Android小專案之--找到本地聯絡人並向其發郵件(附原始碼)

weixin_34321977發表於2010-06-10

  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

 

相關文章