【发布时间】:2019-10-26 06:19:57
【问题描述】:
我的应用在 assets 文件夹中包含一个 PDF 文件。我的目标是创建一个电子邮件意图,它打开附有此 PDF 的电子邮件。它正在工作,电子邮件打开并显示附有正确名称和大小的 PDF。但是在发送电子邮件时,没有收到 PDF。发送邮件后,logcat 中唯一显示的是:
E/Gmail: gti:Cannot find size of file.
这很奇怪,因为我绝对可以在电子邮件草稿中看到大小正确的附件。
这是我的代码:
android-manfiest.xml:
<provider
android:name="[my.package.name].core.helpers.utils.AssetsProvider"
android:authorities="[my.package.name].fileprovider2"
android:exported="true"
android:grantUriPermissions="true" />
AssetsProvider.kt
class AssetsProvider : ContentProvider() {
override fun openAssetFile(uri: Uri, mode: String): AssetFileDescriptor? {
val am = context!!.assets
val fileName = uri.lastPathSegment!!
var afd: AssetFileDescriptor? = null
try {
afd = am.openFd(fileName)
} catch (e: IOException) {
e.printStackTrace()
}
// Confirms non null result
Log.v("debug", "afd=" + (afd?.toString() ?: "null"))
return afd
}
override fun onCreate(): Boolean {
return true
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
return null
}
override fun query(
uri: Uri,
projection: Array<String>?,
selection: String?,
selectionArgs: Array<String>?,
sortOrder: String?
): Cursor? {
return null
}
override fun update(
uri: Uri,
values: ContentValues?,
selection: String?,
selectionArgs: Array<String>?
): Int {
return 0
}
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
return 0
}
override fun getType(uri: Uri): String? {
return null
//return "application/pdf"
}
}
并创建Intent(java 代码):
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("application/pdf");
Uri assetUri = Uri.parse("content://[my.package.name].fileprovider2/[pdf_filename].pdf");
intent.putExtra(Intent.EXTRA_STREAM, assetUri);
activity.startActivityForResult(Intent.createChooser(intent, "Sending PDF..."), requestCode);
所以就像我说的,它打开 gmail 来撰写新电子邮件,PDF 附件在那里,正确的文件名和大小,但是当按下发送时,电子邮件没有任何附件,我在 logcat 中得到E/Gmail: gti:Cannot find size of file.按发送。
为什么附件没有发送?
【问题讨论】:
-
有您的
query()支持查询OpenableColumns。例如,请参阅this。 -
@CommonsWare 谢谢你!只需要为该列返回正确的文件长度。
标签: android android-intent android-fileprovider