FileProvider结合ContentProvider共享文件

1、注册

  

    
        
    

2、路径配置

src/main路径配置下,在res中建立一个xml文件下面建立一个配置文件,格式如下:



    

代表的根目录: Context.getFilesDir()
代表的根目录: Environment.getExternalStorageDirectory()
代表的根目录: 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 的权限,如果只读就声明读权限,如果读写都需要就声明读写权限。如:

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共享文件)