​ 近期需要用到读取Android设备外存中的JSON和Word,在前期开发时用于调试的是Android 6.0的米4,当拿到实际应用环境(Android 7.0)时,Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限请求代码(默认权限禁止),否则应用程序无法响应;查阅官方文档后发现可以使用FileProvider解决该问题

FileProvider概述

官方描述:FileProvider是ContentProvider的一个特殊的子类,通过创建content:// Uri来替代file:///Uri分享文件给另一个App,来促进安全共享。

原文: FileProvider is a special subclass of ContentProvider that facilitates secure sharing of files associated with an app by creating a content:// Uri for a file instead of a file:/// Uri.

主要步骤:

定义一个FileProvider

指定可用文件

检索文件的内容URI

授予URI的临时权限

将内容URI提供给其他应用程序

定义一个FileProvider

首先需要在AndroidManifest.xml里申请关于文件的权限

或者

同样,在AndroidManifest.xml中添加以下代码,允许授权临时访问文件

...

...

android:name="android.support.v4.content.FileProvider"

android:authorities="com.mydomain.fileprovider"

android:exported="false"

android:grantUriPermissions="true">

...

...

指定可用文件

在 res 下新建一个xml文件夹,并新建一个 filepath.xml 文件,使用 paths 指定具体文件路径,

在 paths 中 name 属性是用于之后的调用,path 属性对应我们需要的文件目录在对应父节点的路径

示例如下

创建后需要在fileprovider中加入该xml文件

android:name="android.support.v4.content.FileProvider"

android:authorities="com.example.yyyyz.systonpad.fileprovider"

android:grantUriPermissions="true"

android:exported="false">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/filepaths" />

​ 在 provider 中加入一个 meta-data 元素 , android:name 属性设为以上默认值即可, android:resource 设为刚才所添加的xml文件文件名。

为文件生成Content Uri

在完成以上两步后即可在程序中引用你所需要的文件,示例如下

File docPath = new File(mContext.getExternalCacheDir(), "docs");

File file = new File(docPath, cadre.getXm() + ".doc");

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){

Uri uri = getUriForFile(mContext,

BuildConfig.APPLICATION_ID+ ".fileprovider",

file);

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

// 设置文件类型为Word

intent.setDataAndType(uri, "application/msword");

} else{

Uri uri = Uri.fromFile(file);

intent.setDataAndType(uri, "application/msword");

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

}

​ 这里 mContext.getExternalCacheDir() 中获取的路径 Android\data\包名\cache 我需要的文件路径为Android\data\包名\cache\docs\ 所以在 child 中设为 “docs“ 。

​ 之后对Android系统版本进行判断,若>=7.0,则创建 content://Uri , 否则创建 file:///Uri。

​ getUriForFile() 的三个参数 第一个context 无需多说、第二个参数为 包名 + .fileprovider , 第三个参数为之前创建的要打开的file。

为Uri生成暂时的Permissions

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

将Uri提供给其他程序

intent.setDataAndType(uri, "application/msword");

mContext.startActivity(intent);

官方文档中介绍了以下6种不同的路径以及对应的函数

​ 等价于使用 Context.getFilesDir()

​ 等价于使用 getCacheDir()

​ 等价于使用 Environment.getExternalStorageDirectory().

等价于使用 `Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)`.

​ 等价于使用 Context.getExternalCacheDir().

​ 等价于使用 Context.getExternalMediaDirs(). 需要在api21+中使用

android调用另一app的xml,Android 7.0+调用其他App打开文件相关推荐

  1. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.4节文件I/O

    本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.4节文件I/O,作者 吴亚峰,更多章节内容可以访问云栖社区"异步社 ...

  2. android 读取sd卡中string.xml,android,从SD卡读取xml文件中的值

    helo,我想从这个文件中读取值:http://www.nbp.pl/kursy/xml/lastC.xml并用它们填充网格.我的应用程序下载此文件并将其保存在SDCard earch运行时间.我的问 ...

  3. c语言能调用refprop软件么,如何用C++6.0调用refprop物性查询软件 - 能源 - 小木虫 - 学术 科研 互动社区...

    鐪嬪府鍔╋紝杩欎釜寰堝鏄撶殑銆傝窡MATLAB鍟ョ殑璋冪敤鍩烘湰涓婇兘鏄竴鏍风殑銆� Sample C++ Code The example C code, called EX_C1.CPP (l ...

  4. 在线聊天App研发说明(android学习总结)

    初识android 确定学习android之后,开始动手,跟之前做过android的同事,要了开发环境和一本电子书<深入浅出Android--Google手持设备应用程序设计>.书很薄只有 ...

  5. android+矢量图+插件,如何玩转Android矢量图VectorDrawable

    从5.0(api等级21)开始,android开始支持矢量图了.关于什么是矢量图以及矢量图有什么优缺点不在本文的涉及范围之内,具体可以参考矢量图百科.不过这里要提一下它的优点: 保存最少的信息,文件大 ...

  6. android仿空间photoview,PickPhotoView:一个Android照片选择器

    PickPhotoView A Library help u to pick photos. Click to download lastest demo ⬇️ or select Release V ...

  7. 解决android手机EditText设置光标颜色,android:textCursorDrawable=@drawable/corner_cursor 华为手机无效果的问题

    app开发,根据产品需求,需要修改输入框内,光标的颜色, 需要增加一个属性, android:textCursorDrawable="@drawable/corner_cursor" ...

  8. 【Android开发】Android入门安装与使用教程——以Android Studio3.6.1为例

    [Android开发]Android入门教程--以Android Studio3.6.1为例 1.为什么要学习Android 2.学习资源 3.安装Android Studio 3.1 下载安装包 3 ...

  9. Android打开文件

    IM中常有的功能之一,发文件.发完自然需要打开.可是Android 并不能像IOS那样,可以用webview直接打开所有的文件类型. but产品要求,要和ios一样,用webview打开文件,最终接入 ...

最新文章

  1. [SimplePlayer] 1. 从视频文件中提取图像
  2. 佳能打印机ip90 64位系统的驱动_佳能打印机如何安装 佳能打印机漏墨如何解决【详解】...
  3. mvvm怎么让光标制定属性的文本框_Word怎么快速制作斜线表头?10秒搞定,表格颜值直线上升...
  4. thinkphp 路由
  5. CCF201604-1 折点计数
  6. 文本分类训练集 测试集_【AI1000问】训练为什么要分测试集和验证集?
  7. 巴菲特投资50年的5个心得
  8. linux怎样删除定时任务,Linux(CentOS)使用定时任务删除Tomcat日志文件
  9. idea java api_intellij idea怎么设置java帮助文档(示例代码)
  10. ZStack 3.6.0发布:支持云主机从KVM云平台在线迁移至ZStack
  11. 行业认证标准:IEC 61508电气/电子产品功能安全“通用”国际标准
  12. html中文字放在图片下边,css图片下边怎么加字
  13. 多线程爬取中国土地市场网土地交易数据,最新2020/08/21
  14. 颈椎护理小助手,轻松缓解颈部酸痛,宾多康智能颈枕按摩器体验
  15. 阿里巴巴编码规范 java认证记录
  16. 阿昆同学的Java学习日记Day1
  17. 关于嵌入式音视频程序开发的感想
  18. CUMT-CTF第二次双月赛Writeup
  19. ECMA7 新标准概述
  20. FICO配置详解之四:成本中心会计

热门文章

  1. Linux虚拟地址空间布局以及进程栈和线程栈总结
  2. ubuntu / 18.04 系统上配置 DHCP Server
  3. L、TEXT()、_TEXT()和_T()的区别
  4. Ubuntu终端Terminal常用快捷键
  5. linux内核定时唤醒,Linux内核时钟与定时器的实现
  6. caffe linux 教程,CentOS7安装Caffe的教程详解
  7. mysql 客户端_技术分享 | MySQL 客户端连不上(1045 错误)原因全解析
  8. 两线怎么接三线插座图_一文搞懂电工配电二线制、三线制、四线制
  9. Android 接入baceBook
  10. EBS ORACLE使用API批量取消销售订单