Android 检查设备是否有摄像头?

Android 检查设备是否有摄像头?,android,android-camera,Android,Android Camera,在我的应用程序中,如果设备有摄像头,我想使用摄像头。有没有运行android的设备没有摄像头?通过在我的清单中包括以下内容: <uses-feature android:name="android.hardware.camera" android:required="false"/> 然后它基本上是说“如果有摄像头,我会用它,但不需要摄像头来运行应用程序” 在尝试使用camera类之前,如何检查设备上是否存在摄像头?我没有尝试过,但是: private android.hard

在我的应用程序中,如果设备有摄像头,我想使用摄像头。有没有运行android的设备没有摄像头?通过在我的清单中包括以下内容:

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

然后它基本上是说“如果有摄像头,我会用它,但不需要摄像头来运行应用程序”


在尝试使用camera类之前,如何检查设备上是否存在摄像头?

我没有尝试过,但是:

private android.hardware.Camera mCameraDevice;

try {
  mCameraDevice = android.hardware.Camera.open();
} catch (RuntimeException e) {
  Log.e(TAG, "fail to connect Camera", e);
  // Throw exception
}
可能就是你需要的。

这就是我正在使用的

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
}
还有其他各种有趣的东西可供测试——指南针、位置是否可用、是否有前置摄像头:

如果您使用的是Android 2.3,您可以使用一些API检查您的摄像头状态,例如摄像头数量(前后)

要了解设备上有多少摄像头可用,您可以调用:

import android.hardware.Camera;

int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
  hasCamera = true;
}
getNumberOfCameras()是静态的,因此不需要实际连接到相机。这在API 9之后就开始工作了

编辑:

使用较新的Camera2API,您还可以调用,它提供了所有有效相机ID的列表,而不仅仅是计数

试试这个

用于前置摄像头

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

您应该使用此功能在设备中查找摄像头

public static boolean isCameraAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}
不推荐使用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();
}
试试这个:

/** 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;
    }
}

from:

通过以下方式,我们可以检查设备是否有摄像头

/** 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;
        }
    }
使用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;
    }
}
来源:

根据,您必须使用软件包管理器检查设备上是否有摄像头

在Java中:

final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);
val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)
在科特林:

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

我在安卓电视盒中发现,在那里你可以多次插拔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_;
    }
单线解决方案:

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

将此方法放入Utils.java项目类。

根据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的信息请参考:

我相信(但我不是100%确定)所有过去和现在的版本都指定了具有某种最低分辨率的摄像头。遵守CDD是获得Android市场许可和专有谷歌应用程序的先决条件。不过,还有一些安卓设备没有这样做(例如Nook颜色)。截至今天,当前版本的文档(4.2)规定“设备实现应包括一个后向摄像头,并可能包括一个前向摄像头。”请注意,它没有使用关键字“必须”。只需补充一下,也有一些设备只有一个前置摄像头。如果它说应用程序应该使用和不使用摄像头,那么将其添加到清单中有意义吗?它是否会影响Play Store上的应用程序?请不要忘记释放相机对象!有关查看设备是否有摄像头的正确方法,请参见下面DPJane的答案。方法不正确。昂贵的电话。如果其他应用程序打开同一个摄像头,这将引发RuntimeException。不符合目的。这个答案太有名了!:)Android 6.0(API级别23)+上的这个实现将抛出一个SecurityException,除非您在运行时特别请求了“Android.permission.CAMERA”权限。问题很快。这可能是愚蠢的,但我是android/java新手,你从哪里获得上下文????thanks@grobartn:
public类YourActivity扩展活动{Context contextActivity;PackageManager pm;@Override public void onCreate(Bundle savedInstanceState){…contextActivity=this;pm=contextActivity.getPackageManager().
从API第9级开始,除了FEATURE_CAMERA外,您可能还需要检查FEATURE_CAMERA_FRONT。例如,Nexus 7(只有一个前置摄像头)将false返回FEATURE_CAMERA。对于Kindle Fire HD 7(Android 4.0.3),我发现它报告FEATURE_CAMERA,即使它只有一个前置摄像头!糟糕……作为一种解决方法,我也进行了测试(FEATURE_CAMERA_FRONT and CAMERA.getNumberOfCameras()==1)然后我知道没有后置摄像头。在API级别17之后,您可以使用PackageManager.FEATURE_CAMERA_ANY。我认为这是最有用的一个。FEATURE_CAMERA_ANY是一个不错的选择。下面是一个简短的代码版本,供喜欢它的人使用。
public static boolean是可用的(Context Context){return Context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_-CAMERA_-ANY))}
这对我有效,而在API 19单线版本中该功能_-CAMERA没有:boolean hasCam=android.hardware.CAMERA.getNumberOfCameras()>0;这个答案更好。hasSystemFeature(PackageManager.FEATURE_-CAMERA)在Kit Kat(Nexus 7)上返回false对于Nexus 7(2013)返回false,因为FEATURE_CAMERA仅与背面摄像头有关(由于向后兼容性);FEATURE_CAMERA_ANY是指如果设备上至少有一台任何类型的摄像头,那么该功能就是正确的。为什么不推荐使用
android.hardware.CAMERA
呢?这个功能应该使用什么呢?我知道我们现在有
android.hardware.camera2
,但是我们在哪里可以找到
getNumberOfCameras
的替代品呢?