代码改变世界

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

2010-06-10 22:02  Terry_龙  阅读(9848)  评论(11编辑  收藏  举报

  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源代码如下:

<?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, nullnullnullnull);
                        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))+"\'"
                                 
    nullnull);
                        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有许多种写法,本篇例子只是其中之一。下面把其他的方法共享给大家:

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

     

  2. 方法三
    Intent testintent=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卡的音乐文件为例
     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, 
    "发送"));

     

         
  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

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