一,调用流程图如下
二,其基本的实现调用关系如下:
1.初始化handler 线程绑定handlerThread 的looper ,相机传递参数时需要这个线程
/***
* 1
* 初始化handler 线程绑定handlerThread 的looper ,相机传递参数时需要这个线程
*/
private void initHandler() {
handlerThread = new HandlerThread("camera_handler_Therad");
handlerThread.start();
mCameraHandler = new Handler(handlerThread.getLooper());
}
2.设置TextureView监听器, 监听surfaceview 的回调
/***
* 2
* 设置TextureView监听器, 监听surfaceview 的回调
* @param mTextureView
*/
private void initTextureViewSetSurfaceTextureListener(TextureView mTextureView) {
mTextureView.setSurfaceTextureListener((TextureView.SurfaceTextureListener) (new TextureView.SurfaceTextureListener() {
public void onSurfaceTextureSizeChanged(@Nullable SurfaceTexture surface, int width, int height) {
}
public void onSurfaceTextureUpdated(@Nullable SurfaceTexture surface) {
}
public boolean onSurfaceTextureDestroyed(@Nullable SurfaceTexture surface) {
//释放camera
releaseCamera();
return true;
}
public void onSurfaceTextureAvailable(@Nullable SurfaceTexture surface, int width, int height) {
preHeight = height;
preWidth = width;
//surface 可用的时候调用相机开启camera;
openCamera();
}
}));
}
3.打开相机openCamera(mCameraId, mStateCallback, mCameraHandler);
public void openCamera() {
//创建相机的管理者
mCameraManager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE);
//设置相机的特征信息;
setCameraInfo(mCameraManager);
if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(mActivity, "没有相机权限", Toast.LENGTH_SHORT);
return;
}
try {
//设置相机id ,mStateCallback 打开相机的状态回调监听,handler
mCameraManager.openCamera(mCameraId, mStat