检测缺少后置摄像头
Posted
技术标签:
【中文标题】检测缺少后置摄像头【英文标题】:Detecting lack of rear camera 【发布时间】:2013-01-02 04:30:06 【问题描述】:我的应用具有需要后置摄像头的功能。是否有前置摄像头与我的需求无关。事实证明,在所有情况下,建立一个强大的程序来检测是否存在后置摄像头是很棘手的。例如,使用 HTC Evo 3D 的用户抱怨该应用程序说没有后置摄像头(显然有),我也收到过其他用户的许多类似投诉。
这是一件很难测试的事情,因为尽管有很多设备,但我没有只有前置摄像头的设备,例如 Nexus 7,或者用户提到的任何型号。
这是我所拥有的,这是从本网站上其他答案的代码中获取的:
boolean rearCameraFound = false;
if(BUILD_VERSION > 8)
int cameraCount = 0;
Camera cam = null;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for ( int camIdx = 0; camIdx < cameraCount; camIdx++ )
Camera.getCameraInfo( camIdx, cameraInfo );
if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK )
try
cam = Camera.open( camIdx );
Log.d("TAG", "Rear camera detected");
rearCameraFound = true;
catch (RuntimeException e)
Log.e("TAG", "Camera failed to open: " + e.getLocalizedMessage());
if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT )
Log.d("TAG", "Front camera detected");
return rearCameraFound;
else
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))
// this device has a camera
return true;
else
// no camera on this device
return false;
我现在用这个更简单的版本替换了这段代码:
PackageManager pm = context.getPackageManager();
return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
但是,我不知道在 Nexus 7 上会发生什么,例如,只有前置摄像头。这会返回 true 吗?
我正在寻找可以确定是否有后置摄像头的代码!
【问题讨论】:
仅供参考,此代码在 Nexus 7 running stock JB 4.2 上返回 false Sahil - 过去我曾尝试这样做,但被告知我没有足够的声誉来这样做。我想我现在已经知道了,所以一定要解决我的问题并确保完成,谢谢。 【参考方案1】:Nexus 7(只有一个前置摄像头)向FEATURE_CAMERA
返回false,您可以使用FEATURE_CAMERA_FRONT
代替它。看看这个discussion。
现在,通过使用上述方法,您可以确保至少有一个摄像头。所以现在,你可以检查一下手机中的摄像头数量,如果大于一个,那么肯定会有后置摄像头。
import android.hardware.Camera;
int numCameras = Camera.getNumberOfCameras();
if (numCameras > 1)
rearCamera = true;
这很棘手。但仅此而已,我现在能想到的。试试看吧。
【讨论】:
因此,如果我只想了解后置摄像头,我的更新、更简单的代码似乎就足够了。我所能做的就是尝试等待用户反馈。 这不适用于只有后置摄像头可用的情况。 @TranHoangDuyAnh 你到底想做什么? @SahilMahajanMj 有些设备只有后置摄像头,没有前置摄像头。在这种情况下,numCameras = 1。 @TranHoangDuyAnh 我得到了。但现在你想要什么?你想知道前置摄像头是存在还是 wat ?【参考方案2】:使用这个 sn-p。请注意,这只适用于 API 9 或更高版本。
private static boolean checkCameraFacing(final int facing)
if (getSdkVersion() < Build.VERSION_CODES.GINGERBREAD)
return false;
final int cameraCount = Camera.getNumberOfCameras();
CameraInfo info = new CameraInfo();
for (int i = 0; i < cameraCount; i++)
Camera.getCameraInfo(i, info);
if (facing == info.facing)
return true;
return false;
public static boolean hasBackFacingCamera()
final int CAMERA_FACING_BACK = 0;
return checkCameraFacing(CAMERA_FACING_BACK);
public static boolean hasFrontFacingCamera()
final int CAMERA_FACING_BACK = 1;
return checkCameraFacing(CAMERA_FACING_BACK);
public static int getSdkVersion()
return android.os.Build.VERSION.SDK_INT;
而且这样就不用打开相机了。
【讨论】:
【参考方案3】:前置摄像头
Context context = this; //If its Activity
// Context context=getActivity(); If its a Fragment
PackageManager packageManager = context.getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT))
Log.i("CameraLog", "Front Camera Available");
else
Log.i("CameraLog", "No Front Camera Available");
后置摄像头
Context context = this; //If its an Activity
// Context context=getActivity(); If its a fragments
PackageManager packageManager = context.getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA))
Log.i("CameraLog", "Back Camera is Available");
else
Log.i("CameraLog", "No Back Camera Available");
【讨论】:
【参考方案4】:如果设备只有一个摄像头,它可以只有后置摄像头,也可以只有前置摄像头,首先检查后置摄像头是否存在:
检查前置摄像头是否存在,但有两个摄像头的设备明显有前置摄像头 检查设备是否只有一个摄像头,但它可以有后置或前置摄像头 最终结果:如果设备有前置摄像头且只有一个摄像头,则后置摄像头不存在private boolean backCameraExists()
boolean isFrontExists = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
if (isFrontExists && (Camera.getNumberOfCameras()<2))
return false;
return true;
【讨论】:
以上是关于检测缺少后置摄像头的主要内容,如果未能解决你的问题,请参考以下文章
android Camera如何判断当前使用的摄像头是前置还是后置