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 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).
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:
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
: EreignisbeschreibungIntent.EXTRA_EMAIL
: E-Mail-Adressen der Personen an einladenEvents.RRULE
: Die Wiederholungsregel für das EreignisEvents.ACCESS_LEVEL
: ob das Ereignis privat oder öffentlich istEvents.AVAILABILITY
: Gibt an, ob der Zeitraum dieses Ereignisses die gleichzeitige Planung anderer Ereignisse ermöglicht
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:
- 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, den du auf einen Bildausschnitt anwenden kannst. Der grundlegende Workflow zum Erstellen einer Effect
sieht so aus:
- Rufen Sie
EffectContext.createWithCurrentGlContext()
aus Ihrem 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 einen Effektnamen aus @link android.media.effect.EffectFactory}, z. B.EFFECT_FISHEYE
oderEFFECT_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 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- 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 sichisVideoSnapshotSupported()
anrufen, um zu prüfen, ob die Hardware unterstützt. - Sie können die automatische Belichtung und den Weißabgleich jetzt mit
setAutoExposureLock()
undsetAutoWhiteBalanceLock()
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 deronCreate()
-Methode Ihrer Aktivität aufrufen und ihr IhreNdefMessage
übergeben. Wenn Android Beam dann mit einem anderen Gerät aktiviert wird, während die Aktivität im Vordergrund ist, sendet das System dieNdefMessage
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 MethodecreateNdefMessage()
dieNdefMessage
zurückgibt, die 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. So können Sie festlegen, dass dieNdefMessage
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 eineWifiP2pDeviceList
, über die Sie für jedes Gerät in Reichweite einWifiP2pDevice
-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 einWifiP2pGroup
-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 einWifiP2pInfo
-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:
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 sich von „aktiviert“ zu „deaktiviert“ geändert. Es trägtEXTRA_WIFI_STATE
mit entwederWIFI_P2P_STATE_DISABLED
oderWIFI_P2P_STATE_ENABLED
.WIFI_P2P_PEERS_CHANGED_ACTION
: Die Liste der Peer-Geräte hat sich geändert.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
: Die Details für dieses Gerät haben sich 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 die Rückrufmethoden implementieren, um Updates zu Änderungen am Registrierungsstatus und Bluetooth-Kanalstatus der Anwendung zu erhalten.BluetoothHealthAppConfiguration
: Bei Rückrufen anBluetoothHealthCallback
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 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.
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:
- 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. Fügen Sie in diesem Rückruf jedoch keinen zusätzlichen Textinhalt hinzu. Das geschieht im nächsten Schritt. - 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 denonPopulateAccessibilityEvent()
-Callback aufruft.Bei benutzerdefinierten Implementierungen von
View
sollte normalerweiseonPopulateAccessibilityEvent()
implementiert werden, um derAccessibilityEvent
zusätzlichen Text hinzuzufügen, falls derandroid:contentDescription
-Text fehlt oder nicht ausreicht. 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 übergeordnete Ansicht kann dann die Informationen zur Barrierefreiheit durch Hinzufügen einesAccessibilityRecord
ergänzen, bis sie schließlich die Stammansicht erreicht, die das Ereignis mitsendAccessibilityEvent()
an dieAccessibilityManager
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:
- Wenn du eine
AccessibilityEvent
von einer Anwendung erhältst, rufe dieAccessibilityEvent.getRecord()
auf, um eine bestimmteAccessibilityRecord
abzurufen. Dem Ereignis können mehrere Einträge zugeordnet sein. - Sie können
getSource()
entweder überAccessibilityEvent
oder über ein einzelnesAccessibilityRecord
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. DasAccessibilityNodeInfo
-Objekt, das vonAccessibilityEvent
zurückgegeben wird, beschreibt die Ereignisquelle, während die Quelle aus einerAccessibilityRecord
den Vorgänger der Ereignisquelle beschreibt. - Mit
AccessibilityNodeInfo
können Sie Informationen dazu abfragen,getParent()
odergetChild()
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.:
AccessibilityManager.AccessibilityStateChangeListener
ist eine Schnittstelle, über die Sie einen Rückruf erhalten, wenn die Bedienungshilfen aktiviert oder deaktiviert werden.getEnabledAccessibilityServiceList()
enthält Informationen dazu, welche Dienste zur Barrierefreiheit derzeit aktiviert sind.isTouchExplorationEnabled()
gibt an, ob der Touch-Modus für die Erkundung aktiviert ist.
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 Enginestart()
aufrufen, um anzugeben, dass sie bereit ist, die Audiodaten zu senden, und dannaudioAvailable()
aufrufen, um die Audiodaten in einem Byte-Puffer zu übergeben. Sobald alle Audiodaten ü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 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:
TYPE_AMBIENT_TEMPERATURE
: ein Temperatursensor, der die Umgebungstemperatur (Raumtemperatur) in Grad Celsius.TYPE_RELATIVE_HUMIDITY
: Ein Feuchtigkeitssensor, der die relative Luftfeuchtigkeit in Prozent angibt.
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()
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
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 .
Pop-up-Menüs
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:
- 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 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 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. 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 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 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:
- Aktualisierter V8-JavaScript-Compiler für höhere Leistung
- Außerdem sind weitere wichtige Verbesserungen aus Android 3.0 jetzt für Smartphones verfügbar:
- Unterstützung von Elementen mit fester Position auf allen Seiten
- HTML-Medienaufnahme
- Geräteausrichtung Veranstaltungen
- CSS-3D-Transformationen
Berechtigungen
Die folgenden neuen Berechtigungen sind verfügbar:
ADD_VOICEMAIL
: Ermöglicht es einem Anrufbeantworterdienst, dem Gerät Nachrichten hinzuzufügen.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 auf den
ContactsContract.Profile
-Anbieter. - android.Manifest.permission#WRITE_PROFILE: Gewährt Schreibzugriff auf den Anbieter
ContactsContract.Profile
.
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
odertargetSdkVersion
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 unterandroid: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?