Android Facebook 4.0.1 无效密钥哈希错误
Posted
技术标签:
【中文标题】Android Facebook 4.0.1 无效密钥哈希错误【英文标题】:Android Facebook 4.0.1 invalid key hash error 【发布时间】:2015-04-07 12:06:37 【问题描述】:我完全按照 facebook 开发者页面上的说明在 android 中通过 facebook 登录。我的代码运行良好。 但是,当用户注销并尝试再次通过 facebook 登录时,它会给出无效的密钥哈希错误。我不知道我的代码有什么问题。
Manifest.xml
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:theme="@android:style/Theme.NoTitleBar" >
<activity
android:name="com.example.helltop.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".GameActivity"
android:screenOrientation="portrait"></activity>
<activity
android:name=".HelpActivity"
android:screenOrientation="portrait"></activity>
<activity android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name" />
<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
<meta-data
android:name="com.facebook.sdk.ApplicationName"
android:value="@string/facebook_app_name" />
<provider android:authorities="com.facebook.app.FacebookContentProvider137..."
android:name="com.facebook.FacebookContentProvider"
android:exported="true"/>
</application>
登录活动
CallbackManager callbackManager;
LoginButton btnFbLogin;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
setContentView(R.layout.loginactivity);
btnFbLogin = (LoginButton) findViewById(R.id.btn_fblogin); btnFbLogin.setOnClickListener(this);btnFbLogin.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0);
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>()
@Override
public void onSuccess(LoginResult loginResult)
fbLoginGetUserData(loginResult.getAccessToken());
@Override
public void onCancel()
Toast.makeText(LoginActivity.this, "Facebook Login Canceled!" , Toast.LENGTH_SHORT).show();
@Override
public void onError(FacebookException error)
Toast.makeText(LoginActivity.this, "ERROR : " + error.getMessage() , Toast.LENGTH_SHORT).show();
);
btnFbLogin.setReadPermissions(Arrays.asList("public_profile", "email", "user_birthday"));
profileTracker = new ProfileTracker()
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile)
;
private void fbLoginGetUserData(AccessToken accessToken)
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback()
@Override
public void onCompleted(JSONObject object, GraphResponse response)
if(response.getError() != null)
showAlert(response.getError().getErrorCode() + " : " + response.getError().getErrorMessage(), "Facebook Error!");
else
// Get the data here
);
Bundle parameters = new Bundle();
parameters.putString("fields", "id,first_name,last_name,link,birthday,email,gender,middle_name");
request.setParameters(parameters);
request.executeAsync();
这里是我如何为 facebook 创建我的应用程序的发布密钥库和哈希密钥。
keytool -genkey -alias myreleasekey-keyalg RSA -keystore %USERPROFILE%\.android\myapprelease.keystore -keysize 2048 -validity 10000
keytool -exportcert -alias myreleasekey -keystore ~/myapprelease.keystore | "C:\OpenSSL\bin\openssl" sha1 -binary | "C:\OpenSSL\bin\openssl" base64
【问题讨论】:
【参考方案1】:public class MyApplication extends Application
@Override
public void onCreate()
super.onCreate();
printHashKey();
public void printHashKey()
try
PackageInfo info = getPackageManager().getPackageInfo(
"com.parakhidevelopers.happydays",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures)
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("Key Hash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
catch (PackageManager.NameNotFoundException e)
catch (NoSuchAlgorithmException e)
【讨论】:
我应该在使用 releasekeystore 文件签名的应用程序的第一个活动中运行此代码吗?对?因为我记得我也这样做过。 在您的基础应用程序类中运行此代码,并从 log cat 中复制您的哈希键并在设置部分使用它。 但在发布模式下处于调试模式。例如,每当我从 Eclipse 运行我的应用程序时,它都是由调试密钥库构建的。没有关于那个的规范? 我已经编辑了 ans,你会在你的 logcat 中找到你的哈希键 我在 Facebook 开发者页面中为我的应用设置了创建的密钥哈希。第一次单击登录按钮它可以工作,我可以通过 facebook 登录。但是,如果我注销然后再次单击登录按钮,它会抛出无效的密钥哈希。此外,如果我在我的 Facebook 帐户中删除允许的应用程序,我可以再次登录以上是关于Android Facebook 4.0.1 无效密钥哈希错误的主要内容,如果未能解决你的问题,请参考以下文章
Phonegap 构建 - Facebook 连接插件 - 无效的 android_key 参数错误
无效的密钥哈希。密钥哈希与任何存储的密钥哈希不匹配 facebook android
Phonegap Facebook 插件 - 从 Android 设备中删除应用程序后密钥哈希无效