10

我最初问了这个问题,关于在安装时通过市场链接将参数传递到我的应用程序中。

似乎每个人都在说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");
        }
    }
}
4

3 回答 3

4

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

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

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

更新:

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

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

于 2013-07-22T21:49:44.733 回答
4

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

一路走来,我想出了一些事情,我不太确定我这样做是正确的还是错误的,但由于某些原因,这些都奏效了。如果有人仍然卡住,他们可以从我的学习中得到一些指导。

A. 创建一个自定义 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" >
        <意图过滤器>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </接收者>

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

E. 最后,让我一直感到沮丧的最重要的部分——安装在设备本身上的应用程序。您的应用程序应该安装在设备上,但根本不运行。为此,您必须“强制关闭”应用程序,然后启动 adb shell 命令来启动 install_referrer。那时,您应该会看到 logcat 亮起所需的数据。

F. 您可能还想卸载 google play store 应用上的更新并将其恢复为出厂设置。有时(未确认)google play 的版本决定了哪些数据通过 install_referrer 传递给应用程序,或者是否调用了referrer。

希望这可以帮助某人。

于 2014-04-14T21:32:33.797 回答
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 服务客户端库中,因此无需编写任何 Java 代码。如果您还没有,您还必须为您的应用程序完成 Google Analytics 的初始设置说明

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

如果您没有使用 Google Analytics,那么您需要在您的 java 代码中定义您自己的BroadcastReceiver 。在实现onReceive时,您将希望它检查接收到的意图的附加内容。

Google Play(商店)收到的 URL 中的 referrer 参数是唯一传递给 Android 应用程序的参数,因此在其中编码一些参数是很常见的。对于 Google Analytics,这意味着行业标准 utm_* 参数,但您可以使用其他参数。这是我通常用于打开 Google Play 以安装和测试完整流程的 test 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 已记录到您的控制台,并且仍附加完整的引用信息,这一点非常重要。转义很容易出错并默默地删除引荐来源网址。
  • 请记住,APK 必须已由 Google Play(商店)安装到您正在测试的设备上(您不能侧载)。因此,您通常需要使用您在 Google Play 中的 Alpha 分发渠道进行测试。
  • 需要注意的是,如果设备 >= Honeycomb MR1,则 INSTALL_REFERRER 意图在应用程序首次启动后广播,而不是在应用程序安装后广播。
  • 每次需要测试引荐流时,您都需要重新安装应用程序。
  • 从 Android Google Play 应用程序安装应用程序时会跟踪安装推荐,而不是商店的网络版本。
于 2015-06-12T01:04:56.900 回答