Android 11 supportsCameraApi call failed 問題分析
issue
今天遇到的問題: 之前運作正常的app 在新的android 11 系統 上無法打開
05-26 15:06:28.479 1240 5408 E Camera3-Device: flush: Transaction error: Status(EX_TRANSACTION_FAILED): 'DEAD_OBJECT: '
05-26 15:06:28.479 1240 5408 E CameraDeviceClient: detachDevice: flush failed with code 0xffffffe0
05-26 15:06:28.480 1240 5408 I Camera3-Device: disconnectImpl: E
05-26 15:06:28.480 1240 5408 E Camera3-Device: Camera 0: disconnectImpl: Shutting down in an error state
05-26 15:06:28.480 1240 5408 I CameraLatencyHistogram: ProcessCaptureRequest latency histogram (391) samples:
05-26 15:06:28.480 1240 5408 I CameraLatencyHistogram: 40 80 120 160 200 240 280 320 360 inf (max ms)
05-26 15:06:28.481 1240 5408 I CameraLatencyHistogram: 85.93 11.76 0.51 0.77 0.26 0.26 0.00 0.00 0.00 0.51 (%)
05-26 15:06:28.482 1240 5408 W Camera3-OutputUtils: flushInflightRequests: Frame 385 | Timestamp: 294755615042, metadata arrived: true, buffers left: 1.
05-26 15:06:28.482 1240 5408 W Camera3-OutputUtils: flushInflightRequests: Frame 386 | Timestamp: 0, metadata arrived: false, buffers left: 1.
05-26 15:06:28.482 1240 5408 W Camera3-OutputUtils: flushInflightRequests: Frame 387 | Timestamp: 0, metadata arrived: false, buffers left: 1.
05-26 15:06:28.483 1240 5408 W Camera3-OutputUtils: flushInflightRequests: Frame 388 | Timestamp: 0, metadata arrived: false, buffers left: 1.
05-26 15:06:28.483 1240 5408 W Camera3-OutputUtils: flushInflightRequests: Frame 389 | Timestamp: 0, metadata arrived: false, buffers left: 1.
05-26 15:06:28.505 1240 5408 I CameraLatencyHistogram: Stream 0 dequeueBuffer latency histogram (391) samples:
05-26 15:06:28.506 1240 5408 I CameraLatencyHistogram: 5 10 15 20 25 30 35 40 45 inf (max ms)
05-26 15:06:28.506 1240 5408 I CameraLatencyHistogram: 97.19 2.30 0.51 0.00 0.00 0.00 0.00 0.00 0.00 0.00 (%)
05-26 15:06:28.506 1240 5408 I Camera3-Device: disconnectImpl: X
05-26 15:06:28.508 1240 5408 E CameraService: supportsCameraApi: Unknown camera ID 0
05-26 15:06:28.508 1240 5408 W CameraService: updateStatus: Failed to determine if device supports HAL3 0, supportsCameraApi call failed
05-26 15:06:28.510 1240 5408 I CameraService: disconnect: Disconnected client for camera 0 for PID 5780
05-26 15:06:28.510 1240 5408 I CameraService: onDeviceStatusChanged: Status changed for cameraId=1, newStatus=0
05-26 15:06:28.510 1240 1240 E Camera3-Device: Camera 0: clearStreamingRequest: Device not initialized
05-26 15:06:28.510 1240 5408 E CameraService: supportsCameraApi: Unknown camera ID 1
05-26 15:06:28.511 1240 5408 W CameraService: updateStatus: Failed to determine if device supports HAL3 1, supportsCameraApi call failed
05-26 15:06:28.512 1240 5408 W CameraService: removeClientLocked: Could not evict client, no client for camera ID offline-1
05-26 15:06:28.512 1240 5408 I CameraService: disconnectClient: Client for camera ID 1 evicted due to device status change from HAL
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: Session 0: Exception while stopping repeating:
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: android.hardware.camera2.CameraAccessException: CAMERA_ERROR (3): cancelRequest:467: Camera 0: Error clearing streaming request: Function not implemented (-38)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:1012)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.impl.ICameraDeviceUserWrapper.cancelRequest(ICameraDeviceUserWrapper.java:99)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.impl.CameraDeviceImpl.stopRepeating(CameraDeviceImpl.java:1263)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.impl.CameraCaptureSessionImpl.close(CameraCaptureSessionImpl.java:579)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.impl.CameraCaptureSessionImpl$2.onDisconnected(CameraCaptureSessionImpl.java:790)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.impl.CameraDeviceImpl$7.run(CameraDeviceImpl.java:251)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.Handler.handleCallback(Handler.java:938)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.Handler.dispatchMessage(Handler.java:99)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.Looper.loop(Looper.java:223)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.HandlerThread.run(HandlerThread.java:67)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: Caused by: android.os.ServiceSpecificException: cancelRequest:467: Camera 0: Error clearing streaming request: Function not implemented (-38) (code 10)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.Parcel.createExceptionOrNull(Parcel.java:2387)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.Parcel.createException(Parcel.java:2357)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.Parcel.readException(Parcel.java:2340)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.os.Parcel.readException(Parcel.java:2282)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.ICameraDeviceUser$Stub$Proxy.cancelRequest(ICameraDeviceUser.java:732)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: at android.hardware.camera2.impl.ICameraDeviceUserWrapper.cancelRequest(ICameraDeviceUserWrapper.java:97)
05-26 15:06:28.514 5780 5861 E CameraCaptureSession: ... 8 more
分析
代碼如下
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
manager.openCamera("1", stateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
log中比較明顯的問題點如下:
05-26 15:06:28.508 1240 5408 E CameraService: supportsCameraApi: Unknown camera ID 0
05-26 15:06:28.508 1240 5408 W CameraService: updateStatus: Failed to determine if device supports HAL3 0, supportsCameraApi call failed
方案
查閱源碼 有如下demo示例
/** The camera2 api is only supported on HAL3.2+ devices */
@SmallTest
public void testSupportsCamera2Api() throws Exception {
for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
boolean supports = mUtils.getCameraService().supportsCameraApi(
String.valueOf(cameraId), API_VERSION_2);
Log.v(TAG, "Camera " + cameraId + " supports api2: " + supports);
}
}
/** The camera1 api is supported on *all* devices regardless of HAL version */
@SmallTest
public void testSupportsCamera1Api() throws Exception {
for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
boolean supports = mUtils.getCameraService().supportsCameraApi(
String.valueOf(cameraId), API_VERSION_1);
assertTrue(
"Camera service returned false when queried if it supports camera1 api " +
" for camera ID " + cameraId, supports);
}
}
結論
app 使用的camera2 api 但是裝置HAL3.0
在此系統中 無法運作
建議使用camera1的app進行适配