У меня есть 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>
Хорошо, делюсь своим ответом, потому что я потратил на это часы.
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>