javaandroidfacebook-graph-apifacebook-android-sdk

Facebook API doesn't return email


I know that this question has been asked, but there is only one answer pretty much or is not even answered.

I dont know if it's my lack of understanding or lack of Facebook documentation, but so far i have this code to retrieve user email.

callbackManager = CallbackManager.Factory.create();
    mFbLoginManager.registerCallback(
            callbackManager,
            new FacebookCallback < LoginResult > () {
                @Override
                public void onSuccess(final LoginResult loginResult) {
                    // Handle success
                    Log.i(TAG, "callBack Login Result: LoginManager success - " + loginResult.toString());
                    GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject userObject, GraphResponse response) {
                            if (response.getError() == null) {
                                try {
                                    AccessToken token = AccessToken.getCurrentAccessToken();
                                    Log.e(TAG, token.getToken());
                                    Log.e(TAG, userObject.toString());
                                    email = userObject.getString("email");
                                } catch (JSONException ex) {
                                    Log.e(TAG, "Not such permissions for email!");
                                    ex.printStackTrace();
                                }
                                Log.d(TAG, "Email fetched: " + email);
                            }else{
                                Log.e(TAG, "Something went wrong with fetching email with GraphRequest");
                            }
                        }
                    }).executeAsync();
                }

The JSON string returns only the name and the id, therefore my email variable is empty.

The part i am troubled with is that when i test it on Graph Explorer or with that link, i get the email.

I have se permissions also on the developers site dashboard and also in my code(that's inside onClick() when user press the facebook login button): mFbLoginManager.logInWithReadPermissions(LoginActivity.this, Arrays.asList("user_photos", "email", "public_profile")

So i am not sure what is the problem in my code. The login button is custom and not the facebook LoginButton, i dont know if that matters.

Every help is welcome


Solution

  • Add below depandancy in Gradle

    implementation 'com.facebook.android:facebook-android-sdk:4.11.0'
    
    
    
    
     FacebookSdk.sdkInitialize(this);
        callbackManager =CallbackManager.Factory.create();
    
        // -----start putting in oncreate-----------------------
        
        LoginManager.getInstance().logInWithReadPermissions(UserActivity.this, Arrays.asList("public_profile", "user_friends","email"));
    
        facebookTime();
    
        //----onclicklisterner ---------------/
    
                callbackManager.onActivityResult(requestCode,resultCode,data);
    
        //---onactivityresult-------------/
    
        public void facebookTime() {
            LoginManager.getInstance().registerCallback(callbackManager,
                    new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(LoginResult loginResult) {
                            System.out.println("Success");
                            GraphRequest request = GraphRequest.newMeRequest(
                                    loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                                        @Override
                                        public void onCompleted(JSONObject object, GraphResponse response) {
                                            //   Util.showCenteredToast(getActivity(), "object" + object);
                                            //     Util.showCenteredToast(getActivity(), "GraphResponse" + response);
                                            try {
                                                strEmail = object.getString("email");
                                                strUserName = object.getString("name");
                                                String id = object.getString("id");
                                                // write your code here
                                                //asyncTask.iSocialMediaResponse = LoginFragment.this;
                                                asyncTask.execute();
    
    
                                            } catch (JSONException e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    });
                            Bundle parameters = new Bundle();
                            parameters.putString("fields", "email,name");
                            //parameters.putString("fields", "user_friends");
                            request.setParameters(parameters);
                            //Log.e(" About to Graph Call", " ");
                            request.executeAsync();
                        }
                        
                        @Override
                        public void onCancel() {
                            // App code
                            Util.showCenteredToast(UserActivity.this, "oncancel");
                        }
                        
                        @Override
                        public void onError(FacebookException exception) {
                            // App code
                            Util.showCenteredToast(UserActivity.this, "exception" + exception);
                        }
                    });
        }
        
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            callbackManager.onActivityResult(requestCode, resultCode, data);
    
        }