【问题标题】:new android Camera2 Api on nexus 7Nexus 7 上的新 android Camera2 Api
【发布时间】:2014-12-17 16:09:39
【问题描述】:

我在 Nexus 7 上使用 android Camera2 API 时遇到问题。我在 android 4.4.4 上开发了一个使用相机拍照的应用,我想更新它以用于 Lollipop 更新。我已按照此链接中的代码使新的相机 api 工作:https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java

我已经在 Nexus 5 上测试过代码,一切正常,但如果我在 Nexus 7 上尝试,就会出现问题。这是错误日志:

12-17 17:01:15.517: W/LegacyRequestMapper(24382): convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
12-17 17:01:15.517: W/LegacyRequestMapper(24382): Only received metering rectangles with weight 0.
12-17 17:01:15.518: W/LegacyRequestMapper(24382): Only received metering rectangles with weight 0.
12-17 17:01:15.519: W/LegacyRequestMapper(24382): mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH;camera does not support it
12-17 17:01:15.519: W/LegacyRequestMapper(24382): convertRequestToMetadata - Ignoring android.lens.focusDistance false, only 0.0f is supported
12-17 17:01:15.955: I/CameraDeviceState(24382): Legacy camera service transitioning to state CAPTURING
12-17 17:01:21.198: I/RequestQueue(24382): Repeating capture request cancelled.
12-17 17:01:21.198: I/RequestQueue(24382): Repeating capture request set.
12-17 17:01:21.215: W/LegacyRequestMapper(24382): convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
12-17 17:01:21.215: W/LegacyRequestMapper(24382): Only received metering rectangles with weight 0.
12-17 17:01:21.215: W/LegacyRequestMapper(24382): Only received metering rectangles with weight 0.
12-17 17:01:21.216: W/LegacyRequestMapper(24382): mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH;camera does not support it
12-17 17:01:21.216: W/LegacyRequestMapper(24382): convertRequestToMetadata - Ignoring android.lens.focusDistance false, only 0.0f is supported
12-17 17:01:21.495: E/AndroidRuntime(24382): FATAL EXCEPTION: CameraBackground
12-17 17:01:21.495: E/AndroidRuntime(24382): Process: com.example.newapicamera, PID: 24382
12-17 17:01:21.495: E/AndroidRuntime(24382): java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
12-17 17:01:21.495: E/AndroidRuntime(24382):    at com.example.newapicamera.Camera2BasicFragment$4.process(Camera2BasicFragment.java:285)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at com.example.newapicamera.Camera2BasicFragment$4.onCaptureCompleted(Camera2BasicFragment.java:324)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at java.lang.reflect.Method.invoke(Native Method)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at java.lang.reflect.Method.invoke(Method.java:372)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at android.hardware.camera2.dispatch.InvokeDispatcher.dispatch(InvokeDispatcher.java:39)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at android.hardware.camera2.dispatch.HandlerDispatcher$1.run(HandlerDispatcher.java:65)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at android.os.Handler.handleCallback(Handler.java:739)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at  android.os.Handler.dispatchMessage(Handler.java:95)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at android.os.Looper.loop(Looper.java:135)
12-17 17:01:21.495: E/AndroidRuntime(24382):    at android.os.HandlerThread.run(HandlerThread.java:61)
12-17 17:01:21.542: I/RequestQueue(24382): Repeating capture request cancelled.
12-17 17:01:21.580: E/BufferQueueProducer(24382): [unnamed-24382-2] dequeueBuffer: BufferQueue has been abandoned
12-17 17:01:21.580: E/BufferQueueProducer(24382): [unnamed-24382-2] dequeueBuffer: BufferQueue has been abandoned
12-17 17:01:21.596: E/BufferQueueProducer(24382): [unnamed-24382-2] queueBuffer: BufferQueue has been abandoned
12-17 17:01:21.605: W/Camera-JNI(24382): callback on dead camera object
12-17 17:01:21.620: E/BufferQueueProducer(24382): [unnamed-24382-2] queueBuffer: BufferQueue has been abandoned
12-17 17:01:21.651: E/BufferQueueProducer(24382): [unnamed-24382-2] queueBuffer: BufferQueue has been abandoned
12-17 17:01:21.688: E/BufferQueueProducer(24382): [unnamed-24382-2] queueBuffer: BufferQueue has been abandoned
12-17 17:01:21.721: E/BufferQueueProducer(24382): [unnamed-24382-2] queueBuffer: BufferQueue has been abandoned

抛出异常的行是:

int aeState = result.get(CaptureResult.CONTROL_AE_STATE);

出了什么问题?

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    使用新的 camera2 API 时,Nexus 7 是 LEGACY 级别的设备,而 LEGACY 设备相对于实现新 API 的 LIMITED 或 FULL 级别的设备有许多限制。

    在 CONTROL_AE_STATE 的 documentation 中有一条注释:

    Limited capability - Present on all camera devices that report being at least HARDWARE_LEVEL_LIMITED devices in the android.info.supportedHardwareLevel key
    

    这意味着它不能保证出现在 LEGACY 设备上,事实上也不会出现,因为此类设备不会产生 AE 状态信息。

    【讨论】:

      【解决方案2】:

      在使用 Camera2 API 的任何功能之前,首先需要检查设备是否支持该功能。对于您的情况,您可以检查如下:

      // CONTROL_AE_STATE can be null on some devices
                              Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                              if (aeState == null ||
                                      aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
                                  mState = STATE_WAITING_NON_PRECAPTURE;
                                  captureStillPicture();
                              } else {
                                  runPrecaptureSequence();
                              }
      

      更多细节可以查看谷歌官方示例代码:https://github.com/googlesamples/android-Camera2Basic

      【讨论】:

        【解决方案3】:

        我今天读到 camera2 api 仅在 nexus 5 和 6 版本的棒棒糖中实现。

        【讨论】:

        • 你在哪里读到的? camera2 是 Lollipop 官方版本中支持的 API。它在预览时不受完全支持,但现在应该可以正常工作。我可能错了,但请提供您的信息来源。
        • 我读到Camera2也不支持预览版,但现在棒棒糖正式发布了!因为相机 api 已被弃用,所以我不能在我的棒棒糖设备上使用它
        • 您仍然可以使用相机接口
        • 我的应用程序已经使用旧的相机 API,但更新棒棒糖后,应用程序崩溃。出于这个原因,我尝试使用 Camera2 API。
        • 简单的 Camera 2 API 示例在我的 Nexus 2013 wifi 上运行 5.0.1。但是,它没有使用任何很酷的新高级功能。我听说 Nexus 7 没有支持新 RAW 输出的硬件。不确定它是否支持突发模式或其他东西。我很想知道 Camera API 能做什么,不能做什么。
        【解决方案4】:

        我的猜测是 result 是一个捆绑包,get 返回一个 Integer 对象(与语句左侧的 int 原语相反)。似乎CaptureResult.CONTROL_AE_STATE 不在捆绑包中。这可能意味着您的设备不支持某些功能,但这还不清楚。

        发生崩溃是因为 Java 自动将 Integer 拆箱为 int,但这里的 Integernull!这将引发空指针异常,因为 Java 试图将空对象转换为 int,因此会出现警告:

        Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference

        处理这个问题的更安全的方法是让aeState 成为Integer,这样你就不会强制java 自动拆箱语句的右侧。 Java 试图帮助你,但它可能会让人困惑!

        【讨论】:

        • 好的,我知道问题出在哪里,但我知道为什么只有当我在 nexus 7 上运行应用程序时才会出现!
        • 这是一个特定于设备的问题。有关信息,请参见 Eddy Talvala 的回答:nexus7
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        相关资源
        最近更新 更多