PackageManager.getInstallerPackageName()能告诉我我的应用是从亚马逊应用商店安装的吗?

时间:2012-11-08 13:24:58

标签: android amazon google-play android-package-managers amazon-appstore

我计划在亚马逊应用商店和Google Play上发布我的应用,并且在我的应用中有些东西需要根据应用是否是从亚马逊应用商店安装而略有不同。如果我正确理解PackageManager.getInstallerPackageName(String packageName)方法,它会告诉我安装我的应用程序的应用程序的名称。对?如果是这样,如果我的应用程序从亚马逊应用商店安装,有没有人知道此方法返回的值是多少?如果没有,有没有人知道我可以用来确定我的应用程序是否是从亚马逊应用程序商店安装的任何其他方法?

  

注意:我知道有关Stack Overflow的其他问题已被回答暗示   PackageManager.getInstallerPackageName(String packageName)来   确定安装我的应用程序的应用程序的名称。然而,   搜索Stack Overflow和其他地方,我无法做到   确定返回的是什么   PackageManager.getInstallerPackageName(String packageName)会在   该应用程序是从亚马逊应用程序商店安装的。

4 个答案:

答案 0 :(得分:18)

由于三星没有实现PackageManager.getInstallerPackageName(),它仍然返回null。因此,使用PackageManager.getInstalledPackages()获取所有包并搜索samsungapp packagename" com.sec.android.app.samsungapps"。

商户:

null - developer
com.android.vending - google play
com.amazon.venezia - amazon app
com.sec.android.app.samsungapps - samsung app store

代码:

// lets start with google play store link
String link = "https://play.google.com/store/apps/details?id=com.hellothupten.capital2countryquiz";

//find out the installer for your app package name.
String installer = getPackageManager().getInstallerPackageName(
        "com.hellothupten.capital2countryquiz");

if (installer == null) {
    List<PackageInfo> installedPackages = getPackageManager()
            .getInstalledPackages(PackageManager.GET_ACTIVITIES);
    for (PackageInfo p : installedPackages) {
        if (p.packageName.contains("samsungapps")) {
            // change to samsung app store link
            link = "http://apps.samsung.com/mars/topApps/topAppsDetail.as?productId=000000840239";
            break;
        }
    }
} else if (installer.contains("amazon")) {
    // change to amazon app store link
    link = "amzn://apps/android?p=com.hellothupten.capital2countryquiz";
} else if (installer.contains("samsung")) {
    // change to samsung app store link. This does not
    // exist..but who knows samsung may implement
    // getInstallerPackageName in future, I assume it will
    // contain a word samsung in its package name.
    link = "http://apps.samsung.com/mars/topApps/topAppsDetail.as?productId=000000840239";

}

使用链接变量作为商店链接。

<强>更新

samsungapps://ProductDetail/com.sec.chaton

三星:http://developer.samsung.com/android/technical-docs/Samsung-Apps-Deeplink-Guide

答案 1 :(得分:11)

好消息! Apparently最新版本的亚马逊商店最终将PackageManager.getInstallerPackageName()设置为"com.amazon.venezia",与Google Play的"com.android.vending"形成鲜明对比。

较旧的应用仍然会返回null,我实际上并未验证API,或者是否安装新商店然后升级旧应用将设置安装程序。但是,安装新应用并检查/data/system/packages.xml表示installer已正确设置。

答案 2 :(得分:7)

调用PackageManager.getInstallerPackageName(myPackageName),其中myPackageName是包的名称(您要为其确定安装程序的应用),提供以下值:

  • null如果该应用是从亚马逊应用商店安装的
  • null如果应用已在任何应用商店之外直接安装
  • com.android.vending如果该应用是从Google Play安装的。

(感谢@CommonsWare指针。)

答案 3 :(得分:5)

您正在尝试确定您自己的应用是否已从亚马逊商店安装,因此以下内容适用于该情况。但是自从您提出这个问题后情况发生了变化,所以这个答案在2016年发布时有效,而非2012年。

如上所述,在大约2013年中期之前发布的Amazon安装程序版本安装的应用程序在从该方法传递已安装应用程序的软件包名称时,会从getInstallerPackageName()返回null。但在那之后他们开始回归&#34; com.amazon.venezia&#34;这样的电话。最近,Amazon Underground应用程序可能会分配第二个安装程序包名称com.amazon.mshop.android。

因此,如果您认为可能会在野外遇到旧版本的安装程序,这不是一个完全可靠的指标,因为只是侧载的应用程序(从本地存储中保存的APK安装)通常也会返回null来自getInstallerPackageName()的方法为其包调用该方法时,因此将与其中一个旧的亚马逊商店应用程序安装的应用程序无法区分。

如果尽管存在此问题,您仍希望使用此方法,但希望避免使用旧安装程序版本将安装程序标记为null的设备的错误否定,则可以尝试以下操作:

  • 测试getInstallerPackageName()以查看它是否为非null。

  • 如果非null,那么只需测试它是否以com.amazon开头,你可以相信它是从亚马逊安装的,如果确实如此,你可以相信它不是从亚马逊安装的它不是。

  • 但是如果为null,则通过遍历设备上的每个包进行额外的测试,将遇到的每个包名称提供给getInstallerPackageName(),以查看是否有一个以&#34; com.amazon&#34;

    • 如果没有该值,那么您的空值是不明确的,您应该考虑到您的应用是否是从亚马逊商店安装的任何方式都没有任何信息(相反)侧载)。

    • 但是,如果甚至只有一个应用程序具有该安装程序包值,那么您可以假设您的应用程序是而不是从亚马逊商店安装,因为可以肯定的是设备正在运行亚马逊商店的一个版本,该商店使用以#34; com.amazon&#34;开头的安装程序包名称标记已安装的应用程序,因为至少有一个应用程序非实际标记那种方式 - 非常不太可能以任何其他方式发生。这意味着你的应用程序的空值是由亚马逊安装程序创建的而不是,而是由其他一些安装程序创建的 - 而且很可能意味着你的应用程序是侧面的从您的APK的本地副本加载。