android - play - como desinstalar aplicaciones de amazon
¿Puede PackageManager.getInstallerPackageName() decirme que mi aplicación se instaló en la tienda de aplicaciones de Amazon? (4)
Planeo publicar mi aplicación en la tienda de aplicaciones de Amazon, así como en Google Play, y tengo algunas cosas en mi aplicación que deben comportarse de forma ligeramente diferente dependiendo de si la aplicación se instaló desde la tienda de aplicaciones de Amazon o no. Si entendí el método PackageManager.getInstallerPackageName(String packageName)
correctamente, me dice el nombre de la aplicación que instaló mi aplicación. ¿Derecha? Si es así, ¿alguien sabe cuál sería el valor devuelto por este método si mi aplicación se instalara en la tienda de aplicaciones de Amazon? De lo contrario, ¿alguien sabe algún otro método que pueda usar para determinar si mi aplicación se instaló en la tienda de aplicaciones de Amazon?
Nota: soy consciente de otras preguntas sobre desbordamiento de pila que se han respondido aludiendo al uso de
PackageManager.getInstallerPackageName(String packageName)
para determinar el nombre de la aplicación que instaló mi aplicación. Sin embargo, al buscar Stack Overflow y en otros lugares, no he podido determinar cuál sería el valor devuelto porPackageManager.getInstallerPackageName(String packageName)
en caso de que la aplicación se haya instalado desde la tienda de aplicaciones de Amazon.
¡Buenas noticias! Apparently la última versión de la tienda de Amazon finalmente establece PackageManager.getInstallerPackageName()
en "com.amazon.venezia"
para contrastar con "com.android.vending"
Google Play.
Las aplicaciones más antiguas seguirán siendo null
, y no he verificado la API o si la instalación de la nueva Tienda y luego la actualización de una aplicación anterior configurará el instalador. Pero instalar una nueva aplicación y comprobar /data/system/packages.xml
indica que el installer
está configurado correctamente.
Al llamar a PackageManager.getInstallerPackageName(myPackageName)
, donde myPackageName
es el nombre del paquete (de la aplicación para la que desea determinar el instalador) proporciona los siguientes valores:
-
null
si la aplicación se instaló desde la tienda de aplicaciones de Amazon -
null
si la aplicación se instaló directamente fuera de cualquier tienda de aplicaciones. -
com.android.vending
si la aplicación se instaló desde Google Play.
(Gracias a @CommonsWare por el puntero).
Como Samsung no ha implementado el PackageManager.getInstallerPackageName (), todavía devuelve nulo. Así que use PackageManager.getInstalledPackages () para obtener todos los paquetes y busque el nombre de paquete de samsungapp "com.sec.android.app.samsungapps".
Víveres:
null - developer
com.android.vending - google play
com.amazon.venezia - amazon app
com.sec.android.app.samsungapps - samsung app store
Código:
// lets start with google play store link
String link = "https://play.google.com/store/apps/details?id=com.hellothupten.capital2countryquiz";
//find out the installer for your app package name.
String installer = getPackageManager().getInstallerPackageName(
"com.hellothupten.capital2countryquiz");
if (installer == null) {
List<PackageInfo> installedPackages = getPackageManager()
.getInstalledPackages(PackageManager.GET_ACTIVITIES);
for (PackageInfo p : installedPackages) {
if (p.packageName.contains("samsungapps")) {
// change to samsung app store link
link = "http://apps.samsung.com/mars/topApps/topAppsDetail.as?productId=000000840239";
break;
}
}
} else if (installer.contains("amazon")) {
// change to amazon app store link
link = "amzn://apps/android?p=com.hellothupten.capital2countryquiz";
} else if (installer.contains("samsung")) {
// change to samsung app store link. This does not
// exist..but who knows samsung may implement
// getInstallerPackageName in future, I assume it will
// contain a word samsung in its package name.
link = "http://apps.samsung.com/mars/topApps/topAppsDetail.as?productId=000000840239";
}
Utilice la variable de enlace como el enlace de la tienda.
Actualizar:
samsungapps://ProductDetail/com.sec.chaton
Samsung: http://developer.samsung.com/android/technical-docs/Samsung-Apps-Deeplink-Guide
Está intentando determinar si su propia aplicación se ha instalado desde la tienda de Amazon, por lo que lo siguiente corresponde a esa situación. Pero las cosas han cambiado desde que hiciste la pregunta, por lo que esta respuesta es válida para 2016 cuando se publicó, no para 2012.
Como se informó anteriormente, las aplicaciones instaladas por las versiones del instalador de Amazon lanzadas antes de mediados de 2013 devuelven un valor nulo desde getInstallerPackageName () cuando ese método pasa el nombre del paquete de la aplicación instalada. Pero después de ese tiempo, comenzaron a devolver "com.amazon.venezia" para dicha llamada. Y recientemente, la aplicación Amazon Underground puede asignar un segundo nombre de paquete de instalación, com.amazon.mshop.android.
Por lo tanto, este no es un indicador completamente confiable si cree que puede encontrar esas versiones más antiguas del instalador en el mundo salvaje, porque una aplicación que simplemente se descarga de forma simultánea (instalada desde un APK almacenado en el almacenamiento local) generalmente también devolverá un valor nulo desde getInstallerPackageName ( ) cuando se llama a ese método para su paquete, y por lo tanto no se podrá distinguir de una aplicación instalada por una de esas aplicaciones de tienda de Amazon más antiguas.
Si, a pesar de este problema, desea utilizar este enfoque, pero desea evitar falsos negativos para los dispositivos que tienen las versiones anteriores del instalador que marcan el instalador como nulo, puede intentar lo siguiente:
Pruebe getInstallerPackageName () para ver si no es nulo.
Si no es nulo, simplemente haga una prueba para ver si comienza con com.amazon, y puede creer que se instaló desde Amazon si lo hace, y puede creer que no se instaló desde Amazon si no lo hace.
Pero si es nulo, haga una prueba adicional iterando sobre cada paquete en el dispositivo, suministrando cada nombre de paquete encontrado a getInstallerPackageName (), buscando si hay uno solo que comience con "com.amazon".
Si no hay ninguno con ese valor, entonces su valor nulo es ambiguo, y debe tener en cuenta que no tiene información de una manera u otra respecto de si su aplicación se instaló desde la tienda de Amazon (a diferencia de la carga lateral).
Pero si incluso una sola aplicación tiene ese valor de paquete de instalador, entonces puede asumir que su aplicación no se instaló desde la tienda de Amazon, porque es una apuesta segura que el dispositivo está ejecutando una versión de la tienda de Amazon que etiqueta aplicaciones instaladas con un nombre de paquete de instalación que comienza con "com.amazon", dado que al menos una aplicación distinta a la suya fue etiquetada de esa manera, lo cual es muy improbable que ocurra de otra manera. Y eso significa que el instalador de Amazon no creó el valor nulo de su aplicación, sino que lo hizo otro instalador, y probablemente significa que su aplicación se cargó desde una copia local de su APK.