Итак, типичный код, который гуляет на просторах интернета:
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.setType("text/plain");
context.startActivity(Intent.createChooser(it, "Choose Email Client"));
Сразу обратим внимание на строку "text/plain". Должно быть именно text/plain, а не Кроме того, вариант "text/plain" поддерживается очень большим количеством приложений. Здесь и Google Reader, и Facebook и Bluetooth.. список может быть очень длинным. Чтобы в списке фигурировали только email-приложения, нужно указывать "text/xml".
Переходим к вызову Intent.createChooser. Функция Intent.createChooser выводит список приложений, способных обработать переданный в нее intent. При этом список приложений выводится всегда, галочки "Use by default for this action" в этом списке нет. В результате, пользователи вынуждены выбирать программу для отправки email каждый раз, что их крайне нервирует.
Можно легко обойтись без createChooser
/*context.startActivity(Intent.createChooser(it, "Choose Email Client"));*/ context.startActivity(it);Диалог выбора приложений все так же будет показываться, но в нем появится галочка "Use by default for this action", позволяющая запомнить выбор (чтобы отменить то, что запомнили, нужно лезть в настройки, находить в них выбранное приложение и сбрасывать там флаг "Launch by default").
У createChooser есть еще один подводный камень. Если вы попытаетесь вызвать функцию из контекста виджета, то получите сообщение об ошибке - "Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?". Ясно, что надо выставить флаг FLAG_ACTIVITY_NEW_TASK. Важно только не ошибиться и выставить его у правильного intent - у того, что возвращает функция createChooser, а не того, который мы в нее передаем.
Итак, собираем все вместе и получаем функцию, реализующую перечисленные варианты работы:
/**
* Send email through one of email applications.
* User selects app through dialog.
* @param bUseChooser - use or don't use application chooser.
* Chooser asks user to select email application each time
* without possibility to remember the choice.
* Checkbox "use by default for this action" is not available in chooser.
* But it's available if chooser is turned off.
* @param bUseTextPlain - use text/plain or text/xml.
* If you use "text/xml" then the dialog shows email applications only.
*/
public static void SendEmail(Context context
, String srcEmail
, String srcSubject
, boolean bUseChooser
, boolean bUseTextPlain
, int resourceIdChooserMessage
) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType(! bUseTextPlain
? "text/xml" //show email applications only
: "text/plain");
if (srcEmail != null) {
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { srcEmail });
}
if (srcSubject != null) {
intent.putExtra(Intent.EXTRA_SUBJECT, new String[] { srcSubject });
}
if (bUseChooser) {
//"use by default for this action" is not available here
//user selects required application manually each time
Intent chooser_intent = Intent.createChooser(intent, context.getString(resourceIdChooserMessage));
chooser_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(chooser_intent);
} else {
context.startActivity(intent);
}
}
...
//using without chooser
SendEmail(context, "my@abc.com"
, null
, false
, false
, 0);
//using with chooser
SendEmail(context, "my@abc.com"
, null
, true
, false
, R.string.select_email_app);
В большинстве случаев - сойдет.
Комментариев нет:
Отправить комментарий