Android应用开发中,很多情况下免不了要调用手机上的邮件类应用,实现邮件发送的功能,这一般是通过调用系统已有的Intent来实现的。看到网上很多邮件发送都是调用action为android.content.Intent.ACTION_SEND的Intent来实现的,下面我们就来看下这种方式实现的效果如何。

【使用Intent.ACTION_SEND方式】

具体的UI搭建我就不说了,很easy,直接看下发送的核心代码就行:

  1. String[] email = {"3802**92@qq.com"}; // 需要注意,email必须以数组形式传入
  2. Intent intent = new Intent(Intent.ACTION_SEND);
  3. intent.setType("message/rfc822"); // 设置邮件格式
  4. intent.putExtra(Intent.EXTRA_EMAIL, email); // 接收人
  5. intent.putExtra(Intent.EXTRA_CC, email); // 抄送人
  6. intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); // 主题
  7. intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); // 正文
  8. startActivity(Intent.createChooser(intent, "请选择邮件类应用"));

上面代码的效果如下图所示,将会拉起不止邮件类应用,这是很坑爹的事情,用户体验相当差。

从上面结果可以看出,ACTION_SEND不是首选的方案,更好的方案是能够过滤非邮件类应用,只识别邮件类应用。这可以通过使用另外一个action来实现的。

【使用Intent.ACTION_SENDTO方式】

核心代码如下:

  1. // 必须明确使用mailto前缀来修饰邮件地址,如果使用
  2. // intent.putExtra(Intent.EXTRA_EMAIL, email),结果将匹配不到任何应用
  3. Uri uri = Uri.parse("mailto:3802**92@qq.com");
  4. String[] email = {"3802**92@qq.com"};
  5. Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
  6. intent.putExtra(Intent.EXTRA_CC, email); // 抄送人
  7. intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); // 主题
  8. intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); // 正文
  9. startActivity(Intent.createChooser(intent, "请选择邮件类应用"));

效果图如下所示:

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

但是,当系统中存在多于一个的匹配应用时,会弹出ChooserActivity,让用户选择一个应用发送邮件,这时查看logcat不会出现之前的异常。这又是为何呢?

【ChooserActivity的bug】

从异常信息中可以看出,代码在某个地方注册了IntentReceiver,但却没有代码去解除注册。具体原因是Android源码的一个bug,但不影响正常功能,因此可忽略之。想知道详细原因的可以自己查看Android源码。下图是stackoverflow上面的解答,可参考之。

网址:

http://stackoverflow.com/questions/10068954/why-does-intent-createchooser-need-a-broadcastreceiver-and-how-to-implement/10290486#10290486

Demo源码地址: http://download.csdn.net/detail/ace1985/4695230

Android调用系统邮件类应用的正确实现方法的更多相关文章

  1. Android 调用系统邮件,发送邮件到指定邮箱

    在项目中,最后有一个联络我们,要求是点击号码还有邮箱地址能够发送邮件,这时候解决的方案其实有两种,一种是调用系统发邮件的软件,可以添加邮箱账号就可以发送邮件:第二种是使用javamail来发送邮件.在 ...

  2. Android调用系统相机、自己定义相机、处理大图片

    Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...

  3. Android调用系统相机、自定义相机、处理大图片

    Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...

  4. Android调用系统相册和拍照的Demo

    最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...

  5. Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

    原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博 ...

  6. 探索Android调用系统的分享功能

    非常多的应用为了应用的推广和传播都会使用"分享"的功能,点击分享button.就能将想要分享的内容或者图片分享至QQ空间.微博.微信朋友圈等实现了分享功能的应用.这篇文章主要是为了 ...

  7. Android调用系统相机和相册并解决data为空,OOM,图片角度不对的问题

    最近公司项目用到手机拍照的问题,好不容易在网上copy了一些代码,但是运行起来一大堆bug,先是三星手机上运行程序直接崩掉,debug了一下原来是onActivityResult中data返回为空,找 ...

  8. Android调用系统照相机

    ndroid调用系统相机实现拍照功能 在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没 ...

  9. android调用系统相机并获取图片

    如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...

随机推荐

  1. 结合tcpdump命令对traceroute深入分析

    昨天突然被问到traceroute的原理,一时竟也说不出来,有些命令平时虽然经常在用,但实际原理确并不了解,趁这次机会就来梳理一下. traceroute:是网络诊断中,用来分析IP包经过那些路由的命 ...

  2. css选择器基本属性

    选择器一,相邻选择器: 1,相邻选择器 1),定义:相邻选择器匹配指定元素的相邻兄弟元素 2),用法:如果需要选择紧接在另一个元素后的元素,而且二者有相同的父元素,可以使用相邻兄弟选择器 3),表示符 ...

  3. FileGeodatabase和PersonalGeodatabase与ArcSDEGeodatabase三种数据库比较.

  4. MYSQL存储过程注释位置

    MYSQL数据库存储过程,像"#“和”/%%/“注释需要写在BEGIN,END语句块里面,否则保存不了,例如: CREATE PROCEDURE HelloWorld() BEGIN #大家 ...

  5. scala学习笔记——操作符

    中置操作符(二元操作符),操作符位于两个参数之间.操作符包括字母,比如to,也可以包括操作符字符,比如1->10,等同于方法调用1.->(10) a 标识符 b 其中的标识符是一个带有两个 ...

  6. 解决MacOS Terminal打开慢的问题

    用了Mac有一段时间了,突然发现Terminal打开奇慢,每次打开都显示logining...,打开大概要个五六秒的时间,以前打开都是瞬间打开的啊,这对于我们这种追求速度的程序员怎么受的了呢.开始一直 ...

  7. sublime3 ctl+b无效

    Preference->Browse Packages->python,编辑Python.sublime-build文件,在字典里添加path item,value为你的python路径, ...

  8. IIS中启用gzip压缩(网站优化)

    HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度.这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的 ...

  9. haslayout引起的IE6 :hover失效

    大家都知道IE6之支持<a>标签的:hover为了,但是通常在做实际效果的时候<a>标签 :hover在IE6下会失效, 看代码: [code="html" ...

  10. flask开发restful api系列(2)

    继续上一章所讲,上一章我们最后面说道,虽然这个是很小的程序,但还有好几个要优化的地方.先复制一下老的view.py代码. # coding:utf-8 from flask import Flask, ...