1

i am trying to retreive the contacts thumbnail from phonebook given a phone number or email ID. Th code that i wrote works but takes a very long time because it is querying the whole contacts(not efficient at all).

Below is the code

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 gets a String[] of all the numbers and emails for the contactID passed to it.

I got another approach from SO that uses PhoneLookup but that giver=s me an error. I checke to see what columns is this cursor returning. i got only two columns one of which as contact name and the other was an integer probably the ID. Here is the second code;

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();    
                    }

please help to either optimize my first code or sort out the error in the second code.Thanks a lot.

4

3 に答える 3

4

Joe の回答とこの投稿の助けを借りて、私にとって完璧に機能するコードを思いつくことができました。このコードは基本的に電話番号を入力として受け取り、電話番号に存在する場合は連絡先にサムネイル 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();

メールの検索にも同様の方法を使用できます。PhoneLookup.CONTENT_FILTER_URIの代わりにContactsContract.Contacts.CONTENT_LOOKUP_URIを使用する必要があります

これが私のような他の初心者にも役立つことを願っています:P

于 2012-11-05T14:07:17.910 に答える
1

最初に ADDRESS で ContactsContract.CommonDataKinds.Email をクエリし、ContactsContract.ContactsColumns.LOOKUP_KEY を含むプロジェクションを返します。これにより、その電子メール アドレスを持つすべての連絡先の集約連絡先 ID (不変) が得られます。そこから、LOOKUP_KEY で ContactsContract.Contacts をクエリして写真を取得します。または、LOOKUP_KEY を含む行の _ID 値を取得し、ContactsContract.RawContacts.CONTACT_ID でクエリを実行して未加工の連絡先をすべて取得してから、それらの写真をクエリします。

連絡先データベースは階層構造になっているため、効果的に使用するには、その階層構造を理解する必要があります。

また、常にバックグラウンド スレッドでクエリを実行する必要があります。

于 2012-11-04T19:38:10.957 に答える
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();
        }
    }
于 2012-11-06T13:52:48.773 に答える