在Android中发送邮件是使用Intent()函数的android.content.Intent.ACTION_SEND方法,但实际上在Android上使用的邮件发送服务是Gmail程序,而非直接使用SMTP的Protocol。现在介绍本文需要使用到的功能清单:
验证用户输入的邮箱是否为合法的邮箱格式;
用户可以手动输入邮箱地址,也可以长按邮箱文本框跳到联系人那里找到联系人,得到联系人的邮箱后进行发送邮件。
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget34"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:background="@drawable/white"
>
<TextView
android:id="@+id/myTextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="60px"
android:layout_y="22px"
android:text="@string/str_receive"
/>
<TextView
android:id="@+id/myTextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="60px"
android:layout_y="82px"
android:text="@string/str_cc"
/>
<EditText
android:id="@+id/myEditText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_x="120px"
android:layout_y="12px"
android:textsize="18sp"
/>
<EditText
android:id="@+id/myEditText2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_x="120px"
android:layout_y="72px"
android:textsize="18sp"
/>
<Button
android:id="@+id/myButton1"
android:layout_width="wrap_content"
android:layout_height="124px"
android:layout_x="0px"
android:layout_y="2px"
android:text="@string/str_button"
type="submit"
/>
<TextView
android:id="@+id/myTextView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="60px"
android:layout_y="142px"
android:text="@string/str_subject"
/>
<EditText
android:id="@+id/myEditText3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_x="120px"
android:layout_y="132px"
android:textsize="18sp"
/>
<EditText
android:id="@+id/myEditText4"
android:layout_width="fill_parent"
android:layout_height="209px"
android:layout_x="0px"
android:layout_y="202px"
android:textsize="18sp"
/>
</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能够实现自定义的方法,使得在处理一些特定的数据时,对于数据的存储/检索更加简单。
用户长按文本框后,得通过 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) {
Toast.makeText(sendEmailActivity.this, e.toString(), 1000).show();
}
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
};
注意使用Content Provider查找联系必须在配置文件里面配置权限,具体权限如下:
邮件发送程序并不复杂,主要是在 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) {
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)));
}
});