Android: регистрация Intent Filter для открытия вложения электронной почты с моим приложением

У меня есть приложение, которое генерирует пользовательские типы файлов (.sor). Внутри приложения у меня есть возможность отправить электронное письмо с одним из прикрепленных файлов. У меня также есть фильтр намерений, чтобы приложение могло отображаться в списке приложений, которые могут открывать этот тип файла. Это позволяет мне (иногда) открывать файл с приложением прямо из почтового клиента пользователя на телефоне.

Однако это работает только тогда, когда электронная почта поступает от почтового клиента ПК, и не будет работать, когда электронная почта получена с телефона. Например, если я сгенерирую один из этих файлов.sor, а затем с помощью своего приложения отправлю электронное письмо на свою учетную запись электронной почты, я получу письмо на свой телефон, но не смогу открыть вложение с моим приложением... НО, если я отправлю электронное письмо на ту же учетную запись и открою его на своем компьютере (с Thunderbird) вместо телефона, а затем переадресую или отправлю как новое электронное письмо на мой телефон, я смогу использовать то же самое приложение электронной почты на телефоне, чтобы открыть вложение с моим приложением... Я говорю только об одной учетной записи электронной почты, единственная разница в том, откуда было отправлено письмо, с моего телефона или моего компьютера с Windows 7.

Единственное, о чем я могу думать, это то, что когда я отправляю электронное письмо с телефона, во вложенный файл внедряется другой тип пантомимы, чем когда я отправляю его из Thunderbird на моем компьютере... Я указываю тип пантомимы как "application / octet-stream ", когда я отправляю электронное письмо из моего приложения, и у меня есть фильтр намерений, который ищет этот тип MIME... но он не работает правильно.

Мой фильтр намерений:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="application/octet-stream" />
  <data android:scheme="file" />
</intent-filter>

Намерение, которое я передаю почтовому клиенту телефона при отправке файла во вложении электронной почты с телефона:

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("application/octet-stream");
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + fullPathString));
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "FiberDroid OTDR Trace File: \"" + ContextMenuFileName + "\"");
sendIntent.putExtra(Intent.EXTRA_TEXT, "This e-mail was sent from the TTI FiberDroid Android application.");
startActivity(Intent.createChooser(sendIntent, "Select E-Mail Application"));

Опять же, отправка электронного письма с прикрепленным файлом работает правильно... и если я отправлю этот же файл обратно на телефон с помощью почтового клиента на ПК (например, Outlook или Thunderbird), я смогу открыть файл с помощью своего приложения. прямо из приложения электронной почты телефонов. Проблема в том, что если я открываю электронную почту на телефоне, не пройдя через компьютер в качестве посредника, я не могу открыть вложение, единственная опция, которую мне дают, - "Сохранить на SD-карту"...

Напомним, что на моем телефоне есть 2 одинаковых электронных письма, с одним и тем же приложенным файлом, и оба изначально отправлены из моего приложения на один и тот же аккаунт (оба также получены с одного аккаунта), но вложение в том, которое прошло мой ПК как ненужный посредник работает правильно, а тот, который был отправлен и получен непосредственно с моего телефона, - нет.

Есть идеи? Заранее спасибо.

2 ответа

Решение

Я решил это, в основном, снимая в темноте и не понимая, ПОЧЕМУ то, что я сделал, решило, но вот что у меня есть для моих фильтров намерений в манифесте, где ".sor" - это расширение моего пользовательского файла. тип. Это работает со всеми приложениями для работы с электронной почтой и файлами, которые я пробовал, включая K-9 mail и Astro:

<!-- For email attachments -->
<intent-filter>
   <action android:name="android.intent.action.VIEW" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="application/*" host="*" android:pathPattern=".*.sor" android:scheme="content" />
</intent-filter>

<!--  For file browsers -->
<intent-filter>
   <action android:name="android.intent.action.VIEW"/>
   <category android:name="android.intent.category.DEFAULT"/>
   <data android:mimeType="application/*" host="*" android:pathPattern=".*.sor" android:scheme="file" />
</intent-filter>

Пример Тима Аутина на этот вопрос не работает с фильтром намерений Android . Он использует три фильтра намерений:

  • один для поддерживаемых типов пантомимы
  • один для расширений файлов с подстановочным знаком mime-типа <data android:mimeType="*/*" />
  • один для расширений файлов без тега типа MIME

Комбинации типов mime и расширений файлов были слишком ограничительными и в конечном итоге не соответствовали моему расширению файла

Другие вопросы по тегам