API per Android 4.0

Livello API: 14

Android 4.0 (ICE_CREAM_SANDWICH) è un'importante release della piattaforma che aggiunge una serie di nuove funzionalità per utenti e app sviluppatori. Oltre a tutte le nuove funzionalità e API descritte di seguito, Android 4.0 è un perché offre l'ampio insieme di API e temi olografici da Android 3.x. su schermi più piccoli. In qualità di sviluppatore di app, ora disponi di un'unica piattaforma e di un framework API unificato che ti consente di sviluppare e pubblicare la tua applicazione con un singolo APK che fornisce un un'esperienza utente ottimizzata per smartphone, tablet e altri dispositivi con la stessa versione di Android: Android 4.0 (livello API 14) o versioni successive.

Per gli sviluppatori, la piattaforma Android 4.0 è disponibile come componente scaricabile per l'SDK Android. La piattaforma scaricabile include una libreria Android e un'immagine di sistema, nonché una serie di skin di emulazione altro ancora. Per iniziare a sviluppare o testare soluzioni rispetto ad Android 4.0, usa Android SDK Manager per scaricare la piattaforma nell'SDK.

Panoramica dell'API

Le sezioni che seguono forniscono una panoramica tecnica delle nuove API in Android 4.0.

API social nel provider di contatti

Le API di contatto definite dal provider ContactsContract sono state sono stati estesi per supportare nuove funzionalità orientate ai social quali un profilo personale per il proprietario del dispositivo e la possibilità per gli utenti di invitare singoli contatti ai social network installati dispositivo.

Profilo utente

Android ora include un profilo personale che rappresenta il proprietario del dispositivo, come definito Tabella ContactsContract.Profile. App social che mantengono un'identità utente può contribuire ai dati del profilo dell'utente creando una nuova voce ContactsContract.RawContacts all'interno di ContactsContract.Profile. In altre parole, i contatti non elaborati che rappresentano l'utente del dispositivo non appartengono alla tabella tradizionale dei contatti non elaborati definita dall'URI ContactsContract.RawContacts; devi aggiungere un contatto non elaborato del profilo la tabella alle ore CONTENT_RAW_CONTACTS_URI. Grezzo i contatti di questa tabella vengono quindi aggregati in un singolo profilo visibile all'utente con l'etichetta "Io".

L'aggiunta di un nuovo contatto non elaborato per il profilo richiede Autorizzazione android.Manifest.permission#WRITE_PROFILE. Allo stesso modo, per leggere dal profilo devi richiedere l'autorizzazione android.Manifest.permission#READ_PROFILE. Tuttavia, la maggior parte delle app non dovrebbe dover leggere il profilo utente, anche quando fornisce dati al profilo. La lettura del profilo dell'utente è un'autorizzazione sensibile e, pertanto, dovrebbero essere gli utenti scettico nei confronti delle app che lo richiedono.

Intenzione di invito

L'azione per intent INVITE_CONTACT consente a un'app per richiamare un'azione che indichi che l'utente vuole aggiungere un contatto a un social network. L'app riceve l'app e lo usa per invitare il contatto specificato social network. La maggior parte delle app riceverà questa operazione. Ad esempio, L'app Persone integrata richiama l'intent di invito quando l'utente seleziona "Aggiungi connessione" per uno specifico app social elencata nei dati di contatto di una persona.

Per rendere visibile la tua app come in "Aggiungi collegamento" l'app deve fornire un adattatore di sincronizzazione sincronizza i dati dei contatti dal tuo social network. Devi quindi indicare al sistema che i tuoi risponde all'intent INVITE_CONTACT aggiungendo l'attributo inviteContactActivity al file di configurazione della sincronizzazione dell'app, con un nome completo dell'attività che il sistema deve avviare quando invia l'intent di invito. L'attività che inizia può quindi recuperare l'URI del contatto in questione dalla ed eseguire le operazioni necessarie per invitare quel contatto alla rete o aggiungerlo alla le connessioni dell'utente.

Foto grandi

Android ora supporta le foto ad alta risoluzione per i contatti. Ora, quando invii una foto in un contatto, il sistema lo elabora sia in una miniatura 96x96 (come in precedenza) che in un "Foto del display" 256 x 256 in un nuovo archivio di foto basato su file (le dimensioni esatte scelte dal sistema possono variare in futuro). Puoi aggiungere una foto di grandi dimensioni a un contatto inserendo un'immagine foto nella solita PHOTO colonna di di dati, che il sistema elaborerà nella miniatura e nella foto appropriate record.

Feedback sull'utilizzo dei contatti

Le nuove API di ContactsContract.DataUsageFeedback ti consentono di monitorare la frequenza con cui l'utente utilizza metodi particolari per contattare le persone, ad esempio la frequenza con cui l'utente usa ogni numero di telefono o indirizzo email. Queste informazioni aiutano a migliorare la posizione di ogni contatto associati a ogni persona e fornire suggerimenti migliori per contattarli.

Provider calendario

Le nuove API Calendar vi consentono di leggere, aggiungere, modificare ed eliminare calendari, eventi, promemoria e avvisi memorizzati nel provider del calendario.

Una serie di app e widget può utilizzare queste API per leggere e modificare gli eventi di calendario. Tuttavia, alcuni dei casi d'uso più interessanti sono gli adattatori di sincronizzazione che sincronizzano il calendario dell'utente altri servizi di calendario con il provider Calendar, in modo da offrire una posizione unificata per tutti gli eventi dell'utente. Gli eventi di Google Calendar, ad esempio, vengono sincronizzati con il Provider di calendario tramite l'adattatore Google Calendar Sync, che permette di visualizzare questi eventi con il software Android App Calendario.

Il modello dei dati per i calendari e le informazioni relative agli eventi nel provider di calendario è definito da CalendarContract. Tutti i dati del calendario dell'utente vengono archiviati in un numero di tabelle definite da varie sottoclassi di CalendarContract:

  • La tabella CalendarContract.Calendars contiene le informazioni specifiche del calendario informazioni. Ogni riga di questa tabella contiene i dettagli di un singolo calendario, come nome, colore, informazioni di sincronizzazione e così via.
  • La tabella CalendarContract.Events contiene informazioni specifiche sugli eventi. Ogni riga di questa tabella contiene le informazioni relative a un singolo evento, come titolo dell'evento, luogo, ora di inizio, ora di fine e così via. L'evento può verificarsi una volta o ricorrente più volte. Partecipanti, promemoria e proprietà estese sono archiviati in tabelle separate e usa l'attributo _ID dell'evento per collegarlo all'evento.
  • La tabella CalendarContract.Instances contiene l'ora di inizio e l'ora di fine le occorrenze di un evento. Ogni riga di questa tabella rappresenta una singola occorrenza. Per eventi singoli esiste una mappatura one-to-one delle istanze agli eventi. Per gli eventi ricorrenti, vengono visualizzate più righe automaticamente per corrispondere alle occorrenze di quell'evento.
  • La tabella CalendarContract.Attendees contiene il partecipante o l'invitato all'evento informazioni. Ogni riga rappresenta un singolo invitato di un evento. Specifica il tipo di ospite e la sua risposta per l'evento.
  • La tabella CalendarContract.Reminders contiene i dati degli avvisi e delle notifiche. Ogni riga rappresenta un singolo avviso per un evento. Un evento può avere più promemoria. Il numero di i promemoria per evento sono specificati in MAX_REMINDERS, che viene impostato dall'adattatore di sincronizzazione proprietario del calendario specificato. I promemoria vengono specificati in minuti prima della data dell'evento programmato e specificare un metodo di allarme, ad esempio utilizzare un avviso, un'email o un SMS per ricordarlo per l'utente.
  • La tabella CalendarContract.ExtendedProperties contiene campi di dati opachi usato dall'adattatore di sincronizzazione. Il provider non esegue alcuna azione con gli elementi di questa tabella, se non l'eliminazione quando i relativi eventi vengono eliminati.

Per accedere ai dati del calendario di un utente con il provider del calendario, la tua applicazione deve richiedere l'autorizzazione READ_CALENDAR (per l'accesso in lettura) e WRITE_CALENDAR (per accesso in scrittura).

Intento evento

Se vuoi solo aggiungere un evento al calendario dell'utente, puoi utilizzare un intent ACTION_INSERT con i dati definiti da Events.CONTENT_URI per avviare un l'attività nell'app Calendar che crea nuovi eventi. L'utilizzo dell'intent non richiede e puoi specificare i dettagli dell'evento con le seguenti funzionalità aggiuntive:

Fornitore di servizi vocali

Il nuovo fornitore di messaggi vocali consente alle applicazioni di aggiungere messaggi vocali al dispositivo, in modo da presentare tutti i messaggi vocali dell'utente in un'unica presentazione visiva. Ad esempio, è possibile che un utente abbia più fonti per i messaggi vocali, come uno del provider di servizi dello smartphone e altri del VoIP o di un'altra voce alternativa. i servizi di machine learning. Queste app possono utilizzare le API del fornitore di messaggi vocali per aggiungere i propri messaggi vocali al dispositivo. La l'applicazione Telefono integrata presenta quindi tutti i messaggi vocali all'utente in una presentazione unificata. Sebbene l'applicazione Telefono del sistema sia l'unica in grado di leggere tutti i messaggi vocali, ogni applicazione che fornisce messaggi vocali può leggere quelle che ha aggiunto al sistema (ma non può legge i messaggi vocali da altri servizi).

Al momento le API non consentono ad app di terze parti di leggere tutti i messaggi vocali dal le uniche app di terze parti che dovrebbero usare le API Compose da consegnare all'utente.

La classe VoicemailContract definisce il fornitore di contenuti per Provder messaggio vocale. Le sottoclassi VoicemailContract.Voicemails e VoicemailContract.Status forniscono tabelle in cui le app possono inserire i dati della segreteria da archiviare sul dispositivo. Per un esempio di app del fornitore di messaggi vocali, vedi Fornitore della segreteria Demo.

Multimediale

Android 4.0 aggiunge diverse nuove API per le applicazioni che interagiscono con contenuti multimediali come foto, video e musica.

Effetti multimediali

Un nuovo framework di effetti multimediali consente di applicare una varietà di effetti visivi alle immagini e video. Ad esempio, gli effetti immagine consentono di correggere facilmente gli occhi rossi, convertire un'immagine in scala di grigi, regola luminosità, saturazione, ruota un'immagine, applica un effetto fisheye e molto altro ancora. La di sistema esegue tutti l'elaborazione degli effetti sulla GPU per ottenere le prestazioni massime.

Per ottenere prestazioni ottimali, gli effetti vengono applicati direttamente alle texture OpenGL, deve disporre di un contesto OpenGL valido prima di poter usare le API degli effetti. Le texture a cui applichi possono provenire da bitmap, video o persino dalla fotocamera. Esistono, però, alcune restrizioni le texture devono soddisfare i seguenti requisiti:

  1. Devono essere associate a un'immagine di texture GL_TEXTURE_2D
  2. Devono contenere almeno un livello mipmap

Un oggetto Effect definisce un singolo effetto multimediale a cui puoi applicare una cornice di immagine. Il flusso di lavoro di base per creare un Effect è il seguente:

  1. Chiama EffectContext.createWithCurrentGlContext() dal contesto OpenGL ES 2.0.
  2. Utilizza il valore EffectContext restituito per chiamare EffectContext.getFactory(), che restituisce un'istanza di EffectFactory.
  3. Chiama createEffect(), trasmettendo un nome dell'effetto da @link android.media.effect.EffectFalse}, ad esempio EFFECT_FISHEYE o EFFECT_VIGNETTE.

Puoi regolare i parametri di un effetto chiamando setParameter() e trasmettendo il nome e il valore del parametro. Ogni tipo di effetto accetta diversi, documentati con il nome dell'effetto. Ad esempio, EFFECT_FISHEYE ha un parametro per scale del un'immagine o una distorsione di testo.

Per applicare un effetto a una texture, richiama apply() sulla Effect e passiamo la texture di input, la sua larghezza e l'altezza, e il valore texture. La texture di input deve essere associata a una texture GL_TEXTURE_2D dell'immagine (solitamente chiamata glTexImage2D() ). Puoi fornire più livelli mipmap. Se la texture di output non è stata associata a un immagine texture, l'effetto verrà associato automaticamente a GL_TEXTURE_2D e a un livello mipmap (0), che avrà lo stesso dimensione come input.

Tutti gli effetti elencati in EffectFactory sono garantiti per essere supportati. Tuttavia, alcuni effetti aggiuntivi disponibili dalle librerie esterne non sono supportati da tutti i dispositivi. pertanto devi prima verificare se l'effetto desiderato dalla libreria esterna è supportato richiamando isEffectSupported().

Client di controllo remoto

La nuova versione di RemoteControlClient consente ai lettori multimediali di attivare la riproduzione da client di controllo remoto, come la schermata di blocco del dispositivo. I lettori multimediali possono inoltre esporre informazioni sui contenuti multimediali attualmente in riproduzione per la visualizzazione sul telecomando, come la traccia informazioni e copertine degli album.

Per attivare i client di controllo remoto per il media player, crea un'istanza per un RemoteControlClient con il relativo costruttore, passandolo un PendingIntent che trasmette ACTION_MEDIA_BUTTON. L'intent deve anche dichiarare il componente BroadcastReceiver esplicito nella tua app che gestisce l'evento ACTION_MEDIA_BUTTON.

Per dichiarare gli input del controllo multimediale che il player è in grado di gestire, devi chiamare setTransportControlFlags() sul tuo RemoteControlClient, passando un set di flag FLAG_KEY_MEDIA_*, ad esempio FLAG_KEY_MEDIA_PREVIOUS e FLAG_KEY_MEDIA_NEXT.

Poi devi registrare il tuo RemoteControlClient passandolo a MediaManager.registerRemoteControlClient(). Una volta effettuata la registrazione, il broadcast receiver che hai dichiarato quando hai creato l'istanza di RemoteControlClient riceverà ACTION_MEDIA_BUTTON eventi che si verificano quando viene premuto un pulsante da un telecomando. L'intent che ricevi include il KeyEvent per il tasto multimediale premuto, che puoi recuperare dall'intent con getParcelableExtra(Intent.EXTRA_KEY_EVENT).

Per visualizzare sul telecomando le informazioni relative ai contenuti multimediali in riproduzione, chiama editMetaData() e aggiungi metadati al file restituito RemoteControlClient.MetadataEditor. Puoi fornire una bitmap per gli artwork multimediali, informazioni numeriche come il tempo trascorso e informazioni di testo come il titolo della traccia. Per informazioni sulle chiavi disponibili, vedi i flag METADATA_KEY_* in MediaMetadataRetriever.

Per un'implementazione di esempio, consulta il player di musica casuale, che fornisce una logica di compatibilità tale da consentire al client di controllo remoto su Android 4.0 dispositivi pur continuando a supportare i dispositivi con Android 2.1.

Lettori multimediali

  • Per lo streaming di contenuti multimediali online da MediaPlayer ora è necessaria l'autorizzazione INTERNET. Se usi MediaPlayer per riprodurre contenuti da internet, assicurati di aggiungere l'elemento INTERNET autorizzazione al file manifest, altrimenti la riproduzione di contenuti multimediali non funzionerà a partire da Android 4,0.
  • setSurface() consente di definire un Surface che si comporti come il sink del video.
  • setDataSource() ti consente di inviare intestazioni HTTP aggiuntive con la tua richiesta, che possono essere utili per il live streaming HTTP(S)
  • Il live streaming HTTP(S) ora rispetta i cookie HTTP nelle richieste

Tipi di elementi multimediali

Android 4.0 aggiunge il supporto per:

  • Protocollo di live streaming HTTP/HTTPS versione 3
  • Codifica audio AAC raw ADTS
  • Immagini WEBP
  • Video Matroska

Per maggiori informazioni, consulta la sezione Contenuti multimediali supportati Formati.

Fotocamera

La classe Camera ora include API per il rilevamento dei volti e il controllo le aree di messa a fuoco e di misurazione.

Riconoscimento facciale

Ora le app Fotocamera possono migliorare le loro capacità grazie alle API di rilevamento facciale di Android, che non rilevare solo il volto di un soggetto, ma anche caratteristiche facciali specifiche, come gli occhi e la bocca.

Per rilevare i volti nell'applicazione della fotocamera, devi registrare un Camera.FaceDetectionListener chiamando il numero setFaceDetectionListener(). Puoi quindi iniziare la superficie della videocamera e inizia a rilevare i volti chiamando il numero startFaceDetection().

Quando il sistema rileva uno o più volti nella scena della videocamera, chiama il callback di onFaceDetection() implementazione di Camera.FaceDetectionListener, compreso un array di Camera.Face oggetti.

Un'istanza della classe Camera.Face fornisce varie informazioni su volto rilevato, ad esempio:

  • Un elemento Rect che specifica i margini del volto in relazione ai campo visivo corrente
  • Un numero intero compreso tra 1 e 100 che indica il grado di sicurezza del sistema che l'oggetto sia un volto umano
  • Un ID univoco per monitorare più volti
  • Diversi oggetti Point che indicano la posizione di occhi e bocca localizzato

Nota:il rilevamento facciale potrebbe non essere supportato su alcuni dispositivi, dovresti quindi controllare chiamando il numero getMaxNumDetectedFaces() e assicurarti che il reso è maggiore di zero. Inoltre, alcuni dispositivi potrebbero non supportare l'identificazione di occhi e bocca, In questo caso, quei campi nell'oggetto Camera.Face saranno nulli.

Aree di messa a fuoco e misurazione

Le app Fotocamera ora possono controllare le aree utilizzate dalla fotocamera per la messa a fuoco e la misurazione del bianco saldo e dell'esposizione automatica. Entrambe le funzionalità utilizzano la nuova classe Camera.Area per specificare l'area della visualizzazione corrente della videocamera che deve essere messa a fuoco o a consumo. Un'istanza della classe Camera.Area definisce i confini dell'area con un Rect e la ponderazione dell'area, che rappresenta il livello di importanza di questa classe rispetto alle altre aree in considerazione, con un numero intero.

Prima di impostare un'area di messa a fuoco o un'area di misurazione, devi chiamare rispettivamente getMaxNumFocusAreas() o getMaxNumMeteringAreas(). Se restituiscono zero, allora il dispositivo non supporta la funzionalità corrispondente.

Per specificare le aree di messa a fuoco o di misurazione da utilizzare, chiama semplicemente setFocusAreas() o setMeteringAreas(). Ognuno dei due utilizza un List di Camera.Area oggetti che indicano le aree da considerare per la messa a fuoco o la misurazione. Ad esempio, potresti implementare una funzionalità che consenta all'utente di impostare tocca un'area dell'anteprima, che poi traduci in un oggetto Camera.Area e richiedi alla fotocamera di mettere a fuoco quell'area della scena. La messa a fuoco o l'esposizione in quell'area cambiano continuamente in base ai cambiamenti della scena nell'area.

Messa a fuoco automatica continua per le foto

Ora puoi attivare la messa a fuoco automatica continua (CAF) quando scatti foto. Per attivare il CAF nel tuo app fotocamera, tessera FOCUS_MODE_CONTINUOUS_PICTURE a setFocusMode(). Quando è tutto pronto per l'acquisizione una foto, chiama autoFocus(). Il tuo Camera.AutoFocusCallback riceve immediatamente una richiamata per indicarti se l'attenzione. Per riprendere il CAF dopo aver ricevuto la richiamata, devi chiamare il numero cancelAutoFocus().

Nota:la messa a fuoco automatica continua è supportata anche durante l'acquisizione. utilizzando FOCUS_MODE_CONTINUOUS_VIDEO, che è stato aggiunta al livello API 9.

Altre funzionalità della fotocamera

  • Mentre registri un video, ora puoi chiamare takePicture() per salvare una foto senza interrompere la sessione video. Prima di farlo, chiama isVideoSnapshotSupported() per assicurarti che l'hardware la supporta.
  • Ora puoi bloccare l'esposizione automatica e il bilanciamento del bianco con setAutoExposureLock() e setAutoWhiteBalanceLock() per evitare che queste proprietà non vengano modificate.
  • Ora puoi chiamare setDisplayOrientation() mentre è in esecuzione l'anteprima della fotocamera. In precedenza, potevi chiamare questo solo prima di iniziare l'anteprima, ma ora puoi modificare l'orientamento in qualsiasi momento.

Intent di trasmissione con la videocamera

  • Camera.ACTION_NEW_PICTURE: Questo indica che l'utente ha acquisito una nuova foto. L'app Fotocamera integrata richiama questa dopo l'acquisizione di una foto e anche le app fotocamera di terze parti dovrebbero trasmettere questo intento dopo aver scattato una foto.
  • Camera.ACTION_NEW_VIDEO: Questo indica che l'utente ha acquisito un nuovo video. L'app Fotocamera integrata richiama questa mostrare dopo la registrazione di un video e anche le app per videocamere di terze parti dovrebbero trasmettere questo intent dopo aver acquisito un video.

Android Beam (NDEF Push con NFC)

Android Beam è una nuova funzione NFC che ti consente di inviare messaggi NDEF da un dispositivo a: un altro (un processo noto anche come "NDEF Push"). Il trasferimento dei dati ha inizio I dispositivi basati su Android che supportano Android Beam si trovano nelle vicinanze (circa 4 cm), solitamente con si toccano le spalle. I dati all'interno del messaggio NDEF possono contenere qualsiasi dato che desideri condividere tra i dispositivi. Ad esempio, l'app Persone condivide i contatti, YouTube condivide i video e il browser condivide URL utilizzando Android Beam.

Per trasmettere i dati tra dispositivi utilizzando Android Beam, devi creare un NdefMessage che contenga le informazioni che vuoi condividere mentre è attiva la tua attività in primo piano. Devi quindi passare NdefMessage al sistema in uno dei due modi:

Nel caso in cui tu voglia eseguire codice specifico dopo che il sistema ha distribuito correttamente il file NDEF all'altro dispositivo, puoi implementare NfcAdapter.OnNdefPushCompleteCallback e impostarlo con setNdefPushCompleteCallback(). Il sistema quindi chiama onNdefPushComplete() quando il messaggio viene recapitato.

Sul dispositivo ricevente, il sistema invia messaggi push NDEF in modo simile al normale NFC. i tag. Il sistema richiama un intent con ACTION_NDEF_DISCOVERED per avviare un'attività con un URL o un tipo MIME impostato in base al primo NdefRecord in NdefMessage. Per l'attività che vuoi rispondi, puoi dichiarare i filtri per intent per gli URL o i tipi MIME che interessano alla tua app. Per ulteriori informazioni per informazioni sull'invio di tag, consulta la guida per gli sviluppatori NFC.

Se vuoi che NdefMessage contenga un URI, puoi usare la comodità createUri per creare un nuovo NdefRecord basato su una stringa o su un oggetto Uri. Se l'URI è un formato speciale che vuoi che la tua applicazione riceva anche durante un evento Android Beam, devi creare un filtro per intent per la tua attività utilizzando lo stesso schema URI al fine di ricevere lo schema messaggio NDEF in arrivo.

Dovresti anche passare un "record di app Android" con NdefMessage in per garantire che l'applicazione gestisca il messaggio NDEF in arrivo, anche se le applicazioni filtrano in base alla stessa azione intent. Puoi creare un record di app Android chiamata createApplicationRecord(), passarla il nome del pacchetto dell'applicazione. Quando l'altro dispositivo riceve il messaggio NDEF con record dell'applicazione e più applicazioni contengono attività che gestiscono l'intent specificato, il sistema recapita sempre il messaggio all'attività nella tua applicazione (in base al record dell'applicazione). Se al momento l'applicazione non è installata sul dispositivo di destinazione, verrà utilizza il record dell'applicazione Android per avviare Google Play e indirizzare l'utente l'applicazione per installarla.

Se la tua applicazione non utilizza API NFC per eseguire messaggi push NDEF, Android fornisce una comportamento predefinito: quando la tua applicazione è in primo piano su un dispositivo e Android Beam è richiamato con un altro dispositivo Android, l'altro dispositivo riceve un messaggio NDEF con un Record dell'app Android che identifica la tua applicazione. Se il dispositivo ricevente ha un'applicazione installata, il sistema la avvia; se non è installata, Google Play si apre e richiede l'utente alla tua applicazione per installarla.

Per ulteriori informazioni su Android Beam e su altre funzioni NFC, consulta la guida per gli sviluppatori Nozioni di base su NFC. Per alcuni esempi di codice utilizzando Android Beam, consulta la sezione Android Demo Beam.

P2P Wi-Fi

Android ora supporta le connessioni Wi-Fi peer-to-peer (P2P) tra dispositivi Android e altri tipi di dispositivi (in conformità con Wi-Fi DirectTM di Wi-Fi Alliance di certificazione) senza hotspot o connessione a internet. Il framework Android offre set di API Wi-Fi P2P che ti consentono di rilevare e connetterti ad altri dispositivi quando ogni dispositivo supporta Wi-Fi P2P, quindi comunica tramite una connessione veloce su distanze molto più lunghe rispetto a una Connessione Bluetooth.

Un nuovo pacchetto, android.net.wifi.p2p, contiene tutte le API per l'esecuzione di peer-to-peer connessioni Wi-Fi. Il corso principale con cui devi lavorare è WifiP2pManager, che puoi acquisire chiamando getSystemService(WIFI_P2P_SERVICE). Il WifiP2pManager include API che ti consentono di:

  • Inizializza la tua applicazione per le connessioni P2P chiamando initialize()
  • Scopri i dispositivi nelle vicinanze chiamando il numero discoverPeers()
  • Avvia una connessione P2P chiamando il numero connect()
  • E altro ancora

Sono necessarie anche molte altre interfacce e classi, ad esempio:

  • L'interfaccia di WifiP2pManager.ActionListener ti consente di ricevere i callback quando un'operazione, come l'individuazione dei peer o la connessione ai peer, ha esito positivo o negativo.
  • L'interfaccia di WifiP2pManager.PeerListListener consente di ricevere e informazioni sui peer rilevati. Il callback fornisce un WifiP2pDeviceList, da cui puoi recuperare un oggetto WifiP2pDevice per ogni dispositivo nel raggio d'azione e ottenere informazioni come il nome, l'indirizzo e il tipo di dispositivo, le configurazioni WPS supportate dal dispositivo e altro ancora.
  • L'interfaccia di WifiP2pManager.GroupInfoListener ti consente di: ricevere informazioni su un gruppo P2P. Il callback fornisce un oggetto WifiP2pGroup, che fornisce informazioni sul gruppo come il proprietario, il il nome della rete e la passphrase.
  • L'interfaccia di WifiP2pManager.ConnectionInfoListener ti consente di ricevere informazioni sulla connessione corrente. Il callback fornisce un oggetto WifiP2pInfo, che contiene informazioni come l'eventuale presenza di un gruppo e chi ne è il proprietario.

Per utilizzare le API Wi-Fi P2P, la tua app deve richiedere le seguenti autorizzazioni utente:

Il sistema Android trasmette anche diverse azioni durante determinati eventi Wi-Fi P2P:

Per saperne di più, consulta la documentazione di WifiP2pManager. Inoltre guarda il Demo P2P Wi-Fi dell'applicazione di esempio.

Dispositivi Bluetooth per la salute

Android ora supporta i dispositivi Bluetooth Health Profile, quindi puoi creare applicazioni che utilizzano Il Bluetooth per comunicare con i dispositivi per la salute che supportano il Bluetooth, come i cardiofrequenzimetri misuratori del sangue, termometri e bilance.

Come per le cuffie standard e i dispositivi con profilo A2DP, devi chiamare getProfileProxy() con un tipo di profilo BluetoothProfile.ServiceListener e HEALTH per stabilire una connessione con il profilo un oggetto proxy.

Una volta acquisito il proxy del profilo sanitario (l'BluetoothHealth ), la connessione e la comunicazione con i dispositivi sanitari accoppiati riguarda le seguenti nuove Classi Bluetooth:

  • BluetoothHealthCallback: devi estendere questa lezione e implementare il metodi di callback per ricevere aggiornamenti sulle modifiche allo stato di registrazione dell'applicazione e Stato del canale Bluetooth.
  • BluetoothHealthAppConfiguration: durante i callback al tuo BluetoothHealthCallback, riceverai un'istanza di questo oggetto, che fornisce informazioni di configurazione sul dispositivo Bluetooth Health disponibile, che devi utilizzare per eseguire varie operazioni come l'avvio e la terminazione delle connessioni con le API di BluetoothHealth.

Per ulteriori informazioni sull'uso del profilo Salute Bluetooth, consulta la documentazione di BluetoothHealth.

Accessibilità

Android 4.0 migliora l'accessibilità per gli utenti con disabilità visiva grazie alla nuova modalità Esplora al tocco e API estese che ti consentono di fornire maggiori informazioni su visualizzare contenuti o sviluppare servizi di accessibilità avanzati.

Modalità Esplora al tocco

Gli utenti affetti da ipovedenti ora possono esplorare lo schermo toccando e trascinando un dito sul schermo per ascoltare le descrizioni vocali dei contenuti. La modalità Esplora al tocco funziona come un cursore virtuale, consente agli screen reader di identificare il testo descrittivo nello stesso modo in cui i lettori possono quando l'utente naviga con un D-pad o una trackball, leggendo le informazioni fornite di android:contentDescription e setContentDescription() al passaggio del mouse simulato . Quindi, Tieni presente che questo è un promemoria per ricordarti di fornire un testo descrittivo per le visualizzazioni in soprattutto per ImageButton, EditText, ImageView e altri widget che potrebbero non contenere naturalmente testo.

Accessibilità per le visualizzazioni

Per migliorare le informazioni disponibili per i servizi di accessibilità come gli screen reader, puoi: implementare nuovi metodi di callback per gli eventi di accessibilità nei componenti View personalizzati.

Innanzitutto, è importante notare che il comportamento del metodo sendAccessibilityEvent() è cambiato in Android 4,0. Come con la versione precedente di Android, quando l'utente attiva i servizi di accessibilità sul dispositivo e un evento di input come un clic o un passaggio del mouse, la rispettiva vista riceve una notifica con una chiamata a sendAccessibilityEvent(). In precedenza, l'implementazione di sendAccessibilityEvent() andrebbe inizializza AccessibilityEvent e invialo a AccessibilityManager. Il nuovo comportamento prevede alcune chiamate aggiuntive metodi che consentono alla visualizzazione e ai relativi elementi principali di aggiungere ulteriori informazioni contestuali all'evento:

  1. Se richiamati, i metodi sendAccessibilityEvent() e sendAccessibilityEventUnchecked() rinviano a onInitializeAccessibilityEvent().

    Le implementazioni personalizzate di View potrebbero voler implementare onInitializeAccessibilityEvent() per aggiungere ulteriori informazioni sull'accessibilità a AccessibilityEvent, ma devi anche chiamare la super-implementazione per forniscono informazioni predefinite come la descrizione standard dei contenuti, l'indice degli articoli e altro ancora. Tuttavia, non devi aggiungere altri contenuti testuali in questo callback, poiché succede a questo punto.

  2. Una volta inizializzato, l'evento è uno dei vari tipi che dovrebbe essere compilato con testo. informazioni, la vista riceve una chiamata a dispatchPopulateAccessibilityEvent(), che rimanda al onPopulateAccessibilityEvent() di Google.

    In genere, le implementazioni personalizzate di View devono implementare onPopulateAccessibilityEvent() per aggiungerne altre contenuti testuali in AccessibilityEvent se il testo android:contentDescription non è presente o insufficiente. Per aggiungere ulteriore descrizione testuale alla AccessibilityEvent, chiama getText().add().

  3. A questo punto, View passa l'evento nella gerarchia delle visualizzazioni richiamando requestSendAccessibilityEvent() il vista genitore. Ogni vista genitore ha poi la possibilità di aumentare le informazioni sull'accessibilità aggiungendo un elemento AccessibilityRecord, finché raggiunge la vista principale, che invia l'evento a AccessibilityManager con sendAccessibilityEvent().

Oltre ai nuovi metodi descritti sopra, che sono utili quando estendi la classe View, puoi anche intercettare questi callback di eventi su qualsiasi View estendendo AccessibilityDelegate e impostandolo sulla vista con setAccessibilityDelegate(). In questo caso, ciascun metodo di accessibilità nella vista reindirizza la chiamata al metodo corrispondente in del delegato. Ad esempio, quando la vista riceve una chiamata a onPopulateAccessibilityEvent(), la passa alla lo stesso metodo in View.AccessibilityDelegate. Qualsiasi metodo non gestito da il delegato torna direttamente alla vista per il comportamento predefinito. Questo ti permette di eseguire solo l'override i metodi necessari per una determinata vista senza estendere la classe View.

Se vuoi mantenere la compatibilità con le versioni di Android precedenti alla 4.0, supportando al contempo le nuove API di accessibilità, puoi farlo con l'ultima versione del supporto v4 libreria (in Compatibility Package, r4) utilizzando un insieme di classi di utilità che forniscono le nuove API di accessibilità in un ambiente la progettazione.

Servizi di accessibilità

Se stai sviluppando un servizio di accessibilità, le informazioni sui vari eventi di accessibilità è stata notevolmente ampliata per offrire agli utenti feedback sull'accessibilità più avanzati. Nella specifici, gli eventi vengono generati in base alla composizione delle visualizzazioni, fornendo informazioni di contesto migliori e consentendo ai servizi di accessibilità di attraversare le gerarchie di oggetti View per ottenere ulteriori informazioni e di affrontare casi speciali.

Se stai sviluppando un servizio di accessibilità (ad esempio uno screen reader), puoi accedere ulteriori informazioni sui contenuti e attraversare le gerarchie di visualizzazioni con la seguente procedura:

  1. Dopo aver ricevuto AccessibilityEvent da un'applicazione, richiama AccessibilityEvent.getRecord() per recuperare uno specifico AccessibilityRecord (potrebbero esserci diversi record allegati ).
  2. Da AccessibilityEvent o da un singolo AccessibilityRecord, puoi chiamare getSource() per recuperare un oggetto AccessibilityNodeInfo.

    Un AccessibilityNodeInfo rappresenta un singolo nodo del contenuto della finestra in un formato che consente di eseguire query sulle informazioni sull'accessibilità nodo. L'oggetto AccessibilityNodeInfo restituito da AccessibilityEvent descrive l'origine dell'evento, mentre l'origine da un AccessibilityRecord descrive il predecessore dell'evento sorgente.

  3. Con AccessibilityNodeInfo, puoi eseguire query sulle informazioni chiama getParent() o getChild() per attraversare la vista gerarchia e perfino di aggiungere viste figlio al nodo.

Per poter pubblicare l'applicazione nel sistema come servizio di accessibilità, deve dichiarare un file di configurazione XML che corrisponda a AccessibilityServiceInfo. Per ulteriori informazioni sulla creazione di un servizio di accessibilità, consulta i AccessibilityService e SERVICE_META_DATA per informazioni sulla configurazione XML.

Altre API di accessibilità

Se ti interessa lo stato di accessibilità del dispositivo, AccessibilityManager ha alcune nuove API, tra cui:

Servizi di controllo ortografico

Un nuovo framework di controllo ortografico consente alle app di creare controlli ortografici in modo simile alla metodo di input (per gli IME). Per creare un nuovo controllo ortografico, devi implementare un servizio che si estende SpellCheckerService ed estendi la classe SpellCheckerService.Session per fornire suggerimenti ortografici basati sul testo fornito dai metodi di callback dell'interfaccia. Nei metodi di callback SpellCheckerService.Session, devi restituire il valore suggerimenti ortografici come oggetti SuggestionsInfo.

Le applicazioni con un servizio di controllo ortografico devono dichiarare l'autorizzazione BIND_TEXT_SERVICE come richiesto dal servizio. Il servizio deve anche dichiarare un filtro per intent con <action android:name="android.service.textservice.SpellCheckerService" /> come azione dell'intent e deve includi un elemento <meta-data> che dichiara le informazioni di configurazione per l'incantesimo controllo.

Guarda l'esempio app di controllo ortografico e esempio Client di controllo ortografico per vedere un esempio di codice.

Motori di sintesi vocale

Le API di sintesi vocale di Android sono state significativamente estese per consentire alle applicazioni di implementare più facilmente i motori di sintesi vocale personalizzati, mentre le applicazioni che vogliono utilizzare un motore di sintesi vocale hanno coppia nuove API per la selezione di un motore.

Utilizzo dei motori di sintesi vocale

Nelle versioni precedenti di Android, potevi utilizzare la classe TextToSpeech eseguire operazioni di sintesi vocale (TTS) utilizzando il motore TTS fornito dal sistema o impostare motore personalizzato utilizzando setEngineByPackageName(). In Android 4.0, il metodo setEngineByPackageName() è stato obsoleto e ora puoi specificare il motore da utilizzare con un nuovo costruttore TextToSpeech che accetta il nome pacchetto di un motore TTS.

Puoi anche eseguire query sui motori di sintesi vocale disponibili con getEngines(). Questo metodo restituisce un elenco di oggetti TextToSpeech.EngineInfo, che includono metadati come l'oggetto icona, etichetta e nome del pacchetto.

Creazione dei motori di sintesi vocale

In precedenza, i motori personalizzati richiedevano che il motore venisse creato utilizzando un'intestazione nativa non documentata . In Android 4.0 è disponibile un set completo di API framework per la creazione di motori di sintesi vocale.

La configurazione di base richiede l'implementazione di TextToSpeechService che risponde all'intent INTENT_ACTION_TTS_SERVICE. La il lavoro principale per un motore di sintesi vocale viene eseguito durante il callback onSynthesizeText() in un servizio che estende TextToSpeechService. Il sistema fornisce questo metodo due oggetti:

  • SynthesisRequest: contiene vari dati, tra cui il testo da sintetizza, le impostazioni internazionali, la velocità della voce e il tono della voce.
  • SynthesisCallback: questa è l'interfaccia che consente al tuo motore di sintesi vocale fornisce i dati vocali risultanti sotto forma di audio in streaming. Innanzitutto, il motore deve chiamare start() per indicare che è pronto per la pubblicazione l'audio, quindi chiama audioAvailable(), passando i dati audio in un buffer di byte. Una volta che il motore ha passato tutto l'audio attraverso buffer, chiama done().

Ora che il framework supporta una vera API per la creazione di motori di sintesi vocale, il supporto del codice nativo è stata rimossa. Cerca un post del blog su un livello di compatibilità che puoi usare per convertire i vecchi motori di sintesi vocale nel nuovo framework.

Per un motore di sintesi vocale di esempio che utilizza le nuove API, vedi l'app di esempio Motore di sintesi vocale.

Utilizzo della rete

Android 4.0 offre agli utenti una visibilità precisa della quantità di dati di rete utilizzati dalle loro applicazioni. L'app Impostazioni fornisce controlli che consentono agli utenti di gestire i limiti impostati per l'utilizzo dei dati di rete e disattivare l'utilizzo dei dati in background per singole app. Per evitare che gli utenti disattivino l'accesso dell'app ai dati in background, dovresti sviluppare strategie per utilizzare i dati la connessione in modo efficiente e regolare l'utilizzo in base al tipo di connessione disponibile.

Se la tua applicazione esegue molte transazioni di rete, devi fornire le impostazioni utente che Consenti agli utenti di controllare le abitudini della tua app in relazione ai dati, ad esempio la frequenza con cui l'app sincronizza i dati, se eseguire caricamenti/download solo in Wi-Fi, se utilizzare i dati in roaming e così via. Con questi controlli a loro disposizione, è molto meno probabile che gli utenti disattivino l'accesso della tua app ai dati quando si avvicinano ai propri limiti, perché possono invece controllare con precisione la quantità di dati utilizzata dalla tua app. Se fornisci un'attività di preferenza con queste impostazioni, devi includere nel file manifest dichiara un filtro per intent per ACTION_MANAGE_NETWORK_USAGE un'azione. Ad esempio:

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

Questo filtro per intent indica al sistema che questa è l'attività che controlla i tuoi dell'utilizzo dei dati da parte dell'applicazione. Pertanto, quando l'utente controlla la quantità di dati utilizzata dalla tua app App Impostazioni, un'opzione "Visualizza impostazioni applicazioni" è disponibile che avvia in modo che l'utente possa perfezionare la quantità di dati utilizzata dalla tua app.

Inoltre, tieni presente che getBackgroundDataSetting() è ora deprecato e restituisce sempre true. Utilizza invece getActiveNetworkInfo(). Prima di tentare qualsiasi rete transazioni, devi sempre chiamare getActiveNetworkInfo() per ottenere il NetworkInfo che rappresenta la rete attuale ed eseguire una query isConnected() per verificare se il dispositivo ha un connessione. Puoi quindi controllare altre proprietà della connessione, ad esempio se il dispositivo è in roaming o connesso alla rete Wi-Fi.

Aziende

Android 4.0 amplia le funzionalità per le applicazioni aziendali con le seguenti funzionalità.

Servizi VPN

Il nuovo VpnService consente alle applicazioni di creare la propria VPN (Virtuale rete privata), in esecuzione come Service. Un servizio VPN crea un'interfaccia per rete virtuale con il proprio indirizzo e le proprie regole di routing ed esegue tutte le operazioni di lettura e scrittura con come descrittore del file.

Per creare un servizio VPN, usa VpnService.Builder, che ti consente di specificare indirizzo di rete, server DNS, route di rete e altro ancora. Al termine, puoi definire richiamando establish(), che restituisce un ParcelFileDescriptor.

Dal momento che un servizio VPN può intercettare i pacchetti, ci sono implicazioni per la sicurezza. Pertanto, se implementare VpnService, il tuo servizio deve richiedere il BIND_VPN_SERVICE per garantire che solo il sistema possa associarlo (solo al sistema viene concessa questa autorizzazione, le app non possono richiederla). Per utilizzare il servizio VPN, gli utenti devono abilitarla manualmente nelle impostazioni di sistema.

Criteri relativi ai dispositivi

Le applicazioni che gestiscono le limitazioni dei dispositivi ora possono disattivare la videocamera tramite setCameraDisabled() e la proprietà USES_POLICY_DISABLE_CAMERA (applicata con un elemento <disable-camera /> nel file di configurazione dei criteri).

Gestione dei certificati

La nuova classe KeyChain fornisce API che ti consentono di eseguire l'importazione e accedere nell'archivio chiavi di sistema. I certificati semplificano l'installazione dei due client (per convalidare l'identità dell'utente) e i certificati dell'autorità di certificazione (per verificare l'identità del server). Applicazioni come browser web o client di posta possono accedere ai file installati per autenticare gli utenti nei server. Consulta KeyChain documentazione per ulteriori informazioni.

Sensori dei dispositivi

In Android 4.0 sono stati aggiunti due nuovi tipi di sensori:

  • TYPE_AMBIENT_TEMPERATURE: un sensore di temperatura che fornisce la temperatura ambiente (stanza) in gradi Celsius.
  • TYPE_RELATIVE_HUMIDITY: un sensore di umidità che fornisce la umidità relativa dell'ambiente (stanza) in percentuale.

Se un dispositivo ha entrambi i sensori TYPE_AMBIENT_TEMPERATURE e TYPE_RELATIVE_HUMIDITY, puoi utilizzarli per calcolare il punto di rugiada e umidità assoluta.

Il sensore di temperatura precedente, TYPE_TEMPERATURE, è stato ritirato. Dovresti usare il sensore TYPE_AMBIENT_TEMPERATURE .

Inoltre, i tre sensori sintetici di Android sono stati notevolmente migliorati, quindi ora dispongono di servizi latenza e un output più fluido. Questi sensori includono il sensore di gravità (TYPE_GRAVITY), il sensore del vettore di rotazione (TYPE_ROTATION_VECTOR) e il sensore di accelerazione lineare (TYPE_LINEAR_ACCELERATION). I sensori migliorati si affidano al giroscopio sensore per migliorare la resa, in modo che i sensori appaiano solo sui dispositivi dotati di giroscopio.

Barra delle azioni

ActionBar è stato aggiornato per supportare diversi nuovi comportamenti. Più alta importante, il sistema gestisce agevolmente le dimensioni e la configurazione della barra delle azioni quando viene eseguita su schermi più piccoli, in modo da offrire un'esperienza utente ottimale su schermi di tutte le dimensioni. Ad esempio: quando lo schermo è stretto (ad esempio quando lo smartphone è in orientamento verticale), l'icona della barra delle azioni le schede di navigazione appaiono in una "barra in pila" direttamente sotto la barra delle azioni principale. Puoi attivare anche una "barra delle azioni divisa", che posiziona tutte le attività in una barra separata in basso dello schermo quando è stretto.

Barra delle azioni divisa

Se la barra delle azioni include diverse attività, non tutte potranno essere visualizzate nella barra delle azioni. uno schermo stretto, in modo che il sistema ne inserisca di più nel menu extra. Tuttavia, Android 4.0 ti consente di attivare la "barra delle azioni divisa" in modo che più attività possano essere visualizzate sullo schermo in barra separata nella parte inferiore dello schermo. Per attivare la barra delle azioni suddivise, aggiungi android:uiOptions con "splitActionBarWhenNarrow" a uno dei tuoi <application>: o singoli tag <activity> nel file manifest. Quando questa opzione è attiva, il sistema aggiunge un'ulteriore barra in fondo alla schermata per tutte le attività quando lo schermo è stretto (nessuna attività verrà visualizzata nella barra delle azioni).

Se vuoi usare le schede di navigazione fornite dalle API di ActionBar.Tab, ma non hai bisogno della barra principale delle azioni in alto (vuoi che vengano visualizzate solo le schede in alto), quindi attiva la barra delle azioni di suddivisione come descritto sopra e richiama anche setDisplayShowHomeEnabled(false) per disattivare sull'icona dell'applicazione nella barra delle azioni. Non è rimasto nulla nella barra delle azioni principale scompare: a sinistra sono presenti le schede di navigazione in alto e le attività nella nella parte inferiore dello schermo.

Stili della barra delle azioni

Se vuoi applicare stili personalizzati alla barra delle azioni, puoi utilizzare le nuove proprietà di stile backgroundStacked e backgroundSplit per applicare uno sfondo disegna o colorare rispettivamente la barra in pila e la barra divisa. Puoi anche impostare questi stili un runtime con setStackedBackgroundDrawable() e setSplitBackgroundDrawable().

Fornitore di azioni

La nuova classe ActionProvider ti consente di creare un gestore specializzato per attività. Un fornitore di azioni può definire una visualizzazione delle azioni, un comportamento predefinito delle azioni e un sottomenu per ogni attività a cui è associato. Quando vuoi creare un'attività che abbia comportamenti dinamici (ad esempio una visualizzazione delle azioni variabili, un'azione predefinita o un sottomenu), l'estensione di ActionProvider è una buona soluzione per creare un componente riutilizzabile, anziché per gestire le varie trasformazioni delle attività nel frammento o nell'attività.

Ad esempio, ShareActionProvider è un'estensione di ActionProvider che facilita una "condivisione" un'azione dalla barra delle azioni. Invece di utilizzare tradizionale che richiama l'intent ACTION_SEND, puoi utilizza questo provider di azioni per presentare una vista azioni con un elenco a discesa di applicazioni che gestiscono l'intent ACTION_SEND. Quando l'utente seleziona un'applicazione da utilizzare. per l'azione, ShareActionProvider ricorda la selezione e la fornisce nella visualizzazione Azioni per accedere più rapidamente alla condivisione con l'app.

Per dichiarare un fornitore di azioni per un'attività, includi android:actionProviderClass nell'elemento <item> del menu opzioni dell'attività, con il nome della classe dell'azione provider come valore. Ad esempio:

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

Nei onCreateOptionsMenu() delle tue attività di callback, recupera un'istanza del provider di azioni dalla voce di menu e imposta 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);
}

Per un esempio di utilizzo di ShareActionProvider, vedi ActionBarShareActionProviderActivity in ApiDemos.

Visualizzazioni azioni comprimibili

Le attività che forniscono una visualizzazione azione ora possono passare dallo stato di tale visualizzazione a quello tradizionale stato dell'attività. In precedenza, supportavano solo SearchView quando viene utilizzata come visualizzazione delle azioni, ma ora puoi aggiungerne una per qualsiasi attività passa dallo stato espanso (la visualizzazione dell'azione è visibile) a quello compresso (l'elemento dell'azione è visibile).

Per dichiarare che un'attività contenente una visualizzazione delle azioni può essere comprimibile, includi il flag “collapseActionView" nell'attributo android:showAsAction per l'elemento <item> nel file XML del menu.

Per ricevere i callback quando una visualizzazione delle azioni passa dalla visualizzazione espansa a quella compressa, registra un di MenuItem.OnActionExpandListener con il rispettivo MenuItem mediante la chiamata di setOnActionExpandListener(). In genere, devi farlo durante il callback onCreateOptionsMenu().

Per controllare una visualizzazione dell'azione comprimibile, puoi chiamare collapseActionView() e expandActionView() su il rispettivo MenuItem.

Quando crei una visualizzazione di azioni personalizzate, puoi anche implementare la nuova interfaccia CollapsibleActionView per ricevere callback quando la visualizzazione viene espansa e compressi.

Altre API per la barra delle azioni

  • setHomeButtonEnabled() ti consente di specificare se l'icona o il logo si comporta come un pulsante per andare alla schermata Home o verso l'alto (passa "true" per fare in modo che si comporti come un pulsante).
  • setIcon() e setLogo() ti consentono di definire l'icona o il logo della barra delle azioni in fase di esecuzione.
  • Fragment.setMenuVisibility() ti consente di attivare o disabilitare la visibilità delle voci di menu opzioni dichiarate dal frammento. Questo è utile se frammento è stato aggiunto all'attività, ma non è visibile, quindi le voci di menu dovrebbero essere nascosti.
  • FragmentManager.invalidateOptionsMenu() consente di invalidare il menu opzioni dell'attività durante i vari stati del ciclo di vita dei frammenti in cui l'utilizzo del metodo equivalente da Activity potrebbe non essere disponibile.

Interfaccia utente e visualizzazioni

Android 4.0 introduce una serie di nuove viste e altri componenti UI.

Layout griglia

GridLayout è un nuovo gruppo di viste che posiziona le visualizzazioni secondarie in un riquadro rettangolare a griglia. A differenza di TableLayout, GridLayout si basa su un piano gerarchia e non utilizza viste intermedie come le righe delle tabelle per fornire la struttura. Al contrario, gli elementi secondari specificano quali righe e colonne devono occupare (le celle possono estendersi righe e/o colonne) e, per impostazione predefinita, sono disposte in sequenza nelle righe e nelle colonne della griglia. L'orientamento GridLayout determina se gli elementi secondari sequenziali sono per per impostazione predefinita, in orizzontale o in verticale. Lo spazio tra i publisher secondari può essere specificato utilizzando delle istanze della nuova vista Space o impostando i parametri di margine pertinenti sui bambini.

Vedi ApiDemos per i campioni che utilizzano GridLayout.

Visualizzazione texture

TextureView è una nuova visualizzazione che ti consente di visualizzare uno stream di contenuti, ad esempio come video o come scena OpenGL. Sebbene simile a SurfaceView, TextureView è unico in quanto si comporta come una visualizzazione normale, invece di creare una in una finestra separata, in modo da poterlo trattare come qualsiasi altro oggetto View. Ad esempio: puoi applicare trasformazioni, animarle con ViewPropertyAnimator o regolane l'opacità di setAlpha().

Tieni presente che TextureView funziona solo in una finestra con accelerazione hardware.

Per saperne di più, consulta la documentazione di TextureView.

Cambia widget

Il nuovo widget Switch è un pulsante di attivazione/disattivazione a due stati che gli utenti possono trascinare su uno o l'altro (o semplicemente toccarlo) per alternare un'opzione tra due stati.

Puoi utilizzare gli attributi android:textOn e android:textOff per specificare il testo sull'opzione quando il dispositivo è attivato o disattivato. Anche l'attributo android:text consente di inserire un'etichetta accanto all'opzione.

Per un esempio sull'utilizzo dei sensori, consulta il file di layout switches.xml e i rispettivi Switch .

Android 3.0 ha introdotto PopupMenu per creare brevi menu contestuali che appaiono in corrispondenza di un punto di ancoraggio da te specificato (di solito nel punto dell'elemento selezionato). Android 4.0 estende PopupMenu con un paio di funzionalità utili:

Preferenze

Una nuova classe astratta TwoStatePreference funge da base per che forniscono un'opzione di selezione a due stati. La nuova SwitchPreference è un'estensione di TwoStatePreference che fornisce un widget Switch nella per consentire agli utenti di attivare o disattivare un'impostazione senza dover aprire un'altra schermata o finestra di dialogo delle preferenze. Ad esempio, l'applicazione Impostazioni utilizza SwitchPreference per le impostazioni Wi-Fi e Bluetooth.

Temi di sistema

Il tema predefinito per tutte le applicazioni destinate ad Android 4.0 (impostando targetSdkVersion o minSdkVersion a “14" o successiva) è ora il "valore predefinito dispositivo" tema: Theme.DeviceDefault. Potrebbe essere tema scuro Holo o un tema scuro diverso definito dal dispositivo specifico.

È garantito che la famiglia di temi Theme.Holo non cambi da un dispositivo all'altro con la stessa versione di Android. Se in modo esplicito applicare uno qualsiasi dei Theme.Holo temi alle tue attività, puoi ti garantisco che questi temi non cambieranno carattere su dispositivi diversi all'interno dello stesso completamente gestita.

Se vuoi che la tua app si confonda con il tema generale del dispositivo (ad esempio quando i diversi OEM) fornire temi predefiniti diversi per il sistema), devi applicare esplicitamente temi della famiglia Theme.DeviceDefault.

Pulsante del menu Opzioni

A partire da Android 4.0, noterai che i telefoni non richiedono più un pulsante hardware Menu. Tuttavia, non dovrai preoccuparti se la tua applicazione esistente fornisce un menu opzioni e si aspetta che ci sia una Pulsante Menu. Per garantire che le app esistenti continuino a funzionare come previsto, il sistema fornisce una il pulsante Menu sullo schermo per le app progettate per versioni precedenti di Android.

Per una migliore esperienza utente, le app nuove e aggiornate devono invece utilizzare l'ActionBar per fornire l'accesso alle voci di menu e impostare targetSdkVersion su "14" per sfruttare i più recenti comportamenti predefiniti del framework.

Controlli per la visibilità dell'interfaccia utente di sistema

Sin dagli albori di Android, il sistema ha gestito un componente UI noto come stato , che si trova nella parte superiore dei dispositivi degli smartphone per fornire informazioni quali l'operatore segnale, ora, notifiche e così via. Android 3.0 ha aggiunto la barra di sistema per i tablet disponibili nella parte inferiore dello schermo per fornire i controlli di navigazione del sistema (Home, Indietro e così via) nonché un'interfaccia per gli elementi tradizionalmente forniti dalla barra di stato. Nella Android 4.0, il sistema fornisce un nuovo tipo di interfaccia utente di sistema chiamata barra di navigazione. Tu potrebbe considerare la barra di navigazione una versione ottimizzata di quella di sistema, smartphone: fornisce i controlli di navigazione. per i dispositivi che non dispongono di controparti hardware per la navigazione nel sistema, ma tralascia l'interfaccia utente di notifica e i controlli di impostazione della barra di sistema. Pertanto, un dispositivo che fornisce la navigazione ha anche la barra di stato in alto.

Fino ad oggi, puoi nascondere la barra di stato sui telefoni usando il flag FLAG_FULLSCREEN. In Android 4.0, le API che controllano la visibilità della barra di sistema è stata aggiornata per rispecchiare meglio il comportamento della barra e barra di navigazione:

  • Il flag SYSTEM_UI_FLAG_LOW_PROFILE sostituisce il flag STATUS_BAR_HIDDEN. Se impostato, questo flag abilita "low profile" per la barra di sistema barra di navigazione. I pulsanti di navigazione vengono attenuati e altri elementi nella barra di sistema vengono nascosti. Abilitazione in corso... Ciò è utile per creare giochi più coinvolgenti senza distrazioni per la navigazione del sistema. pulsanti.
  • Il flag SYSTEM_UI_FLAG_VISIBLE sostituisce il flag STATUS_BAR_VISIBLE per richiedere che la barra di sistema o la barra di navigazione siano visibili.
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION è un nuovo flag che richiede nascondere completamente la barra di navigazione. Tieni presente che questa opzione funziona solo per la barra di navigazione utilizzati da alcuni telefoni (non nasconde la barra di sistema sui tablet). La navigazione torna alla visualizzazione non appena il sistema riceve un input dell'utente. Di conseguenza, questa modalità è utile principalmente per la riproduzione di video o in altri casi in cui occorre utilizzare l'intero schermo, ma l'input dell'utente non è obbligatorio.

Puoi impostare ciascuno di questi flag per la barra di sistema e la barra di navigazione chiamando setSystemUiVisibility() in qualsiasi vista della tua attività. La gestore di finestre combina (OR insieme) tutti i flag di tutte le visualizzazioni della finestra e e applicarle all'interfaccia utente di sistema purché la finestra abbia lo stato attivo per l'input. Quando la finestra perde l'input lo stato attivo (l'utente esce dalla tua app o viene visualizzata una finestra di dialogo), le segnalazioni non hanno più effetto. Analogamente, se rimuovi queste visualizzazioni dalla gerarchia delle visualizzazioni, i relativi flag non verranno più applicati.

Per sincronizzare altri eventi della tua attività con le modifiche di visibilità nell'interfaccia utente di sistema (ad ad esempio, nascondi la barra delle azioni o altri controlli dell'interfaccia utente quando l'UI di sistema si nasconde), devi registrare un View.OnSystemUiVisibilityChangeListener per ricevere una notifica quando la visibilità delle modifiche alla barra di sistema o alla barra di navigazione.

Consulta OverscanActivity per una dimostrazione delle diverse opzioni di interfaccia utente di sistema.

Framework di input

Android 4.0 aggiunge il supporto per gli eventi di passaggio del cursore e per gli eventi relativi al pulsante del mouse e allo stilo.

Eventi di passaggio del mouse

Il corso View ora supporta il passaggio del mouse per rendere possibili interazioni più avanzate mediante l'uso di dispositivi di puntamento (come un mouse o altri dispositivi che attivano una schermata del cursore).

Per ricevere gli eventi di passaggio del mouse su una vista, implementa View.OnHoverListener e registralo con setOnHoverListener(). Quando un utente passa il mouse si verifica nella vista, il listener riceve una chiamata a onHover(), fornendo il valore View che ha ricevuto l'evento e un MotionEvent che descrive il tipo di evento di passaggio del mouse che si è verificato. L'evento di passaggio del mouse può essere uno dei seguenti:

View.OnHoverListener dovrebbe restituire true da onHover() se gestisce l'evento di passaggio del mouse. Se le tue listener restituisce false, l'evento di passaggio del mouse verrà inviato alla vista principale come di consueto.

Se l'applicazione utilizza pulsanti o altri widget che cambiano aspetto in base all'impostazione stato attuale, ora puoi utilizzare l'attributo android:state_hovered in un elenco di stati richiamabile fornisce un elemento disegnabile sullo sfondo diverso al passaggio del cursore sulla vista.

Per una dimostrazione dei nuovi eventi di passaggio del mouse, consulta la classe Hover in apiDemos.

Eventi relativi allo stilo e al pulsante del mouse

Android ora fornisce API per ricevere input da un dispositivo di input con stilo, ad esempio un digitalizzatore una periferica per tablet o un touchscreen compatibile con lo stilo.

L'input dello stilo funziona in modo simile all'input del tocco o del mouse. Quando lo stilo è a contatto con il digitalizzatore, le applicazioni ricevono eventi touch proprio come farebbero quando si utilizza un dito tocca il display. Quando lo stilo si trova sopra il digitalizzatore, le applicazioni ricevono il passaggio del mouse eventi proprio come avveniva quando il puntatore del mouse veniva spostato sul display quando non ci sono pulsanti sono stati premute.

La tua applicazione può distinguere tra input di dita, mouse, stilo e gomma eseguendo una query sul "tipo di strumento" associata a ogni puntatore in un MotionEvent utilizzando getToolType(). I tipi di strumenti attualmente definiti sono: TOOL_TYPE_UNKNOWN, TOOL_TYPE_FINGER, TOOL_TYPE_MOUSE TOOL_TYPE_STYLUS e TOOL_TYPE_ERASER. Eseguendo una query sul tipo di strumento, l'applicazione puoi scegliere di gestire l'input con lo stilo in modi diversi rispetto all'input con il dito o con il mouse.

La tua applicazione può anche interrogare i pulsanti del mouse o dello stilo su cui vengono premuti i pulsanti interrompi il "pulsante stato" di MotionEvent utilizzando getButtonState(). Gli stati dei pulsanti attualmente definiti sono: BUTTON_PRIMARY, BUTTON_SECONDARY, BUTTON_TERTIARY, BUTTON_BACK e BUTTON_FORWARD. Per praticità, i pulsanti Avanti e Indietro del mouse mappate automaticamente alle chiavi KEYCODE_BACK e KEYCODE_FORWARD. La tua applicazione può gestire queste chiavi per il supporto con il pulsante del mouse per la navigazione in avanti e indietro.

Oltre a misurare con precisione la posizione e la pressione di un contatto, alcuni input stilo indicano anche la distanza tra la punta dello stilo e il digitalizzatore, l'angolo di inclinazione dello stilo, e l'angolo di orientamento dello stilo. La tua applicazione può eseguire query su queste informazioni utilizzando getAxisValue() con i codici asse AXIS_DISTANCE, AXIS_TILT e AXIS_ORIENTATION.

Per una dimostrazione dei tipi di strumenti, degli stati dei pulsanti e dei nuovi codici degli assi, consulta la sezione TouchPaint in ApiDemos.

Proprietà

La nuova classe Property offre un modo rapido, efficiente e semplice per specificare di qualsiasi oggetto che consente ai chiamanti di impostare/ottenere genericamente valori sugli oggetti target. Inoltre, permette di trasmettere i riferimenti a campo/metodo e al codice di impostare/ottenere valori della proprietà senza conoscere i dettagli di quali sono i campi/metodi.

Ad esempio, se vuoi impostare il valore del campo bar sull'oggetto foo, devi in precedenza:

Kotlin

foo.bar = value

Java

foo.bar = value;

Per chiamare il setter per un campo privato sottostante bar, usavi fai questo:

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

Tuttavia, se vuoi passare l'istanza foo e impostare un altro codice bar, non c'è modo di farlo prima di Android 4.0.

Utilizzando la classe Property, puoi dichiarare un Property l'oggetto BAR nella classe Foo per poter impostare il campo sull'istanza foo di classe Foo in questo modo:

Kotlin

BAR.set(foo, value)

Java

BAR.set(foo, value);

La classe View ora utilizza la classe Property per ti consentono di impostare vari campi, ad esempio le proprietà di trasformazione aggiunte in Android 3.0 (ROTATION, ROTATION_X, TRANSLATION_X e così via).

Il corso ObjectAnimator utilizza anche Property , quindi puoi creare un ObjectAnimator con un Property, che è più veloce, efficiente e sicuro per i tipi di caratteri l'importanza di un approccio umile.

Accelerazione hardware

A partire da Android 4.0, l'accelerazione hardware per tutte le finestre è abilitata per impostazione predefinita se il tuo dell'applicazione ha impostato targetSdkVersion o minSdkVersion a “14" o superiore. L'accelerazione hardware solitamente si traduce in animazioni più fluide, scorrimento, migliorando complessivamente le prestazioni e la risposta all'interazione dell'utente.

Se necessario, puoi disattivare manualmente l'accelerazione hardware con il hardwareAccelerated per i singoli elementi <activity> o l'attributo <application> . In alternativa, puoi disattivare l'accelerazione hardware per singole visualizzazioni chiamando il numero setLayerType(LAYER_TYPE_SOFTWARE).

Per ulteriori informazioni sull'accelerazione hardware, incluso un elenco di disegni non supportati operazioni, consulta la sezione Hardware Documento di accelerazione.

Modifiche JNI

Nelle versioni precedenti di Android, i riferimenti locali di JNI non erano handle indiretti, Android utilizzato puntatori diretti. Questo non era un problema purché il garbage collection non spostasse oggetti, funzionava perché permetteva di scrivere codice con bug. In Android 4.0, il sistema ora utilizza riferimenti indiretti per rilevare questi bug.

I dettagli dei riferimenti locali di JNI sono descritti in "Riferimenti locali e globali" nei suggerimenti di JNI. In Android 4.0, CheckJNI è stato migliorato per rilevare questi errori. Leggi il prossimo post sul Blog per sviluppatori Android sugli errori comuni dei riferimenti JNI e su come correggerli.

Questa modifica nell'implementazione di JNI interessa solo le app destinate ad Android 4.0 impostando targetSdkVersion o minSdkVersion a “14" o versioni successive. Se hai impostato questi attributi su un valore inferiore, allora i riferimenti locali JNI si comportano come nelle versioni precedenti.

WebKit

  • WebKit aggiornato alla versione 534.30
  • Supporto per i caratteri indiani (devanagari, bengalese e tamil, incluso il supporto dei caratteri complessi) necessaria per combinare i glifi) in WebView e nel browser integrato
  • Supporto dei caratteri etiopi, georgiani e armeno in WebView e nel browser integrato
  • Il supporto di WebDriver ti consente di è più facile testare le app che utilizzano WebView

Browser Android

L'applicazione Browser aggiunge le seguenti funzionalità per supportare le applicazioni web:

Autorizzazioni

Di seguito sono riportate le nuove autorizzazioni:

Funzionalità del dispositivo

Di seguito sono riportate le nuove funzionalità del dispositivo:

  • FEATURE_WIFI_DIRECT: dichiara che l'applicazione utilizza Wi-Fi per le comunicazioni peer-to-peer.

Per una visualizzazione dettagliata di tutte le modifiche alle API in Android 4.0 (livello API 14), consulta il report Differenze nelle API.

API precedenti

Oltre a quanto sopra, Android 4.0 supporta naturalmente tutte le API delle versioni precedenti. Poiché la piattaforma Android 3.x è disponibile solo per i dispositivi con schermi grandi, se hai , principalmente per gli smartphone, potresti non essere a conoscenza di tutte le API aggiunte ad Android in queste versioni recenti.

Qui puoi trovare alcune delle API più importanti che potrebbero esserti sfuggite e che ora sono disponibili anche sui telefoni:

Android 3.0
  • Fragment: un componente di framework che consente di separare elementi di un'attività in moduli autonomi che definiscono la propria UI e il proprio ciclo di vita. Consulta le Guida per gli sviluppatori relativa ai frammenti.
  • ActionBar: sostituisce la tradizionale barra del titolo nella parte superiore di finestra dell'attività. Include il logo dell'applicazione nell'angolo a sinistra e fornisce una nuova a riga di comando per le voci di menu. Consulta le Guida per gli sviluppatori sulla barra delle azioni.
  • Loader: un componente del framework che facilita la dei dati in combinazione con i componenti dell'interfaccia utente per caricare i dati in modo dinamico senza bloccare thread principale. Consulta le Guida per gli sviluppatori relativa ai caricatori.
  • Appunti di sistema: le applicazioni possono copiare e incollare dati (oltre il semplice testo) da e verso a livello di sistema. I dati troncati possono essere testo normale, URI o intent. Consulta le Guida per gli sviluppatori Copia e incolla.
  • Trascinamento: un insieme di API integrate nel framework di visualizzazione che facilita il trascinamento operazioni. Consulta le Guida per gli sviluppatori relativa al trascinamento.
  • Un nuovissimo framework di animazione flessibile consente di animare proprietà arbitrarie di qualsiasi (View, Drawable, Fragment, Object o qualsiasi altra cosa) e definisci aspetti dell'animazione come come durata, interpolazione, ripetizione e così via. Il nuovo framework rende le animazioni in Android più semplice che mai. Consulta le Sviluppatore Animazione proprietà guida.
  • Grafica e Compute Engine di RenderScript: RenderScript offre un ambiente 3D ad alte prestazioni l'API di rendering grafico e di computing a livello nativo, che scrivi nel linguaggio C (standard C99), offrendo le prestazioni che ti aspetti da un ambiente nativo mantenendo la portabilità su varie CPU e GPU. Consulta le Sviluppatore RenderScript guida.
  • Grafica 2D con accelerazione hardware. Ora puoi attivare il renderer OpenGL per i tuoi impostando {android:hardwareAccelerated="true"} nel file <application> dell'elemento manifest o per il singolo elemento <activity> elementi. Questo porta in animazioni più fluide, scorrimento più fluido e in generale prestazioni e risposta migliori all'utente un'interazione.

    Nota:se imposti minSdkVersion o targetSdkVersion della tua applicazione su "14" o superiore, l'accelerazione hardware è abilitata per impostazione predefinita.

  • E molto altro ancora. Consulta la piattaforma Android 3.0 note per ulteriori informazioni.
Android 3.1
  • API USB: nuove potenti API per l'integrazione di periferiche connesse con App per Android Le API si basano su uno stack USB e su servizi integrato nella piattaforma, con supporto per le interazioni sia su host USB che su dispositivo. Consulta la guida per gli sviluppatori relativa a host e accessorio USB.
  • API MTP/PTP: le applicazioni possono interagire direttamente con le telecamere connesse e altre PTP dispositivi per ricevere notifiche quando i dispositivi vengono collegati e rimossi, nonché per gestire file e spazio di archiviazione su quei dispositivi e di trasferire file e metadati da e verso questi dispositivi. L'API MTP implementa la PTP (Picture Transfer Protocol) della specifica MTP (Media Transfer Protocol). Consulta le documentazione di android.mtp.
  • API RTP: Android espone un'API al proprio stack RTP (Real-time Transport Protocol). quali applicazioni possono utilizzare per gestire i flussi di dati on demand o interattivi. In particolare, le app che forniscono VOIP, push-to-talk, conferenze e streaming audio possono utilizzare l'API per avviare sessioni e trasmettono o ricevono stream di dati su qualsiasi rete disponibile. Consulta la documentazione di android.net.rtp.
  • Supporto per joystick e altri input generici di movimento.
  • Consulta la piattaforma Android 3.1 note per molte altre nuove API.
Android 3.2
  • Le nuove schermate supportano le API che ti offrono un maggiore controllo sulle modalità di gestione delle applicazioni visualizzati su schermi di diverse dimensioni. L'API estende il modello di supporto per lo schermo esistente con la capacità di scegliere come target con precisione intervalli specifici di dimensioni dello schermo in base alle dimensioni, misurate in unità di pixel indipendenti dalla densità (ad esempio 600 dp o 720 dp di larghezza), piuttosto che dalla loro generalizzazione dimensioni dello schermo (ad esempio, grande o xlarge). Ad esempio, questo è importante per distinguere tra 5" e un dispositivo da 7" device, che tradizionalmente vengono raggruppati in bucket "grandi" schermate. Vedi il post del blog Nuovi strumenti per la gestione delle dimensioni dello schermo.
  • Nuove costanti per <uses-feature> a dichiarare i requisiti di orientamento orizzontale o verticale.
  • Le "dimensioni dello schermo" del dispositivo la configurazione cambia ora durante l'orientamento dello schermo modifica. Se la tua app ha come target il livello API 13 o versioni successive, devi gestire "screenSize" modifica alla configurazione se vuoi gestire anche la modifica alla configurazione di "orientation". Consulta android:configChanges per ulteriori informazioni.
  • Consulta la piattaforma Android 3.2 per altre nuove API.

Livello API

All'API Android 4.0 viene assegnato un numero intero 14, archiviato nel sistema stesso. Questo identificatore, chiamato "livello API", consente al sistema di determinare correttamente se un sia compatibile con il sistema prima di installarla.

Per utilizzare le API introdotte in Android 4.0 nella tua applicazione, devi compilare il su una piattaforma Android che supporta il livello API 14 o in alto. In base alle tue esigenze, potrebbe essere necessario aggiungere anche android:minSdkVersion="14" al <uses-sdk> .

Per saperne di più, consulta la pagina Che cos'è l'API Livello?