0

我有一个非常基本的 Android 应用程序,使用基于https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/示例的 Facebook SDK

如果我从 ADT 运行它,它会工作并显示“已打开”。由于我已经授权了该应用程序,因此它不会显示对话框,而只会显示“已打开”文本。

如果我将它导出为 apk 并使用我刚刚创建的新密钥库对其进行签名,它的工作原理相同。

但是,如果我导出一个 apk 并使用我用来签署我的真实应用程序的实际密钥库对其进行签名,它就不起作用。首先,即使我已经授权它,它也会显示一个访问我的公共个人资料和朋友列表的对话框,然后单击 OK 后它显示“已关闭”,这意味着 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);
    }

}
4

1 回答 1

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”替换为您的实际包名称。

于 2013-09-12T03:19:06.517 回答