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