cómo obtener el URI de la foto de contacto

Estoy trabajando con Android Contact ContentProvider. Tengo un número de teléfono y necesito obtener el URI de la foto del contacto asociado con este número de teléfono. ¿¿¿Cómo puedo hacerlo???

Sé que puedo obtener los datos brutos de la foto y construir un InputStream , pero no quiero el flujo de entrada, necesito el URI .

EDITAR: Originalmente estoy usando el siguiente código para obtener información de contacto

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNo)); Cursor cursor = context.getContentResolver().query(uri, details, null, null, null); 

Para obtener la identificación del conatct usando el número de teléfono, use el siguiente código:

 import android.provider.ContactsContract.PhoneLookup; public String fetchContactIdFromPhoneNumber(String phoneNumber) { Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor cursor = this.getContentResolver().query(uri, new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID }, null, null, null); String contactId = ""; if (cursor.moveToFirst()) { do { contactId = cursor.getString(cursor .getColumnIndex(PhoneLookup._ID)); } while (cursor.moveToNext()); } return contactId; } 

y use la identificación de contacto obtenida para obtener el URI de la foto contactada. Use el siguiente código para obtener URI de la foto:

 import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; public Uri getPhotoUri(long contactId) { ContentResolver contentResolver = getContentResolver(); try { Cursor cursor = contentResolver .query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + "=" + contactId + " AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null, null); if (cursor != null) { if (!cursor.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, contactId); return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); } 

Espero que esto ayude.

Esta solución muestra cómo obtener una imagen de un contacto de usuario y luego mostrarla en un ImageView .

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

Aquí está el código de la documentación de Android .

 Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 

Puede obtener PHOTO_URI por NUMBER solo use el siguiente código y también puede usar _ID.

  public static String getContactPhoto(Context context, String phoneNumber) { ContentResolver cr = context.getContentResolver(); Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.PHOTO_URI}, null, null, null); if (cursor == null) { return null; } String contactImage= null; if (cursor.moveToFirst()) { contactImage= cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI)); } if (!cursor.isClosed()) { cursor.close(); } return contactImage; } 
  final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; String phoneNumber = "+1 416 385 7805"; ContentResolver contentResolver = context.getContentResolver(); Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY, IS_HONEYCOMB ? ContactsContract.Contacts.PHOTO_THUMBNAIL_URI : ContactsContract.Contacts._ID, }; Cursor cursor = contentResolver.query( uri, projection, null, null, null); if (cursor != null && cursor.moveToNext()) { long contactId = cursor.getLong(0); String lookupKey = cursor.getString(1); String thumbnailUri = cursor.getString(2); cursor.close(); } 

Entonces, si sdk es nido de abeja o superior, tienes una miniatura del contacto. O puede construir un uri de búsqueda como este:

 Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 

PD: si ya conoce la ID de contacto y / o la clave de búsqueda , puede construir un URI a partir de una cadena:

búsqueda: content://com.android.contacts/contacts/lookup/{lookup key}/{contact id} miniatura: content://com.android.contacts/contacts/{contact id}/photo

Por lo tanto, es mejor guardar en caché estos valores.