Подтвердить что ты не робот

Android Intent Chooser отображает только функцию электронной почты

Мое приложение объединяет электронную почту, в которой пользователь может напрямую отправлять отчет об ошибке, обратную связь и т.д. Я использую приложение/октет-поток как SetType для намерения. Когда вы отправляете сообщение электронной почты, вы получаете выбор контента, и он показывает различные элементы из Evernote, Facebook, E-mail и т.д.

Как я могу заставить этот выбор только показывать E-mail, чтобы не путать пользователя со всеми этими другими элементами, которые соответствуют типу выбора контента?

Спасибо.

4b9b3361

Ответ 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);
}

Ответ 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();
        }
}