【问题标题】:Android Facebook SDK Not Working for Exported APKAndroid Facebook SDK 不适用于导出的 APK
【发布时间】:2013-09-12 11:19:06
【问题描述】:

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

如果我从 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);
    }

}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多