FileProvider共享文件、缓存的使用

来源:互联网 发布:crm软件 用百会 编辑:程序博客网 时间:2024/06/05 18:07

FileProvider 是一个特殊的 ContentProvider 的子类,它使用 content:// Uri 代替了 file:/// Uri.
从而更便利而且安全的为另一个app分享文件。
使用FileProvider前需要在 AndroidManifest.xml中进行配置:

  <provider        android:name="android.support.v4.content.FileProvider" //provider的类名        android:authorities="com.example.myapp.fileprovider"   //没有特定要求,自定义        android:exported="false"                               //不建议设置为true        android:grantUriPermissions="true">               //允许你有给其赋予临时访问权限的权力        <meta-data            android:name="android.support.FILE_PROVIDER_PATHS"            android:resource="@xml/provider_paths"/>     //定义资源路径    </provider>

这里是直接使用的v4包中的FileProvider,我们也可以直接继承FileProvider类,适当重写重载函数,但不建议如此做。下面来介绍上面的几个设置:
android:name: provider的类名, 若使用默认的v4的FileProvider可使用”android.support.v4.content.FileProvider”,也可以设置为自定义的继承FileProvider的provider类;
android:authorities: 一个签名认证,可以自定义,但在获取uri的时候需要保持一致;
android:grantUriPermissions: 使用FileProvider的时候需要我们给留出的URI赋予临时访问权限(READ和WRITE),该设置是允许我们行使该项权力;
meta-data: meta-data配置的是我们可以访问的文件的路径配置信息,需要使用xml文件进行配置,FileProvider会通过解析xml文件获取配置项,其中name名字不可改变,应为:android.support.FILE_PROVIDER_PATHS,resource为配置路径信息的配置项目。

创建res/xml/fileprovider_paths.xml文件,并配置路径:

<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android">    <external-path        name="storage"        path="../../../"/>    <cache-path        name="cache-path"        path="."></cache-path>    <external-cache-path        name="external-cache-path"        path="."></external-cache-path>    <external-files-path        name="external-files-path"        path="."></external-files-path></paths>

在这个文件中,为每个目录添加一个XML元素指定目录。
paths 可以添加多个子路径:
分享app内部的存储, Context.getFilesDir();
分享外部的存储,Environment.getExternalStorageDirectory();
分享内部缓存目录。(我遇到的就是分享的缓存) getCacheDir();

其中属性的意思,如:
path=”../../../”
name=”storage”
组成的路径就是Environment.getExternalStorageDirectory() + “../../../”+“storage”;
若此处Environment.getExternalStorageDirectory() 的值为/storage/emulated/0/,则完整的路径为:
/storage/emulated/0/../../../storage, 即 /storage。意思就是共享/storage目录下及其子目录下的文件

FileProvider的使用
若要获取IMG_20171111_110012.jpg文件的uri,代码如下:

String auth = "com.example.myapp.fileprovider";String filePath = "/storage/506C-181E/DCIM/CameraVr/IMG_20171111_110012.jpg";File file = new File(filePath ); Uri uri = FileProvider.getUriForFile(context, auth, file);
原创粉丝点击