Android 检查是否安装了付费应用程序

Android 检查是否安装了付费应用程序,android,eclipse,Android,Eclipse,我创建了一个android应用程序,还有一个付费密钥应用程序,可以在常规应用程序中打开一些功能。 我尝试使用此代码检查是否安装了付费密钥: protected static boolean isProInstalled(Context context) { PackageManager manager = context.getPackageManager(); if (manager.checkSignatures(context.getPackageName(), "com.

我创建了一个android应用程序,还有一个付费密钥应用程序,可以在常规应用程序中打开一些功能。 我尝试使用此代码检查是否安装了付费密钥:

protected static boolean isProInstalled(Context context) {
    PackageManager manager = context.getPackageManager();
    if (manager.checkSignatures(context.getPackageName(), "com.myapps.appkey")
        == PackageManager.SIGNATURE_MATCH) {
        //Pro key installed, and signatures match
        return true;
    }
    return false;
}
当我安装从Eclipse导出的两个APK时,它在我的手机上工作(我想我导出了它们。可能是直接用“run”/“debug”实现的。我不记得了)。但是当我把它们上传到Google Play时,我收到了一个用户的消息,说他买了钥匙,但这些功能仍然被屏蔽。
我做错什么了吗?那些签名到底是什么?导出APK时,它是否与别名和密钥库有任何关系?

调试密钥是从IDE运行时使用的默认密钥,因此在测试时,它们都使用相同的密钥。但是您使用不同的存储密钥为它们签名,因此签名不匹配


正如@NobuGames在评论中提到的,既然你已经发布了这两个应用程序,那么你可以使用硬编码字符串更新免费应用程序以检查付费应用程序的密钥散列。从理论上讲,这可能会使某些人更容易为你的应用程序制作一个高级解锁盗版版本,尽管如果他们深入到你的源代码中,我怀疑他们无论如何都会成功。想想看,这是一个很好的问题(足够受欢迎的应用程序,让海盗花那么多时间在你的应用程序上进行黑客攻击)

您是否使用不同的密钥为这两个应用程序签名?您是否使用应用程序的实际发布版本在手机上进行了测试,或者在哪里运行调试版本(默认情况下使用
debug.keystore
签名)?我使用了不同的keystore/别名/密码。我应该使用相同的密钥库吗?默认的debug.keystore是什么?我想当我在手机上安装时,我导出了两个APK,并将它们移动到手机上安装。我试了很多次,可能是使用了debug选项……debug键是从IDE运行时使用的默认键,所以在测试时,它们都使用相同的键。但是您使用不同的存储密钥为它们签名,因此签名不匹配。此时,您唯一能做的就是取消发布两个应用中的一个,并使用不同的软件包名称和与您留下的相同的密钥重新发布。除了Tenfour04所说的:您还可以通过使用软件包管理器检查是否安装了付费版本来解决此问题,读取其签名散列,并将其与付费应用程序签名的硬编码散列值进行比较(您可以通过向打印散列代码的付费版本临时添加一些调试输出来检索散列值;使用正确的密钥构建并签名该应用程序,然后运行它来检索值)。见@Tenfour04-谢谢!成功了!你能把它作为答案发表吗?