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

时间:2022-09-21 17:33:15

读取系统联系人

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

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

图   7.1

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

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

图   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 所示。

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

图   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"?&gt ...

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

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

  6. android&colon; 内容提供器简介

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

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

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

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

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

  9. &lt&semi;Android基础&gt&semi; &lpar;七)内容提供器

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

随机推荐

  1. MJExtension笔记&lpar;一&rpar;

    之前有说,看好的编程就去敲好的开源项目:一直觉得这个无从下手,但是这次跟着一点点敲MJExtension,我明白了这句话的深度:其实并不需要去找,每一个三方项目都有很多值得学习的地方:笔记一只记录在敲 ...

  2. opencv3-core之基本操作

    这一篇打算将core部分的例子说完,这都是基于<opencv2.4.9tutorial.pdf>中的core部分,其实这些例子后期都很稳定的,也就是说就算是2.3.1和2.4.10 ,这几 ...

  3. NPN&amp&semi;PNP

    一.晶体管基础知识 晶体管分2种:NPN.PNP 晶体管通常封装为TO-92,下面是元件实物图 和 元件符合: NPN: 当电压和电流被加到基极上时,NPN晶体管: 其工作原理: 就像水龙头—给控制开 ...

  4. drop table xx purge

    drop table xx purge; 说明: 所有删除的表都会在回收站里面,只有后面加上purge才是彻底的清空表. (一般用于测试.练习数据表,所以最好不要带purge,要不误删就找不到了.)

  5. Android使用bindService启动服务

    1.Service package com.example.ebobo; import java.util.Timer; import java.util.TimerTask; import andr ...

  6. 彻底弄懂python编码

    在编写python程序的过程中,中英文混用经常会出现编码问题.围绕此问题,本文首先介绍编码的含义及常用编码,随后列举几个python经常遇到的编码异常及解决方法,接着列举笔者在实践中遇到的异常出现的情 ...

  7. ExecutorService——shutdown方法和awaitTermination方法

    ExecutorService的关闭shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池. 方法简介shutdown方法: ...

  8. C&plus;&plus;复习3&period;C&sol;C&plus;&plus;常量的知识

    C/C++常量的知识 20130918 语言的实现隐含着使用着一些常量,如初始化全局变量静态变量,另外还有一些我们不曾感觉到的变量:函数地址(也就是函数名称), 静态数组的名字,字符串常亮的地址.常量 ...

  9. thinkphp5配置讲解

    一.thinkphp配置类型有哪些? 1.在thinkphp中,有6种配置.即惯例配置,应用配置.扩展配置.模块配置.场景配置.动态配置. 2.惯例配置就是系统默认的配置. 3.应用配置就是我们自己开 ...

  10. Qt&plus;opencv:读取、显示图像

    GitHub:点击下载完整代码 本文主要是使用Qt与opencv将图像进行显示在QT界面上. 程序运行后的界面如下所示: (由于只有打开图像之后,才能对图像进行翻转,所以程序设置为读取图像成功之后才能 ...