【发布时间】:2024-01-23 12:48:01
【问题描述】:
我有以下代码,用于允许用户使用 facebook 登录。目前,如果用户没有安装本机 android facebook 应用程序,所以我使用的 webview 弹出登录一切正常,用户已登录,processSessionStatus() 被触发。
这会将用户电子邮件传递到我的应用自己的登录信息。
问题是当用户安装了本机应用并将其用于 facebook 登录时,processSessionStatus() 不会触发。
我已经设置了我的 facebook 开发设置以包含 FbLoginActivity 作为本机登录使用的活动。我想一旦用户使用本机应用程序登录,我需要向onActivityResult 添加一些内容以触发processSessionStatus()?
但是我不确定我需要传递什么才能使其正确触发。
我的 FbLoginActivity:
public class FbLoginActivity extends Activity {
private static List<String> permissions;
Session.StatusCallback statusCallback = new SessionStatusCallback();
ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fblogin);
Button fbButton = (Button) findViewById(R.id.fbshare);
/***** FB Permissions *****/
permissions = new ArrayList<String>();
permissions.add("email");
/***** End FB Permissions *****/
fbButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Check if there is any Active Session, otherwise Open New
// Session
Session session = Session.getActiveSession();
if (session == null) {
Session.openActiveSession(FbLoginActivity.this, true,
statusCallback);
} else if (!session.isOpened()) {
session.openForRead(new Session.OpenRequest(
FbLoginActivity.this).setCallback(statusCallback)
.setPermissions(permissions));
}
}
});
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(this, null, statusCallback,
savedInstanceState);
}
if (session == null) {
session = new Session(this);
}
Session.setActiveSession(session);
session.addCallback(statusCallback);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(
statusCallback).setPermissions(permissions));
}
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state,
Exception exception) {
// Check if Session is Opened or not
processSessionStatus(session, state, exception);
}
}
@SuppressWarnings("deprecation")
public void processSessionStatus(Session session, SessionState state,
Exception exception) {
if (session != null && session.isOpened()) {
if (session.getPermissions().contains("email")) {
// Show Progress Dialog
dialog = new ProgressDialog(FbLoginActivity.this);
dialog.setMessage("Logging in..");
dialog.show();
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
Response response) {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
if (user != null) {
Map<String, Object> responseMap = new HashMap<String, Object>();
GraphObject graphObject = response
.getGraphObject();
responseMap = graphObject.asMap();
Log.i("FbLogin", "Response Map KeySet - "
+ responseMap.keySet());
// TODO : Get Email
// responseMap.get("email");
String fb_id = user.getId();
String email = null;
String name = (String) responseMap
.get("name");
if (responseMap.get("email") != null) {
email = responseMap.get("email")
.toString();
Intent i = new Intent(FbLoginActivity.this, FbLogin2Activity.class);
i.putExtra("Email", email);
startActivity(i);
} else {
// Clear all session info & ask user to
// login again
Session session = Session
.getActiveSession();
if (session != null) {
session.closeAndClearTokenInformation();
}
}
}
}
});
} else {
session.requestNewReadPermissions(new Session.NewPermissionsRequest(
FbLoginActivity.this, permissions));
}
}
}
/********** Activity Methods **********/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("FbLogin", "Result Code is - " + resultCode + "");
Session.getActiveSession().onActivityResult(FbLoginActivity.this,
requestCode, resultCode, data);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Save current session
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
@Override
protected void onStart() {
// TODO Add status callback
super.onStart();
Session.getActiveSession().addCallback(statusCallback);
}
@Override
protected void onStop() {
// TODO Remove callback
super.onStop();
Session.getActiveSession().removeCallback(statusCallback);
}
}
【问题讨论】:
-
所以用户无法登录?
-
@VishalPawale 用户登录正常,但是当他们拥有本机应用程序并使用该应用程序登录时,它只会返回到 FbLoginActivity 并且不会触发 processSessionStatus() 而当他们使用 webview 弹出窗口登录时 processSessionStatus( ) 被解雇了
-
那么在原生应用的情况下,你没有得到用户的emailId?
-
@VishalPawale 好吧,它甚至没有走那么远,您登录它已登录但 processSessionStatus() 没有运行,因此电子邮件等不会发生
-
哦,好吧..所以问题是如果用户已经登录,
processSessionStatus()在点击fbButton时不会被调用。我建议看看fbButton的点击监听器,当用户登录时它什么也不做。实际上,它应该使用Preferences跟踪用户是否通过活动登录。所以你可以做的是——保持布尔值是首选项&一旦用户登录将其标记为 true 并将他的电子邮件存储在首选项中,以便用户无需再次登录。每次用户启动您的应用时,请检查用户是否已登录。
标签: android facebook webview android-facebook