我有一个非常基本的Android应用程序,使用基于https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/
示例的Facebook SDK如果我从ADT运行它,它可以工作并显示“已打开”。由于我已经授权了应用程序,因此它不显示对话框,只显示“已打开”文本。
如果我将其导出为apk并使用我刚创建的新密钥库对其进行签名,则其工作方式相同。
但是,如果我导出一个apk并用我用来签署我的真实应用程序的实际密钥库签名,它就不起作用了。首先,它显示了一个对话框,用于访问我的公开个人资料和好友列表,即使我已经授权它,然后点击确定后显示“已关闭”,这意味着session.isClosed()为真。
我在Facebook开发人员工具中拥有调试,新的和实际密钥库的所有关键哈希值。
可能有什么不对?我的密钥库被软管了吗?
以下是我的应用的代码:
package com.example.newtest;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
import com.facebook.*;
import com.facebook.model.*;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Session.openActiveSession(this, true, new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("opened");
} else if (session.isClosed()) {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("closed");
} else {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("neither opened nor closed");
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
}
答案 0 :(得分:2)
Facebook的命令行方法生成keyhash它并不总是可靠的。在onCreate()
中使用此代码可确保您生成正确的密钥:
try {
PackageInfo info = getPackageManager().getPackageInfo(
"package.name.here",
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) {
}
确保将“package.name.here”替换为您的实际包名。