Displaying contact's photo by photo_ID

android, contacts, image, photo

Solution

You are trying to set ID of the row from `ContactsContract.Data` table as a resource ID into your `ImageView`. And surely it wouldn't work. It doesn't even make any sense.

You should retrieve the original photo from database first and only then you can show it.

For example, you can use this code to retrieve image bitmap with the help of row ID pointing to the image data (i've recreated some pieces of code just to test it):

private void queryContactInfo(int rawContactId) {
    Cursor c = getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[] {
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    ContactsContract.CommonDataKinds.Phone.TYPE,
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.PHOTO_ID
            }, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[] { Integer.toString(rawContactId) }, null);
    if (c != null) {
        if (c.moveToFirst()) {
            String number = c.getString(0);
            int type = c.getInt(1);
            String name = c.getString(2);
            int photoId = c.getInt(3);
            Bitmap bitmap = queryContactImage(photoId);
            showSelectedNumber(type, number, name, bitmap);
        }
        c.close();
    }
}

private Bitmap queryContactImage(int imageDataRow) {
    Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {
        ContactsContract.CommonDataKinds.Photo.PHOTO
    }, ContactsContract.Data._ID + "=?", new String[] {
        Integer.toString(imageDataRow)
    }, null);
    byte[] imageBytes = null;
    if (c != null) {
        if (c.moveToFirst()) {
            imageBytes = c.getBlob(0);
        }
        c.close();
    }

    if (imageBytes != null) {
        return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
    } else {
        return null;
    }
}

public void showSelectedNumber(int type, String number, String name, Bitmap bitmap) {
    mInfoView.setText(type + " " + number + " " + name);
    mImageView.setImageBitmap(bitmap); // null-safe
}

You can also see http://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html as a convenient provider directory for getting contacts' photos. There is an example as well.

Problem

I let the user select a contact in my app, and I display it on the home screen widget, but the photo is not displayed and I don't know what's wrong. This is how I get the reference to the photo: ``` ... Cursor c = null; try { c = getContentResolver().query(uri, new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.PHOTO_ID }, null, null, null); if (c != null && c.moveToFirst()) { String number = c.getString(0); int type = c.getInt(1); String name = c.getString(2); int photo = c.getInt(3); showSelectedNumber(type, number, name, photo); } } ``` This is how I display it: ``` public void showSelectedNumber(int type, String number, String name, int photo) { mAppWidgetPrefix.setText(name); pickedNumber.setText(number); pickedPhoto.setImageResource(photo); } ``` Why doesn't it work?

Original source

Related problems