通过fileProvider接收外部App传递文件路径的一些坑
问题
由于Google的作死,现如今线版本的Android系统阻止了应用之间通过intent传递路径的行为,而通过此方法传递过来的路径会非常奇怪,直接获取会以类似如下形式表现:
content://com.example.app.provider/storage/emulated/0/xxx...
如果将它丢到new File(path)里则会导致出错,那么如何解决这样的奇葩路径呢?
按照以往的方法,我们要读取到需要打开的文件的方法为:
Intent intent = getIntent();
if (intent != null) {String action = intent.getAction();if (action != null) {if (intent.ACTION_VIEW.equals(action)) {String uriPath = intent.getDataString(); //获取要打开文件的路径if (!isNull(uriPath)) {//执行打开操作...} else {//显示错误提示}}else if (intent.ACTION_SEND.equals(action)) {Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);if (uri != null) {String file = uri.getPath();if (!isNull(file)) {//执行打开操作...} else {//显示错误提示}} else {//显示错误提示}}}
}
但是显然,fileProvider传递过来并非通常意义的路径,我们无法直接进行打开操作,那么此时正确的方法为首先我们需要在接收“打开”操作的Activity中接收到系统传递过来的Intent:
Uri data = getIntent().getData();
接下来直接通过ContentResolver获取读取流进行读取文件内容:
if (data != null) {InputStream inputStream = null;try {inputStream = getContentResolver().openInputStream(data);String content = readStreamToString(inputStream);//content 就是读取到的内容了,请直接食用} catch (Exception e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException ignored) {}}}
}
此时通过ContentResolver获取到读取流就可以轻松读取到外部App传递过来的文档内容了。文中的content即读取到的文件所有内容,当然了,如果是图片也可以通过inputStream读取到,请按具体情况进行修改。
但是注意,如果遇到低版本的App,依然会传递以前方式正确路径过来,此时通过fileProvider法又无法读取内容,那么在这里我们就要做到新旧兼容,请参阅下述的完整代码:
完整代码
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//尝试使用fileProvider方式读取Uri data = getIntent().getData();if (data != null) {InputStream inputStream = null;try {inputStream = getContentResolver().openInputStream(data);String content = readStreamToString(inputStream);//请对读取到的内容content进行处理...} catch (Exception e) {//如果不支持,尝试老方法doTryOldReader(getIntent());} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException ignored) {}}}}else{//如果不支持,尝试老方法doTryOldReader(getIntent());}
}//部分旧文件浏览器可以直接将路径发过来的情况执行下边的方法
private void doTryOldReader(Intent intent) {if (intent != null) {String action = intent.getAction();if (action != null) {if (intent.ACTION_VIEW.equals(action)) {String uriPath = intent.getDataString();if (!isNull(uriPath)) {//在此处读取uriPath路径的文件即可} else {//错误提示}}if (intent.ACTION_SEND.equals(action)) {Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);if (uri != null) {String file = uri.getPath();if (!isNull(file)) {//在此处读取uriPath路径的文件即可} else {//错误提示}} else {//错误提示}}} else {//错误提示}} else {//错误提示}finish();
}
通过fileProvider接收外部App传递文件路径的一些坑相关推荐
- 解决微信小程序报[ app.json 文件内容错误] app.json: app.json 未找到,未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。小程序app.json报错
编译报错:[ app.json 文件内容错误] app.json: app.json 未找到 原因:由于project.config.json文件的miniprogramRoot小程序根目录属性找不到 ...
- 解决微信小程序报[ app.json 文件内容错误] app.json app.json 未找到,未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。小程序app.json报错
编译报错:[ app.json 文件内容错误] app.json: app.json 未找到 原因:由于project.config.json文件的miniprogramRoot小程序根目录属性找不到 ...
- Android用外部应用打开文件,Android N 以上使用其他应用打开文件 FileProvider
又是好长一段时间没有写东西了,说忙到没有时间写东西,这个说法在任何时候都是借口.总的来说还是没有写,真的要写的话还是有时间来写的,不说成为一个高产的人吧,但是稍微写一些的时间还是有的,再不济也可以分开 ...
- HTTP传递文件和接收文件处理之MultipartFile
1. 什么是MultipartFile? MultipartFile是spring用来处理文件封装的一个接口,继承自InputStreamSource,而InputStreamSource接口中封装了 ...
- 点击qq或者微信对话框里面的文件跳转到自己的app时的文件路径问题
点击qq或者微信对话框里面的文件跳转到自己的app时的文件路径问题 最近研发一个手机app,当点击qq或者微信里面的文件时,需要把自己的app加入到可用的程序列表.并在打开软件里面对点击的文件做响应的 ...
- Android安卓的APP应用安装后该应用所有相关文件路径
一. Android应用安装后该应用所有相关文件路径有4种情况: system/app 系统自带的应用程序,无法删除.root后可以删除,注意可能造成系统崩溃,不过有的垃圾捆绑软件只能这么删除了 da ...
- QtCreator里添加外部第三库、头文件路径的方法(.pro文件)
一.前言 在项目开发过程中,经常需要用到第三方库,需要在QtCreator工程里指定第三库的路径.头文件路径.引用的库名称等等:并且可能还需要编写通用工程针对不同的编译器类型,位数选择不同的库,针对不 ...
- python更改文件路径_更换路径python
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pypi 项目 github 地址 . (本版本 sdk 基于 json api ...
- ASP.NET Core 3.1系列(7)——Controller接收前端上传文件的方法
1.前言 前一篇博客主要介绍了在GET和POST模式下Controller接收参数的一系列方法,归根结底还是一些简单类型参数的传递和接收.当前端界面需要上传文件时,后台的Controller又应该如何 ...
- kvm虚拟机_通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部
本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现 tag: qemu-ga, qemu guest agent, kvm, guest-file-write, inject 小慢哥的原 ...
最新文章
- python列表中包含元祖_python列表与元祖
- 多级菜单栏展开隐藏动画
- 7种CSS圆角框解决方案
- Pixhawk代码分析-姿态解算篇D
- 腾讯无边界网络 致胜企业安全新战场
- 淘宝客网站的链接跳转形式
- CentOS 5安装GIT的基本命令
- 年薪 66万+,西澳大学招聘 CV DL Research Fellow(研究员)
- CCF201409-1 相邻数对
- 高清壁纸:60款可爱的圣诞节电脑桌面壁纸《中篇》
- 10692 XYM-入门之道
- tensorflow搭建神经网络
- 观察者模式和java委托
- WinXP无损升级Win10
- kettle使用教程(超详细)
- Chrome扩展 - 百度识图
- 整理百度SEO指南2.0
- kepware怎么读modbus/tcp数据_DDR3读写数据调试
- Exception 异常和自定义异常
- HRBUSTOJ 1313 火影忍者之~静音 【模拟】【排序】