Writing a file using RNFS (react-native-fs) in Android

958 Views Asked by At

I've been trying to write a file in Android using RNFS (react-native-fs), but I keep getting the following error :

Permission Denial: writing com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image%3A1000004616 from pid=8769, uid=10304 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()

This is my approach :

// write the file
RNFS.writeFile('content://com.android.providers.media.documents/document/image%3A1000004621', '/storage/emulated/0/Documents/my_app_folder/my_image.jpg', 'base64')
.then(success => {
  console.log('FILE WRITTEN!');
})
.catch(err => {
  console.log(err.message);
});

I have the following permisstions enabled :

try {
    PermissionsAndroid.requestMultiple([
      PermissionsAndroid.PERMISSIONS.ACCESS_MEDIA_LOCATION,
      PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
      PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
      PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES,
      PermissionsAndroid.PERMISSIONS.READ_MEDIA_VIDEO,
      PermissionsAndroid.PERMISSIONS.READ_MEDIA_AUDIO,
    ]).then(result => {
      if (
        result['android.permission.ACCESS_MEDIA_LOCATION'] &&
        result['android.permission.READ_EXTERNAL_STORAGE'] &&
        result['android.permission.WRITE_EXTERNAL_STORAGE'] &&
        result['android.permission.READ_MEDIA_IMAGES'] &&
        result['android.permission.READ_MEDIA_VIDEO'] &&
        result['android.permission.READ_MEDIA_AUDIO'] === 'granted'
      ) {
        console.log('SUCCESS! Permissions Granted!');
      } else if (
        result['android.permission.ACCESS_MEDIA_LOCATION'] ||
        result['android.permission.READ_EXTERNAL_STORAGE'] ||
        result['android.permission.READ_MEDIA_IMAGES'] ||
        result['android.permission.READ_MEDIA_VIDEO'] ||
        result['android.permission.READ_MEDIA_AUDIO'] === 'never_ask_again'
      ) {
        console.log(
          'Please Go into Settings -> Applications -> APP_NAME -> Permissions and Allow permissions to continue',
        );
      }
    });
  } catch (err) {
    console.warn(err);
  }  

Manifest.xml :

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"   

Where am I going wrong?

Thank you all in advance.

1

There are 1 best solutions below

0
On

As far as I know, RNFS still have problems with SAF support https://github.com/itinance/react-native-fs/issues/926

A working solution is to use library like this https://github.com/ammarahm-ed/react-native-scoped-storage.

And an explanation why it happened https://blog.notesnook.com/scoped-storage-in-react-native/