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

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

类似的 Stackoverflow 问题有很多。

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

所有人都有评论或相互矛盾的答案说这不是一种可靠的方法,建议可靠地检查哪个商店安装了给定应用程序的唯一方法是生成两个单独的二进制文件,每个二进制文件都有一个 storeFlag 设置并上传一个二进制文件到 Amazon,一个到 Google Play。

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

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

最佳答案

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

关于java - 是否可以在运行时可靠地检测哪个商店安装了 Android 应用程序(Google Play 或亚马逊市场)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19592927/

相关文章:

java - 如何根据特定时间删除 Firebase 数据库中的项目

java - 代号一 - 自动滚动屏幕

android - 分享 debug.keystore

java - Tomcat 和 Ajax 问题

java - 如何在 FXML 中使用预定义的 Spinner 样式类

Android 注释找不到 AndroidManifest.xml

android - Remoteview showNext() 和 showPrevious() 中的 ViewFlipper 不工作

android - 在Android中实现应用内购买退款

ios - JSON 解码器返回没有与 key CodingKeys 关联的值,例如 IAP 收据中的 "expires_date"

iphone - 如何在没有服务器的情况下使用iPhone自动续订