Ошибка React Native saveToCameraRoll с ошибкой «Отказано в доступе» на Android

Описание

Сбой saveToCameraRoll с ошибкой Permission denied на Android

Воспроизведение

Сохранение фотографии AWS S3 на устройстве Camera Roll неожиданно завершилось сбоем

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" /> среди нескольких других разрешений.

Что может вызвать ошибку отказа в доступе? что нужно сделать на уровне манифеста, чтобы сохранить в cameraRoll?

Дополнительная информация

  • Версия React Native: [ЗАПОЛНИТЕ ЭТО: Воспроизводится ли ошибка в последней версии RN?] Проверьте с помощью V41.
  • Платформа: [ЗАПОЛНИТЕ ЭТО: iOS, Android или обе?] Только Android
  • Операционная система: [ЗАПОЛНИТЕ ЭТО: MacOS, Linux или Windows?] Dev MacOS Sierra
  • Инструменты разработки: [ЗАПОЛНИТЕ ЭТО: версия Xcode или Android Studio, версия iOS или Android SDK, если применимо] RN CLI + Android SDK

person Philippe Cohen    schedule 14.03.2017    source источник


Ответы (2)


Начиная с 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;
    }
  };
person alpha    schedule 26.05.2017
comment
Я считаю, что это работает и должно быть помечено как принятый ответ! Также нам, вероятно, нужно выполнить Platform.OS проверку, так как запрос разрешения нужен только на Android. - person rudyryk; 16.01.2018

Можешь попробовать:

...
let permission = await Expo.Permissions.askAsync(Expo.Permissions.CAMERA_ROLL);

if (permission.status === 'granted') {
   await CameraRoll.saveToCameraRoll(fileUrl, "photo");
}
person Rodrigo Tessarollo    schedule 05.03.2018