приложение висит на camera.release () - PullRequest
3 голосов
/ 09 января 2012

Я работаю над фонариком, используя вспышку камеры. Кажется, он работает нормально, но иногда вызывает 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;
            }
        }
    }
}

Ответы [ 4 ]

1 голос
/ 09 января 2012

Попробуйте поместить его в поток для запуска в фоновом режиме, чтобы он не зависал.

new Thread(new Runnable(){
    public void run(){
        camera.setPreviewCallback(null); // PreviewCallback de_init.
        camera.stopPreview(); // stop Preview
        camera.release();
    }
}).start();
0 голосов
/ 06 мая 2015

просто вызовите ваши методы как

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

Вы должны вызвать setPreviewCallback (null) между stopPreview и camera.releass

0 голосов
/ 31 июля 2013

Я решил эту проблему, добавив camera.unlock () перед выпуском ()

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

Необходим тест для большего количества устройств ...

0 голосов
/ 16 июля 2012

Для меня решение, которое работает:

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