12

ユーザーのデバイスにインストールされている Android アプリ A があり、他の Android 開発者がインストール単価ベースでアプリの宣伝広告を公開できるように、自分のアプリに AppWidget があるとします。そのため、アプリ A の紹介を通じてアプリ B がユーザーのデバイスにインストールされているかどうかを追跡する必要があります。

また、Android アプリ B の広告が Android アプリ A のウィジェットで実行されており、アプリ A のユーザーをアプリ B のユーザーにリダイレクトするためのリンクにすべてのリファラー データが含まれているとします。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 コードを作成して起動すると、必要な参照データを含む Google Play のアプリ B に移動します。アプリ B がユーザーのデバイスにインストールされ、初めて起動されると、アプリ A が受信することを期待するブロードキャストはcom.android.vending.INSTALL_REFERRER. ブロードキャストが受信され、utm_source がアプリ A の場合は、トランザクションを記録して処理します。これが私たちの目指すすべてです。

アプリ A の AndroidManifest.xml コード スニペットを次に示します。

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

ブロードキャストを処理することになっているブロードキャスト レシーバー クラス 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<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だけにインテントをブロードキャストするということですか?

それとも私は何か間違ったことをしていますか?

これは、アプリ B が広告を掲載するためだけにトラッキング SDK やコードをアプリに挿入しなくても実現できますか?

ご協力いただきありがとうございます。

追加情報 - Google アナリティクス SDK を使用していないため、Google の BR ではなくカスタム ブロードキャスト レシーバーを使用しています。

上記のコードは魅力のように機能します。以下のルーカスのアドバイスに従って、正解とマークされた回答を x-www-form-urlencoded から UTF-8 に置き換えました。最初にこれをしなかった理由は、Localytics と呼ばれるモバイル分析会社がここに投稿したためです - http://www.localytics.com/docs/android-market-campaign-analytics/彼らのコードには同じ問題があります。つまり、基本的に私が今持っているのは、Google Play で公開し、ICS を実行している Android デバイスから Google Play からアプリをダウンロードした Android アプリの上記のコードを開き、Retrieve Referral をクリックすると機能したことです。無料でお試しください。リンクは次のとおりです -https://play.google.com/store/apps/details?id=com.locateme.android&referrer=utm_source%3Dtooyou%26utm_medium%3Dbanner%26utm_term%3Dappdownload%26utm_content%3Dimage%26utm_campaign%3Dtooyoupromo

繰り返しますが、もう 1 つ重要なことは、ウェブから Google Play を使用してデバイスにアプリをリモートでインストールしている場合、この方法での Google Play キャンペーンの参照追跡は機能しないということです。テストしましたが、これは Google の未解決の欠陥です。

4

2 に答える 2

7

上記のソース コードは正しくありません。

この線

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

する必要があります

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

Androidのドキュメントはこれについて明確ではありませんが、x-www-form-urlencodedを使用すると、サポートされていないエンコーディング例外がスローされます....

于 2012-07-20T21:15:37.417 に答える
0

Tunes のモバイル アプリ トラッキングなどのサードパーティ トラッキングを使用することもできます。これにより、Android B がインストールされるたびに Android A アプリがポストバックを取得できるようになります。MAT や Appsflyer などのサードパーティ ツールは、インストールの追跡に使用される最も一般的なツールの 1 つです。

于 2016-03-08T04:10:30.700 に答える