С 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";
Клиент получает реферер 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-filter
для action
Intent.ACTION_PACKAGE_FIRST_LAUNCH
, который впоследствии соединяет InstallReferrerClient
с InstallReferrerService
. Невозможно запустить Intent.ACTION_PACKAGE_FIRST_LAUNCH
с помощью adb
, потому что он фильтрует "строку защищенного широковещательного действия", поэтому он может быть запущен только при установке из Play Store.
Реализация, согласно документации, может выглядеть примерно так:
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, а затем установка пакета через них ... иначе будет регистрироваться только реферер по умолчанию (кроме того, намерение даже не может быть запущено при правильной реализации клиента).
person
Martin Zeitler
schedule
09.09.2019