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

DMO*_*DMO 5 android

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

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

我在 AndroidManifest 文件上设置了查询节点,如下所示

 <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.APP_EMAIL" />
        </intent>
    </queries>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用意图进行查询时,包管理器上的方法返回零项。

 fun isEmailAppInstalled(context: Context): Boolean {
        val intent = Intent(Intent.ACTION_MAIN)
        intent.addCategory(Intent.CATEGORY_APP_EMAIL)
        return context.packageManager.queryIntentActivities(intent, 0).isNotEmpty()
 }
Run Code Online (Sandbox Code Playgroud)

env*_*yM6 13

在您的AndroidManifest添加中:

<queries>
    <intent>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="mailto"/>
    </intent>
</queries>
Run Code Online (Sandbox Code Playgroud)

并将您的代码更改为

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

语言语法可能需要双重检查/更新,因为我已经测试了该解决方案,Xamarin.Forms并且也与 API 29 及以下版本兼容。


Zah*_*lam 0

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

adb shell dumpsys package queries
Run Code Online (Sandbox Code Playgroud)

在命令输出中,找到forceQueryable 部分。此部分包括设备自动对您的应用程序可见的包列表。(此部分从文档复制)。

在此输入图像描述

因此,在这种情况下,如果没有标签,我可以通过Intent.createChooser<queries>从我的设备上的 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")

    }
}
Run Code Online (Sandbox Code Playgroud)