Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Facebook sdk 3.8.0。对于android,重新登录请求后。newMeRequest返回空用户;java.net.SocketException:套接字已关闭_Java_Android_Facebook_Facebook Android Sdk - Fatal编程技术网

Facebook sdk 3.8.0。对于android,重新登录请求后。newMeRequest返回空用户;java.net.SocketException:套接字已关闭

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已关闭” 我不明白插座怎么可能是关着

我正在开发一个android应用程序,它已经使用Facebook sdk 5个月了。在我成功登录新设备之前,一切都正常工作。之后,我成功登录,但当我试图使用Request.newMeRequest获取用户信息时,我得到了null。所以我调试了这个问题,下面是我发现的:

  • 已使用访问令牌成功创建会话
  • 当试图调用facebook sdk中的某个地方的NewMereRequest时,引发了一个异常。异常为“java.net.SocketException:Socket已关闭”
  • 我不明白插座怎么可能是关着的。我在互联网上搜索了很多,下面是一些我试图消除bug的建议和内容:

  • 我重新安装了应用程序并清除了所有缓存的数据
  • 我重新安装了Facebook应用程序
  • 我重新启动了设备
  • 我从我的Facebook应用程序列表中删除了该应用程序(这将取消该应用程序对我的数据的访问)
  • 他们似乎都没有结果,所以我放弃了。当我回到家时,我有4个小时没有尝试这个过程。在那里,我重新安装了Facebook应用程序,之后我成功登录并再次检索用户数据我没有修改任何代码。

    但问题并不止于此。今天,在多次登录和注销之后,这个问题再次出现,在过去的3个小时里,我已经能够让它正常工作

    在这一点上,我真的不知道为什么会发生这种情况,也不知道如何解决它。有人知道是什么导致了这种行为吗

    我正在使用Android V3.8.0的Facebook sdk。我还在多台设备上测试该应用程序(我不确定这是否相关),到目前为止,这个问题只出现在Nexus7和Jelly Bean上,而在Nexus4和Kit Kat上,这是迄今为止从未发生过的

    编辑:

    代码库相当大,因此我将从一些可能有用的部分开始,并根据需要添加更多内容:
    这将处理会话

    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攻击?