1 package com.intsig.bcrsdk.demo.Activity; 2 3 import android.annotation.TargetApi; 4 import android.app.Activity; 5 import android.graphics.SurfaceTexture; 6 import android.hardware.camera2.CameraAccessException; 7 import android.hardware.camera2.CameraCaptureSession; 8 import android.hardware.camera2.CameraCharacteristics; 9 import android.hardware.camera2.CameraDevice; 10 import android.hardware.camera2.CameraManager; 11 import android.hardware.camera2.CaptureRequest; 12 import android.hardware.camera2.CaptureResult; 13 import android.hardware.camera2.TotalCaptureResult; 14 import android.os.Build; 15 import android.os.Bundle; 16 import android.os.Handler; 17 import android.os.HandlerThread; 18 import android.util.Log; 19 import android.view.Surface; 20 import android.view.TextureView; 21 22 23 import com.intsig.bcrsdkdemo.R; 24 25 import java.util.Arrays; 26 27 28 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 29 public class Camera2Activity extends Activity { 30 private TextureView textureView; 31 private String TAG="测试"; 32 33 private HandlerThread mThreadHandler; 34 private Handler mHandler; 35 36 private CaptureRequest.Builder mPreviewBuilder; 37 @Override 38 protected void onCreate(Bundle savedInstanceState) { 39 super.onCreate(savedInstanceState); 40 setContentView(R.layout.activity_camera2); 41 mThreadHandler = new HandlerThread("CAMERA2"); 42 mThreadHandler.start(); 43 mHandler = new Handler(mThreadHandler.getLooper()); 44 45 textureView= (TextureView) findViewById(R.id.tv); 46 textureView.setSurfaceTextureListener(textureListener); 47 48 } 49 50 private TextureView.SurfaceTextureListener textureListener=new TextureView.SurfaceTextureListener() { 51 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 52 @Override 53 public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) { 54 Log.e(TAG,"可用"); 55 56 //CameraManaer 摄像头管理器,用于检测摄像头,打开系统摄像头 57 CameraManager cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE); 58 try { 59 String[] CameraIdList=cameraManager.getCameraIdList();//获取可用相机列表 60 Log.e(TAG,"可用相机的个数是:"+CameraIdList.length); 61 CameraCharacteristics cameraCharacteristics=cameraManager.getCameraCharacteristics(CameraIdList[0]);//获取某个相机(摄像头特性) 62 cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);//检查支持 63 64 cameraManager.openCamera(CameraIdList[0],mCameraDeviceStateCallback, mHandler); 65 } catch (CameraAccessException e) { 66 e.printStackTrace(); 67 } 68 69 } 70 71 @Override 72 public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) { 73 Log.e(TAG,"改变"); 74 } 75 76 @Override 77 public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { 78 Log.e(TAG,"释放"); 79 return false; 80 } 81 82 @Override 83 public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { 84 Log.e(TAG,"更新"); 85 } 86 }; 87 88 //CameraDeviceandroid.hardware.Camera也就是Camera1的Camera 89 private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() { 90 @Override 91 public void onOpened(CameraDevice camera) { 92 try { 93 startPreview(camera); 94 } catch (CameraAccessException e) { 95 e.printStackTrace(); 96 } 97 } 98 99 @Override 100 public void onDisconnected(CameraDevice camera) { 101 102 } 103 104 @Override 105 public void onError(CameraDevice camera, int error) { 106 107 } 108 }; 109 110 111 /** 112 * @param camera 113 * @throws CameraAccessException 114 * 开始预览 115 */ 116 private void startPreview(CameraDevice camera) throws CameraAccessException { 117 SurfaceTexture texture = textureView.getSurfaceTexture(); 118 texture.setDefaultBufferSize(textureView.getWidth(), textureView.getHeight()); 119 Surface surface = new Surface(texture); 120 try { 121 //CameraRequest表示一次捕获请求,用来对z照片的各种参数设置,比如对焦模式、曝光模式等。CameraRequest.Builder用来生成CameraRequest对象 122 mPreviewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 123 124 } catch (CameraAccessException e) { 125 e.printStackTrace(); 126 } 127 mPreviewBuilder.addTarget(surface); 128 camera.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, mHandler); 129 } 130 131 //CameraCaptureSession 这个对象控制摄像头的预览或者拍照 132 //setRepeatingRequest()开启预览,capture()拍照 133 //StateCallback监听CameraCaptureSession的创建 134 private CameraCaptureSession.StateCallback mSessionStateCallback = new CameraCaptureSession.StateCallback() { 135 @Override 136 public void onConfigured(CameraCaptureSession session) { 137 Log.e(TAG,"相机创建成功!"); 138 try { 139 session.capture(mPreviewBuilder.build(), mSessionCaptureCallback, mHandler);//拍照 140 session.setRepeatingRequest(mPreviewBuilder.build(), mSessionCaptureCallback, mHandler);//返回结果 141 } catch (CameraAccessException e) { 142 e.printStackTrace(); 143 Log.e(TAG,"这里异常"); 144 } 145 } 146 147 @Override 148 public void onConfigureFailed(CameraCaptureSession session) { 149 Log.e(TAG,"相机创建失败!"); 150 } 151 }; 152 153 154 //CameraCaptureSession.CaptureCallback监听拍照过程 155 private CameraCaptureSession.CaptureCallback mSessionCaptureCallback = new CameraCaptureSession.CaptureCallback() { 156 157 @Override 158 public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { 159 Log.e(TAG,"这里接受到数据"+result.toString()); 160 } 161 162 @Override 163 public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult){ 164 165 }}; 166 }