#android #gmail #mime-types #attachment #mime
#Android #gmail #mime-типы #вложение #mime
Вопрос:
В настоящее время я работаю над приложением для Android, которое считывает файл с пользовательским расширением. Одной из обязательных функций является то, что приложение должно быть предложено gmail, когда пользователь получает письмо с вложением .ourextension.
Я провел некоторое исследование и обнаружил, что клиент gmail на Android не полагается на расширение, потому что в данных запущенного намерения предлагаемый файл не имеет расширения. Оно зависит только от mime-типа, заданного почтовым клиентом.
Проблема в том, что наш пользовательский файл не обнаруживается одинаково между почтовыми клиентами. Например, если я отправляю себе с веб-страницы gmail наш пользовательский файл, тип mime определяется как application / octet-stream. Если мой друг отправляет с помощью настольного программного обеспечения Apple mail, оно определяется как текст / xml (что было бы неплохо). А в другом почтовом клиенте Evolution mime-тип — текстовый / обычный…
Наше приложение не может обрабатывать все эти типы! В противном случае это было бы предложено для каждого типа вложения…
Есть ли какое-либо решение для этого?
Ответ №1:
Решение для открытия файла с пользовательским расширением протестировано с gmail < 4.2, gmail 4.2, Google Drive и файловым браузером
Код для отправки файла :
sendIntent.setType("application/calc1");
Фильтр намерений :
<!-- Filter to open file with gmail version < 4.2 -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/calc1" />
<data android:pathPattern=".*\.calc1" />
<data android:host="*" />
</intent-filter>
<!-- Filter to open with file browser or google drive -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\.calc1" />
<data android:host="*" />
</intent-filter>
<!-- Filter to open file with gmail version 4.2 -->
<!-- Save file first with "save" button otherwise gmail crashes -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/octet-stream" />
<data android:pathPattern=".*\.calc1" />
<data android:host="*" />
</intent-filter>
Ответ №2:
Это можно заставить работать из gmail, хотя мне требуются дни усилий, чтобы разобраться во всех проблемах.
Важные данные о намерениях
act=android.intent.action.VIEW
dat=file:///mnt/sdcard/Download/Availability Focus.inform
typ=application/octet-stream
flg=0x80001 cmp=air.com.extension/.AppEntry
Фильтр намерений, который смог его зафиксировать (некоторые примечания ниже)
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file" android:pathPattern=".*\.inform" android:mimeType="application/octet-stream"/>
<data android:scheme="content" android:pathPattern=".*\.inform" android:mimeType="application/octet-stream"/>
</intent-filter>
Требуется как содержимое, так и файловая схема. Без схемы СОДЕРЖИМОГО gmail будет игнорировать ваш фильтр целиком. Это похоже на ошибку. Без ФАЙЛОВОЙ схемы gmail выдаст сообщение об ошибке, в котором говорится, что он не знает, какое приложение запускать из намерения.
07-19 15:38:19.160: ERROR/Gmail(2220): Coun't find Activity for intent
При наличии обеих схем приложение получает назначение как для загруженных, так и для предварительно просмотренных файлов. С ними нужно обращаться по-другому.
Комментарии:
1. Я только что протестировал это, и это работает для Gmail 4.1.2, работающего на Android 4.0.3. Но когда я открываю то же электронное письмо с помощью Gmail 2.3.6, работающего на Android 2.3.6, у меня даже нет возможности открыть вложение.
2. Протестировано с Gmail 4.2.1, работающим на Android 4.2. Работает хорошо. Спасибо.
3. При тестировании этого убедитесь, что вы также пытаетесь открыть вложение с другим расширением, с которым еще не установлена связь. Вы обнаружите, что ваше
intent-filter
также соответствует ему. Я думаю, причина в том, что у вас нетhost
атрибута, и без этогоpathPattern
игнорируется (developer.android.com/guide/topics/manifest/data-element.html ). Если вы добавите,android:host="*"
то вашеintent-filter
имя внезапно больше не будет соответствовать. Проблема, похоже, в том, чтоcontent://
URI не содержат имени файла (developer.android.com/reference/android/content/ContentUris.html ).
Ответ №3:
Вы все еще можете подобрать расширение для gmail
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/*" host="*" android:pathPattern=".*\.mht" android:scheme="content" />
</intent-filter>
Измените тип mime на /, и он будет совпадать только с расширением
Комментарии:
1. Извините, я не видел вашего ответа раньше, я попробую как можно скорее, если это сработает, и отредактирую свой ответ, если это сработает.
2. Извините, но это не работает, Gmail использует mime-тип только для намерения.
3. У меня работает. У меня есть кнопка загрузки и предварительного просмотра. Протестировано на стандартном телефоне Galaxy S и планшете Galaxy S II.
Ответ №4:
Редактировать: Этому ответу 3 года. У меня не было времени проверять ответы других, но мой явно устарел, поэтому, пожалуйста, найдите другие ответы по этой теме!
Я не нашел никаких решений, единственный способ работать — с mime-типом, поэтому вы должны молиться, чтобы ваше вложение было распознано с известным mime-типом, и справиться с этим. Это означает, что вы будете мешать работе другого приложения, например, если ваш файл распознается как html.
Вам нужно обработать случай, когда файл не читается вашим приложением, и показать всплывающее окно для уведомления пользователя о том, что вы не можете прочитать файл.
Возможно, через год или два Gmail предоставит хороший api…
Кстати, в последней версии gmail добавлена кнопка загрузки, которую вы должны обработать, чтобы избежать сбоев, она работает путем создания нового файла с uri.