2011-10-12 161 views
9

我正在使用Android Contact ContentProvider。我有一個電話號碼,我需要獲得與此電話號碼關聯的聯繫人的照片URI。我該怎麼做???如何獲取聯繫人照片URI

我知道我能得到原始數據的照片,建設的InputStream,但我不想輸入流,我需要URI

編輯:原來我用下面的代碼來獲取聯繫人信息

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNo)); 
    Cursor cursor = context.getContentResolver().query(uri, details, null, null, null); 

回答

11

要使用的電話號碼使用下面的代碼獲得conatct ID:

import android.provider.ContactsContract.PhoneLookup; 

public String fetchContactIdFromPhoneNumber(String phoneNumber) { 
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 
     Uri.encode(phoneNumber)); 
    Cursor cursor = this.getContentResolver().query(uri, 
     new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID }, 
     null, null, null); 

    String contactId = ""; 

    if (cursor.moveToFirst()) { 
     do { 
     contactId = cursor.getString(cursor 
      .getColumnIndex(PhoneLookup._ID)); 
     } while (cursor.moveToNext()); 
    } 

    return contactId; 
    } 

,並使用接觸式ID獲得獲取contatc照片URI。使用下面的代碼獲取照片URI:

import android.provider.ContactsContract; 
import android.provider.ContactsContract.CommonDataKinds.Phone; 

public Uri getPhotoUri(long contactId) { 
    ContentResolver contentResolver = getContentResolver(); 

    try { 
     Cursor cursor = contentResolver 
      .query(ContactsContract.Data.CONTENT_URI, 
       null, 
       ContactsContract.Data.CONTACT_ID 
        + "=" 
        + contactId 
        + " AND " 

        + ContactsContract.Data.MIMETYPE 
        + "='" 
        + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE 
        + "'", null, null); 

     if (cursor != null) { 
     if (!cursor.moveToFirst()) { 
      return null; // no photo 
     } 
     } else { 
     return null; // error in cursor process 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

    Uri person = ContentUris.withAppendedId(
     ContactsContract.Contacts.CONTENT_URI, contactId); 
    return Uri.withAppendedPath(person, 
     ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
    } 

希望這會有所幫助。

+4

不要忘記在完成後關閉遊標,否則會發生內存泄漏。 –

+2

另外,請務必在應用程序的清單中包含READ_CONTACTS權限。 – PeteH

+6

這個getPhotoUri proc在各種可能的方式中都是完全錯誤的......不要使用它...你也需要檢查uri的存在..答案應該被刪除..如果你需要讀取PHOTO_URI或PHOTO_THUMBNAIL_URI一個有效URI的內容提供者! – xnagyg

7

該解決方案演示瞭如何從用戶聯繫人獲取圖像,然後將其顯示在ImageView中。

ImageView profile = (ImageView)findViewById(R.id.imageView1);     
Uri my_contact_Uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(Contact_Id)); 
InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),my_contact_Uri);    
BufferedInputStream buf =new BufferedInputStream(photo_stream); 
Bitmap my_btmp = BitmapFactory.decodeStream(buf); 
profile.setImageBitmap(my_btmp); 
+0

代碼在BufferedInputStream中缺少「buf」buf = new BufferedInputStream(photo_stream); –

+4

另外,您可以直接將Uri設置爲imageView(使用imageView。setImageURI(uri),而不必自己轉換爲Bitmap。 –

+0

@paul_sns如何將其存儲到數據庫?我可以使用uri或位圖鏈接嗎? – ajdeguzman

0
final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; 
    String phoneNumber = "+1 416 385 7805"; 
    ContentResolver contentResolver = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.LOOKUP_KEY, 
      IS_HONEYCOMB ? ContactsContract.Contacts.PHOTO_THUMBNAIL_URI : ContactsContract.Contacts._ID, 
      }; 
    Cursor cursor = 
      contentResolver.query(
        uri, 
        projection, 
        null, 
        null, 
        null); 
    if (cursor != null && cursor.moveToNext()) { 
     long contactId = cursor.getLong(0); 
     String lookupKey = cursor.getString(1); 
     String thumbnailUri = cursor.getString(2);   
     cursor.close(); 
    } 

所以,現在如果SDK是蜂窩狀或更高u有接觸的縮略圖URI。 或者你可以構建一個這樣的查找uri:

Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 

p.S.如果你已經知道接觸ID和/或查找鍵你可以從字符串構造一個URI:

查找:content://com.android.contacts/contacts/lookup/{lookup key}/{contact id} 縮略圖:content://com.android.contacts/contacts/{contact id}/photo

所以最好緩存這些值。

2

這裏的代碼來自Android Documentation

Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); 
return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
1

你可以通過PHOTO_URINUMBER使用下面的代碼,你也可以使用_ID。

public static String getContactPhoto(Context context, String phoneNumber) { 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.PHOTO_URI}, null, null, null); 
    if (cursor == null) { 
     return null; 
    } 
    String contactImage= null; 
    if (cursor.moveToFirst()) { 
     contactImage= cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI)); 
    } 

    if (!cursor.isClosed()) { 
     cursor.close(); 
    } 
    return contactImage; 
}