FileProvider共享文件、缓存的使用

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值