android 7.0 应用间文件共享FileProvider
1.官方教程
Android 7.0 以后安全系数提高,应用间文件共享要使用FileProvider。原来的 file:///
Uri 替换为
content://
Uri
https://developer.android.com/reference/android/support/v4/content/FileProvider
2.步骤
- Defining a FileProvider
- Specifying Available Files
- Retrieving the Content URI for a File
- Granting Temporary Permissions to a URI
- Serving a Content URI to Another App
3.示例
3.1 定义 FileProvider
在AndroidManifest.xml中
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="cn.com.txw.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
非androidx 使用 android:name="android.support.v4.content.FileProvider"
3.2 定义共享文件的路径
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="externalFiles" path="download/"/>
<external-path name="externalRoot" path="download/" />
<root-path name="root" path="" />
</paths>
注意 path的值是目录时要有 "/"
<paths>可选子标签及含义 如下:
子标签 | 路径 |
---|---|
file-path | Context.getFilesDir() |
cache-path | getCacheDir() |
external-path | Environment.getExternalStorageDirectory() |
external-files-path | Context#getExternalFilesDir(String) Context.getExternalFilesDir(null) . |
external-cache-path | Context.getExternalCacheDir() |
external-media-path | Context.getExternalMediaDirs() |
root-path |
根目录 "/" |
3.3 生成共享文件的uri
public static void openApkFile(String file ) { Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri data;
File apk = new File(file); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
final String author = "cn.com.txw.fileprovider";
try {
data = FileProvider.getUriForFile(mContext, author, apk);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}catch (Exception e){
e.printStackTrace();
Log.e(TAG, "openApkFile: exception = " + e.getMessage() );
return;
}
} else {
data = Uri.fromFile(apk);
}
intent.setDataAndType(data, "application/vnd.android.package-archive");
mContext.startActivity(intent);
}
FileProvider.getUriForFile(mContext, author, apk) 生成uri,其中:
- author 为AndroidManifest 中指定的 android:authorities="cn.com.txw.fileprovider"
- apk 为文件绝对路径
- mContext 为Context
3.4 文件的临时权限
上述代码中的 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 增加uri相关临时权限。
mContext.grantUriPermission开启权限
uri = FileProvider.getUriForFile(mContext, author, apk);
int mode_flags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
mContext.grantUriPermission(mContext.getPackageName(), uri, mode_flags);
intent.addFlags(mode_flags);
mContext.revokeUriPermission关闭权限
mContext.revokeUriPermission(uri,mode_flags);
4.android 8.0的问题
上述示例是打开apk文件,注意在8.0后要申请”未知来源应用“的安装权限。
private boolean checkPermissions(){
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
String[] permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.REQUEST_INSTALL_PACKAGES};
final int KG_PERMISSION = ; int permissionCheck = ; for (String permission : permissions){
permissionCheck += checkSelfPermission(permission);
}
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
requestPermissions(permissions,KG_PERMISSION);
return false;
}
}
return true;
}
android 7.0 应用间文件共享FileProvider的更多相关文章
- Android 7.0 通过FileProvider共享文件
一.概述 Android 7.0后,提供了很多新特性,其中最主要的是禁止了通过file://URI直接在文件操作共享文件(该操作会触发FileUriExposedException),而是通过cont ...
- Android 7.0 FileProvider 使用说明
FileProvider FileProvider 这个组件在Android 22.0.0 (也就是 Android 5.0 ) 版本下加入进Android系统,该组件是ContentProvider ...
- android 7.0+ FileProvider 访问隐私文件 相册、相机、安装应用的适配
从 Android 7.0 开始,Android SDK 中的 StrictMode 策略禁止开发人员在应用外部公开 file:// URI.具体表现为,当我们在应用中使用包含 file:// URI ...
- Android 7.0下,拍摄照片报错
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI.如果一项包含文件 URI 的 intent 离开 ...
- 应用间共享文件 FileProvider
应用间共享文件 FileProvider 7.0及以上版本,分析文件给其他进程访问的时候,需要使用FileProvider,否则会出现崩溃: 例如:用系统下载器下载apk,然后通过Intent安装. ...
- android 7.0以上共享文件(解决调用系统照相和图片剪切出现的FileUriExposedException崩溃问题)
在android7.0开始试共享“file://”URI 将会导致引发 FileUriExposedException. 如果应用需要与其他应用共享私有文件,则应该使用 FileProvider, F ...
- Android 7.0 行为变更
Android 7.0 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 如果您之前发布过 Android 应用,请注意 ...
- 关于Android 7.0更新后调用系统相机及电筒问题
android升级到7.0后对权限又做了一个更新即不允许出现以file://的形式调用隐式APP,需要用共享文件的形式:content:// URI 因为系统相机是提供的共享 Provider , C ...
- Android 7.0新特性
还望支持个人博客站:http://www.enjoytoday.cn 由于google目前不是无法直接在国内访问,故此,对于android 开发平台的7.0新特性做个保存.也可供大家查阅.原文转自an ...
随机推荐
- NPOI实现Excel导入
导入功能实现: ]; GetExtensionsFromFileStream(file.InputStream); using NPOI.XSSF.UserModel; public List< ...
- angularjs开发常见问题-2(angularjs内置过滤器)
在angular中内置了几个经常使用的filter,能够简化我们的操作. 过滤器使用 '|' 符号,概念有点相似于linux中的管道. 1.filter (过滤) filter能够依据条件过滤数据.样 ...
- ElasticSearch远程随意代码运行漏洞(CVE-2014-3120)分析
原理 这个漏洞实际上非常easy,ElasticSearch有脚本运行(scripting)的功能,能够非常方便地对查询出来的数据再加工处理. ElasticSearch用的脚本引擎是MVEL,这个引 ...
- JSP JDBC 读取SQL Server 数据2
<%-- Created by IntelliJ IDEA. User: hellohongfu Date: 2017/12/21 Time: 0:16 To change this templ ...
- install build tools 25.0.2 and sync the project
install build tools 25.0.2 and sync the project in android studio bundle.gradle,将buildToolsVersion修改 ...
- Eclipse 创建新的workspace
工具:eclipse 版本:4.5.1 1.配置jdk(java-Compiler).maven(Mven-User Settings) 2.从svn拉取项目,创建.project(修改其项目名称) ...
- Delphi通过Get获取来自PHP的返回值
Delphi代码 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contro ...
- Go——godoc命令简介
前言 godoc的一些简记 命令 godoc的列表 | godoc的chm下载 查看godoc的所有命令 `$ godoc -h` usage: godoc -http=localhost:6060 ...
- MySQL 优化之 EXPLAIN 关键字
MySQL查询优化之explain的深入解析 0. 准备 首先执行如下的 sql 语句: CREATE TABLE IF NOT EXISTS `article` (`id` int(10) unsi ...
- [Selenium] 配置 Internet Explorer Driver 的注意事项
1)请确保 IEDriverServer 的可执行文件在系统环境变量PATH 中 2)在IE7 和以上版本的 Internet Explorer 上,必须确保保护模式的正确配置.设置方式为 Tools ...