如何使用Google的installreferrer库测试安装引用?

12

有很多例子可以测试“默认”检测安装引荐的方法,但是没有例子可以测试com.android.installreferrer:installreferrer库。

像这样的例子:

adb shell am broadcast -a com.android.vending.INSTALL_REFERRER 
                       -n your.package.name/path.to.receiver --es referrer
                       --es referrer "EXTRA_STRING_VALUE"

无法工作,因为我们不知道接收方的路径。那么如何测试它呢?

3个回答

11

使用InstallReferrerClient时,似乎没有在AndroidManifest.xml中注册任何BroadcastReceiver。该库只是绑定到系统的安装引荐服务...

private static final String SERVICE_PACKAGE_NAME = "com.android.vending";
private static final String SERVICE_NAME = "com.google.android.finsky.externalreferrer.GetInstallReferrerService";
private static final String SERVICE_ACTION_NAME = "com.google.android.finsky.BIND_GET_INSTALL_REFERRER_SERVICE";

客户在手动安装时会收到引荐人 utm_source=google-play&utm_medium=organic。没有暴露 BroadcastReceiver(但是 InstallReferrerService 应该有一个)。
原始的 Intent Bundle 的键是:install_referrerreferrer_click_timestamp_secondsinstall_begin_timestamp_seconds,如果您想尝试模拟它 - 但是 onInstallReferrerSetupFinished() 回调将间接地提供结果。
文档还指出:

安装引荐信息将可用90天,并且除非重新安装应用程序,否则不会更改。为避免您的应用程序中不必要的 API 调用,您应该在安装后仅在第一次执行期间调用 API。您的应用程序可以监听系统广播 Intent.ACTION_PACKAGE_FIRST_LAUNCH 来识别应用程序的第一次执行。


这应该是一个针对action Intent.ACTION_PACKAGE_FIRST_LAUNCHintent-filter,随后将InstallReferrerClient连接到InstallReferrerService。无法使用adb触发Intent.ACTION_PACKAGE_FIRST_LAUNCH,因为它过滤了“受保护的广播操作字符串”,因此只有在从Play商店安装时才能触发。根据文档,实现可能如下所示:

AndroidManifest.xml:

<receiver
    android:name=".receiver.PackageStatusReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_FIRST_LAUNCH"/>
    </intent-filter>
</receiver>

PackageStatusReceiver.java:

public class PackageStatusReceiver extends BroadcastReceiver implements InstallReferrerStateListener {

    protected static final String LOG_TAG = PackageStatusReceiver.class.getSimpleName();

    private InstallReferrerClient referrerClient;

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction() != null) {
            if(intent.getAction().equals(Intent.ACTION_PACKAGE_FIRST_LAUNCH)) {
                this.referrerClient = InstallReferrerClient.newBuilder(context).build();
                this.referrerClient.startConnection(this);
            }
        }
    }

    @Override
    public void onInstallReferrerSetupFinished(int responseCode) {
        switch (responseCode) {
            case InstallReferrerClient.InstallReferrerResponse.OK:
                Log.d(LOG_TAG, "InstallReferrer Response.OK");
                try {
                    ReferrerDetails response = referrerClient.getInstallReferrer();
                    String referrer = response.getInstallReferrer();
                    long clickTimestamp = response.getReferrerClickTimestampSeconds();
                    long installTimestamp = response.getInstallBeginTimestampSeconds();
                    Log.d(LOG_TAG, "InstallReferrer " + referrer);
                    referrerClient.endConnection();
                } catch (RemoteException e) {
                    Log.e(LOG_TAG, "" + e.getMessage());
                }
                break;
            case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED:
                Log.w(LOG_TAG, "InstallReferrer Response.FEATURE_NOT_SUPPORTED");
                break;
            case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE:
                Log.w(LOG_TAG, "InstallReferrer Response.SERVICE_UNAVAILABLE");
                break;
            case InstallReferrerClient.InstallReferrerResponse.SERVICE_DISCONNECTED:
                Log.w(LOG_TAG, "InstallReferrer Response.SERVICE_DISCONNECTED");
                break;
            case InstallReferrerClient.InstallReferrerResponse.DEVELOPER_ERROR:
                Log.w(LOG_TAG, "InstallReferrer Response.DEVELOPER_ERROR");
                break;
        }
    }

    @Override
    public void onInstallReferrerServiceDisconnected() {
        Log.w(LOG_TAG, "InstallReferrer onInstallReferrerServiceDisconnected()");
    }
}

为了测试这个,你需要通过引荐链接到Play Store并通过它们安装包...否则只有默认的引荐者将被记录(除非在正确实现客户端时甚至无法触发意图)。

我应该使用哪个参数来获取UTM参数? - Vikas Rai
我建议将referrerClient.endConnection()调用移动到InstallReferrerClient.InstallReferrerResponse.OK情况下的"finally"块中,因为response.getInstallReferrer()可能会抛出异常,而连接将保持打开状态。 - haksist
“referrer信息将在90天内可用,除非应用程序被重新安装,否则不会更改”这是什么意思? 我应该永久存储本地存储中的数据还是需要在90天后执行特定操作?请帮忙。 - Jay Patel

2

您可以通过在Play Market控制台设置应用的内部测试版本来测试安装属性(referrer)。然后,使用来自Play Market URL生成器的修改链接。


1

我已经通过USB使用了物理设备。

1 将应用程序放在Play Store上并获得批准

2 最重要的步骤:在例如,我仅使用最后一个值上构建正确的链接。同样重要的是,在广告网络字段下选择自定义,否则它将在测试时工作,但在没有指定广告网络的情况下不会在生产中工作

3 将链接发送到手机上的电子邮件

4 点击刚发送的链接。它会运行Play Store(不要从Play Store安装)

5所需内容添加到主活动中(不要使用过时和过时的文档)。使用Android StudioRun按钮启动应用程序。按Home键将应用程序退出屏幕,然后按Recent按钮滑动以删除应用程序

6 Play商店的“安装”按钮(现在)应该显示为“打开” 点击按钮。现在,您可以处理response.getInstallReferrer(),例如在日志中查看


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