问题描述
这个问题困扰着我很多。 当然,在我的模拟器上没有Facebook应用程序,因此当我触发打开的活动会话时,它将进入我的浏览器。 现在,我在具有Facebook应用程序的设备上对其进行了测试,它会触发该应用程序并要求登录。 在模拟器或没有Facebook应用程序的设备上,问题出在这里,它使用此代码正确识别了会话。
Session session = Session.getActiveSession();
//check if user is logged in at facebook
if (session != null && session.isOpened()) {
Log.i("", "Session Open");
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
facebookId = user.getId();
loginType = 2;
LogMeIn();
}
}
});
}
else
{
Log.i("", "Session Closed");
// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Log.i("", "Session Open");
// make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
Log.i("", "Complete");
if (user != null) {
facebookId = user.getId();
loginType = 2;
LogMeIn();
}
}
});
}
else
{
Log.i("", "Session Closed");
}
}
});
}
但是,在具有Faceboook应用程序的设备中,会话始终为null。 因此,趋势是再次启动Session.openActiveSession,并且每次检查时,我总是最终关闭会话。 有什么想法的人有什么问题吗? 我的方法是否错误,这就是为什么它仅在通过浏览器登录Facebook时能很好地工作的原因? 任何帮助将不胜感激。 谢谢!
1楼
您是否在Facebook SDK中启用了会话跟踪?
您需要在Activity
的onCreate()
创建UiLifecycleHelper
:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
}
传递到构造函数中的callback
与您在上面的代码中创建的callback
相同(您是匿名完成的)。
之后,您需要在Activity
的生命周期方法中对与UiLifecycleHelper
相同的方法进行匹配调用。
这将使Facebook SDK可以跟踪您的会话。
@Override
public void onResume() {
super.onResume();
uiHelper.onResume();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
您可以在他们的找到更多详细信息。 您可能遵循了更简单的“入门”教程,而不是更深入的“登录”教程。 用户是否通过应用程序登录(因为已安装)或浏览器(如果已正确设置)都不会影响会话跟踪。