【问题标题】:intent.resolveActivity() is NULL on a device with the camera (4.2.2)intent.resolveActivity() 在带有摄像头的设备上为 NULL (4.2.2)
【发布时间】:2016-06-03 17:50:49
【问题描述】:

使用这个piece of code is suggested 并声明

注意 startActivityForResult() 方法受保护 调用 resolveActivity() 的条件,它返回第一个 可以处理意图的活动组件。 执行此检查 很重要,因为如果您使用 任何应用都无法处理的意图,您的应用就会崩溃。因此,只要 结果不为空,使用意图是安全的。

代码:

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

它工作正常,但不能在运行 4.2.2 的阿尔卡特设备上运行。我的吐司收到ELSE 消息“无法使用相机...”

如果设备有摄像头,这怎么可能?

我现在该怎么办?如何处理这个用例 - 显然我必须依靠一些带摄像头的设备会报告“无法使用摄像头”,检测到这些设备有摄像头然后使用它?!

文档或 SO 问题没有说明 ELSE 案例。

【问题讨论】:

    标签: android android-camera android-camera-intent


    【解决方案1】:

    如果设备有摄像头,这怎么可能?

    预装在该设备上的相机应用的作者未能支持ACTION_IMAGE_CAPTUREIntent 操作。有lots of bugs with camera apps

    虽然可能与您的情况无关,但请记住,在 Android 4.3+ 上使用受限配置文件时,设备的当前用户可能无法访问 ACTION_IMAGE_CAPTURE 活动,即使该设备恰好有一个活动。

    我现在该怎么办?

    执行以下操作:

    • 告诉用户他们没有兼容的相机应用程序,并引导他们下载一个您知道与您的应用程序配合良好的应用程序

    • 不要依赖ACTION_IMAGE_CAPTURE,而是在您的应用中嵌入拍照功能

    • resolveActivity()返回null的设备上禁用需要ACTION_IMAGE_CAPTURE的应用功能

    【讨论】:

    • 天啊,这是它的相机应用程序。难道他们真的从来没有支持过这个意图???天哪
    • @sandalone:也许这款设备不附带 Play 商店和其他 Google 专有应用程序,在这种情况下,它不必满足任何特定的兼容性标准。或者,也许ACTION_IMAGE_CAPTURE 在制造此设备时并不是兼容性测试套件的一部分。或者,也许它在发货时通过了测试套件,但随后阿尔卡特在固件升级中破坏了应用程序(AFAICT 没有重新测试)。
    • 它有 Play 商店(欧盟位置)。所以它一定是一些坏了但从未测试过的东西。
    【解决方案2】:

    请检查您是否在 AndroidManifest.xml 中使用权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    如果你使用然后使用这个编辑的代码来检查是否有摄像头..

    private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (getApplicationContext().getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
            // this device has a camera
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        } else {
            // no camera on this device
        }
    

    }

    如果您想使用之前的代码,请不要忘记在 AndroidManifest.xml 中设置此代码

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

    【讨论】:

    • 为什么粗体很重要?因为我希望没有相机的设备使用应用程序(从图库或 SD 卡加载图像)???我找不到任何没有粗体代码会产生异常的地方
    • 从图库或 SD 卡加载图像是一个不同的问题。 CAPTURE 和 PICK 不一样。打开图库图片一般我们使用Intent.ACTION_PICK,用户权限也是不同的红色存储权限。
    • 这不是我问的。为什么我们需要 required=true?我希望没有摄像头的设备可以使用该应用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2014-05-04
    • 1970-01-01
    • 2012-04-24
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多