Android 发送为 Intent.ACTION_SEND 时 PDF 未被接受
Android PDF not accepted when sending as Intent.ACTION_SEND
我有一个 PDF 文件,我想通过 Intent.ACTION_SEND 分享。尽管当我单击其中一个选项(gmail、google 驱动器等)时。它说 "Request contains no data."
**更新了下面的代码
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 获得了 "file format not accepted",从 Gmail 获得了 "Unable to attach file"。
想知道问题是从内部存储调用还是不使用 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
//
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 包,然后 post 此代码。出于某种原因,其他代码导致我的文件共享无法正常工作。
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="projection" path="." />
</paths>
我有一个 PDF 文件,我想通过 Intent.ACTION_SEND 分享。尽管当我单击其中一个选项(gmail、google 驱动器等)时。它说 "Request contains no data." **更新了下面的代码
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 获得了 "file format not accepted",从 Gmail 获得了 "Unable to attach file"。
想知道问题是从内部存储调用还是不使用 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
//
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 包,然后 post 此代码。出于某种原因,其他代码导致我的文件共享无法正常工作。
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="projection" path="." />
</paths>