美文网首页
FileProvider结合ContentProvider共享文

FileProvider结合ContentProvider共享文

作者: 快感的感知 | 来源:发表于2021-12-29 10:40 被阅读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());
            }
        }
    

    相关文章

      网友评论

          本文标题:FileProvider结合ContentProvider共享文

          本文链接:https://www.haomeiwen.com/subject/mwlvqrtx.html