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.Calendarsenthä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.Eventsenthä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_IDdes Termins, um sie mit dem Termin zu verknüpfen. - Die Tabelle
CalendarContract.Instancesenthä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.Attendeesenthä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.Remindersenthä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_REMINDERSangegeben, 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.ExtendedPropertiesenthä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_FISHEYEoderEFFECT_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
MediaPlayerist jetzt die BerechtigungINTERNETerforderlich. Wenn SieMediaPlayerfür Folgendes verwenden: aus dem Internet wiedergeben, achten Sie darauf, dieINTERNETBerechtigung für dein Manifest. Andernfalls funktioniert die Medienwiedergabe mit Android nicht mehr. 4.0 - Mit
setSurface()können Sie eineSurfaceso 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 dieNdefMessagean 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()dieNdefMessagezurü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 dieNdefMessagenur 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_STATECHANGE_WIFI_STATEINTERNET(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_INFOmit einemWifiP2pInfo-Objekt undEXTRA_NETWORK_INFOmit einemNetworkInfo-Objekt enthält.WIFI_P2P_STATE_CHANGED_ACTION: Der P2P-Status hat sich von „aktiviert“ zu „deaktiviert“ geändert. Es trägtEXTRA_WIFI_STATEmit entwederWIFI_P2P_STATE_DISABLEDoderWIFI_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 anBluetoothHealthCallbackerhä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 denBluetoothHealthAPIs 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 anAccessibilityEventanhä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
Viewsollte normalerweiseonPopulateAccessibilityEvent()implementiert werden, um derAccessibilityEventzusätzlichen Text hinzuzufügen, falls derandroid:contentDescription-Text fehlt oder nicht ausreicht. So fügen Sie demAccessibilityEvent,getText()anrufen.add(). - An dieser Stelle gibt
Viewdas 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 einesAccessibilityRecordergänzen, bis sie schließlich die Stammansicht erreicht, die das Ereignis mitsendAccessibilityEvent()an dieAccessibilityManagersendet.
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
AccessibilityEventvon einer Anwendung erhältst, rufe dieAccessibilityEvent.getRecord()auf, um eine bestimmteAccessibilityRecordabzurufen. Dem Ereignis können mehrere Einträge zugeordnet sein. - Sie können
getSource()entweder überAccessibilityEventoder über ein einzelnesAccessibilityRecordaufrufen, um einAccessibilityNodeInfo-Objekt abzurufen.Ein
AccessibilityNodeInfostellt einen einzelnen Knoten dar. des Fensterinhalts in einem Format darzustellen, mit dem Sie Informationen zur Barrierefreiheit abfragen können, Knoten. DasAccessibilityNodeInfo-Objekt, das vonAccessibilityEventzurückgegeben wird, beschreibt die Ereignisquelle, während die Quelle aus einerAccessibilityRecordden Vorgänger der Ereignisquelle beschreibt. - Mit
AccessibilityNodeInfokö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.AccessibilityStateChangeListenerist 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 ausActivitymö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.OnDismissListenererstellen, 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_PROFILEersetzt 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_VISIBLEersetzt das FlagSTATUS_BAR_VISIBLE, um anzufordern, dass die System- oder Navigationsleiste sichtbar ist. SYSTEM_UI_FLAG_HIDE_NAVIGATIONist 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
WebViewund im integrierten Browser - Unterstützung für äthiopische, georgische und armenische Schriftarten in
WebViewund 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, derSpellCheckerServiceimplementiert, muss diese Berechtigung für sich selbst benötigen.BIND_VPN_SERVICE: Ein Dienst, derVpnServiceimplementiert, 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
minSdkVersionodertargetSdkVersionauf"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?