使用Universal Image Loader加载联系人头像

3

我正在使用Uri加载联系人详细信息:

Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI, Uri.encode(mCurFilter))

在使用通用图像加载器时,一切都正常,直到我尝试加载联系人照片ContactsContract.Contacts.PHOTO_URI

ImageLoader.getInstance().displayImage(photoUri, mImageview);

我从联系人那里得到的照片Uri格式如下:

content://com.android.contacts/display_photo/2486

但是 UIL 无法加载这张图片,并显示以下错误:
java.lang.IllegalArgumentException: URI: content://com.android.contacts/display_photo/2486/photo,
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
            at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
            at android.content.ContentResolver.query(ContentResolver.java:478)
            at android.content.ContentResolver.query(ContentResolver.java:422)
            at android.provider.ContactsContract$Contacts.openContactPhotoInputStream(ContactsContract.java:2016)
            at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getContactPhotoStream(BaseImageDownloader.java:232)
            at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromContent(BaseImageDownloader.java:222)
            at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:92)
            at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.getImageStream(BaseImageDecoder.java:98)
            at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:74)
            at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:265)
            at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:238)
            at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:136)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

我在UIL中寻找了Uri格式,但未找到支持此类Uri的内容:
可接受的URI示例。
1个回答

0

我认为这是与Android-Universal-Image-Loader 1.9.2版本以下的问题,已经在此处报告UIL unable to load image when source is PHOTO_URI of contact

因此,根据Nostra13的说法,如果您使用旧版Universal Image Loader,则可以尝试扩展BaseImageDownloader并覆盖imageloader类中的getStreamFromContent(...)方法:

@Override
protected InputStream getStreamFromContent(String imageUri, Object extra) throws FileNotFoundException {
        ContentResolver res = context.getContentResolver();
        Uri uri = Uri.parse(imageUri);
        if (imageUri.startsWith("content://com.android.contacts/")) {
            return ContactsContract.Contacts.openContactPhotoInputStream(res, uri);
        } else {
            return res.openInputStream(uri);
        }
    }

这个问题已经在Android-Universal-Image-Loader 1.9.2中得到解决,所以您可以下载最新版本并在加载联系人图片时使用它。


我想要异步地完成它,并且为了避免内存异常,所以需要使用Universal Image Loader来完成。 - Shahzeb
正如我在答案中提到的,这是一个公开的漏洞,如果你遇到了任何问题,你可以在那里报告。同时,我也会查看它,并希望我能帮助你。 - King of Masses

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接