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 ?
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With