Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有啥方法可以加快这个过程吗?

Posted

技术标签:

【中文标题】Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有啥方法可以加快这个过程吗?【英文标题】:Camera.release() takes 30 seconds to release the camera in Nexus 10. Is there any way to speed up the process?Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有什么方法可以加快这个过程吗? 【发布时间】: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 上未实现的... 【参考方案1】:

您可以尝试在线程内释放相机作为解决方法,但这不是一个理想的解决方案。您可以在后台执行发布功能时启动您的下一个活动

   new AsyncTask() 

        @Override
        protected Object doInBackground(Object... params) 
            releaseCamera();
            return null;
        ;
    .execute();

【讨论】:

我们使用该解决方法。然而,如果相机需要再次打开,用户将无法这样做,这并不理想。【参考方案2】:

Dilip,这是 Nexus 10 中的已知问题,请查看此Nexus 10 camera.release hangs for 30 seconds。

我们尝试过这些东西,

camera.stopPreview();
camera.setPreviewCallback(null);
camera.unlock();
camera.release();
camera = null;

它对我有用,但我也必须在其他设备上测试相同的代码(最好将上面的代码放在 try/catch 语句中)。

另外,您可以在线程中添加此功能:

new Thread(new Runnable()
    public void run()
        camera.stopPreview();
    camera.setPreviewCallback(null);
    camera.unlock();
    camera.release();
    camera = null;
    
).start();

尝试使用Camera2 API创建相机管理代码,希望这不会造成问题,检查这个http://blog.csdn.net/torvalbill/article/details/40376145

【讨论】:

建议在 Nexus 10 上不起作用。我们正在寻找可行的解决方案或变通方法。 @ssasa 我们发现,如果您没有正确打开和关闭这些错误,则这些错误会在 nexus 中发生,一段时间后它就会成为一个问题。这就是原因,我提供了我们用于正确关闭相机的脚本,而且,我们正在实施本周的相机 2 API。也许,到这个周末,我可以对此发表评论。【参考方案3】:

我不需要声誉级别来添加评论,所以我会把它放在这里:

new Thread(new Runnable()
public void run()
    camera.stopPreview();
camera.setPreviewCallback(null);
camera.unlock();
camera.release();
camera = null;

).start();

当发布调用将在单独的线程中运行时,它将导致其他使用相机的应用程序出现问题,并将在此基础上启动。 我也在寻找解决方案。我没有Nexus10。我们有自己的设备。

【讨论】:

以上是关于Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有啥方法可以加快这个过程吗?的主要内容,如果未能解决你的问题,请参考以下文章

无需重启即可释放 Android 相机?

nexus在docker安装nexus与初始密码问题

nexus在docker安装nexus与初始密码问题

nexus在docker安装nexus与初始密码问题

nexus配置https(在nexus上配置jks证书方式)

英语nexus啥意思