天天看點

Android 11 supportsCameraApi call failed 問題分析Android 11 supportsCameraApi call failed 問題分析

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進行适配