Android中如何使用代码打开各种类型的文件

来源:互联网 发布:红蜘蛛软件 编辑:程序博客网 时间:2024/06/05 14:36

介绍

本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3、wav、ogg等)、视频文件(3gp、mp4等)、图片文件(jpg、png、gif等)、安装包(apk)、文档(txt、doc、ppt、pdf、xls等),已经封装成工具类OpenFileUtils,末尾有源码地址。

注意

打开音乐、视频、图片、文档等文件是需要有读取SD卡的权限的,如果是6.0以下的系统,则直接在清单文件中声明SD卡读取权限即可;如果是6.0或以上,则需要动态申请权限。

为了兼容Android7.0,获取文件Uri需要使用到FileProvider,由于本篇只是介绍如何打开文件,就不再介绍如何使用FileProvider,不清楚的同学可以查看我写过的一篇关于Android7.0适配的博客,里面有介绍到该内容,博客地址:

http://blog.csdn.net/chay_chan/article/details/57083383

OpenFileUtils封装好的获取文件Uri的方法getUri()的代码为:

 /** * 获取对应文件的Uri * @param intent 相应的Intent * @param file 文件对象 * @return */private static Uri getUri(Intent intent, File file) {    Uri uri = null;    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {        //判断版本是否在7.0以上        uri =                FileProvider.getUriForFile(mContext,                        mContext.getPackageName() + ".fileprovider",                        file);        //添加这一句表示对目标应用临时授权该Uri所代表的文件        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);    } else {        uri = Uri.fromFile(file);    }    return uri;}

OpenFileUtils的使用

OpenFileUtils是封装好的用于打开本机各类文件的工具类,使用方式为:OpenFileUtils.getInstance(Context context).openFile(String filePath)。

各种文件的类型的DataType

DataType用于指定Intent中的数据类型,不同类型的文件有不同的DataType,传入相应类型的DataType,系统会搜寻可以打开该文件的软件,比如传入视频的DataType,即”video/*”,那么系统将会搜寻本机中可以播放视频的软件,如果没有安装其他视频播放软件,则系统会默认使用自带的播放视频软件,如果你还安装了其他视频播放软件,如手机QQ影音,那么就会弹出选择框让你选择使用哪个软件打开。

下面第一个DataType未指定明确的文件类型,那么此时系统会弹出所有可以打开文件的软件,需要用户自己判断使用哪个软件才可以打开。

/**声明各种类型文件的dataType**/private static final String DATA_TYPE_ALL = "*/*";//未指定明确的文件类型,不能使用精确类型的工具打开,需要用户选择private static final String DATA_TYPE_APK = "application/vnd.android.package-archive";private static final String DATA_TYPE_VIDEO = "video/*";private static final String DATA_TYPE_AUDIO = "audio/*";private static final String DATA_TYPE_HTML = "text/html";private static final String DATA_TYPE_IMAGE = "image/*";private static final String DATA_TYPE_PPT = "application/vnd.ms-powerpoint";private static final String DATA_TYPE_EXCEL = "application/vnd.ms-excel";private static final String DATA_TYPE_WORD = "application/msword";private static final String DATA_TYPE_CHM = "application/x-chm";private static final String DATA_TYPE_TXT = "text/plain";private static final String DATA_TYPE_PDF = "application/pdf";

打开文件的方法

/** * 打开文件 * @param filePath 文件的全路径,包括到文件名 */private static void openFile(String filePath) {    File file = new File(filePath);    if (!file.exists()){        //如果文件不存在        Toast.makeText(mContext, "打开失败,原因:文件已经被移动或者删除", Toast.LENGTH_SHORT).show();        return;    }    /* 取得扩展名 */    String end = file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length()).toLowerCase(Locale.getDefault());    /* 依扩展名的类型决定MimeType */    Intent intent = null;    if (end.equals("m4a") || end.equals("mp3") || end.equals("mid") || end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {        intent =  generateVideoAudioIntent(filePath,DATA_TYPE_AUDIO);    } else if (end.equals("3gp") || end.equals("mp4")) {        intent = generateVideoAudioIntent(filePath,DATA_TYPE_VIDEO);    } else if (end.equals("jpg") || end.equals("gif") || end.equals("png") || end.equals("jpeg") || end.equals("bmp")) {        intent = generateCommonIntent(filePath,DATA_TYPE_IMAGE);    } else if (end.equals("apk")) {        intent = generateCommonIntent(filePath,DATA_TYPE_APK);    }else if (end.equals("html") || end.equals("htm")){        intent = getHtmlFileIntent(filePath);    } else if (end.equals("ppt")) {        intent = generateCommonIntent(filePath,DATA_TYPE_PPT);    } else if (end.equals("xls")) {        intent = generateCommonIntent(filePath,DATA_TYPE_EXCEL);    } else if (end.equals("doc")) {        intent = generateCommonIntent(filePath,DATA_TYPE_WORD);    } else if (end.equals("pdf")) {        intent = generateCommonIntent(filePath,DATA_TYPE_PDF);    } else if (end.equals("chm")) {        intent = generateCommonIntent(filePath,DATA_TYPE_CHM);    } else if (end.equals("txt")) {        intent = generateCommonIntent(filePath, DATA_TYPE_TXT);    } else {        intent = generateCommonIntent(filePath,DATA_TYPE_ALL);    }    mContext.startActivity(intent);}   

打开文件的处理步骤如下:

  1. 截取得到文件的后缀名
  2. 根据后缀名判断对应的文件属于哪种DataType,调用对应产生封装好的intent的方法,获取到intent;
  3. 调用startActivity()方法,传入intent

其中,generateVideoAudioIntent(String filePath, String dataType)是产生打开视频和音频类型文件的Intent的方法,代码如下:

/** * 产生打开视频或音频的Intent * @param filePath 文件路径 * @param dataType 文件类型 * @return */ private static Intent generateVideoAudioIntent(String filePath, String dataType){    Intent intent = new Intent(Intent.ACTION_VIEW);    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);    intent.putExtra("oneshot", 0);    intent.putExtra("configchange", 0);    File file = new File(filePath);    intent.setDataAndType(getUri(intent,file), dataType);    return intent;}

generateHtmlFileIntent()是产生打开网页类型文件的Intent的方法,代码如下:

 /** * 产生打开网页文件的Intent * @param filePath 文件路径 * @return */private static Intent generateHtmlFileIntent(String filePath) {    Uri uri = Uri.parse(filePath)            .buildUpon()            .encodedAuthority("com.android.htmlfileprovider")            .scheme("content")            .encodedPath(filePath)            .build();    Intent intent = new Intent(Intent.ACTION_VIEW);    intent.setDataAndType(uri, DATA_TYPE_HTML);    return intent;}

打开其他类型文件的方法generateCommonIntent(String filePath, String dataType),代码如下:

/** * 产生除了视频、音频、网页文件外,打开其他类型文件的Intent * @param filePath 文件路径 * @param dataType 文件类型 * @return */private static Intent generateCommonIntent(String filePath, String dataType) {    Intent intent = new Intent();    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    intent.setAction(Intent.ACTION_VIEW);    File file = new File(filePath);    Uri uri = getUri(intent, file);    intent.setDataAndType(uri, dataType);    return intent;}

OpenFileUtils的源码,可以点击下面的网址跳转查看和下载:

点击查看源码)

原创粉丝点击