diff options
author | michaelbai@chromium.org <michaelbai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-07 21:18:49 +0000 |
---|---|---|
committer | michaelbai@chromium.org <michaelbai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-07 21:18:49 +0000 |
commit | c046ccfa02ef700a0f516b4e79c496e82a1aa8d0 (patch) | |
tree | 7792854f66c4ca5fdb7be48e64cd50f9724da146 /media | |
parent | e1a99891375075a5edcbe73857000c13b2437f4b (diff) | |
download | chromium_src-c046ccfa02ef700a0f516b4e79c496e82a1aa8d0.zip chromium_src-c046ccfa02ef700a0f516b4e79c496e82a1aa8d0.tar.gz chromium_src-c046ccfa02ef700a0f516b4e79c496e82a1aa8d0.tar.bz2 |
Check the permission at the first time we query the camera, if the permission is missing, no camera will returned.
BUG=369384
Review URL: https://codereview.chromium.org/264833006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@268952 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java | 54 | ||||
-rw-r--r-- | media/video/capture/android/video_capture_device_factory_android.cc | 3 |
2 files changed, 40 insertions, 17 deletions
diff --git a/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java b/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java index 6083861..25c7cba 100644 --- a/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java +++ b/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java @@ -5,6 +5,7 @@ package org.chromium.media; import android.content.Context; +import android.content.pm.PackageManager; import android.hardware.Camera; import android.util.Log; @@ -27,7 +28,7 @@ import org.chromium.media.VideoCapture; @JNINamespace("media") class VideoCaptureFactory { - protected static class CamParams { + static class CamParams { final int mId; final String mName; final int mWidth; @@ -41,7 +42,7 @@ class VideoCaptureFactory { } } - protected static class ChromiumCameraInfo { + static class ChromiumCameraInfo { private final int mId; private final Camera.CameraInfo mCameraInfo; // Special devices have more cameras than usual. Those devices are @@ -52,6 +53,8 @@ class VideoCaptureFactory { }; private static final String TAG = "ChromiumCameraInfo"; + private static int sNumberOfSystemCameras = -1; + private static boolean isSpecialDevice() { for (String[] device : s_SPECIAL_DEVICE_LIST) { if (device[0].contentEquals(android.os.Build.MODEL) && @@ -62,19 +65,44 @@ class VideoCaptureFactory { return false; } + private static boolean isSpecialCamera(int id) { + return id >= sNumberOfSystemCameras; + } + + private static int toSpecialCameraId(int id) { + assert isSpecialCamera(id); + return id - sNumberOfSystemCameras; + } + private ChromiumCameraInfo(int index) { mId = index; mCameraInfo = isSpecialCamera(index) ? null : getCameraInfo(mId); } @CalledByNative("ChromiumCameraInfo") - private static int getNumberOfCameras() { + private static int getNumberOfCameras(Context appContext) { + // Camera.getNumberOfCammeras() will not fail without permission, but the + // following operation on camera will do. Without permission isn't fatal + // error in WebView, specially for those application which has no purpose + // to use camera, but happens to load page required it. + // So, we output a warning log and pretend system have no camera at all. + if (sNumberOfSystemCameras == -1) { + if (PackageManager.PERMISSION_GRANTED == + appContext.getPackageManager().checkPermission( + "android.permission.CAMERA", appContext.getPackageName())) { + sNumberOfSystemCameras = Camera.getNumberOfCameras(); + } else { + sNumberOfSystemCameras = 0; + Log.w(TAG, "Missing android.permission.CAMERA permission, " + + "no system camera available."); + } + } if (isSpecialDevice()) { Log.d(TAG, "Special device: " + android.os.Build.MODEL); - return Camera.getNumberOfCameras() + + return sNumberOfSystemCameras + VideoCaptureTango.numberOfCameras(); } else { - return Camera.getNumberOfCameras(); + return sNumberOfSystemCameras; } } @@ -91,8 +119,7 @@ class VideoCaptureFactory { @CalledByNative("ChromiumCameraInfo") private String getDeviceName() { if (isSpecialCamera(mId)) { - return VideoCaptureTango.getCamParams( - mId - Camera.getNumberOfCameras()).mName; + return VideoCaptureTango.getCamParams(toSpecialCameraId(mId)).mName; } else { if (mCameraInfo == null) { return ""; @@ -127,17 +154,12 @@ class VideoCaptureFactory { } } - protected static boolean isSpecialCamera(int id) { - return id >= Camera.getNumberOfCameras(); - } - // Factory methods. @CalledByNative static VideoCapture createVideoCapture( Context context, int id, long nativeVideoCaptureDeviceAndroid) { - if (isSpecialCamera(id)) { - return new VideoCaptureTango(context, - id - Camera.getNumberOfCameras(), + if (ChromiumCameraInfo.isSpecialCamera(id)) { + return new VideoCaptureTango(context, ChromiumCameraInfo.toSpecialCameraId(id), nativeVideoCaptureDeviceAndroid); } else { return new VideoCaptureAndroid(context, id, @@ -147,9 +169,9 @@ class VideoCaptureFactory { @CalledByNative static VideoCapture.CaptureFormat[] getDeviceSupportedFormats(int id) { - return isSpecialCamera(id) ? + return ChromiumCameraInfo.isSpecialCamera(id) ? VideoCaptureTango.getDeviceSupportedFormats( - id - Camera.getNumberOfCameras()) : + ChromiumCameraInfo.toSpecialCameraId(id)) : VideoCaptureAndroid.getDeviceSupportedFormats(id); } diff --git a/media/video/capture/android/video_capture_device_factory_android.cc b/media/video/capture/android/video_capture_device_factory_android.cc index a473cb9..e9a806a 100644 --- a/media/video/capture/android/video_capture_device_factory_android.cc +++ b/media/video/capture/android/video_capture_device_factory_android.cc @@ -22,7 +22,8 @@ void VideoCaptureDeviceFactoryAndroid::GetDeviceNames( JNIEnv* env = AttachCurrentThread(); - int num_cameras = Java_ChromiumCameraInfo_getNumberOfCameras(env); + int num_cameras = Java_ChromiumCameraInfo_getNumberOfCameras( + env, base::android::GetApplicationContext()); DVLOG(1) << "VideoCaptureDevice::GetDeviceNames: num_cameras=" << num_cameras; if (num_cameras <= 0) return; |