WebView中实现下载DownloadManager

来源:互联网 发布:mac os x与windows 编辑:程序博客网 时间:2024/06/06 20:29

WebView中实现下载

WebView本身是没有下载的,那如果要实现下载怎么办。WebView有个接口,一旦loadUrl发现无法render,一般是下载url, 通过setDownloadListener可以自己处理下载任务。
public void setDownloadListener (DownloadListener listener)
Registers the interface to be used when content can not be handled by the rendering engine, and should be downloaded instead. This will replace the current handler.

如果在setDownloadListener中自己处理下载任务,会发现下载Url请求了两遍,第一次是webview请求的,第二次是自己的下载任务请求的。

自己的下载任务处理,有两种方式: 1 : HttpClient 2: DownloadManager

DownloadManager

关于DownloadManager的文档参考http://www.trinea.cn/android/android-downloadmanager/

注意, DownloadManager下载request中如果没有文件名,那么request中就不太好设置指定存放下载文件目录(我至今没有找到合适的方法), 默认放在”下载” 目录下, 通过DownloadManager.query,可以得到很多属性,例如文件URI,记住这时下载的文件,是存在MediaStore数据库中了,所以里面的文件返回的文件URI格式为”content://”,如果希望现在文件路径,通过文件类型来打开文件,这时通过把Uri文件转化为File即可:

cursor = downloadManager.query(............);String filePath = cursor.getString(fileUriId);                        Uri fileUri = Uri.parse(filePath);                        fileCursor = context.getContentResolver().query(fileUri, new String[]{MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.MIME_TYPE}                                                            , null, null, null);                        if (fileCursor.moveToFirst()) {                            String disFilePath = fileCursor.getString(fileCursor.getColumnIndex(MediaStore.Files.FileColumns.DATA));                            String disFileType = fileCursor.getString(fileCursor.getColumnIndex(MediaStore.Files.FileColumns.MIME_TYPE));                            Toast.makeText(context, "文件下载到 :" + disFilePath, Toast.LENGTH_SHORT).show();                            Intent fileIntent = new Intent(Intent.ACTION_VIEW);                            fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                            fileIntent.setDataAndType(fileUri, disFileType);                            startActivity(fileIntent);                        }

WebView打开doc等形式文件

WebView没有解析这些文件 解析器,所以无法打开,因此需要通过Intent来打开三方的应用来打开这些文件。
如果在国外,可以使用google在线解析文档网站,url = google在线解析文档URL + 文件url , webview.load(url);

如果要在本应用中打开文件,而不希望借助三方应用或浏览器, 那么需要加入三方库,例如有内置PDF解析的三方库。

Cookie

在WebView与HttpClient之间对cookie进行持久化。
因为WebView本身不支持下载,所以下载URL需要其他方法来请求,如果下载URL 需要cookie (现在很多通过cookie来维持一个Session,达到登陆Session的效果),这个时候,需要把webview的cookie传导httpclient的Header中。

目前没有发现可以通过Intent来调用本地浏览器,还传给浏览器cookie的。 因为浏览器作为下载任务的话,非常好,浏览器下载文件比自己写的下载任务稳定多了,但是不能把Cookie传给浏览器,因此无法下载,那么久采用上述的两种方法。

如何打开下载好的文件

通过DownloadManager的Receiver,可以判断文件是否下载成功或者因为什么原因失败等, 如果下载成功,如何立马打开文件。打开文件最重要的是先得到文件的引用(File或Uri),然后得到文件类型。

public class DownloadRecevier extends BroadcastReceiver {        @SuppressLint("NewApi")        @Override        public void onReceive(Context context, Intent intent) {            long fileId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);            DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);            Cursor cursor = null;            Cursor fileCursor = null;            Query queryFilter = new Query();            queryFilter.setFilterById(fileId);            cursor = dm.query(queryFilter);            int fileUriId = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);            int reasonId = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);            String reasonTips = null;            if (cursor.moveToFirst()) {                int reason = cursor.getInt(reasonId);                switch (reason) {                    case DownloadManager.ERROR_DEVICE_NOT_FOUND:                        reasonTips = "为找到SD卡";                        break;                    case DownloadManager.ERROR_FILE_ALREADY_EXISTS:                        reasonTips = "文件已存在";                        break;                    case DownloadManager.ERROR_FILE_ERROR:                        reasonTips = "文件错误";                        break;                    case DownloadManager.ERROR_HTTP_DATA_ERROR:                        reasonTips = "网络错误";                        break;                    case DownloadManager.ERROR_INSUFFICIENT_SPACE:                        reasonTips = "内存空间不足";                        break;                    case DownloadManager.ERROR_UNKNOWN:                        reasonTips = "未知错误";                    default:                        break;                }                if (!TextUtils.isEmpty(reasonTips)) {                    Toast.makeText(context, reasonTips, Toast.LENGTH_SHORT).show();                } else {                    try {                    /*这里的filePath是文件保存在MediaStore中的数据库路径(content:// author / 表名 / 其他path)   */                        String filePath = cursor.getString(fileUriId);                        Uri fileUri = Uri.parse(filePath);                        /*通过查找MediaStore,可以得到文件的具体信息,包括文件存储路径(DATA字段)*/                        fileCursor = context.getContentResolver().query(fileUri, new String[]{MediaStore.Files.FileColumns.DATA}                                , null, null, null);                        if (fileCursor.moveToFirst()) {                            String disFilePath = fileCursor.getString(fileCursor.getColumnIndex(MediaStore.Files.FileColumns.DATA));                            String fileType = MimeTypes.getMimeType(disFilePath);                            Intent fileIntent = new Intent(Intent.ACTION_VIEW);                            fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                            fileIntent.setDataAndType(Uri.fromFile(new File(disFilePath)), fileType);                            startActivity(fileIntent);                        }                    } catch (ActivityNotFoundException e) {                        Toast.makeText(context, "请安装可以打开该文件格式的第三方应用", Toast.LENGTH_SHORT).show();                    }                 }                if (cursor != null) {                    cursor.close();                }                if (fileCursor != null) {                    fileCursor.close();                }            }        }    }

注意: setDataAndType时,不要把fileUri传入setDataAndType, 因为fileUri是Uri(content:// 形式的),而disFilePath是文件绝对路径,并不是在MediaStore数据库中的路径。也就是说setDataAndType识别绝对路劲的File。
另外在部分android机型,setDataAndType可以传入fileUri(content:// 形式),可以正确打开文件。但是有部分机型,不能正确打开文件,或者打开的界面模式不是你想要的,例如图片无法正确打开,例如doc文件使用wps打开时,出现wps主页面,而不是文件的阅读页面。
总的来说,最靠谱的做法,是使用绝得路径的文件Uri,使用Intent来打开,才是正确的。

根据文件,得到文件mimeType

public final class MimeTypes {    public static final String ALL_MIME_TYPES = "*/*";    private static final HashMap<String, Integer> EXT_ICONS = new HashMap<String, Integer>();    private static final HashMap<String, String> MIME_TYPES = new HashMap<String, String>();    static {          /**           * 把文件扩展名映射到对应文件类型的图标           */          // BINARY//        EXT_ICONS.put("a", R.drawable.type_unknown);//        EXT_ICONS.put("bin", R.drawable.type_unknown);//        EXT_ICONS.put("class", R.drawable.type_unknown);//        EXT_ICONS.put("com", R.drawable.type_unknown);//        EXT_ICONS.put("dex", R.drawable.type_unknown);//        EXT_ICONS.put("dump", R.drawable.type_unknown);//        EXT_ICONS.put("exe", R.drawable.type_unknown);//        EXT_ICONS.put("dat", R.drawable.type_unknown);//        EXT_ICONS.put("dll", R.drawable.type_unknown);//        EXT_ICONS.put("lib", R.drawable.type_unknown);//        EXT_ICONS.put("o", R.drawable.type_unknown);//        EXT_ICONS.put("obj", R.drawable.type_unknown);//        EXT_ICONS.put("pyc", R.drawable.type_unknown);//        EXT_ICONS.put("pyo", R.drawable.type_unknown);//        EXT_ICONS.put("ser", R.drawable.type_unknown);//        EXT_ICONS.put("swf", R.drawable.type_unknown);//        EXT_ICONS.put("so", R.drawable.type_unknown);//  //        // Shell//        EXT_ICONS.put("bar", R.drawable.type_unknown);//        EXT_ICONS.put("csh", R.drawable.type_unknown);//        EXT_ICONS.put("ksh", R.drawable.type_unknown);//        EXT_ICONS.put("sh", R.drawable.type_unknown);//  //        // TEXT//        EXT_ICONS.put("csv", R.drawable.type_note);//        EXT_ICONS.put("diff", R.drawable.type_note);//        EXT_ICONS.put("in", R.drawable.type_note);//        EXT_ICONS.put("list", R.drawable.type_note);//        EXT_ICONS.put("log", R.drawable.type_note);//        EXT_ICONS.put("rc", R.drawable.type_note);//        EXT_ICONS.put("text", R.drawable.type_note);//        EXT_ICONS.put("txt", R.drawable.type_note);//        EXT_ICONS.put("tsv", R.drawable.type_note);//  //        // Properties//        EXT_ICONS.put("properties", R.drawable.type_config);//        EXT_ICONS.put("conf", R.drawable.type_config);//        EXT_ICONS.put("config", R.drawable.type_config);//        EXT_ICONS.put("prop", R.drawable.type_config);//  //        // HTML//        EXT_ICONS.put("htm", R.drawable.type_html);//        EXT_ICONS.put("html", R.drawable.type_html);//        EXT_ICONS.put("mhtml", R.drawable.type_html);//        EXT_ICONS.put("xhtml", R.drawable.type_html);//  //        // XML//        EXT_ICONS.put("xml", R.drawable.type_xml);//        EXT_ICONS.put("mxml", R.drawable.type_xml);//  //        // DOCUMENT//        EXT_ICONS.put("doc", R.drawable.type_note);//        EXT_ICONS.put("docx", R.drawable.type_note);//        EXT_ICONS.put("odp", R.drawable.type_note);//        EXT_ICONS.put("odt", R.drawable.type_note);//        EXT_ICONS.put("rtf", R.drawable.type_note);//        EXT_ICONS.put("ods", R.drawable.type_note);//        EXT_ICONS.put("xls", R.drawable.type_note);//        EXT_ICONS.put("xlsx", R.drawable.type_note);//  //        // Presentation//        EXT_ICONS.put("ppt", R.drawable.type_note);//        EXT_ICONS.put("pptx", R.drawable.type_note);//  //        // PDF//        EXT_ICONS.put("pdf", R.drawable.type_pdf);//        EXT_ICONS.put("fdf", R.drawable.type_pdf);//        EXT_ICONS.put("ldwf", R.drawable.type_pdf);//  //        // Package//        EXT_ICONS.put("ace", R.drawable.type_package);//        EXT_ICONS.put("bz", R.drawable.type_package);//        EXT_ICONS.put("bz2", R.drawable.type_package);//        EXT_ICONS.put("cab", R.drawable.type_package);//        EXT_ICONS.put("cpio", R.drawable.type_package);//        EXT_ICONS.put("gz", R.drawable.type_package);//        EXT_ICONS.put("lha", R.drawable.type_package);//        EXT_ICONS.put("lrf", R.drawable.type_package);//        EXT_ICONS.put("lzma", R.drawable.type_package);//        EXT_ICONS.put("rar", R.drawable.type_package);//        EXT_ICONS.put("tar", R.drawable.type_package);//        EXT_ICONS.put("tgz", R.drawable.type_package);//        EXT_ICONS.put("xz", R.drawable.type_package);//        EXT_ICONS.put("zip", R.drawable.type_package);//        EXT_ICONS.put("Z", R.drawable.type_package);//        EXT_ICONS.put("7z", R.drawable.type_package);//        EXT_ICONS.put("rar", R.drawable.type_package);//        EXT_ICONS.put("tar", R.drawable.type_package);//        EXT_ICONS.put("jar", R.drawable.type_package);//  //        // Image//        EXT_ICONS.put("bmp", R.drawable.type_pic);//        EXT_ICONS.put("cgm", R.drawable.type_pic);//        EXT_ICONS.put("g3", R.drawable.type_pic);//        EXT_ICONS.put("gif", R.drawable.type_pic);//        EXT_ICONS.put("ief", R.drawable.type_pic);//        EXT_ICONS.put("jpe", R.drawable.type_pic);//        EXT_ICONS.put("jpeg", R.drawable.type_pic);//        EXT_ICONS.put("jpg", R.drawable.type_pic);//        EXT_ICONS.put("png", R.drawable.type_pic);//        EXT_ICONS.put("btif", R.drawable.type_pic);//        EXT_ICONS.put("svg", R.drawable.type_pic);//        EXT_ICONS.put("svgz", R.drawable.type_pic);//        EXT_ICONS.put("tif", R.drawable.type_pic);//        EXT_ICONS.put("tiff", R.drawable.type_pic);//        EXT_ICONS.put("psd", R.drawable.type_pic);//        EXT_ICONS.put("dwg", R.drawable.type_pic);//        EXT_ICONS.put("dxf", R.drawable.type_pic);//        EXT_ICONS.put("fbs", R.drawable.type_pic);//        EXT_ICONS.put("fpx", R.drawable.type_pic);//        EXT_ICONS.put("fst", R.drawable.type_pic);//        EXT_ICONS.put("mmr", R.drawable.type_pic);//        EXT_ICONS.put("rlc", R.drawable.type_pic);//        EXT_ICONS.put("mdi", R.drawable.type_pic);//        EXT_ICONS.put("npx", R.drawable.type_pic);//        EXT_ICONS.put("wbmp", R.drawable.type_pic);//        EXT_ICONS.put("xif", R.drawable.type_pic);//        EXT_ICONS.put("ras", R.drawable.type_pic);//        EXT_ICONS.put("ico", R.drawable.type_pic);//        EXT_ICONS.put("pcx", R.drawable.type_pic);//        EXT_ICONS.put("pct", R.drawable.type_pic);//        EXT_ICONS.put("pic", R.drawable.type_pic);//        EXT_ICONS.put("xbm", R.drawable.type_pic);//        EXT_ICONS.put("xwd", R.drawable.type_pic);//        EXT_ICONS.put("bpg", R.drawable.type_pic);//  //        // Audio//        EXT_ICONS.put("aac", R.drawable.type_music);//        EXT_ICONS.put("adp", R.drawable.type_music);//        EXT_ICONS.put("aif", R.drawable.type_music);//        EXT_ICONS.put("aifc", R.drawable.type_music);//        EXT_ICONS.put("aiff", R.drawable.type_music);//        EXT_ICONS.put("amr", R.drawable.type_music);//        EXT_ICONS.put("ape", R.drawable.type_music);//        EXT_ICONS.put("au", R.drawable.type_music);//        EXT_ICONS.put("dts", R.drawable.type_music);//        EXT_ICONS.put("eol", R.drawable.type_music);//        EXT_ICONS.put("flac", R.drawable.type_music);//        EXT_ICONS.put("kar", R.drawable.type_music);//        EXT_ICONS.put("lvp", R.drawable.type_music);//        EXT_ICONS.put("m2a", R.drawable.type_music);//        EXT_ICONS.put("m3a", R.drawable.type_music);//        EXT_ICONS.put("m3u", R.drawable.type_music);//        EXT_ICONS.put("m4a", R.drawable.type_music);//        EXT_ICONS.put("mid", R.drawable.type_music);//        EXT_ICONS.put("mid", R.drawable.type_music);//        EXT_ICONS.put("mka", R.drawable.type_music);//        EXT_ICONS.put("mp2", R.drawable.type_music);//        EXT_ICONS.put("mp3", R.drawable.type_music);//        EXT_ICONS.put("mpga", R.drawable.type_music);//        EXT_ICONS.put("oga", R.drawable.type_music);//        EXT_ICONS.put("ogg", R.drawable.type_music);//        EXT_ICONS.put("pya", R.drawable.type_music);//        EXT_ICONS.put("ram", R.drawable.type_music);//        EXT_ICONS.put("rmi", R.drawable.type_music);//        EXT_ICONS.put("snd", R.drawable.type_music);//        EXT_ICONS.put("spx", R.drawable.type_music);//        EXT_ICONS.put("wav", R.drawable.type_music);//        EXT_ICONS.put("wax", R.drawable.type_music);//        EXT_ICONS.put("wma", R.drawable.type_music);//  //        // Video//        EXT_ICONS.put("3gp", R.drawable.type_video);//        EXT_ICONS.put("3gpp", R.drawable.type_video);//        EXT_ICONS.put("3g2", R.drawable.type_video);//        EXT_ICONS.put("3gpp2", R.drawable.type_video);//        EXT_ICONS.put("h261", R.drawable.type_video);//        EXT_ICONS.put("h263", R.drawable.type_video);//        EXT_ICONS.put("h264", R.drawable.type_video);//        EXT_ICONS.put("jpgv", R.drawable.type_video);//        EXT_ICONS.put("jpgm", R.drawable.type_video);//        EXT_ICONS.put("jpm", R.drawable.type_video);//        EXT_ICONS.put("mj2", R.drawable.type_video);//        EXT_ICONS.put("mp4", R.drawable.type_video);//        EXT_ICONS.put("mp4v", R.drawable.type_video);//        EXT_ICONS.put("mpg4", R.drawable.type_video);//        EXT_ICONS.put("m1v", R.drawable.type_video);//        EXT_ICONS.put("m2v", R.drawable.type_video);//        EXT_ICONS.put("mpa", R.drawable.type_video);//        EXT_ICONS.put("mpe", R.drawable.type_video);//        EXT_ICONS.put("mpg", R.drawable.type_video);//        EXT_ICONS.put("mpeg", R.drawable.type_video);//        EXT_ICONS.put("ogv", R.drawable.type_video);//        EXT_ICONS.put("mov", R.drawable.type_video);//        EXT_ICONS.put("qt", R.drawable.type_video);//        EXT_ICONS.put("fvt", R.drawable.type_video);//        EXT_ICONS.put("m4u", R.drawable.type_video);//        EXT_ICONS.put("pyv", R.drawable.type_video);//        EXT_ICONS.put("viv", R.drawable.type_video);//        EXT_ICONS.put("f4v", R.drawable.type_video);//        EXT_ICONS.put("fli", R.drawable.type_video);//        EXT_ICONS.put("flv", R.drawable.type_video);//        EXT_ICONS.put("m4v", R.drawable.type_video);//        EXT_ICONS.put("asf", R.drawable.type_video);//        EXT_ICONS.put("asx", R.drawable.type_video);//        EXT_ICONS.put("avi", R.drawable.type_video);//        EXT_ICONS.put("wmv", R.drawable.type_video);//        EXT_ICONS.put("wmx", R.drawable.type_video);//        EXT_ICONS.put("mkv", R.drawable.type_video);//  //        // Application//        EXT_ICONS.put("apk", R.drawable.type_apk);        /*         * 把文件扩展名映射到对应的文件mimeType         */        MIME_TYPES.put("asm", "text/x-asm");        MIME_TYPES.put("def", "text/plain");        MIME_TYPES.put("in", "text/plain");        MIME_TYPES.put("rc", "text/plain");        MIME_TYPES.put("list", "text/plain");        MIME_TYPES.put("log", "text/plain");        MIME_TYPES.put("pl", "text/plain");        MIME_TYPES.put("prop", "text/plain");        MIME_TYPES.put("properties", "text/plain");        MIME_TYPES.put("rc", "text/plain");        MIME_TYPES.put("epub", "application/epub+zip");        MIME_TYPES.put("ibooks", "application/x-ibooks+zip");        MIME_TYPES.put("ifb", "text/calendar");        MIME_TYPES.put("eml", "message/rfc822");        MIME_TYPES.put("msg", "application/vnd.ms-outlook");        MIME_TYPES.put("ace", "application/x-ace-compressed");        MIME_TYPES.put("bz", "application/x-bzip");        MIME_TYPES.put("bz2", "application/x-bzip2");        MIME_TYPES.put("cab", "application/vnd.ms-cab-compressed");        MIME_TYPES.put("gz", "application/x-gzip");        MIME_TYPES.put("lrf", "application/octet-stream");        MIME_TYPES.put("jar", "application/java-archive");        MIME_TYPES.put("xz", "application/x-xz");        MIME_TYPES.put("Z", "application/x-compress");        MIME_TYPES.put("bat", "application/x-msdownload");        MIME_TYPES.put("ksh", "text/plain");        MIME_TYPES.put("sh", "application/x-sh");        MIME_TYPES.put("db", "application/octet-stream");        MIME_TYPES.put("db3", "application/octet-stream");        MIME_TYPES.put("otf", "x-font-otf");        MIME_TYPES.put("ttf", "x-font-ttf");        MIME_TYPES.put("psf", "x-font-linux-psf");        MIME_TYPES.put("cgm", "image/cgm");        MIME_TYPES.put("btif", "image/prs.btif");        MIME_TYPES.put("dwg", "image/vnd.dwg");        MIME_TYPES.put("dxf", "image/vnd.dxf");        MIME_TYPES.put("fbs", "image/vnd.fastbidsheet");        MIME_TYPES.put("fpx", "image/vnd.fpx");        MIME_TYPES.put("fst", "image/vnd.fst");        MIME_TYPES.put("mdi", "image/vnd.ms-mdi");        MIME_TYPES.put("npx", "image/vnd.net-fpx");        MIME_TYPES.put("xif", "image/vnd.xiff");        MIME_TYPES.put("pct", "image/x-pict");        MIME_TYPES.put("pic", "image/x-pict");        MIME_TYPES.put("adp", "audio/adpcm");        MIME_TYPES.put("au", "audio/basic");        MIME_TYPES.put("snd", "audio/basic");        MIME_TYPES.put("m2a", "audio/mpeg");        MIME_TYPES.put("m3a", "audio/mpeg");        MIME_TYPES.put("oga", "audio/ogg");        MIME_TYPES.put("spx", "audio/ogg");        MIME_TYPES.put("aac", "audio/x-aac");        MIME_TYPES.put("mka", "audio/x-matroska");        MIME_TYPES.put("jpgv", "video/jpeg");        MIME_TYPES.put("jpgm", "video/jpm");        MIME_TYPES.put("jpm", "video/jpm");        MIME_TYPES.put("mj2", "video/mj2");        MIME_TYPES.put("mjp2", "video/mj2");        MIME_TYPES.put("mpa", "video/mpeg");        MIME_TYPES.put("ogv", "video/ogg");        MIME_TYPES.put("flv", "video/x-flv");        MIME_TYPES.put("mkv", "video/x-matroska");    }    /**     * 根据扩展名得到对应的文件图标     * @param ext  文件扩展名     * @return   文件图标     */    public static int getIconForExt(String ext) {        final Integer res = EXT_ICONS.get(ext);        return res == null ? 0 : res;    }    /**     * 根据File, 得到对应的mimeType     * @param file   文件     * @return   file对应的mimeType     */    public static String getMimeType(File file) {        if (!file.exists() || file.isDirectory()) {            return null;        }        String type = null;        final String extension = getExtFromFilePath(file.getName());       /*注意有些文件扩展名使用getMimeTypeFromExtension是没有mimeType的, 因此这里会在MIME_TYPES中进行补充,例如邮件扩展名eml*/        if (extension != null && !extension.isEmpty()) {            final String extensionLowerCase = extension.toLowerCase(Locale                    .getDefault());            final MimeTypeMap mime = MimeTypeMap.getSingleton();            type = mime.getMimeTypeFromExtension(extensionLowerCase);            if (TextUtils.isEmpty(type)) {                type = MIME_TYPES.get(extensionLowerCase);            }        }        return type;    }    /**     * 根据文件路径, 得到对应的mimeType     * @param file   文件     * @return   file对应的mimeType     */    public static String getMimeType(String filePath) {        File file = new File(filePath);        return getMimeType(file);    }    public static String getExtFromFilePath(String filePath) {        int suffixIndex = filePath.lastIndexOf(".");        return suffixIndex >= 0 && suffixIndex < filePath.length() - 1 ? filePath.substring(suffixIndex + 1).toLowerCase() : "";    }    private static boolean mimeTypeMatch(String mime, String input) {        return Pattern.matches(mime.replace("*", ".*"), input);    }    public static boolean isPicture(File f) {        final String mime = getMimeType(f);        return mime != null && mimeTypeMatch("image/*", mime);    }    public static boolean isVideo(File f) {        final String mime = getMimeType(f);        return mime != null && mimeTypeMatch("video/*", mime);    }}
0 0
原创粉丝点击