как получить контактный фото URI - PullRequest
10 голосов
/ 12 октября 2011

Я работаю с Android Contact ContentProvider. У меня есть номер телефона , и мне нужно получить URI для Фото контакта, связанного с этим номером телефона. Как я могу это сделать ???

Я знаю, что могу получить необработанные данные фотографии и построить InputStream , но мне не нужен входной поток, мне нужен URI .

РЕДАКТИРОВАТЬ: Первоначально я использовал следующий код для получения контактной информации

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

Ответы [ 5 ]

11 голосов
/ 12 октября 2011

Чтобы получить идентификатор соединения с помощью номера телефона, используйте следующий код:

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

и используйте полученный идентификатор контакта, чтобы получить URI фотографии с контентом.Используйте следующий код для получения URI фотографии:

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

Надеюсь, это поможет.

9 голосов
/ 10 ноября 2012

Это решение демонстрирует, как получить изображение от контакта с пользователем, а затем отобразить его в 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);
4 голосов
/ 05 июня 2016

Вот код из Документация Android .

Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
2 голосов
/ 18 сентября 2017

Вы можете получить PHOTO_URI по NUMBER, просто используйте следующий код, также вы можете использовать _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;
}
0 голосов
/ 14 мая 2016
    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();
    }

Так что теперь, если SDK сотовый или выше, у вас есть миниатюра Uri контакта. Или вы можете создать URI поиска следующим образом:

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

P.S. Если вы уже знаете идентификатор контакта и / или ключ поиска , вы можете создать Uri из строки:

поиск: content://com.android.contacts/contacts/lookup/{lookup key}/{contact id} Миниатюра: content://com.android.contacts/contacts/{contact id}/photo

Так что лучше кэшировать эти значения.

...