Descripción general de las funciones y API

Android 15 incluye excelentes funciones y APIs para desarrolladores. En las siguientes secciones, se resumen estas funciones para ayudarte a comenzar a usar las APIs relacionadas.

Para obtener una lista detallada de las APIs agregadas, modificadas y quitadas, consulta el informe de diferencias de la API. Para obtener detalles sobre las APIs agregadas, consulta la referencia de la API de Android. En Android 15, busca las APIs que se agregaron en el nivel de API 35. Para conocer las áreas en las que los cambios de la plataforma podrían afectar tus apps, asegúrate de revisar los cambios en el comportamiento de Android 15 para apps orientadas a Android 15 y para todas las apps.

Cámara y contenido multimedia

Android 15 incluye una variedad de funciones que mejoran la experiencia de la cámara y los medios, y que te brindan acceso a herramientas y hardware para ayudar a los creadores a hacer realidad su visión en Android.

Para obtener más información sobre las funciones y soluciones para desarrolladores más recientes de la cámara y el contenido multimedia de Android, consulta la charla Building modern Android media and camera experiences de Google I/O.

Mejora con poca luz

Android 15 presenta Mejora de poca luz, un modo de exposición automática disponible para Camera 2 y la extensión de cámara del modo nocturno. La mejora con poca luz ajusta la exposición de la transmisión de vista previa en condiciones de poca luz. Esto es diferente de la forma en que la extensión de cámara del modo nocturno crea imágenes fijas, ya que el modo nocturno combina una ráfaga de fotos para crear una sola imagen mejorada. Si bien el modo nocturno funciona muy bien para crear una imagen fija, no puede crear una transmisión continua de fotogramas, pero el modo de mejora con poca luz sí puede hacerlo. Por lo tanto, el modo de poca luz habilita las siguientes funciones de la cámara:

  • Proporciona una vista previa de imagen mejorada para que los usuarios puedan encuadrar mejor sus fotos con poca luz.
  • Cómo escanear códigos QR con poca luz

Si habilitas la función de mejora de poca luz, esta se activa automáticamente cuando hay un nivel de luz bajo y se desactiva cuando hay más luz.

Las apps pueden grabar desde la transmisión de vista previa en condiciones de poca luz para guardar un video más brillante.

Para obtener más información, consulta Aumento de poca luz.

Controles de cámara en la app

Android 15 agrega una extensión para tener más control sobre el hardware de la cámara y sus algoritmos en dispositivos compatibles:

  • Ajustes avanzados de la intensidad del flash que permiten un control preciso de la intensidad del flash en los modos SINGLE y TORCH mientras se capturan imágenes.

Control de margen de HDR

Android 15 elige el margen de HDR adecuado para las capacidades subyacentes del dispositivo y la profundidad de bits del panel. En el caso de las páginas que tienen mucho contenido SDR, como una app de mensajería que muestra una sola miniatura HDR, este comportamiento puede influir de manera negativa en el brillo percibido del contenido SDR. Android 15 te permite controlar el margen de HDR con setDesiredHdrHeadroom para lograr un equilibrio entre el contenido SDR y HDR.

El brillo de los elementos de la IU de SDR en la pantalla izquierda parece ser más uniforme que el de la pantalla derecha, lo que simula posibles problemas de margen cuando se mezcla el contenido HDR y SDR. Si ajustas el margen de HDR, puedes lograr un mejor equilibrio entre el contenido SDR y HDR.

Control de volumen

Android 15 引入了对 CTA-2075 响度标准的支持,可帮助您避免音频响度不一致,并确保用户在切换内容时不必不断调整音量。系统利用输出设备(头戴式耳机和扬声器)的已知特性以及 AAC 音频内容中提供的响度元数据,智能调整音频响度和动态范围压缩级别。

如需启用此功能,您需要确保 AAC 内容中提供响度元数据,并在应用中启用平台功能。为此,您可以通过使用关联的 AudioTrack 中的音频会话 ID 调用其 create 工厂方法来实例化 LoudnessCodecController 对象;这会自动开始应用音频更新。您可以传递 OnLoudnessCodecUpdateListener 来修改或过滤响度参数,然后再将其应用于 MediaCodec

// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = 
val audioTrack = AudioTrack.Builder()
                                .setSessionId(sessionId)
                                .build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
   val lcController = LoudnessCodecController.create(mSessionId)
   // Starts applying audio updates for each added MediaCodec
}

AndroidX media3 ExoPlayer 也将更新,以使用 LoudnessCodecController API,可实现无缝应用集成。

Dispositivos MIDI 2.0 virtuales

Android 13 agregó compatibilidad para conectarse a dispositivos MIDI 2.0 a través de USB, que se comunican con paquetes MIDI universales (UMP). Android 15 extiende la compatibilidad con UMP a las apps de MIDI virtual, lo que permite que las apps de composición controlen las apps de sintetizador como un dispositivo MIDI 2.0 virtual, al igual que lo harían con un dispositivo MIDI 2.0 USB.

Decodificación de software AV1 más eficiente

Logotipo de dav1d

dav1d, el popular decodificador de software AV1 de VideoLAN, está disponible para dispositivos Android que no admiten la decodificación de AV1 en hardware. dav1d tiene hasta 3 veces más rendimiento que el decodificador de software AV1 heredado, lo que permite la reproducción de AV1 en HD para más usuarios, incluidos algunos dispositivos de nivel bajo y medio.

Tu app debe habilitar el uso de dav1d invocándolo por nombre "c2.android.av1-dav1d.decoder". dav1d se convertirá en el decodificador de software de AV1 predeterminado en una actualización posterior. Esta compatibilidad está estandarizada y se ofrece portabilidad a los dispositivos Android 11 que reciben actualizaciones del sistema de Google Play.

Productividad y herramientas para desarrolladores

Si bien la mayor parte de nuestro trabajo para mejorar tu productividad se centra en herramientas como Android Studio, Jetpack Compose y las bibliotecas de Android Jetpack, siempre buscamos formas de ayudarte a hacer realidad tu visión con mayor facilidad en la plataforma.

Actualizaciones de OpenJDK 17

Android 15 continúa la tarea de actualizar las bibliotecas principales de Android para alinearlas con las funciones de las versiones más recientes de LTS de OpenJDK.

Se incluyen las siguientes funciones y mejoras clave:

Estas APIs se actualizan en más de mil millones de dispositivos que ejecutan Android 12 (nivel de API 31) y versiones posteriores a través de las actualizaciones del sistema de Google Play, por lo que puedes segmentar tu contenido para las funciones de programación más recientes.

Mejoras en PDF

Android 15 incluye mejoras sustanciales en las APIs de PdfRenderer. Las apps pueden incorporar funciones avanzadas, como la renderización de archivos protegidos por contraseña, las anotaciones, la edición de formularios, la búsqueda y la selección con copia. Se admiten optimizaciones de PDF linealizados para acelerar la visualización de PDF local y reducir el uso de recursos. La biblioteca de PDF de Jetpack usa estas APIs para simplificar la adición de funciones de visualización de PDF a tu app.

Las actualizaciones más recientes del procesamiento de PDF incluyen funciones como la búsqueda en un archivo PDF incorporado.

Se trasladó PdfRenderer a un módulo que se puede actualizar con Google. Las actualizaciones del sistema de Play son independientes de la versión de la plataforma, estos cambios a Android 11 (nivel de API 30) mediante la creación de una versión versión de la plataforma de API anterior a Android 15, llamada PdfRendererPreV

Mejoras en el cambio automático de idioma

Android 14 agregó el reconocimiento multilingüe integrado en el dispositivo en el audio con cambio automático entre idiomas, pero esto puede provocar que se omitan palabras, en especial cuando los idiomas cambian con menos pausa entre las dos oraciones. Android 15 agrega controles adicionales para ayudar a las apps a ajustar este cambio según su caso de uso. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS limita el cambio automático al comienzo de la sesión de audio, mientras que EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES desactiva el cambio de idioma después de una cantidad definida de cambios. Estas opciones son particularmente útiles si esperas que se hable un solo idioma durante la sesión que se debe detectar automáticamente.

Se mejoró la API de fuentes variables de OpenType

Android 15 提高了 OpenType 可变字体的易用性。您可以创建 来自可变字体的 FontFamily 实例,而不指定粗细轴 使用 buildVariableFamily API。文本渲染程序会替换 wght 轴的值,以匹配显示的文本。

使用该 API 可以大大简化创建 Typeface 的代码:

Kotlin

val newTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build()

Java

Typeface newTypeface = Typeface.CustomFallbackBuilder(
            new FontFamily.Builder(
                new Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build();

以前,如需创建相同的 Typeface,您需要更多代码:

Kotlin

val oldTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf")
                    .setFontVariationSettings("'wght' 400")
                    .setWeight(400)
                    .build())
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 100")
                        .setWeight(100)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 200")
                        .setWeight(200)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 300")
                        .setWeight(300)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 500")
                        .setWeight(500)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 600")
                        .setWeight(600)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 700")
                        .setWeight(700)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 800")
                        .setWeight(800)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 900")
                        .setWeight(900)
                        .build()
                ).build()
        ).build()

Java

Typeface oldTypeface = new Typeface.CustomFallbackBuilder(
    new FontFamily.Builder(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 400")
            .setWeight(400)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 100")
            .setWeight(100)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 200")
            .setWeight(200)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 300")
            .setWeight(300)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 500")
            .setWeight(500)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 600")
            .setWeight(600)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 700")
            .setWeight(700)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 800")
            .setWeight(800)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 900")
            .setWeight(900)
            .build()
    )
    .build()
).build();

以下示例展示了同时使用旧版和新版 API 创建的 Typeface 的呈现方式:

使用新旧 API 渲染字体时出现差异的示例

在此示例中,使用旧 API 创建的 Typeface 不包含 为 350、450、550 和 650 创建准确的字体粗细 Font 实例,因此渲染程序会回退到最接近的权重。在 在此示例中,系统会渲染 300 而不是 350,渲染 400 而不是 450, 依此类推。相比之下,使用新 API 创建的 Typeface 会为给定重量动态创建 Font 实例,因此系统也会为 350、450、550 和 650 呈现准确的重量。

Controles detallados de saltos de línea

从 Android 15 开始,TextView 和底层行断开符可以将给定部分文本保留在同一行中,以提高可读性。您可以通过在字符串资源或 createNoBreakSpan 中使用 <nobreak> 标记来充分利用此换行符自定义功能。同样,您可以使用 <nohyphen> 标记或 createNoHyphenationSpan 来防止对字词进行分词。

例如,以下字符串资源不包含换行符,在呈现时,文本“Pixel 8 Pro”会在不合适的位置换行:

<resources>
    <string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>

相比之下,此字符串资源包含 <nobreak> 标记,该标记会将字词“Pixel 8 Pro”换行,并防止换行:

<resources>
    <string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>

以下图片展示了这些字符串呈现方式的差异:

一行文本的布局,其中显示短语“Pixel 8 Pro.”未使用 <nobreak> 标记换行。
使用 <nobreak> 标记封装“Pixel 8 Pro.”短语的同一行文本的布局。

Archivado de apps

Android y Google Play anunciaron la compatibilidad con el archivado de apps el año pasado, lo que permite a los usuarios liberar espacio quitando parcialmente del dispositivo las apps que se usan con poca frecuencia y que se publicaron con Android App Bundle en Google Play. Android 15 incluye compatibilidad a nivel del SO para el archivado y desarchivado de apps, lo que facilita su implementación en todas las tiendas de aplicaciones.

Las apps con el permiso REQUEST_DELETE_PACKAGES pueden llamar al método PackageInstaller requestArchive para solicitar el archivado de un paquete de app instalado, lo que quita el APK y los archivos almacenados en caché, pero conserva los datos del usuario. Las apps archivadas se muestran como apps que se pueden mostrar a través de la APIs de LauncherApps; los usuarios verán un tratamiento de la IU para destacar que apps se archivan. Si un usuario presiona una app archivada, el instalador responsable recibirá una solicitud para desarchivarla, y la transmisión ACTION_PACKAGE_ADDED puede supervisar el proceso de restauración.

Habilita el modo de 16 KB en un dispositivo con las opciones para desarrolladores

Activa la opción para desarrolladores Iniciar con tamaño de página de 16 KB para iniciar un dispositivo en el modo de 16 KB.

En las versiones de QPR de Android 15, puedes usar la opción para desarrolladores disponible en ciertos dispositivos para iniciar el dispositivo en modo de 16 KB y realizar pruebas en el dispositivo. Antes de usar la opción para desarrolladores, ve a Configuración > Sistema > Actualizaciones de software y aplica las actualizaciones disponibles.

Esta opción para desarrolladores está disponible en los siguientes dispositivos:

  • Pixel 8 y 8 Pro (con Android 15 QPR1 o versiones posteriores)

  • Pixel 8a (con Android 15 QPR1 o versiones posteriores)

  • Pixel 9, 9 Pro y 9 Pro XL (con Android 15 QPR2 o versiones posteriores)

  • Pixel 9a (con Android 16 o versiones posteriores)

Gráficos

Android 15 incluye las mejoras gráficas más recientes, como ANGLE y adiciones al sistema de gráficos de Canvas.

Modernización del acceso a la GPU de Android

Logotipo de Vulkan

El hardware de Android evolucionó bastante desde los primeros días, en los que el SO principal se ejecutaba en una sola CPU y se accedía a las GPUs con APIs basadas en canalizaciones de funciones fijas. La API de gráficos de Vulkan® está disponible en el NDK desde Android 7.0 (nivel de API 24) con una abstracción de nivel inferior que refleja mejor el hardware de GPU moderno, se escala mejor para admitir varios núcleos de CPU y ofrece una sobrecarga reducida del controlador de CPU, lo que mejora el rendimiento de la app. Todos los motores de juego modernos son compatibles con Vulkan.

Vulkan es la interfaz preferida de Android para la GPU. Por lo tanto, Android 15 incluye ANGLE como una capa opcional para ejecutar OpenGL® ES sobre Vulkan. El cambio a ANGLE estandarizará la implementación de OpenGL de Android para mejorar la compatibilidad y, en algunos casos, el rendimiento. Para probar la estabilidad y el rendimiento de tu app de OpenGL ES con ANGLE, habilita la opción para desarrolladores en Configuración -> Sistema -> Opciones para desarrolladores -> Experimental: Habilita ANGLE en Android 15.

Plan de ruta de ANGLE para Android en Vulkan

Plan de acción de los próximos cambios en las APIs de la GPU de Android

Como parte de la optimización de nuestra pila de GPU, en el futuro, enviaremos ANGLE como el controlador del sistema GL en más dispositivos nuevos, con la expectativa de que OpenGL/ES solo esté disponible a través de ANGLE. Dicho esto, planeamos seguir admitiendo OpenGL ES en todos los dispositivos.

Próximos pasos recomendados

Usa las opciones para desarrolladores para seleccionar el controlador ANGLE para OpenGL ES y probar tu app. Para proyectos nuevos, te recomendamos que uses Vulkan para C/C++.

Mejoras en Canvas

Android 15 continúa con la modernización del sistema de gráficos Canvas de Android con las siguientes capacidades adicionales:

  • Matrix44 proporciona una matriz 4x4 para transformar las coordenadas que se deben usar cuando deseas manipular el lienzo en 3D.
  • clipShader interseca el clip actual con el sombreador especificado, mientras que clipOutShader establece el clip en la diferencia entre el clip actual y el sombreador, cada uno de los cuales trata el sombreador como una máscara alfa. Esto admite el dibujo de formas complejas de manera eficiente.

Rendimiento y batería

Android sigue enfocándose en ayudarte a mejorar el rendimiento y la calidad de tus apps. Android 15 introduce APIs que ayudan a que las tareas de tu app sean más eficientes de ejecutar, optimizan el rendimiento de la app y recopilan estadísticas sobre tus apps.

Para conocer las prácticas recomendadas que permiten ahorrar batería, depurar el uso de la red y la energía, y obtener detalles sobre cómo mejoramos la eficiencia de la batería del trabajo en segundo plano en Android 15 y versiones recientes de Android, consulta la charla Improving battery efficiency of background work on Android (Cómo mejorar la eficiencia de la batería del trabajo en segundo plano en Android) de Google I/O.

API de ApplicationStartInfo

En versiones anteriores de Android, el inicio de la app era un misterio. Era difícil determinar dentro de tu app si se inició desde un estado en frío, semicaliente o en caliente. También era difícil saber cuánto tiempo pasó tu app durante las diferentes fases del lanzamiento: bifurcar el proceso, llamar a onCreate, dibujar el primer fotograma y mucho más. Cuando se creó una instancia de tu clase Application, no tenías ninguna manera de saber si la app se inició desde una transmisión, un proveedor de contenido, un trabajo, una copia de seguridad, un inicio completo, una alarma o un Activity.

La API de ApplicationStartInfo en Android 15 proporciona todo esto y mucho más. Incluso puedes agregar tus propias marcas de tiempo al flujo para ayudar a recopilar datos de tiempo en un solo lugar. Además de recopilar métricas, puedes usar ApplicationStartInfo para ayudar a optimizar directamente el inicio de la app. Por ejemplo, puedes eliminar la creación de instancias costosa de bibliotecas relacionadas con la IU dentro de tu clase Application cuando se inicia la app debido a una transmisión.

Información detallada sobre el tamaño de la app

Desde Android 8.0 (nivel de API 26), Android incluye la API de StorageStats.getAppBytes que resume el tamaño instalado de una app como un solo número de bytes, que es la suma del tamaño del APK, el tamaño de los archivos extraídos del APK y los archivos que se generaron en el dispositivo, como el código compilado por adelantado (AOT). Este número no es muy útil en términos de cómo tu app usa el almacenamiento.

Android 15 agrega la API de StorageStats.getAppBytesByDataType([type]), que te permite obtener estadísticas sobre cómo tu app usa todo ese espacio, incluidas las divisiones de archivos APK, el código relacionado con AOT y la aceleración, los metadatos de DEX, las bibliotecas y los perfiles guiados.

Creación de perfiles administrada por la app

Android 15 incluye la clase ProfilingManager, que te permite recopilar información de perfil desde tu app, como volcados de montón, perfiles de montón, muestreo de pila y mucho más. Proporciona una devolución de llamada a tu app con una etiqueta proporcionada para identificar el archivo de salida, que se entrega al directorio de archivos de tu app. La API aplica un límite de frecuencia para minimizar el impacto en el rendimiento.

Para simplificar la construcción de solicitudes de generación de perfiles en tu app, te recomendamos que uses la API de AndroidX Profiling correspondiente, disponible en Core 1.15.0-rc01 o versiones posteriores.

Mejoras en la base de datos SQLite

Android 15 presenta las APIs de SQLite que exponen funciones avanzadas del un motor SQLite subyacente que se dirija a problemas de rendimiento específicos que pueden en las apps. Estas APIs se incluyen con la actualización de SQLite a la versión 3.44.3

Los desarrolladores deben consultar las prácticas recomendadas para el rendimiento de SQLite para aprovechar al máximo su base de datos, en especial cuando trabajan con bases de datos grandes o cuando ejecutan consultas sensibles a la latencia.

  • Transacciones diferidas de solo lectura: Cuando emitas transacciones de solo lectura (no incluyas instrucciones de escritura), usa beginTransactionReadOnly() y beginTransactionWithListenerReadOnly(SQLiteTransactionListener) para emitir transacciones DEFERRED de solo lectura. Estas transacciones se pueden ejecutar de forma simultánea entre sí y, si la base de datos está en modo WAL, se pueden ejecutar de forma simultánea con transacciones IMMEDIATE o EXCLUSIVE.
  • Recuento y IDs de filas: Se agregaron APIs para recuperar el recuento de filas modificadas o el ID de la última fila insertada sin emitir una consulta adicional. getLastChangedRowCount() muestra la cantidad de filas que se insertaron, actualizaron o borraron mediante la instrucción de SQL más reciente en la transacción actual, mientras que getTotalChangedRowCount() devuelve el recuento de la conexión actual. getLastInsertRowId() muestra el rowid de la última fila que se insertará en la conexión actual.
  • Sentencias sin procesar: Emite una sentencia SQlite sin procesar, omitiendo los wrappers de conveniencia y cualquier sobrecarga de procesamiento adicional que puedan generar.

Actualizaciones del framework de rendimiento dinámico de Android

Android 15 继续投资于 Android 动态性能框架 (ADPF),这是一组 API,可让游戏和性能密集型应用更为直接地与 Android 设备的电源和散热系统进行互动。在受支持的设备上,Android 15 添加了 ADPF 功能:

  • 针对提示会话的节能模式,用于指明其关联的线程应优先节能而非性能,非常适合长时间运行的后台工作负载。
  • 系统可以在提示会话中报告 GPU 和 CPU 工作时长,以便同时调整 CPU 和 GPU 频率,以最佳方式满足工作负载需求。
  • 热余量阈值,用于根据余量预测来解读可能的热节流状态。

如需详细了解如何在应用和游戏中使用 ADPF,请参阅相关文档

Privacidad

Android 15 incluye una variedad de funciones que ayudan a los desarrolladores de apps a proteger la privacidad del usuario.

Detección de grabación de pantalla

Android 15 增加了对应用的支持,以检测 正在录制。每当应用转换时,系统都会调用回调 在屏幕录制内容中处于可见与隐藏状态之间。如果正在记录注册进程的 UID 拥有的 activity,则系统会将应用视为可见。这样一来,如果您的应用执行敏感操作,您就可以告知用户正在录制他们的操作。

val mCallback = Consumer<Int> { state ->
  if (state == SCREEN_RECORDING_STATE_VISIBLE) {
    // We're being recorded
  } else {
    // We're not being recorded
  }
}

override fun onStart() {
   super.onStart()
   val initialState =
      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
   mCallback.accept(initialState)
}

override fun onStop() {
    super.onStop()
    windowManager.removeScreenRecordingCallback(mCallback)
}

Capacidades expandidas de IntentFilter

Android 15 incluye compatibilidad con una resolución Intent más precisa a través de UriRelativeFilterGroup, que contiene un conjunto de objetos UriRelativeFilter que forman un conjunto de reglas de coincidencia Intent que deben cumplirse, incluidos los parámetros de consulta de URL, los fragmentos de URL y las reglas de bloqueo o exclusión.

Estas reglas se pueden definir en el archivo en formato XML AndroidManifest con la etiqueta <uri-relative-filter-group>, que puede incluir, de manera opcional, una etiqueta android:allow. Estas etiquetas pueden contener etiquetas <data> que usan atributos de etiqueta de datos existentes, así como los atributos android:query y android:fragment.

Este es un ejemplo de la sintaxis de AndroidManifest:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:host="astore.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/auth" />
    <data android:query="region=na" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:query="mobileoptout=true" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:fragmentPrefix="faq" />
  </uri-relative-filter-group>
</intent-filter>

Espacio privado

可通过解锁和锁定私密空间,在设备上显示或隐藏敏感应用。

借助私密空间,用户可以在设备上创建一个单独的空间,在额外的身份验证层保护下,防止敏感应用遭到窥探。私密空间使用单独的用户个人资料。用户可以选择使用设备锁定方式或为私密空间使用单独的锁定方式。

私密空间中的应用会显示在启动器的单独容器中,并且当私密空间处于锁定状态时,这些应用不会显示在“最近用过”视图、通知、“设置”和其他应用中。用户生成的内容和下载的内容(例如媒体内容或文件)以及账号在私密空间和主空间之间是分开的。在私密空间处于解锁状态时,您可以使用系统 Sharesheet照片选择器向应用授予对各个空间中内容的访问权限。

用户无法将现有应用及其数据移至私密空间。相反,用户可以在私密空间中选择安装选项,以便使用他们偏好的任意应用商店安装应用。私密空间中的应用会作为主空间中任何应用的单独副本进行安装(同一应用的新副本)。

当用户锁定私密空间时,系统会停止该个人资料。在个人资料停止运行时,私密空间中的应用将不再处于活动状态,无法执行前台或后台活动,包括显示通知。

我们建议您使用私密空间测试应用,以确保应用能按预期运行,尤其是当您的应用属于以下某一类别时:

Consulta la selección del usuario más reciente para el acceso a las fotos seleccionadas

Ahora las apps pueden destacar solo las fotos y los videos seleccionados más recientemente cuando se otorga acceso parcial a los permisos de contenido multimedia. Esta función puede mejorar la experiencia del usuario de las apps que solicitan acceso a fotos y videos con frecuencia. Para usar esta función en tu app, habilita el argumento QUERY_ARG_LATEST_SELECTION_ONLY cuando consultes MediaStore a través de ContentResolver.

Kotlin

val externalContentUri = MediaStore.Files.getContentUri("external")

val mediaColumns = arrayOf(
   FileColumns._ID,
   FileColumns.DISPLAY_NAME,
   FileColumns.MIME_TYPE,
)

val queryArgs = bundleOf(
   // Return only items from the last selection (selected photos access)
   QUERY_ARG_LATEST_SELECTION_ONLY to true,
   // Sort returned items chronologically based on when they were added to the device's storage
   QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
   QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
   QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
       FileColumns.MEDIA_TYPE_IMAGE.toString(),
       FileColumns.MEDIA_TYPE_VIDEO.toString()
   )
)

Java

Uri externalContentUri = MediaStore.Files.getContentUri("external");

String[] mediaColumns = {
    FileColumns._ID,
    FileColumns.DISPLAY_NAME,
    FileColumns.MIME_TYPE
};

Bundle queryArgs = new Bundle();
queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true);
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC");
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?");
queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] {
    String.valueOf(FileColumns.MEDIA_TYPE_IMAGE),
    String.valueOf(FileColumns.MEDIA_TYPE_VIDEO)
});

Privacy Sandbox en Android

Android 15 incluye las extensiones más recientes de los servicios de anuncios de Android, que incorporan la versión más reciente de Privacy Sandbox en Android. Esta incorporación forma parte de nuestro trabajo para desarrollar tecnologías que mejoren la privacidad del usuario y permitan brindar experiencias de publicidad personalizadas y efectivas en apps para dispositivos móviles. En nuestra página de Privacy Sandbox, encontrarás más información sobre los programas de versión beta y de vista previa para desarrolladores de Privacy Sandbox en Android para ayudarte a comenzar.

Health Connect

Android 15 集成了与 Health Connect by Android 相关的最新扩展程序。Health Connect by Android 是一个安全的集中式平台,可用于管理和共享应用收集的健康与健身数据。此次更新 增加了对健身营养、体表温度、训练计划等。

体表温度追踪功能让用户可以更精确地存储和分享体表温度 来自穿戴式设备或其他跟踪设备的体温数据。

训练计划是一种结构化的锻炼计划,可帮助用户实现健身目标。训练计划支持各种完成和表现目标:

如需详细了解 Android 中 Health Connect 的最新更新,请参阅 利用 Android 打造自适应体验 健康演讲。

Compartir pantalla de una app

Android 15 admite el uso compartido de la pantalla de la app para que los usuarios puedan compartir o grabar solo una ventana de la app en lugar de toda la pantalla del dispositivo. Esta función, que se habilitó por primera vez en Android 14 QPR2, incluye callbacks de MediaProjection que permiten que tu app personalice la experiencia de uso compartido de pantalla de la app. Ten en cuenta que, para las apps orientadas a Android 14 (nivel de API 34) o versiones posteriores, se requiere el consentimiento del usuario para cada sesión de captura de MediaProjection.

Experiencia del usuario y la IU del sistema

Android 15 brinda a los desarrolladores de apps y a los usuarios más control y flexibilidad para configurar sus dispositivos según sus necesidades.

Para obtener más información sobre cómo usar las mejoras más recientes de Android 15 para mejorar la experiencia del usuario de tu app, consulta la charla Mejora la experiencia del usuario de tu app para Android de Google I/O.

Vistas previas de widgets más completas con la API de Generated Previews

在 Android 15 之前,提供微件选择器预览的唯一方法是指定静态图片或布局资源。这些预览通常与放置在主屏幕上的实际 widget 的外观大不相同。此外,由于无法使用 Jetpack Glance 创建静态资源,因此“资讯一览” 开发者必须为其微件截屏或创建 XML 布局, 微件预览。

Android 15 添加了对生成的预览的支持。这意味着,应用微件提供程序可以生成 RemoteViews 以用作选择器预览,而不是静态资源。

应用可以向微件选择器提供远程视图, 更新选择器中的内容,使其更能代表用户的内容 看到的内容。

推送 API

应用可以通过推送 API 提供生成的预览。应用可以提供 预览,并且不会收到明确的请求, 以提供预览。预览会保留在 AppWidgetService 中,并且主持人可以按需请求预览。以下示例加载了一个 XML 微件 并将其设置为预览:

AppWidgetManager.getInstance(appContext).setWidgetPreview(
   ComponentName(
       appContext,
       SociaLiteAppWidgetReceiver::class.java
   ),
   AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
   RemoteViews("com.example", R.layout.widget_preview)
)

预期的流程如下:

  1. 任何时候,widget 提供程序都会调用 setWidgetPreview。提供的预览会与其他提供方信息一起保留在 AppWidgetService 中。
  2. setWidgetPreview 会通过 AppWidgetHost.onProvidersChanged 回调。作为回应,微件宿主会重新加载其所有提供方信息。
  3. 显示微件预览时,主机会检查 AppWidgetProviderInfo.generatedPreviewCategories,如果所选类别可用,则调用 AppWidgetManager.getWidgetPreview 以返回此提供程序的已保存预览。

何时调用 setWidgetPreview

由于没有用于提供预览的回调,因此应用可以选择在运行期间的任何时间发送预览。预览的更新频率取决于微件的用例。

以下列表介绍了两大类预览用例:

  • 在 widget 预览中显示真实数据(例如个性化数据)的提供程序 或最新信息。这些提供商可以设置预览 已登录 Google 账号或已在其应用中完成初始配置。之后 可以设置一项定期任务,按照所选的节奏更新预览。 此类 widget 的示例包括照片、日历、天气或新闻 widget。
  • 在预览中显示静态信息或不显示任何数据的快捷操作 widget 的提供程序。这些提供程序可以在应用首次启动时设置预览一次。例如,快速开车便是此类微件的示例 操作 widget 或 Chrome 快捷方式 widget。

某些提供商可能会在基座接入模式选择器上显示静态预览,但真实的 信息。这些提供商应遵循指南 设置预览

Pantalla en pantalla

Android 15 引入了画中画 (PiP) 方面的变更,确保实现 更流畅的过渡效果。对于在主界面上叠加界面元素的应用,这将非常有用,因为这些界面元素会进入 PiP。

开发者使用 onPictureInPictureModeChanged 回调来定义逻辑 用于切换叠加界面元素的可见性。此回调是 在画中画进入或退出动画播放完毕时触发。距离开始还有 Android 15 中,PictureInPictureUiState 类包含另一种状态。

在此界面状态下,以 Android 15(API 级别 35)为目标平台的应用将遵守 使用以下参数调用 Activity#onPictureInPictureUiStateChanged 回调: isTransitioningToPip()。还有 在画中画模式下,有很多与应用无关的界面元素, 包含建议、 评分和标题当应用进入画中画模式时,请使用 onPictureInPictureUiStateChanged 回调以隐藏这些界面元素。当 应用从画中画窗口进入全屏模式,使用 onPictureInPictureModeChanged 回调以取消隐藏这些元素,如 请参阅以下示例:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements
        }
    }
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements
        }
    }

不相关界面元素的快速可见性切换(适用于画中画窗口)有助于 确保画中画播放动画更流畅、无闪烁。

Reglas de No interrumpir mejoradas

AutomaticZenRule permite que las apps personalicen las reglas de la Administración de atención (No interrumpir) y decidan cuándo activarlas o desactivarlas. Android 15 mejora considerablemente estas reglas con el objetivo de mejorar la la experiencia del usuario. Se incluyen las siguientes mejoras:

  • Se agregan tipos a AutomaticZenRule, lo que permite que el sistema aplique tipos tratamiento a algunas reglas.
  • Se agregó un ícono a AutomaticZenRule para que los modos sean más atractivos reconocibles.
  • Agrega una cadena triggerDescription a AutomaticZenRule que describa las condiciones en las que la regla debe activarse para el usuario.
  • Agregado ZenDeviceEffects a AutomaticZenRule, lo que permite que las reglas activen, por ejemplo, la escala de grises la pantalla, el modo nocturno o la atenuación del fondo de pantalla.

Cómo configurar VibrationEffect para los canales de notificación

Android 15 admite la configuración de vibraciones enriquecidas para las notificaciones entrantes canal con NotificationChannel.setVibrationEffect, por lo que los usuarios pueden distinguir entre distintos tipos de notificaciones tener que mirar su dispositivo.

Chip de la barra de estado de proyección de contenido multimedia y detención automática

媒体投放可能会泄露用户的私密信息。一个醒目的新状态栏条状标签可让用户了解任何正在进行的屏幕投影。用户可以点按该条状标签停止投屏、共享或录制屏幕。此外,为了提供更直观的用户体验,当设备屏幕锁定后,所有正在进行的屏幕投影都会自动停止。

Chip de la barra de estado para compartir pantalla, transmitir y grabar.

Pantallas grandes y factores de forma

Android 15 brinda a tus apps la compatibilidad necesaria para aprovechar al máximo los factores de forma de Android, incluidas las pantallas grandes, los dispositivos plegables y los que se pueden voltear.

Mejoras en la realización de tareas múltiples en pantallas grandes

Android 15 ofrece a los usuarios mejores formas de realizar varias tareas a la vez en dispositivos con pantalla grande. Para ejemplo, los usuarios pueden guardar sus combinaciones favoritas de apps con pantalla dividida para accede y fija la barra de tareas en la pantalla para cambiar de app rápidamente. Esto significa que asegurarse de que tu app sea adaptable es más importante que nunca.

Google I/O tiene sesiones sobre Cómo compilar apps para Android adaptativas y Cómo compilar una IU con la biblioteca de Material 3 adaptativa que pueden ayudarte. Además, nuestra documentación tiene más información para ayudarte a diseñar para pantallas grandes.

Compatibilidad con la pantalla de la cubierta

Tu app puede declarar una propiedad que Android 15 usa para permitir que tu Application o Activity se presente en las pantallas de portada pequeñas de los dispositivos plegables compatibles. Estas pantallas son demasiado pequeñas para considerarse objetivos compatibles en los que se ejecuten apps para Android, pero tu app puede admitirlas, lo que la hará disponible en más lugares.

Conectividad

Android 15 actualiza la plataforma para que tu app tenga acceso a los avances más recientes en tecnologías inalámbricas y de comunicación.

Compatibilidad con satélites

Android 15 继续扩大对卫星连接的平台支持,并包含一些界面元素,以确保在整个卫星连接环境中提供一致的用户体验。

应用可以使用 ServiceState.isUsingNonTerrestrialNetwork() 执行以下操作: 检测设备是否连接到卫星,让他们更清楚地了解 可能会导致完全网络服务不可用的原因此外,Android 15 支持短信和彩信应用以及预加载的 RCS 应用,以便使用卫星连接发送和接收消息。

当设备连接到卫星时,系统会显示通知。

Experiencias de NFC más fluidas

Android 15 está trabajando para que la experiencia de pago con un toque sea más fluida y confiable, a la vez que sigue admitiendo el sólido ecosistema de apps de NFC de Android. En los dispositivos compatibles, las apps pueden solicitar que NfcAdapter ingrese al modo de observación, en el que el dispositivo escucha, pero no responde a los lectores NFC, y envía los objetos PollingFrame del servicio de NFC de la app para que se procesen. Los objetos PollingFrame se pueden usar para autenticar antes de la primera comunicación con el lector de NFC, lo que permite una transacción con un solo toque en muchos casos.

Además, las apps pueden registrar un filtro en dispositivos compatibles para que se les notifique la actividad del bucle de sondeo, lo que permite un funcionamiento fluido con varias aplicaciones compatibles con NFC.

Rol de la billetera

Android 15 presenta un rol de billetera que permite una integración más estrecha con la app de billetera preferida del usuario. Este rol reemplaza la configuración predeterminada de pago sin contacto de NFC. Los usuarios pueden administrar el titular del rol de la Billetera navegando a Configuración > Apps > Apps predeterminadas.

El rol de billetera se usa cuando se enrutan los toques NFC para los AID registrados en la categoría de pago. Los toques siempre se dirigen al titular del rol de la Billetera, a menos que otra app que esté registrada para el mismo AID se esté ejecutando en primer plano.

Este rol también se usa para determinar dónde debe ir la tarjeta de acceso rápido a la Billetera cuando se activa. Cuando el rol se establece en "Ninguno", la tarjeta de acceso rápido no está disponible y las presiones de NFC de la categoría de pago solo se entregan a la app en primer plano.

Seguridad

Android 15 te ayuda a mejorar la seguridad de tu app, proteger sus datos y brindarles a los usuarios más transparencia y control sobre sus datos. Para obtener más información sobre lo que estamos haciendo para mejorar las medidas de protección del usuario y proteger tu app contra nuevas amenazas, mira la charla Safeguarding user security on Android de Google I/O.

Cómo integrar Credential Manager con el autocompletado

从 Android 15 开始,开发者可以将用户名或密码字段等特定视图与 Credential Manager 请求相关联,从而更轻松地在登录过程中提供量身定制的用户体验。当用户聚焦于其中一个视图时,系统会向 Credential Manager 发送相应请求。系统会汇总来自各个提供商的凭据,并在自动填充后备界面(例如内嵌建议或下拉菜单建议)中显示这些凭据。Jetpack androidx.credentials 库是开发者首选的端点,很快将在 Android 15 及更高版本中推出,以进一步增强此功能。

Integra el acceso y el registro con un solo toque con solicitudes biométricas

El Administrador de credenciales integra mensajes biométricos en la creación de credenciales. y procesos de acceso, lo que elimina la necesidad de que los proveedores gestionen instrucciones biométricas. Como resultado, los proveedores de credenciales solo deben enfocarse en los resultados de los flujos de creación y obtención, junto con el resultado del flujo biométrico. Este proceso simplificado crea una credencial más eficiente y optimizada de creación y recuperación.

Administración de claves para la encriptación de extremo a extremo

Presentamos E2eeContactKeysManager en Android 15, que facilita la encriptación de extremo a extremo (E2EE) en tus apps para Android, ya que proporciona una API a nivel del SO para el almacenamiento de claves públicas criptográficas.

E2eeContactKeysManager está diseñado para integrarse a la app de contactos de la plataforma y brindarles a los usuarios una forma centralizada de administrar y verificar las claves públicas de sus contactos.

Verificaciones de permisos en URIs de contenido

Android 15 presenta un conjunto de APIs que realizan verificaciones de permisos en los URIs de contenido:

Accesibilidad

Android 15 agrega funciones que mejoran la accesibilidad para los usuarios.

Mejoras en el braille

En Android 15, habilitamos que TalkBack admita pantallas braille que usan el estándar HID a través de USB y Bluetooth seguro.

Este estándar, al igual que el que usan los mouses y los teclados, ayudará a que Android admita una gama más amplia de pantallas braille con el tiempo.

Internacionalización

Android 15 agrega funciones y capacidades que complementan la experiencia del usuario cuando un dispositivo se usa en diferentes idiomas.

Fuente variable para CJK

A partir de Android 15, el archivo de fuente para los idiomas chino, japonés y coreano (CJK), NotoSansCJK, ahora es una fuente variable. Las fuentes variables abren posibilidades para la tipografía creativa en los idiomas CJK. Los diseñadores pueden explorar una variedad más amplia de estilos y crear diseños visualmente llamativos que antes eran difíciles o imposibles de lograr.

Cómo aparece la fuente variable para los idiomas chino, japonés y coreano (CJK) con diferentes anchos de fuente.

Justificación entre caracteres

从 Android 15 开始,可以通过 使用 JUSTIFICATION_MODE_INTER_CHARACTER。“字词间的理由”原为 最初是在 Android 8.0(API 级别 26)中引入的, Justifications 功能为使用 例如中文、日语等。

使用 JUSTIFICATION_MODE_NONE 的日语文本布局。
使用 JUSTIFICATION_MODE_NONE 的英语文本布局。


使用 JUSTIFICATION_MODE_INTER_WORD 的日语文本布局。
使用 JUSTIFICATION_MODE_INTER_WORD 的英语文本布局。


使用 JUSTIFICATION_MODE_INTER_CHARACTER 的日语文本布局。
使用 JUSTIFICATION_MODE_INTER_CHARACTER 的英语文本布局。

Configuración automática de saltos de línea

Android comenzó a admitir saltos de línea basados en frases para japonés y coreano en Android 13 (nivel de API 33) Sin embargo, aunque los saltos de línea basados en frases mejoran la la legibilidad de las líneas de texto cortas, no funcionan bien para las líneas de texto largas. En Android 15, las apps pueden aplicar saltos de línea basados en frases solo para líneas breves de texto con la opción LINE_BREAK_WORD_STYLE_AUTO. Esta opción selecciona la mejor opción de estilo de palabra para el texto.

Para las líneas cortas de texto, se utilizan saltos de línea basados en frases, que funcionan de la misma manera. como LINE_BREAK_WORD_STYLE_PHRASE, como se muestra en el siguiente imagen:

Para líneas de texto cortas, LINE_BREAK_WORD_STYLE_AUTO Aplica saltos de línea basados en frases para mejorar la legibilidad del texto. Esto es lo mismo que aplicar LINE_BREAK_WORD_STYLE_PHRASE

Para líneas de texto más largas, LINE_BREAK_WORD_STYLE_AUTO usa el prefijo "no" de salto de línea y que funcione igual que LINE_BREAK_WORD_STYLE_NONE, como se muestra en el siguiente imagen:

Para líneas de texto largas, LINE_BREAK_WORD_STYLE_AUTO No aplica ningún estilo de palabra de salto de línea para mejorar la legibilidad del texto. Esto es lo mismo que aplicar LINE_BREAK_WORD_STYLE_NONE

Fuente adicional de Hentaigana japonés

En Android 15, se incluyó un archivo de fuente para el antiguo hiragana japonés (conocido como Hentaigana). se agrupa de forma predeterminada. Las formas únicas de los caracteres hentaigana pueden agregar un estilo distintivo al material gráfico o al diseño, a la vez que ayudan a preservar la transmisión y la comprensión precisas de los documentos japoneses antiguos.

Carácter y estilo de texto del hentaigana japonés fuente.

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. Cualquier persona puede usar o modificar este logotipo o una versión modificada para hacer referencia al proyecto VideoLAN o a cualquier producto desarrollado por el equipo de VideoLAN, pero no indica que el proyecto lo respalde.

Vulkan y el logotipo de Vulkan son marcas registradas de Khronos Group Inc.

OpenGL es una marca comercial registrada, y el logotipo de OpenGL ES es una marca comercial de Hewlett Packard Enterprise que se usa con permiso de Khronos.