Panoramica delle funzionalità e delle API

Android 11 introduce nuove fantastiche funzionalità e API per gli sviluppatori. Le sezioni seguenti ti aiutano a scoprire le funzionalità per le tue app e a iniziare a utilizzare le API correlate.

Per un elenco dettagliato delle API nuove, modificate e rimosse, leggi il report sulle differenze delle API. Per informazioni dettagliate sulle nuove API, visita il Riferimento API Android, dove le nuove API sono evidenziate per una maggiore visibilità. Inoltre, per scoprire le aree in cui le modifiche alla piattaforma potrebbero interessare le tue app, assicurati di consultare le modifiche al comportamento di Android 11 per le app che hanno come target Android R e per tutte le app, nonché le modifiche alla privacy.

Nuove esperienze

Controlli del dispositivo

Android 11 include una nuova API ControlsProviderService che puoi utilizzare per esporre i controlli per i dispositivi esterni connessi. Questi controlli vengono visualizzati in Controlli dei dispositivi nel menu del tasto di accensione di Android. Per saperne di più, consulta Controlla i dispositivi esterni.

Controlli multimediali

Android 11 aggiorna il modo in cui vengono visualizzati i controlli multimediali. I controlli multimediali vengono visualizzati vicino alle Impostazioni rapide. Le sessioni di più app sono disposte in un carosello scorrevole che include stream riprodotti localmente sullo smartphone, stream remoti, come quelli rilevati su dispositivi esterni o sessioni di trasmissione, e sessioni precedenti riprendibili nell'ordine in cui sono state riprodotte l'ultima volta.

Gli utenti possono riavviare le sessioni precedenti dal carosello senza dover avviare l'app. Quando inizia la riproduzione, l'utente interagisce con i controlli multimediali nel modo consueto.

Per saperne di più, consulta controlli multimediali.

Schermi

Supporto migliore per i display con struttura a cascata

Android 11 fornisce diverse API per supportare i display a cascata, ovvero i display che avvolgono il bordo del dispositivo. Questi display sono considerati una variante dei display con ritagli display. I metodi DisplayCutout.getSafeInset…() esistenti ora restituiscono l'inset sicuro per evitare le aree con display a cascata e i ritagli. Per eseguire il rendering dei contenuti dell'app nell'area a cascata, procedi nel seguente modo:

  • Chiama DisplayCutout.getWaterfallInsets() per ottenere le dimensioni esatte dell'inserto a cascata.

  • Imposta l'attributo di layout della finestra layoutInDisplayCutoutMode su LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS per consentire alla finestra di estendersi nelle aree di ritaglio e waterfall su tutti i bordi dello schermo. Devi assicurarti che non siano presenti contenuti essenziali nelle aree di ritaglio o a cascata.

Sensore dell'angolo della cerniera e pieghevoli

Android 11 consente alle app in esecuzione su dispositivi con configurazioni dello schermo basate su cerniere di determinare l'angolo della cerniera fornendo un nuovo sensore con TYPE_HINGE_ANGLE e un nuovo SensorEvent che può monitorare l'angolo della cerniera e fornisce una misurazione in gradi tra due parti integrali del dispositivo. Puoi utilizzare queste misurazioni non elaborate per eseguire animazioni granulari mentre l'utente manipola il dispositivo.

Consulta la sezione Pieghevoli.

Conversazioni

Miglioramenti alla conversazione

Android 11 apporta una serie di miglioramenti al modo in cui vengono gestite le conversazioni. Le conversazioni sono comunicazioni bidirezionali in tempo reale tra due o più persone. Queste conversazioni hanno una rilevanza speciale e gli utenti hanno diverse nuove opzioni per interagire con loro.

Per ulteriori informazioni sulle conversazioni e su come la tua app può supportarle, consulta Persone e conversazioni.

Fumetti della chat

Le bolle sono ora disponibili per gli sviluppatori per contribuire a mostrare le conversazioni in tutto il sistema. Le bolle erano una funzionalità sperimentale di Android 10 che veniva attivata tramite un'opzione sviluppatore; in Android 11, questo non è più necessario.

Se un'app ha come target Android 11 (livello API 30) o versioni successive, le sue notifiche non vengono presentate come bolle, a meno che non soddisfino i nuovi requisiti per le conversazioni. In particolare, la notifica deve essere associata a una scorciatoia.

Prima di Android 11, se volevi che una notifica venisse visualizzata in una bolla, dovevi specificare esplicitamente che la notifica era impostata per l'avvio sempre in modalità UI del documento. A partire da Android 11, non è più necessario configurare esplicitamente questa impostazione. Se la notifica è in formato fumetto, la piattaforma la imposta automaticamente in modo che venga sempre avviata in modalità UI del documento.

Sono stati apportati diversi miglioramenti alle prestazioni delle bolle e gli utenti hanno maggiore flessibilità nell'attivazione e nella disattivazione delle bolle da ogni app. Per gli sviluppatori che hanno implementato il supporto sperimentale, sono state apportate alcune modifiche alle API in Android 11:

Indicatori visivi 5G

Per informazioni sulla visualizzazione degli indicatori 5G sui dispositivi degli utenti, consulta Informare gli utenti quando utilizzano il 5G.

Privacy

Android 11 introduce numerose modifiche e restrizioni per migliorare la privacy degli utenti. Per scoprire di più, consulta la pagina Privacy.

Sicurezza

Aggiornamenti dell'autenticazione biometrica

Per aiutarti a controllare il livello di sicurezza dei dati della tua app, Android 11 offre diversi miglioramenti all'autenticazione biometrica. Queste modifiche vengono visualizzate anche nella libreria Jetpack Biometric.

Tipi di autenticazione

Android 11 introduce l'interfaccia BiometricManager.Authenticators, che puoi utilizzare per dichiarare i tipi di autenticazione supportati dalla tua app.

Determina il tipo di autenticazione utilizzato

Dopo l'autenticazione dell'utente, puoi verificare se l'utente ha eseguito l'autenticazione utilizzando una credenziale del dispositivo o una credenziale biometrica chiamando getAuthenticationType().

Supporto aggiuntivo per le chiavi di autenticazione per utilizzo

Android 11 offre un maggiore supporto per l'autenticazione tramite chiavi di autenticazione per utilizzo.

Metodi deprecati

Android 11 ritira i seguenti metodi:

  • Il metodo setDeviceCredentialAllowed().
  • Il metodo setUserAuthenticationValidityDurationSeconds().
  • La versione sovraccarica di canAuthenticate() che non accetta argomenti.

Condivisione sicura di set di dati di grandi dimensioni

In alcune situazioni, ad esempio quelle che coinvolgono il machine learning o la riproduzione di contenuti multimediali, la tua app potrebbe voler utilizzare lo stesso set di dati di grandi dimensioni di un'altra app. Nelle versioni precedenti di Android, la tua app e un'altra app dovevano scaricare ciascuna una copia separata dello stesso set di dati.

Per ridurre la ridondanza dei dati, sia sulla rete che sul disco, Android 11 consente di memorizzare nella cache del dispositivo questi set di dati di grandi dimensioni utilizzando blob di dati condivisi. Per scoprire di più sulla condivisione dei set di dati, consulta la guida approfondita sulla condivisione di set di dati di grandi dimensioni.

Eseguire la crittografia basata su file dopo un riavvio OTA senza credenziali utente

Dopo che il dispositivo ha completato un aggiornamento OTA e si è riavviato, le chiavi di crittografia delle credenziali (CE) inserite nello spazio di archiviazione protetto da credenziali sono immediatamente disponibili per le operazioni di crittografia basata su file (FBE). Ciò significa che, dopo un aggiornamento OTA, l'app può riprendere le operazioni che richiedono le chiavi CE prima che l'utente inserisca il PIN, la sequenza o la password.

Prestazioni e qualità

Debug wireless

Android 11 supporta il deployment e il debug dell'app in modalità wireless dalla tua workstation tramite Android Debug Bridge (ADB). Ad esempio, puoi eseguire il deployment della tua app abilitata al debug su più dispositivi remoti senza collegare fisicamente il tuo dispositivo tramite USB e senza dover affrontare i problemi comuni di connessione USB, come l'installazione dei driver. Per saperne di più, consulta Esegui app su un dispositivo hardware.

Installazione incrementale dell'APK ADB

L'installazione di APK di grandi dimensioni (oltre 2 GB) su un dispositivo può richiedere molto tempo, anche se viene apportata solo una piccola modifica a un'app. L'installazione incrementale dell'APK di ADB (Android Debug Bridge) accelera questo processo installando una parte sufficiente dell'APK per avviare l'app durante lo streaming dei dati rimanenti in background. adb install utilizzerà questa funzionalità automaticamente se è supportata dal dispositivo e se hai installato la versione più recente di SDK Platform-Tools. Se non è supportato, viene utilizzato automaticamente il metodo di installazione predefinito.

Utilizza il seguente comando adb per utilizzare la funzionalità. Se il dispositivo non supporta l'installazione incrementale, il comando non va a buon fine e viene visualizzata una spiegazione dettagliata.

adb install --incremental

Prima di eseguire un'installazione incrementale dell'APK ADB, devi firmare l'APK e creare un file dello schema di firma dell'APK v4. Per il funzionamento di questa funzionalità, il file di firma v4 deve essere posizionato accanto all'APK.

Rilevamento degli errori tramite l'allocatore della memoria nativa

GWP-ASan è una funzionalità di allocazione della memoria nativa che aiuta a trovare bug use-after-free e heap-buffer-overflow. Puoi attivare questa funzionalità a livello globale o per sottoprocessi specifici della tua app. Per scoprire di più, consulta la guida di GWP-Asan.

API Neural Networks 1.3

Android 11 espande e migliora l'API Neural Networks (NNAPI).

Nuove operazioni

NNAPI 1.3 introduce un nuovo tipo di operando, TENSOR_QUANT8_ASYMM_SIGNED, per supportare il nuovo schema di quantizzazione di TensorFlow Lite.

Inoltre, NNAPI 1.3 introduce le seguenti nuove operazioni:

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

Nuovi controlli ML

NNAPI 1.3 introduce nuovi controlli per contribuire al corretto funzionamento del machine learning:

API NDK Thermal

Quando i dispositivi si surriscaldano, possono limitare la CPU e/o la GPU, il che può influire sulle app in modi imprevisti. Le app o i giochi che incorporano grafica complessa, calcoli complessi o attività di rete prolungata hanno maggiori probabilità di riscontrare problemi.

Utilizza l'API NDK Thermal in Android 11 per monitorare le variazioni di temperatura sul dispositivo e poi intervieni per mantenere un consumo energetico ridotto e una temperatura del dispositivo più bassa. Questa API è simile all'API Java Thermal; puoi utilizzarla per ricevere notifiche per qualsiasi modifica dello stato termico o per eseguire il polling dello stato attuale direttamente.

Testo e input

Transizioni IME migliorate

Android 11 introduce nuove API per migliorare le transizioni per gli editor dei metodi di immissione (IME), come le tastiere sullo schermo. Queste API semplificano la regolazione dei contenuti della tua app in sincronia con la comparsa e la scomparsa dell'IME e con altri elementi come le barre di stato e di navigazione.

Per mostrare un IME mentre un EditText ha lo stato attivo, chiama view.getInsetsController().show(Type.ime()). Puoi chiamare questo metodo su qualsiasi visualizzazione nella stessa gerarchia della EditText attiva, non è necessario chiamarlo specificamente sulla EditText. Per nascondere l'IME, chiama view.getInsetsController().hide(Type.ime()). Puoi verificare se un IME è attualmente visibile chiamando view.getRootWindowInsets().isVisible(Type.ime()).

Per sincronizzare le visualizzazioni della tua app con la comparsa e la scomparsa dell'IME, imposta un listener su una visualizzazione fornendo un WindowInsetsAnimation.Callback a View.setWindowInsetsAnimationCallback(). Puoi impostare questo listener su qualsiasi visualizzazione, non deve essere necessariamente un EditText. L'IME chiama il metodo onPrepare() del listener, quindi chiama onStart() all'inizio della transizione. Quindi, chiama onProgress() in ogni fase della transizione. Al termine della transizione, l'IME chiama onEnd(). In qualsiasi momento della transizione, puoi scoprire l'avanzamento della transizione chiamando WindowInsetsAnimation.getFraction().

Per un esempio di come utilizzare queste API, consulta il nuovo esempio di codice WindowInsetsAnimation.

Controllo dell'animazione dell'IME

Puoi anche assumere il controllo dell'animazione dell'IME o di un'altra barra di sistema, come la barra di navigazione. Per farlo, chiama prima setOnApplyWindowInsetsListener() per impostare un nuovo listener per le modifiche agli inset della finestra:

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, 
                          barsIme.bottom)

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
    WindowInsets.CONSUMED
}

Java

mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {

       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,
                             barsIme.bottom);

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});

Per spostare l'IME o un'altra barra di sistema, chiama il metodo controlWindowInsetsAnimation() del controller:

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

Java

mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }

           @Override
           public void onCancelled() {}
       });

Aggiornamenti alle librerie ICU

Android 11 aggiorna il pacchetto android.icu per utilizzare la versione 66 della libreria ICU, rispetto alla versione 63 di Android 10. La nuova versione della libreria include dati sulle impostazioni internazionali CLDR aggiornati e una serie di miglioramenti al supporto dell'internazionalizzazione in Android.

Le modifiche principali nelle nuove versioni della libreria includono:

  • Molte API di formattazione ora supportano un nuovo tipo di oggetto restituito che estende FormattedValue.
  • L'API LocaleMatcher è stata migliorata con una classe builder, il supporto per il tipo java.util.Locale e una classe di risultati con dati aggiuntivi su una corrispondenza.
  • Unicode 13 è ora supportato.

Media

Allocazione dei buffer MediaCodec

Android 11 include una nuova API MediaCodec che offre alle app un maggiore controllo sull'allocazione dei buffer di input e output. In questo modo, l'app può gestire la memoria in modo più efficiente.

Nuove classi:
Nuovi metodi:

Inoltre, il comportamento di due metodi in MediaCodec.Callback() è cambiato:

onInputBufferAvailable()
Anziché chiamare MediaCodec.getInputBuffer() e MediaCodec.queueInputBuffer() con l'indice, se configurate per utilizzare l'API Block Model, le app devono utilizzare MediaCodec.getQueueRequest con l'indice, collegando un LinearBlock/HardwareBuffer allo slot.
onOutputBufferAvailable()
Anziché chiamare MediaCodec.getOutputBuffer() con l'indice, le app possono utilizzare MediaCodec.getOutputFrame() con l'indice per ottenere l'oggetto OutputFrame con ulteriori informazioni e buffer LinearBlock/HardwareBuffer.

Decodifica a bassa latenza in MediaCodec

Android 11 migliora MediaCodec per supportare la decodifica a bassa latenza per i giochi e altre app in tempo reale. Puoi verificare se un codec supporta la decodifica a bassa latenza passando FEATURE_LowLatency a MediaCodecInfo.CodecCapabilities.isFeatureSupported().

Per attivare o disattivare la decodifica a bassa latenza, esegui una delle seguenti operazioni:

Nuova funzione AAudio AAudioStream_release()

La funzione AAudioStream_close() rilascia e chiude uno stream audio contemporaneamente. Questo può essere pericoloso. Se un altro processo tenta di accedere allo stream dopo la chiusura, il processo si arresta in modo anomalo.

La nuova funzione AAudioStream_release() rilascia lo stream, ma non lo chiude. In questo modo, le risorse vengono liberate e lo stream rimane in uno stato noto. L'oggetto persiste finché non chiami AAudioStream_close().

API MediaParser

MediaParser è una nuova API di basso livello per l'estrazione di contenuti multimediali. È più flessibile di MediaExtractor e fornisce un controllo aggiuntivo sulla funzionalità di estrazione dei contenuti multimediali.

Acquisizione audio da un dispositivo USB

Quando un'applicazione senza l'autorizzazione RECORD_AUDIO utilizza UsbManager per richiedere l'accesso diretto a un dispositivo audio USB con funzionalità di acquisizione audio (ad esempio cuffie USB), viene visualizzato un nuovo messaggio di avviso che chiede all'utente di confermare l'autorizzazione per l'utilizzo del dispositivo. Il sistema ignora qualsiasi opzione "Usa sempre", pertanto l'utente deve confermare l'avviso e concedere l'autorizzazione ogni volta che un'app richiede l'accesso.

Per evitare questo comportamento, l'app deve richiedere l'autorizzazione RECORD_AUDIO.

Accesso simultaneo al microfono

Android 11 aggiunge nuovi metodi alle API AudioRecord, MediaRecorder e AAudioStream. Questi metodi attivano e disattivano la possibilità di acquisire contemporaneamente, indipendentemente dal caso d'uso selezionato. Consulta Condivisione dell'input audio.

Selettore di output

Android 11 implementa un nuovo comportamento per le app che utilizzano le API Cast e MediaRouter.

Oltre ad accedere alle opzioni di trasmissione da un'app, le opzioni di cambio appaiono anche nel media player di sistema. In questo modo, l'utente può usufruire di un'esperienza senza interruzioni quando passa da un dispositivo all'altro mentre cambia i contesti di visualizzazione e ascolto, ad esempio guardando un video in cucina o su uno smartphone oppure ascoltando l'audio a casa o in auto. Consulta il selettore di output.

Connettività

Miglioramenti di Wi-Fi Passpoint

Per informazioni sulle funzionalità di Passpoint aggiunte in Android 11, consulta Passpoint.

L'API Wi-Fi Suggestion è stata ampliata

Android 11 espande l'API Wi-Fi Suggestion per aumentare le funzionalità di gestione della rete della tua app, tra cui:

  • Le app di gestione della connettività possono gestire le proprie reti consentendo le richieste di disconnessione.
  • Le reti Passpoint sono integrate nell'API Suggestion e possono essere suggerite all'utente.
  • Le API Analytics ti consentono di ottenere informazioni sulla qualità delle tue reti.

Aggiornamenti di CallScreeningService

A partire da Android 11, un CallScreeningService può richiedere informazioni sullo stato di verifica STIR/SHAKEN (verstat) per le chiamate in arrivo. Queste informazioni vengono fornite nell'ambito dei dettagli della chiamata per le chiamate in arrivo.

Se un'app CallScreeningService dispone dell'autorizzazione READ_CONTACTS, viene avvisata quando ci sono chiamate in arrivo o in uscita da o verso un numero nei contatti dell'utente.

Per saperne di più, consulta Impedisci lo spoofing dell'ID chiamante.

Aggiornamenti di Open Mobile API

Per informazioni sul supporto di OMAPI su Android 11 e versioni successive, consulta Supporto del lettore Open Mobile API.

VPN ad alte prestazioni

Le app che hanno come livello API target 30 e versioni successive o che vengono eseguite su dispositivi lanciati con il livello API 29 e versioni successive possono applicare IKEv2/IPsec alle VPN sia per le VPN configurate dall'utente sia per quelle basate su app.

Le VPN vengono eseguite in modo nativo sul sistema operativo, semplificando il codice necessario per stabilire connessioni VPN IKEv2/IPsec in un'app.

Controllo dell'accesso alla rete per processo

Per informazioni sull'attivazione dell'accesso alla rete per processo, consulta Gestisci l'utilizzo della rete.

Consenti più configurazioni Passpoint installate con lo stesso FQDN

A partire da Android 11, puoi utilizzare PasspointConfiguration.getUniqueId() per ottenere un identificatore univoco per un oggetto PasspointConfiguration, che consente agli utenti della tua app di installare più profili con lo stesso nome di dominio completo (FQDN).

Questa funzionalità è utile quando un operatore implementa più di una combinazione di Mobile Country Code (MCC) e Mobile Network Code (MNC) sulla propria rete, ma ha un solo FQDN. Su Android 11 e versioni successive, è possibile installare più di un profilo con lo stesso FQDN che corrisponderà alla rete come provider di casa quando l'utente installa una SIM con MCC o MNC.

Supporto dell'antenna GNSS

Android 11 introduce la classe GnssAntennaInfo, che consente alla tua app di sfruttare maggiormente il posizionamento con precisione centimetrica che il Global Navigation Satellite System (GNSS) può fornire.

Scopri di più nella guida sulle informazioni sulla calibrazione dell'antenna.

Grafica

Decoder di immagini NDK

L'API NDK ImageDecoder fornisce un'API standard per le app Android C/C++ per decodificare direttamente le immagini. Gli sviluppatori di app non devono più utilizzare le API del framework (tramite JNI) o raggruppare librerie di decodifica delle immagini di terze parti. Per saperne di più, consulta la guida per gli sviluppatori relativa al decodificatore di immagini.

API Frequenza fotogrammi

Android 11 fornisce un'API che consente alle app di informare il sistema della frequenza fotogrammi prevista, per ridurre il tremolio sui dispositivi che supportano più frequenze di aggiornamento. Per informazioni su come utilizzare questa API, consulta la guida alla frequenza fotogrammi.

Richiesta e verifica del supporto per la bassa latenza

Alcuni display possono eseguire la post-elaborazione grafica, ad esempio alcuni display esterni e TV. Questa post-elaborazione migliora la grafica, ma può aumentare la latenza. I display più recenti che supportano HDMI 2.1 hanno una modalità a bassa latenza automatica (ALLM, nota anche come modalità di gioco), che riduce al minimo la latenza disattivando questa post-elaborazione. Per maggiori dettagli su ALLM, consulta la specifica HDMI 2.1.

Una finestra può richiedere l'utilizzo della modalità a bassa latenza automatica, se disponibile. La modalità ALLM è particolarmente utile per applicazioni come giochi e videoconferenze, in cui una bassa latenza è più importante di una grafica ottimale.

Per attivare o disattivare la post-elaborazione minima, chiama Window.setPreferMinimalPostProcessing() o imposta l'attributo preferMinimalPostProcessing della finestra su true. Non tutti i display supportano la post-elaborazione minima. Per scoprire se un display specifico la supporta, chiama il nuovo metodo Display.isMinimalPostProcessingSupported().

Inserimento di un livello di debug grafico ad alte prestazioni

Le applicazioni ora possono caricare livelli grafici esterni (GLES, Vulkan) nel codice dell'applicazione nativa per esporre la stessa funzionalità di un'app abilitata al debug, ma senza l'overhead delle prestazioni. Questa funzionalità è particolarmente importante quando esegui la profilazione della tua applicazione con strumenti come GAPID. Per profilare la tua app, includi il seguente elemento meta-data nel file manifest dell'app anziché rendere l'applicazione abilitata al debug:

<application ... >
    <meta-data android:name="com.android.graphics.injectLayers.enable"
                  android:value="true" />
</application>

Immagini e fotocamera

Disattiva i suoni e le vibrazioni delle notifiche durante l'acquisizione attiva

A partire da Android 11, quando utilizza attivamente la fotocamera, la tua app può disattivare solo le vibrazioni, sia i suoni che le vibrazioni o nessuno dei due utilizzando setCameraAudioRestriction().

Supporto della fotocamera esteso nell'emulatore Android

Per informazioni sul supporto esteso per le fotocamere nell'emulatore a partire da Android 11, consulta Supporto della fotocamera.

Supporto per l'utilizzo simultaneo di più fotocamere

Android 11 aggiunge API per eseguire query sul supporto per l'utilizzo di più di una fotocamera alla volta, tra cui una fotocamera anteriore e una posteriore.

Per verificare se il dispositivo su cui è in esecuzione l'app supporta la funzionalità, utilizza i seguenti metodi:

  • getConcurrentCameraIds() restituisce un Set di combinazioni di ID fotocamera che possono trasmettere in streaming contemporaneamente con combinazioni di stream garantite se configurate dallo stesso processo dell'applicazione.
  • isConcurrentSessionConfigurationSupported() esegue una query per verificare se i dispositivi con fotocamera possono supportare contemporaneamente le configurazioni di sessione corrispondenti.

Supporto migliorato per le immagini HEIF con più frame

A partire da Android 11, se chiami ImageDecoder.decodeDrawable() e passi un'immagine HEIF contenente una sequenza di frame (ad esempio un'animazione o una foto della serie a raffica), il metodo restituisce un AnimatedImageDrawable contenente l'intera sequenza di immagini. Nelle versioni precedenti di Android, il metodo restituiva un BitmapDrawable di un singolo frame.

Se l'immagine HEIF contiene più frame che non sono in sequenza, puoi recuperare un singolo frame chiamando MediaMetadataRetriever.getImageAtIndex().

Accessibilità

Aggiornamenti per gli sviluppatori di servizi di accessibilità

Se crei un servizio di accessibilità personalizzato, puoi utilizzare le seguenti funzionalità in Android 11:

  • La spiegazione rivolta agli utenti di un servizio di accessibilità ora consente l'utilizzo di HTML e immagini, oltre al testo normale. Questa flessibilità semplifica la spiegazione agli utenti finali di ciò che fa il tuo servizio e di come può aiutarli.
  • Per utilizzare una descrizione dello stato di un elemento UI più significativa dal punto di vista semantico rispetto a contentDescription, chiama il metodo getStateDescription().
  • Per richiedere che gli eventi touch bypassino l'esplorazione al tocco del sistema, chiama setTouchExplorationPassthroughRegion(). Analogamente, per richiedere che i gesti bypassino il rilevatore di gesti del sistema, chiama setGestureDetectionPassthroughRegion().
  • Puoi richiedere azioni IME, come "Invio" e "Avanti", nonché screenshot di finestre che non attivano il flag FLAG_SECURE.

Altre funzionalità

Motivi di uscita dal processo dell'app

Android 11 introduce il metodo ActivityManager.getHistoricalProcessExitReasons(), che segnala i motivi di eventuali terminazioni recenti dei processi. Le app possono utilizzare questo metodo per raccogliere informazioni diagnostiche sugli arresti anomali, ad esempio se la terminazione di un processo è dovuta ad ANR, problemi di memoria o altri motivi. Inoltre, puoi utilizzare il nuovo metodo setProcessStateSummary() per archiviare informazioni sullo stato personalizzate per un'analisi successiva.

Il metodo getHistoricalProcessExitReasons() restituisce istanze della classe ApplicationExitInfo, che contiene informazioni relative alla chiusura di un processo dell'app. Chiamando getReason() su un'istanza di questa classe, puoi determinare il motivo per cui il processo della tua app è stato terminato. Ad esempio, un valore restituito di REASON_CRASH indica che si è verificata un'eccezione non gestita nella tua app. Se la tua app deve garantire l'univocità degli eventi di uscita, può mantenere un identificatore specifico dell'app, ad esempio un valore hash basato sul timestamp del metodo getTimestamp().

Risorse aggiuntive

Per saperne di più, leggi l'articolo sui nuovi strumenti di Android 11 per rendere le app più private e stabili su Medium.

Caricatori di risorse

Android 11 introduce una nuova API che consente alle app di estendere dinamicamente il modo in cui le risorse vengono cercate e caricate. Le nuove classi API ResourcesLoader e ResourcesProvider sono le principali responsabili della nuova funzionalità. Insieme, offrono la possibilità di fornire risorse e asset aggiuntivi o di modificare i valori di risorse e asset esistenti.

Gli oggetti ResourcesLoader sono container che forniscono oggetti ResourcesProvider all'istanza Resources di un'app. A loro volta, gli oggetti ResourcesProvider forniscono metodi per caricare i dati delle risorse dagli APK e dalle tabelle delle risorse.

Un caso d'uso principale di questa API è il caricamento di asset personalizzati. Puoi utilizzare loadFromDirectory() per creare un ResourcesProvider che reindirizza la risoluzione di risorse e asset basati su file, in modo che la ricerca venga eseguita in una directory specifica anziché nell'APK dell'applicazione. Puoi accedere a questi asset tramite la famiglia di metodi open() della classe API AssetManager, proprio come con gli asset raggruppati nell'APK.

Schema di firma dell'APK v4

Android 11 aggiunge il supporto per lo schema di firma dell'APK v4. Questo schema produce un nuovo tipo di firma in un file separato (apk-name.apk.idsig), ma per il resto è simile a v2 e v3. Non vengono apportate modifiche all'APK. Questo schema supporta l'installazione incrementale degli APK di ADB, che velocizza l'installazione degli APK.

Filtri per intent dinamici

Per ricevere gli intent, un'app deve dichiarare in fase di compilazione i tipi di dati che è in grado di ricevere definendo un filtro per intent nel manifest dell'app. In Android 10 e versioni precedenti, le app non possono modificare i propri filtri per intent in fase di runtime. Questo è un problema per le app di virtualizzazione (come le macchine virtuali e i desktop remoti) perché non hanno modo di sapere esattamente quale software l'utente installerà al loro interno.

Android 11 introduce i gruppi MIME, un nuovo elemento del manifest che consente a un'app di dichiarare un insieme dinamico di tipi MIME in un filtro per intent e di modificarlo in modo programmatico in fase di runtime. Per utilizzare un gruppo MIME, includi un elemento di dati nel manifest dell'app con il nuovo attributo android:mimeGroup:

<intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeGroup="myMimeGroup"/>
</intent-filter>

Il valore dell'attributo android:mimeGroup è un ID stringa arbitrario che identifica il gruppo MIME in fase di runtime. Puoi accedere ai contenuti di un gruppo MIME e aggiornarli passando il relativo ID ai seguenti nuovi metodi nella classe API PackageManager:

Quando aggiungi un tipo MIME a un gruppo MIME in modo programmatico, questo funziona esattamente come un tipo MIME statico dichiarato esplicitamente nel manifest.

Miglioramenti della compilazione automatica

Android 11 introduce miglioramenti per i servizi di compilazione automatica.

Identificatori di suggerimenti in AssistStructure.ViewNode

Spesso è utile per i servizi di compilazione automatica calcolare un hash della firma per una visualizzazione in base alle proprietà della visualizzazione. Il suggerimento di visualizzazione è una proprietà particolarmente utile da includere durante il calcolo di un hash della firma, ma la stringa del suggerimento potrebbe cambiare in base alle impostazioni internazionali dello smartphone. Per risolvere questo problema, Android 11 espande AssistStructure.ViewNode con un nuovo metodo getHintIdEntry(), che restituisce l'identificatore della risorsa per il testo del suggerimento di una visualizzazione. Questo metodo fornisce un valore indipendente dalle impostazioni internazionali che puoi utilizzare per calcolare gli hash delle firme.

Eventi di visualizzazione dei set di dati

Per aiutare i servizi di compilazione automatica a migliorare i loro suggerimenti, Android 11 offre un modo per identificare i casi in cui un servizio di compilazione automatica ha presentato set di dati, ma l'utente non ne ha selezionato nessuno. In Android 11, FillEventHistory segnala un nuovo tipo di evento TYPE_DATASETS_SHOWN. FillEventHistory registra un evento di questo tipo ogni volta che il servizio di compilazione automatica presenta uno o più set di dati all'utente. I servizi di compilazione automatica possono utilizzare questi eventi insieme all'evento TYPE_DATASET_SELECTED esistente per determinare se l'utente ha selezionato una delle opzioni di compilazione automatica fornite.

Integrazione IME

Le tastiere e altri IME ora possono visualizzare i suggerimenti di compilazione automatica in linea, in una barra dei suggerimenti o in un'interfaccia simile, anziché in un menu a discesa. Per proteggere le informazioni sensibili come password e numeri di carte di credito, i suggerimenti vengono mostrati all'utente, ma non sono noti all'IME finché l'utente non ne seleziona uno. Per informazioni su come gli IME e i gestori delle password possono supportare questa funzionalità, consulta Integra la compilazione automatica con le tastiere.

Condivisione dei dati con il servizio di acquisizione dei contenuti

A partire da Android 11, la tua app può condividere dati con il servizio di acquisizione dei contenuti del dispositivo. Questa funzionalità consente a un dispositivo di fornire più facilmente informazioni contestuali, ad esempio mostrando il nome di un brano attualmente in riproduzione nell'ambiente dell'utente.

Per rendere disponibili i dati della tua app al servizio di acquisizione dei contenuti, chiama il metodo shareData() su un'istanza di ContentCaptureManager. Se il sistema accetta la richiesta di condivisione dei dati, la tua app riceve un descrittore del file di sola scrittura da condividere con il servizio di acquisizione dei contenuti.