2010-08-18 13 views
30

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?Obteniendo una foto de un contacto

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

intente esto, Tal vez esto le ayudará http://stackoverflow.com/a/38992166/4593930 –

Respuesta

54

Probablemente esto le ayudará a (contacto se identifica por 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); 
} 

uso es:

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

Cuando pongo esto en Eclipse, e importo todo, me estoy poniendo errores en 'this.ctx' y' ContentUris' – Chiggins

+0

Bueno, debería cambiar this.ctx en su variable de contexto, contenturis debería funcionar ya que es parte de Android SDK. Intenta presionar Control + o para resolver las importaciones http://developer.android.com/intl/de/reference/android/content/ContentUris.html – Pentium10

+1

Nota: recuerda cerrar el cursor –

12

No sabe 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 la siguiente forma: contenido: //com.android.contacts/data/3345, donde el número es el identificación fotográfica.

4

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

Añadiendo el rendimiento mejorado 'photo_stream.close();' para mí. – Uri

+0

@Uri cómo puede decir esto, y si es bueno, entonces otro puede usar también –

+1

IDK para mí solo lo hizo ... use bajo su propio riesgo – Uri

13

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 utilizar:

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

1

Es necesario utilizar el permiso de este tipo en el archivo de manifiesto

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

¿El permiso READ_CONTACTS es suficiente para leer la imagen del perfil de los contactos? – Jeet

+0

en mi experiencia personal, en el estudio de Android simplemente escriba su código y si su proyecto necesita algún permiso y si no lo declara en su manifiesto, aparecerá un error y si lee su error de seguimiento, la huella dirá tu que permiso necesitas sin embargo, base para aceptar respuesta, solo necesita el permiso de lectura de contactos –

3

Para los futuros lectores, carga todos los contactos con imágenes requieren demasiado tiempo y memoria si Cargue 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 consultar más. 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 vez, cargarlos en la memoria, y el uso de la memoria para la consulta de las imágenes de los contactos de forma individual.

0

Sé que es una pregunta muy antigua, pero también algunas de las respuestas aquí, 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

Cuestiones relacionadas