Google 在發表 Android 手機平台時,強調的是超強大的網絡支持能力,因此,無論通過 GPRS、3G的電信網絡或者是Wifi的無線WLAN網絡,都能夠發EMAIL。
繼上篇博客使用 Intent 激活 Android 自帶電話與短信服務,效果很出眾,本篇依舊利用 Android 提供的Intent 接口再做另外一個小程序即郵件的發送。本篇將不介紹 Intent 如果你想了解 Intent含義,您可以到本篇查看 http://www.fengfly.com/plus/view-181811-1.html。
發送郵件中使用的Intent 行為為 android.content.Intent.ACTION_SEND 。實際上在 Android 上使用的郵件發送服務是調用Gmail程序,而非直接使用SMTP的Protocol 。現在介紹本篇需要使用到的功能清單:
- 驗證用戶輸入是否為正確的郵箱格式;
- 用戶可以先把手動輸入郵箱,也可以長按郵箱文本框跳到聯系人那裡找到聯系人,得到聯系人的郵箱,後返回;
- 發送郵件。
程序運行的效果圖:
XML源代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@ id/widget34"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/white"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<TextView
android:id="@ id/myTextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_receive"
android:layout_x="60px"
android:layout_y="22px"
>
</TextView>
<TextView
android:id="@ id/myTextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_cc"
android:layout_x="60px"
android:layout_y="82px"
>
</TextView>
<EditText
android:id="@ id/myEditText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="120px"
android:layout_y="12px"
>
</EditText>
<EditText
android:id="@ id/myEditText2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="120px"
android:layout_y="72px"
>
</EditText>
<Button
android:id="@ id/myButton1"
android:layout_width="wrap_content"
android:layout_height="124px"
android:text="@string/str_button"
android:layout_x="0px"
android:layout_y="2px"
>
</Button>
<TextView
android:id="@ id/myTextView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_subject"
android:layout_x="60px"
android:layout_y="142px"
>
</TextView>
<EditText
android:id="@ id/myEditText3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="120px"
android:layout_y="132px"
>
</EditText>
<EditText
android:id="@ id/myEditText4"
android:layout_width="fill_parent"
android:layout_height="209px"
android:textSize="18sp"
android:layout_x="0px"
android:layout_y="202px"
>
</EditText>
</AbsoluteLayout>
- 判斷用戶輸入郵箱是否正確方法為:
public static boolean isEmail(String strEmail) {
String strPattern = "^[a-zA-Z][\\w\\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w\\.-]*[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z\\.]*[a-zA-Z]$";
Pattern p = Pattern.compile(strPattern);
Matcher m = p.matcher(strEmail);
return m.matches();
}
- 記得之前在MM開發社區有網友發過請教貼,請教如何從一個Activity跳轉到另一個Activity後得到需要的數據後返回加載到原有的Activitiy所在的控件上,大致原理是這樣的,一般程序做跳轉都是用StartAcivity方法,如果想實現跳轉並取值返回,就需要用到startActivityForResult(intent,requestCode),其中requestCode為一個Activity要返回值的依據,可以為任意int類型。你可以自己定義常量,也可以自己指定數字。程序覆蓋了onActivityResult()這個方法,令程序收到result後,再重新加載寫回原本需要加載的控件上。本例中調了文本框的長按事件,當文本框長按即自行跳轉到聯系人頁面上,點擊需要的聯系人名稱返回該聯系人的郵箱號回到我們的主程序窗口並加載到文本上。
問題:如何找到聯系人並查詢它的郵箱號?這裡用到的是Content Provider。
關於Content Provider
如果你要公開你的數據,你可以創建或者使用一個Content Provider。它是一個能使所以應用程度都能存儲和檢索數據的對象。它是唯一在包和包之間分享數據的方法;因為不存在那種供所有的包來共享的一般存儲空間。Android自帶了一些Content Provider,它們用於一些一般的數據類型(音頻,視頻,圖片,個人聯系信息等等)。您能從 Provider這個包中看到一些Android自帶的Content Provider。到底表面之下一個Content Provider是如何存儲數據的決定於這個Content Provider是如何實現的,但是所有的Content Provider必須實現一種一般公約用來數據查詢和一種一般公約來返回結果。然而,一個Content Provider能夠實現自定義的方法,使得在處理一些特定的數據時,對於數據的存儲/檢索更加簡單。
具體的使用方法在這裡不多解釋你可以參照Google這裡給出的文檔解釋:http://docs.google.com/Doc?id=d38b5gp_132fmkfpjg3g3
用戶長按文本框後,得通過 Content Provider查找跳轉到聯系人中心,查找用戶並返回郵箱代碼如下:
private OnLongClickListener searhEmail=new OnLongClickListener(){
public boolean onLongClick(View arg0) {
Uri uri=Uri.parse("content://contacts/people");
Intent intent=new Intent(Intent.ACTION_PICK,uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
return false;
}
;
};
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICK_CONTACT_SUBACTIVITY:
final Uri uriRet=data.getData();
if(uriRet!=null)
{
try {
Cursor c=managedQuery(uriRet, null, null, null, null);
c.moveToFirst();
//取得聯系人的姓名
String strName=c.getString(c.getColumnIndexOrThrow(People.NAME));
//取得聯系人的EMAIL
String[] PROJECTION=new String[]{
Contacts.ContactMethods._ID,
Contacts.ContactMethods.KIND,
Contacts.ContactMethods.DATA
};
//查詢指定人的Email
Cursor newcur=managedQuery(
Contacts.ContactMethods.CONTENT_URI,
PROJECTION,
Contacts.ContactMethods.PERSON_ID "=\'"
c.getLong(c.getColumnIndex(People._ID)) "\'",
null, null);
startManagingCursor(newcur);
String email="";
if(newcur.moveToFirst())
{
email=newcur.getString(newcur.getColumnIndex
(Contacts.ContactMethods.DATA));
myEditText.setText(email);
}
} catch (Exception e) {
// TODO: handle exception
Toast.makeText(sendEmailActivity.this, e.toString(), 1000).show();
}
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
};
注意使用Content Provider查找聯系必須在配置文件裡面配置權限,具體權限如下:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
- 郵件發送程序並不復雜,主要是在 EditText 、Button 控件的構建,通過構造一個自定義的 Intent(android.content.Intent.ACTION_SEND)作為傳送 Email 的 Activity 之用,在該Intent中,還必須使用 setType()來決定 Email的格式,使用 putExtra() 來置入寄件入(EXTRA_EMAIL)、主題(EXTRA_SUBJECT)、郵件內容(EXTRA_TEXT)以及其他Email的字段(EXTRA_BCC、EXTRA_CC)。代碼如下:
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent mailIntent=new Intent(android.content.Intent.ACTION_SEND);
mailIntent.setType("plain/test");
strEmailReciver=new String[]{ myEditText.getText().toString() };
strEmailCC=new String[]{myEditText2.getText().toString()};
strEmailSubject=myEditText3.getText().toString();
strEmailBody=myEditText4.getText().toString();
mailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, strEmailReciver);
mailIntent.putExtra(android.content.Intent.EXTRA_CC, strEmailCC);
mailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, strEmailSubject);
mailIntent.putExtra(android.content.Intent.EXTRA_TEXT, strEmailBody);
startActivity(Intent.createChooser(mailIntent, getResources().getString(R.string.send)));
}
});
小結:
在Android中發送Email有許多種寫法,本篇例子只是其中之一。下面把其他的方法共享給大家:
- 方法二
Uri uri=Uri.parse("mailto:[email protected]");
Intent MymailIntent=new Intent(Intent.ACTION_SEND,uri);
startActivity(MymailIntent);
- 方法三
Intent testintent=new Intent(Intent.ACTION_SEND);
String[] tos={"[email protected]"};
String[] ccs={"[email protected]"};
testintent.putExtra(Intent.EXTRA_EMAIL, tos);
testintent.putExtra(Intent.EXTRA_CC, ccs);
testintent.putExtra(Intent.EXTRA_TEXT, "這是內容");
testintent.putExtra(Intent.EXTRA_SUBJECT, "這是標題");
testintent.setType("message/rfc822");
startActivity(Intent.createChooser(testintent, "發送"));
- 方法四,傳附件,這裡以SD卡的音樂文件為例
Intent testN=new Intent(Intent.ACTION_SEND);
testN.putExtra(Intent.EXTRA_SUBJECT, "標題");
testN.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/music.mp3");
startActivity(Intent.createChooser(testN, "發送"));
- 使用javamail。這裡我就不介紹javamail的實現方法了,有興趣的話可以到這裡看一下,網上找到的一篇比較詳細的文章http://www.javaeye.com/topic/352753
- 由於目前模擬器未內置Gmail Client端程序,因此發送Email程序在送出數據後,模擬器上會發出 “No Application can perform this action”,本人沒有Android手機,故無法測試,還請有Android手機的園友能夠在測試後,將結果反饋給我,謝謝。
源碼下載:/Files/TerryBlog/sendEmail.rar