0

hi here i am creating login with facebook without login button. it is work properly but at the closing facbook webkit login form it is again open pop up for request permission continuously. give me solution for it.

    private void FacebookLogin() {
    // TODO Auto-generated method stub

    final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
            this, Arrays.asList("email"));
    Session openActiveSession = Session.openActiveSession(this, true,
            new Session.StatusCallback() {
                @Override
                public void call(Session session, SessionState state,
                        Exception exception) {

                    if (session.isOpened()) {
                        session.requestNewReadPermissions(newPermissionsRequest);
                        Request getMe = Request.newMeRequest(session,
                                new GraphUserCallback() {
                                    @Override
                                    public void onCompleted(GraphUser user,
                                            Response response) {
                                        if (user != null) {
                                            org.json.JSONObject graphResponse = response
                                                    .getGraphObject()
                                                    .getInnerJSONObject();
                                            String email = graphResponse
                                                    .optString("email");
                                            String id = graphResponse
                                                    .optString("id");
                                        }
                                    }
                                });
                        getMe.executeAsync();
                    } else {
                        if (!session.isOpened())
                            Log.d("FACEBOOK", "!session.isOpened()");
                        else
                            Log.d("FACEBOOK", "isFetching");

                    }
                }
            });


}

@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    // TODO Auto-generated method stub
    super.onActivityResult(arg0, arg1, arg2);
    Session.getActiveSession().onActivityResult(this, arg0, arg1, arg2);
}
DroidVasu
  • 27
  • 1
  • 7

3 Answers3

0

I found two methods.

The first - you add into XML facebook button and hide (set visability = GONE) it. Initialize this button and on you custom event call facebookButton.performClick();

Second way - use this part of code:

callbackManager = CallbackManager.Factory.create();
    List<String> permission = new ArrayList<String>();
    permission.add("email");
    LoginManager loginManager = LoginManager.getInstance();

    loginManager.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            if (facebookDialog.isShowing()) {
                loadingProgressBar.setVisibility(View.VISIBLE);
                singViaFacebook.setText(R.string.dialog_facebook_loggin);
            }
            loadProfile();
        }

        @Override
        public void onCancel() {
            lockLoginButton(true);
            startTimer();
        }

        @Override
        public void onError(FacebookException exception) {
            lockLoginButton(true);
            startTimer();
        }
    });

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

And call this piece of code when you want call popup:

loginManager.logInWithReadPermissions(this, permission)

Works with Facebook SDK [4,5)

VKostenc
  • 1,140
  • 14
  • 19
0

First Declare Callback manager like,

private CallbackManager callbackManager;

private AccessToken accessToken;

put this code in OnCreate()::

callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

        @Override
        public void onSuccess(LoginResult loginResult) {
            accessToken = loginResult.getAccessToken();
            getFacebookUserProfile(accessToken);
        }

        @Override
        public void onCancel() {
            Toast.makeText(StartUpActivity.this, "Login with facebook canceled.", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(FacebookException error) {
            Toast.makeText(StartUpActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
        }
    });

Then assign click to your button like,

btnFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                accessToken = AccessToken.getCurrentAccessToken();
                if (accessToken != null) {
                    getFacebookUserProfile(accessToken);
                } else {
                    LoginManager.getInstance().logInWithReadPermissions(StartUpActivity.this, Arrays.asList("public_profile", "email"));
                }
            }
        });

Then Override,

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

        if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
            callbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }

Then use this function for get user profile,

private void getFacebookUserProfile(AccessToken accessToken) {
        GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {

            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                try {
                    authenticateUser(object);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "id, name, first_name,last_name, email");
        request.setParameters(parameters);
        request.executeAsync();
    }

Hope it works for you

Erçin Dedeoğlu
  • 4,950
  • 4
  • 49
  • 69
Akash Moradiya
  • 3,318
  • 1
  • 14
  • 19
-2

Try this

    public class LoginFragment extends Fragment{
        boolean isFetching = false;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.login_fragment, null);

                Button button = (Button) view.findViewById(R.id.login_button);
                button.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        performFacebookLogin();
                    }
                });
                return view;
            }
            private void performFacebookLogin()
            {
                Log.d("FACEBOOK", "performFacebookLogin");
                final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("email"));
                Session openActiveSession = Session.openActiveSession(getActivity(), true, new Session.StatusCallback()
                {
                    @Override
                    public void call(Session session, SessionState state, Exception exception)
                    {
                        Log.d("FACEBOOK", "call");
                        if (session.isOpened() && !isFetching)
                        {
                            Log.d("FACEBOOK", "if (session.isOpened() && !isFetching)");
                            isFetching = true;
                            session.requestNewReadPermissions(newPermissionsRequest);
                            Request getMe = Request.newMeRequest(session, new GraphUserCallback()
                            {
                                @Override
                                public void onCompleted(GraphUser user, Response response)
                                {
                                    Log.d("FACEBOOK", "onCompleted");
                                    if (user != null)
                                    {
                                        Log.d("FACEBOOK", "user != null");
                                        org.json.JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
                                        String email = graphResponse.optString("email");
                                        String id = graphResponse.optString("id");
                                        String facebookName = user.getUsername();
                                        if (email == null || email.length() < 0)
                                        {
                                            Toast.makeText(getActivity(), 
                                                    "An email address is required for your account, we could not find an email associated with this Facebook account. Please associate a email with this account or login the oldskool way.", Toast.LENGTH_LONG).show();
                                            return;
                                        }
                                    }
                                }
                            });
                            getMe.executeAsync();
                        }
                        else
                        {
                            if (!session.isOpened())
                                Log.d("FACEBOOK", "!session.isOpened()");
                            else
                                Log.d("FACEBOOK", "isFetching");

                        }
                    }

                });

}
}

Now add a button in your fragments layout

<Button
    android:id="@+id/login_button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Login With Facebook" />

It works for me , and only once pop up the request permission try it and let me know

Abhishek
  • 1,337
  • 10
  • 29