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" />