如何在 Android API 30 上查找设备上是否存在电子邮件应用程序?

5

我的应用需要检查是否存在邮件应用,以便我们可以隐藏发送电子邮件的按钮。

在API 30上,Android对包管理器进行了更改,因此我们无法访问活动,除非它们已在<queries>标记中声明。

我已按以下方式在AndroidManifest文件中设置了查询节点:

 <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.APP_EMAIL" />
        </intent>
    </queries>

当我尝试使用intent进行查询时,包管理器的方法返回零项。
 fun isEmailAppInstalled(context: Context): Boolean {
        val intent = Intent(Intent.ACTION_MAIN)
        intent.addCategory(Intent.CATEGORY_APP_EMAIL)
        return context.packageManager.queryIntentActivities(intent, 0).isNotEmpty()
 }
3个回答

11
在你的AndroidManifest中添加:
<queries>
    <intent>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="mailto"/>
    </intent>
</queries>

并修改您的代码为:

val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
        intent.addCategory(Intent.CATEGORY_DEFAULT)
        return context.packageManager.queryIntentActivities(intent, 0).isNotEmpty()

需要仔细检查/更新语言语法,因为我已经在Xamarin.Forms中测试了该解决方案,并且向后兼容到API 29及以下版本。


在我的Android应用中有效。 - ezaspi

0

来自文档

fun composeEmail(addresses: Array<String>, subject: String) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:")    //<- only email apps should handle this
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
    }

    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

0
根据基于API级别30或更高版本的新文档,如果您想访问设备上安装的其他应用程序,则必须通过在应用程序清单文件中添加<queries>元素来声明包可见性。这里你所做的事情。同时,系统会自动将某些应用程序对您的应用程序可见。我们可以通过以下方式进行检查。
adb shell dumpsys package queries

在命令输出中,找到forceQueryable部分。该部分包括设备自动向您的应用程序公开的软件包列表。(此部分摘自文档)。

enter image description here

所以在这种情况下,没有<queries>标签,我可以通过Intent.createChooser在API 30和29上访问我的设备上的电子邮件应用程序。

  fun isEmailAppInstalled(context: Context) {
    /* val intent = Intent(Intent.ACTION_MAIN)
    intent.addCategory(Intent.CATEGORY_APP_EMAIL)
    return context.packageManager.queryIntentActivities(intent, 0).isNotEmpty()*/
    val intent = Intent(Intent.ACTION_MAIN)
    intent.addCategory(Intent.CATEGORY_APP_EMAIL)
    try {
        startActivity(Intent.createChooser(intent, "Choose your Email App"))
    } catch (e: ActivityNotFoundException) {
        Log.i("ZI", "No Email App Found")

    }
}

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