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

正常情况

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

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

Android 判断媒体类型(video?image?or ?)& 兼容Vivo(中文文件名)_第1张图片
兼容中文文件名 & 兼容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--
            }
        }

你可能感兴趣的:(Android 判断媒体类型(video?image?or ?)& 兼容Vivo(中文文件名))