Как просмотреть / показать файл PDF с помощью FileProvider? Показывает только пустой экран - PullRequest
0 голосов
/ 02 мая 2018

Приложение 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, получает сообщение о том, что доступ к файлу невозможен (без причины).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...