Unity facebook sdk получить изображение профиля с помощью www не работает

я пытаюсь получить фотографию профиля facebook с помощью facebook sdk

когда я использовал этот код, он работал нормально, но внезапно URL-адрес второго дня не загружался. загрузка URL завершена, не печатается и не показывает ошибок.

private IEnumerator getProfilePicture()
{
    Debug.Log("Here  to get profile picture");

    WWW url = new WWW("https" + "://graph.facebook.com/" + FB.UserId + "/picture?type=square"); 

    yield return url;

    Debug.Log("url download completed");
    Texture2D textFb2 = new Texture2D(url.texture.width, url.texture.height, TextureFormat.ARGB32, false);

    Sprite sprite = Sprite.Create(url.texture, new Rect(0, 0, url.texture.width, url.texture.height), new Vector2(0.5f, 0.5f), 32);
    spriteToDisplay.GetComponent<SpriteRenderer>().sprite = sprite;
}

person Game Dev    schedule 17.12.2014    source источник
comment
У меня это работает - вы уверены, что вызываете его с помощью StartCoroutine(getProfilePicture()); ?   -  person izeed    schedule 17.12.2014
comment
да, я пробовал с StartCoroutine(getProfilePicture()); и StartCoroutine(getProfilePicture); оба плюс я пробовал с другим приложением facebook, но он не печатает завершенную загрузку URL   -  person Game Dev    schedule 17.12.2014
comment
download.unity3d.com/webplayer/images/unity-icon-big. jpg - указание этой строки в поле www работает нормально   -  person Game Dev    schedule 17.12.2014
comment
@GameDev, это происходит со всеми пользователями? вы пробовали тот же вызов в браузере? у вас может больше не быть доступа к /picture пользователя   -  person ifaour    schedule 17.12.2014
comment
Facebook предоставляет доступ к основному профилю по умолчанию :public_profile Предоставляет доступ к основной информации о человеке, включая имя, фамилию, изображение профиля, пол и возрастной диапазон. Это разрешение утверждено по умолчанию (скопировано из приложения facebook). и да, если я ввожу этот URL-адрес в браузер, он дает изображение моего профиля   -  person Game Dev    schedule 18.12.2014


Ответы (2)


Запрос, который вы отправляете в Facebook, приводит к перенаправлению 302 на изображение, хранящееся в CDN Facebook. Причина, по которой это не работает для вас, заключается в том, что класс Unity WWW никогда не поддерживал должным образом перенаправление 302.

Может случиться так, что он работал в течение дня или около того, потому что ресурс не был распространен в сети CDN, но после того, как это произошло, вы больше не можете его загрузить.

302 можно увидеть с помощью curl:

$ curl https://graph.facebook.com/zuck/picture?type=square -I
HTTP/1.1 302 Found
Location: https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xfa1/v/t1.0-1/c14.4.153.153/s50x50/1939620_10101266232851011_437577509_n.jpg?oh=6b6cd8460210e1de160cf8a6056df416&oe=550D5F6C&__gda__=1429858477_b29a956770b6173d71cb28eb35fa99e6
Facebook-API-Version: v1.0
Content-Type: image/jpeg
Pragma: no-cache
Access-Control-Allow-Origin: *
X-FB-Rev: 1534884
Cache-Control: private, no-cache, no-store, must-revalidate
Expires: Sat, 01 Jan 2000 00:00:00 GMT
X-FB-Debug: 3+McQVKq40Qa/6hLThwOwQTXP5dpENQqA5FvbX3elTkVxKsEw6ISvJG0eh0V5wVTUjC4fkmuZ1coTCDm2rLTZg==
Date: Wed, 17 Dec 2014 13:33:13 GMT
Connection: keep-alive
Content-Length: 0

Одно из предложений — использовать библиотеку Uniweb, которая обрабатывает ошибки 302.

Или обработайте 302 самостоятельно, извлеките заголовок ответа Location и отправьте другой WWW-запрос. (Но заголовки ответа доступны не на всех платформах).

person peterept    schedule 17.12.2014
comment
спасибо за ответ. Мне не разрешено использовать платный плагин. Есть ли другой вариант? - person Game Dev; 18.12.2014
comment
в этом случае вы можете добавить проверку в свой код, если у ответа было новое местоположение для перехода с var redirection = www.responseHeaders[LOCATION] (Примечание: должно быть в верхнем регистре). Если это так, сделайте еще один запрос www www = new WWW(redirection); выход доход www; - person peterept; 18.12.2014
comment
эй, спасибо за ответ, если возможно, вы можете написать мне пример кода. работа с www для меня в новинку, и в голову вообще ничего не приходит - person Game Dev; 19.12.2014
comment
Вы почти все знаете, используя WWW, как вы написали. Я использую документы Unity в качестве справки: docs.unity3d.com/ScriptReference/WWW.html Просто добавьте мой код выше, чтобы проверить местоположение, и все! - person peterept; 20.12.2014
comment
с помощью этого Debug.Log (здесь, чтобы получить изображение профиля); URL-адрес WWW = новый WWW (https + ://graph.facebook.com/ + FB.UserId + /picture?type=square); var redirection = url.responseHeaders[LOCATION]; Debug.Log(Ответ перенаправления + перенаправление); возвращаемый URL-адрес; Debug.Log(загрузка URL завершена); - выдает ошибку, что загрузка www еще не завершена. - person Game Dev; 23.12.2014
comment
Убедитесь, что вы делаете это в сопрограмме, и вы переходите на www, чтобы дождаться завершения загрузки. - person peterept; 05.01.2015
comment
WWW www = новый WWW (url); выход доход www; if(www.responseHeaders.ContainsKey(РАСПОЛОЖЕНИЕ)){ var redirection = www.responseHeaders[РАСПОЛОЖЕНИЕ]; WWW wwwRe = новый WWW(перенаправление); доходность доходность wwwRe; обратный вызов( wwwRe.texture, userID ); }else{ обратный вызов( www.texture, userID ); } Я попробовал этот код, и все же на симуляторе он работает, на устройстве я ничего не получаю. не могли бы вы помочь мне, пожалуйста, что я делаю неправильно? Благодарю. - person Dennis; 21.08.2015

И, наконец, после нескольких дней борьбы я нашел ответ, и то, что я получил, довольно странно.

когда я использую тот же код, ничего не меняя, ничего не проверяя и запуская устройство Android, все работает нормально,

у него было только одно предварительное требование: мой телефон должен быть подключен к пакетным данным, а не к wi-fi...

следует отметить, что нет ограничений на сеть Wi-Fi, и я могу использовать facebook через сеть Wi-Fi... плюс оценка, имя и другие вещи работают через Wi-Fi..... это только если я хочу, чтобы изображение профиля было загружено, я должен подключить свой телефон через пакетные данные

person Game Dev    schedule 29.12.2014
comment
Скорее всего, вы получаете другой восходящий прокси-сервер через сотовую связь, а не через Wi-Fi. Вот почему вы получаете разные результаты. - person peterept; 05.01.2015