TextView的autoLink属性为我们提供了很大的便利性,当文本中有网址,邮箱或电话的时候可以让我们方便地执行打电话发邮件等动作,不过也有一些问题,比如说设置autoLink包含email属性,当文本中有邮件地址时只要点击就可以调用邮件客户端来发邮件,但是如果当前系统中没有邮件客户端可供调用,程序会直接挂掉。

  通过看Log可以发现,系统抛出了ActivityNotFoundException异常,并且Exception的getMessage中包含"mailto:xxxx@xxx.xxx"字样,当时第一反应是设置Thread.uncaughtExceptionHandler,判断如果异常的类型是ActivityNotFoundException并且Error Message中有"mailto"字样直接让uncaughtException函数返回,试了一下,程序确实没挂掉,窃喜中,但是接下来点击了一下屏幕,5秒钟后ANR了,好吧这个方法不行。

  又想到当点击链接后会调用邮件客户端发邮件,肯定有startActivity的调用,于是重载Activity的startActivity函数,把参数 intent的内容打出来(直接toString()就行了),发现在Intent的内容是ACTIVION_VIEW,并有extra data:mailto:xxxx@xxx.xxx,所以就通过intent包含的信息判断如果包含mailto字样就认为是系统调用邮件客户端发邮件,此时判断系统中是否有邮件客户端可处理这个请求,如果没有就把这个startActivity事件拦截下来。

@Override
public void startActivity(Intent intent) {
if (intent.toString().indexOf("mailto") != -1) { // Any way to judge that this is to sead an email
PackageManager pm = getPackageManager();
// The first Method
List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
if (activities == null || activities.size() == 0) {
// Do anything you like, or just return
return;
} // Another method
// ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
// if (resolveInfo == null) // Yet another metod
// Intent.createChooser(intent, "Choose email client");
}
super.startActivity(intent);
}

  代码就是上面这样,很简单,提到了三种方法,第一种和第二种都是通过PackageManager判断是否有可以处理这个Intent的请求的组件,如果没有就直接让startActivity返回,在返回之前你想干嘛干嘛,第三种方法是通过 Intent.createChoose手动弹出一个选择器,这个方法记得以前用是不行的,这次试了下竟然可以,难道是我记错了?反正用前两种方法就好了。

  不只是邮件,如果你想通过以下代码跳转到应用市场让用户为你的应用评分

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + getPackageName()));
startActivity(intent);

  如果用户系统中没有安装任何应用市场,很不幸,你的程序一样会挂掉,和前面说的email一样的问题:ActivityNotFoundException,不知道Google为什么不处理一下,也许人家以为手机上怎么可能没有邮件客户端和应用市场,不了解中国国情啊,不知道如果没有电话应用会是什么样?没有应用市场的处理是一样的方法,重载startActivity,只要你能判断这个请求是跳往市场的就行了。不过这个已经有了Intent对象,直接判断就行了,判断到没有市场直接不startActivity。

系统中没有邮件客户端设置autoLink=email会挂掉的问题的更多相关文章

  1. Outlook 2010中263邮箱客户端设置

    Outlook 2010中263邮箱客户端设置 1.首次添加电子邮箱账户:打开outlook,在账户设置和服务中分别选择:“手动配置服务器设置或其他服务器类型”,“Internet电子邮件” 2.在i ...

  2. linux中Zabbix邮件报警设置配置步骤

    使用外部邮箱账号发送报警邮件设置 配置Zabbix服务端外部邮箱 vi /etc/mail.rc #编辑,添加以下信息 set from=xxx@163.com smtp=smtp.163.com s ...

  3. linux系统中SSH免密设置报错

    执行 ssh-add ~/.ssh/msi_rsa 时报下面错误 Could not open a connection to your authentication agent. 解决办法: 执行命 ...

  4. cacti报警邮件的设置

    众所周知,用Linux系统自带的sendmail发送邮件是有限制的,可能对有些邮箱无法正常发送,导致报警邮件不能够及时发送到,因此就可能会产生不必要的麻烦!对此,我们可以用其他方法来发送邮件,就是在c ...

  5. Hacker(22)----解除系统中的密码

    Win7系统中,用户可以设置BIOS密码以及系统登录密码,这些密码都有各自的用途.但对黑客而言,完全可以采用不同的方式绕过这些密码.下面介绍黑客如如何接触这些密码. 一.解除BIOS密码 BIOS密码 ...

  6. Jenkins 邮件发送设置(jenkins自带邮件设置)

    首先进入系统设置,找到Jenkins Location部分 这里设置 系统管理员邮件地址,然后设置邮件通知部分,这里为了方便我使用了QQ邮箱(作为发送邮件地址) 这里的 用户名 必须与上面的 系统管理 ...

  7. linux浏览器,邮件客户端,输入法,双屏设置,应用软件,scrot -s截图,office

    搜狗输入法linux版:http://pinyin.sogou.com/linux/help.php win/linux同时支持比较好用的浏览器:maxthon,firefox,maxthon,ope ...

  8. linux浏览器,邮件客户端,输入法,双屏设置,应用软件,gnome-screenshot/scrot -s截图,office

    搜狗输入法linux版:http://pinyin.sogou.com/linux/help.php win/linux同时支持比较好用的浏览器:maxthon,firefox,maxthon,ope ...

  9. mailto实现将用户在网页中输入的内容传递到本地邮件客户端

    背景: 想在自己的网站中有这样一个设计: 用户点击提交按钮之后,就会打开本地邮件客户端,并自动将他在输入框中输入的内容作为邮件的内容,像下面这样: mailto可以帮助实现这个功能. 简介: mail ...

随机推荐

  1. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  2. Django admin定制化,User字段扩展[原创]

    前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...

  3. nodejs操作arduino入门(javascript操作底层硬件)

    用Javascript来操作硬件早就不是一件稀奇的事情了. 所以作为一名电子专业出身的FE,我也打算尝试一下用js来驱动arduino: 要想操作这些底层硬件,肯定是需要一些工具的,我这里介绍的工具主 ...

  4. .Net语言 APP开发平台——Smobiler学习日志:如何快速在手机上实现ContextMenu

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  5. Git分布式版本控制教程

    Git分布式版本控制Git 安装配置Linux&Unix平台 Debian/Ubuntu $ apt-get install git Fedora $ ) $ dnf and later) G ...

  6. BPM应用开发解决方案分享

    一.需求分析企业整体管理是一个完整的体系,如果 把这个体系比做一个拼图,企业信息化通过各个业务系统覆盖了一部分业务. 企业通过采购实施通用软件的方式,覆盖了企业的核心业务和专业化业务然而系统只满足了部 ...

  7. Win10提示没有权限使用网络资源问题解决

    借鉴链接:http://www.cr173.com/html/67361_1.html Win10提示没有权限使用网络资源解决方法 1.打开控制面板; 2.在所有控制面板项中找到凭据管理器; 3.添加 ...

  8. Form 表单提交参数

    今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...

  9. Linux网络属性配置

    目录 IP地址分类 如何将Linux主机接入到网络中 网络接口的命名方式 ifcfg系列命令 如何配置主机名 如何配置DNS服务器指向 iproute2系列命令 Linux管理网络服务 永久生效配置路 ...

  10. x01.os.22: ubuntu 常用设置

    新组装了个 64 位电脑,i5 CPU,进入 ubuntu 后,又是一通搜索设置,整理如下,以备后用. 安装 .dep 包 sudo dpkg -i [filename.dep] 在 ubuntu 中 ...