Android Facebook SDK不适用于导出的APK

时间:2013-09-12 03:11:52

标签: android facebook login facebook-android-sdk keystore

我有一个非常基本的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);
    }

}

1 个答案:

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