从Android Market安装应用程序后获取引荐来源


70

我正在尝试注册一个广播接收器,该广播接收器捕获从Market安装应用程序后由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?



1
值得注意的是,由于最新版本的Android Market应用程序中存在错误,因此引荐来源字符串目前无法正常工作。您可以在此处给该错误加注星标,以帮助吸引Google的注意:code.google.com/p/android/issues/detail?id=19247
plowman

是否有人在安装除我以外的其他应用程序时是否有办法接收此广播?
卡西欧·兰迪姆

你如何做相反的事情?意思是,您如何在APK文件上使用意图将其标记为您选择的引荐来源?
Android开发人员

您能告诉我哪些参数吗?其实我也有像你一样的问题。
Pratik Dasa 2015年

Answers:


54

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

笔记:

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

上面的代码还可以,只需一些说明即可完成信息:

  1. Android清单。该<receiver>标签必须是内 <application>标签。
  2. 链接市场的正确网址不是SDK中著名的Google表单的结果

但是这个

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

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

以及最后的个人笔记。

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


2
为了测试,看看这个答案:stackoverflow.com/questions/5890914/...
emmby

1
INSTALL_REFERRER按文档所述工作,“著名的Google表单”生成的网址没有任何问题,因为它们是由GA SDK接收的。仅当您计划手动发布到GA或与其他分析平台集成时,您的代码才有效。如果您想抓住引荐来源并仍然使用GA SDK,请参见上面的链接。
Barry Fruitman 2011年

<receiver>标签必须是内部的<application>标签。Analytics(分析)SDK开发人员指南中未对此进行说明,否则,编译也不会失败。所以,谢谢托比亚!
Giorgos Kylafas 2012年

1
请参阅下面的评论-我相信您的Note#1在Android> = 3.1上不再适用。
汤姆(Tom)

您甚至可以在将应用程序上载到市场之前对其进行测试。您可以从外壳发送:广播-a com.android.vending.INSTALL_REFERRER -n com.yourapp.custom.referrer.receiver / .ReferrerReceiver --es“ referrer”“ your_referrer_data”
MikeL 2016年

19

这可能会晚一点,但是您可以在不使用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中看到它的弹出窗口。

希望这可以帮助!


6
在OS X上,-e选项的键值对不需要用双码括起来。因此,上述命令将是: adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n your.package/path.to.your.BroadcastReceiver --es referrer test_referrer=test
Alok Vaish

6

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

现在,系统在将应用安装后将其标记为处于休眠状态-在用户通过运行(或放置小部件)显式激活该应用之前,它们不会收到INSTALL_REFERRER或任何其他广播。


有任何文档支持这一点吗?尽管打开了带有引荐来源网址参数的Play商店,我仍然无法看到启动安装的应用之前/之后的任何广播
rycfung 2012年

汤姆,我认为它可行,并且已经在4.x中进行了测试。从Android 3.1开始,已引入了针对已停止的应用程序的启动控件。http://developer.android.com/about/versions/android-3.1.html请注意,系统将FLAG_EXCLUDE_STOPPED_PACKAGES添加到所有广播意图。但是,后台服务或应用程序可以通过向应在广播意图中添加FLAG_INCLUDE_STOPPED_PACKAGES标志来覆盖此行为。被允许激活已停止的应用程序。希望这会有所帮助。
androidyue 2013年

5

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

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


u能帮助我在我的问题stackoverflow.com/questions/10431018/...


@Jake能否请您告诉我哪些参数?实际上,我和您一样有同样的问题
Pratik Dasa 2015年

2

我同意Google的文档不是最好的。但是,我只能通过将应用程序实际上载到Market Place,然后下载/安装它来激发意图。该意图确实在下载/安装后立即启动-用户不必启动应用程序。我也正在使用它来启动后台服务。


您能指出您能够实现此版本的android吗?对于2.3.3&ICS(4.0),此行为仍然有效吗?
rycfung 2012年

2

请注意,这不是第一个开始意图,而只是与Android Market相关的意图,它是通过Google Android Market发送的。如果您通过与Android Market不同的资源安装该应用程序,则不会触发。

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

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

PS您无需阅读即可读取deviceid / IMEI,就像某些应用程序一样。您不应该监视用户。


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"

1

实际上,可能有任何链接,例如market:// ...http:// market ...都可以正常工作。同样,引荐来源网址字段中的参数类型也无关紧要。它在那里的任何文本都可以正常工作。

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

UPD:只有一种方法可以对其进行测试-将您的App部署到Market中,然后将其安装在手机上。


我相信INSTALL_REFERRER不适用于http协议。至少现在已经没有了。请参阅本文件,并注意点#2下的已知问题: developers.google.com/analytics/devguides/collection/android/v2/...
rycfung

@rycfung我认为这仅意味着您在网络上单击“安装”后将无法使用,而不是从网络链接打开Play商店应用时
Zac Sweers 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.