Finden Sie programmatisch heraus, von welcher App Store-Installation Sie stammen?

8

Hintergrund

In meiner App habe ich eine Schaltfläche "Bewerte mich". Es folgt dem üblichen Pfad - der Benutzer klickt ein, startet eine Absicht und öffnet die Liste der App im Play Store. Alles schön und gut. Jetzt möchte ich versuchen, meine App über verschiedene App-Stores (z. B. Amazon) zu verteilen. Wenn der Nutzer also auf die Schaltfläche "Bewerten mich" klickt, möchte ich nicht, dass der Nutzer zum Google Play Store gelangt, sondern zu einem beliebigen anderen Laden, aus dem sie es bekommen haben.

APK Für jedes Geschäft

Dies ist zwar möglich, aber ich denke, es wäre ein Albtraum, dies zu verwalten (wie das Erstellen einer neuen APK für jedes Geschäft jedes Mal, wenn ich ein neues Update herausgebe.

Also suche ich so etwas wie diesen Pseudocode:

if(rate-me button pressed){

    if (from Google Play Store){
        Go to Google Play Store
    }
    else if (from Amazon Store){
        Go to Amazon Store
    }
}

Und so weiter.......

Ich vermute, es gibt einen Weg (den einige Apps sicherlich nutzen müssen), aber ich habe keine Ahnung, wie ich vorgehen soll.

BungleBonce
quelle
1
Also ... warum nicht die gleiche App erstellen, sondern anhand einer Ressource entscheiden? Würde es nicht funktionieren, open_store.txt hinzuzufügen und basierend auf dem Inhalt zu wechseln?
Wondra
Hallo @wondra, ich bin nicht sicher, ob ich verstehe, was du meinst? Meinen Sie damit, dass Sie eine Textdatei erstellen und dann bei der Installation der App darauf schreiben (mit einem festgelegten Wert, z. B. 1 für Google Play, 2 für Amazon usw.). Fragen Sie diese Datei dann ab, wenn der Benutzer die Rate-Me erreicht Taste? Wenn Sie das meinen, ist das gut, aber die Frage wäre immer noch dieselbe. Wie würde ich programmgesteuert bestimmen, aus welchem ​​Speicher die App installiert wurde, damit ich überhaupt in die Datei schreiben kann? Ich habe dich vielleicht missverstanden !!
BungleBonce
5
Stellen Sie einfach 3 Versionen Ihrer App mit bedingter Kompilierung bereit. jeweils mit einem anderen Weg. Der Variablen- / Codepfad kann sich abhängig von der kompilierten Variablen ändern.
Vaughan Hilts
@ VaughanHilts könnten Sie bitte näher erläutern? Oder vielleicht eine vollständige Idee als Antwort posten? Vielen Dank!
BungleBonce
1
Ich wollte gerade genau das sagen, was Vaughan Hilts sagte. Erstellen Sie verschiedene Versionen der App für verschiedene Geschäfte.
Panda Pyjama

Antworten:

7

Ich gehe davon aus, dass Sie in Java schreiben, während Sie für Android schreiben, aber wenn Sie dies nicht tun, können Sie Methoden in der Sprache Ihrer Wahl nachschlagen, um das gleiche Ergebnis zu erzielen. Da Java keine integrierte Unterstützung für die bedingte Kompilierung bietet, können Sie hier einige recht einfache Dinge tun. Manchmal ist die Low-Tech-Lösung die beste.

Stellen Sie für jeden App Store eine andere App bereit, die aus unterschiedlichem Code kompiliert wurde. So einfach kann es sein. Haben Sie einfach eine globale Zeichenfolge (oder nicht, kapseln Sie sie dort, wo sich die entsprechende Logik befindet) und weisen Sie ihr einfach einen Wert zu, kompilieren Sie sie und stellen Sie sie bereit. So einfach ist das.

Dies kann eine Zeichenfolge, ein Aufzählungswert oder eine Ganzzahl sein. Es spielt keine Rolle - solange jeder Wert pro App Store eindeutig ist. Ich würde eine schnelle, stark typisierte Aufzählung mit Optionen wie "Amazon", "GooglePlay", "XXXX", "ZZZZ", "JJJJ" vorschlagen. Schreiben Sie Skripte, um diesen Wert zu ändern, oder übergeben Sie Kompilierungsflags mit Tools von Drittanbietern, wenn dies automatisiert werden soll.

Automatisieren

Wenn Sie noch einen Schritt weiter gehen möchten, analysieren Sie die Option als Ressourcendatei . Schreiben Sie Skripte, eines für jede Bereitstellung. Haben Sie eine Datei mit dem Namen "store.dat" und schreiben Sie den Wert des Speichers, der bei der Bereitstellung bereitgestellt wird, in die Datei. Wenn Sie unter Linux oder OSX arbeiten, kann dies so einfach sein wie

echo "Google" > resources/store/store.dat
RUN COMPILATION STUFF HERE

Erstellen Sie ein Skript, um alle diese Skripte im Sperrschritt auszuführen, und Sie haben eine robuste, automatisierte Lösung.

Vaughan Hilts
quelle
Vielen Dank für diese @VaughanHilts, habe ein paar Fragen, im Moment habe ich einen String-Wert namens 'Market', der die URL zum Markt enthält. Ist das die Art von Sache, die du meinst, und ändere sie einfach, wenn ich sie kompiliere Ich hätte für jeden Markt eine andere APK?
BungleBonce
Sichere Sache. :) Sie können dies auf verschiedene Arten tun. Das Wundermittel stellt lediglich sicher, dass Sie den Installationstyp identifizieren können.
Vaughan Hilts
OK, soweit so gut @VaughanHilts, ich verstehe diesen Teil, was mir immer noch nicht klar ist, ist dieses Bit: "Schreiben Sie Skripte, um diesen Wert zu ändern, oder übergeben Sie Kompilierungsflags mit Tools von Drittanbietern, wenn Sie möchten, dass dies automatisiert wird." - Mir ist einfach nicht klar, was damit gemeint ist. - Wenn ich meine Marktzeichenfolge manuell ändere, besteht Bedarf an diesem Teil, da ich zu Beginn meiner Absicht die Marktzeichenfolge trotzdem an sie weitergebe, damit dieser Markt geöffnet wird - Nochmals vielen Dank, ich hoffe, Sie können ein bisschen mehr Details erklären, damit ich richtig verstehe! :-) Prost
BungleBonce
@ user22241 Hallo, dieser Teil muss nicht ausgeführt werden, es sei denn, Sie möchten die Zeichenfolge nicht für jeden Build von Hand ändern müssen. Das Schreiben von Skripten würde nur das Ändern und Bereitstellen automatisch machen. Wir können im Chat fortfahren, wenn Sie weitere Fragen haben.
Vaughan Hilts
Cool @VaughanHilts, ich habe eine dumme Frage, wie funktioniert der Chat auf dieser Seite? Ich habe es nie benutzt. Vielen Dank!
BungleBonce
2

Versuche dies:

try {
    String packagename = context.getPackageName();
    final PackageManager pm = context.getPackageManager();
    PackageInfo pInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
    String installerPackagenName = pm.getInstallerPackageName(packageName);
    if(installerPackagenName.equalsIgnoreCase("com.amazon.venezia")){
        //Go to Amazon Store
    } else if (installerPackagenName.equalsIgnoreCase("com.android.vending")){
        //Go to Google Play Store
    } else {

    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
cgr
quelle