【问题标题】:Camera2: Should createCaptureRequest() be called on a background threadCamera2:应在后台线程上调用 createCaptureRequest()
【发布时间】:2020-01-28 12:07:28
【问题描述】:

来自文档:

创建会话是一项昂贵的操作,可能需要数百毫秒,因为它需要配置相机设备的内部管道并分配内存缓冲区以将图像发送到所需的目标。因此设置是异步完成的,CameraDevice#createCaptureSession 和 CameraDevice#createReprocessableCaptureSession 会将准备使用的 CameraCaptureSession 发送到提供的侦听器的 CameraCaptureSession.StateCallback#onConfigured 回调。

但是,我收到了由 createCaptureSession() 引起的 ANR:

AppNotResponding : Application not responsive since: Fri Jan 17 17:19:26 GMT+01:00 2020
        at android.os.BinderProxy.transactNative(BinderProxy.java)
        at android.os.BinderProxy.transact(BinderProxy.java:510)
        at android.hardware.camera2.ICameraDeviceUser$Stub$Proxy.endConfigure(ICameraDeviceUser.java:719)
        at android.hardware.camera2.impl.ICameraDeviceUserWrapper.endConfigure(ICameraDeviceUserWrapper.java:114)
        at android.hardware.camera2.impl.CameraDeviceImpl.configureStreamsChecked(CameraDeviceImpl.java:476)
        at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSessionInternal(CameraDeviceImpl.java:664)
        at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:512)

我没有在代码示例中看到 createCaptureSession() 调用是在后台线程上进行的。通常有一个处理程序被传递,所以只有回调会在后台线程上执行?

【问题讨论】:

    标签: android android-camera2


    【解决方案1】:

    如果你参考谷歌官方的Camera2 sample,预览会话是在单独的HandlerThread中创建的。相机会话的创建方式如下 mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      相关资源
      最近更新 更多