检查相机是否可以在 Android 与 Intent 上的 resolveActivity 中使用

Checking if the camera can be used in Android vs. resolveActivity on the Intent

我在网上看到了一些不同的东西,所以我想确保我做的是正确的:

检查 phone 是否有摄像头:

PackageManager pm = context.getPackageManager();

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

不过我也看到了http://developer.android.com/training/camera/photobasics.html

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
PackageManager pm = context.getPackageManager();

if (takePictureIntent.resolveActivity(pm) != null) {
    //proceed
 }

我知道第一个是"correct"用来验证摄像头是否存在的,但是第二个到底是干什么的呢?在继续之前实际检查这两个条件是个好主意,还是只检查一个或另一个就足够了?

根据 http://developer.android.com/reference/android/content/pm/PackageManager.html#resolveActivity%28android.content.Intent,%20int%29 它说 resolveActivity "Determine the best action to perform for a given Intent" 但我真的不知道那意味着什么。这是 "check for the camera" 的另一种方式吗?

第二个是检查设备上是否有接受相机意图的相机应用程序。检查以确保是否有可以处理相机意图的应用程序没有错。

虽然我猜测设备有摄像头时可能没有摄像头应用程序,但这种可能性极小。

but what is the second one doing exactly?

确定设备上是否安装了提供 ACTION_IMAGE_CAPTURE activity 您可以启动的应用程序。可能没有这样的应用程序,或者可能有应用程序但当前用户可能没有权限。

Is it a good idea to actually check for both conditions before proceeding, or does it suffice to just check one or the other?

要么使用 resolveActivity()/queryIntentActivities() 提前检测是否存在您要调用的隐式 Intent 的应用程序,要么捕获 ActivityNotFoundException如果您调用 startActivity()/startActivityForResult() 并且没有匹配的 activity,则会引发此问题。对于任何隐式 Intent.

都是如此

从技术上讲,检查是否有硬件相机更多是使用相机 API 的应用程序的责任。但是,您可以自己检查一下,特别是如果您想要在用户无法拍照时禁用 UI 选项(例如,操作栏项目)。在这种情况下,仅在以下情况下启用 UI 选项:

  • 有摄像头,
  • 有一个ACTION_IMAGE_CAPTUREactivity