com.android.vending.INSTALL_REFERRER不起作用

时间:2013-02-13 22:06:58

标签: android google-play broadcastreceiver install-referrer

我最初问过this question,关于在安装时通过市场链接将参数传递到我的应用中。

每个人似乎都在说BroadcastListener intent-filter行为com.android.vending.INSTALL_REFERRER。关于这一点的所有文档似乎暗示这是Google Analytics的功能(文档在v1中,但我现在只能下载v2 SDK ...这就是我正在使用的内容)。我无法通过这些链接传递数据。我有我的完整清单和我的广播听众。我已将谷歌分析包括在内,以防万一。

根本不起作用。我的广播监听器永远不会被调用,日志中不会打印出任何内容。救命啊!

的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");
        }
    }
}

3 个答案:

答案 0 :(得分:4)

所以xbakesx说,如果他的接收器扩展com.google.analytics.tracking.android.AnalyticsReceiver,它似乎有效。

<击>

我认为关键是意图具有...... AnalyticsReceiver的权限,因此没有其他没有扩展它的类可以获取意图。如果您查看他们的测试广播https://developers.google.com/analytics/solutions/testing-play-campaigns,它确实看起来特定于该课程。

如果您更改了该测试广播,以便您的班级替换com.google.analytics.tracking.android.AnalyticsReceiver,那么您可以接收它。最大的问题是他们似乎已经在测试版4或5中锁定了这个类。如果有人有链接到测试版3,我们可以测试一下,或者如果xbakex可以确认玩新的罐子会摇滚!

更新

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

很酷的是你根本不需要任何GA罐子!在这里查看我的测试项目:https://github.com/twotoasters/AnalyticsTest/该项目还向您展示如何解析链接以获取所需的所有信息。

答案 1 :(得分:4)

经过多次尝试失败后,我终于可以在logcat中看到传递的引用参数。

一路上,我想出了一些事情,我不太确定我是在做这个仪式还是错误,但由于某些原因,这些都奏效了。如果有人仍然坚持,他们可以从我的学习中得到一些指示。

一个。创建一个自定义的BroadcastReceiver,您可以在其中准备好意图。 (只有在您成功从ADB触发Install_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>

℃。确保正确安装了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之后的第一个引号是查询字符串/参数名称,第二个引号是值。同样,如果您必须添加多个值,请复制它,如上例所示。

电子。最后,最重要的部分让我一直感到沮丧 - 设备本身安装的应用程序。您的应用应该安装在设备上但根本不运行。要做到这一点,你必须&#34;强制关闭&#34;应用程序然后触发adb shell命令以启动install_referrer。那时候,你应该看到logcat点亮了所需的数据。

F。您可能还想在Google Play商店应用上卸载更新并将其恢复为出厂设置。有时(未确认)谷歌播放的版本决定了通过install_referrer传递给应用程序的数据,或者是否完全调用了引用者。

希望这有助于某人。

答案 2 :(得分:2)

使用意图过滤器在应用的AndroidManifest.xml中注册BroadcastReceiver,无论是否使用Google Analytics,都是应用安装推介的正确解决方案。

<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 services client library中,因此没有任何Java代码可以编写。如果您还没有,则还必须通过initial setup instructions获取适用于您应用的Google Analytics。

 <service android:name="com.google.android.gms.analytics.CampaignTrackingService" />

如果您不使用Google Analytics,则需要在java代码中定义自己的BroadcastReceiver。在实施onReceive时,您会希望它检查收到的意图上的额外内容。

Google Play(商店)收到的网址中的referrer参数是传递给Android应用程序的唯一参数,因此在其中编码一些参数非常常见。对于Google Analytics,这意味着行业标准的utm_ *参数,但您可以使用其他参数。这是我通常用于打开Goog​​le 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\""

测试说明:

  • 在测试此流程时,检查上述命令是否会导致输出,其中Intent已记录到您的控制台并且仍然附加了FULL引用者信息,这一点非常重要。转义非常容易,并且无声地丢弃引荐来源。
  • 请记住,Google Play(商店)必须已将APK安装到您正在测试的设备上(您无法侧载)。因此,您通常需要在Google Play中使用Alpha分发渠道对其进行测试。
  • 重要的是要注意,如果设备是&gt; = Honeycomb MR1,则在首次启动应用程序之后而不是在安装应用程序之后广播INSTALL_REFERRER意图。
  • 每次需要测试引荐来源流时,您都需要重新安装应用。
  • 从Android Google Play应用安装应用时会跟踪安装引荐,但不会跟踪商店的网络版。