diff options
Diffstat (limited to 'apps/TestingCamera2/src/com/android/testingcamera2/CameraOps2.java')
-rw-r--r-- | apps/TestingCamera2/src/com/android/testingcamera2/CameraOps2.java | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/CameraOps2.java b/apps/TestingCamera2/src/com/android/testingcamera2/CameraOps2.java index dcb3cab..ddf0098 100644 --- a/apps/TestingCamera2/src/com/android/testingcamera2/CameraOps2.java +++ b/apps/TestingCamera2/src/com/android/testingcamera2/CameraOps2.java @@ -19,7 +19,9 @@ package com.android.testingcamera2; import java.util.HashSet; import java.util.Set; -import android.content.Context; +import android.Manifest; +import android.app.Activity; +import android.content.pm.PackageManager; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; @@ -32,11 +34,17 @@ import android.hardware.camera2.CameraAccessException; public class CameraOps2 extends CameraManager.AvailabilityCallback { private final CameraManager mCameraManager; - + private final Activity mActivity; private final Set<CameraDevice> mOpenCameras = new HashSet<CameraDevice>(); - public CameraOps2(Context context) { - mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); + // For persisting values for permission requests + private static final int PERMISSIONS_REQUEST_CAMERA = 1; + private String mDelayedOpenId = null; + private CameraDevice.StateCallback mDelayedOpenListener = null; + + public CameraOps2(Activity activity) { + mActivity = activity; + mCameraManager = (CameraManager) activity.getSystemService(Activity.CAMERA_SERVICE); if (mCameraManager == null) { throw new AssertionError("Can't connect to camera manager!"); } @@ -101,6 +109,26 @@ public class CameraOps2 extends CameraManager.AvailabilityCallback { return false; } } + if ((mActivity.checkSelfPermission(Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED) + || (mActivity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED)) { + TLog.i("Requesting camera/storage permissions"); + + mDelayedOpenId = cameraId; + mDelayedOpenListener = listener; + + mActivity.requestPermissions(new String[] { + Manifest.permission.CAMERA, + Manifest.permission.WRITE_EXTERNAL_STORAGE }, + PERMISSIONS_REQUEST_CAMERA); + return false; + } + + return doOpenCamera(cameraId, listener); + } + + private boolean doOpenCamera(String cameraId, CameraDevice.StateCallback listener) { try { DeviceStateCallback proxyListener = new DeviceStateCallback(listener); mCameraManager.openCamera(cameraId, proxyListener, null); @@ -112,6 +140,33 @@ public class CameraOps2 extends CameraManager.AvailabilityCallback { return true; } + public void onRequestPermissionsResult (int requestCode, String[] permissions, + int[] grantResults) { + if (requestCode == PERMISSIONS_REQUEST_CAMERA) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + TLog.i("Camera permission granted"); + if (mDelayedOpenId != null && mDelayedOpenListener != null) { + doOpenCamera(mDelayedOpenId, mDelayedOpenListener); + } + mDelayedOpenId = null; + mDelayedOpenListener = null; + } else { + TLog.i("Camera permission denied, not opening camera"); + if (mDelayedOpenId != null && mDelayedOpenListener != null) { + mDelayedOpenListener.onError(null, + CameraDevice.StateCallback.ERROR_CAMERA_DISABLED); + mDelayedOpenId = null; + mDelayedOpenListener = null; + } + } + if (grantResults[1] == PackageManager.PERMISSION_GRANTED) { + TLog.i("Storage permission granted"); + } else { + TLog.i("Storage permission not granted; saving will not work"); + } + } + } + public CameraCharacteristics getCameraInfo(String cameraId) { try { return mCameraManager.getCameraCharacteristics(cameraId); |