Java Facebook认证Android

Java Facebook认证Android,java,android,facebook,Java,Android,Facebook,下面是我的登录功能: public void facebookLogin() { shareAppPreferences = new AppPreferences(getApplicationContext()); facebook = ((GlobalVars)getApplicationContext()).facebook; String access_token = shareAppPreferences.getAccessToken();

下面是我的登录功能:

  public void facebookLogin()
{

    shareAppPreferences = new AppPreferences(getApplicationContext());
     facebook = ((GlobalVars)getApplicationContext()).facebook;

     String access_token = shareAppPreferences.getAccessToken();
     long expires = shareAppPreferences.getAccessExpires();
     Log.d("MyTag","token:" +access_token);
     if(access_token != null) {
         facebook.setAccessToken(access_token);
     }
     if(expires != 0) {
         facebook.setAccessExpires(expires);
     }
     /*
      * Only call authorize if the access_token has expired.
      */
     if(!facebook.isSessionValid()) {
         Log.d("MyTag","In Authorize");
          facebook.authorize(this, new String[] {}, new DialogListener() {
              @Override
              public void onComplete(Bundle values) {
                //  new AccessKeyTask().execute("http://37.49.226.66/allaroundme/requests.php");
                  shareAppPreferences.saveAccessToken(facebook.getAccessToken());
                  Log.d("MyTag","face token: " +facebook.getAccessToken());
                  shareAppPreferences.saveAccessExpires(facebook.getAccessExpires());

              }

              @Override
              public void onFacebookError(FacebookError error) {}

              @Override
              public void onError(DialogError e) {}

              @Override
              public void onCancel() {}
          });
     }
     Intent intent = new Intent(this,MainActivity.class);
     Log.d("MyTag", "starting activity");
     startActivity(intent);

}

我真的不明白为什么这个代码不起作用,在尝试使用该代码之前,我通过facebook应用程序注销了facebook。onComplete()似乎不会发生,并且访问令牌始终为空。但在我第一次登录后,我不必输入信息。这里有人能帮我吗?

以下是对我有用的代码:

    public void loginToFacebook(){
        facebook.authorize(CandyCount.this, new String[]{"publish_stream", "email"}, Facebook.FORCE_DIALOG_AUTH, new DialogListener() {

            public void onFacebookError(FacebookError e) {
                Toast.makeText(getApplicationContext(), "onFacebookError", Toast.LENGTH_SHORT).show();
            }

            public void onError(DialogError e) {
                Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show();
            }

            public void onComplete(Bundle values) {

                Editor editor = sp.edit();
                editor.putString("access_token", facebook.getAccessToken());
                editor.putLong("access_expires", facebook.getAccessExpires());
                editor.commit();
                updateButtonStatus();

                getName();

            }

            public void onCancel() {
                // TODO Auto-generated method stub

            }

        });
    }
在onCreate中:

    sp = getPreferences(MODE_PRIVATE);
    access_token = sp.getString("access_token", null);
    expires = sp.getLong("access_expires", 0);
    getName = sp.getString("name", null);

    if (access_token != null){
        facebook.setAccessToken(access_token);
        fbName.setText("Hello, " + getName);
        updateButtonStatus();
    }
    if (expires != 0){
        facebook.setAccessExpires(expires);

    }
在updateButtonStatus方法中,我更改了按钮的图像,在单击按钮时,我根据会话是否有效来注销或登录

看看这篇文章,它很好地解释了facebook sdk


显然,您需要修改代码以满足您的特定需求。我希望这有帮助

好的,这段代码可以很好地保存令牌:但是如果我从facebook应用程序注销我的acc,然后启动我的应用程序,它仍然记得我,并且不需要我重新输入facebook信息。你看到问题了吗?我相信Facebook的访问令牌就是这样工作的。一旦你提供信息并登录,它就可以自动让你登录,但不会让你在其他应用(如fb应用)上登录facebook。我注销了facebook应用程序,然后进入我的应用程序,事实上,它可以自动让我登录。不过,当我回到fb应用程序时,我被注销了。这就是它的工作原理