Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Facebook after login not coming back but asking login again

I am trying to implement Facebook login functionality in my app and getting token after giving publish permission.

For this I follow following steps.

  1. Create app on Facebook(Fill all details like app name, Hash key(Release), Class name, Package Name, Single Sign On)

  2. App is available for all user now.

  3. Then i am using app id in my manifest.xml

Everything is working fine with me if Native Facebook app is install on my mobile. But if native app is not install then it will open facebook webview after filling login info it ask me to authorize after clicking on ok button it again asking me to login. And this process will continue.

****After login and allowing app permission it's not coming back to my screen but it asking login me again****.

Here is my screen shot.

enter image description here

Here is second screen shot

enter image description here

After clicking on ok then it's asking me again to login. It's loop login - authorize- login..
Here is my full code:

I am using my own button so i am not adding xml code.

  public class FBActivity extends Activity {
Session.StatusCallback statusCallback = new SessionStatusCallback();

@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.registartionwithmultiple);
    printHashKey();
    bundle = savedInstanceState;
    permissions = new ArrayList<String>();
    readpermissions = new ArrayList<String>();

    permissions.add("publish_actions");
    readpermissions.add("email");
    executeFacebookLogin();     
}       

private void executeFacebookLogin() {
     Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);         
    Session session = Session.getActiveSession();
    if(session == null) {
        if(bundle != null) {
            Log.i("TEST","RESTORING FROM BUNDLE");
            session = Session.restoreSession(this, null, statusCallback, bundle);
        }
        if(session == null) {
            Log.i("TEST","CREATE NEW SESSION");
            session = new Session(this);
        }
        Session.setActiveSession(session);          
        session.addCallback(statusCallback);
        if(session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {

            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));

        } 
    }

    if(session.isClosed()) {
        session.closeAndClearTokenInformation();
        Session.setActiveSession(null);
    }
    if(!session.isOpened()) {

        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
        Log.i("FB Login ","Open for Publish");
    } else {
        Session.openActiveSession(this, true, statusCallback);
    }

}


private class SessionStatusCallback implements Session.StatusCallback {

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        //Check if Session is Opened or not
        processSessionStatus(session, state, exception);
    }
}

@SuppressWarnings("deprecation")
public void processSessionStatus(Session session, SessionState state, Exception exception) {
    Log.i("TEST","Session in process session "+session);
    if(session != null && session.isOpened()) {

        if(session.getPermissions().contains("publish_actions")) {
            //Show Progress Dialog 
            dialog = new ProgressDialog(this);
            dialog.setMessage("Loggin in..");
            dialog.show();
            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user, Response response) {


                    if (dialog!=null && dialog.isShowing()) {
                        dialog.dismiss();
                    }
                    if(user != null) {
                        Map<String, Object> responseMap = new HashMap<String, Object>();
                        GraphObject graphObject = response.getGraphObject();
                        responseMap = graphObject.asMap();
                        Log.i("FbLogin", "Response Map KeySet - " + responseMap.keySet());
                        // TODO : Get Email responseMap.get("email"); 

                        fb_id = user.getId();
                        fb_email = null;
                        user.getBirthday();
                        fb_userName = user.getUsername();
                        fb_fullname = user.getFirstName() +" "+user.getLastName();

                        String name = (String) responseMap.get("name");
                        if (responseMap.get("email")!=null) {
                            fb_email = responseMap.get("email").toString();
                            Log.i("TEST", "FB_ID="+fb_id +"email="+fb_email+"name="+name+"user_name="+user.getUsername()+"birthday="+user.getBirthday());
                            Session session = Session.getActiveSession();
                            tokenKey = session.getAccessToken();
                            SharedPreferenceStoring myPrefsClass = new SharedPreferenceStoring();
                            myPrefsClass.storingFBToken(FBActivity.this, tokenKey);

                            finish();

                        }
                        else {
                            //Clear all session info & ask user to login again
                            Session session = Session.getActiveSession();                               
                            if(session != null) {
                                session.closeAndClearTokenInformation();
                            }
                        }
                    }
                }
            });
        } else {

            session.requestNewPublishPermissions(new Session.NewPermissionsRequest(FBActivity.this, permissions));

        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("TEST","Activity result");
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("FbLogin", "Result Code is - " + resultCode +"");
    Session.getActiveSession().onActivityResult(FBActivity.this, requestCode, resultCode, data);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Save current session
    super.onSaveInstanceState(outState);
    Session session = Session.getActiveSession();
    Session.saveSession(session, outState);
}

}

I also getting hash key.. Here is code for hash key

private void printHashKey() {
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.myapp",
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:",
                    Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }
}  

I also add Internet Permission in AndroidManifest.xml and meta-data for Facebook .

Hope all this information is sufficient if need any thing more will surely update my question.

Please give me any reference or hint.

like image 630
Sandip Armal Patil Avatar asked Jan 24 '14 15:01

Sandip Armal Patil


1 Answers

u need a library easyfacebookandroidsdk.jar and build it up in ur project

use this code :

public class MainActivity extends Activity implements LoginListener{

EditText et1;
 private FBLoginManager fbLoginManager;
Button b;

//replace it with your own Facebook App ID
public final String FacebookTesting="218874471621782";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.editText1);
b=(Button)findViewById(R.id.button1);
connectToFacebook();

}


public void connectToFacebook(){

  //read about Facebook Permissions here:
  //http://developers.facebook.com/docs/reference/api/permissions/
  String permissions[] = {
//          "user_about_me",  
//          "user_activities",
//          "user_birthday",
//          "user_checkins",
//          "user_education_history",   
//          "user_events",
//          "user_groups",
//          "user_hometown",
//          "user_interests",
//          "user_likes",
//          "user_location",
//          "user_notes",
//            "user_online_presence",
//          "user_photo_video_tags",
//          "user_photos",
//          "user_relationships",
//          "user_relationship_details",
//         "user_religion_politics",
//         "user_status", 
//         "user_videos",
//          "user_website",
//          "user_work_history",
//          "email",
//
//          "read_friendlists",
//          "read_insights",
//          "read_mailbox",
//          "read_requests",
//          "read_stream",
//          "xmpp_login",
//          "ads_management",
//          "create_event",
//          "manage_friendlists",
//          "manage_notifications",
//          "offline_access",
//          "publish_checkins",
    "publish_stream",
//          "rsvp_event",
//          "sms",
    //"publish_actions",

//          "manage_pages"

  };

  fbLoginManager = new FBLoginManager(this,
    R.layout.activity_main, 
    FacebookTesting, 
    permissions);

  if(fbLoginManager.existsSavedFacebook()){
   fbLoginManager.loadFacebook();
  }
  else{
   fbLoginManager.login();
  }
 }





@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


 @Override
 protected void onActivityResult(int requestCode, int resultCode, android.content.Intent data){


 fbLoginManager.loginSuccess(data);
 }

public void loginSuccess(Facebook facebook) {
//  GraphApi graphApi = new GraphApi(facebook);
 new getDataBackgroundThread().execute(facebook);
//    User user = new User();

//    try{
//     user = graphApi.getMyAccountInfo();
//
//     //update your status if logged in
//     graphApi.setStatus("Hello, world!");
//    } catch(EasyFacebookError e){
//     Log.d("TAG: ", e.toString());
//    }

//    fbLoginManager.displayToast("Hey, " + user.getFirst_name() + "! Login success!");
}

@Override
public void logoutSuccess() {
// TODO Auto-generated method stub

}


@Override
public void loginFail() {
// TODO Auto-generated method stub

}



 class getDataBackgroundThread extends AsyncTask<Facebook, Void, String> {

    private Exception exception;


    protected String doInBackground(Facebook... urls) {
        try{
             GraphApi graphApi = new GraphApi(urls[0]);

              User user = new User();

              try{
            //   user = graphApi.getMyAccountInfo();

               //update your status if logged in
               //graphApi.setStatus("My android App "+"VivekAppTest");
                  graphApi.setStatus("Hello "+"VivekAppTest");
              } catch(EasyFacebookError e){
               Log.d("TAG: ", e.toString());
              }
        return "posted";
        }
        catch (Exception e) {
            // TODO: handle exception
            return null;
        }


}
    protected void onPostExecute(String ipr) {
        // TODO: check this.exception 
        // TODO: do something with the feed
//
//               Intent i=new Intent(getApplicationContext(),MainActivity.class);
//               startActivity(i); 
//               finish();
//              Toast toast=Toast.makeText(getApplicationContext(),"Post Successful !", 1);
//              toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL,0, 130);
//              toast.show();
//          
    }
 }
}

Get your Facebook App id & replace it in the code. I always use this code whenever i have to post the text on FB.

In manifest give Internet permission
<uses-permission android:name="android.permission.INTERNET"/>

Thats all

Cheers

like image 83
Vivek Warde Avatar answered Sep 20 '22 12:09

Vivek Warde