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);
}
}
Android FileProvider的使用
最新推荐文章于 2024-06-20 01:33:44 发布