- 一、权限请求
- 二、线程管理
- 2.1 单例
- 2.2 Handler
- 2.3 常用功能
本篇文章简单介绍初始化相关的权限请求和线程管理 一、权限请求
相机应用肯定需要相机权限,如果没有相机权限就初始化相机,基本会报如下类似错误:can't not connect camera service,因此在初始化相机之前一定要确保相机权限申请通过。我们可以在surfaceChange里添加如下代码:
@Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { super.surfaceChanged(holder, format, w, h); tryInit(); } public void tryInit(){ if(ActivityCompat.checkSelfPermission (AppContexts.sContext, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { uiObserver.onPermissionDeny() return false; } uiObserver.onPermissionGranted() }
uiObserver是用来触发界面修改的。没有权限要在界面上提示用户,不然用户进来就发现黑屏就会觉得应用体验不好。容易遗失用户。
二、线程管理CameraManager:即进行统一调度管理相机具体实现的抽象层。对上层暴露公共接口、对下层统一管理不同API的实现。一个基本健全的CameraManager应该包含如下功能:
2.1 单例作为相机的抽象管理类,应该设计为单例
private static final class SingleHolder { private static final CameraManager INSTANCE = new CameraManager(); } public static CameraHelper of() { return SingleHolder.INSTANCE; }2.2 Handler
//CameraManager.java 1. handle 作为消息分发 2. Android里可自行参考相关资料实现自己的Handler或者继承HandlerThread等 3. 该Handler处理业务层调用并分发消息给Camera实现类。 ********************************** public CameraHandler handler2.3 常用功能
变量 ******************************************* private AbsbaseCameraImpl mCameraImpl; public CameraHandler handler 分发消息 1.初始化 2.对焦 3.缩放 4.曝光 5.闪光灯 6.拍照 7.stop 8.release 9.切换前后置 10.AWB:白平衡调节 ******************************************** public static final int MSG_INIT_CAMERA = 0; public static final int MSG_SWITCH_FOCUS = 2; public static final int MSG_ZOOM_CHANGE = 3; public static final int MSG_EXPOSURE_CHANGE = 4; public static final int MSG_SWITCH_FLASH = 5; public static final int MSG_TAKE_PIC = 6; public static final int MSG_STOP_CAMERA = 7; public static final int MSG_RELEASE_CAMERA = 8; public static final int MSG_SWITCH_CAMERA = 9; public static final int MSG_AWB_CHANGE = 10; 对应函数 ******************************************** public void initCamera(int cameraId, float aspectRatio){ getCameraHandler().sendMessage(handler.obtainMessage(MSG_INIT_CAMERA, cameraId, aspectRatio)); } public void switchFocus(int focusMode){...} public void switchZoom(float zoomValue){...} public void switchExposure(float exposurevalue){...} public void switchFlash(int flashMode){...} public void takePic(TakePicCallBack callBack){...} public void stopCamera(){...} public void releaseCamera(){...} public void switchCamera(){...} 消息分发 ******************************************** public void handleMessage(Message msg){ switch (msg.what) { case MSG_INIT_CAMERA: camera.initCamera((int)msg.obj[0],(float)msg.obj[1]); break; ... } } 上层回调 1. previewSize selected 2. pictureSize selected 3. previewStarted ******************************************** public interface CameraStatusCallback { void onPreviewSizeChange(int width, int height); void onPictureSizeChange(int width, int height); void onPreviewStarted(); }
本篇文章简要介绍了权限检查和申请,以及CameraManager.java类的设计。
下一篇文章具体阐述Camera1Impl.java的实现。
如有疑问或勘误请评论或者通过如下邮箱联系我
[email protected]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)