Android多SIM卡通话记录查询返回零结果排查求助
问题分析与解决方案
核心问题点
- 字段匹配逻辑错误:你用
Calls.PHONE_ACCOUNT_ID LIKE ?搭配iccId + "%"的写法完全错误。PHONE_ACCOUNT_ID是系统给每个电话账户分配的唯一标识,和ICCID没有前缀关联关系,不能用LIKE来匹配。 - 日期参数可能类型不匹配:
Calls.DATE存储的是毫秒级时间戳,如果ten_mins_ago不是转成字符串的长整型数值,查询就会失效。
修正步骤与代码
1. 获取对应ICCID的PhoneAccount ID
先通过系统API找到目标SIM卡对应的PhoneAccount ID,这才是和Calls.PHONE_ACCOUNT_ID匹配的正确字段:
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); SubscriptionManager subscriptionManager = SubscriptionManager.from(context); List<SubscriptionInfo> subs = subscriptionManager.getActiveSubscriptionInfoList(); String targetPhoneAccountId = null; if (subs != null) { for (SubscriptionInfo sub : subs) { if (iccId.equals(sub.getIccId())) { targetPhoneAccountId = sub.getPhoneAccountId().toString(); break; } } } if (targetPhoneAccountId == null) { // 未找到对应ICCID的SIM卡,直接返回 return; }
2. 生成正确的时间参数
确保时间戳是毫秒级的长整型,转成字符串传入查询:
long tenMinsAgo = System.currentTimeMillis() - 10 * 60 * 1000;
3. 执行修正后的查询
将匹配条件改为精确匹配PHONE_ACCOUNT_ID,同时传入正确的时间参数:
Cursor cursor = context.getContentResolver() .query( Calls.CONTENT_URI, new String[]{Calls.TYPE, Calls.NUMBER, Calls.DATE}, Calls.PHONE_ACCOUNT_ID + " = ? AND " + Calls.DATE + " > ? ", new String[]{targetPhoneAccountId, String.valueOf(tenMinsAgo)}, Calls.DEFAULT_SORT_ORDER);
额外注意事项
- 必须申请
READ_CALL_LOG权限,Android 6.0及以上版本需要动态申请该权限。 - 部分设备存在SIM卡信息获取的兼容性问题,若
SubscriptionInfo无法正常获取,可尝试通过TelephonyManager.getPhoneAccounts()遍历匹配。
内容的提问来源于stack exchange,提问作者luckysing_noobster
相关产品推荐
相关产品推荐

