Android API 30 如何检测设备是否已安装电子邮件应用
Android API 30+ 检测已安装邮件应用失败解决方案
问题根因
你当前用的Intent.CATEGORY_APP_EMAIL匹配规则本身适配性很差:只有极少数系统自带邮件应用会在主Activity中声明该 category,绝大多数第三方邮件应用(QQ邮箱、网易邮箱、Outlook等)都不会主动声明,所以天然就有概率查不到已安装的邮件应用,叠加API30+的包可见性限制,就会出现返回列表为空的问题。
修复步骤
1. 修改AndroidManifest中的queries配置
替换你原来的queries节点,匹配所有处理发邮件请求的应用过滤器:
<queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> </queries>
2. 修改检测逻辑代码
改用mailto协议匹配规则查询,同时使用正确的查询标记:
import android.net.Uri import android.content.pm.PackageManager fun isEmailAppInstalled(context: Context): Boolean { val sendEmailIntent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") } return context.packageManager.queryIntentActivities( sendEmailIntent, PackageManager.MATCH_DEFAULT_ONLY ).isNotEmpty() }
注意事项
- 不需要申请
QUERY_ALL_PACKAGES权限,仅靠上面的queries配置即可满足包可见性要求,申请多余的全量查询权限反而可能导致Google Play上架被拒 - 该方案匹配所有可以处理发送邮件请求的应用,和你控制发送邮件按钮显示的业务场景完全匹配,适配市面上绝大多数主流邮件应用
- 不要添加
PackageManager.GET_RESOLVED_FILTER等多余的查询标记,Android11+的包可见性规则下多余标记可能导致查询结果为空
内容的提问来源于stack exchange,提问作者DMO
相关产品推荐
相关产品推荐

