Допустим, у меня есть приложение Android A, которое установлено на устройстве пользователя, и у меня есть AppWidget с моим приложением, в котором мы позволяем другим разработчикам Android публиковать свои объявления о продвижении приложений. на основе стоимости за установку. Поэтому нам нужно отслеживать, устанавливается ли приложение B на устройстве пользователя по ссылке приложения A.
Предположим также, что реклама Android-приложения B запущена в виджете Android-приложения A, а ссылка, по которой мы перенаправляем пользователей приложения A к пользователю приложения B в Google Play, содержит все данные реферера. URL-адрес выглядит следующим образом (рекомендуется здесь-
Если вы нажмете указанную выше ссылку в своем браузере или сделаете из нее QR-код и запустите его, вы попадете в приложение B. в Google Play с необходимыми реферальными данными. Теперь, когда приложение B установлено на устройстве пользователя и запущено в первый раз, широковещательная рассылка, которую приложение A ожидает получить, будет com.android.vending.INSTALL_REFERRER
. Если широковещательная рассылка получена, а источником utm_source является приложение A, запишите и обработайте транзакцию. Это все, к чему мы стремимся.
Вот AndroidManifest приложения А.фрагмент кода xml.
Добавлены разрешения -
Вот класс ReferralReceiver.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 referralParams = new HashMap();
// 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 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 retrieveReferralParams(Context context)
{
HashMap params = new HashMap();
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 2.3.4.
С помощью простого TextView и кнопки в основном действии приложения я пытаюсь отобразить реферальные данные, полученные приемником. Вот вызов и отображение -
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?
Или я что-то не так делаю?
Можно ли добиться этого, если приложению B не нужно будет вставлять наш SDK или код отслеживания в свое приложение только для того, чтобы размещать рекламу у нас.
Заранее большое спасибо за помощь.
Дополнительная информация. Мы не используем SDK Google Analytics, поэтому мы используем наш пользовательский приемник широковещательных сообщений, а не Google BR.
Приведенный выше код работает как шарм. Я просто последовал совету Лукаса ниже в ответе, отмеченном как правильный, и заменил x-www-form-urlencoded на UTF-8. Почему я не сделал этого сначала, так это из-за того, что мобильная аналитическая компания Localytics разместила здесь — http://www.localytics.com/docs/android-market-campaign-analytics/В их коде та же проблема. В общем, сейчас у меня есть приведенный выше фрагмент кода в приложении для Android, который я опубликовал в Google Play, а затем загрузил приложение из Google Play со своего Android-устройства с ICS, открыл его и нажал «Получить реферал», и это сработало. Попробуйте бесплатно, вот ссылка - 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.