从内容uri读取文件时出现权限错误

时间:2019-02-13 10:29:31

标签: android react-native

我一直在尝试制作一个简单的文档选择器,该文档选择器允许用户选择一个文件并返回以base64编码的所选文件。 为此,我目前正在使用两个软件包:

这是这段特定的代码:

    DocumentPicker.pick({
        type: [DocumentPicker.types.allFiles]
    })
    .then(res =>
    {
        RNFS.readFile(decodeURIComponent(res.uri), "base64").then(result =>
        {
            console.log(result)
        })
    })
    .catch(error =>
    {
        console.log(error)
    })

从“下载”文件夹中选择文件时,它很好用,但是,当我尝试从“最近”文件夹或与我的应用程序不相关的任何文件夹中选择文件时,readFile失败,并显示以下错误:

  

拒绝权限:从pid = 22663读取com.android.providers.media.MediaDocumentsProvider uri内容://com.android.providers.media.documents/document/image:105724,uid = 10471需要android.permission.MANAGE_DOCUMENTS或grantUriPermission()

根据我的阅读,MANAGE_DOCUMENTS是“签名”权限,不能添加到manifest.xml或由react native android权限API授予。

是否可以通过任何方式授予或传递react-native-fs此权限,或者可以使用任何替代方法来选择任何文件而不会出现错误?我做错了吗? 我试过使用react-native-get-real-path从内容uri获取文件uri,并获取内容uri以获得blob,但这似乎行不通。

谢谢

2 个答案:

答案 0 :(得分:1)

对于遇到此问题的任何人,请确保您不要在Android上使用decodeURIComponent。但是您仍然必须将其用于IOS。以下代码段可在两个平台上使用

import { Platform } from 'react-native';
import DocumentPicker from 'react-native-document-picker';

const file = await DocumentPicker.pick();
const uri = Platform.select({
  android: file.uri,
  ios: decodeURIComponent(file.uri)?.replace?.('file://', ''),
});

const base64File = await RNFS.readFile(uri, "base64");
// Your file handling here

答案 1 :(得分:0)

回答我的问题,因为我发现了问题:RNFS.readFile仅在提供原始res.uri时才有效,您不必通过解码URIComponent对其进行解码。

正确的代码是:

RNFS.readFile(res.uri, "base64").then(result =>
{
    console.log(result)
})