Я пытаюсь поделиться файлом, хранящимся в 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 есть настройки для разрешенных типов и размеров вложений, но я не уверен, как их найти и происходит ли это здесь.
Спасибо за любые ваши идеи.
application/octal
не является распознаваемым типом MIME; вы можете думать оapplication/octet-stream
. - person CommonsWare   schedule 03.07.2019