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());
        }
    }
上一篇下一篇

猜你喜欢

热点阅读