android 类型判断,Android 判断媒体类型(video?image?or ?)& 兼容Vivo(中文文件名)...

博客介绍了如何在Android中判断媒体文件(如图片、视频)的类型,特别是在遇到Vivo手机中文文件名时出现的类型判断问题。通过分析并解决MimeTypeMap.getFileExtensionFromUrl()方法对中文文件名支持不足的问题,提出了截取文件格式进行二次判断的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正常情况

有的时候我们需要判断媒体文件类型,来进行相应操作

// 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) 方法,试了一下,效果如下图:

3d056e02bc6d

兼容中文文件名 & 兼容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--

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值