2

I'm using this code to open email chooser via intent

val mIntent = Intent(
    Intent.ACTION_SENDTO, Uri.fromParts(
        "mailto",
        "name@email.com", null
    )
)
mIntent.putExtra(Intent.EXTRA_SUBJECT, "[Feedback - App Name]")
mIntent.putExtra(Intent.EXTRA_TEXT, "")
try {
    startActivity(Intent.createChooser(mIntent, "Choose Email Client..."))
} catch (e: Exception) {
    (activity as MainActivity).showToast("There are no email clients installed.")
}

it works as expected but it also includes PayPal app in the list of email clients.

email chooser

On clicking PayPal, if the email is registered with PayPal, it redirects to the payment page. And if not registered, it shows below screen.

paypal

In both scenarios, there is no option to send emails from the PayPal app.

So, How can I include only email clients in the intent chooser?

I have tried this code as well, it also results in the same.

val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:")
intent.putExtra(Intent.EXTRA_EMAIL, "addresses")
intent.putExtra(Intent.EXTRA_SUBJECT, "subject")
if (intent.resolveActivity(activity?.getPackageManager()!!) != null) {
    startActivity(Intent.createChooser(intent, "Choose Email Client..."))
}

EDIT :

I have checked in other apps where the same dialog is opening. May be PayPal app is listening to mail events.

Niraj
  • 903
  • 8
  • 23

3 Answers3

0

Please look into this :

 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);
    }

Edited

private void sendEmail(Connect connect) {
    Intent email = new Intent(Intent.ACTION_SENDTO);
    email.setData(Uri.parse("mailto:"));
    email.putExtra(Intent.EXTRA_EMAIL, new String[]{connect.getEmail()});
    email.putExtra(Intent.EXTRA_SUBJECT, "");
    email.putExtra(Intent.EXTRA_TEXT, "");
    try {
        startActivity(Intent.createChooser(email, getString(R.string.choose_email_client)));
    } catch (ActivityNotFoundException activityNotFoundException) {
        UIUtils.showShortSnackBar(fragmentConnectLayout, getString(R.string.no_email_client));
    }
}
Nensi Kasundra
  • 1,980
  • 6
  • 21
  • 34
0

You can loop through the intent package names and remove PayPal. Then create a chooser with your filtered list.

val emailAppLauncherIntents = ArrayList<Intent>()

// Intent that only email apps can handle:
val emailAppIntent = Intent(Intent.ACTION_SENDTO)
emailAppIntent.data = Uri.parse("mailto:")

val packageManager = requireActivity().packageManager

// All installed apps that can handle email intent
val emailApps = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_ALL)
} else {
    packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_DEFAULT_ONLY)
}

emailApps.forEach { resolveInfo ->
    val packageName = resolveInfo.activityInfo.packageName
    val launchIntent = packageManager.getLaunchIntentForPackage(packageName)

    // Paypal shows up for send intent - we don't want this
    if (!packageName.contains("paypal") && launchIntent != null) {
          emailAppLauncherIntents.add(launchIntent)
    }
}

val chooser = Intent.createChooser(Intent(), getString(R.string.select_email_client))
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toTypedArray())
startActivity(chooser)
Nic Bell
  • 513
  • 2
  • 7
0

You can choose specific packages to make this action , try this :

        val email = "examle@gmail.com"
        val subject = "some text "

        val intent = Intent(Intent.ACTION_VIEW)
        val data = Uri.parse("mailto:$email?subject=${Uri.encode(subject)}")
        intent.data = data
        intent.setPackage("com.google.android.gm") // Package name for Gmail app
        startActivity(intent)