Funzionalità e API di Android 9

Android 9 (livello API 28) introduce nuove fantastiche funzionalità 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. Inoltre, dai un'occhiata alle modifiche al comportamento di Android 9 per scoprire le aree in cui le modifiche alla piattaforma potrebbero influire sulle tue app.

Posizionamento in ambienti interni con Wi-Fi RTT

Le nuove API RTT supportano il posizionamento in ambienti interni nelle tue app.

Android 9 aggiunge il supporto della piattaforma al protocollo Wi-Fi IEEE 802.11-2016, noto anche come Wi-Fi Round-Trip-Time (RTT), per consentirti di sfruttare il posizionamento in spazi interni nelle tue app.

Sui dispositivi con Android 9 che supportano hardware, le tue app possono utilizzare le API RTT per misurare la distanza dai punti di accesso (AP) Wi-Fi compatibili con RTT nelle vicinanze. Sul dispositivo devono essere attivi i servizi di geolocalizzazione e la ricerca di reti Wi-Fi deve essere attivata (in Impostazioni > Posizione) e l'app deve disporre dell'autorizzazione ACCESS_FINE_LOCATION. Non è necessario connettere il dispositivo ai punti di accesso per utilizzare RTT. Per garantire la privacy, solo il telefono è in grado di determinare la distanza dal punto di accesso; i punti di accesso non contengono queste informazioni.

Se il 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 con una distanza massima di 1-2 metri.

Grazie a questa precisione, puoi creare nuove esperienze, come la navigazione all'interno degli edifici e servizi granulari basati sulla posizione geografica, come il controllo vocale chiaro (ad es. "Accendi questa luce") e informazioni basate sulla località (ad esempio "Esistono offerte speciali per questo prodotto?").

Guarda l'API WiFi RTT in uso nell'app demo Android WifiRttScan.

Per maggiori informazioni, consulta Posizione Wi-Fi: gamma con RTT.

Supporto per ritaglio display

Schermata Opzioni sviluppatore che mostra ritagli di dimensioni diverse

Test del ritaglio del display tramite l'emulatore

Android 9 offre supporto per gli schermi edge-to-edge più recenti che contengono ritagli dei display per videocamere e altoparlanti. La classe DisplayCutout ti consente di individuare la posizione e la forma delle aree non funzionali in cui non dovrebbero essere visualizzati i contenuti. Per determinare l'esistenza e il posizionamento di queste aree ritagliate, utilizza il metodo getDisplayCutout().

Un nuovo attributo di layout della finestra, layoutInDisplayCutoutMode, consente alla tua app di disporre i contenuti intorno ai ritagli di un dispositivo. Puoi impostare questo attributo su uno dei seguenti valori:

Puoi simulare un ritaglio dello schermo su qualsiasi dispositivo o emulatore con Android 9 nel seguente modo:

  1. Attiva le opzioni sviluppatore.
  2. Nella schermata Opzioni sviluppatore, scorri verso il basso fino alla sezione Disegno e seleziona Simula un display con ritaglio.
  3. 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.

Notifiche di messaggi

MessagingStyle con foto allegata.

Notifica di messaggistica

MessagingStyle con risposte e conversazione.

Per un codice di esempio che utilizza le notifiche, incluse le funzionalità di Android 9, consulta l'esempio di persone.

Esperienza di messaggistica avanzata

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, come addMessage(), ora utilizzano la classe Person anziché una CharSequence. La classe Person supporta anche il pattern di progettazione Builder.

  • Supporto per le immagini: Android 9 ora mostra le immagini nelle notifiche di messaggi sugli smartphone. Puoi usare setData() nel messaggio per visualizzare un'immagine. Lo snippet di codice seguente mostra come creare un Person 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: l'app può recuperare l'elemento 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.

  • Identifica se una conversazione è una conversazione di gruppo: puoi utilizzare setGroupConversation() per identificare intenzionalmente una conversazione come gruppo o non come conversazione 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.

  • SmartResponse: Android 9 supporta le stesse risposte suggerite disponibili nella tua app di messaggistica. Utilizza RemoteInput.setChoices() per fornire all'utente una serie di risposte standard.

Impostazioni del canale, annunci e Non disturbare

Android 8.0 ha introdotto i canali di notifica, che consentono di creare un canale personalizzabile dall'utente per ogni tipo di notifica che vuoi visualizzare. Android 9 semplifica le impostazioni del canale 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 in quel gruppo.

    Inoltre, la tua app può eseguire query sulle impostazioni attuali dei gruppi di canali utilizzando il nuovo metodo getNotificationChannelGroup().

  • Nuovi tipi di intent di 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 per intent ed extra, consulta l'elenco delle costanti aggiornato nel riferimento NotificationManager. Per informazioni su come reagire agli intent di trasmissione, consulta Trasmissioni.

  • NotificationManager.Policy ha tre nuove categorie di priorità Non disturbare:

  • NotificationManager.Policy ha anche sette nuove costanti Non disturbare che puoi utilizzare per eliminare le interruzioni visive:

Supporto della modalità multicamera e aggiornamenti della fotocamera

Sui dispositivi con Android 9, puoi accedere agli stream contemporaneamente da due o più videocamere fisiche. Sui dispositivi con doppia fotocamera anteriore o doppia posteriore, puoi creare funzionalità innovative non possibili con una sola videocamera, come zoom senza interruzioni, bokeh e visione stereo. L'API ti consente anche di chiamare uno stream logico o fuso della videocamera che passa automaticamente da una videocamera all'altra.

Altri miglioramenti apportati alla videocamera includono ulteriori parametri di sessione che aiutano a ridurre i ritardi durante l'acquisizione iniziale e la condivisione delle superfici, che consente ai client della videocamera di gestire vari casi d'uso senza dover interrompere e avviare lo streaming della videocamera. Abbiamo inoltre aggiunto API per il supporto Flash basato su display e accesso ai timestamp OIS per la stabilizzazione delle immagini a livello di app e gli 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 in scala di grigi, U (Cb) 128 e V (Cr) 128.

Android 9 consente anche di supportare videocamere USB/UVC esterne sui dispositivi supportati.

ImageDecoder per disegnabili 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 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. Quindi, chiama decodeDrawable() o decodeBitmap() passando l'oggetto ImageDecoder.Source per creare un oggetto Drawable o 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 note. 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 target in setTargetSize(). Puoi anche ridimensionare le immagini utilizzando una dimensione di esempio. Passa la dimensione del campione direttamente a setTargetSampleSize().
  • Per ritagliare un'immagine entro l'intervallo dell'immagine scalata, chiama setCrop().
  • Per creare una bitmap modificabile, passa true in setMutableRequired().

ImageDecoder consente inoltre di aggiungere effetti personalizzati e complicati a un'immagine, come gli angoli arrotondati o le maschere del cerchio. Utilizza setPostProcessor() con un'istanza della classe PostProcessor per eseguire i comandi di disegno che preferisci.

Animazione

Android 9 introduce la classe AnimatedImageDrawable per il disegno e la visualizzazione di 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 worker per la decodifica, in modo che la decodifica non interferisca con le altre operazioni nel thread di rendering. Questa implementazione consente alla tua app di visualizzare un'immagine animata senza gestire i suoi aggiornamenti o interferire con altri eventi nel thread dell'interfaccia utente dell'app.

Un elemento 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.

API video HDR VP9, compressione delle immagini HEIF e contenuti multimediali

Android 9 offre il supporto integrato per HDR (High Dynamic Range) VP9 Profile 2, per consentirti di inviare agli utenti film compatibili con 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 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 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 tuo 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-to-heic utilizzando ImageDecoder o BitmapFactory (che ottiene una bitmap da un file JPEG). Puoi quindi utilizzare HeifWriter per scrivere immagini fisse in formato HEIF da buffer di byte YUV o istanze di Surface o Bitmap.

Le metriche sui media sono disponibili anche nelle classi AudioTrack, AudioRecord e MediaDrm.

Android 9 introduce la classe MediaDRM per ottenere metriche, livelli HDCP, livelli di sicurezza e numero di sessioni, nonché per aumentare il controllo sui livelli di sicurezza e sugli arresti anomali sicuri. Per maggiori dettagli, consulta il report Diff API.

In Android 9, l'API AAudio aggiunge il supporto per diversi attributi aggiuntivi di AAudioStream, inclusi utilizzo, tipo di contenuto e input preimpostato. Con questi attributi puoi creare flussi ottimizzati per applicazioni VoIP o videocamera. 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 su canali, 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, 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 job, 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 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 on-device su Android. Android 9 espande e migliora l'API, aggiungendo supporto per nove nuove operazioni:

Problema noto: quando passi tensori ANEURALNETWORKS_TENSOR_QUANT8_ASYMM all'operazione ANEURALNETWORKS_PAD, disponibile su Android 9 e versioni successive, l'output da NNAPI potrebbe non corrispondere all'output di framework di machine learning di livello superiore, come TensorFlow Lite. Dovresti invece trasmettere 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 inferiori 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 del framework per la compilazione automatica.

Miglioramenti alla sicurezza

Android 9 introduce una serie di funzionalità di sicurezza, riassunte nelle sezioni seguenti:

Android Protected Confirmation

I dispositivi supportati con Android 9 o versioni successive ti offrono la possibilità di utilizzare la conferma protetta di Android. Quando utilizzi questo flusso di lavoro, l'app mostra una richiesta all'utente, in cui gli viene chiesto 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, l'archivio chiavi di Android riceve e archivia una firma crittografica protetta da un codice HMAC (Keyed-Hash Message Authentication Code). Dopo che l'archivio chiavi Android ha confermato la validità del messaggio, l'app può utilizzare la chiave generata da trustedConfirmationRequired nell'ambiente di esecuzione attendibile (TEE) per firmare il messaggio che l'utente ha accettato. La firma indica, con un'elevata affidabilità, che l'utente ha visto la dichiarazione e l'ha accettata.

Attenzione : Android Protected Conferma non fornisce un canale di informazioni sicuro per l'utente. L'app non può assumere 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 Conferma, consulta la guida Android Protected Conferma.

Finestra di dialogo di 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, dando agli utenti maggiore sicurezza di poter eseguire l'autenticazione utilizzando un 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 di autenticazione. Inoltre, cambia il suo comportamento per adattarsi al tipo di autenticazione biometrica scelto da un utente.

Modulo di sicurezza hardware

I dispositivi supportati con Android 9 o versioni successive 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 sicuro.
  • 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 saperne di più sull'utilizzo di Strongbox Keymaster, consulta il Modulo di sicurezza hardware.

Importazione sicura delle chiavi nell'archivio chiavi

Android 9 offre ulteriore sicurezza per la decrittografia delle chiavi aggiungendo la possibilità di importare in modo sicuro le chiavi criptate nell'archivio chiavi utilizzando un formato di chiave con codifica ASN.1. Il Keymaster quindi 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 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 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 la tua 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 lo sblocco dello schermo prima di consentire la decrittografia di tutti i dati in corso o archiviati utilizzando la chiave specificata. Questi tipi di chiavi sono particolarmente adatti per criptare i dati sensibili da archiviare su disco, come i dati sanitari o aziendali. Il flag offre agli utenti una maggiore garanzia che i dati non possano essere decriptati mentre il dispositivo è bloccato in caso di furto o smarrimento del telefono.

Per impedire la decrittografia di una chiave quando il dispositivo è bloccato, abilita il flag passando true al metodo setUnlockedDeviceRequired(). Dopo aver completato questo passaggio, se lo schermo dell'utente è bloccato, qualsiasi tentativo di decriptare o firmare i dati utilizzando questa chiave non andrà a buon fine. 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 dati triplo, o Triple DES. Se la tua app interagisce con sistemi legacy che richiedono Triple DES, utilizza questo tipo di crittografia quando cripti 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 tecnologia Wi-Fi Protected Config (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 vengono visualizzati 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:

Quando questa misura per la 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 dell'app includono preferenze o informazioni sensibili, Android 9 ti consente di definire le condizioni del dispositivo 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 la panoramica del backup dei dati.

Accessibilità

Android 9 introduce miglioramenti al framework di accessibilità che rendono più semplice offrire 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 nel testo nell'interfaccia utente dell'app e selezionare.

Ad esempio, in un'app per lo shopping, uno screen reader può aiutare gli utenti a passare direttamente da una categoria di offerte alla successiva, senza che lo screen reader dovrebbe 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 UI raggruppati logicamente correlati e che in genere costituiscono un frammento.

In Android 9, puoi fornire titoli dei riquadri di accessibilità o titoli identificabili singolarmente per questi riquadri. Se un riquadro 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 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 che viene sostituito in tempo di esecuzione utilizzando setAccessibilityPaneTitle(). Ad esempio, potresti fornire un titolo per l'area dei contenuti di un oggetto Fragment.

Navigazione con 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.

Navigazione e output del gruppo

Gli screen reader hanno tradizionalmente usato l'attributo android:focusable per determinare quando dovrebbero leggere un ViewGroup, o una raccolta di oggetti View, come una singola unità. In questo modo gli utenti potevano capire che le visualizzazioni erano correlate logicamente tra loro.

In Android 8.1 e versioni precedenti, devi contrassegnare ogni oggetto View all'interno di un ViewGroup come non attivabile e lo stesso ViewGroup come attivabile. Grazie a questa disposizione, alcune istanze di View erano contrassegnate come attivabili, rendendo più difficile la navigazione da tastiera.

A partire da Android 9, puoi usare 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 si concentrano su tutti gli elementi che hanno impostato android:screenReaderFocusable o android:focusable su true.

Azioni pratiche

Android 9 aggiunge il supporto per eseguire azioni di convenienza per conto degli utenti:

Interazione con le descrizioni comando
Alcune funzionalità aggiuntive 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 e ACTION_SHOW_TOOLTIP e ACTION_HIDE_TOOLTIP per indicare alle istanze di View di mostrare o nascondere le descrizioni comando.
Azioni globali aggiunte
Android 9 introduce il supporto per due azioni aggiuntive sui dispositivi nella classe AccessibilityService. Il servizio può aiutare gli utenti a bloccare i propri dispositivi e acquisire screenshot utilizzando rispettivamente le azioni GLOBAL_ACTION_LOCK_SCREEN e GLOBAL_ACTION_TAKE_SCREENSHOT.

Dettagli cambio finestra

Android 9 consente di monitorare più facilmente gli aggiornamenti delle finestre di un'app quando un'app torna all'elenco di 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 multi-finestra, ogni finestra produce il proprio insieme di eventi. Il metodo getSource() restituisce la vista principale della finestra associata a ogni evento.

Se per un'app sono stati definiti titoli del riquadro Accessibilità per gli oggetti View, il 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 come è cambiata la finestra. Ad esempio, il framework può rilevare quando un riquadro ha un nuovo titolo o quando è scomparso.

Rotazione

Per eliminare le rotazioni involontarie, 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 insolite di orientamento dello schermo, potresti riscontrare problemi che in precedenza non venivano notati, quando la preferenza di rotazione dell'utente era sempre impostata su verticale. Ti invitiamo a dare un'occhiata al 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 maggiori dettagli, consulta le modifiche del comportamento associate.

Dispositivo mobile rotante che mostra una nuova modalità di rotazione che consente agli utenti di attivare manualmente la rotazione

Una nuova modalità di rotazione consente agli utenti di attivare la rotazione manualmente quando necessario utilizzando un pulsante nella barra di sistema.

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, consente all'app di eseguire il layout di testo al di fuori del thread principale.

  • Lente d'ingrandimento: la classe Magnifier è un widget per la piattaforma che fornisce un'API Lente d'ingrandimento, che consente un'esperienza coerente con le funzionalità di 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à in TextClassifier sostituiscono la funzionalità della classe Linkify.

  • Layout testo: diversi metodi e attributi facilitano 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 ART (Android runtime) precoce ottimizza ulteriormente i file DEX (formato Dalvik Executable) compressi convertendo i file DEX in un pacchetto dell'app in una rappresentazione più compatta. Grazie a questa modifica, l'app si avvia più velocemente e consuma meno spazio su disco e RAM.

Questo miglioramento è un vantaggio in particolare per i dispositivi di fascia bassa con velocità di I/O del disco inferiori.

Tracciamento del sistema sul dispositivo

Android 9 ti consente di registrare le tracce di 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 delle tempistiche relative ai processi e ai 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.