Ionic React Native - 请求出错:/storage/emulated/0/Download/newPicture.png: open failed: EACCES (Permission denied)

发布时间:2021-03-07 10:18

我的 Ionic React Android 应用程序遇到了问题。我想将文件下载到 Android 的公共下载文件夹,但我总是收到此错误:

Msg: error block ...  There was an error with the request: /storage/emulated/0/Download/newPicture.png: open failed: EACCES (Permission denied)

我正在使用以下代码:

function download(name){
    AndroidPermissions.hasPermission(AndroidPermissions.PERMISSION.READ_EXTERNAL_STORAGE)
        .then(status => {
          if (status.hasPermission) {
            console.log("Has permission");
            performAndroidDownload(name);
          } 
          else {
            console.log("Request permission");
            AndroidPermissions.requestPermission(AndroidPermissions.PERMISSION.READ_EXTERNAL_STORAGE)
              .then(status => {
                if(status.hasPermission) {
                  performAndroidDownload(name);
                }
              });
          }
        });
}

    function performAndroidDownload(name:string){
        const filePath = File.externalRootDirectory +"Download/"+ name; 
        console.log(filePath);
        HTTP.downloadFile("https://url.com/uploads/"+match.params.id+"/"+name, {}, {}, filePath).then(response => {
        // prints 200
        console.log('success block...', response);
        }).catch(err => {
        // prints 403
        console.log('error block ... ', err.status);
        // prints Permission denied
        console.log('error block ... ', err.error);
        });
    }

我还在 AndroidManifest.xml 中添加了 android:requestLegacyExternalStorage="true",但没有帮助。

也尝试了 WRITE_EXTERNAL_STORAGE 权限,但没有帮助。

感谢您的帮助!

回答1

我终于解决了权限问题!

请求上述权限后,我需要添加以下行:

AndroidPermissions.requestPermissions([AndroidPermissions.PERMISSION.READ_EXTERNAL_STORAGE,AndroidPermissions.PERMISSION.WRITE_EXTERNAL_STORAGE])

整个解决方案是:

function download(name){
    AndroidPermissions.hasPermission(AndroidPermissions.PERMISSION.READ_EXTERNAL_STORAGE)
        .then(status => {
          if (status.hasPermission) {
            console.log("Has permission");
            performAndroidDownload(name);
          } 
          else {
            console.log("Request permission");
            AndroidPermissions.requestPermission(AndroidPermissions.PERMISSION.READ_EXTERNAL_STORAGE)
              .then(status => {
                if(status.hasPermission) {
                  performAndroidDownload(name);
                }
              });
          }
        });
}

function performAndroidDownload(name:string){
    const filePath = File.externalRootDirectory + "Download/" + name; 
    AndroidPermissions.requestPermissions([AndroidPermissions.PERMISSION.READ_EXTERNAL_STORAGE,AndroidPermissions.PERMISSION.WRITE_EXTERNAL_STORAGE]).then(e => {
      
      HTTP.downloadFile("https://url.com/uploads/"+match.params.id+"/"+name, {}, {}, filePath).then(response => {
        // prints 200
        console.log('success block...', JSON.stringify(response));
    
        }).catch(err => {
        // prints 403
        console.log('error block ... ', err.status);
        // prints Permission denied
        console.log('error block ... ', err.error);
        });
    });

  }