今天要实现的是读取手机联系人,并显示在上一篇文章我们已经开发出的界面上,最终效果图如下:
在上一篇文章中,我们已经开发了手机短信的主界面. 由于是短信应用开发,当然要从短信数据库读取数据了,但是,在我们实际使用的短信应用中,除了要显示短信内容外,还要显示短信联系人头像,而联系人头像是无法直接从手机短信数据库中读取的(也可能是我不知道这个方法而已,嘿嘿),所以必须还要读取手机联系人数据库才能获得短信联系人的头像数据, 因此,还是得从读取手机联系人数据库开始吧,今天我们的任务就是从读取手机通讯录,把联系人的信息显示在界面上,下面进入正文。
手机联系人数据库所在的路径是:/data/data/com.android.providers.contacts/databases/contacts2.db,我们先来看一下数据库里都有哪些表吧,打开数据库,如下所示:
可以看到数据库里有一大堆的表,在最下面显示的是数据库中定义的视图,通过视图可以很方便的取得需要的数据,不需通过多表连接查询,下面我们就是直接通过phone视图来查询的。在这么多的表当中,比较重要的有三个,分别是contacts,data和raw_contacts表,表的主要字段说明参考自本文开头的链接文章,地址为http://xys289187120.blog.51cto.com/3361352/656766,下面给出。
1.contacts表
_id:联系人id
photo_id:联系人头像id
times_contacted:与该联系人通话次数
last_time_contacted:最后一次通话的时间
2.raw_contacts表
displayname:联系人名称
contact_id:与contact表的_id对应,用于连结raw_contacts表与contacts表
deleted:删除标志,0为默认,1表示此联系人已被删除
3.data表
raw_contact_id:与raw_contacts表的_id对应,可连结data表与raw_contacts表
data1至data15列保存了联系人的详细信息,如联系人名称,电话号码,Email,备注等
下面给出程序实现代码,MainActivity是应用的启动Activity,MessageListAdapter是显示信息的ListView的适配器,继承自BaseAdapter,MessageHolder用于装载每条信息列表项包含的控件,ContactData联系人的JavaBean类,具体如下所示。另外,项目需要AndroidManifest.xml文件中配置手机联系人读取权限,在文件中增加如下声明:
<uses-permission android:name="android.permission.READ_CONTACTS"/>。
1.MainActivity.java
package com.example.mymessageproject;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView messageListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messageListView = (ListView)this.findViewById(R.id.listView1);
MessageListAdapter adapter = new MessageListAdapter(this);
adapter.getPhoneContacts();
messageListView.setAdapter(adapter);
//实时通知数据已更新
adapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is