You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:57:27