Android中如何使用代码打开各种类型的文件
介绍
本篇用于介绍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);
}
打开文件的处理步骤如下:
- 截取得到文件的后缀名
- 根据后缀名判断对应的文件属于哪种DataType,调用对应产生封装好的intent的方法,获取到intent;
- 调用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中如何使用代码打开各种类型的文件相关推荐
- 手机如何打开c语言文件类型,Android中如何使用代码打开各种类型的文件
介绍 本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3.wav.ogg等).视频文件(3gp.mp4等).图片文件(jpg.png.gif等).安装包(apk).文档(txt. ...
- android中如何通过代码检测是否有root权限?
2019独角兽企业重金招聘Python工程师标准>>> Android android中如何通过代码检测是否有root权限? while 3 票 1892 评论 (0) • 分享 • ...
- android中在java代码中设置Button按钮的背景颜色
android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...
- python下载大文件mp4_Python代码打开本地.mp4格式文件的方法
Python代码打开本地.mp4格式文件的方法 想通过编写Python代码来打开本地的.mp4格式文件,使用os模块来操作文件.我的电脑默认的是QQ影音播放器,执行Python代码打开默认播放器,播放 ...
- win10无法打开服务器文件类型,win10系统无法打开此类型的文件(.exe)的解决方法...
很多小伙伴都遇到过win10系统无法打开此类型的文件(.exe)的困惑吧,一些朋友看过网上零散的win10系统无法打开此类型的文件(.exe)的处理方法,并没有完完全全明白win10系统无法打开此类型 ...
- Intent打开各种类型的文件
需要用到Intent.setDataAndType(path,type)函数 模板: //android获取一个用于打开PPT文件的intent public static Intent getP ...
- python读取mp4文件失败_Python代码打开本地.mp4格式文件的方法-mp4文件
Python开发技术的应用相信有不少的小伙伴都有所了解,简单的说那就是非常的强大,Python开发技术的应用是非常广泛的,本篇文章扣丁学堂Python培训小编就给读者们分享一下Python代码打开本地 ...
- 解决win10系统不能打开.chm类型的文件
1.查看C:\Windows\SysWOW64目录和C:\Windows\System32这两个目录下有没有hh.exe, hhctrl.ocx ,itss.dll ,itircl.dll 这些文件, ...
- Unity 调用Android中的java代码
文章目录 1. Android 程序 2. Unity程序 3. 最佳实践 Unity与Android交互有多种方式,使用AndroidJavaClass和AndroidJavaObject是最为方便 ...
最新文章
- Java的File类
- Atitit.文件搜索工具 attilax 总结
- 青年生命科学论坛报告:扩增子和宏基因组数据分析与可视化流程—刘永鑫(北京210606)...
- 2019年,比特币现金爱好者线下见面会发展至6大洲30个国家
- (转)TinyXML Tutorial 中文指南
- 学习手记(2018.11.30~2019.6.6)——养老时间
- 医生的小助手,医疗AI赋能诊断新冠肺炎新方案!
- pat乙级相当于什么水平_曼彻斯特大学相当于国内什么水平的大学?
- 八卦图代码matlab,12行javascript代码绘制一个八卦图_javascript技巧
- Xshell、Xfpt 官方下载与使用介绍
- 数据:FIT2CLOUD飞致云连续进入云管理软件市场权威研究报告
- C语言拍皮球双重循环,山东理工大学ACM平台题答案关于C语言 1184 C语言实验——拍皮球...
- 市场部商业计划PPT模板
- 数论整理之费马小定理
- CDH安全认证及使用
- Mac | 使用 Wineskin 在 Mac 上运行 exe 程序
- 传统的企业如何实现数字化转型?
- 罗杨老师带你了解谷歌编程之夏(GSoC)活动全流程
- 【JAVA 学习笔记】HashMap 探究
- Yii学习--使用Yii来建立博客