安卓Facebook SDK登录后不调用回调函数

32

我正在尝试创建一个处理应用程序中Facebook登录的类。

我的问题是它并不适用于所有的活动。

在那个活动上,它没有调用回调函数。

在登录和授权应用程序webview被解除后,回调函数没有触发。

在Logcat中打印的最后状态是OPENING

这是我的代码:

public void doLogin() {
              
        
        if ((Session.getActiveSession() == null || !Session.getActiveSession().isOpened())) {
            List<String> permissions = new ArrayList<String>();
            permissions.add("email");

            // start Facebook Login
            openActiveSession(activity, true, new Session.StatusCallback() {

                // callback when session changes state
                @Override
                public void call(Session session, SessionState state,
                        Exception exception) {
                    
                    Log.d("Sessionstate", state.toString());
                    if (session.isOpened()) {
                        // make request to the /me API
                        Request.executeMeRequestAsync(session,
                                new Request.GraphUserCallback() {

                                    @Override
                                    public void onCompleted(GraphUser user,
                                            Response response) {
                                        if (prgCheckFB.isShowing())
                                            prgCheckFB.dismiss();
                                        if (user != null) {

                                            Log.e("facebookid", id);
                                            doSomething(user);



                                        }
                                    }
                                });
                    
                    } 
                }, permissions); 
        }
    }



private static Session openActiveSession(Activity activity,
        boolean allowLoginUI, Session.StatusCallback callback,
        List<String> permissions) {
    Session.OpenRequest openRequest = new Session.OpenRequest(activity)
            .setPermissions(permissions).setCallback(callback);
    Session session = new Session.Builder(activity).build();
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState())
            || allowLoginUI) {
        Session.setActiveSession(session);
        session.openForRead(openRequest);
        return session;
    }
    return null;
}

doSomething 是一个函数,它将用户数据保存在共享首选项中。

有什么问题吗?该函数可以在一些活动中运行,但不是全部活动。


你能否获取登录页面? - InnocentKiller
是的,但在登录页面完成后回调没有触发。 - skaciw
当您按下登录按钮时,您无法登录。对吧! - InnocentKiller
我认为我已经成功登录了Facebook,因为在登录页面之后,我被重定向到了授权页面。 - skaciw
那么你遇到了什么问题? - InnocentKiller
我想在成功登录FB后做一些事情。但是,回调根本没有被触发。因此,doSomething函数从未被调用。 - skaciw
3个回答

104

也许您忘记在登录后处理结果...

检查覆盖方法onActivityResult..

因为它将结果处理回MainActivity,

也许这可以帮助您的问题..

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

更新 1

对于较新的SDK,请使用:

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

7
API 稍作修改,现在需要使用 CallbackManager 替代 Session: callbackManager.onActivityResult(requestCode, resultCode, data); - racs
我已按上述说明尝试过了,但没有收到任何回调。它只是回到放置 FB 登录按钮的页面。 - Pramod J George
在应用程序清单中将FB登录活动设置为启动器活动非常重要。 - Konstantin Konopko
3
我尝试了这个,可以登录但没有返回电子邮件值,并且不进入FacebookCallback <LoginResult>,有人遇到过吗?你是如何解决的? - natsumiyu
如果我在一个Fragment中使用OnActivityResult,它会被调用吗? - Pranesh Sahu
显示剩余3条评论

6
在 AndroidManifest.xml 文件中为回调活动设置属性 android:noHistory="true",也会导致回调方法不触发。

1
花了几个小时才想明白这个问题,真希望我能点赞五次。 - 6006604
在AndroidManifest.xml文件中的com.facebook.FacebookActivity活动中添加android:noHistory="true",解决了我的问题!谢谢。 - jboxxpradhana

0

我以一种奇怪的方式面对并解决了这个问题。 起初它是正常工作的,但在我添加了其他社交登录按钮(如Google登录)之后,我在它们之间进行了初始化。

CallbackManager.Factory.create();

并且

LoginButton loginButton =(LoginButton) findViewById(R.id.button_facebook);

当我将Google初始化移动到其他行时,问题得到了解决。

简而言之,Facebook登录初始化必须是直接的,没有其他代码执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接