Funktionen und APIs – Übersicht

Android 15 bietet tolle neue Funktionen und APIs für Entwickler. In den folgenden Abschnitten werden diese Funktionen zusammengefasst, um Ihnen den Einstieg in die zugehörigen APIs zu erleichtern.

Eine detaillierte Liste der neuen, geänderten und entfernten APIs finden Sie im Bericht „API-Unterschiede“. Weitere Informationen zu neuen APIs finden Sie in der Android API-Referenz. Neue APIs sind zur besseren Sichtbarkeit hervorgehoben. Wenn du wissen möchtest, in welchen Bereichen sich Plattformänderungen auf deine Apps auswirken können, solltest du dir die Verhaltensänderungen, die sich auf Apps auswirken, wenn sie auf Android 15 ausgerichtet sind und die Verhaltensänderungen, die alle Apps unabhängig von targetSdkVersion betreffen, ansehen.

Kamera und Medien

Android 15 bietet eine Vielzahl von Funktionen, die die Kamera- und Mediennutzung verbessern und dir Zugriff auf Tools und Hardware bieten, um Creator dabei zu unterstützen, ihre Vision auf Android zum Leben zu erwecken.

Weitere Informationen zu den neuesten Funktionen und Entwicklerlösungen für Android-Medien und -Kameras finden Sie im Vortrag Moderne Android-Medien und Kameraerlebnisse erstellen von der Google I/O.

Booster für wenig Licht

Android 15 引入了低光增强,这是一种新的自动曝光模式,可供 Camera 2夜间模式相机扩展使用。“低光增强”功能可调整预览视频流在弱光条件下的曝光量。这与夜间模式相机扩展程序创建静态图片的方式不同,因为夜间模式会组合多张照片来制作单张增强图片。虽然夜间模式非常适合创建静态图片,但无法创建连续的帧流,但“低光增强”可以。因此,“低光增强”可以实现新的相机功能,例如:

  • 提供增强的图片预览,以便用户更好地为弱光环境取景
  • 在光线昏暗的环境下扫描二维码

如果您启用“弱光增强”,它会在光线较暗时自动开启,在光线较暗时关闭。

应用可以在光线昏暗的环境下录制预览流,以保存明亮的视频。

有关详情,请参阅弱光增强

In-App-Kamerasteuerung

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

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

HDR-Headroom-Steuerung

Unter Android 15 wird ein HDR-Toleranzbereich ausgewählt, der den zugrunde liegenden Gerätefunktionen und der Bittiefe des Panels entspricht. Bei Seiten mit vielen SDR-Inhalten, z. B. einer Messaging-App mit einer einzelnen HDR-Miniaturansicht, kann sich dieses Verhalten negativ auf die wahrgenommene Helligkeit der SDR-Inhalte auswirken. Unter Android 15 kannst du den HDR-Toleranzbereich mit setDesiredHdrHeadroom steuern, um ein ausgewogenes Verhältnis zwischen SDR- und HDR-Inhalten zu erreichen.

Die Helligkeit von SDR-UI-Elementen auf dem linken Bildschirm ist gleichmäßiger als die Helligkeit auf dem rechten Bildschirm. Dadurch werden mögliche Toleranzprobleme simuliert, wenn HDR- und SDR-Inhalte gemischt sind. Durch Anpassung des HDR-Toleranzraums erreichst du ein besseres Gleichgewicht zwischen SDR- und HDR-Inhalten.

Lautstärkeregelung

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

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

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

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

Virtuelle MIDI 2.0-Geräte

Android 13 unterstützt jetzt die Verbindung mit MIDI 2.0-Geräten über USB, die über Universal MIDI Packets (UMP) kommunizieren. Android 15 dehnt die UMP-Unterstützung auf virtuelle MIDI-Apps aus. So können Kompositions-Apps Synthesizer-Apps als virtuelles MIDI 2.0-Gerät steuern, genau wie mit einem USB MIDI 2.0-Gerät.

Effizientere AV1-Software-Decodierung

Logo: dav1d

dav1d, der beliebte AV1-Softwaredecoder von VideoLAN, ist jetzt für Android-Geräte verfügbar, die keine AV1-Decodierung in Hardware unterstützen. dav1d ist bis zu 3-mal leistungsfähiger als der alte AV1-Softwaredecoder, sodass mehr Nutzer HD AV1 wiedergeben können, einschließlich einiger Geräte der unteren und mittleren Preisklasse.

Vorerst muss Ihre Anwendung die Verwendung von dav1d aktivieren, indem Sie sie mit dem Namen "c2.android.av1-dav1d.decoder" aufrufen. „dav1d“ wird bei einem nachfolgenden Update zum standardmäßigen AV1-Software-Decoder gemacht. Diese Unterstützung ist standardisiert und auf Android 11-Geräte zurückportiert, die Google Play-Systemupdates erhalten.

Produktivität der Entwicklungsteams und Tools

Während wir bei der Verbesserung Ihrer Produktivitätszentren vor allem auf Tools wie Android Studio, Jetpack Compose und die Android Jetpack-Bibliotheken konzentrieren, suchen wir immer nach Möglichkeiten, wie Sie Ihre Vorstellungen auf der Plattform leichter verwirklichen können.

OpenJDK 17-Updates

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

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

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

PDF-Verbesserungen

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

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

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

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

Optimierungen für den automatischen Sprachwechsel

Unter Android 14 wurde die mehrsprachige Spracherkennung auf dem Gerät mit automatischem Wechsel zwischen Sprachen hinzugefügt. Dies kann jedoch dazu führen, dass Wörter ausgelassen werden, insbesondere wenn Sprachen mit weniger Pausen zwischen den beiden Äußerungen wechseln. Android 15 bietet zusätzliche Steuerelemente, mit denen Apps diesen Wechsel auf ihren Anwendungsfall abstimmen können. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS beschränkt den automatischen Wechsel bis zum Beginn der Audiositzung, während EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES den Sprachwechsel nach einer bestimmten Anzahl von Wechsel deaktiviert. Diese Optionen sind besonders nützlich, wenn Sie davon ausgehen, dass während der Sitzung eine einzelne Sprache gesprochen wird, die automatisch erkannt werden sollte.

Verbesserte OpenType Variable Font API

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

使用新的 API,这大大简化了创建 Typeface 的代码:

Kotlin

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

Java

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

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

Kotlin

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

Java

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

以下示例展示了同时使用新旧 API 创建的 Typeface 如何呈现:

使用新旧 API 时 Typeface 渲染有何不同的示例

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

Detaillierte Steuerung für Zeilenumbrüche

从 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> 标记进行换行。
同一行文本的布局,其中词组“Pixel 8 Pro”用 <nobreak> 标记封装。

App-Archivierung

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

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

Grafik

Android 15 bietet die neuesten Grafikverbesserungen, einschließlich ANGLE und Ergänzungen des Canvas-Grafiksystems.

GPU-Zugriff von Android modernisieren

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

Verbesserungen für Canvas

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

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

Leistung und Akku

Android unterstützt dich weiterhin dabei, die Leistung und Qualität deiner Apps zu verbessern. Mit Android 15 werden neue APIs eingeführt, die dir dabei helfen, Aufgaben in deiner App effizienter auszuführen, die App-Leistung zu optimieren und Statistiken zu deinen Apps zu erfassen.

Best Practices für den Akkuverbrauch, Tipps zur Fehlerbehebung beim Netzwerk und zur Stromnutzung sowie Details dazu, wie wir die Effizienz der Hintergrundarbeit unter Android 15 und neueren Android-Versionen verbessern, finden Sie im Talk der Google I/O zur Optimierung der Akkueffizienz bei Hintergrundarbeiten unter Android.

ApplicationStartInfo-API

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

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

Detaillierte Informationen zur App-Größe

Seit Android 8.0 (API-Level 26) enthält Android die StorageStats.getAppBytes API, die die installierte Größe einer App als eine einzelne Bytezahl zusammenfasst. Dies ist die Summe aus der APK-Größe, der Größe der aus dem APK extrahierten Dateien und der auf dem Gerät generierten Dateien, z. B. kompilierter Vorab-Code (AOT). Diese Zahl ist nicht sehr aufschlussreich für die Speichernutzung Ihrer App.

Unter Android 15 wird die StorageStats.getAppBytesByDataType([type]) API hinzugefügt, mit der du Informationen darüber erhalten kannst, wie deine App den gesamten Speicherplatz nutzt, einschließlich APK-Dateiaufteilungen, AOT-Code und beschleunigtem Code, DEX-Metadaten, Bibliotheken und geführten Profilen.

Von der Anwendung verwaltete Profilerstellung

Android 15 enthält die brandneue ProfilingManager-Klasse, mit der Sie Profilinformationen direkt in Ihrer App erfassen können. Wir planen, dies mit einer Android Jetpack API zu vereinen, die das Erstellen von Profilanfragen vereinfacht. Die Core API ermöglicht jedoch das Erfassen von Heap-Dumps, Heap-Profilen, Stack-Sampling und mehr. Sie liefert einen Callback für Ihre Anwendung mit einem bereitgestellten Tag, mit dem die Ausgabedatei identifiziert wird. Diese wird an das Dateiverzeichnis Ihrer Anwendung gesendet. Die API begrenzt die Ratenbegrenzung, um die Auswirkungen auf die Leistung zu minimieren.

Verbesserungen der SQLite-Datenbank

Android 15 introduces new SQLite APIs that expose advanced features from the underlying SQLite engine that target specific performance issues that can manifest in apps.

Developers should consult best practices for SQLite performance to get the most out of their SQLite database, especially when working with large databases or when running latency-sensitive queries.

  • Read-only deferred transactions: when issuing transactions that are read-only (don't include write statements), use beginTransactionReadOnly() and beginTransactionWithListenerReadOnly(SQLiteTransactionListener) to issue read-only DEFERRED transactions. Such transactions can run concurrently with each other, and if the database is in WAL mode, they can run concurrently with IMMEDIATE or EXCLUSIVE transactions.
  • Row counts and IDs: new APIs were added to retrieve the count of changed rows or the last inserted row ID without issuing an additional query. getLastChangedRowCount() returns the number of rows that were inserted, updated, or deleted by the most recent SQL statement within the current transaction, while getTotalChangedRowCount() returns the count on the current connection. getLastInsertRowId() returns the rowid of the last row to be inserted on the current connection.
  • Raw statements: issue a raw SQlite statement, bypassing convenience wrappers and any additional processing overhead that they may incur.

Updates des Dynamic Performance Framework von Android

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

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

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

Datenschutz

Android 15 bietet eine Vielzahl von Funktionen, mit denen App-Entwickler die Privatsphäre der Nutzer schützen können.

Erkennung von Bildschirmaufzeichnungen

Unter Android 15 werden Apps unterstützt, die erkennen, dass sie aufgezeichnet werden. Ein Callback wird immer dann ausgelöst, wenn die App innerhalb einer Bildschirmaufzeichnung den Status „Sichtbar“ oder „Unsichtbar“ wechselt. Eine Anwendung gilt als sichtbar, wenn Aktivitäten aufgezeichnet werden, die der UID des Registrierungsprozesses gehören. So können Sie den Nutzer informieren, wenn Ihre Anwendung einen sensiblen Vorgang ausführt, wenn dieser aufgezeichnet wird.

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

Erweiterte IntentFilter-Funktionen

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

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

下面是 AndroidManifest 语法的示例:

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

Vertrauliches Profil

The private space can be unlocked and locked to show or hide sensitive apps on a device.

Private space lets users create a separate space on their device where they can keep sensitive apps away from prying eyes, under an additional layer of authentication. The private space uses a separate user profile. When a user locks the private space, the profile is paused and any apps in the private space are no longer active. The user can choose to use the device lock or a separate lock factor for the private space.

Apps in the private space show up in a separate container in the launcher, and are hidden from the recents view, notifications, settings, and from other apps when the private space is locked. User-generated and downloaded content (such as media or files) and accounts are separated between the private space and the main space. The system sharesheet and the photo picker can be used to give apps access to content across spaces when the private space is unlocked.

We recommend that you test your app with private space to make sure your app works as expected, especially if your app falls into one of the following categories:

Letzte Nutzerauswahl für den Zugriff auf ausgewählte Fotos abfragen

现在,授予媒体权限的部分访问权限后,应用可以仅突出显示最近选择的照片和视频。此功能可以改善频繁请求访问照片和视频的应用的用户体验。如需在您的应用中使用此功能,请在通过 ContentResolver 查询 MediaStore 时启用 QUERY_ARG_LATEST_SELECTION_ONLY 参数。

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 für Android

Android 15 enthält die neuesten Erweiterungen für Android-Anzeigendienste sowie die neueste Version der Privacy Sandbox für Android. Diese Ergänzung ist Teil unserer Bemühungen, neue Technologien zu entwickeln, die den Datenschutz für Nutzer verbessern und effektive, personalisierte Anzeigen für mobile Apps ermöglichen. Auf unserer Privacy Sandbox-Seite finden Sie weitere Informationen zur Privacy Sandbox für Entwicklervorschauen und Betaprogrammen für Android, um Ihnen den Einstieg zu erleichtern.

Health Connect

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

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

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

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

Teilfreigabe des Bildschirms

Unter Android 15 wird die Teilfreigabe des Bildschirms unterstützt. Nutzer können also statt des gesamten Gerätebildschirms nur ein App-Fenster teilen oder aufzeichnen. Diese Funktion, die erstmals in Android 14 QPR2 aktiviert wurde, enthält MediaProjection-Callbacks, mit denen deine App die Teilbildschirmfreigabe anpassen kann. Hinweis: Für Apps, die auf Android 14 (API-Level 34) oder höher ausgerichtet sind, ist jetzt für jede MediaProjection-Erfassungssitzung eine Nutzereinwilligung erforderlich.

Nutzererfahrung und System-UI

Android 15 bietet App-Entwicklern und Nutzern mehr Kontrolle und Flexibilität bei der Konfiguration ihres Geräts an ihre Anforderungen.

Weitere Informationen dazu, wie Sie mithilfe der neuesten Verbesserungen in Android 15 die Nutzerfreundlichkeit Ihrer App verbessern können, finden Sie im Vortrag zur Verbesserung der Nutzerfreundlichkeit Ihrer Android-App von der Google I/O.

Umfassendere Widget-Vorschauen mit der Generated Previews API

Vor Android 15 bestand die einzige Möglichkeit zur Bereitstellung von Vorschauen für die Widget-Auswahl darin, eine statische Bild- oder Layoutressource anzugeben. Diese Vorschauen unterscheiden sich häufig deutlich vom Aussehen des eigentlichen Widgets, wenn es auf dem Startbildschirm platziert wird. Außerdem können mit Jetpack Glance keine statischen Ressourcen erstellt werden. Daher musste ein Glance-Entwickler einen Screenshot von seinem Widget erstellen oder ein XML-Layout erstellen, um eine Widgetvorschau zu erhalten.

Unter Android 15 werden generierte Vorschauen unterstützt. Anbieter von App-Widgets können also RemoteViews generieren und als Auswahlvorschau anstelle einer statischen Ressource verwenden.

Apps können der Widget-Auswahl Remote-Ansichten zur Verfügung stellen, damit sie den Inhalt in der Auswahl so aktualisieren können, dass er dem Nutzer besser entspricht.

Push-API

Apps können generierte Vorschauen über eine Push API bereitstellen. Anwendungen können jederzeit in ihrem Lebenszyklus Vorschauen bereitstellen. Sie erhalten keine explizite Anfrage vom Host, eine Vorschau bereitzustellen. Vorschauen werden in AppWidgetService beibehalten und können von Hosts bei Bedarf angefordert werden. Im folgenden Beispiel wird eine XML-Widget-Layoutressource geladen und als Vorschau festgelegt:

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

Der erwartete Ablauf lautet:

  1. Der Widget-Anbieter ruft jederzeit setWidgetPreview auf. Die bereitgestellten Vorschauen werden zusammen mit anderen Anbieterinformationen in AppWidgetService beibehalten.
  2. setWidgetPreview benachrichtigt Hosts über den AppWidgetHost.onProvidersChanged-Callback über eine aktualisierte Vorschau. Daraufhin werden vom Widget-Host alle Anbieterinformationen neu geladen.
  3. Beim Anzeigen einer Widgetvorschau prüft der Host AppWidgetProviderInfo.generatedPreviewCategories. Wenn die ausgewählte Kategorie verfügbar ist, ruft er AppWidgetManager.getWidgetPreview auf, um die gespeicherte Vorschau für diesen Anbieter zurückzugeben.

Wann Sie setWidgetPreview anrufen sollten

Da es keinen Callback für die Bereitstellung von Vorschauen gibt, können Apps jederzeit während der Ausführung Vorschauen senden. Wie oft die Vorschau aktualisiert wird, hängt vom Anwendungsfall des Widgets ab.

In der folgenden Liste werden die beiden Hauptkategorien von Anwendungsfällen für die Vorschau beschrieben:

  • Anbieter, die in der Widget-Vorschau echte Daten zeigen, z. B. personalisierte oder aktuelle Informationen. Diese Anbieter können die Vorschau festlegen, sobald sich der Nutzer angemeldet oder eine Erstkonfiguration in der App vorgenommen hat. Danach können sie eine regelmäßige Aufgabe einrichten, um die Vorschauen im gewünschten Rhythmus zu aktualisieren. Ein solcher Widget-Typ kann beispielsweise ein Foto-, Kalender-, Wetter- oder Nachrichten-Widget sein.
  • Anbieter, die statische Informationen in Vorschauen oder Quick-Action-Widgets anzeigen, aber keine Daten enthalten. Diese Anbieter können eine Vorschau beim ersten Start der App festlegen. Beispiele für diese Art von Widget sind ein Drive-Schnellaktionen-Widget oder ein Chrome-Verknüpfungs-Widget.

Einige Anbieter zeigen in der Hub-Modusauswahl möglicherweise eine statische Vorschau, aber echte Informationen in der Auswahl auf dem Startbildschirm. Diese Anbieter sollten die Richtlinien für beide Anwendungsfälle befolgen, um Vorschauen festzulegen.

Die Funktion „Bild im Bild“

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

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

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

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

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

Verbesserte „Bitte nicht stören“-Regeln

Mit AutomaticZenRule können Apps die Regeln für die Geräuschunterdrückung (Bitte nicht stören) anpassen und entscheiden, wann sie aktiviert oder deaktiviert werden sollen. Unter Android 15 werden diese Regeln erheblich verbessert, um die Nutzererfahrung zu verbessern. Die folgenden Verbesserungen wurden vorgenommen:

  • Typen werden zu AutomaticZenRule hinzugefügt. Dadurch kann das System einige Regeln gesondert behandeln.
  • AutomaticZenRule wird ein Symbol hinzugefügt, damit die Modi besser erkennbar sind.
  • Einen triggerDescription-String zu AutomaticZenRule hinzufügen, der die Bedingungen beschreibt, unter denen die Regel für den Nutzer aktiviert werden soll.
  • ZenDeviceEffects wurde zu AutomaticZenRule hinzugefügt. Damit können Regeln wie die Graustufenanzeige, den Nachtmodus oder das Dimmen des Hintergrunds ausgelöst werden.

VibrationEffect für Benachrichtigungskanäle festlegen

Android 15 unterstützt das Festlegen von starken Vibrationen für eingehende Benachrichtigungen nach Kanal mit NotificationChannel.setVibrationEffect. So können Nutzer zwischen verschiedenen Arten von Benachrichtigungen unterscheiden, ohne auf ihr Gerät sehen zu müssen.

Große Displays und Formfaktoren

Android 15 bietet deinen Apps die Möglichkeit, die Formfaktoren von Android, einschließlich großer Displays, umklappbarer und faltbarer Smartphones, optimal zu nutzen.

Verbessertes Multitasking auf großen Bildschirmen

Mit Android 15 ist Multitasking auf Geräten mit großen Bildschirmen noch einfacher. Nutzer können beispielsweise ihre bevorzugten Kombinationen für Apps mit geteiltem Bildschirm speichern, um schnell darauf zuzugreifen, und die Taskleiste auf dem Bildschirm anpinnen, um schnell zwischen Apps zu wechseln. Deshalb ist es wichtiger denn je, dass Ihre App anpassungsfähig ist.

Auf der Google I/O finden Sie hilfreiche Sitzungen zu den Themen Adaptive Android-Apps erstellen und UI mit der adaptiven Material 3-Bibliothek erstellen. In unserer Dokumentation finden Sie weitere Informationen zum Design für große Bildschirme.

Unterstützung für das Cover

Deine App kann eine Eigenschaft deklarieren, die unter Android 15 verwendet wird, damit deine Application oder Activity auf kleinen Titelbildschirmen unterstützter umklappbarer Geräte angezeigt werden können. Diese Bildschirme sind zu klein, um als kompatible Ziele für die Ausführung von Android-Apps betrachtet zu werden, aber Ihre App kann diese unterstützen, sodass Ihre App an mehr Orten verfügbar ist.

Konnektivität

Unter Android 15 wird die Plattform aktualisiert, damit deine App Zugriff auf die neuesten Fortschritte in der Kommunikations- und drahtlosen Technologie erhält.

Satellitenunterstützung

Android 15 erweitert die Plattformunterstützung für Satellitenverbindungen weiter und enthält einige UI-Elemente, um eine einheitliche Nutzererfahrung in der gesamten Landschaft der Satellitenkonnektivität zu gewährleisten.

Apps können ServiceState.isUsingNonTerrestrialNetwork() verwenden, um zu erkennen, wann ein Gerät mit einem Satelliten verbunden ist. So wissen sie besser, warum vollständige Netzwerkdienste möglicherweise nicht verfügbar sind. Darüber hinaus bietet Android 15 Unterstützung für SMS- und MMS-Apps sowie vorinstallierte RCS-Apps, um über die Satellitenverbindung Nachrichten zu senden und zu empfangen.

Eine Benachrichtigung wird angezeigt, wenn das Gerät eine Verbindung zu einem Satelliten hergestellt hat.

Nahtlose NFC-Funktionen

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

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

Wallet-Rolle

Mit Android 15 wird eine neue Wallet-Rolle eingeführt, die eine engere Einbindung in die bevorzugte Wallet-App des Nutzers ermöglicht. Diese Rolle ersetzt die NFC-Standardeinstellung für kontaktloses Bezahlen. Nutzer können den Wallet-Rolleninhaber unter Einstellungen > Apps > Standard-Apps verwalten.

Die Rolle „Wallet“ wird beim Routing von NFC-Tippaktionen für AIDs verwendet, die in der Zahlungskategorie registriert sind. Eingaben werden immer an den Wallet-Rolleninhaber gesendet, es sei denn, eine andere App, die für dieselbe AID registriert ist, wird im Vordergrund ausgeführt.

Diese Rolle wird auch verwendet, um zu bestimmen, wo die Kachel für den Schnellzugriff für Wallet bei Aktivierung platziert werden soll. Wenn die Rolle auf „None“ festgelegt ist, ist die QuickAccess-Kachel nicht verfügbar und NFC-Tippaktionen für Zahlungskategorien werden nur an die Vordergrund-App gesendet.

Sicherheit

Mit Android 15 kannst du die Sicherheit deiner App verbessern, deine App-Daten schützen und Nutzern mehr Transparenz und Kontrolle über ihre Daten bieten. Im Vortrag Nutzersicherheit unter Android schützen von der Google I/O erfahren Sie mehr darüber, wie wir die Sicherheitsmaßnahmen für Nutzer verbessern und Ihre App vor neuen Bedrohungen schützen.

Schlüsselverwaltung für Ende-zu-Ende-Verschlüsselung

Wir führen E2eeContactKeysManager in Android 15 ein. Damit wird die Ende-zu-Ende-Verschlüsselung (E2EE) in Android-Apps durch die Bereitstellung einer API auf Betriebssystemebene für das Speichern kryptografischer öffentlicher Schlüssel ermöglicht.

E2eeContactKeysManager ist für die Einbindung in die Anwendung für Plattformkontakte konzipiert und bietet Nutzern eine zentrale Möglichkeit, die öffentlichen Schlüssel ihrer Kontakte zu verwalten und zu prüfen.

Berechtigungsprüfungen für Inhalts-URIs

Mit Android 15 werden eine Reihe neuer APIs eingeführt, die Berechtigungsprüfungen für Inhalts-URIs durchführen:

Bedienungshilfen

Android 15 bietet zusätzliche Funktionen, die die Barrierefreiheit für Nutzer verbessern.

Bessere Brailleschrift

Seit Android 15 unterstützt TalkBack nun Braillezeilen, die den HID-Standard sowohl über USB als auch über sicheres Bluetooth verwenden.

Dieser Standard ähnelt dem für Mäuse und Tastaturen. Er wird Android im Laufe der Zeit dabei helfen, eine breitere Palette von Braillezeilen zu unterstützen.

Lokalisierung

Android 15 bietet Funktionen, die die Nutzerfreundlichkeit ergänzen, wenn ein Gerät in verschiedenen Sprachen verwendet wird.

Schriftart für CJK-Variablen

Ab Android 15 ist NotoSansCJK die Schriftartdatei für Chinesisch, Japanisch und Koreanisch (CJK) als variable Schriftart. Variable Schriftarten eröffnen neue Möglichkeiten für die Creative-Typografie in CJK-Sprachen. Designschaffende können ein breiteres Spektrum an Stilen ausprobieren und optisch ansprechende Layouts erstellen, die zuvor schwer oder unmöglich zu erreichen waren.

Wie die Variablenschrift für die Sprachen Chinesisch, Japanisch und Koreanisch (CJK) mit unterschiedlichen Schriftbreiten angezeigt wird.

Begründung zwischen den Zeichen

从 Android 15 开始,可以使用 JUSTIFICATION_MODE_INTER_CHARACTER 利用字母间距将文本两端对齐。Android 8.0(API 级别 26)中首次引入了字词间对齐,而字符间对齐可为使用空格字符进行分割的语言(例如中文、日语等)提供类似的功能。

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


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


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

Automatische Konfiguration von Zeilenumbrüchen

Android 从 Android 13(API 级别 33)开始针对日语和韩语支持基于短语的换行符。不过,虽然基于短语的换行符可以提高短行文本的可读性,但不适用于较长的文本。在 Android 15 中,应用现在可以使用 LINE_BREAK_WORD_STYLE_AUTO 选项为短文本行应用基于短语的换行符。此选项用于选择最适合该文本的文字样式选项。

对于简短的文本行,使用基于短语的换行符,其功能与 LINE_BREAK_WORD_STYLE_PHRASE 相同,如下图所示:

对于简短的文本行,LINE_BREAK_WORD_STYLE_AUTO 会采用基于短语的换行符,以提高文本的可读性。 这与应用 LINE_BREAK_WORD_STYLE_PHRASE 相同。

对于较长的文本,LINE_BREAK_WORD_STYLE_AUTO 使用不换行的字词样式,其功能与 LINE_BREAK_WORD_STYLE_NONE 相同,如下图所示:

对于较长的文本,LINE_BREAK_WORD_STYLE_AUTO 不会应用换行字词样式,以提高文本的可读性。 这与应用 LINE_BREAK_WORD_STYLE_NONE 相同。

Neue japanische Hentaigana-Schriftart

In Android 15 ist eine neue Schriftartdatei für das alte japanische Hiragana (Hentaigana) standardmäßig gebündelt. Die einzigartigen Formen der Hentaigana-Figuren können den Kunstwerken oder dem Design ein besonderes Flair verleihen und gleichzeitig dazu beitragen, die genaue Übertragung und das Verständnis antiker japanischer Dokumente zu bewahren.

Zeichen- und Textstil für die japanische Schriftart Hentaigana.

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. Dieses Logo oder eine modifizierte Version dürfen von jeder Person verwendet oder modifiziert werden, um auf das VideoLAN-Projekt oder ein vom VideoLAN-Team entwickeltes Produkt zu verweisen. Dies bedeutet jedoch nicht, dass dies vom Projekt unterstützt wird.

Vulkan und das Vulkan-Logo sind eingetragene Marken von Khronos Group Inc.

OpenGL ist eine eingetragene Marke und das OpenGL ES-Logo ist eine Marke von Hewlett Packard Enterprise, die mit Genehmigung von Khronos verwendet wird.