2010-09-28 7 views
13

Wir planen, Google Analytics zum Verfolgen von Anzeigenklick-Verweisen über den Android Market auf unsere Anwendung zu verwenden.Erhalten Sie Google Analytics-Referrer-Tag für Google Analytics

Gemäß der Google Documentation kommt das Referrer-Tag über eine Absicht und wird automatisch von der Google Analytics-Bibliothek aufgezeichnet.

Das ist großartig, aber wir müssen diesen Verweis-Tag für unsere eigenen internen Analysen extrahieren. Die Dokumentation enthält keine Details darüber, wie man sie aus der anfänglichen Startabsicht herausholen kann, und Anweisungen, wie man dies vor der Inbetriebnahme simulieren kann.

Hat jemand Erfahrung damit?

Antwort

23

Ich ging voran und veröffentlichte eine tote Pixel-Finder-App, um mit Snooping auf die Absicht zu spielen. Aus irgendeinem Grund, als ich zwei verschiedene Rundfunkempfänger (zB com.google.android.apps.analytics.AnalyticsReceiver und meine eigenen) registriert habe, habe ich sie nie alleine empfangen.

Also habe ich nur meinen eigenen Empfänger registriert, verarbeitet die Informationen und übergibt sie an Google Analytics. Ich weiß nicht, wie koscher das ist, aber es funktioniert. Code folgt.

public class ZSGoogleInterceptor extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle extras = intent.getExtras(); 

     String referrerString = extras.getString("referrer"); 
     // Next line uses my helper function to parse a query (eg "a=b&c=d") into key-value pairs 
     HashMap<String, String> getParams = Utility.getHashMapFromQuery(referrerString); 
     String source = getParams.get("utm_campaign"); 

     if (source != null) { 
      SharedPreferences preferences = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE); 
      Editor preferencesEditor = preferences.edit(); 
      preferencesEditor.putString("ga_campaign", source); 
      preferencesEditor.commit(); 
     } 

     // Pass along to google 
     AnalyticsReceiver receiver = new AnalyticsReceiver(); 
     receiver.onReceive(context, intent); 
    } 

} 

Dann, wenn Ihre Anwendung tatsächlich gestartet wird, können Sie den Wert wieder aus den gemeinsam genutzten Präferenzen ziehen und zusammen mit Benutzern Anmeldungen oder was auch immer passieren. Ich habe das Kampagnen-Tag für meine Zwecke verwendet, aber Sie können alle Parameter, die Sie möchten, aus der Referrer-Zeichenfolge abrufen, die erstellt wurde with this tool.

+4

Der Grund mehr als einen Empfänger doesn' t Arbeit ist, dass Sie nicht mehr als einen Empfänger für denselben Intent-Filter registrieren können. Dies ist der Punkt der verwirrenden Dokumentation hier - http://code.google.com/apis/analytics/docs/mobile/android.html#google-play-tracking - die besagt, dass Sie nicht mehr haben können als eine von * jeder * Art von BroadcastReceiver in einer Anwendung, was natürlich nicht wahr ist. –

+0

@DaveSims - Ja, sie haben diese Notiz hinzugefügt, lange nachdem ich diesen Beitrag gemacht habe. Nicht besonders klar, aber stimme ich zu. – DougW

+0

@DougW meine que ist, wie ich kann ich von diesem Link "http://market.android.com/details?id=com.lifestreet.android.TestInstallationIntent&refrer=bb%3DAAAAAAAAAA&feature=search_result" referre = bb nehme an, ich habe hinzufügen in der Menifest-Code vier Zeilen von Standard-google dieser com.google.android.apps.analytics.AnalyticsReceiver ich brauche extra in meinem Code – Khan

7

@DougW 'Antwort s für Analytics SDK 4

https://developers.google.com/analytics/devguides/collection/android/v4/campaigns

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

import com.google.android.gms.analytics.CampaignTrackingReceiver; 

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

/** 
* Created by dave on 15-05-05. 
*/ 
public class ReferrerReceiver extends BroadcastReceiver { 

    public static final String REFERRER = "REF"; 

    public static final String UTM_CAMPAIGN = "utm_campaign"; 
    public static final String UTM_SOURCE = "utm_source"; 
    public static final String UTM_MEDIUM = "utm_medium"; 
    public static final String UTM_TERM = "utm_term"; 
    public static final String UTM_CONTENT = "utm_content"; 

    private final String[] sources = { 
      UTM_CAMPAIGN, UTM_SOURCE, UTM_MEDIUM, UTM_TERM, UTM_CONTENT 
    }; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Bundle extras = intent.getExtras(); 

     String referrerString = extras.getString("referrer"); 

     try { 
      Map<String, String> getParams = getHashMapFromQuery(referrerString); 

      SharedPreferences preferences = context 
        .getSharedPreferences(REFERRER, Context.MODE_PRIVATE); 

      SharedPreferences.Editor preferencesEditor = preferences.edit(); 

      for (String sourceType : sources) { 
       String source = getParams.get(sourceType); 

       if (source != null) { 

        preferencesEditor.putString(sourceType, source); 

       } 
      } 

      preferencesEditor.commit(); 
     } catch (UnsupportedEncodingException e) { 

      Log.e("Referrer Error", e.getMessage()); 
     } finally { 

      // Pass along to google 
      CampaignTrackingReceiver receiver = new CampaignTrackingReceiver(); 
      receiver.onReceive(context, intent); 
     } 



    } 

    public static Map<String, String> getHashMapFromQuery(String query) 
      throws UnsupportedEncodingException { 

     Map<String, String> query_pairs = new LinkedHashMap<String, String>(); 

     String[] pairs = query.split("&"); 
     for (String pair : pairs) { 
      int idx = pair.indexOf("="); 
      query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), 
        URLDecoder.decode(pair.substring(idx + 1), "UTF-8")); 
     } 
     return query_pairs; 
    } 

} 

In Ihrem Manifest-Datei aktualisiert:

 <service android:name="com.google.android.gms.analytics.CampaignTrackingService" /> 
     <receiver android:name="com.google.android.gms.analytics.CampaignTrackingReceiver" /> 

     <!-- Make sure this points to the location of Referrer Receiver in your package --> 
     <receiver android:name=".ReferrerReceiver" android:exported="true"> 
      <intent-filter> 
       <action android:name="com.android.vending.INSTALL_REFERRER" /> 
      </intent-filter> 
     </receiver> 
+0

Ist es wirklich in Ordnung, getHashMapFromQuery zu verwenden? Gibt es keine offiziellere Möglichkeit, die Referrer-Zeichenfolge zu analysieren? –