Android邮件发送详解
转载:http://flysnow.iteye.com/blog/1128354
Android中我为什么发不了邮件???我手机里明明有邮件客户端的,可我为什么不能调用它发送邮件???相信这是很多人会问的问题,手机里有Email客户端,可是偏偏在自己的应用里调用不了,抑或是不知道怎么调用,还有的是一直认为自己写对了,可是偏偏不能调用,无奈之下只能却网上找段代码粘贴上,ok,可以了。。可是你知道别人的代码为什么可以?你知道调用Email是怎么工作的吗?如果你又像给多人发邮件,还想发送附件,怎么做?又迷糊了吧?所以需要搞懂原理才能一通百通,举一反三,而这就是这篇博文要写的,也是你可以在这篇博文中学到的。
我们新建一个工程SendEmail,基于Android1.6实现。然后定义布局文件和代码如下:
Xml代码:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button
- android:id="@+id/send_btn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Send Action"
- />
- </LinearLayout>
Java代码:
- /** 发送邮件测试界面
- * */
- public class SendEmailActivity extends Activity implements View.OnClickListener{
- private Button mSendBtn;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mSendBtn=(Button)findViewById(R.id.send_btn);
- mSendBtn.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch(v.getId()){
- case R.id.send_btn:
- startSendEmailIntent();
- break;
- }
- }
- private void startSendEmailIntent(){
- Intent data=new Intent(Intent.ACTION_SENDTO);
- data.setData(Uri.parse("mailto:qq10000@qq.com"));
- data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
- data.putExtra(Intent.EXTRA_TEXT, "这是内容");
- startActivity(data);
- }
- }
这是我们运行应用,点击按钮就会看到如下效果:
分析发送代码
主要的发送代码如下:
- Intent data=new Intent(Intent.ACTION_SENDTO);
- data.setData(Uri.parse("mailto:qq10000@qq.com"));
- data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
- data.putExtra(Intent.EXTRA_TEXT, "这是内容");
- startActivity(data);
- 首先构造一个Action为SENDTO的Action
- 其次创建一个Uri,他是一个mailto的邮件链接,也就是接收地址.
- 再通过Intent.EXTRA_SUBJECT和Intent.EXTRA_TEXT传递标题和文本的数据,记住,一定要使用这些常量,这是标准,否则Email客户端不认识,那样你传递的标题和文本就不起作用了。
- 然后就是startActivity进行打开,系统会根据Intent自动匹配找到能处理这个intent的应用,如图列表,有很多个,我们这里选择网易掌上邮,就打开了一个邮件发送界面,如我们所愿,邮件地址、标题和内容都在了,很成功.
- intent中的数据传递是以Extra的方式进行put后传递的,然后在使用的时候getter取出使用。
发送给多人以及抄送和密送
发送给多人以及抄送和密送都很简单,查找Intent类中的Extra常量,发送有这么三个常量:Intent.EXTRA_EMAIL,Intent.EXTRA_CC,Intent.EXTRA_BCC。这三个分别用于传递“接受人地址列表”、“抄送人地址列表”和“密送人地址列表”,传递的都是String[]类型的Email地址,如果数组中有多个地址,就可以发送给多人。发送的函数修改如下,我们看下效果:
- private void startSendEmailIntent(){
- Intent data=new Intent(Intent.ACTION_SENDTO);
- data.setData(Uri.parse("mailto:qq10000@qq.com"));
- data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com","ls8708@163.com"});
- data.putExtra(Intent.EXTRA_CC, new String[]{"ls8709@163.com"});
- data.putExtra(Intent.EXTRA_BCC, new String[]{"ls810@163.com"});
- data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
- data.putExtra(Intent.EXTRA_TEXT, "这是内容");
- startActivity(data);
- }
发送附件
Email'客户端的发送Activity提供了两个Intent Filter,一个用于发送普通邮件,一个用户发送带有附件的邮件。区分很很容易的,发送普通邮件的那个Intent Filter配置的Action SENDTO,而带有附件的邮件则是SEND,所以是2个不一样,但是哪些比如附加“标题”,“内容”,“抄送”,“发送多人”等等还是通用的。布局文件新增一个按钮,用于发送带有附件的邮件,Activity代码也做修改。
- <Button
- android:id="@+id/send_to_btn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="SendTo Action"/>
- /* * 发送邮件测试界面
- * @author 飞雪无情 个人博客:http://flysnow.iteye.com/
- * @since 2011-7-19
- */
- public class SendEmailActivity extends Activity implements View.OnClickListener{
- private Button mSendBtn;
- private Button mSendToBtn;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mSendBtn=(Button)findViewById(R.id.send_btn);
- mSendToBtn=(Button)findViewById(R.id.send_to_btn);
- mSendBtn.setOnClickListener(this);
- mSendToBtn.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch(v.getId()){
- case R.id.send_btn:
- startSendEmailIntent();
- break;
- case R.id.send_to_btn:
- startSendToEmailIntent();
- break;
- }
- }
- private void startSendEmailIntent(){
- Intent data=new Intent(Intent.ACTION_SENDTO);
- data.setData(Uri.parse("mailto:qq10000@qq.com"));
- data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com","ls8708@163.com"});
- data.putExtra(Intent.EXTRA_CC, new String[]{"ls8709@163.com"});
- data.putExtra(Intent.EXTRA_BCC, new String[]{"ls810@163.com"});
- data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
- data.putExtra(Intent.EXTRA_TEXT, "这是内容");
- startActivity(data);
- }
- private void startSendToEmailIntent(){
- Intent data=new Intent(Intent.ACTION_SEND);
- data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com"});
- data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
- data.putExtra(Intent.EXTRA_TEXT, "这是内容");
- data.putExtra(Intent.EXTRA_STREAM, Uri.parse(""));
- data.setType("text/plain");
- startActivity(data);
- }
- }
运行应用,我们看到效果图里最小面的附件标识,说明已经可以发送附件了.
发送附件最重要的就是Action必须为SEND,type一定要设置setType(""),还要为Intent.EXTRA_STREAM赋值,类型为Uri,一个附件的Uri。这样才能发送附件。
客户端Email应用的发送Activity配置
这是Android1.6自带Email客户端的配置,如下:
- <activity
- android:name=".activity.MessageCompose"
- android:label="@string/app_name"
- android:enabled="false"
- >
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <action android:name="android.intent.action.SENDTO" />
- <data android:scheme="mailto" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- </intent-filter>
- <intent-filter android:label="@string/app_name">
- <action android:name="android.intent.action.SEND" />
- <data android:mimeType="text/plain" />
- <data android:mimeType="image/*" />
- <data android:mimeType="video/*" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
从以上代码总结:
- 一个Activity定义了2个Intent Filter用于发送不同类型邮件。
- SENDTO发送普通邮件,SEND可以发送普通和带有附件的,不过最好主要用于发送附件。
- 使用SENDTO时,必须为Intent设置Data,也就是Uri,内容为"mailto:emailaddr",否则不能匹配,因为有schema必须为mailto的限制
- 使用SEND时必须要设置type,也就是使用setType()方法,type只能为以前xml定义的4个。不过我测试了text/*也可以,其他的没测试.
- 发送附件只能使用SEND这个Action.
- void initFromIntent(Intent intent) {
- //提取接受人地址列表
- String[] extraStrings = intent.getStringArrayExtra(Intent.EXTRA_EMAIL);
- if (extraStrings != null) {
- addAddresses(mToView, extraStrings);
- }
- //提取抄送人地址列表
- extraStrings = intent.getStringArrayExtra(Intent.EXTRA_CC);
- if (extraStrings != null) {
- addAddresses(mCcView, extraStrings);
- }
- //提取密送人地址列表
- extraStrings = intent.getStringArrayExtra(Intent.EXTRA_BCC);
- if (extraStrings != null) {
- addAddresses(mBccView, extraStrings);
- }
- //提取标题
- String extraString = intent.getStringExtra(Intent.EXTRA_SUBJECT);
- if (extraString != null) {
- mSubjectView.setText(extraString);
- }
- //提取Uri中的接受人地址
- final Uri dataUri = intent.getData();
- if (dataUri != null) {
- if ("mailto".equals(dataUri.getScheme())) {
- initializeFromMailTo(dataUri.toString());
- } else {
- String toText = dataUri.getSchemeSpecificPart();
- if (toText != null) {
- addAddresses(mToView, toText.split(","));
- }
- }
- }
- //提取邮件内容
- CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT);
- if (text != null) {
- mMessageContentView.setText(text);
- }
- //提取附件,可以看出Action必须是SEND.EXTRA_STREAM中有数据
- //type不能为null,这样才能提取倒附件.
- if (Intent.ACTION_SEND.equals(intent.getAction()) && intent.hasExtra(Intent.EXTRA_STREAM)) {
- String type = intent.getType();
- Uri stream = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
- if (stream != null && type != null) {
- if (MimeUtility.mimeTypeMatches(type, Email.ACCEPTABLE_ATTACHMENT_SEND_TYPES)) {
- addAttachment(stream);
- }
- }
- }
- // Finally - expose fields that were filled in but are normally hidden, and set focus
- if (mCcView.length() > 0) {
- mCcView.setVisibility(View.VISIBLE);
- }
- if (mBccView.length() > 0) {
- mBccView.setVisibility(View.VISIBLE);
- }
- setNewMessageFocus();
- mDraftNeedsSaving = false;
- }
Android邮件发送详解的更多相关文章
- Android Studio 插件开发详解四:填坑
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78265540 本文出自[赵彦军的博客] 在前面我介绍了插件开发的基本流程 [And ...
- Android Socket通信详解
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客 ...
- JMessage Android 端开发详解
目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 IM 应用会需要有哪些功能? 用户注册 / 登 ...
- Android中Context详解 ---- 你所不知道的Context(转)
Android中Context详解 ---- 你所不知道的Context(转) 本文出处 :http://b ...
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- android:ToolBar详解
android:ToolBar详解(手把手教程) 泡在网上的日子 发表于 2014-11-18 12:49 第 124857 次阅读 ToolBar 42 来源 http://blog.mosil.b ...
- Android之canvas详解
首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...
- 【转】Android Canvas绘图详解(图文)
转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...
- Android 核心分析 之八Android 启动过程详解
Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...
随机推荐
- jQuery 基本实现功能模板
下面是列出了基本功能的实现 <!DOCTYPE html> <html> <head> <script src="http://libs.baidu ...
- CSS3 边框
说明:CSS3完全向后兼容,因此不必改变现有的设计.浏览器通常支持CSS2 CSS3模块 CSS3被划分为模块: 选择器 框模型 背景和边框 文本效果 2D/3D 转换 动画 多列布局 用户界面 CS ...
- 真机测试,Xcode报错:process launch failed: Security
解决办法:手机->通用->设备管理->信任开发商应用即可
- 【C++学习之路】派生类的构造函数(二)
二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( ...
- Spring4.0学习笔记(4) —— 使用外部属性文件
1.配置xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...
- 解决.VS2012+EF5.0开发的网站在window server2003上无法部署的问题(转载)
转载:http://www.cnblogs.com/eggTwo/p/3653825.html (一)前 言 ...
- 禁止ios默认拉动弹性行为
document.ontouchmove = function(e) { e.preventDefault();} /** 禁止ios默认拉动弹性行为**///屏蔽ios下浏览器滚动缓冲效果
- 关于ASP.NET MVC中的视图生成
在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 ...
- 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript
本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...
- 【课上OJ】判断密码强度
一个判断密码强度问题: 假设允许采用以下四类字符作为密码: (1)大写英文字母,(2)小写英文字母,(3)数字0-9,(4)特殊符号 @ - _ # ~ 对密码强度做以下规定: Best: 长度> ...