问题
由于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传递文件路径的一些坑相关推荐

  1. 解决微信小程序报[ app.json 文件内容错误] app.json: app.json 未找到,未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。小程序app.json报错

    编译报错:[ app.json 文件内容错误] app.json: app.json 未找到 原因:由于project.config.json文件的miniprogramRoot小程序根目录属性找不到 ...

  2. 解决微信小程序报[ app.json 文件内容错误] app.json app.json 未找到,未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。小程序app.json报错

    编译报错:[ app.json 文件内容错误] app.json: app.json 未找到 原因:由于project.config.json文件的miniprogramRoot小程序根目录属性找不到 ...

  3. Android用外部应用打开文件,Android N 以上使用其他应用打开文件 FileProvider

    又是好长一段时间没有写东西了,说忙到没有时间写东西,这个说法在任何时候都是借口.总的来说还是没有写,真的要写的话还是有时间来写的,不说成为一个高产的人吧,但是稍微写一些的时间还是有的,再不济也可以分开 ...

  4. HTTP传递文件和接收文件处理之MultipartFile

    1. 什么是MultipartFile? MultipartFile是spring用来处理文件封装的一个接口,继承自InputStreamSource,而InputStreamSource接口中封装了 ...

  5. 点击qq或者微信对话框里面的文件跳转到自己的app时的文件路径问题

    点击qq或者微信对话框里面的文件跳转到自己的app时的文件路径问题 最近研发一个手机app,当点击qq或者微信里面的文件时,需要把自己的app加入到可用的程序列表.并在打开软件里面对点击的文件做响应的 ...

  6. Android安卓的APP应用安装后该应用所有相关文件路径

    一. Android应用安装后该应用所有相关文件路径有4种情况: system/app 系统自带的应用程序,无法删除.root后可以删除,注意可能造成系统崩溃,不过有的垃圾捆绑软件只能这么删除了 da ...

  7. QtCreator里添加外部第三库、头文件路径的方法(.pro文件)

    一.前言 在项目开发过程中,经常需要用到第三方库,需要在QtCreator工程里指定第三库的路径.头文件路径.引用的库名称等等:并且可能还需要编写通用工程针对不同的编译器类型,位数选择不同的库,针对不 ...

  8. python更改文件路径_更换路径python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pypi 项目 github 地址 . (本版本 sdk 基于 json api ...

  9. ASP.NET Core 3.1系列(7)——Controller接收前端上传文件的方法

    1.前言 前一篇博客主要介绍了在GET和POST模式下Controller接收参数的一系列方法,归根结底还是一些简单类型参数的传递和接收.当前端界面需要上传文件时,后台的Controller又应该如何 ...

  10. kvm虚拟机_通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部

    本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现 tag: qemu-ga, qemu guest agent, kvm, guest-file-write, inject 小慢哥的原 ...

最新文章

  1. python列表中包含元祖_python列表与元祖
  2. 多级菜单栏展开隐藏动画
  3. 7种CSS圆角框解决方案
  4. Pixhawk代码分析-姿态解算篇D
  5. 腾讯无边界网络 致胜企业安全新战场
  6. 淘宝客网站的链接跳转形式
  7. CentOS 5安装GIT的基本命令
  8. 年薪 66万+,西澳大学招聘 CV DL Research Fellow(研究员)
  9. CCF201409-1 相邻数对
  10. 高清壁纸:60款可爱的圣诞节电脑桌面壁纸《中篇》
  11. 10692 XYM-入门之道
  12. tensorflow搭建神经网络
  13. 观察者模式和java委托
  14. WinXP无损升级Win10
  15. kettle使用教程(超详细)
  16. Chrome扩展 - 百度识图
  17. 整理百度SEO指南2.0
  18. kepware怎么读modbus/tcp数据_DDR3读写数据调试
  19. Exception 异常和自定义异常
  20. HRBUSTOJ 1313 火影忍者之~静音 【模拟】【排序】

热门文章

  1. python histogram bins_5种方法教你用Python玩转histogram直方图
  2. 北京自由职业艺术人才首评职称 不看身份看业绩
  3. 正则表达式在一个字符串上多次搜索、正则表达式匹配书名等
  4. 系统重构过程中的异构数据同步回环处理
  5. 360校招真题——最强大脑
  6. 软件版本中的beta,rc,ga是什么意思
  7. 明知故犯还是执迷不悟?
  8. Rimworld Mod制作教程7 comp组件
  9. 警告: PREMNMX is an obsolete function.解决办法
  10. Eclipse Mars2在线安装svn详细步骤