7.0以上android.os.FileUriExposedException: file:///storage/emulated/0/xxx.xxx exposed beyond app的bug解决

公司开发的Android屏幕设备升级到了11,在进行apk升级进行存储本地的过程中报错

1.首先将apk下载到项目的专属文件夹中,Android/data/包名/

2.上面这个错误就是读取该文件的Uri的时候报的错。

从 Android N 开始,将不允许在 App 间,使用 file:// 的方式,传递一个 File ,(之前的uri的获取方式)否者会抛出 FileUriExposedException的错误,会直接引发 Crash。

那么解决方案为:

1.首先在AndroidManifest.xml下面声明一个provider

<provider
    android:authorities="一般是你的包名.provider"
    android:name="android.support.v4.content.FileProvider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths"/>
</provider>

2.然后在res的xml文件夹下创建上面提到的filepaths文件

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

「external-cache-path」表示Android/data/包名/cache, 在代码中对应为Context.getExternalCacheDir()

比如Android/data/包名/cache/imgs/dog.jpg

「path」代表Android/data/包名/cache的子目录名字,这个例子中就是imgs

「name」代表最终的文件名字,上面例子中就是dog.jpg


「external-cache-path」同样级别的标签还有很多,这个表格是对应表

files-path/data/data/<包名>/files
cache-path/data/data/<包名>/cache
external-path/storage/emulate/0
external-files-path/storage/emulate/0/Android/data/<包名>/files
external-cache-path/storage/emulate/0/Android/data/<包名>/cache

3.获取Uri时用FileProvider的方式

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
     uri = FileProvider.getUriForFile(UpdateService.this,『你的包名』+".provider",new File(filePath));}

注意:!!!

上面的第二个参数是这个方法的authority,务必和Androidmanifest中申请的一样。
    android:authorities="一般是你的包名.provider",否则会找不到这个抛空指针异常

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值