From 8eda6847f4225ba1c115ca8442783e99cc2f09a9 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Mon, 21 Oct 2019 14:37:38 +0800 Subject: [PATCH] [Wi-Fi] Release the camera before opening As per the Google's design mentioned at https://developer.android.com/training/camera/cameradirect.html Calling Camera.open() throws an exception if the camera is already in use by another application, so we wrap it in a try block one must release the camera before opening Bug: 141662635 Test: Manual occurs once while testing 10 times 1.Open wifi settings,tap QR code icon 2.Make a incoming VoLTE call,tap incoming VoLTE call dialog 3.Check device Signed-off-by: JeiFeng Lee Change-Id: Ief62600af8b745cb4eae2e5ae277a2cebdda68eb --- .../settings/wifi/qrcode/QrCamera.java | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/wifi/qrcode/QrCamera.java b/src/com/android/settings/wifi/qrcode/QrCamera.java index f0afd606130..3e9c0b25c3d 100644 --- a/src/com/android/settings/wifi/qrcode/QrCamera.java +++ b/src/com/android/settings/wifi/qrcode/QrCamera.java @@ -288,32 +288,43 @@ public class QrCamera extends Handler { for (int i = 0; i < numberOfCameras; ++i) { Camera.getCameraInfo(i, cameraInfo); if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { + releaseCamera(); mCamera = Camera.open(i); - mCamera.setPreviewTexture(surface); mCameraOrientation = cameraInfo.orientation; break; } } - if (mCamera == null) { - Log.e(TAG, "Cannot find available back camera."); - mScannerCallback.handleCameraFailure(); - return false; - } - setCameraParameter(); - setTransformationMatrix(); - if (!startPreview()) { - Log.e(TAG, "Error to init Camera"); - mCamera = null; - mScannerCallback.handleCameraFailure(); - return false; - } - return true; - } catch (IOException e) { - Log.e(TAG, "Error to init Camera"); + } catch (RuntimeException e) { + Log.e(TAG, "Fail to open camera: " + e); mCamera = null; mScannerCallback.handleCameraFailure(); return false; } + + try { + if (mCamera == null) { + throw new IOException("Cannot find available back camera"); + } + mCamera.setPreviewTexture(surface); + setCameraParameter(); + setTransformationMatrix(); + if (!startPreview()) { + throw new IOException("Lost contex"); + } + } catch (IOException ioe) { + Log.e(TAG, "Fail to startPreview camera: " + ioe); + mCamera = null; + mScannerCallback.handleCameraFailure(); + return false; + } + return true; + } + } + + private void releaseCamera() { + if (mCamera != null) { + mCamera.release(); + mCamera = null; } }