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

2w3rbyxf  于 2023-02-17  发布在  Android
关注(0)|答案(4)|浏览(256)

我计划在Amazon应用商店和Google Play上发布我的应用,并且我的应用中的一些内容需要根据应用是否从Amazon应用商店安装而略有不同。如果我正确理解了PackageManager.getInstallerPackageName(String packageName)方法,它会告诉我安装我的应用的应用名称。对吗?如果是,如果我的应用程序是从Amazon应用程序商店安装的,那么有没有人知道这个方法返回的值是什么?如果没有,有没有人知道我可以使用其他方法来确定我的应用程序是否是从Amazon应用程序商店安装的?

**注:**我知道Stack Overflow上的其他问题,这些问题的答案暗示使用PackageManager.getInstallerPackageName(String packageName)来确定安装我的应用程序的应用程序名称。但是,在搜索Stack Overflow和其他地方时,我无法确定如果应用程序是从Amazon应用程序商店安装的,PackageManager.getInstallerPackageName(String packageName)返回的 value 是什么。

uwopmtnx

uwopmtnx1#

由于三星没有实现PackageManager. getInstallerPackageName(),所以它仍然返回null,所以使用PackageManager. getInstalledPackages()获取所有软件包,并搜索三星应用程序软件包名称"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";

}

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

    • 更新日期:**
samsungapps://ProductDetail/com.sec.chaton

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

oxcyiej7

oxcyiej72#

好消息!亚马逊商店的最新版本Apparently终于将PackageManager.getInstallerPackageName()设置为"com.amazon.venezia",以与Google Play的"com.android.vending"形成对比。
旧版应用仍然会返回null,我还没有实际验证API,也没有验证安装新应用商店然后升级旧版应用是否会设置安装程序。但安装新应用并检查/data/system/packages.xml表明installer设置正确。

gz5pxeao

gz5pxeao3#

调用PackageManager.getInstallerPackageName(myPackageName),其中myPackageName是包的名称(您希望确定其安装程序的应用的名称),可获得以下值:

  • null(如果应用程序是从Amazon应用程序商店安装的
  • null(如果应用是在任何应用商店之外 * 直接 * 安装的)。
  • com.android.vending(如果应用是从Google Play安装的)。

(谢谢@CommonsWare的指点。)

pw136qt2

pw136qt24#

您正在尝试确定您自己的应用程序是否已从Amazon商店安装,因此以下内容适用于该情况。但自从您提出这个问题后,情况发生了变化,所以这个答案在发布时的2016年有效,而不是2012年。
如前所述,在2013年中期之前发布的亚马逊安装程序版本中,当getInstallerPackageName()方法被传递已安装应用的软件包名称时,该方法会返回null。但在那之后,他们开始为此类调用返回“com.amazon.venezia”。最近,亚马逊地下应用可能会分配第二个安装程序软件包名称com.amazon.mshop.android。
因此,如果您认为自己可能会遇到这些旧版本的安装程序,这并不是一个完全可靠的指标,因为简单的侧载应用(从本地存储中的APK安装)在针对其软件包调用getInstallerPackageName()方法时,通常也会从该方法返回null,因此无法与这些旧版亚马逊商店应用之一安装的应用区分开来。
尽管存在此问题,但如果您仍希望使用此方法,但又希望避免对具有较旧安装程序版本的设备产生将安装程序标记为空的误报,则可以尝试以下操作:

  • 测试getInstallerPackageName()以查看它是否为非空值。
  • 如果非空,则只需测试它是否以www.example.com开头com.amazon,如果是,则可以认为它是从Amazon安装的,如果不是,则可以认为它不是从Amazon安装的。
  • 但如果为null,则通过迭代设备上的每个包来执行额外的测试,将遇到的每个包名称提供给getInstallerPackageName(),查看是否有一个以“www.example.com“开头的包com.amazon。
  • 如果该值不存在,则您的空值是不明确的,您应该考虑到您没有任何关于您的应用是否从Amazon商店安装(而不是侧载)的信息。
  • 但是,如果有一个应用程序具有该安装程序包值,那么你可以假设你的应用程序是 * 不是 * 从亚马逊商店安装的,因为可以肯定的是,该设备运行的是亚马逊商店的一个版本,该版本用以“www.example.com“开头的安装程序包名称标记已安装的应用程序com.amazon,考虑到至少有一个应用程序是以这种方式被标记的--这种情况以其他方式发生的可能性是非常小的。这意味着,你的应用程序的空值不是亚马逊安装程序创建的,而是由其他安装程序加载-很可能这意味着您的应用是从APK的本地副本侧加载的。

相关问题