0

I hope anybody can help me ! I want to change my code for the new facebook sdk 4.0 but there is only a little description and i´m getting crazy and don´t know how to make the new code with facebook login button and accesstoken

target of this code is that the user logs in with his facebook account and checks if the user already exits. if not then insert new user with email and facebook id and name

I have marked the codes with //needs to be changed and //needs to be changed END

Thanx in advance for any help !!!

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
// import com.facebook.Request;
//import com.facebook.Request.GraphUserCallback;
// import com.facebook.Response;
// import com.facebook.Session;
// import com.facebook.SessionState;
//import com.facebook.UiLifecycleHelper;
// import com.facebook.model.GraphUser;
// import com.facebook.widget.LoginButton;

@SuppressLint("NewApi")
public class AuthenticationFragment extends Fragment {
    LoginButton facebookLoginButton;
  //   private UiLifecycleHelper uiHelper;
    String TAG = "Fragment";
    Button btnLogin, btnCreateAccount;
    ProgressDialog dialogPrg;
    String userName = null;

    // New Facebook Added
    CallbackManager callbackManager;


    public static final AuthenticationFragment newInstance() {
        // TODO Auto-generated constructor stub
        AuthenticationFragment fragment = new AuthenticationFragment();
        return fragment;
    }

    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.authentication_layout, container,
                false);
        facebookLoginButton = (LoginButton) view
                .findViewById(R.id.btnFacebookLogin);
        facebookLoginButton.setFragment(this);
        facebookLoginButton.setReadPermissions(Arrays.asList("email"));


       // New added for Facebook

        // Callback registration
        facebookLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code

                //login ok  get access token
                AccessToken.getCurrentAccessToken();


            }

            @Override
            public void onCancel() {
                // App code



                Log.i(TAG, "facebook login canceled");
            }

            @Override
            public void onError(FacebookException exception) {
                // App code

                Log.i(TAG, "facebook login failed error");
            }
        });
        //New added for Facebook END






        btnLogin = (Button) view.findViewById(R.id.btn_login);
        btnCreateAccount = (Button) view.findViewById(R.id.btn_create_account);
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), LoginActivity.class);
                startActivity(intent);
            }
        });
        btnCreateAccount.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(getActivity(),
                        CreateAccountActivity.class);
                startActivity(intent);
            }
        });
        dialogPrg = new ProgressDialog(getActivity());
        dialogPrg.setCanceledOnTouchOutside(false);
        return view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


  //    uiHelper = new UiLifecycleHelper(getActivity(), callback);
  //     uiHelper.onCreate(savedInstanceState);



    }







// Needs to be changed

    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(final Session session, final SessionState state,
                         final Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

    // Needs to be changed END



    private void onSessionStateChange(Session session, SessionState state,
                                      Exception exception) {
        if (state.isOpened()) {
            Log.i("FB AUT FRAGMENT", "Logged in...");
        } else if (state.isClosed()) {
            Log.i("FB AUT FRAGMENT", "Logged out...");
        }
    }


    // Needs to be changed

    private void insertUser(Session session) {
        Request.newMeRequest(session, new GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {
                // TODO Auto-generated method stub
                new facebookUserCheck(user).start();
            }
        }).executeAsync();
    }

    // Needs to be changed END


    // Needs to be changed

    private class facebookUserCheck extends Thread {
        GraphUser user;

        public facebookUserCheck(GraphUser user) {
            // TODO Auto-generated constructor stub
            this.user = user;
        }

        // Needs to be changed



        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            // TODO Auto-generated method stub
            String handleInsertUser = getActivity().getResources().getString(
                    R.string.users_json_url)
                    + "facebook_user_check";
            try {
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(handleInsertUser);
                MultipartEntity reqEntity = new MultipartEntity();


// Needs to be changed   user.getId 
                
                reqEntity.addPart("fb_id", new StringBody(user.getId()));
// Needs to be changed END 
                

                post.setEntity(reqEntity);
                HttpResponse res = client.execute(post);
                HttpEntity resEntity = res.getEntity();
                final String response_str = EntityUtils.toString(resEntity);
                if (resEntity != null) {
                    Log.i(TAG, response_str);
                    getActivity().runOnUiThread(new Runnable() {
                        public void run() {
                            try {
                                dialogPrg.dismiss();
                                JSONArray jsonArray = new JSONArray(
                                        response_str);
                                if (jsonArray.length() == 1) {
                                    JSONObject obj = jsonArray.getJSONObject(0);
                                    User user = Ultils.parseUser(obj);
                                    UserSessionManager userSession = new UserSessionManager(
                                            getActivity());
                                    userSession.storeUserSession(user);
                                    Intent intent = new Intent(getActivity(),
                                            HomeActivity.class);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK
                                            | Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }
                            } catch (Exception e) {
                                LayoutInflater inflater = LayoutInflater
                                        .from(getActivity());
                                View promptsView = inflater.inflate(
                                        R.layout.username_promtps_layout, null);

                                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                                        getActivity());

                                // set prompts.xml to alertdialog builder
                                alertDialogBuilder.setView(promptsView);

                                final EditText message = (EditText) promptsView
                                        .findViewById(R.id.editTextDialogUserInput);
                                alertDialogBuilder
                                        .setMessage(getResources().getString(
                                                R.string.choose_your_user_name));
                                // set dialog message
                                alertDialogBuilder
                                        .setCancelable(false)
                                        .setPositiveButton(
                                                getResources().getString(
                                                        R.string.ok_label),
                                                new DialogInterface.OnClickListener() {
                                                    public void onClick(

                                                            DialogInterface dialog,
                                                            int id) {
                                                        if (!Validator
                                                                .validUserName(message
                                                                        .getText()
                                                                        .toString())) {
                                                            showDialog(getResources()
                                                                    .getString(
                                                                            R.string.invalid_user_name));
                                                            return;
                                                        }
                                                        userName = message
                                                                .getText()
                                                                .toString();
                                                        new facebookUserRegister(
                                                                user).start();
                                                    }
                                                });

                                // create alert dialog
                                AlertDialog alertDialog = alertDialogBuilder
                                        .create();

                                // show it
                                alertDialog.show();
                            }
                        }
                    });
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }

    // Needs to be changed
    
    private class facebookUserRegister extends Thread {
        GraphUser user;

        public facebookUserRegister(GraphUser user) {
            // TODO Auto-generated constructor stub
            this.user = user;
        }

        // Needs to be changed END
        
        
        
        @Override
        public void run() {
            super.run();
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    dialogPrg.show();
                }
            });
            String handleInsertUser = getActivity().getResources().getString(
                    R.string.users_json_url)
                    + "facebook_user_register";
            try {
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(handleInsertUser);
                MultipartEntity reqEntity = new MultipartEntity();


                // Needs to be changed user.getId, user.getName, user.asMap
                
                reqEntity.addPart("fb_id", new StringBody(user.getId()));
                reqEntity.addPart("fullname", new StringBody(user.getName()));
                reqEntity.addPart("email", new StringBody(user.asMap().get("email").toString()));
                // Needs to be changed  END


                reqEntity.addPart("username", new StringBody(userName));
                post.setEntity(reqEntity);
                HttpResponse res = client.execute(post);
                HttpEntity resEntity = res.getEntity();
                final String response_str = EntityUtils.toString(resEntity);
                if (resEntity != null) {
                    Log.i(TAG, response_str);
                    getActivity().runOnUiThread(new Runnable() {
                        public void run() {
                            try {
                                dialogPrg.dismiss();
                                JSONObject jsonObj = new JSONObject(
                                        response_str);
                                if (jsonObj.getString("ok").equals("0")) {
                                    // show error email;
                                    showDialog(getActivity().getResources()
                                            .getString(R.string.email_exist));
                                    return;
                                }

                                if (jsonObj.getString("ok").equals("1")) {
                                    // show error username
                                    showDialog(getActivity()
                                            .getResources()
                                            .getString(R.string.user_name_exist));
                                    return;
                                }

                                if (jsonObj.getString("ok").equals("2")) {
                                    // show unknow username
                                    showDialog(getActivity().getResources()
                                            .getString(R.string.login_failed));
                                    return;
                                }

                            } catch (Exception e) {
                                JSONArray jsonArray;
                                try {
                                    jsonArray = new JSONArray(response_str);
                                    if (jsonArray.length() == 1) {
                                        JSONObject obj = jsonArray
                                                .getJSONObject(0);
                                        User user = Ultils.parseUser(obj);
                                        UserSessionManager userSession = new UserSessionManager(
                                                getActivity());
                                        userSession.storeUserSession(user);
                                        Intent intent = new Intent(
                                                getActivity(),
                                                HomeActivity.class);
                                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK
                                                | Intent.FLAG_ACTIVITY_NEW_TASK);
                                        startActivity(intent);
                                    }
                                } catch (JSONException e1) {
                                    // TODO Auto-generated catch block
                                    e1.printStackTrace();
                                    showDialog(getActivity().getResources()
                                            .getString(R.string.login_failed));
                                }

                            }
                        }
                    });
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }


    // Needs to be changed
   
    @Override
    public void onResume() {
        super.onResume();


        Session session = Session.getActiveSession();
        if (session != null && (session.isOpened() || session.isClosed())) {
            onSessionStateChange(session, session.getState(), null);
        }

      //   uiHelper.onResume();
    }

    // Needs to be changed END
    
    
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // New Facebook added
        callbackManager.onActivityResult(requestCode, resultCode, data);
        //New Facebook added END



      //  uiHelper.onActivityResult(requestCode, resultCode, data);


// Needs to be changed

        if (Session.getActiveSession() != null
                && Session.getActiveSession().isOpened()) {
            dialogPrg.setMessage(getActivity().getResources().getString(
                    R.string.loging));
            dialogPrg.show();
            facebookLoginButton.setEnabled(false);
            insertUser(Session.getActiveSession());
        }
    }
// Needs to be changed END
    
    
    
    
    
    @Override
    public void onPause() {
        super.onPause();
      //   uiHelper.onPause();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
      //  uiHelper.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
       // uiHelper.onSaveInstanceState(outState);
    }

    public void showDialog(String message) {
        Ultils.logout(getActivity());
        AlertDialog.Builder buidler = new AlertDialog.Builder(getActivity());
        buidler.setMessage(message);
        buidler.setPositiveButton(
                getActivity().getResources().getString(R.string.ok_label),
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method
                        // stub
                        facebookLoginButton.setEnabled(true);
                    }
                });
        AlertDialog dialog = buidler.create();
        dialog.show();
    }

}
Frank
  • 2,738
  • 2
  • 14
  • 19
  • You never seem to initialize your callbackManager with an actual instance. You should try adding callbackManager = CallbackManager.Factory.create(); in your onCreateView, just before you call facebookLoginButton.registerCallback. – Ming Li Mar 30 '15 at 23:49
  • Hi yes so far i have put this in AuthenticationActivity ....but for me is important how i can change the code to work again with facebook sdk 4.0 – Frank Mar 31 '15 at 01:22
  • What did you put in AuthenticationActivity? The initialization of callbackManager? Can you show the code there? This is a crucial part in actually getting the results of login. – Ming Li Mar 31 '15 at 01:42
  • if have put this code but think this is maybe wrong there ! should move it to CreateView in the fragment @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(getApplicationContext()); callbackManager = CallbackManager.Factory.create(); setContentView(R.layout.frame_layout); – Frank Mar 31 '15 at 02:01
  • Move the callbackManager initialization to your Fragment code. Also put a breakpoint in your onActivityResult and make sure it's being called when login is done. – Ming Li Mar 31 '15 at 18:15

2 Answers2

0

Use this Snippet for facebook login. Works like a charm in my app.

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import com.facebook.AppEventsLogger;
import com.facebook.FacebookAuthorizationException;
import com.facebook.FacebookOperationCanceledException;
import com.facebook.FacebookRequestError;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphObject;
import com.facebook.model.GraphPlace;
import com.facebook.model.GraphUser;
import com.facebook.widget.FacebookDialog;
import com.facebook.widget.LoginButton;
import com.facebook.widget.ProfilePictureView;
import com.ids.service.R;
import android.support.v4.app.FragmentActivity;
import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends FragmentActivity {

     private final String PENDING_ACTION_BUNDLE_KEY = "com.facebook.samples.hellofacebook:PendingAction";

     
     private LoginButton loginButton;
     private ProfilePictureView profilePictureView;
     private PendingAction pendingAction = PendingAction.NONE;
     private GraphUser user;
     private GraphPlace place;
     private List<GraphUser> tags;
     private boolean canPresentShareDialog;
     private boolean canPresentShareDialogWithPhotos;

     private enum PendingAction {
         NONE,
         POST_PHOTO,
         POST_STATUS_UPDATE
     }
     private UiLifecycleHelper uiHelper;

     private Session.StatusCallback callback = new Session.StatusCallback() {

   @Override
   public void call(Session session, SessionState state,
     Exception exception) {
    onSessionStateChange(session, state, exception);
   }
     };

     private FacebookDialog.Callback dialogCallback = new FacebookDialog.Callback() {
         @Override
         public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
             Log.d("Facebook", String.format("Error: %s", error.toString()));
         }

         @Override
         public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
             Log.d("Facebook", "Success!");
         }
     };
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  uiHelper = new UiLifecycleHelper(this, callback);
        uiHelper.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            String name = savedInstanceState.getString(PENDING_ACTION_BUNDLE_KEY);
            pendingAction = PendingAction.valueOf(name);
        }

        setContentView(R.layout.activity_main);
        profilePictureView = (ProfilePictureView) findViewById(R.id.profilePicture);
        loginButton = (LoginButton) findViewById(R.id.login_button);
        loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                MainActivity.this.user = user;
                updateUI();
                // It's possible that we were waiting for this.user to be populated in order to post a
                // status update.
                handlePendingAction();
            }
        });
 }

  @Override
     protected void onResume() {
         super.onResume();
         uiHelper.onResume();

         // Call the 'activateApp' method to log an app event for use in analytics and advertising reporting.  Do so in
         // the onResume methods of the primary Activities that an app may be launched into.
         AppEventsLogger.activateApp(this);

         updateUI();
     }

     @Override
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         uiHelper.onSaveInstanceState(outState);

         outState.putString(PENDING_ACTION_BUNDLE_KEY, pendingAction.name());
     }

     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         uiHelper.onActivityResult(requestCode, resultCode, data, dialogCallback);
     }

     @Override
     public void onPause() {
         super.onPause();
         uiHelper.onPause();

         // Call the 'deactivateApp' method to log an app event for use in analytics and advertising
         // reporting.  Do so in the onPause methods of the primary Activities that an app may be launched into.
         AppEventsLogger.deactivateApp(this);
     }

     @Override
     public void onDestroy() {
         super.onDestroy();
         uiHelper.onDestroy();
     }

     private void onSessionStateChange(Session session, SessionState state, Exception exception) {
         if (pendingAction != PendingAction.NONE &&
                 (exception instanceof FacebookOperationCanceledException ||
                 exception instanceof FacebookAuthorizationException)) {
                 new AlertDialog.Builder(MainActivity.this)
                     .setTitle(R.string.cancelled)
                     .setMessage(R.string.permission_not_granted)
                     .setPositiveButton(R.string.ok, null)
                     .show();
             pendingAction = PendingAction.NONE;
         } else if (state == SessionState.OPENED_TOKEN_UPDATED) {
             handlePendingAction();
         }
         updateUI();
     }

     @SuppressWarnings("unused")
  private void updateUI() {
         Session session = Session.getActiveSession();
         if (user != null) {
          profilePictureView.setProfileId(user.getId());
          Log.e("Name", user.getName());
         }
     }

     @SuppressWarnings("incomplete-switch")
     private void handlePendingAction() {
         PendingAction previouslyPendingAction = pendingAction;
         // These actions may re-set pendingAction if they are still pending, but we assume they
         // will succeed.
         pendingAction = PendingAction.NONE;

         switch (previouslyPendingAction) {
             case POST_PHOTO:
                 postPhoto();
                 break;
             case POST_STATUS_UPDATE:
                 postStatusUpdate();
                 break;
         }
     }

     private interface GraphObjectWithId extends GraphObject {
         String getId();
     }

     private void showPublishResult(String message, GraphObject result, FacebookRequestError error) {
         String title = null;
         String alertMessage = null;
         if (error == null) {
             title = getString(R.string.success);
             String id = result.cast(GraphObjectWithId.class).getId();
             alertMessage = getString(R.string.successfully_posted_post, message, id);
         } else {
             title = getString(R.string.error);
             alertMessage = error.getErrorMessage();
         }

         new AlertDialog.Builder(this)
                 .setTitle(title)
                 .setMessage(alertMessage)
                 .setPositiveButton(R.string.ok, null)
                 .show();
     }

    

     private FacebookDialog.ShareDialogBuilder createShareDialogBuilderForLink() {
         return new FacebookDialog.ShareDialogBuilder(this)
                 .setName("Hello Facebook")
                 .setDescription("The 'Hello Facebook' sample application showcases simple Facebook integration")
                 .setLink("http://developers.facebook.com/android");
     }

     private void postStatusUpdate() {
         if (canPresentShareDialog) {
             FacebookDialog shareDialog = createShareDialogBuilderForLink().build();
             uiHelper.trackPendingDialogCall(shareDialog.present());
         } else if (user != null && hasPublishPermission()) {
             final String message = getString(R.string.status_update, user.getFirstName(), (new Date().toString()));
             Request request = Request
                     .newStatusUpdateRequest(Session.getActiveSession(), message, place, tags, new Request.Callback() {
                         @Override
                         public void onCompleted(Response response) {
                             showPublishResult(message, response.getGraphObject(), response.getError());
                         }
                     });
             request.executeAsync();
         } else {
             pendingAction = PendingAction.POST_STATUS_UPDATE;
         }
     }

    
     private FacebookDialog.PhotoShareDialogBuilder createShareDialogBuilderForPhoto(Bitmap... photos) {
         return new FacebookDialog.PhotoShareDialogBuilder(this)
                 .addPhotos(Arrays.asList(photos));
     }

     private void postPhoto() {
         Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
         if (canPresentShareDialogWithPhotos) {
             FacebookDialog shareDialog = createShareDialogBuilderForPhoto(image).build();
             uiHelper.trackPendingDialogCall(shareDialog.present());
         } else if (hasPublishPermission()) {
             Request request = Request.newUploadPhotoRequest(Session.getActiveSession(), image, new Request.Callback() {
                 @Override
                 public void onCompleted(Response response) {
                     showPublishResult(getString(R.string.photo_post), response.getGraphObject(), response.getError());
                 }
             });
             request.executeAsync();
         } else {
             pendingAction = PendingAction.POST_PHOTO;
         }
     }
     
     private boolean hasPublishPermission() {
         Session session = Session.getActiveSession();
         return session != null && session.getPermissions().contains("publish_actions");
     } 
}
  • Hi thanx for you answer Varun but my code is working fine too. Maybe a misunderstanding ! I want to change the code to be compatible with the new facebook sdk 4.0 – Frank Mar 31 '15 at 13:02
0

As you can read in the Facebook SDK for Android changelog in section 4.0 - March 25, 2015 the UiLifecycleHelper was removed and its functionality transferred to the CallbackManager.

Here is a tutorial which explains how to implement the login with facebook SDK 4.0.

Oliver
  • 133
  • 1
  • 1
  • 5