一、需求
最近開發的一個應用中,給手機中的好友轉賬,那麼需要選擇使用者手機中的聯系人,作為收款賬号。先看看效果:
1、主界面
2、點選收款賬号右邊的圖示按鈕之後,跳到手機聯系人頁面
3、選取聯系人之後
二、理論知識
作為一個完成的應用程式,資料存儲操作是必不可少的。是以,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;
}
}