Google Play / Google Analytics INSTALL_REFERRER for BroadcastReceiver in 2014

On StackOverflow, I noticed that many people were missing INSTALL_REFERRER over the years, as well as a number of error messages on the Android forum (all closed due to "wrong forum" - but I don't see any public tracker). I am wondering if anyone has a way to make INSTALL_REFERRER work on the current version of Google Play 2014 version.

Edit: I found an issue tracker and created an issue: https://code.google.com/p/play-games-platform/issues/detail?id=202

Edit 2: (replace com.myapp

with app name)

Here's what I did to test the answer . This is the same as in the Google Analytics Help docs. It works. adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n com.myapp/com.flyingsoftgames.googleplayquery.QueryReceiver --es "referrer" "utm_source=testSource&utm_medium=testMedium&utm_term=testTerm&utm_content=testContent&utm_campaign=testCampaign"``

Here's what I did to validate the answer on the Google Play Store . This is also the same as the Google Analytics Help documents from the Link Building Utility. (Yes, the keys are different, but in the docs, not what I'm testing - I just want ANY answer, and the docs indicate that it referrer

should work ...) I set from that rank and ran by listening QueryReceiver

with logcat ( adb logcat -s QueryReceiver

). This does not work.

https://play.google.com/store/apps/details?id=com.myapp&referrer=utm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_term%3Dpodcast%252Bapps%26utm_content%3DdisplayAd1%26utm_campaign%3Dpodcast%252Bgeneralkeywords

Here is my (Cordova plugin) code that works fine when starting a manual cast:

AndroidManifest.xml:

<receiver android:exported="true" android:name="com.flyingsoftgames.googleplayquery.QueryReceiver">
 <intent-filter>
  <action android:name="com.android.vending.INSTALL_REFERRER" />
 </intent-filter>
</receiver>

      

GooglePlayQuery.java: package com.flyingsoftgames.googleplayquery;

import com.flyingsoftgames.googleplayquery.QueryReceiver;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaPlugin;

import android.content.Intent;
import android.content.IntentFilter;
import android.content.Context;
import android.app.Activity;
import android.content.ComponentName;
import android.content.pm.PackageManager;

import org.json.JSONArray;
import org.json.JSONException;

public class GooglePlayQuery extends CordovaPlugin {
 public static CallbackContext queryCallback = null;
 public static CordovaInterface cordova = null;

 @Override public void initialize (CordovaInterface initCordova, CordovaWebView webView) {
  // Create a static cordova reference so that QueryReceiver can access it.
  cordova = initCordova;

  // Enable the broadcast receiver in case it isn't enabled.
  Activity activity = cordova.getActivity ();
  ComponentName receiver = new ComponentName (activity, QueryReceiver.class);
  PackageManager pm = activity.getPackageManager ();
  pm.setComponentEnabledSetting (receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
  super.initialize (cordova, webView);
 }

 public boolean execute (String action, JSONArray inputs, CallbackContext callbackContext) throws JSONException {
  if ("getURI".equals(action)) {this.queryCallback = callbackContext;}
  return true;
 }
}

      


QueryReceiver.java:

package com.flyingsoftgames.googleplayquery;

import com.flyingsoftgames.googleplayquery.GooglePlayQuery;
import org.apache.cordova.PluginResult;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.app.Activity;
import android.content.ComponentName;
import android.content.pm.PackageManager;

import android.util.Log;

public class QueryReceiver extends BroadcastReceiver {
 @Override public void onReceive (Context context, Intent intent) {
  if (GooglePlayQuery.queryCallback != null) {
   Log.d ("QueryReceiver", intent.toURI());
   GooglePlayQuery.queryCallback.sendPluginResult (new PluginResult (PluginResult.Status.OK, intent.toURI()));
  }

  // Now disable the broadcast receiver since we don't need it anymore.
  Activity activity = GooglePlayQuery.cordova.getActivity ();
  ComponentName receiver = new ComponentName (activity, QueryReceiver.class);
  PackageManager pm = activity.getPackageManager ();
  pm.setComponentEnabledSetting (receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
 }
}

      

+3


source to share


1 answer


I believe I finally found the reason why this is not working. There is a silent error when GooglePlayQuery.cordova

it is null. QueryReceiver.onReceive

works before GooglePlayQuery.initialize

, but only in production mode. Insane.

I still need a few hours to test it (as my game is published) to test, but here is my new code. It is also available at https://github.com/agamemnus/cordova-plugin-google-play-query-receiver .

AndroidManifest.xml:

<receiver android:exported="true" android:name="com.flyingsoftgames.googleplayquery.QueryReceiver">
 <intent-filter>
  <action android:name="com.android.vending.INSTALL_REFERRER" />
 </intent-filter>
</receiver>

      




GooglePlayQuery.java:

package com.flyingsoftgames.googleplayquery;

import com.flyingsoftgames.googleplayquery.QueryReceiver;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;

import android.content.Intent;
import android.app.Activity;
import android.content.ComponentName;
import android.content.pm.PackageManager;

import org.json.JSONArray;
import org.json.JSONException;

public class GooglePlayQuery extends CordovaPlugin {
 public static CallbackContext queryCallback = null;
 public static CordovaInterface cordova = null;
 public static String referrer_uri = "";

 public static Intent QueryReceiverCachedIntent = null;

 @Override public void initialize (CordovaInterface initCordova, CordovaWebView webView) {
  // Create a static cordova reference so that QueryReceiver can access it.
  cordova = initCordova;

  // Enable the broadcast receiver in case it isn't enabled.
  Activity activity = cordova.getActivity ();
  ComponentName receiver = new ComponentName (activity, QueryReceiver.class);
  PackageManager pm = activity.getPackageManager ();
  pm.setComponentEnabledSetting (receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

  // If the QueryReceiver onReceive already ran, run the cached data.
  if (QueryReceiver.cachedIntent != null) {QueryReceiver.runCachedOnReceive (QueryReceiver.cachedIntent);}

  super.initialize (cordova, webView);
 }

 public boolean execute (String action, JSONArray inputs, CallbackContext callbackContext) throws JSONException {
  if ("getURI".equals(action)) {
   if (referrer_uri != "") {
    callbackContext.sendPluginResult (new PluginResult (PluginResult.Status.OK, referrer_uri));
    referrer_uri = "";
    return true;
   }
   this.queryCallback = callbackContext;
  }
  return true;
 }
}

      




QueryReceiver.java:

package com.flyingsoftgames.googleplayquery;

import com.flyingsoftgames.googleplayquery.GooglePlayQuery;
import org.apache.cordova.PluginResult;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.app.Activity;
import android.content.ComponentName;
import android.content.pm.PackageManager;

import android.util.Log;

public class QueryReceiver extends BroadcastReceiver {

 public static Intent cachedIntent = null;

 @Override public void onReceive (Context context, Intent intent) {
  // If the onReceive occurred before the GooglePlayQuery initialize function ran: cache the intent. Otherwise, run as intended.
  if (GooglePlayQuery.cordova == null) {cachedIntent = intent;} else {runCachedOnReceive (intent);}
 }

 public static void runCachedOnReceive (Intent intent) {
  if (cachedIntent != null) cachedIntent = null;
  Log.e ("QueryReceiver", intent.toURI());
  if (GooglePlayQuery.queryCallback != null) {
   GooglePlayQuery.queryCallback.sendPluginResult (new PluginResult (PluginResult.Status.OK, intent.toURI()));
  } else {
   GooglePlayQuery.referrer_uri = intent.toURI();
  }

  // Now disable the broadcast receiver since we don't need it anymore.
  Activity activity = GooglePlayQuery.cordova.getActivity ();
  ComponentName receiver = new ComponentName (activity, QueryReceiver.class);
  PackageManager pm = activity.getPackageManager ();
  pm.setComponentEnabledSetting (receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
 }
}

      

0


source







All Articles