Si está utilizando Android Studio , el lenguaje Java 7 debe habilitarse automáticamente sin parches. Try-with-resource requiere API Level 19+, y faltan cosas de NIO 2.0.
Si no puede usar las características de Java 7, consulte la respuesta de @Nuno sobre cómo editar su build.gradle
.
Lo siguiente es solo para interés histórico.
Una pequeña parte de Java 7 ciertamente se puede usar con Android (nota: solo he probado en 4.1).
En primer lugar, no podría usar el ADT de Eclipse porque está codificado que solo el compilador Java 1.5 y 1.6 son compatibles. Podrías recompilar ADT, pero creo que no hay una manera simple de hacerlo, aparte de recompilar todo el Android juntos.
Pero no necesita usar Eclipse. Por ejemplo, Android Studio 0.3.2 , IntelliJ IDEA CE y otros IDE basados en javac admiten la compilación en Android y puede establecer el cumplimiento incluso hasta Java 8 con:
- Archivo → Estructura del proyecto → Módulos → (seleccione el módulo en el segundo panel) → Nivel de idioma → (elija "7.0 - Diamantes, ARM, captura múltiple, etc.")
Esto solo permite las características del lenguaje Java 7 , y difícilmente puede beneficiarse de nada, ya que la mitad de la mejora también proviene de la biblioteca. Las características que podría usar son aquellas que no dependen de la biblioteca:
- Operador de diamantes (
<>
)
- Interruptor de cuerda
- Captura múltiple (
catch (Exc1 | Exc2 e)
)
- Subrayado en literales numéricos (
1_234_567
)
- Literales binarios (
0b1110111
)
Y estas características aún no se pueden usar :
- La
try
declaración -with-resources - porque requiere la interfaz no existente "java.lang.AutoCloseable" (esto se puede usar públicamente en 4.4+)
- La anotación @SafeVarargs, porque "java.lang.SafeVarargs" no existe
... "todavía" :) Resulta que, aunque la biblioteca de Android está dirigida a 1.6, la fuente de Android contiene interfaces como AutoCloseable e interfaces tradicionales como Closeable hereda de AutoCloseable (sin embargo, SafeVarargs realmente falta). Podríamos confirmar su existencia a través de la reflexión. Están ocultos simplemente porque el Javadoc tiene la @hide
etiqueta, lo que provocó que "android.jar" no los incluyera.
Ya existe una pregunta existente ¿ Cómo construyo el SDK de Android con API ocultas e internas disponibles? sobre cómo recuperar esos métodos. Solo necesita reemplazar la referencia "android.jar" existente de la Plataforma actual con nuestra personalizada, luego muchas de las API de Java 7 estarán disponibles (el procedimiento es similar al de Eclipse. Verifique la Estructura del Proyecto → SDK).
Además de AutoCloseable, (solo) también se revelan las siguientes características de la biblioteca Java 7 :
- Constructores de encadenamiento de excepciones en ConcurrentModificationException, LinkageError y AssertionError
- Los métodos estáticos .compare () para primitivas: Boolean.compare (), Byte.compare (), Short.compare (), Character.compare (), Integer.compare (), Long.compare ().
- Moneda : .getAvailableCur Currency (), .getDisplayName () (pero sin .getNumericCode ())
- BitSet : .previousSetBit (), .previousClearBit (), .valueOf (), .toLongArray (), .toByteArray ()
- Colecciones : .emptyEnumeration (), .emptyIterator (), .emptyListIterator ()
- AutoCloseable
- Throwable : .addSuppressed (), .getSuppressed (), y el constructor de 4-argumento
- Carácter : .compare (), .isSurrogate (), .getName (), .highSurrogate (), .lowSurrogate (), .isBmpCodePoint () (pero sin .isAlphabetic () y .isIdeographic ())
- Sistema: .lineSeparator () (¿no documentado?)
- java.lang.reflect.Modifier : .classModifiers (), .constructorModifiers (), .fieldModifiers (), .interfaceModifiers (), .methodModifiers ()
- NetworkInterface : .getIndex (), .getByIndex ()
- InetSocketAddress : .getHostString ()
- InetAddress : .getLoopbackAddress ()
- Registrador : .getGlobal ()
- ConcurrentLinkedDeque
- AbstractQueuedSynchronizer : .hasQueuedPredecessors ()
- DeflaterOutputStream : los 3 constructores con "syncFlush".
- Deflater : .NO_FLUSH, .SYNC_FLUSH, .FULL_FLUSH, .deflate () con 4 argumentos
Eso es básicamente todo. En particular, NIO 2.0 no existe y Arrays.asList todavía no es @SafeVarargs.