您现在的位置是:首页 > 文章详情

Android 7.0 FileProvider使用

日期:2018-07-18点击:423
1). FileProvider

Android 7.0的新特性规定,对于android 7.0应用(仅仅对于android 7.0版本的sdk而言,若是编译版本低于25仍然不会受到影响),android框架使用StrictMode Api禁止我们的应用对外部(跨越应用分享)公开file://,若使用file://格式共享文件则会报FileUriExposedException异常,android 7.0应用间的文件共享需要使用content://类型的URI分享,并且需要为其提供临时的文件访问权限
(Intent.FLAG_GRANT_READ_URI_PERMISSION和Intent.FLAG_GRANT_WRITE_URI_PERMISSION),对此,官方给我们的建议是使用FileProvider类进行分享。

2). 使用步骤
  • manifest中声明FileProvider
  • res/xml中定义对外暴露的文件夹路径
  • 生成content://类型的Uri
  • 给Uri授予临时权限
  • 使用Intent传递Uri
3). AndroidManifest.xml文件声明
 <provider android:name="android.support.v4.content.FileProvider" android:authorities="<包名>.fileProvider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> 
  • name:provider的类名,若使用默认的v4的FileProvider可使用”android.support.v4.content.FileProvider”,也可以设置为自定义的继承FileProvider的provider类;
  • authorities:一个签名认证,可以自定义,但在获取uri的时候需要保持一致;
  • grantUriPermissions:使用FileProvider的使用需要我们给流出的URI赋予临时访问权限(READ和WRITE),该设置是允许我们行使该项权力;
  • meta-data:meta-data配置的是我们可以访问的文件的路径配置信息,需要使用xml文件进行配置,FileProvider会通过解析xml文件获取配置项,其中name名字不可改变为:android.support.FILE_PROVIDER_PATHS,resource为配置路径信息的配置项目。
4). xml配置
<?xml version="1.0" encoding="utf-8"?> <resources> <paths> <!-- Context.getFilesDir() + "/path/" --> <files-path name="my_files" path="mazaiting/"/> <!-- Context.getCacheDir() + "/path/" --> <cache-path name="my_cache" path="mazaiting/"/> <!-- Context.getExternalFilesDir(null) + "/path/" --> <external-files-path name="external-files-path" path="mazaiting/"/> <!-- Context.getExternalCacheDir() + "/path/" --> <external-cache-path name="name" path="mazaiting/" /> <!-- Environment.getExternalStorageDirectory() + "/path/" --> <external-path name="my_external_path" path="mazaiting/"/> <!-- Environment.getExternalStorageDirectory() + "/path/" --> <external-path name="files_root" path="Android/data/<包名>/"/> <!-- path设置为'.'时代表整个存储卡 Environment.getExternalStorageDirectory() + "/path/" --> <external-path name="external_storage_root" path="."/> </paths> </resources> 
img_acec241f6307c21611977b911c865a1e.png
图1.png
5). 生成Uri
 Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", new File(path)); 
6). 授予临时权限
 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
7). 传递
 intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); 
8). 安装应用代码
img_2841e81d7522bfbb41c32999e8a749a0.png
图2.png
原文链接:https://yq.aliyun.com/articles/663271
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章