【问题标题】:Facebook Android Tutorial logoutFacebook Android 教程注销
【发布时间】:2012-10-29 17:55:51
【问题描述】:

我关注this tutorial。我知道您从savedPreferences 检索访问令牌,然后创建了一个注销按钮。问题是,我的 access_token 似乎总是正确的,无论我是从我的应用程序还是从 Facebook 应用程序注销。

这是我的代码:

public class MainActivity extends Activity {
    private String TAG = MainActivity.class.getName();      

    Facebook mFacebook = new Facebook("whatever");
    AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook);

    private SharedPreferences mPrefs;

    //UI elements
    private ImageButton fbLoginButton;
    private Button getInfoButton;
    private Button fbLogoutButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mPrefs = getPreferences(MODE_PRIVATE);
        String access_token = mPrefs.getString("access_token", null);
        long expires = mPrefs.getLong("access_expires", 0);

        if(access_token != null) {
            Log.d(TAG, "Token found. Setting token " + access_token);
            mFacebook.setAccessToken(access_token);
        }

        if(expires != 0) {
            Log.d(TAG, "Setting expire " + expires);
            mFacebook.setAccessExpires(expires);
        }


        if(!mFacebook.isSessionValid()) {
            mFacebook.authorize(this, new String[] {"email", "read_friendlists" }, new DialogListener() {
                @Override
                public void onComplete(Bundle values) {
                    SharedPreferences.Editor editor = mPrefs.edit();
                    editor.putString("access_token", mFacebook.getAccessToken());
                    editor.putLong("access_expires", mFacebook.getAccessExpires());
                    editor.commit();
                    Log.d(TAG, "Logging you in");
                }

                @Override
                public void onFacebookError(FacebookError error) {
                     Log.d(TAG, "Facebook error: " + error.getMessage() );

                }

                @Override
                public void onError(DialogError e) {
                     Log.d(TAG, "Error: " + e.getMessage());
                }

                @Override
                public void onCancel() {
                    Log.d(TAG, "User Canceled");
                }
            });
        }
        else{
            Toast.makeText(this, "Already logged in", Toast.LENGTH_LONG).show();
        }


        fbLoginButton = (ImageButton) findViewById(R.id.buttonFBLogin);
        getInfoButton = (Button) findViewById(R.id.buttonGetInfo);
        fbLogoutButton = (Button) findViewById(R.id.buttonLogout);

        fbLogoutButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                doLogout();
            }
        });
    }

    protected void doLogout() {
        mAsyncRunner.logout(this, new RequestListener() {
              @Override
              public void onComplete(String response, Object state) {
                  Log.d(TAG, "Logging you out");
              }

              @Override
              public void onIOException(IOException e, Object state) {}

              @Override
              public void onFileNotFoundException(FileNotFoundException e,
                    Object state) {}

              @Override
              public void onMalformedURLException(MalformedURLException e,
                    Object state) {}

              @Override
              public void onFacebookError(FacebookError e, Object state) {}
            });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        mFacebook.authorizeCallback(requestCode, resultCode, data);
    }
}

我总是收到Already logged in Toast。我做错了吗?

PS。在从 sharedpreferences 检索 access_token 之前,该应用程序似乎运行良好,所以这不是我的 API 密钥或调试密钥的问题。

【问题讨论】:

  • 尝试将一些日志消息放入 mAsyncRunner.logout 内的不同函数中,看看是否遇到了某种错误
  • @Kelmer 你是否解决了这个问题。我也面临同样的问题我没有得到任何解决方案。

标签: android facebook login logout


【解决方案1】:

尝试mFacebook.logout 并检查响应值。如果注销成功,它将为“true”。为我工作。

不要忘记单点登录功能。如果您仍然登录 Facebook 应用程序,它不会真正注销您。

【讨论】:

  • 不,但它会撤销令牌,因此会再次要求它,不是吗?无论如何,从 Facebook 应用程序退出时,它仍然给我“已经登录”消息
  • 也许这是 Toast.makeText(this, "已经登录", Toast.LENGTH_LONG).show();给你这个消息?当您从 Facebook 注销时,它会清除所有令牌,因此 mFacebook.isSessionValid() 之后返回 false,因为您的会话不再有效。
  • 没错,因为它应该返回 false,所以应该不会显示 toast,因为它位于 if 语句的另一个路径中。
  • 对,我告诉你它会返回这个值,因为你的会话不再有效,这是注销后的预期行为
猜你喜欢
  • 2012-03-04
  • 2013-01-27
  • 2014-07-31
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多