diff options
Diffstat (limited to 'apps/TestingCamera2')
5 files changed, 109 insertions, 11 deletions
diff --git a/apps/TestingCamera2/AndroidManifest.xml b/apps/TestingCamera2/AndroidManifest.xml index 5127f0e..79c1b7f 100644 --- a/apps/TestingCamera2/AndroidManifest.xml +++ b/apps/TestingCamera2/AndroidManifest.xml @@ -30,7 +30,7 @@ <uses-sdk android:minSdkVersion="21" - android:targetSdkVersion="21" /> + android:targetSdkVersion="10000" /> <uses-feature android:name="android.hardware.camera.front" diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java b/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java index 00f721e..b220328 100644 --- a/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java +++ b/apps/TestingCamera2/src/com/android/testingcamera2/CameraControlPane.java @@ -376,8 +376,7 @@ public class CameraControlPane extends ControlPane { if (isChecked) { // Open camera mCurrentCamera = null; - boolean success = mCameraOps.openCamera(mCurrentCameraId, mCameraListener); - buttonView.setChecked(success); + mCameraOps.openCamera(mCurrentCameraId, mCameraListener); } else { // Close camera closeCurrentCamera(); @@ -520,6 +519,7 @@ public class CameraControlPane extends ControlPane { @Override public void onClosed(CameraDevice camera) { // Don't change state on close, tracked by callers of close() + mOpenButton.setChecked(false); } @Override @@ -558,7 +558,6 @@ public class CameraControlPane extends ControlPane { mCurrentCamera.close(); mCurrentCamera = null; setCameraState(CameraState.CLOSED); - mOpenButton.setChecked(false); } } 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); diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/TestingCamera21.java b/apps/TestingCamera2/src/com/android/testingcamera2/TestingCamera21.java index c78c401..c15a78c 100644 --- a/apps/TestingCamera2/src/com/android/testingcamera2/TestingCamera21.java +++ b/apps/TestingCamera2/src/com/android/testingcamera2/TestingCamera21.java @@ -184,6 +184,12 @@ public class TestingCamera21 extends Activity implements CameraControlPane.InfoD return super.onOptionsItemSelected(item); } + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + mCameraOps.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + /** * Get shared camera controls */ diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java b/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java index 64fa8a4..9bd3113 100644 --- a/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java +++ b/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java @@ -16,7 +16,9 @@ package com.android.testingcamera2.v1; +import android.Manifest; import android.app.Activity; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -108,7 +110,7 @@ public class TestingCamera2 extends Activity implements SurfaceHolder.Callback { private final Set<View> mManualControls = new HashSet<View>(); private final Set<View> mAutoControls = new HashSet<View>(); - + private static final int PERMISSIONS_REQUEST_CAMERA = 1; Handler mMainHandler; boolean mUseMediaCodec; @@ -196,9 +198,45 @@ public class TestingCamera2 extends Activity implements SurfaceHolder.Callback { @Override public void onResume() { super.onResume(); - try { - if (VERBOSE) Log.v(TAG, String.format("onResume")); + if (VERBOSE) Log.v(TAG, String.format("onResume")); + + if ((checkSelfPermission(Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED ) + || (checkSelfPermission(Manifest.permission.RECORD_AUDIO) + != PackageManager.PERMISSION_GRANTED) + || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED)) { + Log.i(TAG, "Requested camera/video permissions"); + requestPermissions(new String[] { + Manifest.permission.CAMERA, + Manifest.permission.RECORD_AUDIO, + Manifest.permission.WRITE_EXTERNAL_STORAGE}, + PERMISSIONS_REQUEST_CAMERA); + return; + } + setUpPreview(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + if (requestCode == PERMISSIONS_REQUEST_CAMERA) { + for (int i = 0; i < grantResults.length; i++) { + if (grantResults[i] == PackageManager.PERMISSION_DENIED) { + Log.i(TAG, "At least one permission denied, can't continue: " + permissions[i]); + finish(); + return; + } + } + + Log.i(TAG, "All permissions granted"); + setUpPreview(); + } + } + + private void setUpPreview() { + try { mCameraOps.minimalPreviewConfig(mPreviewView.getHolder()); mCurrentPreviewHolder = mPreviewView.getHolder(); } catch (ApiFailureException e) { |