Как узнать, загружено ли приложение из Google Play или Amazon?

Есть ли способ узнать, было ли приложение загружено из магазина приложений Amazon или в Google Play Store? Разумеется, я имел в виду в самом приложении.

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

Ответ 1

В коде:

final PackageManager packageManager = getPackageManager();

try {
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) {
        // App was installed by Play Store
    }
} catch (final NameNotFoundException e) {
    e.printStackTrace();
}

"com.android.vending" сообщает, что он пришел из Google Play Store. Я не уверен, что такое Amazon Appstore, но это должно быть легко проверить, используя приведенный выше код.

Через ADB:

adb shell pm dump "PACKAGE_NAME" | grep "vending"

Пример:

adb shell pm dump "com.android.chrome" | grep "vending"

installerPackageName=com.android.vending

Ответ 2

В большинстве случаев вы можете получить имя магазина, включив в него проверку:

final PackageManager packageManager = getPackageManager();

try {
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) {
        // App was installed by Play Store
    }  else if ("com.amazon.venezia".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) {
        // App was installed by Amazon Appstore
    } else {
        // App was installed from somewhere else
    }
} catch (final NameNotFoundException e) {
    e.printStackTrace();
}

"com.android.vending" - это Google Play Store и
"com.amazon.venezia" - это Амазонская аптека, и
null, когда он был загружен боком

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

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK>

Возможно, вам захочется рассмотреть разные имена пакетов для разных магазинов, например "com.example.yourapp" для Google и "com.example.yourapp.amazon" для Amazon - вы можете легко установить их в своем Gradle script.