Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android referral tracking not working with Google play

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 ?

like image 808
Mideesh Punathil Avatar asked Jul 21 '14 13:07

Mideesh Punathil


People also ask

How does Google Play install referrer work?

The Google Install Referrer is an Android-specific measurement technology that attributes clicks on Google Play Store app pages to the correlating app download. Google's Install Referrer framework sends an install referrer (or unique code string) to the Google Play store when an ad click has occurred.

What is Google Play install referrer API?

An Install Referrer is an Android-specific ad tracking identifier. Like Device IDs and Device Fingerprinting, an install referrer is a unique string that's sent to the Play Store when a user clicks on an ad.


1 Answers

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

like image 104
Sachin Rao Avatar answered Oct 20 '22 12:10

Sachin Rao