如何在运行时确定应用程序是通过亚马逊应用商店还是谷歌Play安装的?

3
什么是在运行时确定应用程序是否通过亚马逊安卓应用商店或Google Play安装的推荐最佳实践?我希望避免为我在每个应用商店中提供的应用生成单独的APK文件。
我的首选方法是使用PackageManager.getInstallerPackageName。
根据Android API文档,这正是我要找的内容:检索安装了包的应用程序的软件包名称。这标识了包来自哪个市场。
不幸的是,似乎通过Amazon Appstore(包括KF)安装的应用程序返回null,这只有在用户手动安装APK时才会出现。
请问是否有其他方法可以做到这一点。
1个回答

4
除了返回 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
}

它如何被篡改?类似的问题可以在这里找到:https://dev59.com/KWjWa4cB1Zd3GeqPu94U,其中提到setInstallerPackageName可能会导致安全异常。 - giannileuani
那并没有真正回答问题,问题是如何在没有两个apk的情况下完成这个操作。 - mbonnin
@mbonnin 这可以通过现在的Gradle实现而不需要重复。但是你仍然需要上传单独的APK文件。 - Raghav Sood
@RaghavSood 不确定您的“duplication”意思。拥有2个不同的apk很麻烦。显然,亚马逊开始支持getInstallerPackageName,所以再试一次可能值得尝试:https://dev59.com/TWYr5IYBdhLWcg3w7eXb - mbonnin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接