从 Android Market 安装应用后获取推荐人

Posted

技术标签:

【中文标题】从 Android Market 安装应用后获取推荐人【英文标题】:Get referrer after installing app from Android Market 【发布时间】:2011-05-04 20:04:33 【问题描述】:

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

【问题讨论】:

我在这里回答了同样的问题***.com/questions/3817030/… 值得注意的是,由于最新版本的 Android Market 应用程序中的错误,引荐来源字符串目前无法使用。您可以在此处为该错误加注星标以帮助引起 Google 的注意:code.google.com/p/android/issues/detail?id=19247 有谁知道在安装除我之外的其他应用程序时是否有办法接收此广播? 你如何做相反的事情?意思是,您如何在 APK 文件上使用意图,将其标记为您选择的引用者? 你能告诉我哪些参数吗?其实我和你有同样的问题。 【参考方案1】:

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

注意事项:

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

上面的代码没问题,只是一些解释来补全信息:

    Android 清单。 &lt;receiver&gt; 标签必须在 &lt;application&gt; 标签。 链接市场的正确url不是sdk中著名的google表单的结果

但是这个

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

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

还有最后的个人说明。

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

【讨论】:

要测试,请参阅此答案:***.com/questions/5890914/… INSTALL_REFERRER 按文档说明工作,“著名的谷歌表单”生成的 URL 没有任何问题,因为它们被设计为由 GA SDK 接收。仅当您计划手动发布到 GA 或与其他分析平台集成时,您的代码才有效。如果您想捕获引荐来源并仍然使用 GA SDK,请参阅上面的链接。 &lt;receiver&gt; 标签必须在&lt;application&gt; 标签内。这在分析 SDK 开发指南中没有解释,如果您不这样做,编译也不会失败。所以,谢谢托比亚! 在下面查看我的评论 - 我相信您的 Note #1 不再适用于 Android >= 3.1。 您甚至可以在将应用上传到市场之前对其进行测试。您可以从外壳发送:am broadcast -a com.android.vending.INSTALL_REFERRER -n com.yourapp.custom.referrer.receiver/.ReferrerReceiver --es "referrer" "your_referrer_data"【参考方案2】:

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

希望这会有所帮助!

【讨论】:

在 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【参考方案3】:

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

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

【讨论】:

有任何文档支持吗?尽管使用推荐人参数打开 Play 商店,但在启动已安装的应用程序之前/之后,我仍然看不到任何广播发送 Tom,我认为它可以工作并且已经在 4.x 中进行了测试。自 Android 3.1 以来,已引入对已停止应用程序的启动控件。 http://developer.android.com/about/versions/android-3.1.html 请注意,系统将 FLAG_EXCLUDE_STOPPED_PACKAGES 添加到所有广播意图。但是,后台服务或应用程序可以通过将 FLAG_INCLUDE_STOPPED_PACKAGES 标志添加到应该允许激活停止的应用程序的广播意图来覆盖此行为。希望这会有所帮助。【参考方案4】:

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

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

【讨论】:

你能帮我解决我的问题吗***.com/questions/10431018/… 更新链接developers.google.com/analytics/devguides/collection/android/… @Jake 你能告诉我哪些参数吗?其实我和你有同样的问题【参考方案5】:

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

【讨论】:

您能指出您在哪个版本的 android 上能够实现这一目标吗?这种行为是否仍然适用于 2.3.3 和 ICS (4.0)?【参考方案6】:

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

使用您可以在那里建立的链接:http://code.google.com/mobile/analytics/docs/android/#android-market-tracking 从intent中获取referrer,拆开得到不同的参数

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

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

【讨论】:

【参考方案7】:
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"

【讨论】:

【参考方案8】:

实际上,ma​​rket://...http://market... 等任何链接都可以正常工作。 此外,引用字段中的参数类型也无关紧要。它适用于其中的任何文本。

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

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

【讨论】:

我相信 INSTALL_REFERRER 不适用于 http 协议。至少,如果以前是这样的话,现在不会了。请参阅本文档,并注意已知问题下的第 2 点:developers.google.com/analytics/devguides/collection/android/v2/… @rycfung 我认为这仅意味着当您从网络单击“安装”时它不起作用,而不是从网络链接打开 Play 商店应用程序【参考方案9】:

使用 Google Play Referrer API(从 2017 年 11 月 20 日起)非常轻松安全地使用我 answered here

【讨论】:

【参考方案10】:

com.android.vending.INSTALL_REFERRER 不再广播since March 2020。有关详细信息和替代方案,请参阅此SO answer。

【讨论】:

以上是关于从 Android Market 安装应用后获取推荐人的主要内容,如果未能解决你的问题,请参考以下文章

在模拟器 2.2 中安装 android market 应用程序

工信部:将统一 Android 消息推送标准;Google:6月30日停止对Android Market应用支持

检测应用程序是不是从 Android Market 下载

转发布android app到android market的方法

检查应用程序是不是在 Android Market 上可用

如何使用 chrome 上的新方案将数据传递到 android Market?