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
相关产品推荐
相关产品推荐

