简析android5.0相机使用
android5.0提供了新的相机处理的API,我们想上一张图:我们先对整逻辑进行一下梳理,在来一步一步的对源码进行分析,不至于看源码的时候有一种懵逼的感觉:
Android5.0新提供的阿比中关键的几个类在上图中进行了描述:
CameraManager:管理手机上的所用摄像头设备,它的主要作用主要是获取摄像头列表和打开指定的摄像头
CameraDevice:具体的每一个摄像头,它有一系列参数(预览尺寸,拍照尺寸等)
CameraCaptureSession:相机捕获会话,用于处理拍照和预览工作
CaptureRequest:捕获请求,定义输出缓冲区以及显示界面(TextureView或者SurfaceView)
问题来了:
1.如何获取摄像头管理器,摄像头管理器是怎样管理到我们的应用程序中的
2.如何获取摄像头个数,选择要操作的摄像头
3.如何关联到我们选择的摄像头上
4.如何获取摄像同的预览和预览的每一帧的原始数据
1.如何获取摄像头管理器,摄像头管理器是怎样管理到我们的应用程序中的
如果对机器人系统底层源码有了解,机器人系统对硬件,软件,都是使用模块化的开发方式,WindowManagerService / ActivityManagerService / CameraManager等来对应不同的服务,这里我们要对相机进行处理,就对应要从CameraManager入手,这时系统提供给我们在应用程序开发是管理相机的入口接下来我们就从CameraManager下手:(android6.0源码)在活动启动时创建ActivityThread中通过:SystemServiceRegistry来统一管理系统启动的服务,使用静态代码块来进行初始化
/ **
*管理{@link Context#getSystemService}可以返回的所有系统服务。
*由{@link ContextImpl}使用。
* /
最终类SystemServiceRegistry {
private final static String TAG =“SystemServiceRegistry”;
//服务注册表信息。
//静态初始化完成后,该信息永远不会更改。
private static final HashMap <Class <?>,String> SYSTEM_SERVICE_NAMES =
新的HashMap <Class <?>,String>();
private static final HashMap <String,ServiceFetcher <?>> SYSTEM_SERVICE_FETCHERS =
新的HashMap <String,ServiceFetcher <?>>();
private static int sServiceCacheSize;
//不可实例化
private SystemServiceRegistry(){}
静态的 {
registerService(Context.ACCESSIBILITY_SERVICE,AccessibilityManager.class,
新的CachedServiceFetcher <AccessibilityManager>(){
@覆盖
public AccessibilityManager createService(ContextImpl ctx){
返回AccessibilityManager.getInstance(ctx);
}}); registerService(Context.CAMERA_SERVICE,CameraManager.class,
新的CachedServiceFetcher <CameraManager>(){
@覆盖
public CameraManager createService(ContextImpl ctx){
返回新的CameraManager(ctx);
}});
}
我们可以通过上下文中的getSystemService来获取相机管理器:
CameraManager manager =(CameraManager)activity.getSystemService(Context.CAMERA_SERVICE);