[英]Cannot log out while using the Facebook SDK - Android
我已经尝试学习这个 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);
}
}
您可以使用 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) 在不将 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 登录/注册流程中进行一些小的更改。
我在 Android 上的 Facebook SDK 注销遇到了类似的问题。 经过多次测试,发现该问题仅出现在三星手机上。 登录时,Facebook SDK 将启动一个 webview,它缓存 Facebook 身份验证令牌。 因此,即使您注销 SDK,webview 也会保留令牌。 这不受 Facebook SDK 的直接控制,但是当登录发生时,它会检测到现有令牌并继续登录,而不会进一步提示。 这似乎涉及@ravi 答案的元素,作为AccessToken的参数也可以指定“accessTokenSource”,它可以是一个webview。
如果您清除浏览器缓存(无论默认浏览器如何,如果安装了 Chrome,Facebook 似乎想要使用 Chrome),然后尝试执行 Facebook 登录,您将获得预期的行为。 显然,Facebook SDK 中需要更多的制衡机制来处理挥之不去的代币。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.