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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With