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. Usa quindi SDK Manager per scaricare l'SDK Platform e le immagini di sistema dell'SDK per Android 6.0.
Aggiorna il livello API target
Per ottimizzare meglio la tua app per i dispositivi con Android, imposta il tuo targetSdkVersion
su "23"
, installa la tua 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 le 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 consentono di autenticare gli utenti mediante la scansione delle impronte sui dispositivi supportati. Utilizza queste API insieme al 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 nella tua app e utilizzare l'icona dell'impronta Android standard nella tua UI.
L'icona dell'impronta di 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" />
Per vedere l'implementazione dell'autenticazione tramite impronta nell'app, consulta l'esempio di autenticazione biometrica. Per una dimostrazione di come utilizzare queste API di autenticazione insieme ad altre API Android, guarda il video API Fingerprint e Payment.
Se stai testando questa funzione, segui questi passaggi:
- Installa Android SDK Tools Revision 24.3, se non l'hai ancora fatto.
- Registra una nuova impronta nell'emulatore andando a Impostazioni > Sicurezza > Impronta, quindi segui le istruzioni per la registrazione.
- Utilizza un emulatore per emulare gli eventi di tocco con impronta con il comando seguente. Usa lo stesso comando per emulare gli eventi di tocco con impronta nella schermata di blocco o nell'app.
adb -e emu finger touch <finger_id>
Su Windows, potresti dover eseguire
telnet 127.0.0.1 <emulator-id>
e poifinger touch <finger_id>
.
Conferma credenziale
La tua app può autenticare gli utenti in base all'ultima volta che hanno sbloccato il dispositivo. Questa funzionalità libera gli utenti dal dover ricordare ulteriori password specifiche per le app ed evita la necessità di implementare la tua interfaccia utente di autenticazione. L'app deve usare questa funzionalità insieme a un'implementazione di chiave pubblica o segreta per l'autenticazione utente.
Per impostare la durata del timeout per cui la stessa chiave può essere riutilizzata dopo che l'utente è stato autenticato correttamente, chiama 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 riautenticare l'utente all'interno dell'app.
Collegamento dell'app
Questa release migliora il sistema degli intent di Android fornendo un collegamento delle app più efficace. 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 all'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 scoprire come funziona questa funzionalità e come configurare gli elementi di cui eseguire il backup nel file system, vedi Configurazione di Backup automatico per le app.
Condivisione diretta
Questa release fornisce API per rendere la condivisione intuitiva e rapida per gli utenti. Ora puoi definire target per la condivisione diretta che avviano un'attività specifica nella tua app. Questi target per la condivisione diretta vengono 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 avviare un'attività in un'altra app di social network, che consente all'utente di condividere i contenuti direttamente con un amico o una community specifica nell'app.
Per abilitare le destinazioni della condivisione diretta, devi definire una classe che estenda la classe ChooserTargetService
. Dichiara il tuo servizio nel 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 conversazionali nelle tue app. Chiama il metodo isVoiceInteraction()
per determinare se un'azione vocale ha attivato la tua attività. In tal caso, la tua app può utilizzare la classe 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 deriva da un'azione vocale dell'utente. Anche un'attività di interazione vocale può
avviarsi senza input dell'utente. Ad esempio, anche un'altra app lanciata tramite
un'interazione vocale può inviare un intento. Per determinare se la tua attività
è stata avviata da una query vocale di un utente o da un'altra app di interazione vocale, chiama il
metodo isVoiceInteractionRoot()
. Se un'altra app ha lanciato le tue
attività, il metodo restituisce false
. L'app potrebbe quindi richiedere all'utente di confermare l'intenzione di questa azione.
Per ulteriori informazioni sull'implementazione delle azioni vocali, consulta 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'assistente, l'utente può richiamare 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 di informazioni standard 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, svolgi i seguenti passaggi:
- Implementa l'interfaccia
Application.OnProvideAssistDataListener
. - Registra questo listener utilizzando
registerOnProvideAssistDataListener()
. - Per fornire informazioni contestuali specifiche per l'attività, sostituisci il callback
onProvideAssistData()
e, facoltativamente, quello dionProvideAssistContent()
.
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 una memoria interna. Questa funzionalità consente agli utenti di spostare sia le app sia i relativi dati privati tra dispositivi di archiviazione. Quando sposti le app, il sistema rispetta la preferenza android:installLocation
nel 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 di file, ti consigliamo vivamente di chiamare sempre queste API in modo dinamico. Non utilizzare percorsi di file impostati come hardcoded o non ripristinare percorsi di file completi creati in precedenza.
Context
metodi:ApplicationInfo
campi:
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:
- Nuovo livello di filtro
INTERRUPTION_FILTER_ALARMS
che corrisponde alla nuova modalità Non disturbare Solo sveglie. - Nuovo valore della categoria
CATEGORY_REMINDER
che viene utilizzato per distinguere i promemoria pianificati dall'utente da altri eventi (CATEGORY_EVENT
) e sveglie (CATEGORY_ALARM
). - Nuova classe
Icon
che puoi allegare alle notifiche tramite i metodisetSmallIcon()
esetLargeIcon()
. Allo stesso modo, il metodoaddAction()
ora accetta un oggettoIcon
invece di un ID risorsa disegnabile. - Nuovo metodo
getActiveNotifications()
che consente alle tue app di sapere quali notifiche sono attive al momento.
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. Quando la connessione è attiva, le informazioni sulla posizione del touchscreen sono unite alle informazioni della pressione e dei pulsanti dello stilo, per offrire una gamma più ampia di espressione rispetto al solo touchscreen. La tua app può rimanere in ascolto delle pressioni dei pulsanti con lo stilo ed eseguire azioni secondarie, registrando oggetti View.OnContextClickListener
e GestureDetector.OnContextClickListener
nella tua attività.
Utilizza i metodi e le costanti MotionEvent
per rilevare le interazioni dei pulsanti con lo stilo:
- Se l'utente tocca uno stilo con un pulsante sullo schermo dell'app, viene restituito il
metodo
getTooltype()
TOOL_TYPE_STYLUS
. - Per le app che hanno come target Android 6.0 (livello API 23), il metodo
getButtonState()
restituisceBUTTON_STYLUS_PRIMARY
quando l'utente preme il pulsante principale dello stilo. Se lo stilo ha un secondo pulsante, lo stesso metodo restituisceBUTTON_STYLUS_SECONDARY
quando l'utente lo preme. Se l'utente preme entrambi i pulsanti contemporaneamente, il metodo restituisce entrambi i valori collegati (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
). -
Per le app che hanno come target una versione precedente della piattaforma, il metodo
getButtonState()
restituisceBUTTON_SECONDARY
(per la pressione del pulsante principale dello stilo),BUTTON_TERTIARY
(per la pressione del pulsante secondario dello stilo) o entrambi.
Scansione Bluetooth Low Energy migliorata
Se la tua app esegue scansioni di Bluetooth Low Energy, usa il nuovo metodo setCallbackType()
per specificare che il sistema deve notificare le richiamate la prima volta che trova o vede dopo un lungo periodo di tempo un pacchetto pubblicitario che corrisponde al pacchetto ScanFilter
impostato. Questo approccio all'analisi è più efficiente dal punto di vista energetico rispetto a quanto fornito nella precedente versione della piattaforma.
Supporto di Hotspot 2.0 Release 1
In questa release è stato aggiunto il supporto della specifica 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 con una risoluzione logica inferiore ed
è adattata a una risoluzione fisica più grande, tieni presente che la risoluzione fisica restituita
dal metodo getPhysicalWidth()
può essere diversa dalla risoluzione logica
segnalata 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, il rendering dell'UI continua a essere visualizzato alla risoluzione originale (ad esempio 1080p) ed è ridimensionato a 4K, ma gli oggetti SurfaceView
potrebbero mostrare contenuti alla risoluzione nativa.
ColorStateList a tema
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 stai chiamando 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 apportati miglioramenti all'elaborazione audio su Android, tra cui:
- Supporto del protocollo MIDI, con le nuove API
android.media.midi
. Usa queste API per inviare e ricevere eventi MIDI. - Nuove classi
AudioRecord.Builder
eAudioTrack.Builder
per creare rispettivamente oggetti di acquisizione e riproduzione dell'audio digitale e configurare le proprietà sorgente e sink audio in modo da sostituire le impostazioni predefinite 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 un telecomando connesso 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 incorporato, recupera l'oggettoInputDevice
da quel callback, quindi chiama il nuovo metodohasMicrophone()
. - Nuovo metodo
getDevices()
che ti consente di recuperare un elenco di tutti i dispositivi audio attualmente connessi al sistema. Puoi anche registrare un oggettoAudioDeviceCallback
se vuoi che il sistema invii una notifica all'app quando un dispositivo audio si connette o si disconnette.
Funzionalità video
In questa release sono state aggiunte 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 bloccato e vengono restituiti tramite un callback. Supporta inoltre la velocità di riproduzione dinamica. - Nuovo evento
EVENT_SESSION_RECLAIMED
, che indica che una sessione aperta dall'app è stata rivendicata 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 poiché è stato spostato nello stato Terminale. - Nuova interfaccia
getMaxSupportedInstances()
per ricevere un suggerimento per il numero massimo di istanze di codec simultanee supportate. - Nuovo metodo
setPlaybackParams()
per impostare la velocità di riproduzione dei contenuti multimediali per una riproduzione rapida 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 la fotocamera è dotata di flash, puoi utilizzare il metodo setTorchMode()
per attivare o disattivare la modalità torcia dell'unità flash senza aprire la fotocamera. L'app
non ha la proprietà esclusiva dell'unità flash o della fotocamera. La modalità torcia viene spenta e non è più disponibile quando il dispositivo con la fotocamera non è più disponibile o quando non sono disponibili altre risorse della fotocamera che mantengono la torcia accesa. Anche altre app possono chiamare
setTorchMode()
per disattivare la modalità torcia. Quando l'ultima app che ha acceso la modalità torcia è chiusa, questa modalità è disattivata.
Puoi registrare un callback per ricevere una notifica sullo stato della modalità torcia chiamando il metodo registerTorchCallback()
. La prima volta che il callback viene registrato, 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 di rielaborazione
L'API Camera2
è estesa per supportare la rielaborazione delle immagini in formato YUV e 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 videocamera rielaborabile chiamando createReprocessableCaptureSession()
e creare richieste per la rielaborazione del buffer di input.
Usa 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:
- Chiama il metodo
dequeueInputImage()
. - Compila i dati nel buffer di input.
- Invia il buffer alla fotocamera chiamando il metodo
queueInputImage()
.
Se utilizzi un oggetto ImageWriter
insieme a un'immagine PRIVATE
, l'app non può accedere direttamente ai dati dell'immagine. Puoi invece passare l'immagine PRIVATE
direttamente a
ImageWriter
chiamando il
metodo
queueInputImage()
senza alcuna 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 seguenti nuove API 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 COSU (di proprietà aziendale e monouso):
- Disattiva o riattiva il blocco tastiera con il metodo
setKeyguardDisabled()
. - Disattiva o riattiva la barra di stato (incluse le impostazioni rapide, le notifiche e
il gesto di navigazione verso l'alto che avvia Google Now) con il
setStatusBarDisabled()
metodo. - Disabilita o riattiva l'Avvio protetto con la
UserManager
costanteDISALLOW_SAFE_BOOT
. - Evita che lo schermo si spegna quando è collegato con la costante
STAY_ON_WHILE_PLUGGED_IN
.
- Disattiva o riattiva il blocco tastiera con il metodo
- Installazione e disinstallazione silenziosa di app da parte del proprietario del dispositivo: un proprietario di dispositivo ora può installare e disinstallare in modalità silenziosa le applicazioni utilizzando le API
PackageInstaller
, indipendenti 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 one-touch 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 chiesto di selezionare un certificato, il proprietario del profilo o del dispositivo ora può chiamare il metodoonChoosePrivateKeyAlias()
per fornire l'alias automaticamente 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()
, il proprietario di un 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 una finestra temporale giornaliera durante la quale è necessario eseguire un aggiornamento, ad esempio negli orari 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 di certificati delegato:un profilo o un proprietario del dispositivo ora può concedere a un'app di terze parti la possibilità di chiamare queste
DevicePolicyManager
API di gestione dei certificati: - Monitoraggio dell'utilizzo dei dati. Il proprietario di un profilo o di un 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 a eseguire query sui dati del profilo che gestiscono, mentre i proprietari dei dispositivi hanno accesso ai dati di utilizzo dell'utente principale gestito. - Gestione delle autorizzazioni di runtime:
Un profilo o un proprietario di dispositivo può impostare un criterio di autorizzazione per tutte le richieste di runtime di tutte le applicazioni che utilizzano
setPermissionPolicy()
per chiedere all'utente di concedere l'autorizzazione oppure di concederla automaticamente o negarla automaticamente. Se il secondo criterio viene 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 ora sono visibili in Impostazioni > Altro > VPN. Inoltre, le notifiche relative all'utilizzo della VPN ora sono specifiche per il modo in cui la VPN è configurata. Per il proprietario del profilo, le notifiche sono specifiche per indicare se la VPN è configurata per un profilo gestito, per un profilo personale o per entrambi. Per un proprietario di dispositivo, le notifiche sono specifiche che indicano 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 è all'interno del profilo di lavoro.