Android-приложение A хочет отслеживать реферальные данные Google Play для установки Android-приложения B.

Допустим, у меня есть приложение Android A, которое установлено на устройстве пользователя, и у меня есть AppWidget с моим приложением, в котором мы позволяем другим разработчикам Android публиковать свои объявления о продвижении приложений. на основе стоимости за установку. Поэтому нам нужно отслеживать, устанавливается ли приложение B на устройстве пользователя по ссылке приложения A.

Предположим также, что реклама Android-приложения B запущена в виджете Android-приложения A, а ссылка, по которой мы перенаправляем пользователей приложения A к пользователю приложения 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-tooyou%26utm_campaign%3Dfoursquare-android)

Если вы нажмете указанную выше ссылку в своем браузере или сделаете из нее 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.

12
задан Aakash 9 August 2012 в 03:10
поделиться