如何在运行时确定应用程序是通过 amazon appstore 还是 Google play 安装的

Posted

技术标签:

【中文标题】如何在运行时确定应用程序是通过 amazon appstore 还是 Google play 安装的【英文标题】:How to determine at runtime if app is installed via amazon appstore or Google play 【发布时间】:2013-01-03 01:09:19 【问题描述】:

在运行时确定应用是通过 Amazon android Appstore 还是 Google play 安装的推荐最佳做法是什么?我想避免为我的应用可用的每个应用商店生成单独的 APK。

我的首选方法是使用 PackageManger.getInstallerPackageName。

根据 Android API 文档,这正是我正在寻找的内容: 检索安装包的应用程序的包名。这可以确定包裹来自哪个市场。

不幸的是,通过 Amazon Appstore(包括 KF)安装的应用程序似乎返回 null,这只有在用户手动安装 APK 时才会出现。

如果有其他方法可以让我知道吗?

【问题讨论】:

【参考方案1】:

除了返回 null 的问题外,getInstallerPackageName() 还可以被篡改并返回不准确的信息。

我已经研究了很长时间,我能想到的最佳解决方案是拥有一个包含该信息的常量文件:

public class Constants 

    public static final int GOOGLE_PLAY = 0;
    public static final int AMAZON = 1;
    public static final int BUILT_FOR = GOOGLE_PLAY;

只需在此文件中使用AMAZON 而不是GOOGLE_PLAY 并为每个应用商店构建一次apk。

您可以在代码中的其他地方使用以下命令进行检查:

if(Constants.BUILT_FOR == Constants.GOOGLE_PLAY) 
    //Google Play build


if(Constants.BUILT_FOR == Constants.AMAZON) 
    //Amazon Build

【讨论】:

怎么可能被篡改?可以在此处找到类似的问题:***.com/questions/12593621 并提到 setInstallerPackageName 可能导致安全异常。 这并没有真正回答问题,问题是在没有 2 个 apk 的情况下这样做。 @mbonnin 如今,Gradle 无需重复即可实现这一目标。但是,您仍然需要上传单独的 apk @RaghavSood 不确定您所说的“重复”是什么意思。拥有 2 个不同的 apk 很麻烦。显然亚马逊开始支持getInstallerPackageName,所以可能值得再试一次:***.com/questions/13289748/…

以上是关于如何在运行时确定应用程序是通过 amazon appstore 还是 Google play 安装的的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon ec2 上运行 seed.rb 文件

如何在 Amazon Kinesis 服务上部署和运行 Amazon Kinesis 应用程序

如何在运行时确定应用程序是为内部测试人员还是外部测试人员分发?

在 Amazon ECS 上的 Docker 中运行节点 API 的最佳方式是啥?

Amazon ELB 上的 Laravel 4:未定义属性:$attributes

如何查找未使用的 Amazon EC2 安全组