Камера Android заблокирована после закрытия силы - программирование
Подтвердить что ты не робот

Камера Android заблокирована после закрытия силы

У меня есть приложение, в котором я использую камеры устройств.

Теперь я освобождаю камеру только в нормальном режиме.

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

Таким образом, приложение неожиданно завершает работу в режиме камеры, т.е. Force Close (из-за OutOfMemoryError) - камера блокируется. И единственный способ его освободить - перезапустить устройство.

И после запуска приложения я получаю: RuntimeException: Fail to connect to camera service

Как я могу убедиться, что камера выпущена в любом случае?

4b9b3361

Ответ 1

Так как лучший способ сохранить часть кода так, чтобы вы его нашли позже, это опубликовать его в 'net,

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();

Ответ 2

Как предложили @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();
        }
    }
} 

Ответ 3

Ошибка из памяти возникает из-за того, что изображение, которое вы пытались сохранить, превысило лимит, обычно приходит, когда вы пытаетесь обработать растровое изображение.

Вы можете попробовать эти методы, чтобы избежать освобождения камеры.

Камера myCamera;

Используйте журналы и пальцы, где возникает ошибка, и Добавьте блок catch try и в блок catch добавьте myCamera.stopPreview(); и myCamera.release(); Также переопределите метод ondestroy и onpause и add myCamera.stopPreview(); и myCamera.release();

Надеюсь, это поможет вам или, по крайней мере, дать вам представление.

Ответ 4

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;
}}

сделайте это так.