获取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

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D