Android 9 (livello API 28) introduce nuove funzionalità e capacità per utenti e sviluppatori. Questo documento evidenzia le novità per gli sviluppatori.
Per scoprire di più sulle nuove API, leggi il report sulle differenze tra le API o visita la documentazione di riferimento dell'API Android. Inoltre, assicurati di consultare Modifiche del comportamento di Android 9 per scoprire le aree in cui le modifiche della piattaforma potrebbero influire sulle tue app.
Posizionamento indoor con Wi-Fi RTT

Android 9 aggiunge il supporto della piattaforma per il protocollo Wi-Fi IEEE 802.11-2016, noto anche come Wi-Fi Round-Trip-Time (RTT), per consentirti di sfruttare il posizionamento indoor nelle tue app.
Sui dispositivi con Android 9 con supporto hardware, le tue app possono utilizzare le
API RTT per misurare la
distanza dai punti di accesso (AP) Wi-Fi nelle vicinanze che supportano RTT. Il dispositivo deve avere
i servizi di localizzazione attivi e la ricerca di reti Wi-Fi abilitata (in
Impostazioni > Posizione) e la tua app deve disporre dell'autorizzazione
ACCESS_FINE_LOCATION
. Per utilizzare RTT, il dispositivo non deve connettersi ai punti di accesso.
Per mantenere la privacy, solo lo smartphone è in grado di determinare la distanza dal punto di accesso; i punti di accesso non dispongono di queste informazioni.
Se il tuo dispositivo misura la distanza da tre o più punti di accesso, puoi utilizzare un algoritmo di multilaterazione per stimare la posizione del dispositivo che meglio si adatta a queste misurazioni. Il risultato è in genere preciso entro 1-2 metri.
Con questa precisione, puoi creare nuove esperienze, come la navigazione all'interno degli edifici e servizi basati sulla posizione geografica con un'elevata granularità, come il controllo vocale disambiguato (ad esempio, "Accendi questa luce") e informazioni basate sulla posizione (ad esempio "Ci sono offerte speciali per questo prodotto?").
Vedi l'API WiFi RTT in uso nell'app demo Android WifiRttScan.
Per ulteriori informazioni, vedi Posizione Wi-Fi: misurazione della distanza con RTT.
Supporto del ritaglio display

Testare il ritaglio del display utilizzando l'emulatore
Android 9 offre supporto per gli ultimi schermi edge-to-edge
che contengono ritagli display per fotocamere e altoparlanti. La classe
DisplayCutout
consente di scoprire la posizione e la forma delle aree non funzionali in cui
non devono essere visualizzati i contenuti. Per determinare l'esistenza e il posizionamento di queste aree di ritaglio, utilizza il metodo getDisplayCutout()
.
Un nuovo attributo di layout della finestra,
layoutInDisplayCutoutMode
,
consente all'app di disporre i contenuti intorno alle tacche di un dispositivo. Puoi impostare
questo attributo su uno dei seguenti valori:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Puoi simulare un ritaglio dello schermo su qualsiasi dispositivo o emulatore con Android 9 nel seguente modo:
- Attiva le opzioni sviluppatore.
- Nella schermata Opzioni sviluppatore, scorri verso il basso fino alla sezione Disegno e seleziona Simula un display con un ritaglio.
- Seleziona le dimensioni del ritaglio.
Notifiche
Android 9 introduce diversi miglioramenti alle notifiche, tutti disponibili per gli sviluppatori che hanno come target il livello API 28 e versioni successive.

MessagingStyle con foto allegata.

MessagingStyle con risposte e conversazione.
Per un esempio di codice che utilizza le notifiche, incluse le funzionalità di Android 9, consulta l'esempio People.
Esperienza di messaggistica migliorata
A partire da Android 7.0 (livello API 24), puoi aggiungere un'azione per rispondere ai messaggi o inserire altro testo direttamente da una notifica. Android 9 migliora questa funzionalità con i seguenti miglioramenti:
Supporto semplificato per i partecipanti alla conversazione: la classe
Person
viene utilizzata per identificare le persone coinvolte in una conversazione, inclusi i loro avatar e URI. Molte altre API, comeaddMessage()
, ora utilizzano la classePerson
anzichéCharSequence
. La classePerson
supporta anche il pattern di progettazione Builder.Supporto delle immagini: Android 9 ora mostra le immagini nelle notifiche di messaggistica sugli smartphone. Puoi utilizzare
setData()
nel messaggio per visualizzare un'immagine. Il seguente snippet di codice mostra come creare unPerson
e un messaggio contenente un'immagine.
Kotlin
// Create new Person. val sender = Person() .setName(name) .setUri(uri) .setIcon(null) .build() // Create image message. val message = Message("Picture", time, sender) .setData("image/", imageUri) val style = Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message)
Java
// Create new Person. Person sender = new Person() .setName(name) .setUri(uri) .setIcon(null) .build(); // Create image message. Message message = new Message("Picture", time, sender) .setData("image/", imageUri); Notification.MessagingStyle style = new Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message);
Salva le risposte come bozze: la tua app può recuperare il
EXTRA_REMOTE_INPUT_DRAFT
inviato dal sistema quando un utente chiude inavvertitamente una notifica di messaggistica. Puoi utilizzare questo extra per precompilare i campi di testo nell'app in modo che gli utenti possano completare la risposta.Identificare se una conversazione è di gruppo: puoi utilizzare
setGroupConversation()
per identificare intenzionalmente una conversazione come di gruppo o non di gruppo.Imposta l'azione semantica per un intent: il metodo
setSemanticAction()
ti consente di dare un significato semantico a un'azione, ad esempio "segna come letto", "elimina", "rispondi" e così via.Risposta rapida: Android 9 supporta le stesse risposte suggerite disponibili nell'app di messaggistica. Utilizza
RemoteInput.setChoices()
per fornire un array di risposte standard all'utente.
Impostazioni del canale, trasmissioni e Non disturbare
Android 8.0 ha introdotto i canali di notifica, che ti consentono di creare un canale personalizzabile dall'utente per ogni tipo di notifica che vuoi visualizzare. Android 9 semplifica le impostazioni dei canali di notifica con le seguenti modifiche:
Blocco dei gruppi di canali: ora gli utenti possono bloccare interi gruppi di canali nelle impostazioni di notifica di un'app. Puoi utilizzare il metodo
isBlocked()
per identificare quando un gruppo è bloccato e, di conseguenza, non inviare notifiche per i canali del gruppo.Inoltre, la tua app può eseguire query per le impostazioni correnti dei gruppi di canali utilizzando il nuovo metodo
getNotificationChannelGroup()
.Nuovi tipi di intent di trasmissione: il sistema Android ora invia intent di trasmissione quando cambia lo stato di blocco dei canali di notifica e dei gruppi di canali. L'app proprietaria del canale o del gruppo bloccato può ascoltare questi intent e reagire di conseguenza. Per ulteriori informazioni su queste azioni e questi extra per gli intent, consulta l'elenco aggiornato delle costanti nel riferimento
NotificationManager
. Per informazioni su come reagire agli intent di trasmissione, consulta la sezione Trasmissioni.NotificationManager.Policy
ha tre nuove categorie di priorità Non disturbare:PRIORITY_CATEGORY_ALARMS
assegna la priorità alle sveglie.PRIORITY_CATEGORY_MEDIA
dà la priorità ai suoni provenienti da fonti multimediali, come la navigazione vocale e i contenuti multimediali.PRIORITY_CATEGORY_SYSTEM
dà la priorità ai suoni di sistema.
NotificationManager.Policy
ha anche sette nuove costanti Non disturbare che puoi utilizzare per eliminare le interruzioni visive:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
impedisce alla notifica di avviare l'attività a schermo intero.SUPPRESSED_EFFECT_LIGHTS
blocca le spie di notifica.SUPPRESSED_EFFECT_PEEK
impedisce alle notifiche di scorrere brevemente nella visualizzazione ("sbirciatina").SUPPRESSED_EFFECT_STATUS_BAR
impedisce la visualizzazione delle notifiche nella barra di stato sui dispositivi che supportano le barre di stato.SUPPRESSED_EFFECT_BADGE
blocca i badge sui dispositivi che li supportano. Per ulteriori informazioni, consulta Modificare un badge di notifica.SUPPRESSED_EFFECT_AMBIENT
blocca le notifiche sui dispositivi che supportano i display Ambient.SUPPRESSED_EFFECT_NOTIFICATION_LIST
impedisce la visualizzazione delle notifiche nella visualizzazione elenco sui dispositivi che la supportano, ad esempio l'area delle notifiche o la schermata di blocco.
Supporto multicamera e aggiornamenti della videocamera
Sui dispositivi con Android 9, puoi accedere contemporaneamente agli stream di due o più fotocamere fisiche. Sui dispositivi con due fotocamere anteriori o posteriori, puoi creare funzionalità innovative non possibili con una sola fotocamera, come zoom continuo, bokeh e visione stereo. L'API ti consente anche di chiamare un flusso di videocamera logico o combinato che passa automaticamente da una videocamera all'altra.
Altri miglioramenti della videocamera includono parametri di sessione aggiuntivi che contribuiscono a ridurre i ritardi durante l'acquisizione iniziale e la condivisione della superficie che consente ai client della videocamera di gestire vari casi d'uso senza la necessità di interrompere e riavviare lo streaming della videocamera. Abbiamo anche aggiunto API per il supporto del flash basato sul display e l'accesso ai timestamp OIS per la stabilizzazione delle immagini a livello di app ed effetti speciali.
In Android 9 l'API
multi-camera
supporta le fotocamere monocromatiche per i dispositivi con
funzionalità FULL
o
LIMITED
.
L'output monocromatico viene ottenuto tramite il formato
YUV_420_888
con Y come scala di grigi, U (Cb) come 128 e V (Cr) come 128.
Android 9 supporta anche le fotocamere esterne USB/UVC sui dispositivi supportati.
ImageDecoder per drawables e bitmap
Android 9 introduce la classe
ImageDecoder
, che fornisce un approccio modernizzato per la decodifica delle immagini. Utilizza questa classe
anziché le API
BitmapFactory
e
BitmapFactory.Options
.
ImageDecoder
ti consente di creare un
Drawable
o un
Bitmap
da un buffer di byte, un file
o un URI. Per decodificare un'immagine, chiama prima
createSource()
con l'origine dell'immagine codificata. Poi chiama
decodeDrawable()
o decodeBitmap()
passando l'oggetto ImageDecoder.Source
per creare un Drawable
o un Bitmap
. Per modificare le
impostazioni predefinite, passa OnHeaderDecodedListener
a
decodeDrawable()
o decodeBitmap()
. Chiamate ImageDecoder
onHeaderDecoded()
con la larghezza e l'altezza predefinite dell'immagine, una volta note.
Se l'immagine codificata è una GIF animata o un'immagine WebP, decodeDrawable()
restituisce un
Drawable
che è un'istanza della
classe AnimatedImageDrawable
.
Esistono diversi metodi per impostare le proprietà delle immagini:
- Per scalare l'immagine decodificata a una dimensione esatta, passa le dimensioni target a
setTargetSize()
. Puoi anche scalare le immagini utilizzando una dimensione del campione. Passa la dimensione del campione direttamente asetTargetSampleSize()
. - Per ritagliare un'immagine all'interno dell'intervallo dell'immagine scalata, chiama
setCrop()
. - Per creare una bitmap modificabile, passa
true
asetMutableRequired()
.
ImageDecoder
ti consente anche di aggiungere effetti personalizzati e complessi a un'immagine,
come angoli arrotondati o
maschere circolari. Utilizza
setPostProcessor()
con un'istanza della classe
PostProcessor
per eseguire i comandi di disegno che preferisci.
Animazione
Android 9 introduce la classe
AnimatedImageDrawable
per disegnare e visualizzare immagini animate GIF e WebP.
AnimatedImageDrawable
funziona in modo simile a
AnimatedVectorDrawable
in quanto il thread di rendering gestisce le animazioni di AnimatedImageDrawable
.
Il thread di rendering utilizza anche un thread di lavoro per la decodifica, in modo che questa non interferisca con altre operazioni sul thread di rendering. Questa implementazione consente
alla tua app di visualizzare un'immagine animata senza gestire gli aggiornamenti o
interferire con altri eventi nel thread UI dell'app.
Un AnimatedImageDrawable
può essere decodificato utilizzando un'istanza di
ImageDecoder
. Il seguente
snippet di codice mostra come utilizzare ImageDecoder
per decodificare il tuo
AnimatedImageDrawable
:
Kotlin
@Throws(IOException::class) private fun decodeImage() { val decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(resources, R.drawable.my_drawable)) // Prior to start(), the first frame is displayed. (decodedAnimation as? AnimatedImageDrawable)?.start() }
Java
private void decodeImage() throws IOException { Drawable decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(getResources(), R.drawable.my_drawable)); if (decodedAnimation instanceof AnimatedImageDrawable) { // Prior to start(), the first frame is displayed. ((AnimatedImageDrawable) decodedAnimation).start(); } }
ImageDecoder
offre diversi metodi che ti consentono di modificare ulteriormente l'immagine.
Ad esempio, puoi utilizzare il metodo
setPostProcessor()
per modificare l'aspetto dell'immagine, ad esempio applicando una maschera circolare o
angoli arrotondati.
Video HDR VP9, compressione delle immagini HEIF e API Media
Android 9 offre il supporto integrato per l'HDR (High Dynamic Range) VP9 Profilo 2, in modo da poter offrire ai tuoi utenti film HDR da YouTube, Play Film e altre fonti su dispositivi compatibili con HDR.
Android 9 aggiunge anche il supporto per la codifica delle immagini utilizzando il formato High Efficiency Image
File (HEIF
o HEIC), che migliora la compressione e riduce l'utilizzo di spazio di archiviazione e dati di rete. I campioni di immagini statiche HEIF sono supportati nelle classi
MediaMuxer
e MediaExtractor
. Grazie al supporto della piattaforma sui dispositivi Android 9, è facile inviare e
utilizzare le immagini HEIF dal server di backend. Dopo aver verificato che la tua app sia compatibile con questo formato di dati per la condivisione e la visualizzazione, prova HEIF come formato di archiviazione delle immagini nella tua app. Puoi eseguire una conversione da JPEG a HEIC utilizzando ImageDecoder
o BitmapFactory
(che ottiene una bitmap da un file JPEG). Puoi quindi utilizzare
HeifWriter
per scrivere immagini
statiche HEIF da buffer di byte YUV o istanze di
Surface
o
Bitmap
.
Le metriche dei contenuti multimediali sono disponibili anche nelle classi
AudioTrack
,
AudioRecord
e
MediaDrm
.
Android 9 introduce metodi per la classe
MediaDRM
per ottenere metriche, livelli HDCP, livelli di sicurezza e numero di sessioni, nonché per aggiungere un maggiore controllo su livelli di sicurezza e arresti sicuri. Per maggiori dettagli, consulta il report
API Diff.
In Android 9, l'API AAudio aggiunge
il supporto di diversi attributi AAudioStream aggiuntivi, tra cui utilizzo, tipo di
contenuto e preset di input. Utilizzando questi attributi, puoi creare stream ottimizzati per applicazioni VoIP o videocamere. Puoi anche impostare l'ID sessione per
associare un flusso AAudio a un submix che può includere effetti. Utilizza l'API
AudioEffect
per controllare gli
effetti.
Android 9 introduce l'API
AudioEffect
per l'elaborazione della dinamica.
Con questa classe, puoi creare effetti audio basati sui canali, tra cui
equalizzazione, compressione multibanda e limiter, in più fasi. Il numero di bande e stadi attivi è configurabile e la maggior parte dei parametri può essere controllata in tempo reale.
Sensibilità ai costi dei dati in JobScheduler
A partire da Android 9, JobScheduler
può utilizzare gli indicatori di stato della rete forniti dagli operatori per migliorare la gestione
dei job correlati alla rete.
I job possono dichiarare le dimensioni stimate dei dati, segnalare il prefetching e specificare
requisiti di rete dettagliati. JobScheduler
gestisce quindi il lavoro in base
allo stato della rete. Ad esempio, quando la rete segnala di essere congestionata,
JobScheduler
potrebbe posticipare le richieste di rete di grandi dimensioni. Quando si trova su una rete
senza limiti, JobScheduler
può eseguire job di prefetch per
migliorare l'esperienza utente, ad esempio precaricando i titoli.
Quando aggiungi lavori, assicurati di utilizzare setEstimatedNetworkBytes()
,
setPrefetch()
,
e setRequiredNetwork()
quando opportuno per aiutare
JobScheduler
a gestire correttamente il lavoro. Quando il job viene eseguito,
assicurati di utilizzare l'oggetto Network
restituito da
JobParameters.getNetwork()
.
In caso contrario, utilizzerai implicitamente la rete predefinita del dispositivo, che
potrebbe non soddisfare i tuoi requisiti, causando un utilizzo involontario dei dati.
API Neural Networks 1.1
L'API Neural Networks è stata introdotta in Android 8.1 (livello API 27) per accelerare il machine learning sul dispositivo Android. Android 9 espande e migliora l'API, aggiungendo il supporto per nove nuove operazioni:
- Operazioni matematiche elemento per elemento:
- Operazioni sugli array:
Problema noto: quando passi
tensori ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
all'operazione
ANEURALNETWORKS_PAD
, disponibile su Android 9 e versioni successive,
l'output di NNAPI potrebbe non corrispondere all'output di framework di machine learning di livello superiore, come
TensorFlow Lite. Fino a quando il problema non viene risolto, devi passare solo
ANEURALNETWORKS_TENSOR_FLOAT32
.
Inoltre, l'API introduce anche una nuova funzione,
ANeuralNetworksModel_relaxComputationFloat32toFloat16()
,
che ti consente di specificare se calcolare
ANEURALNETWORKS_TENSOR_FLOAT32
con un intervallo e una precisione bassi come quelli del formato
in virgola mobile a 16 bit IEEE 754.
framework Compilazione automatica
Android 9 introduce diversi miglioramenti che i servizi di compilazione automatica possono implementare per migliorare ulteriormente l'esperienza utente durante la compilazione dei moduli. Per scoprire di più su come utilizzare le funzionalità di compilazione automatica nella tua app, consulta la guida Framework di compilazione automatica.
Miglioramenti alla sicurezza
Android 9 introduce una serie di funzionalità di sicurezza, che sono riassunte nelle sezioni seguenti:
Android Protected Confirmation
I dispositivi supportati con Android 9 o versioni successive ti consentono di utilizzare la conferma protetta di Android. Quando utilizzi questo flusso di lavoro, la tua app mostra all'utente un prompt che gli chiede di approvare una breve dichiarazione. Questa dichiarazione consente all'app di confermare che l'utente vuole completare una transazione sensibile, ad esempio un pagamento.
Se l'utente accetta la dichiarazione, Android Keystore riceve e memorizza una
firma crittografica protetta da un codice di autenticazione del messaggio con hash (HMAC). Dopo che Android Keystore conferma la validità del messaggio, la tua app
può utilizzare la chiave generata da trustedConfirmationRequired
nell'ambiente
di esecuzione attendibile (TEE) per firmare il messaggio accettato dall'utente. La
firma indica, con un'affidabilità molto elevata, che l'utente ha visto la
dichiarazione e l'ha accettata.
Attenzione: la conferma protetta di Android non fornisce un canale di informazioni sicuro per l'utente. La tua app non può presumere alcuna garanzia di riservatezza oltre a quelle offerte dalla piattaforma Android. In particolare, non utilizzare questo flusso di lavoro per visualizzare informazioni sensibili che normalmente non mostreresti sul dispositivo dell'utente.
Per indicazioni su come aggiungere il supporto di Android Protected Confirmation, consulta la guida Android Protected Confirmation.
Finestra di dialogo unificata per l'autenticazione biometrica
In Android 9, il sistema fornisce finestre di dialogo di autenticazione biometrica per conto della tua app. Questa funzionalità crea un aspetto, un comportamento e un posizionamento standardizzati per la finestra di dialogo, dando agli utenti maggiore sicurezza di autenticarsi con un controllo delle credenziali biometriche attendibile.
Se la tua app utilizza
FingerprintManager
per mostrare agli utenti una finestra di dialogo di autenticazione con l'impronta, passa all'utilizzo di
BiometricPrompt
. BiometricPrompt
si basa sul sistema per visualizzare la finestra di dialogo di autenticazione. Inoltre, il suo comportamento cambia per adattarsi al tipo di autenticazione biometrica
che un utente ha scelto.
Modulo di sicurezza hardware
I dispositivi supportati con Android 9 o versioni successive installate possono avere un'implementazione di KeyMint (in precedenza Keymaster) HAL che risiede in un modulo di sicurezza hardware. Il modulo contiene quanto segue:
- La propria CPU.
- Spazio di archiviazione sicuro.
- Un generatore di numeri casuali reali.
- Meccanismi aggiuntivi per resistere alla manomissione dei pacchetti e al sideload non autorizzato delle app.
Quando controlla le chiavi memorizzate in StrongBox KeyMint, il sistema conferma l'integrità di una chiave con il Trusted Execution Environment (TEE).
Per scoprire di più sull'utilizzo di StrongBox KeyMint, consulta la sezione Modulo di sicurezza hardware.
Importazione sicura delle chiavi nell'archivio chiavi
Android 9 offre una maggiore sicurezza di decrittografia delle chiavi aggiungendo la possibilità di importare chiavi criptate in modo sicuro nel keystore utilizzando un formato di chiave codificato ASN.1. KeyMint decripta quindi le chiavi nel Keystore, in modo che il contenuto delle chiavi non venga mai visualizzato come testo normale nella memoria host del dispositivo.
Scopri di più su come importare le chiavi criptate in modo più sicuro.
Schema di firma dell'APK con rotazione della chiave
Android 9 aggiunge il supporto dello schema di firma dell'APK v3. Questo schema ha la possibilità di includere un record di prova della rotazione nel blocco di firma per ogni certificato di firma. Questa funzionalità consente di firmare l'app con un nuovo certificato di firma collegando i certificati di firma precedenti del file APK a quello con cui è firmato ora.
Scopri di più su come ruotare le chiavi utilizzando
apksigner
.
Opzione per consentire la decrittografia della chiave solo sui dispositivi sbloccati
Android 9 introduce il flag unlockedDeviceRequired
. Questa opzione determina
se il keystore richiede lo sblocco dello schermo prima di consentire
la decrittografia di tutti i dati in transito o archiviati utilizzando la chiave specificata. Questi tipi
di chiavi sono adatti alla crittografia di dati sensibili da archiviare su disco, come
dati sanitari o aziendali. Il flag offre agli utenti una maggiore garanzia che i dati non possano essere decrittografati mentre il dispositivo è bloccato in caso di smarrimento o furto dello smartphone.
Per proteggere una chiave dalla decrittografia mentre il dispositivo è bloccato, attiva il flag
passando true
al metodo setUnlockedDeviceRequired()
. Dopo aver completato questo passaggio, quando lo schermo dell'utente è bloccato, qualsiasi
tentativo di decriptare o firmare i dati utilizzando questa chiave non va a buon fine. Per accedere a un dispositivo bloccato è necessario un PIN, una password, un'impronta o un altro fattore attendibile.
Supporto della crittografia precedente
I dispositivi Android 9 forniti con Keymaster 4 supportano l'algoritmo di crittografia tripla dei dati o Triple DES. Se la tua app interagisce con sistemi legacy che richiedono Triple DES, utilizza questo tipo di crittografia quando cripti credenziali sensibili.
Per scoprire di più su come rendere più sicura la tua app, consulta Sicurezza per gli sviluppatori Android.
Ritiro di WPS
La Configurazione protetta Wi-Fi (WPS) è ritirata per motivi di sicurezza.
Backup di Android
Android 9 aggiunge nuove funzionalità e opzioni per sviluppatori relative al backup e al ripristino. I dettagli di queste modifiche sono riportati nelle sezioni seguenti.
Backup con crittografia lato client
Android 9 aggiunge il supporto per la crittografia dei backup di Android con un segreto lato client. Questo supporto viene attivato automaticamente quando vengono soddisfatte le seguenti condizioni:
- L'utente ha attivato il backup utilizzando Android 9 o versioni successive.
- L'utente ha impostato un blocco schermo per il suo dispositivo che richiede un PIN, una sequenza o una password per lo sblocco.
Quando questa misura per la privacy è attivata, per ripristinare i dati dai backup eseguiti dal dispositivo dell'utente è necessario il PIN, la sequenza o la password del dispositivo. Per scoprire di più sulla tecnologia alla base di questa funzionalità, consulta il white paper Google Cloud Key Vault Service.
Definisci le condizioni del dispositivo richieste per il backup
Se i dati dell'app includono informazioni o preferenze sensibili, Android 9 ti consente di definire le condizioni del dispositivo in base alle quali i dati della tua app vengono inclusi nel backup dell'utente, ad esempio quando è attivata la crittografia lato client o è in corso un trasferimento locale da dispositivo a dispositivo.
Per saperne di più sul backup dei dati sui dispositivi Android, consulta la panoramica del backup dei dati.
Accessibilità
Android 9 introduce miglioramenti al framework di accessibilità che semplificano l'offerta di esperienze ancora migliori agli utenti della tua app.
Semantica di navigazione
Gli attributi aggiunti in Android 9 ti consentono di definire più facilmente il modo in cui i servizi di accessibilità, in particolare gli screen reader, navigano da una parte dello schermo all'altra. Questi attributi possono aiutare gli utenti con disabilità visive a spostarsi rapidamente nel testo dell'interfaccia utente della tua app e a effettuare una selezione.
Ad esempio, in un'app di shopping, uno screen reader può aiutare gli utenti a navigare direttamente da una categoria di offerte alla successiva, senza che lo screen reader debba leggere tutti gli elementi di una categoria prima di passare alla successiva.
Titoli dei riquadri di accessibilità
In Android 8.1 (livello API 27) e versioni precedenti, i servizi di accessibilità non possono sempre determinare quando è stato aggiornato un riquadro specifico dello schermo, ad esempio quando un'attività sostituisce un frammento con un altro. I riquadri sono costituiti da elementi UI raggruppati logicamente e correlati visivamente che in genere comprendono un frammento.
In Android 9, puoi fornire titoli del riquadro di accessibilità o titoli identificabili singolarmente per questi riquadri. Se un riquadro ha un titolo di accessibilità, i servizi di accessibilità ricevono informazioni più dettagliate quando il riquadro cambia. Questa funzionalità consente ai servizi di fornire all'utente informazioni più granulari su ciò che è cambiato nell'interfaccia utente.
Per specificare il titolo di un riquadro, utilizza l'attributo
android:accessibilityPaneTitle
. Puoi anche aggiornare il titolo di un riquadro dell'interfaccia utente sostituito in fase di runtime utilizzando setAccessibilityPaneTitle()
.
Ad esempio, potresti fornire un titolo per l'area dei contenuti di un oggetto
Fragment
.
Navigazione basata sui titoli
Se la tua app mostra contenuti testuali che includono intestazioni logiche, imposta l'attributo
android:accessibilityHeading
su true
per le istanze di
View
che rappresentano queste intestazioni. Aggiungendo queste intestazioni, consenti ai servizi di accessibilità di aiutare gli utenti a navigare direttamente da un'intestazione all'altra. Qualsiasi servizio di accessibilità può utilizzare questa
funzionalità per migliorare l'esperienza di navigazione nell'interfaccia utente degli utenti.
Navigazione e output del gruppo
Gli screen reader hanno sempre utilizzato l'attributo
android:focusable
per
determinare quando devono leggere un
ViewGroup
o una raccolta di
View
oggetti come una singola unità. In questo modo,
gli utenti potevano capire che le visualizzazioni erano logicamente correlate tra loro.
In Android 8.1 e versioni precedenti, devi contrassegnare ogni oggetto View
all'interno di un
ViewGroup
come non selezionabile e il ViewGroup
stesso come selezionabile. Questa
disposizione ha fatto sì che alcune istanze di View
venissero contrassegnate come selezionabili in modo da
rendere più complessa la navigazione da tastiera.
A partire da Android 9, puoi utilizzare l'attributo
android:screenReaderFocusable
al posto dell'attributo android:focusable
nelle situazioni in cui
rendere selezionabile un oggetto View
ha conseguenze indesiderate. Gli screen reader
mettono a fuoco tutti gli elementi per cui è stato impostato android:screenReaderFocusable
o android:focusable
su true
.
Azioni rapide
Android 9 aggiunge il supporto per l'esecuzione di azioni di comodità per conto degli utenti:
- Interazione con le descrizioni comando
- Le funzionalità aggiunte nel framework di accessibilità ti danno accesso alle
descrizioni comando nell'interfaccia utente di un'app. Utilizza
getTooltipText()
per leggere il testo di una descrizione comando e utilizzaACTION_SHOW_TOOLTIP
eACTION_HIDE_TOOLTIP
per indicare alle istanze diView
di mostrare o nascondere le descrizioni comando. - Aggiunta di azioni globali
- Android 9 introduce il supporto di due azioni aggiuntive per i dispositivi nella classe
AccessibilityService
. Il tuo servizio può aiutare gli utenti a bloccare i propri dispositivi e acquisire screenshot utilizzando le azioniGLOBAL_ACTION_LOCK_SCREEN
eGLOBAL_ACTION_TAKE_SCREENSHOT
.
Dettagli della modifica della finestra
Android 9 semplifica il monitoraggio degli aggiornamenti delle finestre di un'app quando un'app
ridisegna più finestre contemporaneamente. Quando si verifica un evento
TYPE_WINDOWS_CHANGED
, utilizza l'API
getWindowChanges()
per determinare in che modo sono cambiate le finestre. Durante un aggiornamento multischermo, ogni finestra produce il proprio insieme di eventi.
Il metodo getSource()
restituisce la visualizzazione principale della finestra associata a ogni evento.
Se un'app ha definito titoli del riquadro di accessibilità per i relativi oggetti
View
, il tuo servizio può riconoscere
quando l'interfaccia utente dell'app viene aggiornata. Quando si verifica un evento
TYPE_WINDOW_STATE_CHANGED
, utilizza i tipi restituiti da
getContentChangeTypes()
per determinare in che modo è cambiata la finestra. Ad esempio, il framework può
rilevare quando un riquadro ha un nuovo titolo o quando un riquadro è scomparso.
Rotazione
Per eliminare le rotazioni involontarie, abbiamo aggiunto una modalità che blocca l'orientamento attuale anche se la posizione del dispositivo cambia. Gli utenti possono attivare la rotazione manualmente quando necessario premendo un pulsante nella barra di sistema.
Nella maggior parte dei casi, l'impatto della compatibilità sulle app è minimo. Tuttavia, se la tua app ha un comportamento di rotazione personalizzato o utilizza impostazioni di orientamento dello schermo insolito, potresti riscontrare problemi che sarebbero passati inosservati prima, quando la preferenza di rotazione dell'utente era sempre impostata su verticale. Ti invitiamo a esaminare il comportamento di rotazione in tutte le attività chiave della tua app e assicurarti che tutte le impostazioni di orientamento dello schermo continuino a offrire l'esperienza ottimale.
Per maggiori dettagli, consulta le modifiche al comportamento associate.

Una nuova modalità di rotazione consente agli utenti di attivare manualmente la rotazione quando necessario utilizzando un pulsante nella barra di sistema.
Testo
Android 9 introduce le seguenti funzionalità relative al testo nella piattaforma:
Precomputed Text: la classe
PrecomputedText
migliora il rendimento del rendering del testo consentendoti di calcolare e memorizzare nella cache le informazioni necessarie in anticipo. Consente inoltre all'app di eseguire il layout del testo al di fuori del thread principale.Lente d'ingrandimento: la classe
Magnifier
è un widget della piattaforma che fornisce un'API per la lente d'ingrandimento, consentendo un'esperienza coerente della funzionalità di lente d'ingrandimento in tutte le app.Smart Linkify: Android 9 migliora la classe
TextClassifier
, che sfrutta il machine learning per identificare alcune entità nel testo selezionato e suggerire azioni. Ad esempio,TextClassifier
può consentire alla tua app di rilevare che l'utente ha selezionato un numero di telefono. La tua app potrebbe quindi suggerire all'utente di effettuare una chiamata utilizzando quel numero. Le funzionalità inTextClassifier
sostituiscono la funzionalità della classeLinkify
.Layout del testo: diversi metodi e attributi di convenienza semplificano l'implementazione del design dell'interfaccia utente. Per maggiori dettagli, consulta la documentazione di riferimento per
TextView
.
Conversione ART ahead-of-time dei file DEX
Sui dispositivi con Android 9 o versioni successive, il compilatore ahead-of-time (AOT) di Android Runtime (ART) ottimizza ulteriormente i file in formato Dalvik Executable compresso (DEX) convertendo i file DEX in un pacchetto dell'app in una rappresentazione più compatta. Questa modifica consente all'app di avviarsi più rapidamente e di consumare meno spazio su disco e RAM.
Questo miglioramento è particolarmente vantaggioso per i dispositivi di fascia bassa con velocità di I/O del disco più lente.
Tracciamento del sistema sul dispositivo
Android 9 ti consente di registrare le tracce di sistema dal tuo dispositivo, quindi condividere un report di queste registrazioni con il tuo team di sviluppo. Questo report supporta più formati, incluso HTML.
Raccogliendo queste tracce, puoi acquisire dati di temporizzazione relativi ai processi e ai thread della tua app e visualizzare altri tipi di stati del dispositivo significativi a livello globale.
Per scoprire di più su questo strumento, consulta l'articolo Eseguire la tracciatura del sistema sul dispositivo.