Android小项目之--找到本地联络人并向其发邮件(附源码)

2010-06-10 22:02 by Terry_龙, 4015 visits,收藏,编辑

  Google在发表Android手机平台时,强调的是超强大的网络支持能力,因此,无论通过GPRS3G的电信网络或者是Wifi的无线WLAN网络,都能够发EMAIL。  

  继上篇博客使用Intent激活Android自带电话与短信服务,效果很出众,本篇依旧利用Android提供的Intent 接口再做另外一个小程序即邮件的发送。本篇将不介绍Intent如果你想了解 Intent含义,您可以到本篇查看http://www.cnblogs.com/TerryBlog/archive/2010/06/09/1755152.html

  发送邮件中使用的Intent行为为android.content.Intent.ACTION_SEND。实际上在Android上使用的邮件发送服务是调用Gmail程序,而非直接使用SMTPProtocol。现在介绍本篇需要使用到的功能清单:

  • 验证用户输入是否为正确的邮箱格式;
  • 用户可以先把手动输入邮箱,也可以长按邮箱文本框跳到联系人那里找到联系人,得到联系人的邮箱,后返回;
  • 发送邮件。

  程序运行的效果图:

  XML源代码如下:

<? xmlversion="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(StringstrEmail){
    StringstrPattern
    = " ^[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]$ " ;

    Patternp
    = Pattern.compile(strPattern);
    Matcherm
    = 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 OnLongClickListenersearhEmail = new OnLongClickListener(){
    public boolean onLongClick(Viewarg0){
    Uriuri
    = Uri.parse( " content://contacts/people " );
    Intentintent
    = new Intent(Intent.ACTION_PICK,uri);
    startActivityForResult(intent,PICK_CONTACT_SUBACTIVITY);
    return false ;
    }
    ;
    };

    protected void onActivityResult( int requestCode, int resultCode,Intentdata){

    switch (requestCode){
    case PICK_CONTACT_SUBACTIVITY:
    final UriuriRet = data.getData();
    if (uriRet != null )
    {
    try {
    Cursorc
    = managedQuery(uriRet, null , null , null , null );
    c.moveToFirst();
    // 取得联系人的姓名
    StringstrName = c.getString(c.getColumnIndexOrThrow(People.NAME));
    // 取得联系人的EMAIL
    String[]PROJECTION = new String[]{
    Contacts.ContactMethods._ID,
    Contacts.ContactMethods.KIND,
    Contacts.ContactMethods.DATA
    };
    // 查询指定人的Email
    Cursornewcur = managedQuery(
    Contacts.ContactMethods.CONTENT_URI,
    PROJECTION,
    Contacts.ContactMethods.PERSON_ID
    + " =\' "
    + c.getLong(c.getColumnIndex(People._ID)) + " \' " ,
    null , null );
    startManagingCursor(newcur);
    Stringemail
    = "" ;
    if (newcur.moveToFirst())
    {
    email
    = newcur.getString(newcur.getColumnIndex
    (Contacts.ContactMethods.DATA));
    myEditText.setText(email);
    }

    }
    catch (Exceptione){
    // TODO:handleexception
    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"/>
  • 邮件发送程序并不复杂,主要是在EditTextButton控件的构建,通过构造一个自定义的Intent(android.content.Intent.ACTION_SEND)作为传送EmailActivity之用,在该Intent中,还必须使用setType()来决定Email的格式,使用putExtra() 来置入寄件入(EXTRA_EMAIL)、主题(EXTRA_SUBJECT)、邮件内容(EXTRA_TEXT)以及其他Email的字段(EXTRA_BCC、EXTRA_CC)。代码如下:
    myButton.setOnClickListener(
    new OnClickListener(){

    @Override
    public void onClick(Viewv){
    // TODOAuto-generatedmethodstub

    IntentmailIntent
    = 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有许多种写法,本篇例子只是其中之一。下面把其他的方法共享给大家:

  1.  方法二 Uriuri = Uri.parse( " mailto:terryyhl@gmail.com " );
    IntentMymailIntent
    = new Intent(Intent.ACTION_SEND,uri);
    startActivity(MymailIntent);

  2. 方法三 Intenttestintent = new Intent(Intent.ACTION_SEND);
    String[]tos
    = { " terryyhl@gmail.com " };
    String[]ccs
    = { " kalaicheng@hotmail.com " };
    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,
    " 发送 " ));

  3. 方法四,传附件,这里以SD卡的音乐文件为例 IntenttestN = new Intent(Intent.ACTION_SEND);
    testN.putExtra(Intent.EXTRA_SUBJECT,
    " 标题 " );
    testN.putExtra(Intent.EXTRA_STREAM,
    " file:///sdcard/music.mp3 " );
    startActivity(Intent.createChooser(testN,
    " 发送 " ));

         
  4. 使用javamail。这里我就不介绍javamail的实现方法了,有兴趣的话可以到这里看一下,网上找到的一篇比较详细的文章http://www.javaeye.com/topic/352753
  5. 由于目前模拟器未内置Gmail Client端程序,因此发送Email程序在送出数据后,模拟器上会发出 “No Application can perform this action”,本人没有Android手机,故无法测试,还请有Android手机的园友能够在测试后,将结果反馈给我,谢谢。

源码下载:/Files/TerryBlog/sendEmail.rar

好了,今天就到此为止,如果你有什么疑问或者建议请:QQ285735942Email:terryyhl@gmail.com


原文链接:http://www.cnblogs.com/TerryBlog/archive/2010/06/10/1755911.html

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 箭头函数的基础使用
  3. NPM 和webpack 的基础使用
  4. Python list sort方法的具体使用
  5. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  6. python list.sort()根据多个关键字排序的方法实现
  7. android上一些方法的区别和用法的注意事项
  8. android 使用html5作布局文件: webview跟javascript交互
  9. android实现字体闪烁动画的方法

随机推荐

  1. Android中文API(114)——TabWidget
  2. Android动画学习三(Activity跳转动画)
  3. adb shell am 的用法
  4. android 反射应用
  5. mono for android 各版本下载地址
  6. Android扩展 - 拍照篇(Camera)
  7. ANDROID GUI
  8. android之uses-permission权限配置
  9. Android(安卓)之WebView实现下拉刷新和其
  10. android通过代码判断手机是否root