OSDN Git Service

[Wi-Fi] Release the camera before opening
authorArc Wang <arcwang@google.com>
Mon, 21 Oct 2019 06:37:38 +0000 (14:37 +0800)
committerArc Wang <arcwang@google.com>
Mon, 21 Oct 2019 07:38:41 +0000 (15:38 +0800)
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 <linger.lee@mediatek.com>
Change-Id: Ief62600af8b745cb4eae2e5ae277a2cebdda68eb

src/com/android/settings/wifi/qrcode/QrCamera.java

index f0afd60..3e9c0b2 100644 (file)
@@ -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;
                     }
                 }
+            } catch (RuntimeException e) {
+                Log.e(TAG, "Fail to open camera: " + e);
+                mCamera = null;
+                mScannerCallback.handleCameraFailure();
+                return false;
+            }
+
+            try {
                 if (mCamera == null) {
-                    Log.e(TAG, "Cannot find available back camera.");
-                    mScannerCallback.handleCameraFailure();
-                    return false;
+                    throw new IOException("Cannot find available back camera");
                 }
+                mCamera.setPreviewTexture(surface);
                 setCameraParameter();
                 setTransformationMatrix();
                 if (!startPreview()) {
-                    Log.e(TAG, "Error to init Camera");
-                    mCamera = null;
-                    mScannerCallback.handleCameraFailure();
-                    return false;
+                    throw new IOException("Lost contex");
                 }
-                return true;
-            } catch (IOException e) {
-                Log.e(TAG, "Error to init Camera");
+            } 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;
         }
     }