Android:Camera2 API 仅在 Google Pixel 2 和 2 XL 设备上崩溃

Posted

技术标签:

【中文标题】Android:Camera2 API 仅在 Google Pixel 2 和 2 XL 设备上崩溃【英文标题】:Android: Camera2 API crash only on Google Pixel 2 & 2 XL devices 【发布时间】:2019-04-05 19:52:57 【问题描述】:

我在我的一个应用程序中使用 Camera2 示例代码:https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java

它一直运行良好,直到最近该应用程序在图像捕获时崩溃,但仅在 Google Pixel 2 和 Pixel 2 XL 设备上崩溃。

崩溃报告显示如下:

java.lang.NullPointerException: 
  at ....Camera2BasicFragment$ImageSaver.run (Camera2BasicFragment.java:935)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:193)
  at android.os.HandlerThread.run (HandlerThread.java:65)

这是第 935 行(ImageSaver 类):

ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();

我尝试了一些方法,但由于我没有 Pixel 2 设备,因此无法测试。有什么建议吗?

更新(2018 年 11 月 5 日):

所以合乎逻辑的解释是,从 ImageReader 返回的图像在某种程度上为空:

@Override
        public void onImageAvailable(ImageReader reader) 
            mBackgroundHandler.post(new ImageSaver(reader.acquireLatestImage(), mFile));
        

SO 上的其他一些帖子表明可能不支持 ImageReader 格式。这是格式:

mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
 ImageFormat.JPEG, /*maxImages*/2);

但我无法想象为什么 JPEG 会是一种不受支持的格式。

仍在寻找答案!

【问题讨论】:

那个示例应用没有Camera2ApiActivity.java ...1173 行是什么意思? @MartinZeitler 抱歉,我现在更新了行号以匹配示例代码以便于理解。 很久没用Camera2 API了。但这是我的假设。如果我没记错的话,该回调用于预览。不适用于拍摄的图像。大多数设备允许帧的预览流采用 JPEG 格式,但不是所有设备。所有设备的格式都是 de YUV 格式。我会说您可以尝试将格式更改为YUV。 【参考方案1】:

所有手机都有camera2 api的三摄像头崩溃,这适用于所有背面有2个摄像头或单摄像头的手机

因此建议将 API 更改为多摄像头之一,而不是将其限制为 2 或 3 个摄像头

【讨论】:

以上是关于Android:Camera2 API 仅在 Google Pixel 2 和 2 XL 设备上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何检查设备是不是实现了 Camera2 api 功能?

Android Camera API/Camera2 API 相机预览及滤镜贴纸等处理

Android 10(api 29)camera2 api回归与广角相机

使用 Camera2(Android 版本 21)API 录制 60fps 视频

支持 Android Camera Api 和 Camera2 Api 的问题

如何实现RTMP推送Android Camera2数据