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. У нас есть собственное устройство.