Obtener una foto de un contacto

Muy bien, solo estoy tratando de aprender sobre el uso de la información de contacto, pero estoy un poco atascado. Me gustaría poder mostrar una imagen para el contacto. Usando el siguiente código que tengo, ¿cómo podría poner la foto para el contacto en ImageView en 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

      

Probablemente esto lo ayude (el contacto se identifica mediante 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); } 

El uso es:

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

La documentación de Android dice que deberíamos hacerlo de esta manera.

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

Para contactId puede usar:

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

Fuente: https://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html

No sé por qué pero esto funciona en 2.2 y 4.1:

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

La foto Uri tiene el siguiente formato: content: //com.android.contacts/data/3345 , donde el número es photoId.

Este código tomará una imagen de un contacto y luego se mostrará en su imageView, es muy fácil y funciona perfecto, en este caso obtengo una imagen de un contacto y la visualizo si, si todavía hay una consulta, publico un comentario.

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

Para lectores futuros, cargar todos los contactos con imágenes requiere demasiado tiempo y memoria si carga las imágenes a tamaño completo. Por experiencia, en Nexus 5 se tardan hasta 3 segundos en cargar ~ 500 contactos. Debido a esta intensidad, debemos evitar buscar contactos en el hilo de UI.

Esto se debe principalmente a que las fotos en miniatura están en otra tabla, lo que nos obliga a realizar más consultas. Si no necesita cargar ninguna imagen, lleva ~ 400 ms en el caso mencionado anteriormente.

He creado una esencia que recupera todos los contactos, con sus respectivas referencias en miniatura en ~ 500-700ms para 500 contactos;

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

El punto clave es consultar y obtener todas las referencias en miniatura una vez, cargarlas en la memoria y usar la memoria para consultar imágenes de contactos individualmente.

Necesita usar un permiso como este en su archivo de manifiesto

   

Sé que es una pregunta muy antigua, pero también lo son algunas de las respuestas, ya que ahora se han desaprobado algunas cosas. Como la pregunta apareció en las búsquedas mientras buscaba una solución similar, pensé que agregaría mis dos centavos aquí …

He creado una lista de contactos simple con sus nombres y fotos de ContactsContract. Por favor, compruebe mi respuesta en … https://stackoverflow.com/a/37710199/1209544

Aquí está el código de trabajo:

 public static Bitmap retrieveContactPhoto(Context context, String number) { ContentResolver contentResolver = context.getContentResolver(); String contactId = null; Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID}; Cursor cursor = contentResolver.query( uri, projection, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID)); } cursor.close(); } Bitmap photo = BitmapFactory.decodeResource(context.getResources(), R.drawable.about_icon_email); Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId)); Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); cursor = context.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; } 

Espero que te ayude