Android Facebook SDK让用户无法登录?

Jen*_*nny 5 android facebook

我有一个屏幕,弹出Facebook登录的东西,代码如下:

    //facebook stuff
    if (Session.getActiveSession() == null ||  Session.getActiveSession().isClosed()) {
        Session.openActiveSession(this, true, null);
    }
Run Code Online (Sandbox Code Playgroud)

如果用户点击"后退"按钮并取消登录的东西,它会自动将它们发送到应该受到Facebook保护的屏幕(并且由于没有用户登录而有错误).

我该怎么处理?我看到在老sdk或其他什么,它有:

facebook.isSessionValid()
Run Code Online (Sandbox Code Playgroud)

还有办法吗?如果是这样,我该怎样做呢?某种循环,直到他们最终停止尝试退出?有没有办法禁止退出该屏幕?我根本没有生成那个屏幕:facebook确实如此.这只是我必须忍受的错误吗?

编辑:

这样做的必然结果是我刚注意到,如果我使用facebook应用程序注销,facebook sdk并没有在我自己的应用程序中告诉我:它仍然在验证.更糟糕的是,即使在我退出之后它也会这样做,然后使用Facebook应用程序以完全不同的用户身份登录.我该如何处理?

编辑:更多代码

这就是我现在如何登录Facebook(在Activity的onCreate中)并要求让我的图形用户和我的朋友们(先得到我,然后一旦异步完成,得到朋友)

if (Session.getActiveSession() == null ||  Session.getActiveSession().isClosed()) {
            Log.v(CLASS_NAME, "Logging into facebook");
            //Session.openActiveSession(this, true, new Session.statusCallback());
            final Session.StatusCallback sessionStatusCallback = new Session.StatusCallback() {

            @Override
            public void call(Session session, SessionState state,
                    Exception exception) {
                // TODO Auto-generated method stub
                    if(exception != null)
                    {
                        // Handle fail case here.
                        Log.v(CLASS_NAME, "Facebook login error " + exception);
                        return;
                    }

                    // If session is just opened...
                    if(state == SessionState.OPENED)
                    {
                        // Handle success case here.
                        Log.v(CLASS_NAME, "Facebook login success!");
                        return;
                    }


            }

        };

        Session.openActiveSession(this, true, sessionStatusCallback);
    }


    //annonymous inner class
    final Callback<ArrayList<GraphUser>> inner_callback_class2 = new FacebookHelper.Callback<ArrayList<GraphUser>>() {
        @Override
        public void setResult(ArrayList<GraphUser> result) throws Exception {
            // TODO Auto-generated method stub
            for(GraphUser user : result){
                friends.put(user.getId(), user);
            }
            friends.put(me.getId(), me); //i can see my own comments as well


            //get comments
            //ArrayList<String>tmp = new ArrayList<String>();
            //tmp.add("Jenny");
            //tmp.add("Charles");
            //initial comment call so I can view them
            //
            getComments();
        }
    };


    //annonymous inner class
    FacebookHelper.Callback<GraphUser> inner_callback_class = new FacebookHelper.Callback<GraphUser>() {
        @Override
        public void setResult(GraphUser result) throws Exception {
            // TODO Auto-generated method stub
            me = result;
            Log.v("ANYTHING", me.getName());
            //make sure i have an id before I do anything
            FacebookHelper.getMyFriends(Session.getActiveSession(),inner_callback_class2);
            //post comment
            //RailsServerHelper.postComment("Comment Testing", movie.id, myID, currentNPT);
        }
    };

    FacebookHelper.getMyID(Session.getActiveSession(), inner_callback_class);
Run Code Online (Sandbox Code Playgroud)

这就是我如何得到我的朋友(在一个静态助手类中):

public static void getMyFriends(final Session session, final Callback<ArrayList<GraphUser>> callback){
    Request request = Request.newMyFriendsRequest(session, new Request.GraphUserListCallback() {
        @Override
        public void onCompleted(List<GraphUser> users, Response response) {
            // TODO Auto-generated method stub
            ArrayList<GraphUser> tmp = new ArrayList<GraphUser>(users);
            try {
                callback.setResult(tmp);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    request.executeAsync(); 

}
Run Code Online (Sandbox Code Playgroud)

我唯一的其他Facebook事情是整个清楚你建议的会话事项:

@Override
public void onDestroy(){
    Session.getActiveSession().closeAndClearTokenInformation();
    Log.v(CLASS_NAME, "Clearing facebook session");
    pleaseStop = true;
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

它根本不会让我重新登录.我有两个我正在测试它的设备.

第一个设备最初工作正常,有一个配置文件,但当我尝试尝试第二个配置文件时,它不会记录第一个配置文件,所以我做了closeAndClearTokenInformation()的事情.这导致没有配置文件,它将不再弹出整个facebook登录的东西.我认为没有配置文件,因为它总是打印出"登录到Facebook",并且getMe调用的东西永远不会起作用.(只是在这里描述我的代码,我看到我可以把getMe的东西放在回调中的facebook日志中)它也从不打印我放在callBack中的成功语句,并且在第一个设备上它打印出错误语句如果我按下后退按钮(无论我坐在那个屏幕上多久).

第二个设备从未设法登录配置文件,因为在登录屏幕上点击了后退按钮.从那以后,系统似乎认为它"登录"没有人,我所做的一切都无法让它更新.我没有看到它试图像第一个设备一样登录.closeAndClear调用似乎在这个设备上什么都不做.如果相关,则第二设备是在完全不同的机器上运行的虚拟模拟器.

在实际设备上,我看到的是:

01-24 07:16:04.669: V/MakeAndViewCommentsActivity(3677): Logging into facebook
Run Code Online (Sandbox Code Playgroud)

然后是一堆系统消息(我等了十多分钟),其中没有一个似乎有警告或错误,然后:

01-24 07:29:05.548: V/MakeAndViewCommentsActivity(3677): Clearing facebook session
01-24 07:29:05.552: V/MakeAndViewCommentsActivity(3677): Facebook login error com.facebook.FacebookException: Log in attempt aborted.
Run Code Online (Sandbox Code Playgroud)

为什么facebook openActiveSession不会回来?

编辑:Facebook示例应用程序仍然有原始登录工作,但不在乎我是否在实际的Facebook应用程序中注销或更改用户.我猜他们也不包括任何会话结算?

编辑:当我有一个打印声明:

Log.v(CLASS_NAME, "Facebook callback with state: " + state);
Run Code Online (Sandbox Code Playgroud)

我知道了:

01-24 09:10:54.333: V/MakeAndViewCommentsActivity(4869): Facebook callback with state: OPENING
Run Code Online (Sandbox Code Playgroud)

回调只被调用一次吗?或者它是否会在理论上再次以"OPEN"状态再次调用?

解:

编辑:查看它永远不会离开"打开"状态的事实对我帮助很大,但事实证明我必须添加代码:

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

然后就行了!我不知道为什么.我想我会对此进行研究,但我很高兴我终于可以改变用户了.

Min*_* Li 0

您正在传递一个空回调。如果您实现了回调,您将看到回调将被调用,并且如果您检查了 state.isClosed(),它将返回 true (并且状态应为 CLOSED_LOGIN_FAILED)。异常参数中也应该有一个异常。您无法禁用用户退出 SSO 的功能,这是设计使然。

您也是正确的,因为如果用户注销 Facebook 应用程序,则不会收到任何通知。获得更好用户体验的一种方法是,当您代表用户执行某些操作(例如发布状态)时,始终显示用户的姓名和个人资料图片,这样就可以立即看出该用户不是正确的用户。其他选项是每次应用程序退出时始终调用 session.closeAndClearTokenInformation。这样,您总是会开始一个新的会话,并且如果用户安装了 facebook 应用程序,它仍然是一个非常快速的身份验证(无需按其他按钮)。缺点是,如果他们没有 facebook 应用程序,那么每次都会弹出一个用于登录的网络对话框(但您可以通过检查 FB 应用程序是否存在来解决这个问题)。

  • 我也很困惑:我以为 Facebook SDK 利用了手机全局会话变量。也就是说,如果您在一个应用程序中注销,您也会在所有应用程序中注销。这似乎比我想象的有用得多。 (2认同)