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
刚刚添加的两个联系人的数据都成功读取出来了!说明跨程序访问数据的功能确实是实
现了。
android: 通过内容提供器读取系统联系人的更多相关文章
- Android 创建内容提供器(ContentResolver)
如果想实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 ContentResolver 的方式来创建一个自己的内容提供器. ContentProvider 类中有六 ...
- Android之 内容提供器(2)——创建自己的内容提供器将数据共享出去
创建自己的内容提供器非常简单,只需要新建一个类继承ContentProvider类,通过实现ContentProvider的增删改查的方法向内容提供器中增删数据. 1 ContentProvider简 ...
- Android之 内容提供器(1)——使用内容提供器访问其它程序共享的数据
(下面内容是阅读郭霖大神的<第一行代码>总结的) 1 概述 内容提供器是Android实现跨程序共享数据的标准方式. 内容提供器的的使用方法有两种, 一是使用已有的内容提供器对其他程序的数 ...
- 通过系统自带的内容提供器(ContentResolver)读取系统的通讯录,并设置点击事件
1.布局 主布局只有一个listview,用来显示电话簿的名字和手机号码 <?xml version="1.0" encoding="utf-8"?> ...
- Android学习笔记(十九)——内容提供器
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...
- android: 内容提供器简介
我们学了 Android 数据持久化的技术,包括文件存储.SharedPreferences 存 储.以及数据库存储.不知道你有没有发现,使用这些持久化技术所保存的数据都只能在当 前应用程序中访问.虽 ...
- Android基础总结(6)——内容提供器
前面学习的数据持久化技术包括文件存储.SharedPreferences存储以及数据库存储技术保存的数据都只能被当前应用程序所访问.虽然文件存储和SharedPreferences存储中提供了MODE ...
- Android初级教程理论知识(第四章内容提供器)
之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...
- <Android基础> (七)内容提供器
第七章 内容提供器 7.1 内容提供器(Content Provider) 主要应用于在不同的应用程序之间实现数据共享功能.允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 7.2 ...
随机推荐
- idhttp的用法
1)POST function PostMethod(http: TIDhttp; URL: string; Params: TStringList): string;var RespData: TS ...
- Nodejs编码转化问题
目前Node.js仅支持hex.utf8.ascii.binary.base64.ucs2几种编码的转换.对于GBK,GB2312等编码,Nodejs自带的toString()方法不支持,因此中文转化 ...
- 谷歌身份验证器加强Linux帐户安全
下载 Google的身份验证模块 # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...
- 数字电路-异同步 复位 线与 oc门
1.同步电路和异步电路的区别是什么? 异步电路:主要是组合逻辑电路,用于产生地址译码器.FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通 ...
- FreeBSD_11-系统管理——{Part_3-网络}
一.Network Servers DNS unbound/local_unbound # /etc/rc.conf local_unbound_enable="YES" # 测试 ...
- 修改ubuntu DNS的步骤(图文)
有时候连接上VPN服务器后,还是打不开某些网站,这时候,需要对DNS进行更改,一般是修改成为谷歌提供的免费DNS:8.8.8.8 8.8.4.4,在windows下更改比较简单(点击查看“连接上VP ...
- 常用Sql语句书写
一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...
- java开发中的一些工具软件
1. XJad, 反编译工具,类似于.Net中的Refractor.可以反编译单个jar文件或一个文件夹下的class文件,效果还不错. 2. dirtyJOE, class文件直接修改工具.有时想修 ...
- win7连接共享打印机 错误为
1. xp局域网共享打印机,本机运行 –> \\共享电脑ip –> 选择驱动目录 .INF 文件 –> 确认. 直接报错..... 2. 参考方法: 开始——设备和打印机——添 ...
- 用scala实现一个sql执行引擎-(下)
执行 上一篇讲述了如何通过scala提供的内置DSL支持,实现一个可以解析sql的解析器,这篇讲如何拿到了解析结果-AST以后,如何在数据上进行操作,得到我们想要的结果.之前说到,为什么选择scala ...