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. Sybase常用函数

    ==================================常用函数===========================================字符串函数1)ISNULL(EXP1, ...

  2. FreeMarker辅助

    /** * FreeMarker 辅助类 * @author Rubekid * */ public class FreeMarkerHelper { /** * 模板文件存放目录 */ privat ...

  3. css部分总结

    10.19HTML总结 1.<!DOCTYPE HTML>声明:告知浏览器文档使用哪种HTML或者XHTML规范,该标签可声明三种DTD(文档类型定义)类型:严格版本.过渡版本以及基于框架 ...

  4. 3:url无规律的多页面爬取

    试例网站:豆瓣电影TOP250:http://movie.douban.com/top250 关键点:在审查元素下查看后页即可以看到跳转的url.而且最后一页就此属性就没有了. 由于关键是实现分页,所 ...

  5. NHibernate——基本映射(5)

    一.映射定义概括 1.1 映射定义(Mapping declaration) 对象和关系数据库之间的映射是用一个XML文档(XML document)来定义的.这个映射文档被设计为易读的,并且可以手工 ...

  6. Android --------- 利用SharedPreferences存取数据

    //向SharedPreferences中存放数据 //1.定义SharedPreferences对象,通过getSharedPreferences方法得到 SharedPreferences sp ...

  7. C# 计算日期时间的间隔天数

    DateTime oldDate = ,,); DateTime newDate = DateTime.Now; // Difference in days, hours, and minutes. ...

  8. Catel帮助手册-Catel.Core:(1)参数检查

      我们检查方法是否正确,一般是返回对错,或者是是否抛出一个异常,大部分人不检查异常的正确性,那么这种错误在很深的堆栈中,很难查看. Catel与一般的检查方法不同,一般是使用   public vo ...

  9. .net Signalr 使用笔记

    官方参考地址:http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 1.服务器端可以是控制台.winfor ...

  10. java学习笔记(3):java的工作原理及相关基础

    一.运行机制 如上图所示,图中内容即为Java的运行机制: 1.我们一开始所编写的代码文件存储格式为(如text.java)文件,这就是源程序文件 2.在Java编辑器的作用下,也就是就行了编译,形成 ...