Разрешение предоставлено, но когда я пытаюсь сохранить файл, я получаю исключение отказа в разрешении - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь загрузить файл 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";
  }

И в этой строке я получаю исключение, что Permision отклоняется.

      file.createNewFile();

Я дважды проверяю настройки приложения и разрешение на хранение

Вот мой файл манифеста:

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Проблема в том, что я нацеливаюсь на Android 10, API 29, и они изменили разрешение на хранение.

Android Q: file.mkdirs () возвращает false

0 голосов
/ 06 марта 2020

Попробуйте,

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

Возвращаемое значение getFilesDir имеет тип File, поэтому, если вы выполните String Casting таким образом, вы не получите правильный путь.

...