【发布时间】:2014-02-14 22:59:57
【问题描述】:
我正在使用以下代码在 onPause 中释放相机。但是 mCamera.release() 行平均需要 30 秒才能释放 Nexus 10 设备中的相机。我在 mCamera.release() 前后添加了日志,发现打印这些日志的时间差是 30 秒。
private void releaseCamera() {
if (mCamera != null) {
previewing = false;
mCamera.setPreviewCallback(null);
if(mPreview != null)
mPreview.getHolder().removeCallback(mPreview);
Log.e("QR","Starting to call mCamera.release()");
mCamera.release();
Log.e("QR","Released Camera");
mCamera = null;
}
}
我在调用 releaseCamera() 之前调用 mCamera.stopPreview()
有什么方法可以异步进行吗?因为从 Camerapreview 活动到下一个活动只需不到一分钟。
Edit1:我们将预览尺寸从最高 (1080x1920) 减小到中等范围 (480x800),一切开始正常。预览大小是否与 HAL 中的相机版本有关?
【问题讨论】:
-
我在我的应用程序中创建了许多线程。是不是造成了问题?如果是这样,我如何在不生根设备的情况下进行检查?
-
将预览大小从 (1080,1920) 减小到较小的大小,例如 (480,800),性能会发生一些显着变化。 Camera.release() 与预览大小有关系吗?如果释放相机有延迟,所花费的时间几乎是一个常数——Nexus 10 是 320 毫秒或 30 秒——这背后的原因是什么?
-
你在打电话给
mCamera.stopPreview()吗? -
您是否在其他应用中看到过类似问题? Grafika (github.com/google/grafika) 有一些基于相机的活动,例如“show + capture camera”,我经常在 Nexus 10 上运行它。你是从 onPause() 调用这个吗?在此期间,logcat 中是否有任何看起来与相机相关的内容?
-
如果您查看 Camera2 API (github.com/android/platform_hardware_libhardware/blob/master/…) 的代码,第 284 行,您会看到您在应用程序中看到的堆栈跟踪错误。似乎 HAL 正在等待相机上的所有操作完成后再关闭它,并且某些东西阻止了您的释放。在释放超时(我猜是 30 秒)时,HAL 断开连接。这段代码中有一行很有趣: // TODO: 设置来自 HAL 的通知,而不是在这里休眠。这可能是 nexus 10 上未实现的...
标签: android android-camera nexus-10 google-nexus