我的应用程序,需要一个后置摄像头功能。 是否有前置摄像头与否无关,我的需要。 组建了一个强大的程序,以检测一个后置摄像头是否存在,在任何情况下,被证明是非常棘手。 例如,与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(其中只有一个正面镜头)返回false FEATURE_CAMERA
,取而代之的是,你可以使用FEATURE_CAMERA_FRONT
。 看看这个讨论 。
现在,通过使用上述,可以确保有一个ATLEAST相机。 所以,现在,你可以检查相机的存在的号码在电话中,如果是大于一,那么就会有肯定是一个后置摄像头。
import android.hardware.Camera;
int numCameras = Camera.getNumberOfCameras();
if (numCameras > 1) {
rearCamera = true;
}
这是相当棘手。 但是,这一切,我现在能想到的。 只要给它一个尝试。
使用此片段。 注意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;
}
这是无需打开相机。
对于前置摄像头
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");
}
如果设备只有一个摄像头,它只能有后置摄像头,或者只有前置摄像头,首先检查后置摄像头存在:
- 检查前置摄像头的存在,但有两个摄像头设备有前置摄像头明显
- 检查设备只有一个摄像头,但它可以有背部或前置摄像头
- 最终结果:如果设备有前置摄像头,它只有一个摄像头,后置摄像头不存在
private boolean backCameraExists() {
boolean isFrontExists = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
if (isFrontExists && (Camera.getNumberOfCameras()<2)) {
return false;
}
return true;
}