API-Level: 18
Android 4.3 (JELLY_BEAN_MR2
)
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
neuen APIs.
Als App-Entwickler sollten Sie das System-Image von Android 4.3 herunterladen. und SDK-Plattform aus dem SDK Manager als so schnell wie möglich. Wenn du kein Gerät mit Android 4.3 hast, auf dem du App testen, Android 4.3-System verwenden um Ihre App im Android Emulator zu testen. Entwickeln Sie dann Ihre Apps für die Android 4.3-Plattform, um die die neuesten APIs.
Ziel-API-Level aktualisieren
Zur besseren Optimierung deiner App für Geräte mit Android 4.3
sollten Sie Ihr targetSdkVersion
auf
"18"
, installieren Sie es auf einem System-Image von Android 4.3,
testen und ein Update mit dieser Änderung veröffentlichen.
Sie können APIs in Android 4.3 verwenden und gleichzeitig ältere Versionen unterstützen, indem Sie
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 zur Aufrechterhaltung der Abwärtskompatibilität finden Sie unter Unterstützung verschiedener
Plattformversionen.
In der Android Support Library finden Sie verschiedene APIs, mit denen Sie neuen Funktionen in älteren Versionen der Plattform.
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, von den Änderungen in Android 4.3 betroffen sein.
Wenn Ihre App implizite Intents verwendet...
Ihre App verhält sich möglicherweise in einer eingeschränkten Profilumgebung zu Unrecht.
Nutzer in einer Umgebung mit eingeschränkten Profilen
alle Android-Standard-Apps zur Verfügung stehen. Ein eingeschränktes Profil kann beispielsweise
Webbrowser und Kamera-App deaktiviert. Ihre App sollte also keine Annahmen darüber treffen, welche Apps
verfügbar, denn wenn du startActivity()
anrufst, ohne
um zu prüfen, ob eine App zur Verarbeitung der Intent
,
kann deine App in einem eingeschränkten Profil abstürzen.
Wenn Sie einen impliziten Intent verwenden, sollten Sie immer durch Aufrufen von resolveActivity()
oder queryIntentActivities()
prüfen, ob eine App für die Verarbeitung des Intents verfügbar ist. Beispiel:
Kotlin
val intent = Intent(Intent.ACTION_SEND) ... if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show() }
Java
Intent intent = new Intent(Intent.ACTION_SEND); ... if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show(); }
Wenn deine App von Konten abhängt...
Ihre App verhält sich möglicherweise in einer eingeschränkten Profilumgebung zu Unrecht.
Nutzer in einer eingeschränkten Profilumgebung haben standardmäßig keinen Zugriff auf Nutzerkonten.
Wenn deine App von einem Account
abhängig ist, kann sie abstürzen oder sich verhalten
wenn er in einem eingeschränkten Profil verwendet wird.
Wenn Sie gänzlich verhindern möchten, dass eingeschränkte Profile Ihre Anwendung nutzen,
App von vertraulichen Kontoinformationen abhängt, geben Sie das Attribut android:requiredAccountType
in der <application>
Ihres Manifests an
-Elements.
Wenn Sie eingeschränkten Profilen erlauben möchten, Ihre App weiterhin zu verwenden, obwohl sie dies nicht können eigene Konten erstellen, können Sie dann entweder Ihre App-Funktionen deaktivieren, für die ein Konto erforderlich ist oder eingeschränkten Profilen den Zugriff auf die vom primären Nutzer erstellten Konten erlauben. Weitere Informationen finden Sie im Abschnitt Weitere Informationen zur Unterstützung von Konten in einem eingeschränkten Profil
Wenn Ihre App VideoView verwendet...
Unter Android 4.3 erscheint dein Video möglicherweise kleiner.
Auf früheren Android-Versionen hat das VideoView
-Widget fälschlicherweise
hat den "wrap_content"
-Wert für layout_height
und layout_width
so berechnet, dass er mit "match_parent"
identisch ist. Wenn du also "wrap_content"
für die Höhe oder Breite verwendet hast, hast du vielleicht schon das gewünschte Videolayout ausgewählt.
kann dies auf Android 4.3 und höher zu einem viel kleineren Video führen. Um das Problem zu beheben,
"wrap_content"
mit "match_parent"
und bestätige, dass dein Video wie erwartet auf angezeigt wird
Android 4.3 sowie ältere Versionen.
Eingeschränkte Profile
Auf Android-Tablets können Nutzer jetzt eingeschränkte Profile auf Grundlage des Hauptnutzers erstellen. Wenn Nutzer ein eingeschränktes Profil erstellen, können sie einschränken, welche Apps die für das Profil verfügbar sind. Mit neuen APIs in Android 4.3 können Sie zudem detaillierte Einschränkungseinstellungen für die von Ihnen entwickelten Apps festlegen. Mit den neuen APIs können Sie können Nutzer steuern, welche Art von Inhalten in Ihrer App verfügbar ist, wenn sie in einem einer eingeschränkten Profilumgebung.
Die Benutzeroberfläche, über die Nutzer die von Ihnen erstellten Einschränkungen steuern können, wird vom System
Einstellungen. So können Sie Nutzern die Einschränkungseinstellungen für Ihre App anzeigen:
Sie müssen die Einschränkungen Ihrer App deklarieren, indem Sie einen BroadcastReceiver
erstellen, der den ACTION_GET_RESTRICTION_ENTRIES
-Intent empfängt. Das System ruft diesen Intent auf, um eine Abfrage durchzuführen
alle Apps für verfügbare Einschränkungen und erstellt dann die Benutzeroberfläche so, dass der Hauptnutzer
Einschränkungen für jedes eingeschränkte Profil verwalten.
In der Methode onReceive()
von
deine BroadcastReceiver
verwenden, musst du für jede Einschränkung, die deine App bietet, eine RestrictionEntry
erstellen. Jede RestrictionEntry
definiert einen Titel, eine Beschreibung und eines der
folgenden Datentypen:
TYPE_BOOLEAN
für eine Einschränkung, die entweder wahr oder falsch.TYPE_CHOICE
für eine Einschränkung, die mehrere Optionen, die sich gegenseitig ausschließen (Option für Optionsfelder).TYPE_MULTI_SELECT
für eine Einschränkung, die mehrere Auswahlmöglichkeiten hat, die sich nicht gegenseitig ausschließen (Kästchenauswahl).
Dann fügen Sie alle RestrictionEntry
-Objekte in ein ArrayList
-Objekt ein und fügen es dem Ergebnis des Broadcast-Empfängers als Wert für den
EXTRA_RESTRICTIONS_LIST
extra.
Das System erstellt in der App „Einstellungen“ die Benutzeroberfläche für die Einschränkungen deiner App und speichert sie
Einschränkung durch den eindeutigen Schlüssel, den Sie für jede RestrictionEntry
angegeben haben
-Objekt enthält. Wenn der Nutzer Ihre App öffnet, können Sie alle aktuellen Einschränkungen abfragen, indem Sie
getApplicationRestrictions()
wird angerufen.
Dadurch wird ein Bundle
zurückgegeben, das die Schlüssel/Wert-Paare für jede Einschränkung enthält.
die Sie mit den RestrictionEntry
-Objekten definiert haben.
Wenn Sie spezifischere Einschränkungen vorgeben möchten, die nicht mit booleschen, einfachen
Auswahl- und Multi-Choice-Werte, dann können Sie eine Aktivität erstellen, in der die Nutzenden
und Nutzern erlauben, diese Aktivität über die Einschränkungseinstellungen zu öffnen. In der
Übertragungsempfänger, zusätzlich EXTRA_RESTRICTIONS_INTENT
hinzufügen
im Ergebnis Bundle
. Dieses Extra muss einen Intent
angeben
gibt die zu startende Activity
-Klasse an (verwenden Sie die Methode
putParcelable()
, um EXTRA_RESTRICTIONS_INTENT
mit dem Intent zu übergeben.
Wenn der Hauptnutzer Ihre Aktivitäten eingibt, um benutzerdefinierte Einschränkungen festzulegen,
Aktivität muss dann ein Ergebnis zurückgeben, das die Einschränkungswerte in einem Extra-Element enthält, indem entweder
den Schlüssel EXTRA_RESTRICTIONS_LIST
oder EXTRA_RESTRICTIONS_BUNDLE
, je nachdem, ob Sie
RestrictionEntry
-Objekte bzw. Schlüssel/Wert-Paare.
Konten in einem eingeschränkten Profil unterstützen
Alle dem primären Nutzer hinzugefügten Konten sind für ein eingeschränktes Profil verfügbar, das
Konten sind standardmäßig nicht über die AccountManager
APIs zugänglich.
Wenn Sie versuchen, ein Konto mit AccountManager
hinzuzufügen,
erhalten Sie ein Fehlerergebnis. Aufgrund dieser Einschränkungen gilt für Sie Folgendes:
drei Optionen:
Wenn Sie von einem eingeschränkten Profil Zugriff auf ein Konto erhalten möchten, müssen Sie dem <application>-Tag das Attribut android:restrictedAccountType
hinzufügen:
<application ... android:restrictedAccountType="com.example.account.type" >
Achtung:Wenn Sie dieses Attribut aktivieren, App-Zugriff auf die Konten des primären Nutzers von eingeschränkten Profilen aus. Sie sollten das also zulassen, wenn die von Ihrer App angezeigten Informationen keine personenidentifizierbaren Informationen preisgeben die als sensibel eingestuft werden. Die Systemeinstellungen informieren den primären Nutzer, dass Ihre App ihren Konten eingeschränkte Profile gewährt. Daher sollte für den Nutzer klar ersichtlich sein. dass der Kontozugriff für die Funktionalität Ihrer App wichtig ist. Wenn möglich, sollten Sie auch angemessene Steuerungsmöglichkeiten für den primären Nutzer zur Verfügung zu stellen, mit denen festgelegt wird, wie viel Kontozugriff in Ihrer App zulässig ist.
Wenn Sie Konten verwenden möchten, diese aber nicht als primäres Konto Ihrer App benötigen,
können Sie die Kontoverfügbarkeit prüfen und Funktionen deaktivieren, wenn diese nicht verfügbar sind.
Sie sollten zuerst prüfen, ob bereits ein Konto verfügbar ist. Ist dies nicht der Fall, fragen Sie nach,
Sie können ein neues Konto erstellen, indem Sie getUserRestrictions()
aufrufen und DISALLOW_MODIFY_ACCOUNTS
im Ergebnis prüfen. Wenn es sich um true
handelt,
deaktivieren Sie alle Funktionen Ihrer App, die Zugriff auf Konten erfordern.
Beispiel:
Kotlin
val um = context.getSystemService(Context.USER_SERVICE) as UserManager val restrictions: Bundle = um.userRestrictions if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
Java
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); Bundle restrictions = um.getUserRestrictions(); if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
Hinweis:In diesem Szenario sollten Sie nicht erklären, alle neuen Attribute in Ihrer Manifestdatei.
Wenn es stattdessen wichtig ist, dass Ihre App nicht für eingeschränkte Profile verfügbar ist,
Ihre Anwendung von vertraulichen personenbezogenen Daten in einem Konto abhängt (und weil eingeschränkte Profile
kann derzeit keine neuen Konten hinzugefügt werden).
Das Attribut android:requiredAccountType
zum <application>-Tag:
<application ... android:requiredAccountType="com.example.account.type" >
Die Gmail App verwendet dieses Attribut beispielsweise, um sich selbst für eingeschränkte Profile zu deaktivieren, da die private E-Mail-Adresse des Inhabers nicht für eingeschränkte Profile verfügbar sein soll.
Drahtlose Verbindung und Konnektivität
Bluetooth Low Energy (Smart Ready)
Android unterstützt jetzt Bluetooth Low Energy (LE) mit neuen APIs in android.bluetooth
.
Mit den neuen APIs können Sie Android-Apps entwickeln, die mit Bluetooth Low Energy kommunizieren.
Peripheriegeräte wie Herzfrequenzmesser und Schrittzähler.
Da Bluetooth LE eine Hardwarefunktion ist, die nicht für alle
Android-Geräte müssen Sie in Ihrer Manifestdatei eine <uses-feature>
deklarieren
-Element für "android.hardware.bluetooth_le"
:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
Wenn Sie bereits mit den klassischen Bluetooth-APIs von Android vertraut sind, beachten Sie, dass die Verwendung der
Bluetooth LE APIs unterscheiden sich in einigen Punkten. Am wichtigsten ist, dass es jetzt eine BluetoothManager
-Klasse gibt, die Sie für einige übergeordnete Vorgänge verwenden sollten
etwa eine BluetoothAdapter
erwerben, eine Liste aller verbundenen
Geräte und das Prüfen des Gerätestatus. So erhalten Sie jetzt zum Beispiel
BluetoothAdapter
:
Kotlin
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothAdapter = bluetoothManager.adapter
Java
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); bluetoothAdapter = bluetoothManager.getAdapter();
Um Bluetooth LE-Peripheriegeräte zu erkennen, rufen Sie startLeScan()
auf dem BluetoothAdapter
auf und übergeben Sie eine Implementierung
der BluetoothAdapter.LeScanCallback
-Oberfläche. Wenn die Bluetooth-
ein Bluetooth LE-Peripheriegerät erkennt, empfängt Ihre BluetoothAdapter.LeScanCallback
-Implementierung einen Aufruf an den
onLeScan()
-Methode. Dieses
stellt ein BluetoothDevice
-Objekt bereit, das die
erkanntes Gerät, den RSSI-Wert für das Gerät und ein Byte-Array mit der
Werbedatensatz.
Wenn Sie nur nach bestimmten Arten von Peripheriegeräten suchen möchten, können Sie stattdessen startLeScan()
aufrufen und ein Array von UUID
-Objekten einfügen, die die GATT-Dienste angeben, die Ihre App unterstützt.
Hinweis:Sie können nur nach Bluetooth LE-Geräten suchen oder mit vorherigen APIs nach klassischen Bluetooth-Geräten suchen. Sie können nicht gleichzeitig nach LE und Classic suchen Bluetooth-Geräte gleichzeitig
Rufe dann connectGatt()
auf dem entsprechenden Gerät auf, um eine Verbindung zu einem Bluetooth LE-Peripheriegerät herzustellen
BluetoothDevice
-Objekt und übergeben Sie ihm eine Implementierung von
BluetoothGattCallback
Ihre Implementierung von BluetoothGattCallback
empfängt Rückrufe bezüglich der Verbindung
mit dem Gerät und anderen Ereignissen. Es ist während: onConnectionStateChange()
-Callback, mit dem Sie mit dem Gerät kommunizieren können, wenn die Methode STATE_CONNECTED
als neuen Status übergibt.
Für den Zugriff auf Bluetooth-Funktionen auf einem Gerät muss deine App außerdem bestimmte Bluetooth-Nutzerberechtigungen Weitere Informationen findest du im Leitfaden zur Bluetooth Low Energy API.
WLAN-Suchmodus
Bei dem Versuch, den Standort des Nutzers zu ermitteln, kann Android WLAN nutzen, um indem Sie Zugangspunkte in der Nähe scannen. Oft deaktivieren Nutzer die WLAN-Funktion jedoch, Dadurch wird der Akku geschont, was zu ungenauen Standortdaten führt. Android enthält jetzt ein Nur-Scan-Modus, mit dem das WLAN des Geräts Zugangspunkte scannen kann, um den Standort zu ermitteln ohne Verbindung zu einem Zugangspunkt herstellen zu müssen. Dadurch wird der Akkuverbrauch erheblich reduziert.
Wenn du den Standort des Nutzers abrufen möchtest, das WLAN aber derzeit deaktiviert ist, kannst du den
Nutzer kann den Nur-WLAN-Scanmodus aktivieren, indem er startActivity()
mit der Aktion ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
aufruft.
WLAN-Konfiguration
Mit den neuen WifiEnterpriseConfig
APIs können unternehmensorientierte Dienste
die WLAN-Konfiguration für verwaltete Geräte zu automatisieren.
Schnelle Antwort für eingehende Anrufe
Seit Android 4.0 eine Funktion namens „Kurzantwort“ können Nutzer auf eingehende Anfragen
mit einer sofortigen SMS an, ohne den Anruf annehmen oder das Gerät entsperren zu müssen.
Bisher wurden diese Kurznachrichten immer von der standardmäßigen Messaging-App verarbeitet. Jetzt für alle Apps
kann seine Fähigkeit zur Verarbeitung dieser Nachrichten durch Erstellen eines Service
deklarieren
mit einem Intent-Filter für ACTION_RESPOND_VIA_MESSAGE
.
Wenn der Nutzer auf einen eingehenden Anruf mit einer kurzen Antwort antwortet, sendet die Telefon App
Intent ACTION_RESPOND_VIA_MESSAGE
mit einem URI
eine Beschreibung des Empfängers (des Anrufers) und des zusätzlichen EXTRA_TEXT
mit der Nachricht, die der Nutzer senden möchte. Wenn Ihr Dienst den Intent erhält, sollte er
die Nachricht und beendet sich sofort von selbst (Ihre App sollte keine Aktivität anzeigen).
Deklarieren Sie die Berechtigung SEND_RESPOND_VIA_MESSAGE
, um diesen Intent zu erhalten.
Multimedia
Verbesserungen von MediaExtractor und MediaCodec
In Android können Sie jetzt noch einfacher eigene Dynamic Adaptive
Streaming über HTTP-Player (DASH) gemäß ISO/IEC 23009-1
mit vorhandenen APIs in MediaCodec
und MediaExtractor
. Das Framework, das diesen APIs zugrunde liegt, wurde aktualisiert, um
fragmentierte MP4-Dateien geparst, aber Ihre App ist weiterhin für das Parsen der MPD-Metadaten verantwortlich.
und die einzelnen Streams an MediaExtractor
übergeben.
Wenn Sie DASH mit verschlüsselten Inhalten verwenden möchten, gibt die Methode getSampleCryptoInfo()
die MediaCodec.CryptoInfo
-Metadaten zurück, die die Struktur der einzelnen verschlüsselten Medien beschreiben
Stichprobe. Außerdem wurde die Methode getPsshInfo()
zu
MediaExtractor
, damit du auf die PSSH-Metadaten für deine DASH-Medien zugreifen kannst.
Diese Methode gibt eine Zuordnung von UUID
-Objekten zu Byte zurück, wobei der Parameter
UUID
gibt das Kryptoschema an und die Bytes sind die spezifischen Daten
auf dieses Schema anwenden.
DRM für Medien
Die neue MediaDrm
-Klasse bietet eine modulare Lösung für digitale Rechte
DRM-Schutz für Ihre Medieninhalte durch die Trennung von DRM-Angelegenheiten von der Medienwiedergabe. Für
können Sie mit dieser API-Trennung Widevine-verschlüsselte Inhalte ohne
das Widevine-Medienformat zu verwenden. Diese DRM-Lösung unterstützt auch die allgemeine DASH-Verschlüsselung.
können Sie verschiedene DRM-Schemata
für Ihre Streaminginhalte verwenden.
Mit MediaDrm
können Sie intransparente Schlüsselanfragenachrichten abrufen und verarbeiten.
Schlüsselantwortnachrichten vom Server für den Erwerb und die Bereitstellung von Lizenzen. Deine App ist
verantwortlich für die Netzwerkkommunikation mit den Servern; Die Klasse MediaDrm
bietet nur die Möglichkeit, die Nachrichten zu generieren und zu verarbeiten.
Die MediaDrm
APIs sind für die Verwendung in Verbindung mit dem
MediaCodec
APIs, die in Android 4.1 (API-Level 16) eingeführt wurden,
einschließlich MediaCodec
für die Codierung und Decodierung Ihrer Inhalte, MediaCrypto
für die Verarbeitung verschlüsselter Inhalte und MediaExtractor
zum Extrahieren und Zerlegen Ihrer Inhalte.
Sie müssen zuerst MediaExtractor
und
MediaCodec
-Objekte. Sie können dann auf das DRM-Schema
UUID
, in der Regel aus Metadaten im Content, und verwenden sie zum Erstellen eines
Instanz eines MediaDrm
-Objekts mit seinem Konstruktor.
Videocodierung von einer Oberfläche
Unter Android 4.1 (API-Level 16) wurde die Klasse MediaCodec
für untergeordnete Elemente hinzugefügt
Codierung und Decodierung von Medieninhalten. Für die Codierung von Videos war Android 4.1 erforderlich,
Medien mit einem ByteBuffer
-Array. In Android 4.3 kannst du jetzt Surface
als Eingabe für einen Encoder verwenden. So können Sie beispielsweise Eingaben codieren
aus einer vorhandenen Videodatei oder mithilfe von Frames, die über OpenGL ES generiert wurden.
Wenn du eine Surface
als Eingabe für deinen Encoder verwenden möchtest, rufe zuerst configure()
für deinen MediaCodec
auf.
Rufen Sie dann createInputSurface()
auf, um die Surface
zu erhalten, auf die Sie Ihre Medien streamen können.
Sie können z. B. das angegebene Surface
als Fenster für ein OpenGL verwenden
Kontext hinzu, indem er an eglCreateWindowSurface()
übergeben wird. Rufen Sie dann beim Rendern der Oberfläche eglSwapBuffers()
auf, um den Frame an MediaCodec
zu übergeben.
Um mit der Codierung zu beginnen, rufen Sie start()
auf der MediaCodec
auf. Wenn Sie fertig sind, rufen Sie signalEndOfInputStream()
an
um die Codierung zu beenden, und rufen Sie release()
auf der
Surface
Media-Muxing
Die neue Klasse MediaMuxer
ermöglicht Multiplexing zwischen einem Audiostream
und einen Videostream. Diese APIs dienen als Gegenstück zur MediaExtractor
Klasse, die in Android 4.2 zum Demultiplexen (Demuxen) von Medien hinzugefügt wurde.
Die unterstützten Ausgabeformate sind in MediaMuxer.OutputFormat
definiert. Derzeit
MP4 ist das einzige Ausgabeformat und wird derzeit von MediaMuxer
unterstützt
jeweils nur einen Audiostream und/oder einen Videostream verwenden.
MediaMuxer
wurde hauptsächlich für MediaCodec
entwickelt
Du kannst die Videoverarbeitung über MediaCodec
durchführen und dann die
Ausgabe in MP4-Datei über MediaMuxer
. Sie können auch MediaMuxer
in Kombination mit MediaExtractor
verwenden, um
Medien ohne Codierung oder Decodierung bearbeiten.
Wiedergabefortschritt und Scrubbing für RemoteControlClient
In Android 4.0 (API-Level 14) wurde die RemoteControlClient
zu
die Wiedergabesteuerung für Medien über Clients für die Fernbedienung aktivieren, z. B. über die Steuerelemente auf der
Sperrbildschirm. Mit Android 4.3 können solche Controller jetzt die Wiedergabe-
und die Steuerelemente für das Scrubbing. Wenn Sie die Fernbedienung für Ihr
Medien-App mit den RemoteControlClient
-APIs hinzufügen, kannst du die Wiedergabe erlauben
indem zwei neue Oberflächen implementiert werden.
Zuerst müssen Sie das Flag FLAG_KEY_MEDIA_POSITION_UPDATE
aktivieren, indem Sie es an
setTransportControlsFlags()
.
Implementieren Sie dann die folgenden beiden neuen Schnittstellen:
RemoteControlClient.OnGetPlaybackPositionListener
- Enthält den Callback
onGetPlaybackPosition()
, der die aktuelle Position anfordert Ihrer Medien, wenn die Fernbedienung den Fortschritt in der Benutzeroberfläche aktualisieren muss. RemoteControlClient.OnPlaybackPositionUpdateListener
- Dies beinhaltet den Callback
onPlaybackPositionUpdate()
, der teilt Ihrer App den neuen Zeitcode für Ihre Medien mit, wenn der Nutzer die Wiedergabe mit dem UI für die Fernbedienung.Nachdem du deine Wiedergabe mit der neuen Position aktualisiert hast, rufe
setPlaybackState()
auf, um anzugeben, dass neuen Wiedergabestatus, -position und -geschwindigkeit.
Nachdem Sie diese Schnittstellen definiert haben, können Sie sie für RemoteControlClient
festlegen, indem Sie setOnGetPlaybackPositionListener()
aufrufen und
setPlaybackPositionUpdateListener()
.
Grafik
Unterstützung für OpenGL ES 3.0
Android 4.3 fügt Java-Schnittstellen und native Unterstützung für OpenGL ES 3.0 hinzu. Wichtige neue Funktionen in OpenGL ES 3.0 enthalten:
- Beschleunigung erweiterter visueller Effekte
- Hochwertige ETC2/EAC-Texturkomprimierung als Standardfunktion
- Eine neue Version der Schattierungssprache GLSL ES mit Unterstützung für Ganzzahl- und 32-Bit-Gleitkommazahlen
- Erweitertes Textur-Rendering
- Breiter gefasste Standardisierung von Texturgröße und Rendering-Zwischenspeicherformaten
Die Java-Oberfläche für OpenGL ES 3.0 unter Android wird mit GLES30
bereitgestellt.
Wenn Sie OpenGL ES 3.0 verwenden, müssen Sie dies in Ihrer Manifestdatei mit dem
<uses-feature>
Tag und das Attribut android:glEsVersion
. Beispiel:
<manifest> <uses-feature android:glEsVersion="0x00030000" /> ... </manifest>
Den OpenGL ES-Kontext geben Sie an, indem Sie setEGLContextClientVersion()
aufrufen.
und dabei 3
als Version übergeben.
Weitere Informationen zur Verwendung von OpenGL ES und dazu, wie Sie prüfen können, welche OpenGL ES-Version zur Laufzeit finden Sie im OpenGL ES API-Leitfaden.
Mipmapping für Drawables
Die Verwendung einer Mipmap als Quelle für Ihre Bitmap oder ein Drawable ist eine einfache Möglichkeit, eine eine hohe Bildqualität und verschiedene Bildgrößen. Dies kann besonders nützlich sein, Bild, das während einer Animation skaliert werden soll.
Android 4.2 (API-Level 17) unterstützt jetzt Mipmaps in der Bitmap
Klasse: Android tauscht die Mip-Bilder in Bitmap
aus, wenn Sie
hat eine Mipmap-Quelle angegeben und setHasMipMap()
aktiviert. In Android 4.3 können Sie Mipmaps auch für ein BitmapDrawable
-Objekt aktivieren, indem Sie ein Mipmap-Asset angeben und
das Attribut android:mipMap
in einer Bitmap-Ressourcendatei festlegen oder hasMipMap()
aufrufen.
Benutzeroberfläche
Overlays anzeigen
Die neue Klasse ViewOverlay
bietet eine transparente Ebene
eine View
, der Sie visuelle Inhalte hinzufügen können und die keinen Einfluss
Layout-Hierarchie. Du kannst ein ViewOverlay
für jede View
erhalten, indem du getOverlay()
aufrufst. Das Overlay
immer dieselbe Größe und Position hat wie die Hostansicht (die Ansicht, aus der sie erstellt wurde).
Sie können Inhalte hinzufügen, die vor der Host-Ansicht angezeigt werden,
die Grenzen dieser Hostansicht.
Die Verwendung eines ViewOverlay
ist besonders nützlich, wenn Sie
Animationen wie das Verschieben einer Ansicht außerhalb des Containers oder das Verschieben von Elementen auf dem Bildschirm
ohne Auswirkungen auf die Ansichtshierarchie zu haben. Da der nutzbare Bereich eines Overlays jedoch
auf denselben Bereich beschränkt ist wie die Ansicht des Organisators, wenn Sie eine Ansicht animieren möchten, die nach draußen
im Layout platziert werden soll, müssen Sie ein Overlay aus einer übergeordneten Ansicht verwenden, das die gewünschte
Layoutgrenzen.
Wenn Sie ein Overlay für eine Widget-Ansicht wie Button
erstellen,
können Drawable
-Objekte zum Overlay hinzufügen, indem sie
add(Drawable)
Wenn Sie getOverlay()
für eine Layoutansicht wie RelativeLayout
aufrufen,
wird als Objekt ein ViewGroupOverlay
zurückgegeben. Die
ViewGroupOverlay
-Klasse ist eine abgeleitete Klasse
von ViewOverlay
, mit denen Sie auch View
hinzufügen können
durch Aufrufen von add(View)
.
Hinweis:Alle Drawables und Ansichten, die Sie einem Overlay hinzufügen. sind nur visuell. Sie können keine Fokus- oder Eingabeereignisse empfangen.
Der folgende Code animiert beispielsweise eine Ansicht, die nach rechts gleitet, indem die Ansicht platziert wird. im Overlay der übergeordneten Ansicht und führen dann in dieser Ansicht eine Übersetzungsanimation aus:
Kotlin
val view: View? = findViewById(R.id.view_to_remove) val container: ViewGroup? = view?.parent as ViewGroup container?.apply { overlay.add(view) ObjectAnimator.ofFloat(view, "translationX", right.toFloat()) .start() }
Java
View view = findViewById(R.id.view_to_remove); ViewGroup container = (ViewGroup) view.getParent(); container.getOverlay().add(view); ObjectAnimator anim = ObjectAnimator.ofFloat(view, "translationX", container.getRight()); anim.start();
Optical Bounds Layout
Für Ansichten, die Hintergrundbilder mit neun Patches enthalten, können Sie jetzt festlegen, dass sie auf mit benachbarten Ansichten basierend auf der "optischen" die Grenzen des Hintergrundbilds ein, als der „Clip“ die Grenzen der Ansicht.
Zum Beispiel zeigen die Abbildungen 1 und 2 jeweils das gleiche Layout, aber die Version in Abbildung 1 ist Clipgrenzen verwenden (Standardverhalten), während in Abbildung 2 optische Grenzen verwendet werden. Da die 9-Patch-Bilder, die für die Schaltfläche und den Bilderrahmen verwendet werden, umfassen Innenabstände, sie scheinen nicht aneinander oder am Text ausgerichtet zu sein, wenn Sie Clipgrenzen verwenden.
Hinweis:Der Screenshot in den Abbildungen 1 und 2 enthält den Hinweis Layoutgrenzen“ Entwicklereinstellung aktiviert. In jeder Ansicht stehen rote Linien für die optische Bänder, blaue Linien die Clip-Grenzen und Rosa die Ränder.
Um die Ansichten anhand ihrer optischen Begrenzungen auszurichten, setzen Sie das Attribut android:layoutMode
in einem der übergeordneten Layouts auf "opticalBounds"
. Beispiel:
<LinearLayout android:layoutMode="opticalBounds" ... >
Damit dies funktioniert, müssen die 9-Patch-Images, die auf den Hintergrund Ihrer Ansichten angewendet werden, die optischen Grenzen durch rote Linien entlang der Unter- und rechten Seite der 9-Patch-Datei (als wie in Abbildung 3 dargestellt). Die roten Linien kennzeichnen die Region, die von der der Clipgrenzen, wobei die optischen Begrenzungen des Bilds verbleiben.
Wenn Sie optische Grenzen für eine ViewGroup
in Ihrem Layout aktivieren,
untergeordnete Ansichten übernehmen den Layoutmodus für optische Grenzen, es sei denn, Sie überschreiben ihn für eine Gruppe durch
android:layoutMode
wird auf "clipBounds"
festgelegt. Alle Layoutelemente berücksichtigen auch die
optischen Grenzen der Ansicht ihres Kindes und passten ihre eigenen Grenzen basierend auf den optischen Grenzen des
die enthaltenen Ansichten. Layoutelemente (untergeordnete Klassen von ViewGroup
)
derzeit unterstützen keine optischen Grenzen für Neun-Patch-Bilder, die auf ihren eigenen Hintergrund angewendet werden.
Wenn Sie eine benutzerdefinierte Ansicht erstellen, indem Sie View
, ViewGroup
oder eine Unterklasse davon abgeleitet haben, übernimmt die Ansicht diese optisch gebundenen Verhaltensweisen.
Hinweis:Alle vom Holo-Design unterstützten Widgets wurden aktualisiert.
mit optischen Grenzen, darunter Button
, Spinner
,
EditText
und weitere. Sie können also sofort davon profitieren,
Attribut android:layoutMode
auf "opticalBounds"
, wenn in deiner App ein Holo-Design angewendet wird
(Theme.Holo
, Theme.Holo.Light
usw.).
Um mit dem Tool 9-Patch zeichnen optische Grenzen für Ihre eigenen Bilder mit neun Patches festzulegen, halten Sie die Strg-Taste gedrückt, auf die Rahmenpixel.
Animation für Rechteckwerte
Mit dem neuen RectEvaluator
können Sie jetzt zwischen zwei Rect
-Werten animieren. Diese neue Klasse ist eine Implementierung von TypeEvaluator
, die Sie an ValueAnimator.setEvaluator()
übergeben können.
Fensteranhängen und Fokus-Listener
Bisher war es so, dass Sie darauf warten wollten, dass Ihre Ansicht an das Fenster angehängt oder davon getrennt wurde.
Als sich der Fokus geändert hat, mussten Sie die View
-Klasse überschreiben, um
Implementieren Sie onAttachedToWindow()
und onDetachedFromWindow()
bzw. onWindowFocusChanged()
.
Wenn Sie jetzt Ereignisse vom Typ „Anhängen“ und „Trennen“ empfangen möchten, können Sie stattdessen ViewTreeObserver.OnWindowAttachListener
implementieren und für eine Ansicht mit
addOnWindowAttachListener()
.
Wenn Sie Fokusereignisse erhalten möchten, können Sie ViewTreeObserver.OnWindowFocusChangeListener
implementieren und auf eine Ansicht mit
addOnWindowFocusChangeListener()
.
TV-Overscan-Unterstützung
Du kannst jetzt Overscan aktivieren, damit deine App auf jedem Fernseher den gesamten Bildschirm ausfüllt.
für Ihr App-Layout. Der Overscan-Modus wird durch das Flag FLAG_LAYOUT_IN_OVERSCAN
bestimmt, das Sie mit Plattformdesigns wie
Theme_DeviceDefault_NoActionBar_Overscan
oder durch Aktivieren der
windowOverscan
in einem benutzerdefinierten Design.
Bildschirmausrichtung
Die <activity>
screenOrientation
des Tags
unterstützt jetzt zusätzliche Werte, um die Einstellung des Nutzers für die automatische Rotation zu berücksichtigen:
"userLandscape"
- Verhält sich wie
"sensorLandscape"
, außer wenn der Nutzer das automatische Drehen deaktiviert hat bleibt das Display in der normalen Ausrichtung im Querformat gesperrt und dreht sich nicht. "userPortrait"
- Verhält sich wie
"sensorPortrait"
, außer wenn der Nutzer das automatische Drehen deaktiviert: bleibt das Display in der normalen Hochformat-Ausrichtung gesperrt und lässt sich nicht umdrehen. "fullUser"
- Verhält sich wie
"fullSensor"
und lässt Drehung in alle vier Richtungen zu, außer Wenn der Nutzer das automatische Drehen deaktiviert, wird es in der vom Nutzer bevorzugten Ausrichtung gesperrt.
Außerdem können Sie jetzt auch "locked"
deklarieren, um die Ausrichtung Ihrer App in
aktuellen Ausrichtung des Bildschirms.
Rotationsanimationen
Das neue Feld rotationAnimation
in
Mit WindowManager
können Sie zwischen drei Animationen wählen,
die beim Wechsel der Bildschirmausrichtung
verwendet werden soll. Die drei Animationen sind:
Hinweis:Diese Animationen sind nur verfügbar, wenn Sie für Ihre Aktivitäten die Option "Vollbild" ausgewählt haben. den Sie mit Designs wie Theme.Holo.NoActionBar.Fullscreen
aktivieren können.
So aktivieren Sie zum Beispiel die Funktion Animation:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val params: WindowManager.LayoutParams = window.attributes params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE window.attributes = params ... }
Java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WindowManager.LayoutParams params = getWindow().getAttributes(); params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; getWindow().setAttributes(params); ... }
Nutzereingabe
Neue Sensortypen
Mit dem neuen TYPE_GAME_ROTATION_VECTOR
-Sensor kannst du die Drehungen des Geräts erkennen, ohne dir Gedanken über magnetische Störungen machen zu müssen. Im Gegensatz zum TYPE_ROTATION_VECTOR
-Sensor basiert TYPE_GAME_ROTATION_VECTOR
nicht auf dem magnetischen Norden.
Die neuen Sensoren TYPE_GYROSCOPE_UNCALIBRATED
und TYPE_MAGNETIC_FIELD_UNCALIBRATED
liefern Sensorrohdaten ohne
Verzerrungsschätzungen berücksichtigen. Das heißt, die vorhandenen TYPE_GYROSCOPE
und TYPE_MAGNETIC_FIELD
Sensoren liefern Sensordaten, die die geschätzte Verzerrung durch Gyroskopdrift und harte Eisen berücksichtigen
auf dem Gerät befinden. Während das neue „nicht kalibrierte“ bieten die verschiedenen Sensoren,
Sensorrohdaten und stellen die geschätzten
Verzerrungswerte separat bereit. Mit diesen Sensoren kannst du
eine eigene benutzerdefinierte Kalibrierung für die Sensordaten, indem Sie die geschätzte Verzerrung mit
externe Daten.
Benachrichtigungs-Listener
In Android 4.3 wird eine neue Dienstklasse hinzugefügt: NotificationListenerService
. Diese ermöglicht es deiner App, Informationen zu neuen Benachrichtigungen zu empfangen, sobald diese vom System gepostet werden.
Wenn Ihre App derzeit die Bedienungshilfen-APIs für den Zugriff auf Systembenachrichtigungen verwendet, sollten Sie sie aktualisieren, um stattdessen diese APIs zu verwenden.
Contacts Provider
Abfrage nach „Kontaktbare Kontakte“
Die neue Abfrage des Kontaktanbieters (Contactables.CONTENT_URI
) bietet eine effiziente Möglichkeit zum Abrufen einer Cursor
, die alle E-Mail-Adressen und Telefonnummern aller Kontakte enthält, die der angegebenen Abfrage entsprechen.
Kontakt-Deltas abfragen
Zum Kontaktanbieter wurden neue APIs hinzugefügt, mit denen Sie kürzlich vorgenommene Änderungen an den Kontaktdaten effizient abfragen können. Zuvor konnte Ihre App benachrichtigt werden, wenn sich etwas in den Kontaktdaten geändert hat. Sie wussten jedoch nicht genau, was sich geändert hat, und müssten alle Kontakte abrufen und diese dann durchgehen, um die Änderung zu erkennen.
Um Änderungen an Einfügungen und Aktualisierungen zu verfolgen, können Sie jetzt den Parameter CONTACT_LAST_UPDATED_TIMESTAMP
in Ihre Auswahl aufnehmen, um nur die Kontakte abzufragen, die sich seit Ihrer letzten Anfrage an den Anbieter geändert haben.
Um zu verfolgen, welche Kontakte gelöscht wurden, enthält die neue Tabelle ContactsContract.DeletedContacts
ein Protokoll der gelöschten Kontakte. Jeder gelöschte Kontakt wird in dieser Tabelle jedoch für eine begrenzte Zeit aufbewahrt. Ähnlich wie bei CONTACT_LAST_UPDATED_TIMESTAMP
können Sie den neuen Auswahlparameter CONTACT_DELETED_TIMESTAMP
verwenden, um zu prüfen, welche Kontakte seit Ihrer letzten Anfrage beim Anbieter gelöscht wurden. Die Tabelle enthält auch die Konstante DAYS_KEPT_MILLISECONDS
mit der Anzahl der Tage (in Millisekunden), für die das Protokoll gespeichert wird.
Außerdem überträgt der Contacts Provider jetzt die Aktion CONTACTS_DATABASE_CREATED
, wenn der Nutzer
löscht den Kontaktspeicher über das Menü "Systemeinstellungen" und erstellt
Datenbank des Kontakteanbieters. Es soll Apps signalisieren, dass alle Kontaktinformationen
gespeichert sind, und laden Sie sie mit einer neuen Abfrage.
Beispielcode, der diese APIs verwendet, um nach Änderungen an den Kontakten zu suchen, findest du in den ApiDemos im Download der SDK-Beispiele verfügbar.
Lokalisierung
Verbesserte Unterstützung für bidirektionalen Text
Frühere Versionen von Android unterstützen linksläufige Sprachen und Layouts.
aber manchmal wird Text mit gemischter Richtung nicht richtig verarbeitet. Android 4.3 fügt also die BidiFormatter
-APIs hinzu, mit denen Sie Text richtig in entgegengesetzte Richtungen formatieren können
ohne Teile davon zu verzerren.
Wenn Sie beispielsweise einen Satz mit einer Zeichenfolgenvariablen wie „Meinten Sie
15 Bay Street, Laurel, CA?" gibt, übergeben Sie normalerweise eine lokalisierte Zeichenfolgenressource und die Variable an
String.format()
:
Kotlin
val suggestion = String.format(resources.getString(R.string.did_you_mean), address)
Java
Resources res = getResources(); String suggestion = String.format(res.getString(R.string.did_you_mean), address);
Wenn das Gebietsschema jedoch Hebräisch ist, wird die formatierte Zeichenfolge wie folgt ausgegeben:
栏戠 夛WERT örtlichen Anteil 15 Bay Street, Laurel, CA?
Das ist falsch, weil „15“ links von der "Bay Street" befinden. Die Lösung ist die Verwendung von BidiFormatter
und der zugehörigen unicodeWrap()
-Methode. Der obige Code wird beispielsweise zu:
Kotlin
val bidiFormatter = BidiFormatter.getInstance() val suggestion = String.format( resources.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address) )
Java
Resources res = getResources(); BidiFormatter bidiFormatter = BidiFormatter.getInstance(); String suggestion = String.format(res.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address));
Standardmäßig verwendet unicodeWrap()
die Methode
die erste starke Heuristik für die
Richtung der Richtungsschätzung,
Signal für Textrichtung nicht die richtige Richtung für den gesamten Inhalt wieder.
Bei Bedarf können Sie eine andere Heuristik angeben, indem Sie eine der TextDirectionHeuristic
-Konstanten aus TextDirectionHeuristics
übergeben.
an unicodeWrap()
.
Hinweis:Diese neuen APIs sind auch für frühere Versionen verfügbar.
über den Android-Support
Bibliothek mit der Klasse BidiFormatter
und den zugehörigen APIs.
Bedienungshilfen
Schlüsselereignisse verarbeiten
Ein AccessibilityService
kann jetzt einen Rückruf erhalten für
mit der Callback-Methode onKeyEvent()
angeben. So kann die Bedienungshilfe Eingaben für
wie z. B. eine Tastatur, und übersetzen diese Ereignisse in spezielle Aktionen,
bisher nur mit Berührungen oder den Richtungstasten des Geräts möglich gewesen wäre.
Text auswählen und kopieren und einfügen
Die AccessibilityNodeInfo
bietet jetzt APIs, die
AccessibilityService
zum Auswählen, Ausschneiden, Kopieren und Einfügen
Text in einem Knoten
einfügen.
Um die Auswahl des auszuschneidenden oder zu kopierenden Textes festzulegen, kann Ihre Bedienungshilfe das neue
Aktion, ACTION_SET_SELECTION
, bestanden
die Start- und Endposition der Auswahl mit ACTION_ARGUMENT_SELECTION_START_INT
und ACTION_ARGUMENT_SELECTION_END_INT
.
Alternativ können Sie Text auswählen, indem Sie die Cursorposition mithilfe der vorhandenen
Aktion, ACTION_NEXT_AT_MOVEMENT_GRANULARITY
(bisher nur zum Verschieben der Cursorposition) und durch Hinzufügen des Arguments ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
.
Anschließend können Sie sie mit ACTION_CUT
ausschneiden oder kopieren.
ACTION_COPY
und später einfügen mit
ACTION_PASTE
Hinweis:Diese neuen APIs sind auch für frühere Versionen verfügbar.
über den Android-Support
Bibliothek mit dem AccessibilityNodeInfoCompat
.
Bedienungshilfen deklarieren
Ab Android 4.3 muss eine Bedienungshilfe Bedienungshilfen deklarieren.
in seiner Metadatendatei, um bestimmte Bedienungshilfen nutzen zu können. Wenn die Capability nicht
in der Metadatendatei angefordert wurde, ist das Feature ein Null-Vorgang. Zum Deklarieren der
müssen Sie XML-Attribute verwenden, die den verschiedenen
„Fähigkeit“ Konstanten in AccessibilityServiceInfo
.
Wenn ein Dienst beispielsweise die Funktion flagRequestFilterKeyEvents
nicht anfordert,
erhält sie keine Schlüsselereignisse.
Testen und Debugging
Automatisierte UI-Tests
Die neue Klasse UiAutomation
bietet APIs, mit denen Sie
Aktionen für die Testautomatisierung. Durch die Nutzung der AccessibilityService
APIs der Plattform kann der UiAutomation
Mit APIs können Sie den Bildschirminhalt prüfen und beliebige Tastatur- und Touch-Ereignisse einfügen.
Rufen Sie Instrumentation.getUiAutomation()
auf, um eine Instanz von UiAutomation
zu erhalten. Um
Damit dies funktioniert, müssen Sie die Option -w
mit dem Befehl instrument
angeben.
wenn InstrumentationTestCase
von adb shell
ausgeführt wird.
Mit der Instanz UiAutomation
können Sie beliebige Ereignisse ausführen,
durch Aufrufen von executeAndWaitForEvent()
und Übergeben eines Runnable
,
Zeitraum für den Vorgang und eine Implementierung der UiAutomation.AccessibilityEventFilter
-Schnittstelle. Innerhalb Ihrer UiAutomation.AccessibilityEventFilter
-Implementierung erhalten Sie einen Anruf
mit der Sie die Ereignisse filtern können, die Sie interessieren, und den Erfolg oder
Misserfolg eines Testfalls.
Wenn Sie während eines Tests alle Ereignisse beobachten möchten, erstellen Sie eine Implementierung von UiAutomation.OnAccessibilityEventListener
und übergeben Sie sie an setOnAccessibilityEventListener()
.
Ihre Listener-Oberfläche empfängt dann einen Aufruf von onAccessibilityEvent()
Jedes Mal, wenn ein Ereignis eintritt, wird ein AccessibilityEvent
-Objekt empfangen.
der das Ereignis beschreibt.
Es gibt eine Vielzahl anderer Vorgänge, die die UiAutomation
APIs verfügbar machen
auf sehr niedriger Ebene, um die Entwicklung von UI-Testtools wie uiautomator zu fördern. Beispiel:
UiAutomation
kann auch:
- Eingabeereignisse einfügen
- Bildschirmausrichtung ändern
- Screenshots erstellen
Der wichtigste Vorteil von UI-Testtools ist, dass die UiAutomation
APIs
über Anwendungsgrenzen hinweg nutzen, im Gegensatz zu denen in Instrumentation
.
Systrace-Ereignisse für Apps
Android 4.3 fügt die Trace
-Klasse mit zwei statischen Methoden hinzu:
beginSection()
und endSection()
,
mit denen Sie Codeblöcke definieren können, die in den Systrace-Bericht aufgenommen werden sollen. Durch Erstellen
mit nachverfolgbarem Code in Ihrer App enthält, liefern Ihnen die Systrace-Logs
Analyse dessen, wo in Ihrer App eine Verlangsamung auftritt.
Informationen zur Verwendung des Systrace-Tools finden Sie unter Anzeige und Leistung mit Systrace analysieren.
Sicherheit
Android-Schlüsselspeicher für private App-Schlüssel
Android bietet jetzt einen benutzerdefinierten Java Security Provider in der KeyStore
an
Android Key Store, mit dem Sie private Schlüssel generieren und speichern können,
möglicherweise nur von Ihrer App gesehen und verwendet werden. Um den Android Key Store zu laden,
"AndroidKeyStore"
auf KeyStore.getInstance()
.
Generiere zum Verwalten der privaten Anmeldedaten deiner App im Android Key Store einen neuen Schlüssel mit
KeyPairGenerator
mit KeyPairGeneratorSpec
. Zuerst
durch Aufrufen von getInstance()
eine Instanz von KeyPairGenerator
abrufen Rufen Sie dann
initialize()
, übergeben Sie eine Instanz von
KeyPairGeneratorSpec
, den Sie über
KeyPairGeneratorSpec.Builder
Rufe dann generateKeyPair()
auf, um dein KeyPair
zu erhalten.
Hardware-Anmeldedatenspeicher
Android unterstützt jetzt auch hardwaregestützten Speicherplatz für KeyChain
Anmeldedaten. Dies erhöht die Sicherheit, da die Schlüssel nicht zur Extraktion bereitstehen. Das heißt, einmal
befinden sich in einem hardwaregestützten Schlüsselspeicher (Secure Element, TPM oder TrustZone) und können für Folgendes verwendet werden:
kryptografischer Vorgänge auszuführen,
jedoch das Material des privaten Schlüssels kann nicht exportiert werden. Sogar der Betriebssystem-Kernel
kann nicht auf dieses Schlüsselmaterial zugreifen. Obwohl nicht alle Android-Geräte den Speicher auf
können Sie zur Laufzeit überprüfen, ob hardwaregestützter Speicher verfügbar ist. Rufen Sie dazu
KeyChain.IsBoundKeyAlgorithm()
Manifestdeklarationen
Deklarierbare erforderliche Funktionen
Die folgenden Werte werden jetzt in <uses-feature>
unterstützt
-Element, damit deine App nur auf Geräten installiert wird, die die entsprechenden Funktionen bieten
die Ihre App braucht.
FEATURE_APP_WIDGETS
- Erklärt, dass deine App ein App-Widget bietet und nur auf Geräten installiert werden darf, die
einen Startbildschirm oder eine ähnliche Stelle enthalten, an der Nutzer App-Widgets einbetten können.
Beispiel:
<uses-feature android:name="android.software.app_widgets" android:required="true" />
FEATURE_HOME_SCREEN
- Erklärt, dass deine App als Ersatz für den Startbildschirm fungiert und nur auf
Geräte, die Startbildschirm-Apps von Drittanbietern unterstützen.
Beispiel:
<uses-feature android:name="android.software.home_screen" android:required="true" />
FEATURE_INPUT_METHODS
- Erklärt, dass deine App eine benutzerdefinierte Eingabemethode bietet (eine mit
InputMethodService
entwickelte Tastatur) und nur auf Geräten installiert werden sollte, die Eingabemethoden von Drittanbietern unterstützt. Beispiel:<uses-feature android:name="android.software.input_methods" android:required="true" />
FEATURE_BLUETOOTH_LE
- Erklärt, dass deine App Bluetooth Low Energy APIs verwendet und nur auf Geräten installiert werden sollte
die über Bluetooth Low Energy mit anderen Geräten kommunizieren können.
Beispiel:
<uses-feature android:name="android.software.bluetooth_le" android:required="true" />
Nutzerberechtigungen
Die folgenden Werte werden jetzt in <uses-permission>
unterstützt
zur Deklaration der
Berechtigungen, die deine App für den Zugriff auf bestimmte APIs benötigt.
BIND_NOTIFICATION_LISTENER_SERVICE
- Erforderlich, um die neuen
NotificationListenerService
APIs zu verwenden. SEND_RESPOND_VIA_MESSAGE
- Erforderlich, um
ACTION_RESPOND_VIA_MESSAGE
zu erhalten die Nutzerabsicht verstehen.
Eine detaillierte Ansicht aller API-Änderungen in Android 4.3 finden Sie in der Bericht zu API-Unterschieden