天天看點

android開發步步為營之19:選取手機通訊錄中的聯系人

一、需求

最近開發的一個應用中,給手機中的好友轉賬,那麼需要選擇使用者手機中的聯系人,作為收款賬号。先看看效果:

1、主界面

android開發步步為營之19:選取手機通訊錄中的聯系人

2、點選收款賬号右邊的圖示按鈕之後,跳到手機聯系人頁面

android開發步步為營之19:選取手機通訊錄中的聯系人

3、選取聯系人之後

android開發步步為營之19:選取手機通訊錄中的聯系人

二、理論知識

作為一個完成的應用程式,資料存儲操作是必不可少的。是以,Android系統一共提供了四種資料存儲方式。分别是:SharePreference、SQLite、Content Provider和File。由于Android系統中,資料基本都是私有的的,都是存放于“data/data/程式包名”目錄下,是以要實作資料共享,正确方式是使用Content Provider。

  SQLite: SQLite是一個輕量級的資料庫,支援基本SQL文法,是常被采用的一種資料存儲方式。Android為此資料庫提供了一個名為SQLiteDatabase的類,封裝了一些操作資料庫的API。

  SharedPreference: 除SQLite資料庫外,另一種常用的資料存儲方式,其本質就是一個xml檔案,常用于存儲較簡單的參數設定。

  File: 即常說的檔案(I/O)存儲方法,常用語存儲大數量的資料,但是缺點是更新資料将是一件困難的事情。

  ContentProvider: Android系統中能實作所有應用程式共享的一種資料存儲方式,由于資料通常在各應用間的是互相私密的,是以此存儲方式較少使用,但是其又是必不可少的一種存儲方式。例如音頻,視訊,圖檔和通訊錄,一般都可以采用此種方式進行存儲。每個Content Provider都會對外提供一個公共的URI(包裝成Uri對象),如果應用程式有資料需要共享時,就需要使用Content Provider為這些資料定義一個URI,然後其他的應用程式就通過Content Provider傳入這個URI來對資料進行操作。

         PS: URI由3個部分組成:"content://"、資料的路徑、辨別ID(可選)。

    比如選擇聯系人手機号碼的uri是:content://com.android.contacts/data/phones

三、代碼實作

 好,現在,我們來看看如何實作。其實比較簡單

第一步、給按鈕注冊事件

// 選擇聯系人

       contactBtn.setOnClickListener(new OnClickListener() {

           @Override

           public void onClick(View v) {

              // 從手機聯系人選擇

              Intent intent = new Intent(Intent.ACTION_PICK,

                     android.provider.ContactsContract.Contacts.CONTENT_URI);

              startActivityForResult(intent, REQ_CODE);

           }

       });

第二步、選取好聯系人之後,轉賬首頁面在onActivityResult擷取傳回的結果

// 擷取activiy傳回結果

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

       // TODO Auto-generated method stub

       super.onActivityResult(requestCode, resultCode, data);

       //得到選中的聯系人資料

       Cursor c = null;

       switch (requestCode) {

       case REQ_CODE:

           if (data == null) {

              return;

           }

           try {

              if (data != null) {

                  //我們可以發現聯系人資料是通過Content Provider來共享給所有的應用的

                  c = getContentResolver().query(data.getData(), null, null,

                         null, null);

              }

              if (c != null) {

                  c.moveToFirst();

                  //擷取聯系人編号

                  int contactId = c.getInt(c

                         .getColumnIndex(ContactsContract.Contacts._ID));

                    //通過聯系人編号擷取聯系人手機号碼、姓名等等資料

                  Cursor phones = getContentResolver().query(

                         ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

                         null,

                         ContactsContract.CommonDataKinds.Phone.CONTACT_ID

                                + " = " + contactId, null, null);

                  String strPhoneNum = null;

                  String strPhoneName = null;

                  if (phones.getCount() > 0) {

                     // phones.moveToFirst();

                     for (int i = 0; i < phones.getCount(); i++) {

                         phones.moveToPosition(i);

                         //得到手機号碼

                         String tmpPhoneNum = phones

                                .getString(phones

                                       .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                         //得到聯系人姓名

                         String tmpPhoneName = phones

                                .getString(phones

                                       .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                         if (tmpPhoneNum != null) {

                            String valStr = tmpPhoneNum.replace("+86", "")

                                   .replaceAll("-", "");

                            if (StringUtil.isMobile(valStr)

                                   || i == phones.getCount() - 1) {

                                strPhoneNum = tmpPhoneNum;

                                strPhoneName = tmpPhoneName;

                                break;

                            }

                         }

                     }

                     phones.close();// 記得關閉

                  }

                  if (strPhoneNum == null || strPhoneNum.equals("null")) {

                     strPhoneNum = "";

                  }

                  String phoneNum = strPhoneNum;

                  phoneNum = phoneNum.replace("+86", "").replaceAll("-", "");

                  String showTxt = phoneNum;

                  if (strPhoneName != null) {

                     strPhoneName = strPhoneName.replace("+86", "")

                            .replaceAll("-", "");

                     if (!strPhoneName.equals(phoneNum)) {

                         showTxt = showTxt + "(" + strPhoneName + ")";

                     }

                  }

                  //顯示格式:手機号碼+(姓名)

                  transferAccountEdit.setText(showTxt);

                  transferAccountEdit.setSelection(showTxt.length());

                  c.close();

              }

           } catch (Exception e) {

              e.getMessage();

           }

           break;

       default:

           break;

       }

    }