int*_*_32 7 android google-play google-play-services install-referrer
有很多示例如何测试检测安装引用程序的“默认”方式,但是没有示例如何测试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"
Run Code Online (Sandbox Code Playgroud)
不起作用,因为我们不知道receiver路径。那么如何测试呢?
使用InstallReferrerClient,BroadcastReceiver在AndroidManifest.xml. 该库只是绑定到系统的安装引用服务......
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";
Run Code Online (Sandbox Code Playgroud)
客户端utm_source=google-play&utm_medium=organic在手动安装时收到引用。没有BroadcastReceiver暴露(但InstallReferrerService应该有一个)。
原始的钥匙Intent Bundle是:install_referrer,referrer_click_timestamp_seconds并且install_begin_timestamp_seconds如果你想尝试效仿它-但onInstallReferrerSetupFinished()回调将间接传递的结果。
该文件还指出:
安装引用信息将在 90 天内可用,除非重新安装应用程序,否则不会更改。为避免应用中不必要的 API 调用,您应该在安装后的第一次执行期间只调用一次 API。您的应用程序可以侦听系统广播
Intent.ACTION_PACKAGE_FIRST_LAUNCH以识别应用程序的第一次执行。
所以这应该是一个intent-filterfor action Intent.ACTION_PACKAGE_FIRST_LAUNCH,它随后将 连接InstallReferrerClient到InstallReferrerService。一个不能触发Intent.ACTION_PACKAGE_FIRST_LAUNCH用adb,因为它过滤了“保护广播操作字符串”,因此从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>
Run Code Online (Sandbox Code Playgroud)
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()");
}
}
Run Code Online (Sandbox Code Playgroud)
要对此进行测试,您需要指向 Play 商店的引用链接,然后通过它们安装软件包……否则只会记录默认引用(除了在正确实施客户端时甚至无法触发意图)。
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |