facebook登录集成在Dialog android中

时间:2017-05-27 06:38:43

标签: android facebook-android-sdk

我正在将Facebook登录集成在Dialog中,但我的回调功能无效。 onActivityresult未被调用

这是代码......

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);
}
}

2 个答案:

答案 0 :(得分:1)

Dialog没有onActivityResult(int requestCode, int resultCode, Intent data)方法,因为CallbackManager需要调用CallbackManager.onActivityResult()方法来接收登录结果,所以不会调用你的回调。

Dialog是活动的一部分,当另一项活动启动时(如Facebook登录活动),您的对话框无论如何都会被取消。

解决方案是在对话框的主机活动中执行登录并将登录结果转发到对话框。

不要忘记在您的活动中覆盖onActivityResult()并在那里致电CallbackManager.onActivityResult()

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

答案 1 :(得分:0)

以下是对话框片段

中的Facebook signIn集成示例代码
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);
    }
        }