La aplicación de Android A quiere realizar el seguimiento de los datos de referencia de Google Play para la instalación de la aplicación Android B

Digamos que tengo una aplicación de Android A que se instala en el dispositivo del usuario y tengo un AppWidget con mi aplicación en la que dejamos que otros desarrolladores de Android publiquen sus anuncios de promoción de aplicaciones con un coste por instalación. Por lo tanto, necesitamos realizar un seguimiento si la aplicación B está siendo instalada en el dispositivo del usuario mediante la referencia de la aplicación A.

Supongamos también que la aplicación Android B tiene su anuncio en ejecución en el widget de la aplicación de Android A y el enlace a través del cual redirigimos los usuarios de la aplicación A al usuario de la aplicación B a Google Play está con todos los datos de referencias. La URL se parece a esto (como se recomienda aquí –

Https://play.google.com/store/apps/details?id=com.joelapenna.foursquared&referrer=utm_source%3Dtooyoou%26utm_medium%3Dbanner%26utm_term%3Dfoursquare%26utm_content%3Dfoursquare-tooyoou%26utm_campaign%3Dfoursquare-android )

Si pulsa el enlace anterior en su navegador o crea un código QR fuera de él y lo lanzará, lo llevará a la aplicación B en Google Play con los datos de referencia necesarios. Ahora, cuando la aplicación B se instala en el dispositivo del usuario y se inicia por primera vez la difusión que la aplicación A espera recibir es com.android.vending.INSTALL_REFERRER . Si se recibe la emisión y utm_source es App A, entonces grabe y procese la transacción. Esto es todo lo que pretendemos hacer.

Aquí está el fragmento de código AndroidManifest.xml de la aplicación A.

 <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> 

Permisos añadidos –

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission> 

Aquí está la clase de Receptor de Broadcast ReferralReceiver.java que se supone que procesa la emisión.

 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; } } 

El dispositivo de depuración está en Android OS 2.3.4

Mediante un TextView y un botón simples en la actividad principal de la aplicación intento exhibir los datos de la referencia capturados por el receptor. Aquí está la llamada y la exhibición –

 referraltext.setText(ReferralReceiver.retrieveReferralParams(this.getApplicationContext()).toString()); 

Cuando lanzo el enlace de referencia de la aplicación B que se muestra arriba, vaya a Google Play, instálelo y ábralo por primera vez. Logcat no muestra la emisión com.android.vending.INSTALL_REFERRER en absoluto y por lo tanto los datos de referencia cuando se muestra muestran un vacío cuerda.

Al mismo tiempo, cuando uso el comando adb debajo del mismo receptor de difusión funciona como un encanto y muestra los datos de referencia.

 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" 

¿Eso significa que Google Play no transmite los datos de referencia y la intención esperada?

¿O significa que transmite la intención sólo para la aplicación B que se está instalando?

¿O estoy haciendo algo mal?

¿Es esto posible de lograr sin la aplicación B tener que insertar nuestro SDK de seguimiento o código en su aplicación sólo para anunciar con nosotros.

Muchas gracias de antemano por su ayuda.

Información adicional: no estamos utilizando el SDK de Google Analytics, por lo que estamos utilizando nuestro receptor de difusión personalizado en lugar de BR de Google

El código de arriba funciona como un encanto. Acabo de seguir el consejo de Lucas abajo en la respuesta marcada correcta y reemplazado x-www-form-urlencoded a UTF-8. ¿Por qué no lo hice al principio es a causa de lo que una empresa de análisis móvil llamado Localytics publicado aquí – http://www.localytics.com/docs/android-market-campaign-analytics/ Su código tiene el mismo problema. Así que básicamente lo que tengo ahora es que el código de arriba en una aplicación de Android que publiqué en Google Play y luego descargé la aplicación de Google Play desde mi dispositivo Android que ejecuta ICS, lo abrió y hizo clic en Recuperar Referencia y funcionó. Pruébelo gratis, aquí está el enlace: https://play.google.com/store/apps/details?id=com.locateme.android&referrer=utm_source%3Dtooyoou%26utm_medium%3Dbanner%26utm_term%3Dappdownload%26utm_content%3Dimage% 26utm_campaign% 3Dtooyooupromo

Otra cosa muy importante que quiero reiterar es que el seguimiento de referencias de campañas de Google Play de esta manera no funcionará si instalas una aplicación remotamente en tu dispositivo con Google Play desde la web. Lo he probado y es un defecto abierto con Google.

El código fuente anterior no es correcto.

la línea

 referrer = URLDecoder.decode(referrer, "x-www-form-urlencoded"); 

debiera ser

 referrer = URLDecoder.decode(referrer, "UTF-8"); 

La documentación de Android no está clara acerca de esto, pero si utiliza x-www-form-urlencoded lanzará una excepción de codificación no compatible ….

También puede utilizar seguimiento de terceros como seguimiento de aplicaciones móviles de Tunes. Esto ayudará a Android Una aplicación para obtener postbacks cada vez que Android B está instalado. Herramientas de terceros como MAT, Appsflyer es una de las herramientas más comunes utilizadas para realizar el seguimiento de las instalaciones.

  • NEW_OUTGOING_CALL no se llama en el Samsung Galaxy S
  • ¿Puede BroadcastReceiver registrado en AndroidManifest recibir intenciones cuando se cancela el proceso de solicitud?
  • ¿Por qué llamar a setResult en BroadcastReceiver?
  • Direccionamiento explícito de una intención a un receptor de difusión dinámica
  • Android.net.wifi.WIFI_STATE_CHANGED no se está transmitiendo
  • Iniciar actividad marcando un número
  • ACTION_MY_PACKAGE_REPLACED no recibido
  • Mostrar la notificación de la barra de estado desde un BroadcastReceiver
  • ¿Cómo identifica * qué * dispositivo bluetooth causa una emisión ACTION_ACL_CONNECTED?
  • Cómo determinar si una de mis actividades está en primer plano
  • ¿Es esto posible comprobar si una difusión fue enviada en modo pegajoso? ¿Puede ser abortado / removido?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.