2010-03-19 49 views
5

Tôi gán cho một địa chỉ liên lạc ImageView hình ảnh sử dụng mã này:Cách kiểm tra xem Liên hệ có hình ảnh không?

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

Nếu tiếp xúc không có hình ảnh, điều này không có gì, và không có lỗi được nâng lên.

Khi không có hình ảnh, tôi muốn thêm hình ảnh mặc định. Vì vậy, tôi cần phải kiểm tra xem hình ảnh đã được thêm vào chế độ xem hay kiểm tra xem URI có giữ một số dữ liệu hình ảnh hay không

Làm cách nào để đạt được điều đó?

Thần I sẽ thiết lập hình ảnh mặc định của thành viên này:

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

bạn đang nhắm mục tiêu eclair hoặc cupcake/donut? – Schildmeijer

+0

sdk android 2.1 – Pentium10

Trả lời

8

Nếu thiết bị mục tiêu của bạn đang chạy android 2.0/2.0.1/2.1 bạn sẽ phải truy vấn ContactsContract.Data .CONTENT_URI với một lựa chọn như:

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

Nếu không truy vấn Contacts.Photos .CONTENT_URI

Sửa bởi Pentium10

Để tham khảo tôi bao gồm ở đây phương pháp tôi đưa ra (nếu bạn vẫn thấy lỗi, cập nhật nó):

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

Đây không phải là giải thích chi tiết, nhưng nếu bạn đã quen thuộc với ContentProviders/ContentResolvers thì điều này là đủ. Nếu không, hãy cho tôi biết và tôi sẽ đăng một số ví dụ về mã. – Schildmeijer

+0

Cảm ơn bạn. Tôi đã chỉnh sửa câu trả lời của bạn và đưa vào giải pháp mà tôi đưa ra. Kiểm tra lỗi. – Pentium10

+1

vì lý do nào đó, một số lần nếu liên hệ có nhiều chi tiết hơn, trả lại uri, nhưng uri không có hình ảnh – Hamidreza

0

Tùy thuộc vào trường hợp sử dụng của bạn, có thể có khác (tốt hơn?) Tùy chọn. Nếu bạn có một con trỏ của tất cả các địa chỉ liên lạc và bạn đang nói, ràng buộc chúng vào một listview, bạn chỉ có thể cố gắng để lấy một bức ảnh bằng cách sử dụng openContactPhotoInputStream, và kiểm tra null.

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

Dưới đây là một ví dụ nhanh cho bất kỳ ai có thể vấp ngã này:

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

Sau đó, bạn có thể gọi nó với một cái gì đó như thế này:

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

Đây là những gì tôi đã đưa ra dựa trên các câu trả lời khác.

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

Chỉ cần kiểm tra nếu cột PHOTO_ID trong PhoneLookUp nhà cung cấp nội dung là null hay không Dưới đây là một phương pháp tôi đã phát triển:

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

nếu bạn cần hình ảnh xúc uri nhận được nó từ:

ContentUris.withAppendedId (ContactsContract.Contacts.CONTENT_URI, Long.valueOf (id)). toString()

và nếu bạn cần đặt chế độ xem thành chế độ xem hình ảnh, hãy sử dụng dòng sau (Tôi đã sử dụng Trình tải hình ảnh toàn cầu 1.9.2 cho các mục đích hình ảnh tải):

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

lưu ý: contactThumb là mô tả cuối cùng uri Cheers!

Các vấn đề liên quan