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 inMAX_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:
Events.TITLE
: Name für die TerminCalendarContract.EXTRA_EVENT_BEGIN_TIME
: Beginn des Ereignisses in Millisekunden vom EpocheCalendarContract.EXTRA_EVENT_END_TIME
: Ereignis Endzeit in Millisekunden seit der EpocheEvents.EVENT_LOCATION
: Ort des EreignissesEvents.DESCRIPTION
: Ereignis BeschreibungIntent.EXTRA_EMAIL
: E-Mail-Adressen der Personen an einladenEvents.RRULE
: Die Wiederholung Regel für den TerminEvents.ACCESS_LEVEL
: Ob der Termin privat oder öffentlich istEvents.AVAILABILITY
: Gibt an, ob der Zeitraum dieses Ereignisses die gleichzeitige Planung anderer Ereignisse ermöglicht
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:
- Sie müssen an ein
GL_TEXTURE_2D
-Texturbild gebunden sein - 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:
- Rufe
EffectContext.createWithCurrentGlContext()
über deinen OpenGL ES 2.0-Kontext auf. - Verwenden Sie die zurückgegebene
EffectContext
, umEffectContext.getFactory()
aufzurufen. Dabei wird eine Instanz zurückgegeben. vonEffectFactory
. - Rufen Sie
createEffect()
auf und übergeben Sie ein Effektname von @link android.media.effect.EffectFactory}, z. B.EFFECT_FISHEYE
oderEFFECT_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 BerechtigungINTERNET
erforderlich. Wenn SieMediaPlayer
für Folgendes verwenden: aus dem Internet wiedergeben, achten Sie darauf, dieINTERNET
Berechtigung für dein Manifest. Andernfalls funktioniert die Medienwiedergabe mit Android nicht mehr. 4.0 - Mit
setSurface()
können Sie eineSurface
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 sichisVideoSnapshotSupported()
anrufen, um zu prüfen, ob die Hardware unterstützt. - Du kannst die automatische Belichtung und den Weißabgleich jetzt mit
setAutoExposureLock()
undsetAutoWhiteBalanceLock()
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 deronCreate()
deiner Aktivität an deineNdefMessage
übergeben. . Dann, wenn Android Beam mit einem anderen Gerät aktiviert wird, während die Aktivität im im Vordergrund sendet das System denNdefMessage
an das andere Gerät. - Definieren Sie die
NdefMessage
, die bei der Initiierung von Android Beam übertragen werden soll:Implementieren Sie
NfcAdapter.CreateNdefMessageCallback
. Implementierung dercreateNdefMessage()
gibt denNdefMessage
zurück, den Sie senden möchten. Übergeben Sie dann dieNfcAdapter.CreateNdefMessageCallback
-Implementierung ansetNdefPushMessageCallback()
.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, dieNdefMessage
, die Sie senden möchten. Auf diese Weise kannst du festlegen, dassNdefMessage
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 einWifiP2pDeviceList
bereit, mit dem du einWifiP2pDevice
-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 einWifiP2pGroup
-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 einWifiP2pInfo
-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:
WIFI_P2P_CONNECTION_CHANGED_ACTION
: P2P Der Verbindungsstatus hat sich geändert. Diese enthältEXTRA_WIFI_P2P_INFO
mit einemWifiP2pInfo
-Objekt undEXTRA_NETWORK_INFO
mit einemNetworkInfo
-Objekt enthält.WIFI_P2P_STATE_CHANGED_ACTION
: Der P2P-Status hat zwischen „Aktiviert“ und „Deaktiviert“ geändert. Sie enthältEXTRA_WIFI_STATE
mitWIFI_P2P_STATE_DISABLED
oderWIFI_P2P_STATE_ENABLED
WIFI_P2P_PEERS_CHANGED_ACTION
: Die Liste der Peers Geräte geändert wurden.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
: Die Details zu dieses Gerät geändert.
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 dieBluetoothHealthCallback
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 denBluetoothHealth
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:
- Wenn die Methoden
sendAccessibilityEvent()
undsendAccessibilityEventUnchecked()
aufgerufen werden, anonInitializeAccessibilityEvent()
.Bei benutzerdefinierten
View
-Implementierungen kannonInitializeAccessibilityEvent()
implementiert werden, um zusätzliche Informationen zur Barrierefreiheit anAccessibilityEvent
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. - 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 dieonPopulateAccessibilityEvent()
Callback des Nutzers an.Bei benutzerdefinierten Implementierungen von
View
sollte normalerweiseonPopulateAccessibilityEvent()
implementiert werden, um zusätzliche Textinhalt anAccessibilityEvent
senden, wennandroid:contentDescription
-Text fehlt oder unzureichend. So fügen Sie demAccessibilityEvent
,getText()
anrufen.add()
. - An dieser Stelle gibt
View
das Ereignis in der Ansichtshierarchie nach oben weiter, indem es den AufrufrequestSendAccessibilityEvent()
am Eltern-Ansicht. Jede Elternansicht hat dann die Möglichkeit, die Informationen zur Barrierefreiheit zu ergänzen, indemAccessibilityRecord
hinzufügen, bis sie erreicht schließlich die Stammansicht, über die das Ereignis mitsendAccessibilityEvent()
an dieAccessibilityManager
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:
- Beim Empfang einer
AccessibilityEvent
von einer AnwendungAccessibilityEvent.getRecord()
aufrufen, um eine bestimmteAccessibilityRecord
abzurufen (es können mehrere Datensätze an den . - Sie können entweder aus
AccessibilityEvent
oder einem einzelnenAccessibilityRecord
getSource()
aufrufen, um einAccessibilityNodeInfo
-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 vonAccessibilityEvent
zurückgegebeneAccessibilityNodeInfo
-Objekt beschreibt die Ereignisquelle, während die Quelle ausAccessibilityRecord
beschreibt den Vorgänger des Ereignisses. Quelle. - Mit dem
AccessibilityNodeInfo
können Sie Informationen abfragengetParent()
odergetChild()
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.:
AccessibilityManager.AccessibilityStateChangeListener
ist eine Oberfläche, über die Sie einen Callback empfangen können, wenn Bedienungshilfen aktiviert oder deaktiviert.getEnabledAccessibilityServiceList()
gibt Informationen dazu an, welche Bedienungshilfen aktiviert sind.isTouchExplorationEnabled()
teilt Ihnen mit ob der Touchscreen-Modus aktiviert ist.
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 Suchmaschinestart()
aufrufen, um anzugeben, dass die Suchmaschine zur Auslieferung bereit ist. und dannaudioAvailable()
aufrufen die Audiodaten in einem Byte-Zwischenspeicher übergeben. Sobald alle Audiosignale über die Zwischenspeichern, rufen Siedone()
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:
TYPE_AMBIENT_TEMPERATURE
: ein Temperatursensor, der die Umgebungstemperatur (Raumtemperatur) in Grad Celsius.TYPE_RELATIVE_HUMIDITY
: Ein Luftfeuchtigkeitssensor, der relative Luftfeuchtigkeit (Raum) als Prozentsatz.
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()
undsetLogo()
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 ausActivity
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 .
Pop-up-Menüs
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:
- Sie können jetzt den Inhalt eines Pop-up-Menüs aus einer XML-Menüressource mit
inflate()
einfach inblähen und ihr die Menüressourcen-ID übergeben. - Sie können jetzt auch ein
PopupMenu.OnDismissListener
erstellen, das ein -Callback beim Schließen des Menüs.
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 FlagSTATUS_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 FlagSTATUS_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:
- Aktualisierter V8-JavaScript-Compiler für höhere Leistung
- Und andere wichtige Verbesserungen, die von Android übernommen wurden
3.0 sind jetzt für Mobilgeräte verfügbar:
<ph type="x-smartling-placeholder">
- </ph>
- Unterstützung von Elementen mit festen Positionen auf allen Seiten
- HTML-Medienaufnahme
- Geräteausrichtung Veranstaltungen
- CSS-3D-Transformationen
Berechtigungen
Die folgenden neuen Berechtigungen sind verfügbar:
ADD_VOICEMAIL
: Ermöglicht einem Mailboxdienst, eine Mailbox hinzuzufügen Nachrichten an das Gerät gesendet.BIND_TEXT_SERVICE
: Ein Dienst, derSpellCheckerService
implementiert, muss diese Berechtigung für sich selbst benötigen.BIND_VPN_SERVICE
: Ein Dienst, derVpnService
implementiert, muss diese Berechtigung für sich selbst benötigen.- android.Manifest.permission#READ_PROFILE: Gewährt Lesezugriff für den
ContactsContract.Profile
-Anbieter. - android.Manifest.permission#WRITE_PROFILE: Gewährt Schreibzugriff auf den Anbieter
ContactsContract.Profile
.
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 FragmenteActionBar
: 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 – EntwicklerleitfadenLoader
: 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
odertargetSdkVersion
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 unterandroid: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?