Android 6.0 (Marshmallow) offre nuove funzionalità per utenti e sviluppatori di app. Questo documento fornisce un'introduzione alle API più importanti.
Inizia a sviluppareeloping
Per iniziare a creare app per Android 6.0, devi prima scaricare l'SDK Android. Poi utilizza SDK Manager per scaricare le immagini di sistema e della piattaforma SDK Android 6.0.
Aggiorna il livello API target
Per ottimizzare al meglio la tua 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 supportando anche le versioni precedenti aggiungendo condizioni al codice che controllano il livello API di sistema prima di eseguire API non supportate dal tuo minSdkVersion.
Per scoprire di più su come mantenere la compatibilità con le versioni precedenti, leggi Supporto
di versioni diverse della piattaforma.
Per saperne di più sul funzionamento dei livelli API, leggi Che cos'è il livello API?
Autenticazione tramite impronta
Questa release offre nuove API che consentono di autenticare gli utenti utilizzando le scansioni delle impronte sui dispositivi supportati. Utilizza queste API insieme al sistema Android Keystore.
Per autenticare gli utenti tramite la scansione dell'impronta, ottieni un'istanza della nuova classe
FingerprintManager e chiama il metodo
authenticate(). La tua app deve essere in esecuzione su un dispositivo compatibile
con un sensore di impronte digitali. Devi implementare l'interfaccia utente per il flusso di autenticazione
con l'impronta digitale nella tua app e utilizzare l'icona standard dell'impronta digitale di Android 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 con l'impronta, tieni presente che ogni app deve
autenticare l'impronta dell'utente in modo indipendente.
Per utilizzare questa funzionalità nella tua app, aggiungi prima l'autorizzazione
USE_FINGERPRINT nel manifest.
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
Per vedere l'implementazione dell'autenticazione con l'impronta in un'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 per impronta e pagamento.
Se stai testando questa funzionalità, segui questi passaggi:
- Installa Strumenti SDK Android Revision 24.3, se non l'hai ancora fatto.
- Registra una nuova impronta nell'emulatore andando a Impostazioni > Sicurezza > Impronta, poi segui le istruzioni per la registrazione.
- Utilizza un emulatore per emulare gli eventi tocco dell'impronta con il
seguente comando. Utilizza lo stesso comando per emulare gli eventi touch dell'impronta sulla schermata di blocco o
nella tua app.
adb -e emu finger touch <finger_id>
Su Windows, potrebbe essere necessario eseguire
telnet 127.0.0.1 <emulator-id>seguito dafinger touch <finger_id>.
Conferma credenziale
La tua app può autenticare gli utenti in base alla data dell'ultimo sblocco del dispositivo. Questa funzionalità libera gli utenti dal dover ricordare password aggiuntive specifiche per le app ed evita la necessità di implementare la propria interfaccia utente di autenticazione. La tua app deve utilizzare questa funzionalità in combinazione con un'implementazione di chiavi pubbliche o segrete per l'autenticazione utente.
Per impostare la durata del timeout per cui la stessa chiave può essere riutilizzata dopo l'autenticazione
di un utente, chiama il nuovo metodo
setUserAuthenticationValidityDurationSeconds()
quando configuri un KeyGenerator o
KeyPairGenerator.
Evita di mostrare eccessivamente la finestra di dialogo di riautenticazione. Le tue app devono provare a utilizzare prima l'oggetto
crittografico e, se il timeout scade, utilizzare il metodo
createConfirmDeviceCredentialIntent()
per riautenticare l'utente all'interno dell'app.
Collegamento delle app
Questa release migliora il sistema di intent di Android fornendo un collegamento più efficace delle app. 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 particolare link web ed evitare di chiedere agli utenti di selezionare un'app. Per scoprire come implementare questa funzionalità, consulta Gestione dei link per app.
Backup automatico delle app
Il sistema ora esegue il backup e il ripristino automatici dei dati completi per le app. Per attivare questo comportamento, la tua app deve avere come target Android 6.0 (livello API 23); non devi aggiungere codice aggiuntivo. 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 Configurare il backup automatico per le app.
Direct Share
Questa release fornisce API per rendere la condivisione intuitiva e rapida per gli utenti. Ora puoi definire destinazioni di condivisione diretta che avviano un'attività specifica nella tua app. Queste destinazioni di condivisione diretta vengono mostrate 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, la destinazione di condivisione diretta potrebbe avviare un'attività in un'altra app di social network, che consente all'utente di condividere contenuti direttamente con un amico o una community specifici in quell'app.
Per attivare le destinazioni di condivisione diretta, devi definire una classe che estenda la classe ChooserTargetService. Dichiara il tuo
servizio nel manifest. All'interno di questa dichiarazione, specifica l'autorizzazione
BIND_CHOOSER_TARGET_SERVICE e un
filtro per intent utilizzando l'azione
SERVICE_INTERFACE.
L'esempio seguente mostra come dichiarare
ChooserTargetService nel 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 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 a
Azioni vocali,
ti consente di integrare esperienze vocali conversazionali nelle tue app. Chiama il metodo
isVoiceInteraction() per determinare se un'azione vocale ha attivato
la tua attività. In questo caso, la tua app può utilizzare la classe
VoiceInteractor per richiedere una conferma vocale all'utente, selezionare
un'opzione da un elenco e altro ancora.
La maggior parte delle interazioni vocali ha origine da un'azione vocale dell'utente. Un'attività di interazione vocale può
anche iniziare senza input dell'utente. Ad esempio, un'altra app avviata tramite un'interazione vocale può anche inviare un intent per avviare un'interazione vocale. 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. La tua app potrebbe quindi chiedere all'utente di confermare che
l'azione sia intenzionale.
Per saperne di più sull'implementazione dei comandi vocali, consulta il sito per sviluppatori di Voice Actions.
API Assist
Questa release offre un nuovo modo per gli utenti di 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ò richiamare l'assistente in qualsiasi app tenendo premuto il pulsante Home.
La tua app può scegliere di non condividere il contesto attuale con l'assistente impostando il
flag FLAG_SECURE. Oltre al set standard di informazioni che la piattaforma trasmette all'assistente, la tua app può condividere informazioni aggiuntive utilizzando la nuova classe AssistContent.
Per fornire all'assistente un contesto aggiuntivo dalla tua app, segui questi passaggi:
- Implementa l'interfaccia
Application.OnProvideAssistDataListener. - Registra questo listener utilizzando
registerOnProvideAssistDataListener(). - Per fornire informazioni contestuali specifiche per l'attività, esegui l'override del
callback
onProvideAssistData()e, facoltativamente, del nuovo callbackonProvideAssistContent().
Dispositivi di archiviazione adottabile
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 dati privati di queste app tra i dispositivi di archiviazione. Quando
sposti le app, il sistema rispetta la preferenza
android:installLocation
nel manifest.
Se la tua app accede alle seguenti API o ai seguenti campi, tieni presente che i percorsi dei file restituiti cambieranno dinamicamente 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 rendere persistenti percorsi di file completi creati in precedenza.
Contextmethods:- Campi
ApplicationInfo:
Per eseguire il debug di questa funzionalità, puoi abilitare 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
Questa release aggiunge le seguenti modifiche all'API per le notifiche:
- Nuovo livello di filtro
INTERRUPTION_FILTER_ALARMSche corrisponde alla nuova modalità Non disturbare Solo sveglie. - Nuovo valore della categoria
CATEGORY_REMINDERutilizzato per distinguere i promemoria programmati dall'utente da altri eventi (CATEGORY_EVENT) e sveglie (CATEGORY_ALARM). - Nuova classe
Iconche puoi allegare alle notifiche tramite i metodisetSmallIcon()esetLargeIcon(). Analogamente, il metodoaddAction()ora accetta un oggettoIconanziché un ID risorsa disegnabile. - Nuovo metodo
getActiveNotifications()che consente alle tue app di scoprire quali delle loro notifiche sono attualmente attive.
Supporto dello stilo Bluetooth
Questa release offre un supporto migliore per l'input dell'utente tramite uno stilo Bluetooth. Gli utenti possono accoppiare
e connettere una stilo Bluetooth compatibile al proprio smartphone o tablet. Quando è connesso, le informazioni
sulla posizione del touch screen vengono combinate con le informazioni sulla pressione e sui pulsanti dello stilo per
offrire una gamma di espressione più ampia rispetto al solo touch screen. La tua app può rilevare
le pressioni del pulsante dello stilo ed eseguire azioni secondarie registrando
gli oggetti View.OnContextClickListener e
GestureDetector.OnContextClickListener nella tua attività.
Utilizza i metodi e le costanti MotionEvent per rilevare le interazioni con i pulsanti dello stilo:
- Se l'utente tocca uno stilo con un pulsante sullo schermo della tua app, il metodo
getTooltype()restituisceTOOL_TYPE_STYLUS. - Per le app destinate ad Android 6.0 (livello API 23), il metodo
getButtonState()restituisceBUTTON_STYLUS_PRIMARYquando l'utente preme il pulsante principale dello stilo. Se lo stilo ha un secondo pulsante, lo stesso metodo restituisceBUTTON_STYLUS_SECONDARYquando l'utente lo preme. Se l'utente preme entrambi i pulsanti contemporaneamente, il metodo restituisce entrambi i valori con l'operatore OR (BUTTON_STYLUS_PRIMARY|BUTTON_STYLUS_SECONDARY). -
Per le app che hanno come target una versione della piattaforma precedente, 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.
Miglioramento della scansione Bluetooth Low Energy
Se la tua app esegue scansioni Bluetooth Low Energy, utilizza il nuovo metodo
setCallbackType()
per specificare che vuoi che il sistema invii callback di notifica quando trova per la prima volta o dopo molto tempo un pacchetto pubblicitario corrispondente al set ScanFilter. Questo
approccio alla scansione è più efficiente dal punto di vista energetico rispetto a quello fornito nella versione precedente della piattaforma.
Supporto di Hotspot 2.0 Release 1
Questa release aggiunge il supporto della specifica Hotspot 2.0 Release 1 sui dispositivi Nexus 6 e Nexus 9. Per
provisionare le credenziali Hotspot 2.0 nella tua app, utilizza i nuovi metodi della
classe WifiEnterpriseConfig, ad esempio
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 e viene
aumentata a una risoluzione fisica maggiore, tieni presente che la risoluzione fisica restituita dal metodo
getPhysicalWidth() potrebbe differire dalla risoluzione logica
segnalata da getSize().
Puoi richiedere al sistema di modificare la risoluzione fisica nella tua app durante l'esecuzione impostando
la proprietà preferredDisplayModeId della finestra
della tua app. Questa funzionalità è utile se vuoi passare alla risoluzione del display 4K. In modalità di visualizzazione 4K, la UI continua a essere visualizzata alla risoluzione originale (ad esempio 1080p) e viene eseguito l'upscaling a 4K, ma gli oggetti SurfaceView potrebbero mostrare i contenuti alla risoluzione nativa.
ColorStateList con temi
Gli attributi del tema 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 i nuovi metodi
Context.getColorStateList() o
Context.getColor(). Questi metodi sono
disponibili anche nella libreria appcompat v4 tramite ContextCompat.
Funzionalità audio
Questa release aggiunge miglioramenti all'elaborazione audio su Android, tra cui:
- Supporto del protocollo MIDI
con le nuove API
android.media.midi. Utilizza queste API per inviare e ricevere eventi MIDI. - Nuove classi
AudioRecord.BuildereAudioTrack.Builderper creare rispettivamente oggetti di acquisizione e riproduzione audio digitale e configurare le proprietà di origine e destinazione audio per ignorare i valori predefiniti del sistema. - Hook API per l'associazione di dispositivi audio e di input. Ciò è particolarmente utile se la tua app
consente agli utenti di avviare una ricerca vocale da un controller di gioco o da 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 integrato, recupera l'oggettoInputDeviceda questo callback, quindi chiama il nuovo metodohasMicrophone(). - Nuovo metodo
getDevices()che consente di recuperare un elenco di tutti i dispositivi audio attualmente connessi al sistema. Puoi anche registrare un oggettoAudioDeviceCallbackse vuoi che il sistema invii una notifica alla tua app quando un dispositivo audio si connette o si disconnette.
Funzionalità video
Questa release aggiunge nuove funzionalità alle API di elaborazione video, tra cui:
- Nuova classe
MediaSyncche consente alle applicazioni di eseguire il rendering sincrono di flussi 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 dal 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, in quanto è passato allo stato terminale. - Nuova interfaccia
getMaxSupportedInstances()per ottenere un suggerimento sul numero massimo di istanze di codec simultanee supportate. - Nuovo metodo
setPlaybackParams()per impostare la velocità di riproduzione dei contenuti multimediali per la riproduzione veloce o al rallentatore. Inoltre, allunga o accelera automaticamente la riproduzione audio in sincronia con il video.
Funzionalità della fotocamera
Questa release include le seguenti nuove API per accedere alla torcia della fotocamera e per il ritrattamento delle immagini della fotocamera:
API Flashlight
Se un dispositivo videocamera ha un flash, puoi chiamare il metodo
setTorchMode()
per attivare o disattivare la modalità torcia del flash senza aprire il dispositivo videocamera. L'app
non ha la proprietà esclusiva del flash o della videocamera. La modalità torcia viene
disattivata e non è più disponibile ogni volta che la videocamera non è più disponibile o quando altre risorse della videocamera
che mantengono 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 viene chiusa, la modalità Torcia viene disattivata.
Puoi registrare un callback per ricevere una notifica sullo stato della modalità torcia chiamando il metodo
registerTorchCallback(). La prima volta che viene registrato il callback, viene chiamato immediatamente con lo stato della modalità torcia
di tutti i dispositivi di videocamera attualmente noti con un flash. Se la modalità torcia viene attivata o
disattivata correttamente, viene richiamato il
metodo onTorchModeChanged().
API di rielaborazione
L'API Camera2 è estesa per supportare il ritrattamento delle immagini in formato YUV e privato opaco. Per determinare se queste funzionalità di rielaborazione sono disponibili,
chiama getCameraCharacteristics() e controlla la chiave
REPROCESS_MAX_CAPTURE_STALL. Se un
dispositivo supporta l'elaborazione, puoi creare una sessione di acquisizione della videocamera rielaborabile chiamando
createReprocessableCaptureSession()
e creare richieste per l'elaborazione del buffer di input.
Utilizza la classe ImageWriter per connettere 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(). - Inserisci i dati nel buffer di input.
- 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. Invece, passa l'immagine PRIVATE direttamente a
ImageWriter chiamando il metodo
queueInputImage() senza copiare alcun buffer.
La classe ImageReader ora supporta
flussi di immagini in formato PRIVATE. Questo supporto consente alla tua app di
mantenere una coda circolare di immagini di output di ImageReader, selezionare una o
più immagini e inviarle a ImageWriter per l'elaborazione della fotocamera.
Funzionalità di Android for Work
Questa release include le seguenti nuove API per Android for Work:
- Controlli avanzati per i dispositivi Corporate-Owned, Single-Use: il proprietario del dispositivo
ora può controllare le seguenti impostazioni per migliorare la gestione dei
dispositivi Corporate-Owned, Single-Use (COSU):
- Disattiva o riattiva la protezione tastiera con il
metodo
setKeyguardDisabled(). - Disattiva o riattiva la barra di stato (incluse le impostazioni rapide, le notifiche e il
gesto di scorrimento verso l'alto per la navigazione che avvia Google Now) con il
metodo
setStatusBarDisabled(). - Disattiva o riattiva l'avvio protetto con la costante
UserManagerDISALLOW_SAFE_BOOT. - Evita che lo schermo si spenga quando è collegato con la
costante
STAY_ON_WHILE_PLUGGED_IN.
- Disattiva o riattiva la protezione tastiera con il
metodo
- Installazione e disinstallazione invisibile delle app da parte del proprietario del dispositivo: un proprietario del dispositivo ora può
installare e disinstallare le applicazioni in modalità invisibile 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 dell'utente. Questa funzionalità è utile per attivare il provisioning con un solo tocco di chioschi o 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 può ora chiamare il metodoonChoosePrivateKeyAlias()per fornire l'alias in modo silenzioso all'applicazione richiedente. Questa funzionalità ti consente di concedere alle app gestite l'accesso ai certificati senza interazione utente. - Accettazione automatica degli aggiornamenti di sistema. Se imposti un criterio di aggiornamento di sistema con
setSystemUpdatePolicy(), un proprietario del dispositivo ora può accettare automaticamente un aggiornamento di sistema, ad esempio nel caso di un dispositivo kiosk, o posticipare l'aggiornamento e impedire che venga eseguito dall'utente per un massimo di 30 giorni. Inoltre, un amministratore può impostare un intervallo di tempo giornaliero in cui deve essere eseguito 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 Device Policy Controller ha impostato un criterio di aggiornamento di sistema e si comporta di conseguenza. -
Installazione delegata dei certificati:un proprietario del profilo o del dispositivo ora può concedere a un'app di terze parti la possibilità di chiamare queste API di gestione dei certificati
DevicePolicyManager: - Monitoraggio dell'utilizzo dei dati. Un proprietario del profilo o del dispositivo ora può eseguire query per le statistiche sull'utilizzo dei dati visibili in Impostazioni > Utilizzo dati utilizzando i nuovi metodi
NetworkStatsManager. Ai proprietari dei profili viene automaticamente concessa 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 proprietario del profilo o del dispositivo può impostare una norma di autorizzazione per tutte le richieste di runtime di tutte le applicazioni che utilizzano
setPermissionPolicy(), per chiedere all'utente di concedere l'autorizzazione o per concederla o negarla automaticamente in modo silenzioso. Se viene impostato quest'ultimo criterio, l'utente non può modificare la selezione effettuata dal proprietario del profilo o del dispositivo nella schermata delle autorizzazioni dell'app in Impostazioni. - VPN nelle Impostazioni:le app VPN sono ora visibili in Impostazioni > Altro > VPN. Inoltre, le notifiche che accompagnano l'utilizzo della VPN ora sono specifiche per la configurazione della VPN. Per il proprietario del profilo, le notifiche sono specifiche a seconda che la VPN sia configurata per un profilo gestito, un profilo personale o entrambi. Per un proprietario del dispositivo, le notifiche sono specifiche a seconda che la VPN sia configurata per l'intero dispositivo.
- Notifica di 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 viene sbloccato direttamente sull'attività di un'app nel profilo gestito, viene visualizzata una notifica toast che informa l'utente che si trova all'interno del profilo di lavoro.