IntentActionUtil【Intent的常见作用的工具类】
版权声明:本文为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的常见作用的工具类】的更多相关文章
- 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)
目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...
- 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)
在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...
- Android 开发工具类 35_PatchUtils
增量更新工具类[https://github.com/cundong/SmartAppUpdates] import java.io.File; import android.app.Activity ...
- 适用于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通用)>,现在重新整理一 ...
- Android 常见工具类封装
1,MD5工具类: public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0' ...
- 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 ...
- JAVA 获取文件的MD5值大小以及常见的工具类
/** * 获取文件的MD5值大小 * * @param file * 文件对象 * @return */ public static String getMD5(File file) { FileI ...
- Collections 工具类和 Arrays 工具类常见方法
Collections Collections 工具类常用方法: 排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) 排序操作 void revers ...
- velocity merge作为工具类从web上下文和jar加载模板的两种常见情形
很多时候,处于各种便利性或折衷或者通用性亦或是限制的原因,会借助于模板生成结果,在此介绍两种使用velocity merge的情形,第一种是和spring mvc一样,将模板放在velocityCon ...
随机推荐
- Python爬虫实战:使用Selenium抓取QQ空间好友说说
前面我们接触到的,都是使用requests+BeautifulSoup组合对静态网页进行请求和数据解析,若是JS生成的内容,也介绍了通过寻找API借口来获取数据. 但是有的时候,网页数据由JS生成,A ...
- segmenter_worker.go
package; ; i < engine.initOptions.NumShards; i++ { if i == shard { ...
- authorizations.go
{ return nil, fmt.Errorf("invalid TTL %d (must be >0)", authState.TTL) } ...
- MySQL 慢查询日志总结
慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志 ...
- 【NOI赛前训练】——专项测试1·网络流
T1: 题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1, ...
- APP版本更新通知流程测试要点
一.APP版本更新通知流程图如下: 二.测试注意点: 1.Android更新直接下载APK,IOS引导至APP Store更新页面: 强制更新------只有"立即更新" 1.一般 ...
- window 7 安装Jmeter并配置https录制脚本
安装与环境配置: http://blog.csdn.net/hhuangdanfeng/article/details/51564765 http://blog.csdn.net/u010573212 ...
- LSTM实现中文文本情感分析
1. 背景介绍 文本情感分析是在文本分析领域的典型任务,实用价值很高.本模型是第一个上手实现的深度学习模型,目的是对深度学习做一个初步的了解,并入门深度学习在文本分析领域的应用.在进行模型的上手实现之 ...
- 在ASP.NET Core中给上传图片功能添加水印
在传统的.NET框架中,我们给图片添加水印有的是通过HttpModules或者是HttpHandler,然后可以通过以下代码添加水印: var image = new WebImage(imageBy ...
- Access2007数据库下载地址与AccessHelper
链接:https://pan.baidu.com/s/1pLzOlTv0nqSbhzujHZht1w 提取码:1m9l AccessHelper: using System; using System ...