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

相关文章

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格