已授予权限,但是当我尝试保存文件时出现权限被拒绝异常

Permission granted, but when I try to save file I get permission denied exception

我正在尝试下载 PDF 文件并将其保存到设备内存中。

  public void downloadPdfAttachment(Activity activity, Attachment attachment) {
    Dexter.withActivity(activity)
      .withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
      .withListener(new MultiplePermissionsListener() {
        @Override public void onPermissionsChecked(MultiplePermissionsReport report) {
          if (report.areAllPermissionsGranted() && attachment != null) {
            startPdfAttachmentDownload(activity, attachment);
          } else {
            view.displayStoragePermissionRequired();
          }
        }
        @Override public void onPermissionRationaleShouldBeShown(
          List<PermissionRequest> permissions, PermissionToken token) {
          token.continuePermissionRequest();
        }
      }).check();
  }

我在这里获得了所有两个许可。然后我尝试下载附件并保存。

public static String savePdfToDisk(Context context, ResponseBody body, String pdfName) {
    try {
      File fileDirectory = new File(getPdfFolder(context));
      fileDirectory.mkdir();

      File file = new File(fileDirectory, pdfName);
      file.createNewFile();

      InputStream inputStream = null;
      OutputStream outputStream = null;

      try {
        byte[] fileReader = new byte[4096];

        long fileSize = body.contentLength();
        long fileSizeDownloaded = 0;

        inputStream = body.byteStream();
        outputStream = new FileOutputStream(file);

        while (true) {
          int read = inputStream.read(fileReader);

          if (read == -1) {
            break;
          }

          outputStream.write(fileReader, 0, read);

          fileSizeDownloaded += read;

          Log.d("PdfUtils", "file download: " + fileSizeDownloaded + " of " + fileSize);
        }

        outputStream.flush();

        return file.getAbsolutePath();
      } catch (IOException e) {
        Log.d("PdfUtils", e.getMessage());
        return null;
      } finally {
        if (inputStream != null) {
          inputStream.close();
        }

        if (outputStream != null) {
          outputStream.flush();
          outputStream.close();
        }
      }
    } catch (IOException e) {
      Log.d("PdfUtils", e.getMessage());
      return null;
    }
  }

  public static String getPdfFolder(Context context) {
    return context.getFilesDir()+ "/my_app_name/pdf_files";
  }

在这一行我得到了权限被拒绝的异常。

      file.createNewFile();

我仔细检查了应用程序设置并授予了存储权限。

这是我的清单文件:

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

有什么想法吗?

试试这个,

public static String getPdfFolder(Context context) {
    return context.getFilesDir().getAbsolutePath() + "/my_app_name/pdf_files";
}

getFilesDir 的 return 值是 File 类型,因此如果您以这种方式进行字符串转换,将无法获得正确的路径。

问题是我的目标是 Android 10,API 29,他们更改了存储权限。