我正在尝试从给出电话号码或电子邮件ID的电话簿中检索联系人缩略图。我编写的代码有效,但需要很长时间,因为它查询整个联系人(根本没有效率)。
以下是代码
Cursor cursor;
String[] queryColumns = { ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,ContactsContract.Contacts._ID };
ContentResolver cr = getContentResolver();
cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, queryColumns,
null, null, null);
cursor.moveToFirst();
while (cursor.moveToNext() && continueSearch) {
String[] phonesAndEmails = extractPhonesAndEmails(Integer.parseInt(cursor.getString(1)));
for(int g=0;g<phonesAndEmails.length;g++){
if(phonesAndEmails[g].equals(searchFor)){
contactThumbUri = cursor.getString(0);
MyUtils.addLog("Found Match **************" + contactThumbUri);
continueSearch=false;
}
}
}
cursor.close();
extractPhonesAndEmails获取传递给它的contactID的所有数字和电子邮件的String []。
我从SO那里得到了另一种使用PhoneLookup的方法,但是给了我一个错误。我想知道这个光标返回的是什么列。我只有两列,其中一列是联系人姓名,另一列是整数,可能是ID。这是第二个代码;
if(!MyUtils.checkIfEmailID(searchFor)){
Cursor mCursor;
Uri qUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(searchFor));
String[] mqueryColumns = {PhoneLookup.PHOTO_URI};
mCursor = getContentResolver().query(qUri, mqueryColumns,null, null, null);
MyUtils.addLog(mCursor.getCount() + " count");
MyUtils.addLog(mCursor.getString(0));
mCursor.moveToFirst();
while (mCursor.moveToNext() && continueSearch) {
contactThumbUri=mCursor.getString(0);
MyUtils.addLog(contactThumbUri);
continueSearch=false;
}
mCursor.close();
}
请帮助优化我的第一个代码或在第二个代码中解决错误。谢谢。
答案 0 :(得分:4)
在Joe的回答和this post的帮助下, 我能够提出适合我的代码。此代码基本上将电话号码作为输入,并将缩略图uri返回给联系人(如果存在于电话中)。这是代码。
谢谢乔。
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(searchFor));
String[] projection = {PhoneLookup.LOOKUP_KEY};
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
do{
String lookUpKey = cursor.getString(0);
uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, Uri.encode(lookUpKey));
String[] projection1 = {ContactsContract.Contacts.PHOTO_THUMBNAIL_URI};
Cursor cursor1 = getContentResolver().query(uri, projection1, null, null, null);
cursor1.moveToFirst();
contactThumbUri = cursor1.getString(0);
cursor1.close();
if(!contactThumbUri.equals(null)){
continueSearch=false;
}
}while(cursor.moveToNext() && continueSearch);
cursor.close();
可以使用类似的方法查找电子邮件。需要使用 ContactsContract.Contacts.CONTENT_LOOKUP_URI 而不是 PhoneLookup.CONTENT_FILTER_URI
希望这也有助于像我这样的其他初学者:P
答案 1 :(得分:1)
首先在ADDRESS上查询ContactsContract.CommonDataKinds.Email并返回包含ContactsContract.ContactsColumns.LOOKUP_KEY的投影。这将为您提供具有该电子邮件地址的所有联系人的汇总联系人ID(不变更)。从那里,查询 ContactsContract.Contacts on LOOKUP_KEY获取照片。或者,获取包含LOOKUP_KEY的行的_ID值,然后在ContactsContract.RawContacts.CONTACT_ID中查询以获取所有原始联系人,然后查询他们的照片。
“联系人”数据库是分层的,您必须了解其层次结构才能有效地使用它。
此外,您应该始终在后台线程上进行查询。
答案 2 :(得分:0)
试试这个。
final String[] queryColumns = { ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,
ContactsContract.Contacts._ID };
final String email = "abc@gmail.com";
final StringBuffer sb = new StringBuffer();
sb.append("mimetype_id = (select _id from mimetypes where mimetype = " +
"'vnd.android.cursor.item/email_v2') and data1 = '"+email +"'");
final Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI,
queryColumns, sb.toString(), null, null);
if (cursor == null || !cursor.moveToFirst()) {
return;
}
try {
do {
final String photoURI = cursor.getString(0);
final long contactID = cursor.getLong(1);
Log.i("Test", "PhotoURI"+photoURI+"ContactID"+contactID);
} while (cursor.moveToNext());
} finally {
if (cursor != null) {
cursor.close();
}
}