好的,我明白了。 ImageLoaderConfiguration
有一个选项,您可以传递一个图像解码器。
这是我如何更改初始化的方式:
ImageDecoder smartUriDecoder = new SmartUriDecoder(getContentResolver(), new BaseImageDecoder(false));
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.taskExecutor(ThreadPool.getExecutorService())
.defaultDisplayImageOptions(displayOptions)
.imageDecoder(smartUriDecoder)
.build();
还有SmartUriDecoder
类:
public class SmartUriDecoder implements ImageDecoder {
private final ContentResolver m_contentResolver;
private final BaseImageDecoder m_imageUriDecoder;
public SmartUriDecoder(ContentResolver contentResolver, BaseImageDecoder imageUriDecoder) {
if (imageUriDecoder == null) {
throw new NullPointerException("Image decoder can't be null");
}
m_contentResolver = contentResolver;
m_imageUriDecoder = imageUriDecoder;
}
@Override
public Bitmap decode(ImageDecodingInfo info) throws IOException {
if (TextUtils.isEmpty(info.getImageKey())) {
return null;
}
String cleanedUriString = cleanUriString(info.getImageKey());
Uri uri = Uri.parse(cleanedUriString);
if (isVideoUri(uri)) {
return makeVideoThumbnail(info.getTargetSize().getWidth(), info.getTargetSize().getHeight(), getVideoFilePath(uri));
}
else {
return m_imageUriDecoder.decode(info);
}
}
private Bitmap makeVideoThumbnail(int width, int height, String filePath) {
if (filePath == null) {
return null;
}
Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.MINI_KIND);
Bitmap scaledThumb = scaleBitmap(thumbnail, width, height);
thumbnail.recycle();
return scaledThumb;
}
private boolean isVideoUri(Uri uri) {
String mimeType = m_contentResolver.getType(uri);
return mimeType.startsWith("video/");
}
private String getVideoFilePath(Uri uri) {
String columnName = MediaStore.Video.VideoColumns.DATA;
Cursor cursor = m_contentResolver.query(uri, new String[] { columnName }, null, null, null);
try {
int dataIndex = cursor.getColumnIndex(columnName);
if (dataIndex != -1 && cursor.moveToFirst()) {
return cursor.getString(dataIndex);
}
}
finally {
cursor.close();
}
return null;
}
private Bitmap scaleBitmap(Bitmap origBitmap, int width, int height) {
float scale = Math.min(
((float)width) / ((float)origBitmap.getWidth()),
((float)height) / ((float)origBitmap.getHeight())
);
return Bitmap.createScaledBitmap(origBitmap,
(int)(((float)origBitmap.getWidth()) * scale),
(int)(((float)origBitmap.getHeight()) * scale),
false
);
}
private String cleanUriString(String contentUriWithAppendedSize) {
return contentUriWithAppendedSize.replaceFirst("_\\d+x\\d+$", "");
}
}
在UIL的文档中,它说
info.getImageKey()
将返回指定图像的原始URI,但末尾附加了一个大小,并且我找不到获取原始URI的方法。因此需要使用
cleanUriString()
来解决这个问题。
ThumbnailUtils.createVideoThumbnail()
会强制创建所有视频缩略图。但我不确定这个方法的工作原理,所以我可能是完全错误的。 - Daniel Gabriel