读取系统联系人

由于我们之前一直使用的都是模拟器,电话簿里面并没有联系人存在,所以现在需要自 己手动添加几个,以便稍后进行读取。打开电话簿程序,界面如图 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: 通过内容提供器读取系统联系人的更多相关文章

  1. Android 创建内容提供器(ContentResolver)

    如果想实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 ContentResolver 的方式来创建一个自己的内容提供器. ContentProvider 类中有六 ...

  2. Android之 内容提供器(2)——创建自己的内容提供器将数据共享出去

    创建自己的内容提供器非常简单,只需要新建一个类继承ContentProvider类,通过实现ContentProvider的增删改查的方法向内容提供器中增删数据. 1 ContentProvider简 ...

  3. Android之 内容提供器(1)——使用内容提供器访问其它程序共享的数据

    (下面内容是阅读郭霖大神的<第一行代码>总结的) 1 概述 内容提供器是Android实现跨程序共享数据的标准方式. 内容提供器的的使用方法有两种, 一是使用已有的内容提供器对其他程序的数 ...

  4. 通过系统自带的内容提供器(ContentResolver)读取系统的通讯录,并设置点击事件

    1.布局 主布局只有一个listview,用来显示电话簿的名字和手机号码 <?xml version="1.0" encoding="utf-8"?> ...

  5. Android学习笔记(十九)——内容提供器

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...

  6. android: 内容提供器简介

    我们学了 Android 数据持久化的技术,包括文件存储.SharedPreferences 存 储.以及数据库存储.不知道你有没有发现,使用这些持久化技术所保存的数据都只能在当 前应用程序中访问.虽 ...

  7. Android基础总结(6)——内容提供器

    前面学习的数据持久化技术包括文件存储.SharedPreferences存储以及数据库存储技术保存的数据都只能被当前应用程序所访问.虽然文件存储和SharedPreferences存储中提供了MODE ...

  8. Android初级教程理论知识(第四章内容提供器)

    之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...

  9. <Android基础> (七)内容提供器

    第七章 内容提供器 7.1 内容提供器(Content Provider) 主要应用于在不同的应用程序之间实现数据共享功能.允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 7.2 ...

随机推荐

  1. idhttp的用法

    1)POST function PostMethod(http: TIDhttp; URL: string; Params: TStringList): string;var RespData: TS ...

  2. Nodejs编码转化问题

    目前Node.js仅支持hex.utf8.ascii.binary.base64.ucs2几种编码的转换.对于GBK,GB2312等编码,Nodejs自带的toString()方法不支持,因此中文转化 ...

  3. 谷歌身份验证器加强Linux帐户安全

    下载 Google的身份验证模块 # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...

  4. 数字电路-异同步 复位 线与 oc门

    1.同步电路和异步电路的区别是什么? 异步电路:主要是组合逻辑电路,用于产生地址译码器.FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通 ...

  5. FreeBSD_11-系统管理——{Part_3-网络}

    一.Network Servers DNS unbound/local_unbound # /etc/rc.conf local_unbound_enable="YES" # 测试 ...

  6. 修改ubuntu DNS的步骤(图文)

    有时候连接上VPN服务器后,还是打不开某些网站,这时候,需要对DNS进行更改,一般是修改成为谷歌提供的免费DNS:8.8.8.8  8.8.4.4,在windows下更改比较简单(点击查看“连接上VP ...

  7. 常用Sql语句书写

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...

  8. java开发中的一些工具软件

    1. XJad, 反编译工具,类似于.Net中的Refractor.可以反编译单个jar文件或一个文件夹下的class文件,效果还不错. 2. dirtyJOE, class文件直接修改工具.有时想修 ...

  9. win7连接共享打印机 错误为

    1.  xp局域网共享打印机,本机运行 –>  \\共享电脑ip –> 选择驱动目录 .INF 文件 –> 确认. 直接报错..... 2.  参考方法: 开始——设备和打印机——添 ...

  10. 用scala实现一个sql执行引擎-(下)

    执行 上一篇讲述了如何通过scala提供的内置DSL支持,实现一个可以解析sql的解析器,这篇讲如何拿到了解析结果-AST以后,如何在数据上进行操作,得到我们想要的结果.之前说到,为什么选择scala ...