我必须在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中一切正常。请帮忙。谢谢!