文档章节

Android7.0使用Intent打开文件

丁佳辉
 丁佳辉
发布于 2017/08/28 09:04
字数 475
阅读 43
收藏 0

软件使用过程中,有人反馈调用Intent打开文件地方无法出现选择。以为是个别用户手机上没有此类软件。后查看发现这些用户手机系统都是android7.0,查看7.0对于Intent的使用发现The increased level of file access security offered by a content URI makes FileProvider a key part of Android's security infrastructure.

android7.0之后,安全级别升级了。为了保护源文件,所以限制了其访问权限。使用第三方应用打开文件的时候会通过FileProvider ,生成 content URI允许您使用临时访问权限来授予读取和写入访问权限。关于FileProvider的介绍和使用。

我需要使用的功能是打开pdf

1.配置文件中定义FileProvider

 

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
</provider>

 

 

defaultConfig {
    applicationId "xxx"
    minSdkVersion 17
    targetSdkVersion 25
    versionCode 6
    versionName "1.0.5"
}

 

 

authorities:设置FileProvider的控制域

exported:设置FileProvider不需要是公开的

grantUriPermissions :授予对文件的临时访问权限

2.创建file_paths文件

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path name="my" path=""></external-path>
    </paths>
</resources>

 

<paths>有很多可直接利用的目录

 

<files-path name="name" path="path" /><!--Context.getFilesDir()-->
<cache-path name="name" path="path" /> <!--getCacheDir()-->
<external-path name="name" path="path" /><!--Environment.getExternalStorageDirectory()-->
<external-files-path name="name" path="path" /><!--表示应用程序外部存储区域根目录中的文件。
该子目录的根路径与Context#getExternalFilesDir(String)Context.getExternalFilesDir(null)返回的值相同。-->
<external-cache-path name="name" path="path" /><!--Context.getExternalCacheDir()-->

 

3.配置file_paths

 

<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths"/>

 provider整体配置:

 

 

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"/>
</provider>

 

 

4.生成文件的 content URI,并调用文件

 

private void show(String file) {
    try {
        Uri uri = null;
        if (Build.VERSION.SDK_INT >= 24) {
            uri = FileProvider.getUriForFile(this, "xx",new File(file));
        } else {
            uri = Uri.fromFile(new File(file));
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(uri, "application/pdf");
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

xx:配置文件中为provide配置的authorities属性值

本文转载自:http://blog.csdn.net/u012691505/article/details/71080275

丁佳辉
粉丝 20
博文 446
码字总数 203356
作品 0
浦东
程序员
私信 提问
Android包管理机制(一)PackageInstaller的初始化

前言 包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一。 包指的是Apk、jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一个...

刘望舒
2018/06/19
0
0
Android实战之app版本更新升级全文章(三)

(PS:也可以用第三方公司出的,比如腾讯的Bugly等,也挺方便的,不过apk要上传到Bugly的平台上,然后公司要求在自己平台上,所以没有使用。) -------------------------------------我是分割...

qq_27489007
2017/04/14
0
0
Android适配总结之FileProvider

1 概述 由于前段时间做的应用都是车机上的(Android6.0),并不需要太多适配。想想到现在,Android已经到9了,貌似我好久都没做过适配了,这些适配的工作还是有必要做一些记录。 参考资料 鸿洋...

newtrek
02/17
0
0
自定义Androidk全量更新组件

  自动更新功能对于一个APP来说是必备的功能,特别是对于未投放市场下载的APP,每次都让用户删掉原来的,再下载新的版本,肯定是不合适的。 实现思路: 后台提供接口,返回服务端版本号ser...

饮水思源为名
2018/08/09
0
0
Android 7.0 新特性

Android7.0提供新功能以提升性能、生产效率和安全性。 关于Android N的性能改进,Android N建立了先进的图形处理Vulkan系统,能少的减少对CPU的占用。与此同时,Android N加入了JIT编译器,安...

安卓笔记侠
2018/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部