Facebook登录CallbackManager没有调用FacebookCallback?

Muh*_*lvi 28 android facebook

  • 我尝试使用LoginButton登录但是没有调用登录回调.(LoginButton在片段中).
  • 在Application onCreate中调用FacebookSdk.sdkInitialize
  • 登录完成后不会调用回调.这是代码:

活动:

public class FrameActivity extends BaseActivity {

 public static CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// FacebookSdk.sdkInitialize is called in the Application onCreate

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

}
}
Run Code Online (Sandbox Code Playgroud)

分段:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_login, container, false);
    LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button);
    loginButton.setReadPermissions("user_friends");
    loginButton.setReadPermissions("public_profile");
    loginButton.setReadPermissions("email");
    loginButton.setReadPermissions("user_birthday");
    // If using in a fragment
    loginButton.setFragment(this);
    // Other app specific specialization

    // Callback registration
    loginButton.registerCallback(FrameActivity.callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {


}
        @Override
        public void onCancel() {
            // App code

        }

        @Override
        public void onError(FacebookException exception) {
            // App code

        }
    });
    return view;
}
Run Code Online (Sandbox Code Playgroud)

Rag*_*ddy 49

试试这个:

  1. FacebookSdk.sdkInitialize()在片段中初始化onCreateView().

  2. 下一行初始化callbackManager = CallbackManager.Factory.create();

  3. 落实onActivityResult()在片段类.

  4. 添加你callbackManager.onActivityResult(requestCode, resultCode, data); 的片段onActivityResult().

确保删除FacebookInit()callbackManager活动.

  • 请注意,如果您在Fragment中使用logInWithReadPermissions(..,..),则将(this)作为第一个参数而不是getActivity()传递,因为有两个方法需要将另一个Activity分段. (4认同)
  • 添加callbackManager.onActivityResult(requestCode,resultCode,data); 在片段onActivityResult中.为我工作.非常感谢 . (3认同)

Pra*_*ash 16

loginButton.setFragment(this); 
Run Code Online (Sandbox Code Playgroud)

这条线已经存在问题.但只是想为其他任何过度开发的开发人员写这篇文章.

如果您在片段中使用FB登录按钮,请确保将其添加到onCreateView方法中.这样可以确保回调转到Fragment而不是转到您的活动.


小智 10

对于旧版本:

更改方法如下:

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data)
 {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK)
    {

        com.facebook.Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }
    else
    {
        com.facebook.Session.getActiveSession().closeAndClearTokenInformation();
    }

}
Run Code Online (Sandbox Code Playgroud)

更新:对于v2.3,从这里:

您将回调添加到您的活动或片段的onCreate()方法:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());

callbackManager = CallbackManager.Factory.create();

LoginManager.getInstance().registerCallback(callbackManager,
        new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
            }

            @Override
            public void onCancel() {
                 // App code
            }

            @Override
            public void onError(FacebookException exception) {
                 // App code   
            }
});
}
Run Code Online (Sandbox Code Playgroud)

如果登录成功,则该LoginResult参数具有新AccessToken权限,以及最近授予或拒绝的权限.

登录成功后您不需要registerCallback,您可以选择使用AccessTokenTracker下面描述的类跟随当前访问令牌更改.

然后onActivityResult()将登录结果转发给callbackManager创建的onCreate():

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)

与FacebookSDK登录或共享集成的每个活动和片段都应转发onActivityResult到callbackManager.