? ? ? ? 版權所有@飛雪無情, 轉載請著名出處: http://flysnow.iteye.com/blog/1128354
?
?
? ? ? Android中我為什么發(fā)不了郵件???我手機里明明有郵件客戶端的,可我為什么不能調用它發(fā)送郵件??? 相信這是很多人會問的問題,手機里有Email客戶端,可是偏偏在自己的應用里調用不了,抑或是不知道怎么調用, 還有的是一直認為自己寫對了,可是偏偏不能調用,無奈之下只能卻網(wǎng)上找段代碼粘貼上,ok,可以了。??墒悄? 知道別人的代碼為什么可以?你知道調用Email是怎么工作的嗎?如果你又像給多人發(fā)郵件,還想發(fā)送附件,怎么做? 又迷糊了吧?所以需要搞懂原理才能一通百通,舉一反三,而這就是這篇博文要寫的,也是你可以在這篇博文中學到的。
?
在這里你可以學到:
?
- 什么是Intent和Intent Fileter
- 如何發(fā)送Email
- 如何發(fā)送特定的標題和內(nèi)容的Emil
- 如何發(fā)送給多人
- 如何抄送和密送
- 如何發(fā)送附件
一:什么是 Intent和Intent Fileter
關于這個詳細介紹請參考 :
Android系列教程之十:Intents and Intent Filters(一)
Android系列教程之十一:Intents and Intent Filters(二) ?
Android系列教程之十二:Intents and Intent Filters(三) ?
二:如何發(fā)送Email
? ? ? ? ? 通過上面就會知道Android應用之間的通信是通過Intent這個東西,如果手機中有實現(xiàn)了你想要功能的應用 那么你就不用麻煩去實現(xiàn)一個拉。直接使用就可以,比如這里的發(fā)送郵件。
我們新建一個工程SendEmail,基于Android1.6實現(xiàn)。然后定義布局文件和代碼如下:
?
<?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>
?
/** 發(fā)送郵件測試界面 * @author 飛雪無情 個人博客:http://flysnow.iteye.com/ * @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, "這是內(nèi)容"); startActivity(data); } }
? ? 這是我們運行應用,點擊按鈕就會看到如下效果:
?
三:分析發(fā)送代碼?
主要的發(fā)送代碼如下:
?
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, "這是內(nèi)容"); startActivity(data);
- ?首先構造一個Action為SENDTO的Action
- 其次創(chuàng)建一個Uri,他是一個mailto的郵件鏈接,也就是接收地址.
- 再通過Intent.EXTRA_SUBJECT和Intent.EXTRA_TEXT傳遞標題和文本的數(shù)據(jù),記住,一定要使用這些常量,這是標準,否則Email客戶端不認識,那樣你傳遞的標題和文本就不起作用了。
- 然后就是startActivity進行打開,系統(tǒng)會根據(jù)Intent自動匹配找到能處理這個intent的應用,如圖列表,有很多個,我們這里選擇網(wǎng)易掌上郵,就打開了一個郵件發(fā)送界面,如我們所愿,郵件地址、標題和內(nèi)容都在了,很成功.
- intent中的數(shù)據(jù)傳遞是以Extra的方式進行put后傳遞的,然后在使用的時候getter取出使用。
四:發(fā)送給多人以及抄送和密送
發(fā)送給多人以及抄送和密送都很簡單,查找Intent類中的Extra常量,發(fā)送有這么三個常量:Intent.EXTRA_EMAIL,Intent.EXTRA_CC,Intent.EXTRA_BCC。這三個分別用于傳遞“接受人地址列表”、“抄送人地址列表”和“密送人地址列表”,傳遞的都是String[]類型的Email地址,如果數(shù)組中有多個地址,就可以發(fā)送給多人。發(fā)送的函數(shù)修改如下,我們看下效果:
?
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, "這是內(nèi)容"); startActivity(data); }
五,發(fā)送附件
Email'客戶端的發(fā)送Activity提供了兩個Intent Filter,一個用于發(fā)送普通郵件,一個用戶發(fā)送帶有附件的郵件。 區(qū)分很很容易的,發(fā)送普通郵件的那個Intent Filter配置的Action SENDTO,而帶有附件的郵件則是SEND,所以是2個不一樣,但是哪些比如附加“標題”,“內(nèi)容”,“抄送”,“發(fā)送多人”等等還是通用的。 布局文件新增一個按鈕,用于發(fā)送帶有附件的郵件,Activity代碼也做修改。
?
<Button android:id="@+id/send_to_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="SendTo Action"/>?
/* * 發(fā)送郵件測試界面 * @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, "這是內(nèi)容"); 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, "這是內(nèi)容"); data.putExtra(Intent.EXTRA_STREAM, Uri.parse("")); data.setType("text/plain"); startActivity(data); } }
?運行應用,我們看到效果圖里最小面的附件標識,說明已經(jīng)可以發(fā)送附件了.
?
發(fā)送附件最重要的就是Action必須為SEND,type一定要設置setType(""),還要為Intent.EXTRA_STREAM賦值,類型為Uri,一個附件的Uri。這樣才能發(fā)送附件。
六,客戶端Email應用的發(fā)送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用于發(fā)送不同類型郵件。
- SENDTO發(fā)送普通郵件,SEND可以發(fā)送普通和帶有附件的,不過最好主要用于發(fā)送附件。
- 使用SENDTO時,必須為Intent設置Data,也就是Uri,內(nèi)容為"mailto:emailaddr",否則不能匹配,因為有schema必須為mailto的限制
- 使用SEND時必須要設置type,也就是使用setType()方法,type只能為以前xml定義的4個。不過我測試了text/*也可以,其他的沒測試.
- 發(fā)送附件只能使用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(",")); } } } //提取郵件內(nèi)容 CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT); if (text != null) { mMessageContentView.setText(text); } //提取附件,可以看出Action必須是SEND.EXTRA_STREAM中有數(shù)據(jù) //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; }
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
