安卓应用创建联系人遇ANR:如何检测设备是否安装联系人应用?
检测设备是否已安装联系人应用并避免ANR问题
我完全懂你碰到的这个坑——当设备里没有任何联系人应用能响应你的插入联系人请求时,系统找不到对应的处理程序,就会卡住引发ANR。别担心,咱们可以通过提前检测来解决这个问题,下面是具体的实现思路和代码:
解决思路
核心就是利用PackageManager查询设备中是否存在能处理你创建的联系人插入Intent的应用。如果有,再正常启动Intent;如果没有,就给用户一个友好提示,避免触发ANR。
完整代码示例
把检测逻辑和你原有的代码结合起来,就变成这样:
// 构建插入联系人的Intent Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION); intent.setType(ContactsContract.RawContacts.CONTENT_TYPE); intent.putExtra(ContactsContract.Intents.Insert.PHONE, contactNumber) .putExtra(ContactsContract.Intents.Insert.NAME, contactName); // 获取PackageManager实例 PackageManager packageManager = getPackageManager(); // 查询所有能处理该Intent的应用 List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); if (!resolveInfos.isEmpty()) { // 存在可用的联系人应用,启动Intent startActivity(intent); } else { // 没有检测到联系人应用,给用户提示 Toast.makeText(this, "未找到联系人应用,无法创建联系人", Toast.LENGTH_SHORT).show(); }
关键细节说明
queryIntentActivities方法会返回所有符合条件的应用信息列表,只要列表不为空,就说明有应用能处理这个请求;- 加上
MATCH_DEFAULT_ONLY参数是为了筛选出那些带有CATEGORY_DEFAULT的Activity,确保这些应用是用户可以正常交互的(比如系统自带的联系人应用); - 一定要在启动Intent前做这个检测,否则系统找不到处理程序时就会陷入等待,最终导致ANR。
内容的提问来源于stack exchange,提问作者AkashToSky
相关产品推荐
相关产品推荐

