From: Nathaniel McCallum Date: Tue, 10 Dec 2013 21:20:51 +0000 (-0500) Subject: Use multiple techniques to find cameras X-Git-Url: http://pileus.org/git/?p=~andy%2Ffreeotp;a=commitdiff_plain;h=2b2fb5d5496959a43e25e8fc1839dee4df298fc2 Use multiple techniques to find cameras --- diff --git a/src/org/fedorahosted/freeotp/MainActivity.java b/src/org/fedorahosted/freeotp/MainActivity.java index f72386d..efcdae3 100644 --- a/src/org/fedorahosted/freeotp/MainActivity.java +++ b/src/org/fedorahosted/freeotp/MainActivity.java @@ -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 {