APIs unter Android 4.0

API-Level:14

Android 4.0 (ICE_CREAM_SANDWICH) ist ein wichtiges Plattformrelease, das eine Vielzahl neuer Funktionen für Nutzer und Apps bietet zu entwickeln. Neben den unten beschriebenen neuen Funktionen und APIs ist Android 4.0 eine wichtige Plattform-Release, da es die umfangreichen APIs und holografischen Themes aus Android 3.x bringt. auf kleinere Bildschirme übertragen werden. Als App-Entwickler verfügen Sie nun über eine einzige Plattform und ein einheitliches API-Framework. mit dem du deine App mit einem einzigen APK entwickeln und veröffentlichen kannst, das eine optimierte User Experience für Handys, Tablets und andere Geräte, wenn die gleiche Version von Android: Android 4.0 (API-Level 14) oder höher

Für Entwickler ist die Android 4.0-Plattform als herunterladbare Komponente für das Android SDK. Die herunterladbare Plattform umfasst eine Android-Bibliothek und ein System-Image sowie eine Reihe von Emulator-Skins mehr. Um mit dem Entwickeln oder Testen auf Android 4.0 zu beginnen, Verwenden Sie den Android SDK Manager, um die Plattform in Ihr SDK herunterzuladen.

API-Übersicht

In den folgenden Abschnitten erhalten Sie einen technischen Überblick über die neuen APIs in Android 4.0.

APIs für soziale Netzwerke in Contacts Provider

Die vom Anbieter ContactsContract definierten Kontakt-APIs wurden um neue sozialorientierte Funktionen wie ein persönliches Profil für den Geräteeigentümer und die Möglichkeit für Nutzer, einzelne Kontakte zu sozialen Netzwerken einzuladen, die auf der .

Nutzerprofil

Android enthält jetzt ein persönliches Profil, das den Geräteeigentümer repräsentiert, wie von den Tabelle „ContactsContract.Profile“. Social Apps, die eine Nutzeridentität bewahren kann zu den Profildaten des Nutzers beitragen, indem ein neuer ContactsContract.RawContacts-Eintrag in ContactsContract.Profile erstellt wird. Unformatierte Kontakte, die den Gerätenutzer repräsentieren, Sie gehören nicht zu der herkömmlichen Tabelle mit unverarbeiteten Kontakten, die durch den URI ContactsContract.RawContacts definiert ist. müssen Sie stattdessen einen unverarbeiteten Profilkontakt der Tabelle unter CONTENT_RAW_CONTACTS_URI. RAW Kontakte in dieser Tabelle werden dann in dem für den Nutzer sichtbaren Profil „Ich“ zusammengefasst.

Das Hinzufügen eines neuen unbearbeiteten Kontakts für das Profil erfordert die Berechtigung „android.Manifest.permission#WRITE_PROFILE“. Um aus dem Profil zu lesen, -Tabelle enthält, müssen Sie die Berechtigung "android.Manifest.permission#READ_PROFILE" anfordern. Sie können jedoch die meisten Apps das Nutzerprofil nicht lesen müssen, auch wenn sie Daten zum zu erstellen. Das Lesen des Benutzerprofils ist eine vertrauliche Berechtigung, und Sie sollten erwarten, dass Nutzende skeptisch gegenüber Apps sind, die diese Anforderung anfordern.

Einladungsabsicht

Die Intent-Aktion INVITE_CONTACT lässt eine App zu , um eine Aktion aufzurufen, die angibt, dass der Nutzer einem sozialen Netzwerk einen Kontakt hinzufügen möchte. Die App der Empfänger der App sie nutzt, um den angegebenen Kontakt einzuladen soziales Netzwerk. Die meisten Apps sind am Empfänger-Ende dieses Vorgangs. Beispiel: Der Parameter Die integrierte People-App ruft den Einladungs-Intent auf, wenn der Nutzer „Add connection“ auswählt für eine bestimmte Social App, die in den Kontaktdaten einer Person aufgeführt ist.

Um Ihre App als unter „Verbindung hinzufügen“ sichtbar zu machen muss Ihre App einen Synchronisierungsadapter bereitstellen, Kontaktinformationen aus Ihrem sozialen Netzwerk synchronisieren. Dann müssen Sie dem System mitteilen, Die Anwendung reagiert auf den Intent INVITE_CONTACT, indem sie Fügen Sie der Konfigurationsdatei für die Synchronisierung Ihrer App das Attribut inviteContactActivity hinzu, mit einem vollständig qualifizierter Name der Aktivität, die das System starten soll, wenn der Einladungs-Intent gesendet wird. Die gestartete Aktivität kann dann den URI für den betreffenden Kontakt aus dem und führen die erforderlichen Schritte durch, um diesen Kontakt zum Netzwerk einzuladen oder die Person zum die Verbindungen der Nutzenden.

Große Fotos

Android unterstützt jetzt Fotos mit hoher Auflösung für Kontakte. Wenn Sie jetzt ein Foto in eine wird dieser vom System in eine 96-x-96-Miniaturansicht (wie zuvor) und 256 x 256 "Foto anzeigen" die in einem neuen dateibasierten Fotospeicher abgelegt wird (die genauen Abmessungen, vom System in Zukunft variieren kann. Sie können einem Kontakt ein großes Foto hinzufügen, indem Sie Foto in der üblichen Spalte PHOTO einer Datenzeile, die das System dann in die entsprechende Miniaturansicht verarbeitet und das Foto anzeigt Datensätze.

Feedback zur Kontaktnutzung

Mit den neuen ContactsContract.DataUsageFeedback APIs können Sie Wie oft die Nutzenden bestimmte Methoden zur Kontaktaufnahme mit Personen verwenden, z. B. wie oft die Nutzenden jede Telefonnummer oder E-Mail-Adresse. Diese Informationen tragen dazu bei, das Ranking für jeden Kontakt zu verbessern Methode, die den einzelnen Personen zugeordnet ist, und bietet bessere Vorschläge für die Kontaktaufnahme mit den einzelnen Personen.

Kalenderanbieter

Mit den neuen Kalender-APIs können Sie Kalender, Termine, Teilnehmer, Erinnerungen und Benachrichtigungen, die im Kalenderanbieter gespeichert sind.

Diese APIs können von einer Vielzahl von Apps und Widgets verwendet werden, um Kalendertermine zu lesen und zu ändern. Sie können jedoch einige der überzeugendsten Anwendungsfälle sind Synchronisierungsadapter, die den Kalender des Nutzers von andere Kalenderdienste zusammen mit dem Kalenderanbieter nutzen, um einen einheitlichen Standort für alle Ereignisse des Nutzers. So werden Google Kalender-Termine mit dem Kalenderanbieter synchronisiert: den Google Kalender-Synchronisierungsadapter verwenden, sodass diese Termine über die integrierte Android-Funktion Kalender App.

Das Datenmodell für Kalender und terminbezogene Informationen im Kalenderanbieter ist definiert durch CalendarContract. Alle Kalenderdaten des Nutzers werden in einem Anzahl der Tabellen, die durch verschiedene abgeleitete Klassen von CalendarContract definiert werden:

  • Die Tabelle CalendarContract.Calendars enthält die kalenderspezifischen Informationen. Jede Zeile in dieser Tabelle enthält die Details zu einem einzelnen Kalender, z. B. den Namen, Farbe, Synchronisierungsinformationen usw.
  • Die Tabelle CalendarContract.Events enthält ereignisspezifische Informationen. Jede Zeile in dieser Tabelle enthält die Informationen zu einem einzelnen Ereignis, z. B. Termintitel, Ort, Startzeit, Ende usw. Der Termin kann einmalig oder wiederkehrend stattfinden. und zwar mehrmals. Teilnehmer, Erinnerungen und erweiterte Properties werden in separaten Tabellen und verwenden Sie die _ID des Termins, um sie mit dem Termin zu verknüpfen.
  • Die Tabelle CalendarContract.Instances enthält die Start- und Endzeit für eines Ereignisses. Jede Zeile in dieser Tabelle steht für ein einzelnes Vorkommen. Für einmalige Termine gibt es eine 1:1-Zuordnung von Instanzen zu Ereignissen. Bei wiederkehrenden Terminen werden mehrere Zeilen automatisch generiert wurde, um den mehrfachen Vorkommen dieses Ereignisses zu entsprechen.
  • Die Tabelle CalendarContract.Attendees enthält den Veranstaltungsteilnehmer oder Gast Informationen. Jede Zeile steht für einen einzelnen Gast eines Termins. Sie gibt den Gasttyp an, Person und die Reaktion der Person auf das Ereignis.
  • Die Tabelle CalendarContract.Reminders enthält die Benachrichtigungsdaten. Jede Zeile steht für eine einzelne Benachrichtigung für ein Ereignis. Ein Termin kann mehrere Erinnerungen haben. Die Anzahl der Erinnerungen pro Termin sind in MAX_REMINDERS angegeben, der vom Synchronisierungsadapter festgelegt wird, der Eigentümer des angegebenen Kalenders ist. Erinnerungen werden in Minuten vor dem Termin angegeben. und geben Sie eine Alarmmethode an, z. B. über eine Warnung, E-Mail oder SMS Nutzenden.
  • Die Tabelle CalendarContract.ExtendedProperties enthält intransparente Datenfelder die vom Synchronisierungsadapter verwendet werden. Der Anbieter unternimmt nur Elemente in dieser Tabelle, um diese zu löschen wenn die zugehörigen Termine gelöscht werden.

Um mit dem Kalenderanbieter auf die Kalenderdaten eines Nutzers zugreifen zu können, muss Ihre Anwendung die Berechtigung READ_CALENDAR (für Lesezugriff) und WRITE_CALENDAR (für Schreibzugriff).

Ereignis-Intent

Wenn Sie dem Kalender des Nutzers lediglich einen Termin hinzufügen möchten, können Sie einen ACTION_INSERT-Intent mit den von Events.CONTENT_URI definierten Daten verwenden, um einen in der Kalender App, mit der neue Termine erstellt werden. Für die Verwendung des Intents sind keine und Sie können mit den folgenden Extras Termindetails angeben:

Mailboxanbieter

Mit dem neuen Mailbox-Anbieter können Anwendungen Mailboxnachrichten zur Gerät, um alle Mailboxnachrichten des Nutzers in einer einzigen visuellen Präsentation zu präsentieren. Beispiel: kann es sein, dass ein Nutzer mehrere Mailbox-Quellen hat, eine vom Dienstanbieter und die anderen über VoIP oder eine alternative Sprachausgabe . Diese Apps können die Voicemail Provider APIs verwenden, um dem Gerät ihre Mailboxnachrichten hinzuzufügen. Die Die integrierte Telefon App zeigt dem Nutzer dann alle Mailboxnachrichten in einer einheitlichen Präsentation an. Obwohl nur die Telefon App des Systems die einzige App ist, die alle Mailboxnachrichten lesen kann, kann jede Anwendung, die Voicemail bereitstellt, diejenigen lesen, die sie dem System hinzugefügt hat, jedoch nicht Mailboxnachrichten von anderen Diensten lesen.

Da die APIs derzeit Drittanbieter-Apps nicht erlauben, alle Mailboxnachrichten der die Mailbox APIs nur für Drittanbieter-Apps mit Mailbox für Nutzende zu liefern.

Die Klasse VoicemailContract definiert den Contentanbieter für die Mailbox-Übersteller Die abgeleiteten Klassen VoicemailContract.Voicemails und VoicemailContract.Status stellen Tabellen bereit, in denen Anwendungen Mailboxdaten zum Speichern auf dem Gerät einfügen Ein Beispiel für eine Mailbox-Anbieter-App finden Sie in der Mailbox-Anbieter Demo

Multimedia

Mit Android 4.0 wurden mehrere neue APIs für Anwendungen hinzugefügt, die mit Medien wie Fotos interagieren, Videos und Musik.

Medieneffekte

Mit dem neuen Framework für Medieneffekte können Sie eine Vielzahl von visuellen Effekten auf Bilder und Videos. Mit Bildeffekten können Sie z. B. rote Augen ganz einfach korrigieren, ein Bild in Graustufen umwandeln Helligkeit anpassen, Sättigung anpassen, Bilder drehen, einen Fischaugeneffekt anwenden und vieles mehr. Die das System die Verarbeitung aller Effekte auf der GPU durchführt, um maximale Leistung zu erzielen.

Für maximale Leistung werden Effekte direkt auf OpenGL-Texturen angewendet, sodass Ihre Anwendung muss einen gültigen OpenGL-Kontext haben, bevor die Effect APIs verwendet werden können. Die Texturen, auf die Sie sie anwenden von Bitmaps, Videos oder sogar von der Kamera stammen. Es gibt jedoch bestimmte Einschränkungen, Texturen müssen folgende Anforderungen erfüllen:

  1. Sie müssen an ein GL_TEXTURE_2D-Texturbild gebunden sein
  2. Sie müssen mindestens eine Mipmap-Ebene enthalten

Ein Effect-Objekt definiert einen einzelnen Medieneffekt, auf den du dich anwenden kannst. ein Bild-Frame. Der grundlegende Workflow zum Erstellen einer Effect sieht so aus:

  1. Rufe EffectContext.createWithCurrentGlContext() über deinen OpenGL ES 2.0-Kontext auf.
  2. Verwenden Sie die zurückgegebene EffectContext, um EffectContext.getFactory() aufzurufen. Dabei wird eine Instanz zurückgegeben. von EffectFactory.
  3. Rufen Sie createEffect() auf und übergeben Sie ein Effektname von @link android.media.effect.EffectFactory}, z. B. EFFECT_FISHEYE oder EFFECT_VIGNETTE.

Sie können die Parameter eines Effekts anpassen, indem Sie setParameter() aufrufen und einen Parameternamen und einen Parameterwert übergeben. Für jeden Effekttyp verschiedene Parameter, die mit dem Namen des Effekts dokumentiert sind. Beispiel: EFFECT_FISHEYE hat einen Parameter für die scale des Verzerrungen.

Um einen Effekt auf eine Textur anzuwenden, rufen Sie apply() auf der Effect und übergeben Sie die Eingabetextur, ihre Breite und Höhe sowie die Ausgabe Textur. Die Eingabetextur muss an eine GL_TEXTURE_2D-Textur gebunden sein Image (normalerweise durch Aufrufen der glTexImage2D() . Sie können mehrere Mipmap-Ebenen bereitstellen. Wenn die Ausgabetextur nicht an eine Texturbild, wird es durch den Effekt automatisch als GL_TEXTURE_2D und mit einer Mipmap-Ebene (0) verbunden, die denselben Größe als Eingabe.

Alle in EffectFactory aufgeführten Effekte werden garantiert unterstützt. Einige zusätzliche Effekte aus externen Bibliotheken werden jedoch nicht von allen Geräten unterstützt. Sie müssen also zuerst überprüfen, ob der gewünschte Effekt aus der externen Bibliothek unterstützt wird, indem Sie den Aufruf isEffectSupported()

Ferngesteuerter Client

Mit der neuen RemoteControlClient können Mediaplayer die Wiedergabe aktiviert werden Steuerung über Clients für die Fernbedienung, z. B. den Sperrbildschirm des Geräts. Mediaplayer können außerdem Informationen zu den Medien, die gerade auf der Fernbedienung wiedergegeben werden, z. B. der Titel und Albumcover.

Instanziiere zum Aktivieren von Fernbedienungs-Clients für deinen Mediaplayer ein RemoteControlClient mit seinem Konstruktor und übergib ein PendingIntent, das ACTION_MEDIA_BUTTON überträgt. Im Intent muss auch die explizite BroadcastReceiver-Komponente in deiner App deklariert werden, die das ACTION_MEDIA_BUTTON-Ereignis verarbeitet.

Um anzugeben, welche Mediensteuerungseingaben dein Player verarbeiten kann, musst du setTransportControlFlags() auf deinem RemoteControlClient übergeben und eine Reihe von FLAG_KEY_MEDIA_*-Flags übergeben, z. B.: FLAG_KEY_MEDIA_PREVIOUS und FLAG_KEY_MEDIA_NEXT.

Anschließend müssen Sie RemoteControlClient registrieren, indem Sie sie an MediaManager.registerRemoteControlClient() übergeben. Nach der Registrierung empfängt der Übertragungsempfänger, den Sie bei der Instanziierung von RemoteControlClient angegeben haben, ACTION_MEDIA_BUTTON Ereignisse ausgelöst, wenn eine Taste auf einer Fernbedienung gedrückt wird. Der Intent, den Sie erhalten, enthält das KeyEvent für den gedrückten Medienschlüssel, den Sie mit getParcelableExtra(Intent.EXTRA_KEY_EVENT) aus dem Intent abrufen können.

Wenn Sie auf der Fernbedienung Informationen zum wiedergegebenen Medium aufrufen möchten, rufen Sie editMetaData() auf und fügen Sie Metadaten zum zurückgegebenen RemoteControlClient.MetadataEditor. Sie können eine Bitmap für Medien-Artwork bereitstellen, numerische Informationen wie die verstrichene Zeit und Textinformationen wie den Titeltitel. Für Informationen zu verfügbaren Schlüsseln finden Sie unter den METADATA_KEY_*-Flags in MediaMetadataRetriever.

Ein Implementierungsbeispiel finden Sie im Random Music Player, der stellt eine Kompatibilitätslogik bereit, die den Remote Control Client unter Android 4.0 ermöglicht. und unterstützen dabei weiterhin Geräte mit Android 2.1.

Mediaplayer

  • Für das Streamen von Onlinemedien von MediaPlayer ist jetzt die Berechtigung INTERNET erforderlich. Wenn Sie MediaPlayer für Folgendes verwenden: aus dem Internet wiedergeben, achten Sie darauf, die INTERNET Berechtigung für dein Manifest. Andernfalls funktioniert die Medienwiedergabe mit Android nicht mehr. 4.0
  • Mit setSurface() können Sie eine Surface so definieren, dass sie sich als Videosenke verhält.
  • setDataSource() bietet Ihnen folgende Möglichkeiten: Zusätzliche HTTP-Header mit Ihrer Anfrage senden, was für HTTP(S)-Livestreaming nützlich sein kann
  • Beim HTTP(S)-Livestreaming werden jetzt HTTP-Cookies über Anfragen hinweg berücksichtigt.

Medientypen

Android 4.0 unterstützt jetzt:

  • HTTP/HTTPS-Live-Streaming-Protokoll Version 3
  • ADTS-Roh-AAC-Audiocodierung
  • WEBP-Bilder
  • Matroska-Video

Weitere Informationen finden Sie unter Unterstützte Medien Formate:

Kamera

Die Camera-Klasse enthält jetzt APIs zur Gesichtserkennung und Steuerung Mess- und Fokusbereiche.

Gesichtserkennung

Kamera-Apps können jetzt ihre Funktionen durch die Gesichtserkennungs-APIs von Android verbessern. nur das Gesicht einer Person, sondern auch bestimmte Gesichtsmerkmale wie Augen und Mund erkennen.

Damit in deiner Kamera-App Gesichter erkannt werden, musst du eine Camera.FaceDetectionListener registrieren, indem du setFaceDetectionListener() aufrufst. Sie können dann Kameraoberfläche und beginne mit der Gesichtererkennung, indem du startFaceDetection() aufrufst.

Wenn das System ein oder mehrere Gesichter im Kamerabereich erkennt, wird der onFaceDetection()-Callback in deinem Implementierung von Camera.FaceDetectionListener, einschließlich eines Arrays Camera.Face-Objekte.

Eine Instanz der Klasse Camera.Face bietet verschiedene Informationen über das erkannte Gesicht, einschließlich:

  • Ein Rect, der die Grenzen des Gesichts in Bezug auf den Aktuelles Sichtfeld
  • Eine Ganzzahl zwischen 1 und 100, die angibt, wie sicher das System ist, dass das Objekt ein menschliches Gesicht
  • Eine eindeutige ID, mit der mehrere Gesichter erfasst werden können
  • Mehrere Point-Objekte, die anzeigen, wo sich die Augen und der Mund befinden gelegen

Hinweis:Die Gesichtserkennung wird möglicherweise auf einigen Geräte. Rufen Sie deshalb getMaxNumDetectedFaces() auf und vergewissern Sie sich, dass die Rücksendung Wert größer als null ist. Außerdem unterstützen einige Geräte die Erkennung von Augen und Mund möglicherweise nicht, In diesem Fall sind diese Felder im Camera.Face-Objekt null.

Fokus- und Messbereiche

Kamera-Apps können jetzt die Bereiche steuern, die die Kamera für den Fokus und für die Messung von Weiß verwendet Guthaben und die automatische Belichtung. Beide Funktionen verwenden die neue Klasse Camera.Area, um anzugeben, Der Bereich des aktuellen Kamerabilds, der fokussiert oder gemessen werden soll. Eine Instanz der Camera.Area-Klasse definiert die Grenzen des Gebiets mit einem Rect und dem Gewicht der Fläche, das angibt, wie wichtig dieser Bereich ist. Fläche im Verhältnis zu anderen infrage kommenden Bereichen – mit einer Ganzzahl.

Bevor Sie einen Fokus- oder Messbereich festlegen, sollten Sie zuerst getMaxNumFocusAreas() bzw. getMaxNumMeteringAreas() aufrufen. Wenn diese Null zurückgeben, Das Gerät unterstützt die entsprechende Funktion nicht.

Wenn Sie den zu verwendenden Fokus- oder Messbereich festlegen möchten, rufen Sie einfach setFocusAreas() oder setMeteringAreas() auf. Jedes nimmt ein List von Camera.Area-Objekten an, die die zu berücksichtigenden Bereiche angeben. für den Fokus oder die Messung. Beispielsweise können Sie eine Funktion implementieren, mit der Nutzende die Fokusbereich festlegen, indem Sie einen Bereich in der Vorschau berühren, den Sie dann in ein Camera.Area-Objekt übersetzen und festlegen, dass die Kamera auf diesen Bereich der Szene fokussieren soll. Der Fokus oder die Belichtung in diesem Bereich werden kontinuierlich aktualisiert, wenn sich die Szene im Bereich ändert.

Kontinuierlicher Autofokus für Fotos

Sie können jetzt beim Aufnehmen von Fotos die kontinuierliche Autofokussierung (CAF) aktivieren. So aktivieren Sie CAF in Ihrem Kamera-App, Pass FOCUS_MODE_CONTINUOUS_PICTURE an setFocusMode(). Bereit zum Aufnehmen Foto, ruf autoFocus() an. Dein Camera.AutoFocusCallback erhält sofort einen Rückruf mit der Information, Fokus erreicht wurde. Um CAF nach Erhalt des Rückrufs fortzusetzen, musst du cancelAutoFocus() aufrufen.

Hinweis:Der fortlaufende Autofokus wird auch bei der Aufnahme unterstützt. mit FOCUS_MODE_CONTINUOUS_VIDEO verwendet, in API-Ebene 9 hinzugefügt.

Weitere Kamerafunktionen

  • Während der Videoaufnahme kannst du jetzt takePicture() anrufen, um ein Foto zu speichern, ohne die Videositzung zu unterbrechen. Zuvor sollten Sie sich isVideoSnapshotSupported() anrufen, um zu prüfen, ob die Hardware unterstützt.
  • Du kannst die automatische Belichtung und den Weißabgleich jetzt mit setAutoExposureLock() und setAutoWhiteBalanceLock() sperren, dass sich diese Eigenschaften ändern.
  • Du kannst jetzt setDisplayOrientation() aufrufen, während die Kameravorschau läuft. Bisher konnten Sie das bevor Sie die Vorschau starten. Sie können die Ausrichtung jetzt aber jederzeit ändern.

Kamera-Übertragungsabsichten

  • Camera.ACTION_NEW_PICTURE: Dies bedeutet, dass der Nutzer ein neues Foto aufgenommen hat. Die integrierte Kamera-App ruft diese nachdem ein Foto aufgenommen wurde, und Kamera-Apps von Drittanbietern sollten dies ebenfalls nachdem Sie das Foto aufgenommen haben.
  • Camera.ACTION_NEW_VIDEO: Das bedeutet, dass der Nutzer ein neues Video aufgenommen hat. Die integrierte Kamera-App ruft diese nachdem ein Video aufgezeichnet wurde. Kamera-Apps von Drittanbietern sollten diese Absicht ebenfalls übertragen. nachdem Sie ein Video aufgenommen haben.

Android Beam (NDEF Push mit NFC)

Android Beam ist eine neue NFC-Funktion, mit der NDEF-Nachrichten von einem Gerät an ein anderer (Prozess, der auch als „NDEF Push“ bezeichnet wird). Die Datenübertragung wird eingeleitet, wenn zwei Android-Geräte, die Android Beam unterstützen, befinden sich in unmittelbarer Nähe (ca. 4 cm), in der Regel mit ihre Rücken berührt haben. Die Daten in der NDEF-Nachricht können beliebige Daten enthalten, die Sie teilen möchten zwischen Geräten. Die Kontakte App teilt beispielsweise Kontakte, YouTube teilt Videos und der Browser teilt URLs über Android Beam.

Um mit Android Beam Daten zwischen Geräten zu übertragen, müssen Sie eine NdefMessage mit den Informationen erstellen, die Sie während Ihrer Aktivität teilen möchten. im Vordergrund. Anschließend musst du die NdefMessage in einem von zwei Schritten an das System übergeben. Möglichkeiten:

  • Definieren Sie eine einzelne NdefMessage, die während der Aktivität übertragen werden soll:

    Du kannst jederzeit setNdefPushMessage() anrufen, um Folgendes festzulegen: auf die Nachricht, die Sie senden möchten. Du kannst beispielsweise diese Methode aufrufen und sie während der onCreate() deiner Aktivität an deine NdefMessage übergeben. . Dann, wenn Android Beam mit einem anderen Gerät aktiviert wird, während die Aktivität im im Vordergrund sendet das System den NdefMessage an das andere Gerät.

  • Definieren Sie die NdefMessage, die bei der Initiierung von Android Beam übertragen werden soll:

    Implementieren Sie NfcAdapter.CreateNdefMessageCallback. Implementierung der createNdefMessage() gibt den NdefMessage zurück, den Sie senden möchten. Übergeben Sie dann die NfcAdapter.CreateNdefMessageCallback-Implementierung an setNdefPushMessageCallback().

    Das ist der Fall, wenn Android Beam mit einem anderen Gerät aktiviert wird, während Ihre Aktivität im im Vordergrund ruft das System createNdefMessage() auf, die NdefMessage, die Sie senden möchten. Auf diese Weise kannst du festlegen, dass NdefMessage nur dann liefert, wenn Android Beam initiiert wird, falls der Inhalt der Nachricht kann sich während der Lebensdauer der Aktivität ändern.

Falls Sie einen bestimmten Code ausführen möchten, nachdem das System Ihre NDEF erfolgreich übermittelt hat an das andere Gerät senden, können Sie NfcAdapter.OnNdefPushCompleteCallback implementieren und mit setNdefPushCompleteCallback() festlegen. Das System Rufen Sie nach der Zustellung der Nachricht dann onNdefPushComplete() auf.

Auf dem empfangenden Gerät sendet das System NDEF-Push-Nachrichten auf ähnliche Weise wie normale NFC. Tags. Das System ruft einen Intent mit dem ACTION_NDEF_DISCOVERED auf , um eine Aktivität zu starten, wobei entweder eine URL oder ein MIME-Typ gemäß dem ersten NdefRecord in NdefMessage festgelegt ist. Für die Aktivität, die Sie können Sie Intent-Filter für die URLs oder MIME-Typen angeben, die für Ihre App wichtig sind. Weitere Informationen Informationen zur Tag-Auslösung finden Sie im NFC-Entwicklerleitfaden.

Wenn Ihre NdefMessage einen URI enthalten soll, können Sie jetzt ganz einfach createUri, um einen neuen NdefRecord basierend auf einem String oder einem Uri-Objekt zu erstellen. Wenn der URI gleich ein spezielles Format haben, das Ihre App auch während eines Android Beam-Events empfangen soll, können Sie sollten Sie einen Intent-Filter für Ihre Aktivität mit demselben URI-Schema erstellen, um den Parameter eingehende NDEF-Nachricht.

Außerdem sollten Sie einen „Android application record“ (Android-Anwendungseintrag) übergeben. mit NdefMessage in um sicherzustellen, dass Ihre Anwendung die eingehende NDEF-Nachricht verarbeitet, auch wenn andere nach derselben Intent-Aktion filtern. So erstellen Sie einen Eintrag für Android-Apps: createApplicationRecord() wird aufgerufen, übergeben den Paketnamen Ihrer App. Wenn das andere Gerät die NDEF-Nachricht mit der Anwendungsdatensatz und mehrere Anwendungen enthalten Aktivitäten, die den angegebenen Intent verarbeiten, Das System stellt die Nachricht immer an die Aktivität in Ihrer Anwendung zu (basierend auf dem übereinstimmenden App-Eintrag). Ist Ihre App derzeit nicht auf dem Zielgerät installiert, verwendet das System den Android-App-Datensatz, um Google Play zu starten und den Nutzer zum um sie zu installieren.

Wenn Ihre Anwendung keine NFC APIs für NDEF-Push-Nachrichten verwendet, stellt Android eine Standardverhalten: Wenn Ihre App auf einem Gerät im Vordergrund ausgeführt wird und Android Beam mit einem anderen Android-Gerät aufgerufen wird, empfängt das andere Gerät eine NDEF-Nachricht mit einer Ein Android-App-Eintrag, der Ihre App identifiziert. Wenn das empfangende Gerät installiert haben, wird sie vom System gestartet. Falls sie nicht installiert ist, wird Google Play geöffnet und zu Ihrer App, um sie zu installieren.

Weitere Informationen zu Android Beam und anderen NFC-Funktionen finden Sie im Entwicklerleitfaden NFC Basics. Beispielcode mit Android Beam finden Sie in der Android Beam-Demo

WLAN-P2P

Android unterstützt jetzt Wi-Fi-Peer-to-Peer-Verbindungen (P2P) zwischen Android-Geräten und andere Gerätetypen (entsprechend der Richtlinie Wi-Fi DirectTM der Wi-Fi Alliance Zertifizierungsprogramms) ohne Hotspot oder Internetverbindung. Das Android-Framework bietet eine eine Reihe von Wi-Fi P2P APIs, mit denen Sie andere Geräte finden und sich mit ihnen verbinden können, wenn jedes Gerät unterstützt Wi-Fi P2P und kommunizieren über eine schnelle Verbindung über weitaus größere Entfernungen Bluetooth-Verbindung.

Das neue Paket android.net.wifi.p2p enthält alle APIs zur Ausführung von Peer-to-Peer-Verbindungen. mit dem WLAN verbunden sind. Die primäre Klasse, mit der Sie arbeiten müssen, ist WifiP2pManager. Sie können sie durch Aufrufen von getSystemService(WIFI_P2P_SERVICE) erwerben. WifiP2pManager enthält APIs, mit denen Sie Folgendes tun können:

  • Initialisieren Sie Ihre Anwendung für P2P-Verbindungen, indem Sie initialize() aufrufen
  • Wenn du discoverPeers() anrufst, kannst du Geräte in der Nähe finden
  • Starten Sie eine P2P-Verbindung, indem Sie connect() aufrufen
  • Und vieles mehr

Darüber hinaus sind mehrere andere Schnittstellen und Klassen erforderlich, z. B.:

  • Über die WifiP2pManager.ActionListener-Schnittstelle erhalten Sie Callbacks, wenn ein Vorgang wie das Erkennen von Peers oder das Herstellen einer Verbindung zu ihnen erfolgreich ist oder fehlschlägt.
  • Mit der WifiP2pManager.PeerListListener-Schnittstelle empfangen Sie Informationen über ähnliche Mitbewerber. Der Callback stellt ein WifiP2pDeviceList bereit, mit dem du ein WifiP2pDevice-Objekt für jedes Gerät in Reichweite abrufen und Informationen wie den Gerätenamen, die Adresse, den Gerätetyp, die vom Gerät unterstützten WPS-Konfigurationen und mehr.
  • Über die WifiP2pManager.GroupInfoListener-Schnittstelle können Sie Folgendes tun: Informationen über eine P2P-Gruppe erhalten. Der Callback stellt ein WifiP2pGroup-Objekt bereit, das Gruppeninformationen wie den Eigentümer, den Netzwerkname und Passphrase.
  • Mit der WifiP2pManager.ConnectionInfoListener-Oberfläche können Sie um Informationen über die aktuelle Verbindung zu erhalten. Der Callback stellt ein WifiP2pInfo-Objekt bereit, das Informationen enthält, z. B. ob eine Gruppe und wer der Gruppeneigentümer ist.

Zur Verwendung der Wi-Fi P2P APIs muss Ihre App die folgenden Nutzerberechtigungen anfordern:

  • ACCESS_WIFI_STATE
  • CHANGE_WIFI_STATE
  • INTERNET (obwohl deine App technisch keine Verbindung herstellt) mit dem Internet verbunden sind, erfordert die Kommunikation mit Wi-Fi-P2P-Peers über Standard-Java-Sockets Internet. Berechtigung) erhalten.

Das Android-System überträgt während bestimmter WLAN-P2P-Ereignisse auch verschiedene Aktionen:

Weitere Informationen finden Sie in der WifiP2pManager-Dokumentation. Ebenfalls sieh dir die WLAN-P2P-Demo Beispielanwendung.

Bluetooth-Gesundheitsgeräte

Android unterstützt jetzt Bluetooth Health Profile-Geräte, sodass Sie Apps erstellen können, die Bluetooth zur Kommunikation mit Gesundheitsgeräten, die Bluetooth unterstützen, wie Herzfrequenzmessern, Blutmessgeräte, Thermometer und Waagen.

Ähnlich wie bei herkömmlichen Headsets und Geräten mit A2DP-Profil musst du getProfileProxy() mit einem BluetoothProfile.ServiceListener und dem Profiltyp HEALTH aufrufen, um eine Verbindung mit dem Profil herzustellen Proxy-Objekt enthält.

Sobald Sie den Health Profile-Proxy (BluetoothHealth) erhalten haben, ist Folgendes erforderlich, um sich mit gekoppelten Gesundheitsgeräten zu verbinden und mit diesen zu kommunizieren. Bluetooth-Kurse:

  • BluetoothHealthCallback: Sie müssen diese Klasse erweitern und den Callback-Methoden, um Updates über Änderungen am Registrierungsstatus der App zu erhalten und Bluetooth-Kanalstatus.
  • BluetoothHealthAppConfiguration: Während der Callbacks an die BluetoothHealthCallback empfangen Sie eine Instanz dieses Objekts, das Konfigurationsinformationen zum verfügbaren Bluetooth-Gesundheitsgerät, das Sie verwenden müssen um verschiedene Vorgänge auszuführen, z. B. Verbindungen mit den BluetoothHealth APIs zu initiieren und zu beenden.

Weitere Informationen zur Verwendung des Bluetooth Health Profile findest du in der Dokumentation zu BluetoothHealth.

Bedienungshilfen

Android 4.0 verbessert die Barrierefreiheit für Nutzer mit Sehbehinderung durch den neuen Touchscreen-Modus und erweiterte APIs, mit denen Sie mehr Informationen zum Ansehen von Inhalten oder erweiterte Bedienungshilfen entwickeln.

Touch-Geste „Tippen & Entdecken“

Nutzer mit Sehbehinderung können jetzt den Bildschirm erkunden, indem sie einen Finger über die Bildschirm, um Sprachbeschreibungen des Inhalts zu hören. Der Touchscreen-Modus funktioniert wie virtuellen Cursor verwenden, können Screenreader den beschreibenden Text auf dieselbe Weise erkennen was Leser tun können, wenn sie mit einem Steuerkreuz oder Trackball navigieren, indem sie die zur Verfügung gestellten Informationen lesen. von android:contentDescription und setContentDescription() bei simulierter Mausbewegung . Also: Es ist wichtig, dass Sie beschreibenden Text für die Ansichten in Ihrem insbesondere für ImageButton, EditText, ImageView und andere Widgets, die von Natur aus keine beschreibenden Text.

Bedienungshilfen für Ansichten

Um die Informationen zu verbessern, die für Bedienungshilfen wie Screenreader verfügbar sind, können Sie Implementieren Sie neue Callback-Methoden für Bedienungshilfen-Ereignisse in Ihren benutzerdefinierten View-Komponenten.

Wichtig: Das Verhalten der Methode sendAccessibilityEvent() hat sich in Android geändert. 4.0 Wie bei der vorherigen Android-Version gilt: Wenn der Nutzer Bedienungshilfen auf dem Gerät aktiviert, und ein Eingabeereignis wie Klicken oder Bewegen des Mauszeigers erfolgt, wird die entsprechende Ansicht mit einem Aufruf an sendAccessibilityEvent() Zuvor wurden die Implementierung von sendAccessibilityEvent() Initialisieren Sie AccessibilityEvent und senden Sie es an AccessibilityManager. Das neue Verhalten beinhaltet einige zusätzliche , mit denen die Ansicht und ihre übergeordneten Elemente dem Ereignis weitere Kontextinformationen hinzufügen können:

  1. Wenn die Methoden sendAccessibilityEvent() und sendAccessibilityEventUnchecked() aufgerufen werden, an onInitializeAccessibilityEvent().

    Bei benutzerdefinierten View-Implementierungen kann onInitializeAccessibilityEvent() implementiert werden, um zusätzliche Informationen zur Barrierefreiheit an AccessibilityEvent anhängen, sollte aber auch die Super-Implementierung aufrufen, Standardinformationen wie die standardmäßige Inhaltsbeschreibung, den Artikelindex und mehr bereitstellen. Sie sollten diesem Callback jedoch keinen zusätzlichen Textinhalt hinzufügen.

  2. Nach der Initialisierung, wenn das Ereignis einer von mehreren Typen ist, die mit Text gefüllt werden sollten wird ein Aufruf an dispatchPopulateAccessibilityEvent() gesendet, wodurch die Ansicht verweist auf die onPopulateAccessibilityEvent() Callback des Nutzers an.

    Bei benutzerdefinierten Implementierungen von View sollte normalerweise onPopulateAccessibilityEvent() implementiert werden, um zusätzliche Textinhalt an AccessibilityEvent senden, wenn android:contentDescription-Text fehlt oder unzureichend. So fügen Sie dem AccessibilityEvent, getText() anrufen.add().

  3. An dieser Stelle gibt View das Ereignis in der Ansichtshierarchie nach oben weiter, indem es den Aufruf requestSendAccessibilityEvent() am Eltern-Ansicht. Jede Elternansicht hat dann die Möglichkeit, die Informationen zur Barrierefreiheit zu ergänzen, indem AccessibilityRecord hinzufügen, bis sie erreicht schließlich die Stammansicht, über die das Ereignis mit sendAccessibilityEvent() an die AccessibilityManager gesendet wird.

Zusätzlich zu den oben genannten neuen Methoden, die beim Erweitern der View-Klasse nützlich sind, kannst du diese Ereignis-Callbacks für jedes View auch abfangen, indem du AccessibilityDelegate erweiterst und für die Ansicht mit setAccessibilityDelegate(). Dabei wird der Aufruf der jeweiligen Bedienungshilfen in der Ansicht an die entsprechende Methode in Bevollmächtigten hinzufügen. Wenn die Datenansicht beispielsweise einen Aufruf von onPopulateAccessibilityEvent() erhält, wird dieser an den Aufruf Methode in View.AccessibilityDelegate. Alle Methoden, die nicht von werden die Bevollmächtigten für das Standardverhalten direkt an die Ansicht zurückgegeben. So können Sie nur Die für eine bestimmte Ansicht erforderlichen Methoden, ohne die View-Klasse zu erweitern.

Wenn Sie die Kompatibilität mit Android-Versionen vor 4.0 aufrechterhalten, aber gleichzeitig neuen Bedienungshilfen-APIs verfügbar ist, können Sie dies mit der aktuellen Version der Unterstützung für Barrierefreiheit im Internet tun. library (in Kompatibilitätspaket, r4) mit einer Reihe von Dienstprogrammklassen, die die neuen Bedienungshilfen-APIs in einem abwärtskompatiblen Design.

Bedienungshilfen

Wenn Sie eine Bedienungshilfe entwickeln: Die Informationen zu verschiedenen Bedienungshilfen-Ereignissen wurde erheblich erweitert, um Nutzern ein umfassenderes Feedback zur Barrierefreiheit zu ermöglichen. In Ereignisse werden anhand der Zusammensetzung der Aufrufe generiert, wodurch bessere Kontextinformationen geliefert und Sie ermöglichen es Bedienungshilfen, Ansichtshierarchien zu durchlaufen, um zusätzliche Ansichtsinformationen und mit Sonderfällen umgehen.

Wenn Sie eine Bedienungshilfe wie einen Screenreader entwickeln, können Sie auf zusätzliche Inhaltsinformationen und durchsuchen Sie Ansichtshierarchien mit dem folgenden Verfahren:

  1. Beim Empfang einer AccessibilityEvent von einer Anwendung AccessibilityEvent.getRecord() aufrufen, um eine bestimmte AccessibilityRecord abzurufen (es können mehrere Datensätze an den .
  2. Sie können entweder aus AccessibilityEvent oder einem einzelnen AccessibilityRecord getSource() aufrufen, um ein AccessibilityNodeInfo-Objekt abzurufen.

    Ein AccessibilityNodeInfo stellt einen einzelnen Knoten dar. des Fensterinhalts in einem Format darzustellen, mit dem Sie Informationen zur Barrierefreiheit abfragen können, Knoten. Das von AccessibilityEvent zurückgegebene AccessibilityNodeInfo-Objekt beschreibt die Ereignisquelle, während die Quelle aus AccessibilityRecord beschreibt den Vorgänger des Ereignisses. Quelle.

  3. Mit dem AccessibilityNodeInfo können Sie Informationen abfragen getParent() oder getChild() aufrufen, um die Ansicht zu durchlaufen und sogar untergeordnete Ansichten zum Knoten hinzufügen.

Damit sich Ihre Anwendung im System als Bedienungshilfe veröffentlichen kann, muss eine XML-Konfigurationsdatei deklarieren, die AccessibilityServiceInfo entspricht. Weitere Informationen zum Erstellen eines Bedienungshilfe finden Sie unter AccessibilityService und SERVICE_META_DATA für Informationen zur XML-Konfiguration.

Weitere APIs für Bedienungshilfen

Wenn Sie sich für den Status der Bedienungshilfen des Geräts interessieren, bietet das AccessibilityManager einige neue APIs, z. B.:

Rechtschreibprüfung

Mit dem neuen Framework für die Rechtschreibprüfung können Apps ähnliche Funktionen für die Rechtschreibprüfung erstellen wie die Eingabemethoden-Framework (für IMEs) verwendet wird. Um eine neue Rechtschreibprüfung zu erstellen, müssen Sie einen Dienst implementieren, erweitert SpellCheckerService und erweitern Sie die Klasse SpellCheckerService.Session, um Rechtschreibvorschläge basierend auf für Text, der von den Callback-Methoden der Schnittstelle bereitgestellt wird. In den SpellCheckerService.Session-Callback-Methoden müssen Sie den Parameter Rechtschreibvorschläge als SuggestionsInfo-Objekte.

Anwendungen mit einem Rechtschreibprüfungsdienst müssen die Berechtigung BIND_TEXT_SERVICE entsprechend dem Dienst deklarieren. Der Dienst muss außerdem einen Intent-Filter mit <action android:name="android.service.textservice.SpellCheckerService" /> als Intent-Aktion deklarieren und sollte Enthalten ein <meta-data>-Element, das Konfigurationsinformationen für die Schreibweise angibt Checker.

Beispiel ansehen Rechtschreibprüfung und Beispiel Rechtschreibprüfungs-Client App für Beispielcode.

Sprachausgabe-Engines

Die Text-to-Speech-APIs (TTS) von Android wurden erheblich erweitert, damit Anwendungen Benutzerdefinierte Sprachausgabe-Engines hingegen einfacher zu implementieren. neue APIs zur Auswahl einer Suchmaschine.

Sprachausgabe-Engines verwenden

In früheren Android-Versionen konnten Sie die TextToSpeech-Klasse verwenden Text-in-Sprache-Vorgänge mithilfe der vom System bereitgestellten TTS-Engine auszuführen oder eine benutzerdefinierte Suchmaschine mit setEngineByPackageName(). In Android 4.0 wurde die Methode setEngineByPackageName() eingestellt. Sie können nun die zu verwendende Suchmaschine mit einem neuen TextToSpeech-Konstruktor angeben, der den Paketnamen einer TTS-Engine akzeptiert.

Sie können die verfügbaren Sprachausgabe-Engines auch mit getEngines() abfragen. Diese Methode gibt eine Liste von TextToSpeech.EngineInfo-Objekten zurück, die Metadaten wie die der Engine Symbol, Label und Paketname.

Sprachausgabe-Engines erstellen

Bisher war es für benutzerdefinierte Engines erforderlich, dass die Engine mit einem undokumentierten nativen Header erstellt wurde. -Datei. In Android 4.0 gibt es eine vollständige Reihe von Framework-APIs zum Erstellen von TTS-Engines.

Für die grundlegende Einrichtung ist eine TextToSpeechService-Implementierung erforderlich, die auf den Intent INTENT_ACTION_TTS_SERVICE antwortet. Die Die Hauptaufgabe der TTS-Engine findet während des onSynthesizeText()-Callbacks in einem Dienst statt. die sich über TextToSpeechService erstreckt. Das System bietet diese Methode Objekte:

  • SynthesisRequest: Enthält verschiedene Daten, einschließlich des Textes, der die Sprache, die Sprechgeschwindigkeit und die Stimmlage.
  • SynthesisCallback: Schnittstelle, über die Ihre Sprachausgabe-Engine liefert die resultierenden Sprachdaten als Streaming-Audio. Zuerst muss die Suchmaschine start() aufrufen, um anzugeben, dass die Suchmaschine zur Auslieferung bereit ist. und dann audioAvailable() aufrufen die Audiodaten in einem Byte-Zwischenspeicher übergeben. Sobald alle Audiosignale über die Zwischenspeichern, rufen Sie done() auf.

Da das Framework jetzt eine echte API zum Erstellen von Text-in-Sprache-Engines unterstützt, wird der native Code -Implementierung wurde entfernt. Suchen Sie nach einem Blogpost über eine Kompatibilitätsebene. mit der Sie Ihre alten Text-in-Sprache-Engines in das neue Framework umwandeln können.

Ein Beispiel für eine Text-in-Sprache-Engine, die die neuen APIs verwendet, finden Sie in der Beispielanwendung Text to Speech Engine.

Netzwerk-Nutzung

Unter Android 4.0 sehen Nutzer genau, wie viele Netzwerkdaten ihre Anwendungen nutzen. Die App „Einstellungen“ bietet Steuerelemente, mit denen Nutzer Limits für die Netzwerkdatennutzung und und sogar die Nutzung von Hintergrunddaten für einzelne Apps deaktivieren. Um zu verhindern, dass Nutzer Ihre Zugriff der App auf Daten aus dem Hintergrund hat, sollten Sie Strategien zur Nutzung dieser Daten entwickeln. effizient verbinden und die Nutzung an die verfügbare Verbindungsart anpassen.

Wenn Ihre Anwendung viele Netzwerktransaktionen durchführt, sollten Sie Nutzereinstellungen bereitstellen, die Nutzern ermöglichen, das Verhalten Ihrer App bei der Datennutzung zu steuern, z. B. wie oft Ihre App Daten synchronisiert Uploads/Downloads nur bei WLAN-Verbindung, ob beim Roaming mobile Daten verwendet werden sollen usw. Mit diesen Funktionen Einstellungen zur Verfügung stehen, ist die Wahrscheinlichkeit, dass Nutzer den Datenzugriff Ihrer App auf die Daten deaktivieren, sehr viel geringer, wenn nähern sie sich an ihre Grenzen, da sie stattdessen präzise steuern können, wie viele Daten Ihre App verwendet. Wenn Sie mit diesen Einstellungen eine bevorzugte Aktivität angeben, sollten Sie diese in deren Manifest aufnehmen. einen Intent-Filter für ACTION_MANAGE_NETWORK_USAGE deklarieren Aktion ausführen. Beispiel:

<activity android:name="DataPreferences" android:label="@string/title_preferences">
    <intent-filter>
       <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Durch diesen Intent-Filter wird dem System mitgeteilt, dass über diese Aktivität Ihr der Datennutzung der Anwendung. Wenn der Nutzer also prüft, wie viele Daten Ihre App aus dem App „Einstellungen“, „App-Einstellungen ansehen“ über die Schaltfläche Präferenzaktivität, damit der Nutzer eingrenzen kann, welche Datenmenge Ihre App verwendet.

getBackgroundDataSetting() ist jetzt verworfen und gibt immer „true“ zurück. Verwenden Sie stattdessen getActiveNetworkInfo(). Bevor du versuchst, ein Netzwerk zu nutzen Transaktionen, sollten Sie immer getActiveNetworkInfo() anrufen, um die NetworkInfo für das aktuelle Netzwerk abzurufen und isConnected() abzufragen, um zu prüfen, ob das Gerät eine Sie können dann weitere Verbindungseigenschaften prüfen, z. B. ob das Gerät Roaming oder eine WLAN-Verbindung haben.

Unternehmen

Android 4.0 erweitert die Möglichkeiten von Unternehmensanwendungen um die folgenden Funktionen.

VPN-Dienste

Mit der neuen VpnService können Anwendungen ihr eigenes virtuelles VPN (VPN) erstellen privates Netzwerk), ausgeführt als Service. Ein VPN-Dienst erstellt eine Schnittstelle für eine virtuelles Netzwerk mit eigenen Adress- und Routingregeln und führt alle Lese- und Schreibvorgänge mit einer Datei-Deskriptor.

Verwenden Sie zum Erstellen eines VPN-Dienstes VpnService.Builder. Damit können Sie Netzwerkadresse, DNS-Server, Netzwerkroute und mehr. Nach Abschluss können Sie durch Aufrufen von establish(), wodurch ein ParcelFileDescriptor zurückgegeben wird.

Da ein VPN-Dienst Pakete abfangen kann, hat dies Auswirkungen auf die Sicherheit. Wenn Sie also implementieren Sie VpnService, muss Ihr Dienst den BIND_VPN_SERVICE anfordern, damit nur das System eine Bindung daran vornehmen kann (nur erhält das System diese Berechtigung und kann nicht von Apps angefordert werden). Um dann den VPN-Dienst zu nutzen, müssen Nutzer sie manuell in den Systemeinstellungen aktivieren.

Geräterichtlinien

Apps, die die Geräteeinschränkungen verwalten, können die Kamera jetzt mithilfe von „setCameraDisabled()“ und der Eigenschaft „USES_POLICY_DISABLE_CAMERA“ deaktivieren, die mit einem <disable-camera />-Element in der Richtlinienkonfigurationsdatei angewendet wird.

Zertifikatverwaltung

Die neue Klasse KeyChain bietet APIs, mit denen Sie Daten importieren und darauf zugreifen können. Zertifikate im Schlüsselspeicher des Systems. Zertifikate vereinfachen die Installation beider Clients. Zertifikate (zur Validierung der Nutzeridentität) und Zertifikate der Zertifizierungsstelle (zur Serveridentität überprüfen). Anwendungen wie Webbrowser oder E-Mail-Clients können auf die installierte Version von um Nutzer bei Servern zu authentifizieren. Siehe KeyChain in der Dokumentation.

Gerätesensoren

In Android 4.0 wurden zwei neue Sensortypen hinzugefügt:

Wenn ein Gerät sowohl den TYPE_AMBIENT_TEMPERATURE- als auch den TYPE_RELATIVE_HUMIDITY-Sensor hat, kannst du damit den Taupunkt berechnen und der absoluten Luftfeuchtigkeit.

Der vorherige Temperatursensor, TYPE_TEMPERATURE, wurde eingestellt. Du solltest den TYPE_AMBIENT_TEMPERATURE-Sensor verwenden .

Außerdem wurden die drei synthetischen Sensoren von Android stark verbessert, sodass sie nun weniger und eine flüssigere Ausgabe. Zu diesen Sensoren gehören der Schwerkraftsensor (TYPE_GRAVITY), der Rotationsvektorsensor (TYPE_ROTATION_VECTOR) und der lineare Beschleunigungssensor (TYPE_LINEAR_ACCELERATION). Die verbesserten Sensoren nutzen das Gyroskop um die Ausgabe zu verbessern, sodass die Sensoren nur auf Geräten mit einem Gyroskop erscheinen.

Aktionsleiste

Die ActionBar wurde aktualisiert, um mehrere neue Verhaltensweisen zu unterstützen. Meiste Das System verwaltet die Größe und Konfiguration der Aktionsleiste kleineren Bildschirmen entsprechen, um bei allen Bildschirmgrößen eine optimale User Experience zu bieten. Beispiel: wenn der Bildschirm schmal ist (z. B. bei einem Mobiltelefon im Hochformat), wird die Aktionsleiste angezeigt, werden in einer „gestapelten Leiste“ die direkt unter der Aktionsleiste erscheint. Sie können die Option „Aktionsleiste teilen“, sodass alle Aufgaben unten in einer separaten Leiste Bildschirm zu sehen, wenn er schmal ist.

Aktionsleiste teilen

Wenn Ihre Aktionsleiste mehrere Aufgaben enthält, passen nicht alle in die Aktionsleiste auf Bildschirm schmal, sodass das System mehr davon im Dreipunkt-Menü platziert. Android 4.0 können Sie „Aktionsleiste teilen“ aktivieren, sodass in einem Moment mehr Aufgaben auf dem Bildschirm angezeigt werden. separaten Balken unten auf dem Bildschirm. Wenn Sie die Aktionsleiste teilen möchten, fügen Sie entweder android:uiOptions mit "splitActionBarWhenNarrow" zu Ihrem <application> Tag oder einzelne <activity>-Tags in Ihrer Manifest-Datei. Wenn diese Option aktiviert ist, wird am unteren Rand des Bildschirm für alle Aufgaben bei schmalem Bildschirm, d. h., im primären Bereich werden keine Aufgaben angezeigt Aktionsleiste).

Wenn Sie die Navigationstabs der ActionBar.Tab APIs verwenden möchten, die Hauptaktionsleiste jedoch nicht oben benötigen (damit nur die Tabs oben angezeigt werden sollen). Aktivieren Sie in die geteilte Aktionsleiste wie oben beschrieben ein und rufen Sie außerdem setDisplayShowHomeEnabled(false) auf, um die App-Symbols in der Aktionsleiste. In der Hauptaktionsleiste ist keine Aktion mehr zu sehen, verschwindet. Nun sind nur noch die Navigationstabs oben und die Aufgaben unten auf dem Bildschirm.

Stile der Aktionsleiste

Wenn Sie einen benutzerdefinierten Stil auf die Aktionsleiste anwenden möchten, können Sie die neuen Stileigenschaften backgroundStacked und backgroundSplit verwenden, um einen Hintergrund anzuwenden. der gestapelten Leiste bzw. der geteilten Leiste hinzu. Sie können diese Stile auch unter Laufzeit mit setStackedBackgroundDrawable() und setSplitBackgroundDrawable().

Aktionsanbieter

Mit der neuen Klasse ActionProvider können Sie einen spezialisierten Handler für umzusetzenden Maßnahmen. Ein Aktionsanbieter kann eine Aktionsansicht, ein Standardaktionsverhalten und ein Untermenü definieren für jede Aufgabe, mit der sie verknüpft ist. Wenn Sie eine Aufgabe erstellen möchten, dynamische Verhaltensweisen (z. B. eine variable Aktionsansicht, eine Standardaktion oder ein Untermenü) haben, ist das Erweitern von ActionProvider eine gute Lösung, um eine wiederverwendbare Komponente zu erstellen, anstatt die verschiedenen Transformationen der umzusetzenden Maßnahmen in Ihrem Fragment oder Ihrer Aktivität bearbeiten.

Die ShareActionProvider ist beispielsweise eine Erweiterung von ActionProvider, die das Teilen von Inhalten ermöglicht. Aktion aus. Anstelle von einer herkömmlichen Aufgabe, die den Intent ACTION_SEND aufruft, Mit diesem Aktionsanbieter können Sie eine Aktionsansicht mit einer Drop-down-Liste von Anwendungen einblenden, den Intent ACTION_SEND. Wenn der Nutzer eine Anwendung auswählt für die Aktion merkt sich ShareActionProvider diese Auswahl und stellt sie bereit .

Wenn Sie einen Aktionsanbieter für eine Aufgabe deklarieren möchten, fügen Sie den android:actionProviderClass hinzu Attribut im <item>-Element für das Optionsmenü Ihrer Aktivität mit dem Klassennamen der Aktion Anbieter als Wert festzulegen. Beispiel:

<item android:id="@+id/menu_share"
      android:title="Share"
      android:showAsAction="ifRoom"
      android:actionProviderClass="android.widget.ShareActionProvider" />

Im onCreateOptionsMenu() deiner Aktivität Callback-Methode abrufen, eine Instanz des Aktionsanbieters aus dem Menüpunkt abrufen und die Methode Intent:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options, menu)
    val shareActionProvider = menu.findItem(R.id.menu_share)?.actionProvider as? ShareActionProvider
    // Set the share intent of the share action provider.
    shareActionProvider?.setShareIntent(createShareIntent())
    ...
    return super.onCreateOptionsMenu(menu)
}

Java

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    ShareActionProvider shareActionProvider =
          (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
    // Set the share intent of the share action provider.
    shareActionProvider.setShareIntent(createShareIntent());
    ...
    return super.onCreateOptionsMenu(menu);
}

Ein Beispiel für die Verwendung von ShareActionProvider findest du unter ActionBarShareActionProviderActivity in ApiDemos.

Minimierbare Aktionsansichten

Bei Aktionselementen, die eine Aktionsansicht bieten, kann jetzt zwischen dem Status der Aktionsansicht und Status der umzusetzenden Maßnahme. Bisher wurde nur SearchView unterstützt wird minimiert, wenn es als Aktionsansicht verwendet wird. Jetzt können Sie jeder Aufgabe eine Aktionsansicht hinzufügen und Zwischen dem maximierten Status (Aktionsansicht ist sichtbar) und dem minimierten Zustand (Aktionselement ist sichtbar).

Wenn Sie festlegen möchten, dass eine Aufgabe, die eine Aktionsansicht enthält, minimierbar ist, fügen Sie in der XML-Datei des Menüs im Attribut android:showAsAction für das Element <item> das Flag “collapseActionView" ein.

Um Rückrufe zu erhalten, wenn eine Aktionsansicht zwischen maximiert und minimiert wechselt, registrieren Sie eine Instanz von MenuItem.OnActionExpandListener mit der entsprechenden MenuItem durch Aufrufen von setOnActionExpandListener(). In der Regel solltest du dies während des onCreateOptionsMenu()-Callbacks tun.

Um eine minimierbare Aktionsansicht zu steuern, können Sie collapseActionView() und expandActionView() aufrufen auf die entsprechende MenuItem.

Beim Erstellen einer Ansicht für benutzerdefinierte Aktionen können Sie auch die neue CollapsibleActionView-Oberfläche implementieren, um Rückrufe zu erhalten, wenn die Ansicht maximiert und minimiert.

Andere APIs für Aktionsleiste

  • Mit setHomeButtonEnabled() können Sie angeben, ob sich das Symbol/Logo als Schaltfläche für die Navigation nach oben oder nach oben verhält (übergeben Sie "true", damit es wie eine Schaltfläche).
  • Mit setIcon() und setLogo() können Sie das Symbol oder Logo der Aktionsleiste zur Laufzeit definieren.
  • Mit Fragment.setMenuVisibility() können Sie oder deaktivieren Sie die Sichtbarkeit der Optionen im Optionsmenü, die durch das Fragment deklariert wurden. Dies ist nützlich, wenn der Fragment wurde zur Aktivität hinzugefügt, ist aber nicht sichtbar, daher sollten die Menüpunkte ausgeblendet.
  • FragmentManager.invalidateOptionsMenu() ermöglicht es Ihnen, das Menü mit den Aktivitätsoptionen in verschiedenen Stadien des Fragmentlebenszyklus zu entwerten in denen die entsprechende Methode aus Activity möglicherweise nicht verfügbar ist.

Benutzeroberfläche und Aufrufe

Mit Android 4.0 werden eine Vielzahl neuer Ansichten und anderer UI-Komponenten eingeführt.

Rasterlayout

GridLayout ist eine neue Ansichtsgruppe, die untergeordnete Ansichten in einem rechteckigen Raster. Im Gegensatz zu TableLayout ist GridLayout auf einen flachen Hierarchie und nutzt keine Zwischenansichten wie Tabellenzeilen, um Struktur zu schaffen. Stattdessen geben untergeordnete Elemente an, welche Zeilen und Spalten sie belegen sollen (Zellen können mehrere Zeilen und/oder Spalten) und werden standardmäßig sequenziell über die Zeilen und Spalten des Rasters verteilt. Die Ausrichtung für GridLayout bestimmt, ob sequenzielle untergeordnete Elemente horizontal oder vertikal angeordnet sein. Ein Leerzeichen zwischen untergeordneten Elementen kann entweder durch Instanzen der neuen Space-Ansicht oder durch Festlegen der relevanten Margenparameter für Kinder.

Siehe ApiDemos für Beispiele mit GridLayout.

Texturansicht

TextureView ist eine neue Ansicht, in der Sie einen Contentstream wie als Video oder OpenGL-Szene. Obwohl TextureView ähnlich wie SurfaceView ist, ist es insofern einzigartig, als es sich wie eine normale Ansicht verhält, kein separaten Fenster geöffnet, damit Sie es wie jedes andere View-Objekt behandeln können. Beispiel: können Sie Transformationen anwenden, sie mit ViewPropertyAnimator animieren oder Passen Sie die Deckkraft mit setAlpha() an.

TextureView funktioniert nur in einem hardwarebeschleunigten Fenster.

Weitere Informationen finden Sie in der TextureView-Dokumentation.

Widget wechseln

Das neue Switch-Widget ist eine Ein/Aus-Schaltfläche mit zwei Status, die Nutzer in einen der beiden Zustände ziehen können auf die andere Seite oder in die andere (oder tippen Sie einfach), um eine Option zwischen zwei Status zu wechseln.

Sie können die Attribute android:textOn und android:textOff verwenden, um den Text anzugeben. das auf dem Schalter erscheint, wenn die Ein/Aus-Einstellung aktiviert ist. Das Attribut android:text können Sie neben dem Schalter ein Label platzieren.

Ein Beispiel mit Switches finden Sie in der Layoutdatei switches.xml und die entsprechenden Switches .

Mit Android 3.0 wurde PopupMenu eingeführt, um kurze Kontextmenüs zu erstellen, die auf an einem von Ihnen angegebenen Ankerpunkt (normalerweise am Punkt des ausgewählten Elements) Android 4.0 erweitert der PopupMenu mit einigen nützlichen Funktionen:

Einstellungen

Eine neue abstrakte TwoStatePreference-Klasse dient als Grundlage für Einstellungen, die eine Option zur Auswahl von zwei Bundesstaaten bieten. Die neue SwitchPreference ist eine Erweiterung von TwoStatePreference, die ein Switch-Widget in der bevorzugte Ansicht, sodass Nutzer eine Einstellung aktivieren oder deaktivieren können, ohne eine weitere Bildschirm oder Dialogfeld der Einstellung. Die App „Einstellungen“ verwendet beispielsweise ein SwitchPreference für die WLAN- und Bluetooth-Einstellungen.

Systemdesigns

Das Standarddesign für alle Apps für Android 4.0 (durch Festlegen von targetSdkVersion oder minSdkVersion bis “14" oder höher) ist jetzt der "Gerätestandard" Thema: Theme.DeviceDefault Dabei kann es sich um das dunkle Holo-Design oder ein anderes dunkles Design wählen.

Die Themenfamilie Theme.Holo ändert sich garantiert nicht von einem Gerät zum anderen übertragen, wenn sie dieselbe Android-Version verwenden. Wenn Sie explizit eines der Theme.Holo Themen auf Ihre Aktivitäten anwenden, können Sie können Sie sicher sein, dass sich der Charakter dieser Designs auf verschiedenen Geräten innerhalb desselben Plattformversion.

Wenn sich Ihre App in das allgemeine Gerätethema einfügen soll (z. B. wenn verschiedene OEMs verschiedene Standardthemen für das System bereitstellen), sollten Sie explizit Designs aus der Familie Theme.DeviceDefault anwenden.

Schaltfläche für das Optionsmenü

Ab Android 4.0 werden Mobiltelefone keine Menü-Hardware-Taste mehr benötigen. Sie müssen sich jedoch darüber keine Gedanken machen, wenn Ihre vorhandene Anwendung ein Optionsmenü bietet und erwartet, dass ein Menüschaltfläche. Damit vorhandene Apps weiterhin wie erwartet funktionieren, bietet das System eine Bildschirmschaltfläche für Apps, die für ältere Android-Versionen entwickelt wurden.

Für eine optimale Nutzererfahrung sollten neue und aktualisierte Apps stattdessen die ActionBar verwenden, um Zugriff auf Menüpunkte zu gewähren, und targetSdkVersion auf "14", um die neuesten Framework-Standardverhalten zu nutzen.

Steuerelemente für die Sichtbarkeit der System-UI

Seit den Anfängen von Android hat das System eine UI-Komponente verwaltet, die sogenannte Status- Die Leiste befindet sich oben auf Mobilgeräten und liefert Informationen wie den Mobilfunkanbieter. Signal, Uhrzeit, Benachrichtigungen usw. Unter Android 3.0 wurde die Systemleiste für Tablets hinzugefügt. Geräte, die sich unten auf dem Bildschirm für Steuerelemente zur Systemsteuerung (Startbildschirm, und so weiter) sowie eine Benutzeroberfläche für Elemente, die üblicherweise über die Statusleiste bereitgestellt werden. In Unter Android 4.0 bietet das System eine neue Art von System-UI, die Navigationsleiste. Ich könnte man die Navigationsleiste als überarbeitete Version der Systemleiste betrachten, Geräte: Sie bieten Navigationssteuerelemente, die keine entsprechenden Hardware zur Bedienung des Systems haben, der Benachrichtigungsbenutzeroberfläche und Einstellungssteuerelemente der Systemleiste. Ein Gerät, das die Navigation befindet sich auch die Statusleiste oben.

Bis heute können Sie die Statusleiste auf Mobilgeräten mit der Kennzeichnung FLAG_FULLSCREEN ausblenden. In Android 4.0 werden die APIs, die Die Sichtbarkeit der Systemleiste wurde aktualisiert, um das Verhalten der beiden Systeme besser wiederzugeben. und Navigationsleiste:

  • Das Flag SYSTEM_UI_FLAG_LOW_PROFILE ersetzt das Flag STATUS_BAR_HIDDEN. Wenn dieses Flag festgelegt ist, wird „Low-Profil“ aktiviert für die Systemleiste oder Navigationsleiste. Die Navigationsschaltflächen werden gedimmt und andere Elemente in der Systemleiste werden ebenfalls ausgeblendet. Wird aktiviert Das ist nützlich, um immersive Spiele zu erstellen, ohne die Systemsteuerung zu stören. Schaltflächen.
  • Das Flag SYSTEM_UI_FLAG_VISIBLE ersetzt das Flag STATUS_BAR_VISIBLE, um anzufordern, dass die System- oder Navigationsleiste sichtbar ist.
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION ist ein neues Flag, das die Navigationsleiste vollständig ausgeblendet. Beachten Sie, dass dies nur für die Navigationsleiste funktioniert. die von einigen Mobilgeräten verwendet wird (die Systemleiste auf Tablets wird nicht ausgeblendet). Die Navigation kehrt zur Ansicht zurück, sobald das System eine Benutzereingabe erhält. Daher ist dieser Modus nützlich, in erster Linie für die Videowiedergabe oder andere Fälle, in denen der gesamte Bildschirm benötigt wird, aber die Nutzereingabe nicht erforderlich.

Du kannst jedes dieser Flags für die System- und Navigationsleiste setzen, indem du in jeder Ansicht deiner Aktivität setSystemUiVisibility() aufrufst. Die Der Fenstermanager kombiniert (ODER) alle Markierungen aus allen Ansichten in Ihrem Fenster und und wenden sie auf die System-UI an, solange der Eingabefokus im Fenster liegt. Wenn das Fenster keine Eingabe mehr hat (der Nutzer verlässt Ihre App oder ein Dialogfeld wird geöffnet), werden Ihre Meldungen nicht mehr wirksam. Das Gleiche gilt, wenn Sie diese Ansichten aus der Ansichtshierarchie entfernen.

Um andere Ereignisse in Ihrer Aktivität mit Sichtbarkeitsänderungen in der System-UI zu synchronisieren (für Aktionsleiste oder andere UI-Steuerelemente ausblenden, wenn die System-UI ausgeblendet wird), sollten Sie eine View.OnSystemUiVisibilityChangeListener, um benachrichtigt zu werden, wenn die Sichtbarkeit der System- oder Navigationsleiste.

Siehe OverscanActivity-Klasse für eine Demonstration verschiedener Optionen der System-UI.

Eingabe-Framework

In Android 4.0 werden jetzt Ereignisse beim Bewegen des Mauszeigers sowie neue Ereignisse für Eingabestifte und Maustasten unterstützt.

Hover-Ereignisse

Die Klasse View unterstützt jetzt das Bewegen des Mauszeigers -Ereignisse, um umfassendere Interaktionen zu ermöglichen z. B. mit einer Maus oder anderen Geräten, die eine Bildschirmanzeige Cursor).

Wenn Sie Hover-Ereignisse für eine Ansicht erhalten möchten, implementieren Sie View.OnHoverListener und und es bei setOnHoverListener() registrieren. Wenn der Mauszeiger darauf bewegt wird, in der Ansicht auftritt, empfängt der Listener einen Aufruf an onHover() mit dem View, hat das Ereignis und eine MotionEvent erhalten, die den Typ des Hover-Ereignisses beschreibt. die aufgetreten sind. Folgende Ereignisse sind möglich:

View.OnHoverListener sollte bei onHover() den Wert „true“ zurückgeben, wenn das Hover-Ereignis verarbeitet wird. Wenn Ihr Listener "false" zurückgibt, wird das Hover-Ereignis wie gewohnt an die übergeordnete Ansicht gesendet.

Wenn Ihre App Schaltflächen oder andere Widgets verwendet, deren Darstellung je nach aktuellen Zustand ist, können Sie jetzt das Attribut android:state_hovered in einer Statusliste Drawable verwenden, um stellen ein anderes Drawable für den Hintergrund bereit, wenn der Mauszeiger über die Ansicht bewegt wird.

Eine Demonstration der neuen Hover-Ereignisse finden Sie in der Hover-Klasse in ApiDemos

Ereignisse für Eingabestift und Maustasten

Android bietet jetzt APIs für den Empfang von Eingaben von einem Eingabegerät wie einem Digitizer. ein Tablet-Peripheriegerät oder einen Touchscreen mit integriertem Eingabestift.

Die Eingabe per Eingabestift funktioniert ähnlich wie die Eingabe per Berührung oder Maus. Wenn der Eingabestift berührt wird Mit dem Digitizer empfangen Anwendungen Touch-Ereignisse, so wie sie es mit einem Finger tun würden, um tippen Sie auf das Display. Wenn sich der Eingabestift über dem Digitizer befindet, wird der Mauszeiger in Apps eingeblendet. wie beim Bewegen eines Mauszeigers über den Bildschirm, wenn keine Schaltflächen gedrückt.

Ihre Anwendung kann zwischen Finger-, Maus-, Eingabestift- und Radierereingaben unterscheiden, indem sie das „tool type“ die mit jedem Zeiger in einem MotionEvent mithilfe von getToolType() verknüpft sind. Derzeit sind folgende Tooltypen definiert: TOOL_TYPE_UNKNOWN, TOOL_TYPE_FINGER, TOOL_TYPE_MOUSE, TOOL_TYPE_STYLUS, und TOOL_TYPE_ERASER. Durch Abfragen des Tooltyps kann Ihre Anwendung kann festlegen, dass die Eingabe per Eingabestift anders als bei der Eingabe per Finger oder Maus verarbeitet werden soll.

Ihre Anwendung kann auch abfragen, welche Maus- oder Eingabestifttasten gedrückt werden, indem Sie die Bundesstaat“ einer MotionEvent mit getButtonState(). Die derzeit definierten Schaltflächenstatus sind: BUTTON_PRIMARY, BUTTON_SECONDARY, BUTTON_TERTIARY, BUTTON_BACK und BUTTON_FORWARD. Der Einfachheit halber sind die Zurück- und Vorwärts-Maustasten automatisch den Tasten KEYCODE_BACK und KEYCODE_FORWARD zugeordnet. Ihre Anwendung kann diese Schlüssel verarbeiten, um auf der Schaltfläche „Zurück“ und „Vorwärts“.

Neben der präzisen Messung der Position und des Drucks eines Kontakts gibt es bei einigen Eingabestiften Geräte auch den Abstand zwischen der Eingabestiftspitze und dem Digitizer, den Neigungswinkel des Eingabestifts, und den Ausrichtungswinkel des Eingabestifts. Ihre Anwendung kann diese Informationen mithilfe von getAxisValue() mit den Achsencodes AXIS_DISTANCE, AXIS_TILT und AXIS_ORIENTATION abfragen.

Eine Demonstration der Tool-Typen, Schaltflächenstatus und der neuen Achsencodes finden Sie auf der Seite TouchPaint .

Properties

Die neue Klasse Property bietet eine schnelle, effiziente und einfache Möglichkeit, einen Wert für bei jedem Objekt, das es Aufrufern ermöglicht, in der Regel Werte für Zielobjekte festzulegen bzw. abzurufen. Außerdem ermöglicht die Funktionalität der Übergabe von Feld-/Methodenreferenzen und ermöglicht Code das Festlegen/Abrufen von Werten der Eigenschaft definieren, ohne die Details der Felder/Methoden zu kennen.

Wenn Sie beispielsweise den Wert des Felds bar für das Objekt foo festlegen möchten, Gehen Sie dazu wie folgt vor:

Kotlin

foo.bar = value

Java

foo.bar = value;

Wenn Sie den Setter für ein zugrunde liegendes privates Feld bar aufrufen möchten, haben Sie zuvor Gehen Sie wie folgt vor:

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

Wenn Sie jedoch die foo-Instanz übergeben und einen anderen Code bar haben, ist dies vor Android 4.0 nicht möglich.

Mit der Klasse Property können Sie ein Property deklarieren Objekt BAR der Klasse Foo, sodass Sie das Feld für die Instanz foo von Klasse Foo:

Kotlin

BAR.set(foo, value)

Java

BAR.set(foo, value);

Die Klasse View nutzt jetzt die Klasse Property, um können Sie verschiedene Felder festlegen, z. B. Transformationseigenschaften, die in Android 3.0 (ROTATION, ROTATION_X, TRANSLATION_X usw.) hinzugefügt wurden.

Die ObjectAnimator-Klasse verwendet auch die Property -Klasse, sodass Sie ein ObjectAnimator mit einer Property erstellen können, die schneller, effizienter und typsicherer als die stringbasierte Ansatz.

Hardwarebeschleunigung

Ab Android 4.0 ist die Hardwarebeschleunigung für alle Fenster standardmäßig aktiviert, wenn Ihr App hat entweder targetSdkVersion oder minSdkVersion bis “14" oder höher. Die Hardwarebeschleunigung führt in der Regel zu flüssigeren Animationen und Scrollen sowie eine insgesamt bessere Leistung und Reaktion auf Nutzerinteraktionen.

Bei Bedarf kannst du die Hardwarebeschleunigung manuell mit dem hardwareAccelerated deaktivieren. für einzelne <activity>-Elemente oder das <application>-Attribut -Elements. Alternativ können Sie die Hardwarebeschleunigung für einzelne Ansichten deaktivieren, indem Sie setLayerType(LAYER_TYPE_SOFTWARE) aufrufen.

Weitere Informationen zur Hardwarebeschleunigung, einschließlich einer Liste nicht unterstützter Zeichnungen finden Sie auf der Seite Hardware Acceleration-Dokument.

JNI-Änderungen

In früheren Android-Versionen waren lokale JNI-Referenzen keine indirekten Aliasse. Android verwendet direkte Verweise. Solange die automatische Speicherbereinigung keine Objekte verschoben hat, war das kein Problem, schien zu funktionieren, weil wir damit Programmfehler programmieren konnten. In Android 4.0 verwendet das System jetzt indirekte Verweise gefunden werden, um diese Fehler zu erkennen.

Ausführliche Informationen zu lokalen JNI-Referenzen finden Sie unter „Lokale und globale Referenzen“. in den JNI-Tipps. In Android 4.0: CheckJNI wurde optimiert, um diese Fehler zu erkennen. Im Blog für Android-Entwickler finden Sie demnächst einen Beitrag. häufige Fehler bei JNI-Referenzen und wie Sie diese beheben können.

Diese Änderung in der JNI-Implementierung betrifft nur Apps, die auf Android 4.0 ausgerichtet sind, indem entweder targetSdkVersion oder minSdkVersion auf “14" oder höher setzen. Wenn Sie für diese Attribute einen niedrigeren Wert festgelegt haben, Dann verhalten sich lokale JNI-Referenzen wie in früheren Versionen.

WebKit

  • WebKit wurde auf Version 534.30 aktualisiert
  • Unterstützung indischer Schriftarten (Dewanagari, Bengali und Tamil, einschließlich der komplexen Zeichenunterstützung) die zum Kombinieren von Glyphen erforderlich sind) in WebView und im integrierten Browser
  • Unterstützung für äthiopische, georgische und armenische Schriftarten in WebView und den integrierter Browser
  • Die Unterstützung von WebDriver Es ist einfacher, Apps zu testen, die WebView verwenden

Android-Browser

Die Browseranwendung bietet die folgenden Funktionen zur Unterstützung von Webanwendungen:

Berechtigungen

Die folgenden neuen Berechtigungen sind verfügbar:

Gerätefunktionen

Die folgenden neuen Gerätefunktionen sind verfügbar:

  • FEATURE_WIFI_DIRECT: Gibt an, dass die Anwendung Verwendungen WLAN für die Peer-to-Peer-Kommunikation.

Eine detaillierte Ansicht aller API-Änderungen in Android 4.0 (API-Level) 14) sehen Sie sich den Bericht zu API-Unterschieden an.

Vorherige APIs

Zusätzlich zu den oben genannten Funktionen unterstützt Android 4.0 natürlich alle APIs aus früheren Releases. Da die Android 3.x-Plattform nur für Geräte mit großen Bildschirmen verfügbar ist, in erster Linie für Mobiltelefone entwickelt hat, dann ist euch vielleicht nicht bewusst, in diesen neuen Versionen.

Hier sehen Sie einige der wichtigsten APIs, die Sie vielleicht übersehen haben und die jetzt verfügbar sind. auf Mobilgeräten:

Android 3.0
  • Fragment: Eine Framework-Komponente, mit der Sie verschiedene einer Aktivität in eigenständige Module umwandeln, die ihre eigene Benutzeroberfläche und ihren eigenen Lebenszyklus definieren. Weitere Informationen finden Sie in der Fragmente
  • ActionBar: ersetzt die herkömmliche Titelleiste oben auf des Aktivitätsfensters. Sie enthält das Anwendungslogo in der linken Ecke für Menüpunkte. Weitere Informationen finden Sie in der Action Bar – Entwicklerleitfaden
  • Loader: Framework-Komponente, die den asynchronen Modus ermöglicht das Laden von Daten in Kombination mit UI-Komponenten, um Daten dynamisch zu laden, ohne den im Hauptthread. Weitere Informationen finden Sie in der Loaders-Entwicklerleitfaden
  • Systemzwischenablage: Anwendungen können Daten (über den reinen Text hinaus) in und aus der systemweiten Zwischenablage öffnen. Bei diesen Daten kann es sich um Nur-Text, einen URI oder einen Intent handeln. Weitere Informationen finden Sie in der Copy and Paste (Kopieren und Einfügen)
  • Drag & Drop: eine Reihe von in das Ansichts-Framework integrierten APIs, die Drag & Drop ermöglichen Geschäftsabläufe. Weitere Informationen finden Sie in der Drag-and-drop für Entwicklerleitfaden
  • Mit dem neuen flexiblen Animations-Framework können Sie beliebige Eigenschaften (View, Drawable, Fragment, Object oder irgendetwas anderes) und definieren Animationsaspekte wie wie Dauer, Interpolation, Wiederholung usw. Mit dem neuen Framework werden Animationen unter Android erstellt. einfacher als je zuvor. Weitere Informationen finden Sie in der Entwickler für die Property-Animation .
  • RenderScript-Grafiken und Compute Engine: RenderScript bietet leistungsstarke 3D- Grafikrendering- und Compute-API auf nativer Ebene, die Sie in C (C99-Standard) schreiben, die die Leistung bietet, die Sie von einer nativen Umgebung erwarten, und gleichzeitig portabel bleiben. auf verschiedenen CPUs und GPUs. Weitere Informationen finden Sie in der RenderScript-Entwickler .
  • Hardwarebeschleunigte 2D-Grafik: Ihr könnt jetzt den OpenGL-Renderer für eure durch Festlegen von {android:hardwareAccelerated="true"} im <application> Ihres Manifestelements -Element oder für einzelne <activity> Elemente. Dieses Ergebnis flüssigere Animationen, flüssigeres Scrollen und eine insgesamt bessere Leistung und Reaktion auf Nutzer Interaktion.

    Hinweis:Wenn Sie für Ihre Anwendung den Wert minSdkVersion oder targetSdkVersion auf "14" oder höher, die Hardwarebeschleunigung ist standardmäßig aktiviert.

  • Und vieles, vieles mehr. Siehe Android 3.0-Plattform .
Android 3.1
  • USB-APIs: Leistungsstarke neue APIs für die Integration verbundener Peripheriegeräte in Android-Apps Die APIs basieren auf einem USB-Stack und auf Diensten, die in die Plattform integriert, einschließlich Unterstützung für USB-Host- und Geräteinteraktionen. Weitere Informationen finden Sie im Entwicklerleitfaden für USB-Host und -Zubehör.
  • MTP/PTP-APIs: Anwendungen können direkt mit verbundenen Kameras und anderen PTP interagieren. Geräte, um Benachrichtigungen zu erhalten, wenn Geräte angeschlossen und entfernt wurden, Dateien und Speicherplatz verwalten auf diesen Geräten zu und übertragen Dateien und Metadaten auf und von ihnen. Die MTP API implementiert die PTP. (Picture Transfer Protocol) Teilmenge der MTP-Spezifikation (Media Transfer Protocol). Weitere Informationen finden Sie in der android.mtp-Dokumentation.
  • RTP-APIs: Android stellt eine API über seinen integrierten RTP-Stack (Real-time Transport Protocol) bereit. mit welchen Anwendungen On-Demand- oder interaktives Datenstreaming verwaltet werden kann. Insbesondere Apps die VoIP, Push-to-Talk, Konferenzen und Audiostreaming bieten, können mithilfe der API -Sitzungen und das Übertragen oder Empfangen von Datenstreams über ein beliebiges verfügbares Netzwerk. Weitere Informationen finden Sie in der Dokumentation zu android.net.rtp.
  • Unterstützung von Joysticks und anderen allgemeinen Bewegungseingaben.
  • Siehe Android 3.1-Plattform für viele weitere neue APIs.
Android 3.2
  • Neue Bildschirme unterstützen APIs, mit denen Sie mehr Kontrolle über die Funktionsweise Ihrer Anwendungen haben Bildschirmgrößen dargestellt werden. Die API erweitert das vorhandene Bildschirmunterstützungsmodell um die die Möglichkeit, bestimmte Bildschirmgrößenbereiche präzise nach Abmessungen auszurichten, gemessen in dichteunabhängige Pixeleinheiten (z. B. 600 dp oder 720 dp Breite) und nicht anhand ihrer allgemeinen Bildschirmgrößen (wie Large oder xLarge) Dies ist beispielsweise wichtig, zwischen einem 5"- und einem 7"- die beide üblicherweise als "groß" Bildschirmen. Siehe Blog-Post, Neue Tools zur Verwaltung von Bildschirmgrößen.
  • Neue Konstanten für <uses-feature> in Anforderungen für die Bildschirmausrichtung im Quer- oder Hochformat deklarieren.
  • Die „Bildschirmgröße“ des Geräts ändert sich die Konfiguration jetzt bei der Bildschirmausrichtung. ändern können. Wenn deine App auf API-Level 13 oder höher ausgerichtet ist, musst du die "screenSize" verarbeiten. Konfigurationsänderung, wenn Sie auch die "orientation"-Konfigurationsänderung verarbeiten möchten. Weitere Informationen finden Sie unter android:configChanges.
  • Siehe Android 3.2-Plattform für andere neue APIs.

API-Ebene

Der Android 4.0 API wird eine Ganzzahl zugewiesen Kennung (14) aus, die im System selbst gespeichert wird. Anhand dieser Kennung, die als „API-Ebene“ bezeichnet wird, kann das System korrekt feststellen, Anwendung mit dem System kompatibel ist, bevor Sie sie installieren.

Zur Verwendung der in Android 4.0 eingeführten APIs in Ihrer App müssen Sie die über eine Android-Plattform, die API-Level 14 oder höher liegen. Je nach Ihren Anforderungen müssen Sie möglicherweise auch eine android:minSdkVersion="14"-Attribut für den <uses-sdk> -Elements.

Weitere Informationen finden Sie unter Was ist eine API? Stufe?