Как проверить, есть ли у контакта изображение? - PullRequest
5 голосов
/ 19 марта 2010

Я присваиваю изображения контактам ImageView, используя этот код:

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

Если у контакта нет изображения, это ничего не делает, и ошибка не возникает.

Когда естьнет изображения, я хочу добавить изображение по умолчанию.Поэтому мне нужно проверить, было ли изображение добавлено в представление, или убедиться, что URI содержит некоторые данные изображения

Как мне этого добиться?

Чем я установлю изображение по умолчанию этим:

mPhotoView.setImageResource(R.drawable.ic_contact_picture_2);

Ответы [ 4 ]

8 голосов
/ 19 марта 2010

Если ваше целевое устройство работает под управлением Android 2.0 / 2.0.1 / 2.1, вам придется запросить ContactsContract.Data .CONTENT_URI с выбором, например:

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

В противном случае запрос Contacts.Photos .CONTENT_URI

Редактирование Pentium10

Для справки я привожу здесь метод, который придумал (если вы все еще видите ошибки, обновите его):

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 голосов
/ 27 июля 2014

Просто проверьте, является ли столбец PHOTO_ID в поставщике контента PhoneLookUp пустым или нет Вот метод, который я разработал:

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

если вам нужно изображение контакта, получите его:

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

и если вам нужно установить его в режим просмотра изображений, используйте следующую строку (я использовал Universal Image Loader 1.9.2 для загрузки изображений):

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

примечание: contactThumb является последним описанным uri Ура!

0 голосов
/ 24 декабря 2013

Это то, что я придумал на основе других ответов.

    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 голосов
/ 24 марта 2013

В зависимости от вашего варианта использования, может быть другой (лучше?) Вариант. Если у вас есть курсор всех контактов, и вы говорите, связывая их с представлением списка, вы можете просто попытаться получить фотографию, используя openContactPhotoInputStream, и проверить на нулевое значение.

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

Вот краткий пример для любого, кто может наткнуться на это:

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

Тогда вы можете назвать это примерно так:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...