Программно узнать, из какого магазина приложений произошла установка?

8

Фон

В моем приложении есть кнопка «Оцените меня». Он идет по обычному пути - пользователь нажимает, запускает намерение и открывает список приложений в Play Store. Все хорошо. Теперь я хочу попробовать распространить свое приложение через разные магазины приложений (например, Amazon), поэтому, очевидно, что если пользователь нажимает кнопку «Оценить меня», я не хочу, чтобы он отправлял пользователя в Магазин Google Play, но в любое другое место. магазин они получили это.

APK для каждого магазина

Это возможно, правда, но я думаю, что это будет полный кошмар (например, создание нового APK для каждого магазина каждый раз, когда я выпускаю новое обновление).

Поэтому я ищу что-то вроде этого псевдокода:

if(rate-me button pressed){

    if (from Google Play Store){
        Go to Google Play Store
    }
    else if (from Amazon Store){
        Go to Amazon Store
    }
}

И так далее.......

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

BungleBonce
источник
1
Итак ... почему бы не создать то же самое приложение, но принять решение на основе какого-либо ресурса? Не будет ли работать open_store.txt и переключаться в зависимости от содержимого?
Wondra
Привет @ Wondra, я не уверен, что понимаю, что ты имеешь в виду? Вы имеете в виду создание текстового файла и затем запись в него, когда приложение установлено (с определенным значением, скажем, 1 для Google Play, 2 для Amazon и т. Д.) Затем запросите этот файл, когда пользователь нажмет на меня кнопка? Если это то, что вы имеете в виду, это хорошо, но вопрос все тот же, как я могу программно определить, из какого хранилища было установлено приложение, чтобы я мог сначала записать в файл? Я, возможно, неправильно понял вас, хотя!
BungleBonce
5
Просто разверните 3 версии вашего приложения с условной компиляцией; у каждого свой путь. Путь к переменной / коду может меняться в зависимости от скомпилированной переменной.
Вон Хилтс
@VaughanHilts не могли бы вы уточнить, пожалуйста? Или, возможно, опубликовать полную идею в качестве ответа? Спасибо!
BungleBonce
1
Я собирался сказать точно так же, как сказал Вон Хилтс. Сделайте разные версии приложения для разных магазинов.
Панда Пижама

Ответы:

7

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

Разверните другое приложение, скомпилированное из другого кода для каждого магазина приложений. Это может быть так просто. Просто имейте глобальную строку (или нет, инкапсулируйте ее там, где есть соответствующая логика) и просто присвойте ей значение, скомпилируйте и разверните. Это так просто.

Это может быть строка, значение перечисления или целое число. Это не имеет большого значения - если каждое значение уникально для магазина приложений. Я бы предложил быстрое перечисление со строгим шрифтом с такими опциями, как «Amazon», «GooglePlay», «XXXX», «ZZZZ», «YYYY». Напишите сценарии для изменения этого значения или передайте флаги компиляции, используя сторонние инструменты, если вы хотите, чтобы это было автоматизировано.

Автоматизация

Если вы хотите сделать еще один шаг вперед, проанализируйте опцию как файл ресурсов . Написание сценариев, по одному для каждого развертывания. Создайте файл с именем «store.dat» и запишите значение хранилища, в котором он развертывается, в файл при развертывании. Если вы используете Linux или OSX, это может быть что-то простое, например:

echo "Google" > resources/store/store.dat
RUN COMPILATION STUFF HERE

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

Вон Хилтс
источник
Спасибо за это @VaughanHilts, получил несколько вопросов, на данный момент у меня есть строковое значение, называемое «Market», которое содержит URL-адрес для рынка, это то, что вы имеете в виду, и просто меняйте его, когда я компилирую, так Я хотел бы иметь разные APK для каждого рынка?
BungleBonce
Конечно, вещь. :) Вы можете сделать это различными способами, волшебная пуля просто гарантирует, что вы можете определить тип установки.
Вон Хилтс
Хорошо, пока все хорошо @VaughanHilts, я понял эту часть, но я до сих пор не понимаю, что такое бит: «Написание сценариев для изменения этого значения или передача флагов компиляции с использованием сторонних инструментов, если вы хотите, чтобы это было автоматизировано». - Мне просто непонятно, что подразумевается под этим - если я вручную изменяю свою рыночную строку, есть ли необходимость в этой части, поскольку, когда я начинаю свое намерение, я в любом случае передаю ей рыночную строку, чтобы она открыла этот рынок - еще раз спасибо, я надеюсь, что вы можете объяснить немного подробнее, чтобы я правильно понял! :-) Приветствия
BungleBonce
@ user22241 Привет, нет необходимости выполнять эту часть, если только вы не хотите менять строку вручную для каждой сборки. Написание сценариев просто сделало бы автоматическое изменение и развертывание. Мы можем продолжить в чате, если у вас есть дополнительные вопросы.
Вон Хилтс
Круто @VaughanHilts, у меня глупый вопрос, как работает чат на этом сайте? Я никогда не использовал это. Спасибо!
BungleBonce
2

попробуй это:

try {
    String packagename = context.getPackageName();
    final PackageManager pm = context.getPackageManager();
    PackageInfo pInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
    String installerPackagenName = pm.getInstallerPackageName(packageName);
    if(installerPackagenName.equalsIgnoreCase("com.amazon.venezia")){
        //Go to Amazon Store
    } else if (installerPackagenName.equalsIgnoreCase("com.android.vending")){
        //Go to Google Play Store
    } else {

    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
CGR
источник