API Guides Contacts Provider (二)

article/2025/10/20 11:47:00

Data From Sync Adapters


用户直接输入联系人的数据到设备中,但是也可以通过sync adapters从服务器上获取联系人的数据。sync adapter 会自动同步设备和服务器上的数据。sync adapter运行在后台,由系统来控制。系统调用ContentResolver去管理数据。

在Android中,和sync adapter一起工作的服务器是由账户类型表示的。每个sync adapter和一种账户类型共同工作,但是它也可以同时支持多个不同的账户名。账户类型和账户名在Sources of raw contacts data有简要的描述。下面会有更详细的描述,还会描述账户名和账户类型与sync adapter和服务器的关系。

账户类型:

    标识一个用户用来存储数据的服务器。通常情况下,用户需要取得该服务器的认证。例如,Google contacts是一个账户类型,它由google.com来标识,这个标识就是在 AccountManager中要使用到的账户类型。

账户名:

    标识一个账户,或用来登入到某个类型。Google contacts的账户名和Google的账户名一样,使用邮件地址作为账户名。其他的服务器可能只使用字母或数字作为用户名。


账户类型不需要唯一的。用户可以配置多个Google contact的账户,并下载它们的数据到Contacts Provider。例如,用户有一个私人的账户名,用来存储私人的联系人数据;还有另一个工作的账户名,用来存储工作的联系人。账户名+账户类型一起标识一组特定的联系人数据,这组数据可以在contacts provider和服务器上同步。

如果你想要下载你自己服务器上的数据到contacts provider,你需要自己写一个sync adapter。在Contacts Provider Sync Adapters中有更多关于这方面的描述。

下图展示了Contacts Provider如何桥接联系人的数据。每个sync adapter都用它的账户类型来标记。


Required Permissions


如果想要访问Contacts Provider,需要以下权限:

读取一个或多个表:

    READ_CONTACTS,在 AndroidManifest.xml文件中,使用<uses-permission>标签定义。例如: <uses-permission android:name="android.permission.READ_CONTACTS">。

写入一个或多个表:

    WRITE_CONTACTS,在 AndroidManifest.xml文件中,使用<uses-permission>标签定义。例如:<uses-permission android:name="android.permission.WRITE_CONTACTS">

这些权限并不对用户配置文件数据起作用。用户配置文件和其权限会来接下来的The User Profile章节中讨论。

记住,用户的联系人数据是私人的,并且是敏感的。用户会在意他们的隐私,他们不愿意让任意程序收集他们个人或联系人的信息。如果你没有明确告知用户,为何需要访问联系人的权限,他们可能会给你的应用低的评价或简单的拒绝安装。

The User Profile


在ContactsContract.Contacts表中,有一行保存用户的配置文件数据。这行数据用来描述用户的信息,而不是联系人的信息。这行用户配置文件为每个心痛关联一条raw contact的数据。每行raw contact可以拥有多条的data数据。在ContactsContract.Profile中定义了访问用户配置文件的相关常量。

访问用户配置文件数据需要特殊的权限。除了 READ_CONTACTS和WRITE_CONTACTS用来读写联系人外,还需要android.Manifest.permission#READ_PROFILE和 android.Manifest.permission#WRITE_PROFILE权限。

你必须记住,用户的配置文件数据是敏感的。android.Manifest.permission#READ_PROFILE权限允许你访问私人数据。一定要在你的应用描述中告诉用户你为何需要访问用户的个人配置文件数据。

使用 ContentResolver.query()方法去查询包含用户配置文件数据的一行联系人数据。把CONTENT_URI设进去,并且不要任何过滤条件。你也可以用这个URI用为基准uri,来查询raw contact或data的数据。例如,下面的代码片段用来查询用户的配置文件数据:

// Sets the columns to retrieve for the user profile
mProjection = new String[]{Profile._ID,Profile.DISPLAY_NAME_PRIMARY,Profile.LOOKUP_KEY,Profile.PHOTO_THUMBNAIL_URI};// Retrieves the profile from the Contacts Provider
mProfileCursor =getContentResolver().query(Profile.CONTENT_URI,mProjection ,null,null,null);
注意:如果你查询多行contact数据,你想要检测一下某行是否为用户配置文件数据,使用 IS_USER_PROFILE  列,这一列值为1的话,就是用户配置文件。

Contacts Provider Metadata


Contents Provider在数据库中存储跟踪联系人状态的数据。数据库中的元数据存储在很多个地方,包括raw contacts,data,contacts,ContactsContract.Settings和 ContactsContract.SyncState等表中。下面的表格展示了一些数据表的功能:


TableColumnValuesMeaning
ContactsContract.RawContactsDIRTY"0" -从上次同步后,没有改变.标记raw contacts在设备上已经修改,需要同步到服务器。当应用程序更新一条raw contact数据的时候,Contacts Provider会自动修改这个值。

Sync adapters 修改raw contact 或者data表的时候,需要把CALLER_IS_SYNCADAPTER加入到他们使用的URI中。这样,provider才不会把这些修改编辑成dirty。否则,sync同步到本地数据,又会被回传到服务器,即使这个修改是由服务器发起的。

"1" - 在上次同步后,数据有改变。需要同步到服务器
ContactsContract.RawContactsVERSION这一行的版本号当这一行或其关联的数据发生改变时,Contacts Provider会自动增加这个值。
ContactsContract.DataDATA_VERSION这一行的版本号当这一行或其关联的数据发生改变时,Contacts Provider会自动增加这个值。
ContactsContract.RawContactsSOURCE_ID指向创建这个raw contact的账户

当sync adapter创建一个raw contact的时候,这一列被设置成服务器可以唯一识别的ID。当Android的应用创建一个raw contact的时候,应用程序要把这一列放空。这样子告诉sync adapter需要在服务器上创建一个新的raw contact,并给它一个SOURCE_ID。

唯一性:一个账户的每一行数据都需要 拥有它自己的source ID,如果不强制这样做,在联系人的应用中就会引出问题。注意,相同账户类型的两个raw contact可能会有相同的source  id。例如,emily.dickinson@gmail.com 账户中的一行记录Thomas Higginson的数据,可以和 emily.dickinson@gmail.com账户中的另一行Thomas Higginson拥有相同的source ID。

固定性:在服务器上,每个raw contact的source id的值是不变的。如果用户在设备的设置菜单中清楚所有联系人数据,然后再从服务器上同步,每个raw contact得到相同的source ID和删除前是一样的。如果你没有强制要求固定性,快捷方式将不能工作。

ContactsContract.GroupsGROUP_VISIBLE"0" - 在Android的应用中,这一组中的联系人不可见。为了兼容侮辱器,可以隐藏某些组的功能。
"1" -在Android的应用中,这一组中的联系人可见。
ContactsContract.SettingsUNGROUPED_VISIBLE"0" - 在这个账户名和账户类型中,不属于任何组的联系人,在Android应用程序中,不可见。默认情况下,如果contacts的所有raw contact数据都不属于任何一个组,则这条contact不可教案。raw contact的组用由一行或多行 ContactsContract.Data中的ContactsContract.CommonDataKinds.GroupMembership 标记的。通过在 ContactsContract.Settings 设置UNGROUPED_VISIBLE的值,可以强制让无组的联系人显示或不显示。
"1" - 在这个账户名和账户类型中,不属于任何组的联系人,在Android应用程序中,可见。
ContactsContract.SyncState(all)这个表用来存储sync adapter的元数据。可以在设备中存储同步状态或其他同步相关的数据。








http://chatgpt.dhexx.cn/article/mjs40Ukh.shtml

相关文章

Android 7.0后SettingProvider ContactsProvider TelephonyProvider MediaProvider数据库位置

在Android7.0之后&#xff0c;很多Provider数据库的位置都发生了改变&#xff0c;在这记录下&#xff0c;免得以后又忘记了&#xff0c;找起来费劲。 1、SettingsProvider 在之前SettingsProvider是是以settings.db的方法存在&#xff0c;在Android N之后SettingsProvider数据存…

利用Contacts Provider读取手机联系人信息

参考:https://developer.android.google.cn/guide/topics/providers/contacts-provider.html Contacts Provider组织结构 Contacts Provider组织结构由三部分构成,如下图所示: (联系人)Contact:代表联系人,包含了多种联系渠道。(原始联系人)RawContact:每个原始联…

API Guides Contacts Provider

Contacts Provider Contacts Provider是Android的一个强大组件&#xff0c;它管理联系人的核心数据。你在手机联系人看到联系人信息&#xff0c;来源于Contact Provider。当然&#xff0c;你可以在自己的应用用访问ContactProvider的数据&#xff0c;也可以同步手机和服务…

Android官方文档—APP组件(Content Providers)(Contacts Provider)

通讯录内容提供者 Contacts Provider是一个功能强大且灵活的Android组件&#xff0c;用于管理设备的人员数据中​​央存储库。联系人提供程序是您在设备的联系人应用程序中看到的数据源&#xff0c;您还可以在自己的应用程序中访问其数据&#xff0c;并在设备和在线服务之间传…

理清contactsprovider

初步了解android contact provider android的联系人数据单独拿出来做成ContactsProvider&#xff0c;众多的table和view整体看下来&#xff0c;使得联系人的数据错综复杂。但是我们在开发的过程并不需要将所有的table都搞清楚。用到最多的是 ContactsContract.Contacts、Contac…

Android ContactsProvider源码分析

Android源码目录packages\providers下的应用是下载&#xff0c;通话等内置基本应用提供数据存储和操作的provider应用&#xff0c;本文章将针对ContactsProvider源码的架构和实现展开分析。&#xff08;注&#xff1a;本文使用使用android4.0版本进行分析&#xff09; 1、架构设…

ContactsProvider2

本篇不全也不细&#xff0c;只是根据按照个人理解和工作中遇到的问题&#xff0c;总结了个人认为的要点。 1. Android的数据库体系 1.1. 概述1.2 uri结构 2. ContactsProvider2 2.1. 概述2.2. Contacts2.db中的表2.3. ContactProvider2中的实现2.4. 批量访问 1. Android的数…

Android ContactProvider码源解析

Android Contacts源码解析2 4 ContactsProvider模块 1ContactsProvider简介2数据库创建3主要数据库的表结构相互关系 1data表2raw_contacts表3contacts表4mimetypes5其他表 文章转载自&#xff1a;https://blog.csdn.net/kafka_88/article/details/58585607 4&#xff0c;…

Contacts Provider基础

作为四大组件之一的ContentProvider工作中我们很少会用到自己自定义的ContentProvider,用到的最多的就是系统提供的。官方文档提供了两种系统ContentProvider,一种是CalendarProvider,一种是Contacts Provider。今天我们的主角就是Contact Provider。 The Contacts Provider is…

Error: invalid code, hints: [ req_id: * ]

1、问题描述&#xff1a;这个问题是在处理订单支付时需要用户登录遇到的&#xff0c;具体报错信息如下&#xff1a; 2、报错原因&#xff1a; 当前开发者的appid没有支付权限导致 3、解决方案&#xff1a; 需要负责人给分配对应的权限

This application’s bundle identifier does not match its code signing identifier.

今天使用carthage更新第三方后莫名出现真机云心失败,提示 This application’s bundle identifier does not match its code signing identifier. 解决方法: /usr/local/bin/carthage copy-frameworks 进入Building Phases 单击并在New Run Script Phase中添加脚本 将/usr/lo…

Code Sign error: a valid provisioning profile matching the application's Identifier 'com.yourcompany

出现这个错误的原因是因为&#xff1a;appid和provisioning profile不匹配 &#xff01;有两种解决的办法&#xff1a;重新下载provisioning profile&#xff0c;或者可能因为&#xff1a;生成证书和appid 所用的根证书不同&#xff0c;最好重新都生成然后下载。&#xff08;这…

ANTD react 手机号(验证码)登陆 + 账号登陆(图形验证码)

这种页面可能是大家常用的,但重写比较费时间,之前没有搜到完整的,在这里自己总结一下,方面复用 代码: <LoginFormformRef{formRef}initialValues{{autoLogin: false}}onFinish{async values > {await handleSubmit(values as LoginParams)}}><Tabs activeKey{type…

Springboot+axios+vue使用VerifyCodeUtils工具类实现验证码图片功能

一、环境准备 ideajava 1.8maven 3.6.3操作系统&#xff1a;window10vue.min.jsaxios.min.js 二、VerifyCodeUtils工具类 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import ja…

Identity and Authentication - Common Authentication Methods

Username and Passwords This is the most common method of identifying users in the age of Software as a Service (SaaS) 解释上面的图中的步骤&#xff1a; Login Request: POST /login postuser {username: users,password: pws }Find users: SELECT * FROM databa…

iOS code signing identity 配置

PROJECT 和 TARGET 中都要选:code signing identity: 调试统一都选 developer, 发布统一都选 distribution provisioning Profile 也要选. 过期和无效的证书及时删除, 避免 ambiguous 警告. 选择正确的证书配置后仍然报错, clean 一下重启 xcode 还不行~~~重启电脑

Invalid CAPTCHA response. Please try again. (Code: 1201)

项目场景&#xff1a; Invalid CAPTCHA response. Please try again. (Code: 1201) 解决方案&#xff1a; 直接使用隐私浏览器打开即可。

经典的Embedding方法Word2vec

提起Embedding,就不得不提Word2vec,它不仅让词向量在自然语言处理领域再度流行&#xff0c;更为关键的是&#xff0c;自2013年谷歌提出Word2vec以来&#xff0c;Embedding 技术从自然语言处理领域推广到广告、搜索、图像、推荐等深度学习应用领域&#xff0c; 成了深度学习知识…

embedding表示方法及原理

目录 1.前言2.embedding表示方法2.1 word2vec embedding2.2 neural network embedding2.3 graph embedding 3.参考文献 1.前言 近几年embedding的使用及优化在各种比赛、论文中都有很多的应用&#xff0c;使用embedding表示特征的空间表示也在各种应用中确定是一种很有效的特征…

深度学习:词嵌入Embedding

http://blog.csdn.net/pipisorry/article/details/76095118 词嵌入 词嵌入其实就是将数据的原始表示表示成模型可处理的或者是更dense的低维表示&#xff08;lz&#xff09;。 One-hot Embedding 假设一共有个物体&#xff0c;每个物体有自己唯一的id&#xff0c;那么从物体…