我有一个PDF文件,我正在尝试通过Intent.ACTION_SEND共享。虽然当我单击选项之一(gmail,google驱动器等)时。它说“请求不包含任何数据。” **下面的更新代码
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>
答案 0 :(得分:0)
可以分享我自己的答案,因为我花了几个小时。
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: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>