谷歌联系人api(gdata)同步低分辨率照片

时间:2014-09-27 20:49:54

标签: c# sync resolution google-contacts

我使用谷歌联系人api(gdata)在谷歌联系人中设置联系人的照片。
我正在使用fiddler,我发现请求是根据Google Contacts Examples发送的,但从谷歌下载的照片总是96x96。 我用来更新和下载照片的代码是:

public void UpdateUserPhoto(Contact contact, Stream photo)
{
      _contactsRequest.SetPhoto(contact, photo);
}

public static void DownloadPhoto(ContactsRequest cr, Contact contact)
{
    if (contact.PhotoEtag == null)
        return;
    Stream photoStream = cr.Service.Query(contact.PhotoUri);
    FileStream outStream = File.OpenWrite(string.Format(@"c:\friends\{0}.jpg",contact.Name.FullName));
    byte[] buffer;
    using (var memoryStream = new MemoryStream())
    {
        photoStream.CopyTo(memoryStream);
        buffer =  memoryStream.ToArray();
    }

    outStream.Write(buffer, 0, buffer.Length);
    photoStream.Close();
    outStream.Close();
}

我尝试将联系人同步到我的手机也在那里,大小始终限制为96x96。 我做错了什么或谷歌不允许同步超过96x96?我可以看到许多应用程序以超过96x96的速度同步联系人,然后我想这是可能的,但是正确的方法是什么?

修改

以下是同步&检索由提琴手拍摄的照片:
同步照片请求
PUT https://www.google.com/m8/feeds/photos/media/mymail@gmail.com/55f3484e8aaf1c82 HTTP / 1.1
Etag:" SomeEtag"
如果匹配:" SomeEtag。"
内容类型:image / jpg
用户代理:G-GoogleContactsSync / GOAuth2RequestFactory-CS-Version = 2.2.0.0
授权:承载我的授权
GData-Version:3.0
主持人:www.google.com
内容长度:34480

同步照片回复
HTTP / 1.1 200 OK
Content-Type:application / atom + xml;字符集= UTF-8;类型=条目
GData-Version:3.1
ETag:" KgxxHGIyfCt7I2BoA047FShUNFU3BWx8RDQ。"
日期:2014年10月1日星期三20:13:06 GMT
到期日:2014年10月1日星期三20:13:06 GMT
Cache-Control:private,max-age = 0
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-XSS-Protection:1;模式=块
服务器:GSE
替代协议:443:quic,p = 0.01
内容长度:694
(这里有带有Id,更新,编辑等的xml)。

照片要求:
获取https://www.google.com/m8/feeds/photos/media/myMail@gmail.com/55f3484e8aaf1c82 HTTP / 1.1
Content-Type:application / atom + xml;字符集= UTF-8
用户代理:G-GoogleContactsSync / GOAuth2RequestFactory-CS-Version = 2.2.0.0
授权:承载我的授权
GData-Version:3.0
主持人:www.google.com

照片回复:
HTTP / 1.1 200 OK
内容类型:image / jpeg
到期日:2014年10月1日星期三20:25:54 GMT
日期:2014年10月1日星期三20:25:54 GMT
Cache-Control:private,max-age = 0,must-revalidate,no-transform
变化:接受,X-GData授权,GData版本
GData-Version:3.1
ETag:" SomeEtag。"
转移编码:分块
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-XSS-Protection:1;模式=块
服务器:GSE
替代协议:443:quic,p = 0.01

1 个答案:

答案 0 :(得分:3)

我自己重新测试并上传了许多来源的图片,包括我的Android手机和平板电脑上的联系人应用,gmail联系人和API。所有这些都将采用更高分辨率的图片,但只允许大小为96x96使用Contact API v3.So当您通过PC上的任何应用程序使用该API下载时,您将获得96x96图像,似乎没有办法与特定的API有所不同。

除非我也错过了联系API v3仅限于此图像大小的内容。我怀疑google +等价物不是。

我这样做的方法是使用google plus api

  var service = new PlusService(new BaseClientService.Initializer());
  var request = new PeopleResource.GetRequest(service, "<your google user id>")
  {
      OauthToken = authParameters.AccessToken
  };

  Person person = request.Execute();
  Person.ImageData image = person.Image;
  string pictureUrl = image.Url;

  ... request to url here after munging sz

现在您需要更改返回到所需大小的网址,因为默认值为?sz = 50,如果您的原始大小是您指定的大小,则会显示该大小,否则会缩放图像

然而,联系人api和google plus api是不同的野兽。您需要使用google plus的域功能来提取您的联系人,并且他们可能拥有与您在联系人列表中不同的照片(如果已设置)。

Krystan