安卓7.0拍照遇到 Uri暴露错误

最近,项目又做到,调用摄像头拍照获取图片这个功能。

用以前的代码直接用,发现在Android7.0上使用时会出现问题。

Android6.0之后,动态申请权限已成常态。

调用摄像头拍照获取图片这个功能,需要动态申请 照相机权限、SD卡读写权限。

可是加了这些权限后,还是会报错。

错误:android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()

这个是uri暴露错误。

Android 7.0开始,一个应用提供自身文件给其它应用使用时,如果给出一个file://格式的URI的话,应用会抛出FileUriExposedException。这是由于谷歌认为目标app可能不具有文件权限,会造成潜在的问题。所以让这一行为快速失败。

网上有两种解决方法:FileProvider方式 和 VmPolicy方式。

第一种是是谷歌官方推荐的解决方案,我这里也是采用第一种方法。

步骤:1.在AndroidManifest.xml中添加如下代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="">

    <application
        >

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

    </application>
</manifest>

2.在res目录下新建一个xml文件夹,并且新建一个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>

3.使用到uri的代码

Uri photoURI = Uri.fromFile(createImageFile());

变成:

Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile());

修改代码后,再次调试,程序正常运行。

ps:只是个小功能,网上也有不少资料,但还是自己总结一下比较好!

时间: 2024-12-28 05:43:24

安卓7.0拍照遇到 Uri暴露错误的相关文章

安卓6.0(棉花糖)新特性汇总

安卓6.0(棉花糖)新特性汇总 Android伴随着众多新特性和新功能,Android6.0(API level 23)在系统和API上都有着诸多的改变. 1.App Permissions(软件权限管理) 在安卓6.0里,应用许可提示可以自定义了.它允许对应用的权限进行高度管理,比如应用能否使用位置.相机.麦克风.通讯录等,这些都可以开放给开发者和用户. 作为开发者,当你的app的目标版本(target)为Android6.0(API 23)或更高时,请确保在运行时进行权限的检查和请求.其中,

Eclipse--Maven--Dynamic Web Module 3.0 requires Java 1.6 错误

用Eclipse创建Maven webapp项目时报错Dynamic Web Module 3.0 requires Java 1.6 错误 其实这个问题就是两者不匹配的问题Dynamic Web Module 和JDK 版本不匹配,具体问题看problems 两种方法解决, (1)上面Java 是1.4的,按向下三角形换用低版本的Dynamic Web Module,我试了一下,换成2.4以下就可以啦 (2)也可以根据Dynamic Web Module3.0为匹配对象,更换Java为1.6及

曝光了所谓基于安卓5.0的htc sense 6界面截图

新浪科技消息称近日国外rom开发都liabtoorer曝光了所谓基于安卓5.0的htc sense 6界面截图.据说该截图来自于htc one m8,从截图看,新界面看起来全是卡片的样子,但还是基本延续了sense以往的风格,预计htc会将该版本作米sense 6.5推送更新,不过到时候还会不会依旧四下巴呢.HTC刚上安卓5.0,最近外媒sammebiie又曝光了一段三量galaxy s5 运行基于安卓5.0的touch wiz的视频,从视频看,新系统在保留了touchwiz风格的同时依旧是卡片

解决安装VC6.0后出现MSDEV.EXE错误解决方法

问题:安装VC6.0后,在打开项目或添加文件时,出现如下错误: 可能导致原因:由于Ms安装软件的兼容性问题,导致VC6.0安装不完全, 解决方法:--网上打sp6补丁的方法貌似不可用,所以可以采用另一种方法 1.在下面的网站下载FileTool.exe http://support.microsoft.com/kb/241396/en-us      2.FileTool.exe是个自解压文件,执行它,解压到某个目录下 3.解压后的文件是一个VC工程,在VC6中编译它 4. 在dsw文件上右键“

res\drawable-hdpi\new.png:0: error: invalid symbol: &#39;new&#39;错误原因是new是关键词呀

<ImageView android:id="@+id/new" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_margi

IIS部署ASP.NET MVC (4.0)网站出现的错误

(1)无法读取配置节“system.web.extensions”,因为它缺少节声明 在IIS中,在基本设置中,将程序池选择为ASP.NET 4.0即OK! (2)由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 第一步,检查: 出现环境:win7 + IIS7.0 解决办法:IIS的根节点->右侧“ISAPI和CGI限制”->把禁止的DotNet版本项设置为允许,即可~ 第二步:检查4.0的aspnet_isapi.dll文件是否已添加,如果没有点击右键

NET Runtime version 2.0.50727.42 - 执行引擎错误 或者无法创建应用程序域

server2003操作系统 IIS运行应用程序报错,应用程序事件查看器详细: NET Runtime version 2.0.50727.42 - 执行引擎错误 或者无法创建应用程序域 解决方法:卸载.net2.0,然后重装 借助专门卸载.net2.0的工具net framework 2.0cleanup_tool 卸载完后重启系统,安装.netFramework

oracle11.2.0.3.0 RAC aix7100-02-02-1316 crs-4124,crs-4000错误问题解决

原因: 在测试机上首次安装oracle11G RAC,安装完成后正常使用,过了一段时间后重启节点1测试是否可以自启动,解决节点1没有自启动,手工启动也无法启动 过程: 在节点一上运行: # pwd /u01/grid/bin # ./crsctl start crs CRS-4124: Oracle High Availability Services startup failed. CRS-4000: Command Start failed, or completed with errors

安卓5.0宣告了ARM平台全面进入64位时代

2014年10月份,安卓5.0正式版发布了,安卓5.0支持64位CPU,安卓5.0全面启用ART运行模式,在程序安装的时候,进行预编译,新的运行环境能够使大多数应用的执行时间减半.这意味着,CPU 消耗大.运行时间长的应用能够更加快速地完成,而一般的应用也能更加流畅,比如动画效果更顺畅,触控反馈更加即时. 和电脑从32位平台进入64位平台类似,也会出现两个平台交替带来的阵痛,部分应用程序会出现不兼容的情况比如在安卓4.x平台下运行的程序,在安卓5.x及以上平台运行不了,但安卓5.0给安卓生态圈带