版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

主要用于通过Intent调用手机本地软件打开文件(doc、xsl、pdf、ppt、mp3、mp4等格式)、安装apk、发送邮件、拨打电话、发送短信、打开地图。

因为需要用到android.permission.READ_EXTERNAL_STORAGE权限,所以依赖《Android6.0运行时权限(基于RxPermission开源库)》。

效果图

代码分析

对打开各种后缀的文件的Intent进行封装。

目前打开HTML文件有点儿问题。

使用步骤

一、项目组织结构图

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将IntentActionUtil复制到项目中

package com.why.project.intentactionutildemo.utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri; import java.io.File;
import java.util.List; /**
* Create By HaiyuKing
* Used Intent的常见作用的工具类(以前叫AndroidFileUtil)
* 参考资料 http://blog.csdn.net/chaoyu168/article/details/50778016
* http://www.2cto.com/kf/201210/162045.html
* http://blog.csdn.net/shlpyy/article/details/8706751
* http://www.cnblogs.com/simov/p/3761243.html
* http://blog.csdn.net/wangyang2698341/article/details/20847469
*/
@SuppressLint("DefaultLocale")
public class IntentActionUtil { /**
* 打开指定类型的文件的Intent
* param - filePath : 文件路径:例如,*/
public static Intent openFileIntent(String filePath) {
if(isFileExit(filePath)){
String endName = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length()).toLowerCase();//后缀名
/* 依扩展名的类型决定MimeType */
if (endName.equals("m4a") || endName.equals("mp3") || endName.equals("mid") ||
endName.equals("xmf") || endName.equals("ogg") || endName.equals("wav") || endName.equals("amr")) {
return getAudioFileIntent(filePath);//播放音频
} else if (endName.equals("3gp") || endName.equals("mp4")) {
return getVideoFileIntent(filePath);//播放视频
} else if (endName.equals("jpg") || endName.equals("gif") || endName.equals("png") ||
endName.equals("jpeg") || endName.equals("bmp")) {
return getImageFileIntent(filePath);//打开图片
} else if (endName.equals("apk")) {
return getApkFileIntent(filePath);//安装软件
} else if (endName.equals("ppt") || endName.equals("pptx")) {
return getPptFileIntent(filePath);//打开PPT文档
} else if (endName.equals("xls") || endName.equals("xlsx")) {
return getExcelFileIntent(filePath);//打开excel文档
} else if (endName.equals("doc") || endName.equals("docx")) {
return getWordFileIntent(filePath);//打开doc文档
} else if (endName.equals("pdf")) {
return getPdfFileIntent(filePath);//打开PDF文档
} else if (endName.equals("chm")) {
return getChmFileIntent(filePath);//打开CHM文档
} else if (endName.equals("txt")) {
return getTextFileIntent(filePath);//打开txt文档
} else if (endName.equals("zip")) {
return getZipFileIntent(filePath);//打开zip压缩包
} else if (endName.equals("rar")) {
return getRarFileIntent(filePath);//打开rar压缩包
} else if (endName.equals("html") || endName.equals("htm")) {
return getHtmlFileIntent(filePath);//打开html文件
}else {
return getAllIntent(filePath);//打开其他的文件
}
}else{
return null;
}
} /**
* 调用发邮件的Intent
* param sendToEmail - 邮件主送人的地址
* return
*/
public static Intent getEmailIntent(String sendToEmail) {
Uri emailUri = Uri.parse(sendToEmail);
Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);
return intent;
}
/**
* 调用浏览器打开网页的Intent
*
* param url - 网址:例如,http://www.baidu.com
* return
*/
public static Intent getWebViewIntent(String url) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
return intent;
} /**
* 调用地图软件显示地图定位的Intent
* param x - 定位X坐标:116.398064
* param y - 定位Y坐标:39.913703
* return
*/
public static Intent getMapViewIntent(double x,double y) {
Uri uri = Uri.parse("geo:"+x+","+y);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
return intent;
} /**
* 打开拨号程序,拨打电话的Intent
*
* param telphoneNum - 电话号码
* return
*/
public static Intent getPhoneIntent(String telphoneNum) {
Uri uri = Uri.parse("tel:" + telphoneNum);
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
return intent;
} /**
* 打开短信程序,发送短信的Intent
*
* param telphoneNum - 电话号码
* param smsBody - 短信内容文本
* return
*/
public static Intent getSMSIntent(String telphoneNum,String smsBody) {
Uri uri = Uri.parse("smsto:" + telphoneNum);
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body",smsBody);
return intent;
} /**
* Android获取一个用于打开VIDEO(视频)文件的intent
*/
private static Intent getVideoFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("oneshot", 0);
intent.putExtra("configchange", 0);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "video/*");
return intent;
} /**
* Android获取一个用于打开AUDIO(音频)文件的intent
*/
private static Intent getAudioFileIntent(String param) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("oneshot", 0);
intent.putExtra("configchange", 0);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "audio/*");
return intent;
} /**
* Android获取一个用于打开图片文件的intent
*/
private static Intent getImageFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "image/*");
return intent;
} /**
* Android获取一个用于安装APK文件的intent
*/
private static Intent getApkFileIntent(String filePath) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/vnd.android.package-archive");
return intent;
} /**
* Android获取一个用于打开PPT文件的intent
*/
private static Intent getPptFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
return intent;
}
/**
* Android获取一个用于打开Excel文件的intent
*/
private static Intent getExcelFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/vnd.ms-excel");
return intent;
}
/**
* Android获取一个用于打开Word文件的intent
*/
private static Intent getWordFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/msword");
return intent;
} /**
* Android获取一个用于打开PDF文件的intent
*/
private static Intent getPdfFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/pdf");
return intent;
} /**
* Android获取一个用于打开CHM文件的intent
*/
private static Intent getChmFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/x-chm");
return intent;
} /**
* Android获取一个用于打开文本文件的intent
*/
private static Intent getTextFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "text/plain");
return intent;
} /**
* Android获取一个用于打开ZIP文件的intent
*/
private static Intent getZipFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/zip");
return intent;
}
/**
* Android获取一个用于打开Rar文件的intent
*/
private static Intent getRarFileIntent(String filePath) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "application/rar");
return intent;
} /**
* Android获取一个用于打开Html文件的intent【有点儿问题,无法实现选择浏览器查看预览效果,且在Android6.0上无法通过“HTML查看程序”进行查看】
*/
private static Intent getHtmlFileIntent(String filePath) {
Uri uri = Uri.parse(filePath).buildUpon().encodedAuthority("com.android.htmlfileprovider")
.scheme("content").encodedPath(filePath).build();//content://com.android.htmlfileprovider/storage/emulated/0/intentFile/htmldemo.html
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setDataAndType(uri, "text/html");
return intent;
} /**
* Android获取一个用于打开任意文件的intent
*/
private static Intent getAllIntent(String filePath) { Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(filePath));
intent.setDataAndType(uri, "*/*");
return intent;
} /**
* 判断intent是否可用
*/
public static boolean isIntentAvailable(Context mContext, Intent intent) {
final PackageManager packageManager = mContext.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);//PackageManager.GET_ACTIVITIES
return list.size() > 0;
} /**
* 判断intent是否可用
* 些时候你想要知道某个AP是否有注册了一个明确的intent
* 比如说你想要检查某个receiver是否存在,然后根据是否存在来这个receiver来在你的AP里面enable某些功能
*/
public static boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfo.size() > 0) {
return true;
}
return false;
} /**
* 判断文件是否存在
* param - filePath:文件路径
*/
private static boolean isFileExit(String filePath) {
if (filePath == null) {
return false;
}
try {
File f = new File(filePath);
if (!f.exists()) {
return false;
}
} catch (Exception e) {
// TODO: handle exception
}
return true;
}
}

IntentActionUtil

在AndroidManifest.xml中添加权限

    <!-- *****************IntentActionUtil【Intent的常见作用的工具类】***************** -->
<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)

三、使用方法

        tv_openEmail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent = IntentActionUtil.getEmailIntent("wangxxxxxx@126.com");
if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
MainActivity.this.startActivity(intent);
}else{
Toast.makeText(MainActivity.this, "无法打开,请安装手机邮箱软件", Toast.LENGTH_SHORT).show();
}
}
}); tv_openWeb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent = IntentActionUtil.getWebViewIntent("http://www.baidu.com");
if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
MainActivity.this.startActivity(intent);
}else{
Toast.makeText(MainActivity.this, "无法打开,请安装手机浏览器软件", Toast.LENGTH_SHORT).show();
}
}
}); tv_openMap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent = IntentActionUtil.getMapViewIntent(116.398064,39.913703);
if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
MainActivity.this.startActivity(intent);
}else{
Toast.makeText(MainActivity.this, "无法打开,请安装手机地图软件", Toast.LENGTH_SHORT).show();
}
}
}); tv_openTel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent = IntentActionUtil.getPhoneIntent("10010");
if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
MainActivity.this.startActivity(intent);
}
}
}); tv_openSMS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent = IntentActionUtil.getSMSIntent("10010","");
if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
MainActivity.this.startActivity(intent);
}
}
}); tv_openAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String filePath = Environment.getExternalStorageDirectory() + "/intentFile/" + "videodemo.m4a";
Intent intent = new Intent();
intent = IntentActionUtil.openFileIntent(filePath);
if(intent != null){
MainActivity.this.startActivity(intent);
}else{
Toast.makeText(MainActivity.this,"文件不存在",Toast.LENGTH_SHORT).show();
}
}
});

混淆配置

参考资料

Android--用intent打开各种文件

http://blog.csdn.net/chaoyu168/article/details/50778016

android intent和intent action大全

http://www.2cto.com/kf/201210/162045.html

判断一个intent是否可用的接口

http://blog.csdn.net/shlpyy/article/details/8706751

【Android】打开本地的html文件

http://www.cnblogs.com/simov/p/3761243.html

android intent打开各种文件的方法

http://blog.csdn.net/wangyang2698341/article/details/20847469

项目demo下载地址

https://github.com/haiyuKing/IntentActionUtilDemo

Demo中使用的文件:

链接:http://pan.baidu.com/s/1bpnJrpt 密码:4w3u

IntentActionUtil【Intent的常见作用的工具类】的更多相关文章

  1. 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)

    目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...

  2. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

  3. Android 开发工具类 35_PatchUtils

    增量更新工具类[https://github.com/cundong/SmartAppUpdates] import java.io.File; import android.app.Activity ...

  4. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  5. Android 常见工具类封装

    1,MD5工具类: public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0' ...

  6. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  7. JAVA 获取文件的MD5值大小以及常见的工具类

    /** * 获取文件的MD5值大小 * * @param file * 文件对象 * @return */ public static String getMD5(File file) { FileI ...

  8. Collections 工具类和 Arrays 工具类常见方法

    Collections Collections 工具类常用方法: 排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) 排序操作 void revers ...

  9. velocity merge作为工具类从web上下文和jar加载模板的两种常见情形

    很多时候,处于各种便利性或折衷或者通用性亦或是限制的原因,会借助于模板生成结果,在此介绍两种使用velocity merge的情形,第一种是和spring mvc一样,将模板放在velocityCon ...

随机推荐

  1. pymongo 学习总结

    1.简介 MongoDB是一种强大.灵活.追求性能.易扩展的数据存储方式.是面向文档的数据库,不是关系型数据库,是NoSQL(not only SQL)的一种.所谓的面向文档,就是将原来关系型数据库中 ...

  2. 根据NABCD原则完成的案例项目需求分析及其创新方法

    <well> Need:在当下的知识经济时代,社会效率在提升,社会竞争强度也在增大,现代社会对人的素质提出了更高的要求,这导致了越来越多的人心理压力增大.well产品就是为了缓解人们心理压 ...

  3. 使用Eclipse远程调试

    在一般的开发中,有事因为项目需要,测试环境是在Linux下,这是如果出现异常或者bug,调试起来都是很费劲的,如果你还在为这个头疼,那就好好看接下来的总结 1,启动改程序时,不论是脚本启动,还是tom ...

  4. 【bzoj 1095】[ZJOI2007]Hide 捉迷藏

    题目链接: TP 题解: 样例好良心,调样例3h一A…… 细节好多……诸如没完没了的pop和push……搞得头都大了. 同情zzh……调了整一天了. 动态点分治裸题……果然每个“裸题”打起来都跟shi ...

  5. loj6271「长乐集训 2017 Day10」生成树求和 加强版

    又是一个矩阵树套多项式的好题. 这里我们可以对每一位单独做矩阵树,但是矩阵树求的是边权积的和,而这里我们是要求加法,于是我们i将加法转化为多项式的乘法,其实这里相当于一个生成函数?之后如果我们暴力做的 ...

  6. C语言实现十六进制字符串转数字

    代码: int StringToInt(char *hex) { ]) * + CharToInt(hex[]); } int CharToInt(char hex) { ') '; if (hex& ...

  7. TiDB show processlist命令源码分析

    背景 因为丰巢自去年年底开始在推送平台上尝试了TiDB,最近又要将承接丰巢所有交易的支付平台切到TiDB上.我本人一直没有抽出时间对TiDB的源码进行学习,最近准备开始一系列的学习和分享.由于我本人没 ...

  8. 你真的了解字典(Dictionary)吗?

    从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点. 为了便于描述,我把上面的那条线路称为线路1,下面的称为线路2. 思路 ...

  9. 「拥抱开源, 又见 .NET」系列第三次线下活动简报

    「拥抱开源, 又见 .NET」 随着 .NET Core的发布和开源,.NET又重新回到人们的视野. 自2016年 .NET Core 1.0 发布以来,其强大的生命力让越来越多技术爱好者对她的未来满 ...

  10. 面试前必须要知道的Redis面试题

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零单排学Redis[青铜] 从零单排学 ...