Android намерение открывает пустой PDF, хотя я использовал тот же путь, который использовался для его сохранения - PullRequest
4 голосов
/ 06 февраля 2020

Я пытаюсь сгенерировать PDF из макета с:

                PdfDocument document = new PdfDocument();
                PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2480, 3508, 0).create();
                PdfDocument.Page page = document.startPage(pageInfo);

                linearview.draw(page.getCanvas());
                document.finishPage(page);

                OutputStream outStream;
                File file = new File(getExternalFilesDir(null), "pedido.PDF");

                try {
                    outStream = new FileOutputStream(file);
                    document.writeTo(outStream);
                    document.close();
                    outStream.flush();
                    outStream.close();
                    Log.d(TAG, "pdf saved to " + getExternalFilesDir(null));
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    File myPDF = new File(getExternalFilesDir(null), "pedido.PDF");
                    Uri uri = FileProvider.getUriForFile(OrderActivity.this, BuildConfig.APPLICATION_ID + ".provider", myPDF);
                    Log.d(TAG, "openPDF: intent with uri: " + uri);
                    intent.setDataAndType(uri, "application/pdf");
                    startActivity(intent);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.d(TAG, e.toString());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.d(TAG, e.toString());
                }

Когда я запускаю этот код, я получаю пустой PDF-файл, открываемый программой открытия PDF по умолчанию. Я не знаю, так ли это, потому что он не нашел файл PDF, но я думаю, что это проблема, потому что PDF генерируется правильно. Если я go с поисковиком файла и открываю файл /storage/emulated/0/Android/data/com.lucaszanella.venko/files/pedido.PDF, я вижу PDF нормально.

Это вывод, который я получаю

D/OrderActivity: pdf saved to /storage/emulated/0/Android/data/com.lucaszanella.venko/files
D/OrderActivity: openPDF: intent with uri: content://com.lucaszanella.venko.provider/external_files/Android/data/com.lucaszanella.venko/files/pedido.PDF

Как видите, PDF сохраняется в папке /storage, но намерение пытается открыть его из /external_files. Это проблема, но я все сделал, я думаю.

Обновление:

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

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

это то, чего не хватало:

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

, хотя мне не нужны разрешения для чтения из внешнего каталога.

0 голосов
/ 06 февраля 2020

Попробуйте

Uri uri = Uri.fromFile(myPDF);

вместо

Uri uri = FileProvider.getUriForFile(OrderActivity.this, BuildConfig.APPLICATION_ID + ".provider", myPDF);
...