简体   繁体   中英

facebook login integration in a Dialog android

I am integrating facebook login inside a Dialog but my callback is not working. onActivityresult is not being called

here is the code...

public class SettingsDialog extends Dialog {

private CallbackManager callbackManager;
LoginButton facebookLogin;
Bundle bundle;
private GoogleApiClient mGoogleApiClient;
ImageView facbookSignin;
Context context;

public SettingsDialog(@NonNull Context context) {
    super(context);
    this.context = context;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(context);
    setContentView(R.layout.activity_settings_dialog);
  getWindow().getAttributes().height = WindowManager.LayoutParams.FILL_PARENT;
  getWindow().getAttributes().width = 500;

   getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
   getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;
    WindowManager.LayoutParams wlp = getWindow().getAttributes();

    wlp.gravity = Gravity.RIGHT;
  getWindow().setAttributes(wlp);

    facbookSignin = (ImageView)findViewById(R.id.fb_signin);
    facebookLogin = (LoginButton)findViewById(R.id.fb_login_button);

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

            facebookLogin.callOnClick();
        }
    });

    callbackManager = CallbackManager.Factory.create();
    facebookLogin.setReadPermissions(Arrays.asList("email"));

    facebookLogin.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {

            Toast.makeText(context, "Success", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onCancel() {

        }

        @Override
        public void onError(FacebookException error) {

        }
    });

}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (callbackManager.onActivityResult(requestCode, resultCode, data)) {
        return;
    }
    callbackManager.onActivityResult(requestCode, resultCode, data);
}
}

Dialog doesn't have onActivityResult(int requestCode, int resultCode, Intent data) method and your callback doesn't get called since CallbackManager need CallbackManager.onActivityResult() method to be called in order to receive result of login.

Dialog is a part of activity and when another activity will be launched (like Facebook login activity) your dialog will be dismissed anyway.

Solution is to perform login in dialog's host activity and forward login result to your dialog.

Don't forget to override onActivityResult() in your activity and call CallbackManager.onActivityResult() there.

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

Below is sample code for Facebook signIn integration at dialog fragment

public class SignInFragment extends DialogFragment{   
         @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);

                    callbackManager = CallbackManager.Factory.create();
                }
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                    view = inflater.inflate(R.layout.fragment_sign_in, null);

          LoginManager.getInstance().registerCallback(callbackManager, mFBSignInCallback);

         List<String> permissionNeeds = Arrays.asList("public_profile", "email");
        LoginManager.getInstance().logInWithReadPermissions(SignInFragment.this, permissionNeeds);

             return view;
            }

private FacebookCallback<LoginResult> mFBSignInCallback = new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        Toast.makeText(mContext, "in LoginResult on success", Toast.LENGTH_LONG).show();
            @Override
                    public void onCancel() {
                        Log.d("VIVZ", "onCancel");
                    }

                    @Override
                    public void onError(FacebookException e) {
                        Log.d("VIVZ", "onError " + e.getMessage());
                        }
                };

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM