【问题标题】:Cannot log out while using the Facebook SDK - Android使用 Facebook SDK 时无法注销 - Android
【发布时间】:2018-04-07 01:32:53
【问题描述】:

我已经尝试学习这个 Facebook SDK 几天了,但我似乎被卡住了。我正在为一个学校项目构建一个基本应用程序,当用户第一次登录时,Facebook 允许您输入电子邮件和密码并登录。一旦用户单击“注销”,我就会注销。 。 据我所知。现在,当我返回单击登录时,它会自动重新登录到最后一个帐户。没有给我切换帐户的选项。我该如何解决这个问题?

编辑*** 当我登录,然后注销,然后再次单击登录时,它会显示“您之前使用 Facebook 登录到“APP NAME”。您要继续吗?”

唯一的选择是取消和继续。我什至无法尝试与其他人登录!这是我的问题,如果有人能解决它,那就太棒了!同时我会继续尝试不同的事情

package example.com.demo_app;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookActivity;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.appevents.AppEventsLogger;
import com.facebook.login.LoginBehavior;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.facebook.login.widget.ProfilePictureView;

import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {

LoginButton fbButton;
CallbackManager callBackManager;

TextView nameBox;
TextView emailBox;
TextView idBox;

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



    fbButton = (LoginButton)findViewById(R.id.login_button);
    fbButton.setReadPermissions("email", "public_profile");

    callBackManager = CallbackManager.Factory.create();
    fbButton.registerCallback(callBackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {


            String user_id = loginResult.getAccessToken().getUserId();



            GraphRequest graphRequest = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {


                    if (object != null)
                    {
                        displayInfo(object);
                    }
                    else {
                        LoginManager.getInstance().logOut();

                    }
                }
            });

            Bundle parameters = new Bundle();
            parameters.putString("fields", "first_name, last_name, email, id");
            graphRequest.setParameters(parameters);
            graphRequest.executeAsync();


        }

        @Override
        public void onCancel() {


        }

        @Override
        public void onError(FacebookException error) {

        }
    });


}

public void displayInfo(JSONObject object)
{
    String first_name = "";
    String last_name = "";
    String email = "";
    String id = "";
    try {
        first_name = object.getString("first_name");
        last_name = object.getString("last_name");
        email = object.getString("email");
        id = object.getString("id");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    nameBox = (TextView)findViewById(R.id.txtFullName);
    emailBox = (TextView)findViewById(R.id.txtEmail);
    idBox = (TextView)findViewById(R.id.txtID);

    nameBox.setText(first_name+ " " +last_name);
    emailBox.setText(email);
    idBox.setText(id);

    ProfilePictureView profilePictureView;

    profilePictureView = (ProfilePictureView) findViewById(R.id.friendProfilePicture);

    profilePictureView.setProfileId(id);



}

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

}

}

【问题讨论】:

    标签: android facebook logout facebook-sdk-4.0


    【解决方案1】:

    我遇到了类似的问题,我无法以其他用户身份再次登录并收到相同的消息。

    我尝试了什么:

    1) 在不将 AccessToken 设置为 null 的情况下注销(不起作用

    void logoutFacebook(){
        LoginManager.getInstance().logOut();
        // either finish() or startActivity() or any other app code
    }
    

    2) 在注销前将 AccessToken 设置为 null(不起作用

    void logoutFacebook(){
        if(AccessToken.getCurrentAccessToken()!=null){
            AccessToken.setCurrentAccessToken(null);
        }
        LoginManager.getInstance().logOut();
        // either finish() or startActivity() or any other app code
    }
    

    3) 从用户的 Facebook 帐户中删除应用(无效

    void logoutFacebook(){
        if(AccessToken.getCurrentAccessToken()!=null){
            AccessToken accessToken=AccessToken.getCurrentAccessToken();
                    new GraphRequest(accessToken
                            ,"/"+accessToken.getUserId()+"/permissions/"
                            ,null
                            ,HttpMethod.DELETE
                            ,new GraphRequest.Callback() {
                        @Override
                        public void onCompleted(GraphResponse graphResponse) {
                            LoginManager.getInstance().logOut();
                        }
                    }).executeAsync();
            AccessToken.setCurrentAccessToken(null);
        }
        // either finish() or startActivity() or any other app code
    }
    

    工作原理:

    在调用 fbButton 上的 registerCallback 之前将 fbButton 的 LoginBehavior 设置为 LoginBehavior.WEB_VIEW_ONLY。

    fbButton.setLoginBehavior(LoginBehavior.WEB_VIEW_ONLY);
    // now call registerCallback on fbButton
    

    fbButton 的默认 LoginBehavior 是 LoginBehavior.NATIVE_WITH_FALLBACK。

    根据关于 LoginBehavior.NATIVE_WITH_FALLBACK 和 LoginBehavior.WEB_VIEW_ONLY 的 Facebook 开发人员文档

    NATIVE_WITH_FALLBACK

    "指定登录应该尝试使用 Facebook 应用登录,如果这不起作用,则回退到网络对话身份验证。这是默认行为。"

    WEB_VIEW_ONLY

    "指定只应使用 Web 视图对话框身份验证。"

    如需进一步参考,请转到 -> https://developers.facebook.com/docs/reference/android/current/class/LoginBehavior/

    此解决方案可能需要您在 Facebook 登录/登录流程中进行小幅更改。

    【讨论】:

      【解决方案2】:

      我在 Android 上退出 Facebook SDK 时遇到过类似问题。经过多次测试,发现该问题仅出现在三星手机上。登录时,Facebook SDK 会启动一个 webview,它缓存 Facebook auth token。因此,即使您在 SDK 上注销,webview 也会保留令牌。这不受 Facebook SDK 的直接控制,但是当登录发生时,它会检测到现有令牌并继续登录而无需进一步提示。这似乎涉及@ravi 的回答元素作为AccessToken 的参数,也可以指定“accessTokenSource”,可以是webview。

      如果您清除浏览器缓存(无论默认浏览器如何,Facebook 似乎都希望使用 Chrome,如果它已安装),然后尝试执行 Facebook 登录,您将获得预期的行为。显然,Facebook SDK 中需要更多的制衡机制来处理滞留代币。

      【讨论】:

        【解决方案3】:

        您可以使用 Facebook SDK 中的 AccessToken 类注销。

        所以,要注销,只需在注销按钮上放置一个 OnClickListener 并执行以下操作:

         public void logOut() {
                AccessToken.setCurrentAccessToken(null);
                if (LoginManager.getInstance() != null) {
                    LoginManager.getInstance().logOut();
                }
                startActivity(new Intent(MainActivity.this, SplashSignIn.class));
            }
        

        虽然您可以只使用 LoginManager.getInstance().logOut() 注销,但下次您尝试登录时,它会从上次登录尝试中识别您之前的帐户。所以将 AccessToken 设置为 null 以被视为新用户。

        【讨论】:

        • 唯一的问题是我在技术上没有生成“注销”按钮。 Facebook SDK 会在用户登录后自动生成注销按钮,因此我不能 100% 确定如何调用他们已经制作的注销按钮
        • 听着。用户登录后,您可能已将他定向到其他活动。只需在此处添加您选择的按钮并在其上添加 onClickListener 即可。当您在那里调用上述方法时,将用户重定向到您的登录屏幕(如上面的代码所示)。您会发现 FB 的注销按钮已更改回登录。发生这种情况是因为您调用 LoginManager 为您设置了它。
        • 我尝试将访问令牌设置为空,但它仍然可以识别我之前登录的帐户。我该怎么办?
        猜你喜欢
        • 2011-09-17
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 2016-03-28
        • 2013-04-12
        • 1970-01-01
        相关资源
        最近更新 更多