Android联系人模块分析(二)

Android contacts 联系人 通讯录 源码 完全解析 Android contacts 联系人 通讯录 源码 完全解析Android contacts 联系人 通讯录 源码 完全解析 1简介 2软件架构 3各功能模块分析 1联系人数据的显示 1联系人列表显示 2联系人详细信息数据的显示 2联系人数据的编辑和存储 1编辑界面相关 2数据存储相关 3Sim联系人数据的整合 1Sim卡联系人数据的显示 2开机自动导入Sim卡联系人 3telephony中Ic 阅读详情


      上篇文章讲解了ContentsProvider的基本结构,本篇文章结合实际的联系人模块操作的例子来讲解联系人模块的使用。

       下图为联系人模块中的表结构,各个表项中字段信息,可以参考上篇文章对ContactscProvder的分析中所描述的,在ContactsContract.java文件中定义了各个数据表的结构、Uri等信息。ContactsProvider数据库的三个主要的数据表结构信息如下图:

      

        这三张表是联系人数据库的最主要的数据表,其他的数据只是提供一些辅助功能,我们先详细介绍这三张表的结构和使用方法。

        从上图我们可以看书Contacts表和raw contact表是一对多的关系,Contacts表是对raw contact表记录的聚合,即Contacts表中是没有账户(Account)的概念的,而raw contact表是联系人特定账户的的概要信息,Data表则存储了联系人的详细信息,比如email、电话号码等。

           下面我们就详细介绍一下上述三张数据表的结构和使用方法:

        一、raw contact表

              raw contact表描述了联系人每个账户下的数据,根据账户名和账户类型字段进行区分。即同一个联系人可能在raw contact表中有多个记录,每个记录分属于不同的账户。所以一个contact id可能对应多一个raw contact id,这也是笔者屡次被问及的一个问题,为什么一个contact id会对应多个raw contact id,相信读者看到这里就会知道该问题的答案了。从这里我们也发现android是允许一个联系人绑定多个账户的。

              需要注意的字段为ACCOUNT_NAME,ACCOUNT_TYPE,DELETED、VERSION。

              ACCOUNT_NAME和ACOUNT_TYPE我就不详细描述了,DELETED标志位的作用是,当删除一条用户记录时,可以暂时再内部维护一条删除状态的记录,待该账户的server端删除完毕后,再从本地删除,其实用户可以不必关心该字段的内部机制,只需要注意在查询raw contact表时,可以根据DELETED字段过滤掉已删除的记录。VERSION字段也是一个很有用的字段,可以根据该字段来确定联系人信息是否发生变化,如果您本地保存了联系人信息,那么就可以根据VERSION信息来和系统数据库的联系人信息进行比较,来确定是否需要做UPDATE操作。

        二、data表

           data表存储了联系人的具体信息,比如电话、email等信息,从上图我们可以看书每个raw contact表中的记录会对应多个data信息,这不难理解,一个联系人可能有多个电话号码,多个email,这些信息是如何存储再data表中的呢?其实不难解决这个问题,定义一个专门的描述字段用来定义该记录的类型,即MIME TYPE,然后根据MIME TYPE来区分该记录的类型。然后每种信息都会有一个自己的类型,比如phone记录,在ContactsContract中的Phone类中进行了定义:
          
/** MIME type used when storing this in data table. */
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone_v2";

           从上述的注释可以看出该MIME type的定义是用来将Phone信息存储在data表中的。这样如果需要判断data表中某条记录是否为电话号码信息,可以如下:
if(Phone.CONTENT_ITEM_TYPE.equals(mime))
        三、Contacts表
              Contacts表是对raw contact表按照account type和account name进行的聚合。Contacts表的聚合逻辑在ContactAggregator.java文件中,该类中定义了一个成员方法:
protected long insertContact(SQLiteDatabase db, long rawContactId) {
        mSelectionArgs1[0] = String.valueOf(rawContactId);
        computeAggregateData(db, mRawContactsQueryByRawContactId, mSelectionArgs1, mContactInsert);
        return mContactInsert.executeInsert();
    }


            这个方法就是用来往Contacts表中插入数据的,该方法被出发调用的时机为:raw contact表有新插入记录,ContactsProvider的onCommit事件等。上述插入Contacts表的SQL语句为:
String INSERT_SQL =
                "INSERT INTO " + Tables.CONTACTS + " ("
                        + Contacts.NAME_RAW_CONTACT_ID + ", "
                        + Contacts.PHOTO_ID + ", "
                        + Contacts.PHOTO_FILE_ID + ", "
                        + Contacts.SEND_TO_VOICEMAIL + ", "
                        + Contacts.CUSTOM_RINGTONE + ", "
                        + Contacts.LAST_TIME_CONTACTED + ", "
                        + Contacts.TIMES_CONTACTED + ", "
                        + Contacts.STARRED + ", "
                        + Contacts.HAS_PHONE_NUMBER + ", "
                        + Contacts.LOOKUP_KEY + ") " +
                " VALUES (?,?,?,?,?,?,?,?,?,?)";


            生成SQL statement的语句为:             
mContactInsert = db.compileStatement(ContactReplaceSqlStatement.INSERT_SQL);

           ok,读者可以根据我上述列举的点仔细研读一下Contacts表记录的插入过程。对应用程序而言,Contacts表大多数字段都是只读的,由ContactsProvider来维护该表的信息,如果您需要所有联系人的信息,且不区分账号类型和账号名称,您可以从该表中取出所有的记录。

        
            下面有几道思考题,读者可以试着完成,我后续会详细的结合实例再来分析这几张表的内容,以及其他几张辅助表的使用。

           1、取出所有无手机号码的联系人(不区分account type和account name);
           2、取出特定联系人的手机号码和email信息;
           3、读出所有账号类型为空的联系人;
          

原生Contacts联系人模块 测试:先编framework再编service/core再编service然后adb push framework.jar和services.jar。 源码:contacts的源码在ContactsProvider目录下,在ContactsProvider2类中可以通过UriMatcher找到所有访问路径。 相关数据库:导出com.android.provider.contacts下的cont... 阅读详情

相关推荐

安卓中通过intent组件跳转到系统联系人编辑界面,及具体案例分析

本人对于intent的用法的一些总结,在此抛砖引玉,还望大家多提建议,共勉!!!

android_bai的博客 4995

联系人模块--Group

一、群组数据库contact2.db中的group 1.数据库位置 /data/data/com.android.providers.contacts/databases/contact2.db 2.Group表的内容截图 3.各代表的意思 _id 行id package_id account_name 账户名字 account_type 帐户的类型 sourceid ve

Zed_Faker的博客 2308

基于Android的短信应用开发(二)——读取手机联系人

读取手机联系人

ALittleForward的专栏 2101

Android联系人模块分析(一)

联系人模块是Android系统中的一个重要的功能模块,目前Android市场上有大量的基于通讯录的应用,本人计划写出系列文章详细介绍联系人模块的结构和使用。作为开头,本篇文章将对ContactsProvider做个简要的介绍。      Android系统将联系人的信息存储在sqlite数据库中,并通过ContactsProvider提供查询、更新、删除等操作。所以如果需要掌握联系人相关信息的操

jiang_lostcode的专栏 3405

Android实现@联系人功能的全面指南

htmltable {th, td {th {pre {简介:本文详细介绍了在Android应用中如何实现“@联系人功能”,类似于微信聊天中的提及功能。这需要理解并实现包括监听文本输入、构建联系人列表、显示联系人选择界面、处理选择结果、显示提示以及优化用户体验在内的多个关键步骤。开发者可以利用提供的APK示例代码学习如何在项目中实现这一功能,并通过反编译工具深入理解代码细节。

weixin_42309599的博客 986

android联系人模块分析文档

android联系人模块分析文档

用Android实现联系人按字母检索,GitHub - doubijuan/ContactsDome: Android 使用ListView的A-Z字母排序功能实现联系人模块,主要学习了ListVie...

ContactsDomeAndroid 使用ListView的A-Z字母排序功能实现联系人模块,主要学习了ListView的A-Z字母排序功能以及根据输入框的输入值改变来过滤搜索结果,如果输入框里面的值为空,更新为原来的列表,否则为过滤数据列表,包括汉字转成拼音的功能先来看一下最终效果图:现在我们来看下项目结构图其实很多都是和上一篇文章一样的,我在这里就不多说啦,不是很明白的地方,可以看一下上一篇...

weixin_39705850的博客 2819

android 联系人模块例子

android联系人模块的资料参考,个人觉得比较全面,很适合初学者来学习开发

如何将联系人从 iPhone 转移到安卓手机

综上所述,是最简单、高效、出错率最低的迁移方式。虽然蓝牙无法用于 iPhone 与安卓之间的数据传输,但你可以借助 iReaShare Phone Transfer 实现无缝迁移,兼顾速度、安全性和易用性。

Digitally的博客 2012

android联系人contacts模块的学习总结

android联系人contacts模块的学习总结,感兴趣的朋友可以下一下

android 联系人模块

这是一个自己写的android联系人的app初学者可以学习

android联系人开发文档,Android联系人模块分析(一)

Android联系人模块分析(一)联系人模块是Android系统中的一个重要的功能模块,目前Android市场上有大量的基于通讯录的应用,本人计划写出系列文章详细介绍联系人模块的结构和使用。作为开头,本篇文章将对ContactsProvider做个简要的介绍。Android系统将联系人的信息存储在sqlite数据库中,并通过ContactsProvider提供查询、更新、删除等操作。所以如果需要掌...

weixin_39744384的博客 448

Android 完整的通讯录项目源码

Android 完整的通讯录项目源码,开源源码,比较适合安卓初学者学习,界面看着还可以,系统能在手机上正常运行!

Android 学习笔记 Contacts (二)Contacts 联系人详解

1.获取联系人详细信息 在(一)中我们只是获取了联系人的ID和NAME,但是这是远远不够的,怎么样获取其他的值呢? public void fetchContactInformation() { String id,name,phoneNumber,email; ContentResolver contentResolver = this.getContentResolver

Dake 4万+

基于CODESYS与EtherCAT的步进电机单轴控制实践

本文详细介绍了基于CODESYS平台与EtherCAT总线技术实现步进电机单轴控制的完整实践流程。从硬件选型、软件工程创建、EtherCAT主从站配置,到运动控制功能块编程与在线调试,手把手指导读者完成从零到一的搭建,并提供了常见问题的排坑指南,帮助自动化开发者快速掌握这一高效、灵活且成本可控的工业运动控制解决方案。

hh234的博客 491

cvtColor +内存泄漏

题目不知道怎么取,因为cvtColor并没有产生内存泄漏,但是我由于没有正确使用cvtColor而出现了内存泄漏的问题,所以暂且以cvtColor+内存泄漏为题 1.应用背景 项目中用到cvtColor的地方是需要将灰度图转为3通道的彩色图(实际上转换后仍然为灰色的,但是电脑认为的是3通道的彩色图了) 因此需要用到以下语句 cvtColor(src_img, cvMtxRGB, C

smilebluesky的专栏 6058

如何在Android上合并重复联系人?

要删除Android上的重复联系人,您可以直接在设备上使用方法1或方法3,尽管前者可能并非适用于所有设备。如果您更喜欢在不接触手机的情况下删除重复项,请在电脑上使用方法2。这篇文章对您有帮助吗?请在评论区分享您的反馈和建议。

Digitally的博客 1439

[OrCad电路板设计系统].Orcad.Pspice.9.2下载安装

Orcad.Pspice.9.2详细下载安装图文步骤1 安装前准备工作1.1 下载安装包1.2 解压2 安装时步骤2.1 安装文件2.2 破解文件3 安装完成 1 安装前准备工作 1.1 下载安装包 打开百度网盘APP 链接:https://pan.baidu.com/s/1cMFxHUvuh5iEhFVT-lvciQ 提取码:7m65 1.2 解压 解压下载好的安装包 2 安装时步骤 2.1 安装文件 1.点击Setup安装文件,出现警告对话框,告诉你应该关闭所有病毒防火墙,点击确定 2.进入安装界面,

weixin_48924581的博客 1万+

浅谈android中手机联系人字母索引表的实现

实际上字母索引表的效果,可以说在现在的众多APP中使用的非常流行,比如支付宝,微信中的联系人,还有购物,买票的APP中选择全国城市,切换城市的时候,这时候的城市也就是按照一个字母索引的顺序来显示,看起来是很方便的.其实这种字母索引表的效果最开始是出现在微信的联系人中.因为觉得这种效果功能在今后的项目中可以说是非常常见,可能会用的上,所以准备来波博客讲述一下实现的原理,一来方便以后自己复习,二来如果

Mikyou的专栏 1万+

ComfyUI 的 LoRA 训练:秋叶 LoRA-scripts 参数设置与测试方法详解

秋叶 LoRA-scripts 的参数设置需结合理论(如模型原理、优化器机制)和硬件条件(显存、算力),新手可先按推荐值起步,再逐步调整。测试时,loss 值帮你判断训练是否正常,XYZ 图表法帮你找到最佳使用参数。掌握这些知识,你就能避开 LoRA 训练的常见坑,从 “盲目调参” 变为 “精准训练”。

2301_78150483的博客 2402

国密系列算法简介

众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目前,这些算法已广泛应用于各个领域中,期待有一天会有采用国密算法的区块链应用出现。其中SM1、SM7算法不公开,调用该...

HardessGod的博客 5777

Android Contacts 联系人源码分析

http://www.lxway.com/161080401.htm Android Contacts总览 Contacts应用是由Google Android团队编写的Android原生应用。在应用层面上涉及到Contacts.apk, ContactProvider.apk。其他相关的在Framwork,以及framework与linux内核之间的SQLite.Contacts.a

happy_6678的专栏 2547

PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型

在本节中,我们将深入探讨使用 TorchScript 导出 PyTorch 模型。通过序列化,TorchScript 使模型与 Python 生态系统独立,从而使得模型可以在其他环境中加载,例如基于 C++ 的环境。我们还跨越 Torch 框架与 Python 生态的边界,研究机器学习通用开放格式 ONNX,该技术能帮助我们将 PyTorch 训练的模型导出至非 PyTorch 甚至非 Python 环境。

盼小辉丶的博客 3531

android T9 搜索联系人分析与实现(支持多音字)

最近在项目开发过程中

ZJQYJG的专栏 7903

YOLO11实战优化:暗光环境检测 | 引入Retinex增强模块与YOLO11联合训练,解决夜间/低照度场景抓拍痛点

本文探讨了暗光环境下目标检测的技术挑战与解决方案。研究发现,传统CNN模型在低照度条件下性能显著下降,主要由于光子数减少导致信噪比降低、目标特征被噪声淹没。针对这一问题,文章提出将可微分光照增强模块嵌入YOLO检测器的技术路线,重点分析了Retinexformer+YOLO11联合方案的优势。 文章对比了YOLO系列模型在暗光场景的表现,指出YOLO11凭借其C3k2模块、无锚检测头和多任务统一骨干网络,在低对比度图像特征提取方面优于前代产品。同时详细介绍了Retinexformer的理论基础和技术创新,包

2601_95807009的博客 206

数据库常见面试题(附答案)

1.事务四大特性 原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前,其它会话不能看到过程 一致性,事务前后,数据总额一致 持久性,一旦事务提交,对数据的改变就是永久的 2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别 脏读:事务B读取事务A还没有提交的数据 不可重复读:两次事务读的数据不一致 幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看...

csdn问鼎 46万+
上一篇: Android联系人模块分析(一)
下一篇: 根据gfp_mask来获得对应的zone
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值