一、需求
最近开发的一个应用中,给手机中的好友转账,那么需要选择用户手机中的联系人,作为收款账号。先看看效果:
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;
}
}