Android PDF не принимается при отправке как Intent.ACTION_SEND - PullRequest
0 голосов
/ 04 мая 2019

У меня есть файл PDF, которым я пытаюсь поделиться через Intent.ACTION_SEND. Хотя, когда я нажимаю на один из вариантов (Gmail, Google Drive и т. Д.). Там написано: «Запрос не содержит данных». ** Обновлен код ниже

case R.id.share_item:

            final Intent shareIntent = new Intent(Intent.ACTION_SEND);

            shareIntent.setType("application/pdf");
            shareIntent.putExtra(Intent.EXTRA_STREAM, displayedFile.getAbsolutePath());
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

            startActivity(Intent.createChooser(shareIntent, "Share PDF using.."));

            return true;
    }

Я предполагаю, что проблема должна быть с моим putExtra? Тем не менее, URL для моего файла определенно работает, потому что я могу успешно использовать этот путь для печати PDF-файлов.

Edit: Я обновил свой код, чуть-чуть.

            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());

            final Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("application/pdf");

            Uri uri = Uri.parse(displayedFile.getAbsolutePath());
            shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

            startActivity(Intent.createChooser(shareIntent, "Share PDF using.."));

Это возвращает меня к "формат файла не принят" из Whatsapp и "Невозможно прикрепить файл" из Gmail.

Хотите знать, связана ли проблема с вызовом из внутреннего хранилища или с использованием FileProvider?

Редактировать 2: Попытка добавить этот код, но я получаю сбой

 Uri outputPdfUri = FileProvider.getUriForFile(this,
                    PdfViewActivity.this.getPackageName() + ".provider", sharingFile);

Я также добавил это в свой манифест и file_paths

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.example.androidextensiontest.files"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"

            android:resource="@xml/file_paths" />
    </provider>

1 Ответ

0 голосов
/ 04 мая 2019

Хорошо, поделюсь своим собственным ответом, потому что я потратил на это часы.

case R.id.share_item:

            //these policy guidlines do not follow google Guidelines, recommended to change system
            //https://stackoverflow.com/questions/48117511/exposed-beyond-app-through-clipdata-item-geturi
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());

            final Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("application/pdf");

            File sharingFile = new File(displayedFile.getPath());

            Uri outputPdfUri = FileProvider.getUriForFile(this, PdfViewActivity.this.getPackageName() + ".provider", displayedFile);

            Uri uri = Uri.parse("file://" + displayedFile.getAbsolutePath() + ".pdf");
            shareIntent.putExtra(Intent.EXTRA_STREAM, outputPdfUri);

            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            //Write Permission might not be necessary
            shareIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

            startActivity(Intent.createChooser(shareIntent, "Share PDF using.."));

            return true;
    }

Эта кнопка share_item извлекает из моего сохраненного файла во внутреннем хранилище. Ключ был получать правильно манифест и XML-файл.

Убедитесь, что это входит в теги вашего приложения в вашем AndroidManifest.xml. Обратите внимание, что я использую Androidx и измените эту строку соответствующим образом. Я также никогда не выяснял строку android: полномочия, но нашел, что заполненный ответ был самым распространенным на Github.

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

Наконец, file_paths.xml - создайте пакет xml внутри своей красной папки и опубликуйте этот код. По какой-то причине другой код стал причиной того, что мой общий доступ к файлам не работал.

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <files-path name="projection" path="." />
</paths>
...