Android Camera getCameraIdList流程 (androidP)
Posted we1less
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Camera getCameraIdList流程 (androidP)相关的知识,希望对你有一定的参考价值。
getCameraIdList() 按标识符返回当前连接的摄像头设备列表,包括其他 camera API 客户端可能正在使用的摄像头。
getCameraIdList
路径 frameworks/base/core/java/android/hardware/camera2/CameraManager.java
获取idlist,在下面代码可以看出调用的是CameraManagerGlobal的getCameraIdList
@NonNull
public String[] getCameraIdList() throws CameraAccessException {
return CameraManagerGlobal.get().getCameraIdList();
}
CameraManagerGlobal::getCameraIdList
路径 frameworks/base/core/java/android/hardware/camera2/CameraManager.java
这里面主要是获取到cameraService根据mDeviceStatus里面的值进行返回
private final ArrayMap<String, Integer> mDeviceStatus = new ArrayMap<String, Integer>();
public String[] getCameraIdList() {
String[] cameraIds = null;
synchronized(mLock) {
// Try to make sure we have an up-to-date list of camera devices.
//获取cameraService
connectCameraServiceLocked();
int idCount = 0;
for (int i = 0; i < mDeviceStatus.size(); i++) {
int status = mDeviceStatus.valueAt(i);
if (status == ICameraServiceListener.STATUS_NOT_PRESENT ||
status == ICameraServiceListener.STATUS_ENUMERATING) continue;
idCount++;
}
cameraIds = new String[idCount];
idCount = 0;
for (int i = 0; i < mDeviceStatus.size(); i++) {
int status = mDeviceStatus.valueAt(i);
if (status == ICameraServiceListener.STATUS_NOT_PRESENT ||
status == ICameraServiceListener.STATUS_ENUMERATING) continue;
cameraIds[idCount] = mDeviceStatus.keyAt(i);
idCount++;
}
}
//...接下来是排序
return cameraIds;
}
mDeviceStatus的添加 onStatusChangedLocked
路径 frameworks/base/core/java/android/hardware/camera2/CameraManager.java
可以明显看出这个数据结构中的值是受这个回调函数控制的,那么这个回调是何时调用的呢
private final ArrayMap<String, Integer> mDeviceStatus = new ArrayMap<String, Integer>();
private void onStatusChangedLocked(int status, String id) {
//...
Integer oldStatus;
if (status == ICameraServiceListener.STATUS_NOT_PRESENT) {
oldStatus = mDeviceStatus.remove(id);
} else {
oldStatus = mDeviceStatus.put(id, status);
}
//...
final int callbackCount = mCallbackMap.size();
for (int i = 0; i < callbackCount; i++) {
Executor executor = mCallbackMap.valueAt(i);
final AvailabilityCallback callback = mCallbackMap.keyAt(i);
postSingleUpdate(callback, executor, id, status);
}
} // onStatusChangedLocked
connectCameraServiceLocked
路径 frameworks/base/core/java/android/hardware/camera2/CameraManager.java
这个函数是上文中调用过的主要的用途就是获取链接到cameraService,并将自己作为监听注册给cameraService,在调用注册函数后会获取到cameraStatuses的一个数组,这个里面存放了关于摄像头设备的全部信息,遍历这个数组把他们放进mDeviceStatus中。当然这个类里面同样重写了onStatusChanged函数并且这里面同样调用了onStatusChangedLocked,这样当cameraService想要通知当前的摄像设备的状态时可以通过这个回调获取了
private void connectCameraServiceLocked() {
//...
IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME);
//...
ICameraService cameraService = ICameraService.Stub.asInterface(cameraServiceBinder);
try {
CameraMetadataNative.setupGlobalVendorTagDescriptor();
} catch (ServiceSpecificException e) {
handleRecoverableSetupErrors(e);
}
try {
CameraStatus[] cameraStatuses = cameraService.addListener(this);
for (CameraStatus c : cameraStatuses) {
onStatusChangedLocked(c.status, c.cameraId);
}
mCameraService = cameraService;
} catch(ServiceSpecificException e) {
// Unexpected failure
throw new IllegalStateException("Failed to register a camera service listener", e);
} catch (RemoteException e) {
// Camera service is now down, leave mCameraService as null
}
}
//####################################################################
@Override
public void onStatusChanged(int status, String cameraId) throws RemoteException {
synchronized(mLock) {
onStatusChangedLocked(status, cameraId);
}
}
以上是关于Android Camera getCameraIdList流程 (androidP)的主要内容,如果未能解决你的问题,请参考以下文章
问题支持Android相机的API和camera2 API问题,怎么解决