Предполагается, что GoogleApiClient.connect() 'будет иметь интерфейс типа, но был признан виртуальным

Итак, я подключаюсь к клиенту google api, как это.

        googleApiClient = new GoogleApiClient.Builder(context)
        .addApi(LocationServices.API)
        .addApi(ActivityRecognition.API)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();
        googleApiClient.connect();

Этот точный код, который я использую в нескольких местах, хорошо работает. Это не отличается от того, что вы видите в своих учебниках. Но теперь:

java.lang.IncompatibleClassChangeError: метод 'void com.google.android.gms.common.api.GoogleApiClient.connect() 'был как ожидается, будет иметь интерфейс типа, но вместо этого был найден тип virtual (объявление "java.lang.reflect.ArtMethod" появляется в /system/framework/core -libart.jar)

Строка, в которой отображаются отчеты stacktrace:

googleApiClient.connect();

Использование игровых сервисов 8.1

compile 'com.google.android.gms:play-services:8.1.0'

Кто-нибудь это сказал?

Ответы

Ответ 1

Проблема возникает из одной из библиотек, от которой зависит ваше приложение, и библиотеки, которая также зависит от сервисов Google Play.

В этой библиотеке используется более ранняя версия SDK Google Play Services, и она по-прежнему полагается на то, что класс GoogleApiClient является интерфейсом. Это изменилось в 8.1.0, где он стал абстрактным классом. Это нарушает обратную совместимость из-за транзитивных зависимостей библиотек.

Посмотрите, есть ли в этой библиотеке новая обновленная версия с 8.1.0 или удалите эту зависимость, если это возможно.

Дополнительное объяснение можно найти здесь.

Ответ 2

Это ошибка в библиотеке Служебных услуг 8.1.0. Решил его, понизив библиотеку игровых сервисов.

изменить

compile 'com.google.android.gms:play-services:8.1.0'

к

compile 'com.google.android.gms:play-services:7.8.+'

И ошибка больше не появляется. Мой другой код работал (как упоминалось в вопросе, потому что они использовали более старую версию библиотеки) Это нужно будет сделать, пока Google не опубликует обновление.

Обновление: Я написал это до того, как появился другой ответ от galex. Это правильный ответ. Но если вам не удастся найти библиотеки, у которых есть эти конфликты версий, или если вы не можете изменить эти зависимости в библиотеке, решение состоит в том, чтобы понизить версию воспроизведения до 7.8

Ответ 3

      compile 'com.google.android.gms:play-services:7.8.+'
compile 'com.google.android.gms:play-services-maps:7.8.+'

Решено для меня через 10 часов!