2014-09-27 68 views
3

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

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(); 
} 

我试过的联系人同步到我的手机有过,规模总是限制在96×96。 我做错了什么或谷歌不允许同步超过96x96?我可以看到许多应用程序可以同步超过96x96的联系人,然后我猜这有可能,但是正确的方法是什么?

编辑

这里是照片的同步&检索由提琴手所捕获:
同步照片请求:
PUT https://www.google.com/m8/feeds/photos/media/[email protected]/55f3484e8aaf1c82 HTTP/1.1
的Etag: “SomeEtag”
如果 - 匹配:“SomeEtag”。
内容类型:image/JPG
的User-Agent:G-GoogleContactsSync/GOAuth2RequestFactory-CS-版本= 2.2.0.0
授权:承载myAuthorization
的GData-版本:3.0
主机:www.google.com
内容长度:34480

同步光响应
HTTP/1.1 200 OK
内容类型:应用/原子+ xml的;字符集= UTF-8; type = entry
GData-Version:3.1
ETag:“KgxxHGIyfCt7I2BoA047FShUNFU3BWx8RDQ”。
日期:星期三,2014年10月1日20点13分06秒GMT
到期日:周三,2014年10月1日20点13分06秒GMT
缓存控制:私人,最大年龄= 0
X-Content-Type的-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-XSS-Protection:1;模式=块
服务器:GSE
复用协议:443:QUIC,p值= 0.01
的Content-Length:694
(下面是XML ID为,更新,编辑等)

照片请求:
GET https://www.google.com/m8/feeds/photos/media/[email protected]/55f3484e8aaf1c82 HTTP/1.1
Content-Type:application/atom + xml;字符集= UTF-8
的User-Agent:G-GoogleContactsSync/GOAuth2RequestFactory-CS-版本= 2.2.0.0
授权:承载myAuthorization
的GData-版本:3.0
主机:www.google.com

图片回复:
HTTP/1。1 200 OK
内容类型:图像/ JPEG
到期日:周三,2014年10月1日20点25分54秒GMT
日期:星期三,2014年10月1日20点25分54秒GMT
缓存控制:私人, max-age = 0,must-revalidate,no-transform
Vary:Accept,X-GData-Authorization,GData-Version
GData-Version:3.1
ETag:“SomeEtag”。
传输编码:分块
X-Content-Type的选项:nosniff
X框选项:SAMEORIGIN
X-XSS-保护:1;模式=块
服务器:GSE
复用协议:443:QUIC,P = 0.01

+0

您向哪个版本的API发出请求?如果您在请求中省略版本参数,则默认为v1,这会返回96x96的照片。 – 2014-09-30 23:02:00

+0

它的版本3.请参阅我的更新.. – atlanteh 2014-10-01 20:33:26

+0

已修改我的答案 – 2014-10-05 17:01:20

回答

3

我这个重新测试自己,并上载从多种来源的照片,包括Android手机和平板电脑上的联系人应用,Gmail的联系人和API。他们都将采取更高分辨率的图片,但只允许使用联系API v3的大小为96x96。所以当您通过任何应用程序使用该API在PC上下载时,您将获得一张96x96图像,似乎没有办法以改变那个特定的API。

意义除非我也错过了联系API v3仅限于此大小的图像。我怀疑谷歌+等值不是。

中,我已经做了这个问题的方法是使用谷歌加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和谷歌加API是不同的野兽。您需要使用Google plus的域名功能才能将您的联系人拉出,并且可能他们拥有的照片与您在联系人列表中设置的照片不同(如果有的话)。

Krystan

+0

它已经是第3版。请参阅我的更新.. – atlanteh 2014-10-01 20:32:45

+1

好的。谢谢。那么是否还有其他任何可以使用PC的API来使用它? – atlanteh 2014-10-04 17:20:48

+0

如果您从Url中删除'?sz = 50',您将获得原始大小。请参阅https://developers.google.com/+/web/api/rest/latest/people#image.url(虽然它没有明确表示) – TWiStErRob 2016-01-19 23:44:12