Фильтр намерений для загрузки вложений из приложений Gmail на Android
У меня есть приложение для Android с фильтром намерений (ACTION_VIEW), чтобы открыть файл и импортировать его в мое приложение. Я хочу загрузить файл приложения из приложения Gmail в свое приложение. Некоторые типы файлов (например, jpg, png, txt) сохраняются правильно, а некоторые нет (например, doc, xls, ppt). Я считаю, что у меня есть правильный фильтр намерений для моей деятельности, так как он работает из другого приложения (например, Dropbox), но не из приложения Gmail. Есть ли решение для этого?
2 ответа
Мне удалось заставить всплывающие кнопки загрузки и предварительного просмотра на Android в GMail, удалив фильтр данных схемы в моем намерении (удалите строку схемы и попробуйте):
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.ext" />
<data android:host="*" />
</intent-filter>
Однако согласно документации Android: "Если для фильтра намерений не указана схема, все остальные атрибуты URI игнорируются". После удаления атрибутов схемы и URI единственным другим способом фильтрации намерений является использование типа Mime, и все мы знаем, что пользовательские расширения файлов не имеют зарегистрированных типов MIME.
Для справки, URI имеют вид:
- Схема:// хост: порт / путь
- PATHPREFIX
- pathPattern
Так что без схемы все это падает. Обнаружив вышеизложенное, я попробовал очевидное - используйте " * " для схемы и даже попытался " .* ". Ни один из тех не работал. Я надеюсь, что кто-то еще может построить мои испытания. Но я считаю, что это связано с выбором правильной схемы. К сожалению, единственные известные мне схемы - это http https контент и файл, и ни одна из вышеперечисленных не является волшебной пулей.
РЕДАКТИРОВАТЬ::::::::
Я решил это вчера. Пожалуйста, посмотрите мое решение:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/*" host="*" android:pathPattern=".*.ext" android:scheme="content" />
</intent-filter>
Это намерение заставит Gmail отображать кнопки "Скачать / Предварительный просмотр". Фактически, это также приведет к открытию вашего приложения, когда файлы.ext отправляются как вложения в обычный почтовый клиент.
Так как это один из главных вопросов в Google, связанный с "фильтром намерений вложений в gmail", и я обнаружил, что ответ выше не работает в моем случае, я публикую результаты своего исследования.
Для того, чтобы зарегистрироваться по намерениям из gmail, нам нужно поддерживать схему контента:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" android:mimeType="*" android:host="*" />
</intent-filter>
В случае проверенных вложений URI не содержал расширение файла, даже если оно отображалось в gmail, поэтому использование android:pathPattern блокировало получение намерений gmail.
В связи с тем, что регистрация во всех mimeTypes является излишним, я отладил содержимое объекта Intent (на стороне Java) и обнаружил, что в моем приложении достаточно text/plain (поэтому ваша домашняя работа состоит в том, чтобы найти подходящие mimeTypes для вашего приложения). Мой последний фильтр намерений выглядит так:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" android:mimeType="text/plain" android:host="*" />
</intent-filter>