summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authormichaelbai@chromium.org <michaelbai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-07 21:18:49 +0000
committermichaelbai@chromium.org <michaelbai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-07 21:18:49 +0000
commitc046ccfa02ef700a0f516b4e79c496e82a1aa8d0 (patch)
tree7792854f66c4ca5fdb7be48e64cd50f9724da146 /media
parente1a99891375075a5edcbe73857000c13b2437f4b (diff)
downloadchromium_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.java54
-rw-r--r--media/video/capture/android/video_capture_device_factory_android.cc3
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;