2010-09-28 20 views
13

Stiamo pianificando di utilizzare Google Analytics per monitorare i referral click-through degli annunci, attraverso l'Android Market, alla nostra applicazione.Ottieni tag di referrer per Google Analytics Android

In base allo Google Documentation il tag del referrer passa attraverso un intento e viene registrato automaticamente dalla libreria di Google Analytics.

È grandioso, ma abbiamo bisogno di estrarre il tag di riferimento per la nostra analisi interna. La documentazione è timida sui dettagli su come estrarla dall'intenzione iniziale di lancio e istruzioni su come simularla prima di andare in diretta.

Qualcuno ha esperienza con questo?

risposta

23

Sono andato avanti e ho pubblicato un'app per pixel finder per giocare con lo snooping sull'intento. Per qualche ragione, quando ho registrato due diversi ricevitori di trasmissione (es. Com.google.android.apps.analytics.AnalyticsReceiver e il mio), non l'ho mai ricevuto da solo.

Quindi, invece, ho registrato solo il mio ricevitore, elaborare le informazioni e passarle a Google Analytics. Non so quanto sia kosher, ma funziona. Il codice segue.

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

} 

Poi, quando l'applicazione è in realtà lanciato, si può tirare il valore di nuovo fuori delle preferenze condivise e passarlo con iscrizione utente o qualsiasi altra cosa. Ho usato il tag della campagna per i miei scopi, ma puoi prendere tutti i parametri che desideri dalla stringa del referrer creata with this tool.

+4

La ragione più di un ricevitore doesn' Il lavoro è che non è possibile registrare più di un ricevitore per lo stesso filtro di intent. Questo è il punto della documentazione confusa qui - http://code.google.com/apis/analytics/docs/mobile/android.html#google-play-tracking - sembra che tu non possa avere più di uno * qualsiasi * tipo di BroadcastReceiver in un'applicazione, che ovviamente non è vero. –

+0

@DaveSims - Sì, hanno aggiunto quella nota molto tempo dopo aver fatto questo post. Però non particolarmente chiaro, sono d'accordo. – DougW

+0

@DougW my que è come posso ottenere da questo link "http://market.android.com/details?id=com.lifestreet.android.TestInstallationIntent&referrer=bb%3DAAAAAAAAAA&feature=search_result" referre = bb supponiamo di aver aggiunto nel codice manifesto quattro righe di google predefinite di questo com.google.android.apps.analytics.AnalyticsReceiver ho bisogno di qualsiasi extra nel mio codice – Khan

7

@DougW 'risposta s aggiornata per 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 te file manifesto:

 <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

È davvero corretto usare getHashMapFromQuery? Non c'è un modo più ufficiale per analizzare la stringa del referrer? –

Problemi correlati