我在使用 Android 实现 Facebook 登录/注册时遇到问题。文档不充分,他们的用例很奇怪(他们谈论的只是那里的 fragment ,这让注意力远离了主要主题)
我创建的是工作登录(注册),但如果我没有检查用户是否已经登录,那么应用程序会尝试将它们重新插入数据库,从而导致错误。
我也不知道 uiHelper 是做什么用的,所以我已经从我的代码中完全删除了它。
我的问题是如何检查用户是否已经通过 Facebook 注册,现在只需登录即可。
编辑:我想说的是,用户在这两种情况下都没有登录,但在其中一种情况下,他们已经通过 fb 注册了,我只想让他们登录。在另一种情况下,他们还没有通过 fb 和他们的第一种方法注册,所以我想在数据库中注册它们并登录(我已经完成了后者)
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.authButton) {
OpenRequest openrequest = new OpenRequest(this).setPermissions(Arrays.asList("basic_info", "email", "user_likes", "user_status"));
Session session = new Session(Login.this);
session.openForRead(openrequest);
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
makeMeRequest(session);
} else if (state.isClosed()) {
System.out.println("closed"); //debugging
Session sessionw = new Session(this);
Session.setActiveSession(sessionw);
sessionw.openForRead(new Session.OpenRequest(this).setCallback(callback).setPermissions(Arrays.asList("basic_info", "email", "user_likes", "user_status")));
}
}
private void makeMeRequest(final Session session) {
// Make an API call to get user data and define a
// new callback to handle the response.
Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
// If the response is successful
if (session == Session.getActiveSession()) {
if (user != null) {
userFBId = user.getId();
userName = user.getName();
userEmail = (String) user.asMap().get("email");
userSex = (String) user.getProperty("gender");
userFacebookAvatar = "http://graph.facebook.com/"+user.getId()+"/picture?type=square";
new RegisterFacebookUser(Login.this, Login.this, userName, userEmail, userSex, userFacebookAvatar).execute(); //this is an async task that inserts the user in the db
}
}
if (response.getError() != null) {
System.out.println(response.getError().toString());
}
}
});
request.executeAsync();
}
@Override
public void OnFacebookUserRegisteredSuccess(int userId) {
editor = sharedPrefs.edit();
editor.putBoolean("userLoggedInState", true);
editor.putBoolean("userHasRegisteredViaFacebook", true);
editor.putInt("currentLoggedInUserId", userId);
editor.putString("userFBId", userFBId);
editor.commit();
Intent signupSuccessHome = new Intent(this, Home.class);
startActivity(signupSuccessHome);
finish();
}
@Override
public void OnFacebookUserRegisteredFailure() {
toastMaker.toast(net.asdqwe.activities.Login.this, Configurationz.ErrorMessages.FACEBOOK_LOGIN_FAILURE, Toast.LENGTH_LONG);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REAUTH_ACTIVITY_CODE) {
Session.getActiveSession().onActivityResult(Login.this, requestCode, resultCode, data);
} else {
Session session = Session.getActiveSession();
int sanitizedRequestCode = requestCode % 0x10000;
session.onActivityResult(this, sanitizedRequestCode, resultCode, data);
}
}
最佳答案
您不应该依赖自己的偏好来确定用户之前是否注册过,因此只能“让他们登录”。 Facebook 允许用户注册应用程序,但用户将来可能会从他们的控制台取消注册或删除您的应用程序。之后 Facebook 将重置它发送到您的应用程序的许可 token ,并且任何 Activity (例如代表用户发帖)都将被拒绝。
所以要回答您的问题,只需执行您正在执行的注册和登录流程即可。如果用户已经注册,Facebook 将弹出一些权限 UI 流程,用户无需执行任何操作(因为所有权限都已授予)。您将在您的应用程序中取回 session token 。在您的应用中更新此 session token ,并在未来代表用户将其用于所有请求。
注意:我认为您使用的是旧版本的 Facebook SDK。您应该升级到最新版本 (3.6)。他们已经解决了很多注册/登录问题,您的用户会非常感谢您。
关于android - Facebook/Android - 如何检查用户是否已经注册,现在只需登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20658446/