2012-06-17 10 views
10

¿Hay alguna manera de saber si una aplicación se ha descargado de Amazon App Store o Google Play Store? Quise decir dentro de la aplicación, por supuesto.¿Cómo saber si una aplicación se descargó de Google Play o Amazon?

Implementé una aplicación en ambos sitios y me gustaría saber desde dónde la descargó el cliente dentro de la aplicación. Lo sé, puedo implementar diferentes aplicaciones para cada servicio, pero esto agrega un poco de trabajo de mantenimiento que podría evitarse si hubiera alguna forma de resolverlo solo con un condicional dentro de la aplicación usando el mismo paquete.

+3

¿por qué no solo tener una variable dentro de cada uno de los lanzamientos mostrando dónde se cargó? O tenga un OptionPane como usuario ... –

+9

'PackageManager' y' getInstallerPackageName() 'le dirá qué era el instalador. Tendría que ejecutar experimentos para ver qué devuelve en sus diferentes escenarios. – CommonsWare

+0

@Fran si experimentaste, ¿con qué se te ocurrió? – ahsteele

Respuesta

12

En Código:

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(); 
} 

que "permiso com.android.vending" dice que vino de la tienda de Google Play. No estoy seguro de qué es Amazon Appstore, pero debería ser fácil probarlo con el código anterior.

Via ADB:

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

Ejemplo:

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

installerPackageName=com.android.vending 
+0

Esto produce un 'installerPackageName' de' null' cuando se adjunta al depurador de Android Studio y la construcción directa tanto a un Google Nexus 7 como a un Kindle Fire HD. ¿Se espera eso cuando está conectado al depurador? ¿Y devolverá cadenas legítimas cuando sea un lanzamiento.apk? –

+1

Sí y no. 'null' se espera cuando la aplicación no se instala a través de una tienda de aplicaciones o cuando la tienda de aplicaciones de instalación no configura el campo. El instalador utilizado por Android Studio no configura el campo, por lo que es nulo. (Para mí, como se ve en la pestaña "Ejecutar" DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.mypackage.myapp" ') En cualquier caso, Android Studio no establecería el valor a 'com.android.vending', pero es más probable que 'com.android.studio' o algo así. – nmr

1

Mientras que en la mayoría de los casos se puede obtener el nombre de la tienda mediante la inclusión de una comprobación similar a esto:

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.andr oid.vending" es Google Play Store y
'com.amazon.venezia' es la Amazon Appstore, y
nula cuando fue transferido en forma paralela

los resultados podrían no ser fiables sin embargo, como por ejemplo durante las pruebas beta de una tienda podría no establecer este valor, y además es posible sideload su aplicación para especificar el nombre del paquete del instalador que podría interpretarse como un nombre de la tienda:

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK> 

es posible que desee considerar la posibilidad de diferentes nombres de paquetes para diferentes tiendas, por ejemplo, "com.example.yourapp" para Google y "com.example.yourapp.amazon" para Amazon - puede eas ponlos en tu script de Gradle.

Cuestiones relacionadas