Nexus7上新的android Camera2 Api

Nexus7上新的android Camera2 Api,android,android-camera,Android,Android Camera,我对Nexus7上的android Camera2 API有问题。我在安卓4.4.4上开发了一个应用程序,它使用相机拍照,我想为棒棒糖更新更新它。我遵循此链接中的代码使新的摄影机api正常工作: 我在Nexus5上测试过代码,一切都很好,但如果我在Nexus7上尝试,就会出现问题。这是错误日志: 12-17 17:01:15.517: W/LegacyRequestMapper(24382): convertRequestMetadata - control.awbRegions setting

我对Nexus7上的android Camera2 API有问题。我在安卓4.4.4上开发了一个应用程序,它使用相机拍照,我想为棒棒糖更新更新它。我遵循此链接中的代码使新的摄影机api正常工作:

我在Nexus5上测试过代码,一切都很好,但如果我在Nexus7上尝试,就会出现问题。这是错误日志:

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);

出了什么问题?

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

发生崩溃的原因是Java自动将
整数
解包为
整数
,但此处的
整数
!这将引发空指针异常,因为Java正在尝试将空对象转换为int,因此出现警告:

尝试在空对象引用上调用虚拟方法“int java.lang.Integer.intValue()”


一种更安全的处理方法是将
aeState
设置为
Integer
,这样就不会强制java自动取消对语句右侧的装箱。Java正试图帮助您,但它可能会让人困惑

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

当使用新的camera2 api时,nexus 7是传统级别的设备,传统设备相对于实现新api的有限或完整级别的设备有许多限制

在控制状态下,有一个注释:

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

这意味着它不一定会出现在传统设备上,事实上也不会出现,因为这些设备不会产生AE状态信息。

在使用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();
                        }

有关更多详细信息,您可以在此处查看谷歌的官方示例代码:

您在哪里读到的?camera2是官方发布的棒棒糖中受支持的API。它在预览时不完全受支持,但现在应该可以正常工作了。我可能错了,但请提供您的信息来源。我读到预览版也不支持Camera2,但现在棒棒糖发布是官方的!因为Camera api已弃用,所以我无法在我的棒棒糖设备上使用它。您仍然可以使用Camera api。我的应用程序已经使用旧的Camera api,但在棒棒糖更新后,应用程序崩溃。出于这个原因,我尝试使用Camera2 API。简单的Camera2 API示例在我的Nexus 2013 wifi 5.0.1上运行。然而,它并没有使用任何很酷的新的高级功能。我读到Nexus7没有硬件来支持新的原始输出。不确定它是否支持突发模式或其他东西。我很想知道摄像头API到底能做什么,不能做什么。好吧,我知道问题出在哪里,但我知道为什么只有在nexus 7上运行应用程序时才会出现occours!这是一个特定于设备的问题。有关nexus7的信息,请参见Eddy Talvala的答案