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

Posted

技术标签:

【中文标题】如何知道应用程序是不是已从 Google Play 或 Amazon 下载?【英文标题】:How to know if an app has been downloaded from Google Play or Amazon?如何知道应用程序是否已从 Google Play 或 Amazon 下载? 【发布时间】:2012-06-19 18:53:31 【问题描述】:

有什么方法可以知道应用程序是从 Amazon App Store 还是 Google Play Store 下载的?当然,我的意思是在应用程序本身内。

我已经在这两个站点上部署了一个应用程序,我更想知道客户在应用程序中从哪里下载了它。我知道,我可以为每个服务部署不同的应用程序,但这会增加一些维护工作,如果有某种方法可以通过使用相同包的应用程序内的条件来解决它,则可以避免这些工作。

【问题讨论】:

为什么不在每个版本中都有一个变量来显示它的上传位置?或者有一个 OptionPane 作为用户... PackageManagergetInstallerPackageName() 会告诉你安装程序是什么。您必须进行实验以查看在不同情况下会返回什么。 @Fran 如果你做了实验,你想出了什么? @ashteele 我终于使用了另一种方法,基于 Eclipse 上的一个 android 库项目来处理常见的事情,以及针对每个市场使用该库的不同应用程序项目。 那么请把它作为答案。 【参考方案1】:

在代码中:

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();

“com.android.vending”告诉您它来自 Google Play 商店。我不确定亚马逊应用商店是什么,但使用上面的代码应该很容易测试。

通过亚行:

adb shell pm dump "PACKAGE_NAME" | grep "vending"

例子:

adb shell pm dump "com.android.chrome" | grep "vending"

installerPackageName=com.android.vending

【讨论】:

当附加到 Android Studio 调试器并直接构建到 Google Nexus 7 和 Kindle Fire HD 时,这会产生 installerPackageNamenull。当连接到调试器时,这是预期的吗?当它是 release.apk 时它会返回合法的字符串? 是和不是。 null 是当应用程序不是通过应用程序商店安装,或者安装应用程序商店没有设置该字段时。 Android Studio 使用的安装程序没有设置该字段,因此为空。 (对我来说,在“运行”选项卡DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.mypackage.myapp" 中看到)无论如何,Android Studio 几乎肯定不会将值设置为com.android.vending,但更有可能设置为com.android.studio 或其他东西。【参考方案2】:

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

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”是 Google Play 商店和 “com.amazon.venezia”是亚马逊应用商店, 侧载时为空

但结果可能不可靠,例如在 beta 测试期间,商店可能不会设置此值,此外还可以旁加载您的应用程序,指定安装程序的包名称,该名称可以解释为商店名称:

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK>

您可能需要考虑为不同的商店使用不同的应用程序 ID,例如 Google 的“com.example.yourapp”和亚马逊的“com.example.yourapp.amazon”——您可以在 Gradle 脚本中轻松设置它们.

【讨论】:

以上是关于如何知道应用程序是不是已从 Google Play 或 Amazon 下载?的主要内容,如果未能解决你的问题,请参考以下文章

此应用因违反 Google Play 开发者计划政策而从 Google Play 下架。 Android 应用拒绝

Google play 如何知道应用安装的国家/地区?

由于短信权限,Google Play 商店删除了我的应用

如何检查 Android 设备上是不是有可用的 Google Play 游戏帐户?

如何知道应用程序是从 google play 还是侧载安装的?

如何评估 Google Play 热门应用?