Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Так как samsung не реализовал 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";

}

Используйте ссылку в качестве ссылки для хранилища.

Update:

samsungapps://ProductDetail/com.sec.chaton

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

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