react-native-fs ENOENT:打开失败:EACCES(权限被拒绝),重新安装后打开'/storage/emulated/0/Download/

问题描述 投票:0回答:2

大家好

环境:

  • 安卓11
  • 反应原生0.68.5
  • react-native-fs 2.20.0

需要:

将文件持久保存到应用程序(如果我卸载应用程序,文件需要保留)。如果我重新安装应用程序,我需要能够再次操作这些文件。我用

RNFS.DownloadDirectoryPath
上传了下载文件夹中的文件,这样在卸载应用程序时它们不会被删除,但文件是公共的,可以在需要时下载到其他位置。

错误:

一切正常,直到我卸载并重新安装该应用程序。一旦我想操作我的

/storage/emulated/0/Download/AppName/...

中的现有文件

当我想移动文件时遇到以下错误:

Error: ENOENT: open failed: EACCES (Permission denied), open '/storage/emulated/0/Download/AppName/...

当我想下载文件时遇到以下错误:

Error: ENOENT: no such file or directory, open '/storage/emulated/0/Download

在操作文件之前,我确保我有:

  • 权限Android.PERMISSIONS.WRITE_EXTERNAL_STORAGE
  • 权限Android.PERMISSIONS.READ_EXTERNAL_STORAGE

我的build.gradle:

buildToolsVersion = "31.0.0" 
minSdkVersion = 30 
compileSdkVersion = 31 
targetSdkVersion = 31

我的清单:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
....
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true"
...

非常感谢那些花时间帮助我的人

为了尝试解决问题,我在清单中添加了这一行:

android:preserveLegacyExternalStorage="true"

我将

minSdkVersion
中的
build.gradle
从 21 更改为 30。

我的印象是,权利属于应用程序,就好像重新安装应用程序后它就失去了权利一样。

android react-native react-native-fs
2个回答
0
投票

您没有告诉它,但这种情况发生在您的 Android 11+ 设备上。

在 Android 11+ 上,应用程序只能访问它自己创建的文件以及公共目录中的媒体文件。

重新安装后,应用程序将被视为不同的应用程序。

使用存储访问框架 ACTION_OPEN_DOCUMENT 让用户选择文件。


0
投票

我是这样保存文件的

const localFilePath = Platform.select({
        android: `${RNFS.DownloadDirectoryPath}/filename.extension`
    });

await RNFS.writeFile(localFilePath, file_data, 'utf8');

只需将

DownloadDirectoryPath
更改为
DocumentDirectoryPath
它对我有用

© www.soinside.com 2019 - 2024. All rights reserved.