问题 如何获取Android Contact缩略图


我有一个 listview 适配器,我正在尝试以下内容 newView 方法:

@Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);

        long contactId = Long.valueOf(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))); 
        String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
        boolean hasPhone = Boolean.parseBoolean(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); 
        String thumbnailUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); 

        TextView name_text = (TextView) v.findViewById(R.id.name_entry);
        if (name_text != null) {
            name_text.setText(contactName);
        }

        name_text.setTag(new Contact(contactId, hasPhone));

        ImageView thumbnail = (ImageView) v.findViewById(R.id.thumbnail);
        if (thumbnailUri != null) {
            thumbnail.setImageURI(Uri.parse(thumbnailUri));
        } else {
            thumbnail.setImageResource(R.drawable.ic_launcher);
        }

        return v;
    }

但是当我尝试解析存储在thumbnailUri中的Uri时,我收到以下错误:

   08-09 01:58:38.619: I/System.out(1471): resolveUri failed on bad bitmap uri: content://com.android.contacts/contacts/1/photo

我是以错误的方式来做这件事的吗?任何帮助将不胜感激!


4004
2017-08-08 14:01


起源

你能在那里放一个logcat信息来查看你要解决的URI是什么并将其发布在这里吗? Log.i(“URI”,thumbnailUri); - RyanInBinary
内容://com.android.contacts/contacts/1/photo,我认为是正确的。也许只是因为我正在使用模拟器。我需要一个真正的设备:/ - Bradley Campbell
让自己成为一个真正的设备。这有效,我的代码很好。 - Bradley Campbell


答案:


private Uri getPhotoUriFromID(String id) {
    try {
        Cursor cur = getContentResolver()
                .query(ContactsContract.Data.CONTENT_URI,
                        null,
                        ContactsContract.Data.CONTACT_ID
                                + "="
                                + id
                                + " 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
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    Uri person = ContentUris.withAppendedId(
            ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
    return Uri.withAppendedPath(person,
            ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
}

这是您需要传递联系人ID的功能,您将获得可以在imageview中轻松设置的图像的URI。

使用此函数的响应uri,如imageView.setImageURI(uri)

希望它适用于您的代码。


12
2017-08-08 14:21



尝试了这个,并且它返回了与我已经获得的相同的Uri(内容://com.android.contacts/contacts/1/photo)。我仍然收到相同的错误消息。 - Bradley Campbell
那里有两个联系人ID。一个是联系人ID,另一个是原始联系人ID,你提供给哪个id函数?它可能是id的问题,所以它没有得到Uri。 - Rushabh Patel
还试过这个: String stringUri = imageUri.getPath(); //works  String stringUri = imageUri.toString(); //does not work  i.setImageURI(Uri.parse(stringUri));  它可能适合你。因为我的代码功能正常工作。 - Rushabh Patel
原来这只是与使用模拟器有关。对此感到抱歉,感谢您的帮助。如果没有你的帮助,我会一直认为我的代码是错的:) - Bradley Campbell
此方法返回一个小图像而不是一个大图像。我如何检索大图像而不是小图像? - George Panayi