2016-08-01 87 views
1

我正在使用Facebook登录集成到我的应用程序。我为已签名的APK配置了散列键Facebook,并成功运行。但有时当我释放一个新的APK文件时,散列键不再有效(“无效的密钥散列Facebook的android不匹配任何存储”)。已签名APK的Android Facebook哈希键有时会更改

我读下面这个链接,发现“此外,根据计算机的,有时键可以改变,如果是这样,哈希值发生变化,你就会有只适应该” android hash key

莫非你请帮我解释一下这方面的更多细节? 签名APK的散列键Facebook有时会更改吗?如何将应用上传到Play商店?

非常感谢。

+0

我面临同样的问题,之后我得到的哈希键的同时调试标志apk.that键为我工作。 – Vasant

+0

您需要在Facebook开发者控制台注册您的散列键,同时释放您的APK在发布模式! – Piyush

+0

在Facebook应用程序设置页面中,有一个选项可以添加多个哈希值...如果您使用的是android studio,您可以通过直接从右侧窗口中的gradle任务列表运行“signingReport”任务,轻松获得签名构建的哈希值。 ..感谢 –

回答

0

因为每台PC都有不同的debug.keystore文件,所以在切换PC时调试密钥散列会发生变化。当你使用release.keystore文件释放keyhash时,即使切换PC,也不会改变。在这种情况下,您正在使用相同的release.keystore文件。

+0

随着你的评论,这意味着如果我们只使用一个文件release.keystore,散列键从来没有改变,不是吗? –

+0

是的..它不会根据Facebook的开发者文档改变。 – LvN

+0

如果它正在更改,请确保您使用的是同一个文件,并且您添加到Facebook开发者控制台的keyhash是正确的。我建议你使用logcat进行keyhash,不要去命令行工具,因为它令人困惑。你可以使用@ user3793589的答案。生成已签名的apk并在您的设备上运行它,检查logcat并获得您的版本keyhash。 – LvN

0

每当您的应用程序正在开发中调试散列键用于facebook集成。调试哈希密钥是特定于计算机的(即,您正在其中工作的PC)

虽然释放哈希键与调试密钥(它不会更改)相比不同。当您为上传生成已签名的apk时,必须更新发布哈希键才能与您的应用进行Facebook集成。

阅读this关于如何创建Facebook的

释放散列键可以使用下面的代码检查你的密钥散列更好的理解:

// Add code to print out the key hash 
    try { 
     String PACKAGE_NAME=getApplicationContext().getPackageName();; 
     PackageInfo info = getPackageManager().getPackageInfo(
       PACKAGE_NAME, 
       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) { 

    }  
+0

感谢您的回复。正如我注意到的,我成功运行带签名APK的Facebook的哈希键,但有时当我生成新的APK文件进行测试时,哈希键不再有效。我只用了一台PC。随着你的评论,这意味着当我们生成一个新的APK文件时,哈希键可以改变,是不是? –

+0

@DinhThang你是否改变了包名?或项目名称? – Arshak

+0

@DinhThang我添加了代码,它将在运行您的应用程序时在logcat中显示您的keyhash。您可以将其与Facebook开发者控制台中存储的keyhash进行比较,如果不同,请添加keyhash。 – Arshak

0

您需要注册既是开发商hashkey (与您的计算机相关)以及Facebook上的生产hashkey(与签名版本相关)。 为了确保您有正确的钥匙,在你的代码运行此并复制输出:

try { 
     PackageInfo info = getPackageManager().getPackageInfo(
       "Your package name", 
       PackageManager.GET_SIGNATURES); 
     for (Signature signature : info.signatures) { 
      MessageDigest md = MessageDigest.getInstance("SHA"); 
      md.update(signature.toByteArray()); 
      System.out.println(Base64.encodeToString(md.digest(), Base64.DEFAULT)); 
      } 
    } catch (NameNotFoundException e) { 

    } catch (NoSuchAlgorithmException e) { 

    }