如何检查设备上是否安装了电子邮件客户端?

8

我需要检查设备上是否安装了电子邮件客户端。我已经使用了以下代码,但它对我无效。

public boolean isIntentAvailable() {
    final PackageManager packageManager = getApplicationContext().getPackageManager();
    final Intent intent = new Intent(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_EMAIL, "vin@gmail.com");
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.GET_META_DATA);
    return list.size() > 0;
} 
5个回答

12

我使用这个方法,适用于我的情况:

public static boolean isMailClientPresent(Context context){
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/html");
    final PackageManager packageManager = context.getPackageManager();
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, 0);

    if(list.size() == 0)
        return false;
    else 
        return true;
}

1
这并不是完全可靠的。如果您将类型设置为"text/html"运行此代码,它仍然可以找到其他有效的方式,而不是电子邮件。例如,我设置了一个新的模拟器,并尝试调用此函数时,它显示我的ResolveInfo对象列表,其中包含通过蓝牙传输的项目。因此,即使没有可用的电子邮件客户端,此函数调用也会返回true。建议您按照@eyal的建议更新此代码,并将类型更改为"message/rfc822"。 - cking24343
在我的情况下,在不支持 Google API 的 emulator 中,它返回一个带有一个元素的列表(活动“com.android.fallback.Fallback”),然后在发送电子邮件时引发异常。请参见 https://dev59.com/T3I95IYBdhLWcg3wsQFm#31052350 了解此情况。 - CoolMind

4

使用这种方法:

    private fun sendEmail(to: Array<String>) {
        val intent = Intent(Intent.ACTION_SENDTO)
        intent.data = Uri.parse("mailto:") // only email apps should handle this
        intent.putExtra(Intent.EXTRA_EMAIL, to)
//        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        if (intent.resolveActivity(requireContext().packageManager) != null) {
            startActivity(intent)
        }
    }

为了在针对API 30时能够检查电子邮件客户端,需将"queries"添加到清单文件中:
<queries>
    <intent>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="*" />
    </intent>
</queries>

1
谢谢!在我的情况下,缺少的是<queries>块,这是我在SO上找到的唯一提到它的答案。我正在使用packageManager.queryIntentActivities()来查找已安装的电子邮件应用程序,但在OnePlus设备上,即使安装了电子邮件应用程序,它始终返回一个空列表。我添加了<queries>块,现在它可以正常工作了。 - Mickäel A.
记录一下,经过调查,我遇到的问题与OnePlus设备无关,而是与针对SDK >= 30的应用程序有关。请参见https://dev59.com/h3E85IYBdhLWcg3wnUwd#64419233。 - Mickäel A.

3

对于邮件客户端,你应该使用:

intent.setType("message/rfc822");

与其:

intent.setType("text/html");

“message/rfc822” 在删除 Gmail 后,queryIntentActivities() 返回一个长度为 1 的列表。是否有一种可靠的解决方案来检查已安装的电子邮件客户端? - Ed of the Mountain
1
@EdoftheMountain,那听起来很正确,大多数设备都有默认的电子邮件客户端和Gmail。所以在你删除了Gmail之后,你可能只剩下默认的一个。 - Yarh

0
这是我的方法,在小米(安卓13)手机上有效:
将以下内容添加到manifest.xml中: ``` ```
在View.OnClickListener的onClick方法中: ``` val mailIntent = Intent.makeMainSelectorActivity( Intent.ACTION_MAIN, Intent.CATEGORY_APP_EMAIL ) mailIntent.data = Uri.parse("mailto:") val emails = arrayOf(data?.serviceEmail) mailIntent.putExtra(Intent.EXTRA_EMAIL, emails) if (mailIntent.resolveActivity(packageManager) != null) { startActivity(mailIntent) } else { showTips("请检查是否安装了邮件应用") } ```

0
在所有设备(OnePlus、Moto、Samsung等)上检查电子邮件客户端的正确方法如下:
在您的清单文件中,在应用程序标签之后添加以下代码。
<queries>
        <intent>
            <action android:name="android.intent.action.SENDTO" />
            <data android:scheme="*" />
        </intent>
</queries>

您可以根据需要更改方案。 完成后,您需要在按钮点击(或与电子邮件相关的任何事件)上使用以下代码:
Intent email = new Intent(Intent.ACTION_SENDTO);
email.setData(Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"receipient@email.com"});
email.putExtra(Intent.EXTRA_SUBJECT, "Any Subject");
if (email.resolveActivity(getPackageManager()) != null)         
    startActivity(email);
else 
   // A toast to display any message when email client is not available

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接