Как просмотреть/показать файл PDF с помощью FileProvider? Показывает только пустой экран

Приложение для Android может создавать PDF-файлы, которые должны храниться во внешнем хранилище и просматриваться или делиться пользователем.

Создание, хранение и совместное использование файла не проблема. Однако просмотреть файл не удается, и отображается только пустой экран.

Это мой код:

<!-- Provider definition in manifest -->
<provider
    android:authorities="com.example.MyApp.fileprovider"
    android:name="android.support.v4.content.FileProvider"
    android:exported="false"
    android:grantUriPermissions="true" >
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>


<!-- file_path.xml in xml resource dir -->
<?xml version="1.0" encoding="utf-8"?>
<path xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="ExternalDir" path="Documents/MyApp" />
</path>


// Sharing and viewing
File baseDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
File appDir = new File(baseDir, "MyApp");
appDir.mkdirs();

File pdfFile = new File(appDir, "Test.pdf");
savePDFToFile(pdfFile)


Uri fileUri = FileProvider.getUriForFile(this, "com.example.MyApp.fileprovider", pdfFile);

// View
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
viewIntent .setDataAndType(fileUri, "application/pdf");
viewIntent .addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
viewIntent .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(viewIntent , "View"));


// Sharing
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("application/pdf");
sharingIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
startActivity(Intent.createChooser(sharingIntent, "Share"));

Создание/запись PDF-файла не проблема. Таким образом, с разрешениями проблем не возникает. Поделиться файлом (например, сохранить его на Google Диске или отправить по электронной почте) также не проблема. Таким образом, конфигурация FileProvider и создание Uri кажутся правильными.

Итак, что не так с намерением просмотра? При тестировании этого в эмуляторе с использованием API 26 отображается только пустая страница. Пользователь, запускающий тот же код на устройстве с API 26, получает сообщение о том, что доступ к файлу невозможен (без причины).

Однако файл существует, и разрешение на доступ не должно быть проблемой, потому что в противном случае намерение совместного использования также не сработает, не так ли?

Как это решить?


person Andrei Herford    schedule 02.05.2018    source источник
comment
если на вашем телефоне не установлено приложение с поддержкой просмотра pdf, то оно не будет работать   -  person Hitesh Sarsava    schedule 02.05.2018
comment
На телефоне пользователя установлен Adobe Acrobat. Таким образом, это не должно быть проблемой. Совместное использование с Google Диском в эмуляторе не проблема, и, насколько мне известно, Googel Driver предлагает встроенную программу просмотра PDF. Итак, должна ли быть возможность просмотра файла с помощью Google Диска в эмуляторе?   -  person Andrei Herford    schedule 02.05.2018
comment
гугл диск не позволяет открыть внешний pdf файл. это только открыть сохраненный файл PDF на диске Google.   -  person Hitesh Sarsava    schedule 02.05.2018
comment
Я только что протестировал его на другом эмуляторе с API 24 и установил на него Acrobat с помощью PlayStore. Теперь я могу выбирать между Google Диском и Acrobat для просмотра файла. Acrobat показывает всплывающее сообщение с текстом. Не удалось получить доступ к этому файлу. Проверьте местоположение или сеть и повторите попытку. Google Диск открывает пустой экран и снова переключается на мое приложение...   -  person Andrei Herford    schedule 02.05.2018
comment
не тестируйте в эмуляторе, тестируйте на реальном устройстве, чтобы получить реальную ошибку   -  person Hitesh Sarsava    schedule 02.05.2018
comment
Как объяснено, тест на реальном устройстве с API 26 выдает точно такую ​​же ошибку. Доступ к этому файлу невозможен... Установка Acrobat в эмуляторе была необходима только для того, чтобы получить точно такое же сообщение в эмуляторе (вместо пустого экрана при использовании Google Водить машину). Итак, вопрос все тот же: почему обмен работает, а просмотр нет?   -  person Andrei Herford    schedule 02.05.2018
comment
это потому, что диск Google создан для обмена только файлами с использованием глубоких ссылок. Вы знаете о глубоких ссылках в Android? затем найдите его. это даст вам полный ответ на ваш вопрос. вот ссылки, например: developers.google.com/+/mobile /android/share/deep-link и stackoverflow.com/questions/35175055/   -  person Hitesh Sarsava    schedule 02.05.2018
comment
Давайте продолжим обсуждение в чате.   -  person Andrei Herford    schedule 02.05.2018