java - 无法附加文件;使用活动意图创建和发送 PDF
问题描述
我之前问过类似的问题,但是,我做了更多的研究,我仍然在努力弄清楚我的问题是什么。本质上,我想做的是在PDF
客户完成购买后以某种格式创建收据。然后,这个新创建PDF
的文件需要通过Intent
. 与我之前的问题相比,我现在已经实现了 a FileProvider
,但是我不断收到两个不同的错误。第一个是:
java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content...requires the provider be exported, or grantUriPermission()
这会导致文件根本不附加到电子邮件中。我有时会遇到的第二个错误是,它会将实际的 URI 路径放入电子邮件的收件人部分,您可以在下面看到(也导致文件未附加)
在进行研究时,我尝试了很多不同的解决方案,例如使用setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
or addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
,可以在这里看到
我还看到一些帖子说要android:requestLegacyExternalStorage="true"
在清单中使用,但是,这会极大地限制我的最低 APK 级别。
我什至尝试了这篇文章的建议,即您手动浏览并授予所有软件包的权限,但这仍然没有解决我的问题。
我也试过用这个grantUriPermission()
方法,还是不行。
下面,你会看到我已经放置了一些代码:
清单文件.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.fabricanddecor">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:largeHeap="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".LoginActivity"
android:configChanges="orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustPan">
</activity>
<provider
android:authorities="com.example.fabricanddecor"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
</manifest>
provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="."/>
</paths>
创建电子邮件并触发 Intent 的方法(编辑)
try {
String directory = Environment.getExternalStorageDirectory().getPath();
File file = new File(directory);
if (file.mkdirs()) {
String filePath = directory + "/sale.pdf";
File file2 = new File(filePath);
Uri contentUri = FileProvider.getUriForFile(getContext(), "com.example.fabricanddecor", file2);
Intent intent = new Intent(Intent.ACTION_SEND);
getContext().grantUriPermission("com.example.fabricanddecor", contentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_EMAIL, recipient);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_STREAM, contentUri);
intent.setDataAndType(contentUri, "application/pdf");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(intent, "Choose an Email Service"));
}
} catch (Exception e) {
e.printStackTrace();
}
任何帮助或建议将不胜感激,并感谢您的宝贵时间。如果需要任何进一步的代码,我很乐意提供帮助。
解决方案
推荐阅读
- reactjs - Firestore:从firestore的集合中删除文档
- python - 在 Sklearn 管道和交叉验证中使用缩放器
- python-3.x - “python -m pip install --upgrade pip”异常错误
- python - 在导入之前修补函数调用?
- python - 在许多表 django rest 框架之间对数据进行排序
- macos - 使用加拿大计算时 Mpi Bcast 错误
- git - Git Rebase 包括特定的提交
- python - 如何在 spaCy 中改进德语文本分类模型
- python - Discord.py on_message() 但仅用于私人消息
- python - 将具有不同长度数组的字典转换为 Excel