Présentation des fonctionnalités et des API

Android 15 offre aux développeurs de nouvelles fonctionnalités et API de qualité. Les sections suivantes résument ces fonctionnalités pour vous aider à vous familiariser avec les API associées.

Pour obtenir une liste détaillée des API ajoutées, modifiées et supprimées, consultez le rapport de différences des API. Pour en savoir plus sur les API ajoutées, consultez la documentation de référence des API Android. Pour Android 15, recherchez les API ajoutées au niveau d'API 35. Pour savoir dans quels domaines les changements de plate-forme peuvent affecter vos applications, consultez les modifications de comportement d'Android 15 pour les applications ciblant Android 15 et pour toutes les applications.

Appareil photo et médias

Android 15 inclut diverses fonctionnalités qui améliorent l'expérience de l'appareil photo et des contenus multimédias, et qui vous donnent accès à des outils et du matériel pour aider les créateurs à donner vie à leur vision sur Android.

Pour en savoir plus sur les dernières fonctionnalités et solutions pour les développeurs concernant les contenus multimédias et l'appareil photo Android, consultez la conférence Créer des expériences multimédias et d'appareil photo Android modernes de Google I/O.

Amplification luminosité faible

Android 15 introduit l'amplification de la luminosité, un mode d'exposition automatique disponible à la fois pour Camera 2 et l'extension de l'appareil photo en mode Nuit. L'amplification de la luminosité ajuste l'exposition du flux d'aperçu en cas de faible luminosité. Cela diffère de la façon dont l'extension d'appareil photo du mode Nuit crée des images fixes, car le mode Nuit combine une rafale de photos pour créer une seule image améliorée. Bien que le mode Nuit soit très efficace pour créer une image fixe, il ne peut pas créer un flux continu de frames, contrairement au mode Boost en faible luminosité. Ainsi, la fonctionnalité Boost en basse luminosité active les fonctionnalités de l'appareil photo, telles que:

  • Fournir un aperçu amélioré des images pour que les utilisateurs puissent mieux cadrer leurs photos prises en basse luminosité
  • Scanner des codes QR dans des conditions de faible luminosité

Si vous activez la fonctionnalité Boost en cas de faible luminosité, elle s'active automatiquement lorsque le niveau de luminosité est faible et se désactive lorsque la luminosité est plus élevée.

Les applications peuvent enregistrer le flux d'aperçu par faible luminosité dans le but d'éclaircir les vidéos.

Pour en savoir plus, consultez la section Amélioration en basse luminosité.

Commandes de la caméra dans l'application

Android 15 adds an extension for more control over the camera hardware and its algorithms on supported devices:

  • Advanced flash strength adjustments enabling precise control of flash intensity in both SINGLE and TORCH modes while capturing images.

Contrôle de la marge HDR

Android 15 chooses HDR headroom that is appropriate for the underlying device capabilities and bit-depth of the panel. For pages that have lots of SDR content, such as a messaging app displaying a single HDR thumbnail, this behavior can end up adversely influencing the perceived brightness of the SDR content. Android 15 lets you control the HDR headroom with setDesiredHdrHeadroom to strike a balance between SDR and HDR content.

The brightness of SDR UI elements on the left screen appears to be more uniform than the brightness on the right screen, which simulates possible headroom issues when HDR and SDR content are mixed. By adjusting the HDR headroom, you can achieve a better balance between the SDR and HDR content.

Contrôle du volume

Android 15 est compatible avec la norme de volume CTA-2075 pour vous aider à éviter les incohérences de volume audio et à vous assurer que les utilisateurs n'ont pas à ajuster constamment le volume lorsqu'ils passent d'un contenu à un autre. Le système exploite les caractéristiques connues des appareils de sortie (écouteurs et haut-parleurs) ainsi que les métadonnées de volume disponibles dans le contenu audio AAC pour ajuster intelligemment le volume audio et les niveaux de compression de la plage dynamique.

Pour activer cette fonctionnalité, vous devez vous assurer que les métadonnées de volume sont disponibles dans votre contenu AAC et activer la fonctionnalité de la plate-forme dans votre application. Pour ce faire, vous instanciez un objet LoudnessCodecController en appelant sa méthode d'usine create avec l'ID de session audio de l'AudioTrack associé. Les mises à jour audio sont alors automatiquement appliquées. Vous pouvez transmettre OnLoudnessCodecUpdateListener pour modifier ou filtrer paramètres de volume sonore avant de les appliquer 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
}

ExoPlayer sera également mis à jour pour AndroidX media3 afin d'utiliser LoudnessCodecController pour une intégration parfaite des applications.

Appareils MIDI 2.0 virtuels

Android 13 添加了对使用 USB 连接 MIDI 2.0 设备的支持,这些设备使用通用 MIDI 数据包 (UMP) 进行通信。Android 15 将 UMP 支持扩展到了虚拟 MIDI 应用,使作曲应用能够像使用 USB MIDI 2.0 设备一样,将虚拟 MIDI 2.0 设备用作控制合成器应用的设备。

Décodage logiciel AV1 plus efficace

dav1d logo

dav1d, the popular AV1 software decoder from VideoLAN is available for Android devices that don't support AV1 decode in hardware. dav1d is up to 3x more performant than the legacy AV1 software decoder, enabling HD AV1 playback for more users, including some low and mid tier devices.

Your app needs to opt-in to using dav1d by invoking it by name "c2.android.av1-dav1d.decoder". dav1d will be made the default AV1 software decoder in a subsequent update. This support is standardized and backported to Android 11 devices that receive Google Play system updates.

Productivité et outils pour les développeurs

Bien que la plupart de nos efforts pour améliorer votre productivité soient axés sur des outils tels qu'Android Studio, Jetpack Compose et les bibliothèques Android Jetpack, nous cherchons toujours des moyens dans la plate-forme pour vous aider à concrétiser plus facilement votre vision.

Mises à jour OpenJDK 17

Android 15 poursuit le travail d'actualisation des principales bibliothèques Android afin de s'adapter aux fonctionnalités des dernières versions d'OpenJDK LTS.

Les principales fonctionnalités et améliorations sont les suivantes:

Ces API sont mises à jour sur plus d'un milliard d'appareils exécutant Android 12 (niveau d'API 31) ou version ultérieure via les mises à jour du système Google Play, ce qui vous permet de cibler les dernières fonctionnalités de programmation.

Améliorations apportées aux PDF

Android 15 对 PdfRenderer API 进行了重大改进。应用可以整合呈现等高级功能 受密码保护的文件、注释、表单编辑searching,而 selection 则包含副本。支持线性化 PDF 优化,此功能可加快本地 PDF 查看速度并减少资源使用量。Jetpack PDF 库使用这些 API 来简化 PDF 的添加 查看功能。

<ph type="x-smartling-placeholder">
</ph>
PDF 渲染的最新更新包括 搜索嵌入式 PDF 文件中的内容。

PdfRenderer 已移至一个可使用 Google Play 系统更新独立于平台版本,并且我们支持 将这些变更还原到 Android 11(API 级别 30),方法是创建兼容的 Android 15 之前版本的 API Surface,称为 PdfRendererPreV

Améliorations du changement de langue automatique

Android 14 added on-device, multi-language recognition in audio with automatic switching between languages, but this can cause words to get dropped, especially when languages switch with less of a pause between the two utterances. Android 15 adds additional controls to help apps tune this switching to their use case. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS confines the automatic switching to the beginning of the audio session, while EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES deactivates the language switching after a defined number of switches. These options are particularly useful if you expect that there will be a single language spoken during the session that should be autodetected.

Amélioration de l'API OpenType Variable Font

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 呈现准确的重量。

Contrôles précis des sauts de ligne

从 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.”短语的同一行文本的布局。

Archivage des applications

Android 和 Google Play 宣布支持最后的应用归档功能 年,这让用户可以通过移除部分内容来释放空间 通过 Android 应用发布的设备中不常用的应用 前往 Google Play 下载套装。Android 15 在操作系统级别支持应用归档和解压缩,让所有应用商店都能更轻松地实现归档和解压缩。

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

Activer le mode 16 ko sur un appareil à l'aide des options pour les développeurs

Activez l'option développeur Démarrer avec une page de 16 ko pour démarrer un appareil en mode 16 ko.

À partir d'Android 15 QPR1, vous pouvez utiliser l'option pour les développeurs disponible sur certains appareils pour démarrer l'appareil en mode 16 ko et effectuer des tests sur l'appareil. Avant d'utiliser l'option pour les développeurs, accédez à Paramètres > Système > Mises à jour logicielles et appliquez les mises à jour disponibles.

Cette option pour les développeurs est disponible sur les appareils suivants :

  • Pixel 8 et 8 Pro (avec Android 15 QPR1 ou version ultérieure)

  • Pixel 8a (avec Android 15 QPR1 ou version ultérieure)

  • Pixel 9, 9 Pro et 9 Pro XL (avec Android 15 QPR2 bêta 2 ou version ultérieure)

Graphiques

Android 15 apporte les dernières améliorations graphiques, y compris ANGLE et des ajouts au système graphique Canvas.

Moderniser l'accès au GPU d'Android

Vulkan logo

Android hardware has evolved quite a bit from the early days where the core OS would run on a single CPU and GPUs were accessed using APIs based on fixed-function pipelines. The Vulkan® graphics API has been available in the NDK since Android 7.0 (API level 24) with a lower-level abstraction that better reflects modern GPU hardware, scales better to support multiple CPU cores, and offers reduced CPU driver overhead — leading to improved app performance. Vulkan is supported by all modern game engines.

Vulkan is Android's preferred interface to the GPU. Therefore, Android 15 includes ANGLE as an optional layer for running OpenGL® ES on top of Vulkan. Moving to ANGLE will standardize the Android OpenGL implementation for improved compatibility, and, in some cases, improved performance. You can test out your OpenGL ES app stability and performance with ANGLE by enabling the developer option in Settings -> System -> Developer Options -> Experimental: Enable ANGLE on Android 15.

The Android ANGLE on Vulkan roadmap

Roadmap of upcoming changes to the Android GPU APIs.

As part of streamlining our GPU stack, going forward we will be shipping ANGLE as the GL system driver on more new devices, with the future expectation that OpenGL/ES will be only available through ANGLE. That being said, we plan to continue support for OpenGL ES on all devices.

Recommended next steps

Use the developer options to select the ANGLE driver for OpenGL ES and test your app. For new projects, we strongly encourage using Vulkan for C/C++.

Améliorations apportées à Dessin

Android 15 continues our modernization of Android's Canvas graphics system with additional capabilities:

  • Matrix44 provides a 4x4 matrix for transforming coordinates that should be used when you want to manipulate the canvas in 3D.
  • clipShader intersects the current clip with the specified shader, while clipOutShader sets the clip to the difference of the current clip and the shader, each treating the shader as an alpha mask. This supports the drawing of complex shapes efficiently.

Performances et batterie

Android continue de vous aider à améliorer les performances et la qualité de vos applications. Android 15 introduit des API qui permettent d'exécuter plus efficacement les tâches dans votre application, d'optimiser les performances de l'application et de recueillir des insights sur vos applications.

Pour découvrir les bonnes pratiques en matière d'efficacité de la batterie, le débogage de l'utilisation du réseau et de l'alimentation, et des informations détaillées sur la façon dont nous améliorons l'efficacité de la batterie pour les tâches en arrière-plan dans Android 15 et les versions récentes d'Android, consultez la conférence Improving battery efficiency of background work on Android (Améliorer l'efficacité de la batterie pour les tâches en arrière-plan sur Android) de Google I/O.

API ApplicationStartInfo

Dans les versions précédentes d'Android, le démarrage des applications était un peu mystérieux. Il était difficile de déterminer dans votre application si elle a démarré à partir d'un état à froid, tiède ou chaud. Il était également difficile de savoir combien de temps votre application a passé pendant les différentes phases de lancement: forking du processus, appel de onCreate, dessin du premier frame, etc. Lorsque votre classe Application a été instanciée, vous ne pouviez pas savoir si l'application a démarré à partir d'une diffusion, d'un fournisseur de contenu, d'une tâche, d'une sauvegarde, d'un démarrage terminé, d'une alarme ou d'un Activity.

L'API ApplicationStartInfo sur Android 15 fournit tout cela et plus encore. Vous pouvez même choisir d'ajouter vos propres codes temporels dans le flux pour collecter les données temporelles au même endroit. En plus de collecter des métriques, vous pouvez utiliser ApplicationStartInfo pour optimiser directement le démarrage de l'application. Par exemple, vous pouvez éliminer l'instanciation coûteuse des bibliothèques liées à l'UI dans votre classe Application lorsque votre application démarre en raison d'une diffusion.

Informations détaillées sur la taille de l'application

Depuis Android 8.0 (niveau d'API 26), Android inclut l'API StorageStats.getAppBytes, qui résume la taille installée d'une application en un seul nombre d'octets, qui correspond à la somme de la taille de l'APK, de la taille des fichiers extraits de l'APK et des fichiers générés sur l'appareil, tels que le code compilé à l'avance (AOT). Ce nombre n'est pas très révélateur de la façon dont votre application utilise l'espace de stockage.

Android 15 ajoute l'API StorageStats.getAppBytesByDataType([type]), qui vous permet d'obtenir des informations sur la façon dont votre application utilise tout cet espace, y compris les fractionnements de fichiers APK, le code lié à l'AOT et à l'accélération, les métadonnées dex, les bibliothèques et les profils guidés.

Profilage géré par l'application

Android 15 includes the ProfilingManager class, which lets you collect profiling information from within your app such as heap dumps, heap profiles, stack sampling, and more. It provides a callback to your app with a supplied tag to identify the output file, which is delivered to your app's files directory. The API does rate limiting to minimize the performance impact.

To simplify constructing profiling requests in your app, we recommend using the corresponding Profiling AndroidX API, available in Core 1.15.0-rc01 or higher.

Améliorations de la base de données SQLite

Android 15 引入了 SQLite API,这些 API 可公开底层 SQLite 引擎的高级功能,以解决可能在应用中出现的特定性能问题。将 SQLite 更新到版本 3.44.3

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

Mises à jour d'Android Dynamic Performance Framework

Android 15 continues our investment in the Android Dynamic Performance Framework (ADPF), a set of APIs that allow games and performance intensive apps to interact more directly with power and thermal systems of Android devices. On supported devices, Android 15 adds ADPF capabilities:

  • A power-efficiency mode for hint sessions to indicate that their associated threads should prefer power saving over performance, great for long-running background workloads.
  • GPU and CPU work durations can both be reported in hint sessions, allowing the system to adjust CPU and GPU frequencies together to best meet workload demands.
  • Thermal headroom thresholds to interpret possible thermal throttling status based on headroom prediction.

To learn more about how to use ADPF in your apps and games, head over to the documentation.

Confidentialité

Android 15 inclut diverses fonctionnalités qui aident les développeurs d'applications à protéger la confidentialité des utilisateurs.

Détection de l'enregistrement d'écran

Android 15 est désormais compatible avec les applications qui détectent que pendant leur enregistrement. Un rappel est appelé chaque fois que l'application passe de l'état visible à l'état invisible dans un enregistrement d'écran. Une application est considérée comme visible si des activités appartenant à l'UID du processus d'enregistrement sont enregistrées. Ainsi, si votre application effectue une opération sensible, peuvent informer l'utilisateur qu'ils sont enregistrés.

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

Fonctionnalités IntentFilter étendues

Android 15 builds in support for more precise Intent resolution through UriRelativeFilterGroup, which contains a set of UriRelativeFilter objects that form a set of Intent matching rules that must each be satisfied, including URL query parameters, URL fragments, and blocking or exclusion rules.

These rules can be defined in the AndroidManifest XML file with the <uri-relative-filter-group> tag, which can optionally include an android:allow tag. These tags can contain <data> tags that use existing data tag attributes as well as the android:query and android:fragment attributes.

Here's an example of the AndroidManifest syntax:

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

Espace privé

L'espace privé peut être déverrouillé et verrouillé pour afficher ou masquer des applications sensibles sur un appareil.

L'espace privé permet aux utilisateurs de créer un espace distinct sur leur appareil afin de tenir leurs applications sensibles loin des regards indiscrets, protégées par un niveau d'authentification renforcé. L'espace privé utilise un profil utilisateur distinct. Pour verrouiller son espace privé, l'utilisateur peut choisir le verrouillage de l'écran ou une méthode différente.

Les applications de l'espace privé se trouvent dans un conteneur dédié dans le lanceur d'applications et n'apparaissent pas dans les vues récentes, les notifications, les paramètres, ni dans d'autres applications lorsque l'espace privé est verrouillé. Le contenu généré et téléchargé par l'utilisateur (comme les contenus multimédias ou les fichiers) sur l'espace privé et l'espace principal ainsi que les comptes de chacun de ces espaces sont distincts. La Sharesheet du système et le sélecteur de photos peuvent être utilisés pour autoriser les applications à accéder au contenu des différents espaces lorsque l'espace privé est déverrouillé.

Les utilisateurs ne peuvent pas déplacer les applications existantes et leurs données vers l'espace privé. À la place, les utilisateurs sélectionnent une option d'installation dans l'espace privé pour installer une application à l'aide de la plate-forme de téléchargement d'applications de leur choix. Les applications de l'espace privé sont installées en tant que copies distinctes de celles de l'espace principal (nouvelles copies de la même application).

Lorsqu'un utilisateur verrouille l'espace privé, le profil est arrêté. Lorsque le profil est arrêté, les applications de l'espace privé ne sont plus actives et ne peuvent pas effectuer d'activités de premier plan ni d'activités en arrière-plan, y compris afficher des notifications.

Nous vous recommandons de tester votre application avec un espace privé pour vous assurer qu'elle fonctionne comme prévu, en particulier si elle appartient à l'une des catégories suivantes:

Interroger la dernière sélection d'utilisateur pour l'accès aux photos sélectionnées

Les applications ne peuvent désormais mettre en avant que les photos et vidéos sélectionnées le plus récemment lorsqu'un accès partiel aux autorisations multimédias est accordé. Cette fonctionnalité peut améliorer l'expérience utilisateur pour les applications qui demandent fréquemment l'accès aux photos et aux vidéos. Pour utiliser cette fonctionnalité dans votre application, activez l'argument QUERY_ARG_LATEST_SELECTION_ONLY lorsque vous interrogez MediaStore via 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 sur Android

Android 15 includes the latest Android Ad Services extensions, incorporating the latest version of the Privacy Sandbox on Android. This addition is part of our work to develop technologies that improve user privacy and enable effective, personalized advertising experiences for mobile apps. Our privacy sandbox page has more information about the Privacy Sandbox on Android developer preview and beta programs to help you get started.

Santé Connect

Android 15 intègre les dernières extensions autour de Santé Connect par Android, une plate-forme sécurisée et centralisée permettant de gérer et de partager les données de santé et de remise en forme collectées par les applications. Cette mise à jour ajoute la prise en charge de types de données supplémentaires pour la forme physique, la nutrition, la température de la peau, les plans d'entraînement et plus encore.

Le suivi de la température cutanée permet aux utilisateurs de stocker et de partager des données de température plus précises à partir d'un accessoire connecté ou d'un autre appareil de suivi.

Les plans d'entraînement sont des plans d'entraînement structurés pour aider l'utilisateur à rester en forme objectifs. La prise en charge des plans de formation comprend plusieurs phases objectifs:

Pour en savoir plus sur les dernières nouveautés de Santé Connect sur Android, consultez la présentation Créer des expériences adaptables avec Android Santé lors de Google I/O.

Partager le contenu d'une appli sur l'écran

Android 15 supports app screen sharing so users can share or record just an app window rather than the entire device screen. This feature, first enabled in Android 14 QPR2, includes MediaProjection callbacks that allow your app to customize the app screen sharing experience. Note that for apps targeting Android 14 (API level 34) or higher, user consent is required for each MediaProjection capture session.

Expérience utilisateur et interface utilisateur du système

Android 15 offre aux développeurs d'applications et aux utilisateurs plus de contrôle et de flexibilité pour configurer leur appareil en fonction de leurs besoins.

Pour savoir comment utiliser les dernières améliorations d'Android 15 afin d'améliorer l'expérience utilisateur de votre application, consultez la conférence Améliorer l'expérience utilisateur de votre application Android de Google I/O.

Aperçus de widgets plus riches avec l'API Generated Previews

Avant Android 15, le seul moyen de fournir des aperçus du sélecteur de widgets était de spécifier une ressource d'image ou de mise en page statique. Ces aperçus diffèrent souvent considérablement de l'apparence du widget réel lorsqu'il est placé sur l'écran d'accueil. De plus, les ressources statiques ne peuvent pas être créées avec Jetpack Glance. Un développeur Glance doit donc prendre une capture d'écran de son widget ou créer une mise en page XML pour obtenir un aperçu du widget.

Android 15 prend en charge les aperçus générés. Cela signifie que les fournisseurs de widgets d'application peuvent générer RemoteViews à utiliser comme aperçu du sélecteur au lieu d'une ressource statique.

Les applications peuvent fournir des vues distantes au sélecteur de widgets afin de mettre à jour le contenu du sélecteur pour qu'il soit plus représentatif de ce que l'utilisateur verra.

API Push

Les applications peuvent fournir des aperçus générés via une API push. Les applications peuvent fournir des aperçus à tout moment de leur cycle de vie et ne reçoivent pas de demande explicite de la part de l'hôte. Les aperçus sont conservés dans AppWidgetService, et les hôtes peuvent les demander à la demande. L'exemple suivant charge une ressource de mise en page de widget XML et la définit en tant qu'aperçu:

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

Le flux attendu est le suivant:

  1. Le fournisseur de widgets appelle setWidgetPreview à tout moment. Les aperçus fournis sont conservés dans AppWidgetService avec d'autres informations du fournisseur.
  2. setWidgetPreview informe les hôtes d'un aperçu mis à jour via le rappel AppWidgetHost.onProvidersChanged. En réponse, l'hôte du widget recharge toutes ses informations sur le fournisseur.
  3. Lorsque l'hôte affiche un aperçu de widget, il vérifie AppWidgetProviderInfo.generatedPreviewCategories. Si la catégorie choisie est disponible, il appelle AppWidgetManager.getWidgetPreview pour renvoyer l'aperçu enregistré pour ce fournisseur.

Quand appeler le setWidgetPreview

Étant donné qu'il n'y a pas de rappel pour fournir des aperçus, les applications peuvent choisir d'envoyer des aperçus à tout moment lorsqu'elles s'exécutent. La fréquence d'actualisation de l'aperçu dépend du cas d'utilisation du widget.

La liste suivante décrit les deux principales catégories de cas d'utilisation d'aperçu:

  • Fournisseurs qui affichent des données réelles dans leurs aperçus de widgets, comme des informations personnalisées ou récentes. Ces fournisseurs peuvent définir l'aperçu une fois que l'utilisateur s'est connecté ou a effectué la configuration initiale dans son application. Ensuite, ils peuvent configurer une tâche périodique pour mettre à jour les aperçus à la fréquence de leur choix. Il peut s'agir d'un widget photo, d'un widget agenda, d'un widget météo ou d'un widget d'actualités.
  • Fournisseurs qui affichent des informations statiques dans des aperçus ou des widgets d'action rapide qui n'affichent aucune donnée. Ces fournisseurs peuvent définir des aperçus une seule fois, lors du premier lancement de l'application. Exemples de ce type de widget : widget d'actions rapides Drive ou widget de raccourcis Chrome.

Certains fournisseurs peuvent afficher des aperçus statiques dans le sélecteur de mode Hub, mais des informations réelles dans le sélecteur de l'écran d'accueil. Ces fournisseurs doivent suivre les consignes pour ces deux cas d'utilisation afin de définir des aperçus.

Picture-in-picture

Android 15 introduit des modifications en mode Picture-in-picture (PIP) pour garantir une transition plus fluide en mode PIP. Cela sera bénéfique pour des applications avec des éléments d'interface utilisateur superposés à leur interface utilisateur principale, qui va dans le mode PIP.

Les développeurs utilisent le rappel onPictureInPictureModeChanged pour définir une logique qui active/désactive la visibilité des éléments d'interface utilisateur superposés. Ce rappel est déclenché lorsque l'animation d'entrée ou de sortie du mode PIP est terminée. À partir d'Android 15, la classe PictureInPictureUiState inclut un autre état.

Avec cet état d'interface utilisateur, les applications ciblant Android 15 (niveau d'API 35) observeront le rappel Activity#onPictureInPictureUiStateChanged appelé avec isTransitioningToPip() dès le début de l'animation PIP. Il y a de nombreux éléments d'interface utilisateur qui ne sont pas pertinents pour l'application en mode PIP, par des exemples de vues ou de mise en page incluant des informations telles que des suggestions, les vidéos, les avis et les titres. Lorsque l'application passe en mode PIP, utilisez la Rappel onPictureInPictureUiStateChanged pour masquer ces éléments d'interface utilisateur. Lorsque passe en mode plein écran depuis la fenêtre PIP, utilisez onPictureInPictureModeChanged pour afficher ces éléments, comme indiqué dans les exemples suivants:

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

Cette option d'activation/de désactivation rapide de la visibilité des éléments d'interface utilisateur non pertinents (pour une fenêtre PiP) permet d'assurer une animation d'entrée PiP plus fluide et sans scintillement.

Règles "Ne pas déranger" améliorées

AutomaticZenRule lets apps customize Attention Management (Do Not Disturb) rules and decide when to activate or deactivate them. Android 15 greatly enhances these rules with the goal of improving the user experience. The following enhancements are included:

  • Adding types to AutomaticZenRule, allowing the system to apply special treatment to some rules.
  • Adding an icon to AutomaticZenRule, helping to make the modes be more recognizable.
  • Adding a triggerDescription string to AutomaticZenRule that describes the conditions on which the rule should become active for the user.
  • Added ZenDeviceEffects to AutomaticZenRule, allowing rules to trigger things like grayscale display, night mode, or dimming the wallpaper.

Définir VibrationEffect pour les canaux de notification

Android 15 permet de définir des vibrations riches pour les notifications entrantes par canal à l'aide de NotificationChannel.setVibrationEffect. Vos utilisateurs peuvent ainsi distinguer les différents types de notifications sans avoir à regarder leur appareil.

Chip de la barre d'état de la projection multimédia et arrêt automatique

Media projection can expose private user information. A new, prominent status bar chip makes users aware of any ongoing screen projection. Users can tap the chip to stop screen casting, sharing, or recording. Also, for a more intuitive user experience, any in‑progress screen projection now automatically stops when the device screen is locked.

Chip de la barre d'état pour le partage d'écran, la diffusion et l'enregistrement.

Grands écrans et facteurs de forme

Android 15 permet à vos applications de tirer le meilleur parti des facteurs de forme d'Android, y compris les grands écrans, les appareils à clapet et les pliables.

Amélioration du multitâche sur grand écran

Android 15 gives users better ways to multitask on large screen devices. For example, users can save their favorite split-screen app combinations for quick access and pin the taskbar on screen to quickly switch between apps. This means that making sure your app is adaptive is more important than ever.

Google I/O has sessions on Building adaptive Android apps and Building UI with the Material 3 adaptive library that can help, and our documentation has more to help you Design for large screens.

Compatibilité avec l'écran de couverture

Votre application peut déclarer une propriété qu'Android 15 utilise pour permettre à votre Application ou Activity d'être présenté sur les petits écrans de couverture des appareils à clapet compatibles. Ces écrans sont trop petits pour être considérés comme des cibles compatibles pour les applications Android, mais votre application peut les prendre en charge, ce qui la rend disponible dans plus d'endroits.

Connectivité

Android 15 met à jour la plate-forme pour permettre à votre application d'accéder aux dernières avancées en matière de technologies de communication et sans fil.

Assistance satellite

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

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

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

Expériences NFC plus fluides

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

此外,应用可以在受支持的设备上注册过滤器,以便在有轮询循环活动时收到通知,从而能够与多个感知 NFC 的应用顺畅运行。

Rôle Wallet

Android 15 引入了钱包角色,可与用户的首选钱包应用更紧密地集成。此角色会取代 NFC 默认的感应式付款设置。用户可以前往设置 > 应用 > 默认应用,管理钱包角色持有者。

在为在付款类别中注册的 AID 路由 NFC 感应式付款时,系统会使用钱包角色。点按操作始终会转到 Google 钱包角色持有者,除非有已注册相同 AID 的其他应用在前台运行。

此角色还用于确定“Google 钱包”快速访问功能块在启用后应显示在何处。将角色设为“无”时,“快速访问”功能块不可用,并且支付类别 NFC 点按仅传送到前台应用。

Sécurité

Android 15 vous aide à renforcer la sécurité de votre application, à protéger ses données et à offrir aux utilisateurs plus de transparence et de contrôle sur leurs données. Pour en savoir plus sur ce que nous faisons pour améliorer la protection des utilisateurs et protéger votre application contre les nouvelles menaces, consultez la conférence Safeguarding user security on Android de Google I/O.

Intégrer Credential Manager à la saisie automatique

Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.

intégrer l'inscription et la connexion en un seul geste aux invites biométriques ;

Credential Manager将生物识别提示集成到凭据创建过程中 和登录流程,这样提供商就无需管理 生物识别提示。因此,凭据提供程序只需专注于创建和获取流程的结果,并辅以生物识别流程结果。这一简化的流程创建了更高效、更精简的凭据 创建和检索过程。

Gestion des clés pour le chiffrement de bout en bout

Nous lançons E2eeContactKeysManager dans Android 15, qui facilite le chiffrement de bout en bout dans vos applications Android en fournissant une API au niveau de l'OS pour le stockage des clés publiques cryptographiques.

E2eeContactKeysManager est conçu pour s'intégrer à l'application de contacts de la plate-forme afin de permettre aux utilisateurs de gérer et de valider de manière centralisée les clés publiques de leurs contacts.

Vérification des autorisations sur les URI de contenu

Android 15 introduces a set of APIs that perform permission checks on content URIs:

Accessibilité

Android 15 ajoute des fonctionnalités qui améliorent l'accessibilité pour les utilisateurs.

Braille amélioré

在 Android 15 中,我们让 TalkBack 能够支持通过 USB 和安全蓝牙使用 HID 标准的盲文显示屏。

此标准与鼠标和键盘使用的标准非常相似,将有助于 Android 随着时间的推移支持更多类型的盲文显示屏。

Internationalisation

Android 15 ajoute des fonctionnalités qui complètent l'expérience utilisateur lorsqu'un appareil est utilisé dans différentes langues.

Police variable CJK

Starting with Android 15, the font file for Chinese, Japanese, and Korean (CJK) languages, NotoSansCJK, is now a variable font. Variable fonts open up possibilities for creative typography in CJK languages. Designers can explore a broader range of styles and create visually striking layouts that were previously difficult or impossible to achieve.

How the variable font for Chinese, Japanese, and Korean (CJK) languages appears with different font widths.

Justification entre les caractères

À partir d'Android 15, le texte peut être justifié en utilisant l'espacement entre les lettres à l'aide de JUSTIFICATION_MODE_INTER_CHARACTER. La justification entre les mots a été introduite pour la première fois dans Android 8.0 (niveau d'API 26). La justification entre les caractères offre des fonctionnalités similaires pour les langues qui utilisent le caractère d'espacement pour la segmentation, comme le chinois, le japonais et d'autres.

Mise en page du texte en japonais à l'aide de JUSTIFICATION_MODE_NONE.
Mise en page du texte en anglais à l'aide de JUSTIFICATION_MODE_NONE.


Mise en page du texte en japonais à l'aide de JUSTIFICATION_MODE_INTER_WORD.
Mise en page du texte en anglais avec JUSTIFICATION_MODE_INTER_WORD.


Mise en page du texte en japonais à l'aide de JUSTIFICATION_MODE_INTER_CHARACTER.
Mise en page du texte en anglais à l'aide de JUSTIFICATION_MODE_INTER_CHARACTER.

Configuration des retours à la ligne automatiques

Android started supporting phrase-based line breaks for Japanese and Korean in Android 13 (API level 33). However, while phrase-based line breaks improve the readability of short lines of text, they don't work well for long lines of text. In Android 15, apps can apply phrase-based line breaks only for short lines of text, using the LINE_BREAK_WORD_STYLE_AUTO option. This option selects the best word style option for the text.

For short lines of text, phrase-based line breaks are used, functioning the same as LINE_BREAK_WORD_STYLE_PHRASE, as shown in the following image:

For short lines of text, LINE_BREAK_WORD_STYLE_AUTO applies phrase-based line breaks to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_PHRASE.

For longer lines of text, LINE_BREAK_WORD_STYLE_AUTO uses a no line-break word style, functioning the same as LINE_BREAK_WORD_STYLE_NONE, as shown in the following image:

For long lines of text, LINE_BREAK_WORD_STYLE_AUTO applies no line-break word style to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_NONE.

Police Hentaigana japonaise supplémentaire

Dans Android 15, un fichier de police pour l'ancien hiragana japonais (appelé Hentaigana) est regroupé par défaut. Les formes uniques des personnages Hentaigana permettent d'ajouter à l'œuvre ou au design, tout en préservant la précision transmission et compréhension des anciens documents japonais.

Style de caractère et de texte pour la police Hentaigana japonaise.

VideoLAN 圆锥图标 版权所有 (c) 1996-2010 VideoLAN。任何人都可以使用此徽标或修改版徽标来提及 VideoLAN 项目或 VideoLAN 团队开发的任何产品,但这并不表示该项目对其表示认可。

Vulkan 和 Vulkan 徽标是 Khronos Group Inc.的注册商标。

OpenGL 是注册商标,OpenGL ES 徽标是 Hewlett Packard Enterprise 的商标,已获得 Khronos 的许可。