2010-03-19 16 views
5

J'assignant à une image de contacts ImageView en utilisant ce code:Comment vérifier si Contact a une image?

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

Si le contact n'a pas d'image, cela ne fait rien, et aucune erreur est soulevée.

En l'absence d'image, je souhaite ajouter une image par défaut. Je dois donc vérifier si l'image a été ajoutée à la vue, ou vérifier que l'URI contient des données d'image.

Comment puis-je y parvenir?

Que je tournerai image par défaut par ceci:

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

ciblez-vous eclair ou cupcake/beignet? – Schildmeijer

+0

android sdk 2.1 – Pentium10

Répondre

8

Si votre appareil cible est en cours d'exécution Android 2.0/2.0.1/2.1 vous devrez interroger ContactsContract.Data .CONTENT_URI avec une sélection comme:

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

Sinon requête Contacts.Photos .CONTENT_URI

Modifier par Pentium10

Pour référence, je comprend ici la méthode que je viens avec (si vous voyez encore des bugs, mettre à jour):

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

Ceci n'est pas une explication détaillée, mais si vous êtes familier avec ContentProviders/ContentResolvers cela devrait suffire. Sinon, faites le moi savoir et je posterai quelques exemples de code. – Schildmeijer

+0

Merci. J'ai édité votre réponse et inclus la solution que j'ai trouvée. Vérifiez les bogues. – Pentium10

+1

pour une raison quelconque, parfois si le contact a plus de détails, retourner uri, mais uri n'a pas d'image – Hamidreza

0

En fonction de votre cas d'utilisation, il peut y avoir une autre option (mieux?). Si vous avez un curseur de tous les contacts et vous dites, en les liant à une liste, vous pouvez simplement essayer de récupérer une photo en utilisant openContactPhotoInputStream, et vérifier null.

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

Voici un exemple rapide pour tous ceux qui peuvent tomber sur ce:

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

Ensuite, vous pouvez l'appeler avec quelque chose comme ceci:

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

C'est ce que je suis venu avec basé sur les autres réponses.

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

juste vérifier si la colonne photo_id dans le fournisseur de contenu PhoneLookUp est nul ou non Voici une méthode que j'ai développé:

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 vous avez besoin de l'image de contact uri obtenir à partir de:

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

et si vous avez besoin de le définir en vue d'une image, utilisez la ligne suivante (j'ai utilisé Universal Image Loader 1.9.2 à des fins de chargement d'image):

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

Note: contactThumb est le dernier décrit uri Cheers!

Questions connexes