2012-06-11 5 views
12

Supponiamo di avere un'app Android A installata nel dispositivo dell'utente e di avere AppWidget con la mia app in cui consentiamo ad altri sviluppatori Android di pubblicare la propria app annunci promozionali in base al costo per installazione. Quindi dobbiamo monitorare se l'App B viene installata sul dispositivo dell'utente tramite il riferimento dell'App A.L'app Android A desidera monitorare i dati di referral di Google Play per l'installazione di app Android B

Supponiamo inoltre che l'app Android B abbia la sua pubblicità in esecuzione sul widget dell'app Android A e il collegamento tramite il quale reindirizziamo gli utenti dell'App A agli utenti di App B su Google Play sia con tutti i dati dei referrer. L'URL simile a questa (come consigliato here -

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)

Se si preme il link qui sopra nel tuo browser o fare un codice QR fuori di esso e lanciarlo vi porterà a App B in Google Play con i dati di riferimento richiesti. Ora, quando App B è installata sul dispositivo dell'utente e lanciata per la prima volta la trasmissione che l'App A si aspetta di ricevere è com.android.vending.INSTALL_REFERRER. Se la trasmissione viene ricevuta e utm_source è App A, registrare ed elaborare la transazione. Questo è tutto ciò che intendiamo fare.

Ecco lo snippet di codice AndroidManifest.xml dell'App A.

<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> 

Permessi aggiunto -

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

Ecco la classe ReferralReceiver.java Broadcast Receiver che dovrebbe elaborare la trasmissione.

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

Il dispositivo Il debugging è su OS Android 2.3.4

Attraverso una semplice TextView e Button nell'attività principale di App cerco di visualizzare i dati di riferimento acquisiti dal ricevitore. Ecco la chiamata e la visualizzazione -

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

Quando lancio referral link di App B mostrato sopra, andare a Google Play, installarlo e aprirlo per la prima volta logcat non mostra la trasmissione com.android.vending .INSTALL_REFERRER affatto e quindi i dati di riferimento quando visualizzati mostrano una stringa vuota.

Allo stesso tempo, quando uso il comando adb sotto lo stesso ricevitore trasmissione funziona come un fascino e visualizza i dati di riferimento.

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" 

Quindi significa che il Google Play non trasmette i dati Referente e l'intento atteso a tutti?

O significa che trasmette l'intento solo per l'App B che viene installata?

O sto facendo qualcosa di sbagliato?

Questo è possibile da raggiungere senza App B dover inserire il nostro SDK di monitoraggio o il codice nella loro App solo fare pubblicità con noi.

Grazie mille in anticipo per il vostro aiuto.

Altre Informazioni - Non stiamo usando l'SDK di Google Analytics in modo stiamo usando il nostro personalizzato Broadcast Receiver piuttosto che BR di Google

Il codice precedente funziona come un fascino. Ho seguito il consiglio di Lucas sotto la risposta corretta e ho sostituito x-www-form-urlencoded con UTF-8. Il motivo per cui non l'ho fatto all'inizio è a causa di ciò che una società di analisi dei dati mobile ha chiamato Localytics pubblicato qui - http://www.localytics.com/docs/android-market-campaign-analytics/ Il loro codice ha lo stesso problema. Quindi, in pratica, quello che ho adesso è che il codice di cui sopra in un'app Android che ho pubblicato su Google Play e che ho scaricato l'app da Google Play dal mio dispositivo Android su ICS, l'ho aperto e cliccato su Recupera referral e ha funzionato. Prova gratuitamente, ecco il 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

Un'altra cosa molto importante che voglio ribadire è che il Google Play campagna di rinvio di monitoraggio in questo modo non funziona se si installa un'applicazione in remoto sul proprio dispositivo utilizzando google play dal web. L'ho provato ed è un difetto aperto con Google.

+0

Ciao Aakash, posso sapere che hai utilizzato SDK di terze parti per questo processo di monitoraggio, per favore fammi sapere il prima possibile – Aerrow

+0

No in realtà non è necessario. Devi solo scrivere il tuo ricevitore per prendere la trasmissione REFERER INSTALLAZIONE di Google Play ed elaborarla come ti serve. – Aakash

+0

Nel mio caso ho bisogno di usare lo scenario sopra. Puoi aiutarmi a implementare questa funzione. – Aerrow

risposta

7

il codice sorgente sopra non è corretto.

la linea

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

dovrebbe essere

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

la documentazione Android non è chiaro su questo, ma se si utilizza x-www-form-urlencoded che verrà un'eccezione codifica non supportata. ...

+0

Grazie mille. Controlla l'aggiornamento nella domanda – Aakash

0

È inoltre possibile utilizzare il monitoraggio di terze parti come il monitoraggio delle app mobili da Tunes. Ciò consentirà all'app Android A di ottenere postback ogni volta che viene installato Android B. Strumenti di terze parti come MAT, Appsflyer è uno degli strumenti più comuni utilizzati per tracciare le installazioni.

Problemi correlati