android: 通过内容提供器读取系统联系人

读取系统联系人

 由于我们之前一直使用的都是模拟器,电话簿里面并没有联系人存在,所以现在需要自 己手动添加几个,以便稍后进行读取。打开电话簿程序,界面如图 7.1 所示。

 

图   7.1

 

可以看到,目前电话簿里是没有任何联系人的,我们可以通过点击 Create a new contact按钮来对联系人进行创建。这里就先创建两个联系人吧,分别填入他们的姓名和手机号,如 图 7.2 所示。

 

图   7.2

 

这样准备工作就做好了,现在新建一个 ContactsTest 项目,让我们开始动手吧。 首先还是来编写一下布局文件,这里我们希望读取出来的联系人信息能够在 ListView 中

显示,因此,修改 activity_main.xml 中的代码,如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

 

<ListView android:id="@+id/contacts_view" android:layout_width="match_parent" android:layout_height="match_parent" >

</ListView>

 

 

</LinearLayout>

简单起见,LinearLayout 里就只放置了一个 ListView。接着修改 MainActivity 中的代码,

如下所示:

 

public class MainActivity extends Activity { ListView contactsView; ArrayAdapter<String> adapter;

List<String> contactsList = new ArrayList<String>();

 

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

contactsView = (ListView) findViewById(R.id.contacts_view);

adapter = new ArrayAdapter<String>(this, android.R.layout. simple_list_item_1, contactsList);

contactsView.setAdapter(adapter);

readContacts();

}

 

private void readContacts() { Cursor cursor = null;

try {

// 查询联系人数据

cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

while (cursor.moveToNext()) {

// 获取联系人姓名

String displayName = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

// 获取联系人手机号

String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));

contactsList.add(displayName + "\n" + number);

}

} catch (Exception e) {

e.printStackTrace();

 

} finally {

if (cursor != null) {

cursor.close();

}

}

}

 

}

在 onCreate()方法中,我们首先获取了 ListView 控件的实例,并给它设置好了适配器, 然后就去调用 readContacts()方法。下面重点看下 readContacts()方法,可以看到,这里使用 了 ContentResolver 的 query()方法来查询系统的联系人数据。不过传入的 Uri 参数怎么有些奇 怪 啊 , 为 什 么 没 有 调 用 Uri.parse() 方 法 去 解 析 一 个 内 容 URI 字 符 串 呢 ? 这 是 因 为 ContactsContract.CommonDataKinds.Phone 类已经帮我们做好了封装,提供了一个CONTENT_URI 常量,而这个常量就是使用 Uri.parse()方法解析出来的结果。接着我们对 Cursor 对象进行遍 历 , 将 联 系 人 姓 名 和 手 机 号 这 些 数 据 逐 个 取 出 , 联 系 人 姓 名 这 一 列 对 应 的 常 量 ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,联系人手机号这一列对应的常 量是 ContactsContract.CommonDataKinds.Phone.NUMBER。两个数据都取出之后,将它们进 行拼接,并且中间加上换行符,然后将拼接后的数据添加到 ListView 里。最后千万不要忘记 将 Cursor 对象关闭掉。

这样就结束了吗?还差一点点,读取系统联系人也是需要声明权限的,因此修改AndroidManifest.xml 中的代码,如下所示:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.contactstest"

android:versionCode="1"

android:versionName="1.0" >

……

<uses-permission android:name="android.permission.READ_CONTACTS" />

……

</manifest>

加入了 android.permission.READ_CONTACTS 权限,这样我们的程序就可以访问到系统 的联系人数据了。现在才算是大功告成,让我们来运行一下程序吧,效果如图 7.3 所示。

图   7.3

刚刚添加的两个联系人的数据都成功读取出来了!说明跨程序访问数据的功能确实是实 现了。

posted @ 2016-03-08 09:02  dodo-yufan  阅读(...)  评论(... 编辑 收藏