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

Jan*_*dec 4 android google-play

可能重复:
如何知道从谷歌播放或侧载加载应用程序?

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

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

Rag*_*ood 7

从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:

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

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

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

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

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

编辑3

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