我一直试图学习这个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);
}
}
2 回答
Android上的Facebook SDK注销遇到了类似的问题 . 经过多次测试,发现问题只发生在三星手机上 . 登录时,Facebook SDK将启动webview,缓存Facebook身份验证令牌 . 因此,即使您在SDK上注销,webview也会保留令牌 . 这不受Facebook SDK的直接控制,但是当登录发生时,它会检测现有令牌并继续登录而无需进一步提示 . 这似乎涉及@ravi答案的元素,因为AccessToken的参数也可以指定"accessTokenSource",这可以是webview .
如果您清除浏览器缓存(Facebook似乎想要使用Chrome,无论默认浏览器是否安装),然后尝试执行Facebook登录,您将获得预期的行为 . 显然,Facebook SDK中需要更多的检查和 balancer 来处理延迟令牌 .
您可以使用Facebook SDK中的AccessToken类注销 .
因此,要注销,只需在注销按钮上放置一个OnClickListener并执行以下操作:
虽然您可以使用LoginManager.getInstance() . logOut()注销,但下次尝试登录时,它会识别您之前登录尝试中的早期帐户 . 因此,将AccessToken设置为null以将其视为新用户 .