Camera.release() занимает 30 секунд, чтобы освободить камеру в Nexus 10. Есть ли способ ускорить процесс?

Я использую следующий код для освобождения камеры в 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;
    }
}

Я вызываю mCamera.stopPreview() перед вызовом releaseCamera()

Есть ли способ, которым я могу сделать это асинхронно? Потому что переход от действия Camerapreview к следующему занятию занимает не более минуты.

Edit1: мы уменьшили размер предварительного просмотра с самого высокого (1080x1920) до среднего диапазона (480x800), и все стало работать нормально. Размер предварительного просмотра имеет какое-либо отношение к выпуску камеры в HAL?

3 ответа

В качестве обходного пути вы можете попытаться освободить камеру внутри Thread, хотя это не идеальное решение. Вы можете запустить следующее действие, пока функция релиза выполняется в фоновом режиме.

   new AsyncTask() {

        @Override
        protected Object doInBackground(Object... params) {
            releaseCamera();
            return null;
        };
    }.execute();

Дилип, это известная проблема в Nexus 10, Проверьте эту камеру Nexus 10. Релиз висит на 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

Мне не нужен уровень репутации, чтобы добавить комментарий, поэтому я выложу его здесь:

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

}).Начните();

Когда вызов освобождения будет выполняться в отдельном потоке, это вызовет проблему для другого приложения, которое использует камеру и будет запущено поверх этого. Я тоже ищу решение. У меня нет Nexus10. У нас есть собственное устройство.

Другие вопросы по тегам