目录
本文主要一起看下之前一篇app demo涉及的一些接口函数,主要涉及代码位置camera2
一、getSystemService
首先通过getSystemService接口获取camera的服务
mCamManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
其实它就是直接获取之前SystemServiceRegistry已经创建好的CameraManager
registerService(Context.CAMERA_SERVICE, CameraManager.class,
new CachedServiceFetcher<CameraManager>() {
@Override
public CameraManager createService(ContextImpl ctx) {
return new CameraManager(ctx);
}});
二、CameraManager
CameraManager负责detect、connect device,创建本地的CameraDevice实例来控制sevice端的device
1.openCamera
这里面connectDevice就是真正去openCamera
openCamera(String cameraId, final CameraDevice.StateCallback callback, Handler handler)
openCameraForUid(String cameraId, final CameraDevice.StateCallback callback,
Executor executor, int clientUid)
openCameraDeviceUserAsync(String cameraId, CameraDevice.StateCallback callback,
xecutor executor, final int uid)
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
new android.hardware.camera2.impl.CameraDeviceImpl(
cameraId, callback, executor, characteristics,
mContext.getApplicationInfo().targetSdkVersion);
cameraUser = cameraService.connectDevice(callbacks, cameraId,
mContext.getOpPackageName(), uid);
deviceImpl.setRemoteDevice(cameraUser);
三、CameraDevice
1.CameraDeviceImpl
CameraDevice的具体实现,里面重要的是包含了从service那获取的
ICameraDeviceUser cameraUser
2.StateCallback
public abstract void onOpened(@NonNull CameraDevice camera); // Must implement
这是必须实现的回调函数,在connectDevice成功之后,deviceImpl.setRemoteDevice里被调用
3.createCaptureSession
SurfaceTexture mSurfaceTexture = mTextureView.getSurfaceTexture();
// 设置TextureView 用于显示的缓冲区大小
mSurfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
mPreviewSurface = new Surface(mSurfaceTexture);
ImageReader mImageReader;
mCamDevice.createCaptureSession(Arrays.asList(mPreviewSurface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback())
createCaptureSessionInternal
configureStreamsChecked
mRemoteDevice.beginConfigure();
mRemoteDevice.createStream(outConfig);
mRemoteDevice.endConfigure(operatingMode, null);
通过 SurfceTexture、ImageReader两种surface构造CaptureSession,session创建成功之后会回调CaptureSession.StateCallback的onConfigured接口。关于ImageReader的surface的格式映射在其构造函数里有映射,比如RAW_SENSOR映射到的是RAW16
// retrieve hal Format and hal dataspace from imageFormat