介绍

本篇用于介绍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适配的博客,里面有介绍到该内容,博客地址:

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

手机如何打开c语言文件类型,Android中如何使用代码打开各种类型的文件相关推荐

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

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

  2. android 文件公有存储,如何将文件写入Android中的外部公共存储,以便从Windows中看到它们?...

    如何将文件写入Android中的外部公共存储,以便从Windows中看到它们? 我的应用程序应该将文件保存到一个地方,当您将手机/平板电脑连接到计算机时,您可以通过系统文件资源管理器看到它们. 这就是 ...

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

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

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

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

  5. Android 中 QQ 和 微信打开第三方应用

    获取当前浏览器 可以用 navigation.userAgent 来区分当前的运行环境(当前测试手机:vivo x20) QQ(Android) Mozilla/5.0 (Linux; Android ...

  6. Android创建无用文件,在Android中清理不必要的废料-空文件夹和无用的文件

    从Android清除不必要的碎片 本教程是什么(在android中清除不必要的废料)? 在android清洁教程中,我们解释了如何查找/删除,不再需要的文件(因为它们已由已卸载的应用程序留下)以及空文 ...

  7. Android中如何通过程序打开或关闭GPS

    手机应用中最酷的可能就是位置服务相关的了,如何读取GPS信息,在官方文档上有相当详细的说明,后面如果有机会,我也会专门写例子来介绍(教程已完成,请参见:教程:实现Android的不同精度的定位(基于网 ...

  8. android raw文件作用,Android 中raw和assets文件夹的区别

    Android 中raw和assets文件夹的区别 发布时间:2020-09-25 08:40:41 来源:脚本之家 阅读:103 作者:lqh Android 中raw和assets文件夹的区别 以 ...

  9. android layout 下添加xml文件,解决android中Layout文件下的xml文件配好后,R类中不能自动生成相应代码...

    为FaceBook审核提交模拟器包及自己验证模拟器包 为FaceBook审核提交模拟器包及自己验证模拟器包折腾了一番,因为我的项目是用cocoapods管理的,所以跟普通直接运行name.xcodep ...

最新文章

  1. 当你舌吻十秒后,下面就……
  2. ICLR要搞深度生成模型大讨论,Max Welling和AAAI百万美元大奖得主都来了,Bengio是组织者之一...
  3. php简单学生管理系统设计与实现,基于PHP的学生成绩管理系统的设计与实现.doc...
  4. BIO和NIO的区别
  5. java基础知识——基础语法
  6. Day2:C语言学习2
  7. java 错误代码2503_错误代码:11300001 数据集配置错误
  8. 27款优秀的Android逆向工程工具
  9. BIGWORLD问题集
  10. RCWL-0516微波雷达感应开关
  11. python将网页保存为pdf,利用Python将网页保存为PDF文件
  12. html鼠标悬停下划线消失,CSS3 2个实用的鼠标悬停文本下划线动画效果
  13. 相机像素尺寸(像元大小)和成像系统分辨率之间的关系
  14. for of 的基本用法
  15. MySQL按照字符排序,英文,中文,数字综合排序
  16. Spring实现`aop`过程
  17. Python Plt颜色配色一览(热力图)
  18. 简单的理解position与anchorPoint
  19. element-ui中的el-table-column加v-if不生效,表头错乱
  20. hash % n 为什么等于 (n - 1) hash

热门文章

  1. 苏格拉底与麦穗的故事
  2. 《寒门贵子》,一篇励志震撼的演讲稿
  3. 用户画像之基本属性信息
  4. 智慧楼宇联网智能门锁解决方案
  5. C++ cout输出小数位数
  6. 单调栈解木板倒水问题(单调栈的简单应用)
  7. 笔记本温度过高自动关机了
  8. 南通SEO给家乡带来了什么?
  9. 基于热敏电阻的数字温度计
  10. 最新版本dubbo-admin部署