- Android App A wants to track Google Play referral data for Android App B installation
- <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>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
- 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;
- }
- }
- referraltext.setText(ReferralReceiver.retrieveReferralParams(this.getApplicationContext()).toString());
- 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"
- if (intent.getAction().equals(Intent.ACION_PACKAGE_ADDED))
- String appName = intent.getData().toString();