Открытие электронной почты с несколькими вложениями, в то время как ограничение выбора для ТОЛЬКО приложений электронной почты?

Как лучше всего на Android отправить электронное письмо с несколькими вложениями без использования приложений, не входящих в электронную почту, в избранное?

При отправке писем я делал это так:

final Intent sendEmailIntent = new Intent(Intent.ACTION_SEND);
sendEmailIntent.setType("message/rfc822");
sendEmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
...

К сожалению, "message/rfc822" больше не работает для фильтрации нежелательных приложений от выбора, например Evernote, Drive и других приложений.

Недавно я нашел это обходное решение, которое работает для отдельных приложений:

sendEmailIntent = new Intent(Intent.ACTION_SENDTO);
Uri data = Uri.parse("mailto:[email protected]&subject...");
sendEmailIntent.setData(data);  
...

К сожалению, это не работает для нескольких вложений. Я попробовал, и он сбой Gmail.: S

Ответ 1

Наконец-то я нашел решение, хотя оно работает только на Ice Cream Sandwich MR1 и выше. Трюк состоит в том, чтобы сначала создать ваше намерение, используя ACTION_SEND_MULTIPLE:

sendEmailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sendEmailIntent.setType("message/rfc822");
sendEmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });                
sendEmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
sendEmailIntent.putExtra(Intent.EXTRA_TEXT, "Body");
final ArrayList<Uri> uris = /* ... Your code to build the attachments. */
sendEmailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);

Чтобы ограничить доступ к приложениям электронной почты, добавьте этот код:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
    sendEmailIntent.setType(null); // If we're using a selector, then clear the type to null. I don't know why this is needed, but it doesn't work without it.
    final Intent restrictIntent = new Intent(Intent.ACTION_SENDTO);
    Uri data = Uri.parse("mailto:[email protected]");
    restrictIntent.setData(data);
    sendEmailIntent.setSelector(restrictIntent);
}

Когда вы запускаете это намерение с помощью функции startActivity(), теперь вы увидите только приложения электронной почты в списке, и если вы выберете Gmail, там будут несколько вложений.

Я делаю это с помощью try/catch в случае, если startActivity не решает никаких действий, и в этом случае я удаляю селектор, и, похоже, он работает хорошо.