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

8

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

生成两个单独的二进制文件是一种100%可靠的方法吗?还是有一种100%可靠的基于代码的运行时方法?

有许多类似的Stackoverflow问题。所有答案都建议使用像PackageManager类上的getInstallerPackageName等方法。所有评论或冲突的答案也说这不是一个可靠的方法,建议唯一可靠的检查已安装给定应用商店的方法是生成两个不同的二进制文件,并将一个二进制文件上传到Amazon,另一个上传到Google Play。


你是否在使用两个独立的二进制文件时遇到了问题?这实际上只需要改变一行代码。 - Cruncher
考虑如何在同时拥有两个应用商店的设备上检测源商店?请记住,您可以在任何设备上安装亚马逊商店,因此您无法知道它来自哪里。 - Eluvatar
@Cruncher,我可以采用两个独立的二进制文件的方法,但是这是一个独特的设置,更喜欢使用单个二进制文件。 - Alfie Hanssen
@Eluvatar,如果在同一设备上安装了两个商店,我仍然需要知道哪个商店安装了应用程序,以便我可以与该商店通信进行IAP,不是吗? - Alfie Hanssen
是的,我会说如果你想要可靠性就使用单独的构建。我想你可以尝试弄清楚安装程序,但如果有人从另一个设备侧载应用程序(从apk导入)怎么办?在运行时要找出哪个商店会更好呢? - Eluvatar
明白了,这很有道理(我是从iOS转到Android,对Android还比较新)。你想发表这个答案的某个版本,以便我可以接受它吗? - Alfie Hanssen
1个回答

10

两个二进制文件是最强大的方法,但检查Build.MANUFACTURER和installerName应该可以让你接近(虽然假设您想检查Amazon AppStore是否已安装旧版安装程序并且未更新,installerName可能会报告空值)

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

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