我的代码在卸载Facebook Mobile应用程序时启动Facebook登录屏幕。我填写了我的用户名和密码,一切正常。但是,当我从Facebook安装Facebook应用程序时。我的应用程序弹出一个窗口,要求获取basic_info和好友列表的权限,但后来我无法登录。状态为CLOSED_LOGIN_FAILED。这是我的代码。我做错了什么?
public class FacebookHome extends CustomActivity {
private Session.StatusCallback statusCallback = new SessionStatusCallback();
private UiLifecycleHelper uiLifecycleHelper;
private static final String TAG = "Facebook";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.facebook_home);
addListenerForView(R.id.facebook_home_layout);
uiLifecycleHelper = new UiLifecycleHelper(this, statusCallback);
uiLifecycleHelper.onCreate(savedInstanceState);
}
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
loggingTextView.setText(getResources().getString(R.string.facebook_logout));
Log.i(TAG, "Logged in...");
} else if (state.isClosed()) {
loggingTextView.setText(getResources().getString(R.string.facebook_login));
Log.i(TAG, "Logged out...");
}
}
protected void onResume() {
super.onResume();
Session session = Session.getActiveSession();
if (session != null &&
(session.isOpened() || session.isClosed()) ) {
onSessionStateChange(session, session.getState(), null);
}
uiLifecycleHelper.onResume();
}
@Override
protected void nonVerboseIntroduction(){
speak("Facebook Main menu");
}
@Override
public void onPause() {
super.onPause();
uiLifecycleHelper.onPause();
}
@Override
public void onDestroy(){
super.onDestroy();
uiLifecycleHelper.onDestroy();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiLifecycleHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiLifecycleHelper.onSaveInstanceState(outState);
}
@SuppressWarnings("deprecation")
@Override
public void confirmation(int selectedViewID) {
switch (selectedViewID) {
case R.id.facebook_login:
//This corresponds with a login button on my custom layout
TextView view = (TextView) findViewById(R.id.facebook_login);
if (view.getText().toString().matches(getResources().getString(R.string.facebook_login))) {
login();
} else if (view.getText().toString().matches(getResources().getString(R.string.facebook_logout)))
exitSession();
break;
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state,
Exception exception) {
onSessionStateChange(session, state, exception);
}
}
private void login() {
try {
Session session = Session.getActiveSession();
if (session == null) {
session = new Session(this);
Session.setActiveSession(session);
session.openForRead(new Session.OpenRequest(this)
.setPermissions("basic_info")
.setCallback(statusCallback));
} else {
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this)
.setCallback(statusCallback));
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
} catch (Exception ex) {
System.out.println(ex.toString());
ex.printStackTrace();
}
}
答案 0 :(得分:2)
您必须在developer.facebook.com控制台上注册您的应用程序,如果您还没有这样做,请转到应用程序选项卡并选择创建新应用程序,填写必要的凭据。
为什么大多数人遇到此问题是因为facebook仪表板提供了错误的哈希键
使用Facebook开发人员指南中的以下代码生成哈希密钥并将其添加到您的应用程序详细信息中,然后它将开始为您的Facebook ID工作。
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.facebook.samples.hellofacebook",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
要使其适用于任何Facebook ID,您需要通过应用的“破折号”标签中的状态和审核选项来生成应用及其所有功能。
答案 1 :(得分:0)
您是否在Facebook应用中配置了原生应用设置。如果没有,请使用您的应用包名称和密钥哈希更新您的原生应用设置。然后您就可以通过Native facebook app登录。