Los métodos de interfaz predeterminados solo son compatibles a partir de Android N


262

Actualicé a Android Studio 3.1 y recibo el siguiente error:

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

ingrese la descripción de la imagen aquí

aquí está mi configuración de gradle:

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

Como puede ver, estoy apuntando a 27, que ya está por delante de 24 de los que se queja. ¿Qué debo hacer exactamente para solucionar esto? Si cambio a 1.8 java, ¿no perderé muchos clientes? ¿Por qué no recibí este error antes de actualizar Android Studio?

No sé si se trata de la clase LifecycleObserver que instalé recientemente, estaba en kotlin y ahora la cambié a java pero sigo teniendo el mismo error después de limpiar el proyecto:

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

¿Cómo rastrear de dónde viene el error para poder solucionarlo?

Aquí están mis dependencias de versión:

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
"como pueden ver, estoy apuntando a 27, que ya está por delante de 24, ¿de qué se queja?" - No se queja de tu targetSdkVersion. "¿Qué debo hacer exactamente para arreglar esto?" - intente compilar con la compatibilidad Java 8 habilitada . "si cambio a 1.8 java, ¿no faltarán muchos clientes?" - no para los métodos de interfaz predeterminados de los que se queja el mensaje de error. "¿Por qué no recibí este error antes de actualizar Android Studio?", tal vez una dependencia implícita (por ejemplo, enlace de datos).
CommonsWare

2
@CommonsWare fue exactamente como lo mencionaste. el cambio a 1.8 resolvió el problema, pero tendré que verificarlo en dispositivos más antiguos para ver qué sucede. el código que lo hizo fue compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

Respuestas:


597

Como CommonsWare mencionó, para referencia agregue esto dentro del android {...}cierre en build.gradle para que el módulo de su aplicación resuelva el problema:

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

13
Especifique que debe estar dentro de la llave rizada de Android de esta manera: android {// add here}
Idee

3
@ j2emanue Ya agregué este en build.gradle, pero sigo teniendo el mismo problema, solo para la versión de lanzamiento
R4j

Tendría que ver su archivo Gradle, tanto los archivos Gradle de proyecto como los de módulo. Tal vez publicar una pregunta.
j2emanue

agregar esto mostrará una referencia no resuelta en la estructura del proyecto ¿alguna idea sobre eso?
Urvish rana

1
Suspiro ¿Por qué google no puede simplemente poner las cosas apropiadas en la configuración predeterminada del proyecto? ..
Roman Truba

65

Debe usar Java8 para resolver esto, basado en google puede hacerlo (haga clic en Archivo> Estructura del proyecto ). y cambiar la compatibilidad de origen y la compatibilidad de destino.

ingrese la descripción de la imagen aquí

Y también puede configurarlo directamente en el archivo build.gradle correspondiente:

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

Programador Thankuu. Buen trabajo
Zafar Iqbal

54

En gradle de nivel de aplicación, debe escribir este código:

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

Vienen de JavaVersion.java en Android.

Una enumeración de versiones de Java.

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

Después del 9: http://openjdk.java.net/jeps/223

@canerkaseler


1
gracias por la explicación e información sobre qué archivo actualizar. Nivel de aplicación o nivel de proyecto.
Lalit Sharma

31

Actualice su build.gradle (Módulo: aplicación) agregue compileOptionsbloque y agregueJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

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

25

Puede resolver este problema bajando la versión Java de compatibilidad de origen y compatibilidad de destino a 1.8 en la última versión de Android Studio 3.4.1

  1. Abra la Configuración del módulo (Estructura del proyecto) Winodw haciendo clic derecho en la carpeta de la aplicación o Comando + Flecha abajo en Mac ingrese la descripción de la imagen aquí

  2. Vaya a Módulos -> Propiedades ingrese la descripción de la imagen aquí

  3. Cambie la versión de compatibilidad de origen y de compatibilidad de destino a 1.8 ingrese la descripción de la imagen aquí

  4. Haga clic en Aplicar o Aceptar Eso es todo. Resolverá tu problema.

También puede agregar manualmente en build.gradle (Módulo: aplicación)

android {
...

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

...
}

1
Simplemente resolvió mi problema. Pero por favor, avísenme cómo demonios sabían que esta es la solución?
Mehrdad Seyrafi

5

Use este código en su build.gradle

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

2

Mi proyecto usa ButterKnife y Retro lambda, estableciendo JavaVersion.VERSION_1_8 no funcionará. Siempre culpa a la función de interfaz estática de ButterKnife hasta que encontré este Migrate from Retrolambda

TL; DR

Simplemente agregue JavaVersion.VERSION_1_8 y QUITE completamente la retrolambda de su proyecto. Se construirá con éxito.


0

Esto también me sucedió a mí pero usando las características dinámicas. Ya tenía habilitada la compatibilidad con Java 8 en el módulo de la aplicación, pero tuve que agregar estas líneas de compatibilidad al módulo Dynamic Feature y luego funcionó.


0

Establecer minSdkVersion en 21 de 19 resolvió el problema para mí.

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.