如果安装了Facebook应用程序,SDK会发送错误的密钥,导致登录失败并显示无效密钥。

3
我已经从我的调试密钥库和发布密钥库中生成了密钥,并将它们都插入到Facebook应用程序的“本机Android应用程序”字段中进行了测试。
我在多个设备上进行了测试,当我使用debug.keystore(从eclipse部署)时,它始终正常工作。但是,当我使用发布密钥库签名应用程序包时,仅当设备未安装Facebook应用程序时才能正常工作。
如果已安装Facebook应用程序,则会发送另一个密钥,我无法识别。
我非常仔细地生成哈希键,分配正确的路径和密码,如Facebook的说明所述。
注意:使用debug.keystore运行时它可以工作,但似乎使用的是对话框身份验证而不是Facebook应用程序。
谢谢
public void share(final int score) {        
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            try {
                mScoreToShare = score;

                if (mGLView != null)
                    mGLView.stopDrawing(); 

                getFacebook();

                if(!mFacebook.isSessionValid()) {
                    facebookAuthorize();    
                }
                else {
                    facebookShowFeedDialog();
                }
            } catch (Exception e) {
                Log.error("Share failed", e);

                if (mGLView != null)
                    mGLView.startDrawing();
            }
        }
    });     
}

private Facebook getFacebook() {

    if (mFacebook == null) {

        mFacebook = new Facebook("xxx");

        SharedPreferences prefs = getSharedPreferences("xxx", MODE_PRIVATE);//getPreferences(MODE_PRIVATE);

        String access_token = prefs.getString("access_token", null);
        long expires = prefs.getLong("access_expires", 0);

        if(access_token != null) {
            mFacebook.setAccessToken(access_token);
        }

        if(expires != 0) {
            mFacebook.setAccessExpires(expires);
        }
    }

    return mFacebook;
}

private void facebookAuthorize() {

    //mFacebook.authorize(this, null, Facebook.FORCE_DIALOG_AUTH, new DialogListener() {
    mFacebook.authorize(this, new DialogListener() {
        @Override
        public void onComplete(Bundle values) {

            SharedPreferences.Editor editor = getSharedPreferences("xxx", MODE_PRIVATE).edit();
            editor.putString("access_token", mFacebook.getAccessToken());
            editor.putLong("access_expires", mFacebook.getAccessExpires());
            editor.commit();

            facebookShowFeedDialog();
        }

        @Override
        public void onFacebookError(FacebookError error) {
            mFacebook = null;
            showAlert();                
            if (mGLView != null)
                mGLView.startDrawing();
        }

        @Override
        public void onError(DialogError e) {
            mFacebook = null;
            showAlert();                
            if (mGLView != null)
                mGLView.startDrawing();
        }

        @Override
        public void onCancel() {
            mFacebook = null;
            if (mGLView != null)
                mGLView.startDrawing();
        }
    });     
}

private void facebookExtendAccessTokenIfNeeded() {
    if (mFacebook != null) {
        mFacebook.extendAccessTokenIfNeeded(this, null);
    }
}

private void facebookShowFeedDialog() {

    Bundle parameters = new Bundle();

    String caption = "";

    parameters.putString("caption", caption);
    parameters.putString("description", "");
    parameters.putString("picture", "");

    //post on user's wall.
    mFacebook.dialog(this, "feed", parameters, new DialogListener(){
        @Override
        public void onComplete(Bundle values) {     
            mFacebook = null;               
            if (mGLView != null)
                mGLView.startDrawing();
        }

        @Override
        public void onFacebookError(FacebookError error) {
            mFacebook = null;
            showAlert("");              
            if (mGLView != null)
                mGLView.startDrawing();
        }

        @Override
        public void onError(DialogError e) {
            mFacebook = null;
            showAlert("");              
            if (mGLView != null)
                mGLView.startDrawing();
        }

        @Override
        public void onCancel() {
            mFacebook = null;
            if (mGLView != null)
                mGLView.startDrawing();
        }
    });

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (mFacebook != null) {
        mFacebook.authorizeCallback(requestCode, resultCode, data); 
    }
}

你是否正在使用onActivityResult?有什么logcat错误吗?你有代码可以展示给我们吗? - David Olsson
这是它:登录失败:invalid_key:Android密钥不匹配。您的密钥“xxx”与应用程序设置中指定的允许密钥不匹配。 - Karmeye
1
你可能需要多检查几次密钥哈希。你确定你正在正确复制它并根据Facebook使用正确的调用吗? - David Olsson
1
对话框没有使用 hey hash,只有在安装了 Facebook 应用程序的设备上才会使用,如果我没记错的话。因此,错误信息所述的 key hash 存在问题。 - David Olsson
Facebook应用程序设置中发布的哈希密钥和用于签署您的应用程序的密钥库所对应的哈希密钥,在SSO中应始终保持相同。 - Vasu
显示剩余2条评论
1个回答

0

从 Facebook 中删除该应用程序,然后使用相同的哈希密钥重新创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接