我有一个屏幕弹出 Facebook 登录的东西,代码如下:
//facebook stuff
if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) {
Session.openActiveSession(this, true, null);
}
如果用户点击“后退”按钮并关闭登录内容,它会自动将它们发送到应该受 facebook 保护的屏幕(并且由于没有用户登录而出现错误)。
我该如何处理?我看到在旧的 sdk 或其他任何东西中,它有:
facebook.isSessionValid()
还有办法做到这一点吗?如果是这样,我将如何实际做到这一点?某种while循环,直到他们最终停止尝试退出?有没有办法禁用退出该屏幕?我根本不生成那个屏幕: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);
这就是我结交朋友的方式(在静态助手类中):
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();
}
我唯一拥有的另一件事是完全清除您建议的会话内容:
@Override
public void onDestroy(){
Session.getActiveSession().closeAndClearTokenInformation();
Log.v(CLASS_NAME, "Clearing facebook session");
pleaseStop = true;
super.onDestroy();
}
它根本不会让我重新登录。我有两个正在测试的设备。
第一个设备最初使用一个配置文件运行良好,但是当我尝试尝试第二个配置文件时,它不会记录第一个配置文件,所以我做了 closeAndClearTokenInformation() 事情。这导致没有个人资料,并且它不会再弹出整个 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);
}
然后它就起作用了!我不知道为什么。我想我会对此进行研究,但我很高兴我终于可以改变用户了。