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

Posted

技术标签:

【中文标题】是否可以在运行时可靠地检测到哪个商店安装了 Android 应用程序(Google Play 或亚马逊市场)?【英文标题】:Is it possible to reliably detect at runtime which store installed an Android App (Google Play or Amazon Market)? 【发布时间】:2013-11-04 18:05:36 【问题描述】:

有很多类似的 *** 问题。

所有答案都建议在PackageManager 类上使用getInstallerPackageName 之类的方法。

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

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

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

【问题讨论】:

您对使用两个单独的二进制文件有疑问吗?这实际上是更改单行代码的问题。 考虑如何在设备上同时检测源存储?请记住,您可以在任何设备上安装亚马逊商店,因此您无法知道它来自哪里。 @Cruncher,我可以采用两个单独的二进制文件方法,但这是一种独特的设置,首选单个二进制文件。 @Eluvatar,如果在同一台设备上安装了两个商店,我仍然需要知道哪个商店安装了该应用程序,以便我可以与该商店进行 IAP 通信,不是吗? 是的,你会的,我会说如果你想要一些可靠的东西使用单独的构建,我想你可以尝试找出安装程序,但是如果有人加载应用程序怎么办(从另一个设备)?那么如果你想在运行时找出它,你会使用什么商店呢? 【参考方案1】:

两个二进制文件将是最强大的方法,但同时检查 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

【讨论】:

以上是关于是否可以在运行时可靠地检测到哪个商店安装了 Android 应用程序(Google Play 或亚马逊市场)?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测当前运行的应用程序是不是是从应用商店安装的?

如何可靠地检测 iOS 9 上是不是连接了外部键盘?

MD5、SHA1、CRC32这三个用于检测文件是不是被修改过,哪个可靠性最高?

提交到应用商店时我应该使用哪个证书

可靠地检测基于 PhantomJS 的垃圾邮件机器人

在android中检测主页按钮按下