3

我需要使用rn-fetch-blob将文件下载到 React Native 应用程序中用户的下载目录,但似乎它与 Android 10 不兼容,因为我收到错误:

在此处输入图像描述

首先我请求权限:

try {
            const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE);
            if (granted === PermissionsAndroid.RESULTS.GRANTED) {
                await actualDownloadPDF();
            } else {
                ToastAndroid.show('Nepovolili jste ukládání souborů do zařízení.', ToastAndroid.LONG);
            }
        } catch (err) {
            console.warn(err);
        }

然后我尝试下载文件:

const res = await RNFetchBlob.config({
                addAndroidDownloads: {
                    useDownloadManager: true,
                    notification: true,
                    mime: 'application/pdf',
                    title: filename,
                    path: dirs.DownloadDir,
                },
            }).fetch('GET', url, {
                Authorization: 'Bearer ' + Api.Bearer,
            });

似乎 Android 10 需要开发人员打开 Intent,用户选择对文件夹的写入权限( https://developer.android.com/training/data-storage/shared/documents-files#grant-access-directory),但我我不知道该怎么做,因为似乎 RNFetchBlob 还没有这个功能。

任何想法如何使这项工作?它在 Android 9 上运行良好。

4

3 回答 3

1

添加android:requestLegacyExternalStorage="true"到您的 AndroidManifest.xml

<application
  ...
  android:requestLegacyExternalStorage="true"
>
于 2021-04-14T16:43:36.727 回答
1

我认为您的 if 子句是错误的。我的工作示例如下所示:

import { PermissionsAndroid } from "react-native";

export const CheckFilePermissions = async (platform) => {
  if(platform === 'android') {
    try {
      const granted = await PermissionsAndroid.requestMultiple([
        PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
        PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
      ]);
      if (granted['android.permission.READ_EXTERNAL_STORAGE'] && granted['android.permission.WRITE_EXTERNAL_STORAGE']) {
        // user granted permissions
        return true;
      } else {
        // user didn't grant permission... handle with toastr, popup, something...
        return false;
      }
    } catch (err) {
      // unexpected error
      return false;
    }
  } else {
    // platform is iOS
    return true;
  }
};

你可以像这样使用它:

if(await CheckFilePermissions(Platform.OS)) {
....
your code 
....
于 2021-02-19T12:02:19.803 回答
1
const fileName = 'document.pdf'; 
const destPath = RNFetchBlob.fs.dirs.DownloadDir + '/' + fileName;

const config = {
  fileCache : true, 
  path: destPath, 
  addAndroidDownloads: { 
    title: destPath, 
    description: `Download ${destPath}`,
    useDownloadManager: false, 
    notification: false,
  }
}; 

const res = await RNFetchBlob.config(config)...

我正在使用此代码,它适用于 Android 10。

于 2020-08-18T18:12:40.373 回答