假设我有一个安装在用户设备中的Android,而我的应用程序有一个AppWidget,我们允许其他安卓开发人员在每次安装成本的基础上发布他们的应用程序推广广告。因此,我们需要跟踪应用程序B是否正在安装在用户的设备上,通过应用程序A的推荐。
我们还假设Android的广告运行在Android的小部件上,我们将App的用户重定向到App的用户到Google的链接是带有所有参考数据的。URL看起来如下(如推荐的here )-
如果你在浏览器中点击上面的链接,或者用它做一个QR代码并启动它,它将带你到Google中的App,使用所需的推荐数据。现在,当应用程序B安装在用户的设备上并首次启动时,App期望接收的广播是com.android.vending.INSTALL_REFERRER。如果接收到广播,而utm_source是App,则记录和处理事务。这就是我们的目标。
下面是App的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;
}
}调试设备在AndroidOS2.3.4上
通过应用程序的主要活动中的一个简单的TextView和Button,我试图显示接收者捕获的引用数据。这是电话和显示器-
referraltext.setText(ReferralReceiver.retrieveReferralParams(this.getApplicationContext()).toString());当我启动上面显示的App的推荐链接时,转到Google,安装它并第一次打开它,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"那么,这是否意味着谷歌游戏根本不播放参考数据和预期意图呢?
或者它是否意味着它只为正在安装的应用程序B广播意图?
还是我做错什么了?
这是否有可能实现,而无需应用程序B必须插入我们的跟踪SDK或代码在他们的应用程序只是为了广告与我们。
提前谢谢你的帮助。
附加信息-我们没有使用Google,所以我们使用的是自定义广播接收器,而不是谷歌的BR
上面的代码工作起来很有魅力。我只是按照卢卡斯在下面的建议,在答案标记正确,并取代x-www-形式-urlencoded到UTF-8。我一开始之所以不这么做,是因为一家名为Localytics的移动分析公司在这里贴出了同样的问题-- http://www.localytics.com/docs/android-market-campaign-analytics/ --他们的代码也有同样的问题。基本上,我现在拥有的是我在Google中发布的Android应用程序中的代码,然后从运行ICS的Android设备上下载该应用程序,打开它,点击检索推荐,然后免费点击worked.Try it,这是链接- 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从网络上运行的话,google play的推荐跟踪方式将无法工作。我已经对它进行了测试,这是Google的一个公开缺陷。
发布于 2012-07-20 21:15:37
上面的源代码不正确。
这条线
referrer = URLDecoder.decode(referrer, "x-www-form-urlencoded");应该是
referrer = URLDecoder.decode(referrer, "UTF-8");android文档对此尚不清楚,但如果使用x-www-form-urlencoded,则会引发不受支持的编码异常.
发布于 2016-03-08 04:10:30
您也可以使用第三方跟踪,如移动应用程序跟踪从Tunes。这将帮助Android应用程序在安装Android时获得回发。第三方工具,如MAT,Appsflyer是最常用的工具之一,用于跟踪安装。
https://stackoverflow.com/questions/10986320
复制相似问题