React Native saveToCameraRoll 在 Android 上因“权限被拒绝”错误而失败

Posted

技术标签:

【中文标题】React Native saveToCameraRoll 在 Android 上因“权限被拒绝”错误而失败【英文标题】:React Native saveToCameraRoll failed with `Permission denied` error on 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

【问题讨论】:

【参考方案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");

【讨论】:

以上是关于React Native saveToCameraRoll 在 Android 上因“权限被拒绝”错误而失败的主要内容,如果未能解决你的问题,请参考以下文章

react native 增加react-native-camera

更新 react-native-maps 以使用 create-react-native-app

react native 增加react-native-storage

React-Native 和 Expo:create-react-native-app 和 react-native init 之间的区别

什么是 react-native-cli 和 @react-native-community/cli?

React Native - 当 react-native 版本 > 0.55 时,无法通过 react-native-cli 创建新项目