检查设备是否装有相机?


80

在我的应用中,如果设备配备了相机,我想使用相机。是否有任何运行android且没有摄像头的设备?通过将以下内容纳入我的清单:

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

基本上就是说“如果有的话我会用相机,但不需要用相机来运行”。

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


1
我相信(但不是100%肯定)所有过去和现在的Android兼容性定义文档版本都指定了具有最低分辨率的相机。遵守CDD是获得Android Market和专有Google应用程序许可访问的先决条件。不过,有一些Android设备没有(例如Nook颜色)。
短暂

2
截至今天,文档(4.2)的当前版本指定“设备实现应包括后置摄像头,并且可以包括前置摄像头”。请注意,它不使用关键字“必须”。
马修·布莱克福德

只需补充一点,就是有些设备仅带有前置摄像头。
贝尔加

如果它表明该应用程序可以在有摄像头和无摄像头的情况下工作,那么将其添加到清单中是否有意义?可能会影响Play商店中的应用吗?
Android开发人员

Answers:


-44

我没有尝试过,但是:

private android.hardware.Camera mCameraDevice;

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

可能就是您所需要的。


并且不要忘记释放Camera对象!
opedog 2011年

11
请参阅下面的dpjanes答案,以了解查看设备是否具有相机的正确方法。
Zack Marrapese

22
不好的方法。昂贵的电话。如果其他应用程序打开了同一台摄像机,则会抛出RuntimeException。不适合目的。
指针为空

5
这个答案变得如此出名!:) meta.stackoverflow.com/a/316273/651647
Farshid Zaker

除非您在运行时明确要求“ android.permission.CAMERA”权限,否则在Android 6.0(API级别23)+上的此实现将引发SecurityException。
马特G

224

这就是我正在使用的

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


4
这么快的问题。这可能是愚蠢的,但我是android / java的新手,您从哪里获取上下文?谢谢
grobartn

3
@grobartn:public class YourActivity extends Activity { Context contextActivity; PackageManager pm; @Override public void onCreate(Bundle savedInstanceState) { ... contextActivity = this; pm = contextActivity.getPackageManager(); ...
Klofi 2011年

14
从API级别9开始,除了FEATURE_CAMERA,您可能还需要检查FEATURE_CAMERA_FRONT。例如,Nexus 7(只有一个前置摄像头)向FEATURE_CAMERA返回false。
Jorge Cevallos 2012年

6
对于Kindle Fire HD 7“(Android 4.0.3),我发现它报告了FEATURE_CAMERA,尽管它只有前置摄像头!糟糕透了...作为一种解决方法,我还测试了(FEATURE_CAMERA_FRONT和Camera.getNumberOfCameras()== 1 ),那么我知道没有后置摄像头
CSmith

6
在API级别17之后,您可以使用PackageManager.FEATURE_CAMERA_ANY
XY

42

要了解您的设备上有多少个摄像机,您可以致电:

import android.hardware.Camera;

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

Camera.getNumberOfCameras()是静态的,因此不需要实际连接到摄像机。从API 9开始有效。

编辑:

使用更新的camera2 API,您还可以调用CameraManager.getCameraIdList(),该列表提供所有有效摄像机ID的列表,而不只是计数。


2
这对我
有用

一线版本:boolean hasCam = android.hardware.Camera.getNumberOfCameras()> 0;
J.Jacobs-VP

这个答案更好。hasSystemFeature(PackageManager.FEATURE_CAMERA)上洁吉(的Nexus 7)返回false
基里尔卡尔马津

1
对于Nexus 7(2013),它返回false,因为FEATURE_CAMERA仅与后置摄像头有关(由于向后兼容);FEATURE_CAMERA_ANY是一项功能,如果设备上至少有一个任何种类的相机,则为true。
Eddy Talvala

为什么android.hardware.Camera不推荐使用?应该使用什么代替此功能?我知道我们现在有android.hardware.camera2,但是在哪里可以找到替代品getNumberOfCameras呢?
Android开发人员

12

您应该使用它来查找设备中的相机

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

1
我认为这是最有用的。FEATURE_CAMERA_ANY是一个不错的选择。对于那些喜欢它的人来说,这是一段较短的代码。 public static boolean isCameraAvailable(Context context) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) }
miva2 2015年

6

不推荐使用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();
}



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

1

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


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


0

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

在Java中:

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

在科特林:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

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_;
    }

0

一线解决方案:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.