从 Android 联系人数据库获取联系人 ID 未按预期工作
Posted
技术标签:
【中文标题】从 Android 联系人数据库获取联系人 ID 未按预期工作【英文标题】:Getting Contact ID from Android Contacts database is not working as intended 【发布时间】:2011-11-13 11:34:27 【问题描述】:我有以下代码。
int phoneContactID = new Random().nextInt();
Cursor contactLookupCursor = context.getContentResolver().query( Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,Uri.encode(contactNumber)), new String[] PhoneLookup.DISPLAY_NAME, PhoneLookup._ID,null,null,null);
try
contactLookupCursor.moveToFirst();
while(contactLookupCursor.moveToNext())
phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
finally
contactLookupCursor.close();
上述代码中的问题是,即使我在模拟器联系人中提供现有号码,它也不会返回任何结果。我在一小时前测试它,它工作正常,现在当我再次测试它时,它没有返回任何东西。我不确定代码是否有问题。我想要做的是获得一个与多个数字相匹配的 ID。例如,假设有一个名为“A”的联系人姓名,而 A 有两个号码。基本上,无论我指的是哪个号码,A 的联系人 ID 都应该是 1。我的假设正确吗?
更新:我做了更多测试。假设如果在联系人数据库中存储的号码没有国家代码,例如 222-222-2222。仅当我通过 2222222222 或 222-222-2222 时,使用以下代码进行的搜索才会返回联系人 ID。如果存储相同的号码,如 12222222222,则只有当我搜索号码为 12222222222 时才会收到有效的联系人 ID。
String[] projection = new String[] ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
Uri contactUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(contactNumber));
Cursor c = context.getContentResolver().query(contactUri, projection, null, null, null);
if (c.moveToFirst())
phoneContactID = c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
我不确定我是否在这里做错了什么。任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:public static int getContactIDFromNumber(String contactNumber,Context context)
contactNumber = Uri.encode(contactNumber);
int phoneContactID = new Random().nextInt();
Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,contactNumber),new String[] PhoneLookup.DISPLAY_NAME, PhoneLookup._ID, null, null, null);
while(contactLookupCursor.moveToNext())
phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
contactLookupCursor.close();
return phoneContactID;
现在正在运行的代码。
【讨论】:
对我来说很棒的 +1。真的很有帮助 一些错误,你有两次 encode(contactNumber),在某些情况下,如果你设备中的电话号码包含国家代码,你的结果是 null。 为什么使用“new Random().nextInt();”?在这种情况下,您应该写 -1 或将其更改为可为空的 Integer 类型。【参考方案2】:好的..对不起,我错过了解释你的问题 我没有这样做。但我认为以下代码可能有效 试一试,让我知道:
Cursor phone_cursor = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?",
new String[]"YOUR NUMBER GOES HERE", null);
while (phone_cursor.moveToNext())
//here you can extract the inofrmation you want
phone_cursor.getString( phone_cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
【讨论】:
抱歉回复延迟。我尝试了上面的代码,但无法返回任何结果。但是,每当我格式化输入以完全匹配它在联系人中的存储方式时,它都会为我返回一个 id。例如 1-234-567-8900 给了我结果,但 2345678900 没有给我结果。 感谢 K-ran-Beast 的努力。出于某种原因,我的原始代码开始工作。 欢迎 vikram...如果您自己找到答案,也请发布您的工作 sn-ps....谢谢 :-)【参考方案3】:按以下方式执行步骤:
//此方法将返回一个包含完整信息的游标
private Cursor getContacts()
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[]
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
接下来,您可以遍历此 Cursor 以获取名称和 ID,如下所示:
while (cursor.moveToNext())
namess[i]= cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
id[i] = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
i++;
【讨论】:
您的代码将帮助我遍历联系人。我想查询给定号码的联系人并提取联系人 ID。我不确定这段代码对我有什么帮助。【参考方案4】:vikramjb 的答案很棒,我尝试以更清晰的方式来做(通过使用此处的说明https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html):
private Long GetContactIdFromNumber(ContentResolver contentResolver, String number)
Uri contactLookup = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
Cursor contactLookupCursor = contentResolver.query(contactLookup,new String[] ContactsContract.PhoneLookup._ID, null, null, null);
if (contactLookupCursor.moveToNext())
long ret = contactLookupCursor.getLong(contactLookupCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
contactLookupCursor.close();
return ret;
contactLookupCursor.close();
return 0l;
顺便说一句,在 api 版本(21 以上)中,CallLog.Calls
中有 PHONE_ACCOUNT_ID
列:
https://developer.android.com/reference/android/provider/CallLog.Calls.html
【讨论】:
以上是关于从 Android 联系人数据库获取联系人 ID 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章