2010-03-19 94 views
5

我分配給使用該代碼的ImageView的聯繫人圖片:如何檢查聯繫人是否有圖像?

mPhotoView = (ImageView) findViewById(R.id.photo); 
mPhotoView.setImageURI(objItem.getPhotoUri()); 

如果該聯繫人有沒有圖像,這並沒有什麼,並沒有出現錯誤。

當沒有圖像時,我想添加一個默認圖像。所以我需要檢查圖像是否被添加到視圖中,或者檢查URI是否包含一些圖像數據

我該如何實現這一目標?

比我將它設置默認的圖像:

mPhotoView.setImageResource(R.drawable.ic_contact_picture_2); 
+0

你是以eclair還是cupcake/donut爲目標? – Schildmeijer 2010-03-19 20:20:24

+0

android sdk 2.1 – Pentium10 2010-03-19 20:21:48

回答

8

如果您的目標設備運行的是Android 2.0/2.0.1/2.1,你將不得不查詢ContactsContract.Data .CONTENT_URI與像一個選擇:

Data.MIMETYPE + "='" + Photo.CONTENT_ITEM_TYPE 

否則查詢Contacts.Photos .CONTENT_URI

編輯由Pentium10

僅供參考這裏我包括我想出方法(如果你仍然看到錯誤,更新):

public Uri getPhotoUri() { 
    Uri person = ContentUris.withAppendedId(
      ContactsContract.Contacts.CONTENT_URI, Long.parseLong(getId())); 
    Uri photo = Uri.withAppendedPath(person, 
      ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 

    Cursor cur = this.ctx 
      .getContentResolver() 
      .query(
        ContactsContract.Data.CONTENT_URI, 
        null, 
        ContactsContract.Data.CONTACT_ID 
          + "=" 
          + this.getId() 
          + " AND " 
          + ContactsContract.Data.MIMETYPE 
          + "='" 
          + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE 
          + "'", null, null); 
    if (cur != null) { 
     if (!cur.moveToFirst()) { 
      return null; // no photo 
     } 
    } else { 
     return null; // error in cursor process 
    } 
    return photo; 
} 
+0

這不是一個詳細的解釋,但如果您熟悉ContentProvider/ContentResolvers,這應該就足夠了。否則,讓我知道,我會張貼一些代碼示例。 – Schildmeijer 2010-03-20 10:36:01

+0

謝謝。我編輯了你的答案,幷包括我提出的解決方案。檢查錯誤。 – Pentium10 2010-03-21 14:43:13

+1

由於某種原因,有時如果接觸有更多的細節,返回uri,但uri沒有圖像 – Hamidreza 2014-12-28 14:01:30

0

根據您的使用情況下,有可能是另一個(更好?)選項。如果你有一個所有聯繫人的光標,並且你說,將它們綁定到一個列表視圖,你可以簡單地嘗試使用openContactPhotoInputStream檢索一張照片,並檢查是否爲空。

InputStream stream = Contacts.openContactPhotoInputStream(context.getContentResolver(), lookupUri); 
if (stream == null) { 
    //your logic here when no photo found 
} 

這裏的任何一個簡單的例子誰可以在此絆倒:

import android.provider.ContactsContract.Contacts; 

//Define someDefaultPhoto somewhere accessible 

protected Bitmap getContactPhoto(Context context, Uri lookupUri) { 
    Bitmap resultPhoto; 
    InputStream stream; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     //For some reason this seems to be necessary pre-ICS. If anyone knows why, I'd love to hear 
     lookupUri = Contacts.lookupContact(context.getContentResolver(), lookupUri); 
    } 
    stream = Contacts.openContactPhotoInputStream(context.getContentResolver(), lookupUri); 

    if (stream == null) { 
     resultPhoto = someDefaultPhoto; 
    } 
    else { 
     resultPhoto = BitmapFactory.decodeStream(stream); 
    } 
    return resultPhoto; 
} 

然後你可以用這樣的稱呼它:

int columnLookupKey = cursor.getColumnIndex(Contacts.LOOKUP_KEY); 
String lookupKey = cursor.getString(columnLookupKey); 
Uri lookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey); 
Bitmap contactPhoto = getContactPhoto(context, lookupUri); 
0

這是我想出了基於其他答案。

private Uri getUserPictureUri(long id) { 
     Uri person = ContentUris.withAppendedId(
     ContactsContract.Contacts.CONTENT_URI, id); 
     Uri picUri = Uri.withAppendedPath(person, 
      ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
     try { 
      InputStream is = getContentResolver().openInputStream(picUri); 
      is.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return picUri; 
} 
0

只是檢查是否在PhoneLookUp內容提供商PHOTO_ID欄爲空或不是 這裏是我已經開發了一個方法:

public static boolean hasContactPhoto(Context context, String number) { 
    String thumbUri = ""; 
    String photoId = ""; 
    String id = ""; 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(number)); 
    Cursor cursor = context.getContentResolver().query(uri, 
      new String[] {ContactsContract.PhoneLookup._ID,ContactsContract.PhoneLookup.PHOTO_ID}, null, null, null); 
    if (cursor.moveToFirst()) { 
     id = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID)); 
     photoId = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_ID)); 
    } 
    cursor.close(); 
    if(!id.equals("") && photoId != null && !photoId.equals("")) 
     return true; 
     //sms.setContactThumb(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id)).toString()); 
    else 
     return false; 
} 

如果你需要接觸式圖像URI來得到它:

ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,Long.valueOf(ID))。的toString()

如果您需要將其設置爲圖像視圖,請使用以下行(我已使用Universal Image Loader 1.9。2圖像加載的目的):

 ImageLoader.getInstance().displayImage(currentRecord.getContactThumb(),viewHolder.mThumbIV); 

注:contactThumb是最後描述的URI 乾杯!

相關問題