有很多示例如何测试检测安装引荐来源网址的“默认”方式,但是没有示例如何测试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"
不起作用,因为我们不知道
receiver
路径。那么如何测试呢? 最佳答案
对于InstallReferrerClient,似乎在BroadcastReceiver
中没有注册任何AndroidManifest.xml
。该库仅绑定(bind)到系统的安装引荐来源服务...
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_referrer
,referrer_click_timestamp_seconds
和install_begin_timestamp_seconds
(如果要尝试模拟它们)-但是onInstallReferrerSetupFinished()
回调将间接传递结果。该文档还指出:
因此,这应该是
intent-filter
action
的Intent.ACTION_PACKAGE_FIRST_LAUNCH
,随后将InstallReferrerClient
连接到InstallReferrerService
。一个人无法使用Intent.ACTION_PACKAGE_FIRST_LAUNCH
触发adb
,因为它会过滤“ protected 广播操作字符串”,因此只有在从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商店的引荐来源网址链接,然后通过它们安装软件包...否则,将仅记录默认引荐来源地址(除了在正确实现客户端时甚至无法触发意图)。