API контактов Google (gdata) синхронизирует фотографии с низким разрешением

Я использую API контактов Google (gdata), чтобы установить фотографию контакта в контактах Google.
Я использую fiddler и вижу, что запрос отправляется в соответствии с примерами контактов Google, но фотография, загруженная обратно из Google, всегда имеет размер 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. Я что-то не так делаю или гугл не позволяет синхронизировать больше 96х96? Я вижу много приложений, которые синхронизируют контакты с разрешением более 96х96, тогда я думаю, что это возможно, но каков правильный путь?

редактировать

Вот синхронизация и поиск фотографии, снятой fiddler:
Синхронизировать запрос фото:
PUT https://www.google.com/m8/feeds/photos/media/mymail@gmail.com/55f3484e8aaf1c82 HTTP / 1.1
Этаг: "SomeEtag"
If-Match: "SomeEtag."
Тип контента: изображение / JPG
Пользователь-агент: G-GoogleContactsSync/GOAuth2RequestFactory-CS-Version=2.2.0.0
Авторизация: Носитель myAuthorization
GData-версия: 3.0
Хост: www.google.com
Длина контента: 34480

Синхронизировать фотоответ
HTTP/1.1 200 ОК
Тип контента: приложение /atom+xml; кодировка =UTF-8; тип = запись
GData-версия: 3.1
ETag: "KgxxHGIyfCt7I2BoA047FShUNFU3BWx8RDQ."
Дата: ср, 01 окт 2014 20:13:06 GMT
Истекает: Ср, 01 октября 2014 20:13:06 GMT
Cache-Control: private, max-age = 0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-защита: 1; Режим = Блок
Сервер: GSE
Альтернативный протокол: 443:quic,p=0,01
Длина контента: 694
(Здесь идет xml с идентификатором, обновлен, отредактирован и т. Д.

Фото запрос:
ПОЛУЧИТЕ https://www.google.com/m8/feeds/photos/media/myMail@gmail.com/55f3484e8aaf1c82 HTTP / 1.1
Тип контента: приложение /atom+xml; кодировка = UTF-8
Пользователь-агент: G-GoogleContactsSync/GOAuth2RequestFactory-CS-Version=2.2.0.0
Авторизация: Носитель myAuthorization
GData-версия: 3.0
Хост: www.google.com

Фотоответ:
HTTP/1.1 200 ОК
Тип контента: изображение / JPEG
Истекает: Ср, 01 октября 2014 20:25:54 GMT
Дата: ср, 01 окт 2014 20:25:54 GMT
Cache-Control: приватный, max-age=0, обязательно повторная проверка, без преобразования
Варьируется: принять, X-GData-авторизация, GData-версия
GData-версия: 3.1
ETag: "SomeEtag."
Передача-кодировка: чанки
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-защита: 1; Режим = Блок
Сервер: GSE
Альтернативный протокол: 443:quic,p=0,01

1 ответ

Решение

Я сам проверил это и загрузил изображения из нескольких источников, включая приложение контактов на мой телефон и планшет на android, контакты gmail и API. Все они будут делать снимки с более высоким разрешением, но позволят использовать размер только 96x96 с помощью Contact API v3.Так при загрузке с помощью любого приложения, использующего этот API на ПК, вы получите изображение 96x96, и, похоже, нет никакого способа изменить это с этим конкретным API.

То есть, если я не пропустил что-то, контакт API v3 ограничен этим размером изображения. Я подозреваю, что Google+ эквиваленты не являются.

То, как я это сделал, это использовать API Google Plus

  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

Теперь вам нужно изменить URL-адрес, который возвращается к нужному размеру, так как значения по умолчанию равны?sz=50, если ваш оригинал соответствует указанному вами размеру, он будет отображаться или в противном случае он будет масштабировать изображение.

Однако контакты API и API Google Plus разные звери. Вам нужно будет использовать функциональность домена в Google Plus, чтобы вытащить туда свои контакты, и потенциально у них есть фотографии, отличные от тех, которые вы делаете в своем списке контактов (если таковые установлены).

Krystan

Другие вопросы по тегам