Funktionen und APIs – Übersicht

Android 15 bietet 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 zu API-Unterschieden. Ausführliche Informationen zu den neuen APIs finden Sie in der Android API-Referenz. Die neuen APIs sind hervorgehoben dargestellt. Wenn du wissen möchtest, in welchen Bereichen sich Plattformänderungen auf deine Apps auswirken können, solltest du dir die Verhaltensänderungen von Android 15, 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 enthält eine Vielzahl von Funktionen, die die Kamera- und Mediennutzung verbessern und mit denen du Tools und Hardware nutzen kannst, um Creator dabei zu unterstützen, ihre Vision auf Android zu verwirklichen.

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

Booster für wenig Licht

Mit Android 15 wird die Optimierung bei wenig Licht eingeführt, ein neuer Modus für die automatische Belichtung, der sowohl für Kamera 2 als auch für die Kameraerweiterung für den Nachtmodus verfügbar ist. Mit der Funktion „Verstärkung bei wenig Licht“ wird die Belichtung des Vorschaustreams bei schwachem Licht angepasst. Dies unterscheidet sich von der Art und Weise, wie mit der Nachtmodus-Kameraerweiterung Standbilder erstellt werden, da der Nachtmodus eine Reihe von Fotos zu einem einzigen, verbesserten Bild kombiniert. Der Nachtmodus eignet sich zwar sehr gut zum Erstellen von Standbildern, er kann jedoch keinen fortlaufenden Stream von Frames erzeugen, die Optimierung bei wenig Licht hingegen schon. Dadurch ermöglicht die Optimierung bei wenig Licht neue Kamerafunktionen, z. B.:

  • Sie bieten eine optimierte Bildvorschau, damit Nutzer Bilder bei schlechten Lichtverhältnissen besser einordnen können.
  • QR-Codes bei wenig Licht scannen

Wenn Sie „Optimierung bei wenig Licht“ aktivieren, wird sie bei wenig Licht automatisch aktiviert und bei mehr Licht wieder ausgeschaltet.

Apps können bei schlechten Lichtverhältnissen aus dem Vorschaustream aufzeichnen, um ein helleres Video zu speichern.

Weitere Informationen finden Sie unter Verstärkung bei wenig Licht.

Kamerasteuerung in der App

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

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

HDR-Tonsteuerung

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

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

Lautstärkeregelung

Mit Android 15 wird der Lautheitsstandard CTA-2075 unterstützt, damit Inkonsistenzen in der Audiowiedergabe vermieden werden und Nutzer die Lautstärke beim Wechseln zwischen Inhalten nicht ständig anpassen müssen. Das System nutzt bekannte Eigenschaften der Ausgabegeräte (Kopfhörer und Lautsprecher) zusammen mit den in AAC-Audioinhalten verfügbaren Lautstärkemetadaten, um die Audiolautstärke und die Dynamikverdichtung intelligent anzupassen.

Damit du diese Funktion aktivieren kannst, musst du dafür sorgen, dass Lautstärke-Metadaten in deinen AAC-Inhalten verfügbar sind, und aktivieren die Plattformfunktion in deiner App. Dazu instanziierst du ein LoudnessCodecController-Objekt, indem du seine create-Factory-Methode mit der Audiositzungs-ID aus der verknüpften AudioTrack aufrufst. Dadurch werden automatisch Audioupdates angewendet. Sie können eine OnLoudnessCodecUpdateListener übergeben, um Lautheitsparameter zu ändern oder zu filtern, bevor sie auf den MediaCodec angewendet werden.

// 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 wird ebenfalls aktualisiert, um die LoudnessCodecController-APIs für eine nahtlose App-Integration zu verwenden.

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

dav1d logo

dav1d, the popular AV1 software decoder from VideoLAN is now 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.

For now, 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.

Produktivität und Tools für Entwickler

Wir arbeiten zwar vor allem daran, die Produktivitätszentren für Tools wie Android Studio, Jetpack Compose und die Android Jetpack-Bibliotheken zu optimieren, aber wir suchen immer nach Möglichkeiten in der Plattform, damit Sie Ihre Vision leichter verwirklichen können.

Updates zu OpenJDK 17

Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.

The following key features and improvements are included:

These APIs are updated on over a billion devices running Android 12 (API level 31) and higher through Google Play System updates, so you can target the latest programming features.

Verbesserungen beim PDF

Android 15 includes substantial improvements to the PdfRenderer APIs. Apps can incorporate advanced features such as rendering password-protected files, annotations, form editing, searching, and selection with copy. Linearized PDF optimizations are supported to speed local PDF viewing and reduce resource use.

The latest updates to PDF rendering include features such as searching an embedded PDF file.

The PdfRenderer has been moved to a module that can be updated using Google Play system updates independent of the platform release, and we're supporting these changes back to Android 11 (API level 30) by creating a compatible pre-Android 15 version of the API surface, called PdfRendererPreV.

We value your feedback on the enhancements we've made to the PdfRenderer API surface, and we plan to make it even easier to incorporate these APIs into your app with an upcoming Android Jetpack library.

Verfeinerungen des automatischen Sprachwechsels

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 Steuerelemente für Zeilenumbrüche

Ab Android 15 können ein TextView und der zugrunde liegende Zeilenumbruch einen bestimmten Teil des Textes in derselben Zeile beibehalten, um die Lesbarkeit zu verbessern. Sie können diese Anpassung des Zeilenumbruchs mithilfe des Tags <nobreak> in Stringressourcen oder in createNoBreakSpan nutzen. Ebenso können Sie mit dem <nohyphen>-Tag oder createNoHyphenationSpan Wörter aus Bindestrichen beibehalten.

Die folgende Stringressource enthält beispielsweise keinen Zeilenumbruch und wird mit dem Text „Pixel 8 Pro.“ gerendert, der an einer unerwünschten Stelle unterbrochen wird:

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

Im Gegensatz dazu enthält diese Stringressource das Tag <nobreak>, das die Wortgruppe „Pixel 8 Pro“ umschließt und Zeilenumbrüche verhindert:

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

Der Unterschied in der Darstellung dieser Strings wird in den folgenden Bildern dargestellt:

Layout für eine Textzeile, in der die Wortgruppe „Pixel 8 Pro.“ nicht mit einem <nobreak>-Tag umgebrochen ist.
Layout für dieselbe Textzeile, in die die Wortgruppe „Pixel 8 Pro.“ mit einem <nobreak>-Tag umgebrochen ist.

App-Archivierung

Android and Google Play announced support for app archiving last year, allowing users to free up space by partially removing infrequently used apps from the device that were published using Android App Bundle on Google Play. Android 15 now includes OS level support for app archiving and unarchiving, making it easier for all app stores to implement it.

Apps with the REQUEST_DELETE_PACKAGES permission can call the PackageInstaller requestArchive method to request archiving an installed app package, which removes the APK and any cached files, but persists user data. Archived apps are returned as displayable apps through the LauncherApps APIs; users will see a UI treatment to highlight that those apps are archived. If a user taps on an archived app, the responsible installer will get a request to unarchive it, and the restoration process can be monitored by the ACTION_PACKAGE_ADDED broadcast.

Grafik

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

GPU-Zugriff von Android modernisieren

Logo: Vulkan

Die Android-Hardware hat sich seit den Anfängen stark weiterentwickelt, als das Kernbetriebssystem auf einer einzigen CPU ausgeführt wurde und auf GPUs über APIs basierend auf Pipelines mit fester Funktion zugegriffen wurde. Die Vulkan® Graphics API ist im NDK seit Android 7.0 (API-Level 24) mit einer Abstraktion auf niedrigerer Ebene verfügbar, die moderne GPU-Hardware besser widerspiegelt, besser skaliert werden kann, um mehrere CPU-Kerne zu unterstützen, und einen geringeren CPU-Treiberaufwand bietet, was zu einer verbesserten App-Leistung führt. Vulkan wird von allen modernen Spiel-Engines unterstützt.

Vulkan ist die von Android bevorzugte Schnittstelle zur GPU. Daher enthält Android 15 ANGLE als optionale Ebene zum Ausführen von OpenGL® ES auf Vulkan. Durch den Wechsel zu ANGLE wird die Android OpenGL-Implementierung standardisiert, um die Kompatibilität und in einigen Fällen auch die Leistung zu verbessern. Sie können die Stabilität und Leistung Ihrer OpenGL ES-App mit ANGLE testen. Aktivieren Sie dazu unter Android 15 die Entwickleroption unter Einstellungen -> System -> Entwickleroptionen -> Experimentell: ANGLE aktivieren.

Die Roadmap „Android ANGLE“ auf Vulkan

Roadmap der bevorstehenden Änderungen bei den Android GPU APIs

Im Rahmen der Optimierung unseres GPU-Stacks werden wir in Zukunft ANGLE als GL-Systemtreiber auf weiteren neuen Geräten veröffentlichen. Wir gehen davon aus, dass OpenGL/ES künftig nur über ANGLE verfügbar sein wird. Die Unterstützung von OpenGL ES auf allen Geräten wird jedoch fortgesetzt.

Empfohlene nächste Schritte

Wählen Sie in den Entwickleroptionen den ANGLE-Treiber für OpenGL ES aus und testen Sie Ihre App. Bei neuen Projekten empfehlen wir Ihnen dringend, Vulkan für C/C++ zu verwenden.

Verbesserungen für Canvas

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

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

Leistung und Akku

Android hilft dir weiterhin dabei, die Leistung und Qualität deiner Apps zu verbessern. Mit Android 15 werden neue APIs eingeführt, mit denen Aufgaben in Ihrer App effizienter ausgeführt, die App-Leistung optimiert und Informationen zu Ihren Apps gesammelt werden können.

Best Practices für den Akkuverbrauch, die Fehlerbehebung bei Netzwerk- und Stromverbrauch und Details dazu, wie wir die Akkueffizienz von Hintergrundaufgaben unter Android 15 und neueren Versionen von Android verbessern, finden Sie auf der Google I/O im Artikel Akkueffizienz der Hintergrundarbeit unter Android verbessern.

ApplicationStartInfo-API

In previous versions of Android, app startup has been a bit of a mystery. It was challenging to determine within your app whether it started from a cold, warm, or hot state. It was also difficult to know how long your app spent during the various launch phases: forking the process, calling onCreate, drawing the first frame, and more. When your Application class was instantiated, you had no way of knowing whether the app started from a broadcast, a content provider, a job, a backup, boot complete, an alarm, or an Activity.

The ApplicationStartInfo API on Android 15 provides all of this and more. You can even choose to add your own timestamps into the flow to help collect timing data in one place. In addition to collecting metrics, you can use ApplicationStartInfo to help directly optimize app startup; for example, you can eliminate the costly instantiation of UI-related libraries within your Application class when your app is starting up due to a broadcast.

Detaillierte Informationen zur App-Größe

Since Android 8.0 (API level 26), Android has included the StorageStats.getAppBytes API that summarizes the installed size of an app as a single number of bytes, which is a sum of the APK size, the size of files extracted from the APK, and files that were generated on the device such as ahead-of-time (AOT) compiled code. This number is not very insightful in terms of how your app is using storage.

Android 15 adds the StorageStats.getAppBytesByDataType([type]) API, which lets you get insight into how your app is using up all that space, including APK file splits, AOT and speedup related code, dex metadata, libraries, and guided profiles.

Von Anwendungen verwaltete Profilerstellung

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

SQLite-Datenbankverbesserungen

Mit Android 15 werden neue SQLite APIs eingeführt, die erweiterte Features der zugrunde liegenden SQLite-Engine zur Verfügung stellen, die auf bestimmte Leistungsprobleme abzielen, die in Apps auftreten können.

Entwickler sollten sich die Best Practices für die SQLite-Leistung ansehen, um ihre SQLite-Datenbank optimal zu nutzen, insbesondere wenn Sie mit großen Datenbanken arbeiten oder latenzempfindliche Abfragen ausführen.

  • Schreibgeschützte verzögerte Transaktionen: Wenn Sie schreibgeschützte Transaktionen ausgeben (ohne Schreibanweisungen), verwenden Sie beginTransactionReadOnly() und beginTransactionWithListenerReadOnly(SQLiteTransactionListener), um schreibgeschützte DEFERRED-Transaktionen auszugeben. Solche Transaktionen können gleichzeitig ausgeführt werden. Wenn sich die Datenbank im WAL-Modus befindet, können sie gleichzeitig mit IMMEDIATE- oder EXCLUSIVE-Transaktionen ausgeführt werden.
  • Zeilenanzahl und -IDs: Es wurden neue APIs hinzugefügt, um die Anzahl der geänderten Zeilen oder die zuletzt eingefügte Zeilen-ID abzurufen, ohne eine zusätzliche Abfrage auszuführen. getLastChangedRowCount() gibt die Anzahl der Zeilen zurück, die mit der letzten SQL-Anweisung in der aktuellen Transaktion eingefügt, aktualisiert oder gelöscht wurden. getTotalChangedRowCount() gibt die Anzahl der aktuellen Verbindung zurück. getLastInsertRowId() gibt den rowid der letzten Zeile zurück, die bei der aktuellen Verbindung eingefügt werden soll.
  • Rohanweisungen: Sie geben eine unbearbeitete SQlite-Anweisung aus und vermeiden dabei Convenience-Wrapper und zusätzlichen Verarbeitungsaufwand.

Updates für das Android Dynamic Performance Framework

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

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

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

Datenschutz

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

Bildschirmaufzeichnungserkennung

Android 15 adds support for apps to detect that they are being recorded. A callback is invoked whenever the app transitions between being visible or invisible within a screen recording. An app is considered visible if activities owned by the registering process's UID are being recorded. This way, if your app is performing a sensitive operation, you can inform the user that they're being recorded.

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 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 new <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 new android:query and android:fragment attributes.

Here's an example of the AndroidManifest syntax:

<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

Der private Bereich kann entsperrt und gesperrt werden, um sensible Apps auf einem Gerät ein- oder auszublenden.

Im privaten Bereich können Nutzer einen separaten Bereich auf ihrem Gerät erstellen, in dem sie vertrauliche Apps mithilfe einer zusätzlichen Authentifizierungsebene vor neugierigen Blicken schützen können. Im privaten Bereich wird ein separates Nutzerprofil verwendet. Der Nutzer kann die Gerätesperre oder einen separaten Sperrfaktor für den privaten Bereich verwenden.

Apps im privaten Bereich werden in einem separaten Container im Launcher angezeigt und nicht in der Ansicht „Zuletzt verwendet“, in Benachrichtigungen, in den Einstellungen und in anderen Apps angezeigt, wenn der private Bereich gesperrt ist. Von Nutzern erstellte und heruntergeladene Inhalte (z. B. Medien oder Dateien) und Konten werden zwischen dem privaten Bereich und dem Hauptbereich getrennt. Über das Sharesheet des Systems und die Bildauswahl können Apps Zugriff auf Inhalte in verschiedenen Bereichen gewähren, wenn der private Bereich entsperrt ist.

Nutzer können vorhandene Apps und ihre Daten nicht in den privaten Bereich verschieben. Stattdessen wählen Nutzer eine Installationsoption im privaten Bereich aus, um eine Anwendung über den von ihnen bevorzugten App-Shop zu installieren. Apps im privaten Bereich werden als separate Kopien von beliebigen Apps im Hauptbereich installiert (neue Kopien derselben App).

Wenn ein Nutzer den privaten Bereich sperrt, wird das Profil beendet. Solange das Profil beendet ist, sind Apps im privaten Bereich nicht mehr aktiv und können keine Vordergrund- oder Hintergrundaktivitäten ausführen, einschließlich der Anzeige von Benachrichtigungen.

Wir empfehlen dir, deine App im privaten Bereich zu testen, um sicherzustellen, dass sie wie erwartet funktioniert. Das gilt insbesondere, wenn deine App in eine der folgenden Kategorien fällt:

Zuletzt ausgewählte 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 enthält die neuesten Erweiterungen rund um Health Connect by Android, eine sichere und zentrale Plattform zum Verwalten und Freigeben von von Apps erhobenen Gesundheits- und Fitnessdaten. Dieses Update unterstützt neue Datentypen für Fitness, Ernährung, Hauttemperatur, Trainingspläne und mehr.

Die Erfassung der Hauttemperatur ermöglicht es Nutzern, genauere Temperaturdaten von einem Wearable oder einem anderen Tracking-Gerät zu speichern und zu teilen.

Trainingspläne sind strukturierte Trainingspläne, die einem Nutzer helfen, seine Fitnessziele zu erreichen. Die Unterstützung für Trainingspläne umfasst eine Vielzahl von Abschluss- und Leistungszielen:

Weitere Informationen zu den neuesten Updates für Health Connect in Android findest du im Vortrag Building anpassbare Experiences with Android Health von der Google I/O.

Teilfreigabe des Bildschirms

Android 15 supports partial 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 partial screen sharing experience. Note that for apps targeting Android 14 (API level 34) or higher, user consent is now required for each MediaProjection capture session.

Nutzererfahrung und System-UI

Android 15 bietet App-Entwicklern und Nutzern mehr Kontrolle und Flexibilität bei der Konfiguration von Geräten, die ihren Anforderungen entsprechen.

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

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

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.

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 Bildschirme und Formfaktoren

Android 15 bietet Ihren Apps die Möglichkeit, die Formfaktoren von Android, einschließlich großer Displays, klappbarer und faltbarer Geräte, optimal zu nutzen.

Verbessertes Multitasking auf großen Bildschirmen

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.

Unterstützung für Coverdisplay

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

Android 15 aktualisiert die Plattform, damit Ihre App auf die neuesten Fortschritte in den Bereichen Kommunikation und Funktechnologien zugreifen kann.

Satellitensupport

Android 15 continues to extend platform support for satellite connectivity and includes some UI elements to ensure a consistent user experience across the satellite connectivity landscape.

Apps can use ServiceState.isUsingNonTerrestrialNetwork() to detect when a device is connected to a satellite, giving them more awareness of why full network services might be unavailable. Additionally, Android 15 provides support for SMS and MMS apps as well as preloaded RCS apps to use satellite connectivity for sending and receiving messages.

A notification appears when the device connects to a satellite.

Reibungslosere NFC-Funktionen

Android 15 arbeitet daran, das kontaktlose Bezahlen nahtloser und zuverlässiger zu gestalten und gleichzeitig das robuste NFC-System von Android zu unterstützen. Auf unterstützten Geräten können Apps den NfcAdapter anfordern, in den Beobachtungsmodus zu wechseln. In diesem Modus werden die PollingFrame-Objekte des NFC-Dienstes der App zur Verarbeitung gesendet, wobei das Gerät zwar abhört, aber nicht auf die NFC-Lesegeräte reagiert. Die PollingFrame-Objekte können zur Authentifizierung vor der ersten Kommunikation mit dem NFC-Lesegerät verwendet werden, was in vielen Fällen eine Transaktion mit nur einem Fingertipp ermöglicht.

Darüber hinaus können Anwendungen jetzt auf unterstützten Geräten einen Filter registrieren, sodass sie über die Aktivität der Abfrageschleife benachrichtigt werden können. Dies ermöglicht einen reibungslosen Betrieb mit mehreren NFC-fähigen Anwendungen.

Wallet-Rolle

Android 15 introduces a new Wallet role that allows tighter integration with the user's preferred wallet app. This role replaces the NFC default contactless payment setting. Users can manage the Wallet role holder by navigating to Settings > Apps > Default Apps.

The Wallet role is used when routing NFC taps for AIDs registered in the payment category. Taps always go to the Wallet role holder unless another app that is registered for the same AID is running in the foreground.

This role is also used to determine where the Wallet QuickAccess tile should go when activated. When the role is set to "None", the QuickAccess tile isn't available and payment category NFC taps are only delivered to the foreground app.

Sicherheit

Mit Android 15 kannst du die Sicherheit deiner App verbessern, die Daten deiner App schützen und Nutzern mehr Transparenz und Kontrolle über ihre Daten bieten. Im Vortrag von Google I/O unter Nutzersicherheit auf Android-Geräten schützen erfahren Sie mehr darüber, wie wir die Nutzersicherheit verbessern und Ihre App vor neuen Bedrohungen schützen.

Anmeldedaten-Manager in Autofill einbinden

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.

Registrierung und Anmeldung durch einmaliges Tippen in biometrische Aufforderungen einbinden

Credential Manager integrates biometric prompts into the credential creation and sign-in processes, eliminating the need for providers to manage biometric prompts. As a result, credential providers only need to focus on the results of the create and get flows, augmented with the biometric flow result. This simplified process creates a more efficient and streamlined credential creation and retrieval process.

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

Android 15 引入了一组可对内容 URI 执行权限检查的新 API:

Bedienungshilfen

Android 15 bietet neue 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 zusätzliche Funktionen, die die Nutzerfreundlichkeit ergänzen, wenn ein Gerät in verschiedenen Sprachen verwendet wird.

Schriftart der Variablen CJK

从 Android 15 开始,中文、日语和韩语 (CJK) 语言的字体文件 NotoSansCJK 现已成为可变字体。可变字体为 CJK 语言的广告素材排版开辟了新的可能性。设计师可以探索更广泛的样式,并创建以前难以或无法实现的具有视觉冲击力的布局。

中文、日语和韩语 (CJK) 语言的可变字体在不同字体宽度下的显示效果。

Zeichenblockierung

Ab Android 15 kann Text mithilfe von JUSTIFICATION_MODE_INTER_CHARACTER unter Verwendung von Buchstabenabstand im Blocksatz ausgerichtet werden. Die Inter-Wort-Begründung wurde erstmals in Android 8.0 (API-Ebene 26) eingeführt. Diese bietet ähnliche Möglichkeiten für Sprachen, die das Leerzeichen zur Segmentierung verwenden, z. B. Chinesisch, Japanisch und andere.

Layout für japanischen Text mit JUSTIFICATION_MODE_NONE.
Layout für englischen Text mit JUSTIFICATION_MODE_NONE.


Layout für japanischen Text mit JUSTIFICATION_MODE_INTER_WORD.
Layout für englischen Text mit JUSTIFICATION_MODE_INTER_WORD.


Layout für japanischen Text mit dem neuen JUSTIFICATION_MODE_INTER_CHARACTER.
Layout für englischen Text mit dem neuen JUSTIFICATION_MODE_INTER_CHARACTER.

Automatischen Zeilenumbruch konfigurieren

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

Neue japanische Schriftart Hentaigana

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 锥形版权所有 (c) 1996-2010 VideoLAN。任何人都可以使用或修改此徽标或修改版本来指代 VideoLAN 项目或 VideoLAN 团队开发的任何产品,但不表示该项目的认可。

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

OpenGL 是注册商标,OpenGL ES 徽标是 Khronos 许可使用的 Hewlett Packard Enterprise 商标。