源码角度探究为什么ImageLoader无法加载含中文名称的视频缩略图


终于有空去解决这个问题了,以前一直以为这个库只能加载图片,其实视频的缩略图也是可以加载的,但是如果视频名称里有中文名,加载就会报错

之前项目比较忙,就不去计较,趁今天下班有点空,忍不住要去查查原因。下载源码研究,结论如下:

首先第一步读取文件:

protected InputStream getStreamFromFile(String imageUri, Object extra) throws IOException {
		String filePath = Scheme.FILE.crop(imageUri);
		// 关键在这里
		if (isVideoFileUri(imageUri)) {
			return getVideoThumbnailStream(filePath);
		} else {
			BufferedInputStream imageStream = new BufferedInputStream(new FileInputStream(filePath), BUFFER_SIZE);
			return new ContentLengthInputStream(imageStream, (int) new File(filePath).length());
		}
	}

然后现在进入 isvideouri 这个方法看看
private boolean isVideoFileUri(String uri) {
		String extension = MimeTypeMap.getFileExtensionFromUrl(uri);
		String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
		return mimeType != null && mimeType.startsWith("video/");
	}

问题就出在这里

 MimeTypeMap.getFileExtensionFromUrl(uri);

这个方法是不支持中文字符的,所以简单,只要复制源码再修改下, 自己实现这个方法,即可 参考如下:

public static String getFileExtensionFromUrl(String url) {
		if (!TextUtils.isEmpty(url)) {
			int fragment = url.lastIndexOf('#');
			if (fragment > 0) {
				url = url.substring(0, fragment);
			}

			int query = url.lastIndexOf('?');
			if (query > 0) {
				url = url.substring(0, query);
			}

			int filenamePos = url.lastIndexOf('/');
			String filename =
					0 <= filenamePos ? url.substring(filenamePos + 1) : url;

			// if the filename contains special characters, we don't
			// consider it valid for our matching purposes:
			if (!TextUtils.isEmpty(filename)) {
				int dotPos = filename.lastIndexOf('.');
				if (0 <= dotPos) {
					return filename.substring(dotPos + 1);
				}
			}
		}

		return "";
	}

参考了这位朋友的博客:http://blog.csdn.net/u012534158/article/details/51056313


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值