Descripción general de las funciones y APIs

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 nuevas, modificadas y quitadas, lee el informe de diferencias de APIs. Para obtener detalles sobre las nuevas APIs, consulta la referencia de la API de Android. Las nuevas APIs están destacadas para mayor visibilidad. Además, para conocer las áreas en las que los cambios de la plataforma podrían afectar a tus apps, asegúrate de revisar los cambios de comportamiento que afectan a las apps cuando se orientan a Android 15 y los cambios de comportamiento que afectan a todas las apps, independientemente de targetSdkVersion.

Cámara y contenido multimedia

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

Si deseas obtener más información sobre las funciones y soluciones para desarrolladores más recientes relacionadas con la cámara y el contenido multimedia de Android, consulta la charla Cómo compilar experiencias modernas de cámara y contenido multimedia de Android en Google I/O.

Mejora con poca luz

Android 15 presenta el Intensificador de poca luz, un nuevo modo de exposición automática disponible para la Cámara 2 y la extensión de la cámara en modo nocturno. La mejora con poca luz ajusta la exposición de la transmisión de la vista previa en condiciones de poca luz. Esto se diferencia de la manera en que la extensión de la cámara del modo nocturno crea imágenes estáticas, ya que el modo nocturno combina una ráfaga de fotos para crear una imagen única mejorada. Si bien el modo nocturno funciona muy bien para crear imágenes estáticas, no puede crear un flujo continuo de fotogramas, pero la potencia baja sí puede hacerlo. Por lo tanto, la potenciación con poca luz habilita funciones nuevas de la cámara, como las siguientes:

  • Proporcionar una vista previa de imagen mejorada, de modo que los usuarios puedan enmarcar mejor sus fotos con poca luz
  • Escaneo de códigos QR con poca luz

Si habilitas la amplificación de poca luz, se activará automáticamente cuando haya un nivel de luz tenue y se desactivará cuando haya más luz.

Las apps pueden grabar fuera de la transmisión de la versión preliminar en condiciones de poca luz para guardar un video iluminado.

Para obtener más información, consulta Potenciación del modo noche.

Controles de cámara integrados en la app

Android 15 添加了一个新扩展,用于在支持的设备上更好地控制相机硬件及其算法:

  • 高级闪光灯强度调整,可让您在拍摄照片时精确控制 SINGLETORCH 模式下的闪光强度。

Control del margen de HDR

Android 15 会选择适合底层设备功能和面板的位深的 HDR 余量。对于包含大量 SDR 内容的页面(例如显示单个 HDR 缩略图的即时通讯应用),此行为最终可能会对 SDR 内容的感知亮度产生不利影响。Android 15 允许您使用 setDesiredHdrHeadroom 控制 HDR 余量,以在 SDR 和 HDR 内容之间取得平衡。

左侧屏幕上 SDR 界面元素的亮度似乎比右侧屏幕的亮度更均匀,这模拟了混合 HDR 和 SDR 内容时可能出现的余量问题。通过调整 HDR 余量,您可以在 SDR 和 HDR 内容之间更好地平衡。

Control de volumen

Android 15 presenta compatibilidad con el estándar de volumen CTA-2075 para ayudarte a evitar incoherencias en el volumen del audio y garantizar que los usuarios no tengan que ajustar el volumen constantemente cuando cambien de contenido. El sistema aprovecha las características conocidas de los dispositivos de salida (auriculares y bocina), junto con los metadatos de intensidad disponibles en el contenido de audio AAC, para ajustar de forma inteligente el volumen del audio y los niveles de compresión de rango dinámico.

Para habilitar esta función, debes asegurarte de que los metadatos de volumen estén disponibles en tu contenido AAC y habilitar la función de plataforma en tu app. Para ello, llama a su método de fábrica create con el ID de sesión de audio del AudioTrack asociado a fin de crear una instancia de un objeto LoudnessCodecController. Puedes pasar un OnLoudnessCodecUpdateListener para modificar o filtrar los parámetros de volumen antes de que se apliquen en 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 también se actualizará para usar las APIs de LoudnessCodecController con el objetivo de lograr una integración fluida de la app.

Dispositivos MIDI 2.0 virtuales

Android 13 agregó compatibilidad para conectarse a dispositivos MIDI 2.0 mediante USB, que se comunican mediante paquetes MIDI universales (UMP). Android 15 extiende la compatibilidad con UMP a apps MIDI virtuales, 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 USB 2.0.

Decodificación de software de AV1 más eficiente

dav1d 徽标

dav1d(VideoLAN 中广受欢迎的 AV1 软件解码器)现已可用于在硬件中不支持 AV1 解码的 Android 设备。dav1d 的性能比旧版 AV1 软件解码器的性能高 3 倍,可让更多用户(包括一些中低层级的设备)播放高清 AV1 视频。

目前,您的应用需要通过调用 dav1d 名称 "c2.android.av1-dav1d.decoder" 来选择使用 dav1d。在后续更新中,dav1d 将成为默认的 AV1 软件解码器。这项支持已标准化,并向后移植到接收 Google Play 系统更新的 Android 11 设备。

Productividad y herramientas para desarrolladores

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

Actualizaciones de OpenJDK 17

Android 15 会继续更新 Android 的核心库,以与最新 OpenJDK LTS 版本中的功能保持一致。

其中包含以下主要功能和改进:

这些 API 通过 Google Play 系统更新在超过 10 亿台搭载 Android 12(API 级别 31)及更高版本的设备上进行了更新,让您能够以最新的编程功能为目标平台。

Mejoras de PDF

Android 15 对 PdfRenderer API 进行了重大改进。应用可以整合一些高级功能,例如渲染受密码保护的文件、注解、表单编辑搜索和通过复制进行选择。支持线性 PDF 优化,以加快本地 PDF 的查看速度并减少资源使用量。

针对 PDF 渲染功能的最新更新包括搜索嵌入式 PDF 文件等功能。

PdfRenderer 已移至一个模块,此模块可使用与平台版本无关的 Google Play 系统更新来进行更新,并且我们将通过创建兼容的 API Surface 低于 Android 15 的版本(称为 PdfRendererPreV)来支持在 Android 11(API 级别 30)中更新这些变更。

我们非常重视您对 PdfRenderer API 接口的增强功能的反馈,我们计划通过即将推出的 Android Jetpack 库,让开发者能更轻松地将这些 API 整合到您的应用中。

Mejoras en el cambio automático de idioma

Android 14 增加了设备端音频中的多语言识别功能,可在语言之间自动切换,但这可能会导致单词丢失,尤其是在语言切换时,两种话语之间的停顿较少时。Android 15 添加了额外的控件,可帮助应用根据其用例调整此切换。EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS 会将自动切换限制为仅在音频会话开始时进行,而 EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES 则会在指定次数的切换后停用语言切换。如果您希望自动检测到会话期间只讲一种语言,这些选项特别有用。

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 时 Typeface 渲染有何不同的示例

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

Controles detallados de salto de línea

A partir de Android 15, un TextView y el salto de línea subyacente pueden conservar la parte determinada del texto en la misma línea para mejorar la legibilidad. Puedes aprovechar esta personalización de salto de línea con la etiqueta <nobreak> en los recursos de cadenas o createNoBreakSpan. Del mismo modo, puedes conservar palabras de la separación silábica con la etiqueta <nohyphen> o createNoHyphenationSpan.

Por ejemplo, el siguiente recurso de cadenas no incluye un salto de línea y se renderiza con el texto "Pixel 8 Pro" rompiendo en un lugar no deseado:

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

Por el contrario, este recurso de cadenas incluye la etiqueta <nobreak>, que une la frase "Pixel 8 Pro" y evita los saltos de línea:

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

La diferencia en la forma en que se renderizan estas cadenas se muestra en las siguientes imágenes:

Diseño de una línea de texto donde la frase "Pixel 8 Pro" no se une con una etiqueta <nobreak>.
Diseño para la misma línea de texto donde la frase "Pixel 8 Pro" está unida a la etiqueta <nobreak>.

Archivado de apps

Android 和 Google Play 去年宣布支持应用归档,这让用户可以通过从 Google Play 上使用 Android App Bundle 发布的部分不常用的应用来释放空间。Android 15 现在包含对应用归档和取消归档的操作系统级支持,因此所有应用商店都可以更轻松地实现此功能。

具有 REQUEST_DELETE_PACKAGES 权限的应用可以调用 PackageInstaller requestArchive 方法来请求归档已安装的应用软件包,此操作会移除 APK 和所有缓存的文件,但会保留用户数据。已归档的应用会通过 LauncherApps API 作为可显示的应用返回;用户会看到界面处理方式,以突出显示这些应用已归档。如果用户点按已归档的应用,相关安装程序将收到将其取消归档的请求,并且可以通过 ACTION_PACKAGE_ADDED 广播监控恢复过程。

Gráficos

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

Modernización del acceso a GPU de Android

Vulkan 徽标

从早期开始,核心操作系统在单个 CPU 上运行,GPU 通过基于固定函数流水线的 API 进行访问,Android 硬件已经发生了很大变化。从 Android 7.0(API 级别 24)开始,NDK 中就已提供 Vulkan® 图形 API。它采用较低级别的抽象,可以更好地反映现代 GPU 硬件,能够更好地进行扩展以支持多个 CPU 核心,并可减少 CPU 驱动程序开销,从而提升应用性能。所有现代游戏引擎都支持 Vulkan。

Vulkan 是 Android 的 GPU 首选接口。因此,Android 15 包含 ANGLE 作为可选层,用于在 Vulkan 上运行 OpenGL® ES。迁移到 ANGLE 会将 Android OpenGL 实现标准化,以提高兼容性,在某些情况下还可提升性能。您可以使用 ANGLE 测试 OpenGL ES 应用的稳定性和性能,方法是在 Android 15 上依次点击设置 -> 系统 -> 开发者选项 -> 实验性功能:启用 ANGLE,启用开发者选项。

Vulkan 上的 Android ANGLE 路线图

Android GPU API 即将发生的变更的路线图。

作为简化 GPU 堆栈的一部分,今后我们将在更多新设备上以 GL 系统驱动程序的形式提供 ANGLE,预计未来将只能通过 ANGLE 使用 OpenGL/ES。不过,我们计划在所有设备上继续支持 OpenGL ES

建议的后续措施

使用开发者选项选择适用于 OpenGL ES 的 ANGLE 驱动程序并测试您的应用。对于新项目,我们强烈建议您使用适用于 C/C++ 的 Vulkan。

Mejoras para Canvas

Android 15 继续对 Android 的 Canvas 图形系统进行现代化改造,并增添了新功能:

  • Matrix44 提供了一个用于转换坐标的 4x4 矩阵,当您想要处理 3D 画布时,应使用此矩阵。
  • clipShader 将当前裁剪与指定着色器相交,而 clipOutShader 会将裁剪设置为当前裁剪和着色器的差异,其中各自将着色器视为 Alpha 蒙版。这有助于高效绘制复杂形状。

Rendimiento y batería

Android continúa su enfoque en ayudarte a mejorar el rendimiento y la calidad de tus apps. Android 15 introduce APIs nuevas que ayudan a que las tareas de tu app sean más eficientes de ejecutar, optimizar el rendimiento de las apps y recopilar estadísticas sobre tus apps.

Para conocer las prácticas recomendadas para ahorrar batería, depurar el uso de red y energía, y obtener detalles sobre cómo mejoramos la eficiencia de la batería del trabajo en segundo plano en Android 15 y las versiones recientes de Android, consulta la charla Cómo mejorar la eficiencia de la batería del trabajo en segundo plano en Android de Google I/O.

API de ApplicationStartInfo

在以前的 Android 版本中,应用启动有点神秘。在应用中确定应用是从冷状态、温状态还是热状态开始的过程很难确定。此外,我们也很难知道您的应用在不同发布阶段所用的时间:创建进程分支、调用 onCreate、绘制第一帧等。在实例化 Application 类时,您无法得知应用是从广播、content provider、作业、备份、启动完成、闹钟还是 Activity 启动的。

Android 15 上的 ApplicationStartInfo API 可提供所有这些功能以及更多其他功能。您甚至可以选择将自己的时间戳添加到流程中,以便在一个位置收集时间数据。除了收集指标之外,您还可以使用 ApplicationStartInfo 直接优化应用启动;例如,当应用因广播而启动时,您可以避免在 Application 类中实例化界面相关库的高成本。

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

A partir de Android 8.0 (nivel de API 26), Android incluyó la API de StorageStats.getAppBytes que resume el tamaño instalado de una app como una sola cantidad de bytes, que es una 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). Esta cifra no es muy detallada en términos de cómo tu app usa el almacenamiento.

En Android 15, se 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, metadatos dex, bibliotecas y perfiles guiados.

Generación de perfiles administrada por la app

Android 15 包含全新的 ProfilingManager 类,可让您从应用内收集性能分析信息。我们计划使用 Android Jetpack API 封装该类,这将简化性能分析请求的构建过程,但核心 API 将允许收集堆转储、堆配置文件、堆栈采样等信息。它使用提供的标记为您的应用提供回调,用于标识输出文件,该文件将传递到应用的文件目录。该 API 会限制速率限制,以最大限度地降低对性能的影响。

Mejoras en la base de datos SQLite

Android 15 引入了新的 SQLite API,可提供底层 SQLite 引擎的高级功能,这些功能旨在解决应用中可能出现的特定性能问题。

开发者应查阅 SQLite 性能最佳实践,以充分利用其 SQLite 数据库,尤其是在使用大型数据库或运行对延迟敏感的查询时。

  • 只读延迟事务:发出只读事务(不包括写入语句)时,使用 beginTransactionReadOnly()beginTransactionWithListenerReadOnly(SQLiteTransactionListener) 发出只读 DEFERRED 事务。此类事务可以相互并发运行,如果数据库处于 WAL 模式,则它们可以与 IMMEDIATEEXCLUSIVE 事务并发运行。
  • 行数和 ID:新增了 API,用于检索已更改的行的计数或最后插入的行 ID,而无需发出额外的查询。getLastChangedRowCount() 返回当前事务中的最新 SQL 语句插入、更新或删除的行数,而 getTotalChangedRowCount() 返回当前连接的相关计数。getLastInsertRowId() 返回要在当前连接上插入的最后一行的 rowid
  • 原始语句:发出原始 SQlite 语句,绕过便捷封装容器以及它们可能产生的任何其他处理开销。

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 构建了通过 UriRelativeFilterGroup 支持更精确的 Intent 解析,其中包含一组 UriRelativeFilter 对象,这些对象构成了一组必须满足的 Intent 匹配规则,其中包括网址查询参数、网址片段以及屏蔽或排除规则。

您可以使用新的 <uri-relative-filter-group> 标记在 AndroidManifest XML 文件中定义这些规则,也可以选择包含 android:allow 标记。这些标记可以包含使用现有数据标记属性以及新的 android:queryandroid:fragment 属性的 <data> 标记。

下面是 AndroidManifest 语法的示例:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:domain="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照片选择器授权应用跨空间访问内容。

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

当用户锁定私密空间后,相应个人资料会停止。配置文件停止后,私密空间中的应用将不再处于活跃状态,并且无法执行前台或后台 activity,包括显示通知。

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

Consultar la selección más reciente del usuario para el acceso a 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 para 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 包含最新的 Android 广告服务扩展程序,以及最新版 Privacy Sandbox on Android。我们致力于开发新的技术,以便更好地保护用户隐私,并为移动应用打造有效的个性化广告体验。这项新功能是我们的工作的一部分。我们的隐私沙盒页面详细介绍了 Privacy Sandbox on Android 开发者预览版和 Beta 版计划,以帮助您开始使用。

Health Connect

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

借助体表温度跟踪功能,用户可以从穿戴式设备或其他跟踪设备存储和分享更准确的体温数据。

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

如需详细了解 Android 中 Health Connect 的最新更新,请观看 Google I/O 大会的利用 Android Health 打造适应性体验演讲。

Compartir pantalla parcialmente

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

IU del sistema y experiencia del usuario

Android 15 les brinda a los desarrolladores de apps y a los usuarios más control y flexibilidad para configurar sus dispositivos de modo que se ajusten a sus necesidades.

Si deseas obtener más información sobre el uso de las mejoras más recientes de Android 15 para mejorar la experiencia del usuario de tu app, consulta la conversación sobre cómo mejorar la experiencia del usuario de tu app para Android desde Google I/O.

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

Antes de Android 15, la única forma de proporcionar vistas previas del selector de widgets era especificar un recurso de diseño o imagen estático. A menudo, estas vistas previas difieren significativamente del aspecto del widget real cuando se coloca en la pantalla principal. Además, los recursos estáticos no se pueden crear con Jetpack Looker, por lo que el desarrollador de un vistazo tuvo que hacer una captura de pantalla de su widget o crear un diseño XML para obtener una vista previa del widget.

En Android 15, se agrega compatibilidad con las vistas previas generadas. Esto significa que los proveedores de widgets de apps pueden generar RemoteViews para usarlo como vista previa del selector, en lugar de como un recurso estático.

Las apps pueden proporcionar vistas remotas al selector de widgets, de modo que puedan actualizar el contenido del selector para que sea más representativo de lo que verá el usuario.

API de Push

Las apps pueden proporcionar vistas previas generadas por medio de una API de envío. Las apps pueden proporcionar vistas previas en cualquier momento de su ciclo de vida y no reciben una solicitud explícita del host para brindarlas. Las vistas previas se conservan en AppWidgetService, y los hosts pueden solicitarlas a pedido. En el siguiente ejemplo, se carga un recurso de diseño de widget XML y se lo establece como vista previa:

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

El flujo esperado es el siguiente:

  1. En cualquier momento, el proveedor de widgets llama a setWidgetPreview. Las vistas previas proporcionadas se conservan en AppWidgetService con otra información del proveedor.
  2. setWidgetPreview notifica a los hosts sobre una vista previa actualizada a través de la devolución de llamada AppWidgetHost.onProvidersChanged. En respuesta, el host del widget vuelve a cargar toda la información de su proveedor.
  3. Cuando se muestra una vista previa de widget, el host verifica AppWidgetProviderInfo.generatedPreviewCategories y, si la categoría elegida está disponible, llama a AppWidgetManager.getWidgetPreview para mostrar la vista previa guardada de este proveedor.

Cuándo llamar a setWidgetPreview

Debido a que no hay una devolución de llamada para proporcionar vistas previas, las apps pueden elegir enviar vistas previas en cualquier momento cuando se ejecutan. La frecuencia con la que se actualiza la vista previa depende del caso de uso del widget.

En la siguiente lista, se describen las dos categorías principales de casos de uso de la vista previa:

  • Proveedores que muestran datos reales en las vistas previas de sus widgets, como información personalizada o reciente. Estos proveedores pueden configurar la vista previa una vez que el usuario haya accedido o haya realizado la configuración inicial en su app. Después de esto, pueden establecer una tarea periódica para actualizar las vistas previas a la cadencia elegida. Algunos ejemplos de este tipo de widget pueden ser un widget de fotos, calendarios, información del clima o de noticias.
  • Proveedores que muestran información estática en vistas previas o widgets de acción rápida que no muestran datos. Estos proveedores pueden configurar vistas previas una vez, cuando se inicia la app por primera vez. Algunos ejemplos de este tipo de widget incluyen un widget de acciones rápidas para el viaje o un widget de accesos directos de Chrome.

Algunos proveedores pueden mostrar vistas previas estáticas en el selector de modo Hub, pero también información real en el selector de pantalla principal. Los proveedores deben seguir las instrucciones en ambos casos de uso para configurar vistas previas.

Pantalla en pantalla

Android 15 引入了对画中画 (PiP) 功能的新变更,可确保在进入画中画模式时能够更顺畅地过渡。这对于将界面元素叠加在其主界面之上的应用(将进入画中画模式)非常有用。

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

借助这种新的界面状态,以 Android 15 为目标平台的应用会在画中画动画开始时立即观察到使用 isTransitioningToPip() 调用的 Activity#onPictureInPictureUiStateChanged 回调。在应用处于画中画模式时,有许多界面元素与应用无关,例如,包含建议、即将播出的视频、评分和标题等信息的视图或布局。当应用进入画中画模式时,使用 onPictureInPictureUiStateChanged 回调隐藏这些界面元素。当应用从画中画窗口进入全屏模式时,可以使用 onPictureInPictureModeChanged 回调来取消隐藏这些元素,如以下示例所示:

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

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

Reglas para la función No interrumpir mejoradas

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

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

Cómo configurar VibrationEffect para los canales de notificaciones

Android 15 admite la configuración de vibraciones enriquecidas para notificaciones entrantes por canal con NotificationChannel.setVibrationEffect, de modo que los usuarios puedan distinguir entre diferentes tipos de notificaciones sin tener que mirar el dispositivo.

Pantallas y factores de forma grandes

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

Mejora en la realización de varias tareas a la vez en pantallas grandes

Android 15 les brinda a los usuarios mejores formas de realizar varias tareas a la vez en dispositivos con pantalla grande. Por ejemplo, los usuarios pueden guardar sus combinaciones favoritas de apps de pantalla dividida para acceder rápidamente y fijar la barra de tareas en la pantalla para cambiar rápidamente de app. Por lo tanto, es más importante que nunca que te asegures de que tu app sea adaptable.

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

Compatibilidad con la pantalla de portada

Tu app puede declarar una propiedad que Android 15 usa para permitir que tu Application o Activity se presente en las pequeñas pantallas de portada de los dispositivos que admiten la pantalla abatible. Estas pantallas son demasiado pequeñas para considerarlas como objetivos compatibles de modo que las apps para Android se ejecuten en ellas, pero tu app puede aceptar admitirlas, lo que hará que esté disponible en más lugares.

Conectividad

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

Compatibilidad por satélite

Android 15 continúa ampliando la compatibilidad de plataforma para la conectividad satelital e incluye algunos elementos de la IU para garantizar una experiencia del usuario coherente en todo el panorama de conectividad satelital.

Las apps pueden usar ServiceState.isUsingNonTerrestrialNetwork() para detectar cuándo un dispositivo está conectado a un satélite, lo que les permite conocer mejor el motivo por el que los servicios de red completa podrían no estar disponibles. Además, Android 15 admite apps de SMS y MMS, así como apps de RCS precargadas para usar la conectividad satelital para enviar y recibir mensajes.

Aparece una notificación cuando el dispositivo se conecta a un satélite.

Experiencias NFC más fluidas

Android 15 正努力让感应式付款体验更加顺畅和可靠,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter 进入观察模式,在该模式下,设备会监听 NFC 读取器,但不响应 NFC 读取器,同时发送应用的 NFC 服务 PollingFrame 对象进行处理。PollingFrame 对象可用于在首次与 NFC 读取器通信之前进行身份验证,在许多情况下可实现一键交易。

此外,应用现在可以在受支持的设备上注册指纹,以便接收轮询循环活动的相关通知,从而实现通过多个可感知 NFC 的应用顺畅执行的操作。

Rol de billetera

Android 15 引入了一个新的钱包角色,可让您与用户首选的钱包应用更紧密地集成。此角色取代了 NFC 默认的感应式付款设置。用户可以通过导航到设置 > 应用 > 默认应用来管理 Google 钱包角色持有者。

在为付款类别中注册的 AID 路由 NFC 触碰时,可使用“钱包”角色。除非已在前台运行为同一 AID 注册的另一个应用,否则点按操作会始终转到钱包角色持有者。

此角色还可用于确定钱包“快速访问”功能块在启用后应转到的位置。当角色设置为“无”时,“快速访问”功能块不可用,并且付款类别 NFC 触碰仅会传送到前台应用。

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. Consulta la charla Cómo proteger la seguridad del usuario en Android de Google I/O para conocer más sobre las medidas que tomamos a fin de mejorar la protección para los usuarios y proteger tu app de nuevas amenazas.

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 mediante una API a nivel del SO destinada al almacenamiento de claves públicas criptográficas.

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

Verificaciones de permisos en URI de contenido

Android 15 presenta un nuevo conjunto de APIs que realizan comprobaciones de permisos en URI de contenido:

Accesibilidad

En Android 15, se agregan funciones que mejoran la accesibilidad para los usuarios.

Mejor braille

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

Este estándar, al igual que el que se usa en mouse y teclados, ayudará a Android a admitir una mayor variedad 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 CJK

A partir de Android 15, NotoSansCJK, el archivo de fuente para los idiomas chino, japonés y coreano (CJK), ahora es una fuente variable. Las fuentes variables ofrecen nuevas posibilidades para la tipografía creativa en lenguajes CJK. Los diseñadores pueden explorar una gama más amplia de estilos y crear diseños visualmente atractivos 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

A partir de Android 15, se puede justificar el texto utilizando el espaciado entre letras con JUSTIFICATION_MODE_INTER_CHARACTER. La justificación entre palabras se introdujo por primera vez en Android 8.0 (nivel de API 26), y la justificación entre caracteres proporciona capacidades similares para idiomas que usan el carácter de espacio en blanco para la segmentación, como el chino, el japonés y otros.

Diseño para texto en japonés con JUSTIFICATION_MODE_NONE
Diseño para texto en inglés con JUSTIFICATION_MODE_NONE


Diseño para texto en japonés con JUSTIFICATION_MODE_INTER_WORD
Diseño para texto en inglés con JUSTIFICATION_MODE_INTER_WORD


Diseño para texto en japonés con el nuevo JUSTIFICATION_MODE_INTER_CHARACTER
Diseño para texto en inglés con el nuevo JUSTIFICATION_MODE_INTER_CHARACTER

Configuración de salto de línea automático

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

Para líneas cortas de texto, se usan saltos de línea basados en frases que funcionan igual que LINE_BREAK_WORD_STYLE_PHRASE, como se muestra en la siguiente imagen:

Para líneas cortas de texto, 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 un estilo de palabra sin salto de línea, que funciona igual que LINE_BREAK_WORD_STYLE_NONE, como se muestra en la siguiente imagen:

En el caso de las 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.

Nueva fuente japonesa Hentaigana

En Android 15, se incluye de forma predeterminada un archivo de fuentes nuevo para el antiguo hiragana japonés (conocido como Hentaigana). Las formas únicas de los personajes de Hentaigana pueden agregar un toque distintivo al material gráfico o al diseño, y ayudar a preservar la transmisión y la comprensión exactas de los documentos japoneses antiguos.

Tipo de carácter y estilo de texto de la fuente Hentaigana japonesa.

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

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

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