Android referral tracking not working with Google play
Asked Answered
H

1

8

I am trying to implement referral tracking on downloads from the Google play. Before uploading to Google Play, when I tried testing the app using below script, its working fine and i am getting referral string.

adb shell 
am broadcast -a com.android.vending.INSTALL_REFERRER -n <my.myPackage>/.<path.up.until.my.CustomBroadcastReceiver> --es "referrer" "utm_source%3Dentity%26utm_medium%3Dsocial%26utm_campaign%3Dwo_referrer%26referrerId%3D173%26entity%3Dfacebook%26email%3Dmideeshp%40email.com"

After running this code, I am decoding the referral string and my server getting updated according to the referral string. But when I deployed this app to Google play, I am not getting any referral string from Google play. I am using Google Analytics V2 for both analytic tracking and referral tracking.

Below one is my custom BroadcastReceiver.

public class InstallReferrerReceiver extends BroadcastReceiver {
private static final String TAG = "InstallReferrerReceiver";

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

    HashMap<String, String> values = new HashMap<String, String>();
    try {
        if (intent.hasExtra("referrer")) {
            Toast.makeText(context, "Inside app refferal", 5000).show();

            String url = intent.getStringExtra("referrer");
            final String referrer = URLDecoder.decode(url, "UTF-8");
            String referrers[] = referrer.split("&");
            int i = 0;
            for (String referrerValue : referrers) {
                String keyValue[] = referrerValue.split("=");
                values.put(URLDecoder.decode(keyValue[0], "UTF-8"),
                        URLDecoder.decode(keyValue[1], "UTF-8"));
                Log.i("" + i, keyValue[0] + "=" + keyValue[1]);
            }

            new AsyncTask<String, String, JSONObject>() {

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                @Override
                protected JSONObject doInBackground(String... params) {
                    // TODO Auto-generated method stub
                    String referrerUrl = "MyserverUrl?action=storerefer&" + referrer;
                    Log.i("purl address", referrerUrl);
                    JSONObject json = RestJsonClient.connect(referrerUrl);
                    return json;
                }

                @Override
                protected void onPostExecute(JSONObject result) {
                    // TODO Auto-generated method stub
                    try {
                        if (result == null) {
                            Log.i("json null", "12");
                        } else {
                            String status, error;
                            status = result.getString("status");
                            error = result.getString("error");
                            if (status.equals("success")) {
                                Log.i("referrer", "referrer status success");
                            }
                            if (status.equals("failure")) {
                                Log.i("referrer", "referrer status failure");
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    super.onPostExecute(result);
                }
            }.execute();
        }
    } catch (Exception e) {
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.package.name"
android:versionCode="4"
android:versionName="1.2.1" >

<supports-screens
    android:anyDensity="true"
    android:largeScreens="true"
    android:normalScreens="true"
    android:resizeable="true"
    android:smallScreens="true" />

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />

<uses-feature
    android:name="android.hardware.telephony"
    android:required="false" />
<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />
<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="my.package.name.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<permission
    android:name="my.package.name.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
    <activity
        android:name="my.package.name.Splash"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name"
        android:windowSoftInputMode="stateHidden" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="my.package.name.InstallReferrerReceiver"
        android:exported="true" >
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </receiver>

    <receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="my.package.name" />
        </intent-filter>
    </receiver>

    <service android:name="my.package.name.GCMIntentService" />
</application>

What should I do to get referral string from Google Play ?

Haily answered 21/7, 2014 at 13:20 Comment(0)
M
5

you can write this simple reciever:

public class DetectInstall extends BroadcastReceiver{

private String referrerId;

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

    if ((null != intent)
            && (intent.getAction().equals("com.android.vending.INSTALL_REFERRER"))) {
        Log.e("Message", "App is getting installed first time..");
        referrerId = intent.getStringExtra("referrer");

    }
}

}

then in manifest add the receiver tag inside the application like this :

<application

    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_bmg"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme" >
    <receiver
        android:name=".DetectInstall"
        android:exported="true" >
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </receiver>

then you will need to send the referrer parameter to the google playstore URL Like this :

https://play.google.com/store/apps/details?id=you.package.name&hl=en&referrer=you will get this first time when you install app

referrer field is required, whatever string u pass in referrer field you will get it in the broadcast reciever

Middelburg answered 8/1, 2015 at 7:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.