具有摄像头的设备上的intent.resolveActivity()为NULL(4.2.2)

san*_*one 2 android android-camera android-camera-intent

建议使用这段代码并说明

请注意,startActivityForResult()方法受调用resolveActivity()的条件的保护,该条件返回可以处理intent的第一个活动组件.执行此检查很重要,因为如果使用无应用程序无法处理的意图调用startActivityForResult(),您的应用程序将崩溃.因此,只要结果不为null,就可以安全地使用intent.

码:

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

它工作正常,但不适用于运行4.2.2的Alcatel设备.我收到了ELSE祝词"不能用相机......"

如果设备有相机,这怎么可能?

我现在应该怎么做?如何处理这个用例 - 显然我不得不依赖一些带摄像头的设备会报告"无法使用摄像头",检测到那些设备有摄像头然后使用它?!

文档或SO问题对ELSE案例一无所知.

Com*_*are 5

如果设备有相机,这怎么可能?

预装在该设备上的相机应用程序的作者未能支持该ACTION_IMAGE_CAPTURE Intent操作.相机应用程序很多错误.

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

我现在应该怎么做?

做类似的事情:

  • 告诉用户他们没有兼容的相机应用程序,并引导他们下载一个你知道适用于你的应用程序的应用程序

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

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

  • 等等.


小智 5

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

如果您使用,则使用此编辑过的代码来检查是否有相机。

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
    }
Run Code Online (Sandbox Code Playgroud)

}

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

    <uses-feature android:name="android.hardware.camera"
              android:required="true" />
Run Code Online (Sandbox Code Playgroud)