Android联系人模块分析(一)

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


     联系人模块是Android系统中的一个重要的功能模块,目前Android市场上有大量的基于通讯录的应用,本人计划写出系列文章详细介绍联系人模块的结构和使用。作为开头,本篇文章将对ContactsProvider做个简要的介绍。

     Android系统将联系人的信息存储在sqlite数据库中,并通过ContactsProvider提供查询、更新、删除等操作。所以如果需要掌握联系人相关信息的操作,就需要掌握ContactsProvider的内容。

       在开始学习ContactsProvider的内容之前,读者需要对ContentProvider机制有较深入的理解,ContactsProvider本质上就是Android内建的一种ContentProvider。ContentProvider是Android系统用来在所有应用程序之间共享数据的一种方法。下面我就从数据访问和存储的角度来介绍如何自定义一个ContentProvider,数据存储在sqlite中:

       1、提供外部访问的接口:访问接口是数据操作的前提,用户不需要知道内部数据的存储方式,只要通过数据访问接口就可以获取Provider中的数    据信息,以下为ContentProvider.java中定义的数据访问、操作的接口:     

      public abstract Cursor query(Uri uri, String[] projection,
            String selection, String[] selectionArgs, String sortOrder);
	 public abstract Uri insert(Uri uri, ContentValues values);
      public abstract int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs); 

    实现自定义ContentProvider,可以直接或间接的派生ContentProvider类,并override以上几种数据操作方法。

            以ContactsProvider为例,在ContactsProvider2.java文件中,我们可以看到:

      public class ContactsProvider2 extends AbstractContactsProvider implements OnAccountsUpdateListener
      public abstract class AbstractContactsProvider extends ContentProvider implements SQLiteTransactionListener

     ContactsProvider派生自AbstractContactsProvider,而AbstractContactsProvider又从ContentProvider派生,从AbstractContactsProvider.java中我们就可以看到       其override了一些数据操作方法。

       2、创建数据库:通过派生SQLiteOpenHelper类,创建数据库及其各个表项信息;

            在ContactsProvider中对应的即为ContactsDatabaseHelper类:  

      public class ContactsDatabaseHelper extends SQLiteOpenHelper
            为了让所有数据库访问者保持一致性,该类设计为单例类,该单例在ContactsProvider创建时创建:

      public boolean onCreate() {
          mDbHelper = new ContactsSearchDBHelper(getContext());
          return true;
      }

   通过该数据库帮助类,在访问数据库时,可以通过该帮助类获得数据库的读、写引用,如下面的insert操作:

           

      public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        int match = sUriMatcher.match(uri);
        long id = -1;

        synchronized (mLock) {
            db.beginTransaction();
            try {
                switch (match) {
                    /*case CONTACT_INFO:
                        id = db.insert(ContactInfo.TABLE_NAME, "", values);
                        db.setTransactionSuccessful();
                        break;*/
                    case CircleMember_DATA:
                        id = db.insert(CircleMember.TABLE_NAME, "", values);
                        db.setTransactionSuccessful();
                        break;

    3、定义数据表名、字段名,及其URI:

             在ContactsProvider中,ContactsContract类定义了该provider的权限、数据表、URI信息:

    /** The authority for the contacts provider */
    public static final String AUTHORITY = "com.android.contacts";
    /** A content:// style uri to the authority for the contacts provider */
    public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);

           Contacts数据表的定义:

      public static class Contacts implements BaseColumns, ContactsColumns,
            ContactOptionsColumns, ContactNameColumns, ContactStatusColumns {
        /**
         * This utility class cannot be instantiated
         */
        private Contacts()  {}

        /**
         * The content:// style URI for this table
         */
        public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "contacts");

         上述只是简单的介绍了ContactsProvider的结构,下面我们来详细介绍一下ContactsProvider中的代码:

       首先看看URI匹配表的生成逻辑:

       

    static {
        // Contacts URI matching table
        final UriMatcher matcher = sUriMatcher;
        matcher.addURI(ContactsContract.AUTHORITY, "contacts", CONTACTS);
        matcher.addURI(ContactsContract.AUTHORITY, "contacts/#", CONTACTS_ID);
        matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/data", CONTACTS_ID_DATA);
        matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/entities", CONTACTS_ID_ENTITIES);
        matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/suggestions",
                AGGREGATION_SUGGESTIONS);
      从URI匹配表的生成逻辑可以看出该Provider提供了哪些查询的方法,以这一行代码为例:

      matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/data", CONTACTS_ID_DATA);

      这个URI就是对Contact表和Data表进行关联查询,当然这个查询是需要带上contactId的,目前ContactsProvider不支持其他字段的Contact表和Data表关联查询。用户就可以根据该URI来进行如下的查询操作:

    Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    String dataDir = ContactsContract.Contacts.Data.CONTENT_DIRECTORY;
    Uri methodUri = Uri.withAppendedPath(contactUri, dataDir);
    Cursor c = null;
    try {
                c = mContext.getContentResolver().query(methodUri,
                        null, null, null, null);
            } catch (IllegalArgumentException e) {
                if (c != null) {
                    c.close();
                }
            }

              上述查询代码就是通过contactId获得该联系人的Data表中的信息,然后根据mimetype来区分获得数据类型,如:

        String mime = c.getString(c.getColumnIndex(Data.MIMETYPE));
        if (Phone.CONTENT_ITEM_TYPE.equals(mime)) {
            就是用来判断该游标项是否为电话号码信息。

         先写到这儿,后面再整理一下,结合实际的例子来描述怎样对联系人信息进行操作。
安卓中通过intent组件跳转到系统联系人编辑界面,及具体案例分析 本人对于intent的用法的一些总结,在此抛砖引玉,还望大家多提建议,共勉!!! 阅读详情

相关推荐

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

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

weixin_42309599的博客 986

Android 5.0 Contacts源码分析

最近工作中要整理最新的Android L的联系人源码分析,在网上各种搜索都不怎么满意,要么版本太老,要么分析的太浅层次了,要么只有简单的使用。无奈就自己整理,发出来共享一下。

lsmfeixiang的专栏 6623

android 联系人模块例子

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

联系人查询InCallUI显示

CallInfo最近在做很杂碎的事情,移植功能,需要零碎的知识点很多,想写一些博客记录,方便自己查阅和供大家参考。这篇记录的是联系人的相关部分,主要部分是打电话的时候如何查询联系人,如何显示在incallui界面如下图: 本文主要分析根据 12345678 分析 数据库查询联系人保存为 C联系人数据库的生成第一次开机启动的时候,BootCompletedReceiver会接收开机启动的广播,收到

贱贱的杨 blog 6415

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

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

android 联系人模块

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

contacts模块功能分析(较全面)

联系人功能分析 ()                                                                     1.    简介 本文基于MTK6516代码进行分析联系人模块的功能及数据库操作的流程。 联系人是手机功能中不可缺少的模块,主要记录用户的联系人数据,方便用户快捷的操

zhao7134的专栏 4654

超实用!用 Ollama + DeepSeek + Dify 搭建本地知识库,提升企业效率

本文介绍了如何使用 Ollama + DeepSeek + Dify 搭建本地知识库,帮助企业高效管理信息。通过简单配置,可实现智能问答、文档检索等功能,提升效率并保障数据安全。

Happiness is everywhere 4294

Android中联系人数据结构及逻辑

<br />Android 2.1中的联系人主要存储在四个table中:<br />accounts存储已经登陆的账号以及账号类型。<br />raw_contacts存储联系人的ID,以及属于哪个账号和账号类型。<br />groups存储组的ID,以及属于哪个账号和账号类型。<br />data存储联系人的所有信息,包括名字,属于哪个组,电话,等等。每一条信息为一条单独记录。<br /><br />另外contacts组是raw_contacts数据在Contacts应用中的映射。Contacts应用会

xiaoquanhuang的专栏 2650

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 238

【MCU】一种基于RTOS的无应答重发机制

文章目录一、背景描述二、结构框图三、基于RTOS的信号量的实现(3-1)思路描述(3-2)步骤(3-2-1)定义超时重发信号量(3-2-2)定义发送线程入口(3-2-3)定义接收线程入口四、基于定时器的实现(4-1)思路描述(4-2)步骤(4-2-1)创建定时器(4-2-2)定义定时器超时处理函数(4-2-3)定义发送线程入口(4-2-4)定义接收线程入口 一、背景描述 ​ 在微控制器之间进行数据通信时,大多需要添加无应答重发机制,以增强数据交互和通信的稳定性。 在使用UART通信的双方设备,当一次数据传输

iriczhao的博客 1523

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

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

weixin_39744384的博客 448

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决

本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。

f6g7h8i9j的博客 190

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

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

Digitally的博客 2012

新手避坑指南:在MacBook上为PyTorch正确配置MPS环境,跑通第一个YOLOv8训练

本文详细指导新手如何在MacBook上为PyTorch正确配置MPS环境,并成功运行YOLOv8训练。从环境准备、PyTorch安装到YOLOv8配置和性能调优,提供全面的避坑指南和实用技巧,帮助开发者充分利用Mac的GPU加速能力。

weixin_29100399的博客 228

从理论到实践:使用Sigrity SystemSI完成DDR4信号完整性仿真全流程解析

本文详细解析了使用Sigrity SystemSI完成DDR4信号完整性仿真的全流程,从核心挑战到实战操作。文章深入探讨了DDR4信号完整性问题,介绍了SystemSI工具链的演进与分工,并提供了从前期准备到高级技巧的详细指南,帮助工程师有效解决DDR4设计中的信号完整性问题。

weixin_30505225的博客 511

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

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

Digitally的博客 1439

Autosar EcuM配置-初始化及下电执行函数-基于ETAS软件

Autosar EcuM学习笔记-上电初始化执行函数及下电前执行函数,本文介绍在EcuM中的配置及使用。

赞的博客 849

Android联系人模块分析(二)

上篇文章讲解了ContentsProvider的基本结构,本篇文章结合实际的联系人模块操作的例子来讲解联系人模块的使用。        下图为联系人模块中的表结构,各个表项中字段信息,可以参考上篇文章对ContactscProvder的分析中所描述的,在ContactsContract.java文件中定义了各个数据表的结构、Uri等信息。ContactsProvider数据库的三个主要的数据表结

jiang_lostcode的专栏 3392

实战优化!C#上位机串口通信卡顿问题:超时机制+数据缓存方案

串口名</param>/// <param name="baudRate">波特率

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1064

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

Mikyou的专栏 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

最近在项目开发过程中

ZJQYJG的专栏 7903

android 联系人界面,在Android4.0中Contacts添加联系人界面分析(源码)

一说到Contacts,那么最直接的就是怎样添加联系人?下面将从Android4.0代码的角度上描述一下增加联系人界面的初始化工作。请大家不要轻视这个初始化,因为其并不是想象中的setContentView就结束了的事。欲知详情,请听我详细道来。增加联系人界面的显示如下(图1,图2)图1 增加联系人界面1图2 增加联系人界面2看到上面的界面,您或许会想,也没啥嘛!我也不多说,一会您就知道了。通过...

weixin_34614567的博客 1258

Android联系人模块分析(三)

前两篇文章主要讲解了ContactsProvider的结构,这篇文章想详细分析一下ContactsProvider的底层数据表结构(Android4.1.1),和大家一起深入的理解其内部实现。        ContactsProvider的代码路径位于packages/providers/ContactsProvider/src下,我们可以结合实际的场景来分析ContactsProvider的

jiang_lostcode的专栏 3314

删除联系人分析

3.2 删除联系人 Contacts相关模块中,有很多地方可以删除联系人,并且有单个删除联系人也有多个删除联系人。以QuickContactActivity为例论述删除单个联系人的详细流程, QuickContactActivity的界面如下, QuickContactActivity界面点击Delete菜单时,会弹出一个对话框,点击对话框的OK才会删除该联系人。 QuickCo

Jack的博客 1052
下一篇: Android联系人模块分析(二)
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值