Android 7.0下,拍摄照片报错

对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。

要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。

解决方法:

首先在AndroidManifest.xml的<application>标签内添加<provider>

       <!-- 文件共享 -->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${APPLICATION_ID}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

接下来在res文件夹下创建xml子文件夹(如果已存在,忽略),并新建文件provider_paths.xml

内容如下

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="." name="external_files"/>
</paths>

接下来在跳转时,传入的Uri不再是使用

Uri.fromFile(tmpFile);

而是使用FileProvider的getUriForFile()方法获取

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    tempFile = File.createTempFile("head", null, StorageUtils.getImageDir(context));
    Uri imgUri = FileProvider.getUriForFile(context,
            BuildConfig.APPLICATION_ID + ".provider", tempFile);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
    startActivityForResult(intent, REQUEST_TAKE);

参考地址

时间: 2024-10-12 14:22:30

Android 7.0下,拍摄照片报错的相关文章

appium在android 7.0真机上运行报错command failed shell:............ps:&#39;uiautomator&quot;的解决方式

appium版本:1_4_16 在CSDN中找到相关解决的方案,根据此解决方案顺利的解决了让人惆怅的问题,再次记录. 1.找到appium安装目录下的adb.js文件,目录为:Appium\node_modules\appium\node_modules\appium-adb\lib 2.打开adb.js,可使用notepad++编辑器等打开文件(说明:在修改代码的时候先注释掉以前的代码,并且添加自己容易识别的标记,以防出错后还有回旋的余地,或者将代码备份也可行),找到如下代码: ADB.pro

安卓工作室 android studio 汉化后,报错。 设置界面打不开。Can&#39;t find resource for bundle java.util.PropertyResourceBundle, key emmet.bem.class.name.element.separator.label

安卓工作室 android studio 汉化后,报错. 设置界面打不开. Android studio has been sinified and reported wrong.The setup interface cannot be opened. 安卓工作室 android studio 版本 2.3.3 Android studio version 2.3.3 汉化包版本 AndroidStudio_v2.0.0.20_resources_cn-v0.2-20170414.jar Lo

Linux系统下启动MySQL报错:Neither host &#39;localhost.localdomain&#39; nor &#39;localhost&#39; could be looked up with

Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with 摘要 Linux系统下安装完MySQL,启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with... Linux系统下装完MySQL,然后重启动时报错: 解决方法:  查看cat /etc/h

Android工程中加入图片,报错cannot be resolved or is not a field

SDK和ADT为22.6.2版本 工程为4.4.2 今天在写Android代码的时候,往工程中加入了几张图片,然后在代码中使用R.drawable调用时,一直报错 cannot be resolved or is not a field 然后我查看了gen目录下的R.java文件,发现里面已经有我加入的图片资源ID了,觉得很奇怪,一般是无法生成R.java文件的时候才会出现这种现象啊 在网上查了资料也未见有可以解决我这个问题的方法,然后我就把我的代码从头到尾重新看了一遍,开始也没有发现什么异常,

[转]解决IIS下UTF-8文件报错乱码的问题

找了两天才找到解决办法…….晕晕晕...用第二种方法解决了. 网上找到的方法都没有写这一条 If objASPError.ASPDescription > "" Then 后面的回车去掉(这个地方微软写错了) 将这一句后面的<br>注释掉即可! Response.Write Server.HTMLEncode(objASPError.ASPDescription)' & "<br>" 转自:http://blog.csdn.ne

Linux系统下启动MySQL报错:Neither host &amp;#39;localhost.localdomain&amp;#39; nor &amp;#39;localhost&amp;#39; could be looked up with

Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with 摘要 Linux系统下安装完MySQL,启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with... Linux系统下装完MySQL,然后重新启动动时报错: 解决方法:  查看cat /etc

Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例

Linux下Oracle11G RAC报错:在安装oracle软件时报file notfound一例 1.现象 之前安装一切都比較顺利,安装oracle软件时,进度到30%时报错:file not found(/u01/app/oracle/product/11.2.0/db_1/owb/external/oc4j_applications/applications/WFMLRSVCApp.ear) 2.应对策略 1.  改变选择语言处.仅仅选择"English": 2.  又一次解压

eclipse下执行wordcount报错 java.lang.ClassNotFoundException 解决办法

eclipse下执行wordcount报错 java.lang.ClassNotFoundException 17/08/29 07:52:54 INFO Configuration.deprecation: fs.default.name is deprecated. Instead, use fs.defaultFS 17/08/29 07:52:54 WARN util.NativeCodeLoader: Unable to load native-hadoop library for y

centOS下进入mysql报错-You must SET PASSWORD before executing this statement

解决办法: mysql>  SET PASSWORD = PASSWORD('123456'); Query OK, 0 rows affected (0.03 sec) mysql> create database roger; Query OK, 1 row affected (0.00 sec) 也就是用mysql>  SET PASSWORD = PASSWORD('123456');这句话重新设置一次密码! centOS下进入mysql报错-You must SET PASSW