正常情况
有的时候我们需要判断媒体文件类型,来进行相应操作
// item 就是 我们要判断的媒体文件的 path 或者 url
val type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(item))
打印 type 的值
07-25 12:23:45.971 5389-5389/com.r.parent E/stetho: /storage/emulated/0/Huawei/MagazineUnlock/magazine-unlock-hi817106.jpg
07-25 12:23:45.976 5389-5389/com.r.parent E/stetho: image/jpeg
07-25 12:23:45.978 5389-5389/com.r.parent E/stetho: /storage/emulated/0/Huawei/MagazineUnlock/magazine-unlock-hi817204.jpg
07-25 12:23:45.978 5389-5389/com.r.parent E/stetho: image/jpeg
07-25 12:23:45.979 5389-5389/com.r.parent E/stetho: /storage/emulated/0/Huawei/MagazineUnlock/magazine-unlock-hi845005.jpg
07-25 12:23:45.979 5389-5389/com.r.parent E/stetho: image/jpeg
07-25 12:24:00.826 5389-5389/com.r.parent E/stetho: /storage/emulated/0/DCIM/Camera/VID_20180612_175411.mp4
07-25 12:24:00.827 5389-5389/com.r E/stetho: video/mp4
兼容中文名(即vivo & oppo,写在 2019.1.28)
测试提了一个BUG,说 Vivo 机型有的图片上传失败。
经过分析,发现 系统截屏 的图片都上传失败,最后定位到Vivo截屏后生成的文件名含有中文
例如:/storage/emulated/0/截屏/截屏_20190124_153238.jpg
文件名为 截屏_20190124_153238.jpg,还有 超级截屏_20190124_153238.jpg 这种类型
通过查看源码,发现 MimeTypeMap.getFileExtensionFromUrl(String url) 方法里面有个正则判断,不支持中文,会返回空字符串,然后获取到的媒体类型为 null。报错。
源码如下:
/**
* Returns the file extension or an empty string iff there is no
* extension. This method is a convenience method for obtaining the
* extension of a url and has undefined results for other Strings.
* @param url
* @return The file extension of the given url.
*/
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 (!filename.isEmpty() &&
Pattern.matches("[a-zA-Z_0-9\\.\\-\\(\\)\\%]+", filename)) {
int dotPos = filename.lastIndexOf('.');
if (0 <= dotPos) {
return filename.substring(dotPos + 1);
}
}
}
return "";
}
灵机一动,我可以截取文件的格式,直接传入 getFileExtensionFromUrl(String url) 方法,试了一下,效果如下图:
兼容中文文件名 & 兼容Vivo
我们可以看到,主流的图片格式都是支持的!
所以,接下来的事情就简单了
1. 我们判断获取到的type为null,
2. 可以再进行一步校验,截取文件格式(即 . 后面的字符串),传入getFileExtensionFromUrl(String url)方法
3. 获取到对应的 type 即可
添加如下代码:
/**
* 兼容 Vivo ,兼容中文名 导致type为null
* 截取 文件的 文件格式(不包含 . ),再进行一次判断
*/
if (type == null) {
val format = item.substring(item.indexOf(".") + 1, item.length)
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(format)
}
xiang'mu代码:
var type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(item))
/**
* 兼容 Vivo ,兼容中文名 导致type为null
* 截取 文件的 文件格式(不包含 . ),再进行一次判断
*/
if (type == null) {
val format = item.substring(item.indexOf(".") + 1, item.length)
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(format)
}
if (type != null) {
if (type.contains("video")) {
MaxCountVideo--
} else if (type.contains("image")) {
MaxCountPic--
}
}