问题:在文件管理器打开三方应用生成的文件,提示不支持文件格式。

分析:先看下系统自带的应用生成的文件是否能正常使用。如:相机拍张照片,在filemanager里面打开,显示正常。log如下

06-03 09:34:02.560  3148  3148 D FileManager: FileManagerOperationActivity, onItemClick, position = 0   --- 点击Item打开文件

06-03 09:34:02.560  3148  3148 D FileManager: BaseAsyncTask, isTaskBusy,task status = FINISHED

06-03 09:34:02.560  3148  3148 D FileManager: BaseAsyncTask, isTaskBusy,retuen false.

06-03 09:34:02.560  3148  3148 D FileManager: FileManagerOperationActivity, onItemClick,Selected position: 0

06-03 09:34:02.561  3148  3148 D FileManager: FileInfo, getMimeType fileName=IMG_20200603_093255_3.jpg,extension = jpg ---文件信息,名称与类型

06-03 09:34:02.561  3148  3148 D FileManager: FileInfo, getMimeType mimeType =image/jpeg

06-03 09:34:02.561  3148  3148 D FileManager: FileInfo, getItemContentUri, filePath = /storage/emulated/0/DCIM/Camera/IMG_20200603_093255_3.jpg, projection = [Ljava.lang.String;@d85383a, where = _data = ?, baseUri = content://media/external/file  -------文件路径

06-03 09:34:02.581  3148  3148 D FileManager: FileInfo, getItemContentUri, item id = 52  -----item的id

06-03 09:34:02.584  3148  3148 D FileManager: FileManagerOperationActivity, onItemClick,Open uri file: content://media/external/file/52 with mimetype =image/jpeg ----获取到uri路径,正常打开文件

06-03 09:34:02.602  3148  3148 D FileManager: AbsBaseActivity, onPause

06-03 09:34:03.274  3148  3148 D FileManager: AbsBaseActivity, onSaveInstanceState , mCurrentPath = /storage/emulated/0/DCIM/Camera

再看有问题的log

06-03 09:35:12.056  3148  3148 D FileManager: FileManagerOperationActivity, onItemClick, position = 0

06-03 09:35:12.056  3148  3148 D FileManager: BaseAsyncTask, isTaskBusy,task status = FINISHED

06-03 09:35:12.056  3148  3148 D FileManager: BaseAsyncTask, isTaskBusy,retuen false.

06-03 09:35:12.056  3148  3148 D FileManager: FileManagerOperationActivity, onItemClick,Selected position: 0

06-03 09:35:12.056  3148  3148 D FileManager: FileInfo, getMimeType fileName=iscanLog.txt,extension = txt

06-03 09:35:12.056  3148  3148 D FileManager: FileInfo, getMimeType mimeType =text/plain

06-03 09:35:12.057  3148  3148 D FileManager: FileInfo, getItemContentUri, filePath = /storage/emulated/0/iScan/iscanLog.txt, projection = [Ljava.lang.String;@f2e7212, where = _data = ?, baseUri = content://media/external/file

以上的log没有问题

06-03 09:35:12.086  3148  3148 D FileManager: FileManagerOperationActivity,  should not pass null uri in the intent

这里没有了这部分,且提示了uri为null。那么就有可能是外部的文件的rui丢失。

06-03 09:34:02.581  3148  3148 D FileManager: FileInfo, getItemContentUri, item id = 52  -----item的id

06-03 09:34:02.584  3148  3148 D FileManager: FileManagerOperationActivity, onItemClick,Open uri file: content://media/external/file/52 with mimetype =image/jpeg ----获取到uri路径,正常打开文件

06-03 09:34:02.602  3148  3148 D FileManager: AbsBaseActivity, onPause

06-03 09:34:03.274  3148  3148 D FileManager: AbsBaseActivity, onSaveInstanceState , mCurrentPath = /storage/emulated/0/DCIM/Camera

去看源码src/com/mediatek/filemanager/FileManagerOperationActivity.java这个文件里面打开文件的代码处做修改,如果uri为null的话,就去重新获取

if (canOpen) {Intent intent = new Intent(Intent.ACTION_VIEW);Uri uri = selecteItemFileInfo.getItemContentUri(this);if(uri == null){+     uri = selecteItemFileInfo.getUri();LogUtils.d(TAG, " uri ==== " +uri);if (uri == null) {mToastHelper.showToast(R.string.msg_unable_open_file);LogUtils.d(TAG, " should not pass null uri in the intent");return;}}LogUtils.d(TAG, "onItemClick,Open uri file: " + uri +" with mimetype =" + mimeType);intent.setDataAndType(uri, mimeType);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);if (mimeType != null && mimeType.equals(TXT_MIME_TYPE)) {mTxtFile = selecteItemFileInfo;}try {startActivity(intent);} catch (android.content.ActivityNotFoundException e) {mTxtFile = null;mToastHelper.showToast(R.string.msg_unable_open_file);LogUtils.w(TAG, "onItemClick,Cannot open file: "+ selecteItemFileInfo.getFileAbsolutePath());}}

但是这样会有一个crash错误:

android.os.FileUriExposedException:

因为在Android N以后 谷歌收回了访问文件的权限,即一个应用提供自身资源文件给其它应用使用时,如果给出 file://xxx 这样格式的URI的话,谷歌会认为目标应用不具备访问此文件的权限,便会抛出 FileUriExposedException 的异常。

此处的解决方式是:在onCreate()添加

import android.os.StrictMode;StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());builder.detectFileUriExposure();

忽略VM的检测。

添加FileProvider的方式解决。

在Android.mk文件添加v4包

LOCAL_STATIC_ANDROID_LIBRARIES := \android-support-v4 \

在AndroidManifest.xml添加provider标签

<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="com.mediatek.filemanager.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths" />
</provider>

在res/xml/新建provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><root-path name="external_files" path="."/>
</paths>

src/com/mediatek/filemanager/FileManagerOperationActivity.java修改

if (canOpen) {Intent intent = new Intent(Intent.ACTION_VIEW);+     //Uri uri = selecteItemFileInfo.getItemContentUri(this);+     Uri uri = FileProvider.getUriForFile(this,getPackageName() + ".fileprovider",selecteItemFileInfo.getFile());if(uri == null){//uri = selecteItemFileInfo.getUri();//if (uri == null) {mToastHelper.showToast(R.string.msg_unable_open_file);LogUtils.d(TAG, " should not pass null uri in the intent");return;//}}LogUtils.d(TAG, "onItemClick,Open uri file: " + uri +" with mimetype =" + mimeType);intent.setDataAndType(uri, mimeType);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);+     intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); if (mimeType != null && mimeType.equals(TXT_MIME_TYPE)) {mTxtFile = selecteItemFileInfo;}try {startActivity(intent);} catch (android.content.ActivityNotFoundException e) {mTxtFile = null;mToastHelper.showToast(R.string.msg_unable_open_file);LogUtils.w(TAG, "onItemClick,Cannot open file: "+ selecteItemFileInfo.getFileAbsolutePath());}}

Android P MTK 文件管理器打开三方应用生成的文件,提示不支持文件格式。相关推荐

  1. 对于RE文件管理器打开安卓手机的Sqlite文件速度很慢的解决办法

    开发的时候遇到这类的事件了,当时需要查看手机数据库信息是否写入正确,但是使用RE的时候打开很慢,要等很久,找了许久才找到问题.一.手机没有root,此时是打不开的状态.二.手机root不完整,重新卸载 ...

  2. 计算机管理器用户怎么打开文件,电脑文件管理器怎么打开文件夹 文件管理器打开想要的文件夹方法-电脑教程...

    电脑文件管理器怎么打开文件夹?当我们在Win10中打开任务栏中文件管理器时,默认只有2个位置:此电脑和快速访问.前者指向传统的磁盘盘符界面,而后者就是Win10新增的那6个大家不怎么使用的固定默认文件 ...

  3. Android使用文件管理器打开指定文件夹,浏览里面的内容

    Android下可以打开一些文件,带有.doc 等后缀的文件网上一般都有解释,这个写一个使用文件管理器打开指定文件夹的 private void openAssignFolder(String pat ...

  4. Android打开系统自带文件管理器,选择指定类型的文件

    //调用系统文件管理器打开指定路径目录Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//intent.setDataAndType(Uri ...

  5. 安卓 通过intent调用系统文件管理器打开指定路径目录

    安卓 通过intent调用系统文件管理器打开指定路径目录   转  https://blog.csdn.net/qq_34161388/article/details/78586247 当我们知道一个 ...

  6. android 调用系统文件管理器

    今天,简单讲讲android如何调用系统的文件管理器获取目录下的文件资源. 这几天,还是因为搬家的事,导致自己状态很差.和领导说想要辞职,领导说还是先适应一下在说.所以还是坚持了. 这个其实也很简单, ...

  7. 手机如何能看java文件管理器_基于安卓Android的手机文件管理器的设计(AndroidStudio)...

    基于安卓Android的手机文件管理器的设计(AndroidStudio)(论文13000字,程序代码) 摘要:本文的目标是设计开发出一款Android手机文件管理器,首先介绍了开发工具和开发语言的来 ...

  8. android 7.0文件管理器,miui9文件管理器apk下载

    IT猫扑网为您带来的miui9文件管理器提取版拥有全新的人性化设计,相比前几代有了翻天覆地的变化,更安全的防护措施,更简洁的界面设计,真正为用户着想.感兴趣的朋友快来IT猫扑下载吧. miui9文件管 ...

  9. UOS使用命令调用文件管理器打开指定路径的方法

    语法如下: dde-file-manager <路径> 例如: dde-file-manager /home/liumou/ 麒麟的方法如下: 麒麟kylin使用命令调用文件管理器打开指定 ...

最新文章

  1. 动力节点Java培训告诉你Java线程的多功能用法
  2. 远程办公时,有哪些提高沟通效率的技巧?
  3. rt-thread的定时器管理源码分析
  4. Eclipse中快速为类提供构造器、get()、set()方法、重写toString()、hasCode()、equals()等
  5. 洛谷 - P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
  6. leetcode 406. 根据身高重建队列(贪心算法)
  7. 秒懂云通信:如何用阿里云语音通知服务(小白指南)
  8. php正则提取a,正则表达式 - php提取html中指定div下a标签的text和href问题
  9. navigation笔记
  10. mysql维护计划 自动备份_MysQL windows 下自动备份,同时加入计划任务脚本
  11. 理解SNS系列之二:更进一步,近观SNS
  12. 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
  13. idea 中vim快捷键
  14. 解析offsetHeight,clientHeight,scrollHeight之间的区别
  15. wget下载网络资源
  16. EayRadius 于 2013-7-19 进行体验度更新,增加用户体验度
  17. 乐动手环app下载安装_乐动手环app下载安装
  18. maven的依赖下载不下来,解决的几种方法(包括手动下载导入)
  19. 真的必须要在主线程更新UI吗?
  20. Rust websocket 客户端实现

热门文章

  1. 计算机和hdmi无法正常显示,Win7系统下电脑HDMI连接显示器字体显示虚不清楚如何解决...
  2. 设计一下类似SpringIoC的注入工具~Lind.DI
  3. 史上最全MOS管封装管脚外观解读,新手必读!
  4. 福建程序员行业技术微信交流群,福建的小伙伴看过来了!
  5. 20145339顿珠达杰 《信息安全系统设计基础》第0周学习总结
  6. Berkeley DB JE 学习笔记
  7. webpack点滴yan
  8. 数码相机存储图片格式
  9. 甲骨文oracle测试面试记录
  10. Oracle 的汉译名 甲骨文 由来