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 ...
随机推荐
- 例子:两个表根据productID合并
- Spring的声明式事务
1.与hibernate集成 <bean id="sessionFactory" class="org.springframework.orm.hibernate3 ...
- iOS 如何改变表视图分割线在iOS7中的默认偏移
- (void)viewDidLoad { [super viewDidLoad]; self.automaticallyAdjustsScrollViewInsets = NO; if ([self ...
- 关于LAMP配置Let’s Encrypt SSL证书
昨天建站,买VPS,先装了LAMP,部署wordpress,测试OK了,然后才买的域名,申请SSL证书. 结果Let’s Encrypt cerbot申请证书遇到了麻烦,--apache参数怎么也识别 ...
- vue 更改头像功能实现
——————– 如上图所示:需要完成的功能是点击更改头像,获取本地文件库,选择图片后将原始图片替换.这里我就直接用html文件引入vue来简单实现在这功能,代码如下: HTML: <div i ...
- Lucene in action 笔记 term vector——针对特定field建立的词频向量空间,不存!不会!影响搜索,其作用是告诉我们搜索结果是“如何”匹配的,用以提供高亮、计算相似度,在VSM模型中评分计算
摘自:http://makble.com/what-is-term-vector-in-lucene given a document, find all its terms and the posi ...
- oracle自动统计信息
在11g中,默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时), select a.window_name, a.repeat_interval,a ...
- Oracle常用数据库表操作
配置数据库: user:orcl.passward:71911.Hao全局数据库名:orcl..解锁数据库用户名,SCOTT,SYSTEM,SYS, PWD:71911.Hao输入sqlplus, ...
- 【扬中集训DAY2T2】 机智的AmyZhi
[题目链接] 点击打开链接 [算法] 据说标算是暴力? 从N-200开始搜 不过我用了搜索+一些奇怪的剪枝,也A了.... [代码] 标程 #include<bits/stdc++.h> ...
- CCRect 构造函数的几个参数解释
转自: http://blog.163.com/hzklclick_wy/blog/static/21550517520137139511839/ void CCRect::setRect(f ...