获取Android Contacts联系人信息

2023-10-21 14:59

本文主要是介绍获取Android Contacts联系人信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个例子:

你是不是见多了这样的写法?

private void readContacts() {Cursor cursor = null;try {// 获取内容提供器ContentResolver resolver = getContentResolver();// 查询联系人数据cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null, null);// 遍历联系人列表while (cursor.moveToNext()) {// 获取联系人姓名String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));// 获取联系人手机号String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));Log.v("yico", "Name:" + name + "\tPhone:" + number);}cursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null, null, null, null);while (cursor.moveToNext()) {String email = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));Log.v("yico", "email:" + email);}} catch (Exception e) {e.printStackTrace();} finally {if (cursor != null) {cursor.close();}}
}

它将所有的电话遍历,将所有的邮箱遍历,却没有对应关系,如果你需要单一的结果集合,那么这种方法也许是合适的,但如果你需要联系人所有信息,那么这种方法显然不能满足你的需求了。


API简介

1. 相关字段

点击跳转到 字段API

如下图所示:

字段

  1. Email 邮箱
  2. Im 即时通讯
  3. Nickname 昵称
  4. Phone 手机

所以,其实所有信息都是平级关系,属于contact的一种类型,那么查询方式应该都是一样的才对。

2. 查询

点击跳转到 查询API

如下图所示:

查询

api中已给出了标准的cursor获取方法,和上面的例子的查询方式不同是吗?这个查询其实还可以简化,如下图所示:

这里写图片描述

第二个参数如果传null,则表示查询所有信息,此处如果你不知道你要查到信息有什么字段,可传null,那么我们的cursor代码可以简化如下:

String phoneWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] phoneWhereParams = new String[]{contactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
Cursor phoneCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, phoneWhere, phoneWhereParams, null);

contactId是什么呢?它是每一个联系人的唯一id码,通过这个id,我们可以只查对应联系人的信息,也不是简单的遍历所有联系人信息。

3. 获取contactId

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

你可以通过遍历这个cursor拿到所有的联系人的id,然后查询该id下的联系人的其它信息。


一个例子

private void readAllContacts() {Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()) {String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));Log.i("yico", " ");Log.i("yico", "联系人" + contactId + "\t" + name);/*** Nickname - 昵称*/String nickWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";String[] nickWhereParams = new String[]{contactId, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE};Cursor nickCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, nickWhere, nickWhereParams, null);while (nickCursor.moveToNext()) {String nickName = nickCursor.getString(nickCursor.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME));Log.i("yico", "nickName" + "\t" + nickName);}/*** Phone - 电话*/String phoneWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";String[] phoneWhereParams = new String[]{contactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};Cursor phoneCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, phoneWhere, phoneWhereParams, null);while (phoneCursor.moveToNext()) {int type = phoneCursor.getInt(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));String phone = "";switch (type) {case 1:phone = "HOME";break;case 2:phone = "MOBILE";break;case 3:phone = "WORK";break; default:phone = "OTHER";break;}phone += "\t" + phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));Log.i("yico", "phone" + "\t" + phone);}}
}    

从这个例子不难看出查询步骤:(以Nickname为例)

  1. 通过ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE 获取对应的cursor
  2. 通过ContactsContract.CommonDataKinds.Nickname.NAME不同的参数取该cursor下对应的信息,每类信息都有什么类型的信息,见上面提到的 字段API

套路都是一样的,这里不再赘述。

这篇关于获取Android Contacts联系人信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/255132

相关文章

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文