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'
    }
j2emanue
źródło
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
    }
...
}
j2emanue
źródło
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
  }
}
Amir
źródło
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

canerkaseler
źródło
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
    }
}
Vasudev Vyas
źródło
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'
    }

...
}
Rajesh Dalsaniya
źródło
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
    }
}
Mahabub Karim
źródło
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.

Leegor
źródło
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.

Joaquin Iurchuk
źródł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
    }
Ricky Roy
źródło