Facebook Login for Android

I completed the first 8 steps of the Facebook Login for Android - Quickstart available at https://developers.facebook.com/docs/facebook-login/android/. After that, I continued with the remaining steps shared below.

I added the following code to my SignIn.java file:

package ...;
...
import java.util.Arrays;
...
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.HttpMethod;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
public class SignIn ...{
  private CallbackManager callbackManager;
  private static final String EMAIL = "email";
  private LoginButton fbLoginButton;
  ...
  protected void onCreate(...){
    ...
    callbackManager = CallbackManager.Factory.create();
    fbLoginButton = (LoginButton) findViewById(R.id.fbLoginButton);
    fbLoginButton.setReadPermissions("email");
    fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
      @Override
      public void onSuccess(LoginResult loginResult) {
        // App code
        handleFacebookAccessToken(loginResult);
      }
      @Override
      public void onCancel() {
        // App code
      }
      @Override
      public void onError(@NonNull FacebookException e) {
        // App code
        e.printStackTrace();
      }
    });
    ...
  }
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    callbackManager.onActivityResult(requestCode, resultCode, data);
    super.onActivityResult(requestCode, resultCode, data);
  }
  ...
  private void handleFacebookAccessToken(LoginResult loginResult) {
    GraphRequest.Callback gCallback = new GraphRequest.Callback() {
      @Override
      public void onCompleted(@NonNull GraphResponse response) {
        System.out.println("response.getJSONObject().toString(): "+response.getJSONObject().toString());
        // I/System.out: response.getJSONObject().toString(): {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","first_name":"Jaime","last_name":"Montoya"}
        if (response != null && response.getJSONObject() != null && response.getJSONObject().has("first_name")) {
          try {
            System.out.println("response.getJSONObject().getString(\"first_name\"): " + response.getJSONObject().getString("first_name"));
            // I/System.out: response.getJSONObject().getString("first_name"): Jaime
          } catch (JSONException e) {
            Log.e(TAG, "onCompleted: ", e);
          }
        }
      }
    };						
    new GraphRequest(AccessToken.getCurrentAccessToken(),"/me?fields=id,name,email,first_name,last_name", null,HttpMethod.GET, gCallback).executeAsync();
    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
      @Override
      public void onCompleted(@Nullable JSONObject jsonObject, @Nullable GraphResponse graphResponse) {
        // App code
        // Access the response here and retrieve the information you want and print it out
        String rawResponse = graphResponse.getRawResponse();
        System.out.println("graphResponse.getRawResponse(): "+rawResponse);
        // I/System.out: graphResponse.getRawResponse(): {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&oh=00_AYBgut2eXf9VkZHd2zjyNbRE3Forr-cKw-Qck9bsEvMoiw&oe=66F92186","width":50}}}
        if (graphResponse.getError() != null) {
          // Handle error
          System.out.println("ERROR graphResponse.getError().toString(): "+graphResponse.getError().toString());
        } else {
          String jsonresult = String.valueOf(jsonObject);
          System.out.println("String.valueOf(jsonObject): "+jsonresult);
          // I/System.out: String.valueOf(jsonObject): {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&oh=00_AYBgut2eXf9VkZHd2zjyNbRE3Forr-cKw-Qck9bsEvMoiw&oe=66F92186","width":50}}}
          String resp = String.valueOf(graphResponse.getJSONObject());
          System.out.println("String.valueOf(graphResponse.getJSONObject()): "+resp);
          // I/System.out: String.valueOf(graphResponse.getJSONObject()): {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&_nc_gid=AU0hDo5VUmJ90SLSrSDffIa&oh=00_AYAgVwgQHdsNY8842kh-RB2cwnUQSPqhLh1vDTCAB5kW6g&oe=66F92186","width":50}}}
          // I/System.out: String.valueOf(graphResponse.getJSONObject()): {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&oh=00_AYBgut2eXf9VkZHd2zjyNbRE3Forr-cKw-Qck9bsEvMoiw&oe=66F92186","width":50}}}
        }
        Log.e(TAG,"jsonObject.toString(): "+jsonObject.toString());
        // E/ContentValues: jsonObject.toString(): {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&_nc_gid=AU0hDo5VUmJ90SLSrSDffIa&oh=00_AYAgVwgQHdsNY8842kh-RB2cwnUQSPqhLh1vDTCAB5kW6g&oe=66F92186","width":50}}}
        // E/ContentValues: jsonObject.toString(): {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&oh=00_AYBgut2eXf9VkZHd2zjyNbRE3Forr-cKw-Qck9bsEvMoiw&oe=66F92186","width":50}}}
        Log.e(TAG,"graphResponse.toString(): "+graphResponse.toString());
        // E/ContentValues: graphResponse.toString(): {Response:  responseCode: 200, graphObject: {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&_nc_gid=AU0hDo5VUmJ90SLSrSDffIa&oh=00_AYAgVwgQHdsNY8842kh-RB2cwnUQSPqhLh1vDTCAB5kW6g&oe=66F92186","width":50}}}, error: null}
        // E/ContentValues: graphResponse.toString(): {Response:  responseCode: 200, graphObject: {"id":"100001513883090","name":"Jaime Montoya","email":"jmontoya@jaimemontoya.com","picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/scontent-mia3-1.xx.fbcdn.net\/v\/t39.30808-1\/294888000_5376067482453661_527545311208686112_n.jpg?stp=cp1_dst-jpg_s50x50&_nc_cat=100&ccb=1-7&_nc_sid=6738e8&_nc_eui2=AeHlWp-lPLRcFXHEYbQxdAiD4Acj0RkYfD3gByPRGRh8Pd-THM0TB9SKYxa3HqARKGUDUrjCeujRwIihU-T5DZNB&_nc_ohc=Hu_mnUSvep0Q7kNvgGlLSvW&_nc_ht=scontent-mia3-1.xx&edm=AP4hL3IEAAAA&oh=00_AYBgut2eXf9VkZHd2zjyNbRE3Forr-cKw-Qck9bsEvMoiw&oe=66F92186","width":50}}}, error: null}
        try {
          String email  = jsonObject.getString("email");
          String birthday = jsonObject.getString("birthday");
          String gender = jsonObject.getString("gender");
          String name = jsonObject.getString("name");
        } catch (JSONException ex) {
          Log.d("ex.toString(): ", ex.toString());
          // D/ex.toString(): org.json.JSONException: No value for birthday
        }
      }
    });
    Bundle parameters = new Bundle();
    parameters.putString("fields","id,name,email,gender,birthday,picture,timezone");
    request.setParameters(parameters);
    request.executeAsync();
  }
  ...
}

I added the following code to my sign_in.xml file:

<com.facebook.login.widget.LoginButton
    android:id="@+id/fbLoginButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:layout_marginBottom="20dp" />
Published: 2:52 AM GMT · Jan 17, 2024