8

有许多类似的 Stackoverflow 问题。

所有人都有建议使用课堂getInstallerPackageName上的方法的答案PackageManager

所有人也有评论或相互矛盾的答案说这不是一种可靠的方法,这表明可靠地检查哪个商店安装了给定应用程序的唯一方法是生成两个单独的二进制文件,每个都有一个storeFlag集合,然后将一个二进制文件上传到亚马逊,一个到谷歌播放。

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

生成两个单独的二进制文件是确定的100% 可靠的方法吗?还是有100% 可靠的基于代码的运行时方法?

4

1 回答 1

10

两个二进制文件将是最强大的方法,但同时检查 Build.MANUFACTURER 和 installerName 应该可以让你非常接近(尽管假设如果用户在他们的非 Kindle 上安装了旧版本的安装程序,你想检查 Amazon AppStore设备且未更新 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
于 2013-10-28T19:50:08.830 回答