Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android中我为什么发不了邮件--Android邮件发送详解

Android中我为什么发不了邮件--Android邮件发送详解

作者头像
飞雪无情
发布于 2018-08-28 02:42:07
发布于 2018-08-28 02:42:07
91500
代码可运行
举报
运行总次数:0
代码可运行

Android中我为什么发不了邮件???我手机里明明有邮件客户端的,可我为什么不能调用它发送邮件???相信这是很多人会问的问题,手机里有Email客户端,可是偏偏在自己的应用里调用不了,抑或是不知道怎么调用,还有的是一直认为自己写对了,可是偏偏不能调用,无奈之下只能却网上找段代码粘贴上,ok,可以了。。可是你知道别人的代码为什么可以?你知道调用Email是怎么工作的吗?如果你又像给多人发邮件,还想发送附件,怎么做?又迷糊了吧?所以需要搞懂原理才能一通百通,举一反三,而这就是这篇博文要写的,也是你可以在这篇博文中学到的。

在这里你可以学到:

  1. 什么是Intent和Intent Fileter
  2. 如何发送Email
  3. 如何发送特定的标题和内容的Emil
  4. 如何发送给多人
  5. 如何抄送和密送
  6. 如何发送附件

一:什么是Intent和Intent Fileter

关于这个详细介绍请参考 :

Intents and Intent Filters(一)

Intents and Intent Filters(二)

Intents and Intent Filters(三)

二:如何发送Email

通过上面就会知道Android应用之间的通信是通过Intent这个东西,如果手机中有实现了你想要功能的应用那么你就不用麻烦去实现一个拉。直接使用就可以,比如这里的发送邮件。

我们新建一个工程SendEmail,基于Android1.6实现。然后定义布局文件和代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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>





 /** 发送邮件测试界面
 * @author 飞雪无情
 * @since 2011-7-19
 */
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);
    }
}

这是我们运行应用,点击按钮就会看到如下效果:

三:分析发送代码

主要的发送代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
  1.  首先构造一个Action为SENDTO的Action
  2. 其次创建一个Uri,他是一个mailto的邮件链接,也就是接收地址.
  3. 再通过Intent.EXTRA_SUBJECT和Intent.EXTRA_TEXT传递标题和文本的数据,记住,一定要使用这些常量,这是标准,否则Email客户端不认识,那样你传递的标题和文本就不起作用了。
  4. 然后就是startActivity进行打开,系统会根据Intent自动匹配找到能处理这个intent的应用,如图列表,有很多个,我们这里选择网易掌上邮,就打开了一个邮件发送界面,如我们所愿,邮件地址、标题和内容都在了,很成功.
  5. intent中的数据传递是以Extra的方式进行put后传递的,然后在使用的时候getter取出使用。

四:发送给多人以及抄送和密送

发送给多人以及抄送和密送都很简单,查找Intent类中的Extra常量,发送有这么三个常量:Intent.EXTRA_EMAIL,Intent.EXTRA_CC,Intent.EXTRA_BCC。这三个分别用于传递“接受人地址列表”、“抄送人地址列表”和“密送人地址列表”,传递的都是String[]类型的Email地址,如果数组中有多个地址,就可以发送给多人。发送的函数修改如下,我们看下效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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代码也做修改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Button
    android:id="@+id/send_to_btn"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="SendTo Action"/>





 /* * 发送邮件测试界面
 * @author 飞雪无情 
 * @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客户端的配置,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

从以上代码总结:

  1. 一个Activity定义了2个Intent Filter用于发送不同类型邮件。
  2. SENDTO发送普通邮件,SEND可以发送普通和带有附件的,不过最好主要用于发送附件。
  3. 使用SENDTO时,必须为Intent设置Data,也就是Uri,内容为”mailto:emailaddr”,否则不能匹配,因为有schema必须为mailto的限制
  4. 使用SEND时必须要设置type,也就是使用setType()方法,type只能为以前xml定义的4个。不过我测试了text/*也可以,其他的没测试.
  5. 发送附件只能使用SEND这个Action.

附加Email客户端中提取Email地址,抄送,标题,附件等信息的源代码分析.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011年7月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android Intent用法全面详解
朋友们在开发的时候对Intent肯定并不陌生,下面总结了一下Intent除了用在activity之间的跳转,还可以        在哪些地方使用: 1.显示网页
再见孙悟空_
2023/02/10
6050
Android之Intent用法全面总结
[代码] 调用拨号程序 // 给移动客服10086拨打电话 Uri uri = Uri.parse("tel:10086"); Intent intent = new Intent(Intent.ACTION_DIAL, uri); startActivity(intent); [代码] 发送短信或彩信 // 给10086发送内容为“Hello”的短信 Uri uri = Uri.parse("smsto:10086"); Intent intent = new Intent(Intent.ACTION_S
晚晴幽草轩轩主
2018/03/27
7310
Intent action属性大全
Intent的中文意思是“意图,目的”的意思,可以理解为不同组件之间通信的“媒介”或者“信使”。 目标组件一般要通过Intent来声明自己的条件,一般通过组件中的<intent-filter>元素来过滤。 Intent在由以下几个部分组成:动作(action),数据(data),分类(Category),类型(Type),组件(Component),和扩展信息(Extra)。 Intent在寻找目标组件的时候有两种方法:第一,通过组件名称直接指定;第二,通过Intent Filter
黄啊码
2020/05/29
1.6K0
Intent 属性详解(下)
上一期学习了Intent的前三个属性,本期接着学习其余四个属性,以及Android系统常用内置组件的启动。 四、Data和Type属性 Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象,一个Uri 对象通常通过如下形式的字符串来表示: content://com.android.contacts/contacts/1tel:123 Uri字符串总满足如下格式: scheme://host:port/path 例如上面给出的 content
分享达人秀
2018/02/05
1.2K0
Intent 属性详解(下)
Intent组件
Android页面之间的跳转可以分为几类,比如有A和B两个页面,从A页面直接跳转到B页面,这样的跳转比较简单,或者从A页面跳转到B页面但是需要传送数据。在Android中,页面的跳转离不开Intent。Intent被称为Android页面之间联系的,他能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。Intent主要包含的内容如下: 1.Action 用来指明要实施的动作是什么,比如说ACTION
水击三千
2018/02/27
8040
Android系统常用Intent大全 博客分类: Android小技巧 AndroidGoogleWebF#
1.从google搜索内容 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY,"searchString") startActivity(intent);
chroya
2018/10/31
9380
Android开发笔记(五十五)手机设备基本操作
手机的基本信息分两类,一类是与电话有关的信息,另一类是设备自身的信息。 与电话有关的信息可由TelephonyManager类获得,常用的参数与对应的方法如下所示: 网络运营商名称 : getNetworkOperatorName 网络运营商编号 : getNetworkOperator,返回五位数字,前三位表示国家代码(中国的为460),后两位表示运营商代码(中国移动为0,中国联通为1,中国电信为2) 手机类型 : getPhoneType 网络类型 : getNetworkType获得细分类型,getNetworkClass获得大类如2G/3G/4G SIM卡状态 : getSimState SIM卡运营商名称 : getSimOperatorName SIM卡运营商编号 : getSimOperator SIM卡序列号 : getSimSerialNumber IMSI : getSubscriberId IMEI : getDeviceId 手机号码 : 实测发现多数情况下getLine1Number和getMsisdn都无法正确取到号码,但是很多APP又需要用户的手机号,那又得想办法获取号码,获取的方法大致有如下几种: 1、用户首次使用,提示用户注册手机号,然后保存起来,下次就能取到手机号了; 2、APP自动用该手机发一条免费短信(比如向10086发),然后到发件箱中寻找该短信的发送号码; 3、如果能连到运营商的支撑系统,那么根据IMSI去后台系统查询手机号,这也是可以的; 设备自身的信息可由Build类获得,常用的参数与对应的方法如下所示: 手机厂商 : Build.MANUFACTURER 手机品牌 : Build.BRAND 手机型号 : Build.MODEL 设备名称 : Build.DEVICE CPU指令 : Build.CPU_ABI 芯片型号 : Build.HARDWARE 手机序列号 : Build.SERIAL SDK版本 : Build.VERSION.SDK_INT 系统版本 : Build.VERSION.RELEASE 版本代号 : Build.VERSION.CODENAME
aqi00
2019/01/18
1.2K0
Intent的七大属性, ComponentName、  Action 、 Category 、 Data  、Type、  Extra  、Flags。
Action作为标识符,代表一个Intent,当一个Activity需要外部协助处理时,就会发出一个Intent,如果一个程序能完成相应功能,只要在intent-filter加上这个这个intent就可以了。 Data保存需要传递的数据格式,比如:tel:// Extras保存需要传递的额外数据。 Category表示Intent的种类,从android上启动Activity有多种方式,比如 程序列表、桌面图标、点击Home激活的桌面等等,Category则用来标识这些Activity的图标会出现在哪些启动的上下文环境里。
zhangjiqun
2024/12/16
1010
Android Intent Action 大全
1、 使用Action跳转,当程序AndroidManifest.xml中某一个 Activity的IntentFilter定义了包含Action,如果恰好与目标Action匹配,且其IntentFilter中没有定义其它的Type或Category过滤条件,那么就正好匹配了。如果手机中有两个以上的Action程序匹配,那么就会弹出一个对话可框来提示说明。例如打开一个网址,弹出可选对话框:
阳光岛主
2019/02/19
2.9K0
Android Intent Action 大全
【Android从零单排系列三十九】《认识Android中的Intent》
小伙伴们,在前面的一系列文章中我们分别介绍了Android视图控件、Android布局、Android四大组件,本文我们单独介绍一下Android中一个非常重要的内容Intent的使用。
再见孙悟空_
2023/07/17
4080
【Android基础】Android利用Intent与其他应用交互
前言: 上一篇博客给大家聊了Intent的定义,分类、属性和功能,相信大家对于Intent在Android中的作用已经清楚,这一篇博客将会给大家聊Intent的用法。 Android系统的一个重要特性就是一个应用程序可以调用另外一个应用程序来完成用户的请求动作。比如你的应用程序需要给用户显示一个地理位置在地图上,你不必在你的应用程序中实现地图功能,而是创建一个显示这个地理位置的Intent,发送出去,Android系统会启动那些可以处理这个请求的应用程序。还比如:你用百度云盘下载了一个pdf文档,你在点击
程序员互动联盟
2018/03/13
9460
笔记71 | Intent分享内容(文本,图片,视频)
在构建一个 intent时,必须指定这个intent需要触发的actions。Android定义了一些actions,比如 ACTION_SEND,该action表明该intent用于从一个activity发送数据到另外一个activity的,甚至可以是跨进程之间的数据发送。 为了发送数据到另外一个activity,我们只需要指定数据与数据的类型,系统会自动识别出能够兼容接受的这些数据的activity。如果这些选择有多个,则把这些activity显示给用户进行选择;如果只有一个,则立即启动该Activit
项勇
2018/06/19
1.7K0
Android 开发常用代码片段
在AndroidManifest.xml中配置Activity节点是配置theme如下:
阳光岛主
2019/02/19
7120
【Android基础】Android中的Intent详解
前言: 每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面。因为每一个Acticity的任务不一样,所以经常互在各个Activity之间进行跳转,在Android中这个动作是靠Intent来完成的。你通过startActivity()方法发送一个Intent给系统,系统会根据这个Intent帮助你找到对应的Activity,即使这个Activity在其他的应用中,也可以用这种方法启动它。 Intent的定义: Intent是Andro
程序员互动联盟
2018/03/14
1.6K0
Android Training Summary (1) Getting Started
Android Training 中Getting Started部分的阅读笔记
宅男潇涧
2018/08/01
4490
Android Training Summary (1) Getting Started
Android 进阶3:Intent 与 IntentFilter 匹配规则
张拭心 shixinzhang
2018/01/05
1.1K0
Android 进阶3:Intent 与 IntentFilter 匹配规则
14个简单有用的android源码,适合初学者
在OnCreate 中不设Layout,然后this.setTheme(R.style.Theme_Transparent);
全栈程序员站长
2022/03/10
1.4K0
相关推荐
Android Intent用法全面详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验