Facebook sdk 3.8.0。对于android,重新登录请求后。newMeRequest返回空用户;java.net.SocketException:套接字已关闭
我正在开发一个android应用程序,它已经使用Facebook sdk 5个月了。在我成功登录新设备之前,一切都正常工作。之后,我成功登录,但当我试图使用Request.newMeRequest获取用户信息时,我得到了null。所以我调试了这个问题,下面是我发现的:Facebook sdk 3.8.0。对于android,重新登录请求后。newMeRequest返回空用户;java.net.SocketException:套接字已关闭,java,android,facebook,facebook-android-sdk,Java,Android,Facebook,Facebook Android Sdk,我正在开发一个android应用程序,它已经使用Facebook sdk 5个月了。在我成功登录新设备之前,一切都正常工作。之后,我成功登录,但当我试图使用Request.newMeRequest获取用户信息时,我得到了null。所以我调试了这个问题,下面是我发现的: 已使用访问令牌成功创建会话 当试图调用facebook sdk中的某个地方的NewMereRequest时,引发了一个异常。异常为“java.net.SocketException:Socket已关闭” 我不明白插座怎么可能是关着
这将处理会话
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
onSessionStateChange(session, state, exception);
}
};
private void onSessionStateChange(Session session, SessionState state,
Exception exception) {
if(Utils.DEBUG) Log.d(TAG, "sessionStateChange fired");
FragmentManager fm = getSupportFragmentManager();
Fragment currentFragment = null;
switch (session.getState()) {
case CLOSED:
if(Utils.DEBUG) Log.d(this.getClass().getSimpleName(), "SESSION CLOSED");
handleLoginButtonOnClosedSession(fm, currentFragment);
break;
case CLOSED_LOGIN_FAILED:
if(Utils.DEBUG) Log.d(this.getClass().getSimpleName(), "SESSION CLOSED LOGIN FAILED");
handleLoginButtonOnClosedSession(fm, currentFragment);
break;
case CREATED:
if(Utils.DEBUG) Log.d(this.getClass().getSimpleName(), "SESSION CREATED");
break;
case CREATED_TOKEN_LOADED:
if(Utils.DEBUG) Log.d(this.getClass().getSimpleName(), "SESSION CREATED TOKEN LOADED");
UserWrapper.getCurrentUser(mContext).maintainFacebookToken(mContext);
break;
case OPENED:
if(Utils.DEBUG) Log.d(this.getClass().getSimpleName(), "SESSION OPENED");
break;
case OPENED_TOKEN_UPDATED:
if(Utils.DEBUG) Log.d(this.getClass().getSimpleName(), "SESSION OPENED TOKEN UPDATED");
UserWrapper.getCurrentUser(mContext).maintainFacebookToken(mContext);
break;
case OPENING:
if(Utils.DEBUG) Log.d(this.getClass().getSimpleName(), "SESSION OPENING");
fm = getSupportFragmentManager();
currentFragment = fm.findFragmentById(R.id.fragment_container);
if(currentFragment instanceof SplashFragment) {
SplashFragment splashFragment = (SplashFragment) currentFragment;
splashFragment.hideLoginButtonForLogin();
}
break;
}
// Only make changes if the activity is visible
if (mIsResumed) {
if (state.isOpened()) {
// we don't want to clear the back stack if the
// home fragment is already showing
FragmentManager manager = getSupportFragmentManager();
Fragment previousFragment = manager.findFragmentById(R.id.fragment_container);
if(previousFragment == null || !(previousFragment instanceof HomeFragment)) {
clearFramgnets();
}
UserWrapper.getCurrentUser(mContext).maintainFacebookToken(mContext);
// If the session state is open:
// Show the authenticated fragment
showFragment(HOME, false);
} else if (state.isClosed()) {
if(Utils.DEBUG) Log.d(TAG, "showing splash");
clearFramgnets();
// If the session state is closed:
// Show the login fragment
showFragment(SPLASH, false);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
if(Utils.DEBUG) Log.d(TAG, "Main Activity - onActivityResult called: requestCode="
+ requestCode + " resultCode:" + resultCode);
}
在这里,我尝试从Facebook获取用户
public void logOnApp(final LoginManager loginManager,
final AppUserLoadedCallback callback) {
if (mUserId == null || mUserId.getIdFromProvider() == null || getAuthToken() == null) {
// make request to the /me API
Request.newMeRequest(Session.getActiveSession(),
new Request.GraphUserCallback() {
// callback after Graph API response with sUser object
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
mUserId = new Id(Provider.FACEBOOK, user
.getId());
loginManager.increaseSuccesfulRetrievalsCount();
fetchUserAuthData(loginManager, callback);
} else {
// The login has been unsuccessful, if we have reached
// the maximum login retries -> logout, else attempt again.
if (loginManager.maxRetriesCountReached()) {
loginManager.mLogoutRunnable.run();
} else {
loginManager.increaseRetriesCount();
logOnApp(loginManager, callback);
}
}
}
}).executeAsync();
} else {
fetchUserAuthData(loginManager, callback);
}
}
任何关于为什么会发生这种情况的新想法都会非常有用 我添加了一些代码示例,如果您需要更具体的东西,请告诉我!您的意思是在2台设备上测试这两台设备上的facebook版本是什么?请将它们更新为最新版本,因为facebook应用程序提供了3.8+支持。我在两台设备上都有最新的facebook应用程序。在一个导致问题的问题上,我甚至重新安装了几次,看看这是否会有所不同。我有一个关于这个主题的更新——我甚至不能下载Facebook图片。这就像是应用程序或其他程序阻止了与Facebook服务器的连接可能在你的代码中的某个地方多次重新发送请求,直到Facebook阻止请求,因为它认为你的设备正在尝试DDOS攻击?