2012-06-17 7 views
10

Gibt es eine Möglichkeit zu wissen, ob eine Anwendung vom Amazon App Store oder Google Play Store heruntergeladen wurde? Ich meinte natürlich in der App selbst.Woher weiß man, ob eine App von Google Play oder Amazon heruntergeladen wurde?

Ich habe eine App auf beiden Seiten bereitgestellt und ich möchte lieber wissen, woher der Kunde es in der Anwendung heruntergeladen hat. Ich weiß, ich kann verschiedene Anwendungen für jeden Dienst bereitstellen, aber dies fügt einige Wartungsarbeiten hinzu, die vermieden werden könnten, wenn es eine Möglichkeit gäbe, es nur mit einer Bedingung in der App zu lösen, die dasselbe Paket verwendet.

+3

Warum sollte nicht einfach eine Variable in jeder Version enthalten sein, die anzeigt, wo sie hochgeladen wurde? Oder haben Sie einen OptionPane als Benutzer ... –

+9

'PackageManager' und' getInstallerPackageName() 'sagen Ihnen, was das Installationsprogramm war. Sie müssten Tests ausführen, um zu sehen, was in Ihren verschiedenen Szenarien zurückgegeben wird. – CommonsWare

+0

@Fran Wenn Sie experimentiert haben, was haben Sie sich einfallen lassen? – ahsteele

Antwort

12

In Code:

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

"com.android.vending" Sie sagt, es kam aus dem Google Play Store. Ich bin mir nicht sicher, was der Amazon Appstore ist, aber es sollte einfach sein, den obigen Code zu testen.

Via ADB:

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

Beispiel:

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

installerPackageName=com.android.vending 
+0

Dies ergibt einen 'installerPackageName' von' null', wenn er an den Android Studio Debugger angehängt wird und direkt sowohl auf ein Google Nexus 7 als auch auf ein Kindle Fire HD aufbaut. Wird das erwartet, wenn eine Verbindung zum Debugger besteht? Und es wird legit Strings zurückgeben, wenn es ein release.apk ist? –

+1

Ja und Nein. "null" wird erwartet, wenn die App nicht über einen App Store installiert wird oder wenn der installierende App Store das Feld nicht festlegt. Das von Android Studio verwendete Installationsprogramm legt das Feld nicht fest, daher ist es null. (Für mich, wie in der "Run" -Registerkarte zu sehen "DEVICE SHELL COMMAND: pm install -r" /data/local/tmp/com.mypackage.myapp "') In jedem Fall würde Android Studio fast sicher nicht den Wert festlegen zu 'com.android.Vending ', aber eher' com.android.studio' oder etwas. – nmr

1

Während in den meisten Fällen können Sie den Shop-Namen erhalten, indem eine Überprüfung ähnlich wie dies zB:

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“ist Google Play Store und
‚com.amazon.venezia‘ist der Amazon Appstore, und
null, wenn es

Die Ergebnisse Sideload wurde jedoch unzuverlässig sein könnte, wie zum Beispiel während der Beta-Test eines Speicher könnte diesen Wert nicht gesetzt, und außerdem ist es möglich, Ihre App zu Sideload die Paketnamen des Installateurs angeben, die als Speichername interpretiert werden könnten:

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK> 

Sie möchten vielleicht mit Namen anderen Paket für verschiedene Läden zum Beispiel prüfen, "com.example.yourapp" für Google und "com.example.yourapp.amazon" für Amazon - Sie können eas Setzen Sie diese in Ihrem Gradle-Skript.