可以PackageManager.getInstallerPackageName()告诉我,我的应用

2019-07-03 15:57发布

我计划发布我在亚马逊应用商店的应用程序,以及谷歌播放,并在我的应用程序的一些事情,需要根据应用程序是否是从亚马逊的应用程序商店或安装不表现略有不同。 如果我理解PackageManager.getInstallerPackageName(String packageName)正确的方法,它告诉我,我的安装应用程序的应用程序的名称。 对? 如果是这样,没有人知道这个方法返回的值会是什么,如果我的应用亚马逊应用商店安装? 如果没有,有没有人知道任何其他方法我可以使用,以确定我的应用程序是否从亚马逊应用商店安装?

注:我知道这已经回答了影射的使用堆栈溢出的其他问题PackageManager.getInstallerPackageName(String packageName)来确定安装我的应用程序的应用程序的名称。 然而,搜索堆栈溢出和其他地方,我一直没能确定返回的是什么PackageManager.getInstallerPackageName(String packageName)将在应用从亚马逊应用商店安装的情况。

Answer 1:

由于三星一直没有实现PackageManager.getInstallerPackageName(),它仍然返回null。 所以使用PackageManager.getInstalledPackages()来获取所有的包和搜索samsungapp软件包名“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



Answer 2:

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

旧版本的应用仍然会返回null ,而我并没有实际验证API还是安装新的商店,然后再升级较旧的应用程序将设置安装程序。 但是,安装新的应用程序和检查/data/system/packages.xml指示installer是否设置正确。



Answer 3:

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

  • null ,如果应用程序是从亚马逊应用商店安装
  • null ,如果应用程序是直接安装任何应用程序商店的外面。
  • com.android.vending如果应用程序是从谷歌播放安装。

(感谢@CommonsWare用于指针。)



Answer 4:

您正在试图确定是否自己的应用程序已经从亚马逊商店安装的,所以下面属于这种情况。 不过既然你问的问题一切都变了,所以这个答案是有效的2016年,当它被张贴,未在2012年。

如上报道,应用了约2013年返回NULL从getInstallerPackageName()中时方法通过安装应用程序的包名之前发布的亚马逊安装的版本安装。 但是,这一次后,他们开始回归“com.amazon.venezia”这样的电话。 而近日,亚马逊地下应用可分配第二安装程序包的名称,com.amazon.mshop.android。

所以,这不是一个完全可靠的指标,如果你认为你可能会遇到的那些旧版本在野外安装的,因为这仅仅是侧载应用程序(从APK安装在本地存储中保存的)通常还将从getInstallerPackageName返回null( )当调用该方法对于它的包,并因此将是从由那些年长亚马逊商店的应用程序之一安装的应用难以区分。

如果,尽管这个问题,你想用这个方法,但想避免漏报对于具有标志安装程序为空旧版本的安装设备,你可以尝试以下操作:

  • 测试getInstallerPackageName(),看看它是否非空。

  • 如果非空,然后只是测试,看它是否与com.amazon开始,你可以认为它是从亚马逊安装,如果是的话,你可以相信,如果没有它不是从亚马逊安装。

  • 但如果为null,通过做每包遍历设备上,喂(遇到getInstallerPackageName每个包的名字),看看是否有连一个一个以“com.amazon”启动额外的测试。

    • 如果没有问题与值,那么你的空值是模糊的,你应该考虑的是你没有任何信息的一种方式或其他有关您的应用程序是否从亚马逊商店安装的(相对于侧装)。

    • 但是,如果有,即使具有安装程序包值的单个应用程序,那么你可以假设你的应用程序不是从亚马逊商店安装的,因为它是一个安全的赌注,设备运行一个版本的亚马逊商店标签安装的应用程序使用安装程序包名称以“com.amazon”,因为至少一个应用其他比你的实际标签这种方式-这是不可能以任何其他方式发生。 这意味着你的应用程序中的空值不是由亚马逊安装程序创建的,而是通过一些其他的安装程序-并且很可能就意味着你的应用程序是侧装从APK的本地副本。



文章来源: Can PackageManager.getInstallerPackageName() tell me that my app was installed from Amazon app store?