2024-07-16升级问题:调用自带软件打开文件时 android.os.FileUriExposedException

2024-07-16升级问题:调用手机自带软件打开文件时,出现以下问题:

E/AndroidRuntime: FATAL EXCEPTION: mainProcess: rs.tabletcropland, PID: 10997android.os.FileUriExposedException: file:///storage/emulated/0/arcgis/%E7%9F%B3%E7%8B%AE%E5%B8%82/Attachment/%E7%9F%B3%E7%8B%AE%E5%B8%82%E8%AE%BE%E6%96%BD%E5%86%9C%E4%B8%9A%E5%A4%A7%E6%A3%9A%E8%B0%83%E6%9F%A5%E6%95%B0%E6%8D%AE.xlsx exposed beyond app through Intent.getData()at android.os.StrictMode.onFileUriExposed(StrictMode.java:2210)at android.net.Uri.checkFileUriExposed(Uri.java:2419)at android.content.Intent.prepareToLeaveProcess(Intent.java:11812)at android.content.Intent.prepareToLeaveProcess(Intent.java:11764)at android.app.Instrumentation.execStartActivity(Instrumentation.java:1765)at android.app.Activity.startActivityForResult(Activity.java:5730)at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)at android.app.Activity.startActivityForResult(Activity.java:5654)at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)at android.app.Activity.startActivity(Activity.java:6152)at android.app.Activity.startActivity(Activity.java:6105)at com.FJDZYG.GIS.Tools.Base.OpenFileUtil.openFile(OpenFileUtil.java:107)at com.FJDZYG.GIS.Common.homePage.view.SearchFileActivity.openfile(SearchFileActivity.java:68)at com.FJDZYG.GIS.Common.homePage.view.SearchFileActivity.access$300(SearchFileActivity.java:33)at com.FJDZYG.GIS.Common.homePage.view.SearchFileActivity$6.false}lifecycleStateRequest PauseActivityItem{finished=true,userLeaving=false,configChanges=0,dontReport=false}
I/Process: Sending signal. PID: 10997 SIG: 9
Process 10997 terminated.

        这个错误是因为在Android 7.0及以上版本中,直接使用file://URI可能会导致FileUriExposedException。为了解决这个问题,你可以将文件路径转换为content://URI,然后使用Intent来打开文件。

解决步骤:

1、在AndroidManifest.xml中添加FileProvider

        在你的AndroidManifest.xml文件中添加一个<provider>元素,用于声明FileProvider和其相关的元数据。这里需要注意的是android:authorities属性的值:

authorities:app的包名.fileProvider
grantUriPermissions:必须是true,表示授予 URI 临时访问权限
exported:必须是false
resource:中的@xml/file_paths是我们接下来要添加的文件

<application ... >...<!--authorities="你的包名+fileprovider" --><providerandroid:authorities="${applicationId}.fileprovider"android:name="android.support.v4.content.FileProvider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths"/></provider>...
</application>

如果是AndroidX的库,则可以如下:

        <!--authorities="你的包名+fileprovider" --><providerandroid:authorities="${applicationId}.fileprovider"android:name="androidx.core.content.FileProvider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths"/></provider>

2、创建file_paths.xml文件

        在你的Android项目的res/xml目录下创建一个名为file_paths.xml的文件(如果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>

完整的:
files-path代表的根目录: Context.getFilesDir().getPath()
external-path代表的根目录: Environment.getExternalStorageDirectory().getPath()
cache-path代表的根目录: getCacheDir().getPath()

path 代表需要共享的目录
name 只是一个标识,随便取

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><!-- external-path:sd ;path:你的应用保存文件的根目录;name随便定义--><!-- root-path 手机存储根目录 --><root-path path="" name="arcgis" /><external-path name="external_files" path="." /><files-path name="picture" path="internal/pic/"/><files-path name="database" path="internal/db/"/><external-files-path name="picture" path="picture/"/>
</paths>

3、在代码中使用FileProvider 

 在需要构建文件Uri的地方,使用FileProvider来构建Uri,而不是直接使用Uri.fromFile()。

完整代码:

/*** 打开文件* 兼容7.0* @param context     activity* @param file        File* @param contentType 文件类型如:文本(text/html)*                    当手机中没有一个app可以打开file时会抛ActivityNotFoundException*/public static void startActionFile(Context context, File file, String contentType) throws ActivityNotFoundException {if (context == null) {return;}Intent intent = new Intent(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//打开只要读取的权限就够了。写的权限会导致失败intent.setDataAndType(getUriForFile(context, file), contentType);if (!(context instanceof Activity)) {intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}context.startActivity(intent);}
/**** Android7.0以上文件在应用间打开方式* @param context* @param file*/public static void openFile_new(Context context, File file) {try {if (context == null) {return;}Intent intent = new Intent(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//打开只要读取的权限就够了。写的权限会导致失败String contentType = getMIMEType(file);intent.setDataAndType(getUriForFile(context, file), contentType);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}catch (ActivityNotFoundException e) {// TODO: handle exceptionToast.makeText(context, "sorry附件不能打开,请下载相关软件!", Toast.LENGTH_LONG).show();}}public static Uri getUriForFile(Context context, File file) {if (context == null || file == null) {throw new NullPointerException();}Uri uri;if (Build.VERSION.SDK_INT >= 24) {uri = FileProvider.getUriForFile(context.getApplicationContext(), context.getPackageName()+".fileprovider", file);} else {uri = Uri.fromFile(file);}return uri;}

至此,问题解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6基本语法(二)——函数与数组

函数 函数是JavaScript中组织代码的一种方式&#xff0c;它可以提高代码的复用性&#xff0c;并使其更加模块化。 在<script>标签中定义函数 你可以在HTML文件的<script>标签内定义函数&#xff0c;或者在JavaScript文件中定义后再引入到HTML中。 <script&g…

相对定位语法:css+xpath基础语法使用-定位页面元素

文章目录 CSS相对定位获取元素关系定位顺序关系 XPath相对定位基础语法顺序关系-通过索引获取元素选取元素 总结 ✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来&#xff01; 编程真是一件很奇妙的东西。你只是浅尝辄止&#xff0c;那么只会觉得枯燥乏味&#xff0c…

HTML5应用的安全防护策略与实践

随着HTML5及其相关技术&#xff08;如CSS3和JavaScript&#xff09;的普及&#xff0c;Web应用变得越来越强大和复杂&#xff0c;同时也成为黑客攻击的目标。本文将探讨HTML5应用面临的常见安全威胁&#xff0c;以及如何通过最佳实践和代码示例来增强应用的安全性。 HTML5安全…

uniapp小程序上传pdf文件

<template><view class="mainInnBox"><view class="formBox"><!-- 注意,如果需要兼容微信小程序,最好通过setRules方法设置rules规则 --><u-form :model="form" ref="uForm" :rules="rules"&g…

用于可穿戴传感器的人类活动识别、健康监测和行为建模的大型语言模型

这篇论文题为《用于可穿戴传感器的人类活动识别、健康监测和行为建模的大型语言模型&#xff1a;早期趋势、数据集和挑战的综述》&#xff0c;由埃米利奥费拉拉&#xff08;Emilio Ferrara&#xff09;撰写。论文主要内容如下&#xff1a; 摘要 可穿戴技术的普及使得传感器数…

韦东山嵌入式linux系列-具体单板的 LED 驱动程序

笔者使用的是STM32MP157的板子 1 怎么写 LED 驱动程序&#xff1f; 详细步骤如下&#xff1a; ① 看原理图确定引脚&#xff0c;确定引脚输出什么电平才能点亮/熄灭 LED ② 看主芯片手册&#xff0c;确定寄存器操作方法&#xff1a;哪些寄存器&#xff1f;哪些位&#xff1f;…

STM32 BootLoader 刷新项目 (三) 程序框架搭建及刷新演示

STM32 Customer BootLoader 刷新项目 (三) 程序框架搭建 文章目录 STM32 Customer BootLoader 刷新项目 (三) 程序框架搭建典型工作流程 1. 硬件原理图介绍1.1 USART硬件介绍1.2 LED和按键介绍 2. STM32 CubeMX工程搭建2.1 创建工程2.2 系统配置2.3 USART串口配置2.4 配置按键G…

GD32 MCU上电跌落导致启动异常如何解决

大家是否碰到过MCU上电过程中存在电源波动或者电压跌落导致MCU启动异常的问题&#xff1f;本视频将会为大家讲解可能的原因以及解决方法&#xff1a; GD32 MCU上下电复位波形如下图所示&#xff0c;上电过程中如果存在吃电的模块&#xff0c;比如wifi模块/4G模块/开启某块电路…

【pytorch】thread: [16,0,0] Assertion `t >= 0 t < n_classes` failed

报错信息&#xff1a;C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\Loss.cu:250: block: [0,0,0], thread: [16,0,0] Assertion t > 0 && t < n_classes failed 可能原因&#xff1a;标签label或者预测的结果pred&#xff0c;超出了数据的范围&…

10校大满贯!中国内地高校2024年1-6月CNS发文统计出炉

随着全球科研竞争的日趋激烈&#xff0c;CNS&#xff08;Cell、Nature、Science&#xff09;作为科学领域的三大顶级期刊&#xff0c;不仅是科研成果的展示平台&#xff0c;更是各国科研实力比拼的重要战场。近年来&#xff0c;中国高校在国际科研舞台上的表现愈发抢眼&#xf…

c#中的字符串方法

Concat() String.Concat(字符串1 字符串n) 字符串拼接 Contains () 字符串1.Contains(字符串2) 字符串1是否包含字符串2返回布尔值 CopyTo() 字符串1.CopyTo(0,空数组,0,5); 从哪开始 复制到哪里 从哪开始存 存储的个数 tartsWith 字符串1.StartsWith("字符串") 以…

排队问题--逆序对应用

对于逆序对&#xff0c;我们可以用树状数组的方式来求&#xff0c;但是值得注意的是&#xff0c;我们逆序对一般求的是比这个元素小的个数&#xff08;位置可以是前或者后&#xff09;&#xff0c;那么求比这个元素大的个数怎么办&#xff0c;我们可以用 i - query() !!! 每个元…

生物安全柜验证:气流流型、粒子、浮游菌等参考标准

生物安全柜也是制药行业常见设备&#xff0c;根据GMP的要求&#xff0c;需对生物安全柜定期进行验证确认&#xff0c;确保生物安全柜的性能满足GMP洁净厂房的相关要求。 生物安全柜是实验室的基本设备&#xff0c;也是生物安全实验室的一级安全隔离屏障。其最重要的作用就是气流…

Windows与Linux双机热备软件推荐

网络数据安全在如今信息化的时代越来越变得举足轻重&#xff0c;因此服务器维护和管理也成为企业健康稳定运营的一项重要工作。但实际情况是很多公司并没有配备专业的运维人员&#xff0c;一般都会通过一些管理软件维护或者主机托管给服务商。整理6款服务器的Windows与Linux双机…

JAVA-----异常处理

一、定义 在 Java 中&#xff0c;异常&#xff08;Exception&#xff09;是指程序在执行过程中遇到的不正常情况&#xff0c;这些情况可能导致程序无法继续执行或产生错误的结果。异常可以是 Java 标准库中提供的内置异常类&#xff0c;也可以是开发人员自定义的异常类。 二、…

Laravel数据库的魔术:数据库种子(Seeders)的实现指南

Laravel数据库的魔术&#xff1a;数据库种子&#xff08;Seeders&#xff09;的实现指南 在Laravel的世界里&#xff0c;数据库种子&#xff08;Seeders&#xff09;是一种优雅的方式来填充数据库&#xff0c;它允许开发者快速地为开发和测试环境创建所需的数据。通过使用Seed…

设计模式10-抽象工厂

抽象工厂 Abstract Factory 动机原理 结构优点代码推导不使用抽象工厂模式使用抽象工厂模式对比分析不使用抽象工厂模式的缺点使用抽象工厂模式的优点 抽象工厂&#xff08;Abstract Factory&#xff09;设计模式是一种创建型模式&#xff0c;它提供了一个接口&#xff0c;用于…

PyTorch面部表情识别项目实战

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 本书案例比较丰富、比较完整&#xff0c;可以用于课题研究、毕业论文素材&#xff0c;值得大家收藏。 人脸表情是人类信息交流的重要方式&#xff0c;它所包含的人体行为信息与人的情感状态、精神状态、健康状态等有着极为…

Docker自建私有仓库遇到https问题

记录一下自己在自建Docker仓库的时候遇到的一个报错 问题 docker push registry:5000/library/centos:7 The push refers to repository [registry:5000/library/centos] Get "https://registry:5000/v2/": http: server gave HTTP response to HTTPS client解决办…

关于Ubuntu22.04中的Command ‘vim‘ not found, but can be installed with:

前言 在Ubuntu终端编辑文本内容时需要利用vim&#xff0c;但新安装的虚拟机中并未配置vim&#xff0c;本文记录了vim的安装过程。 打开终端后&#xff0c;在home目录中输入 vim test.txt但提示报错&#xff0c;提示我们没有找到vim&#xff0c;需要通过以下命令进行安装&…