介绍

本篇用于介绍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的源码,可以点击下面的网址跳转查看和下载:

点击查看源码)

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

  1. 手机如何打开c语言文件类型,Android中如何使用代码打开各种类型的文件

    介绍 本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3.wav.ogg等).视频文件(3gp.mp4等).图片文件(jpg.png.gif等).安装包(apk).文档(txt. ...

  2. android中如何通过代码检测是否有root权限?

    2019独角兽企业重金招聘Python工程师标准>>> Android android中如何通过代码检测是否有root权限? while 3 票 1892 评论 (0) • 分享 • ...

  3. android中在java代码中设置Button按钮的背景颜色

    android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...

  4. python下载大文件mp4_Python代码打开本地.mp4格式文件的方法

    Python代码打开本地.mp4格式文件的方法 想通过编写Python代码来打开本地的.mp4格式文件,使用os模块来操作文件.我的电脑默认的是QQ影音播放器,执行Python代码打开默认播放器,播放 ...

  5. win10无法打开服务器文件类型,win10系统无法打开此类型的文件(.exe)的解决方法...

    很多小伙伴都遇到过win10系统无法打开此类型的文件(.exe)的困惑吧,一些朋友看过网上零散的win10系统无法打开此类型的文件(.exe)的处理方法,并没有完完全全明白win10系统无法打开此类型 ...

  6. Intent打开各种类型的文件

    需要用到Intent.setDataAndType(path,type)函数 模板: //android获取一个用于打开PPT文件的intent   public static Intent getP ...

  7. python读取mp4文件失败_Python代码打开本地.mp4格式文件的方法-mp4文件

    Python开发技术的应用相信有不少的小伙伴都有所了解,简单的说那就是非常的强大,Python开发技术的应用是非常广泛的,本篇文章扣丁学堂Python培训小编就给读者们分享一下Python代码打开本地 ...

  8. 解决win10系统不能打开.chm类型的文件

    1.查看C:\Windows\SysWOW64目录和C:\Windows\System32这两个目录下有没有hh.exe, hhctrl.ocx ,itss.dll ,itircl.dll 这些文件, ...

  9. Unity 调用Android中的java代码

    文章目录 1. Android 程序 2. Unity程序 3. 最佳实践 Unity与Android交互有多种方式,使用AndroidJavaClass和AndroidJavaObject是最为方便 ...

最新文章

  1. Java的File类
  2. Atitit.文件搜索工具 attilax 总结
  3. 青年生命科学论坛报告:扩增子和宏基因组数据分析与可视化流程—刘永鑫(北京210606)...
  4. 2019年,比特币现金爱好者线下见面会发展至6大洲30个国家
  5. (转)TinyXML Tutorial 中文指南
  6. 学习手记(2018.11.30~2019.6.6)——养老时间
  7. 医生的小助手,医疗AI赋能诊断新冠肺炎新方案!
  8. pat乙级相当于什么水平_曼彻斯特大学相当于国内什么水平的大学?
  9. 八卦图代码matlab,12行javascript代码绘制一个八卦图_javascript技巧
  10. Xshell、Xfpt 官方下载与使用介绍
  11. 数据:FIT2CLOUD飞致云连续进入云管理软件市场权威研究报告
  12. C语言拍皮球双重循环,山东理工大学ACM平台题答案关于C语言 1184 C语言实验——拍皮球...
  13. 市场部商业计划PPT模板
  14. 数论整理之费马小定理
  15. CDH安全认证及使用
  16. Mac | 使用 Wineskin 在 Mac 上运行 exe 程序
  17. 传统的企业如何实现数字化转型?
  18. 罗杨老师带你了解谷歌编程之夏(GSoC)活动全流程
  19. 【JAVA 学习笔记】HashMap 探究
  20. Yii学习--使用Yii来建立博客

热门文章

  1. python构建一个计算列表中位数的函数_python学习之数据科学库
  2. 谁浇了李彦宏一瓶冷水?
  3. 计算机维修工在哪考,了如指掌:计算机维修工证报名考试时间——报名入口
  4. 三阶齐次线性方程求通解_三阶常系数线性微分方程特解的简单求法
  5. PHP 中如何正确统计中文字数
  6. js中怎样把ASCII码中的字符与十进制的数相互转换-学习笔记
  7. 应用在汽车倒车影像中的环境光传感芯片
  8. xinxin -QQ登录界面
  9. Deep Retinex Decomposition for Low-Light Enhancement 论文阅读笔记
  10. 1927年12月31日午夜一秒谜案