FileProvider结合ContentProvider共享文
2021-12-29 本文已影响0人
快感的感知
1、注册
<provider
android:name="com.yjn.yy.provider.MmkvFileProvider"
android:authorities="com.yjn.yy.provider.MmkvFileProvider"
android:enabled="true"
android:exported="true"
android:permission="com.straw.providerhost.course.read"></provider>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.yjn.yy.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
2、路径配置
src/main路径配置下,在res中建立一个xml文件下面建立一个配置文件,格式如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path
name="files-path"
path="." />
</paths>
<files-path/>代表的根目录: Context.getFilesDir()
<external-path/>代表的根目录: Environment.getExternalStorageDirectory()
<cache-path/>代表的根目录: getCacheDir()
3、关键代码
在contentprovider中加入以下关键代码
@Override
public String getType(Uri uri) {
if (uri == null) {
Log.w(TAG, "uri is null in getType");
return null;
}
String fileName = uri.getLastPathSegment();
return getFileUri(fileName).toString();
}
/**
* 获取文件Uri 地址
*
* @param fileName
* @return
*/
private Uri getFileUri(String fileName) {
File file = new File(mmkvFilePath);
Uri uri = null;
if (file.exists()) {
uri = FileProvider.getUriForFile(EnvUtil.getInstance().getContext(), "com.yjn.yy.fileprovider",
new File(getContext().getFilesDir().getAbsolutePath() + File.separator
+ "mmkv", fileName));
granUriPermission(uri);
} else {
Log.d(TAG, "fileName is not exists");
}
return uri;
}
/**
* 赋予临时权限
*
* @param uri
*/
private void granUriPermission(Uri uri) {
EnvUtil.getInstance().getContext().grantUriPermission("第三方访问的包名", uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
4、调用方使用
4.1、权限声明
首先,在使用方的 AndroidManifest.xml 中需要声明所使用 ContentProvider 的权限,如果只读就声明读权限,如果读写都需要就声明读写权限。如:
<uses-permission android:name="com.straw.providerhost.course.read"/>
4.2、调用代码
private void queryFileContent(String fileName) {
try {
Context context = getContext();
if (context == null) {
return;
}
String filePath = context.getContentResolver().getType(Uri.withAppendedPath(Uri.parse(""com.yjn.yy.provider.MmkvFileProvider""), "yjn.txt"));
if (filePath == null) {
return;
}
ParcelFileDescriptor parcelFileDescriptor = getContext().getContentResolver().openFileDescriptor(Uri.parse(filePath), "r");
FileReader reader = new FileReader(parcelFileDescriptor.getFileDescriptor());
BufferedReader bufferedReader = new BufferedReader(reader);
StringBuilder stringBuilder = new StringBuilder();
String line = ""; // 读取一行数据
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
Logger.info(TAG, "内容:" + stringBuilder.toString());
} catch (Exception e) {
Logger.err(TAG, e.getMessage());
}
}