我希望使用RAW_CONTACT_ID
或甚至联系人LookupKey获取特定Contact
的{{1}}。
我知道contacts表有一个引用PhoneLookup
列的列name_raw_contact_id
,但在使用contacts查询键查询raw_contacts._id
时似乎没有返回。
我的手机查询查询是:
ContactsContract.Contacts.CONTENT_LOOKUP_URI
然后我根据查找键查找String[] projection = new String[] {
PhoneLookup.DISPLAY_NAME, PhoneLookup.LOOKUP_KEY };
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
Cursor c = resolver.query(uri, projection, null, null, null);
:
Contact
然而,这不会编译,我得到
String[] contactProjection = new String[] {
ContactsContract.Contacts.NAME_RAW_CONTACT_ID
};
Uri contactUri = Uri.withAppendedPath(
ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
Cursor contactCursor = resolver.query(contactUri,
contactProjection, null, null, null);
但是android documentation将cannot find symbol: variable NAME_RAW_CONTACT_ID
location: class android.provider.ContactsContract.Contacts
显示为列。
有什么方法可以根据电话号码或查找密钥获取NAME_RAW_CONTACT_ID
吗?
答案 0 :(得分:2)
我发现答案是提出第三个问题:
long rawContactId = -1;
Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,
new String[]{RawContacts._ID},
RawContacts.CONTACT_ID + "=?",
new String[]{String.valueOf(contactId)}, null);
try {
if (c.moveToFirst()) {
rawContactId = c.getLong(0);
}
} finally {
c.close();
}
但是应该注意每个联系人可以有多个RawContact,上面的查询将获得与contactId
答案 1 :(得分:1)
ContactsContract.Contacts.NAME_RAW_CONTACT_ID列需要 API级别21 或更高版本,因此请确保您使用此版本进行编译。
您还可以在第一个查询中使用 ContactsContract.PhoneLookup._ID 列来获取 Contact_Id ,然后使用此 Contact_Id 在您的第3个查询中,您的问题将在2个查询中解决,而不是3个。
答案 2 :(得分:0)
private HashSet<Long> getRawContactIdsForContact(long contactId)
{
HashSet<Long> ids = new HashSet<Long>();
Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI,
new String[]{RawContacts._ID},
RawContacts.CONTACT_ID + "=?",
new String[]{String.valueOf(contactId)}, null);
if (cursor != null && cursor.moveToFirst())
{
do
{
ids.add(cursor.getLong(0));
} while (cursor.moveToNext());
cursor.close();
}
return ids;
}