]> Pileus Git - ~andy/freeotp/commitdiff
Use multiple techniques to find cameras
authorNathaniel McCallum <npmccallum@redhat.com>
Tue, 10 Dec 2013 21:20:51 +0000 (16:20 -0500)
committerNathaniel McCallum <npmccallum@redhat.com>
Tue, 10 Dec 2013 21:20:51 +0000 (16:20 -0500)
src/org/fedorahosted/freeotp/MainActivity.java

index f72386da07b2064f4c5fcd985680787e342a56a3..efcdae338836113c76752b86b90ac87474ceefb1 100644 (file)
@@ -42,6 +42,8 @@ import org.fedorahosted.freeotp.adapters.TokenAdapter;
 import android.app.Activity;
 import android.content.pm.PackageManager;
 import android.database.DataSetObserver;
+import android.hardware.Camera;
+import android.hardware.Camera.CameraInfo;
 import android.os.Bundle;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -94,9 +96,19 @@ public class MainActivity extends Activity implements OnMenuItemClickListener {
        public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.action_add:
+                       // Look for a back-facing camera.
+                       boolean backCamera = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
+
+                       // If the above method doesn't return a camera, try to work around it.
+                       // Some buggy implementations return false above even when there is a camera.
+                       for (int i = Camera.getNumberOfCameras() - 1; i >= 0 && !backCamera; i--) {
+                               CameraInfo ci = new CameraInfo();
+                               Camera.getCameraInfo(i, ci);
+                               backCamera = ci.facing == CameraInfo.CAMERA_FACING_BACK;
+                       }
+
                        // If the device has a camera available, try to scan for QR code
-                       PackageManager pm = getPackageManager();
-                       if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
+                       if (backCamera) {
                                new CameraDialogFragment().show(getFragmentManager(),
                                                CameraDialogFragment.FRAGMENT_TAG);
                        } else {