/// <summary> /// 这里要替换Contact的Edit的Uri的原因是: /// EditUri的默认值为: https://www.google.com/m8/feeds/contacts/{userEmail}/full /// 而我们的Token针对的授权Uri是:https://www.google.com/m8/feeds/contacts/default/full /// 对于读取某个谷歌用户的联系人的Url,正常应该要用邮箱指定当前要获取谁的联系人,但是也可以指定为default,表示默认为当前Token对应的谷歌用户。 /// 所以,对于读取联系人时,上面这两个地址都可以,我们选择了第二种方式,因为这样做可以不需要知道用户的邮箱,代码可以通用,不用针对每个谷歌用户的邮箱生成 /// 一个专用于操作联系人的Token; /// 但是当要更新时,EditUri的默认值里包含的不是default,而是一个具体的Email,这导致我们之前用defaut的方式获取的Token无法做更新或删除谷歌联系人的操作 /// Googel也搞了,只有在读取数据时具体邮箱才可以和default值等价,而在更新数时则不能。幸亏你提供了源代码,费了好大功夫调试你的代码才知道这个原因。 /// </summary> private void ReplaceContactEditUrl(global::Google.Contacts.Contact contact) { var contactId = contact.Id; var updateContactUrl = GoogleSyncSettings.ContactScope + "/" + contactId.Substring(contactId.LastIndexOf('/') + 1); contact.ContactEntry.EditUri = new AtomUri(updateContactUrl); }
/// <summary> /// 创建Google Contact /// </summary> private void CreateGoogleContact(GoogleContactSyncData contactData, ContactsRequest contactRequest, Group defaultContactGroup) { global::Google.Contacts.Contact contact = null; bool success = false; try { //设置联系人默认分组 contactData.Contact.GroupMembership.Add(new GroupMembership() { HRef = defaultContactGroup.Id }); //调用API新增联系人 contact = contactRequest.Insert(new Uri(GoogleSyncSettings.ContactScope), contactData.Contact); _logger.InfoFormat("新增Google联系人#{0}|{1}|{2}", contact.Id, contactData.Subject, _account.ID); success = true; } catch (Exception ex) { _logger.Error("CreateGoogleContact has exception.", ex); } if (success) { //更新联系人最后更新时间,确保与Google Contact的最后更新时间一致 UpdateContactLastUpdateTime(int.Parse(contactData.SyncId), contact.Updated.ToLocalTime()); //创建同步信息 SyncInfo syncInfo = new SyncInfo(); syncInfo.AccountId = _account.ID; syncInfo.LocalDataId = contactData.SyncId; syncInfo.SyncDataId = contact.Id; syncInfo.SyncDataType = contactData.SyncType; InsertSyncInfo(syncInfo); } }