12

我正在使用以下代码在 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 活动到下一个活动只需要不到一分钟的时间。

编辑1:我们将预览尺寸从最高( 1080x1920)减小到中等范围(480x800),一切都开始正常了。预览大小是否与 HAL 中的相机版本有关?

4

3 回答 3

5

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

   new AsyncTask() {

        @Override
        protected Object doInBackground(Object... params) {
            releaseCamera();
            return null;
        };
    }.execute();
于 2014-11-18T18:17:50.800 回答
1

Dilip,这是 Nexus 10 中的已知问题,请检查此Nexus 10 camera.release 挂起 30 秒

我们尝试了这些东西,

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

于 2014-11-21T03:30:46.157 回答
0

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

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

})。开始();

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

于 2016-02-05T12:54:34.273 回答