12

我有一个使用设备相机的应用程序。

现在我只在正常流程中释放相机。

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
    if(camera != null) {
        camera.stopPreview();
        camera.release();
    } 
} 

因此,然后应用程序以意想不到的方式退出相机模式 - 即强制关闭(由于OutOfMemoryError) - 相机被锁定。释放它的唯一方法是重新启动设备。

申请开始后,我得到: RuntimeException: Fail to connect to camera service

我怎么能确定那台相机无论如何都会被释放?

4

4 回答 4

4

正如@CommonsWare 建议的那样,如果您想确保您的应用程序在崩溃之前释放相机,您应该使用Thread.setDefaultUncaughtExceptionHandler().

或者,如果您使用的是 Bugsense:

private class MyCameraActivity extends Activity implements SurfaceHolder.Callback, ExceptionCallback {

    @Override
    protected void onCreate(Bundle sSavedInstanceState) {
        super.onCreate(sSavedInstanceState);

        BugSenseHandler.setExceptionCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        this.camera = open();

        try {
            camera.setPreviewDisplay(holder);
        } catch (IOException e) {
            Log.e(TAG, e.getMessage(), e);
        }

        // other camera stuff
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        releaseCamera();
    }

    @Override
    public void lastBreath() {
        releaseCamera();
    }

    private void releaseCamera() {
        if (camera != null) {
            camera.stopPreview();
            camera.release();
        }
    }
} 
于 2013-06-26T12:46:54.883 回答
4

由于保留部分代码以便您以后找到它的最佳方法是将其发布在“网络”中,

private UnexpectedTerminationHelper mUnexpectedTerminationHelper = new UnexpectedTerminationHelper();
private class UnexpectedTerminationHelper {
    private Thread mThread;
    private Thread.UncaughtExceptionHandler mOldUncaughtExceptionHandler = null;
    private Thread.UncaughtExceptionHandler mUncaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) { // gets called on the same (main) thread
            XXXX.closeCamera(); // TODO: write appropriate code here
            if(mOldUncaughtExceptionHandler != null) {
                // it displays the "force close" dialog
                mOldUncaughtExceptionHandler.uncaughtException(thread, ex);
            }
        }
    };
    void init() {
        mThread = Thread.currentThread();
        mOldUncaughtExceptionHandler = mThread.getUncaughtExceptionHandler();
        mThread.setUncaughtExceptionHandler(mUncaughtExceptionHandler);
    }
    void fini() {
        mThread.setUncaughtExceptionHandler(mOldUncaughtExceptionHandler);
        mOldUncaughtExceptionHandler = null;
        mThread = null;
    }
}

并且,在主线程的适当位置:

    mUnexpectedTerminationHelper.init();

    mUnexpectedTerminationHelper.fini();
于 2013-06-27T07:20:09.043 回答
0

出现内存不足错误是因为您尝试保存的图像超出了限制,通常在您尝试处理位图时出现。

您可以尝试这些方法来避免相机无法释放。

相机我的相机;

在发生错误的地方使用日志和 fing 并添加 try catch 块并在 catch 块中添加myCamera.stopPreview();myCamera.release(); 覆盖 ondestroy 和 onpause 方法add myCamera.stopPreview();以及myCamera.release();

希望这可以帮助您或至少给您一个想法。

于 2013-06-26T12:08:13.400 回答
-3
private void stopPreviewAndFreeCamera() {

if (mCamera != null) {
    /*
      Call stopPreview() to stop updating the preview surface.
    */
    mCamera.stopPreview();

    /*
      Important: Call release() to release the camera for use by other applications. 
      Applications should release the camera immediately in onPause() (and re-open() it in
      onResume()).
    */
    mCamera.release();

    mCamera = null;
}}

像这样做。

于 2013-06-26T11:27:34.723 回答