Открытие PDF-файла с помощью Android - PullRequest
0 голосов
/ 30 августа 2018

Итак, вот сценарий:

Я загружаю PDF из сети и сохраняю его в /0/Download/NSIT - Notices/"fileName".pdf

Теперь отправляем Намерение так:

private void openPDF(String fileName) {
    Log.d(TAG, "openPDF: called");
    Intent intent = new Intent(Intent.ACTION_VIEW);File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download", "NSIT - Notices");
    File myPDF = new File(Environment.getExternalStorageDirectory() + "/Download/NSIT - Notices", fileName + ".pdf");
    Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", myPDF);
    Log.d(TAG, "openPDF: intent with uri: " + uri);
    intent.setDataAndType(uri, "application/pdf");
    context.startActivity(Intent.createChooser(intent, "Open with..."));
}

Теперь любой читатель PDF (Google Drive PDF Reader, System PDF Viewer) говорит

The File Does Not Exist

Изображение: enter image description here

Гугл сидит, ничего не делая (поэтому не включил свое изображение)

Mainfest.xml

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

Provider_path.xml

    <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

Я создаю файл здесь в AsyncTask, но открываю из postExecute этого AsyncTask

File myDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download", "NSIT - Notices");
            File myPDF = new File(myDir, params[1] + ".pdf");
            if (!myDir.exists())
                myDir.mkdirs();
            try {
                fileOutputStream = new FileOutputStream(myPDF);
                fileOutputStream.write(response.bodyAsBytes());
                fileOutputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Log.d(TAG, "doInBackground: Download complete");

Logcat

enter image description here

Раньше он бросал FileUriExposedException, затем я исправил эту вещь FileProvider. Проблема в том, что файл pdf, загруженный моим приложением, успешно создан, и я могу открыть его из любого файлового менеджера (теперь ES File Explorer), но не из моего приложения :(. Я новичок в FileProvider. Нужна помощь!

PS: Это не проблема моего устройства. Протестировано на двух других телефонах с разными ПЗУ и API> = 23

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Пожалуйста, установите intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Это предоставит доступ к вашему файлу другим провайдерам

0 голосов
/ 30 августа 2018

См. Документацию для Файловый провайдер

Доступен ли поставщик контента для использования другими приложениями:

true: поставщик доступен для других приложений. Любое приложение может использовать URI контента провайдера для доступа к нему, при условии разрешения, указанные для провайдера.

false: поставщик недоступен для других приложений. доступ к поставщику ваших приложений. Только приложения, которые иметь тот же идентификатор пользователя (UID), к которому у провайдера будет доступ.

Попробуйте изменить Android: exported = "true"

...