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(