是否有可能在运行时可靠地检测安装了Android应用程序(Google Play或亚马逊市场)的商店?

时间:2013-10-25 14:44:46

标签: java android in-app-purchase google-play amazon

有许多类似的Stackoverflow问题。

所有人都有答案建议在getInstallerPackageName课程中使用PackageManager等方法。

所有人都有评论或相互矛盾的答案,说这不是一种可靠的方法,这表明可靠地检查安装给定App的商店的唯一方法是生成两个单独的二进制文件,每个二进制文件都设置了storeFlag,并将一个二进制文件上传到亚马逊,一个上传到Google Play。

我需要知道哪个商店是App的安装程序,以便我知道要与应用内购买功能进行通信的商店。

明确的 100%可靠方法是否会生成两个单独的二进制文件?或者是否有 100%可靠的基于代码的运行时方法?

1 个答案:

答案 0 :(得分:7)

两个二进制文件将是最强大的方法,但检查Build.MANUFACTURER和installerName应该让你非常接近(尽管如果用户在他们的安装程序上安装了旧版本的安装程序,则假设你想要检查Amazon AppStore非Kindle设备并且未更新installerName可能会报告null)

boolean isAmazonDevice = Build.MANUFACTURER.equalsIgnoreCase("amazon");

final Application application = getApplication();
String installerName = application.getPackageManager().getInstallerPackageName(application.getPackageName());
boolean fromAmazonStore = installerName != null && installerName.equalsIgnoreCase("com.amazon.venezia");

然后检查以下值:

isAmazonDevice || fromAmazonStore

应该在很长一段时间内为您提供所需的信息。

这可能会让人感到困惑的一个场景是,如果你正在加载你的apk进行测试 - 在这种情况下,它将没有正确的InstallerPackageName。您可以通过使用以下方式加载apk来伪造它:

adb install -i com.amazon.venezia APK_NAME