【问题标题】:unity3d - can't show facebook profile image on the device ( simulator works perfect )unity3d - 无法在设备上显示 facebook 个人资料图片(模拟器完美运行)
【发布时间】:2015-09-05 20:25:03
【问题描述】:

我正在使用 Unity3d (c#) 和 facebook API。当我在统一模拟器上运行它时,我尝试在屏幕上显示我的个人资料图像,一切正常,我得到了图像。但是当我构建一个版本并在真实设备上尝试时,我什么也得不到。

我知道 facebook CDN 存在问题。请求的结果是 302 并且 WWW 类无法处理重定向,所以我做了这样的事情(c# 对我来说是一门新语言):

WWW www = new WWW(url);
    yield return www;

    if( www.responseHeaders.ContainsKey( "LOCATION" ) ){

        var redirection = www.responseHeaders[ "LOCATION" ];

        WWW wwwRe = new WWW( redirection );
        yield return wwwRe;
        callback( wwwRe.texture, userID );

    }else{
        callback( www.texture, userID );
    }

请帮助我让我失去理智,为什么我的所有个人数据都出现在设备上,除了完美统一的图像。我做错了什么?

谢谢。

解决办法:

我尝试了许多选项来获取设备上的个人资料图片,但均无济于事。 最后,我将 Facebook SDK 从 6.2.1 升级到 6.2.2,将 Unity 从 5.1 升级到 5.1.3,再次从设备中删除应用程序(清除所有数据)并且它可以工作。看起来像是 Facebook 的问题(这不是他们第一次发布带有 bug 的 SDK)。

我接受 Umair 的回答,即使他的代码有一些语法问题,他真的很想帮助我,基本上他的回答是正确的。

我使用此代码来测试我的图像: (希望对某人有所帮助)

private void getMyProfileData(){

    // get profile image.
    FB.API( Util.GetPictureURL( "me", 128, 128 ), Facebook.HttpMethod.GET, callBackGetProfilePicture );
}

private void callBackGetProfilePicture( FBResult result ){

    // in case if there some error with the image.
    if( result.Error != null ){
        // call this method again
    }

    string ImageUrl = Util.DeserializePictureURLString( result.Text );  

    StartCoroutine(LoadPictureCoroutune( ImageUrl ));
}

IEnumerator LoadPictureCoroutune(string url){

    var profilePicRequest = new WWW( (string)url );
    yield return profilePicRequest;

    if( profilePicRequest.error == null)
    {
        Texture2D profilePic = profilePicRequest.texture;

            // my test image place
            Image profileImage = FBavatar.GetComponent<Image>(); 
            profileImage.sprite = UnityEngine.Sprite.Create( profilePic, new Rect(0,0,128,128), new Vector2( 0, 0 ));

    }
    else
    {
        Debug.LogError("Error While downloading Picture: " + profilePicRequest.error);
    }
}

【问题讨论】:

  • 你试过没有收益回报的吗?
  • 您是否添加了调试打印以查看是否进入 ContainsKey if?
  • 我无法调试它,因为在模拟器中它在我添加“重定向”之前可以正常工作,因此它没有“位置”键。我不知道如何在设备上调试。 slapy - 我会在没有产量的情况下尝试,但不确定它是否有效。
  • 是IOS吗?如果是这样,您可以通过 Xcode 看到 Debug.Log。
  • 添加一个 Debug.Log 并检查您的 location 键的值。在 yield return wwwRe 之前添加此日志;声明,然后检查 if(wwwRe.error){ Debug.Log(wwwRe.error.ToString();)} else if(wwwRe.isDone){callback( wwwRe.texture, userID );} 这样你就会知道什么错了。

标签: c# facebook unity3d facebook-unity-sdk


【解决方案1】:
  1. 使用以下代码从 Facebook API 获取图片数据:

    FB.API ("/v2.4/me/?fields=picture", Facebook.HttpMethod.GET, RequestResponce);
    
  2. RequestResponce方法中:

    void RequestResponce(FBResult result)
    {
        Debug.Log("requestResponce(): " + result.text);
        if (!string.IsNullOrEmpty(result.Error))
        {
            Debug.Log("FB_API:ReadRequest:Failed:"+result.Error);
        }
        else
        {
            var data = SimpleJSON.JSON.Parse(result.Text);
            string url = data["picture"]["data"]["url"];
            StartCoroutine(LoadPictureCoroutune(url));
        }   
    }
    
  3. IEnumerator LoadPictureCoroutune(string url)
    {
        var profilePicRequest = new WWW(url);
    
        Debug.Log("Going to Load Picture ");
    
        yield return profilePicRequest;
    
        if(profilePicRequest.error == null)
        {
            Texture2D profilePic = profilePicRequest.texture;
    
            if(profilePic != null)
            {
                // Use ProfilePic to wherever you want to.
                //SetPicture(ProfilePic);
            }
        }
        else
        {
            Debug.LogError("Error While downloading Picture: " + profilePicRequest.error);
        }
    }
    

【讨论】:

  • 它对我不起作用,我没有得到图片,只有我将精灵放在他身上的白色方块(我从 Texture2d 创建了一个新精灵)。有什么想法吗?
  • 我找到了解决方案(在我的问题中),谢谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多