APIs unter Android 4.3

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:

  • Zugriff auf die Konten des Inhabers über ein eingeschränktes Profil erlauben.

    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 Konten nicht geändert werden können, deaktivieren Sie bestimmte Funktionen.

    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.

  • Deaktivieren Sie Ihre App, wenn Sie nicht auf private Konten zugreifen können.

    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.

    Abbildung 1: Layout mit Clipgrenzen (Standardeinstellung).

    Abbildung 2: Layout mit optischen Grenzen

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

    Abbildung 3: Vergrößerte Ansicht der 9-Patch-Schaltfläche Holo mit optischen Grenzen.

    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