2010-08-18 2 views
30

Хорошо, я просто пытаюсь узнать об использовании контактной информации, но я немного застрял. Я хотел бы иметь возможность отображать картинку для контакта. Используя следующий код, который у меня есть, как я могу поместить фотографию для контакта в ImageView в contact_entry?Получение фотографии из контакта

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

попробовать это, Может быть, это поможет вам http://stackoverflow.com/a/38992166/4593930 –

ответ

54

Возможно, это поможет вам (контакт идентифицируется 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); 
} 

Использование является:

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

Когда я положил это в Eclipse, и импортировать все, я получаю ошибки в 'this.ctx' и' ContentUris' – Chiggins

+0

Ну, вы должны изменить this.ctx в своей переменной контекста, contenturis должен работать так, как это является частью Android SDK. Попробуйте нажать Control + o, чтобы разрешить импорт. Http://developer.android.com/intl/de/reference/android/content/ContentUris.html – Pentium10

+1

Sidenote: не забудьте закрыть курсор –

12

Не знаю почему, но это работает на 2.2 и 4.1:

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

Фото Uri имеет следующий вид: содержание: //com.android.contacts/data/3345, где число является идентификатор фотографии.

4

Этот код будет иметь изображение от контакта, а затем отобразится в вашем изображении. Это очень просто и прекрасно работает, в этом случае я получаю изображение от контакта и дисплея, если, если есть еще запрос, тогда

   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

Добавление 'photo_stream.close();' улучшенная производительность для меня. – Uri

+0

@ Uri, как вы можете это сказать, и если это хорошо, то другие могут использовать это также –

+1

IDK для меня это просто ... использовать на свой страх и риск – Uri

13

В документации на Android говорится, что мы должны сделать это таким образом.

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; 

} 

Для contactId вы можете использовать:

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

Источник: https://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html

1

Вы должны использовать разрешение, как это в вашем файле манифеста

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

Достаточно ли разрешения READ_CONTACTS, чтобы читать изображение профиля контактов? – Jeet

+0

по моему личному опыту, в студии Android просто напишите свой код, и если вашему проекту нужно какое-либо разрешение, и если вы не объявите его в своем манифесте, вы будете с ошибкой, и если вы прочтете свою ошибку трассировки, вам, какое разрешение вам нужно. однако, основываясь на принятии ответа, вам нужно только разрешение на чтение-контакты –

3

Для будущих читателей, загрузка все контакты с изображениями занимают слишком много времени и памяти, если y ou загружает изображения с полным размером. По опыту на Nexus 5 для загрузки ~ 500 контактов требуется до 3 секунд. Из-за этой интенсивности нам нужно избегать сбора контактов в потоке пользовательского интерфейса.

Это главным образом потому, что миниатюрные фотографии находятся в другой таблице, что заставляет нас запрашивать больше. Если вам не нужно загружать какое-либо изображение, в случае, указанном выше, требуется ~ 400 мс.

Я создал сущность, которая извлекает все контакты с соответствующими значками эскизов в ~ 500-700 мс для 500 контактов;

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

Ключевым моментом является то, чтобы запросить и получить все ссылки на уменьшенные один раз, загружать их в память, и использовать память для запроса изображений контактов индивидуально.

0

Я знаю, что это очень старый вопрос, но так же некоторые из ответов здесь, поскольку здесь несколько вещей устарели. Поскольку вопрос появился в поиске, когда я искал аналогичное решение, я, хотя я добавлю свои два цента здесь ...

Я создал простой список контактов с их именами и фотографиями из ContactsContract. Пожалуйста, проверьте мой ответ на ... https://stackoverflow.com/a/37710199/1209544

Смежные вопросы