Использование FileProvider для открытия PDF-файла, включенного в мое приложение?

Я включил два PDF-файла, которые хочу открыть из своего приложения. Они должны открываться любой программой просмотра PDF, установленной пользователем. Я поместил PDF-файлы в /res/raw. Я использовал этот код:

File file = new File(getContext().getFilesDir().getPath(), s);
            Uri pdfUri = FileProvider.getUriForFile(getContext(), getContext().getApplicationContext().getPackageName() + ".provider", file);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(pdfUri, "application/pdf");
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Мой файл paths.xml выглядит так:

<paths>
<files-path path="raw/" name="raw" />

I'm getting an error that says:

java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.dsv2019.pvt15.prepapp/files/hjartlugnraddning.pdf

Почему это происходит?


person Rattletrap    schedule 31.05.2019    source источник


Ответы (1)


У вас есть несколько проблем.

Во-первых, <files-path path="raw/" name="raw" /> говорит, что он обслуживает файлы из подкаталога raw/ в getFilesDir(). Однако в new File(getContext().getFilesDir().getPath(), s) такого каталога не будет, если только он каким-то образом не находится в s, а ошибка предполагает, что это не так. Кстати, вы можете упростить это как new File(getContext().getFilesDir(), s).

Во-вторых, я думаю, что вы предполагаете существование каталога raw/ в getFilesDir(). Если вы не создадите этот каталог, он не будет существовать.

В-третьих, я думаю, что вы думаете, что сырые ресурсы - это файлы на устройстве. Они не. Это файлы на вашей машине разработки. Это просто записи в файле APK на устройстве.

Итак, чтобы это работало, вам нужно добавить код в:

  • Создайте подкаталог raw/ вне каталога getFilesDir()

  • Используйте openRawResource() для объекта Resources, чтобы скопировать ресурс в файл во вновь созданном подкаталоге raw/.

  • Используйте этот объект File из предыдущего шага с FileProvider.getUriForFile()

person CommonsWare    schedule 31.05.2019
comment
Спасибо. Где правильно хранить мои PDF-файлы, если не в res/raw? Кроме того, есть ли доступный учебник, который проходит шаги, которые вы упомянули? Я много гуглил, но так и не смог найти. - person Rattletrap; 31.05.2019
comment
@Rattletrap: Где правильно хранить мои файлы PDF, если не в формате res/raw? -- если вы хотите упаковать PDF вместе с вашим приложением, res/raw/ или assets/ подойдут. Однако ни одно из этих мест волшебным образом не распаковывается в файлы на устройстве. В обоих случаях вам нужно скопировать байты в файл. Этот образец приложения из в этой книге показан процесс с использованием assets/ для PDF вместо исходного ресурса. - person CommonsWare; 31.05.2019
comment
Теперь это работает. Огромное спасибо. Хороших выходных! - person Rattletrap; 31.05.2019