Может ли PackageManager.getInstallerPackageName() сообщить мне, что мое приложение было установлено из магазина приложений Amazon?

Я планирую опубликовать свое приложение в магазине приложений Amazon, а также в Google Play, и в моем приложении есть некоторые вещи, которые должны вести себя немного иначе, в зависимости от того, было ли приложение установлено из магазина приложений Amazon или нет. Если бы я понял PackageManager.getInstallerPackageName(String packageName) метод правильно, он говорит мне имя приложения, которое установило мое приложение. Правильно? Если да, кто-нибудь знает, какое значение будет возвращено этим методом, если мое приложение будет установлено из магазина приложений Amazon? Если нет, кто-нибудь знает какие-либо другие методы, которые я могу использовать, чтобы определить, было ли мое приложение установлено из магазина приложений Amazon?

Примечание. Мне известны другие вопросы о переполнении стека, на которые даны ответы, касающиеся использования PackageManager.getInstallerPackageName(String packageName) определить имя приложения, которое установило мое приложение. Тем не менее, в поисках переполнения стека и в других местах я не смог определить, какое значение возвращает PackageManager.getInstallerPackageName(String packageName) будет в случае, если приложение было установлено из магазина приложений Amazon.

4 ответа

Решение

Призвание PackageManager.getInstallerPackageName(myPackageName), где myPackageName Это имя пакета (приложения, для которого вы хотите определить установщик), дает следующие значения:

  • null если приложение было установлено из магазина приложений Amazon
  • null если приложение было установлено прямо за пределами любого магазина приложений.
  • com.android.vending если приложение было установлено из Google Play.

(Спасибо @CommonsWare за указатель.)

Поскольку samsung не реализовал PackageManager.getInstallerPackageName(), он по-прежнему возвращает ноль. Поэтому используйте 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";

}

Используйте переменную link в качестве ссылки на магазин.

Обновить:

samsungapps://ProductDetail/com.sec.chaton

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

Хорошие новости! Видимо последняя версия магазина Amazon наконец-то устанавливает PackageManager.getInstallerPackageName() в "com.amazon.venezia" контрастировать с Google Play "com.android.vending",

Старые приложения все равно вернутся null, и я на самом деле не проверил API или установщик установил ли установка нового Магазина и затем обновление старого приложения. Но установка нового приложения и проверка /data/system/packages.xml указывает installer правильно установлено.

Вы пытаетесь определить, установлено ли ваше собственное приложение из магазина Amazon, поэтому к этой ситуации относится следующее. Но все изменилось с тех пор, как вы задали вопрос, поэтому этот ответ действителен для 2016 года, когда он был опубликован, а не для 2012 года.

Как сообщалось выше, приложения, установленные версиями установщика Amazon, выпущенными до середины 2013 года, возвращают null из getInstallerPackageName(), когда этому методу передается имя пакета установленного приложения. Но по прошествии этого времени они стали возвращать "com.amazon.venezia" за такой вызов. И недавно приложение Amazon Underground может назначить имя второго установочного пакета, com.amazon.mshop.android.

Таким образом, это не совсем надежный индикатор, если вы думаете, что вы можете столкнуться с теми более старыми версиями установщика в дикой природе, потому что приложение, которое просто загружается (устанавливается из APK, хранящегося в локальном хранилище), также обычно возвращает null из getInstallerPackageName() когда этот метод вызывается для его пакета и, таким образом, будет неотличим от приложения, установленного одним из этих старых приложений магазина Amazon.

Если, несмотря на эту проблему, вы хотите использовать этот подход, но хотели бы избежать ложных отрицаний для устройств, имеющих более старые версии установщика, которые помечают установщик как нулевой, вы можете попробовать следующее:

  • Протестируйте getInstallerPackageName(), чтобы увидеть, не является ли он ненулевым.

  • Если не ноль, то просто проверьте, начинается ли он с com.amazon, и вы можете поверить, что он был установлен из Amazon, если он установлен, и вы можете поверить, что он не был установлен из Amazon, если он этого не делает.

  • Но если значение равно нулю, проведите дополнительный тест, перебирая каждый пакет на устройстве, передавая каждому найденному имени пакета функцию getInstallerPackageName(), проверяя, существует ли хотя бы один из них, начинающийся с "com.amazon".

    • Если с этим значением нет ни одного, то ваше нулевое значение неоднозначно, и вы должны учитывать, что у вас нет той или иной информации относительно того, было ли ваше приложение установлено из магазина Amazon (в отличие от боковой загрузки).

    • Но если есть хотя бы одно приложение с таким значением пакета установщика, то вы можете предположить, что ваше приложение не было установлено из магазина Amazon, так как можно с уверенностью предположить, что устройство использует версию магазина Amazon, которая помечает установленные приложения с именем пакета установщика, начинающимся с "com.amazon", учитывая, что, по крайней мере, одно приложение, отличное от вашего, на самом деле было помечено таким образом, что вряд ли произойдет любым другим способом. И это означает, что нулевое значение для вашего приложения было создано не установщиком Amazon, а скорее каким-либо другим установщиком - и, скорее всего, это означает, что ваше приложение было загружено из локальной копии вашего APK.

Другие вопросы по тегам