Android调用系统邮件类应用的正确实现方法
Android应用开发中,很多情况下免不了要调用手机上的邮件类应用,实现邮件发送的功能,这一般是通过调用系统已有的Intent来实现的。看到网上很多邮件发送都是调用action为android.content.Intent.ACTION_SEND的Intent来实现的,下面我们就来看下这种方式实现的效果如何。
【使用Intent.ACTION_SEND方式】
具体的UI搭建我就不说了,很easy,直接看下发送的核心代码就行:
- String[] email = {"3802**92@qq.com"}; // 需要注意,email必须以数组形式传入
- Intent intent = new Intent(Intent.ACTION_SEND);
- intent.setType("message/rfc822"); // 设置邮件格式
- intent.putExtra(Intent.EXTRA_EMAIL, email); // 接收人
- intent.putExtra(Intent.EXTRA_CC, email); // 抄送人
- intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); // 主题
- intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); // 正文
- startActivity(Intent.createChooser(intent, "请选择邮件类应用"));
上面代码的效果如下图所示,将会拉起不止邮件类应用,这是很坑爹的事情,用户体验相当差。

从上面结果可以看出,ACTION_SEND不是首选的方案,更好的方案是能够过滤非邮件类应用,只识别邮件类应用。这可以通过使用另外一个action来实现的。
【使用Intent.ACTION_SENDTO方式】
核心代码如下:
- // 必须明确使用mailto前缀来修饰邮件地址,如果使用
- // intent.putExtra(Intent.EXTRA_EMAIL, email),结果将匹配不到任何应用
- Uri uri = Uri.parse("mailto:3802**92@qq.com");
- String[] email = {"3802**92@qq.com"};
- Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
- intent.putExtra(Intent.EXTRA_CC, email); // 抄送人
- intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); // 主题
- intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); // 正文
- startActivity(Intent.createChooser(intent, "请选择邮件类应用"));
效果图如下所示:

当手机上只有一个匹配的邮件类应用时,系统将不会弹出ChooserActivity,供用户从候选的应用中挑选一个,而是直接跳转到匹配的那个应用去。这时查看Eclipse的logcat可以发现,出现如下异常信息:

但是,当系统中存在多于一个的匹配应用时,会弹出ChooserActivity,让用户选择一个应用发送邮件,这时查看logcat不会出现之前的异常。这又是为何呢?
【ChooserActivity的bug】
从异常信息中可以看出,代码在某个地方注册了IntentReceiver,但却没有代码去解除注册。具体原因是Android源码的一个bug,但不影响正常功能,因此可忽略之。想知道详细原因的可以自己查看Android源码。下图是stackoverflow上面的解答,可参考之。

网址:
Demo源码地址: http://download.csdn.net/detail/ace1985/4695230
Android调用系统邮件类应用的正确实现方法的更多相关文章
- Android 调用系统邮件,发送邮件到指定邮箱
在项目中,最后有一个联络我们,要求是点击号码还有邮箱地址能够发送邮件,这时候解决的方案其实有两种,一种是调用系统发邮件的软件,可以添加邮箱账号就可以发送邮件:第二种是使用javamail来发送邮件.在 ...
- Android调用系统相机、自己定义相机、处理大图片
Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...
- Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...
- Android调用系统相册和拍照的Demo
最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...
- Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博
原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博 ...
- 探索Android调用系统的分享功能
非常多的应用为了应用的推广和传播都会使用"分享"的功能,点击分享button.就能将想要分享的内容或者图片分享至QQ空间.微博.微信朋友圈等实现了分享功能的应用.这篇文章主要是为了 ...
- Android调用系统相机和相册并解决data为空,OOM,图片角度不对的问题
最近公司项目用到手机拍照的问题,好不容易在网上copy了一些代码,但是运行起来一大堆bug,先是三星手机上运行程序直接崩掉,debug了一下原来是onActivityResult中data返回为空,找 ...
- Android调用系统照相机
ndroid调用系统相机实现拍照功能 在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没 ...
- android调用系统相机并获取图片
如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...
随机推荐
- Python-xml解析常用方法简介
[XML几种解析方法] 常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,使用场合自然也就不同. Python有三种方法解析XML: SAX,DOM,以及ElementTree ...
- Mysql查看连接端口及版本
C:\Users\Administrator>mysql -uroot -pEnter password: *****Welcome to the MySQL monitor. Commands ...
- linux nc命令
即NetCat简写,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本.因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小).功能实用,被设计为一个简单.可靠的网络工具 ...
- linux下查阅文件内容cat,more,less,tail
1.常用cat,直接查看,一次性全部输出 cat filename cat -b filename 显示行号,除空白行 cat -n 显示行号,包括空白行 常用:cat filename | ...
- (三)一个工作任务引起的乱战——udp通信
先上代码.该代码是在问度娘的过程中搜到的,自己实验运行了下,可以使用(vs2010 net fram4.0).服务端代码: using System;using System.Collections ...
- NSURLSessionDataTask
#import "ViewController.h" @interface ViewController ()<NSURLSessionDelegate,NSURLSessi ...
- HTML元素遮挡Flash之梦
wmode参数: transparent模式:可用z-index控制层级 opaque模式:可用z-index控制层级 window模式:flash层级在浏览器核心显示窗口之上,flash会盖住与他重 ...
- 3月22日 html(三)css样式表
CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控制精确,但是可重用性差,冗余较多. 例 ...
- WEB开发中常用的正则表达式
在计算机科学中,正则表达式用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在WEB开发中,正则表达式通常用来检测.查找替换某些符合规则的字符串,如检测用户输入E-mai格式是否正确,采集符 ...
- 实例讲解MySQL联合查询
好了终于贴完了MySQL联合查询的内容了,加上上一篇一共2篇,都是我转载的,实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN的用法了.首先我们假设有2个表A和B,他们的表结构和字段分别为: ...