代码之家  ›  专栏  ›  技术社区  ›  Alfie Hanssen

是否有可能在运行时可靠地检测哪个商店安装了Android应用程序(Google Play或Amazon Market)?

  •  8
  • Alfie Hanssen  · 技术社区  · 13 年前

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

    是决定性的吗 100%可靠 生成两个独立二进制文件的方法?或者有没有 100%可靠 基于代码的运行时方法?

    还有许多类似的堆栈溢出问题。所有人都有建议使用以下方法的答案 getInstallerPackageName 上 PackageManager 班所有人都有评论或相互矛盾的回答,认为这不是一种可靠的方法,这表明可靠检查指定应用程序安装的存储的唯一方法是生成两个单独的二进制文件,每个二进制文件都有一个 storeFlag 设置,并将一个二进制文件上传到亚马逊,将一个上传到谷歌播放。

    1 回复  |  直到 13 年前
        1
  •  10
  •   Offbeatmammal    12 年前

    两个二进制文件将是最稳健的方法,但检查Build.MANUFACTURER和installerName应该会让你非常接近(尽管假设你想检查亚马逊应用商店,如果用户在他们的非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