Funzionalità e API di Android 8.0

Android 8.0 (livello API 26) introduce una serie di nuove funzioni per utenti e sviluppatori. Questo documento mette in evidenza le novità per gli sviluppatori.

Assicurati di controllare anche Modifiche del comportamento di Android 8.0 per scoprire di più sulle aree in cui la piattaforma cambia ciò potrebbe influire sulle tue app.

Esperienza utente

Modalità Picture in picture

Picture in picture in Android 8.0.

Android 8.0 (livello API 26) consente l'avvio delle attività in modalità Picture in picture (PIP). PIP è un tipo speciale di modalità multi-finestra utilizzata principalmente per la riproduzione video. La modalità PIP era inizialmente disponibile per Solo Android TV; Android 8.0 rende disponibile la funzionalità su altri dispositivi Android.

Quando un'attività è in modalità PIP, è in stato di pausa, ma dovrebbe continuare a mostrare i contenuti. Per questo motivo, devi assicurarti che la tua app non mette in pausa la riproduzione nei suoi onPause() . Devi invece mettere in pausa il video tra onStop() e riprendere la riproduzione tra onStart(). Per ulteriori informazioni, vedi Multi-finestra Ciclo di vita.

Per specificare che la tua attività può utilizzare la modalità PIP, imposta android:supportsPictureInPicture su true nel file manifest. A partire da Android 8.0, la modalità PIP non richiede l'attributo manifestandroid:resizeableActivity. Tuttavia, devi impostare android:resizeableActivity su "true" se la tua attività supporta altre modalità multi-finestra).

Android 8.0 (livello API 26) introduce un nuovo oggetto, PictureInPictureParams, che passi ai metodi PIP per specificare come deve comportarsi un'attività. in modalità PIP. Questo oggetto specifica proprietà come le proporzioni preferite per l'attività.

I metodi PIP esistenti descritti in Aggiunta Ora la modalità Picture in picture utilizzata su tutti i dispositivi Android, non solo su Android TV. Inoltre, Android 8.0 offre i seguenti metodi per supportare Modalità PIP:

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): Inserisce l'attività in modalità Picture in picture. Proporzioni dell'attività e altre impostazioni di configurazione sono specificate da args. Eventuali campi in args sono vuoti, il sistema utilizza i valori impostati l'ultima volta chiamato Activity.setPictureInPictureParams().

    L'attività specificata viene posizionata in un angolo dello schermo. il resto lo schermo mostra l'attività precedente presente sullo schermo. L'attività che entra in modalità PIP passa allo stato di pausa, ma rimane a iniziare. Se l'utente tocca l'attività PIP, il sistema mostra un menu per l'utente con cui interagire; gli eventi no touch raggiungono l'attività mentre è nello stato PIP.

  • Activity.setPictureInPictureParams(): Aggiorna le impostazioni di configurazione PIP di un'attività. Se l'attività è attualmente in modalità PIP, le impostazioni sono aggiornate; Ciò è utile se le proporzioni dell'attività cambiano. Se l'attività non è in modalità PIP, queste impostazioni di configurazione vengono utilizzate indipendentemente dal metodo enterPictureInPictureMode() chiamato.

Notifiche

In Android 8.0 (livello API 26), abbiamo riprogettato le notifiche per forniscono un modo più semplice e più coerente per gestire il comportamento delle notifiche e impostazioni. Queste modifiche includono:

    Un menu di pressione prolungata della notifica in Android 8.0 (livello API 26).

    Gli utenti possono premere a lungo le icone del programma di avvio app per visualizzare le notifiche in Android 8.0.

  • Canali di notifica: Android 8.0 introduce i canali di notifica che consentono di creare un canale personalizzabile dall'utente per ogni tipo di notifica da visualizzare. L'interfaccia utente si riferisce ai canali di notifica come categorie di notifica. Per scoprire come implementare i canali di notifica, consulta la pagina Gestire i canali di notifica.
  • Indicatori di notifica: Android 8.0 introduce il supporto per la visualizzazione punti o badge sulle icone in Avvio applicazioni. Gli indicatori di notifica riflettono Presenza di notifiche che l'utente non ha ancora ignorato o in seguito a un'azione. Per informazioni su come utilizzare gli indicatori di notifica, vedi Notifica badge.
  • Posticipo: gli utenti possono posticipare le notifiche e farle scomparire per un determinato periodo di tempo prima di riapparire. Le notifiche vengono visualizzate di nuovo con il lo stesso livello di importanza con cui sono apparsi per la prima volta. Le app possono rimuovere o aggiornare una notifica posticipata, ma l'aggiornamento di una notifica posticipata non causa affinché riappaia.
  • Timeout notifiche: puoi impostare un timeout durante la creazione di un tramite setTimeoutAfter(). Puoi utilizzare questo metodo per specificare un periodo di tempo trascorso il quale una notifica deve essere annullato. Se necessario, puoi annullare una notifica prima che scada la durata del timeout specificata.
  • Impostazioni di notifica: puoi chiamare setSettingsText() per impostare il testo visualizzato quando crei un link alle impostazioni di notifica della tua app da una notifica utilizzando l'intent Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. Il sistema potrebbe fornire i seguenti extra allo scopo di filtrare le impostazioni che la tua app deve mostrare agli utenti: EXTRA_CHANNEL_ID, NOTIFICATION_TAG e NOTIFICATION_ID.
  • Ignorare le notifiche: gli utenti possono ignorare le notifiche autonomamente. le app possono rimuoverle in modo programmatico. Puoi stabilire quando una notifica viene ignorato e perché viene ignorato implementando onNotificationRemoved() dal metodo NotificationListenerService corso.
  • Colori di sfondo: puoi impostare e attivare un colore di sfondo per una notifica. Dovresti usare questa funzione nelle notifiche soltanto per attività in corso che sono fondamentali per una rapida occhiata all'utente. Ad esempio, puoi impostare un colore di sfondo per le notifiche relative alle indicazioni stradali o a una chiamata in corso. Puoi anche impostare il colore di sfondo desiderato utilizzando setColor(). In questo modo, potrai utilizzare setColorized() per attivare l'uso di un colore di sfondo per una notifica.
  • Stile dei messaggi. In Android 8.0, le notifiche che utilizzano lo Visualizzazione dei corsi MessagingStyle più contenuti nella loro forma compressa. Devi utilizzare la classe MessagingStyle per le notifiche relative alla messaggistica. Puoi utilizzare anche Metodo addHistoricMessage() per fornire contesto a una conversazione aggiungendo messaggi storici alle notifiche relative ai messaggi.

Framework di compilazione automatica

La creazione degli account, l'accesso e le transazioni con carta di credito richiedono tempo e sono soggetti a errori. Gli utenti possono essere facilmente infastiditi dalle app che richiedono questi tipi di attività ripetitive.

Android 8.0 (livello API 26) semplifica la compilazione di moduli, come quelli di accesso e delle carte di credito, con l'introduzione del framework di compilazione automatica. Le app esistenti e nuove funzionano con il framework di compilazione automatica dopo che l'utente ha attivato la compilazione automatica.

Puoi intraprendere alcune azioni per ottimizzare il funzionamento della tua app con il framework. Per ulteriori informazioni, consulta la Panoramica del framework di compilazione automatica.

Caratteri scaricabili

Android 8.0 (livello API 26) e la libreria di assistenza Android 26 ti consentono di richiedere i caratteri da un'applicazione del fornitore anziché raggrupparli nell'APK o consentire all'APK di scaricarli. Questa funzionalità riduce le dimensioni dell'APK, aumenta l'app percentuale di successo dell'installazione e consente a più app di condividere lo stesso carattere.

Per ulteriori informazioni sul download dei caratteri, consulta Caratteri scaricabili.

Caratteri in XML

Android 8.0 (livello API 26) introduce una nuova funzionalità, Fonts in XML, che consente di utilizzare i caratteri come risorse. Ciò significa che non è necessario raggruppare i caratteri come asset. I caratteri vengono compilati in un file R e vengono automaticamente disponibili nel sistema come risorsa. Puoi quindi accedere a questi caratteri con di un nuovo tipo di risorsa, font.

La libreria di supporto 26 fornisce il supporto completo di questa funzionalità sui dispositivi con API 14 e versioni successive.

Per ulteriori informazioni sull'utilizzo dei caratteri come risorse e sul recupero dei caratteri di sistema, consulta Caratteri in XML.

TextView con ridimensionamento automatico

Android 8.0 (livello API 26) consente di impostare le dimensioni dell'espansione del testo automaticamente in base alle dimensioni dell'elemento TextView. Ciò significa che è molto più facile ottimizzare le dimensioni del testo su schermi diversi o con contenuti dinamici. Per ulteriori informazioni sul ridimensionamento automatico di TextView in Android 8.0, consulta TextView con ridimensionamento automatico.

Icone adattive

Android 8.0 (livello API 26) introduce le icone del programma di avvio adattive. Le icone adattabili supportano gli effetti visivi e possono mostrare una serie di forme su diversi modelli di dispositivi. Per scoprire come creare icone adattive, consulta la sezione Icone adattive guida.

Gestione del colore

Gli sviluppatori di app di imaging per Android ora possono sfruttare i nuovi dispositivi con un display in grado di riprodurre una gamma di colori più ampia. Per visualizzare le immagini con una gamma cromatica ampia, le app dovranno attivare un flag nel file manifest (per attività) e caricare bitmap con un profilo di colore ampio incorporato (AdobeRGB, Pro Photo RGB, DCI-P3 e così via).

API WebView

Android 8.0 fornisce diverse API per aiutarti a gestire gli oggetti WebView che mostrano contenuti web nella tua app. Queste API, che migliorano la stabilità e la sicurezza della tua app, includono seguenti:

  • API Version
  • API Google Navigazione sicura
  • API Termination Handle
  • API Renderer Importance

Per scoprire di più su come utilizzare queste API, consulta Gestire le WebView.

Il corso WebView ora include un'API Navigazione sicura per migliorare la sicurezza della navigazione sul web. Per ulteriori informazioni, vedi API Google Navigazione sicura.

Fissare scorciatoie e widget

Android 8.0 (livello API 26) introduce il blocco in-app delle scorciatoie e widget. Nella tua app, puoi creare widget e scorciatoie fissati per Avvio app supportate, soggette all'autorizzazione dell'utente.

Per ulteriori informazioni, consulta Bloccare scorciatoie e widget guida alle funzionalità.

Proporzioni massime dello schermo

Android 8.0 (livello API 26) introduce modifiche alla modalità di configurazione delle proporzioni massime di un'app.

Innanzitutto, Android 8.0 introduce l'attributo maxAspectRatio, che puoi utilizzare per impostare il formato massimo dell'app. Inoltre, in Android 8.0 e versioni successive, il le proporzioni massime predefinite sono le proporzioni native del dispositivo su cui è in esecuzione l'app.

Per ulteriori informazioni sulla dichiarazione delle proporzioni massime, consulta Supporto di più schermi.

Supporto di più display

A partire da Android 8.0 (livello API 26), la piattaforma offre supporta più display. Se un'attività supporta la modalità multi-finestra ed è in esecuzione su un dispositivo con più display, gli utenti possono spostarla da un display all'altro. Quando un'app avvia un'attività, l'app puoi specificare su quale display deve essere eseguita l'attività.

Nota: se un'attività supporta modalità multi-finestra, Android 8.0 abilita automaticamente su più display per quell'attività. Devi testare l'app per assicurarti che funzioni adeguatamente in un ambiente multi-display.

È possibile riprendere una sola attività alla volta, anche se ha più display. L'attività attiva è nello stato di ripresa; tutte le altre attività visibili sono in pausa, ma non sono state interrotte. Per ulteriori informazioni sul ciclo di vita delle attività quando sono visibili più attività, consulta Ciclo di vita in più finestre.

Quando un utente sposta un'attività da un display all'altro, il sistema ridimensiona l'attività e apporta modifiche al runtime, se necessario. Le tue attività può gestire autonomamente la modifica della configurazione oppure può consentire al sistema eliminare il processo contenente la tua attività e ricrearlo con il nuovo dimensioni. Per ulteriori informazioni, vedi Gestione della configurazione Modifiche.

ActivityOptions offre due nuovi metodi per supportare più display:

setLaunchDisplayId()
Specifica su quale display deve essere visualizzata l'attività quando viene lanciata.
getLaunchDisplayId()
Restituisce la visualizzazione di lancio corrente dell'attività.

La shell ADB è stata estesa per supportare più display. Ora puoi usare il comando shell start per avviare un'attività, e specificare il target dell'attività:

adb shell start <activity_name> --display <display_id>

Margini e spaziatura del layout unificati

Android 8.0 (livello API 26) ti consente di specificare più facilmente situazioni in cui lati opposti di un elemento View usano lo stesso margine o spaziatura interna. Nello specifico, ora puoi utilizzare i seguenti attributi nei file XML di layout:

Nota: se personalizzi la logica dell'app per supportare lingue e culture diverse, inclusa l'orientamento del testo, tieni presente che questi attributi non influiscono sui valori di layout_marginStart, layout_marginEnd, paddingStart o paddingEnd. Puoi impostare questi valori personalmente, oltre a i nuovi attributi di layout verticale e orizzontale, per creare un comportamento del layout dipende dalla direzione del testo.

Acquisizione del puntatore

Alcune app, come giochi, desktop remoto e client di virtualizzazione, traggono grande vantaggio dal controllo del cursore del mouse. L'acquisizione del puntatore è una nuova funzionalità di Android 8.0 (livello API 26) che offre questo controllo fornendo tutti gli eventi del mouse a una visualizzazione mirata nell'app.

A partire da Android 8.0, un View nella tua app può richiedere acquisizione del puntatore e definisci un listener per elaborare gli eventi del puntatore acquisiti. Il cursore del mouse viene nascosto in questa modalità. La vista può rilasciare l'acquisizione del puntatore quando non sono più necessarie le informazioni del mouse. Il sistema può anche rilasciare la cattura del cursore quando la visualizzazione perde lo stato attivo, ad esempio quando l'utente apre un'altra app.

Per informazioni su come usare questa funzione nella tua app, vedi Acquisizione del puntatore.

Categorie di app

Android 8.0 (livello API 26) consente a ogni app di dichiarare una categoria adatta quando pertinenti. Queste categorie vengono utilizzate per raggruppare app con finalità o funzioni simili quando vengono presentate agli utenti, ad esempio in Utilizzo dati, Utilizzo batteria o Utilizzo spazio di archiviazione. Puoi definire una categoria per la tua app impostando la Attributo android:appCategory in <application> .

Avvio app Android TV

Android 8.0 (livello API 26) include una nuova Esperienza nella schermata Home di Android TV, disponibile con l'emulatore Android TV e l'immagine del dispositivo Nexus Player per Android 8.0. La nuova schermata Home organizza i contenuti video in righe corrispondenti ai canali, ognuno dei quali viene compilato con i programmi di un'app sul sistema. Le app possono pubblicare più canali e gli utenti possono configurare i canali a loro disposizione vuoi vedere nella schermata Home. La schermata Home di Android TV include anche una riga Guarda successivo, che viene compilata con i programmi delle app in base alle abitudini di visualizzazione dell'utente. Le app possono inoltre fornire Anteprime video, che vengono riprodotte automaticamente quando un utente si concentra su un programma. Le API per i canali e i programmi che popolano fanno parte delle API TvProvider, che sono distribuite come Supporta il modulo Libreria con Android 8.0.

Set di animazioni

A partire da Android 8.0 (livello API 26), l'API AnimatorSet ora supporta la ricerca e la riproduzione in ordine inverso. La ricerca consente di impostare la posizione dell'animazione impostata su un determinato momento. La riproduzione al contrario è utile se la tua app include animazioni per azioni che possono essere annullate. Invece di definire due animazioni separate di serie, puoi eseguire la stessa sequenza al contrario.

Input e navigazione

Cluster di navigazione da tastiera

Se un'attività nella tua app utilizza una gerarchia di visualizzazioni complessa, come quella nella Nella Figura 2, considera la possibilità di organizzare gruppi di elementi UI in cluster per la navigazione da tastiera. Gli utenti possono premere Meta + Tab o Ricerca + Tab Chromebook, per passare da un cluster all'altro. Alcuni esempi di gruppi sono: riquadri laterali, barre di navigazione, aree dei contenuti principali ed elementi che potrebbero contenere molti elementi secondari.

Un&#39;attività di esempio che include cinque cluster di navigazione che l&#39;utente può esplorare utilizzando la scorciatoia del cluster di navigazione da tastiera. I cluster
  vengono visualizzati nella seguente disposizione: riquadro superiore, riquadro laterale sinistro, contenuti principali
  riquadro inferiore e pulsante di azione mobile.
Figura 2. Attività contenente 5 cluster di navigazione

Per creare un cluster di elementi View o ViewGroup, imposta l'attributo android:keyboardNavigationCluster su true nel file XML del layout dell'elemento o passa true a setKeyboardNavigationCluster() nella logica dell'interfaccia utente dell'app.

Nota: i cluster non possono essere nidificati, anche se non sono nidificati. i cluster possono apparire a livelli diversi della gerarchia. Se tenti di cluster Nest, il framework tratta solo i primi Elemento ViewGroup come cluster.

Sui dispositivi con touchscreen, puoi impostare l'elemento android:touchscreenBlocksFocus di un oggetto ViewGroup designato per il cluster su true per consentire la navigazione solo all'interno e all'esterno del cluster. In questo caso configurazione in un cluster, gli utenti non possono usare il tasto Tab o i tasti Freccia entrare o uscire dal cluster; deve premere il pulsante di navigazione del cluster, combinazione di tastiere.

Visualizza lo stato attivo predefinito

In Android 8.0 (livello API 26), puoi assegnare il View che deve ricevere il fuoco dopo la ripresa di un'attività (ricreata) e l'utente preme un tasto di navigazione della tastiera, ad esempio il tasto Tab. Per applicare questa impostazione "in primo piano per impostazione predefinita", imposta l'attributo android:focusedByDefault di un elemento View su true nel file XML del layout contenente l'elemento dell'interfaccia utente oppure passa true a setFocusedByDefault() nella logica dell'interfaccia utente dell'app.

Output vocale

Attività e servizi possono utilizzare istanze di TextToSpeech per dettare e pronunciare i contenuti. A partire da Android 8.0 (livello API 26), la tua app può ottenere informazioni più precise sui tempi in cui un motore di sintesi vocale inizia a pronunciare singole parole sintetizzate, a condizione che il motore fornisca queste informazioni. Puoi utilizzare questa funzionalità per attirare l'attenzione su parole specifiche quando vengono pronunciate dal motore di sintesi vocale.

Per utilizzare questi miglioramenti del motore di sintesi vocale nella tua app, registra un'istanza di UtteranceProgressListener. Nell'ambito della procedura di registrazione, includi un gestore onRangeStart() .

Il motore di sintesi vocale chiama rangeStart() per registrare il momento in cui si prevede la riproduzione audio di un intervallo specifico di testo per iniziare. Quando viene avviata la riproduzione dell'audio per quell'intervallo di testo, lo stato onRangeStart() . L'app può quindi rispondere a questo callback, ad esempio evidenziare l'intervallo di testo associato alla frase.

Per ulteriori informazioni sul monitoraggio dell'avanzamento della riproduzione di un motore di sintesi vocale, consulta la documentazione di riferimento della classe UtteranceProgressListener.

Sistema

Nuovi rilevatori StrictMode

Android 8.0 (livello API 26) aggiunge tre nuovi rilevatori StrictMode per aiutare a identificare potenziali bug nella tua app:

Dati memorizzati nella cache

Android 8.0 (livello API 26) fornisce indicazioni e comportamenti migliori per i dati memorizzati nella cache. Ora a ogni app viene assegnata una quota di spazio su disco per i dati memorizzati nella cache, come restituito da getCacheQuotaBytes(UUID).

Quando il sistema deve liberare spazio su disco, inizia eliminando i file memorizzati nella cache dalle app che superano maggiormente la quota allocata. Pertanto, se mantieni i dati memorizzati nella cache al di sotto della quota allocata, i file memorizzati nella cache saranno tra gli ultimi del sistema da cancellare quando necessario. Quando il sistema decide quali file memorizzati nella cache eliminare all'interno dell'app, considera per primi i file meno recenti (in base all'ora di modifica).

Esistono anche due nuovi comportamenti che puoi attivare su base di directory per controllare come il sistema libera i dati memorizzati nella cache:

  • StorageManager.setCacheBehaviorAtomic() può essere utilizzato per indicare che una directory e i suoi contenuti debbano essere eliminati come una singola unità atomica.
  • setCacheBehaviorTombstone(File, boolean) può essere utilizzato per indicare che, anziché eliminare i file all'interno di una directory, devono essere troncati in modo da avere una lunghezza di 0 byte, lasciando invariato il file vuoto.

Infine, se devi allocare spazio su disco per file di grandi dimensioni, valuta la possibilità di utilizzare API allocateBytes(FileDescriptor, long), che si cancellerà automaticamente file memorizzati nella cache appartenenti ad altre app (se necessario) per soddisfare la tua richiesta. Nel decidere se sul dispositivo abbia spazio su disco sufficiente per contenere i nuovi dati, chiama getAllocatableBytes(UUID) anziché utilizzare getUsableSpace(), poiché la prima prenderà in considerazione eventuali copie memorizzate nella cache che il sistema è disposto a cancellare per tuo conto.

Paginazione dei fornitori di contenuti

Abbiamo aggiornato i fornitori di contenuti per includere il supporto per il caricamento di un insieme di dati di grandi dimensioni una pagina alla volta. Ad esempio, un'app di fotografia con molte migliaia di le immagini possono interrogare un sottoinsieme di dati da presentare in una pagina. Ogni pagina dei risultati restituiti da un fornitore di contenuti è rappresentato da un unico cursore . Sia il client che il provider devono implementare il paging per poter utilizzare questa funzionalità.

Per informazioni dettagliate sulle modifiche ai fornitori di contenuti, consulta ContentProvider e ContentProviderClient.

Richieste di aggiornamento dei contenuti

Le ContentProvider e ContentResolver di corsi ora includono un refresh(), che consente ai clienti di scoprire più facilmente se le informazioni richieste siano aggiornate.

Puoi aggiungere una logica di aggiornamento dei contenuti personalizzati estendendo ContentProvider. Assicurati di eseguire l'override refresh() metodo da restituire true, per indicare ai clienti del tuo provider che hai tentato per aggiornare autonomamente i dati.

L'app client può richiedere esplicitamente contenuti aggiornati chiamando un di questo metodo, chiamato anche refresh(). Quando chiami passa l'URI dei dati da aggiornare.

Nota: poiché potresti richiedere dati su una rete, devi invocare refresh() dal lato client solo quando hai una forte indicazione che i contenuti non sono aggiornati. Il motivo più comune per eseguire questo tipo di aggiornamento dei contenuti è in risposta al un'opzione scorri per aggiornare che richiede esplicitamente all'interfaccia utente corrente di visualizzare contenuti aggiornati.

Miglioramenti a JobScheduler

Android 8.0 (livello API 26) introduce una serie di miglioramenti a JobScheduler. Questi miglioramenti semplificano per rispettare le nuove prestazioni limiti di esecuzione, poiché in genere puoi usare i job pianificati i servizi in background o i broadcast receiver impliciti, ora soggetti a limitazioni.

Gli aggiornamenti di JobScheduler includono:

  • Ora puoi associare una coda di lavoro a un job pianificato. Per aggiungere un elemento di lavoro a la coda di un job, richiama JobScheduler.enqueue() Quando il job è in esecuzione, può rimuovere il lavoro in sospeso dalla coda ed elaborarlo. Questa funzionalità gestisce molti dei casi d'uso che in precedenza avrebbero dovuto per avviare un servizio in background, in particolare i servizi che implementano IntentService.
  • Android Support Library 26.0.0 introduce una nuova classe JobIntentService, che offre lo stesso come IntentService ma utilizza i job invece di con Android 8.0 (livello API 26) o versioni successive.
  • Ora puoi chiamare JobInfo.Builder.setClipData() per associare ClipData a un job. Questa opzione consente di associare le concessioni di autorizzazioni URI a un job, in modo simile a come queste autorizzazioni possono essere propagate a Context.startService(). Puoi anche utilizzare le concessioni di autorizzazioni URI con gli intent nelle code di lavoro.
  • I job pianificati ora supportano diversi nuovi vincoli:
    JobInfo.isRequireStorageNotLow()
    Il job non viene eseguito se lo spazio di archiviazione disponibile sul dispositivo è in esaurimento.
    JobInfo.isRequireBatteryNotLow()
    Il job non viene eseguito se il livello della batteria è pari o inferiore alla soglia critica, ovvero il livello a cui il dispositivo mostra la finestra di dialogo di sistema Avviso batteria in esaurimento.
    NETWORK_TYPE_METERED
    Il job richiede una connessione di rete a consumo, come la maggior parte della rete dati piani.

Datastore personalizzato

Android 8.0 (livello API 26) ti consente di fornire un datastore personalizzato in base alle tue preferenze, essere utili se l'app archivia le preferenze in un database cloud o locale oppure se le preferenze sono specifiche per dispositivo. Per ulteriori informazioni di implementazione del datastore, fai riferimento Archivio di dati personalizzati.

Miglioramenti ai contenuti multimediali

Volumeshaper

È disponibile un nuovo corso VolumeShaper. Utilizza le funzionalità di per eseguire brevi transizioni automatiche del volume come dissolvenze in entrata, dissolvenze in uscita e dissolvenze incrociate. Per saperne di più, consulta Controllare l'ampiezza con VolumeShaper.

Miglioramenti della messa a fuoco audio

Le app audio condividono l'uscita audio su un dispositivo richiedendo e abbandonando lo stato attivo audio. Un'app gestisce le modifiche dello stato attivo avviando o interrompendo la riproduzione o riducendo il volume. È disponibile un nuovo corso AudioFocusRequest. Se usi questa classe come parametro requestAudioFocus(), le app hanno nuove funzionalità per gestire le modifiche al focus audio: attenuazione automatica e aumento della messa a fuoco in ritardo.

Metriche relative ai media

Un nuovo metodo getMetrics() restituisce un oggetto PersistableBundle contenente informazioni sulla configurazione e sulle prestazioni, espresse come mappa di attributi e valori. Il metodo getMetrics() è definito per le seguenti classi di media:

Le metriche vengono raccolte separatamente per ogni istanza e vengono mantenute per tutta la durata dell'istanza. Se non sono disponibili metriche, il metodo restituisce null. Le metriche effettive restituite dipendono dalla classe.

Media player

A partire da Android 8.0 (livello API 26), MediaPlayer può riprodurre Con protezione DRM e contenuti multimediali criptati a livello di campione HLS.

Android 8.0 introduce un nuovo modello sovraccarico il comando seekTo() che fornisce dati per la ricerca di un frame. Include un secondo parametro che specifica una modalità di ricerca:

  • SEEK_PREVIOUS_SYNC sposta la posizione dei contenuti multimediali in un frame di sincronizzazione (o tasto) associati a un'origine dati che si trova subito prima o in un dato momento.
  • SEEK_NEXT_SYNC sposta la posizione dei contenuti multimediali in un frame di sincronizzazione (o chiave) associato a un'origine dati che si trova subito dopo o nell'ora specificata.
  • SEEK_CLOSEST_SYNC sposta la posizione dei contenuti multimediali in un frame di sincronizzazione (o chiave) associato a un'origine dati più vicina al momento specificato o in quel momento.
  • SEEK_CLOSEST sposta la posizione dell'elemento multimediale in un frame (non necessariamente una sincronizzazione) o il frame chiave) associati a un'origine dati più vicina o in un dato momento.

Quando eseguono ricerche continue, le app devono utilizzare una delle modalità SEEK_ anziché SEEK_CLOSEST, che è relativamente più lenta, ma può essere più precisa.

MediaRecorder

  • MediaRecorder ora supporta il formato MPEG2_TS, utile per streaming:

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

    vedi MediaRecorder.OutputFormat

  • MediaMuxer ora può gestire un numero qualsiasi di stream audio e video. Non hai più limitazioni a una traccia audio e/o a una traccia video. Usa addTrack() per mixare tutte le tracce che vuoi.
  • MediaMuxer può anche aggiungere una o più tracce di metadati contenenti per frame definito dall'utente informazioni. Il formato dei metadati è definito dall'applicazione. La la traccia di metadati è supportata solo per i container MP4.

I metadati possono essere utili per l'elaborazione offline. Ad esempio, i segnali del giroscopio del sensore potrebbero essere utilizzati per stabilizzare i video.

Quando aggiungi una traccia di metadati, il formato MIME della traccia deve iniziare con il prefisso "application/". Scrivere metadati equivale a scrivere dati video/audio, ad eccezione del che i dati non provengano da un MediaCodec. L'app trasmette invece ByteBuffer con un timestamp associato al valore Metodo writeSampleData(). Il timestamp deve trovarsi nella stessa base temporale delle tracce video e audio.

Il file MP4 generato utilizza il criterio TextMetaDataSampleEntry definito nella sezione 12.3.3.2 dell'ISOBMFF per segnalare il formato MIME dei metadati. Quando utilizzi MediaExtractor per estrarre il file con la traccia dei metadati, il formato mime dei metadati verrà estratto in MediaFormat.

Accesso ai file multimediali migliorato

SAF (Storage Access Framework) consente alle app di esporre un DocumentsProvider personalizzato, che può fornire l'accesso ai file in un'origine dati ad altre app. Infatti, un fornitore di documenti può anche fornire l'accesso ai file che si trovano nell'archiviazione di rete o che utilizzano un protocollo come Media Transfer Protocol (MTP).

Tuttavia, l'accesso a file multimediali di grandi dimensioni da un'origine dati remota presenta alcune difficoltà:

  • I lettori multimediali richiedono l'accesso ricercabile a un file da un fornitore di documenti. Se un file multimediale di grandi dimensioni si trova su un'origine dati remota, il fornitore di documenti deve recuperare tutti i dati in anticipo e creare uno snapshot come descrittore del file. Il media player non può riprodurre il file senza il descrittore del file, pertanto la riproduzione non può iniziare finché il fornitore di documenti non ha completato il download del file.
  • I gestori delle raccolte multimediali, come le app di foto, devono attraversare una serie di accesso agli URI per raggiungere contenuti multimediali memorizzati su una scheda SD esterna tramite cartelle. Questo modello di accesso rende le operazioni collettive sui contenuti multimediali, come spostamento, copia ed eliminazione, piuttosto lente.
  • I gestori della raccolta multimediale non possono determinare la posizione di un documento a causa della sua URI. Di conseguenza, per questi tipi di app è difficile consentire agli utenti di scegliere. dove salvare un file multimediale.

Android 8.0 risolve tutte queste sfide migliorando il livello di accesso allo spazio di archiviazione .

Fornitori di documenti personalizzati

A partire da Android 8.0, il framework di accesso allo spazio di archiviazione consente ai provider di documenti personalizzati di creare descrittori di file cercabili per i file che si trovano in un'origine dati remota. L'SAF può aprire un file per ottenere un descrittore di file selezionabile nativo. L'SAF invia quindi richieste di byte distinti al fornitore di documenti. Questa funzionalità consente a un fornitore di documenti di restituire l'intervallo esatto di byte richiesto da un'app di media player anziché memorizzare in anticipo l'intero file nella cache.

Per utilizzare questa funzione, devi chiamare il nuovo StorageManager.openProxyFileDescriptor(). Il metodo openProxyFileDescriptor() accetta un oggetto ProxyFileDescriptorCallback come callback. La SAF richiama il callback ogni volta che un'applicazione client esegue operazioni sui file descrittore del file restituito dal fornitore dei documenti.

Accesso diretto ai documenti

A partire da Android 8.0 (livello API 26), puoi utilizzare getDocumentUri() metodo per ottieni un URI che fa riferimento allo stesso documento del mediaUri specificato. Tuttavia, poiché l'URI restituito è supportato da un DocumentsProvider, i gestori delle raccolte multimediali possono accedere direttamente al documento, senza dover attraversare gli alberi delle directory con ambito. Di conseguenza, i gestori dei contenuti multimediali possono eseguire operazioni sui file del documento molto più rapidamente.

Attenzione: il metodo getDocumentUri() individua solo i file multimediali; non concede alle app l'autorizzazione per accedere a questi file. Per scoprire di più su come ottenere l'accesso l'autorizzazione per i file multimediali, consulta la documentazione di riferimento.

Percorsi dei documenti

Quando utilizzi Storage Access Framework in Android 8.0 (livello API 26), puoi utilizzare Metodo findDocumentPath(), disponibile in entrambi DocumentsContract e DocumentsProvider , per determinare il percorso dalla radice di un file system data la ID. Il metodo restituisce questo percorso in un DocumentsContract.Path oggetto. Se un sistema di file ha più percorsi definiti per lo stesso documento, il metodo restituisce il percorso utilizzato più di frequente per raggiungere il documento con l'ID specificato.

Questa funzionalità è particolarmente utile nei seguenti scenari:

  • La tua app utilizza una finestra di dialogo "Salva come" che mostra la posizione di un determinato documento.
  • La tua app mostra le cartelle in una visualizzazione dei risultati di ricerca e deve caricare il file secondario documenti che si trovano all'interno di una determinata cartella se l'utente seleziona tale .

Nota: se la tua app ha l'autorizzazione per accedere solo ad alcuni dei documenti nel percorso, il valore restituito di findDocumentPath() include solo le cartelle e i documenti a cui la tua app può accedere.

Monitoraggio della riproduzione audio

Il servizio di sistema AudioManager gestisce un elenco di oggetti AudioManager attivi, ognuno dei quali contiene informazioni su una determinata sessione di riproduzione audio. La tua app può recupera l'insieme di configurazioni attualmente attive richiamando getActivePlaybackConfigurations().

A partire da Android 8.0 (livello API 26), puoi registrare un callback che invia una notifica alla tua app quando uno o più oggetti AudioPlaybackConfiguration sono stati modificati. Per farlo, chiama registerAudioPlaybackCallback() passando un'istanza di AudioManager.AudioPlaybackCallback. La classe AudioManager.AudioPlaybackCallback contiene il metodo onPlaybackConfigChanged(), che viene chiamato dal sistema quando la configurazione della riproduzione audio cambia.

Connettività

Sensibile al Wi-Fi

Android 8.0 (livello API 26) aggiunge il supporto per Wi-Fi Aware, che si basa sulla specifica Neighbor Awareness Networking (NAN). Sui dispositivi con L'hardware, le app e i dispositivi nelle vicinanze che utilizzano Wi-Fi Aware possono rilevare e comunicare tramite Wi-Fi senza un punto di accesso a internet. Stiamo lavorando con il nostro hardware per rendere disponibile la tecnologia Wi-Fi Aware sui dispositivi il prima possibile. Per Per informazioni su come integrare Wi-Fi Aware nella tua app, vedi Wi-Fi Aware.

Bluetooth

Android 8.0 (livello API 26) arricchisce il supporto Bluetooth della piattaforma aggiungendo le seguenti funzionalità:

  • Supporto per lo standard AVRCP 1.4, che consente la navigazione nelle raccolte di brani.
  • Supporto dello standard Bluetooth Low Energy (BLE) 5.0.
  • Integrazione del codec LDAC di Sony nello stack Bluetooth.

Accoppiamento del dispositivo complementare

Android 8.0 (livello API 26) fornisce API che ti consentono di personalizzare la finestra di dialogo di richiesta di accoppiamento quando cerchi di accoppiarti con dispositivi complementari tramite Bluetooth, BLE e Wi-Fi. Per ulteriori informazioni, consulta Accoppiamento del dispositivo complementare.

Per ulteriori informazioni sull'uso del Bluetooth su Android, vedi Guida al Bluetooth. Per modifiche al Bluetooth specifiche per Android 8.0 (livello API 26), consulta le Bluetooth della Pagina Modifiche del comportamento di Android 8.0.

Condivisione

Condivisione intelligente

Android 8.0 (livello API 26) apprende le preferenze di condivisione personalizzate degli utenti e comprende meglio per ogni tipo di contenuto quali sono le app giuste con cui condividerli. Ad esempio, se un utente scatta la foto di uno scontrino, Android 8.0 può suggerire un'app per il monitoraggio delle spese; se l'utente scatta un selfie, un social media un'app può gestire meglio l'immagine. Android 8.0 apprende automaticamente tutti questi schemi in base alle preferenze personalizzate degli utenti.

La condivisione smart funziona per tipi di contenuti diversi da image, ad esempio audio, video, text, URL, ecc.

Per attivare la condivisione intelligente, aggiungi un massimo di tre ArrayList annotazioni di stringa per l'intent che condivide i contenuti. Le annotazioni devono descrivono i componenti o gli argomenti principali dei contenuti. Il seguente esempio di codice mostra come aggiungere annotazioni all'intent:

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

Per informazioni dettagliate sulle annotazioni di condivisione intelligente, consulta EXTRA_CONTENT_ANNOTATIONS.

Classificazione del testo

Sui dispositivi compatibili, le app possono usare un nuovo classificatore di testo per controllare se: la stringa corrisponde a un tipo di entità classificatore noto e ottiene la selezione suggerita alternative. Le entità riconosciute dal sistema includono indirizzi, URL, numeri di telefono e indirizzi email. Per ulteriori informazioni, vedi TextClassifier.

Accessibilità

Android 8.0 (livello API 26) supporta diverse nuove funzioni di accessibilità per sviluppatori che creano i propri servizi di accessibilità:

Per scoprire di più su come rendere più accessibile la tua app, consulta Accessibilità.

Sicurezza e privacy

Autorizzazioni

Android 8.0 (livello API 26) introduce diverse nuove autorizzazioni relative alla telefonia:

  • L'autorizzazione ANSWER_PHONE_CALLS consente alla tua app di rispondere alle chiamate in arrivo in modo programmatico. Per gestire una telefonata in arrivo la tua app, puoi usare acceptRingingCall() .
  • L'autorizzazione READ_PHONE_NUMBERS concede alla tua app l'accesso in lettura ai numeri di telefono memorizzati in un dispositivo.

Entrambe le autorizzazioni sono classificate come pericolose e fanno parte del PHONE gruppo di autorizzazioni.

Nuove API per il rilevamento e l'accesso agli account

Android 8.0 (livello API 26) introduce diversi miglioramenti alla modalità le app hanno accesso agli account utente. Per gli account che gestisce, gli utenti possono usare i propri criteri per decidere se nascondere gli account, o rivelare gli account a un'app. Il sistema Android monitora le applicazioni che possono per accedere a un determinato account.

Nelle versioni precedenti di Android, le app che volevano monitorare l'elenco degli account utente dovevano ricevere aggiornamenti su tutti gli account, inclusi quelli di tipi estranei. Android 8.0 aggiunge il metodo addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]), che consente alle app di specificare un elenco di tipi di account per i quali devono essere ricevute le modifiche dell'account.

Modifiche all'API

AccountManager offre sei nuovi metodi per aiutare gli autenticatori a gestire le diverse le app possono vedere un account:

Android 8.0 (livello API 26) introduce due valori speciali del nome del pacchetto per specificare la visibilità per applicazioni che non erano state impostate utilizzando setAccountVisibility(android.accounts.Account, java.lang.String, int) . Il valore di visibilità PACKAGE_NAME_KEY_LEGACY_VISIBLE viene applicato alle app che dispongono dell'autorizzazione GET_ACCOUNTS e alle versioni di destinazione di Android precedenti ad Android 8.0 oppure le cui firme corrispondono all'autenticatore che ha come target qualsiasi versione di Android. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE fornisce un valore di visibilità predefinito per le app che non sono state impostate in precedenza e per le quali PACKAGE_NAME_KEY_LEGACY_VISIBLE non è applicabile.

Per ulteriori informazioni sulle nuove API di accesso e rilevamento degli account, consulta riferimento per AccountManager e OnAccountsUpdateListener.

Test

Test della strumentazione

Android 8.0 (livello API 26) fornisce le seguenti funzionalità di supporto aggiuntivo per i test di strumentazione della tua app.

Esegui su processi dell'app non predefiniti

Ora puoi specificare che un determinato test di misurazione debba essere eseguito su un processo esterno a quello predefinito dell'app. Questa configurazione è utile se la tua app contiene più attività eseguite in processi diversi.

Per definire una strumentazione di processo non predefinita, vai al file manifest file, quindi al file <instrumentation>. Aggiungi il parametro android:targetProcess e impostarne il valore su uno tra le seguenti:

  • Il nome di un particolare processo.
  • Un elenco di nomi di processi separati da virgole.
  • Un carattere jolly ("*"), che consente di eseguire la misurazione su qualsiasi processo avviato che esegue codice nel pacchetto specificato nell'attributo android:targetPackage.

Mentre il test della strumentazione è in esecuzione, puoi controllare quale processo è in corso il test chiamando getProcessName().

Segnala i risultati durante un test

Ora puoi segnalare i risultati mentre il test della strumentazione è in esecuzione, anziché in seguito, chiamando addResults().

Intent simulati per i test

Per semplificare la creazione di test di interfaccia utente isolati e indipendenti per le attività della tua app, Android 8.0 (livello API 26) introduce il metodo onStartActivity(). Esegui l'override di questo metodo in una sottoclasse personalizzata Instrumentation.ActivityMonitor corso per gestire una determinata l'intent chiamato dalla classe di test.

Quando la classe di test invoca l'intent, il metodo restituisce un oggetto stubInstrumentation.ActivityResult anziché eseguire l'intent stesso. Utilizzando questa logica di intent simulata nei test, puoi concentrarti su come la tua attività prepara e gestisce l'intent che passi a un'attività diversa o a un'app completamente diversa.

Runtime e strumenti

Ottimizzazioni della piattaforma

Android 8.0 (livello API 26) introduce nella piattaforma ottimizzazioni di runtime e di altro tipo che portano a una serie di miglioramenti delle prestazioni. Queste ottimizzazioni includono la raccolta dei rifiuti con compressione simultanea, un uso più efficiente della memoria e la localizzazione del codice.

Queste ottimizzazioni garantiscono tempi di avvio più rapidi e prestazioni migliori sia nel Sistema operativo e app.

Supporto del linguaggio Java aggiornato

Android 8.0 (livello API 26) aggiunge il supporto di diverse API Java OpenJDK aggiuntive:

Per scoprire di più sulle classi e sui metodi di questi pacchetti appena aggiunti, consulta la documentazione di riferimento dell'API.

Se vuoi utilizzare le funzionalità del linguaggio Java 8 in Android Studio, devi scaricare la versione di anteprima più recente.

API ICU4J per Android Framework aggiornate

Android 8.0 (livello API 26) estende la Framework Android ICU4J API, un sottoinsieme delle API ICU4J, che gli sviluppatori di app possono da utilizzare nel pacchetto android.icu. Queste API utilizzano i dati di localizzazione presenti sul dispositivo, quindi puoi ridurre l'impronta dell'APK non compilando le librerie ICU4J nell'APK.

Tabella 1. Versioni di ICU, CLDR e Unicode utilizzate su Android.

Livello API Android Versione ICU Versione CLDR Versione Unicode
Android 7.0 (livello API 24), Android 7.1 (livello API 25) 56 28 8.0
Android 8.0 (livello API 26) 58,2 30.0.3 9.0

Per ulteriori informazioni sull'internazionalizzazione su Android, incluso il supporto di ICU4J, consulta Internazionalizzazione su Android.

Android Enterprise

Sono state introdotte nuove funzionalità e API aziendali per i dispositivi in esecuzione Android 8.0 (livello API 26). Ecco alcune delle caratteristiche principali:

  • I profili di lavoro su dispositivi completamente gestiti consentono alle aziende di separare il lavoro dal i dati personali e al contempo gestire entrambi.
  • La delega dell'API consente ai proprietari di dispositivi e ai proprietari di profili di assegnare la gestione delle app ad altre applicazioni.
  • Miglioramenti dell'esperienza utente nel flusso di provisioning (inclusi i nuovi opzioni di personalizzazione) diminuiscono i tempi di configurazione.
  • Nuovi controlli per Bluetooth, Wi-Fi, backup e sicurezza consentono alle aziende per gestire più elementi del dispositivo. Il logging delle attività di rete aiuta le aziende a individuare i problemi.

Per scoprire di più su queste e altre nuove API e funzionalità di Android Enterprise, vedi Android in azienda.