Java 如何知道应用程序是否已从Google Play或Amazon下载?

Java 如何知道应用程序是否已从Google Play或Amazon下载?,java,android,google-play,amazon-appstore,Java,Android,Google Play,Amazon Appstore,有没有办法知道应用程序是从亚马逊应用商店还是谷歌游戏商店下载的?当然,我是指应用程序本身 我在这两个网站上都部署了一个应用程序,我很想知道客户是从哪里下载的。我知道,我可以将不同的应用程序部署到每个服务,但这会增加一些维护工作,如果有某种方式可以解决这些问题,只需在应用程序中使用相同的软件包,就可以避免。在代码中: final PackageManager packageManager = getPackageManager(); try { final ApplicationInfo

有没有办法知道应用程序是从亚马逊应用商店还是谷歌游戏商店下载的?当然,我是指应用程序本身


我在这两个网站上都部署了一个应用程序,我很想知道客户是从哪里下载的。我知道,我可以将不同的应用程序部署到每个服务,但这会增加一些维护工作,如果有某种方式可以解决这些问题,只需在应用程序中使用相同的软件包,就可以避免。

在代码中:

final PackageManager packageManager = getPackageManager();

try {
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) {
        // App was installed by Play Store
    }
} catch (final NameNotFoundException e) {
    e.printStackTrace();
}
adb shell pm dump "PACKAGE_NAME" | grep "vending"
“com.android.vending”告诉你它来自谷歌Play商店。我不确定AmazonAppStore是什么,但是使用上面的代码应该很容易测试

通过亚洲开发银行:

final PackageManager packageManager = getPackageManager();

try {
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) {
        // App was installed by Play Store
    }
} catch (final NameNotFoundException e) {
    e.printStackTrace();
}
adb shell pm dump "PACKAGE_NAME" | grep "vending"
例如:


而在大多数情况下,您可以通过包含类似以下内容的检查来获取门店名称:

final PackageManager packageManager = getPackageManager();

try {
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) {
        // App was installed by Play Store
    }  else if ("com.amazon.venezia".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) {
        // App was installed by Amazon Appstore
    } else {
        // App was installed from somewhere else
    }
} catch (final NameNotFoundException e) {
    e.printStackTrace();
}
“com.android.vending”是谷歌Play商店和
“com.amazon.venezia”是亚马逊应用商店,
当它被侧向加载时为null

但是,结果可能不可靠,例如,在beta测试期间,商店可能未设置此值,此外,还可能通过指定安装程序的包名(可解释为商店名)来侧向加载应用程序:

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK>
adb安装-i

你可能想考虑对不同的商店有不同的应用程序ID,例如谷歌的“COM.Simult.YouApp”和“Amaz.Cupp.YouApp.Amazon”的Amazon,你可以很容易地将这些设置在你的GooLL脚本中。或者使用选项窗格作为用户…

PackageManager
getInstallerPackageName()
将告诉您安装程序是什么。你必须进行实验,看看在不同的场景下会得到什么结果。@Fran如果你进行了实验,你想到了什么?@ashteele我最终使用了另一种方法,基于Eclipse上的一个Android库项目,针对常见的东西,每个市场都有不同的应用程序项目使用该库。那么请把它作为一个答案。当连接到Android Studio调试器并直接构建到Google Nexus 7和Kindle Fire HD时,这会产生一个
installerPackageName
null
。连接到调试器时是否会出现这种情况?当它是一个版本时,它将返回合法字符串。apk?是和否。如果应用程序未通过应用商店安装,或者安装应用商店未设置字段,则应为
null
。Android Studio使用的安装程序未设置该字段,因此为空。(对我来说,正如在“运行”选项卡
设备外壳命令:pm install-r”/data/local/tmp/com.mypackage.myapp“
)中看到的,在任何情况下,Android Studio几乎肯定不会将值设置为
com.Android.vending
,但更可能是
com.Android.Studio
或其他什么。