Camera2进行扫码解析

来源:互联网 发布:常见算法的时间复杂度 编辑:程序博客网 时间:2024/04/29 05:23

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<DecodeHintType,String> 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();                }            }        }    };}

2 0
原创粉丝点击