大家好
环境:
需要:
将文件持久保存到应用程序(如果我卸载应用程序,文件需要保留)。如果我重新安装应用程序,我需要能够再次操作这些文件。我用
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
在操作文件之前,我确保我有:
我的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 11+ 设备上。
在 Android 11+ 上,应用程序只能访问它自己创建的文件以及公共目录中的媒体文件。
重新安装后,应用程序将被视为不同的应用程序。
使用存储访问框架 ACTION_OPEN_DOCUMENT 让用户选择文件。
我是这样保存文件的
const localFilePath = Platform.select({
android: `${RNFS.DownloadDirectoryPath}/filename.extension`
});
await RNFS.writeFile(localFilePath, file_data, 'utf8');
只需将
DownloadDirectoryPath
更改为 DocumentDirectoryPath
它对我有用