android - Libgdx 中的 Facebook 集成

标签 android facebook libgdx

我正在尝试将 Facebook 登录集成到我的游戏中,但从现在开始我无法实现这一点。

我已按照以下说明进行操作:

https://github.com/libgdx/libgdx/wiki/Interfacing-with-platform-specific-code

并创建了我的界面并为 Android 项目实现了它,但仍然没有成功。当我调用我的 loginFacebook 函数时,它会显示一个圆形加载屏幕,然后我的游戏屏幕又回来了。

public class AndroidFacebookAdapter implements FacebookIntegration {

    private String name;
    private Activity androidActivity;

    public AndroidFacebookAdapter(Activity andAct) {
        super();
        this.name = "";
        this.androidActivity = andAct ;
    }



    @Override
    public void loginFacebook() {

        Gdx.app.log("AndroidFacebookAdapter"," Facebook login starts");

        //Session.openActiveSession(this, allowLoginUI, callback)
        androidActivity.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Gdx.app.log("AndroidFacebookAdapter"," runOnUiThread runs");
                Session.openActiveSession(androidActivity, true, new Session.StatusCallback() {

                    // callback when session changes state
                    @Override
                    public void call(Session session, SessionState state, Exception exception) {
                      if (session.isOpened()) {
                        Gdx.app.log("AndroidFacebookAdapter"," session.isOpened returns true ");
                        // make request to the /me API
                        Request.newMeRequest(session, new Request.GraphUserCallback() {

                          // callback after Graph API response with user object
                          @Override
                          public void onCompleted(GraphUser user, Response response) {
                            if (user != null) {
                                Gdx.app.log("AndroidFacebookAdapter"," Facebook Login Succefull");
                                name = user.getName();
                            }
                          }
                        }).executeAsync();
                      }
                    }
                  });               

            }
        });


    }

    @Override
    public String getName() {

        return name;
    }

}

在我的 Android 项目中,我将此接口(interface)发送到核心项目。

    andAdap = new AndroidFacebookAdapter(this);

    initialize(new MyGdxGame(andAdap), config);

我在触摸屏幕时调用了它。

game.facebookIntegration.loginFacebook();

在 logcat 中我看到:

10-27 13:06:47.988: I/AndroidFacebookAdapter(16774):  Facebook login starts
10-27 13:06:47.988: I/AndroidFacebookAdapter(16774):  runOnUiThread runs

在我看到一个圆形加载屏幕(屏幕上没有任何内容只是黑色)之后,我的游戏屏幕又回来了。我在哪一步出错了?

感谢您的回答。

编辑 1:意识到我已经登录了我的 Facebook 帐户后,我注销了。然后再次尝试,它正在工作。它正在打开 Facebook 应用程序要求我提供凭据,但即使我输入了正确的用户名/密码,我的“onCompleted”功能也没有被调用。

编辑 2:现在我的问题解决了,感谢 http://blog.supercookie.co.uk/post/94802569132/facebook-integration-w-libgdx 上的教程 我只需要使用 UiLifecycleHelper 类及其实现。我现在的界面实现类。

public class AndroidFacebookAdapter implements FacebookIntegration {

    private String name;
    public AndroidLauncher androidActivity;
    private final UiLifecycleHelper uiHelper;

    public AndroidFacebookAdapter(Activity andAct) {
        super();
        this.name = "";
        this.androidActivity = (AndroidLauncher) andAct ;
        this.uiHelper = new UiLifecycleHelper(this.androidActivity, new Session.StatusCallback() {
            @Override
            public void call(Session session, SessionState sessionState, Exception e) {

            }
        });
    }


    private void loginFacebookImp() {

        Gdx.app.log("AndroidFacebookAdapter"," Facebook login starts");

        androidActivity.runOnUiThread(new Runnable() 
        {

            @Override
            public void run() 
            {
                Gdx.app.log("AndroidFacebookAdapter"," runOnUiThread runs");
                Session.openActiveSession(androidActivity, true, new Session.StatusCallback() 
                {

                    // callback when session changes state
                    @Override
                    public void call(Session session, SessionState state, Exception exception) 
                    {
                        Gdx.app.log("AndroidFacebookAdapter"," openActiveSession call start");
                        if (session.isOpened()) 
                        {
                            Gdx.app.log("AndroidFacebookAdapter"," session.isOpened returns true ");
                            // make request to the /me API
                            Request.newMeRequest(session, new Request.GraphUserCallback() 
                            {

                                  // callback after Graph API response with user object
                                  @Override
                                  public void onCompleted(GraphUser user, Response response) {
                                      Gdx.app.log("AndroidFacebookAdapter"," onCompleted start");
                                    if (user != null) {
                                        Gdx.app.log("AndroidFacebookAdapter"," Facebook Login Succesfull");
                                        Gdx.app.log("AndroidFacebookAdapter"," Facebook name is " +  user.getName());
                                        name = user.getName();
                                    }
                                    else
                                    {
                                        Gdx.app.log("AndroidFacebookAdapter"," Facebook Login failed");
                                    }
                                  }
                            }).executeAsync();
                        }
                        else
                        {
                            Gdx.app.log("AndroidFacebookAdapter"," session.isOpened() is false");
                        }
                    }
                  });               

            }
        });




    }

    private boolean isLoggedInImp()
    {
        return Session.getActiveSession() != null && Session.getActiveSession().isOpened();
    }

    @Override
    public String getName() {       
        return name;
    }



    @Override
    public void loginFacebook() {
        loginFacebookImp();     
    }

    public void onCreate(Bundle savedInstanceState) {
        uiHelper.onCreate(savedInstanceState);
    }

    public void onResume() {
        uiHelper.onResume();
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        uiHelper.onActivityResult(requestCode, resultCode, data);
    }

    public void onSaveInstanceState(Bundle outState) {
        uiHelper.onSaveInstanceState(outState);
    }

    public void onPause() {
        uiHelper.onPause();
    }

    public void onStop() {
        uiHelper.onStop();
    }

    public void onDestroy() {
        uiHelper.onDestroy();
    }


    @Override
    public boolean isLoggedIn() {

        return isLoggedInImp();
    }   

}

最佳答案

和edit 2一样,只添加UiLifecycleHelper android端接口(interface)实现类。然后它按预期工作。更多解释: http://blog.supercookie.co.uk/post/94802569132/facebook-integration-w-libgdx

关于android - Libgdx 中的 Facebook 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26586544/

相关文章:

ios - 在哪里设置 Facebook 应用程序的 "shared via"文本

java - BodyEditorLoader - 读取文件时出错

android - 使用 radiobutton.getText() 时在 logcat 中获取空指针异常

android - 在 Android 的导航架构组件中将复杂对象作为参数传递

java - Facebook面部识别功能与java

c# - 使用 C# 更新 facebook 状态

android - 我怎样才能在安卓上获得软键盘高度?

java - Sprite 碰撞检测如何工作?

android - 如何使用 AppCompat v7 :21 在 android 中自定义 EditText 字段

java - 从图片回调中读取 android jpeg EXIF 元数据