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 ajoute une extension pour un meilleur contrôle du matériel de l'appareil photo et de ses algorithmes sur les appareils compatibles:

  • Ajustements avancés de l'intensité du flash permettant de contrôler précisément l'intensité du flash en mode SINGLE et TORCH lors de la prise de vue.

Contrôle de la marge HDR

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

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

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 est compatible avec la connexion à des appareils MIDI 2.0 via USB, qui communiquent à l'aide de paquets MIDI universels (UMP). Android 15 étend la compatibilité avec UMP aux applications MIDI virtuelles, ce qui permet aux applications de composition de contrôler les applications de synthétiseur en tant qu'appareil MIDI 2.0 virtuel, comme elles le feraient avec un appareil USB MIDI 2.0.

Décodage logiciel AV1 plus efficace

dav1d 徽标

dav1d 是 VideoLAN 推出的热门 AV1 软件解码器,适用于不支持硬件 AV1 解码的 Android 设备。与旧版 AV1 软件解码器相比,dav1d 的性能最高可提升 3 倍,让更多用户(包括一些低端和中端设备)能够播放高清 AV1 视频。

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

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 将继续更新 Android 的核心库,以与最新 OpenJDK LTS 版本中的功能保持一致。

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

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

Améliorations apportées aux PDF

Android 15 apporte d'importantes améliorations au PdfRenderer API. Les applications peuvent intégrer des fonctionnalités avancées telles que l'affichage fichiers protégés par mot de passe, annotations, modification de formulaires, recherche et sélection avec texte. PDF linéarisé des optimisations sont prises en charge pour accélérer l'affichage des PDF locaux et réduire l'utilisation des ressources. La bibliothèque PDF Jetpack utilise ces API pour simplifier l'ajout de PDF à votre application.

Les dernières mises à jour du rendu PDF incluent des fonctionnalités telles que la recherche dans un fichier PDF intégré.

PdfRenderer a été déplacé vers un module pouvant être mis à jour à l'aide de Google mises à jour du système Play indépendamment de la version de la plate-forme, et nous acceptons pour revenir à Android 11 (niveau d'API 30) en créant un version de la surface d'API antérieure à Android 15, appelée PdfRendererPreV

Améliorations du changement de langue automatique

Android 14 a ajouté la reconnaissance multilingue sur l'appareil dans l'audio avec le basculement automatique entre les langues, mais cela peut entraîner la suppression de mots, en particulier lorsque les langues changent avec moins de pause entre les deux énoncés. Android 15 ajoute des commandes supplémentaires pour aider les applications à adapter ce changement à leur cas d'utilisation. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS limite le changement automatique au début de la session audio, tandis que EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES désactive le changement de langue après un nombre défini de changements. Ces options sont particulièrement utiles si vous prévoyez qu'une seule langue sera parlée pendant la session et qu'elle doit être détectée automatiquement.

Amélioration de l'API OpenType Variable Font

Android 15 améliore la facilité d'utilisation de la police variable OpenType. Vous pouvez créer Une instance FontFamily à partir d'une police variable sans spécifier d'axes de pondération avec l'API buildVariableFamily. Le moteur de rendu du texte remplace la valeur de l'axe wght pour qu'elle corresponde au texte affiché.

L'utilisation de l'API simplifie considérablement le code permettant de créer un 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();

Auparavant, pour créer le même Typeface, vous aviez besoin de beaucoup plus de code:

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

Voici un exemple de rendu d'un Typeface créé avec les anciennes et nouvelles API :

Exemple de différence de rendu entre les nouvelles et l'ancienne
API

Dans cet exemple, le Typeface créé avec l'ancienne API n'est pas en mesure de créer des épaisseurs de police précises pour les instances Font 350, 450, 550 et 650. Le moteur de rendu utilise donc l'épaisseur la plus proche. Dans ce cas, 300 est affiché au lieu de 350, 400 au lieu de 450, etc. En revanche, le Typeface créé avec les nouvelles API crée dynamiquement une instance Font pour un poids donné. Les poids précis sont donc affichés pour 350, 450, 550 et 650 également.

Contrôles précis des sauts de ligne

À partir d'Android 15, un TextView et le séparateur de ligne sous-jacent peuvent conserver la partie de texte donnée sur la même ligne pour améliorer la lisibilité. Vous pouvez profiter de cette personnalisation de la casse en utilisant la balise <nobreak> dans les ressources de chaîne ou createNoBreakSpan. De même, vous pouvez empêcher la césure des mots à l'aide de la balise <nohyphen> ou createNoHyphenationSpan.

Par exemple, la ressource de chaîne suivante n'inclut pas de saut de ligne et s'affiche avec le texte "Pixel 8 Pro." qui se brise à un endroit indésirable:

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

En revanche, cette ressource de chaîne inclut la balise <nobreak>, qui affiche la phrase "Pixel 8 Pro" et empêche les sauts de ligne:

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

La différence d'affichage de ces chaînes est illustrée dans les images suivantes:

Mise en page pour une ligne de texte dans laquelle l'expression "Pixel 8 Pro" n'est pas enveloppée à l'aide d'une balise <nobreak>.
Mise en page de la même ligne de texte où la phrase "Pixel 8 Pro." est mise en forme à l'aide d'une balise <nobreak>.

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

Logo Vulkan

Le matériel Android a beaucoup évolué depuis les premiers jours, où le noyau de l'OS s'exécutait sur un seul CPU et que les GPU étaient accessibles à l'aide d'API basées sur des pipelines à fonction fixe. L'API graphique Vulkan® est disponible dans le NDK depuis Android 7.0 (niveau d'API 24) avec une abstraction de bas niveau qui reflète mieux le matériel GPU moderne, s'adapte mieux pour prendre en charge plusieurs cœurs de processeur et offre une surcharge de pilote de processeur réduite, ce qui améliore les performances des applications. Vulkan est compatible avec tous les moteurs de jeu modernes.

Vulkan est l'interface préférée d'Android pour le GPU. Par conséquent, Android 15 inclut ANGLE en tant que couche facultative pour exécuter OpenGL® ES sur Vulkan. Le passage à ANGLE permettra de normaliser l'implémentation OpenGL Android pour améliorer la compatibilité et, dans certains cas, les performances. Vous pouvez tester la stabilité et les performances de votre application OpenGL ES avec ANGLE en activant l'option pour les développeurs dans Settings -> System -> Developer Options -> Experimental: Enable ANGLE (Paramètres -> Système -> Options pour les développeurs -> Expérimental : Activer ANGLE) sur Android 15.

Feuille de route Android ANGLE sur Vulkan

Feuille de route des modifications à venir apportées aux API de GPU Android.

Dans le cadre de la simplification de notre pile GPU, nous allons désormais fournir ANGLE en tant que pilote système GL sur davantage de nouveaux appareils, avec l'espoir qu'OpenGL/ES ne sera disponible que via ANGLE à l'avenir. Cela dit, nous prévoyons de continuer à prendre en charge OpenGL ES sur tous les appareils.

Étapes suivantes recommandées

Utilisez les options pour les développeurs pour sélectionner le pilote ANGLE pour OpenGL ES et tester votre application. Pour les nouveaux projets, nous vous recommandons vivement d'utiliser Vulkan pour C/C++.

Améliorations apportées à Dessin

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

  • Matrix44 提供一个 4x4 矩阵来转换坐标,当您想在 3D 中操控画布时,应使用此矩阵。
  • clipShader 会将当前剪裁区域与指定的着色器相交,而 clipOutShader 会将剪裁区域设为当前剪裁区域与着色器的差值,每个操作都会将着色器视为一个 Alpha 遮罩。这支持高效地绘制复杂形状。

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

从 Android 8.0(API 级别 26)开始,Android 包含 StorageStats.getAppBytes API,该 API 会将应用的安装大小总结为一个字节数,该数值是 APK 大小、从 APK 中提取的文件的大小以及在设备上生成的文件(例如提前编译 [AOT] 代码)的总和。此数字对于了解应用的存储空间使用情况而言,没有太大帮助。

Android 15 添加了 StorageStats.getAppBytesByDataType([type]) API,可让您深入了解应用如何使用所有这些空间,包括 APK 文件分块、AOT 和加速相关代码、DEX 元数据、库和引导式配置文件。

Profilage géré par l'application

Android 15 包含 ProfilingManager 类,可让您从应用内部收集性能分析信息,例如堆转储、堆分析报告、堆栈采样等。它使用提供的标记为您的应用提供回调,以标识输出文件,该文件将传递给应用的文件目录。该 API 会进行速率限制,以尽可能降低对性能的影响。

为了简化在应用中构建性能分析请求的过程,我们建议您使用 Core 1.15.0-rc01 或更高版本中的相应 Profiling AndroidX API。

Améliorations de la base de données SQLite

Android 15 introduit les API SQLite qui exposent les fonctionnalités avancées du SQLite sous-jacent qui ciblent des problèmes de performances spécifiques manifeste dans les applications. Ces API sont incluses dans la mise à jour de SQLite vers 3.44.3.

Les développeurs doivent consulter les bonnes pratiques concernant les performances de SQLite. pour exploiter pleinement leur base de données SQLite, en particulier lorsqu'ils travaillent avec de grands ou lors de l'exécution de requêtes sensibles à la latence.

  • Transactions différées en lecture seule: lors de l'émission de transactions qui sont en lecture seule (pas les instructions d'écriture), utilisez beginTransactionReadOnly() et beginTransactionWithListenerReadOnly(SQLiteTransactionListener) pour émettre des transactions DEFERRED en lecture seule. Ces transactions peuvent s'exécuter simultanément les unes avec les autres. Si la base de données est en mode WAL, elles peuvent s'exécuter simultanément avec des transactions IMMEDIATE ou EXCLUSIVE.
  • Nombre et ID de lignes : des API ont été ajoutées pour récupérer le nombre de lignes modifiées ou l'ID de la dernière ligne insérée sans émettre de requête supplémentaire. getLastChangedRowCount() renvoie le nombre de lignes ont été insérées, mises à jour ou supprimées par l'instruction SQL la plus récente dans la transaction en cours, tandis que getTotalChangedRowCount() renvoie le nombre défini pour la connexion en cours. getLastInsertRowId() renvoie l'rowid de la dernière ligne. à insérer sur la connexion actuelle.
  • Instructions brutes : émettez une instruction SQlite brute, en contournant les wrappers pratiques et tout coût de traitement supplémentaire qu'ils pourraient entraîner.

Mises à jour d'Android Dynamic Performance Framework

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

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

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

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 prend en charge une résolution Intent plus précise via UriRelativeFilterGroup, qui contient un ensemble d'objets UriRelativeFilter qui forment un ensemble de règles de correspondance Intent qui doivent toutes être satisfaites, y compris les paramètres de requête d'URL, les fragments d'URL et les règles de blocage ou d'exclusion.

Ces règles peuvent être définies dans le fichier XML AndroidManifest avec la balise <uri-relative-filter-group>, qui peut éventuellement inclure une balise android:allow. Ces balises peuvent contenir des balises <data> qui utilisent des attributs de balise de données existants, ainsi que les attributs android:query et android:fragment.

Voici un exemple de syntaxe 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>

Espace privé

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

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

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

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

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

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

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 inclut les dernières extensions Android Ad Services, qui intègrent la dernière version de la Privacy Sandbox sur Android. Cette addition s'inscrit dans notre travail visant à développer des technologies qui améliorent la confidentialité des utilisateurs et permettent de créer des expériences publicitaires efficaces et personnalisées pour les applications mobiles. Pour en savoir plus sur les programmes Preview développeur et bêta de la Privacy Sandbox sur Android, consultez notre page dédiée.

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 支持应用屏幕共享,因此用户可以仅共享或录制应用窗口,而不是整个设备屏幕。此功能首次在 Android 14 QPR2 中启用,包含 MediaProjection 回调,可让您的应用自定义应用屏幕共享体验。请注意,对于以 Android 14(API 级别 34)或更高版本为目标平台的应用,每个 MediaProjection 捕获会话都需要征得用户同意

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 permet aux applications de personnaliser la fonctionnalité Attention Règles de gestion (Ne pas déranger) et décidez quand l'activer ou le désactiver de l'IA générative. Android 15 améliore considérablement ces règles dans le but d'améliorer l'expérience utilisateur. Les améliorations suivantes sont incluses:

  • Ajout de types à AutomaticZenRule, ce qui permet au système d'appliquer un traitement spécial à certaines règles.
  • Ajout d'une icône à AutomaticZenRule pour rendre les modes plus reconnaissables.
  • Ajouter une chaîne triggerDescription à AutomaticZenRule qui décrit les conditions selon lesquelles la règle doit être activée pour l'utilisateur.
  • Ajoutée(s) ZenDeviceEffects à AutomaticZenRule, ce qui permet aux règles de déclencher, par exemple, des niveaux de gris l'affichage, le mode Nuit ou la diminution de la luminosité du fond d'écran.

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

La projection multimédia peut exposer des informations personnelles des utilisateurs. Un nouveau chip de barre d'état proéminent informe les utilisateurs de toute projection d'écran en cours. Les utilisateurs peuvent appuyer sur le chip pour arrêter la diffusion, le partage ou l'enregistrement de l'écran. De plus, pour une expérience utilisateur plus intuitive, toute projection d'écran en cours s'arrête désormais automatiquement lorsque l'écran de l'appareil est verrouillé.

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 offre aux utilisateurs de meilleurs moyens d'effectuer plusieurs tâches en même temps sur les appareils à grand écran. Pour Par exemple, les utilisateurs peuvent enregistrer leurs combinaisons d'applications en écran partagé préférées pour des accéder à la barre des tâches et l'épingler à l'écran pour passer rapidement d'une application à l'autre. Il est donc plus important que jamais de vous assurer que votre application est adaptative.

Google I/O propose des sessions sur la création d'applications Android adaptatives applications et Créer une interface utilisateur avec Material 3 bibliothèque adaptative et notre documentation peut vous aider. Concevoir pour les grands écrans.

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 continue d'étendre la prise en charge de la plate-forme pour la connectivité par satellite et inclut certains éléments d'interface utilisateur pour garantir une expérience utilisateur cohérente sur l'ensemble des de la connectivité par satellite.

Les applications peuvent utiliser ServiceState.isUsingNonTerrestrialNetwork() pour : détecter lorsqu'un appareil est connecté à un satellite, ce qui leur permet de mieux connaître pourquoi les services réseau complètes peuvent être indisponibles. De plus, Android 15 prend en charge les applications de SMS et MMS, ainsi que les applications RCS préchargées à utiliser. la connectivité satellite pour envoyer et recevoir des messages.

Une notification s'affiche lorsque l'appareil se connecte à un satellite.

Expériences NFC plus fluides

Android 15 vise à rendre l'expérience de paiement sans contact plus fluide et fiable, tout en continuant à prendre en charge l'écosystème d'applications NFC robuste d'Android. Sur les appareils compatibles, les applications peuvent demander à NfcAdapter de passer en mode observation, où l'appareil écoute, mais ne répond pas aux lecteurs NFC, en envoyant les objets PollingFrame du service NFC de l'application à traiter. Les objets PollingFrame peuvent être utilisés pour l'authentification avant la première communication avec le lecteur NFC, ce qui permet une transaction en un seul geste dans de nombreux cas.

De plus, les applications peuvent enregistrer un filtre sur les appareils compatibles afin d'être informées de l'activité de la boucle de sondage, ce qui permet un fonctionnement fluide avec plusieurs applications compatibles avec la technologie 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

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

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

Le Gestionnaire d'identifiants intègre les invites biométriques aux processus de création et de connexion des identifiants, ce qui évite aux fournisseurs de gérer les invites biométriques. Par conséquent, les fournisseurs d'identifiants n'ont qu'à se concentrer sur les résultats des flux de création et d'obtention, complétés par le résultat du flux biométrique. Ce processus simplifié crée des identifiants plus efficaces et simplifiés. de création et de récupération.

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é

Dans Android 15, TalkBack est compatible avec les écrans braille qui utilisent la norme HID via USB et Bluetooth sécurisé.

Cette norme, semblable à celle utilisée par les souris et les claviers, aidera Android à prendre en charge un plus grand nombre de plages braille au fil du temps.

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

À partir d'Android 15, le fichier de police pour les langues chinoise, japonaise et coréenne (CJK), NotoSansCJK, est désormais une police variable. Les polices variables offrent de nouvelles possibilités de typographie créative dans les langues CJK. Les concepteurs peuvent explorer une gamme plus large de styles et créer des mises en page visuellement frappantes qui étaient auparavant difficiles ou impossibles à réaliser.

Affichage de la police variable pour les langues chinoise, japonaise et coréenne (CJK) avec différentes largeurs de police.

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 a commencé à accepter les sauts de ligne basés sur les expressions pour le japonais et le coréen dans Android 13 (niveau d'API 33). Toutefois, bien que les sauts de ligne basés sur des phrases améliorent la lisibilité des lignes courtes, ils ne fonctionnent pas bien pour les lignes longues. Sous Android 15, les applications ne peuvent appliquer des sauts de ligne basés sur des expressions que pour les lignes courtes de texte, à l'aide de la méthode LINE_BREAK_WORD_STYLE_AUTO . Cette option permet de sélectionner la meilleure option de style de mot pour le texte.

Pour les lignes de texte courtes, des sauts de ligne en fonction d'une expression sont utilisés, en tant que LINE_BREAK_WORD_STYLE_PHRASE, comme indiqué dans image suivante:

Pour les lignes de texte courtes, LINE_BREAK_WORD_STYLE_AUTO applique des sauts de ligne en fonction des expressions pour améliorer la lisibilité du texte. Cela revient à appliquer LINE_BREAK_WORD_STYLE_PHRASE
.

Pour les lignes de texte plus longues, LINE_BREAK_WORD_STYLE_AUTO utilise un "no" saut de ligne, qui fonctionne de la même manière que LINE_BREAK_WORD_STYLE_NONE, comme indiqué dans les image suivante:

Pour les longues lignes de texte, LINE_BREAK_WORD_STYLE_AUTO n'applique aucun style de mot avec saut de ligne pour améliorer la lisibilité du texte. Cela revient à appliquer 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.

Cône VideoLAN Copyright (c) 1996-2010 VideoLAN. Ce logo ou une version modifiée peut être utilisé ou modifié par n'importe qui pour faire référence au projet VideoLAN ou à tout produit développé par l'équipe VideoLAN, mais n'indique pas l'approbation du projet.

Vulkan et le logo Vulkan sont des marques déposées de The Khronos Group Inc.

OpenGL est une marque déposée, et le logo OpenGL ES est une marque de Hewlett Packard Enterprise utilisée avec autorisation par Khronos.