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

Adi*_*ain 18 android amazon android-package-managers amazon-appstore google-play

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

注意:我知道有关Stack Overflow的其他问题已被回答,这些问题暗指 PackageManager.getInstallerPackageName(String packageName)用于确定安装我的应用程序的应用程序的名称.但是,搜索Stack Overflow和其他地方,我无法确定从Amazon应用商店安装应用程序时返回 的PackageManager.getInstallerPackageName(String packageName).

Thu*_*ten 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
Run Code Online (Sandbox Code Playgroud)

码:

// 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";

}
Run Code Online (Sandbox Code Playgroud)

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

更新:

samsungapps://ProductDetail/com.sec.chaton
Run Code Online (Sandbox Code Playgroud)

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


mtt*_*lns 11

好消息!显然,亚马逊商店的最新版本终于将PackageManager.getInstallerPackageName()"com.amazon.venezia"与谷歌Play的对比"com.android.vending".

较旧的应用程序仍将返回null,我实际上没有验证API或是否安装新的Store然后升级旧的应用程序将设置安装程序.但是正确设置了安装新应用程序和检查/data/system/packages.xml指示installer.


Adi*_*ain 7

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

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

(感谢@CommonsWare指针.)

  • 亚马逊或任何应用商店为getInstallerPackageName返回null的明显事实似乎是他们的完全失败.考虑到用户可以在同一设备上同时安装Google Play和Amazon或其他商店,这似乎是区分应用内购买位置或商店内应用链接的唯一方法.假设您不想生成多个apks. (2认同)

Car*_*arl 5

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

如上所述,当该方法传递已安装应用程序的软件包名称时,2013年中左右发布的Amazon安装程序版本安装的应用程序将从getInstallerPackageName()返回null.但在那段时间之后,他们开始返回"com.amazon.venezia"进行此类通话.最近,Amazon Underground应用程序可能会分配第二个安装程序包名称com.amazon.mshop.android.

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

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

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

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

  • 但是如果为null,则通过迭代设备上的每个包来执行额外的测试,将遇到的每个包名称提供给getInstallerPackageName(),以查看是否存在以"com.amazon"开头的单个包.

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

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