API-Level: 17
Android 4.2 (JELLY_BEAN_MR1
)
ist ein Update für die Jelly Bean-Version, das neue Funktionen für Nutzer und die App bietet.
zu entwickeln. In diesem Dokument erhalten Sie eine Einführung in die wichtigsten
nützliche neue APIs für Entwickler.
Als App-Entwickler sollten Sie das Android 4.2-System-Image und die SDK-Plattform von SDK-Manager so schnell wie möglich aufrufen. Wenn Sie kein Gerät mit Android 4.2 haben, auf dem Sie Ihre App testen können, verwenden Sie das Android 4.2-System. um Ihre App im Android Emulator zu testen. Entwickeln Sie dann Ihre Apps für die Android 4.2-Plattform, um die neuesten APIs zu nutzen.
Um deine App für Geräte mit Android 4.2 besser zu optimieren,
sollten Sie Ihr targetSdkVersion
auf
"17"
, installieren Sie es auf einem System-Image von Android 4.2,
testen und ein Update mit dieser Änderung veröffentlichen.
Ich
APIs in Android 4.2 verwenden und gleichzeitig ältere Versionen unterstützen, indem
hinzufügen, die vor der Ausführung auf die API-Ebene des Systems prüfen.
APIs werden von deinem minSdkVersion
nicht unterstützt.
Weitere Informationen über
Informationen zur Aufrechterhaltung der Abwärtskompatibilität finden Sie unter Abwärtskompatibilität erstellen
Benutzeroberflächen.
Weitere Informationen zur Funktionsweise von API-Ebenen finden Sie unter Was ist eine API? Stufe?
Wichtige Verhaltensänderungen
Wenn Sie bereits eine App für Android veröffentlicht haben, beachten Sie bitte Folgendes: Änderungen, die sich auf das Verhalten Ihrer App auswirken können:
- Contentanbieter werden nicht mehr standardmäßig exportiert. Das heißt, der Standardwert
für das Attribut
android:exported
ist jetzt“false"
. Wenn es wichtig ist, dass andere Apps auf Ihren Contentanbieter zugreifen können, müssen Sie jetzt explizitandroid:exported="true"
festlegen.Diese Änderung wird nur wirksam, wenn du
android:targetSdkVersion
oderandroid:minSdkVersion
auf 17 oder höher setzt. Andernfalls ist der Standardwert immer noch“true"
. auch unter Android 4.2 und höher. - Im Vergleich zu früheren Android-Versionen sind die Ergebnisse zum Nutzerstandort eventuell weniger genau
Ihre App die Berechtigung
ACCESS_COARSE_LOCATION
anfordert, aber fordert die BerechtigungACCESS_FINE_LOCATION
nicht an.Um die Datenschutzerwartungen der Nutzer zu erfüllen, wenn Ihre App Berechtigungen für ungefähren Standort (und keinen genauen Standort), erstellt das System keine Standortschätzung genauer als ein Häuserblock.
- Einige von
Settings.System
definierte Geräteeinstellungen sind jetzt schreibgeschützt sein. Wenn deine App versucht, Änderungen an den inSettings.System
definierten Einstellungen zu schreiben, die inSettings.Global
verschoben wurden, unter Android 4.2 und höher schlägt der Schreibvorgang im Hintergrund fehl.Auch wenn Ihr Wert für
android:targetSdkVersion
undandroid:minSdkVersion
niedriger als 17 ist, kann Ihre App die Einstellungen nicht ändern, die aufSettings.Global
verschoben, wenn das Gerät mit Android 4.2 und höher ausgeführt wird. - Wenn deine App
WebView
verwendet, fügt Android 4.2 eine zusätzliche Sicherheit, damit Sie JavaScript sicherer an Ihre Android-Code. Wenn Sie IhrtargetSdkVersion
17 oder höher verwenden, müssen Sie nun die Anmerkung@JavascriptInterface
jeder Methode hinzufügen, die für Ihren JavaScript-Code verfügbar sein sollen. Die Methode muss ebenfalls öffentlich sein. Wenn Sie die Anmerkung, diese Methode kann von einer Webseite inWebView
nicht aufgerufen werden. wenn sie unter Android 4.2 oder höher laufen. Wenn Sie dietargetSdkVersion
16 oder niedriger ist, ist die Anmerkung nicht erforderlich, wir empfehlen jedoch, die Zielversion zu aktualisieren. und fügen Sie die Anmerkung hinzu, um die Sicherheit zu erhöhen.Weitere Informationen zum Binden JavaScript-Code in Android-Code umwandeln.
Daydream
Daydream ist ein neuer interaktiver Bildschirmschonermodus für Android-Geräte. Die Aktivierung erfolgt automatisch wenn das Gerät in ein Dock eingesetzt wird oder inaktiv bleibt, während es an ein Ladegerät anzuschließen (anstatt das Display auszuschalten). Daydream zeigt einen Traum nach dem anderen an, ein rein visuelles, passives Display, das sich bei Berührung schließt oder interaktiv und responsiv sein kann zur gesamten Suite von Eingabeereignissen. Ihre Träume sind Teil Ihrer App und Sie haben vollen Zugriff auf das UI-Toolkit von Android, einschließlich Ansichten, Layouts und Animationen, damit sie flexibler und als Live-Hintergründe oder App-Widgets.
Du kannst einen Traum für Daydream erstellen, indem du eine abgeleitete Klasse von DreamService
implementierst. Die DreamService
APIs sind
Sie ähneln denen von Activity
. So legen Sie die Benutzeroberfläche für Ihre
können Sie jederzeit eine Layout-Ressourcen-ID oder View
an setContentView()
übergeben.
eines Fensters, z. B. aus dem onAttachedToWindow()
Callback des Nutzers an.
Die Klasse DreamService
bietet einen weiteren wichtigen Lebenszyklus-Callback
zusätzlich zu den Service
-Basis-APIs wie onDreamingStarted()
, onDreamingStopped()
und onDetachedFromWindow()
an.
Sie können keine DreamService
aus Ihrem
wird sie automatisch vom System gestartet.
Wenn Ihr Traum interaktiv ist, können Sie eine Aktivität aus dem Traum starten, um die Nutzenden
die gesamte Benutzeroberfläche deiner App aus, um mehr Details oder Steuerungsmöglichkeiten zu sehen. Sie können finish()
verwenden, um den Traum zu beenden, damit der Nutzer die
neue Aktivität.
Deklariere DreamService
mit einem <service>
-Element, um deinen Daydream für das System verfügbar zu machen
in Ihrer Manifest-Datei. Anschließend müssen Sie einen Intent-Filter mit der Aktion "android.service.dreams.DreamService"
hinzufügen. Beispiel:
<service android:name=".MyDream" android:exported="true" android:icon="@drawable/dream_icon" android:label="@string/dream_label" > <intent-filter> <action android:name="android.service.dreams.DreamService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
Es gibt noch einige andere nützliche Methoden in DreamService
beachten Sie Folgendes:
setInteractive(boolean)
legt fest, ob der Traum Eingabeereignisse empfängt oder sofort nach einer Benutzereingabe beendet wird. Wenn der Traum interaktiv ist, kann der Nutzer die Schaltfläche Zurück oder Startseite zum Verlassen des Traums verwenden. Alternativ können Siefinish()
, um den Traum zu beenden.- Wenn Sie ein vollständig immersives Display wünschen, können Sie
setFullscreen()
aufrufen, um die Statusleiste auszublenden. - Vor dem Start von Daydream wird das Display gedimmt, um dem Nutzer zu signalisieren, dass das Zeitlimit bei Inaktivität abgelaufen ist
naht. Wenn du
setScreenBright(true)
aufrufst, kannst du stattdessen die Helligkeit des Displays auf die übliche Helligkeit einstellen.
Weitere Informationen finden Sie in der DreamService
-Dokumentation.
Sekundäre Displays
Android ermöglicht es deiner App jetzt, einzigartige Inhalte auf weiteren, verbundenen Bildschirmen anzuzeigen
per Kabel oder WLAN mit dem Gerät des Nutzers verbunden.
Um einzigartige Inhalte für ein sekundäres Display zu erstellen, erweitere die Presentation
und implementiere den onCreate()
-Callback. Innerhalb von
onCreate()
, gib deine UI für den sekundären Bildschirm an
indem du setContentView()
anrufst.
Als Erweiterung der Klasse Dialog
stellt die Klasse Presentation
die Region bereit, in der Ihre App eine eindeutige UI auf der
sekundäre Displayanzeige.
So werden sekundäre Displays erkannt, auf denen Presentation
angezeigt werden kann:
Verwenden Sie entweder DisplayManager
oder MediaRouter
APIs Mit den DisplayManager
-APIs können Sie
mehrere Bildschirme gleichzeitig angeschlossen sein können, sollten Sie für gewöhnlich schnell über MediaRouter
auf das Standarddisplay des Systems zugreifen.
Präsentationen.
Um die Standardanzeige für Ihre Präsentation zu erhalten, rufen Sie MediaRouter.getSelectedRoute()
auf und übergeben Sie es
ROUTE_TYPE_LIVE_VIDEO
. Dadurch wird ein MediaRouter.RouteInfo
-Objekt zurückgegeben, das die aktuell ausgewählte Route des Systems beschreibt.
für Videopräsentationen. Wenn MediaRouter.RouteInfo
nicht null ist, rufen Sie
getPresentationDisplay()
, um die Display
für den verbundenen Bildschirm abzurufen.
Anschließend können Sie Ihre Präsentation einblenden, indem Sie das Display
-Objekt übergeben.
an einen Konstruktor für Ihre Presentation
-Klasse. Ihre Präsentation wird jetzt
auf dem zweiten Display erscheinen.
Damit während der Laufzeit erkannt wird, wann eine neue Anzeige verbunden wurde, erstellen Sie eine Instanz von MediaRouter.SimpleCallback
, in der Sie die Callback-Methode onRoutePresentationDisplayChanged()
implementieren, die das System aufruft, wenn ein neuer
Präsentationsdisplay ist verbunden. Registrieren Sie dann die MediaRouter.SimpleCallback
, indem Sie sie zusammen mit dem Routentyp ROUTE_TYPE_LIVE_VIDEO
an MediaRouter.addCallback()
übergeben. Wenn Sie einen Anruf bei
onRoutePresentationDisplayChanged()
, rufe einfach wie oben beschrieben MediaRouter.getSelectedRoute()
auf.
Zur weiteren Optimierung der UI in Presentation
für
sekundäre Bildschirme gibt, können Sie
Design ändern, indem Sie das Attribut android:presentationTheme
in der <style>
angeben,
auf Ihre App oder Aktivität angewendet.
Denken Sie daran, dass mit dem Gerät der Nutzenden verbundene Bildschirme oft eine größere Bildschirmgröße haben und
wahrscheinlich eine andere Bildschirmdichte. Da die Bildschirmmerkmale unterschiedlich sein können, sollten Sie
stellen Ressourcen bereit, die speziell für solche größeren Bildschirme optimiert sind. Bei Bedarf
Wenn Sie zusätzliche Ressourcen von Ihrem Presentation
anfordern möchten, rufen Sie getContext()
.getResources()
auf, um das Resources
-Objekt für die Anzeige abzurufen. Damit erhalten Sie
Ressourcen aus Ihrer App, die sich am besten für das
die Bildschirmgröße und -dichte des sekundären Bildschirms.
Weitere Informationen und einige Codebeispiele finden Sie in der Presentation
.
Klassendokumentation.
Sperrbildschirm-Widgets
Unter Android können Nutzer jetzt App-Widgets zum Sperrbildschirm hinzufügen. So machen Sie Ihr App-Widget für die Verwendung auf dem
Sperrbildschirm hinzufügen, fügen Sie Ihrer XML-Datei das Attribut android:widgetCategory
hinzu, das die AppWidgetProviderInfo
angibt. Dieses Attribut unterstützt zwei Werte: home_screen
und keyguard
. Standardmäßig ist das Attribut auf home_screen
gesetzt, sodass Nutzer Ihre
App-Widget zum Startbildschirm hinzu. Soll das App-Widget auch auf dem Schloss verfügbar sein
fügen Sie den Wert keyguard
hinzu:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" ... android:widgetCategory="keyguard|home_screen"> </appwidget-provider>
Sie sollten auch ein anfängliches Layout für Ihr App-Widget angeben, wenn Sie
Das Attribut android:initialKeyguardLayout
Das funktioniert genauso wie das android:initialLayout
, da sie Folgendes bereitstellt:
ein Layout, das sofort angezeigt werden kann, bis Ihr App-Widget initialisiert ist und in der Lage ist,
Layout.
Weitere Informationen zum Erstellen von App-Widgets für den Sperrbildschirm die Größe des App-Widgets auf dem Sperrbildschirm anpassen. Weitere Informationen
Mehrere Nutzer
Android erlaubt nun mehrere Nutzerbereiche auf gemeinsam nutzbaren Geräten wie Tablets. Jeder Nutzer einer Gerät verfügt über eigene Konten, Apps, Systemeinstellungen, Dateien und andere nutzerbezogenen Daten.
Als App-Entwickler müssen Sie nichts weiter tun, damit Ihre App funktioniert. mit mehreren Nutzern auf einem Gerät ordnungsgemäß funktioniert. Unabhängig davon, wie viele Nutzer auf einem werden die Daten, die Ihre App für einen bestimmten Nutzer speichert, von den Daten getrennt, die Ihre App speichert. für andere Nutzende. Das System verfolgt, welche Nutzerdaten zum User-Prozess gehören, in dem Ihre App ausgeführt wird und nur auf die Daten dieses Nutzers zugreifen kann. auf die Daten anderer Nutzer.
Daten in einer Umgebung mit mehreren Nutzern speichern
Immer wenn Ihre App Nutzereinstellungen speichert, eine Datenbank erstellt oder eine Datei im internen oder externen Speicherplatz haben, sind diese Daten nur verfügbar, wenn sie als dieser Nutzer ausgeführt werden.
Um sicherzustellen, dass sich Ihre App in einer Umgebung mit mehreren Nutzern ordnungsgemäß verhält, sollten Sie nicht auf die internes App-Verzeichnis oder externer Speicherort über hartcodierte Pfade und verwenden stattdessen immer die entsprechenden APIs:
- Verwende
getFilesDir()
,getCacheDir()
oderopenFileOutput()
, um auf den internen Speicher zuzugreifen. - Verwenden Sie
getExternalFilesDir()
odergetExternalStoragePublicDirectory()
, um auf den externen Speicher zuzugreifen.
Unabhängig davon, welche dieser APIs Sie zum Speichern von Daten für einen bestimmten Nutzer verwenden, werden die Daten nicht wenn sie unter einem anderen Nutzer ausgeführt werden. Aus der Sicht Ihrer App führt jeder Nutzer auf einem völlig anderen Gerät.
Nutzer in einer Umgebung mit mehreren Nutzern identifizieren
Wenn mit Ihrer App einzelne Nutzer identifiziert werden sollen, z. B. um Analysen zu erstellen oder ein anderes Konto zu erstellen
sollten Sie die empfohlenen Praktiken zur Identifizierung
einzelnen Installationen. Durch Erstellen einer neuen UUID
beim Start deiner App für die
erhalten Sie ganz sicher eine eindeutige ID für das Tracking jedes Nutzers, unabhängig davon, wie viele
Nutzer installieren Ihre App auf einem einzigen Gerät. Alternativ können Sie ein lokales Token speichern, das von
Ihren Server oder verwenden Sie die von Google Cloud Messaging bereitgestellte Registrierungs-ID.
Wenn Ihre App eine der Hardwaregeräte-IDs (z. B. WLAN-MAC) anfordert,
Adresse oder die SERIAL
-Nummer), geben sie für jede Telefonnummer den gleichen Wert an
da diese mit der Hardware und nicht mit dem Nutzer verknüpft sind. Ganz zu schweigen von der
Probleme, die durch diese Kennzeichnungen entstehen, wie im Abschnitt Identifizierung
Blogpost zu App-Installationen.
Neue globale Einstellungen
Die Systemeinstellungen wurden aktualisiert und unterstützen nun mehrere Nutzer mit Settings.Global
. Diese Einstellungssammlung ähnelt den Einstellungen für Settings.Secure
, weil sie schreibgeschützt sind. Sie gelten aber global für alle
alle Nutzerbereiche auf dem Gerät.
Mehrere vorhandene Einstellungen wurden von Settings.System
oder Settings.Secure
hierher verschoben. Wenn Ihre App
Derzeit werden Änderungen an den zuvor in Settings.System
definierten Einstellungen vorgenommen.
(z. B. AIRPLANE_MODE_ON
) angezeigt wird, ist zu erwarten, dass
funktionieren auf Geräten mit Android 4.2 oder höher nicht mehr, wenn diese Einstellungen
in Settings.Global
verschoben. Sie können weiterhin die Einstellungen lesen, die sich in
Settings.Global
, aber die Einstellungen gelten nicht mehr als sicher
wenn Apps geändert werden, scheitert der Versuch ohne Meldung und das System schreibt eine Warnung
das Systemprotokoll, wenn Sie Ihre App unter Android 4.2 oder höher ausführen.
Unterstützung für RTL-Layout
Android bietet jetzt mehrere APIs, mit denen Sie Benutzeroberflächen erstellen können, Transformieren der Layoutausrichtung zur Unterstützung von Sprachen, die von rechts nach links gelesene UIs und Lesefunktionen verwenden Arabisch und Hebräisch.
Um RTL-Layouts in deiner App zu unterstützen, setze das Attribut android:supportsRtl
in deiner Manifestdatei auf das Element <application>
und lege ihn auf “true"
fest. Anschließend aktiviert das System verschiedene RTL-APIs,
Ihre App mit RTL-Layouts anzeigen. In der Aktionsleiste werden beispielsweise das Symbol und der Titel
auf der rechten Seite und Aktionsschaltflächen auf der linken Seite sowie in allen Layouts, die Sie mit den
Die vom Framework bereitgestellten View
-Klassen werden ebenfalls umgekehrt.
Wenn Sie das Erscheinungsbild Ihrer App bei einer Anzeige mit RTL-Layout weiter optimieren möchten, gibt es zwei grundlegende Optimierungsebenen:
- Links- und rechtsorientierte Layouteigenschaften in start- und endorientiertes Layout umwandeln
Eigenschaften.
Verwenden Sie beispielsweise
android:layout_marginStart
. anstelle vonandroid:layout_marginLeft
undandroid:layout_marginEnd
anstelle vonandroid:layout_marginRight
.Die Klasse
RelativeLayout
stellt auch das entsprechende Layout bereit. Attribute zum Ersetzen der linken/rechten Position, wie z. B.android:layout_alignParentStart
bisandroid:layout_alignParentLeft
undandroid:layout_toStartOf
ersetzenandroid:layout_toLeftOf
- Für eine vollständige Optimierung von RTL-Layouts können Sie auch komplett separate
Layoutdateien mit dem Ressourcenqualifizierer
ldrtl
(ldrtl
steht für Layout-direction-right-to-left}). Speichern Sie Ihre Standardlayoutdateien beispielsweiseres/layout/
und deine RTL-optimierten Layouts inres/layout-ldrtl/
.Der Qualifier
ldrtl
eignet sich hervorragend für Drawable-Ressourcen, Grafiken, die in der Leserichtung ausgerichtet sind.
Verschiedene weitere APIs stehen im Framework zur Verfügung, um RTL-Layouts zu unterstützen, z. B.
View
, damit Sie die richtigen Verhaltensweisen für benutzerdefinierte
und in Configuration
, um die aktuelle Layoutrichtung abzufragen.
Hinweis: Wenn Sie SQlite verwenden und Tabellen- oder Spaltennamen vorhanden sind, die
„nur Zahl“, sein
Achtung: Die Verwendung von String.format(String, Object...)
kann zu Fehlern führen, da die Zahlen
in ihre arabischen Entsprechungen umgewandelt, wenn auf Ihrem Gerät die arabische Sprache eingestellt wurde.
Sie müssen String.format(Locale,String,Object...)
verwenden, damit die Zahlen korrekt sind
als ASCII beibehalten. Auch String.format("%d", int)
verwenden
String.valueOf(int)
für
und Zahlen formatieren.
Verschachtelte Fragmente
Sie können jetzt Fragmente in Fragmente einbetten. Dies ist in verschiedenen Situationen nützlich,
Sie dynamische und wiederverwendbare UI-Komponenten in eine UI-Komponente einfügen möchten,
dynamisch und wiederverwendbar. Wenn Sie z. B. ViewPager
verwenden, um
Fragmente erstellen, die nach links und rechts wischen und einen Großteil des Bildschirms einnehmen, können Sie
Fragmente jetzt in jede Fragmentseite.
Um ein Fragment zu verschachteln, rufen Sie einfach getChildFragmentManager()
auf
Die Fragment
, in die Sie ein Fragment einfügen möchten. Dadurch wird eine FragmentManager
zurückgegeben, die Sie wie gewohnt von der übergeordneten Aktivität verwenden können.
zum Erstellen fragmentierter Transaktionen. Hier ist zum Beispiel Code, der ein Fragment
einer vorhandenen Fragment
-Klasse:
Kotlin
val videoFragment = VideoPlayerFragment() childFragmentManager.beginTransaction().apply { add(R.id.video_fragment, videoFragment) commit() }
Java
Fragment videoFragment = new VideoPlayerFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.video_fragment, videoFragment).commit();
Innerhalb eines verschachtelten Fragments können Sie einen Verweis auf das übergeordnete Fragment abrufen, indem Sie
getParentFragment()
Die Android Support Library unterstützt jetzt auch verschachtelte Fragmente. Du kannst also verschachtelte fragmentieren Sie Designs unter Android 1.6 und höher.
Hinweis:Sie können ein Layout nicht zu einem Fragment aufblähen, wenn dieses Layout
enthält <fragment>
. Verschachtelte Fragmente werden nur unterstützt, wenn sie einem
dynamisch fragmentiert.
RenderScript
Die Renderscript-Berechnungsfunktionen wurden um folgende Funktionen erweitert:
- Intrinsische Scripts
Sie können die integrierten Skript-Intrinsiken von Renderscript nutzen, gängige Abläufe für Sie, wie zum Beispiel:
Blends
Blur
Color matrix
3x3 convolve
5x5 convolve
Per-channel lookup table
Converting an Android YUV buffer to RGB
Um ein intrinsisches Skript zu verwenden, rufen Sie die statische
create()
-Methode jedes einzelnen um eine Instanz des Skripts zu erstellen. Anschließend rufen Sie die verfügbareset()
auf. jedes intrinsische Skript, um die notwendigen Eingaben und Optionen festzulegen. Rufen Sie abschließendforEach()
auf. zum Ausführen des Skripts.- Skriptgruppen
-
Mit
ScriptGroup
s kannst du verwandte Renderscripts miteinander verketten. und führen sie mit einem Aufruf aus.ScriptGroup.Builder
verwenden, um der Gruppe alle Skripts hinzuzufügen indem duaddKernel()
anrufst. Sobald Sie alle Skripts hinzufügen, Verbindungen zwischen den indem duaddConnection()
aufrufst. Wenn Sie alle Verbindungen hinzugefügt haben, rufen Siecreate()
auf um die Skriptgruppe zu erstellen. Geben Sie vor dem Ausführen der Skriptgruppe die Eingabe anAllocation
und erstes Skript für die Ausführung mit demsetInput(Script.KernelID, Allocation)
-Methode und geben Sie die Ausgabe anAllocation
, in den das Ergebnis geschrieben wird, und das endgültige Skript in mitsetOutput()
durchführen. Rufen Sie schließlichexecute()
, um die Skriptgruppe auszuführen. - Filterscript
-
Filterscript definiert Einschränkungen für die vorhandenen Renderscript-APIs, die die Ausführung des resultierenden Codes ermöglichen. auf einer größeren Vielfalt von Prozessoren (CPUs, GPUs und DSPs) ausführen. Zum Erstellen von Filterscript-Dateien erstellen Sie
.fs
. anstelle von.rs
-Dateien und geben Sie#pragma rs_fp_relaxed
an, der Renderscript-Laufzeit mitteilen, dass Ihre Skripts keine strikte Gleitkommagenauigkeit gemäß IEEE 754-2008 benötigen. Diese Genauigkeit ermöglicht eine Leerung auf null für Denorme und das Runden in Richtung Null. Außerdem kann Ihr Filterscript Skripte dürfen keine integrierten 32-Bit-Typen verwenden und müssen mithilfe der Methode__attribute__((kernel))
-Attribut, da Filterscript keine Cursor unterstützt, die die Standardsignatur der Funktionroot()
.
Hinweis:Obwohl Filterscript in der Plattform unterstützt wird, Unterstützung wird in SDK Tools Version 21.0.1 verfügbar sein.
Eine detaillierte Ansicht aller API-Änderungen in Android 4.2 finden Sie in der Bericht zu API-Unterschieden