Android прикрепляет файл из ресурсов к электронной почте - PullRequest
1 голос
/ 25 октября 2019

Мое приложение содержит файл 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, правильное имя файла и размер, но при нажатии кнопки отправки электронное письмо проходит без каких-либо вложений, и я получаю E/Gmail: gti:Cannot find size of file.в logcat при нажатии send.

Почему вложение не отправляется?

1 Ответ

1 голос
/ 26 октября 2019

Некоторые клиенты вашего провайдера захотят использовать такие вещи, как getName() и length() на DocumentFile. В этом случае может показаться, что клиент пытается получить длину

. Эти функции, в свою очередь, будут использовать ContentResolver до query() вашего провайдера для OpenableColumns. Ваша миссия - если вы решите принять ее - будет состоять в том, чтобы ваша функция query() в вашем провайдере возвращала Cursor со значениями для столбцов DISPLAY_NAME и / или SIZE. MatrixCursor - это простое (если неуклюжее) решение для реализации этого простого (если неуклюжего) API.

Консервированные поставщики, такие как FileProvider, справятся с этим за вас. Поскольку вы работаете с собственным провайдером, вам нужно справиться с этим самостоятельно.

...