¿Puede PackageManager.getInstallerPackageName () decirme que mi aplicación se instaló desde la tienda de aplicaciones de Amazon?

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 ligeramente diferente dependiendo de si la aplicación se instaló desde la tienda de aplicaciones de Amazon o no. Si entendí correctamente el método PackageManager.getInstallerPackageName(String packageName) , 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 instaló desde 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: PackageManager.getInstallerPackageName(String packageName) otras preguntas sobre Stack Overflow 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 otro lugar, no he podido determinar cuál sería el valor devuelto por PackageManager.getInstallerPackageName(String packageName) en caso de que la aplicación se haya instalado desde la tienda de aplicaciones de Amazon.

Como Samsung no ha implementado PackageManager.getInstallerPackageName (), aún devuelve null. Así que utilice PackageManager.getInstalledPackages () para obtener todos los paquetes y busque el nombre de paquete 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 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"; } 

Use 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

¡Buenas noticias! Al parecer, 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 antiguas seguirán siendo null , y realmente no he verificado la API o si la instalación de la nueva Tienda y la actualización de una aplicación anterior configurarán el instalador. Pero instalar una nueva aplicación y verificar /data/system/packages.xml indica que el installer está configurado correctamente.

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 @CommonsWare por el puntero).

Está tratando de determinar si su propia aplicación se ha instalado desde la tienda de Amazon, por lo que lo siguiente se relaciona con esa situación. Pero las cosas han cambiado desde que hizo la pregunta, por lo que esta respuesta es válida para 2016 cuando se publicó, no en 2012.

Como se informó anteriormente, las aplicaciones instaladas por las versiones del instalador de Amazon publicadas antes de mediados de 2013 devuelven null desde getInstallerPackageName () cuando se pasa ese método al nombre del paquete de la aplicación instalada. Pero después de ese tiempo, comenzaron a devolver “com.amazon.venezia” para tal 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 crees que podrías encontrar esas versiones anteriores del instalador en la naturaleza, porque una aplicación que está simplemente cargada (instalada desde un APK almacenado localmente) también devolverá normalmente null desde getInstallerPackageName ( ) cuando se solicita ese método para su paquete, y por lo tanto será indistinguible de una aplicación instalada por una de esas aplicaciones más antiguas de la tienda de Amazon.

Si, a pesar de este problema, desea utilizar este enfoque, pero le gustaría evitar falsos negativos para 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 prueba para ver si comienza con com.amazon, y puedes creer que fue instalado desde Amazon si lo hace, y puedes creer que no fue instalado desde Amazon si no lo hace.

  • Pero si es nulo, realice una prueba adicional iterando sobre cada paquete en el dispositivo, alimentando cada nombre de paquete encontrado con 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 debería considerar que no tiene información de una manera u otra con respecto a si su aplicación se instaló desde la tienda de Amazon (en lugar de tener una carga lateral).

    • Pero si hay incluso una sola aplicación que tenga ese valor de paquete del instalador, puede suponer que su aplicación no se instaló en la tienda de Amazon, porque es una apuesta segura que el dispositivo ejecuta una versión de la tienda de Amazon que etiqueta las aplicaciones instaladas. con un nombre de paquete de instalador que comience por “com.amazon”, dado que al menos una aplicación que no sea la suya en realidad estaba etiquetada de esa manera, lo cual es extremadamente improbable que ocurra de otra manera. Y eso significa que el valor nulo para su aplicación no fue creado por el instalador de Amazon, sino más bien por otro instalador, y lo más probable es que su aplicación fue cargada de forma lateral desde una copia local de su APK.

    Intereting Posts