繁体   English   中英

错误找不到活动来处理Intent act = android.media.action.IMAGE_CAPTURE

[英]Error No Activity found to handle Intent act=android.media.action.IMAGE_CAPTURE

我继承了在<api 23中可用的代码。由于暴露的文件安全性问题,我不得不对其进行升级以与最新的api一起使用,并且它使我现在必须使用FileProvider。 没什么 但是,现在相机不起作用(并且不一定是由于FileProvider所致,由于升级了api,它恰好在需要使用FileProvider的同时停止了工作)

该代码死于MediaStore.ACTION_IMAGE_CAPTURE意图的创建意图调用,并显示以下错误:

android.content.ActivityNotFoundException:未找到处理意图的活动{act = android.media.action.IMAGE_CAPTURE dat = content://com.company.appname/external_files/temp.jpg flg = 0x1}

我已经做了很多搜索,但是每个人(尤其是到目前为止的stackoverflow)似乎都认为添加代码来检查是否存在相机可以解决此问题,但事实并非如此。 如果未检测到相机,则只是不运行代码的检查。 我用来测试的所有设备都有相机。 我已经在Android模拟器上进行了调试(并通过使用默认的照相机应用程序对自己的照片进行拍照来验证模拟的照相机是否已连接到便携式计算机)以及我的手机,该手机具有前置和后置摄像头,两者均可正常工作。 因此,请没有解决该问题的答案。 我知道我有相机,不需要检查。 我需要帮助来确定为什么我的代码没有找到MediaStore.ACTION_IMAGE_CAPTURE的意图。

AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

<provider
    android:name=".Providers.GenericFileProvider"
    android:authorities="com.company.myapp"
    android:exported="false"
    android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

MainActivity.java

File f = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, 
    FileProvider.getUriForFile(MainActivity.this, AUTHORITY, f));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, REQUEST_CAMERA);

启动活动时,代码在最后一行抛出异常。 因为这是继承的代码,所以我很想废弃它们用于相机捕获并重新开始的内容,但是在将其升级为> api 23之前,这些代码曾经可以正常工作。

只是为了方便起见,升级之前的上一个电话看起来像

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));

但这不再起作用(由于暴露了文件uri而被api阻止了)

有谁发现如何使这项工作?

风格笔记

为了简洁起见,我编辑了代码,生产代码中包含异常处理。

只是为了方便起见,升级之前的上一个电话看起来像

该代码使用EXTRA_OUTPUT ,这是通过ACTION_IMAGE_CAPTURE传递Uri的正确方法。 Uri.fromFile()它的问题是Uri.fromFile()部分,一旦您的targetSdkVersion升至24或更高,该部分就无法在Android 7.0+上运行。

正确的代码是两者的组合:

File f = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(MainActivity.this, AUTHORITY, f));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, REQUEST_CAMERA);

有关将ACTION_IMAGE_CAPTUREFileProvider一起使用的完整示例, FileProvider 示例应用程序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM