Può PackageManager.getInstallerPackageName () dirmi che la mia app è stata installata dall’app store di Amazon?

Ho intenzione di pubblicare la mia app su Amazon App Store e su Google Play, e ho alcune cose nella mia app che devono comportarsi in modo leggermente diverso a seconda che l’app sia stata installata dall’app store di Amazon o meno. Se ho capito correttamente il metodo PackageManager.getInstallerPackageName(String packageName) , mi dice il nome dell’applicazione che ha installato la mia app. Destra? In tal caso, qualcuno sa qual è il valore restituito da questo metodo se la mia app è stata installata dall’app store di Amazon? In caso contrario, qualcuno conosce altri metodi che posso usare per determinare se la mia app è stata installata dall’app store di Amazon?

Nota: sono a conoscenza di altre domande su Stack Overflow a cui è stata data risposta che allude all’uso di PackageManager.getInstallerPackageName(String packageName) per determinare il nome dell’applicazione che ha installato la mia app. Tuttavia, cercando Stack Overflow e altrove, non sono stato in grado di determinare il valore restituito da PackageManager.getInstallerPackageName(String packageName) nel caso in cui l’app sia stata installata dall’app store di Amazon.

Poiché samsung non ha implementato PackageManager.getInstallerPackageName (), restituisce comunque null. Quindi usa il pacchetto PackageManager.getInstalledPackages () per ottenere tutti i pacchetti e cercare il nome del pacchetto samsungapp “com.sec.android.app.samsungapps”.

I negozi:

 null - developer com.android.vending - google play com.amazon.venezia - amazon app com.sec.android.app.samsungapps - samsung app store 

Codice:

 // 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"; } 

Usa la variabile link come link del negozio.

Aggiornare:

 samsungapps://ProductDetail/com.sec.chaton 

Samsung: http://developer.samsung.com/android/technical-docs/Samsung-Apps-Deeplink-Guide

Buone notizie! Apparentemente l’ultima versione del negozio Amazon imposta definitivamente PackageManager.getInstallerPackageName() su "com.amazon.venezia" in contrasto con "com.android.vending" Google Play.

Le app precedenti restituiranno comunque null e in realtà non ho verificato l’API o se l’installazione del nuovo Store e l’aggiornamento di un’app precedente imposteranno il programma di installazione. Ma installare una nuova app e controllare /data/system/packages.xml indica che il programma di installer è impostato correttamente.

Chiamando PackageManager.getInstallerPackageName(myPackageName) , dove myPackageName è il nome del pacchetto (dell’applicazione per cui si desidera determinare il programma di installazione) fornisce i seguenti valori:

  • null se l’app è stata installata dall’app store di Amazon
  • null se l’app è stata installata direttamente all’esterno di qualsiasi app store.
  • com.android.vending se l’app è stata installata da Google Play.

(Grazie a @CommonsWare per il puntatore.)

Stai cercando di determinare se la tua app è stata installata dall’archivio Amazon, quindi quanto segue riguarda questa situazione. Ma le cose sono cambiate da quando hai posto la domanda, quindi questa risposta è valida per il 2016 quando è stata pubblicata, non nel 2012.

Come riportato sopra, le app installate dalle versioni del programma di installazione di Amazon rilasciate prima della metà del 2013 restituiscono null da getInstallerPackageName () quando tale metodo viene passato il nome del pacchetto dell’app installata. Ma dopo quel tempo hanno iniziato a restituire “com.amazon.venezia” per una tale chiamata. Di recente, l’app Amazon Underground può assegnare un secondo nome del pacchetto di installazione, com.amazon.mshop.android.

Quindi, questo non è un indicatore completamente affidabile se pensi che potresti incontrare quelle versioni precedenti dell’installer in the wild, perché un’app che è semplicemente sideraaded (installata da un APK contenuto nella memoria locale) in genere restituirà null da getInstallerPackageName ( ) quando quel metodo viene chiamato per il suo pacchetto, e quindi sarà indistinguibile da un’app installata da una di quelle vecchie app del negozio di Amazon.

Se, nonostante questo problema, si desidera utilizzare questo approccio, ma si desidera evitare falsi negativi per i dispositivi con versioni precedenti del programma di installazione che contrassegnano il programma di installazione come null, è ansible provare quanto segue:

  • Prova getInstallerPackageName () per vedere se non è nullo.

  • Se non è nullo, prova solo per vedere se inizia con com.amazon e puoi credere che sia stato installato da Amazon se lo fa, e puoi credere che non sia stato installato da Amazon in caso contrario.

  • Ma se nullo, fai un test addizionale iterando su ogni pacchetto sul dispositivo, alimentando ogni nome di pacchetto incontrato per getInstallerPackageName (), cercando di vedere se c’è anche uno singolo che inizia con “com.amazon”.

    • Se non ci sono nessuno con quel valore, allora il tuo valore nullo è ambiguo, e dovresti considerare di non avere alcuna informazione in un modo o nell’altro per quanto riguarda se la tua app è stata installata dall’archivio Amazon (invece che con caricamento laterale).

    • Ma se c’è anche una singola app con il valore del pacchetto di installazione, allora si può presumere che l’app non sia stata installata dall’archivio Amazon, perché è una scommessa sicura che il dispositivo stia eseguendo una versione dell’archivio Amazon che tagga le app installate con il nome di un pacchetto di installazione che inizia con “com.amazon”, dato che almeno un’app diversa dalla tua è stata taggata in quel modo, il che è estremamente improbabile che accada in altro modo. Ciò significa che il valore nullo della tua app non è stato creato dal programma di installazione di Amazon, ma piuttosto da qualche altro programma di installazione, e molto probabilmente significa che l’app è stata caricata lateralmente da una copia locale del tuo APK.