版权声明:本文为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. 51单片机GPIO口模拟串口通信

    51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于:   分类: 深入C语言(20) 作者同 ...

  2. 浅谈cookie,sessionStorage和localStorage

    cookie:cookie在浏览器和服务器间来回传递 cookie数据不能超过4k 同时每次http请求都会携带cookie,所以cookie只适合保存很小的数据,比如会话标识 cookie只在设置的 ...

  3. java8中stream的map和flatmap的理解

    转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...

  4. Oracle 启动监听命令

    win10系统,在win右击"运行"-->输入"services.msc" ,来到服务窗口,找Oracle的相关服务 OracleOraDb10g_hom ...

  5. 已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async/await,less下载即使用

    github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管 ...

  6. 基于Token认证的多点登录和WebApi保护

    在文章中有错误的地方,或是有建议或意见的地方,请大家多多指正,邮箱: linjie.rd@gmail.com 一天张三,李四,王五,赵六去动物园,张三没买票,李四制作了个假票,王五买了票,赵六要直接F ...

  7. Android6.0 源码修改之 Contacts应用

    一.Contacts应用的主界面和联系人详情界面增加顶部菜单添加退出按钮 通过Hierarchy View 工具可以发现 主界面对应的类为 PeopleActivity 联系人详情界面对应的类为 Qu ...

  8. CopyOnWriteArrayList你都不知道,怎么拿offer?

    前言 只有光头才能变强 前一阵子写过一篇COW(Copy On Write)文章,结果阅读量很低啊...COW奶牛!Copy On Write机制了解一下 可能大家对这个技术比较陌生吧,但这项技术是挺 ...

  9. Flutter 即学即用系列博客——05 StatelessWidget vs StatefulWidget

    前言 上一篇我们对 Flutter UI 有了一个基本的了解. 这一篇我们通过自定义 Widget 来了解下如何写一个 Widget? 然而 Widget 有两个,StatelessWidget 和 ...

  10. ACM入门之OJ~

    所谓OJ,顾名思义Online Judge,一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等.用户程序执行的结果将被Online ...