Ошибка при получении идентификатора рекламодателя

Я заметил, что мои данные электронной торговли 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 founderror) удерживал это и вызывал тайм-аут. После ее разрешения идентификатор объявления был успешно получен.

У меня была следующая ошибка

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;
        }
}