Les méthodes d'interface par défaut ne sont prises en charge qu'à partir d'Android N

262

J'ai effectué une mise à niveau vers Android Studio 3.1 et j'obtiens l'erreur suivante:

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

entrez la description de l'image ici

voici ma config gradle:

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

Comme vous pouvez le voir, je cible 27 qui est déjà en avance sur 24 dont il se plaint. Que dois-je faire exactement pour résoudre ce problème? Si je passe à la version 1.8 java, ne manquerai-je pas beaucoup de clients? Pourquoi n'ai-je pas eu cette erreur avant de mettre à niveau Android Studio?

Je ne sais pas s'il s'agit de la classe LifecycleObserver que j'ai récemment installée, c'était dans kotlin et maintenant je l'ai changé en java mais j'obtiens toujours la même erreur après le nettoyage du projet:

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

Comment savoir d'où vient l'erreur pour que je puisse la corriger?

voici mes dépendances de version:

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
la source
20
"comme vous pouvez le voir, je cible 27 qui est déjà en avance sur 24 dont il se plaint?" - il ne se plaint pas de votre targetSdkVersion. "Que dois-je faire exactement pour résoudre ce problème?" - essayez de compiler avec la compatibilité Java 8 activée . "Si je passe à la version 1.8 java, ne manquerai-je pas beaucoup de clients?" - pas pour les méthodes d'interface par défaut dont le message d'erreur se plaint. "pourquoi je n'obtenais pas cette erreur avant de mettre à jour android studio." - peut-être une dépendance implicite (par exemple, la liaison de données).
CommonsWare
2
@CommonsWare, c'était exactement comme vous l'avez mentionné. le passage à la version 1.8 a résolu le problème, mais je devrai le vérifier sur les anciens appareils pour voir ce qui se passe. le code qui l'a fait était compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

Réponses:

597

Comme CommonsWare l'a mentionné, pour référence, ajoutez ceci dans la android {...}fermeture du build.gradle de votre module d'application pour résoudre le problème:

android {
...
  compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
...
}
j2emanue
la source
13
Veuillez spécifier qu'il devrait être à l'intérieur de l'accolade frisée android comme ceci: android {// ajouter ici}
Idee
3
@ j2emanue J'ai déjà ajouté celui-ci dans build.gradle, mais j'ai toujours le même problème, uniquement pour la version build
R4j
je devrais voir votre fichier gradle à la fois les fichiers gradle du projet et du module. peut-être poster une question.
j2emanue
l'ajout de cela affichera une référence non retirée dans la structure du projet, une idée à ce sujet?
Urvish rana
1
Soupir Pourquoi Google ne peut pas simplement mettre les choses appropriées dans les paramètres de projet par défaut? ..
Roman Truba
65

Vous devez utiliser Java8 pour résoudre ce problème, basé sur Google, vous pouvez le faire en (cliquez sur Fichier> Structure du projet ). et modifiez la compatibilité source et la compatibilité cible.

entrez la description de l'image ici

Et vous pouvez également le configurer directement dans le fichier build.gradle correspondant:

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
la source
Thankuu programmer.Nice Job
Zafar Iqbal
54

Dans Gradle au niveau de l'application, vous devez écrire le code suivant:

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

Ils viennent de JavaVersion.java dans Android.

Une énumération des versions Java.

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

Après le 9: http://openjdk.java.net/jeps/223

@canerkaseler

canerkaseler
la source
1
merci pour l'explication et les informations sur le fichier à mettre à jour. Au niveau de l'application ou au niveau du projet.
Lalit Sharma
31

Mettez à jour votre build.gradle (Module: app) ajoutez un compileOptionsbloc et ajoutezJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

android {
    .................
    .........................
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Vasudev Vyas
la source
25

Vous pouvez résoudre ce problème en rétrogradant la compatibilité Java source et compatibilité cible vers la version 1.8 dans la dernière version d'Android Studio 3.4.1.

  1. Ouvrez les paramètres du module (structure du projet) Winodw en cliquant avec le bouton droit sur le dossier de l'application ou sur Commande + Flèche bas sur Mac entrez la description de l'image ici

  2. Allez dans Modules -> Propriétés entrez la description de l'image ici

  3. Changer la version de compatibilité source et de compatibilité cible en 1.8 entrez la description de l'image ici

  4. Cliquez sur Appliquer ou OK C'est tout. Cela résoudra votre problème.

Vous pouvez également ajouter manuellement dans build.gradle (Module: app)

android {
...

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

...
}
Rajesh Dalsaniya
la source
1
Cela a juste résolu mon problème. Mais s'il vous plaît, dites-moi comment diable saviez-vous que c'est la solution?
mehrdad seyrafi
5

Utilisez ce code dans votre build.gradle

android {
    compileOptions {
        incremental true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Mahabub Karim
la source
2

Mon projet utilise ButterKnife et Retro lambda, définir JavaVersion.VERSION_1_8 ne fonctionnera pas. Il blâme toujours la fonction d'interface statique de ButterKnife jusqu'à ce que je trouve ce Migrate from Retrolambda

TL; DR

Ajoutez simplement JavaVersion.VERSION_1_8 et RETIREZ complètement retrolambda de votre projet. Il se construira avec succès.

leegor
la source
0

Cela m'est également arrivé, mais en utilisant les fonctionnalités dynamiques. J'ai déjà activé la compatibilité Java 8 dans le module d'application, mais j'ai dû ajouter ces lignes de compatibilité au module Dynamic Feature, puis cela a fonctionné.

Joaquin Iurchuk
la source
0

La définition de minSdkVersion à 21 sur 19 a résolu le problème pour moi.

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
ricky roy
la source