检查设备是否有摄像头?

时间:2009-12-22 04:09:02

标签: android android-camera

在我的应用程序中,如果设备有相机,我想使用相机。是否有运行Android的设备没有有摄像头?通过在我的清单中加入以下内容:

<uses-feature android:name="android.hardware.camera" android:required="false"/>

然后它基本上说“我会使用相机,如果存在,但不需要一个运行应用程序”。

在尝试使用Camera类之前,如何检查设备上是否存在相机?

14 个答案:

答案 0 :(得分:214)

这就是我正在使用的

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
}

还可以使用各种其他有趣的东西 - 指南针,位置可用,是否有前置摄像头: http://developer.android.com/reference/android/content/pm/PackageManager.html

答案 1 :(得分:42)

要了解您的设备上有多少可用的相机,您可以致电:

import android.hardware.Camera;

int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
  hasCamera = true;
}

Camera.getNumberOfCameras()是静态的,因此不需要实际连接到相机。这适用于API 9。

编辑:

使用较新的camera2 API,您还可以调用CameraManager.getCameraIdList(),它会提供所有有效相机ID的列表,而不仅仅是计数。

答案 2 :(得分:10)

您应该使用此功能在设备中找到相机

public static boolean isCameraAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}

答案 3 :(得分:6)

使用 PackageManager.hasSystemFeature() 方法检查相机:

private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}

来源:https://developer.android.com/guide/topics/media/camera.html#custom-camera

答案 4 :(得分:5)

不推荐使用Camera.getNumberOfCameras()。您可以使用:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int getNumberOfCameras() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        try {
            return ((CameraManager) getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length;
        } catch (CameraAccessException e) {
            Log.e("", "", e);
        }
    }
    return Camera.getNumberOfCameras();
}

答案 5 :(得分:3)

试试这个:

/** Check if this device has a camera */
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}

来自:http://developer.android.com/guide/topics/media/camera.html

答案 6 :(得分:3)

通过以下方式我们可以检查设备是否有相机。

/** Check if this device has a camera */
    public static boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) 
        {
            return true;
        }
        else if(context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA_FRONT))
        {
            return true;
        }
        else {
            return false;
        }
    }

答案 7 :(得分:1)

如果您使用的是Android 2.3,则有一些API可以检查您的相机状态,例如相机数量(正面和背面)

答案 8 :(得分:1)

试试这个

前置摄像头

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "NO");
          }

用于后置摄像头

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

        Utils.makeAlertDialog(context, "Has back Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has back Camera ?", "NO");
          }

答案 9 :(得分:0)

根据documentation,您必须使用“程序包管理器”来检查相机在设备上是否可用

在Java中:

final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);

在科特林:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

答案 10 :(得分:0)

我在android电视盒中找到了可以插拔USB摄像机很多次的地方。在某个时间点,摄像头服务开始说它在系统中没有摄像头连接的情况下检测到系统中的一台摄像头。当您多次插入/拔出相机时,会发生这种情况。为了解决这个问题,我发现此解决方案有效:

//under oncreate:
//cameraManager = ((CameraManager) getSystemService(Context.CAMERA_SERVICE)); 

public int getNumberOfCameras() {
        int count_ = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try {
                count_ = cameraManager.getCameraIdList().length;

                if(count_==1)
                {
                    try {
                        cameraManager.getCameraCharacteristics(cameraManager.getCameraIdList()[0]);
                    }catch (Exception e)
                    {
                        count_ = 0;
                    }
                }

            } catch (Exception e) {
               //e.printStackTrace();
            }
        }
        else {
            count_ = Camera.getNumberOfCameras();
        }

        return count_;
    }

答案 11 :(得分:0)

单行解决方案:

public static boolean hasCamera(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}

将此方法放在您的Utils.java项目类中。

答案 12 :(得分:0)

根据Android文档:

/** Check if this device has a camera */
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}

更多有关相机API的信息:
https://developer.android.com/guide/topics/media/camera.html#detect-camera

答案 13 :(得分:-40)

我没试过,但是:

private android.hardware.Camera mCameraDevice;

try {
  mCameraDevice = android.hardware.Camera.open();
} catch (RuntimeException e) {
  Log.e(TAG, "fail to connect Camera", e);
  // Throw exception
}

可能是你需要的。