Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 - один из самых распространенных инструментов, используемых для отслеживания установок.