【问题标题】:app hanging on camera.release()应用程序挂在 camera.release()
【发布时间】:2012-01-09 01:41:52
【问题描述】:

我正在使用相机闪光灯开发手电筒应用程序。它似乎工作正常,但有时调用 camera.release() 会导致挂起大约一分钟左右。我已经包含了下面的代码。我看过一堆例子,我没有看到任何可能导致这种事情的东西。有什么想法吗?

    //latest
    public void setOn(boolean on, Context context) {    

    if (lock) {
        Log.i(TAG, "lock: true");
        return;
    }


    if (on) {           
        if (mCamera == null) {
            mCamera = Camera.open();
        }

        Parameters params = mCamera.getParameters();
        params.setFlashMode(MODE_TORCH);
        mCamera.setParameters(params);
        mCamera.startPreview();
    } else {
        if (mCamera != null) {              
            try {                   
                Parameters params = mCamera.getParameters();
                params.setFlashMode(MODE_OFF);
                mCamera.setParameters(params);                  
            } finally {
                new Thread(new Runnable() {
                    public void run() {
                        Log.i(TAG, "new Thread - start");
                        lock = true;
                        mCamera.setPreviewCallback(null);
                        mCamera.stopPreview();
                        mCamera.release();
                        mCamera = null;
                        lock = false;
                        Log.i(TAG, "new Thread - end");
                    }
                }).start();                                     
            }
        }
    }
}


//original
public void setOn(boolean on, Context context) {        
    Camera camera = mCamera;
    if (on) {           
        if (camera == null) {
            mCamera = camera = Camera.open();
        }

        Parameters params = camera.getParameters();
        params.setFlashMode(MODE_TORCH);
        camera.setParameters(params);
        camera.startPreview();
    } else {
        if (camera != null) {

            try {                   
                Parameters params = camera.getParameters();
                params.setFlashMode(MODE_OFF);
                camera.setParameters(params);                   
            } finally {
                camera.stopPreview();
                camera.release();
                mCamera = camera = null;
            }
        }
    }
}

【问题讨论】:

  • 这发生在哪个设备上?我们在 Android 4.3、4.4 和 5.0 的 Nexus 10 上遇到了完全相同的问题(4.2 没有这个问题)

标签: android camera release flashlight


【解决方案1】:

尝试将它放在一个线程中以在后台运行,这样它就不会挂起 UI。

new Thread(new Runnable(){
    public void run(){
        camera.setPreviewCallback(null); // PreviewCallback de_init.
        camera.stopPreview(); // stop Preview
        camera.release();
    }
}).start();

【讨论】:

  • 谢谢; UI 不再挂起。然而,camera.release() 仍然挂在这个新线程中。有什么线索吗?
  • 我今天早些时候遇到了那个帖子。它揭示了为什么它可能会挂起但没有提供解决方案,因为它声称大约 2 年前已经修复了一个错误来解决这个问题。
  • 您对可能出现的问题还有其他想法吗?我注意到其他示例不使用开始/停止预览。当我移除这些时,它不再挂起,但相机闪光灯不亮。 android-er.blogspot.com/2011/02/…
【解决方案2】:

对我来说,可行的解决方案是:

Try{
    camera.stopPreview();
    camera.setPreviewCallback(null);   
    camera.release();
    camera = null;
} catch (Exception e){
    //...
}

【讨论】:

    【解决方案3】:

    我已经解决了这个问题,在 release() 之前添加 camera.unlock()

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

    需要在更多设备上进行测试...

    【讨论】:

    • 很遗憾,这并不能解决我们在 Nexus 10 上遇到的问题。
    【解决方案4】:

    只需调用您的方法,例如

    mCamera.stopPreview();
    mCamera.setPreviewCallback(null);
    mCamera.release();
    

    你必须在 stopPreview 和 camera.releass 之间调用 setPreviewCallback(null)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多