Domyślne metody interfejsu są obsługiwane tylko w systemie Android N.


262

Uaktualniłem do Androida Studio 3.1 i pojawia się następujący błąd:

    Default interface methods are only supported starting with Android N (--min-api 24): void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner)
Message{kind=ERROR, text=Default interface methods are only supported starting with Android N (--min-api 24): void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner), sources=[Unknown source file], tool name=Optional.of(D8)}

wprowadź opis zdjęcia tutaj

oto moja konfiguracja stopni:

compileSdkVersion 27
//buildToolsVersion '27.0.3'
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 27
     multiDexEnabled true
     //...
   }

Jak widać, celuję w 27, które są już przed 24, na które narzeka. Co dokładnie powinienem zrobić, aby to naprawić? Jeśli przejdę na wersję java 1.8, czy nie stracę wielu klientów? Dlaczego nie otrzymałem tego błędu przed uaktualnieniem studia Android?

Nie wiem, czy chodzi o klasę LifecycleObserver, którą ostatnio wprowadziłem, była w kotlin, a teraz zmieniłem ją na java, ale po czyszczeniu projektu nadal pojawia się ten sam błąd:

    public class LifeCycleAwareObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void  onAppBackgrounded() {
        AnalyticsUtils.trackStartSession(true);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onAppForegrounded() {
        AnalyticsUtils.trackStartSession(false);
    }
}

Jak ustalić, skąd pochodzi błąd, aby go naprawić?

oto moje zależności wersji:

project.ext {

        firebase_version = '12.0.0'

        supportlib_version = '27.0.2'

        room_version = '1.0.0'

        espresso_version = '3.0.1'

        archLifecycleVersion = '1.1.1'
    }

20
„jak widzisz, kieruję reklamy na 27, które są już przed 24, na które narzeka?” - to nie narzeka na twoje targetSdkVersion. „Co dokładnie powinienem zrobić, aby to naprawić?” - spróbuj skompilować z włączoną kompatybilnością Java 8 . „jeśli przejdę na wersję 1.8 java, czy nie będę mieć wielu klientów?” - nie dotyczy domyślnych metod interfejsu, na które narzeka komunikat o błędzie. „dlaczego nie otrzymałem tego błędu przed uaktualnieniem Android Studio.” - być może ukryta zależność (np. powiązanie danych).
CommonsWare

2
@CommonsWare było dokładnie tak, jak wspomniałeś. zmiana na 1.8 rozwiązała problem, ale będę musiał to sprawdzić na starszych urządzeniach, aby zobaczyć, co się stanie. kod, który to zrobił, to compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

Odpowiedzi:


596

Jak wspomniano CommonsWare, w celach informacyjnych dodaj to wewnątrz android {...}zamknięcia w build.gradle, aby moduł aplikacji rozwiązał problem:

android {
...
  compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
...
}

13
Podaj, że powinien on znajdować się w nawiasach klamrowych na Androida w taki sposób: android {// dodaj tutaj}
Idee

3
@ j2emanue Dodałem już ten plik w build.gradle, ale nadal mam ten sam problem, tylko w przypadku wydania kompilacji
R4j

musiałbym zobaczyć twój plik oceny zarówno pliki oceny projektu, jak i modułu. może opublikować pytanie.
j2emanue

dodanie tego pokaże niekochane odniesienie do struktury projektu, jakieś pojęcie na ten temat?
Urvish rana

1
Westchnienie Dlaczego Google nie może po prostu umieścić odpowiednich rzeczy w domyślnych ustawieniach projektu? ..
Roman Truba

65

Aby rozwiązać ten problem, powinieneś użyć Java8, w oparciu o Google możesz to zrobić, klikając ( Plik> Struktura projektu ). i zmień Zgodność źródła i Zgodność docelową.

wprowadź opis zdjęcia tutaj

Możesz także skonfigurować go bezpośrednio w odpowiednim pliku build.gradle:

android {
  ...
  // Configure only for each module that uses Java 8
  // language features (either in its source code or
  // through dependencies).
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Programista Thankuu. Dobra robota
Zafar Iqbal

53

W gradacji na poziomie aplikacji musisz napisać następujący kod:

android {
...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Pochodzą z JavaVersion.java na Androida.

Wyliczenie wersji Java.

Przed 9: http://www.oracle.com/technetwork/java/javase/versioning-naming-139433.html

Po 9: http://openjdk.java.net/jeps/223

@canerkaseler


1
dzięki za wyjaśnienie i informacje o tym, który plik zaktualizować. Poziom aplikacji lub poziom projektu.
Lalit Sharma

30

Zaktualizuj swój build.gradle (moduł: aplikacja) dodaj compileOptionsblok i dodajJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

android {
    .................
    .........................
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

25

Możesz rozwiązać ten problem, obniżając zgodność źródła i docelową zgodność Java w wersji Java do 1.8 w najnowszej wersji Android Studio 3.4.1

  1. Otwórz Ustawienia modułu (Struktura projektu) Winodw, klikając prawym przyciskiem myszy folder aplikacji lub Command + Strzałka w dół na komputerze Mac wprowadź opis zdjęcia tutaj

  2. Przejdź do Moduły -> Właściwości wprowadź opis zdjęcia tutaj

  3. Zmień wersję kompatybilności źródła i docelowej wersji na 1.8 wprowadź opis zdjęcia tutaj

  4. Kliknij Zastosuj lub OK To jest to. To rozwiąże twój problem.

Możesz także ręcznie dodać w build.gradle (moduł: aplikacja)

android {
...

compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }

...
}

1
Właśnie rozwiązało mój problem. Ale proszę powiedz mi, skąd, do cholery, wiedziałeś, że to rozwiązanie?
mehrdad seyrafi

5

Użyj tego kodu w swoim build.gradle

android {
    compileOptions {
        incremental true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

2

Mój projekt używa ButterKnife i Retro lambda, ustawienie JavaVersion.VERSION_1_8 nie będzie działać. Zawsze obwinia za statyczną funkcję interfejsu ButterKnife, dopóki tego nie znalazłem Migracji z Retrolambdy

TL; DR

Po prostu dodaj JavaVersion.VERSION_1_8 i całkowicie USUŃ retrolambda z twojego projektu. Zbuduje się pomyślnie.


0

Zdarzyło mi się to również przy użyciu funkcji dynamicznych. Miałem już włączoną kompatybilność z Java 8 w module aplikacji, ale musiałem dodać te linie zgodności do modułu Dynamic Feature, a potem zadziałało.


0

Ustawienie minSdkVersion na 21 z 19 rozwiązało problem.

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.