【问题标题】:Invalid key hash! the key hash does not match any stored key hashes facebook android无效的密钥哈希!密钥哈希与任何存储的密钥哈希不匹配 facebook android
【发布时间】:2014-12-30 11:56:55
【问题描述】:

在运行 4-5 次此应用程序后,我在出现以下错误之前出现此错误,它工作正常。 错误:无效的密钥哈希!密钥哈希与任何存储的密钥哈希不匹配 facebook android Hashkey 未在 logcat 中生成。 链接:Invalid Key hash with Facebook Android SDK

public class MainActivity extends FragmentActivity {



    public static void showHashKey(Context context) {
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(
                    "com.virgosys.sharedynamic", PackageManager.GET_SIGNATURES); //Your            package name here
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.i("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
                }
        } catch (NameNotFoundException e) {
        } catch (NoSuchAlgorithmException e) {
        }
    }

    private LoginButton loginBtn;
    private Button postImageBtn;
    private Button updateStatusBtn;

    private TextView userName;

    private UiLifecycleHelper uiHelper;

    private static final List<String> PERMISSIONS = Arrays
            .asList("publish_actions");

    private static String message = "Sample status posted from android app";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        uiHelper = new UiLifecycleHelper(this, statusCallback);
        uiHelper.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        userName = (TextView) findViewById(R.id.user_name);
        loginBtn = (LoginButton) findViewById(R.id.fb_login_button);
        loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                if (user != null) {
                    userName.setText("Hello, " + user.getName());
                } else {
                    userName.setText("You are not logged");
                }
            }
        });

        postImageBtn = (Button) findViewById(R.id.post_image);
        postImageBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                postImage();
            }
        });

        updateStatusBtn = (Button) findViewById(R.id.update_status);
        updateStatusBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }
        });

        buttonsEnabled(false);
    }

    private Session.StatusCallback statusCallback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            if (state.isOpened()) {
                buttonsEnabled(true);
                Log.d("FacebookSampleActivity", "Facebook session opened");
            } else if (state.isClosed()) {
                buttonsEnabled(false);
                Log.d("FacebookSampleActivity", "Facebook session closed");
            }
        }
    };

    public void buttonsEnabled(boolean isEnabled) {
        postImageBtn.setEnabled(isEnabled);
        updateStatusBtn.setEnabled(isEnabled);
    }

    public void postImage() {
        if (checkPermissions()) {
            Bitmap img = BitmapFactory.decodeResource(getResources(),
                    R.drawable.ic_launcher);
            Request uploadRequest = Request.newUploadPhotoRequest(
                    Session.getActiveSession(), img, new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            Toast.makeText(MainActivity.this,
                                    "Photo uploaded successfully",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
            uploadRequest.executeAsync();
        } else {
            requestPermissions();
        }
    }

    public void postStatusMessage() {
        if (checkPermissions()) {
            Request request = Request.newStatusUpdateRequest(
                    Session.getActiveSession(), message,
                    new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            if (response.getError() == null)
                                Toast.makeText(MainActivity.this,
                                        "Status updated successfully",
                                        Toast.LENGTH_LONG).show();
                        }
                    });
            request.executeAsync();
        } else {
            requestPermissions();
        }
    }

    public boolean checkPermissions() {
        Session s = Session.getActiveSession();
        if (s != null) {
            return s.getPermissions().contains("publish_actions");
        } else
            return false;
    }

    public void requestPermissions() {
        Session s = Session.getActiveSession();
        if (s != null)
            s.requestNewPublishPermissions(new Session.NewPermissionsRequest(
                    this, PERMISSIONS));
    }

    @Override
    public void onResume() {
        super.onResume();
        uiHelper.onResume();
        buttonsEnabled(Session.getActiveSession().isOpened());
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

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

    @Override
    public void onSaveInstanceState(Bundle savedState) {
        super.onSaveInstanceState(savedState);
        uiHelper.onSaveInstanceState(savedState);
    }

}

【问题讨论】:

  • 这清楚地表明您的 keyhash 无效,您是否使用 debug.keystore 创建了您的 KeyHash?因为当您在调试模式下运行应用程序时,您必须使用 debug.keystore 创建 keyhash。
  • 开发keyhash: "C:\Program Files\Java\jdk1.7.0_55\bin\keytool.exe" -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | "C:\openssl\bin\openssl.exe" sha1 -binary | "C:\openssl\bin\openssl.exe" base64 "C:\Program Files\Java\jdk1.7.0_55\bin\keytool.exe" -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | "C:\openssl\bin\openssl.exe" sha1 -binary | "C:\openssl\bin\openssl.exe" base64 我从这个@ pratt 生成的
  • @PoonamKukreti 你使用的是 Windows 还是 Linux 或 mac?
  • 你必须创建一个签名的密钥库,它会给你一个签名的 MD5 和 SHA,你必须把这个 keyHash 放在你的 facebook 应用程序中(在 Facebook 开发者控制台上),然后它会工作,不要使用debug.keystore 用于 facebook twitter 集成,单独签名 keyStore 检查This
  • @BhavikMehta Ya bhavik,你是对的,但是当你的应用程序正在开发中,当你需要每次运行时,你需要 debug.keystore 的 keyhash,而 facebook 允许一次多个 keyhash。

标签: android eclipse facebook


【解决方案1】:

我通过复制作为异常出现的相同密钥哈希解决了这个问题,然后我将它添加到 Facebook。我以前也这样做过,但当时它不起作用。

【讨论】:

    【解决方案2】:

    如果您使用 Linux 操作系统,则需要在命令行工具上使用以下命令创建 keyhash。

    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 
    

    对于 Windows:

    keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%.android\debug.keystore | openssl sha1 -binary | openssl base64
    

    它会要求你输入密码,所以只需输入“android”,它就会返回你的 debug.keystore 的 keyhash。然后只需将其复制并粘贴到您的 Facebook 开发者控制台。当你要发布你的应用程序时,意味着当你为你的应用程序创建构建作为一个签名的应用程序时,那时只需使用你的应用程序的密钥库并使用相同的命令,但只需将 debug.keystore 替换为你的密钥库名称、别名和密码。最重要的是,Facebook 允许多个 keyhash,所以当你进入 live 一个时不要删除调试 keyhash。让他们两个一直都在。

    【讨论】:

    • @PoonamKukreti 创建密钥哈希时,是否要求输入密码?还是直接创建keyhash?
    • Yes.password : android @pratt
    • @PoonamKukreti 嗯好的,我们可以在 gtalk 上进行协调吗?如果你不介意?
    • @pratt 好的,给我你的电子邮件 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2018-04-01
    相关资源
    最近更新 更多