Android Intent Chooser отображает только функцию электронной почты
Мое приложение объединяет электронную почту, в которой пользователь может напрямую отправлять отчет об ошибке, обратную связь и т.д. Я использую приложение/октет-поток как SetType для намерения. Когда вы отправляете сообщение электронной почты, вы получаете выбор контента, и он показывает различные элементы из Evernote, Facebook, E-mail и т.д.
Как я могу заставить этот выбор только показывать E-mail, чтобы не путать пользователя со всеми этими другими элементами, которые соответствуют типу выбора контента?
Спасибо.
Ответы
Ответ 1
Я предполагаю, что вы используете действие ACTION_SEND
Intent
, так как вы не потрудились фактически указать, что используете, но вы согласились с комментарием @Aleadam.
Я использую приложение/октет-поток как SetType для намерения.
Ничто в этом предложении не ограничивает доступ к электронной почте.
ACTION_SEND
- это общее действие Intent
, которое может поддерживаться любым приложением, которое хочет. Все, что вы делаете, это указать, какие данные вы используете, и тип MIME этих данных - оттуда пользователь может выбирать из доступных действий.
Как указывает @Jasoon, вы можете попробовать message/rfc822
как тип MIME. Тем не менее, это не указывает "только предлагать почтовые клиенты" - он указывает "предлагать что-нибудь, что поддерживает данные message/rfc822
". Это может легко включать в себя некоторые приложения, которые не являются почтовыми клиентами.
Если вы специально хотите отправить что-то по электронной почте, интегрируйте JavaMail в свое приложение или напишите электронную почту переадресации script на свой веб-сервер и вызовите ее или что-то еще. Если вы используете ACTION_SEND
, вы неявно заявляете, что это то, что хочет пользователь, и вы хотите, чтобы пользователь мог отправлять такие-то данные любым способом, который пользователь выбирает.
Ответ 2
Я решил эту проблему с простыми строками кода, как описано в документации по android (https://developer.android.com/guide/components/intents-common.html#Email)
Наиболее важным является флаг: ACTION_SENDTO
, а не ACTION_SEND
Другая важная строка
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
Кстати, если вы отправите пустой Extra
, if()
в конце не будет работать, и приложение не запустит почтовый клиент.
Это работает для меня. Согласно документации на Android. Если вы хотите, чтобы ваши намерения обрабатывались только приложением электронной почты (а не с другими текстовыми сообщениями или социальными приложениями), используйте действие ACTION_SENDTO и включите схему данных "mailto:". Например:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Ответ 3
Просто изо всех сил пытался справиться с этой проблемой при внедрении функции Magic Link, намерении выбора для всех установленных приложений электронной почты:
Скриншот Chooser Intent
private void openEmailApp() {
List<Intent> emailAppLauncherIntents = new ArrayList<>();
//Intent that only email apps can handle:
Intent emailAppIntent = new Intent(Intent.ACTION_SENDTO);
emailAppIntent.setData(Uri.parse("mailto:"));
emailAppIntent.putExtra(Intent.EXTRA_EMAIL, "");
emailAppIntent.putExtra(Intent.EXTRA_SUBJECT, "");
PackageManager packageManager = getPackageManager();
//All installed apps that can handle email intent:
List<ResolveInfo> emailApps = packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_ALL);
for (ResolveInfo resolveInfo : emailApps) {
String packageName = resolveInfo.activityInfo.packageName;
Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
emailAppLauncherIntents.add(launchIntent);
}
//Create chooser
Intent chooserIntent = Intent.createChooser(new Intent(), "Select email app:");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toArray(new Parcelable[emailAppLauncherIntents.size()]));
startActivity(chooserIntent);
}
Ответ 4
Существует более общий способ, который работает с любым типом MIME.
Смотрите это сообщение: Как настроить намерение совместного использования в Android?
Ответ 5
Он работает на всех устройствах. Он покажет только приложения электронной почты
public static void shareViaMail(Activity activity, String title, String body, String filePath) {
Uri URI = Uri.parse("file://" + filePath);
final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
if (URI != null) {
emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
}
try {
activity.startActivity(emailIntent);
} catch (Exception e) {
((BaseActivity) activity).showToast("Gmail App is not installed");
e.printStackTrace();
}
}
Ответ 6
Можно ограничить выбор выбора намерения несколькими опциями. Хорошим примером является код в ответе на этот вопрос. В сущности, вам нужно будет создать список меток, чтобы предоставить выборчику намерений, который затем включит его в свой список. Обратите внимание, что это решение работает не на исключении (некоторые приложения исключаются, а остальные остаются), но вместо этого вам нужно выбрать, какие приложения будут отображаться. Надеюсь, это поможет!
Ответ 7
Он работает на всех устройствах. Он будет показывать только приложения электронной почты
public static void shareViaMail(Activity activity, String title, String body, String filePath) {
Uri URI = Uri.parse("file://" + filePath);
final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
/*if you want to attach something*/
if (URI != null) {
emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
}
try {
activity.startActivity(emailIntent);
} catch (Exception e) {
((BaseActivity) activity).showToast("Gmail App is not installed");
e.printStackTrace();
}
}