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

