Funzionalità e API di Android 9

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

Le nuove API RTT supportano il posizionamento indoor nelle tue app.

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

Schermata delle opzioni sviluppatore che mostra diverse dimensioni del ritaglio

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:

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 un ritaglio.
  3. 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.

Notifiche di messaggistica

MessagingStyle con foto allegata.

Notifica di messaggistica

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, come addMessage(), ora utilizzano la classe Person anziché CharSequence. La classe Person 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 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: 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:

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

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 a setTargetSampleSize().
  • Per ritagliare un'immagine all'interno dell'intervallo dell'immagine scalata, chiama setCrop().
  • Per creare una bitmap modificabile, passa true a setMutableRequired().

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:

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:

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 utilizza ACTION_SHOW_TOOLTIP e ACTION_HIDE_TOOLTIP per indicare alle istanze di View 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 azioni GLOBAL_ACTION_LOCK_SCREEN e GLOBAL_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.

Rotazione del cellulare che mostra la nuova modalità di rotazione che consente agli utenti di attivare manualmente la rotazione

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à in TextClassifier sostituiscono la funzionalità della classe Linkify.

  • 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.