API Android 3.0

Livello API: 11

Per gli sviluppatori, la piattaforma Android 3.0 (HONEYCOMB) è disponibile come componente scaricabile per l'SDK Android. La piattaforma scaricabile include una libreria Android e un'immagine di sistema, oltre a un set di skin per emulatori e altro ancora. La piattaforma scaricabile non include librerie esterne.

Per gli sviluppatori, la piattaforma Android 3.0 è disponibile come componente scaricabile per l'SDK Android. La piattaforma scaricabile include una libreria Android e un'immagine di sistema, oltre a una serie di skin di emulatori e altro ancora. Per iniziare a sviluppare o testare versioni su Android 3.0, utilizza Android SDK Manager per scaricare la piattaforma nel tuo SDK.

Panoramica dell'API

Le sezioni che seguono forniscono una panoramica tecnica delle novità per gli sviluppatori di Android 3.0, incluse le nuove funzionalità e le modifiche all'API Framework rispetto alla versione precedente.

Frammenti

Un frammento è un nuovo componente del framework che consente di separare elementi distinti di un'attività in moduli indipendenti che definiscono la propria UI e il proprio ciclo di vita. Per creare un frammento, devi estendere la classe Fragment e implementare diversi metodi di callback del ciclo di vita, simili a un Activity. Puoi quindi combinare più frammenti in un'unica attività per creare un'interfaccia utente multi-riquadro in cui ogni riquadro gestisce il proprio ciclo di vita e gli input utente.

Puoi anche utilizzare un frammento senza fornire una UI e utilizzare invece il frammento come worker per l'attività, ad esempio per gestire l'avanzamento di un download che si verifica solo mentre l'attività è in esecuzione.

Inoltre:

  • I frammenti sono autonomi e possono essere riutilizzati in più attività
  • Puoi aggiungere, rimuovere, sostituire e animare frammenti all'interno dell'attività
  • Puoi aggiungere frammenti a uno stack di backup gestito dall'attività, mantenendo lo stato dei frammenti mentre vengono modificati e consentendo all'utente di spostarsi a ritroso tra i diversi stati
  • Se fornisci layout alternativi, puoi combinare e abbinare frammenti in base alle dimensioni e all'orientamento dello schermo
  • I frammenti hanno accesso diretto alla loro attività del contenitore e possono contribuire agli elementi della barra delle azioni dell'attività (esaminata di seguito)

Per gestire i frammenti nell'attività, devi utilizzare FragmentManager, che fornisce diverse API per interagire con i frammenti, ad esempio trovando frammenti nell'attività e separandoli dallo stack posteriore per ripristinare lo stato precedente.

Per eseguire una transazione, ad esempio aggiungere o rimuovere un frammento, devi creare un FragmentTransaction. Puoi quindi chiamare metodi come add() remove() o replace(). Dopo aver applicato tutte le modifiche da eseguire per la transazione, devi chiamare commit() e il sistema applica la transazione del frammento all'attività.

Per ulteriori informazioni sull'utilizzo dei frammenti, leggi la documentazione relativa ai frammenti. Diversi esempi sono disponibili anche nell'applicazione Demo API.

Barra delle azioni

La barra delle azioni sostituisce la tradizionale barra del titolo nella parte superiore della finestra delle attività. Include il logo dell'applicazione nell'angolo a sinistra e fornisce una nuova interfaccia per gli elementi nel menu Opzioni. Inoltre, la barra delle azioni ti consente di:

  • Aggiungi le voci di menu direttamente nella barra delle azioni come "attività".

    Nella dichiarazione XML per la voce di menu, includi l'attributo android:showAsAction con un valore pari a "ifRoom". Quando c'è abbastanza spazio, la voce di menu appare direttamente nella barra delle azioni. In caso contrario, la voce viene inserita nel menu extra, come indicato dall'icona del menu sul lato destro della barra delle azioni.

  • Sostituisci un'attività con un widget (ad esempio una casella di ricerca), creando una "visualizzazione azione".

    Nella dichiarazione XML per la voce di menu, aggiungi l'attributo android:actionViewLayout con una risorsa di layout o l'attributo android:actionViewClass con il nome della classe di un widget. Devi inoltre dichiarare l'attributo android:showAsAction per fare in modo che l'articolo venga visualizzato nella barra delle azioni. Se non c'è abbastanza spazio nella barra delle azioni e la voce viene visualizzata nel menu extra, si comporta come una normale voce di menu e non mostra il widget.

  • Aggiungi un'azione al logo dell'applicazione e sostituiscila con un logo personalizzato

    Al logo dell'applicazione viene assegnato automaticamente l'ID android.R.id.home, che il sistema invia al callback onOptionsItemSelected() dell'attività quando lo tocchi. Rispondi a questo ID nel tuo metodo di callback per eseguire un'azione, ad esempio accedere all'attività "home" della tua applicazione.

    Per sostituire l'icona con un logo, specifica il logo dell'applicazione nel file manifest con l'attributo android:logo, quindi chiama setDisplayUseLogoEnabled(true) nell'attività.

  • Aggiungi breadcrumb per spostarti a ritroso nello stack posteriore di frammenti
  • Aggiungi schede o un elenco a discesa per spostarti tra i frammenti
  • Personalizza la barra delle azioni con temi e sfondi

La barra delle azioni è standard per tutte le applicazioni che utilizzano il nuovo tema olografico, che è standard anche quando imposti android:minSdkVersion o android:targetSdkVersion su "11".

Per ulteriori informazioni sulla barra delle azioni, leggi la documentazione relativa alla barra delle azioni. Diversi esempi sono disponibili anche nell'applicazione Demo API.

Appunti di sistema

Le applicazioni ora possono copiare e incollare dati (oltre al semplice testo) da e verso gli appunti a livello di sistema. I dati ritagliati possono essere testo normale, un URI o un intent.

Fornendo al sistema l'accesso ai dati che vuoi che l'utente copi tramite un fornitore di contenuti, l'utente può copiare contenuti complessi (ad esempio un'immagine o una struttura di dati) dalla tua applicazione e incollarli in un'altra applicazione che supporti quel tipo di contenuti.

Per iniziare a utilizzare gli appunti, recupera l'oggetto globale ClipboardManager chiamando getSystemService(CLIPBOARD_SERVICE).

Per copiare un elemento negli appunti, devi creare un nuovo oggetto ClipData, che contenga uno o più oggetti ClipData.Item, ciascuno dei quali descrive una singola entità. Per creare un oggetto ClipData contenente un solo oggetto ClipData.Item, puoi usare uno dei metodi helper, come newPlainText(), newUri() e newIntent(), ciascuno dei quali restituisce un oggetto ClipData precaricato con il ClipData.Item che fornisci.

Per aggiungere ClipData agli appunti, passalo a setPrimaryClip() per la tua istanza di ClipboardManager.

Potrai quindi leggere un file dagli appunti (per incollarlo) chiamando getPrimaryClip() sul ClipboardManager. Gestire il ClipData che ricevi può essere complicato e devi assicurarti di poter gestire effettivamente il tipo di dati negli appunti prima di tentare di incollarlo.

Gli appunti contengono una sola porzione di dati troncati (un oggetto ClipData) alla volta, ma un ClipData può contenere più ClipData.Item.

Per ulteriori informazioni, leggi la documentazione relativa a copia e incolla. Puoi anche vedere una semplice implementazione del copia e incolla nell'esempio delle demo API e un'implementazione più completa nell'esempio del blocco note.

Trascina

Le nuove API semplificano le operazioni di trascinamento nell'interfaccia utente della tua applicazione. Un'operazione di trascinamento è il trasferimento di un tipo di dati, trasportati in un oggetto ClipData, da un luogo all'altro. Il punto di inizio e di fine dell'operazione di trascinamento è un View, quindi le API che gestiscono direttamente le operazioni di trascinamento sono nella classe View.

Un'operazione di trascinamento ha un ciclo di vita definito da diverse azioni di trascinamento, ciascuna definita da un oggetto DragEvent, come ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED e ACTION_DROP. Ogni vista che vuole partecipare a un'operazione di trascinamento può rimanere in ascolto di queste azioni.

Per iniziare a trascinare i contenuti dell'attività, chiama startDrag() su un View, fornendo un oggetto ClipData che rappresenta i dati da trascinare, un View.DragShadowBuilder per facilitare l'"ombra" che gli utenti vedono sotto le dita durante il trascinamento e un Object che può condividere informazioni sull'oggetto di trascinamento con viste che potrebbero ricevere l'oggetto.

Per accettare un oggetto di trascinamento in un elemento View (ricezione del "rilascio"), registra la visualizzazione con un OnDragListener chiamando setOnDragListener(). Quando si verifica un evento di trascinamento sulla vista, il sistema chiama onDrag() per OnDragListener, che riceve un DragEvent che descrive il tipo di azione di trascinamento che si è verificato (ad esempio ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED e ACTION_DROP). Durante un trascinamento, il sistema chiama ripetutamente onDrag() per la vista sotto il trascinamento, per pubblicare un flusso di eventi di trascinamento. La vista ricevente può chiedere informazioni sul tipo di evento consegnato a onDragEvent() chiamando getAction() al numero DragEvent.

Nota:anche se un evento di trascinamento può portare un oggetto ClipData, non è correlato agli appunti di sistema. Un'operazione di trascinamento non dovrebbe mai inserire i dati trascinati negli appunti di sistema.

Per ulteriori informazioni, leggi la documentazione relativa al trascinamento e all'eliminazione. Puoi anche visualizzare un'implementazione della funzionalità di trascinamento nell'applicazione Demo API e nell'applicazione Honeycomb Gallery.

Widget di app

Android 3.0 supporta diverse nuove classi di widget per altri widget di app interattivi nella schermata Home degli utenti, tra cui: GridView, ListView, StackView, ViewFlipper e AdapterViewFlipper.

Ancora più importante, puoi usare il nuovo RemoteViewsService per creare widget di app con raccolte, usando widget come GridView, ListView e StackView supportati da dati remoti, ad esempio quelli di un fornitore di contenuti.

La classe AppWidgetProviderInfo (definita in XML con un elemento <appwidget-provider>) supporta anche due nuovi campi: autoAdvanceViewId e previewImage. Il campo autoAdvanceViewId consente di specificare l'ID visualizzazione della visualizzazione secondaria del widget dell'app che deve essere avanzata automaticamente dall'host del widget. Il campo previewImage specifica un'anteprima dell'aspetto del widget dell'app e viene mostrato all'utente dal selettore. Se questo campo non viene fornito, per l'anteprima viene utilizzata l'icona del widget dell'app.

Per creare un'immagine di anteprima per il widget dell'app (da specificare nel campo previewImage), l'emulatore Android include un'applicazione chiamata "Anteprima widget". Per creare un'immagine di anteprima, avvia l'applicazione, seleziona il relativo widget e configuralo in che modo desideri che venga visualizzata l'immagine di anteprima, quindi salvala e inseriscila nelle risorse disegnabili dell'applicazione.

Puoi visualizzare l'implementazione delle nuove funzionalità dei widget dell'app nelle applicazioni widget StackView e widget Weather List.

Notifiche nella barra di stato

Le API Notification sono state estese per supportare più notifiche della barra di stato ricche di contenuti, inoltre una nuova classe Notification.Builder consente di creare facilmente oggetti Notification.

Le nuove funzioni includono:

  • Supporto di un'icona di grandi dimensioni nella notifica, utilizzando l'setLargeIcon(). In genere, questo avviene per le applicazioni social che mostrano la foto di contatto della persona che ha dato l'origine della notifica o per le app multimediali la miniatura dell'album.
  • Supporto per i layout personalizzati nel riquadro di aggiornamento della barra di stato, utilizzando l'elemento setTicker().
  • Supporto di layout di notifica personalizzati che includono pulsanti con PendingIntent per widget di notifica più interattivi. Ad esempio, una notifica può controllare la riproduzione della musica senza avviare un'attività.

Caricatori di contenuti

Le nuove API framework facilitano il caricamento asincrono dei dati utilizzando la classe Loader. Puoi utilizzarla in combinazione con componenti UI come viste e frammenti per caricare dinamicamente i dati dai thread worker. La sottoclasse CursorLoader è progettata specificatamente per aiutarti a eseguire questa operazione per i dati supportati da un ContentProvider.

Tutto ciò che devi fare è implementare l'interfaccia LoaderCallbacks per ricevere callback quando viene richiesto un nuovo caricatore o i dati sono cambiati, quindi chiama initLoader() per inizializzare il loader per l'attività o il frammento.

Per ulteriori informazioni, leggi la documentazione relativa ai caricatori. Puoi anche visualizzare il codice di esempio utilizzando i caricatori negli esempi LoaderCursor e LoaderThrottle.

API Bluetooth A2DP e cuffie

Android ora include API per applicazioni che consentono di verificare lo stato dei dispositivi Bluetooth A2DP e dei profili delle cuffie connessi. Ad esempio, le applicazioni possono rilevare quando sono collegate delle cuffie Bluetooth per l'ascolto di musica e informare l'utente secondo il caso. Le applicazioni possono anche ricevere trasmissioni per comandi AT specifici del fornitore e notificare all'utente lo stato del dispositivo connesso, ad esempio quando la batteria del dispositivo connesso è in esaurimento.

Puoi inizializzare il rispettivo BluetoothProfile chiamando getProfileProxy() con la costante del profilo A2DP o HEADSET e con BluetoothProfile.ServiceListener per ricevere callback quando il client Bluetooth è connesso o disconnesso.

Framework animazione

Un framework di animazione flessibile completamente nuovo ti consente di animare le proprietà arbitrarie di qualsiasi oggetto (visualizzazione, disegno, frammento, oggetto o altro). Consente di definire diversi aspetti di un'animazione, come:

  • Durata
  • Quantità e comportamento ripetuti
  • Tipo di interpolazione temporale
  • L'animazione viene impostata per riprodurre le animazioni insieme, in sequenza o dopo determinati ritardi
  • Ritardo aggiornamento frame

Per impostazione predefinita, puoi definire questi e altri aspetti dell'animazione per i valori di colore int, in virgola mobile ed esadecimali di un oggetto. In altre parole, quando un oggetto dispone di un campo proprietà per uno di questi tipi, puoi modificarne il valore nel tempo per influire sull'animazione. Per animare qualsiasi altro tipo di valore, devi indicare al sistema come calcolare i valori per quel determinato tipo implementando l'interfaccia TypeEvaluator.

Esistono due animatori che puoi utilizzare per animare i valori di una proprietà: ValueAnimator e ObjectAnimator. L'elemento ValueAnimator calcola i valori dell'animazione, ma non è a conoscenza dell'oggetto o della proprietà specifici che vengono animati come risultato. ma esegue semplicemente i calcoli, ma tu devi attenersi agli aggiornamenti ed elaborare i dati secondo la tua logica. ObjectAnimator è una sottoclasse di ValueAnimator e consente di impostare l'animazione dell'oggetto e della proprietà, nonché di gestire il lavoro di tutte le animazioni. In altre parole, devi fornire all'oggetto ObjectAnimator l'oggetto da animare, la proprietà dell'oggetto da cambiare nel tempo e un insieme di valori da applicare alla proprietà nel corso del tempo, quindi avvia l'animazione.

Inoltre, la classe LayoutTransition attiva animazioni di transizione automatiche per le modifiche che apporti al layout delle attività. Per abilitare le transizioni per parte del layout, crea un oggetto LayoutTransition e impostalo su qualsiasi ViewGroup chiamando setLayoutTransition(). Questo causa l'esecuzione delle animazioni predefinite ogni volta che elementi vengono aggiunti o rimossi dal gruppo. Per specificare animazioni personalizzate, chiama setAnimator() su LayoutTransition e fornisci un Animator personalizzato, ad esempio ValueAnimator o ObjectAnimator discusso sopra.

Per ulteriori informazioni, consulta la documentazione relativa all'animazione della proprietà. Puoi anche visualizzare diversi esempi utilizzando le API di animazione nell'applicazione Demo API.

Framework UI esteso

  • Selezione a scelta multipla per ListView e GridView

    La nuova modalità CHOICE_MODE_MULTIPLE_MODAL per setChoiceMode() consente agli utenti di selezionare più elementi da un ListView o GridView. Se utilizzata insieme alla barra delle azioni, gli utenti possono selezionare più elementi, quindi scegliere l'azione da eseguire da un elenco di opzioni nella barra delle azioni (che si è trasformata in una modalità di azione a scelta multipla).

    Per attivare la selezione a scelta multipla, chiama il numero setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) e registra un MultiChoiceModeListener presso setMultiChoiceModeListener().

    Quando l'utente esercita una pressione prolungata su un elemento, la barra delle azioni passa alla modalità a scelta multipla. Il sistema invia una notifica a MultiChoiceModeListener quando gli elementi vengono selezionati chiamando il numero onItemCheckedStateChanged().

    Per un esempio di selezione a scelta multipla, consulta la classe List15. java nell'applicazione di esempio Demo delle API.

  • Nuove API per trasformare le viste

    Le nuove API consentono di applicare facilmente trasformazioni 2D e 3D alle viste nel layout delle attività. Sono possibili nuove trasformazioni con un insieme di proprietà degli oggetti che definiscono la posizione di layout, l'orientamento, la trasparenza e altro ancora della vista.

    I nuovi metodi per impostare le proprietà delle viste includono: setAlpha(), setBottom(), setLeft(), setRight(), setBottom(), setPivotX(), setPivotY(), setRotationX(), setRotationY(), setScaleX(), setScaleY(), setAlpha() e altri.

    Alcuni metodi hanno anche un attributo XML corrispondente che puoi specificare nel file di layout per applicare una trasformazione predefinita. Gli attributi disponibili includono: translationX, translationY, rotation, rotationX, rotationY, scaleX, scaleY, transformPivotX, transformPivotY e alpha.

    Utilizzando alcune di queste nuove proprietà delle viste in combinazione con il nuovo framework animato (illustrato sopra), puoi applicare facilmente alcune animazioni fantasiose alle tue viste. Ad esempio, per ruotare una vista sul suo asse Y, fornisci a ObjectAnimator il valore View, la proprietà "rotationY" e i valori iniziale e finale:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • Nuovi temi olografici

    I widget di sistema standard e l'aspetto generale sono stati riprogettati e incorporano un nuovo tema dell'interfaccia utente "olografico". Il sistema applica il nuovo tema utilizzando il sistema standard di stile e tema.

    Qualsiasi applicazione destinata alla piattaforma Android 3.0, impostando il valore android:minSdkVersion o android:targetSdkVersion su "11", eredita il tema olografico per impostazione predefinita. Tuttavia, se l'applicazione applica anche un proprio tema, quest'ultimo sostituirà quello olografico, a meno che non aggiorni gli stili per ereditare il tema olografico.

    Per applicare il tema olografico a singole attività o per ereditarle nelle tue definizioni, utilizza uno dei vari nuovi temi Theme.Holo. Se la tua applicazione è compatibile con una versione di Android precedente alla 3.0 e applica temi personalizzati, devi selezionare un tema in base alla versione della piattaforma.

  • Nuovi widget
    • AdapterViewAnimator

      Classe base per un AdapterView che esegue animazioni quando si passa da una visualizzazione all'altra.

    • AdapterViewFlipper

      ViewAnimator semplice che si anima tra due o più viste aggiunte. Viene mostrato un solo bambino alla volta. Se richiesto, può passare automaticamente da un bambino all'altro a intervalli regolari.

    • CalendarView

      Consente agli utenti di selezionare le date da un calendario toccando la data e possono scorrere o mostrare il calendario alla data desiderata. Puoi configurare l'intervallo di date disponibili nel widget.

    • ListPopupWindow

      Si ancora a una vista host e mostra un elenco di opzioni, come un elenco di suggerimenti durante la digitazione in una visualizzazione EditText.

    • NumberPicker

      Consente all'utente di selezionare un numero da un intervallo predefinito. Il widget presenta un campo di immissione e i pulsanti Su e Giù per selezionare un numero. Toccando il campo di immissione, l'utente può scorrere i valori o toccarlo di nuovo per modificare direttamente il valore corrente. Consente inoltre di mappare le posizioni alle stringhe, in modo che venga visualizzata la stringa corrispondente anziché la posizione dell'indice.

    • PopupMenu

      Mostra un oggetto Menu in una finestra popup modale ancorata a una vista. Il popup appare sotto la visualizzazione ancorata, se c'è spazio, o sopra, in caso contrario. Se l'IME (tastiera flessibile) è visibile, il popup non si sovrappone all'IME finché l'utente non tocca il menu.

    • SearchView

      Fornisce una casella di ricerca che puoi configurare per indirizzare le query di ricerca a un'attività specifica e visualizzare suggerimenti di ricerca (come per la finestra di dialogo di ricerca tradizionale). Questo widget è particolarmente utile per offrire un widget di ricerca nella barra delle azioni. Per ulteriori informazioni, consulta la sezione Creazione di un'interfaccia di ricerca.

    • StackView

      Una vista che mostra gli elementi secondari in una pila 3D e consente agli utenti di scorrere le visualizzazioni come un rolodex.

Grafica

  • Grafica 2D con accelerazione hardware

    Ora puoi attivare il renderer OpenGL per la tua applicazione impostando android:hardwareAccelerated="true" nell'elemento <application> dell'elemento manifest o per singoli elementi <activity>.

    Questo flag è utile alle applicazioni perché vengono tracciate più velocemente. In questo modo, le animazioni sono più fluide, lo scorrimento più fluido e in generale le prestazioni e la risposta all'interazione dell'utente sono migliori.

  • Visualizza il supporto per i livelli hardware e software

    Per impostazione predefinita, un View non ha alcun livello specificato. Puoi specificare che la vista sia supportata da un livello hardware o software, specificato dai valori LAYER_TYPE_HARDWARE e LAYER_TYPE_SOFTWARE, utilizzando setLayerType() o l'attributo layerType.

    Un livello hardware è supportato da una trama specifica per l'hardware (in genere Frame Buffer Objects o FBO su hardware OpenGL) e consente il rendering della visualizzazione utilizzando la pipeline di rendering hardware di Android, ma solo se l'accelerazione hardware è attivata per la gerarchia delle visualizzazioni. Quando l'accelerazione hardware è disattivata, i livelli hardware si comportano esattamente come livelli software.

    Un livello software è supportato da una bitmap e consente di visualizzare la visualizzazione utilizzando la pipeline di rendering software di Android, anche se l'accelerazione hardware è abilitata. I livelli software devono essere evitati quando la struttura ad albero delle visualizzazioni interessata viene aggiornata frequentemente. Ogni aggiornamento richiederà di eseguire nuovamente il rendering del livello software, il che potrebbe essere lento.

    Per ulteriori informazioni, consulta la documentazione relativa a LAYER_TYPE_HARDWARE e LAYER_TYPE_SOFTWARE.

  • Motore grafico 3D di rendering

    Renderscript è un framework 3D di runtime che fornisce sia un'API per la creazione di scene 3D, sia uno speciale linguaggio Shader indipendente dalla piattaforma per ottenere le massime prestazioni. Con Renderscript, puoi accelerare le operazioni grafiche e l'elaborazione dei dati. Renderscript è l'ideale per creare effetti 3D ad alte prestazioni per applicazioni, sfondi, caroselli e altro ancora.

    Per ulteriori informazioni, consulta la documentazione su rendering e calcolo 3D con Renderscript.

Contenuti multimediali

  • Video in time-lapse

    Le API Camcorder ora supportano la possibilità di registrare video in time-lapse. setCaptureRate() imposta la frequenza con cui acquisire i frame.

  • Supporto delle texture per gli stream di immagini

    Il nuovo SurfaceTexture ti consente di acquisire uno stream di immagini come texture OpenGL ES. Se chiami setPreviewTexture() per la tua istanza Camera, puoi specificare il SurfaceTexture su cui attingere la riproduzione video o visualizzare l'anteprima dei fotogrammi della videocamera.

  • Live streaming HTTP

    Le applicazioni ora possono passare l'URL di una playlist M3U al framework multimediale per avviare una sessione di live streaming HTTP. Il framework multimediale supporta la maggior parte delle specifiche relative al live streaming HTTP, inclusa la velocità in bit adattiva. Per ulteriori informazioni, consulta il documento Formati multimediali supportati.

  • Dati EXIF

    L'ExifInterface include nuovi campi per apertura foto, ISO e tempo di esposizione.

  • Profili videocamera

    Il nuovo metodo hasProfile() e diversi profili di qualità video (come QUALITY_1080P, QUALITY_720P, QUALITY_CIF e altri) consentono di stabilire le opzioni di qualità della videocamera.

  • Trasferimento di file multimediali digitali

    La piattaforma include il supporto integrato per Media/Picture Transfer Protocol (MTP/PTP) tramite USB, che consente agli utenti di trasferire facilmente qualsiasi tipo di file multimediale tra dispositivi e su un computer host. Gli sviluppatori possono sfruttare questo supporto creando applicazioni che consentono agli utenti di creare o gestire file rich media da trasferire o condividere su più dispositivi.

  • Gestione dei diritti digitali (DRM)

    Nuovo framework di Extensible Digital Rights Management (DRM) per verificare e applicare i diritti digitali. Viene implementato in due livelli architetturali:

    • Un'API framework DRM, esposta alle applicazioni e eseguita attraverso la VM Dalvik per le applicazioni standard.
    • Un gestore DRM di codice nativo che implementa l'API framework ed espone un'interfaccia per i plug-in DRM per gestire la gestione e la decriptazione dei diritti per vari schemi DRM.

    Per gli sviluppatori di applicazioni, il framework offre un'API astratta e unificata che semplifica la gestione dei contenuti protetti. L'API nasconde la complessità delle operazioni DRM e consente una modalità operativa coerente sia per i contenuti protetti che per quelli non protetti e in una varietà di schemi DRM.

    Per produttori di dispositivi, proprietari di contenuti e provider di media digitali su internet, l'API plug-in del framework DRM offre un mezzo per aggiungere il supporto di uno schema DRM preferito nel sistema Android, al fine di applicare in modo sicuro la protezione dei contenuti.

    La versione di anteprima non fornisce plug-in DRM nativi per il controllo e l'applicazione dei diritti digitali. Tuttavia, i produttori di dispositivi possono fornire plug-in DRM con i propri dispositivi.

    Puoi trovare tutte le API DRM nel pacchetto android.drm.

Supporto per tastiera

  • Supporto per i modificatori Ctrl, Meta, Bloc maiusc, Bloc num e Bloc scorr. Per maggiori informazioni, consulta la sezione META_CTRL_ON e i campi correlati.
  • Supporto per tastiere desktop complete, incluso il supporto di tasti come Esc, Home, Fine, Canc e altri. Puoi determinare se gli eventi chiave provengono da una tastiera completa eseguendo una query su getKeyboardType() e controllando la presenza di KeyCharacterMap.FULL
  • Ora TextView supporta le funzionalità di taglio, copia, incolla e selezione tutto basate sulla tastiera tramite le combinazioni di tasti Ctrl+X, Ctrl+C, Ctrl+V e Ctrl+A. Supporta inoltre PagSu/Pagina giù, Home/Fine e la selezione di testo basata su tastiera.
  • KeyEvent aggiunge diversi nuovi metodi per controllare più facilmente lo stato del modificatore della chiave in modo corretto e coerente. Consulta i seguenti argomenti: hasModifiers(int), hasNoModifiers(), metaStateHasModifiers(), metaStateHasNoModifiers().
  • Le applicazioni possono implementare scorciatoie da tastiera personalizzate sottoclasse Activity, Dialog o View e implementando onKeyShortcut(). Il framework chiama questo metodo ogni volta che una chiave viene combinata con il tasto Ctrl. Quando crei un menu Opzioni, puoi registrare le scorciatoie da tastiera impostando l'attributo android:alphabeticShortcut o android:numericShortcut per ogni elemento <item> (o con setShortcut()).
  • Android 3.0 include un nuovo dispositivo "tastiera virtuale" con ID KeyCharacterMap.VIRTUAL_KEYBOARD. La tastiera virtuale ha una mappa dei tasti USA in stile desktop utile per sintetizzare gli eventi chiave per testare l'input.

Eventi di tocco diviso

In precedenza, solo una visualizzazione poteva accettare gli eventi tocco alla volta. Android 3.0 aggiunge il supporto per la suddivisione degli eventi tocco tra viste e finestre persino, in modo che viste diverse possano accettare eventi tocco simultanei.

Gli eventi touch split sono abilitati per impostazione predefinita quando un'applicazione ha come target Android 3.0. In altre parole, quando l'applicazione ha impostato il valore dell'attributo android:minSdkVersion o android:targetSdkVersion su "11".

Tuttavia, le seguenti proprietà ti consentono di disattivare gli eventi di tocco diviso tra le viste all'interno di gruppi di viste specifici e in tutte le finestre.

  • L'attributo android:splitMotionEvents per i gruppi di visualizzazioni consente di disattivare gli eventi di tocco diviso che si verificano tra le visualizzazioni secondarie in un layout. Ad esempio:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    In questo modo, le viste secondarie nel layout lineare non possono suddividere gli eventi tocco: solo una visualizzazione può ricevere eventi di tocco alla volta.

  • La proprietà di stile android:windowEnableSplitTouch consente di disattivare gli eventi tocco diviso tra le finestre, applicandolo a un tema per l'attività o l'intera applicazione. Ad esempio:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    Quando questo tema viene applicato a una <activity> o a una <application>, sono accettati solo gli eventi di tocco all'interno della finestra dell'attività corrente. Ad esempio, se disattivi gli eventi tocco diviso in tutte le finestre, la barra di sistema non può ricevere eventi di tocco contemporaneamente all'attività. Questa opzione non influisce sulla possibilità o meno di suddividere gli eventi tocco nelle viste all'interno dell'attività: per impostazione predefinita, l'attività può comunque suddividere gli eventi tocco tra le viste.

    Per ulteriori informazioni sulla creazione di un tema, consulta la sezione Applicare stili e temi.

WebKit

  • Nuova classe WebViewFragment per creare un frammento composto da un WebView.
  • Nuovi metodi WebSettings:
    • setDisplayZoomControls() ti consente di nascondere i controlli dello zoom sullo schermo consentendo comunque all'utente di eseguire lo zoom con gesti delle dita (è necessario impostare setBuiltInZoomControls() true).
    • Il nuovo metodo WebSettings, setEnableSmoothTransition(), consente di abilitare transizioni fluide durante la panoramica e lo zoom. Se abilitato, WebView sceglie una soluzione per massimizzare le prestazioni (ad esempio, i contenuti di WebView potrebbero non essere aggiornati durante la transizione).
  • Nuovi metodi WebView:
    • onPause(), per mettere in pausa l'elaborazione associata a WebView quando viene nascosta. Ciò è utile per ridurre il traffico di CPU o di rete non necessario quando WebView non è in primo piano.
    • onResume() per riprendere l'elaborazione associata a WebView, che è stata messa in pausa durante onPause().
    • saveWebArchive() ti consente di salvare la visualizzazione corrente come archivio web sul dispositivo.
    • showFindDialog() avvia una ricerca testuale nella visualizzazione corrente.

Browser

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

  • Acquisizione contenuti multimediali

    Come definito dalla specifica HTML Media Capture, il browser consente alle applicazioni web di accedere alle funzionalità di acquisizione di audio, immagini e video del dispositivo. Ad esempio, il seguente codice HTML fornisce un input all'utente per acquisire una foto da caricare:

    <input type="file" accept="image/*;capture=camera" />
    

    In alternativa, escludendo il parametro capture=camera, l'utente può scegliere di acquisire una nuova immagine con la fotocamera o selezionarne una dal dispositivo (ad esempio dall'applicazione Galleria).

  • Orientamento del dispositivo

    Come definito dalla specifica Evento di orientamento del dispositivo, il browser consente alle applicazioni web di ascoltare eventi DOM che forniscono informazioni sull'orientamento fisico e sul movimento del dispositivo.

    L'orientamento del dispositivo viene espresso con gli assi x, y e z in gradi e il movimento viene espresso con i dati di accelerazione e velocità di rotazione. Una pagina web può registrarsi per gli eventi di orientamento chiamando window.addEventListener con il tipo di evento "deviceorientation" e registrarsi per gli eventi di movimento registrando il tipo di evento "devicemotion".

  • Trasformazioni 3D CSS

    Come definito dalla specifica del modulo CSS 3D Transform, il browser consente di trasformare gli elementi visualizzati da CSS in tre dimensioni.

Utilità JSON

Le nuove classi, JsonReader e JsonWriter, ti aiutano a leggere e scrivere stream JSON. Le nuove API completano le classi org.json, che manipolano un documento in memoria.

Puoi creare un'istanza di JsonReader chiamando il relativo metodo del costruttore e passando il valore InputStreamReader che alimenta la stringa JSON. Quindi inizia a leggere un oggetto chiamando beginObject(), leggi il nome di una chiave con nextName(), leggi il valore utilizzando metodi attinenti al tipo, come nextString() e nextInt(), e continua a farlo mentre hasNext() è true.

Puoi creare un'istanza di JsonWriter chiamando il relativo costruttore e trasmettendo il valore OutputStreamWriter appropriato. Quindi scrivi i dati JSON in modo simile al lettore, utilizzando name() per aggiungere il nome di una proprietà e un metodo value() appropriato per aggiungere il rispettivo valore.

Queste classi sono predefinite per impostazione predefinita. Il metodo setLenient() in ogni classe le configura in modo da essere più liberali in ciò che accettano. Questa modalità di analisi permissiva è compatibile anche con l'analizzatore sintattico predefinito di org.json.

Nuove costanti funzionalità

L'elemento manfest <uses-feature> deve essere utilizzato per indicare alle entità esterne (come Google Play) l'insieme di funzionalità hardware e software da cui dipende la tua applicazione. In questa release, Android aggiunge le seguenti nuove costanti che le applicazioni possono dichiarare con questo elemento:

  • "android.hardware.faketouch"

    Se dichiarato, ciò indica che l'applicazione è compatibile con un dispositivo che offre un touchscreen emulato (o migliore). Un dispositivo che offre un touchscreen emulato fornisce un sistema di input utente in grado di emulare un sottoinsieme di funzionalità del touchscreen. Un esempio di questo sistema di input è un mouse o un telecomando che aziona un cursore sullo schermo. Questi sistemi di input supportano eventi di tocco di base come clic verso il basso, clic su e trascinamento. Tuttavia, i tipi di input più complicati (ad esempio gesti, scorrimenti e così via) potrebbero essere più difficili o impossibili sui dispositivi finti touch (e i gesti multitouch non lo sono affatto).

    Se la tua applicazione non richiede gesti complicati e non vuoi che venga filtrata dai dispositivi con un touchscreen emulato, devi dichiarare "android.hardware.faketouch" con un elemento <uses-feature>. In questo modo, l'applicazione sarà disponibile per il maggior numero di tipi di dispositivi, inclusi quelli che forniscono solo un input touchscreen emulato.

    Tutti i dispositivi che includono un touchscreen supportano anche "android.hardware.faketouch", perché le funzionalità del touchscreen sono un soprainsieme di funzionalità del finto tocco. Di conseguenza, a meno che tu non abbia effettivamente bisogno di un touchscreen, devi aggiungere un elemento <uses-feature> per finto tocco.

Nuove autorizzazioni

  • "android.permission.BIND_REMOTEVIEWS"

    Deve essere dichiarata come autorizzazione obbligatoria nell'elemento manifest <service> per un'implementazione di RemoteViewsService. Ad esempio, quando crei un widget app che utilizza RemoteViewsService per completare una visualizzazione raccolta, la voce manifest potrebbe avere il seguente aspetto:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />
    

Nuove tecnologie della piattaforma

  • Archiviazione
    • Supporto del file system ext4 per abilitare l'archiviazione eMMC integrata.
    • Il file system FUSE per supportare i dispositivi MTP.
    • Supporto della modalità host USB per il supporto di tastiere e hub USB.
    • Supporto per MTP/PTP
  • Kernel Linux
    • Aggiornato alla versione 2.6.36
  • VM Dalvik
    • Nuovo codice da supportare e ottimizzare per SMP
    • Vari miglioramenti all'infrastruttura JIT
    • Miglioramenti al garbage collector:
      • Ottimizzato per SMP
      • Supporto per dimensioni heap più grandi
      • Gestione unificata di bitmap e buffer di byte
  • Librerie principali Dalvik
    • Nuova e molto più rapida implementazione di NIO (moderna libreria di I/O)
    • Messaggi di eccezione migliorati
    • Correzioni e correzioni di prestazioni nel corso della giornata

Report sulle differenze API

Per una visualizzazione dettagliata di tutte le modifiche all'API in Android 3.0 (livello API 11), consulta il report sulle differenze delle API.

Livello API

La piattaforma Android 3.0 offre una versione aggiornata dell'API framework. All'API Android 3.0 viene assegnato un identificatore intero (11) memorizzato nel sistema stesso. Questo identificatore, chiamato "livello API", consente al sistema di determinare correttamente se un'applicazione è compatibile con il sistema prima di installarla.

Per utilizzare nella tua applicazione le API introdotte in Android 3.0, devi compilare l'applicazione in base alla libreria Android fornita nella piattaforma SDK Android 3.0. A seconda delle tue esigenze, potresti anche dover aggiungere un attributo android:minSdkVersion="11" all'elemento <uses-sdk> nel file manifest dell'applicazione. Se la tua applicazione è progettata per essere eseguita solo su Android 2.3 e versioni successive, la dichiarazione dell'attributo impedisce l'installazione dell'applicazione su versioni precedenti della piattaforma.

Per ulteriori informazioni, consulta Che cos'è il livello API?