API Android 6.0

Android 6.0 (M) offre nuove funzionalità a utenti e sviluppatori di app. Questo documento offre un'introduzione alle API più importanti.

Inizia a sviluppare

Per iniziare a creare app per Android 6.0, devi prima scaricare l'SDK Android. Utilizza quindi SDK Manager per scaricare l'SDK Platform e le immagini di sistema per Android 6.0.

Aggiornare il livello API target

Per ottimizzare meglio l'app per i dispositivi con Android, imposta targetSdkVersion su "23", installa l'app su un'immagine di sistema Android, testala, quindi pubblica l'app aggiornata con questa modifica.

Puoi utilizzare le API Android e supportare anche le versioni precedenti aggiungendo al codice condizioni che controllano il livello API di sistema prima di eseguire API non supportate da minSdkVersion. Per scoprire di più su come mantenere la compatibilità con le versioni precedenti, consulta Supporto di diverse versioni della piattaforma.

Per ulteriori informazioni su come funzionano i livelli API, consulta Che cos'è il livello API?

Autenticazione tramite impronta digitale

Questa release offre nuove API che ti consentono di autenticare gli utenti tramite la scansione delle impronte sui dispositivi supportati. Utilizza queste API in combinazione con il sistema Android Keystore.

Per autenticare gli utenti tramite la scansione delle impronte, recupera un'istanza della nuova classe FingerprintManager e chiama il metodo authenticate(). L'app deve essere in esecuzione su un dispositivo compatibile dotato di sensore di impronte digitali. Devi implementare l'interfaccia utente per il flusso di autenticazione dell'impronta nell'app e utilizzare l'icona dell'impronta Android standard nella UI. L'icona dell'impronta Android (c_fp_40px.png) è inclusa nell'esempio di autenticazione biometrica. Se stai sviluppando più app che utilizzano l'autenticazione tramite impronta, tieni presente che ogni app deve autenticare l'impronta dell'utente in modo indipendente.

Per utilizzare questa funzionalità nella tua app, devi prima aggiungere l'autorizzazione USE_FINGERPRINT nel file manifest.

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />
Dispositivo mobile che mostra la funzionalità di autenticazione con impronta digitale

Per vedere l'implementazione dell'autenticazione tramite impronta nell'app, fai riferimento all'esempio di autenticazione biometrica. Per una dimostrazione di come utilizzare queste API di autenticazione in combinazione con altre API Android, guarda il video API per impronte e pagamenti.

Se stai testando questa funzione, procedi nel seguente modo:

  1. Se non l'hai ancora fatto, installa la revisione 24.3 di Android SDK Tools.
  2. Registra una nuova impronta nell'emulatore andando a Impostazioni > Sicurezza > Impronta, quindi segui le istruzioni per la registrazione.
  3. Utilizza un emulatore per emulare gli eventi di tocco con l'impronta con il seguente comando. Usa lo stesso comando per emulare gli eventi di tocco con l'impronta nella schermata di blocco o nell'app.
    adb -e emu finger touch <finger_id>
    

    Su Windows, potrebbe essere necessario eseguire telnet 127.0.0.1 <emulator-id> seguito da finger touch <finger_id>.

Conferma credenziale

La tua app può autenticare gli utenti in base all'ultima volta che hanno sbloccato il dispositivo. Questa funzionalità evita agli utenti di dover ricordare password specifiche per le app ed evita che tu debba implementare la tua interfaccia utente di autenticazione. La tua app deve utilizzare questa funzionalità insieme a un'implementazione di chiave pubblica o segreta per l'autenticazione degli utenti.

Per impostare la durata del timeout per cui è possibile riutilizzare la stessa chiave dopo l'autenticazione dell'utente, richiama il nuovo metodo setUserAuthenticationValidityDurationSeconds() quando configuri KeyGenerator o KeyPairGenerator.

Evita di mostrare eccessivamente la finestra di dialogo di riautenticazione: le tue app dovrebbero provare prima a utilizzare l'oggetto crittografico e, se il timeout scade, usa il metodo createConfirmDeviceCredentialIntent() per autenticare nuovamente l'utente nella tua app.

Collegamento dell'app

Questa release migliora il sistema di intent di Android fornendo collegamenti alle app più efficaci. Questa funzionalità ti consente di associare un'app a un dominio web di tua proprietà. In base a questa associazione, la piattaforma può determinare l'app predefinita da utilizzare per gestire un determinato link web e ignorare la richiesta agli utenti di selezionare un'app. Per scoprire come implementare questa funzionalità, consulta Gestire i link alle app.

Backup automatico per le app

Il sistema ora esegue automaticamente il backup e il ripristino completo dei dati per le app. Per attivare questo comportamento, la tua app deve avere come target Android 6.0 (livello API 23). Non è necessario aggiungere altro codice. Se gli utenti eliminano i propri Account Google, vengono eliminati anche i dati di backup. Per informazioni sul funzionamento di questa funzionalità e su come configurare gli elementi di cui eseguire il backup nel file system, consulta Configurazione di Backup automatico per le app.

Condivisione diretta

Parte inferiore di un dispositivo mobile in cui è visualizzata la funzionalità Condivisione diretta

Questa release fornisce le API per rendere la condivisione intuitiva e veloce per gli utenti. Ora puoi definire target per la condivisione diretta che avviano una specifica attività nella tua app. Questi target per la condivisione diretta sono esposti agli utenti tramite il menu Condividi. Questa funzionalità consente agli utenti di condividere contenuti con destinazioni come i contatti all'interno di altre app. Ad esempio, il target della condivisione diretta potrebbe lanciare un'attività in un'altra app di social network, che consente all'utente di condividere i contenuti direttamente con un amico o una community specifici in quell'app.

Per attivare i target della condivisione diretta, devi definire una classe che estenda la classe ChooserTargetService. Dichiara il tuo servizio nel file manifest. All'interno della dichiarazione, specifica l'autorizzazione BIND_CHOOSER_TARGET_SERVICE e un filtro di intent utilizzando l'azione SERVICE_INTERFACE.

L'esempio seguente mostra come dichiarare ChooserTargetService nel file manifest.

<service android:name=".ChooserTargetService"
        android:label="@string/service_name"
        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

Per ogni attività che vuoi esporre a ChooserTargetService, aggiungi un elemento <meta-data> con il nome "android.service.chooser.chooser_target_service" nel file manifest dell'app.

<activity android:name=".MyShareActivity”
        android:label="@string/share_activity_label">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
<meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".ChooserTargetService" />
</activity>

Interazioni vocali

Questa release fornisce una nuova API di interazione vocale che, insieme ad Azioni vocali, ti consente di creare esperienze vocali di conversazione nelle tue app. Richiama il metodo isVoiceInteraction() per determinare se un'azione vocale ha attivato la tua attività. In questo caso, la tua app può utilizzare il corso VoiceInteractor per richiedere una conferma vocale all'utente, effettuare una selezione da un elenco di opzioni e altro ancora.

La maggior parte delle interazioni vocali proviene da un'azione vocale dell'utente. Tuttavia, un'attività di interazione vocale può iniziare anche senza l'input dell'utente. Ad esempio, anche un'altra app lanciata tramite un'interazione vocale può inviare un intent. Per determinare se la tua attività è stata avviata da una query vocale dell'utente o da un'altra app di interazione vocale, chiama il metodo isVoiceInteractionRoot(). Se un'altra app ha avviato la tua attività, il metodo restituisce false. L'app potrebbe quindi chiedere all'utente di confermare l'intenzione di eseguire questa azione.

Per ulteriori informazioni sull'implementazione delle azioni vocali, visita il sito per sviluppatori di Voice Actions.

API Assist

Questa release offre agli utenti un nuovo modo per interagire con le tue app tramite un assistente. Per utilizzare questa funzionalità, l'utente deve consentire all'assistente di utilizzare il contesto corrente. Una volta attivato, l'utente può aprire l'assistente in qualsiasi app premendo a lungo il pulsante Home.

La tua app può scegliere di non condividere il contesto corrente con l'assistente impostando il flag FLAG_SECURE. Oltre all'insieme standard di informazioni che la piattaforma passa all'assistente, la tua app può condividere informazioni aggiuntive utilizzando la nuova classe AssistContent.

Per fornire all'assistente ulteriore contesto dalla tua app, procedi nel seguente modo:

  1. Implementa l'interfaccia Application.OnProvideAssistDataListener.
  2. Registra questo listener utilizzando registerOnProvideAssistDataListener().
  3. Per fornire informazioni contestuali specifiche per l'attività, esegui l'override del callback onProvideAssistData() e, facoltativamente, del nuovo callback onProvideAssistContent().

Dispositivi di archiviazione utilizzabili

Con questa release gli utenti possono adottare dispositivi di archiviazione esterni come le schede SD. L'adozione di un dispositivo di archiviazione esterno cripta e formatta il dispositivo in modo che si comporti come la memoria interna. Questa funzionalità consente agli utenti di spostare sia le app sia i relativi dati privati tra dispositivi di archiviazione. Quando sposta le app, il sistema rispetta la preferenza android:installLocation nel file manifest.

Se la tua app accede alle API o ai campi seguenti, tieni presente che i percorsi dei file restituiti cambieranno in modo dinamico quando l'app viene spostata tra dispositivi di archiviazione interni ed esterni. Quando crei percorsi dei file, ti consigliamo vivamente di chiamare sempre queste API in modo dinamico. Non utilizzare percorsi di file hardcoded o percorsi di file completamente qualificati creati in precedenza.

Per eseguire il debug di questa funzionalità, puoi attivare l'adozione di un'unità USB collegata a un dispositivo Android tramite un cavo USB On-The-Go (OTG), eseguendo questo comando:

$ adb shell sm set-force-adoptable true

Notifiche

In questa release sono state aggiunte le seguenti modifiche all'API per le notifiche:

Supporto per stilo Bluetooth

Questa release offre un supporto migliorato per l'input utente usando uno stilo Bluetooth. Gli utenti possono accoppiare e connettere uno stilo Bluetooth compatibile al proprio telefono o tablet. Durante il collegamento, le informazioni sulla posizione del touchscreen sono unite alle informazioni della pressione e dei pulsanti dello stilo per fornire una gamma di espressione più ampia rispetto al solo touchscreen. La tua app può rimanere in ascolto delle pressioni dei pulsanti dello stilo ed eseguire azioni secondarie registrando oggetti View.OnContextClickListener e GestureDetector.OnContextClickListener nell'attività.

Utilizza i metodi e le costanti MotionEvent per rilevare le interazioni con i pulsanti dello stilo:

Scansione Bluetooth Low Energy migliorata

Se la tua app esegue scansioni Bluetooth Low Energy, usa il nuovo metodo setCallbackType() per specificare che il sistema deve notificare i callback quando trova per la prima volta, o vede dopo un lungo periodo di tempo, un pacchetto pubblicitario che corrisponde al set ScanFilter. Questo approccio alla scansione è più efficiente dal punto di vista energetico rispetto a quello fornito nella versione precedente della piattaforma.

Supporto per Hotspot 2.0 Release 1

In questa release è stato aggiunto il supporto delle specifiche dell'hotspot 2.0 Release 1 su dispositivi Nexus 6 e Nexus 9. Per eseguire il provisioning delle credenziali dell'hotspot 2.0 nella tua app, utilizza i nuovi metodi della classe WifiEnterpriseConfig, come setPlmn() e setRealm(). Nell'oggetto WifiConfiguration, puoi impostare i campi FQDN e providerFriendlyName. Il nuovo metodo isPasspointNetwork() indica se una rete rilevata rappresenta un punto di accesso Hotspot 2.0.

Modalità di visualizzazione 4K

La piattaforma ora consente alle app di richiedere l'upgrade della risoluzione del display al rendering 4K su hardware compatibile. Per eseguire query sulla risoluzione fisica attuale, utilizza le nuove API Display.Mode. Se la UI viene disegnata a una risoluzione logica inferiore ed è aggiornata a una risoluzione fisica più grande, tieni presente che la risoluzione fisica restituita dal metodo getPhysicalWidth() può essere diversa dalla risoluzione logica riportata da getSize().

Puoi richiedere al sistema di modificare la risoluzione fisica dell'app durante l'esecuzione impostando la proprietà preferredDisplayModeId della finestra dell'app. Questa funzionalità è utile se vuoi passare alla risoluzione del display 4K. In modalità display 4K, l'UI continua a essere visualizzata alla risoluzione originale (ad esempio 1080p) ed è convertita in 4K, ma gli oggetti SurfaceView potrebbero mostrare i contenuti alla risoluzione nativa.

ColorStateList che è possibile creare temi

Gli attributi dei temi sono ora supportati in ColorStateList per i dispositivi con Android 6.0 (livello API 23). I metodi Resources.getColorStateList() e Resources.getColor() sono stati ritirati. Se chiami queste API, chiama invece i nuovi metodi Context.getColorStateList() o Context.getColor(). Questi metodi sono disponibili anche nella libreria appcompat v4 tramite ContextCompat.

Funzionalità audio

In questa release sono stati aggiunti miglioramenti all'elaborazione audio su Android, tra cui:

  • Supporto per il protocollo MIDI, con le nuove API android.media.midi. Utilizza queste API per inviare e ricevere eventi MIDI.
  • Nuove classi AudioRecord.Builder e AudioTrack.Builder per creare rispettivamente oggetti di acquisizione e riproduzione audio digitale e configurare le proprietà sorgente audio e sink per sostituire i valori predefiniti di sistema.
  • hook API per associare dispositivi audio e di input. Ciò è particolarmente utile se l'app consente agli utenti di avviare una ricerca vocale da un controller di gioco o da un telecomando collegato ad Android TV. Il sistema richiama il nuovo onSearchRequested() callback quando l'utente avvia una ricerca. Per determinare se il dispositivo di input dell'utente ha un microfono integrato, recupera l'oggetto InputDevice da quel callback, quindi chiama il nuovo metodo hasMicrophone().
  • Nuovo metodo getDevices() che consente di recuperare un elenco di tutti i dispositivi audio attualmente connessi al sistema. Puoi anche registrare un oggetto AudioDeviceCallback se vuoi che il sistema invii una notifica alla tua app quando un dispositivo audio si connette o si disconnette.

Funzionalità video

Questa versione aggiunge nuove funzionalità alle API di elaborazione video, tra cui:

  • Nuova classe MediaSync che consente alle applicazioni di eseguire il rendering sincrono degli stream audio e video. I buffer audio vengono inviati in modo non bloccante e restituiti tramite un callback. Supporta anche la velocità di riproduzione dinamica.
  • Nuovo evento EVENT_SESSION_RECLAIMED, che indica che una sessione aperta dall'app è stata recuperata da Resource Manager. Se la tua app utilizza sessioni DRM, devi gestire questo evento e assicurarti di non utilizzare una sessione recuperata.
  • Nuovo codice di errore ERROR_RECLAIMED, che indica che il Resource Manager ha recuperato la risorsa multimediale utilizzata dal codec. Con questa eccezione, il codec deve essere rilasciato perché è stato spostato nello stato del terminale.
  • Nuova interfaccia getMaxSupportedInstances() per ricevere un suggerimento relativo al numero massimo di istanze di codec simultanee supportate.
  • Nuovo metodo setPlaybackParams() per impostare la velocità di riproduzione dei contenuti multimediali per una riproduzione veloce o in slow motion. Inoltre, estende o accelera la riproduzione audio automaticamente insieme al video.

Funzionalità della fotocamera

Questa release include le seguenti nuove API per l'accesso alla torcia della fotocamera e per la rielaborazione delle immagini da parte della fotocamera:

API Flashlight

Se una fotocamera è dotata di flash, puoi chiamare il metodo setTorchMode() per attivare o disattivare la modalità torcia del flash senza aprire la fotocamera. L'app non è proprietaria esclusiva dell'unità flash o della fotocamera. La modalità torcia è disattivata e non è più disponibile quando la fotocamera non è più disponibile o quando le altre risorse della fotocamera che tengono la torcia accesa non sono più disponibili. Altre app possono anche chiamare setTorchMode() per disattivare la modalità torcia. Quando l'ultima app che ha attivato la modalità torcia è chiusa, la modalità torcia è disattivata.

Puoi registrare un callback per ricevere una notifica sullo stato della modalità torcia chiamando il registerTorchCallback() metodo. La prima volta che viene registrato il callback, questo viene chiamato immediatamente con lo stato della modalità torcia di tutti i dispositivi fotocamera attualmente noti con un'unità flash. Se la modalità torcia viene attivata o spenta correttamente, viene richiamato il metodo onTorchModeChanged().

API Reprocessing

L'API Camera2 è stata estesa per supportare la rielaborazione delle immagini in formato YUV e opaco privato. Per determinare se queste funzionalità di rielaborazione sono disponibili, chiama getCameraCharacteristics() e controlla la presenza della chiave REPROCESS_MAX_CAPTURE_STALL. Se un dispositivo supporta la rielaborazione, puoi creare una sessione di acquisizione della fotocamera rielaborabile chiamando createReprocessableCaptureSession() e creare richieste per la rielaborazione del buffer di input.

Utilizza la classe ImageWriter per collegare il flusso del buffer di input all'input di rielaborazione della videocamera. Per ottenere un buffer vuoto, segui questo modello di programmazione:

  1. Chiama il metodo dequeueInputImage().
  2. Riempi i dati nel buffer di input.
  3. Invia il buffer alla videocamera chiamando il metodo queueInputImage().

Se utilizzi un oggetto ImageWriter insieme a un'immagine PRIVATE, la tua app non può accedere direttamente ai dati dell'immagine. Passa invece l'immagine PRIVATE direttamente a ImageWriter chiamando il metodo queueInputImage() senza copia nel buffer.

La classe ImageReader ora supporta gli stream di immagini in formato PRIVATE. Questo supporto consente alla tua app di mantenere una coda di immagini circolare di ImageReader immagini di output, selezionare una o più immagini e inviarle al ImageWriter per la rielaborazione della fotocamera.

Funzionalità di Android for Work

Questa release include le nuove API seguenti per Android for Work:

  • Controlli avanzati per i dispositivi di proprietà aziendale e monouso: il proprietario del dispositivo ora può controllare le seguenti impostazioni per migliorare la gestione dei dispositivi di proprietà aziendale e monouso:
  • Installazione e disinstallazione di app senza audio da parte del proprietario del dispositivo: un proprietario del dispositivo ora può installare e disinstallare applicazioni in modalità silenziosa utilizzando le API PackageInstaller, indipendentemente da Google Play for Work. Ora puoi eseguire il provisioning dei dispositivi tramite un proprietario del dispositivo che recupera e installa le app senza interazione da parte dell'utente. Questa funzionalità è utile per attivare il provisioning con un solo tocco dei kiosk o di altri dispositivi simili senza attivare un Account Google.
  • Accesso silenzioso al certificato aziendale: quando un'app chiama choosePrivateKeyAlias(), prima che all'utente venga richiesto di selezionare un certificato, il proprietario del profilo o del dispositivo ora può chiamare il metodo onChoosePrivateKeyAlias() per fornire l'alias in modo invisibile all'applicazione che ha inviato la richiesta. Questa funzionalità consente di concedere alle app gestite l'accesso ai certificati senza interazione da parte dell'utente.
  • Accettazione automatica degli aggiornamenti di sistema. Se imposti un criterio di aggiornamento del sistema con setSystemUpdatePolicy(), un proprietario del dispositivo ora può accettare automaticamente un aggiornamento di sistema, ad esempio nel caso di un dispositivo kiosk, oppure posticipare l'aggiornamento e impedirne l'esecuzione da parte dell'utente per un massimo di 30 giorni. Inoltre, un amministratore può impostare un intervallo di tempo giornaliero in cui è necessario eseguire un aggiornamento, ad esempio durante le ore in cui un dispositivo kiosk non è in uso. Quando è disponibile un aggiornamento di sistema, il sistema controlla se l'app controller dei criteri dei dispositivi ha impostato un criterio di aggiornamento del sistema e si comporta di conseguenza.
  • Installazione dei certificati delegata: ora un profilo o un proprietario del dispositivo può concedere a un'app di terze parti la possibilità di chiamare queste DevicePolicyManager API di gestione dei certificati:
  • Dispositivo mobile che mostra la funzione di notifica dello stato del lavoro in Android for Work
  • Monitoraggio dell'utilizzo dei dati. Un profilo o un proprietario del dispositivo ora può eseguire query sulle statistiche sull'utilizzo dei dati visibili in Impostazioni > Dati utilizzando i nuovi metodi NetworkStatsManager. Ai proprietari dei profili viene concessa automaticamente l'autorizzazione per eseguire query sui dati del profilo che gestiscono, mentre i proprietari dei dispositivi hanno accesso ai dati sull'utilizzo dell'utente principale gestito.
  • Gestione delle autorizzazioni di runtime:

    Un proprietario di profilo o di dispositivo può impostare un criterio di autorizzazione per tutte le richieste di runtime di tutte le applicazioni che utilizzano setPermissionPolicy(), per richiedere all'utente di concedere l'autorizzazione oppure per concederla automaticamente o negarla automaticamente. Se il secondo criterio è impostato, l'utente non può modificare la selezione effettuata dal profilo o dal proprietario del dispositivo nella schermata delle autorizzazioni dell'app in Impostazioni.

  • VPN in Impostazioni: le app VPN sono ora visibili in Impostazioni > Altro > VPN. Inoltre, le notifiche che accompagnano l'utilizzo della VPN ora sono specifiche per il modo in cui la VPN è configurata. Per il proprietario del profilo, le notifiche sono specifiche a seconda che la VPN sia configurata o meno per un profilo gestito, un profilo personale o entrambi. Nel caso di un proprietario del dispositivo, le notifiche sono specifiche per determinare se la VPN è configurata per l'intero dispositivo.
  • Notifica dello stato di lavoro: ora viene visualizzata un'icona a forma di valigetta nella barra di stato ogni volta che un'app del profilo gestito ha un'attività in primo piano. Inoltre, se il dispositivo è sbloccato direttamente all'attività di un'app nel profilo gestito, viene visualizzato un avviso popup che informa l'utente che si trova all'interno del profilo di lavoro.