Ошибка при получении идентификатора рекламодателя
Я заметил, что мои данные электронной торговли Google Analytics неправильно доставляются моим приложением для Android, в то время как все остальные данные аналитики (просмотры экрана, исключения) публикуются правильно.
Я уже открыл награду за эту тему, но копая дальше, я обнаружил некоторые ошибки в logcat:
Ошибка при получении идентификатора рекламодателя: java.io.IOException: java.util.concurrent.TimeoutException: истекло время ожидания подключения к службе
Успешно связан с сервисом, но не получил обратный вызов onServiceConnected
Я подозреваю, что эти ошибки происходят из-за того, что что-то не работает на уровне play-services, поэтому я открываю новую ветку.
Так как вышеупомянутые ошибки появляются в журналах до доставки хитов, моя теория состоит в том, что из-за них мои данные электронной торговли публикуются неправильно. Кто-нибудь здесь видел что-нибудь подобное? Что я мог попробовать, чтобы это исправить?
Пожалуйста, обратите внимание, что я использую (взято из build.gradle)
compile 'com.google.android.gms:play-services-analytics:9.4.0'
compile 'com.google.android.gms:play-services-ads:9.4.0'
apply plugin: 'com.google.gms.google-services'
и плагин Gradle
classpath 'com.android.tools.build:gradle:2.2.0-beta1'
4 ответа
Я исправил эту ошибку, добавив ее в dependencies
блокировать в gradle.build
файл:
implementation 'com.google.android.gms:play-services-base:16.0.1'
В моем случае еще одна ошибка (A Virtual method not found
error) удерживал это и вызывал тайм-аут. После ее разрешения идентификатор объявления был успешно получен.
У меня была следующая ошибка
java.util.concurrent.TimeoutException: истекло время ожидания подключения службы
Ошибка была исправлена после того, как вызывающий метод был перемещен в неосновной поток. Я не уверен, что это решение вам поможет, но вы можете его проверить.
Из моих последних тестов кажется, что
onServiceConnected
не вызывается при попытке получить идентификатор Android из основного потока. Это может привести к взаимоблокировкам (как в случае @DimPar) и к исключениям тайм-аута, когда вы пытаетесь предотвратить взаимоблокировку с помощью тайм-аута на
Thread.join
. Кажется, что Android не позволяет внешнему SDK создавать отдельные потоки (даже если они делают это напрямую, создавая новый поток и запуская его). Другими словами, если вы используете SDK, который пытается получить идентификатор Android, даже если он должен работать, это не сработает. Решением этого будет вызов всех внешних функций SDK в отдельном потоке, который вы создаете в действии. Вот пример из моего личного опыта.
Взаимоблокируются следующие блоки кода:
public class MainActivity extends AppCompatActivity {
static boolean doOnce = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if( doOnce ) {
ExternalSDKClass.StartInitialization();
doOnce = false;
}
}
Следующий блок кода работает
public class MainActivity extends AppCompatActivity {
Thread ExternalSDKThread = new Thread() {
@Override
public void run() {
try {
ExternalSDKClass.StartInitialization();
} catch (Exception e) {
Log.i("SDK ERROR", "getAdvertisingIdInfo Exception: " + e.toString());
}
}
};
//---------------------------------
static boolean doOnce = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if( doOnce ) {
ExternalSDKThread.start();
doOnce = false;
}
}