我们有一个可在多个移动平台之间移植的应用程序。它提供了自己的更新机制,用于获取应用程序使用的相当大的数据。现在这种机制还可以下载应用程序的更新版本。如果用户手动安装了 .apk,我们希望通过这种机制向他们发送新版本,但如果他们从 android 市场(或任何其他市场)安装它,市场应用程序将负责升级并自行完成会与之冲突。
那么是否可以从应用程序内部检测该应用程序是否是通过市场安装的?
我们有一个可在多个移动平台之间移植的应用程序。它提供了自己的更新机制,用于获取应用程序使用的相当大的数据。现在这种机制还可以下载应用程序的更新版本。如果用户手动安装了 .apk,我们希望通过这种机制向他们发送新版本,但如果他们从 android 市场(或任何其他市场)安装它,市场应用程序将负责升级并自行完成会与之冲突。
那么是否可以从应用程序内部检测该应用程序是否是通过市场安装的?
从 Google Play 安装时,您将com.android.vending.INSTALL_REFERRER
在安装过程中收到广播。只需为此创建一个广播接收器SharedPreferences
,并在您的行中有一个布尔值,fromGooglePlay
您可以在接收器中将其设置为 true。
但是,我认为您无法为其他应用商店(如亚马逊)提供类似的接收器。
编辑1:
正如@zapl 在评论中指出的那样,这不适用于 Android 3.0 及更高版本,因为至少没有启动一次的应用程序没有资格接收广播等。
但是,您可以尝试另一种解决方案:
在您的应用程序中,在某处有一个常量布尔值,例如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 安装的。如果您提到它是选择更新方法,而不是起诉他们从 Google Play 外部安装它,我感觉他们会很乐意说实话。
编辑 3
正如@Jan 在评论中指出的那样,PackageManager 中似乎有一个getInstallerPackageName()方法可用于此目的。