編輯:關於Android編程
Camera2是5.0後的api,網上暫時沒找到對於Camera2進行掃碼解析的代碼。
寫此文純粹為了個人日後方便查詢。
package com.example.one.codescanm;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.media.Image;
import android.media.ImageReader;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.ImageView;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Hashtable;
public class MainActivity extends Activity {
private CameraManager cameraManager;
private String camerid;
private Handler handler;
private SurfaceHolder holder;
private CaptureRequest.Builder build;
private ImageReader imageReader;
private SurfaceView surfaceView;
private ImageView imageView;
private Bitmap bitmap2;
private CameraCaptureSession msession;
private CameraDevice cameraDevice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView= (ImageView) findViewById(R.id.ada);
surfaceView= (SurfaceView) findViewById(R.id.surface);
holder=surfaceView.getHolder();
cameraManager= (CameraManager) getSystemService(Context.CAMERA_SERVICE);
camerid=CameraCharacteristics.LENS_FACING_FRONT+"";
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
imageReader=ImageReader.newInstance(surfaceView.getWidth(),surfaceView.getHeight(),ImageFormat.JPEG,7);
HandlerThread handlerThread=new HandlerThread("Camera2");
handlerThread.start();
handler=new Handler(handlerThread.getLooper());
try {
cameraManager.openCamera(camerid,new MyDeviceStateCallBack(),handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}catch (SecurityException e)
{
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
}
class MyDeviceStateCallBack extends CameraDevice.StateCallback
{
@Override
public void onOpened(CameraDevice camera) {
cameraDevice=camera;
try {
build=camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
build.addTarget(holder.getSurface());
camera.createCaptureSession(Arrays.asList(holder.getSurface(),imageReader.getSurface()),new MySessionStateCallBack(),handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onDisconnected(CameraDevice camera) {
}
@Override
public void onError(CameraDevice camera, int error) {
}
}
class MySessionStateCallBack extends CameraCaptureSession.StateCallback
{
@Override
public void onConfigured(CameraCaptureSession session) {
build.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
try {
session.setRepeatingRequest(build.build(),new MySessionCaptureCallBack(),handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
}
class MySessionCaptureCallBack extends CameraCaptureSession.CaptureCallback
{
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
Log.d("ma",result.get(CaptureResult.CONTROL_AF_STATE)+"/////");
msession=session;
//在聚焦完成後進行自動捕捉圖片
if(result.get(CaptureResult.CONTROL_AF_STATE)==CaptureRequest.CONTROL_AF_STATE_PASSIVE_FOCUSED)
{
//捕捉圖片
build.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
build.addTarget(imageReader.getSurface());
try {
session.setRepeatingRequest(build.build(), new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
if(imageReader!=null)
{
Image image=imageReader.acquireLatestImage();
if(image!=null)
{
try {
//獲取到圖片後停止捕捉
session.stopRepeating();
} catch (CameraAccessException e) {
e.printStackTrace();
}
Image.Plane[] planes=image.getPlanes();
ByteBuffer byteBuffer=planes[0].getBuffer();
byte[] bytes=new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
bitmap2=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
myHandler.sendEmptyMessage(1);
}
}
}
},handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
}
Handler myHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
imageView.setImageBitmap(bitmap2);
//解析二維碼
MyLuminanceSource myLuminanceSource=new MyLuminanceSource(bitmap2);
Hashtable hashtable=new Hashtable<>();
hashtable.put(DecodeHintType.CHARACTER_SET,"UTF-8");
BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(myLuminanceSource));
QRCodeReader qrCodeReader=new QRCodeReader();
Result result= null;
try {
result = qrCodeReader.decode(binaryBitmap,hashtable);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
if(result==null)
{
try {
//stopRepeating()並不能解除TRIGGER狀態所以先進行解除不然在回調時無法獲取CONTROL_AF_STATE_PASSIVE_FOCUSED狀態
build=cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
build.addTarget(holder.getSurface());
build.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
msession.setRepeatingRequest(build.build(), new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
try {
session.stopRepeating();
} catch (CameraAccessException e) {
e.printStackTrace();
}
try {
build=cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
} catch (CameraAccessException e) {
e.printStackTrace();
}
build.addTarget(holder.getSurface());
build.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
try {
msession.setRepeatingRequest(build.build(), new MySessionCaptureCallBack(), handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
};
}
Android 自定義Progressbar,任何圖片都能當成progressbar轉動起來
今天群裡邊有人問怎麼自定義Android holo主題下的Progressbar; 我想到之前做過自定義Progressbar,通過自己寫動畫和Style可以用任何圖片當
Android 一鍵清理動畫
版本:1.0 日期:2014.7.29 2014.7.30版權:© 2014 kince 轉載注明出處 一鍵清理是很多Launcher都會帶有的功能,其效果也比
PhoneGap || Cordova 安裝以及導入AndroidStudio 遇到的問題
需要用到的資源再網上可以下載到Java SDK,node.js,apache-ant,ADT(google提供的android開發工具,其實主要是需要android SD
android-多種方式實現主界面的Tab
前言這篇文章主要介紹多種方式實現主界面的tab,包括:(1)使用Fragment實現(2)使用ViewPage實現(3)使用ViewPage+FragmentPageAd