android React-天然-fs事件:打开失败:EACCES(权限被拒绝),重新安装后打开“/storage/emulated/0/Download/

ltskdhd1  于 2022-12-16  发布在  Android
关注(0)|答案(2)|浏览(630)
  • 大家好 *
    环境:
  • 安卓11
  • 天然 reactjs 0.68.5
  • React Native文件系统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.权限.写入外部存储
  • 权限Android.权限.读取外部存储

我的版本。等级:

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"

我把build.gradle中的minSdkVersion从21改为30。
我的印象是,权利属于应用程序,就好像通过重新安装应用程序它失去了它的权利。

rta7y2nd

rta7y2nd1#

对于android,您必须获得用户的许可,才能在与存储通信时在React Native代码中写入此内容

import {Button, PermissionsAndroid} from "react-native";

const requestCameraPermission = async () => {
try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
      {
        title: "Cool Photo App Camera Permission",
        message:
          "Your app needs permission.",
        buttonNeutral: "Ask Me Later",
        buttonNegative: "Cancel",
        buttonPositive: "OK"
      }
    );
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      return true;
    } else {
      console.log("Camera permission denied");
      return false;
    }
  } catch (err) {
    console.warn(err);
    return false;
  }
}

在按下按钮或代码中的任何其他地方调用上述函数

xfyts7mz

xfyts7mz2#

你没有告诉它,但这种情况发生在你的Android 11+设备。
在Android 11+上,应用只能访问自己创建的文件以及公共目录中的媒体文件。
重新安装后,应用程序将被视为不同的应用程序。
使用存储访问框架ACTION_OPEN_DOCUMENT让用户选择文件。

相关问题