Die Android 12-Plattform enthält Verhaltensänderungen, die sich auf Ihre App auswirken können. Die folgenden Verhaltensänderungen gelten für alle Apps, die auf Android 12 ausgeführt werden, unabhängig von targetSdkVersion
. Sie sollten Ihre App testen und sie gegebenenfalls so anpassen, dass sie diese Funktionen unterstützt.
Sehen Sie sich auch die Liste der Verhaltensänderungen an, die sich nur auf Apps mit Ausrichtung auf Android 12 auswirken.
Nutzererfahrung
Stretch-Effekt beim Überscrollen
Auf Geräten mit Android 12 und höher ändert sich das visuelle Verhalten bei Überlaufereignissen.
Unter Android 11 und niedrigerer Version werden die visuellen Elemente bei einem Überscroll-Ereignis ausgeleuchtet. Unter Android 12 und höher werden die visuellen Elemente bei einem Drag-Ereignis gedehnt und zurückgesprungen und bei einem Fling-Ereignis nach vorne geschleudert und zurückgesprungen.
Weitere Informationen finden Sie im Leitfaden zum Animieren von Wischgesten.
App-Startbildschirme
Wenn Sie bereits einen benutzerdefinierten Ladebildschirm für Android 11 oder niedriger implementiert haben, müssen Sie Ihre App zur SplashScreen
API migrieren, damit sie ab Android 12 korrekt angezeigt wird. Wenn Sie Ihre App nicht migrieren, kann das zu einer Beeinträchtigung oder zu unbeabsichtigten Problemen beim Starten der App führen.
Eine Anleitung finden Sie unter Vorhandene Startbildschirmimplementierung zu Android 12 migrieren.
Außerdem wird ab Android 12 der neue Standard-Startbildschirm des Android-Systems bei Kaltstarts und Warmstarts für alle Apps verwendet.
Standardmäßig wird dieser System-Startbildschirm mit dem Launcher-Symbolelement Ihrer App und der windowBackground
Ihres Designs erstellt (sofern es eine einfarbige Farbe hat).
Weitere Informationen finden Sie im Entwicklerleitfaden für Splashscreens.
Web-Intent-Auflösung
Ab Android 12 (API-Level 31) wird ein generischer Web-Intent nur dann in eine Aktivität in Ihrer App aufgelöst, wenn Ihre App für die spezifische Domain in diesem Web-Intent genehmigt ist. Wenn Ihre App nicht für die Domain genehmigt ist, wird der Web-Intent stattdessen an die Standardbrowser-App des Nutzers weitergeleitet.
Apps können diese Genehmigung auf folgende Weise erhalten:
Bestätigen Sie die Domain mithilfe von Android-App-Links.
Bei Apps, die auf Android 12 oder höher ausgerichtet sind, ändert das System die automatische Überprüfung der Android App-Links Ihrer App. Prüfen Sie in den Intent-Filtern Ihrer App, ob Sie die Kategorie
BROWSABLE
einschließen und dashttps
-Schema unterstützen.Unter Android 12 oder höher können Sie die Android-App-Links Ihrer App manuell überprüfen, um zu testen, wie sich diese aktualisierte Logik auf Ihre App auswirkt.
Bitten Sie den Nutzer, Ihre App in den Systemeinstellungen mit der Domain zu verknüpfen.
Wenn Ihre App Web-Intents aufruft, sollten Sie einen Prompt oder ein Dialogfeld hinzufügen, in dem der Nutzer die Aktion bestätigen muss.
Verbesserungen beim Vollbildmodus für die Bedienung per Geste
In Android 12 wird das bisherige Verhalten konsolidiert, damit Nutzer Gestenbefehle im Vollbildmodus leichter ausführen können. Außerdem bietet Android 12 Abwärtskompatibilität für den fixierten immersiven Modus.
Display#getRealSize und getRealMetrics: Einstellung und Einschränkungen
Android-Geräte sind in vielen verschiedenen Formfaktoren erhältlich, z. B. mit großen Bildschirmen, Tablets und faltbaren Geräten. Damit Inhalte für jedes Gerät richtig gerendert werden können, muss Ihre App die Bildschirm- oder Displaygröße ermitteln. Im Laufe der Zeit hat Android verschiedene APIs zum Abrufen dieser Informationen bereitgestellt. Mit Android 11 haben wir die WindowMetrics
API eingeführt und die folgenden Methoden eingestellt:
Unter Android 12 empfehlen wir weiterhin die Verwendung von WindowMetrics
. Die folgenden Methoden werden eingestellt:
Um das Verhalten von Apps zu mildern, die Display-APIs zum Abrufen der Begrenzungen der App verwenden, werden in Android 12 die von den APIs zurückgegebenen Werte für Apps eingeschränkt, die nicht vollständig skalierbar sind. Dies kann sich auf Apps auswirken, die diese Informationen mit MediaProjection
verwenden.
Apps sollten die WindowMetrics
APIs verwenden, um die Grenzen ihres Fensters abzufragen, und Configuration.densityDpi
, um die aktuelle Dichte abzufragen.
Für eine größere Kompatibilität mit älteren Android-Versionen können Sie die Jetpack-Bibliothek WindowManager
verwenden. Sie enthält eine WindowMetrics
-Klasse, die Android 4.0 (API-Ebene 14) und höher unterstützt.
Beispiele für die Verwendung von WindowMetrics
Achten Sie zuerst darauf, dass die Aktivitäten Ihrer App vollständig skalierbar sind.
Für alle UI-bezogenen Arbeiten sollte eine Aktivität auf WindowMetrics
aus einem Aktivitätskontext zurückgreifen, insbesondere auf WindowManager.getCurrentWindowMetrics()
oder WindowMetricsCalculator.computeCurrentWindowMetrics()
von Jetpack.
Wenn Ihre App eine MediaProjection
erstellt, müssen die Begrenzungen die richtige Größe haben, da die Projektion die Displaypartition erfasst, in der die Projektor-App ausgeführt wird.
Wenn die App vollständig skalierbar ist, gibt der Aktivitätskontext die richtigen Ränder zurück:
Kotlin
val projectionMetrics: WindowMetrics = activityContext .getSystemService(WindowManager::class.java).maximumWindowMetrics
Java
WindowMetrics projectionMetrics = activityContext .getSystemService(WindowManager.class).getMaximumWindowMetrics();
Wenn die App nicht vollständig skalierbar ist, muss sie eine WindowContext
-Instanz abfragen und die WindowMetrics
der Aktivitätsgrenzen mit WindowManager.getMaximumWindowMetrics()
oder der Jetpack-Methode WindowMetricsCalculator.computeMaximumWindowMetrics()
abrufen.
Kotlin
val windowContext = context.createWindowContext(mContext.display!!, WindowManager.LayoutParams.TYPE_APPLICATION, null) val projectionMetrics = windowContext.getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
Context windowContext = context.createWindowContext(mContext.getDisplay(), WindowManager.LayoutParams.TYPE_APPLICATION, null); WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class) .getMaximumWindowMetrics();
Alle Apps im Mehrfenstermodus
In Android 12 ist der Mehrfenstermodus standardmäßig aktiviert.
Auf großen Bildschirmen (sw >= 600 dp) unterstützt die Plattform alle Apps unabhängig von der App-Konfiguration im Multifenstermodus. Bei resizeableActivity="false"
wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen anzupassen.
Auf kleinen Bildschirmen (sw < 600 dp) prüft das System die minWidth
und minHeight
einer Aktivität, um festzustellen, ob die Aktivität im Multifenstermodus ausgeführt werden kann. Bei resizeableActivity="false"
wird verhindert, dass die App unabhängig von der Mindestbreite und ‑höhe im Mehrfenstermodus ausgeführt wird.
Weitere Informationen finden Sie unter Unterstützung für mehrere Fenster.
Kameravorschau auf großen Bildschirmen
Kamera-Apps gehen in der Regel von einem festen Verhältnis zwischen der Ausrichtung des Geräts und dem Seitenverhältnis der Kameravorschau aus. Aber Formfaktoren mit großen Displays wie faltbare Geräte und Displaymodi wie Multifenster- und Multidisplay stellen diese Annahme infrage.
Unter Android 12 wechseln Kamera-Apps, die eine bestimmte Bildschirmausrichtung anfordern und nicht skalierbar sind (resizeableActivity="false"
), automatisch in den Eingebetteten Porträtmodus. Dadurch wird die richtige Ausrichtung und das richtige Seitenverhältnis der Kameravorschau sichergestellt. Bei faltbaren Geräten und anderen Geräten mit einer Kamera-Hardware-Abstraktionsschicht (HAL) wird die Kameraausgabe zusätzlich gedreht, um die Ausrichtung des Kamerasensors zu kompensieren. Außerdem wird die Kameraausgabe so zugeschnitten, dass sie dem Seitenverhältnis der Kameravorschau der App entspricht. Das Zuschneiden und die zusätzliche Drehung sorgen für eine korrekte Darstellung der Kameravorschau unabhängig von der Geräteausrichtung und dem Zustand des Geräts (geöffnet oder geschlossen).
UX-Verzögerung bei Benachrichtigungen für Dienste im Vordergrund
Um die Nutzung kurz laufender Dienste im Vordergrund zu optimieren, kann auf Geräten mit Android 12 oder höher die Anzeige von Benachrichtigungen für Dienste im Vordergrund mit einigen Ausnahmen um 10 Sekunden verzögert werden. Durch diese Änderung haben Sie die Möglichkeit, kurzlebige Aufgaben abzuschließen, bevor die zugehörigen Benachrichtigungen angezeigt werden.
Leistung
Bucket für Apps im eingeschränkten Standby-Modus
Mit Android 11 (API-Level 30) wurde der eingeschränkte Bucket als App-Standby-Bucket eingeführt. Ab Android 12 ist dieser Bucket standardmäßig aktiv. Der eingeschränkte Bucket hat die niedrigste Priorität (und die höchsten Einschränkungen) aller Buckets. Die Bucket-Kategorien in absteigender Priorität:
- Aktiv: Die App wird gerade verwendet oder wurde vor Kurzem verwendet.
- Arbeitssatz: Die App wird regelmäßig verwendet.
- Häufig: Die App wird oft, aber nicht jeden Tag verwendet.
- Selten: Die App wird nicht häufig verwendet.
- Eingeschränkt: Die App verbraucht viele Systemressourcen oder weist unerwünschtes Verhalten auf.
Das System berücksichtigt neben den Nutzungsmustern auch das Verhalten Ihrer App, um zu entscheiden, ob Ihre App in den eingeschränkten Bereich verschoben wird.
Die Wahrscheinlichkeit, dass Ihre App in den eingeschränkten Bucket verschoben wird, ist geringer, wenn Sie die Systemressourcen Ihrer App verantwortungsvoller nutzen. Außerdem wird Ihre App in einen weniger restriktiven Bucket verschoben, wenn der Nutzer direkt mit Ihrer App interagiert.
Prüfen, ob Ihre App im eingeschränkten Bereich ist
Wenn Sie prüfen möchten, ob das System Ihre App in den eingeschränkten Bucket verschoben hat, rufen Sie getAppStandbyBucket()
auf.
Wenn der Rückgabewert dieser Methode STANDBY_BUCKET_RESTRICTED
ist, befindet sich Ihre App im eingeschränkten Bucket.
Verhalten von Bucket mit eingeschränktem Zugriff testen
Wenn Sie testen möchten, wie sich Ihre App verhält, wenn das System sie in den eingeschränkten Bucket verschiebt, können Sie sie manuell in diesen Bucket verschieben. Führen Sie dazu den folgenden Befehl in einem Terminalfenster aus:
adb shell am set-standby-bucket PACKAGE_NAME restricted
Sicherheit und Datenschutz
Ungefährer Standort
Auf Geräten mit Android 12 oder höher können Nutzer anfordern, dass Ihre App nur auf ungefähre Standortinformationen zugreifen darf.
Wenn Ihre App die Laufzeitberechtigung ACCESS_FINE_LOCATION
anfordert, sollten Sie auch die Berechtigung ACCESS_COARSE_LOCATION
anfordern, um den Fall zu behandeln, dass der Nutzer Ihrer App den Zugriff auf den ungefähren Standort gewährt. Sie sollten beide Berechtigungen in einer einzigen Laufzeitanfrage angeben.
Das Dialogfeld für die Systemberechtigungen enthält die folgenden Optionen für den Nutzer, wie in Abbildung 1 dargestellt:
- Genau: Bietet Zugriff auf genaue Standortinformationen.
- Ungefähr: Gewährt nur Zugriff auf ungefähre Standortinformationen.
Ein-/Aus-Schaltflächen für Mikrofon und Kamera
Auf unterstützten Geräten mit Android 12 oder höher können Nutzer den Zugriff auf Kamera und Mikrofon für alle Apps auf dem Gerät mit nur einer einzigen Ein-/Aus-Schaltfläche aktivieren und deaktivieren. Nutzer können die Optionen zum Ein- und Ausschalten wie in Abbildung 1 gezeigt über die Schnelleinstellungen oder über den Datenschutzbildschirm in den Systemeinstellungen aufrufen.
Weitere Informationen zu diesen Schaltern und dazu, wie Sie prüfen können, ob Ihre App die Best Practices für die Berechtigungen CAMERA
und RECORD_AUDIO
einhält, finden Sie hier.
Mikrofon- und Kameraanzeigen
Wenn auf Geräten mit Android 12 oder höher eine App auf das Mikrofon oder die Kamera zugreift, wird in der Statusleiste ein Symbol angezeigt.
Weitere Informationen zu diesen Indikatoren und dazu, wie Sie prüfen können, ob Ihre App die Best Practices für die Berechtigungen CAMERA
und RECORD_AUDIO
einhält
Sichtbarkeit von Berechtigungspaketen
Auf Geräten mit Android 12 oder höher erhalten Apps, die auf Android 11 (API-Level 30) oder höher ausgerichtet sind und eine der folgenden Methoden aufrufen, eine gefilterte Ergebnismenge, die auf der Sichtbarkeit des Pakets der App in anderen Apps basiert:
BouncyCastle-Implementierung entfernt
In Android 12 wurden viele BouncyCastle-Implementierungen von kryptografischen Algorithmen entfernt, die zuvor eingestellt wurden, einschließlich aller AES-Algorithmen. Stattdessen verwendet das System die Conscrypt-Implementierungen dieser Algorithmen.
Diese Änderung wirkt sich auf Ihre App aus, wenn eine der folgenden Bedingungen zutrifft:
- Ihre App verwendet Schlüsselgrößen von 512 Bit. Diese Schlüsselgröße wird von Conscrypt nicht unterstützt. Aktualisieren Sie gegebenenfalls die Kryptografielogik Ihrer App, um unterschiedliche Schlüsselgrößen zu verwenden.
Ihre App verwendet ungültige Schlüsselgrößen mit
KeyGenerator
. Die Implementierung vonKeyGenerator
in Conscrypt führt im Vergleich zu BouncyCastle eine zusätzliche Validierung der Schlüsselparameter durch. Mit Conscrypt kann Ihre App beispielsweise keinen 64-Bit-AES-Schlüssel generieren, da AES nur 128-, 192- und 256-Bit-Schlüssel unterstützt.Mit BouncyCastle können Schlüssel mit ungültigen Größen generiert werden, die später jedoch fehlschlagen, wenn sie mit einer
Cipher
verwendet werden. Conscrypt schlägt früher fehl.Sie initialisieren Ihre Galois/Counter Mode (GCM)-Chiffren mit einer anderen Größe als 12 Byte. Die Implementierung von
GcmParameterSpec
in Conscrypt erfordert eine Initialisierung von 12 Byte, wie vom NIST empfohlen.
Benachrichtigungen zum Zugriff auf die Zwischenablage
Unter Android 12 und höher wird der Nutzer über eine Toast-Mitteilung über den Zugriff auf die Zwischenablage informiert, wenn eine App zum ersten Mal getPrimaryClip()
aufruft, um auf Zwischenablagedaten aus einer anderen App zuzugreifen.
Der Text in der Toast-Nachricht hat folgendes Format:
APP pasted from your clipboard.
Informationen zum Text in der Clipbeschreibung
Unter Android 12 und höher kann getPrimaryClipDescription()
die folgenden Details erkennen:
- Stilisierter Text mit
isStyledText()
- Unterschiedliche Textklassifizierungen wie URLs mit
getConfidenceScore()
Apps können keine Systemdialogfelder schließen
Um die Nutzersteuerung bei der Interaktion mit Apps und dem System zu verbessern, wird die Intent-Aktion ACTION_CLOSE_SYSTEM_DIALOGS
ab Android 12 eingestellt. Außer in einigen Sonderfällen führt das System, wenn Ihre App versucht, einen Intent aufzurufen, der diese Aktion enthält, je nach Ziel-SDK-Version Ihrer App einen der folgenden Schritte aus:
- Wenn Ihre App auf Android 12 oder höher ausgerichtet ist, tritt eine
SecurityException
auf. Wenn Ihre App auf Android 11 (API-Level 30) oder niedriger ausgerichtet ist, wird die Intent nicht ausgeführt und die folgende Meldung wird in Logcat angezeigt:
E ActivityTaskManager Permission Denial: \ android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \ com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \ dropping broadcast.
Ausnahmen
In den folgenden Fällen kann eine App Systemdialoge unter Android 12 oder höher weiterhin schließen:
- In Ihrer App wird ein Instrumentierungstest ausgeführt.
Ihre App ist auf Android 11 oder niedriger ausgerichtet und zeigt ein Fenster an, das über dem Benachrichtigungs-Schieberegler liegt.
Ihre App ist auf Android 11 oder niedriger ausgerichtet. Außerdem hat der Nutzer mit einer Benachrichtigung interagiert, möglicherweise über die Aktionsschaltflächen der Benachrichtigung, und Ihre App verarbeitet einen Dienst oder Broadcast-Empfänger als Reaktion auf diese Nutzeraktion.
Ihre App ist auf Android 11 oder niedriger ausgerichtet und hat einen aktiven Bedienungshilfendienst. Wenn Ihre App auf Android 12 ausgerichtet ist und die Benachrichtigungsleiste geschlossen werden soll, verwenden Sie stattdessen die Aktion für die Barrierefreiheit
GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADE
.
Nicht vertrauenswürdige Touch-Ereignisse werden blockiert
Um die Systemsicherheit und eine gute Nutzererfahrung zu gewährleisten, verhindert Android 12, dass Apps Touch-Ereignisse verbrauchen, wenn ein Overlay die App auf unsichere Weise verdeckt. Mit anderen Worten: Das System blockiert Touch-Gesten, die bestimmte Fenster passieren, mit einigen Ausnahmen.
Betroffene Apps
Diese Änderung betrifft Apps, die Berührungen durch ihre Fenster hindurchlassen, z. B. durch Verwendung des Flags FLAG_NOT_TOUCHABLE
. Beispiele:
- Overlays, für die die Berechtigung
SYSTEM_ALERT_WINDOW
erforderlich ist, z. B. Fenster, dieTYPE_APPLICATION_OVERLAY
verwenden, und das FlagFLAG_NOT_TOUCHABLE
verwenden. - Aktivitätsfenster, für die das Flag
FLAG_NOT_TOUCHABLE
verwendet wird
Ausnahmen
In den folgenden Fällen sind „Durchlauf“-Berührungen zulässig:
- Interaktionen innerhalb Ihrer App: Das Overlay wird in Ihrer App angezeigt und nur dann, wenn der Nutzer mit Ihrer App interagiert.
Vertrauenswürdige Fenster Zu diesen Fenstern gehören unter anderem:
Unsichtbare Fenster Die Stammansicht des Fensters ist
GONE
oderINVISIBLE
.Vollständig transparente Fenster Die Property
alpha
hat für das Fenster den Wert „0,0“.Zur Anzeige von Systembenachrichtigungen müssen ausreichend durchsichtige Fenster verwendet werden. Das System betrachtet eine Reihe von Systemwarnfenstern als ausreichend durchsichtig, wenn die kombinierte Deckkraft kleiner oder gleich der maximalen Deckkraft des Systems für Berührungen ist. In Android 12 beträgt diese maximale Deckkraft standardmäßig 0, 8.
Erkennen, wenn eine nicht vertrauenswürdige Berührung blockiert wird
Wenn eine Touch-Aktion vom System blockiert wird, wird in Logcat die folgende Meldung protokolliert:
Untrusted touch due to occlusion by PACKAGE_NAME
Änderung testen
Auf Geräten mit Android 12 oder höher werden nicht vertrauenswürdige Touch-Gesten standardmäßig blockiert. Wenn Sie nicht vertrauenswürdige Touch-Gesten zulassen möchten, führen Sie in einem Terminalfenster den folgenden ADB-Befehl aus:
# A specific app adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app # All apps # If you'd still like to see a Logcat message warning when a touch would be # blocked, use 1 instead of 0. adb shell settings put global block_untrusted_touches 0
Wenn Sie das Verhalten auf die Standardeinstellung zurücksetzen möchten (nicht vertrauenswürdige Berührungen werden blockiert), führen Sie den folgenden Befehl aus:
# A specific app adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app # All apps adb shell settings put global block_untrusted_touches 2
Aktivitätslebenszyklus
Aktivitäten des Root-Launchers werden nicht mehr durch Drücken der Rücktaste beendet
In Android 12 wird die Standardbehandlung des Zurück-Tastendrucks des Systems bei Launcher-Aktivitäten geändert, die der Ursprung ihrer Aufgaben sind. In früheren Versionen wurden diese Aktivitäten durch Drücken der Schaltfläche „Zurück“ beendet. Unter Android 12 verschiebt das System die Aktivität und ihre Aufgabe jetzt in den Hintergrund, anstatt sie zu beenden. Das neue Verhalten entspricht dem aktuellen Verhalten, wenn Sie eine App über die Startbildschirmtaste oder eine Geste verlassen.
Für die meisten Apps bedeutet diese Änderung, dass Nutzer, die die Schaltfläche „Zurück“ verwenden, um die App zu verlassen, die App schneller aus einem warmen Zustand fortsetzen können, anstatt sie aus einem kalten Zustand neu starten zu müssen.
Wir empfehlen Ihnen, Ihre Apps mit dieser Änderung zu testen. Wenn Ihre App derzeit onBackPressed()
überschreibt, um die Zurücknavigation zu verarbeiten und den Activity
zu beenden, aktualisieren Sie Ihre Implementierung, damit super.onBackPressed()
aufgerufen wird, anstatt den Vorgang zu beenden. Wenn Sie super.onBackPressed()
aufrufen, werden die Aktivität und die zugehörige Aufgabe bei Bedarf in den Hintergrund verschoben. So können Nutzer zwischen Apps konsistenter navigieren.
Beachten Sie außerdem, dass wir im Allgemeinen empfehlen, die AndroidX Activity APIs für die Bereitstellung benutzerdefinierter Rücknavigation zu verwenden, anstatt onBackPressed()
zu überschreiben. Die AndroidX Activity APIs übergeben das System automatisch an das entsprechende Systemverhalten, wenn keine Komponenten die rückwärts gerichtete Tasteneingabe des Systems abfangen.
Grafiken und Bilder
Verbessertes Wechseln der Aktualisierungsrate
In Android 12 können Änderungen der Bildwiederholrate über setFrameRate()
erfolgen, unabhängig davon, ob das Display einen nahtlosen Übergang zur neuen Bildwiederholrate unterstützt. Ein nahtloser Übergang ist ein Übergang ohne visuelle Unterbrechungen, z. B. ein schwarzer Bildschirm für ein oder zwei Sekunden. Wenn das Display zuvor keinen nahtlosen Übergang unterstützte, wurde nach dem Aufruf von setFrameRate()
in der Regel weiterhin dieselbe Bildwiederholrate verwendet. Sie können vorab feststellen, ob die Umstellung auf die neue Aktualisierung wahrscheinlich reibungslos verläuft, indem Sie getAlternativeRefreshRates()
aufrufen.
Normalerweise wird der Rückruf onDisplayChanged()
nach Abschluss der Umstellung der Bildwiederholrate aufgerufen. Bei einigen extern angeschlossenen Displays wird er jedoch während einer nicht nahtlosen Umstellung aufgerufen.
Hier ist ein Beispiel dafür:
Kotlin
// Determine whether the transition will be seamless. // Non-seamless transitions may cause a 1-2 second black screen. val refreshRates = this.display?.mode?.alternativeRefreshRates val willBeSeamless = Arrays.asList<FloatArray>(refreshRates).contains(newRefreshRate) // Set the frame rate even if the transition will not be seamless. surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
Java
// Determine whether the transition will be seamless. // Non-seamless transitions may cause a 1-2 second black screen. Display display = context.getDisplay(); // API 30+ Display.Mode mode = display.getMode(); float[] refreshRates = mode.getAlternativeRefreshRates(); boolean willBeSeamless = Arrays.asList(refreshRates).contains(newRefreshRate); // Set the frame rate even if the transition will not be seamless. surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS);
Konnektivität
Passpoint-Aktualisierungen
In Android 12 werden die folgenden APIs hinzugefügt:
isPasspointTermsAndConditionsSupported()
: Nutzungsbedingungen ist eine Passpoint-Funktion, mit der bei Netzwerkbereitstellungen unsichere Captive Portals, die offene Netzwerke verwenden, durch ein sicheres Passpoint-Netzwerk ersetzt werden können. Wenn Nutzungsbedingungen akzeptiert werden müssen, wird dem Nutzer eine Benachrichtigung angezeigt. Apps, die Passpoint-Netzwerke vorschlagen, die durch Nutzungsbedingungen eingeschränkt sind, müssen zuerst diese API aufrufen, um sicherzustellen, dass das Gerät die Funktion unterstützt. Wenn das Gerät die Funktion nicht unterstützt, kann es keine Verbindung zu diesem Netzwerk herstellen. Es muss dann ein alternatives oder älteres Netzwerk vorgeschlagen werden.isDecoratedIdentitySupported()
: Beim Authentifizieren in Netzwerken mit Präfixdekoration können Netzwerkbetreiber mit dem dekorierten Identitätspräfix den Network Access Identifier (NAI) aktualisieren, um ein explizites Routing über mehrere Proxys innerhalb eines AAA-Netzwerks durchzuführen. Weitere Informationen finden Sie unter RFC 7542.In Android 12 wird diese Funktion implementiert, um der WBA-Spezifikation für PPS-MO-Erweiterungen zu entsprechen. Apps, die Passpoint-Netzwerke vorschlagen, für die eine dekorierte Identität erforderlich ist, müssen zuerst diese API aufrufen, um sicherzustellen, dass das Gerät die Funktion unterstützt. Wenn das Gerät die Funktion nicht unterstützt, wird die Identität nicht dekoriert und die Authentifizierung im Netzwerk schlägt möglicherweise fehl.
Um einen Passpoint-Vorschlag zu erstellen, müssen Apps die Klassen PasspointConfiguration
, Credential
und HomeSp
verwenden. Diese Klassen beschreiben das Passpoint-Profil, das in der Passpoint-Spezifikation der Wi‑Fi Alliance definiert ist.
Weitere Informationen finden Sie unter Wi-Fi Suggestion API für Internetverbindungen.
Aktualisierte Einschränkungen für Nicht-SDK-Schnittstellen
Android 12 enthält aktualisierte Listen der eingeschränkten nicht SDK-basierten Schnittstellen, die auf der Zusammenarbeit mit Android-Entwicklern und den neuesten internen Tests basieren. Wir sorgen nach Möglichkeit dafür, dass öffentliche Alternativen verfügbar sind, bevor wir Nicht-SDK-Schnittstellen einschränken.
Wenn Ihre App nicht auf Android 12 ausgerichtet ist, wirken sich einige dieser Änderungen möglicherweise nicht sofort auf Sie aus. Derzeit können Sie jedoch einige Nicht-SDK-Schnittstellen verwenden (je nach Ziel-API-Level Ihrer App). Die Verwendung von Nicht-SDK-Methoden oder ‑Feldern birgt jedoch immer ein hohes Risiko, dass Ihre App nicht mehr funktioniert.
Wenn Sie nicht sicher sind, ob Ihre App Nicht-SDK-Schnittstellen verwendet, können Sie Ihre App testen, um das herauszufinden. Wenn Ihre App Nicht-SDK-Schnittstellen verwendet, sollten Sie mit der Planung einer Migration zu SDK-Alternativen beginnen. Uns ist jedoch bewusst, dass es für einige Apps gültige Anwendungsfälle für die Verwendung von Nicht-SDK-Schnittstellen gibt. Wenn Sie keine Alternative zur Verwendung einer Nicht-SDK-Benutzeroberfläche für eine Funktion in Ihrer App finden, sollten Sie eine neue öffentliche API anfordern.
Weitere Informationen zu den Änderungen in dieser Android-Version finden Sie unter Änderungen an den Einschränkungen für Nicht-SDK-Schnittstellen in Android 12. Weitere Informationen zu Nicht-SDK-Schnittstellen finden Sie unter Einschränkungen für Nicht-SDK-Schnittstellen.