4

我让用户在我的应用程序中选择一个联系人,并将其显示在主屏幕小部件上,但照片没有显示,我不知道出了什么问题。

这就是我获得照片参考的方式:

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

这就是我显示它的方式:

public void showSelectedNumber(int type, String number, String name, int photo) {
    mAppWidgetPrefix.setText(name);
    pickedNumber.setText(number);
    pickedPhoto.setImageResource(photo);
}

为什么它不起作用?

4

1 回答 1

11

您正在尝试将ContactsContract.Data表中行的 ID 作为资源 ID 设置到ImageView. 而且肯定行不通。这甚至没有任何意义。

您应该先从数据库中检索原始照片,然后才能显示它。

例如,您可以使用此代码在指向图像数据的行 ID 的帮助下检索图像位图(我重新创建了一些代码只是为了测试它):

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
}

您还可以查看http://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html 作为获取联系人照片的便捷提供商目录。还有一个例子。

于 2012-10-29T09:59:41.643 回答