2013-10-25 3 views
5

Es gibt viele ähnliche Stackoverflow-Fragen.Kann zur Laufzeit zuverlässig festgestellt werden, in welchem ​​Store eine Android App installiert ist (Google Play oder Amazon Market)?

Alle haben Antworten, die die Verwendung von Methoden wie getInstallerPackageName auf der PackageManager Klasse empfehlen. Alle haben auch Kommentare oder widersprüchliche Antworten, die sagen, dass dies kein zuverlässiger Ansatz ist, was darauf hindeutet, dass die einzige Möglichkeit, zuverlässig zu überprüfen, welcher Store eine bestimmte App installiert hat, zwei separate Binärdateien mit jeweils einem storeFlag Satz zu erzeugen und einen hochzuladen binär zu Amazon und eins zu Google Play.

Ich muss wissen, welcher Speicher das Installationsprogramm der App ist, so dass ich weiß, mit welchem ​​Speicher die In-App-Kauffunktionalität kommuniziert.

Ist die endgültige 100% zuverlässige Ansatz, um zwei separate Binärdateien zu generieren? Oder gibt es einen 100% zuverlässigen Code-basierten Laufzeitansatz?

+0

Haben Sie ein Problem mit der Verwendung von zwei separaten Binärdateien? Es ist buchstäblich eine Frage der Änderung einer einzelnen Codezeile. – Cruncher

+0

überlegen, wie Sie den Quellspeicher auf einem Gerät mit beiden erkennen würden? bedenke, dass du den amazon Store auf jedem Gerät installieren kannst und du daher nicht wissen würdest, woher es kommt. – Eluvatar

+0

@ Cruncher, kann ich die zwei getrennte Binärdateien Ansatz gehen, aber es ist ein einzigartiges Setup, wo eine einzelne Binärdatei bevorzugt wird. –

Antwort

5

zwei Binärdateien wären die robusteste Methode, aber die Überprüfung sowohl des Build.MANUFACTURER als auch des InstallerNamens sollte Ihnen ziemlich nahe kommen (obwohl Sie vermutlich nach dem Amazon AppStore suchen, wenn der Benutzer eine alte Version des Installers installiert hat) ihre nicht-Kindle-Gerät und nicht die installer aktualisiert möglicherweise null melden)

boolean isAmazonDevice = Build.MANUFACTURER.equalsIgnoreCase("amazon"); 

final Application application = getApplication(); 
String installerName = application.getPackageManager().getInstallerPackageName(application.getPackageName()); 
boolean fromAmazonStore = installerName != null && installerName.equalsIgnoreCase("com.amazon.venezia"); 

und dann den Wert Überprüfung auf:

isAmazonDevice || fromAmazonStore 

sollten Sie bekommen, was Sie für eine erhebliche Menge der Zeit benötigen.

Ein Szenario, wo dies die Sache verwirren kann, ist, wenn Sie Ihre apk zum Testen sideladen - in diesem Fall würde es nicht den richtigen InstallerPackageName haben. Sie können dies fälschen, indem Sie die apk sideloaden mit:

adb install -i com.amazon.venezia APK_NAME 
Verwandte Themen