2010-03-19 9 views
5

voy a asignar a un contactos ImageView imágenes utilizando este código:¿Cómo comprobar si Contact tiene imagen?

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

Si el contacto no tiene ninguna imagen, esto no hace nada, y no se produce ningún error.

Cuando no hay imagen, quiero agregar una imagen predeterminada. Entonces, debo verificar si la imagen se agregó a la vista o si el URI contiene algunos datos de imagen

¿Cómo logro eso?

que la imagen por defecto pondré por esto:

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

¿Está apuntando a eclair o cupcake/donut? – Schildmeijer

+0

android sdk 2.1 – Pentium10

Respuesta

8

Si el dispositivo de destino está ejecutando Android 2.0/2.0.1/2.1 que tendrá que consultar ContactsContract.Data .CONTENT_URI con una selección como:

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

de lo contrario consulta Contacts.Photos .CONTENT_URI

Editar por Pentium10

Como referencia incluyo aquí el método se me ocurre (si se sigue mostrando errores, actualizarlo):

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

Esto no es una explicación detallada, pero si está familiarizado con ContentProviders/ContentResolvers esto debería ser suficiente. De lo contrario, hágamelo saber y publicaré algunos ejemplos de código. – Schildmeijer

+0

Gracias. Edité tu respuesta e incluí la solución que se me ocurrió. Verificar si hay errores. – Pentium10

+1

por alguna razón, algunas veces si el contacto tiene más detalles, devuelve uri, pero uri no tiene imagen – Hamidreza

0

Dependiendo de su caso de uso, puede haber otra opción (mejor?). Si tiene un cursor de todos los contactos y, por ejemplo, los vincula a una vista de lista, puede simplemente intentar recuperar una fotografía usando openContactPhotoInputStream y comprobar si no tiene nulo.

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

Aquí está un ejemplo rápido para cualquiera que pueda tropezar con esto:

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

Entonces se le puede llamar con algo como esto:

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

Esto es lo que ocurrió con basado en las otras respuestas

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

Del cheque si la columna photo_id en proveedor de contenido PhoneLookUp es nulo o no Aquí es un método que he desarrollado:

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

si necesita la imagen de contacto uri obtenerlo de:

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

y si necesita establecerlo en una vista de imagen, use la siguiente línea (he usado Universal Image Loader 1.9.2 para fines de carga de imágenes):

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

nota: contactThumb es la última describe uri Salud!

Cuestiones relacionadas