显示联系人的照片通过photo_ID联系人、照片、photo_ID

2023-09-06 16:41:32 作者:愚昧的笑

我允许用户选择在我的应用程序中的联系人,并且我展示它的主屏幕小部件,但不显示照片,我不知道什么是错。

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

这是我怎么显示出来:

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?

推荐答案

您正试图从 ContactsContract.Data 表格设置行的ID作为一个资源ID到您的的ImageView 。而且它肯定是行不通的。它甚至没有任何意义。

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.

例如,你可以使用这个code检索图像位图的行ID指向的帮助下对图像数据(我已经重新几张code只是为了测试它):

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
}

您还可以看到http://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html 为获取联系人的照片方便的供应商目录。有一个例子也是如此。

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.