Android 9 (livello API 28) introduce nuove e straordinarie caratteristiche per utenti e sviluppatori. Questo documento mette in evidenza le novità per gli sviluppatori.
Per informazioni sulle nuove API, leggi il report Differenze API o consulta il riferimento API Android. Assicurati anche di consultare le modifiche del comportamento di Android 9 per scoprire le aree in cui le modifiche alla piattaforma possono influire sulle tue app.
Posizionamento in ambienti interni con RTT Wi-Fi
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 in ambienti interni nelle tue app.
Sui dispositivi con Android 9 che supportano l'hardware, le app possono usare le API RTT per misurare la distanza dai punti di accesso (AP) Wi-Fi compatibili con RTT nelle vicinanze. Sul dispositivo devono essere abilitati i servizi di geolocalizzazione e la ricerca di reti Wi-Fi attiva (in Impostazioni > Posizione) e la tua app deve disporre dell'autorizzazione ACCESS_FINE_LOCATION
. Non è necessario che il dispositivo si connetta ai punti di accesso per utilizzare la funzionalità RTT.
Per garantire la privacy, solo il telefono è in grado di determinare la distanza dal punto di accesso; i punti di accesso non hanno queste informazioni.
Se il tuo dispositivo misura la distanza da tre o più punti di accesso, puoi utilizzare un algoritmo multilaterale per stimare la posizione del dispositivo più adatta a queste misurazioni. Il risultato è in genere preciso nel raggio di 1-2 metri.
Con questa precisione, puoi creare nuove esperienze, come la navigazione all'interno dell'edificio e servizi basati sulla posizione granulari, come un controllo vocale ben distinto (ad esempio "Accendi questa luce") e informazioni basate sulla località (ad esempio "Esistono offerte speciali per questo prodotto?").
Guarda l'API Wi-Fi RTT in uso nell'app demo Android WifiRttScan.
Per ulteriori informazioni, consulta la sezione Posizione Wi-Fi: va con RTT.
Supporto per ritaglio display
Android 9 offre supporto per gli schermi edge-to-edge più recenti
con ritagli del display per videocamere e altoparlanti. Il corso DisplayCutout
ti consente di conoscere la posizione e la forma delle aree non funzionali in cui i contenuti non devono essere visualizzati. 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 alla tua app di disporre i propri contenuti intorno ai ritagli 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, come segue:
- Attiva le opzioni sviluppatore.
- Nella schermata Opzioni sviluppatore, scorri verso il basso fino alla sezione Disegno e seleziona Simula un display con ritaglio.
- Seleziona la dimensione 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.
Per un esempio di codice che utilizza le notifiche, incluse le funzionalità di Android 9, vedi l'Esempio di persone.
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 avatar e URI. Molte altre API, comeaddMessage()
, ora utilizzano la classePerson
anziché unaCharSequence
. La classePerson
supporta anche il pattern di progettazione di Builder.Supporto per le immagini: Android 9 ora mostra le immagini nelle notifiche di Messaggi sui telefoni. Puoi utilizzare
setData()
nel messaggio per visualizzare un'immagine. Lo snippet di codice riportato di seguito 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 i dati
EXTRA_REMOTE_INPUT_DRAFT
inviati dal sistema quando un utente chiude inavvertitamente una notifica di messaggistica. Puoi usare questa opzione per precompilare i campi di testo nell'app in modo che gli utenti possano completare la risposta.Identifica se una conversazione è una conversazione di gruppo: puoi utilizzare
setGroupConversation()
per identificare intenzionalmente una conversazione come conversazione di gruppo o non di gruppo.Impostare l'azione semantica per un intent: il metodo
setSemanticAction()
consente di assegnare un significato semantico a un'azione, ad esempio "contrassegna come letto", "elimina", "rispondi" e così via.Risposta rapida: Android 9 supporta le stesse risposte suggerite disponibili nella tua app di messaggistica. Usa
RemoteInput.setChoices()
per fornire all'utente una gamma di risposte standard.
Impostazioni canale, annunci e Non disturbare
Android 8.0 ha introdotto i canali di notifica, consentendo 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 capire quando un gruppo è bloccato e, di conseguenza, non inviare notifiche per i canali che ne fanno parte.Inoltre, la tua app può eseguire query sulle impostazioni attuali del gruppo di canali utilizzando il nuovo metodo
getNotificationChannelGroup()
.Nuovi tipi di intent per la trasmissione: il sistema Android ora invia intent di trasmissione quando lo stato di blocco dei canali di notifica e dei gruppi di canali cambia. L'app proprietaria del canale o del gruppo bloccato può ascoltare questi intent e reagire di conseguenza. Per ulteriori informazioni su queste azioni intent ed extra, consulta l'elenco delle costanti aggiornate 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
dà la priorità alle sveglie.PRIORITY_CATEGORY_MEDIA
dà la priorità ai suoni provenienti da fonti multimediali, come contenuti multimediali e navigazione vocale.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 luci di notifica.SUPPRESSED_EFFECT_PEEK
impedisce che le notifiche vengano visualizzate brevemente ("breve visualizzazione").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 supportano i badge. Per ulteriori informazioni, consulta la sezione 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 supportano questa visualizzazione, ad esempio l'area notifiche o la schermata di blocco.
Supporto della modalità multicamera e aggiornamenti delle videocamere
Sui dispositivi con Android 9, puoi accedere agli stream contemporaneamente da due o più videocamere fisiche. Sui dispositivi dotati di doppia fotocamera anteriore o posteriore, puoi creare funzionalità innovative che non sono possibili con una sola videocamera, ad esempio zoom senza interruzioni, bokeh e visione stereo. L'API consente inoltre di chiamare uno stream della videocamera logico o combinato che passa automaticamente tra due o più videocamere.
Altri miglioramenti della videocamera includono parametri di sessione aggiuntivi che consentono di ridurre i ritardi durante l'acquisizione iniziale e la condivisione delle piattaforme, che consente ai client della videocamera di gestire vari casi d'uso senza dover interrompere e avviare lo streaming della videocamera. Abbiamo anche aggiunto API per il supporto Flash basato su display e accesso ai timestamp OIS per la stabilizzazione dell'immagine e gli effetti speciali a livello di app.
In Android 9 l'API multicamera 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 in scala di grigi, U (Cb) come 128 e V (Cr) come 128.
Android 9 consente inoltre il supporto delle videocamere USB/UVC esterne sui dispositivi supportati.
ImageDecoder per disegni e bitmap
Android 9 introduce la classe ImageDecoder
, che offre un approccio modernizzato per la decodifica delle immagini. Utilizza questa classe
anziché le API BitmapFactory
e BitmapFactory.Options
.
ImageDecoder
consente di creare un elemento
Drawable
o
Bitmap
da un buffer di byte, un file
o un URI. Per decodificare un'immagine, chiama prima createSource()
con l'origine dell'immagine codificata. Quindi, 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()
. ImageDecoder
chiama
onHeaderDecoded()
con la larghezza e l'altezza predefinite dell'immagine, una volta noti.
Se l'immagine codificata è una GIF animata o un WebP, decodeDrawable()
restituisce un Drawable
che è un'istanza della classe AnimatedImageDrawable
.
Puoi utilizzare diversi metodi per impostare le proprietà delle immagini:
- Per ridimensionare l'immagine decodificata a una dimensione esatta, inserisci le dimensioni di destinazione in
setTargetSize()
. Puoi anche ridimensionare le immagini utilizzando un campione. Passa la dimensione del campione direttamente asetTargetSampleSize()
. - Per ritagliare un'immagine all'interno dell'intervallo dell'immagine ridimensionata, chiama
setCrop()
. - Per creare una bitmap modificabile, passa
true
insetMutableRequired()
.
ImageDecoder
consente inoltre di aggiungere effetti personalizzati e complicati a un'immagine, ad esempio angoli arrotondati o maschere del cerchio. Utilizza setPostProcessor()
con un'istanza della classe PostProcessor
per eseguire qualsiasi comando di disegno tu voglia.
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 guida le animazioni di AnimatedImageDrawable
.
Il thread di rendering utilizza anche un thread di lavoro per la decodifica, in modo che la decodifica non interferisca con altre operazioni sul thread di rendering. Questa implementazione consente alla tua app di visualizzare un'immagine animata senza gestirne gli aggiornamenti o interferire con altri eventi nel thread dell'interfaccia utente 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 gli angoli arrotondati.
Video HDR VP9, compressione delle immagini HEIF e API multimediali
Android 9 offre supporto integrato per HDR (High Dynamic Range) VP9 Profile 2, che ti consente di inviare ai tuoi utenti film compatibili con HDR da YouTube, Play Film e altre fonti su dispositivi compatibili con HDR.
Android 9 aggiunge inoltre il supporto per la codifica delle immagini utilizzando il formato file
immagine ad alta efficienza (HEIF
o HEIC), che migliora la compressione e riduce lo spazio di archiviazione e l'utilizzo dei dati di rete. Gli esempi di immagini fisse HEIF sono supportati nelle classi MediaMuxer
e MediaExtractor
. Grazie al supporto della piattaforma sui dispositivi Android 9, è facile inviare e utilizzare
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 il formato HEIF come formato di archiviazione delle immagini nell'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 fisse HEIF da buffer di byte YUV o istanze di Surface
o Bitmap
.
Le metriche multimediali sono disponibili anche nelle classi
AudioTrack
,
AudioRecord
e MediaDrm
.
Android 9 introduce metodi per la classe MediaDRM
per ottenere metriche, livelli di HDCP, livelli di sicurezza e numero di sessioni, nonché per aggiungere maggiore controllo sui livelli di sicurezza e sulle fermate protette. Per i dettagli, consulta il report Differenza API.
In Android 9, l'API AAudio aggiunge il supporto per diversi attributi AAudioStream aggiuntivi, inclusi utilizzo, tipo di contenuti e preimpostazione di input. Utilizzando questi attributi, puoi creare flussi ottimizzati per applicazioni VoIP o camcorder. Puoi anche impostare l'ID sessione per associare uno stream 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 dinamica.
Con questa lezione puoi creare effetti audio basati sul canale, tra cui equalizzazione, compressione multibanda e limitatore, su più fasi. Il numero di bande e fasi attive è configurabile e la maggior parte dei parametri può essere controllata in tempo reale.
Sensibilità al costo 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 relativi alla rete.
I job possono dichiarare la dimensione stimata dei dati, eseguire il precaricamento degli indicatori e specificare requisiti di rete dettagliati. JobScheduler
gestisce il lavoro in base allo
stato della rete. Ad esempio, quando la rete segnala che è congestionata, JobScheduler
potrebbe rinviare le richieste di rete di grandi dimensioni. Quando si trova su una rete senza limiti, JobScheduler
può eseguire job di precaricamento per migliorare l'esperienza utente, ad esempio precaricando i titoli.
Quando aggiungi i job, assicurati di utilizzare setEstimatedNetworkBytes()
, setPrefetch()
e setRequiredNetwork()
quando appropriato, in modo da consentire aJobScheduler
di gestire correttamente il lavoro. Durante l'esecuzione del job,
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 imprevisto 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 su Android. Android 9 espande e migliora l'API, aggiungendo il supporto di nove nuove operazioni:
- Operazioni matematiche per elementi:
- Operazioni di array:
Problema noto: quando passi i 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. Dovrai
passare solo
ANEURALNETWORKS_TENSOR_FLOAT32
finché il problema non sarà risolto.
Inoltre, l'API introduce anche una nuova funzione, ANeuralNetworksModel_relaxComputationFloat32toFloat16()
, che consente di specificare se calcolare ANEURALNETWORKS_TENSOR_FLOAT32
con un intervallo e una precisione pari a quelli del formato a virgola mobile a 16 bit IEEE 754.
Framework di 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 ulteriori informazioni su come utilizzare le funzionalità di compilazione automatica nella tua app, consulta la guida Autocompilazione Framework.
Miglioramenti alla sicurezza
Android 9 introduce una serie di funzionalità di sicurezza, di cui sono riassunte le sezioni seguenti:
Android Protected Confirmation
I dispositivi supportati con Android 9 o versioni successive ti offrono la possibilità di utilizzare Android Protected Confirmation. Quando utilizzi questo flusso di lavoro, l'app mostra una richiesta all'utente, con la richiesta di approvare una breve dichiarazione. Questa dichiarazione consente all'app di ribadire che l'utente vuole completare una transazione sensibile, ad esempio effettuare un pagamento.
Se l'utente accetta l'istruzione, Android Keystore riceve e archivia una firma crittografica protetta da un codice HMAC (Keyed-Hash Message Authentication Code). Dopo che l'archivio chiavi Android 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'altissima affidabilità, che l'utente ha letto la
dichiarazione e l'ha accettata.
Attenzione : Android Protected Confirmation non fornisce un canale informativo sicuro per l'utente. La tua app non può presupporre 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 sull'aggiunta del supporto per Android Protected Confirmation, consulta la guida Android Protected Confirmation.
Finestra di dialogo dell'autenticazione biometrica unificata
In Android 9, il sistema fornisce finestre di dialogo di autenticazione biometrica per conto della tua app. Questa funzionalità crea aspetto, design e posizionamento standardizzati per la finestra di dialogo, offrendo agli utenti una maggiore sicurezza di aver eseguito l'autenticazione contro un sistema di controllo delle credenziali biometriche attendibili.
Se la tua app utilizza
FingerprintManager
per mostrare agli utenti una finestra di dialogo di autenticazione tramite impronta, passa a
BiometricPrompt
. BiometricPrompt
si basa sul sistema per visualizzare la finestra di dialogo dell'autenticazione. Cambia inoltre il suo comportamento per adattarsi al tipo di autenticazione biometrica
scelta dall'utente.
Modulo di sicurezza hardware
I dispositivi supportati con Android 9 o versioni successive installato possono avere un StrongBox Keymaster, un'implementazione del Keymaster HAL che risiede in un modulo di sicurezza hardware. Il modulo contiene quanto segue:
- La sua CPU.
- Spazio di archiviazione protetto.
- Un vero generatore di numeri casuali.
- Meccanismi aggiuntivi per resistere alle manomissioni dei pacchetti e al sideload non autorizzato delle app.
Durante il controllo delle chiavi archiviate nel Keymaster StrongBox, il sistema ne conferma l'integrità con il Trusted Execution Environment (TEE).
Per scoprire di più sull'utilizzo di Strongbox Keymaster, consulta il Modulo di sicurezza hardware.
Importazione delle chiavi sicure nell'archivio chiavi
Android 9 offre un'ulteriore sicurezza per la decriptazione delle chiavi, aggiungendo la possibilità di importare le chiavi criptate in modo sicuro nell'archivio chiavi utilizzando un formato di chiave con codifica ASN.1. Successivamente, il Keymaster decripta le chiavi nell'archivio chiavi, in modo che i contenuti delle chiavi non vengano mai visualizzati come testo non crittografato 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 per lo schema di firma dell'APK v3. Questo schema consente di includere un record di prova di 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 è ora firmato.
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 l'archivio chiavi richiede che lo schermo venga sbloccato prima di consentire la decrittografia di dati in transito o archiviati utilizzando la chiave specificata. Questi tipi di chiavi sono particolarmente adatti per criptare dati sensibili da archiviare su disco, come dati aziendali o sanitari. Il flag offre agli utenti una maggiore garanzia che i dati non possono essere decriptati mentre il dispositivo è bloccato nel caso in cui il telefono venga smarrito o rubato.
Per impedire la decrittografia di una chiave quando il dispositivo è bloccato, abilita 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 avrà esito negativo. Un dispositivo bloccato richiede un PIN, una password, un'impronta o qualche altro fattore attendibile per potervi accedere.
Supporto della crittografia legacy
I dispositivi Android 9 forniti con Keymaster 4 supportano l'algoritmo di crittografia dei dati tripli o Triple DES. Se la tua app interagisce con sistemi legacy che richiedono Triple DES, utilizza questo tipo di crittografia per criptare le credenziali sensibili.
Per scoprire di più su come rendere la tua app più sicura, vedi Sicurezza per gli sviluppatori Android.
Ritiro di WPS
La funzionalità Wi-Fi Protected Configura (WPS) è deprecata per motivi di sicurezza.
Backup di Android
Android 9 aggiunge nuove funzionalità e opzioni per sviluppatori relative a backup e ripristino. I dettagli di queste modifiche sono disponibili nelle sezioni seguenti.
Backup di crittografia lato client
Android 9 aggiunge il supporto per la crittografia dei backup di Android con un secret lato client. Questo supporto viene abilitato 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 dispositivo che richiede un PIN, una sequenza o una password per sbloccarlo.
Quando questa misura della privacy è attiva, il PIN, la sequenza o la password del dispositivo sono necessari per ripristinare i dati dai backup effettuati dal dispositivo dell'utente. Per saperne di più sulla tecnologia alla base di questa funzionalità, consulta il white paper Google Cloud Key Vault Service.
Definisci le condizioni del dispositivo necessarie per il backup
Se i dati della tua app includono preferenze o informazioni sensibili, Android 9 ti consente di definire le condizioni dei dispositivi in base alle quali i dati dell'app sono inclusi nel backup dell'utente, ad esempio quando è attiva la crittografia lato client o è in corso un trasferimento locale tra dispositivi.
Per scoprire di più sul backup dei dati sui dispositivi Android, consulta 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 della navigazione
Gli attributi aggiunti in Android 9 semplificano la definizione del modo in cui i servizi di accessibilità, in particolare gli screen reader, passano da una parte all'altra dello schermo. Questi attributi possono aiutare gli utenti con disabilità visiva a spostarsi rapidamente tra il testo nell'interfaccia utente della tua app e a selezionarli.
Ad esempio, in un'app per gli acquisti, uno screen reader può aiutare gli utenti a passare direttamente da una categoria di offerte all'altra, senza che lo screen reader debba leggere tutti gli elementi di una categoria prima di passare a quella successiva.
Titoli dei riquadri 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 dell'interfaccia utente correlati visivamente e raggruppati in modo logico che in genere comprendono un frammento.
In Android 9, puoi fornire per questi riquadri titoli di accessibilità o titoli identificabili singolarmente. Se il riquadro Accessibilità ha un titolo, i servizi di accessibilità ricevono informazioni più dettagliate quando il riquadro viene modificato. Questa funzionalità consente ai servizi di fornire all'utente informazioni più granulari su cosa è cambiato nella UI.
Per specificare il titolo di un riquadro, utilizza l'attributo android:accessibilityPaneTitle
. Puoi anche aggiornare il titolo di un riquadro dell'interfaccia utente che viene sostituito in fase di runtime utilizzando setAccessibilityPaneTitle()
.
Ad esempio, potresti fornire un titolo per l'area dei contenuti di un oggetto Fragment
.
Navigazione basata su intestazioni
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 passare
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 tradizionalmente utilizzato l'attributo android:focusable
per stabilire quando leggere un oggetto ViewGroup
o una raccolta di oggetti View
come 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 una ViewGroup
come non attivabile e la ViewGroup
stessa come attivabile. A causa di questa disposizione, alcune istanze di View
sono state contrassegnate come attivabili in modo da rendere più ingombrante la navigazione da tastiera.
A partire da Android 9, puoi utilizzare l'attributo android:screenReaderFocusable
al posto dell'attributo android:focusable
in situazioni in cui rendere un oggetto View
attivabile ha conseguenze indesiderate. Gli screen reader mettono in evidenza tutti gli elementi che hanno impostato android:screenReaderFocusable
o android:focusable
su true
.
Azioni utili
Android 9 aggiunge il supporto per l'esecuzione di azioni di praticità per conto degli utenti:
- Interazione con le descrizioni comando
- Le funzioni aggiunte nel framework di accessibilità ti consentono di accedere alle descrizioni comando nell'interfaccia utente di un'app. Utilizza
getTooltipText()
per leggere il testo di una descrizione comando, poiACTION_SHOW_TOOLTIP
eACTION_HIDE_TOOLTIP
per indicare alle istanze diView
di mostrare o nascondere le relative descrizioni comando. - Azioni globali aggiunte
- Android 9 introduce il supporto di due azioni aggiuntive sui dispositivi nella lezione
AccessibilityService
. Il servizio può aiutare gli utenti a bloccare i dispositivi e acquisire screenshot utilizzando rispettivamente le azioniGLOBAL_ACTION_LOCK_SCREEN
eGLOBAL_ACTION_TAKE_SCREENSHOT
.
Dettagli modifica finestra
Android 9 semplifica il monitoraggio degli aggiornamenti delle finestre di un'app quando un'app ritraccia più finestre contemporaneamente. Quando si verifica un evento TYPE_WINDOWS_CHANGED
, utilizza l'API getWindowChanges()
per determinare come sono cambiate le finestre. Durante un aggiornamento multi-finestra, ogni finestra produce il proprio insieme di eventi.
Il metodo getSource()
restituisce la vista principale della finestra associata a ogni evento.
Se un'app ha definito i titoli del riquadro Accessibilità per i suoi oggetti View
, il servizio può riconoscere quando l'UI dell'app viene aggiornata. Quando si verifica un evento TYPE_WINDOW_STATE_CHANGED
, utilizza i tipi restituiti da getContentChangeTypes()
per determinare come è 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 non intenzionali, abbiamo aggiunto una modalità che blocca l'orientamento corrente 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 sulla compatibilità delle app è minimo. Tuttavia, se la tua app ha un comportamento di rotazione personalizzato o utilizza impostazioni di orientamento dello schermo insolite, potresti riscontrare problemi che non venivano rilevati in precedenza quando la preferenza di rotazione dell'utente era sempre impostata su verticale. Ti invitiamo a osservare il comportamento di rotazione in tutte le attività principali della tua app e ad assicurarti che tutte le impostazioni di orientamento dello schermo offrano comunque un'esperienza ottimale.
Per ulteriori dettagli, consulta le modifiche del comportamento associate.
Testo
Android 9 introduce sulla piattaforma le seguenti funzionalità relative al testo:
Testo precalcolato: la classe
PrecomputedText
migliora le prestazioni del rendering del testo consentendoti di calcolare e memorizzare nella cache le informazioni richieste in anticipo. Inoltre, permette alla tua 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 Lente d'ingrandimento, che consente un'esperienza coerente con le 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. L'app potrebbe quindi suggerire all'utente di telefonare con quel numero. Le funzionalità inTextClassifier
sostituiscono la funzionalità della classeLinkify
.Layout del testo: diversi metodi e attributi semplificano l'implementazione del design dell'interfaccia utente. Per maggiori dettagli, consulta la documentazione di riferimento per
TextView
.
Conversione anticipata ART dei file DEX
Sui dispositivi con Android 9 o versioni successive, il compilatore anticipato per Android Runtime (ART) ottimizza ulteriormente i file DEX (formato Dalvik Executable) compressi convertendo i file DEX in un pacchetto di app in una rappresentazione più compatta. Questa modifica consente all'app di avviarsi più velocemente e di consumare meno spazio su disco e RAM.
Questo miglioramento è particolarmente vantaggioso per i dispositivi di fascia bassa con velocità di I/O dei dischi più lente.
Tracciamento del sistema sul dispositivo
Android 9 ti consente di registrare le tracce del sistema dal tuo dispositivo e di condividere un report delle registrazioni con il team di sviluppo. Questo report supporta più formati, tra cui HTML.
Raccogliendo queste tracce, puoi acquisire i dati dei tempi relativi ai processi e i thread della tua app e visualizzare altri tipi di stati dei dispositivi significativi a livello globale.
Per scoprire di più su questo strumento, consulta Eseguire il tracciamento del sistema sul dispositivo.