Вложение Gmail и пользовательское расширение - PullRequest
6 голосов
/ 10 июня 2011

В настоящее время я работаю над приложением Android, которое читает файл с пользовательским расширением. Одной из обязательных функций является то, что приложение должно предлагаться gmail, когда пользователь получает письмо с вложением .ourextension.

Я провел некоторое исследование и обнаружил, что клиент gmail на Android не зависит от расширения, потому что в данных запущенного намерения предложенный файл не имеет расширения. Он полагается только на MIME-тип, указанный почтовым клиентом.

Проблема в том, что наши пользовательские файлы не обнаруживаются одинаково между почтовыми клиентами. Например, если я отправляю себе с помощью веб-страницы gmail наш пользовательский файл, mime-тип определяется как application / octet-stream. Если мой друг отправляет программное обеспечение Apple Mail для настольных ПК, оно определяется как текст / xml (что было бы неплохо). А на другом почтовом клиенте Evolution тип mime - это text / plain ...

Наше приложение не может обрабатывать все эти типы! В противном случае это будет предложено для каждого типа вложения ...

Есть ли какое-то решение для этого?

Ответы [ 4 ]

3 голосов
/ 18 января 2013

Решение для открытия файла с пользовательским расширением, протестированное с gmail <4.2, gmail 4.2, Google Drive и файловым браузером </p>

Код для отправки файла:

sendIntent.setType("application/calc1");

Intent-filter:

           <!-- 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 голосов
/ 19 июля 2012

Можно заставить это работать из 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>

ОБА, требуется схема содержимого и файла,Без схемы CONTENT Gmail будет игнорировать ваш фильтр все вместе.Это похоже на ошибку.Без схемы FILE Gmail выдаст ошибку, сказав, что не знает, какое приложение запустить из намерения.

07-19 15:38:19.160: ERROR/Gmail(2220): Coun't find Activity for intent

При наличии обеих схем приложение получает намерение как для загруженных, так и для предварительно просмотренных файлов.С ними нужно обращаться по-разному.

0 голосов
/ 20 января 2012

Вы все еще можете сопоставить расширение для 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, равное / , и оно будет совпадать только для расширения

0 голосов
/ 10 августа 2011

Редактировать: Этому ответу 3 года. У меня не было времени проверить ответы других, но мои явно устарели, поэтому, пожалуйста, ищите ответы других в этой теме!

Я не нашел никаких решений, единственный способ работать с мим-типом, поэтому вы должны молиться, чтобы ваша привязанность была распознана с помощью известного мим-типа, и справиться с этим. Это означает, что вы будете вмешиваться в другое приложение, если ваш файл распознается как HTML, например.

Вам нужно обработать случай, когда файл не читается вашим приложением, и показать всплывающее окно для уведомления пользователя о том, что вы не можете прочитать файл.

Может быть, через год или два Gmail предоставит хороший API ...

Кстати, в последней версии Gmail добавлена ​​кнопка загрузки, которую вы должны обрабатывать, чтобы избежать сбоев, она работает путем создания нового файла с URI.

...