Android PDF не принимается при отправке с намерением.ACTION_SEND

У меня есть 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-файлов.

Редактировать: Я немного обновил свой код.

            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
1 433
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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);

            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:authorities, но обнаружил, что заполненный ответ был наиболее распространенным на 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>

Другие вопросы по теме