com.android.vending.INSTALL_REFERRER无法正常工作。

10

我最初发布了这个问题,询问如何通过安装链接将参数传递到我的应用中。

大家都建议创建一个带有 intent-filtercom.android.vending.INSTALL_REFERRERBroadcastListener。所有相关文档似乎都暗示这是Google Analytics的一个功能(文档是v1版本,但我现在只能下载v2 SDK ...所以我正在使用它)。我无法通过这些链接传递数据。我已经包含了我的完整清单和广播侦听器。我还包括了Google Analytics,以防万一那是必需的。

完全不起作用。我的广播侦听器从来没有被调用过,日志中也没有任何输出。求助!

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.robotsidekick.webbrowser"
      android:versionCode="4"
      android:versionName="4.0">

<uses-sdk android:minSdkVersion="17"/>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    android:label="@string/app_name"
    android:icon="@drawable/ic_launcher">

    <activity
        android:name="WebBrowser"
        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:exported="true"
        android:name="com.robotsidekick.webbrowser.InstallReceiver">
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </receiver>

</application>

</manifest>

广播监听器

public class InstallReceiver extends BroadcastReceiver
{
    private static final String TAG = "InstallReceiver";

    public void onReceive(Context context, Intent intent)
    {
        Log.e(TAG, "Context: " + context);
        Bundle extras = intent.getExtras();
        if (extras != null)
        {
            Log.e(TAG, "Extras:");
            for (String keys : extras.keySet())
            {
                Log.e(TAG, keys + " -> " + extras.get(keys));
            }
        }
        else
        {
            Log.e(TAG, "Extras are null");
        }
    }
}

2
对于任何遇到和我一样问题的人,我有一个解决方案,虽然不是很好,如果你还没有使用Google Analytics。我将InstallReceiver更改为扩展com.google.analytics.tracking.android.AnalyticsReceiver,然后一切都神奇地解决了。老实说,我无法解释这个现象。 - xbakesx
你使用的是哪个版本?我甚至没有看到com.google.analytics.tracking.android.AnalyticsReceiver作为分析jar(beta5)的一部分。 - sghael
我不确定我正在使用哪个版本,因为像一个真正的专业人士一样,我扔掉了所有的文档...但我很肯定它是 Beta v3。 - xbakesx
3个回答

4

在多次尝试失败后,我终于能在logcat中看到传递的推荐参数。

在这个过程中,我发现了一些事情。我不确定我是对还是错,但出于某些原因,这些方法有效。如果有人仍然遇到问题,他们可以从我的学习中获得一些指针。

A. 创建一个自定义广播接收器,您可以在其中读取意图(这将在成功从ADB测试安装_referrer意图后执行)。还要确保,如果需要将推荐信息回传到服务器,则必须在单独的线程上进行。

    public class CustomBR extends BroadcastReceiver {

    private static final String D_TAG = "BR";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(D_TAG, "CustomReceiver onReceive (context, intent)");
        try {

            String referrer = intent.getStringExtra("referrer");
            // pass the referrer string to another singleton class to post it to server
            HandleServerComm.getInstance().postData(referrer);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

B. 更新androidmanifest.xml文件以反映您创建的自定义接收器

    <receiver android:exported="true" android:name="com.example.myapp.CustomBR" android:enabled="true">
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </receiver>

C. 确保您已正确安装adb以在本地环境中测试此功能。 您还需要通过USB连接启用远程调试的设备。

D. 运行adb shell命令,在设备上远程广播install_referrer并传递参数。

该命令为

adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n com.example.myapp/.CustomBR --es  "token" "sample_token" --es  "source" "banner"

请注意,此命令的重要部分是 com.example.myapp/.CustomBR--es "token" "sample_token",其中 --es 是与意图一起发送的附加参数。在 --es 后面的第一个引号是查询字符串/参数名称,第二个引号是值。类似地,如果您需要添加多个值,请按上面的示例进行复制。
最后,最让我沮丧的部分 - 设备上安装的应用程序本身是最重要的部分。您的应用程序应该已安装在设备上,但完全没有运行。为此,您将不得不“强制关闭”应用程序,然后发出 adb shell 命令来启动 install_referrer。这时,您应该看到 logcat 显示所需的数据。
您可能还想卸载 Google Play 商店应用程序上的更新并将其恢复为出厂设置。有时(未经确认)Google Play 的版本会确定通过 install_referrer 传递给应用程序的数据或是否调用 referrer。
希望这能帮助某些人。

1
看起来你的adb shell命令正在传递字符串extras“token”和“source”,但是你的接收器正在寻找一个extra“referrer”。有什么问题吗? - Greg Ennis

4

xbakesx说,如果他的接收器扩展了com.google.analytics.tracking.android.AnalyticsReceiver,它似乎可以工作。

我认为关键在于intent具有...AnalyticsReceiver的权限,因此没有扩展它的其他类可以拾取intent。如果您查看他们的测试广播https://developers.google.com/analytics/solutions/testing-play-campaigns,它似乎是特定于该类的。

如果您更改该测试广播以便您的类替换com.google.analytics.tracking.android.AnalyticsReceiver,则可以接收它。最大的问题是他们似乎已经在beta 4或5中锁定了这个类。如果有人有beta 3的链接,我们可以测试一下,或者如果xbakex通过玩弄新的jar进行确认,那将会棒极了!

更新:

BAM! 所以权限不是问题。我创建了一个测试项目,并使用PlayStore的Alpha测试来测试推荐链接,您可以在此处构建:https://developers.google.com/analytics/devguides/collection/android/v2/campaigns

酷毙了,您根本不需要任何GA jar!在此处查看我的测试项目:https://github.com/twotoasters/AnalyticsTest/这个项目还向您展示如何解析链接以获取所需的所有信息。


很明显,在beta 3之后,你无法扩展AnalyticsReceiver。我可以改变测试广播,但我不确定如何改变系统发出的广播,以便不指定接收它的目标包/类。所以除了使用beta 3并且永远不升级,我不确定如何使其按照我们的意愿工作。 - xbakesx
更新的答案。只需查看我的示例项目,以了解如何执行此操作。https://github.com/twotoasters/AnalyticsTest/ - MinceMan
2
你好,我按照你的存储库创建了一个引荐接收器,在使用虚假adb广播时它可以工作。但是在alpha版本中发布应用程序时,我没有收到任何广播。它在alpha版本中不起作用吗??https://productforums.google.com/d/msg/analytics/FV2mOfywmlU/5z26mbQXyuwJ - Y M
当我没有任何推荐链接进入Play Store时,我无法获取意图。这种行为是否是预期的?我想跟踪我的所有安装。 - mdavid
那是可以预料的。如果该应用程序没有通过推荐链接安装,那么Play商店不会发送推荐意图。你需要在跟踪其他安装方面有些创意。 - MinceMan
显示剩余2条评论

2
在您的应用程序的AndroidManifest.xml中注册一个带有意图过滤器的BroadcastReceiver是处理应用安装推荐的正确方法,无论是否使用Google Analytics。请保留HTML标签。
<receiver
    android:exported="true"
    android:name="com.yourcompany.package.receivers.InstallReceiver">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>

如果您已经在使用Google Analytics,则只需为接收器指定android:name="com.google.android.gms.analytics.CampaignTrackingReceiver",并指定以下服务。这两个都包含在Google Play服务客户端库中,因此不需要编写任何Java代码。如果您还没有这样做,您还需要按照Google Analytics的初始设置说明为您的应用程序进行设置。请注意保留HTML标签。
 <service android:name="com.google.android.gms.analytics.CampaignTrackingService" />

如果您没有使用Google Analytics,那么您需要在Java代码中定义自己的BroadcastReceiver。在实现onReceive时,您将希望检查接收到的意图(intent)中的extras参数。
URL中的referrer参数是由Google Play(商店)接收到的唯一参数,用于推荐,因此在其中编码一些参数非常常见。对于Google Analytics,这意味着行业标准的utm_*参数,但您也可以使用其他参数。以下是我通常用于打开Google Play以安装和测试完整流程的测试adb命令。
adb shell "am start -a android.intent.action.VIEW -d \"https://play.google.com/store/apps/details?id=com.somecompany.package&referrer=utm_source%253Dtest_campaign_source%2526utm_medium%253Dtest_campaign_medium%2526utm_term%253Dtest_campaign_term%2526utm_content%253Dtest_campaign_content%2526utm_campaign%253Dtest_campaign_name\""

测试说明:

  • 在测试此流程时,非常重要的一点是检查上述命令是否生成了输出,并且意图仍然附带完整的引荐信息。转义可能不正确并悄悄地删除引荐。
  • 请记住,APK必须由Google Play(商店)安装到您正在测试的设备上(无法侧向加载)。因此,通常需要使用Google Play中的Alpha发行渠道进行测试。
  • 需要注意的是,如果设备版本高于Honeycomb MR1,则在首次启动应用程序后广播INSTALL_REFERRER意图,而不是在安装应用程序后广播。
  • 每次需要测试引荐器流程时,都需要重新安装应用程序。
  • 安装引荐跟踪仅在从Android Google Play应用程序安装应用程序时才有效,而不是在商店的Web版本中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接