【问题标题】:React Native saveToCameraRoll failed with `Permission denied` error on AndroidReact Native saveToCameraRoll 在 Android 上因“权限被拒绝”错误而失败
【发布时间】:2017-03-14 22:05:08
【问题描述】:

说明

saveToCameraRoll 在 Android 上因 Permission denied 错误而失败

复制

将 AWS S3 照片保存到设备相机胶卷突然失败

RNFS.downloadFile(DownloadFileOptions)
            .promise
            .then(() => {
                 CameraRoll.saveToCameraRoll(path, this.state.type) // path = /data/user/0/com.XXX.app/filesimage-xyz.jpg"
                    .then((data) => {
                        RNFS.unlink(path)
                            .then(() => {
                                console.log('Download and file unlink succeeded');
                            })
                            .catch((err) => {
                                console.error("RNFS unlink error: ", err.message);
                            });
                        })
                    .catch((error) => { 
                        console.error("Save to Cameral roll  error: ",error.message); 
//error = code:"EUNSPECIFIED"
// framesToPop:1
// message:"Permission denied"
// stack:"Error: Permission denied↵  
                    });
                })
            .catch((error) => {
                console.error("RNFS.downloadFile! error: ", error.message);
            });

在 android/app/src/main/AndroidManifest.xml 我有 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 在其他几个权限中。

什么会导致权限被拒绝错误?在 Manifest 级别应该做什么以保存到 cameraRoll ?

附加信息

  • React Native 版本:[填写此内容:该错误是否在最新的 RN 版本中重现?] 检查 V41
  • 平台:[填写此内容:iOS、Android 还是两者?] 仅限 Android
  • 操作系统:[填写此内容:MacOS、Linux 还是 Windows?] 开发 MacOS Sierra
  • 开发工具:[填写:Xcode 或 Android Studio 版本,iOS 或 Android SDK 版本,如果适用] RN CLI + Android SDK

【问题讨论】:

    标签: react-native-android


    【解决方案1】:

    从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时。您可以使用PermissionAndroid API 让用户授予外部存储访问权限。

    例子:

      requestExternalStoragePermission = async () => {
        try {
          const granted = await PermissionsAndroid.request(
            PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
            {
              title: 'My App Storage Permission',
              message: 'My App needs access to your storage ' +
                'so you can save your photos',
            },
          );
          return granted;
        } catch (err) {
          console.error('Failed to request permission ', err);
          return null;
        }
      };
    

    【讨论】:

    • 它有效,应该被标记为接受的答案,我相信!此外,我们可能需要执行Platform.OS 检查以及仅在Android 上需要权限请求。
    【解决方案2】:

    你可以试试:

    ...
    let permission = await Expo.Permissions.askAsync(Expo.Permissions.CAMERA_ROLL);
    
    if (permission.status === 'granted') {
       await CameraRoll.saveToCameraRoll(fileUrl, "photo");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      相关资源
      最近更新 更多