APIs unter Android 4.0

API-Ebene: 14

Android 4.0 (ICE_CREAM_SANDWICH) ist eine wichtige Plattformveröffentlichung, die 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 haben Sie jetzt eine einzige Plattform und ein einheitliches API-Framework, mit dem Sie Ihre App mit einer einzigen APK entwickeln und veröffentlichen können. Diese bietet eine optimierte Nutzererfahrung für Smartphones, Tablets und mehr, wenn dieselbe Android-Version – Android 4.0 (API-Ebene 14) oder höher – ausgeführt wird.

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. Die Rohkontakte in dieser Tabelle werden dann in dem einzelnen für Nutzer sichtbaren Profil mit dem Label „Mein Google“ zusammengefasst.

Zum Hinzufügen eines neuen Rohkontakts für das Profil ist die Berechtigung „android.Manifest.permission#WRITE_PROFILE“ erforderlich. Wenn Sie Daten aus der Profiltabelle lesen möchten, müssen Sie die Berechtigung „android.Manifest.permission#READ_PROFILE“ anfordern. Die meisten Apps sollten das Nutzerprofil jedoch nicht lesen müssen, auch wenn sie Daten zum Profil beitragen. Das Lesen des Nutzerprofils ist eine sensible Berechtigung und Sie sollten davon ausgehen, dass Nutzer Apps, die diese anfordern, skeptisch gegenüberstehen.

Einladungsabsicht

Mit der Intent-Aktion INVITE_CONTACT kann eine App eine Aktion aufrufen, 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.

Damit Ihre App in der Liste „Verbindung hinzufügen“ angezeigt wird, muss sie einen Synchronisierungsadapter zum Synchronisieren von Kontaktdaten aus Ihrem sozialen Netzwerk bereitstellen. 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 den Daten der Absicht abrufen und die erforderlichen Schritte ausführen, um diesen Kontakt zum Netzwerk einzuladen oder der Person die Kontakte des Nutzers hinzuzufügen.

Große Fotos

Android unterstützt jetzt Fotos in hoher Auflösung für Kontakte. Wenn Sie jetzt ein Foto in einen Kontakteintrag hochladen, verarbeitet das System es sowohl in ein 96 × 96 Pixel großes Thumbnail (wie bisher) als auch in ein 256 × 256 Pixel großes „Darstellungsbild“, das in einem neuen dateibasierten Fotospeicher gespeichert wird. Die genauen Abmessungen, die das System auswählt, können sich in Zukunft ändern. 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 Nutzung von Kontakten

Mit den neuen ContactsContract.DataUsageFeedback APIs können Sie nachvollziehen, wie oft Nutzer bestimmte Methoden zur Kontaktaufnahme verwenden, z. B. wie oft sie eine bestimmte Telefonnummer oder E-Mail-Adresse verwenden. Anhand dieser Informationen können wir die Reihenfolge der Kontaktmethoden für jede Person verbessern und bessere Vorschläge zur Kontaktaufnahme mit ihr machen.

Kalenderanbieter

Mit den neuen Kalender-APIs können Sie Kalender, Termine, Teilnehmer, Erinnerungen und Benachrichtigungen lesen, hinzufügen, ändern und löschen, die beim Kalenderanbieter gespeichert sind.

Diese APIs können von einer Vielzahl von Apps und Widgets verwendet werden, um Kalendertermine zu lesen und zu ändern. Zu den überzeugendsten Anwendungsfällen gehören jedoch Synchronadapter, die den Kalender des Nutzers aus anderen Kalenderdiensten mit dem Kalenderanbieter synchronisieren, um einen einheitlichen Ort für alle Termine des Nutzers anzubieten. So werden Google Kalender-Termine mit dem Kalenderanbieter synchronisiert: den Google Kalender-Synchronisierungsadapter verwenden, sodass diese Termine mit der integrierten Android-Funktion angezeigt werden können. Kalender App.

Das Datenmodell für Kalender und ereignisbezogene Informationen im Kalenderanbieter wird von CalendarContract definiert. Alle Kalenderdaten des Nutzers werden in einer Reihe von Tabellen gespeichert, die durch verschiedene Unterklassen von CalendarContract definiert sind:

  • 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. das 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 die Vorkommnisse eines Ereignisses. Jede Zeile in dieser Tabelle steht für ein einzelnes Vorkommen. Bei einmaligen Ereignissen wird eine Instanz einem Ereignis zugeordnet. Bei wiederkehrenden Ereignissen werden automatisch mehrere Zeilen generiert, die den verschiedenen Vorkommnissen dieses Ereignisses entsprechen.
  • Die Tabelle CalendarContract.Attendees enthält Informationen zu den Teilnehmern oder Gästen der Veranstaltung. 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 Ereignis 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).

Ereignisabsicht

Wenn Sie dem Kalender des Nutzers nur ein Ereignis hinzufügen möchten, können Sie eine ACTION_INSERT-Intent mit den von Events.CONTENT_URI definierten Daten verwenden, um eine Aktivität in der Kalender App zu starten, die neue Termine erstellt. Für die Verwendung der Intent-Ereignisse ist keine Berechtigung erforderlich. Sie können Ereignisdetails mit den folgenden Extras angeben:

Mailboxanbieter

Mit dem neuen Mailboxanbieter können Apps dem Gerät Mailboxnachrichten hinzufügen, 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 Dienstleistungen. 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. Mailboxnachrichten von anderen Diensten lesen.

Da Drittanbieter-Apps mit den APIs derzeit nicht alle Nachrichten aus dem System lesen können, sollten nur Drittanbieter-Apps, die Nachrichten an den Nutzer senden, die APIs für Sprachnachrichten verwenden.

Die Klasse VoicemailContract definiert den Contentanbieter für die Mailbox-Übersteller Die Unterklassen VoicemailContract.Voicemails und VoicemailContract.Status bieten Tabellen, in die Apps Voicemail-Daten zum Speichern auf dem Gerät einfügen können. 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 beispielsweise ganz einfach rote Augen entfernen, ein Bild in Graustufen konvertieren, die Helligkeit und Sättigung anpassen, ein Bild drehen oder einen Fischaugeneffekt anwenden. Das System führt die gesamte Effektverarbeitung auf der GPU aus, um eine maximale Leistung zu erzielen.

Für maximale Leistung werden Effekte direkt auf OpenGL-Texturen angewendet. Ihre Anwendung muss also einen gültigen OpenGL-Kontext haben, bevor sie die Effekt-APIs verwenden kann. 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, den du auf einen Bildausschnitt anwenden kannst. Der grundlegende Workflow zum Erstellen einer Effect sieht so aus:

  1. Rufen Sie EffectContext.createWithCurrentGlContext() aus Ihrem 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 einen Effektnamen aus @link android.media.effect.EffectFactory}, z. B. EFFECT_FISHEYE oder EFFECT_VIGNETTE.

Du kannst die Parameter eines Effekts anpassen, indem du setParameter() aufrufst und einen Parameternamen und einen Parameterwert übergibst. 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.

Wenn Sie einen Effekt auf eine Textur anwenden möchten, rufen Sie apply() auf der Effect auf und geben Sie die Eingabetextur, ihre Breite und Höhe sowie die Ausgabetextur an. Die Eingabetextur muss an ein GL_TEXTURE_2D-Texturbild gebunden sein. Dies geschieht in der Regel durch Aufrufen der Funktion glTexImage2D(). Sie können mehrere Mipmap-Ebenen angeben. Wenn die Ausgabetextur nicht an ein Texturbild gebunden ist, wird sie vom Effekt automatisch als GL_TEXTURE_2D und mit einer Mipmap-Ebene (0) gebunden, die dieselbe Größe wie die Eingabe hat.

Alle in EffectFactory aufgeführten Effekte werden garantiert unterstützt. Einige zusätzliche Effekte, die in externen Bibliotheken verfügbar sind, werden jedoch nicht von allen Geräten unterstützt. Du musst also zuerst prüfen, ob der gewünschte Effekt aus der externen Bibliothek unterstützt wird, indem du isEffectSupported() aufrufst.

Remote-Control-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 auch Informationen zu den aktuell wiedergegebenen Medien auf der Fernbedienung anzeigen, z. B. Titelinformationen und Albumcover.

Instanziieren Sie zum Aktivieren von Fernbedienungs-Clients für Ihren Mediaplayer ein RemoteControlClient mit seinem Konstruktor und übergeben Sie 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 du auf der Fernbedienung Informationen zur wiedergegebenen Mediendatei anzeigen möchtest, ruf editMetaData() auf und füge der zurückgegebenen RemoteControlClient.MetadataEditor Metadaten hinzu. Du kannst ein Bitmap für das Artwork der Medien, numerische Informationen wie die verstrichene Zeit und Textinformationen wie den Titel des Titels angeben. Für Informationen zu verfügbaren Schlüsseln finden Sie unter den METADATA_KEY_*-Flags in MediaMetadataRetriever.

Eine Beispielimplementierung finden Sie im Random Music Player, der eine Kompatibilitätslogik bietet, mit der der Remote-Steuerungsclient auf Android 4.0-Geräten aktiviert wird und gleichzeitig Geräte bis Android 2.1 unterstützt werden.

Mediaplayer

  • Für das Streaming 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
  • Bei HTTP(S)-Livestreams werden HTTP-Cookies jetzt bei allen Anfragen 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 mit den APIs zur Gesichtserkennung von Android erweitert werden, die nicht nur das Gesicht eines Motivs, 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 die Kameraoberfläche starten und die Gesichtserkennung aktivieren, indem Sie startFaceDetection() aufrufen.

Wenn das System ein oder mehrere Gesichter in der Kameraszene erkennt, ruft es den onFaceDetection()-Callback in Ihrer Implementierung von Camera.FaceDetectionListener auf, einschließlich eines Arrays von Camera.Face-Objekten.

Eine Instanz der Camera.Face-Klasse enthält verschiedene Informationen zum erkannten Gesicht, darunter:

  • 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, damit Sie mehrere Gesichter erfassen können
  • Mehrere Point-Objekte, die anzeigen, wo sich die Augen und der Mund befinden gelegen

Hinweis: Die Gesichtserkennung wird auf einigen Geräten möglicherweise nicht unterstützt. Rufen Sie daher getMaxNumDetectedFaces() auf und prüfen Sie, ob der Rückgabewert größer als null ist. Außerdem unterstützen einige Geräte möglicherweise nicht die Erkennung von Augen und Mund. In diesem Fall sind diese Felder im Camera.Face-Objekt null.

Fokus- und Belichtungsbereiche

Kamera-Apps können jetzt die Bereiche steuern, die die Kamera für den Fokus und für die Weißabgleichsmessung und die automatische Belichtung verwendet. 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, unterstützt das Gerät die entsprechende Funktion nicht.

Wenn Sie den zu verwendenden Fokus- oder Messbereich festlegen möchten, rufen Sie einfach setFocusAreas() oder setMeteringAreas() auf. Dabei werden jeweils List von Camera.Area Objekten aufgenommen, die die Bereiche anzeigen, die für den Fokus oder die Belichtung berücksichtigt werden sollen. Sie können beispielsweise eine Funktion implementieren, mit der der Nutzer den Fokusbereich festlegen kann, indem er einen Bereich der Vorschau berührt. Dieser Bereich wird dann in ein Camera.Area-Objekt umgewandelt und die Kamera wird auf diesen Bereich der Szene fokussiert. 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 die kontinuierliche automatische Fokussierung (CAF) beim Aufnehmen von Fotos aktivieren. Wenn Sie CAF in Ihrer Kamera-App aktivieren möchten, übergeben Sie FOCUS_MODE_CONTINUOUS_PICTURE an setFocusMode(). Wenn Sie ein Foto aufnehmen möchten, rufen Sie autoFocus() an. Ihr Camera.AutoFocusCallback erhält sofort einen Rückruf, um anzugeben, ob der Fokus erreicht wurde. Wenn Sie die CAF-Daten nach Erhalt des Rückrufs fortsetzen möchten, müssen Sie cancelAutoFocus() anrufen.

Hinweis: Der kontinuierliche Autofokus wird auch bei der Videoaufnahme unterstützt. Dazu wird FOCUS_MODE_CONTINUOUS_VIDEO verwendet, das in API-Ebene 9 hinzugefügt wurde.

Weitere Kamerafunktionen

  • Während der Videoaufzeichnung können Sie jetzt die Taste takePicture() drücken, um ein Foto zu speichern, ohne die Videoaufzeichnung zu unterbrechen. Zuvor sollten Sie sich isVideoSnapshotSupported() anrufen, um zu prüfen, ob die Hardware unterstützt.
  • Sie können die automatische Belichtung und den Weißabgleich jetzt mit setAutoExposureLock() und setAutoWhiteBalanceLock() sperren, um zu verhindern, dass sich diese Eigenschaften ändern.
  • Sie können jetzt setDisplayOrientation() aufrufen, während die Kameravorschau aktiv ist. Bisher war das nur vor Beginn der Vorschau möglich. Jetzt können Sie die Ausrichtung jederzeit ändern.

Kamera-Übertragungs-Intents

  • Camera.ACTION_NEW_PICTURE: Das Symbol gibt an, dass der Nutzer ein neues Foto aufgenommen hat. Die integrierte Kamera-App sendet diese Übertragung nach der Aufnahme eines Fotos. Kamera-Apps von Drittanbietern sollten diese Intent ebenfalls nach der Aufnahme eines Fotos senden.
  • 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 diesen Intent ebenfalls übertragen. nachdem Sie ein Video aufgenommen haben.

Android Beam (NDEF-Push mit NFC)

Android Beam ist eine neue NFC-Funktion, mit der Sie NDEF-Nachrichten von einem Gerät an ein anderes senden können (auch als „NDEF Push“ bezeichnet). 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 zwischen Geräten teilen möchten. So können Sie beispielsweise über Android Beam Kontakte über die Kontakte App, Videos über YouTube und URLs über den Browser teilen.

Wenn Sie Daten mit Android Beam zwischen Geräten übertragen möchten, müssen Sie eine NdefMessage erstellen, die die Informationen enthält, die Sie freigeben möchten, während Ihre Aktivität im Vordergrund ist. Sie müssen die NdefMessage dann auf eine der folgenden Arten an das System übergeben:

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

    Sie können jederzeit setNdefPushMessage() anrufen, um die Nachricht festzulegen, die gesendet werden soll. Sie können diese Methode beispielsweise in der onCreate()-Methode Ihrer Aktivität aufrufen und ihr Ihre NdefMessage übergeben. Wenn Android Beam dann mit einem anderen Gerät aktiviert wird, während die Aktivität im Vordergrund ist, sendet das System die NdefMessage an das andere Gerät.

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

    Implementieren Sie NfcAdapter.CreateNdefMessageCallback, wobei Ihre Implementierung der Methode createNdefMessage() die NdefMessage zurückgibt, die 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. So können Sie festlegen, dass die NdefMessage nur gesendet wird, wenn Android Beam gestartet wird, falls sich der Inhalt der Nachricht während der Lebensdauer der Aktivität ändern kann.

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 ruft dann onNdefPushComplete() an, wenn die Nachricht zugestellt wurde.

Auf dem Empfängergerät sendet das System NDEF-Push-Nachrichten ähnlich wie bei regulären 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 die praktische Methode createUri verwenden, um eine neue 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.

Sie sollten auch einen „Android-Anwendungseintrag“ mit Ihrer NdefMessage übergeben, damit Ihre Anwendung die eingehende NDEF-Nachricht verarbeitet, auch wenn andere Anwendungen nach derselben Intent-Aktion filtern. Sie können einen Android-Anwendungseintrag erstellen, indem Sie createApplicationRecord() aufrufen und den Paketnamen Ihrer Anwendung übergeben. 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-Eintrag, um Google Play zu starten und den Nutzer zum um sie zu installieren.

Wenn Ihre Anwendung keine NFC APIs zum Senden von NDEF-Push-Nachrichten verwendet, bietet Android ein Standardverhalten: Wenn sich Ihre Anwendung auf einem Gerät im Vordergrund befindet und Android Beam mit einem anderen Android-Gerät aufgerufen wird, erhält das andere Gerät eine NDEF-Nachricht mit einem Android-Anwendungseintrag, der Ihre Anwendung identifiziert. Wenn die Anwendung auf dem Empfängergerät installiert ist, wird sie vom System gestartet. Ist sie nicht installiert, wird Google Play geöffnet und der Nutzer wird zu Ihrer App weitergeleitet, um sie zu installieren.

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

WLAN-P2P

Android unterstützt jetzt WLAN-Peer-to-Peer-Verbindungen (P2P) zwischen Android-Geräten und anderen Gerätetypen (gemäß dem Zertifizierungsprogramm Wi‑Fi Direct™ der Wi‑Fi Alliance) 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 viel größere Entfernungen Bluetooth-Verbindung.

Ein neues Paket, android.net.wifi.p2p, enthält alle APIs für die Durchführung von Peer-to-Peer-Verbindungen über WLAN. Die Hauptklasse, mit der du arbeiten musst, ist WifiP2pManager. Du kannst sie durch Aufrufen von getSystemService(WIFI_P2P_SERVICE) abrufen. Die WifiP2pManager umfasst 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
  • P2P-Verbindung starten, indem Sie connect() anrufen
  • Und vieles mehr

Außerdem 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 Rückruf enthält eine WifiP2pDeviceList, über die Sie für jedes Gerät in Reichweite ein WifiP2pDevice-Objekt abrufen und Informationen wie den Gerätenamen, die Adresse, den Gerätetyp und die vom Gerät unterstützten WPS-Konfigurationen abrufen können.
  • Über die WifiP2pManager.GroupInfoListener-Benutzeroberfläche können Sie Informationen zu einer P2P-Gruppe abrufen. Der Rückruf enthält ein WifiP2pGroup-Objekt mit Gruppeninformationen wie dem Eigentümer, dem Netzwerknamen und der Passphrase.
  • Über die WifiP2pManager.ConnectionInfoListener-Benutzeroberfläche können Sie Informationen zur aktuellen Verbindung abrufen. Der Callback stellt ein WifiP2pInfo-Objekt bereit, das Informationen enthält, z. B. ob eine Gruppe und wer der Gruppeneigentümer ist.

Damit Ihre App die Wi‑Fi P2P APIs verwenden kann, muss sie 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 die Rückrufmethoden implementieren, um Updates zu Änderungen am Registrierungsstatus und Bluetooth-Kanalstatus der Anwendung zu erhalten.
  • BluetoothHealthAppConfiguration: Bei Rückrufen an BluetoothHealthCallback erhältst du eine Instanz dieses Objekts, die Konfigurationsinformationen zum verfügbaren Bluetooth-Gesundheitsgerät enthält. Diese musst du verwenden, 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.

Modus „Tippen & Entdecken“

Nutzer mit Sehverlust können jetzt den Bildschirm erkunden, indem sie einen Finger über das 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 . Daher möchten wir Sie daran erinnern, dass Sie für die Ansichten in Ihrer Anwendung beschreibenden Text angeben sollten, insbesondere für ImageButton, EditText, ImageView und andere Widgets, die möglicherweise keinen beschreibenden Text enthalten.

Barrierefreiheit für Datenansichten

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.

Beachten Sie zuerst, dass sich das Verhalten der sendAccessibilityEvent()-Methode in Android 4.0 geändert hat. 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 umfasst einige zusätzliche Rückrufmethoden, mit denen der Ansicht und ihren übergeordneten Elementen weitere Kontextinformationen zum Ereignis hinzugefügt werden 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. Fügen Sie in diesem Rückruf jedoch keinen zusätzlichen Textinhalt hinzu. Das geschieht im nächsten Schritt.

  2. Wenn das Ereignis nach der Initialisierung zu einem der Typen gehört, die mit Textinformationen ausgefüllt werden sollen, wird die Ansicht auf dispatchPopulateAccessibilityEvent() verwiesen, die den onPopulateAccessibilityEvent()-Callback aufruft.

    Bei benutzerdefinierten Implementierungen von View sollte normalerweise onPopulateAccessibilityEvent() implementiert werden, um der AccessibilityEvent zusätzlichen Text hinzuzufügen, falls der android:contentDescription-Text fehlt oder nicht ausreicht. 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 übergeordnete Ansicht kann dann die Informationen zur Barrierefreiheit durch Hinzufügen eines AccessibilityRecord ergänzen, bis sie schließlich die Stammansicht erreicht, die das Ereignis mit sendAccessibilityEvent() an die AccessibilityManager sendet.

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 Bedienungshilfen-APIs hinzugefügt haben, können Sie dies mit der neuesten Version der Unterstützung für library (in Kompatibilitätspaket, r4) mit einer Reihe von Dienstprogrammklassen, die die neuen Bedienungshilfen-APIs in einem abwärtskompatiblen Design.

Bedienungshilfen

Wenn Sie einen Bedienungshilfendienst entwickeln, wurden die Informationen zu verschiedenen Bedienungshilfenereignissen erheblich erweitert, um Nutzern erweitertes 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 einen Dienst zur Barrierefreiheit entwickeln (z. B. einen Screenreader), können Sie mithilfe der folgenden Schritte auf zusätzliche Inhaltsinformationen zugreifen und Ansichtshierarchien durchlaufen:

  1. Wenn du eine AccessibilityEvent von einer Anwendung erhältst, rufe die AccessibilityEvent.getRecord() auf, um eine bestimmte AccessibilityRecord abzurufen. Dem Ereignis können mehrere Einträge zugeordnet sein.
  2. Sie können getSource() entweder über AccessibilityEvent oder über ein einzelnes AccessibilityRecord 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 AccessibilityNodeInfo-Objekt, das von AccessibilityEvent zurückgegeben wird, beschreibt die Ereignisquelle, während die Quelle aus einer AccessibilityRecord den Vorgänger der Ereignisquelle beschreibt.

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

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

Weitere APIs für Bedienungshilfen

Wenn Sie den Bedienungshilfenstatus des Geräts abrufen möchten, bietet die AccessibilityManager einige neue APIs, z. B.:

Rechtschreibprüfung

Mit einem neuen Framework für Rechtschreibprüfungen können Apps Rechtschreibprüfungen ähnlich wie das Framework für Eingabemethoden (für IMEs) erstellen. Wenn Sie einen neuen Rechtschreibprüfer erstellen möchten, müssen Sie einen Dienst implementieren, der SpellCheckerService erweitert, und die Klasse SpellCheckerService.Session erweitern, um Rechtschreibvorschläge basierend auf Text zu liefern, 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 TTS APIs (Text-to-Speech) von Android wurden erheblich erweitert, damit Anwendungen benutzerdefinierte TTS-Engines einfacher implementieren können. Für Anwendungen, die eine TTS-Engine verwenden möchten, gibt es einige neue APIs zur Auswahl einer Engine.

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(). Unter Android 4.0 wurde die Methode setEngineByPackageName() eingestellt. Sie können die zu verwendende Engine jetzt mit einem neuen Konstruktor TextToSpeech 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 das Symbol, das Label und den Paketnamen der Engine enthalten.

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 Implementierung von TextToSpeechService erforderlich, die auf die INTENT_ACTION_TTS_SERVICE-Intention reagiert. 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: Dieser enthält verschiedene Daten, darunter den zu synthetisierenden Text, die Sprache, die Sprechgeschwindigkeit und die Tonhöhe.
  • SynthesisCallback: Schnittstelle, über die Ihre Sprachausgabe-Engine liefert die resultierenden Sprachdaten als Streaming-Audio. Zuerst muss die Engine start() aufrufen, um anzugeben, dass sie bereit ist, die Audiodaten zu senden, und dann audioAvailable() aufrufen, um die Audiodaten in einem Byte-Puffer zu übergeben. Sobald alle Audiodaten ü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 zu einer Kompatibilitätsschicht, mit der Sie Ihre alten TTS-Engines in das neue Framework konvertieren können.

Ein Beispiel für eine TTS-Engine, die die neuen APIs verwendet, finden Sie in der Beispiel-App Text To Speech Engine.

Netzwerk-Nutzung

Unter Android 4.0 können Nutzer genau sehen, 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>

Dieser Intent-Filter gibt dem System an, dass dies die Aktivität ist, die die Datennutzung Ihrer Anwendung steuert. Wenn der Nutzer in den Einstellungen nachsieht, wie viele Daten Ihre App verwendet, wird die Schaltfläche „App-Einstellungen ansehen“ angezeigt. Über diese Schaltfläche werden die Einstellungen für die Nutzereinstellungen aufgerufen, damit der Nutzer festlegen kann, wie viele Daten Ihre App verwendet.

Hinweis: getBackgroundDataSetting() ist jetzt veraltet und gibt immer „wahr“ 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 andere Verbindungseigenschaften prüfen, z. B. ob das Gerät im Roaming ist oder mit dem WLAN verbunden ist.

Unternehmen

Android 4.0 erweitert die Funktionen für Unternehmensanwendungen um die folgenden Features.

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 ein virtuelles Netzwerk mit eigenen Adress- und Routingregeln und führt alle Lese- und Schreibvorgänge mit einem Dateideskriptor aus.

Verwenden Sie VpnService.Builder, um einen VPN-Dienst zu erstellen. Damit können Sie unter anderem die Netzwerkadresse, den DNS-Server und die Netzwerkroute angeben. Wenn Sie fertig sind, können Sie die Benutzeroberfläche durch Aufrufen von establish() einrichten. Daraufhin wird ParcelFileDescriptor zurückgegeben.

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). Wenn Nutzer Ihren VPN-Dienst dann verwenden möchten, müssen sie ihn 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.

Zertifikatsverwaltung

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 sowohl von Clientzertifikaten (zur Validierung der Identität des Nutzers) als auch von Zertifikaten der Zertifizierungsstelle (zur Überprüfung der Serveridentität). Anwendungen wie Webbrowser oder E-Mail-Clients können auf die installierten Zertifikate zugreifen, 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 TYPE_AMBIENT_TEMPERATURE- als auch TYPE_RELATIVE_HUMIDITY-Sensoren hat, können Sie damit den Taupunkt und die absolute Luftfeuchtigkeit berechnen.

Der bisherige Temperatursensor TYPE_TEMPERATURE wurde eingestellt. Verwenden Sie stattdessen den TYPE_AMBIENT_TEMPERATURE-Sensor.

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. Das System verwaltet die Größe und Konfiguration der Aktionsleiste bei der Ausführung auf kleineren Bildschirmen, um eine optimale Nutzererfahrung auf allen Bildschirmgrößen zu ermöglichen. Wenn das Display beispielsweise schmal ist (z. B. wenn ein Smartphone im Hochformat gehalten wird), werden die Navigationstabs der Aktionsleiste in einer „gestapelten Leiste“ angezeigt, die direkt unter der Hauptaktionsleiste erscheint. Sie können die Option „Aktionsleiste teilen“, alle Aufgaben in einer separaten Leiste unten Bildschirm zu sehen, wenn er schmal ist.

Aktionsleiste teilen

Wenn Ihre Aktionsleiste mehrere Aktionselemente enthält, passen nicht alle auf einem schmalen Bildschirm in die Aktionsleiste. Daher werden mehr davon in das Überlaufmenü verschoben. Android 4.0 können Sie „Aktionsleiste teilen“ aktivieren, damit in einem Moment mehr Aufgaben auf dem Bildschirm angezeigt werden können. separaten Balken unten auf dem Bildschirm. Wenn Sie die geteilte Aktionsleiste aktivieren möchten, fügen Sie entweder dem <application>-Tag oder einzelnen <activity>-Tags in Ihrer Manifestdatei android:uiOptions mit "splitActionBarWhenNarrow" hinzu. 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, aber die Hauptaktionsleiste oben nicht benötigen (oben sollen nur die Tabs angezeigt werden), aktivieren Sie die geteilte Aktionsleiste wie oben beschrieben und rufen Sie setDisplayShowHomeEnabled(false) auf, um das App-Symbol in der Aktionsleiste zu deaktivieren. Wenn die Hauptaktionsleiste leer ist, verschwindet sie. Es bleiben nur die Navigationstabs oben und die Aktionselemente unten auf dem Bildschirm übrig.

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 während der Laufzeit mit setStackedBackgroundDrawable() und setSplitBackgroundDrawable() festlegen.

Aktionsanbieter

Mit der neuen Klasse ActionProvider können Sie einen spezialisierten Handler für umzusetzenden Maßnahmen. Ein Aktionsanbieter kann für jedes Aktionselement, das ihm zugeordnet ist, eine Aktionsanzeige, ein Standardaktionsverhalten und ein Untermenü definieren. Wenn Sie ein Aktionselement mit dynamischem Verhalten erstellen möchten (z. B. eine variable Aktionsanzeige, eine Standardaktion oder ein Untermenü), ist die Erweiterung von ActionProvider eine gute Lösung, um eine wiederverwendbare Komponente zu erstellen, anstatt die verschiedenen Transformationen von Aktionselementen in Ihrem Fragment oder Ihrer Aktivität zu verarbeiten.

Die ShareActionProvider ist beispielsweise eine Erweiterung von ActionProvider, die das Teilen von Inhalten ermöglicht. Aktion aus. Anstelle der Verwendung 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 für die Aktion auswählt, merkt sich ShareActionProvider diese Auswahl und stellt sie in der Aktionsanzeige zur Verfügung, damit er schneller auf die Freigabe über diese App zugreifen kann.

Wenn Sie einen Aktionsanbieter für ein Aktionselement deklarieren möchten, fügen Sie das Attribut android:actionProviderClass in das Element <item> für das Optionsmenü Ihrer Aktivität ein. Geben Sie als Wert den Klassennamen des Aktionsanbieters an. 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 angeben möchten, dass ein Aktionselement, das eine Aktionsanzeige enthält, minimiert werden kann, fügen Sie das Flag “collapseActionView" in das android:showAsAction-Attribut für das Element <item> in der XML-Datei des Menüs 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

Android 4.0 führt eine Vielzahl neuer Ansichten und anderer UI-Komponenten ein.

Rasterlayout

GridLayout ist eine neue Ansichtsgruppe, die untergeordnete Ansichten in einem rechteckigen Raster. Im Gegensatz zu TableLayout basiert GridLayout auf einer flachen Hierarchie und verwendet keine Zwischenansichten wie Tabellenzeilen, um eine Struktur bereitzustellen. Stattdessen geben untergeordnete Elemente an, welche Zeilen und Spalten sie belegen sollen (Zellen können mehrere Zeilen und/oder Spalten umfassen). Standardmäßig werden sie sequenziell über die Zeilen und Spalten des Rasters angeordnet. 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.

In ApiDemos finden Sie Beispiele für die Verwendung von GridLayout.

Texturansicht

TextureView ist eine neue Ansicht, mit der Sie einen Inhaltsstream wie ein Video oder eine OpenGL-Szene anzeigen können. TextureView ähnelt SurfaceView, unterscheidet sich aber dadurch, dass es sich wie eine normale Ansicht verhält und kein separates Fenster erstellt. Sie können es also wie jedes andere View-Objekt behandeln. Beispiel: können Sie Transformationen anwenden, sie mit ViewPropertyAnimator animieren oder Passen Sie die Deckkraft mit setAlpha() an.

Beachten Sie, dass TextureView nur in einem hardwarebeschleunigten Fenster funktioniert.

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.

Mit den Attributen android:textOn und android:textOff können Sie den Text angeben, der auf dem Schalter angezeigt wird, wenn er ein- oder ausgeschaltet ist. Mit dem android:text-Attribut können Sie auch ein Label neben dem Schalter 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 an einem von Ihnen angegebenen Ankerpunkt angezeigt werden (in der Regel an dem Punkt des ausgewählten Elements). Android 4.0 erweitert die PopupMenu um einige nützliche Funktionen:

Einstellungen

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

Systemdesigns

Das Standarddesign für alle Anwendungen, die auf Android 4.0 ausgerichtet sind (targetSdkVersion oder minSdkVersion auf “14" oder höher gesetzt), ist jetzt das Design „Gerätestandard“: Theme.DeviceDefault. Das kann das dunkle Holo-Design oder ein anderes dunkles Design sein, das vom jeweiligen Gerät definiert wird.

Die Theme.Holo-Designfamilie ändert sich auf Geräten mit derselben Android-Version garantiert nicht. Wenn Sie eines der Theme.Holo-Designs explizit auf Ihre Aktivitäten anwenden, können Sie sich darauf verlassen, dass sich die Schriftart auf verschiedenen Geräten innerhalb derselben Plattformversion nicht ändert.

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 darüber jedoch keine Gedanken machen, wenn Ihre vorhandene Anwendung ein Optionsmenü enthält und eine Menüschaltfläche erwartet. 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 Nutzerfreundlichkeit sollten neue und aktualisierte Apps stattdessen die ActionBar verwenden, um Zugriff auf Menüpunkte zu gewähren, und targetSdkVersion auf "14" festlegen, um die neuesten Standardverhalten des Frameworks zu nutzen.

Steuerelemente für die Sichtbarkeit der System-UI

Seit den Anfängen von Android verwaltet das System eine Benutzeroberflächenkomponente namens Statusleiste, die sich oben auf Smartphones befindet und Informationen wie das Signal des Mobilfunkanbieters, die Uhrzeit, Benachrichtigungen usw. anzeigt. 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 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, die Benachrichtigungsbenutzeroberfläche der Systemleiste und die Einstellungen. Ein Gerät, das die Navigation befindet sich auch die Statusleiste oben.

Bis heute können Sie die Statusleiste auf Smartphones mit dem Flag FLAG_FULLSCREEN ausblenden. In Android 4.0 wurden die APIs aktualisiert, die die Sichtbarkeit der Systemleiste steuern, um das Verhalten der System- und Navigationsleiste besser widerzuspiegeln:

  • 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. Das Aktivieren dieser Option ist nützlich, um immersivere Spiele zu erstellen, ohne dass die Systemnavigationsschaltflächen ablenken.
  • 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 Navigationsleiste wird wieder angezeigt, sobald das System eine Nutzereingabe 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. Der Fenstermanager kombiniert alle Flags aus allen Ansichten in Ihrem Fenster (OR-Verknüpfung) und wendet sie auf die System-UI an, solange Ihr Fenster den Eingabefokus hat. Wenn der Fokus des Fensters verloren geht (der Nutzer also die App verlässt oder ein Dialogfeld erscheint), haben Ihre Flags keine Wirkung mehr. Wenn Sie diese Ansichten aus der Ansichtshierarchie entfernen, gelten ihre Flags nicht mehr.

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.

In der Klasse OverscanActivity finden Sie eine Demonstration verschiedener Optionen für die 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 View-Klasse unterstützt jetzt „Hover“-Ereignisse, um durch die Verwendung von Zeigegeräten (z. B. einer Maus oder anderen Geräten, die einen Cursor auf dem Bildschirm steuern) umfangreichere Interaktionen zu ermöglichen.

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 „wahr“ von onHover() zurückgeben, wenn es das Hover-Ereignis verarbeitet. Wenn Ihr Listener „false“ zurückgibt, wird das Hover-Ereignis wie gewohnt an die übergeordnete Ansicht gesendet.

Wenn Ihre Anwendung Schaltflächen oder andere Widgets verwendet, die ihr Aussehen je nach aktuellem Status ändern, können Sie jetzt das Attribut android:state_hovered in einem Zeichnen-Element für den Statuslisten verwenden, um einen anderen Hintergrund zu zeichnen, wenn der Mauszeiger auf 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 Eingabegeräten mit Eingabestift, z. B. von einem Tablet-Peripheriegerät mit Digitizer oder einem Touchscreen mit 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 Eingaben per Finger, Maus, Eingabestift und Radiergummi unterscheiden, indem sie mit getToolType() den „Tooltyp“ abfragt, der mit jedem Zeiger in einer MotionEvent verknüpft ist. Derzeit sind folgende Tooltypen definiert: TOOL_TYPE_UNKNOWN, TOOL_TYPE_FINGER, TOOL_TYPE_MOUSE, TOOL_TYPE_STYLUS, und TOOL_TYPE_ERASER. Wenn Sie den Tooltyp abfragen, kann Ihre Anwendung die Eingabe per Eingabestift anders verarbeiten als die Eingabe per Finger oder Maus.

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

Einige Eingabegeräte mit Eingabestift messen nicht nur die Position und den Druck eines Kontakts, sondern auch den Abstand zwischen der Stiftspitze und dem Digitizer, den Neigungswinkel des Stifts und den Ausrichtungswinkel des Stifts. 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 können damit Feld-/Methodenreferenzen übergeben und Werte der Property im Code festgelegt/abgerufen werden, ohne dass die Details der Felder/Methoden bekannt sein müssen.

Wenn Sie beispielsweise den Wert des Felds bar für Objekt foo festlegen möchten, haben Sie bisher Folgendes getan:

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 View-Klasse nutzt jetzt die Property-Klasse, um verschiedene Felder festzulegen, z. B. Transformierungseigenschaften, die in Android 3.0 hinzugefügt wurden (ROTATION, ROTATION_X, TRANSLATION_X usw.).

Die Klasse ObjectAnimator verwendet auch die Klasse Property. Sie können also eine ObjectAnimator mit einer Property erstellen, was schneller, effizienter und typsicherer ist als der stringbasierte Ansatz.

Hardwarebeschleunigung

Ab Android 4.0 ist die Hardwarebeschleunigung für alle Fenster standardmäßig aktiviert, wenn in Ihrer Anwendung entweder targetSdkVersion oder minSdkVersion auf “14" oder höher festgelegt ist. Die Hardwarebeschleunigung führt in der Regel zu flüssigeren Animationen, flüssigerem Scrollen und insgesamt zu einer besseren Leistung und Reaktion auf Nutzerinteraktionen.

Bei Bedarf können Sie die Hardwarebeschleunigung mit dem Attribut hardwareAccelerated für einzelne <activity>-Elemente oder das <application>-Element manuell deaktivieren. 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 der nicht unterstützten Zeichenvorgänge, finden Sie im Dokument Hardwarebeschleunigung.

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.

Die Vor- und Nachteile lokaler JNI-Referenzen werden unter „Local and Global References“ (Lokale und globale Referenzen) in den JNI-Tipps beschrieben. In Android 4.0 wurde CheckJNI verbessert, 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 diese Attribute auf einen niedrigeren Wert festgelegt haben, verhalten sich lokale JNI-Referenzen wie in früheren Versionen.

WebKit

  • WebKit 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
  • Durch die Unterstützung von WebDriver können Sie Apps, die WebView

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 Funktionen sind neu:

  • 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 Mobilgeräte entwickeln, dann sind Ihnen möglicherweise nicht alle APIs bewusst, die 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 Elemente einer Aktivität in eigenständige Module unterteilen können, die ihre eigene Benutzeroberfläche und ihren eigenen Lebenszyklus definieren. Weitere Informationen finden Sie im Entwicklerleitfaden zu Fragmenten.
  • ActionBar: Er ersetzt die traditionelle Titelleiste oben im Aktivitätsfenster. Es enthält das Anwendungslogo in der linken Ecke und bietet eine neue Benutzeroberfläche für Menüpunkte. Weitere Informationen finden Sie im Entwicklerleitfaden für die Aktionsleiste.
  • 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
  • System-Zwischenablage: Anwendungen können Daten (nicht nur Text) in die systemweite Zwischenablage kopieren und daraus einfügen. Bei diesen Daten kann es sich um Nur-Text, einen URI oder einen Intent handeln. Weitere Informationen finden Sie in der Kopieren und Einfügen
  • Drag-and-drop: Eine Reihe von APIs, die in das Ansichts-Framework eingebunden sind und Drag-and-drop-Vorgänge erleichtern. Weitere Informationen finden Sie im Entwicklerleitfaden für Drag-and-drop.
  • 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 denn je. Weitere Informationen finden Sie im Entwicklerleitfaden für Attributanimationen.
  • 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: Sie können jetzt den OpenGL-Renderer für Ihre Anwendung aktivieren, indem Sie {android:hardwareAccelerated="true"} im <application>-Element Ihres Manifestelements oder für einzelne <activity>-Elemente festlegen. Das führt zu flüssigeren Animationen, flüssigerem Scrollen und insgesamt zu einer besseren Leistung und Reaktion auf Nutzerinteraktionen.

    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. Weitere Informationen finden Sie in den Hinweisen zur Android 3.0-Plattform.
Android 3.1
  • USB APIs: Leistungsstarke neue APIs zur Einbindung verbundener Peripheriegeräte in Android-Anwendungen. Die APIs basieren auf einem USB-Stack und Diensten, die in die Plattform integriert sind, einschließlich Unterstützung für USB-Host- und Geräteinteraktionen. Weitere Informationen finden Sie im Entwicklerhandbuch 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 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 Dokumentation zu android.mtp.
  • RTP APIs: Android stellt eine API für seinen integrierten RTP-Stack (Real-Time Transport Protocol) bereit, mit der Anwendungen On-Demand- oder interaktives Datenstreaming verwalten können. 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.
  • Weitere Informationen zu neuen APIs finden Sie in den Hinweisen zur Android 3.1-Plattform.
Android 3.2
  • Neue Bildschirme unterstützen APIs, mit denen Sie mehr Kontrolle über Ihre Anwendungen haben Bildschirmgrößen dargestellt werden. Die API erweitert das vorhandene Modell zur Bildschirmunterstützung um die Möglichkeit, genau auf bestimmte Bildschirmgrößenbereiche nach Abmessungen abzuzielen, die in dichteunabhängigen Pixeleinheiten (z. B. 600 dp oder 720 dp breit) und nicht nach allgemeinen Bildschirmgrößen (z. B. „large“ oder „xlarge“) gemessen werden. Das ist beispielsweise wichtig, um zwischen einem 5"-Gerät und einem 7"-Gerät unterscheiden zu können, die beide traditionell als „große“ Bildschirme eingestuft werden. 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 festlegen.
  • Die Konfiguration der Gerätebildschirmgröße ändert sich jetzt bei einer Änderung der Bildschirmausrichtung. Wenn Ihre App auf API-Level 13 oder höher ausgerichtet ist, müssen Sie die "screenSize"-Konfigurationsänderung berücksichtigen, wenn Sie auch die "orientation"-Konfigurationsänderung berücksichtigen möchten. Weitere Informationen finden Sie unter android:configChanges.
  • Weitere Informationen zu neuen APIs finden Sie in den Hinweisen zur Android 3.2-Plattform.

API-Ebene

Der Android 4.0 API wird eine Ganzzahl zugewiesen Kennung (14) aus, die im System selbst gespeichert wird. Anhand dieser Kennung, der sogenannten API-Ebene, kann das System vor der Installation einer Anwendung korrekt feststellen, ob sie mit dem System kompatibel ist.

Wenn Sie in Ihrer App APIs verwenden möchten, die in Android 4.0 eingeführt wurden, müssen Sie die App für eine Android-Plattform kompilieren, die API-Ebene 14 oder höher unterstützt. Je nach Bedarf müssen Sie dem Element <uses-sdk> möglicherweise auch ein android:minSdkVersion="14"-Attribut hinzufügen.

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