检测后置摄像头缺失

8
我的应用程序需要后置摄像头的功能,前置摄像头是否存在对我的需求无关。在所有情况下,组合一个强大的例程来检测是否存在后置摄像头都很棘手。例如,一个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会发生什么情况。这会返回真吗?

我正在寻找能够确定是否存在后置摄像头的代码!


2
请注意,这段代码在运行安装有JB 4.2的原生Nexus 7设备上会返回false。 - Raghav Sood
Sahil - 过去我曾尝试过这样做,但被告知我没有足够的声望来这样做。我现在认为我有了足够的声望,所以一定会检查我的问题并确保完成,谢谢。 - androidneil
4个回答

9
Nexus 7(只有一个前置摄像头)返回FEATURE_CAMERA为false,您可以使用FEATURE_CAMERA_FRONT。请参阅此讨论
现在,通过使用上述方法,您可以确保至少有一个相机。因此,现在可以检查手机上的相机数量,如果大于1,则肯定有后置相机。
import android.hardware.Camera;

int numCameras = Camera.getNumberOfCameras();
if (numCameras > 1) {
  rearCamera = true;
}

这是相当棘手的。但这就是我能想到的全部了。试着去做吧。


所以看起来我的新的、更简单的代码可能就足够了,如果我只想知道后置摄像头的话。我能做的就是尝试并等待用户反馈吧。 - androidneil
4
仅后置摄像头可用时,此方法不起作用。 - Tran Hoang Duy Anh
@SahilMahajanMj 有些设备只有后置摄像头,没有前置摄像头。在这种情况下,numCameras = 1。 - Tran Hoang Duy Anh
@TranHoangDuyAnh,我已经得到了。但是现在你想要什么?你想知道是否存在前置摄像头还是其他什么? - Sahil Mahajan Mj
@TranHoangDuyAnh:FEATURE_CAMERAFEATURE_CAMERA_FRONT不能工作吗? - Sahil Mahajan Mj
显示剩余2条评论

2

使用此片段。请注意,仅适用于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;
}

这不需要打开相机。


1

如果设备只有一台相机,则可能只有后置摄像头或前置摄像头,请先检查后置摄像头是否存在:

  • 检查前置摄像头是否存在,但是有两个摄像头的设备显然有前置摄像头
  • 检查设备是否仅有一台摄像头,但它可以是后置或前置摄像头
  • 最终结果:如果设备具有前置摄像头且仅有一台摄像头,则后置摄像头不存在
private boolean backCameraExists() {
    boolean isFrontExists = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
    if (isFrontExists && (Camera.getNumberOfCameras()<2)) {
        return false;
    }
    return true;
}

1

前置摄像头

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");

      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接