¿Averiguar de forma progresiva de qué instalación de la tienda de aplicaciones proviene?

8

Antecedentes

En mi aplicación, tengo un botón 'califícame'. Sigue la ruta habitual: el usuario hace clic, inicia una intención y abre la lista de aplicaciones en Play Store. Todo bien y bien. Ahora deseo tratar de distribuir mi aplicación a través de diferentes tiendas de aplicaciones (Amazon, por ejemplo), así que obviamente, si el usuario presiona el botón "calificarme", no quiero que lo lleve a Google Play Store, sino a lo que sea de la tienda lo obtuvieron.

APK para cada tienda

Esto es posible, cierto, pero creo que sería una pesadilla completa administrar (como crear un nuevo APK para cada tienda cada vez que publico una nueva actualización.

Entonces estoy buscando algo como este pseudocó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
    }
}

Y así.......

Supongo que hay una manera (que algunas aplicaciones seguramente deben usar), pero no tengo idea de cómo hacerlo.

BungleBonce
fuente
1
Entonces ... ¿por qué no crear la misma aplicación, pero decidir en base a algún recurso? ¿No agregaría open_store.txt y cambiar según el contenido de trabajo?
wondra
Hola @wondra, no estoy seguro de entender lo que quieres decir. ¿Te refieres a crear un archivo de texto y luego escribir en él cuando la aplicación está instalada (con un valor predeterminado, digamos 1 para Google Play, 2 para Amazon, etc.) Luego consulta ese archivo cuando el usuario llegue al índice ¿botón? Si eso es lo que quiere decir, eso es bueno, pero la pregunta seguiría siendo la misma, ¿cómo determinaría programáticamente desde qué tienda se instaló la aplicación para poder escribir en el archivo en primer lugar? ¡Aunque podría haberte entendido mal!
BungleBonce
55
Simplemente implemente 3 versiones de su aplicación con compilación condicional; cada uno con un camino diferente. La ruta de la variable / código puede cambiar según la variable compilada.
Vaughan Hilts
@VaughanHilts, ¿podrías explicarlo? ¿O tal vez publicar una idea completa como respuesta? ¡Gracias!
BungleBonce
1
Estaba a punto de decir exactamente lo mismo que dijo Vaughan Hilts. Haga diferentes versiones de la aplicación para diferentes tiendas.
Panda Pyjama

Respuestas:

7

Asumiré que está escribiendo en Java como está escribiendo para Android, pero si no lo está, puede buscar métodos en el idioma que elija para obtener el mismo tipo de resultado. Como Java no tiene soporte integrado para la compilación condicional, hay algunas cosas bastante fáciles que puede hacer aquí; a veces la solución de baja tecnología es la mejor.

Implemente una aplicación diferente compilada a partir de un código diferente para cada tienda de aplicaciones. Puede ser tan simple. Simplemente tenga una cadena global (o no, encapsúlela donde está la lógica apropiada) y simplemente asígnele un valor, compílela y desplácela. Es fácil.

Puede ser una cadena, un valor de enumeración o un entero. Realmente no importa, siempre que cada valor sea único por tienda de aplicaciones. Sugeriría una enumeración rápida fuertemente tipada con opciones como "Amazon", "GooglePlay", "XXXX", "ZZZZ", "YYYY". Escriba scripts para cambiar este valor o pase banderas de compilación utilizando herramientas de terceros si desea que esto se automatice.

Automatizándolo

Si desea avanzar un paso más, analice la opción como archivo de recursos . Escriba scripts, uno para cada implementación. Tenga un archivo llamado "store.dat" y escriba el valor de la tienda que se está implementando en el archivo cuando se implementa, si está bajo Linux u OSX, podría ser algo tan simple como

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

Cree un script para ejecutar todos estos scripts en el paso de bloqueo y tendrá una solución robusta y automatizada.

Vaughan Hilts
fuente
Gracias por esto @VaughanHilts, tengo algunas preguntas, por el momento, tengo un valor de cadena llamado 'Market' que contiene la URL del mercado, ¿es esto lo que quieres decir? ¿Tendría un APK diferente para cada mercado?
BungleBonce
Cosa segura. :) Podrías hacer esto de varias maneras, la bala mágica solo se asegura de que puedas identificar el tipo de instalación.
Vaughan Hilts
OK, hasta ahora todo bien @VaughanHilts, entiendo esa parte, lo que aún no tengo claro es este bit: "Escribe scripts para cambiar este valor o pasa banderas de compilación usando herramientas de terceros si quieres que esto se automatice" - Simplemente no tengo claro qué significa esto: si cambio manualmente mi cadena de mercado, ¿hay alguna necesidad de esta parte ya que cuando comienzo mi intención, le paso la cadena de mercado de todos modos para que abra ese mercado? - Gracias de nuevo, ¡espero que me puedan explicar con más detalles para que lo entienda correctamente! :-) Saludos
BungleBonce
@ user22241 Hola, no hay necesidad de hacer esa parte a menos que no desee cambiar la cadena a mano para cada compilación. Escribir scripts simplemente haría que el cambio y la implementación sean automáticos. Podemos continuar en el chat si tiene más preguntas.
Vaughan Hilts
Genial @VaughanHilts, tengo una pregunta tonta, ¿cómo funciona el chat en este sitio? Nunca lo he usado. ¡Gracias!
BungleBonce
2

prueba esto:

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
fuente