Я предлагаю два решения, которые сработали для меня. 1) Остановите и возобновите камеру правильно. Я делаю это, вызывая эти методы для onPause и onResume, также в середине предварительного просмотра камеры, где я сканирую QR-коды в своем приложении:
public void stopCamera(){
mCamera.cancelAutoFocus();
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mPreviewing = false;
}
public void rethrottleCamera(){
updateViews(); //Updates my Layouts
mPreviewing = true;
mCamera.startPreview();
mCamera.setPreviewCallback(previewCb);
mCamera.autoFocus(autoFocusCB);
}
2) Очень сложно, но работает как по волшебству! Убедитесь, что вы вызываете автофокус после того, как поверхность предварительного просмотра была создана. Для этого запустите автофокус с задержкой 200 мс, чтобы выиграть время для создания поверхности. Установите это, нажав Ctrl + щелчок по объявлению объекта «CameraPreview», например:
CameraPreview my_camera;
Найдите метод public void surfaceChanged и внесите следующие изменения:
//Add a delay to AUTOFOCUS after mCamera.startpreview();!!:
mCamera.startPreview();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mCamera.autoFocus(autoFocusCallback);
}
}, 200); //<-200 millisecond delay
//If you call autofocus right after startPreview, chances are,
//that the previewSurface will have not been created yet,
//and autofocus will fail:
mCamera.startPreview(); //Bad idea!
mCamera.autoFocus(autoFocusCallback); //Bad idea!
Существует множество других исправлений, но эти два могут спасти ваш день.