Вложение Gmail и пользовательское расширение

#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.