使用Facebook SDK时无法注销 - Android

时间:2017-10-25 20:10:55

标签: android facebook logout facebook-sdk-4.0

我一直在努力学习这个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);

}

}

3 个答案:

答案 0 :(得分:1)

您可以使用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以将其视为新用户。

答案 1 :(得分: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 App登录,如果该操作不起作用,则退回到Web对话框身份验证。这是默认行为。

WEB_VIEW_ONLY

指定仅应使用网络视图对话框身份验证。

有关更多参考,请转到-> https://developers.facebook.com/docs/reference/android/current/class/LoginBehavior/

此解决方案可能需要您在Facebook登录/注册流程中进行一些改动。

答案 2 :(得分:0)

我在Android上使用Facebook SDK注销时遇到了类似的问题。经过大量测试,发现该问题仅发生在三星手机上。登录时,Facebook SDK将启动一个Webview,该Webview缓存Facebook身份验证令牌。因此,即使您注销了SDK,Webview仍会保留令牌。这不受Facebook SDK的直接控制,但是在登录时,它会检测到现有令牌并继续登录而没有其他提示。这似乎涉及@ravi答案的元素,因为AccessToken的参数还可以指定“ accessTokenSource”,它可以进行网络查看。

如果您清除浏览器缓存(如果安装了Chrome,而不考虑默认的浏览器,Facebook似乎要使用Chrome),然后尝试执行Facebook登录,那么您将获得预期的行为。显然,Facebook SDK需要更多的制衡手段来处理挥之不去的令牌。