Gmail не отправляет общий файл через намерение, но выдает ошибку о недопустимых вложениях

Я пытаюсь поделиться файлом, хранящимся в getExternalFilesDir(), с помощью намерения ACTION_SEND. Я использую FileProvider для предоставления разрешения и создания uri. Всплывающее окно выбора включает Signal, Gmail и Drive. Если я выберу «Диск», действие завершится успешно, и файл будет правильно загружен в мою учетную запись. Если я выберу сигнал, он преуспеет, и мой друг получит файл. Если я выберу Gmail, действие будет успешным, и я увижу сообщение с вложением с правильным именем и размером. Я заполняю поле «кому» и нажимаю «Отправить», композитор исчезает, но сообщение не отправляется и не сохраняется, и возникает ошибка logcat: > java.lang.IllegalStateException: обнаружены недопустимые вложения при отправке черновика.

Вот Манифест:

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

Вот провайдер_пути:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path
        name="data"
        path="."/>
</paths>

Вот где намерение создается и запускается в MainActivity:

     val uri = getUriForFile(
                    applicationContext,
                    "${BuildConfig.APPLICATION_ID}.fileprovider",
                    file
            )

            Log.d(TAG, "send uri: " + uri)


            Intent(Intent.ACTION_SEND)
                    .apply {
                        //setType("text/plain") // works for drive, but fails for email
                        setType("application/zip")
                        putExtra(Intent.EXTRA_STREAM, uri)
                        putExtra(Intent.EXTRA_SUBJECT, "Armonitor Record:" + file.nameWithoutExtension)
                        putExtra(Intent.EXTRA_TEXT, "See attached...")
                        setFlags(FLAG_GRANT_READ_URI_PERMISSION.or( FLAG_GRANT_WRITE_URI_PERMISSION))
                    }
                    .also {
                        startActivity(Intent.createChooser(it, "share file with"));
                    }

Я знаю, что полномочия файлового провайдера работают, потому что, когда я нарушаю их, я получаю сообщение об ошибке до того, как отображается средство выбора. Я попытался вручную предоставить разрешения любому потребителю намерения на случай, если разрешения будут применяться только к uri setData. Я пробовал различные типы файлов, включая «приложение/восьмеричное», «текст/обычный», «сообщение/rfc822». Файлы, которые я пытаюсь отправить, имеют размер от 0,2 до 38 КБ, и я пробовал файлы .txt и .zip. Я заметил, что если я изменю адрес «от» на другую учетную запись gmail, вложение полностью исчезнет. Электронное письмо может быть успешно отправлено без вложения. На моем телефоне не настроен другой почтовый клиент.

Вот сообщения logcat от gmail для попытки отправить небольшой zip-файл размером ‹1 КБ с type="application/zip". ZIP-файл большего размера (4 КБ) имел несколько иной результат — событие создания сообщения завершилось с ошибкой с исключением 1, но без ошибки недопустимых вложений, и электронное письмо было сохранено и отправлено без вложения:

2019-07-05 11:29:22.944 11320-13752 W/Gmail: ComposeActivity:Failed to retrieve reference message with uri=null.
2019-07-05 11:29:22.980 2013-2107 I/LaunchCheckinHandler: Displayed com.google.android.gm/.ComposeActivityGmailExternal,wp,ca,316
2019-07-05 11:29:22.981 2013-2107 I/ActivityManager: Displayed com.google.android.gm/.ComposeActivityGmailExternal: +312ms
2019-07-05 11:29:22.988 11320-11320 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:22.988 11320-11320 W/Gmail: Gmail:No itemId found for event forward
2019-07-05 11:29:23.011 11320-11320 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:23.011 11320-11320 W/Gmail: Gmail:No itemId found for event forward
2019-07-05 11:29:23.016 11320-11320 W/Gmail: ComposeActivity:b/119949571:In finishSetup.
2019-07-05 11:29:23.019 11320-11320 W/Gmail: Gmail:b/119949571:loading bodyWebView with template emit size of 1898.
2019-07-05 11:29:23.114 11320-11320 E/Gmail: Gmail:EditWebView JS Console: b/119949571:draft.editor.onLoad; source: file:///android_asset/draft_editor_gmail_compiled.js at 87
2019-07-05 11:29:23.121 11320-11320 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:23.121 11320-11320 W/Gmail: Gmail:No itemId found for event forward
2019-07-05 11:29:23.124 11320-11320 E/Gmail: Gmail:EditWebView JS Console: b/119949571:draft.editor.onLoad is finished; source: file:///android_asset/draft_editor_gmail_compiled.js at 88
2019-07-05 11:29:23.149 11320-11320 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:23.149 11320-11320 W/Gmail: Gmail:No itemId found for event forward
2019-07-05 11:29:26.175 11320-11320 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:26.175 11320-11320 W/Gmail: Gmail:No itemId found for event forward
2019-07-05 11:29:37.855 11320-13837 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:37.856 11320-13837 W/Gmail: Gmail:No itemId found for event forward
2019-07-05 11:29:37.858 11320-13837 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:37.858 11320-13837 W/Gmail: Gmail:No itemId found for event forward
2019-07-05 11:29:37.893 11320-11320 E/Gmail: Gmail:Compose Event 1 failed with reason=1
2019-07-05 11:29:37.909 11320-13837 E/Gmail: sapishim:Exception in saveOrSendDraft: method=send_message
    java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Found invalid attachments while sending the draft
        at afiw.a(SourceFile:3)
        at afiw.get(SourceFile:7)
        at gch.b(SourceFile:1)
        at com.google.android.gm.sapi.SapiUiProvider.call(SourceFile:32)
        at android.content.ContentProvider$Transport.call(ContentProvider.java:403)
        at android.content.ContentResolver.call(ContentResolver.java:1756)
        at din.a(SourceFile:109)
        at din.a(SourceFile:602)
        at doa.run(SourceFile:11)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at ghw.dispatchMessage(SourceFile:1)
        at android.os.Looper.loop(Looper.java:193)
        at android.os.HandlerThread.run(HandlerThread.java:65)
     Caused by: java.lang.IllegalStateException: Found invalid attachments while sending the draft
        at jbx.a(Unknown Source:4)
        at afjm.a(SourceFile:2)
        at afjj.run(SourceFile:6)
        at aflq.run(Unknown Source:7)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
        at addr.run(SourceFile:2)
        at abql.run(Unknown Source:3)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6912)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
2019-07-05 11:29:37.910 11320-13837 E/Gmail: Gmail:Draft send failed with reason=11
2019-07-05 11:29:37.943 11320-11320 W/Gmail: Gmail:No collectionId found for event forward
2019-07-05 11:29:37.943 11320-11320 W/Gmail: Gmail:No itemId found for event forward

Что Gmail считает «недействительными вложениями»? Как я могу поделиться этими файлами через Gmail?

Я слышал, что в gmail есть настройки для разрешенных типов и размеров вложений, но я не уверен, как их найти и происходит ли это здесь.

Спасибо за любые ваши идеи.


person alr3000    schedule 03.07.2019    source источник
comment
Я пробовал различные типы файлов, в том числе приложение/восьмеричный, текстовый/обычный, сообщение/rfc822 — какой фактический тип файла вы пытаетесь предоставить? Обратите внимание, что application/octal не является распознаваемым типом MIME; вы можете думать о application/octet-stream.   -  person CommonsWare    schedule 03.07.2019
comment
Извините, это я и имел в виду. Я хочу поделиться zip-файлами и текстовыми файлами. Я пробовал все типы с обоими типами файлов, а также с приложением/zip.   -  person alr3000    schedule 04.07.2019
comment
Если вы попытаетесь поделиться через Gmail и получите ошибку, включает ли Logcat какие-либо сообщения от Gmail, которые содержат какие-либо подсказки? Если другие приложения могут читать контент, и если вы точно описываете контент с помощью типа MIME, я не знаю, почему у Gmail могут быть проблемы с контентом.   -  person CommonsWare    schedule 04.07.2019


Ответы (2)


Хорошо, это, вероятно, слишком глупо, чтобы быть полезным, но я решил это. Дело в том, что мой файл provider_paths был указан только

<external-files-path
    name="data"
    path="."/>

и я сохранял zip-файлы в подпапке, поэтому мне нужно было добавить

<external-files-path
    name="zip"
    path="./zip" />

Я не знаю, почему это работало для обмена через Signal и Drive, но Gmail был более привередливым. Но теперь это работает для них всех, так что ура!

person alr3000    schedule 02.08.2019

Если вы также добавите его как ClipData, разрешение будет работать успешно:

yourIntent.clipData = ClipData.newUri(context.contentResolver, fileName, contentUri)

Причина в том, что Intent.FLAG_GRANT_READ_URI_PERMISSION будет работать только для Intent.data и Intent.clipData, а не для дополнительных функций, если только предоставление разрешения uri не было дано явно (неудобно) или не было дано путем добавления ClipData.

person Louis CAD    schedule 14.01.2021