bkaramik
bkaramik

Reputation: 88

Facebook Integration in Libgdx

I'm trying to integrate Facebook login in my game but since now I couldn't achieve this.

i have followed the instructions in :

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

And created my interface and implemented it for Android project but still no success. When i call my loginFacebook function , it shows me a circular load screen and my game screen comes back.

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;
    }

}

In my Android project i send this interface to the core project .

    andAdap = new AndroidFacebookAdapter(this);

    initialize(new MyGdxGame(andAdap), config);

And i called it when screen is touched.

game.facebookIntegration.loginFacebook();

In logcat i see :

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

After i see a circular loading screen (nothing on screen just black) then my game screen comes back again . In which step i made a mistake ?

Thank you for your answers .

EDIT 1 : After realizing i was already signed in my facebook account , i logged out. Then tried again and it was working. It was opening the Facebook app to ask me for credentials but even i enter the right user name / password my "onCompleted" function is not called.

Edit 2 : Now my problem solved , thanks to the tutorial at http://blog.supercookie.co.uk/post/94802569132/facebook-integration-w-libgdx I just needed to use UiLifecycleHelper class and its implementation. My interface implmenting class now.

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();
    }   

}

Upvotes: 1

Views: 736

Answers (1)

bkaramik
bkaramik

Reputation: 88

As in edit 2 , just add the UiLifecycleHelper android side interface implementing class. Then it is working as expected. For more explanation : http://blog.supercookie.co.uk/post/94802569132/facebook-integration-w-libgdx

Upvotes: 1

Related Questions