2010-08-18 39 views
30

Được rồi, tôi chỉ đang cố gắng tìm hiểu về cách sử dụng thông tin Liên hệ, nhưng tôi hơi bị kẹt. Tôi muốn có thể hiển thị một hình ảnh cho số liên lạc. Sử dụng đoạn mã sau mà tôi có, làm cách nào tôi có thể đặt ảnh cho liên hệ trong ImageView trong contact_entry?Nhận Ảnh từ một Số liên lạc

ListView contacts_list = (ListView) findViewById(R.id.contacts_list); 

// Gets the URI of the db 
Uri uri = ContactsContract.Contacts.CONTENT_URI; 
// What to grab from the db 
String[] projection = new String[] { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.Contacts.PHOTO_ID 
}; 

String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

Cursor cursor = managedQuery(uri, projection, null, null, sortOrder); 

String[] fields = new String[] { 
     ContactsContract.Data.DISPLAY_NAME 
}; 

int[] values = { 
     R.id.contactEntryText 
}; 

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor, 
     fields, values); 
contacts_list.setAdapter(adapter); 

contact_entry.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="54px"> 
    <ImageView 
     android:id="@+id/contactPhoto" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_contact_picture_3"/> 
    <TextView 
     android:text="@+id/contactEntryText" 
     android:id="@+id/contactEntryText" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 
+0

hãy thử điều này, Có thể điều này sẽ giúp bạn http://stackoverflow.com/a/38992166/4593930 –

Trả lời

54

Có lẽ điều này sẽ giúp bạn (tiếp xúc được xác định bởi getId()):

/** 
* @return the photo URI 
*/ 
public Uri getPhotoUri() { 
    try { 
     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 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
    Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long 
      .parseLong(getId())); 
    return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
} 

Cách sử dụng:

Uri u = objItem.getPhotoUri(); 
if (u != null) { 
     mPhotoView.setImageURI(u); 
} else { 
     mPhotoView.setImageResource(R.drawable.ic_contact_picture_2); 
} 
+0

Khi tôi đặt điều này vào Eclipse và nhập mọi thứ, tôi nhận được các lỗi trong 'this.ctx' và' ContentUris' – Chiggins

+0

Bạn nên thay đổi this.ctx trong biến ngữ cảnh của mình, contenturis sẽ hoạt động như một phần của SDK Android. Hãy thử nhấn Control + o để giải quyết việc nhập http://developer.android.com/intl/de/reference/android/content/ContentUris.html – Pentium10

+1

Sidenote: hãy nhớ đóng con trỏ –

12

Không biết tại sao nhưng công trình này trên 2.2 và 4.1:

Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, Long.parseLong(photoId)); 
imageView.setImageURI(photoUri); 

Bức ảnh Uri đã có dạng sau: nội dung: //com.android.contacts/data/3345, nơi số lượng là photoId.

4

Mã này sẽ chụp ảnh từ liên hệ và sau đó sẽ hiển thị trong hình ảnh của bạn, nó rất dễ dàng và hoạt động hoàn hảo, trong trường hợp này tôi nhận được hình ảnh từ liên hệ và hiển thị nếu, nếu vẫn còn truy vấn đăng nhận xét

   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);      
+1

Thêm 'photo_stream.close();' hiệu suất được cải thiện cho tôi. – Uri

+0

@Uri làm thế nào bạn có thể nói điều này, và nếu nó là tốt, sau đó khác có thể sử dụng này cũng –

+1

IDK cho tôi nó chỉ ... đã sử dụng nguy cơ của riêng bạn – Uri

13

Tài liệu Android cho biết, chúng tôi nên thực hiện theo cách này.

public Bitmap openPhoto(long contactId) { 
     Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); 
     Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
     Cursor cursor = getContentResolver().query(photoUri, 
       new String[] {ContactsContract.Contacts.Photo.PHOTO}, null, null, null); 
     if (cursor == null) { 
      return null; 
     } 
     try { 
      if (cursor.moveToFirst()) { 
       byte[] data = cursor.getBlob(0); 
       if (data != null) { 
        return BitmapFactory.decodeStream(new ByteArrayInputStream(data)); 
       } 
      } 
     } finally { 
      cursor.close(); 
     } 
     return null; 

} 

Đối contactId bạn có thể sử dụng:

public static long getContactIDFromNumber(String contactNumber, Context context) { 
    String UriContactNumber = Uri.encode(contactNumber); 
    long phoneContactID = new Random().nextInt(); 
    Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, UriContactNumber), 
      new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID}, null, null, null); 
    while (contactLookupCursor.moveToNext()) { 
     phoneContactID = contactLookupCursor.getLong(contactLookupCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID)); 
    } 
    contactLookupCursor.close(); 

    return phoneContactID; 
} 

Nguồn: https://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html

1

Bạn cần phải sử dụng phép như thế này trong file manifest của bạn

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
+0

Quyền READ_CONTACTS có đủ để đọc hình ảnh hồ sơ của người liên hệ không? – Jeet

+0

về trải nghiệm cá nhân của tôi, trong studio android chỉ cần viết mã của bạn và nếu dự án của bạn cần bất kỳ quyền nào và nếu bạn không khai báo trong tệp kê khai của mình, bạn sẽ gặp lỗi và nếu bạn đọc lỗi theo dõi của mình bạn cần sự cho phép nào. tuy nhiên dựa trên câu trả lời chấp nhận, bạn chỉ cần quyền đọc danh bạ –

3

Đối với độc giả trong tương lai, bốc tất cả các liên hệ với hình ảnh mất quá nhiều thời gian và bộ nhớ nếu y tải hình ảnh với kích thước đầy đủ. Từ trải nghiệm, trên Nexus 5, mất tới 3 giây để tải ~ 500 liên hệ. Do cường độ này, chúng tôi cần tránh tìm nạp địa chỉ liên hệ trong chuỗi giao diện người dùng.

Điều này chủ yếu là do ảnh thu nhỏ nằm trong một bảng khác, điều này buộc chúng tôi truy vấn nhiều hơn. Nếu bạn không cần tải bất kỳ hình ảnh nào, phải mất ~ 400ms trong trường hợp được đề cập ở trên.

Tôi đã tạo một danh sách tìm nạp tất cả các địa chỉ liên hệ, với tham chiếu hình thu nhỏ tương ứng của chúng trong ~ 500-700ms cho 500 địa chỉ liên hệ;

https://gist.github.com/bugraoral/a4d36d79621455fa3dd860ff994ae796

Điểm mấu chốt là để truy vấn và nhận được tất cả tài liệu tham khảo thumbnail một lúc, tải chúng vào bộ nhớ, và sử dụng bộ nhớ để truy vấn hình ảnh của địa chỉ liên lạc cá nhân.

0

Tôi biết đó là câu hỏi rất cũ nhưng do đó, có một số câu trả lời ở đây vì một số điều ở đây hiện không được chấp nhận. Khi câu hỏi xuất hiện trong tìm kiếm trong khi tôi đang tìm giải pháp tương tự, tôi mặc dù tôi sẽ thêm hai xu vào đây ...

Tôi đã tạo danh sách liên hệ đơn giản với tên và ảnh của họ từ ContactsContract. Vui lòng kiểm tra câu trả lời của tôi tại ... https://stackoverflow.com/a/37710199/1209544

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