今天学习了一下如何获取手机中联系人的信息。主要有两种方法。
一、通过contentProvider获取com.android.contacts中的数据库信息,在该数据库中存在两张表,一张是contacts表,用于存放联系人id,另一张是data表,用于存放联系人信息。
Uri的信息应设置为
<span style="font-size:18px;"> Uri uri=Uri.parse("content://com.android.contacts/contacts");//获取contacts表
Uri uri2=Uri.parse("content://com.android.contacts/data");//获取data表</span>
然后通过cursor查询到"_id",这是联系人的id属性名
<span style="font-size:18px;">Cursor cursor = context.getContentResolver().query(uri, new String[]{"_id"}, null, null, null);</span>
<span style="font-size:18px;">在data表中的统一个联系的name信息和phone信息是分两行存放的</span>
<span style="font-size:18px;"><pre name="code" class="java">while (cursor2.moveToNext()){
String data = cursor1.getString(0);//data表中第0列是联系人信息
String mimetype = cursor1.getString(1);//data表中第1列是信息类型
if(mimetype.equals("vnd.android.cursor.item/name")){
System.out.println("第"+id+"个名字:"+data);
}else if(mimetype.equals("vnd.android.cursor.item/phone_v2")){
System.out.println("第"+id+"个电话:"+data);
}
}</span>
源码如下
<span style="font-size:18px;"><pre name="code" class="html">public class ReadContactsEngine {
public void readContacts(Context context){
Uri uri1=Uri.parse("content://com.android.contacts/contacts");//获取contacts表
Uri uri2=Uri.parse("content://com.android.contacts/data");//获取data表
Cursor cursor1 = context.getContentResolver().query(uri1, new String[]{"_id"}, null, null, null);
while (cursor1.moveToNext()){
String id = cursor1.getString(0);//contas表中第0列即为联系人的id
Cursor cursor2 = context.getContentResolver().query(uri2, new String[]{"data1", "mimetype"}, "raw_contact_id=?", new String[]{id}, null);
while (cursor2.moveToNext()){
String data = cursor1.getString(0);//data表中第0列是联系人信息
String mimetype = cursor1.getString(1);//data表中第1列是信息类型
if(mimetype.equals("vnd.android.cursor.item/name")){
System.out.println("第"+id+"个名字:"+data);
}else if(mimetype.equals("vnd.android.cursor.item/phone_v2")){
System.out.println("第"+id+"个电话:"+data);
}
}
}
}
}</span>
注意需要加权限:
<span style="font-size:18px;"> <uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/></span>
在单元测试看到查询结果
07-03 23:45:44.938 3923-3937/? I/System.out: 第1个电话:1 534-443-3607
07-03 23:45:44.938 3923-3937/? I/System.out: 第1个名字:Tom
07-03 23:45:44.942 3923-3937/? I/System.out: 第2个电话:1 234-545-6537
07-03 23:45:44.942 3923-3937/? I/System.out: 第2个名字:Kitty
07-03 23:45:44.942 3923-3937/? I/System.out: 第3个电话:1 821-609-0742
07-03 23:45:44.942 3923-3937/? I/System.out: 第3个名字:Sum
获取的联系人信息需要保存起来,创建一个ContactBea类用于封装联系人信息
public class UrlBean {
private String version;
public String getVersion() {
return version;
}
public String getUrl() {
return url;
}
public String getDesc() {
return desc;
}
private String url;
public void setVersion(String version) {
this.version = version;
}
public void setUrl(String url) {
this.url = url;
}
public void setDesc(String desc) {
this.desc = desc;
}
private String desc;
}
ReadContactsEngine类改成如下:
public class ReadContactsEngine {
/**
*
* @param context 传递一个上下文参数
* @return 返回ContactBean集合
*/
public static ArrayList<ContactBean> readContacts(Context context){
Uri uri1=Uri.parse("content://com.android.contacts/contacts");//获取contacts表
Uri uri2=Uri.parse("content://com.android.contacts/data");//获取data表
Cursor cursor1 = context.getContentResolver().query(uri1, new String[]{"_id"}, null, null, null);
ArrayList<ContactBean> beans=new ArrayList<ContactBean>();//用于存放联系人的容器
while (cursor1.moveToNext()){
String id = cursor1.getString(0);//contas表中第0列即为联系人的id
ContactBean bean=new ContactBean();
Cursor cursor2 = context.getContentResolver().query(uri2, new String[]{"data1", "mimetype"}, "raw_contact_id=?", new String[]{id}, null);
while (cursor2.moveToNext()){
String data = cursor2.getString(0);//data表中第0列是联系人信息
String mimetype = cursor2.getString(1);//data表中第1列是信息类型
if(mimetype.equals("vnd.android.cursor.item/name")){
bean.setName(data);//保存联系人的名字
}else if(mimetype.equals("vnd.android.cursor.item/phone_v2")){
bean.setPhone(data);//保存联系人的号码
}
}
cursor2.close();//关闭cursor1
beans.add(bean);
}
cursor1.close();//关闭cursor2
return beans;
}
}
</pre><p><strong>在listView中显示联系人信息</strong></p><p><strong></strong><pre name="code" class="java">public class ContactsActivity extends ListActivity {
private static final int LOADING=1;//ListActivity中只有ListView组件
private static final int FINISH = 2;
private ProgressDialog pd;
private List<ContactBean> datas=new ArrayList<ContactBean>();//用于显示在ListView中的联系人
private MyAdapter adapter;
private ListView lv_conta;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lv_conta = getListView();
adapter = new MyAdapter();
lv_conta.setAdapter(adapter);
//填充数据
initData();
initEnvent();
}
/**
* 初始化ListView的Item的点击事件
*/
private void initEnvent() {
lv_conta.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ContactBean bean=datas.get(position);
String phone=bean.getPhone();
Intent intent=new Intent();
intent.putExtra(MyConstant.SAFENUMBER,phone);
setResult(1,intent);
finish();
}
});
}
/**
* handler
*/
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case LOADING:
pd = new ProgressDialog(ContactsActivity.this);
pd.setTitle("提醒");
pd.setMessage("正在加载数据,请等候....");
pd.show();
break;
case FINISH:
if(pd!=null)
{
pd.dismiss();//关闭对话框
pd=null;//释放内存
}
adapter.notifyDataSetChanged();//通知适配器去取数据
break;
default:
break;
}
}
};
/**
* 初始化ListView中的数据
*/
private void initData() {
//获取数据是耗时的操作,需在子线程进行
new Thread(){
@Override
public void run() {
Message msg = Message.obtain();
msg.what=LOADING;
handler.sendMessage(msg);
// SystemClock.sleep(5000);//模拟耗时操作
datas= ReadContactsEngine.readContacts(getApplicationContext());
//加载完成
Message msg1 = Message.obtain();
msg.what=FINISH;
handler.sendMessage(msg1);
}
}.start();
}
public class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=View.inflate(getApplicationContext(),R.layout.setupactivity3_contact_lv,null);
TextView tv_name= (TextView) view.findViewById(R.id.tv_contactsName);
TextView tv_phone= (TextView) view.findViewById(R.id.tv_contactsPhone);
ContactBean bean=datas.get(position);
tv_name.setText(bean.getName());
tv_phone.setText(bean.getPhone());
System.out.println("姓名:"+tv_name.getText()+"电话:"+tv_phone.getText());
return view;
}
}
}