Android FileProvider的使用

package com.lipeng.fileprovider;

import android.content.Context;
import android.net.Uri;
import android.text.TextUtils;

import androidx.core.content.FileProvider;

import java.io.File;

/**
 * 2023/4/20
 * @author : lp
 */
public class MyFileProvider extends FileProvider {

    /**
     * 使用FileProvider
     *
     * 1.
     * 因为是ContextProvider的子类,所以需要在AndroidManifest.xml中注册:
     * <provider
     *     android:authorities="${applicationId}.fileprovider"
     *     android:name="androidx.core.content.FileProvider"
     *     android:exported="false"
     *     android:grantUriPermissions="true">
     *        <meta-data
     *             android:name="android.support.FILE_PROVIDER_PATHS"
     *             android:resource="@xml/conversation_file_paths">
     *        </meta-data>
     * </provider>
     * authorities:可以自定义,也可以使用(${applicationId}.fileprovider)的形式
     * name:即当前类,继承FileProvider的实现类,也可以如示例在清单文件中配置系统的FileProvider,
     *      在使用的地方直接使用系统的FileProvider,根据使用情况的多样性决定即可
     * android:exported="false" 只能为false
     * android:grantUriPermissions="true" 是否允许授予权限
     * android:resource="@xml/conversation_file_paths" 见2
     *
     * 2.
     * 因为需要对真实的文件路径进行映射,所以需要编写一个xml文档,用于描述可使用的文件目录,以及通过name去映射该文件夹目录
     * <resources>
     *     <paths>
     *         <root-path
     *             name="root"
     *             path="" />
     *
     *         <files-path
     *             name="files"
     *             path="" />
     *
     *         <cache-path
     *             name="cache"
     *             path="" />
     *
     *         <external-path
     *             name="external"
     *             path="" />
     *
     *         <external-files-path
     *             name="external_file_path"
     *             path="" />
     *         <external-cache-path
     *             name="external_cache_path"
     *             path="" />
     *     </paths>
     * </resources>
     * root-path/files-path/cache-path... 为对应的真实的系统文件路径
     * name:将真实的文件路径映射成的值
     *
     * 3.
     * 获取通过FileProvider获取映射的Uri, 见函数getUribyProvider()
     *
     * 4.
     * 授予Uri权限,有2种方式
     *
     * 一种是,通过Intent传递uri给第三方应用使用,通过addFlags的形式
     * Intent intent = new Intent(Intent.ACTION_SENDTO);
     * intent.setData(uri);
     * intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
     *
     * 另一种是,通过grantUriPermission(),指定包名的形式,
     * context.grantUriPermission("使用该uri的程序包名", providerUri,
     *                 Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
     * revokeUriPermission(): 删除指定uri授予给其他进程的临时权限
     *
     */

    private static final String PROVIDER_AUTHORITIES = ".fileprovider";
    public Uri getUribyProvider(Context context, String filePath) {
        if (TextUtils.isEmpty(filePath)) {
            return null;
        }
        File temFile = new File(filePath);
        if (!temFile.exists()) {
            return null;
        }
        return getUriForFile(context,
                context.getPackageName() + PROVIDER_AUTHORITIES, temFile);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值