安卓Facebook SDK允许用户不登录吗?

5

我有一个弹出屏幕,上面显示着Facebook登录界面的代码如下:

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

如果用户点击“返回”按钮并取消登录,它会自动发送他们到本应该是Facebook保护的屏幕(因为没有用户登录而出现错误)。
我该怎么处理?我发现在旧的sdk或其他地方中,有以下内容:
facebook.isSessionValid()

还有没有其他方法可以实现这个功能?如果有,我应该如何操作呢?是使用 while 循环直到他们停止尝试退出吗?有没有办法禁用那个屏幕上的返回按钮?我根本没有生成那个屏幕:是 Facebook 生成的。这只是一个我必须忍受的 bug 吗?
编辑:
与此相关的是,我刚刚注意到,如果我使用 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);

这是我从静态助手类中获取朋友列表的方法:

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

}

我唯一还有的与Facebook相关的事情就是你建议的清除会话的问题:

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

它根本不让我重新登录。 我正在测试两个设备。

第一个设备最初使用一个配置文件正常工作,但是当我尝试尝试第二个配置文件时,它不会注销第一个配置文件,因此我关闭了clearTokenInformation()的一些东西。 结果是没有配置文件,并且它不再弹出整个Facebook登录界面。 我认为没有配置文件是因为它总是打印“正在登录Facebook”,而getMe调用从未起作用。 (仅从这里描述我的代码,我看到我可以将getMe放入facebook登录回调中。)它还从未打印出我放在回调中的成功语句,在第一个设备上,如果我点击返回按钮,则会打印出错误信息(无论我在该屏幕上停留多长时间)。

第二台设备从未设法登录配置文件,因为登录屏幕上点击了返回按钮。自那以后,系统似乎认为它已经“登录”为无人,而且我所做的任何事情都不能使其刷新。我从未看到它像第一个设备一样尝试登录。在此设备上,closeAndClear呼叫似乎无效。如果相关,请注意,第二个设备是运行在完全不同机器上的虚拟模拟器。

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

01-24 07:16:04.669: V/MakeAndViewCommentsActivity(3677): Logging into facebook

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

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.

为什么facebook的openActiveSession没有返回值?
编辑:Facebook示例应用程序仍具有原始登录功能,但不关心我是否在实际Facebook应用程序中注销或更改用户。 我猜他们也没有包括任何会话清除?
编辑:当我有打印语句时:
Log.v(CLASS_NAME, "Facebook callback with state: " + state);

我明白:

01-24 09:10:54.333: V/MakeAndViewCommentsActivity(4869): Facebook callback with state: OPENING

回调函数只会被调用一次吗?还是说如果它完成了,理论上会再次以“OPEN”状态被调用?

解决方案:

编辑:查看它从未离开“OPENING”状态的事实对我很有帮助,结果我不得不添加以下代码:

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

然后它就奇妙地工作了!我不知道为什么。我猜我将会研究这个问题,但我很高兴我终于可以更改用户。


最后一个onActivityResult的代码非常顺利地运行了。 - user2756345
1个回答

0

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

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


当我尝试在我的活动 onDestroy 方法中调用 closeAndClearTokenInformation 时,它似乎清除了会话(根据调试语句),但我从未有机会登录,甚至批准授权,即使我完全退出应用程序。 - J.R.
2
我也很困惑:我以为Facebook SDK会利用手机的全局Session变量。也就是说,如果你在一个应用程序中注销登录,那么你在所有应用程序中都将注销登录。这似乎比我想象的要没那么有用。 - J.R.
啊!出于某些原因,我需要重写onActivityResult方法!现在它可以工作了,谢谢! - J.R.
1
@Muhammad Babar 这不是一个 bug。 - Ken
1
@MuhammadBabar 这不是一个错误,而是设计如此。您必须从 Activity 或 Fragment 中调用登录。 - Ming Li
显示剩余5条评论

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