生活随笔
收集整理的這篇文章主要介紹了
Android邮件发送详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載:http://flysnow.iteye.com/blog/1128354
Android中我為什么發不了郵件???我手機里明明有郵件客戶端的,可我為什么不能調用它發送郵件???相信這是很多人會問的問題,手機里有Email客戶端,可是偏偏在自己的應用里調用不了,抑或是不知道怎么調用,還有的是一直認為自己寫對了,可是偏偏不能調用,無奈之下只能卻網上找段代碼粘貼上,ok,可以了。。可是你知道別人的代碼為什么可以?你知道調用Email是怎么工作的嗎?如果你又像給多人發郵件,還想發送附件,怎么做?又迷糊了吧?所以需要搞懂原理才能一通百通,舉一反三,而這就是這篇博文要寫的,也是你可以在這篇博文中學到的。
我們新建一個工程SendEmail,基于Android1.6實現。然后定義布局文件和代碼如下:
Xml代碼:
[html]?view plaincopy
<?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代碼:
[java]?view plaincopy
?public?class?SendEmailActivity?extends?Activity?implements?View.OnClickListener{??????private?Button?mSendBtn;??????????@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);??????}??}??
這是我們運行應用,點擊按鈕就會看到如下效果:
?
?
分析發送代碼?
?
主要的發送代碼如下:
[java]?view plaincopy
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地址,如果數組中有多個地址,就可以發送給多人。發送的函數修改如下,我們看下效果:
[java]?view plaincopy
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代碼也做修改。
?
[html]?view plaincopy
<Button??????android:id="@+id/send_to_btn"????????android:layout_width="fill_parent"???????android:layout_height="wrap_content"???????android:text="SendTo?Action"/>??
?
[java]?view plaincopy
?public?class?SendEmailActivity?extends?Activity?implements?View.OnClickListener{??????private?Button?mSendBtn;??????private?Button?mSendToBtn;??????????@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客戶端的配置,如下:
?
[html]?view plaincopy
<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. 附加Email客戶端中提取Email地址,抄送,標題,附件等信息的源代碼分析.
[java]?view plaincopy
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);??????????}????????????????????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);??????????}?????????????????????????????????????????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);??????????????????}??????????????}??????????}??????????????????????????????????????if?(mCcView.length()?>?0)?{??????????????mCcView.setVisibility(View.VISIBLE);??????????}??????????if?(mBccView.length()?>?0)?{??????????????mBccView.setVisibility(View.VISIBLE);??????????}??????????setNewMessageFocus();??????????mDraftNeedsSaving?=?false;??????}??
轉載于:https://www.cnblogs.com/exmyth/p/4581427.html
總結
以上是生活随笔為你收集整理的Android邮件发送详解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。