【问题标题】:Get referrer after installing app from Android Market从 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?

【问题讨论】:

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

标签: android google-play installation google-play-services referrer


【解决方案1】:

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

注意事项:

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

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

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

但是这个

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

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

还有最后的个人说明。

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

【讨论】:

  • 要测试,请参阅此答案:stackoverflow.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

【讨论】:

【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多