2011-06-27 126 views
3

Gah,另一種應該很簡單的方案證明是非常耗時和痛苦的。提取聯繫人的照片

我使用這個查詢的聯繫人提供商:

private Cursor getContacts(){ 
Uri uri = ContactsContract.Contacts.CONTENT_URI; 
String[] projection = new String[] { 
    ContactsContract.Contacts._ID, 
    ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.Contacts.PHOTO_ID 
    }; 
    ...... 
    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 

這工作得很好,並檢索聯繫人姓名,並在接觸了一把它顯示了PHOTO_ID領域的數字ID,我以爲是我要求的PHOTO_ID。但是隨後我將該ID推入此方法中以提取位圖,它在每次接觸時都失敗,並且每次都爲空。我正在測試一組包含Android聯繫人照片的聯繫人(我知道從Facebook聯繫人中提取照片時存在一些問題)。

private Bitmap loadContactPhoto(long id) { 
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id); 
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri); 
    if (input == null) return null; 
    Bitmap bitmap = BitmapFactory.decodeStream(input); 
    return bitmap; 
} 

我錯過了什麼?

回答

2

openContactPhotoInputStream()獲取聯繫人的URI,嘗試使用ContactsContract.Contacts._ID列而不是PHOTO_ID列調用它,並且應該會看到更好的結果。

有一堆這裏的相關討論的一些代碼來看看:

How do I load a contact Photo?

注意,在某些情況下,你會看到在本機通訊錄應用程序,它不會通過加載照片內容解析器。某些同步信息(例如Facebook)會被標記爲僅供聯繫人應用程序本身使用,並且不會導出至其他應用程序:-(

但是,使用contactUri至少應處理一些問題。

+0

謝謝!你救了我的一天!但有沒有人kbow如何從例如facebook同步提取? - 我知道它的高度討論 – bricklore