【Android Camera1】Camera1初始化销毁流程(三) —— 权限请求和相机功能大管家CameraManager

权限请求和相机功能大管家CameraManager


本篇文章简单介绍初始化相关的权限请求和线程管理

一、权限请求

相机应用肯定需要相机权限,如果没有相机权限就初始化相机,基本会报如下类似错误: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或者继承HandlerThread3.Handler处理业务层调用并分发消息给Camera实现类。
**********************************
public CameraHandler handler

2.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的实现。

如有疑问或勘误请评论或者通过如下邮箱联系我
sunquan9301@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值