Descubra programaticamente de onde veio a instalação da loja de aplicativos?

8

fundo

No meu aplicativo, tenho um botão 'classifique-me'. Ele segue o caminho usual - o usuário clica, inicia uma intenção e abre a listagem do aplicativo na Play Store. Tudo bem e bem. Agora, desejo tentar distribuir meu aplicativo por diferentes lojas de aplicativos (Amazon, por exemplo). Obviamente, se o usuário clicar no botão 'classifique-me', não quero que ele leve o usuário à Google Play Store, mas a qualquer que seja loja onde eles conseguiram.

APK Para cada loja

Isso é possível, é verdade, mas acho que seria um pesadelo completo de gerenciar (como criar um novo APK para cada loja toda vez que emitir uma nova atualização.

Então, eu estou procurando algo como este pseudo-código:

if(rate-me button pressed){

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

E assim por diante.......

Acho que existe uma maneira (que alguns aplicativos certamente devem usar), mas não tenho idéia de como fazê-lo.

BungleBonce
fonte
11
Então ... por que não criar o mesmo aplicativo, mas decidir com base em algum recurso? Adicionar o open_store.txt e alternar com base no conteúdo não funcionaria?
Wondra
Olá @wondra, não sei ao certo o que você quer dizer? Você quer criar um arquivo de texto e depois gravar quando o aplicativo estiver instalado (com um valor determinado, digamos 1 para o Google Play, 2 para a Amazon etc.) Em seguida, consulte esse arquivo quando o usuário atingir a taxa me botão? Se é isso que você quer dizer, isso é bom, mas a pergunta ainda é a mesma: como determinaria programaticamente de qual loja o aplicativo foi instalado para que eu pudesse gravar no arquivo em primeiro lugar? Eu posso ter entendido você embora!
BungleBonce 31/08
5
Basta implantar 3 versões do seu aplicativo com compilação condicional; cada um com um caminho diferente. O caminho da variável / código pode mudar dependendo da variável compilada.
Vaughan Hilts
@VaughanHilts você poderia elaborar por favor? Ou talvez postar uma ideia completa como resposta? Obrigado!
BungleBonce
11
Eu estava prestes a dizer exatamente o mesmo que Vaughan Hilts disse. Faça versões diferentes do aplicativo para diferentes lojas.
Panda Pyjama

Respostas:

7

Suponho que você esteja escrevendo em Java como está escrevendo para Android, mas se não estiver, pode procurar métodos na sua linguagem de escolha para obter o mesmo tipo de resultado. Como o Java não possui suporte embutido para compilação condicional, há algumas coisas bastante fáceis que você pode fazer aqui; Às vezes, a solução de baixa tecnologia é a melhor.

Implante um aplicativo diferente compilado a partir de código diferente para cada loja de aplicativos. Pode ser assim tão simples. Basta ter uma string global (ou não, encapsular onde está a lógica apropriada) e simplesmente atribuir um valor, compilar e implantar. É tão fácil.

Pode ser uma string, um valor de enumeração ou número inteiro. Realmente não importa - desde que cada valor seja único por loja de aplicativos. Sugiro uma enumeração rápida e de tipo forte com opções como "Amazon", "GooglePlay", "XXXX", "ZZZZ", "YYYY". Escreva scripts para alterar esse valor ou passe sinalizadores de compilação usando ferramentas de terceiros, se desejar que isso seja automatizado.

Automatizando

Se você quiser dar um passo adiante, analise a opção como arquivo de recurso . Escreva scripts, um para cada implantação. Tenha um arquivo chamado "store.dat" e escreva o valor da loja que está sendo implantada no arquivo quando implantado; se você estiver no Linux ou OSX, pode ser algo tão simples quanto

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

Crie um script para executar todos esses scripts na etapa de bloqueio e você terá uma solução robusta e automatizada.

Vaughan Hilts
fonte
Obrigado por esse @VaughanHilts, tenho algumas perguntas, no momento, eu tenho um valor de string chamado 'Market' que contém a URL do mercado. Esse é o tipo de coisa que você quer dizer e muda quando compila, então Eu teria um APK diferente para cada mercado?
BungleBonce 01/09/14
Coisa certa. :) Você pode fazer isso de várias maneiras, a bala mágica é apenas garantir que você possa identificar o tipo de instalação.
Vaughan Hilts
OK, até agora tudo bem, @VaughanHilts, eu entendi essa parte, o que ainda não estou claro é o seguinte: "Escreva scripts para alterar esse valor ou passe sinalizadores de compilação usando ferramentas de terceiros, se você quiser que isso seja automatizado" - Só não estou claro sobre o que se entende por isso - se eu alterar manualmente minha cadeia de mercado, há alguma necessidade dessa parte, pois quando inicio minha intenção, passo a cadeia de mercado para ela de qualquer maneira, para abrir o mercado - obrigado novamente, espero que você possa explicar um pouco mais detalhadamente para que eu entenda corretamente! :-) Cheers
BungleBonce
@ user22241 Olá, não é necessário fazer essa parte, a menos que você não queira alterar a string manualmente para cada build. Escrever scripts tornaria a alteração e a implantação automáticas. Podemos continuar no bate-papo, se você tiver mais perguntas.
Vaughan Hilts
Legal @VaughanHilts, tenho uma pergunta boba, como funciona o bate-papo neste site? Eu nunca usei isso. Obrigado!
BungleBonce 4/04
2

tente isto:

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
fonte