ユーザーのデバイスにインストールされている Android アプリ A があり、他の Android 開発者がインストール単価ベースでアプリの宣伝広告を公開できるように、自分のアプリに AppWidget があるとします。そのため、アプリ A の紹介を通じてアプリ B がユーザーのデバイスにインストールされているかどうかを追跡する必要があります。
また、Android アプリ B の広告が Android アプリ A のウィジェットで実行されており、アプリ A のユーザーをアプリ B のユーザーにリダイレクトするためのリンクにすべてのリファラー データが含まれているとします。URLは次のようになります(ここで推奨されているように-
ブラウザで上記のリンクをクリックするか、そこから 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 の未解決の欠陥です。