Android上有哪些好用的联系人小米云怎么同步联系人服务

帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:26&分页:灰太狼发信人: HTL (灰太狼), 信区: PocketLife
标&&题: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 10:08:37 2017), 站内 && 同时使用两个手机,一个是iPhone,一个是小米6 && 问题是通讯录如何同步? && 有没有好的解决方案。 && 目前有几个做法: && 1、双方自带同步软件:
ios的icloud同步,可惜与安卓机无法共用;
小米自带的云服务,数据与ios亦无法同步 && 2、三方软件:
小米和ios都对通讯录有严格限制,ios自然不说了,小米手机登陆小米账号后,通讯录也被锁定,禁止三方软件修改通讯录,除非退出小米账号。
目前尝试使用的第三方软件有:百度网盘、qq同步助手
但是都务必蛋疼,每次先退出小米账号,然后同步完成后再登陆小米账号。 && 有没有好的解决方案建议? && -- && ※ 修改:·HTL 于 Sep 19 10:09:38 2017 修改本文·[FROM: 124.161.103.*]
※ 来源:·水木社区 newsmth.net·[FROM: 124.161.103.*] && 有1位用户评价了这篇文章:[&&]fword:小米有个cardav服务,搜一下羽扇纶巾赴征尘发信人: Aorgil (羽扇纶巾赴征尘), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 10:28:07 2017), 站内 && 小米不能用微软的邮箱做账户来同步联系人? && 【 在 HTL 的大作中提到: 】
: 同时使用两个手机,一个是iPhone,一个是小米6
: 问题是通讯录如何同步?
: 有没有好的解决方案。
: ...................
那一夜,我听了一宿梵唱,不为参悟,只为寻你的一丝气息。
那一月,我转过所有经轮,不为超度,只为触摸你的指纹。
那一年,我磕长头拥抱尘埃,不为朝佛,只为贴着了你的温暖。
那一世,我翻遍十万大山,不为修来世,只为路中能与你相遇。
那一瞬,我飞升成仙,不为长生,只为佑你平安喜乐。 &&&& ※ 来源:·水木社区 ·[FROM: 117.136.0.*]
好好学习·天天向上发信人: Cut (好好学习·天天向上), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 10:30:00 2017), 站内 && qq同步助手、百度云。
【 在 HTL (灰太狼) 的大作中提到: 】
: 标&&题: 咨询:iOS和Android通讯录同步方案
: 发信站: 水木社区 (Tue Sep 19 10:08:37 2017), 站内
: 同时使用两个手机,一个是iPhone,一个是小米6
: 问题是通讯录如何同步?
: 有没有好的解决方案。
: 目前有几个做法:
: 1、双方自带同步软件:
: ios的icloud同步,可惜与安卓机无法共用;
: 小米自带的云服务,数据与ios亦无法同步
: 2、三方软件:
: 小米和ios都对通讯录有严格限制,ios自然不说了,小米手机登陆小米账号后,通讯录也被锁定,禁止三方软件修改通讯录,除非退出小米账号。
: 目前尝试使用的第三方软件有:百度网盘、qq同步助手
: 但是都务必蛋疼,每次先退出小米账号,然后同步完成后再登陆小米账号。
: 有没有好的解决方案建议?
: ※ 修改:·HTL 于 Sep 19 10:09:38 2017 修改本文·[FROM: 124.161.103.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 124.161.103.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 1.119.142.34]
好好学习·天天向上发信人: Cut (好好学习·天天向上), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 10:32:46 2017), 站内 && 小米那么蛋疼?不让第三方软件改通讯录? && 那我装个名片全能王,扫名片都无法加入通讯录?
【 在 HTL (灰太狼) 的大作中提到: 】
: 标&&题: 咨询:iOS和Android通讯录同步方案
: 发信站: 水木社区 (Tue Sep 19 10:08:37 2017), 站内
: 同时使用两个手机,一个是iPhone,一个是小米6
: 问题是通讯录如何同步?
: 有没有好的解决方案。
: 目前有几个做法:
: 1、双方自带同步软件:
: ios的icloud同步,可惜与安卓机无法共用;
: 小米自带的云服务,数据与ios亦无法同步
: 2、三方软件:
: 小米和ios都对通讯录有严格限制,ios自然不说了,小米手机登陆小米账号后,通讯录也被锁定,禁止三方软件修改通讯录,除非退出小米账号。
: 目前尝试使用的第三方软件有:百度网盘、qq同步助手
: 但是都务必蛋疼,每次先退出小米账号,然后同步完成后再登陆小米账号。
: 有没有好的解决方案建议?
: ※ 修改:·HTL 于 Sep 19 10:09:38 2017 修改本文·[FROM: 124.161.103.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 124.161.103.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 1.119.142.34]
胖胖发信人: PPPPC2 (胖胖), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 10:33:12 2017), 站内 && 微信可以干这个活
百度一下 && 【 在 HTL (灰太狼) 的大作中提到: 】
: 同时使用两个手机,一个是iPhone,一个是小米6
: 问题是通讯录如何同步?
: 有没有好的解决方案。
: ...................
&& -- && ※ 来源:·水木社区 ·[FROM: 111.205.135.*]
说点什么呢发信人: zhangzhf (说点什么呢), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 10:34:52 2017), 站内 && 装个Outlook就可以了,连电脑上都给你同步上,完美。 && 【 在 HTL 的大作中提到: 】
: 同时使用两个手机,一个是iPhone,一个是小米6
: 问题是通讯录如何同步?
: 有没有好的解决方案。
: ...................
&& -- && ※ 来源:·水木社区 ·[FROM: 114.247.188.*]
好好学习·天天向上发信人: Cut (好好学习·天天向上), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 10:37:06 2017), 站内 && 还得连电脑,麻烦了点儿吧。 && 现在我在家都没有电脑用了。
【 在 zhangzhf (说点什么呢) 的大作中提到: 】
: 标&&题: Re: 咨询:iOS和Android通讯录同步方案
: 发信站: 水木社区 (Tue Sep 19 10:34:52 2017), 站内
: 装个Outlook就可以了,连电脑上都给你同步上,完美。
: 【 在 HTL 的大作中提到: 】
: : 同时使用两个手机,一个是iPhone,一个是小米6
: : 问题是通讯录如何同步?
: : 有没有好的解决方案。
: : ...................
: ※ 来源:·水木社区 ·[FROM: 114.247.188.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 1.119.142.34]
灰太狼发信人: HTL (灰太狼), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 11:14:53 2017), 站内 && 只要登录小米账号,全手机绑定小米生态链 && 限制其他修改通讯录 && 【 在 Aorgil (羽扇纶巾赴征尘) 的大作中提到: 】
: 小米不能用微软的邮箱做账户来同步联系人?
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 124.161.103.*]
灰太狼发信人: HTL (灰太狼), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 11:15:27 2017), 站内 && 正在用 && 问题就是每次必须退出小米账号后 && 然后使用qq同步助手或者百度云同步 && 无法双向自同步 && 【 在 Cut (好好学习·天天向上) 的大作中提到: 】
: qq同步助手、百度云。
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 124.161.103.*]
好好学习·天天向上发信人: Cut (好好学习·天天向上), 信区: PocketLife
标&&题: Re: 咨询:iOS和Android通讯录同步方案
发信站: 水木社区 (Tue Sep 19 11:16:22 2017), 站内 && 许久没有用小米了,现在小米还弄得这么复杂?
【 在 HTL (灰太狼) 的大作中提到: 】
: 标&&题: Re: 咨询:iOS和Android通讯录同步方案
: 发信站: 水木社区 (Tue Sep 19 11:15:27 2017), 站内
: 问题就是每次必须退出小米账号后
: 然后使用qq同步助手或者百度云同步
: 无法双向自同步
: 【 在 Cut (好好学习·天天向上) 的大作中提到: 】
: : qq同步助手、百度云。
: ※ 来源:·水木社区 newsmth.net·[FROM: 124.161.103.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 1.119.142.34]
文章数:26&分页:Android 上有没有好用的联系人同步 app?
17:06:50 +08:00 · 5856 次点击
google的不敢用,每次把邮箱啊,什么的同步一堆,国内基本上用不到这么多邮件联系人。腾讯的联系人同步,貌似最近也老是把通讯录搞乱掉,我已经丢掉好多次联系人了。国内有没有其他替代方案?
32 回复 &| &直到
23:02:08 +08:00
& & 17:25:53 +08:00
Google 同步的怎么不好用了,从 Android 到 iOS 到 OS X 全部用 google 同步完全没有问题的。是不是你的 dialer 显示联系人不全?
& & 17:28:10 +08:00 via Android
QQ同步助手
iOS
Android
连我的nokia 2060 s40都有,还想要什么?
& & 17:29:41 +08:00
我用pc的软件备份,再导入
& & 17:30:37 +08:00
& & 17:39:24 +08:00 via Android
联系人全放在微软outlook上,无论是iOS,Android还是WP,都能完美同步,日历也是一样。还不用担心被墙。
& & 17:54:16 +08:00
手机不是都自带么,华为有华为云,酷派有酷派云……各种云
& & 17:56:36 +08:00
Android平台上最好用的google可以设置同步通讯录还是邮件的啊
& & 18:10:49 +08:00 via Android
outlook online的exchange同步,很好。
& & 18:25:16 +08:00 via Android
google,所有平台都用它
& & 18:34:55 +08:00
QQ同步助手
& & 18:52:20 +08:00
微信电话本,一直用这个
& & 18:55:27 +08:00
QQ同步助手 +1
手机上的各种云 当你换手机华为手机的时候你还会用酷派云么?
& & 19:12:56 +08:00
& & 20:41:53 +08:00
@ 用哪个app?
& & 20:44:24 +08:00
说的啊。
添加微软的exchange帐号。
& & 20:45:45 +08:00
Google 同步
& & 20:47:14 +08:00
一直用google的
& & 20:49:07 +08:00
@ 我看了下,貌似我同步了,但是登陆进去发现电话联系人没进去啊。
& & 20:50:06 +08:00
@ 不想微信绑定手机号码
& & 20:59:14 +08:00
& & 21:11:28 +08:00
vcf文件备份。
& & 21:13:24 +08:00
微信可以直接上传和下载
& & 21:14:23 +08:00
Google,联系人-&设置-&只显示有电话号码的联系人
& & 21:20:11 +08:00 via Android
qq同步助手 ++1
& & 21:57:02 +08:00
在这个隐私堪忧的互联网时代,还有哪种方式比“手动备份,手动回复”更安全呢??!
& & 23:50:47 +08:00 via Android
@ 哪个要你的破隐私?莫非你有啥见不得人的?
& & 09:19:52 +08:00
@ 笑而不语。默默走过。
& & 11:58:55 +08:00 via Android
@ 反正在国内哪里有什么隐私?除非你肉身翻墙
& & 16:12:03 +08:00
google的联系人、日历都不错,不过有时候慢,似乎被墙。
现在改为小米云同步了,能同步联系人,可惜没有日历。
& & 18:35:39 +08:00
@ 建议你阅读一下这个文章http://evilcos.me/?p=434
PS:基本的网络安全常识都没有,还翻墙?!!不再和你讨论。
& & 20:18:39 +08:00 via Android
@ 你的博客?
& & 23:02:08 +08:00
@ outlook联系人在安卓上怎么同步?
& · & 2809 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 20ms · UTC 07:28 · PVG 15:28 · LAX 00:28 · JFK 03:28? Do have faith in what you're doing.Android系统联系人相关介绍以及具体的用法 - 简书
Android系统联系人相关介绍以及具体的用法
本文主要解读Android系统联系人相关的知识,以及展示联系人相关的操作实例。参考Android官方API。由于Contact在API 5的时候废弃,因为其只支持单账号联系人。所以本文就直接介绍ContactContract类
ContactsContract
ContactsContract是什么呢?官方文档是这样描述的:
The contract between the contacts provider and applications. Contains definitions for the supported URIs and columns. These APIs supersede ContactsContract.Contacts.
联系人应用和提供者包括自定义URL可字段都被新的ContactsContractAPI取代。也就是说新的API支持多个URL也就是多账号,是Contact类的升级版。
ContactsContract定义了可扩展的联系人关联数据库,联系人信息存储为三层表模型
ContactsContract.Data:表中一行可以存储任何个人数据,例如手机号或者邮箱地址。并且表中的所有数据皆为开放的。表中有一些常规的预定字段,当然任何应用可以根据自身需求去定义自己数据字段。
ContactsContract.RawContacts:这个表表示用户单个账号下面的联系人,比如用户的Gmail邮箱内的联系人。
ContactsContract.Contact:此表存放着描述同一个人的一个或者多个RowContact(账号)的聚合数据。当单个账号数据修改后,此表会根据需要更新对应的聚合联系人。
ContactsContract.Groups:其中包含有关Gmail联系人组等原始联系人群组的信息。当前的API不支持跨多个账户的组的概念。
ContactsContract.StatusUpdates:其中包含社交状态更新,包括IM可用性。
ContactsContract.AggregationExceptions:用于手动聚合和分解原生数据。
ContactsContract.Settings:其中包含账号和组的可见性和同步设置。
ContactsContract.SyncState: 其中包含代表同步适配器维护的自由格式数据。
ContactsContract.PhoneLookup:用于紧急呼叫者的ID查找。
ContactsContact.Contacts
联系人表的常熟,其中包含代表同一人的原始联系人的每个汇总的记录
无法明确的创建联系人。当一条联系人数据插入的时候,provider首先去查找是否存在同一个联系人。如果找到,会从聚合表中获取联系人的CONTACT_ID。如果没有找到匹配的联系人,provider会自动的插入一个新的联系人,并将新的联系人插入原始的联系人数据表中。
当某个确定的列被修改如: TIMES_CONTACTED, LAST_TIME_CONTACTED, STARRED, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL. 更改联系人表的以上字段都会更改所有构成联系人的原始数据。
如果只是阅读个别联系人,可以使用CONTENT_LOOKUP_URI去代替CONTENT_URI。
如果你要根据电话号码来查找联系人,使用PhoneLookup.CONTENT_FILTER_URI,对此进行了优化
如果你要根据部分名称查询联系人,例如某些过滤条件,可以使用CONTENT_FILTER_URI
如果你想根据某些数据元素如邮箱地址,昵称等查询联系人,可以对ContactsContract.Data表进行查询,该表中包含联系人ID,姓名等。
ContactsContract.Data
表中的常量包含与联系人绑定的数据点。且每一行的数据表中存放着单个一些列的联系人信息(比如手机号)和他相关的数据如(家庭电话或者是工作电话)。
数据表可以容纳任何种类的联系数据。存储在一个特定行的数据由MIMETYPE值指定,该值决定了数据存放在通用的数据表DATA1到DATA15行中。比如,如果数据类型是 Phone.CONTENT_ITEM_TYPE则DATA1列存放手机号,如果数据类型是 Email.CONTENT_ITEM_TYPE则DATA1存放为邮箱地址。同步的适配器和应用可以定义他们自己的数据类型。
ContactsContract预设了很少一部分数据类型,例如:ContactsContract.CommonDataKinds.Phone, ContactsContract.CommonDataKinds.Email等等。为了方便起见,为DATA1起了别名。Phone.NUMBER与DATA1是相同的意思。
DATA1位索引列,用于预期在查询选择中最常用的数据元素。例如在代表电子邮件地址的DATA1行的情况下,应用于邮件地址本身,而DATA2等可以用于诸如电子邮件类型的辅助信息。
按照惯例,DATA15用于存储BLOB(二进制数据)
给定账户类型的同步适配器必须正确的处理相应原始联系人中使用的每种数据类型。否则可能导致数据丢失或者损坏。
同样的你不能为已有的账号类型引入新的数据类型。例如,你给谷歌账号的联系人数据表行中中新增一个数据类型“favorite song”,它将不会同步到服务器上面,因为谷歌同步适配器并不能解析这种数据类型。所以新的数据类型应该去建立新的账户类型或者新的同步适配器。
可以使用传统的插入(Uri,ContentValues),update(Uri,ContentValues,String,String [])和delete(Uri,String,String [])方法来插入/更新/删除数据行,但是基于在几乎所有情况下,批处理ContentProviderOperation将被证明是一个更好的选择。批处理中的所有操作都在单个事务中执行,这确保原始联系人的电话端和服务器端状态始终保持一致。此外,基于批处理的方法效率更高:不仅数据库操作在单个事务中执行时更快,而且还向内容提供者发送一批命令可以节省大量时间在进程和内容提供商运行的过程。
使用批处理操作的另一面是大批量可能长时间锁定数据库,从而阻止其他应用程序访问数据并潜在地导致ANR(“应用程序无响应”对话框)。)
为了避免数据库的这种锁定,请确保在批处理中插入“产生点”。产生点向内容提供者指出,在执行下一个操作之前,它可以提交已经进行的更改,产生其他请求,打开另一个事务并继续处理操作。屈服点不会自动提交事务,但只有在数据库上有其他请求等待时。通常,同步适配器应在批次中的每个原始接触操作序列的开始处插入屈服点。
可以使用传统插入(Uri,ContentValues)方法插入单个数据行。应该始终以批次的形式插入多个行。
ContentValues values = new ContentValues();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, "1-800-GOOG-411");
values.put(Phone.TYPE, Phone.TYPE_CUSTOM);
values.put(Phone.LABEL, "free directory assistance");
Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values);
同样的可以使用ContentProviderOperations:
ArrayList&ContentProviderOperation& ops =
new ArrayList&ContentProviderOperation&();
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValue(Data.RAW_CONTACT_ID, rawContactId)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, "1-800-GOOG-411")
.withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
.withValue(Phone.LABEL, "free directory assistance")
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
就像插入一样,更新可以逐个或者批处理,批处理模式是首选方法:
ArrayList&ContentProviderOperation& ops =
new ArrayList&ContentProviderOperation&();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
.withValue(Email.DATA, "")
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
就像插入和更新一样,删除可以使用delete(Uri,String,String [])方法或使用ContentProviderOperation完成:
ArrayList&ContentProviderOperation& ops =
new ArrayList&ContentProviderOperation&();
ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
.withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
查找给定联系人的给定类型的所有数据
Cursor c = getContentResolver().query(Data.CONTENT_URI,
new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
Data.CONTACT_ID + "=?" + " AND "
+ Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
new String[] {String.valueOf(contactId)}, null);
查找给定联系人的给定类型的所有原始数据
Cursor c = getContentResolver().query(Data.CONTENT_URI,
new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
Data.RAW_CONTACT_ID + "=?" + " AND "
+ Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
new String[] {String.valueOf(rawContactId)}, null);
插入通讯录实例
* 插入本地联系人数据库
* 名片夹的插入地方目前全部是以新增模式保存通讯录,待放出名片夹功能时需要做是否是更新操作的判断
public static int insertContact(Context context, List&CardCaseBean& list, boolean... action) {
boolean isUpdate =
if (action.length & 0) {
if (action[0]) {
isUpdate = action[0];
if (list == null || list.size() & 0) {
ArrayList&ContentProviderOperation& ops = new ArrayList&ContentProviderOperation&();
int rawContactInsertIndex = 0;
int resutl = 0;
for (CardCaseBean card : list) {
rawContactInsertIndex = ops.size();
if (isUpdate) {
ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
//插入姓名
if (!TextUtils.isEmpty(card.name)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, card.name)
.build());
//插入电话
if (!TextUtils.isEmpty(card.mobile)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, card.mobile)
.build());
//插入传真
if (!TextUtils.isEmpty(card.fax)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, card.fax)
.build());
//插入Email
if (!TextUtils.isEmpty(card.email)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, card.email)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
.build());
//插入工作网址
if (!TextUtils.isEmpty(card.web)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Website.URL, card.web)
.withValue(ContactsContract.CommonDataKinds.Website.TYPE, ContactsContract.CommonDataKinds.Website.TYPE_WORK)
.build());
//插入地址
if (!TextUtils.isEmpty(card.address)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, card.address)
.build());
//插入部门
if (!TextUtils.isEmpty(card.department)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, card.department)
.build());
//插入职务
if (!TextUtils.isEmpty(card.jobTitle)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.TITLE, card.jobTitle)
.build());
//插入公司
if (!TextUtils.isEmpty(card.company)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, card.company)
.withYieldAllowed(true)
.build());
//插入备注【公司简介】
if (!TextUtils.isEmpty(card.note)) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Note.DATA1, card.note)
.withYieldAllowed(true)
.build());
// 真正添加
ContentProviderResult[] results = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
if (results != null && results.length & 0) {
for (ContentProviderResult result : results) {
SoutUtils.out("URI:" + result.uri, "count:" + result.count);
} catch (RemoteException | OperationApplicationException e) {
e.printStackTrace();
插入前要进行一些权限的判断以及开启
* 执行插入用户的通讯录
* @param activity:当前的Activity
* @param items:待插入的数据
* @param isUpdate:是否是更新通讯录
private static boolean executeInsertToAddressBook(final Activity activity, List&CardCaseBean& items, boolean isUpdate) {
int hasWriteContactsPermission = ContextCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
//用户拒绝授予权限并且不再提示
if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_CONTACTS)) {
CommonMsgDialog.Builder commonMsgDialog = new CommonMsgDialog.Builder(activity)
.setMessage("没有写入通讯录的权限").setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}).setPositiveButton("开启", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.WRITE_CONTACTS},
REQUEST_WRITE_CONSTACTS_PERMISSIONS);
commonMsgDialog.create().show();
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.WRITE_CONTACTS},
REQUEST_WRITE_CONSTACTS_PERMISSIONS);
int result = UserUtils.insertContact(activity, items, isUpdate);
boolean isSuccess = result & 0;
if (isSuccess) {
if (isUpdate) {
Util.showShortToast(activity, "更新成功");
Util.showShortToast(activity, "已存入通讯录");
Util.showShortToast(activity, "存入失败");
return isS
获取所有联系人常用字段数据
* 获取所有联系人的姓名、手机号、公司、职务、地址、邮箱
public static List&CardCaseBean& getAllContact(Context context) {
//读取通讯录的全部的联系人
//需要先在raw_contact表中遍历id,并根据id到data表中获取数据
//uri = content://com.android.contacts/contacts
List&CardCaseBean& list = new ArrayList&&();
Uri uri = Uri.parse("content://com.android.contacts/contacts"); //访问raw_contacts表
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Contacts.Data._ID}, null, null, null);
//获得_id属性
while (cursor.moveToNext()) {
CardCaseBean contact = new CardCaseBean();
int id = cursor.getInt(0);//获得id并且在data中寻找数据
uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data"); //如果要获得data表中某个id对应的数据,则URI为content://com.android.contacts/contacts/#/data
Cursor cursor2 = resolver.query(uri, new String[]{ContactsContract.Contacts.Data.DATA1, ContactsContract.Contacts.Data.MIMETYPE}, null, null, null);
//data1存储各个记录的总数据,mimetype存放记录的类型,如电话、email等
while (cursor2.moveToNext()) {
String data = cursor2.getString(cursor2.getColumnIndex("data1"));
if (isHasValue(data)) {
if (cursor2.getString(cursor2.getColumnIndex(ContactsContract.Data.MIMETYPE)).equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) {
//如果是名字
contact.name =
} else if (cursor2.getString(cursor2.getColumnIndex(ContactsContract.Data.MIMETYPE)).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
//如果是电话
contact.mobile =
} else if (cursor2.getString(cursor2.getColumnIndex(ContactsContract.Data.MIMETYPE)).equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
//如果是email
contact.email =
} else if (cursor2.getString(cursor2.getColumnIndex(ContactsContract.Data.MIMETYPE)).equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)) {
//如果公司
contact.company =
Cursor cursor3 = resolver.query(uri, new String[]{ContactsContract.Contacts.Data.DATA4, ContactsContract.Contacts.Data.MIMETYPE}, null, null, null);
//data4 获取公司地址以及职务
while (cursor3.moveToNext()) {
String data = cursor3.getString(cursor3.getColumnIndex("data4"));
if (isHasValue(data) && cursor3.getString(cursor3.getColumnIndex(ContactsContract.Data.MIMETYPE)).equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)) {
contact.jobTitle =
Cursor cursor4 = resolver.query(uri, new String[]{ContactsContract.Contacts.Data.DATA9, ContactsContract.Contacts.Data.MIMETYPE}, null, null, null);
//data4 获取公司地址以及职务
while (cursor4.moveToNext()) {
String data = cursor4.getString(cursor4.getColumnIndex("data9"));
if (isHasValue(data) && cursor4.getString(cursor4.getColumnIndex(ContactsContract.Data.MIMETYPE)).equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)) {
contact.address =
list.add(contact);
迷途小书童
github:https://github.com/MissMyDearBear
微信公众号:AlenBear_2018
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
//我所经历的大数据平台发展史(三):互联网时代 o 上篇http://www.infoq.com/cn/articles/the-development-history-of-big-data-platform-paet02 编者按:本文是松子(李博源)的大数据平台发展史...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
学生的作息还是初秋到隆冬早春到盛夏是晨练时略潮湿的袖口怎么都脱不开青春印记 早晨的空气还是掷地有声的清泠微微张合的毛孔还在大口大口地呼吸 只是对面的影子依旧未和我融为一体 天空会渐渐失去色彩树儿也会随冷风凋零何时才能把伤口冰冻起化作远方那指路的繁星被标记、被愈合被铭记、被忘...
共六种花花哟 向日葵
------追逐光明 康乃馨
------母爱最伟大 小野菊
---生的坚毅和希望 玫瑰
------爱的炙热和温暖
自己造了几个仙人掌,准备画个北欧小清新风,结果一不小心涂重了(?&?&?),就全涂深了。
第二十二幅 线稿 上色 告诉大家一个小秘密,千万不要画完仙人掌举起画然后给你近视的室友们看,她们会告诉你:你今天画海草啊……画海草啊……海草啊……草啊……啊……(...
文/木子 人若变记忆便迷人。
回忆不过是被往事下的盅,每次回东壁看望奶奶和外婆的时候,老人总爱反复叨念着旧事,东家的娃...
钢琴距离上次调音整整一年了,原则上应该要整修一下了。 对于 学习新曲子,目前在刚刚学习贝多芬最简单的一首协奏曲op49 no2,据说是他专门写给外行人(非钢琴专业的)弹的,但是也保留了他一贯的风格,万千情绪集一身。即使就这样的曲子,已经是钢琴6-7级之间的曲目了,可见想要弹...}

我要回帖

更多关于 foxmail同步联系人 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信