Search code examples
react-nativeandroid-permissionsandroid-external-storage

Permission Denial Error when trying to upload file picked with [react-native-document-picker] to Firestore storage


I'm trying to upload an xlsx to Firestore storage, using react-native-document-picker to pick the file from ExternalStorageDirectoryPath so when I just log the files URI I don't get the error but as soon as try to upload the file it throws the error.

relevant code :

const uploadFile = async () => {
  try {
    const res = await DocumentPicker.pick({
      type: [DocumentPicker.types.allFiles],
    });
           
    const task = Storage().ref('catalogue/'+ res.name).putFile(res.uri);
           
    task.on('state_changed', 
      sn => {},
      err => console.log(err),
      () => {
        console.log('excel uploaded!'+res.name)
        Storage()
          .ref("catalogue").child(res.name).getDownloadURL()
          .then(url => {
            console.log('uploaded excel url', url);
          }).catch(err=>console.log(err))
      }
    )
    await task 
           
  } catch (err) {
    if (DocumentPicker.isCancel(err)) {
      // User cancelled the picker, exit any dialogs or menus and move on
    } else {
      throw err;
    }
  }
}

I already included the required permissions in myAndroidManifest.xml` file and rebuilt the project

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>

but still I'm getting this error:

Permission Denial: reading com.android.externalStorageProvider uri content://com... requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()


Solution

  • I had a similar problem with the frameworks Qt with the last android SDK version, I've fixed the problem by adding requestLegacyExternalStorage in the manifest (pat Application):

    <application
      android:requestLegacyExternalStorage="true"
      android:hardwareAccelerated="true" 
      android:name="org.qtproject.qt5.android.bindings.QtApplication" 
      //...
    />
    

    it's related to a recent change in the permission system: https://developer.android.com/about/versions/11/privacy/storage