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 и расширений файлов были слишком ограничительными и в конечном итоге не соответствовали моему расширению файла