android检索联系人图像缩略图

时间:2013-05-05 19:31:41

标签: android universal-image-loader

我必须在listview中显示我的联系人的联系人缩略图,该列表视图具有自定义游标适配器实现。首先我使用asynctask并在doInBackground方法中使用以下代码片段来获取缩略图的位图。

Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
                        Long.parseLong(params[0]));
InputStream input = ContactsContract.Contacts
                        .openContactPhotoInputStream(
                                mContext.getContentResolver(), uri);
    if (input != null) {
       mThumb = BitmapFactory.decodeStream(input);
    } else {
          mThumb = defaultPhoto;
}

它为我提供了正确的位图。

后来,我开始了解Universal Image Loader。我实现了一个自定义BaseImageDownlaoder,如下面的代码片段所示。 `public class ContactImageDownloader扩展了BaseImageDownloader {

private static final String SCHEME_CONTACT_IMAGE = "content";
private static final String DB_URI_PREFIX = SCHEME_CONTACT_IMAGE + "://";
private Context mContext;

public ContactImageDownloader(Context context) {
    super(context);
    mContext = context;
}

@Override
protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {
    if (imageUri.startsWith(DB_URI_PREFIX)) {

        InputStream input = ContactsContract.Contacts
                .openContactPhotoInputStream(
                        mContext.getContentResolver(), Uri.parse(imageUri));

        ByteArrayOutputStream output = new ByteArrayOutputStream();

        if (input!=null) {
            IoUtils.copyStream(input, output);
        } else {
  //default image
            Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.wiresimage);
            bitmap.compress(CompressFormat.JPEG, BUFFER_SIZE, output);
        }

        byte[] imageData = output.toByteArray();
        input.close();
        return new ByteArrayInputStream(imageData);
    } else {
        return super.getStreamFromOtherSource(imageUri, extra);
    }
}`
}

但它无法检索图像。在日志中,它显示java.io.FileNotFoundException: File does not exist; URI: content://com.android.contacts/contacts/567, calling user: com.c 所以,现在为了验证我的实现(检查我的自定义BaseImageDownloader是否错误),我把我在asynctask的doInBackground方法中使用的代码片段放到游标适配器的bindView方法中。但仍然是,InputStream为null,即FileNotFoundException。但是在Asynctask中一切正常。请帮忙。谢谢!

0 个答案:

没有答案