• Android邮件发送详解


    转载:http://flysnow.iteye.com/blog/1128354

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

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

    Xml代码:

    [html] view plaincopy
     
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:orientation="vertical"  
    4.     android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent"  
    6.     >  
    7. <Button  
    8.     android:id="@+id/send_btn"    
    9.     android:layout_width="fill_parent"   
    10.     android:layout_height="wrap_content"   
    11.     android:text="Send Action"  
    12.     />  
    13. </LinearLayout>  


    Java代码:

    [java] view plaincopy
     
     
    1.  /** 发送邮件测试界面 
    2.  * */  
    3. public class SendEmailActivity extends Activity implements View.OnClickListener{  
    4.     private Button mSendBtn;  
    5.     /** Called when the activity is first created. */  
    6.     @Override  
    7.     public void onCreate(Bundle savedInstanceState) {  
    8.         super.onCreate(savedInstanceState);  
    9.         setContentView(R.layout.main);  
    10.         mSendBtn=(Button)findViewById(R.id.send_btn);  
    11.         mSendBtn.setOnClickListener(this);  
    12.     }  
    13.     @Override  
    14.     public void onClick(View v) {  
    15.         switch(v.getId()){  
    16.         case R.id.send_btn:  
    17.             startSendEmailIntent();  
    18.             break;  
    19.         }  
    20.     }  
    21.     private void startSendEmailIntent(){  
    22.         Intent data=new Intent(Intent.ACTION_SENDTO);  
    23.         data.setData(Uri.parse("mailto:qq10000@qq.com"));  
    24.         data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");  
    25.         data.putExtra(Intent.EXTRA_TEXT, "这是内容");  
    26.         startActivity(data);  
    27.     }  
    28. }  


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



    分析发送代码 

    主要的发送代码如下:

    [java] view plaincopy
     
     
    1. Intent data=new Intent(Intent.ACTION_SENDTO);  
    2. data.setData(Uri.parse("mailto:qq10000@qq.com"));  
    3. data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");  
    4. data.putExtra(Intent.EXTRA_TEXT, "这是内容");  
    5. 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地址,如果数组中有多个地址,就可以发送给多人。发送的函数修改如下,我们看下效果:

    [java] view plaincopy
     
     
    1. private void startSendEmailIntent(){  
    2.         Intent data=new Intent(Intent.ACTION_SENDTO);  
    3.         data.setData(Uri.parse("mailto:qq10000@qq.com"));  
    4.         data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com","ls8708@163.com"});  
    5.         data.putExtra(Intent.EXTRA_CC, new String[]{"ls8709@163.com"});  
    6.         data.putExtra(Intent.EXTRA_BCC, new String[]{"ls810@163.com"});  
    7.         data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");  
    8.         data.putExtra(Intent.EXTRA_TEXT, "这是内容");  
    9.         startActivity(data);  
    10.     }  


     


    发送附件

    Email'客户端的发送Activity提供了两个Intent Filter,一个用于发送普通邮件,一个用户发送带有附件的邮件。区分很很容易的,发送普通邮件的那个Intent Filter配置的Action SENDTO,而带有附件的邮件则是SEND,所以是2个不一样,但是哪些比如附加“标题”,“内容”,“抄送”,“发送多人”等等还是通用的。布局文件新增一个按钮,用于发送带有附件的邮件,Activity代码也做修改。

    [html] view plaincopy
     
     
    1. <Button  
    2.     android:id="@+id/send_to_btn"    
    3.     android:layout_width="fill_parent"   
    4.     android:layout_height="wrap_content"   
    5.     android:text="SendTo Action"/>  


     

    [java] view plaincopy
     
     
    1.  /* * 发送邮件测试界面 
    2.  * @author 飞雪无情 个人博客:http://flysnow.iteye.com/ 
    3.  * @since 2011-7-19 
    4.  */  
    5. public class SendEmailActivity extends Activity implements View.OnClickListener{  
    6.     private Button mSendBtn;  
    7.     private Button mSendToBtn;  
    8.     /** Called when the activity is first created. */  
    9.     @Override  
    10.     public void onCreate(Bundle savedInstanceState) {  
    11.         super.onCreate(savedInstanceState);  
    12.         setContentView(R.layout.main);  
    13.         mSendBtn=(Button)findViewById(R.id.send_btn);  
    14.         mSendToBtn=(Button)findViewById(R.id.send_to_btn);  
    15.         mSendBtn.setOnClickListener(this);  
    16.         mSendToBtn.setOnClickListener(this);  
    17.     }  
    18.     @Override  
    19.     public void onClick(View v) {  
    20.         switch(v.getId()){  
    21.         case R.id.send_btn:  
    22.             startSendEmailIntent();  
    23.             break;  
    24.         case R.id.send_to_btn:  
    25.             startSendToEmailIntent();  
    26.             break;  
    27.         }  
    28.     }  
    29.     private void startSendEmailIntent(){  
    30.         Intent data=new Intent(Intent.ACTION_SENDTO);  
    31.         data.setData(Uri.parse("mailto:qq10000@qq.com"));  
    32.         data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com","ls8708@163.com"});  
    33.         data.putExtra(Intent.EXTRA_CC, new String[]{"ls8709@163.com"});  
    34.         data.putExtra(Intent.EXTRA_BCC, new String[]{"ls810@163.com"});  
    35.         data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");  
    36.         data.putExtra(Intent.EXTRA_TEXT, "这是内容");  
    37.         startActivity(data);  
    38.     }  
    39.     private void startSendToEmailIntent(){  
    40.         Intent data=new Intent(Intent.ACTION_SEND);  
    41.         data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com"});  
    42.         data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");  
    43.         data.putExtra(Intent.EXTRA_TEXT, "这是内容");  
    44.         data.putExtra(Intent.EXTRA_STREAM, Uri.parse(""));  
    45.         data.setType("text/plain");  
    46.         startActivity(data);  
    47.     }  
    48. }  


    运行应用,我们看到效果图里最小面的附件标识,说明已经可以发送附件了.


    发送附件最重要的就是Action必须为SEND,type一定要设置setType(""),还要为Intent.EXTRA_STREAM赋值,类型为Uri,一个附件的Uri。这样才能发送附件。

    客户端Email应用的发送Activity配置

               这是Android1.6自带Email客户端的配置,如下:

    [html] view plaincopy
     
     
    1. <activity  
    2.             android:name=".activity.MessageCompose"  
    3.             android:label="@string/app_name"  
    4.             android:enabled="false"  
    5.             >  
    6.             <intent-filter>  
    7.                 <action android:name="android.intent.action.VIEW" />  
    8.                 <action android:name="android.intent.action.SENDTO" />  
    9.                 <data android:scheme="mailto" />  
    10.                 <category android:name="android.intent.category.DEFAULT" />  
    11.                 <category android:name="android.intent.category.BROWSABLE" />  
    12.             </intent-filter>  
    13.             <intent-filter android:label="@string/app_name">  
    14.                 <action android:name="android.intent.action.SEND" />  
    15.                 <data android:mimeType="text/plain" />  
    16.                 <data android:mimeType="image/*" />  
    17.                 <data android:mimeType="video/*" />  
    18.                 <category android:name="android.intent.category.DEFAULT" />  
    19.             </intent-filter>  
    20.         </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地址,抄送,标题,附件等信息的源代码分析.
    [java] view plaincopy
     
     
    1. void initFromIntent(Intent intent) {  
    2.           
    3.         //提取接受人地址列表  
    4.         String[] extraStrings = intent.getStringArrayExtra(Intent.EXTRA_EMAIL);  
    5.         if (extraStrings != null) {  
    6.             addAddresses(mToView, extraStrings);  
    7.         }  
    8. //提取抄送人地址列表  
    9.         extraStrings = intent.getStringArrayExtra(Intent.EXTRA_CC);  
    10.         if (extraStrings != null) {  
    11.             addAddresses(mCcView, extraStrings);  
    12.         }  
    13. //提取密送人地址列表  
    14.         extraStrings = intent.getStringArrayExtra(Intent.EXTRA_BCC);  
    15.         if (extraStrings != null) {  
    16.             addAddresses(mBccView, extraStrings);  
    17.         }  
    18. //提取标题  
    19.         String extraString = intent.getStringExtra(Intent.EXTRA_SUBJECT);  
    20.         if (extraString != null) {  
    21.             mSubjectView.setText(extraString);  
    22.         }  
    23.   
    24.         //提取Uri中的接受人地址  
    25.         final Uri dataUri = intent.getData();  
    26.         if (dataUri != null) {  
    27.             if ("mailto".equals(dataUri.getScheme())) {  
    28.                 initializeFromMailTo(dataUri.toString());  
    29.             } else {  
    30.                 String toText = dataUri.getSchemeSpecificPart();  
    31.                 if (toText != null) {  
    32.                     addAddresses(mToView, toText.split(","));  
    33.                 }  
    34.             }  
    35.         }  
    36.   
    37.        //提取邮件内容  
    38.           
    39.         CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT);  
    40.         if (text != null) {  
    41.             mMessageContentView.setText(text);  
    42.         }  
    43.           
    44.       //提取附件,可以看出Action必须是SEND.EXTRA_STREAM中有数据  
    45.      //type不能为null,这样才能提取倒附件.  
    46.           
    47.         if (Intent.ACTION_SEND.equals(intent.getAction()) && intent.hasExtra(Intent.EXTRA_STREAM)) {  
    48.             String type = intent.getType();  
    49.             Uri stream = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);  
    50.             if (stream != null && type != null) {  
    51.                 if (MimeUtility.mimeTypeMatches(type, Email.ACCEPTABLE_ATTACHMENT_SEND_TYPES)) {  
    52.                     addAttachment(stream);  
    53.                 }  
    54.             }  
    55.         }  
    56.           
    57.         // Finally - expose fields that were filled in but are normally hidden, and set focus  
    58.           
    59.         if (mCcView.length() > 0) {  
    60.             mCcView.setVisibility(View.VISIBLE);  
    61.         }  
    62.         if (mBccView.length() > 0) {  
    63.             mBccView.setVisibility(View.VISIBLE);  
    64.         }  
    65.         setNewMessageFocus();  
    66.         mDraftNeedsSaving = false;  
    67.     }  
  • 相关阅读:
    深入浅出Mybatis系列(一)---Mybatis入门
    深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
    深入浅出Mybatis系列(九)---强大的动态SQL
    ZK请求处理
    ZK配置文件
    ZK数据同步
    集群间通信的消息类型
    ZK客户端
    Zookeeper崩溃恢复过程(Leader选举)
    Windows编程
  • 原文地址:https://www.cnblogs.com/exmyth/p/4581427.html
Copyright © 2020-2023  润新知