在具有相机的设备上(4.2.2),intent.resolveActivity()为NULL。

5
使用这段代码是建议的,并且它说明:

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

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

这个功能可以正常使用,但在运行4.2.2版本的Alcatel设备上不能正常工作。我得到了ELSE的消息,并带有我的toast“无法使用相机...”

如果设备有相机,这种情况怎么可能发生?

现在该怎么办? 如何处理这种情况 - 显然我必须依赖一些具有相机的设备报告“无法使用相机”,检测到这些设备有相机,然后使用它?!

文档或SO问题没有提到ELSE情况。

3个回答

8

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

那个设备上预安装的相机应用程序的作者未能支持 ACTION_IMAGE_CAPTURE Intent 操作。有 很多与相机应用程序相关的错误

虽然可能与你目前的情况不相关,但请记住,在 Android 4.3+ 上的受限制的配置文件中,即使设备恰好具有某个 ACTION_IMAGE_CAPTURE 活动,设备的当前用户也可能无法访问它。

我现在该怎么办?

做类似以下的事情:

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

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

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

  • 等等。


OMG,这是它的股票相机应用程序。难道他们从来没有支持过这个意图吗???OMG - sandalone
@sandalone:也许这个设备没有预装Play商店和其他谷歌专有应用程序,因此它不必符合任何特定的兼容性标准。或者,也许在制造这个设备时,ACTION_IMAGE_CAPTURE不是兼容性测试套件的一部分。或者,也许它在发货时通过了测试套件,但后来Alcatel在固件升级中破坏了该应用程序(据我所知,这不会重新进行测试)。 - CommonsWare
它有Play Store(欧盟地区)。所以肯定是某些东西出了问题,但从未经过测试。 - sandalone

5
请检查您是否在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中设置这段代码。

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

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

为什么粗体很重要?因为我希望那些没有相机的设备也能使用应用程序(从图库或SD卡加载图像)??? 我找不到任何地方说明没有加粗代码会生成异常。 - sandalone
从图库或SD卡加载图像是一个不同的问题。CAPTURE和PICK不同。通常我们使用Intent.ACTION_PICK来打开图库图像,用户权限也不同,需要读取外部存储权限。<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - user4696837
这不是我要求的。我们为什么需要required=true?我希望没有相机的设备也能使用该应用程序。 - sandalone

1

我在诺基亚和摩托罗拉设备上遇到了同样的问题,结果发现你实际上不需要验证权限就可以访问相机,一旦授权,它就可以正常工作。

这是我正在制作的应用程序中的代码,希望能对你有所帮助。

enter code here    private void tomarfoto() throws IOException {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//Activar la opcion de camara
    Log.d("camara","opcion camara activada");

   try {
           File photoFile = null;
           photoFile = createImagenFile();
           Log.d("camara", "archivo de imagen creado");
           if (photoFile != null) {
               Uri outputFileUri = FileProvider.getUriForFile(this, MY_PROVIDER, photoFile);
               cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); // Enviar la imagen como parametro y almacenarla
               startActivityForResult(Intent.createChooser(cameraIntent, "Selecciona la cámara"), COD_FOTO); // Toma la foto
               Log.d("camara", "foto tomada");
           }


   }catch(IOException e){
       Log.d("Exception",e.getMessage());
   }
}

我认为当你的目标是Android R(API 30)及以上版本时,你应该跳过“if(cameraIntent.resolveActivity(getPackageManager()) != null)”这一步。我尝试过了,它可以正常工作。 - JustBeginner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接