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 un set di skin per emulatori e altro ancora. Per iniziare a sviluppare o testare l'ambiente Android 3.0, utilizza Android SDK Manager per scaricare la piattaforma nel tuo SDK.
Panoramica dell'API
Le sezioni seguenti forniscono una panoramica tecnica delle novità per gli sviluppatori di Android 3.0, incluse le nuove funzionalità e le modifiche dell'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 un'interfaccia utente 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 posteriore gestito dall'attività, conservando lo stato dei frammenti man mano che vengono modificati e permettendo all'utente di spostarsi indietro tra i diversi stati
- Se fornisci layout alternativi, puoi combinare e abbinare i frammenti in base alle dimensioni e all'orientamento dello schermo
- I frammenti hanno accesso diretto alla propria attività del contenitore e possono contribuire agli elementi della barra delle azioni dell'attività (discussa di seguito)
Per gestire i frammenti nell'attività, devi utilizzare FragmentManager
, che fornisce diverse API per l'interazione con i frammenti, ad esempio per trovare frammenti nell'attività ed estrarre frammenti dallo stack precedente per ripristinare lo stato precedente.
Per eseguire una transazione, come 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. Nell'applicazione Demo API sono disponibili anche diversi esempi.
Barra delle azioni
La barra delle azioni sostituisce la barra del titolo tradizionale 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 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. Altrimenti, l'elemento viene inserito nel menu extra, mostrato 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 della voce di menu, aggiungi l'attributo
android:actionViewLayout
con una risorsa di layout o l'attributoandroid:actionViewClass
con il nome della classe di un widget. Devi inoltre dichiarare l'attributoandroid: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, significa che 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 callbackonOptionsItemSelected()
dell'attività quando lo tocchi. Rispondi a questo ID nel tuo metodo di callback per eseguire un'azione, ad esempio andare all'attività "home" dell'applicazione.Per sostituire l'icona con un logo, specifica il logo dell'applicazione nel file manifest con l'attributo
android:logo
, quindi chiamasetDisplayUseLogoEnabled(true)
nell'attività. - Aggiungi breadcrumb per spostarti a ritroso nello stack posteriore di frammenti
- Aggiungi schede o un elenco a discesa per navigare 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. Nell'applicazione Demo API sono disponibili anche diversi esempi.
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 supporta 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 contiene 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 utilizzare 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 un solo dato tagliato (un oggetto ClipData
) alla volta, ma un ClipData
può contenere più ClipData.Item
.
Per ulteriori informazioni, leggi la documentazione relativa a come copiare e incollare. Puoi anche vedere una semplice implementazione di copia e incolla nell'esempio di demo dell'API e un'implementazione più completa nell'esempio di 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ò ascoltare queste azioni.
Per iniziare a trascinare i contenuti nella tua 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
in grado di condividere informazioni sull'oggetto trascinato con visualizzazioni che potrebbero ricevere l'oggetto.
Per accettare un oggetto di trascinamento in View
(ricevendo il "rilascio"), registra la vista
con un OnDragListener
chiamando setOnDragListener()
. Quando si verifica un evento di trascinamento nella 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 visualizzazione sotto il trascinamento, per pubblicare un flusso di eventi di trascinamento. La visualizzazione ricevente può chiedere il tipo di evento consegnato a onDragEvent()
chiamando getAction()
sul 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 al rilascio. Puoi anche visualizzare un'implementazione del trascinamento nell'applicazione API Demos 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 delle app con raccolte, usando widget come GridView
, ListView
e StackView
supportati da dati remoti, ad esempio 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
vista secondaria del widget dell'app che deve essere avanzata automaticamente dall'host del widget. Il campo previewImage
consente di specificare un'anteprima dell'aspetto del widget dell'app e che 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 denominata "Anteprima widget". Per creare un'immagine di anteprima, avvia questa applicazione, seleziona il widget dell'applicazione e impostalo in che modo vuoi che appaia l'immagine di anteprima, quindi salvala e inseriscila nelle risorse disegnabili dell'applicazione.
Puoi visualizzare un'implementazione delle nuove funzionalità dei widget dell'app nelle applicazioni widget del widget dell'app StackView e widget del widget della lista meteo.
Notifiche nella barra di stato
Le API Notification
sono state estese per supportare più notifiche della barra di stato ricche di contenuti,
in più, una nuova classe Notification.Builder
consente di creare facilmente
oggetti Notification
.
Le nuove funzioni includono:
- Supporto di un'icona di grandi dimensioni nella notifica, tramite
setLargeIcon()
. In genere è utile per le applicazioni social che mostrino la foto di contatto della persona che ha dato l'origine della notifica o per le app multimediali che mostrano la miniatura di un album. - Supporto per layout personalizzati nel riquadro di aggiornamento della barra di stato, tramite
setTicker()
. - Supporto di layout di notifica personalizzati per l'inclusione di pulsanti con
PendingIntent
per widget di notifica più interattivi. Ad esempio, una notifica può controllare la riproduzione di 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 appositamente per aiutarti a farlo per i dati supportati da
un ContentProvider
.
Devi solo implementare l'interfaccia LoaderCallbacks
per ricevere i callback quando viene richiesto un nuovo caricatore o i dati sono cambiati, quindi chiama initLoader()
per inizializzare il caricatore per l'attività o il frammento.
Per ulteriori informazioni, leggi la documentazione relativa ai caricatori. Puoi anche vedere il codice di esempio utilizzando i caricatori negli esempi LoaderCursor e LoaderThrottle.
API Bluetooth A2DP e cuffie
Android ora include API per le applicazioni per verificare lo stato dei dispositivi Bluetooth A2DP e del profilo delle cuffie connessi. Ad esempio, le applicazioni possono rilevare quando sono collegate delle cuffie Bluetooth per ascoltare musica e informare l'utente secondo il caso. Le applicazioni possono anche ricevere trasmissioni per comandi AT specifici del fornitore e informare l'utente dello stato del dispositivo connesso, ad esempio quando il livello della batteria del dispositivo connesso è basso.
Puoi inizializzare il rispettivo BluetoothProfile
chiamando il numero getProfileProxy()
con la costante del profilo A2DP
o HEADSET
e un BluetoothProfile.ServiceListener
per ricevere i callback quando il client Bluetooth è connesso o disconnesso.
Framework dell'animazione
Un nuovissimo framework di animazione flessibile consente di animare proprietà arbitrarie di qualsiasi oggetto (visualizzazione, disegno, frammento, oggetto o altro). Consente di definire diversi aspetti di un'animazione, come
- Durata
- Quantità e comportamento ripetitivi
- Tipo di interpolazione dell'ora
- L'animatore riproduce le animazioni insieme, in sequenza o dopo specifici ritardi
- Ritardo aggiornamento frame
Puoi definire questi e altri aspetti dell'animazione per i valori colore di un oggetto con valori interi, mobili ed esadecimali. In altre parole, quando un oggetto dispone di un campo proprietà per uno di questi tipi, puoi modificarne il valore nel tempo per influire su un'animazione. Per animare qualsiasi altro tipo di valore, devi indicare al sistema come calcolare i valori di quel tipo specifico implementando l'interfaccia TypeEvaluator
.
Puoi utilizzare due animatori per animare i valori di una proprietà: ValueAnimator
e ObjectAnimator
. ValueAnimator
calcola i valori dell'animazione, ma non tiene conto dell'oggetto o della proprietà specifici che vengono animati come risultato. Esegue semplicemente i calcoli, ma devi
ascoltare gli aggiornamenti ed elaborarli con la tua logica. ObjectAnimator
è una sottoclasse di ValueAnimator
e
consente di impostare l'animazione dell'oggetto e della proprietà, oltre a gestire il funzionamento di tutte le animazioni.
In altre parole, devi assegnare a 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, per poi avviare 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 determina l'esecuzione
delle animazioni predefinite ogni volta che vengono aggiunti o rimossi elementi al gruppo. Per specificare animazioni
personalizzate, chiama setAnimator()
su LayoutTransition
e fornisci un Animator
personalizzato,
come un ValueAnimator
o un ObjectAnimator
discusso sopra.
Per ulteriori informazioni, consulta la documentazione Animazione 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
persetChoiceMode()
consente agli utenti di selezionare più elementi da un elementoListView
oGridView
. Se utilizzata insieme alla barra delle azioni, gli utenti possono selezionare più elementi e 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 unMultiChoiceModeListener
pressosetMultiChoiceModeListener()
.Quando l'utente esercita una pressione prolungata su un elemento, la barra delle azioni passa alla modalità azione a scelta multipla. Il sistema avvisa
MultiChoiceModeListener
quando vengono selezionati degli elementi chiamando il numeroonItemCheckedStateChanged()
.Per un esempio di selezione a scelta multipla, consulta la classe List15. java nell'applicazione di esempio Demo API.
- Nuove API per trasformare le visualizzazioni
Le nuove API consentono di applicare facilmente trasformazioni 2D e 3D alle viste nel layout delle attività. Sono possibili nuove trasformazioni da un insieme di proprietà degli oggetti che definiscono la posizione del layout, l'orientamento, la trasparenza e altro ancora.
I nuovi metodi per impostare le proprietà vista 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
ealpha
.Utilizzando alcune di queste nuove proprietà di visualizzazione in combinazione con il nuovo framework delle animazioni (spiegato sopra), puoi applicare facilmente alcune animazioni accattivanti alle viste. Ad esempio, per ruotare una vista sul suo asse y, fornisci a
ObjectAnimator
ilView
, la proprietà "rotationY" e i valori di inizio e fine: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 "olografico" nell'interfaccia utente. Il sistema applica il nuovo tema utilizzando il sistema stile e tema standard.
Qualsiasi applicazione destinata alla piattaforma Android 3.0, impostando il valore
android:minSdkVersion
oandroid:targetSdkVersion
su"11"
, eredita il tema olografico per impostazione predefinita. Tuttavia, se l'applicazione applica anche un proprio tema, questo sostituirà il tema olografico, a meno che non aggiorni gli stili per ereditare il tema olografico.Per applicare il tema olografico a singole attività o per ereditarlo 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 passi da una visualizzazione all'altra.AdapterViewFlipper
ViewAnimator
semplice che si anima tra due o più viste aggiunte. Viene visualizzato un solo bambino alla volta. Se richiesto, può passare automaticamente da un elemento secondario all'altro a intervalli regolari.CalendarView
Consente agli utenti di selezionare le date da un calendario toccando la data e può far scorrere o scorrere il calendario fino alla data desiderata. Puoi configurare l'intervallo di date disponibili nel widget.
ListPopupWindow
Si ancora a una visualizzazione host e mostra un elenco di opzioni, ad esempio un elenco di suggerimenti quando si digita 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. Toccare il campo di immissione consente all'utente di scorrere i valori o di 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 elemento
Menu
in una finestra popup modale ancorata a una vista. Il popup viene visualizzato sotto la vista dell'ancoraggio, se c'è spazio, o sopra la vista se non c'è spazio. Se l'IME (tastiera software) è 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 nella tradizionale finestra di dialogo di ricerca). 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 visualizzazione che mostra gli elementi secondari in uno stack 3D e consente agli utenti di scorrere le visualizzazioni come in 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 per le applicazioni, velocizzando il disegno. Questo consente animazioni più fluide, scorrimento più fluido e prestazioni e risposta all'interazione dell'utente migliori in generale.
- Visualizza il supporto per i livelli hardware e software
Per impostazione predefinita, non è stato specificato alcun livello per un
View
. Puoi specificare che il backup della vista sia supportato da un livello hardware o software, specificato dai valoriLAYER_TYPE_HARDWARE
eLAYER_TYPE_SOFTWARE
, utilizzandosetLayerType()
o l'attributolayerType
.Un livello hardware è supportato da una texture specifica per l'hardware (generalmente Frame buffer Objects o FBO su hardware OpenGL) e determina il rendering della visualizzazione tramite 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 determina il rendering della visualizzazione utilizzando la pipeline di rendering del software di Android, anche se è attivata l'accelerazione hardware. I livelli software devono essere evitati quando l'albero delle visualizzazioni interessato viene aggiornato spesso. Ogni aggiornamento richiederà un nuovo rendering del livello software, che potrebbe essere lento.
Per saperne di più, consulta la documentazione relativa a
LAYER_TYPE_HARDWARE
eLAYER_TYPE_SOFTWARE
. - Motore grafico 3D Renderscript
Renderscript è un framework 3D di runtime che fornisce sia un'API per la creazione di scene 3D, sia uno speciale linguaggio dello shardr indipendente dalla piattaforma per le massime prestazioni. Con Renderscript, puoi accelerare le operazioni di grafica e l'elaborazione dei dati. Renderscript è ideale per creare effetti 3D ad alte prestazioni per applicazioni, sfondi, caroselli e altro ancora.
Per ulteriori informazioni, consulta la documentazione relativa a renderscript e calcolo 3D con Renderscript.
Contenuti multimediali
- Video time-lapse
Le API Camcorder ora supportano la possibilità di registrare video in time-lapse. L'elemento
setCaptureRate()
imposta la frequenza di acquisizione dei frame. - Supporto di texture per stream di immagini
Il nuovo
SurfaceTexture
consente di acquisire uno stream di immagini come texture OpenGL ES. Se chiamisetPreviewTexture()
per la tua istanzaCamera
, puoi specificare ilSurfaceTexture
su cui tracciare la riproduzione del video o visualizzare l'anteprima dei fotogrammi dalla fotocamera. - 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 del live streaming HTTP, inclusa la velocità in bit adattiva. Per ulteriori informazioni, consulta il documento Formati multimediali supportati.
- Dati EXIF
L'elemento
ExifInterface
include nuovi campi per l'apertura foto, l'ISO e il tempo di esposizione. - Profili videocamera
Il nuovo metodo
hasProfile()
e diversi profili di qualità video (comeQUALITY_1080P
,QUALITY_720P
,QUALITY_CIF
e altri) ti consentono di stabilire le opzioni di qualità per la videocamera. - Trasferimento di file nei contenuti 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 basarsi su 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 DRM (Extensible Digital Rights Management) per verificare e applicare i diritti digitali. Viene implementata in due livelli architetturali:
- Un'API framework DRM, esposta alle applicazioni ed 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 per i contenuti protetti e non protetti e in un'ampia gamma 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 supporto per uno schema DRM scelto al sistema Android, in modo da 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 possono fornire plug-in DRM con i loro dispositivi.
Puoi trovare tutte le API DRM nel pacchetto
android.drm
.
Supporto della tastiera
- Supporto per i modificatori Ctrl, Meta, Bloc maiusc, Bloc num e Bloc scorr. Per saperne di più, consulta
META_CTRL_ON
e i campi correlati. - Supporto per tastiere complete in stile desktop, incluso il supporto di tasti come Esc, Home, Fine,
Canc e altri. Puoi determinare se gli eventi chiave provengono da una tastiera completa
eseguindo una query su
getKeyboardType()
e controllando la presenza diKeyCharacterMap.FULL
- Ora
TextView
supporta le operazioni di taglio, copia, incolla e selezione tutto basate sulla tastiera mediante 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 semplificare il controllo corretto e coerente dello stato del modificatore della chiave. VedihasModifiers(int)
,hasNoModifiers()
,metaStateHasModifiers()
,metaStateHasNoModifiers()
.- Le applicazioni possono implementare scorciatoie da tastiera personalizzate sottoclassendo
Activity
,Dialog
oView
e implementandoonKeyShortcut()
. Il framework chiama questo metodo ogni volta che una chiave viene combinata con il tasto di controllo. Quando crei un menu Opzioni, puoi registrare le scorciatoie da tastiera impostando l'attributoandroid:alphabeticShortcut
oandroid:numericShortcut
per ogni elemento<item>
(o consetShortcut()
). - 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 tocco diviso
In precedenza, una singola visualizzazione poteva accettare eventi tocco alla volta. Android 3.0 aggiunge il supporto per la suddivisione degli eventi touch tra viste e anche finestre, in modo che viste diverse possano accettare eventi touch simultanei.
Gli eventi Tocco diviso 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 tocco diviso nelle viste all'interno di gruppi di visualizzazioni specifici e in più finestre.
- L'attributo
android:splitMotionEvents
per i gruppi di visualizzazioni consente di disattivare gli eventi di tocco diviso che si verificano tra le viste 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, poiché solo una visualizzazione può ricevere eventi 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>
, vengono accettati solo gli eventi tocco nella finestra dell'attività corrente. Ad esempio, se disattivi gli eventi touch suddivisi tra le finestre, la barra di sistema non può ricevere eventi touch contemporaneamente all'attività. Questa opzione non influisce sulla possibilità di suddividere gli eventi tocco nelle visualizzazioni all'interno dell'attività: per impostazione predefinita, l'attività può comunque suddividere gli eventi touch tra le viste.Per ulteriori informazioni sulla creazione di un tema, consulta la pagina Applicare stili e temi.
WebKit
- Nuova classe
WebViewFragment
per creare un frammento composto da unWebView
. - Nuovi metodi
WebSettings
:setDisplayZoomControls()
ti consente di nascondere i controlli dello zoom sullo schermo consentendo comunque all'utente di eseguire lo zoom con i gesti delle dita (è necessario impostaresetBuiltInZoomControls()
true
).- Il nuovo metodo
WebSettings
,setEnableSmoothTransition()
, ti consente di attivare transizioni fluide durante la panoramica e lo zoom. Quando abilitato, WebView sceglierà una soluzione per massimizzare le prestazioni (ad esempio, i contenuti di WebView potrebbero non essere aggiornati durante la transizione).
- Nuovi metodi
WebView
:- Callback
onPause()
, per mettere in pausa l'elaborazione associata a WebView quando viene nascosto. Questo è utile per ridurre il traffico di CPU o di rete non necessario quando WebView non è in primo piano. - il callback
onResume()
per riprendere l'elaborazione associata a WebView, messa in pausa duranteonPause()
. saveWebArchive()
ti consente di salvare la visualizzazione corrente come archivio web sul dispositivo.showFindDialog()
avvia una ricerca testuale nella visualizzazione corrente.
- Callback
Browser
L'applicazione browser aggiunge le seguenti funzionalità per supportare le applicazioni web:
- Acquisizione di 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 di selezionarne una dal dispositivo (ad esempio dall'applicazione Galleria). - Orientamento del dispositivo
Come definito dalla specifica Device Orientation Event, 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 è espresso dagli assi x, y e z in gradi e il movimento è 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 agli elementi sottoposti a rendering da CSS di essere trasformati in tre dimensioni.
Utilità JSON
Le nuove classi, JsonReader
e JsonWriter
, ti aiutano a
leggere e scrivere flussi 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 i metodi corrispondenti al tipo, come nextString()
e nextInt()
, e continua a farlo mentre hasNext()
è true.
Puoi creare un'istanza di JsonWriter
chiamando il relativo costruttore e passando il valore OutputStreamWriter
appropriato. Quindi scrivi i dati JSON in modo
simile al lettore, utilizzando name()
per aggiungere un nome di proprietà
e un metodo value()
appropriato per aggiungere il rispettivo
valore.
Queste classi sono severe per impostazione predefinita. Il metodo setLenient()
in ogni classe li configura in modo che siano più liberali in termini di accettazione. Questa modalità di analisi permissiva è compatibile anche con il parser predefinito di org.json
.
Nuove costanti delle 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 l'applicazione. In questa release, Android aggiunge le seguenti nuove costanti che le applicazioni possono dichiarare con questo elemento:
"android.hardware.faketouch"
Se dichiarata, 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à touchscreen. Un esempio di questo sistema di input è un mouse o un telecomando che attiva un cursore sullo schermo. Questi sistemi di input supportano eventi touch di base come clic verso il basso, il clic verso l'alto e il trascinamento. Tuttavia, i tipi di input più complicati (come gesti, scorrimenti e così via) potrebbero essere più difficili o impossibili sui dispositivi falsificati (e i gesti multitouch non sono sicuramente possibili).
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"
, in quanto le funzionalità touchscreen sono un soprainsieme di funzionalità fingertouch. Di conseguenza, a meno che tu non abbia bisogno di un touchscreen, dovresti aggiungere un elemento<uses-feature>
per il fingertouch.
Nuove autorizzazioni
"android.permission.BIND_REMOTEVIEWS"
Deve essere dichiarata come autorizzazione obbligatoria nell'elemento manifest
<service>
per un'implementazione diRemoteViewsService
. Ad esempio, quando crei un widget dell'app che utilizzaRemoteViewsService
per completare una visualizzazione raccolta, la voce del file manifest potrebbe essere la seguente:<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.
- 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
- Kornel Linux
- Aggiornato alla versione 2.6.36
- VM Dalvik
- Nuovo codice da supportare e ottimizzare per SMP
- Vari miglioramenti all'infrastruttura JIT
- Miglioramenti ai 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
- Correttezza e correzioni delle prestazioni nel corso della
Report sulle differenze API
Per una visualizzazione dettagliata di tutte le modifiche all'API in Android 3.0 (livello API 11), consulta il report Differenze API.
Livello API
La piattaforma Android 3.0 fornisce una versione aggiornata dell'API framework. All'API Android 3.0 viene assegnato un identificatore numero 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 esigenze, potrebbe anche essere necessario 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 la sezione Che cos'è il livello API?