React Native saveToCameraRoll在Android上出现"权限被拒绝"错误

Phi*_*hen 6 react-native-android

描述

saveToCameraRoll Permission denied在Android上失败并出现错误

再生产

将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);
            });
Run Code Online (Sandbox Code Playgroud)

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

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

附加信息

  • React Native版本:[填写此内容:错误是否在最新的RN版本上重现?]请查看V41
  • 平台:[填写这个:iOS,Android,或两者兼而有之?] Android inly
  • 操作系统:[填写此内容:MacOS,Linux或Windows?] Dev MacOS Sierra
  • 开发工具:[填写此内容:Xcode或Android Studio版本,iOS或Android SDK版本,如果适用] RN CLI + Android SDK

alp*_*pha 11

从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;
    }
  };
Run Code Online (Sandbox Code Playgroud)