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

Android中ContactsContract.CommonDataKinds.Event.START_DATE返回手机号问题排查

问题根因

  • 你选择了错误的查询URI:Phone.CONTENT_URI 是专门用于查询联系人手机号的数据集,仅返回手机号相关的字段值。不同类型联系人数据的字段常量的索引值可能存在重复,所以你在手机号数据集里取ContactsContract.CommonDataKinds.Event.START_DATE对应索引的字段时,实际取到的是同位置的手机号字段值。
  • 额外注意:你代码中contactID==""的字符串比较写法是错误的,Java中字符串值比较要使用equals()方法,避免空指针可以写成"".equals(contactID)。

正确实现方式

查询联系人生日需要使用通用的联系人数据表ContactsContract.Data.CONTENT_URI,同时指定MIME类型筛选事件类数据,再筛选生日类型即可,示例代码如下:

String selection = ContactsContract.Data.CONTACT_ID + " = ? AND "
        + ContactsContract.Data.MIMETYPE + " = ? AND "
        + ContactsContract.CommonDataKinds.Event.TYPE + " = ?";
String[] selectionArgs = new String[]{
        contactID,
        ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE,
        String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY)
};
Cursor c = activity.getContentResolver().query(
        ContactsContract.Data.CONTENT_URI,
        new String[]{ContactsContract.CommonDataKinds.Event.START_DATE},
        selection,
        selectionArgs,
        null
);
String birthday = null;
if (c != null && c.moveToFirst()) {
    birthday = c.getString(0);
    c.close();
}

如果需要同时查询手机号和生日,可以分别查询两个数据集后做数据合并,不要在单种数据的URI下查询其他类型的字段。

内容的提问来源于stack exchange,提问作者Unknown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:06:03