有可能区分(在代码中)是通过播放还是手动安装apk?

时间:2012-11-15 13:41:57

标签: android google-play

  

可能重复:
  How to know an application is installed from google play or side-load?

我们有一个可在多个移动平台之间移植的应用程序。它提供了自己的更新机制,可以获取应用程序使用的相当大的数据。现在这个机制也可以下载应用程序的更新版本。如果用户手动安装.apk,我们希望通过这种机制向他们发送新版本,但如果他们从Android市场(或任何其他市场)安装它,市场应用程序将负责升级并自己完成会与之发生冲突。

那么是否可以从应用程序中检测应用程序是否是通过市场安装的?

1 个答案:

答案 0 :(得分:7)

从Google Play安装后,您将在安装过程中收到com.android.vending.INSTALL_REFERRER广播。简单地create a broadcast receiver为此,并在SharedPreferences中沿着fromGooglePlay的行设置一个布尔值,您可以在接收器中将其设置为true。

但是,我不认为你可以为亚马逊的其他应用程序商店提供类似的接收器。

编辑1:

正如@zapl在评论中所指出的,这不适用于Android 3.0及更高版本,因为至少没有启动一次的应用程序没有资格接收广播等。

但是,您可以尝试其他解决方案:

在你的app中,在某处有一个常量布尔值,类似于GOOGLE_PLAY_BUILD。在为Google Play构建apk时,请将其设置为true,并在构建用于手动分发的apk时,将其设置为false。然后只需在运行时检查它的值,并采取相应的行动。

编辑2:

为了解决您对分发应用的根设备的担忧,这里有一个更复杂的系统。

每个设备都有一个唯一的ANDROID_ID(虽然显然4.2上的多用户有多个用户,尽管文档说的是这样)。基本上你只需要一个唯一的设备ID,所以即使是MAC地址也可以。

在网络服务器上设置一个表格,用于存储唯一ID,无论您是否收到Google Play广播以及Google Play旗帜的价值。当应用程序首次启动时,请将该设备的这些详细信息添加到表中。

此后启动应用程序时,只需检查所有三个细节是否与本地存储的副本匹配。如果用户从root用户获取应用并安装它,则Google Play标记似乎匹配,但安装引荐部分不会。遗憾的是,这只适用于预蜂窝设备。

或者在基于稍微信任的系统中,您只需询问用户是手动安装还是从Google Play安装。如果你提到它是为了选择更新方法,而不是起诉他们从谷歌外部安装它,我觉得他们会很乐意说实话。

编辑3

正如@Jan在评论中指出的那样,PackageManager中似乎有一个getInstallerPackageName()方法可以用于此目的。