Фильтр намерений для загрузки вложений из приложений 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>
Другие вопросы по тегам