Camera2中打开相机也需要通过CameraManager类
private void openCamera() {
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
//打开相机设备
manager.openCamera(mCameraId, mStateCallback, mCameraHandler);
}
实现StateCallback 接口,当相机打开后会回调onOpened方法,在这个方法里面开启预览
private CameraDevice mCameraDevice;
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
//保存相机设备
mCameraDevice = camera;
startPreview();
}
@Override
public void onDisconnected(CameraDevice camera) {
camera.close();
mCameraDevice = null;
}
@Override
public void onError(CameraDevice camera, int error) {
camera.close();
mCameraDevice = null;
}
};
Open阶段
frameworks/base/core/java/android/hardware/camera2/CameraManager.java
public void openCamera(@NonNull String cameraId,
@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler) {
openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
USE_CALLING_UID);
}
public void openCameraForUid(@NonNull String cameraId,
@NonNull final CameraDevice.StateCallback callback, @NonNull Executor executor,
int clientUid) {
openCameraDeviceUserAsync(cameraId, callback, executor, clientUid);
}
frameworks/base/core/java/android/hardware/camera2/CameraManager.java
private CameraDevice openCameraDeviceUserAsync(String cameraId,
CameraDevice.StateCallback callback, Executor executor, final int uid) {
ICameraDeviceUser cameraUser = null;
//返回给应用端的相机对象
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
new android.hardware.camera2.impl.CameraDeviceImpl(
cameraId,
callback,
executor,
characteristics,
mContext.getApplicationInfo().targetSdkVersion);
//应用端的回调函数
ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
try {
if (supportsCamera2ApiLocked(cameraId)) {
// Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
//通过cameraService跨进程获得BpCameraDeviceUser对象
cameraUser = cameraService.connectDevice(callbacks, cameraId,
mContext.getOpPackageName(), uid);
}
}
//保存CameraDeviceClient对象到CameraDeviceImpl,触发应用的回调函数
deviceImpl.setRemoteDevice(cameraUser);
}
-----------------------------------------------------------------------------------------------------------------------------------
CameraDeviceImpl继承CameraDevice
public class CameraDeviceImpl extends CameraDevice
public CameraDeviceImpl(String cameraId, StateCallback callback, Executor executor,
CameraCharacteristics characteristics, int appTargetSdkVersion) {
mCameraId = cameraId;
mDeviceCallback = callback;
mDeviceExecutor = executor;
}
}
-----------------------------------------------------------------------------------------------------------------------------------
setRemoteDevice的实现
frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
private ICameraDeviceUserWrapper mRemoteDevice;
public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException {
synchronized(mInterfaceLock) {
mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice);
mDeviceExecutor.execute(mCallOnOpened);
mDeviceExecutor.execute(mCallOnUnconfigured);
}
}
private final Runnable mCallOnOpened = new Runnable() {
public void run() {
sessionCallback = mSessionStateCallback;
sessionCallback.onOpened(CameraDeviceImpl.this);
//通知相机应用设备已打开,并且返回CameraDeviceImpl对象,相机应用已实现该函数
mDeviceCallback.onOpened(CameraDeviceImpl.this);
}
};
frameworks/base/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java
public ICameraDeviceUserWrapper(ICameraDeviceUser remoteDevice) {
mRemoteDevice = remoteDevice;
}
通过以上流程,相机应用获得了CameraDevice对象,而CameraDevice保存ICameraDeviceUserWrapper对象,ICameraDeviceUserWrapper保存BpCameraDeviceUser对象,BpCameraDeviceUser具有跨进程的能力,这样应用就可以和CameraService端的CameraDeviceClient进行通信了。
-----------------------------------------------------------------------------------------------------------------------------------
CameraManagerGlobal.get().getCameraService()的实现
通过ServiceManager获的cameraService,CameraManager通过CameraManagerGlobal访问CameraService服务,并注册监听,CamreaService持有CameraServiceListener列表,并回调结果给CameraManager。
frameworks/base/core/java/android/hardware/camera2/CameraManager.java
private static final class CameraManagerGlobal extends ICameraServiceListener.Stub {
public ICameraService getCameraService() {
//连接服务
connectCameraServiceLocked();
return mCameraService;
}
}
private void connectCameraServiceLocked() {
//查询服务引用,CAMERA_SERVICE_BINDER_NAME="media.camera"
IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME);
//转换服务接口
ICameraService cameraService = ICameraService.Stub.asInterface(cameraServiceBinder);
//注册回调监听,camerService可以通知CameraManagerGlobal状态变化
CameraStatus[] cameraStatuses = cameraService.addListener(this);
//存副本
mCameraService = cameraService;
}
frameworks/av/services/camera/libcameraservice/CameraService.h
static char const* getServiceName() { return "media.camera"; }
-----------------------------------------------------------------------------------------------------------------------------------
cameraService.connectDevice的实现
跨进程调用CameraManager->CameraService,返回CameraDeviceClient,将应用端的回调函数设置给cameraService。
frameworks/av/services/camera/libcameraservice/CameraService.cpp
Status CameraService::connectDevice(
const sp<har