72

我正在尝试注册一个广播接收器,该接收器在从市场安装应用程序后捕获由 Android 启动的“com.android.vending.INSTALL_REFERRER”意图。

我在这里关注细节:http ://code.google.com/mobile/analytics/docs/android/#referrals

但是,我不能使用 Google Analytics,所以我创建了自己的解决方案。我在清单文件中添加了以下内容:

<receiver android:name="com.test.Receiver" android:exported="true">
<intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>

并创建了一个基本的 BroadcastReceiver 类:

public class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle extras = intent.getExtras();
        String referrerString = extras.getString("referrer");

        Log.w("TEST", "Referrer is: " + referrerString);
    }
}

但是,当安装应用程序时,接收器似乎没有捕捉到 Intent(如果 Intent 甚至是广播?)并且我没有得到日志输出。

我是不是在某个地方出错了,或者市场在安装应用程序时不再启动这些 Intent?

4

10 回答 10

56

我会尝试帮助像我一样无法使 install_referrer 工作以及找不到有关这些功能的任何有用信息的人。

笔记:

  1. 意图com.android.vending.INSTALL_REFERRER将在安装过程中被捕获,而不是在应用程序第一次启动时被捕获。
  2. 引用者 ... extras.getString("referrer").. 是固定的,但内容可以是任何符合 http get 语法的字符串值...referrer=thatsthevalue&thisisnot=xxx

上面的代码是可以的,只是一些解释来完成信息:

  1. 安卓清单。<receiver>标签必须在 标签内<application>
  2. 链接市场的正确url不是sdk中著名的google表单的结果

但是这个

http://market.android.com/details?id=your.application.package.name&referrer=my_referrer_finally_works_fine

显然,您需要在移动设备上点击链接,而完整测试的唯一方法是在市场上发布测试应用程序。

最后和个人说明。

我不明白为什么这些信息被完全省略,我希望谷歌会采取行动详细说明。

于 2010-12-14T13:16:36.860 回答
22

这可能有点晚了,但您可以在不使用 Google Play 的情况下测试安装引荐来源网址,只需使用 ADB :)

从 adb.exe 运行它

adb shell

am broadcast -a com.android.vending.INSTALL_REFERRER -n your.package/path.to.your.BroadcastReceiver --es "referrer" "test_referrer=test"

如果您在 BroadcastReceiver 中设置了日志记录,您将在 LogCat 中看到它弹出。

希望这可以帮助!

于 2015-06-09T13:18:58.343 回答
6

我认为这些答案一定是在 Android 3.1 之前编写的——因为事情已经以一种导入方式发生了变化。

系统现在在安装时将应用程序标记为休眠 - 在用户通过运行(或放置小部件)明确激活应用程序之前,它们不会收到 INSTALL_REFERRER 或任何其他广播。

于 2012-09-13T15:57:45.753 回答
5

好的,所以我找到了 Intent 没有启动的原因。显然,您必须使用此处概述的相同参数名称:http ://code.google.com/mobile/analytics/docs/android/#referrals

您不能像我一样使用自己的参数名称:S

于 2010-11-04T01:43:15.567 回答
2

请注意,这不是第一个启动意图,而只是一个与 android 市场相关的意图,它被发送到我的 google android 市场。如果您通过与 android 市场不同的资源安装应用程序,它将不会触发。

使用您可以在那里构建的链接:http ://code.google.com/mobile/analytics/docs/android/#android-market-tracking 从意图中获取引荐来源网址并将其拆开以获取不同的参数

referrer = intent.getStringExtra("referrer");
Map<String, String> params = Toolbox.getQueryMap(referrer);

PS 你不需要像某些应用程序那样阅读设备ID/IMEI 来执行此操作。你不应该想窥探你的用户。

于 2011-06-15T18:53:09.433 回答
2

我同意 Google 的文档不是最好的。但是,我只能通过将应用程序实际上传到市场然后下载/安装它来获得触发意图。Intent 会在下载/安装后立即启动 - 用户不必启动应用程序。我也用它来启动后台服务。

于 2011-03-28T21:26:43.740 回答
2
1) Broadcast receiver

public class InstallReferrerReceiver extends BroadcastReceiver {

    String referrer = "";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null) {
            if (intent.getAction().equals("com.android.vending.INSTALL_REFERRER")) {

                Bundle extras = intent.getExtras();
                if (extras != null)
                {
                    referrer = extras.getString("referrer");

                    Log.e("Receiver Referral", "===>" + referrer);                  
                    PrefUtils.putPrefString(context, PrefUtils.PRF_REFERRER, referrer);

                    /*
                    If you want split username and code use below code...
                    for ex referrer="username12345678890"
                    if(referrer!=null)
                    {
                        String[] referrerParts = referrer.split("(?<=\\D)(?=\\d)");
                        String strName = referrerParts[0];
                        String strCode = referrerParts[1];

                        Log.e("Receiver Referral Code", "===>" + strName);
                        Log.e("Receiver Referral Name", "===>" + strCode);

                        PrefUtils.putPrefString(context, PrefUtils.PRF_REFERRER_CODE, strName);
                        PrefUtils.putPrefString(context, PrefUtils.PRF_REFERRER_NAME, strCode);
                    }*/
                }
            }
        }
    }
}

2) Define a receiver in your app manifest.in which com.android.vending.INSTALL_REFERRER 

<receiver
            android:name=".services.InstallReferrerReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
</receiver>

3) Test your app configuration running this command

adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n package_name/broadcast_receiver_path_with_packagename --es referrer "username1234567890"
于 2018-09-28T06:59:52.750 回答
1

实际上,可能有任何链接,例如market://...http://market...都可以正常工作。此外,引用字段中的参数类型也无关紧要。它适用于那里的任何文本。

此事件类型“com.android.vending.INSTALL_REFERRER”不通过广播发送的主要问题。此事件仅进入刚刚安装的应用程序。

UPD:只有一种方法可以对其进行测试——将您的应用程序部署到市场中,然后将其安装到手机上。

于 2011-05-03T05:52:53.910 回答
1

正如我在这里回答的那样,非常轻松安全地使用Google Play Referrer API (从 2017 年 11 月 20 日起)

于 2018-04-20T10:02:06.940 回答
0

com.android.vending.INSTALL_REFERRER自 2020 年 3 月起不再播出。有关详细信息和替代方案,请参阅此SO 答案

于 2021-11-22T14:49:54.903 回答