From 1c6d3f7eae87cf31eabc3c9389c375170097cad4 Mon Sep 17 00:00:00 2001 From: sakal Date: Thu, 22 Sep 2016 05:52:08 -0700 Subject: [PATCH] Add new Camera2Enumerator.isSupported with Context parameter. The old method is marked deprecated and will be removed soon. The new method checks if all cameras on the device support better than legacy implementation of the camera2 API. BUG=webrtc:6390 Review-Url: https://codereview.webrtc.org/2354883002 Cr-Commit-Position: refs/heads/master@{#14350} --- .../src/org/webrtc/Camera2Enumerator.java | 34 +++++++++++++++++++ .../androidapp/res/values/strings.xml | 2 +- .../src/org/appspot/apprtc/CallActivity.java | 2 +- .../org/appspot/apprtc/SettingsActivity.java | 2 +- .../apprtc/test/PeerConnectionClientTest.java | 3 +- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/webrtc/api/android/java/src/org/webrtc/Camera2Enumerator.java b/webrtc/api/android/java/src/org/webrtc/Camera2Enumerator.java index c723b0da0b..3ce85fee78 100644 --- a/webrtc/api/android/java/src/org/webrtc/Camera2Enumerator.java +++ b/webrtc/api/android/java/src/org/webrtc/Camera2Enumerator.java @@ -104,10 +104,44 @@ public class Camera2Enumerator implements CameraEnumerator { } } + /** + * Checks if Android version is new enough to support camera2. + * + * This method will be removed soon. Use isSupported(Context). + */ + @Deprecated public static boolean isSupported() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } + /** + * Checks if API is supported and all cameras have better than legacy support. + */ + public static boolean isSupported(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + return false; + } + + CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); + try { + String[] cameraIds = cameraManager.getCameraIdList(); + for (String id : cameraIds) { + CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(id); + if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) + == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) { + return false; + } + } + // On Android OS pre 4.4.2, a class will not load because of VerifyError if it contains a + // catch statement with an Exception from a newer API, even if the code is never executed. + // https://code.google.com/p/android/issues/detail?id=209129 + } catch (/* CameraAccessException */ AndroidException e) { + Logging.e(TAG, "Camera access exception: " + e); + return false; + } + return true; + } + static int getFpsUnitFactor(Range[] fpsRanges) { if (fpsRanges.length == 0) { return 1000; diff --git a/webrtc/examples/androidapp/res/values/strings.xml b/webrtc/examples/androidapp/res/values/strings.xml index 12bb88b464..c0c1c677e2 100644 --- a/webrtc/examples/androidapp/res/values/strings.xml +++ b/webrtc/examples/androidapp/res/values/strings.xml @@ -42,7 +42,7 @@ camera2_preference Use Camera2. true - Only supported on Android Lollipop and forward. + Not supported on this device. resolution_preference Video resolution. diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java index a1ea8a457d..3763c9e682 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java @@ -232,7 +232,7 @@ public class CallActivity extends Activity boolean loopback = intent.getBooleanExtra(EXTRA_LOOPBACK, false); boolean tracing = intent.getBooleanExtra(EXTRA_TRACING, false); - boolean useCamera2 = Camera2Enumerator.isSupported() + boolean useCamera2 = Camera2Enumerator.isSupported(this) && intent.getBooleanExtra(EXTRA_CAMERA2, true); peerConnectionParameters = new PeerConnectionParameters( diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java index 4114828f09..7f8daad138 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java @@ -126,7 +126,7 @@ public class SettingsActivity extends Activity updateSummaryB(sharedPreferences, keyPrefDisplayHud); updateSummaryB(sharedPreferences, keyPrefTracing); - if (!Camera2Enumerator.isSupported()) { + if (!Camera2Enumerator.isSupported(this)) { Preference camera2Preference = settingsFragment.findPreference(keyprefCamera2); diff --git a/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java b/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java index 85052ea3e2..5b60e71307 100644 --- a/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java +++ b/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java @@ -291,7 +291,8 @@ public class PeerConnectionClientTest extends InstrumentationTestCase private PeerConnectionParameters createParametersForVideoCall( String videoCodec, boolean captureToTexture) { - final boolean useCamera2 = captureToTexture && Camera2Enumerator.isSupported(); + final boolean useCamera2 = captureToTexture + && Camera2Enumerator.isSupported(getInstrumentation().getTargetContext()); PeerConnectionParameters peerConnectionParameters = new PeerConnectionParameters(