- 这个系列的文章会翻译跟Camera2相关的api(用我的散装英语+自己的理解)
- 目前处于一边学习一边翻译的状态,所以可能会有错误
- 我也还没做校对,有需要的凑合着看,我会一边写一边回顾,有错就改
- 也请路过的大神斧正,感谢~~~
camera2是为连接到Android设备上的摄像头提供接口的,用来替代camera(api20及以下)
camera2将摄像头构建为管道形式,画面的捕捉,将产生元数据包,以及一组请求的输出图像缓冲区
摄像头的使用,以一个CameraManager实例作为起点
CameraManager
总结1:CameraManager做的事情,1是看看摄像头有啥功能;2是打开/监听摄像头;3是打开/监听闪光灯
总结2:摄像头和闪光灯的所有权不是谁打开就一直拥有,可能被回收/抢夺
//通过Context.getSystemService(Class)获取
var manager = getSystemService(Context.CAMERA_SERVICE)
嵌套类
CameraManager.AvailabilityCallback
相机可用/不可用状态切换回调
CameraManager.TorchCallback
手电筒状态回调(可用/禁用/不可用)
公开方法
//查询相机功能
public CameraCharacteristics getCameraCharacteristics (String cameraId)
//返回指定id的相机的属性,永不为空
return CameraCharacteristics
//获取摄像头id列表,id值为从0开始的Int值
public String[] getCameraIdList ()
//返回当前已连接的摄像头列表,永不为空
return String[]
//使用给定ID打开与摄像机的连接
/**
使用getCameraIdList()获取可用ID,但是如果在getCameraIdList()后,openCamera()前,摄像头断开,或者摄像头被优先级更高的client占用,则打开失败
前台应用(Activity)一般会被授予更高的级别,哪怕低级别的client再用,你也能把使用权给抢过来
每次成功打开摄像头,都会使用最新的CameraDevice跑一次生命周期,可以在对应的周期方法内做初始化工作
*/
public void openCamera (String cameraId, CameraDevice.StateCallback callback, Handler handler)
public void openCamera (String cameraId, Executor executor, CameraDevice.StateCallback callback)
Handler handler -- 回调可能会用到,传null默认使用当前线程的looper
Executor executor -- 执行回调的执行器,不能为空
//注册一个摄像头可用性回调(覆盖性注册)
/**
不用的时候,需要注销,否则会无休止地接收回调,并组织相关资源的释放
*/
public void registerAvailabilityCallback (CameraManager.AvailabilityCallback callback, Handler handler)
public void registerAvailabilityCallback (Executor executor, CameraManager.AvailabilityCallback callback)
Handler handler -- 回调可能会用到,传null默认使用当前线程的looper
Executor executor -- 执行回调的执行器,不能为空
//注册一个闪光灯可用性回调(覆盖性注册)
/**
首次注册成功,会立即回调所有设备的闪光灯可用性
不用的时候,需要注销,否则会无休止地接收回调,并组织相关资源的释放
*/
public void registerTorchCallback (CameraManager.TorchCallback callback, Handler handler)
public void registerTorchCallback (Executor executor, CameraManager.TorchCallback callback)
Handler handler -- 回调可能会用到,传null默认使用当前线程的looper
Executor executor -- 执行回调的执行器,不能为空
//设置闪光灯模式
/**
使用前,得先用getCameraCharacteristics(String)检查是否有闪光灯
就算有,如果被设置的闪光灯正在被使用,那么也可能设置失败
*/
public void setTorchMode (String cameraId, boolean enabled)
//注销摄像头可用性监听
public void unregisterAvailabilityCallback (CameraManager.AvailabilityCallback callback)
//注销闪光灯可用性监听
public void unregisterTorchCallback (CameraManager.TorchCallback callback)
//如果没注册还调用注销,不会产生任何负面效应
网友评论