2012-06-11 8 views
12

Angenommen, ich habe eine Android App A auf dem Gerät des Benutzers installiert und ich habe ein AppWidget mit meiner App, wo wir andere Android-Entwickler ihre App veröffentlichen lassen Werbeanzeigen auf einer Cost-per-Install-Basis. Daher müssen wir nachverfolgen, ob App B auf dem Gerät des Nutzers über den Verweis von App A installiert wird.Android App A möchte Google Play Empfehlungsdaten für Android App B Installation verfolgen

Nehmen wir weiterhin an, dass die App von Android App B auf dem Widget von Android App A ausgeführt wird und der Link, über den Nutzer von App A zu Nutzern von App B mit allen Referrer-Daten zu Google Play umgeleitet werden. Die URL sieht wie folgt aus (als here empfohlen -

https://play.google.com/store/apps/details?id=com.joelapenna.foursquared&referrer=utm_source%3Dtooyoou%26utm_medium%3Dbanner%26utm_term%3Dfoursquare%26utm_content%3Dfoursquare-tooyoou%26utm_campaign%3Dfoursquare-android)

Wenn Sie den Link oben in Ihrem Browser schlagen oder einen QR-Code daraus zu machen und starten Sie es es Ihnen App B in Google Play nehmen mit den erforderlichen Verweisdaten. Wenn App B auf dem Gerät des Benutzers installiert ist und zum ersten Mal gestartet wird, ist die Broadcast-Nachricht, die App A empfangen soll, com.android.vending.INSTALL_REFERRER. Wenn die Übertragung empfangen wird und die utm_source App A ist, dann notieren und verarbeiten Sie die Transaktion. Das ist alles, was wir erreichen wollen.

Hier ist App A's AndroidManifest.xml Code-Snippet.

<application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:debuggable="true" > 
     <activity 
      android:name=".LocateMeActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:name="com.locateme.android.ReferralReceiver" android:exported="true"> 
     <intent-filter> 
     <action android:name="com.android.vending.INSTALL_REFERRER" /> 
     </intent-filter> 
    </receiver> 
    </application> 

Berechtigungen hinzugefügt -

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

Hier ist die Broadcast-Empfängerklasse ReferralReceiver.java ist, dass die Sendung verarbeiten soll.

import java.io.UnsupportedEncodingException; 
import java.net.URLDecoder; 
import java.util.HashMap; 
import java.util.Map; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 

public class ReferralReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // Workaround for Android security issue: http://code.google.com/p/android/issues/detail?id=16006 
     try 
     { 
      final Bundle extras = intent.getExtras(); 
      if (extras != null) { 
       extras.containsKey(null); 
      } 
     } 
     catch (final Exception e) { 
      return; 
     } 

     Map<String, String> referralParams = new HashMap<String, String>(); 

     // Return if this is not the right intent. 
     if (! intent.getAction().equals("com.android.vending.INSTALL_REFERRER")) { //$NON-NLS-1$ 
      return; 
     } 

     String referrer = intent.getStringExtra("referrer"); //$NON-NLS-1$ 
     if(referrer == null || referrer.length() == 0) { 
      return; 
     } 

     try 
     { // Remove any url encoding 
      referrer = URLDecoder.decode(referrer, "x-www-form-urlencoded"); //$NON-NLS-1$ 
     } 
     catch (UnsupportedEncodingException e) { return; } 

     // Parse the query string, extracting the relevant data 
     String[] params = referrer.split("&"); // $NON-NLS-1$ 
     for (String param : params) 
     { 
      String[] pair = param.split("="); // $NON-NLS-1$ 
      referralParams.put(pair[0], pair[1]); 
     } 

     ReferralReceiver.storeReferralParams(context, referralParams); 
    } 

    private final static String[] EXPECTED_PARAMETERS = { 
     "utm_source", 
     "utm_medium", 
     "utm_term", 
     "utm_content", 
     "utm_campaign" 
    }; 

    private final static String PREFS_FILE_NAME = "ReferralParamsFile"; 

    public static void storeReferralParams(Context context, Map<String, String> params) 
    { 
     SharedPreferences storage = context.getSharedPreferences(ReferralReceiver.PREFS_FILE_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = storage.edit(); 

     for(String key : ReferralReceiver.EXPECTED_PARAMETERS) 
     { 
      String value = params.get(key); 
      if(value != null) 
      { 
       editor.putString(key, value); 
      } 
     } 

     editor.commit(); 
    } 


    public static Map<String, String> retrieveReferralParams(Context context) 
    { 
     HashMap<String, String> params = new HashMap<String, String>(); 
     SharedPreferences storage = context.getSharedPreferences(ReferralReceiver.PREFS_FILE_NAME, Context.MODE_PRIVATE); 

     for(String key : ReferralReceiver.EXPECTED_PARAMETERS) 
     { 
      String value = storage.getString(key, null); 
      if(value != null) 
      { 
       params.put(key, value); 
      } 
     } 
     return params; 
    } 
} 

Das Debug-Gerät ist auf Android OS 2.3.4

Durch eine einfache Textview und Button in der Haupttätigkeit der App Ich versuche, die Befassung Daten durch den Empfänger erfaßt anzuzeigen. Hier ist der Aufruf und Anzeige -

referraltext.setText(ReferralReceiver.retrieveReferralParams(this.getApplicationContext()).toString()); 

Wenn ich App B Einladungslink oben gezeigt zu starten, gehen Sie zu Google Play, installieren Sie sie und öffnen Sie sie zum ersten Mal logcat nicht die Sendung zeigen com.android.vending .INSTALL_REFERRER überhaupt und daher zeigen die Verweisdaten bei der Anzeige eine leere Zeichenfolge an.

Zur gleichen Zeit, wenn ich ADB-Befehl unter dem gleichen Broadcast-Empfänger funktioniert wie ein Charme und zeigt die Empfehlungsdaten.

am broadcast -a com.android.vending.INSTALL_REFERRER -n com.locateme.android/.ReferralReceiver --es "referrer" "utm_source=tooyoou&utm_medium=banner&utm_term=foursquare&utm_content=foursquare-tooyoou&utm_campaign=foursquare-android" 

So bedeutet das, dass die Google Play nicht die Referrer-Daten und die erwartete Absicht überhaupt nicht ausgestrahlt?

Oder bedeutet es, dass es die Absicht nur für App B sendet, die installiert wird?

Oder mache ich etwas falsch?

Ist dies möglich, ohne dass App B unser Tracking-SDK oder Code in ihre App einfügen muss, um nur mit uns zu werben.

Vielen Dank im Voraus für Ihre Hilfe.

Zusätzliche Informationen - Wir sind nicht das Google Analytics SDK so werden wir unsere eigene Broadcast-Receiver statt Googles BR mit

Der obige Code funktioniert wie ein Charme. Ich folgte nur Lucas 'Ratschlag in der Antwort, die korrekt markiert wurde, und ersetzte x-www-form-urlencoded zu UTF-8. Warum ich das nicht zuerst getan habe, ist das, was eine mobile Analysefirma namens Localytics hier gepostet hat - http://www.localytics.com/docs/android-market-campaign-analytics/ Ihr Code hat das gleiche Problem. Also im Grunde, was ich gerade habe ist, dass das oben genannte Stück Code in einer Android App, die ich in Google Play veröffentlicht und dann die App von Google Play von meinem Android-Gerät mit ICS heruntergeladen, öffnete es und klickte auf Retrieval Referral und es funktionierte. Probieren Sie es kostenlos, hier ist der Link - https://play.google.com/store/apps/details?id=com.locateme.android&referrer=utm_source%3Dtooyoou%26utm_medium%3Dbanner%26utm_term%3Dappdownload%26utm_content%3Dimage%26utm_campaign%3Dtooyooupromo

eine weitere sehr wichtige Sache, die ich wiederholen möchte, ist, dass die google Play-Kampagne Verweisung auf diese Weise Tracking funktioniert nicht, wenn Sie eine Anwendung remote auf Ihrem Gerät installieren, der Google Play aus dem Internet. Ich habe es getestet und es ist ein offener Defekt bei Google.

+0

Hallo Aakash, darf ich wissen, haben Sie ein Drittanbieter-SDK für diesen Tracking-Prozess verwendet, bitte teilen Sie mir so schnell wie möglich – Aerrow

+0

Nein, eigentlich müssen Sie nicht. Sie müssen nur Ihren eigenen Receiver schreiben, um die Google Play INSTALL REFERRER-Übertragung zu erfassen und nach Bedarf zu verarbeiten. – Aakash

+0

In meinem Fall brauche ich das obige Szenario. Kannst du mich dazu bringen, diese Funktion zu implementieren? – Aerrow

Antwort

7

Der obige Quellcode ist nicht korrekt.

die Linie

referrer = URLDecoder.decode(referrer, "x-www-form-urlencoded"); 

sollte

referrer = URLDecoder.decode(referrer, "UTF-8"); 

der Androide Dokumentation darüber ist nicht klar, aber wenn Sie x-www-form-urlencoded verwenden wird es eine nicht unterstützte Codierung Ausnahme auslösen. ...

+0

Vielen Dank. Überprüfen Sie das Update in der Frage – Aakash

0

Sie können auch Drittanbieter-Tracking wie Mobile App Tracking von Tunes verwenden. Dies hilft Android Eine App, Postbacks zu erhalten, wenn Android B installiert ist. Drittanbieter-Tools wie MAT, ist Appsflyer eines der am häufigsten verwendeten Tools zum Nachverfolgen von Installationen.