Android App A хочет отслеживать реферальные данные Google Play для установки Android App B
Скажем, у меня есть Android-приложение A, установленное на пользовательском устройстве, и у меня есть приложение AppWidget с моим приложением, где мы позволяем другим разработчикам Android публиковать свои рекламные объявления для приложений на основе стоимости за установку. Поэтому нам нужно отслеживать, установлено ли приложение B на пользовательском устройстве через реферал приложения А.
Предположим также, что Android App B имеет свою рекламу, запущенную на виджетах Android App, и ссылку, через которую мы перенаправляем пользователей App A пользователю App B в Google Play со всеми данными реферера. URL-адрес выглядит так (как рекомендовано здесь -
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)
Если вы нажмете вышеуказанную ссылку в своем браузере или сделаете код QR из нее и запустите ее, она перенесет вас в приложение B в Google Play с необходимыми реферальными данными. Теперь, когда приложение AppB установлено на пользовательское устройство и впервые запускается широковещательная передача, которую приложение A ожидает получить, это com.android.vending.INSTALL_REFERRER
. Если широковещательная передача получена, а utm_source - это приложение А, то запишите и обработайте транзакцию. Это все, на что мы стремимся.
Вот фрагмент кода приложения Android Android.exe.
<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>
Добавлены разрешения -
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
Вот класс ReceiverReceiver.java для вещательного приемника, который должен обрабатывать широковещательную передачу.
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;
}
}
Отладочное устройство находится на Android OS 2.3.4
С помощью простого TextView и Button в основном действии приложения я пытаюсь отобразить реферальные данные, снятые получателем. Вот вызов и отображение -
referraltext.setText(ReferralReceiver.retrieveReferralParams(this.getApplicationContext()).toString());
Когда я запускаю ссылку для ссылки на приложение B, показанную выше, перейдите в Google Play, установите ее и откройте ее в первый раз, когда logcat не показывает широковещательный com.android.vending.INSTALL_REFERRER вообще и, следовательно, реферальные данные при отображении показывает пустую строку.
В то же время, когда я использую команду adb ниже, тот же широковещательный приемник работает как шарм и отображает реферальные данные.
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"
Значит ли это, что Google Play не транслирует данные реферера и ожидаемое намерение вообще?
Или это означает, что он транслирует намерение только для установленного приложения В?
Или я делаю что-то неправильно?
Можно ли достичь этого, если приложение B не должно вставлять наш SDK отслеживания или код в свое приложение, чтобы рекламировать нас.
Заранее благодарим за помощь.
Дополнительная информация. Мы не используем SDK Google Analytics, поэтому мы используем наш пользовательский широковещательный приемник, а не Google BR
Этот код работает как шарм. Я только что последовал за рекомендацией Лукаса ниже в ответе, помеченном правильно, и заменил x-www-form-urlencoded на UTF-8. Почему сначала я этого не делал, из-за того, что размещена здесь компания мобильной аналитики Localitics - http://www.localytics.com/docs/android-market-campaign-analytics/. Их код имеет ту же проблему. Так что в основном то, что у меня есть сейчас, заключается в том, что вышеупомянутый фрагмент кода в Android-приложении, который я опубликовал в Google Play, а затем загрузил приложение из Google Play с моего устройства Android под управлением ICS, открыл его и нажал на ссылку Retrieve Referral, и это сработало. Попробуйте бесплатно, вот ссылка - 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
Еще одна важная вещь, которую я хочу повторить, заключается в том, что отслеживание рефералов в Google Play не работает, если вы устанавливаете приложение удаленно на своем устройстве, используя Google Play из Интернета. Я тестировал его, и это открытый дефект с Google.
Ответы
Ответ 1
неправильный исходный код.
строка
referrer = URLDecoder.decode(referrer, "x-www-form-urlencoded");
должен быть
referrer = URLDecoder.decode(referrer, "UTF-8");
документация по android не совсем понятна, но если вы используете x-www-form-urlencoded, он будет генерировать неподдерживаемое исключение кодирования....
Ответ 2
Вы также можете использовать отслеживание сторонних производителей, например, отслеживание мобильных приложений из Tunes. Это поможет Android-приложению получить обратную передачу при установке Android B.
Сторонние инструменты, такие как MAT, Appsflyer - один из самых распространенных инструментов, используемых для отслеживания установок.