安卓7.0报错android.os.FileUriExposedException

最近在开发过程中遇到了这样一个错误,android.os.FileUriExposedException: file:///storage/emulated/0/xxx/xxx.doc exposed beyond app through Intent.getData()

 

出现这个问题是在使用Intent附带uri打开sd卡下的doc文件,而在Android 7.0后,应用使用 StrictMode模式,API 禁止向您的应用外公开 file://URI并且使用Intent附带uri访问本地文件时,也是需要经过授权处理的。若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider

解决方法

1.在res目录下新建一个xml文件夹,在此文件夹下创建file_path.xml文件(命名任意),文件内容如下

 

 
 
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android">  <external-path path="." name="external_path"/>  <cache-path path="." name="cache_path" />  <files-path path="." name="files_path" />  <external-files-path path="." name="external_files_path" />  <external-cache-path path="." name="external_cache_path" /> </paths>
path:需要临时授权访问的路径(.代表所有路径) 
name:就是你给这个访问路径起个名字
内部的element可以是files-path,cache-path,external-path,external-files-path,external-cache-path,分别对应Context.getFilesDir(),Context.getCacheDir(),Environment.getExternalStorageDirectory(),Context.getExternalFilesDir(),Context.getExternalCacheDir()等几个方法
 

2.在AndroidManifest.xml的<application></application>标签下新增以下内容:

 
<provider  android:name="android.support.v4.content.FileProvider"  android:authorities="com.example.demo.provider"  android:exported="false"  android:grantUriPermissions="true">  <meta-data  android:name="android.support.FILE_PROVIDER_PATHS"  android:resource="@xml/provider_paths"/> </provider>
 
注意: 
authorities:可以自定义,但为了区分,建议用:app的包名.provider
grantUriPermissions:必须是true,表示授予 URI 临时访问权限 
exported:必须是false 
resource:中的@xml/file_paths是我们接下来要添加的文件
 

3.在使用Intent打开文件时,做如下判断

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
Uri uri = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    //第二个参数是manifest中定义的`authorities`
    uri = FileProvider.getUriForFile(context, "com.example.demo.provider", new File(param));
} else {
    uri = Uri.fromFile(new File(param));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
intent.setDataAndType(uri, "image/*");
context.startActivity(intent);
 
 
 
 
 
 
 
 
 
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ext-7.0.0.156.zip是一个文件的名称。这个文件可能是某个软件的压缩包,也可能是一个库文件或者其他类型的文件。这取决于文件的作者和用途,我们需要进一步了解具体的情况。 如果这个文件是某个软件的压缩包,那么它可能包含了软件的安装文件、配置文件、帮助文档等。用户可以下载这个压缩包,解压后按照提示进行安装,即可使用这个软件。 如果这个文件是一个库文件,它可能包含了某种编程语言的函数、类、方法等。开发者们可以将这个库文件导入到他们的工程中,利用其中的函数和类来实现某些功能。 总之,ext-7.0.0.156.zip是一个文件名,它代表着某个具体的文件。我们需要根据实际情况进一步了解它的用途和作用。 ### 回答2: ext-7.0.0.156.zip 是一个软件包的名称,它与 Sencha Ext JS 相关。Sencha Ext JS 是一款用于创建富交互式 Web 应用程序的 JavaScript 框架和工具集。它提供了许多先进的组件和工具,使开发者能够轻松构建具有复杂功能和美观外观的 Web 应用程序。 ext-7.0.0.156.zip 是 Sencha Ext JS 7 版本的一个软件包,其中包含了一些关键的文件和目录。开发人员可以下载这个软件包,并将其集成到他们的项目中。这个软件包具有以下功能: 1. 提供了一些常用的 UI 组件,例如按钮、表格、面板和表单等。 2. 包含了一些强大的工具,例如 Grid 和 Chart 工具,可以帮助开发者轻松创建复杂的数据可视化界面。 3. 支持多种数据源和数据格式,例如 JSON、XML、CSV 和 Excel 等。 4. 提供了一些强大的布局工具,例如布局器和容器,可以帮助开发者轻松管理和组织界面元素。 5. 构建 Web 应用程序时提供了一些重要的前端工具和框架,例如 MVC 和 MVVM 模式、路由和数据绑定等。 总之,ext-7.0.0.156.zip 是 Sencha Ext JS 7 的一个重要部分,它提供了许多重要的组件、工具和框架,可以帮助开发者创建出美观、功能强大的 Web 应用程序。 ### 回答3: ext-7.0.0.156.zip是一个文件名,可能是一个软件包或工具集的版本号。 "EXT"通常指的是Ext JS,它是一个JavaScript框架,用于开发Web应用程序的工具集,提供了丰富的UI组件、数据引擎、AJAX通信等功能。该版本号“7.0.0.156”可能是Ext JS的一个版本号,表示该版本是第7个大版本的第0个小版本的第0个补丁号,用于修复先前版本的错误或添加新功能。zip表明文件被压缩成了ZIP格式,以便在下载和传输过程中更加方便。总的来说,ext-7.0.0.156.zip可能是一个用于Web开发的JavaScript工具集应用程序的版本号和压缩文件的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猫King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值