Condividi tramite


Caratteristiche di Meduse Bean

Questo documento offre una panoramica generale delle nuove funzionalità per gli sviluppatori introdotte in Android 4.1. Queste funzionalità includono: notifiche avanzate, aggiornamenti di Android Beam per condividere file di grandi dimensioni, aggiornamenti a contenuti multimediali, individuazione di rete peer-to-peer, animazioni, nuove autorizzazioni.

Panoramica

Android 4.1 (livello API 16), noto anche come "Jelly Bean", è stato rilasciato il 9 luglio 2012. Questo articolo fornisce un'introduzione generale ad alcune delle nuove funzionalità di Android 4.1 per sviluppatori che usano Xamarin.Android. Alcune di queste nuove funzionalità introdotte sono miglioramenti alle animazioni per l'avvio di un'attività, nuovi suoni per una fotocamera e il supporto migliorato per lo spostamento dello stack di applicazioni. È ora possibile tagliare e incollare con finalità.

La stabilità delle applicazioni Android è migliorata grazie alla possibilità di isolare la dipendenza da provider di contenuti instabili. I servizi possono anche essere isolati in modo che siano accessibili solo dall'attività che li ha avviati.

È stato aggiunto il supporto per l'individuazione dei servizi di rete usando i servizi basati su DNS Bonjour, UPnP o multicast. È ora possibile che le notifiche più complete abbiano testo formattato, pulsanti di azione e immagini di grandi dimensioni.

Sono state infine aggiunte diverse nuove autorizzazioni in Android 4.1.

Requisiti

Per sviluppare applicazioni Xamarin.Android con Jelly Bean è necessario che Xamarin.Android 4.2.6 o versione successiva e Android 4.1 (livello API 16) sia installato tramite Android SDK Manager, come illustrato nella schermata seguente:

Selezione di Android 4.1 in Android SDK Manager

Novità

Animazioni

Le attività possono essere avviate usando animazioni di zoom o animazioni personalizzate usando la ActivityOptions classe . Per supportare queste animazioni sono disponibili i nuovi metodi seguenti:

  • MakeScaleUpAnimation : verrà creata un'animazione che aumenta le prestazioni di una finestra attività da una posizione iniziale e dalle dimensioni sullo schermo.
  • MakeThumbnailScaleUpAnimation : verrà creata un'animazione che aumenta da un'immagine di anteprima dalla posizione specificata sullo schermo.
  • MakeCustomAnimation : crea un'animazione dalle risorse nell'applicazione. È disponibile un'animazione per quando l'attività viene aperta e un'altra per quando l'attività si arresta.

La nuova TimeAnimator classe fornisce un'interfaccia TimeAnimator.ITimeListener che può notificare a un'applicazione ogni volta che un fotogramma cambia in un'animazione. Si consideri ad esempio l'implementazione seguente di TimeAnimator.ITimeListener:

class MyTimeListener : Java.Lang.Object,  TimeAnimator.ITimeListener
{
    public void OnTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime)
    {
        Log.Debug("Activity1", "totalTime={0}, deltaTime={1}", totalTime, deltaTime);
    }
}

E ora per usare la classe , viene creata un'istanza di TimeAnimator e il listener è impostato:

var animator = new TimeAnimator();
animator.SetTimeListener(new MyTimeListener());
animator.Start();

Quando l'istanza TimeAnimator è in esecuzione, richiamerà ITimeAnimator.ITimeListener, che porterà quindi a registrare il tempo di esecuzione dell'animazione e per quanto tempo è trascorso dall'ultima chiamata del metodo.

Spostamento tra stack di applicazioni

Android 4.1 migliora lo spostamento dello stack di applicazioni introdotto in Android 3.0. Specificando la ParentName proprietà di ActivityAttribute, Android può aprire l'attività padre appropriata quando l'utente preme il pulsante Su sulla barra delle azioni - Android creerà un'istanza dell'attività specificata dalla ParentName proprietà . Ciò consente alle applicazioni di mantenere una gerarchia di attività che rendono un'attività specifica.

Per la maggior parte delle applicazioni che impostano sull'attività ParentName sono sufficienti informazioni per Android per fornire il comportamento corretto per l'esplorazione dello stack di applicazioni; Android eseguirà la sintesi dello stack back necessario creando una serie di finalità per ogni attività padre. Tuttavia, poiché si tratta di uno stack di applicazioni artificiali, ogni attività sintetica non avrà lo stato salvato che avrebbe un'attività naturale. Per fornire lo stato salvato a un'attività padre sintetica, un'attività può eseguire l'override del OnPrepareNavigationUpTaskStack metodo . Questo metodo riceve un'istanza TaskStackBuilder che avrà una raccolta di oggetti Intent che Android userà per creare lo stack back. L'attività può modificare queste finalità in modo che, man mano che viene creata l'attività sintetica, riceverà le informazioni sullo stato appropriate.

Per scenari più complessi, sono disponibili nuovi metodi nella classe Activity che possono essere usati per gestire il comportamento di spostamento Up e costruire lo stack back:

  • OnNavigateUp – Eseguendo l'override di questo metodo è possibile eseguire un'azione personalizzata quando si preme il pulsante Su .
  • NavigateUpTo : la chiamata a questo metodo fa sì che l'applicazione passi dall'attività corrente all'attività specificata da una determinata finalità.
  • ParentActivityIntent : viene usato per ottenere una finalità che avvierà l'attività padre dell'attività corrente.
  • ShouldUpRecreateTask : questo metodo viene usato per eseguire query se lo stack back sintetico deve essere creato per passare a un'attività padre. Restituisce true se è necessario creare lo stack sintetico.
  • FinishAffinity : la chiamata a questo metodo terminerà l'attività corrente e tutte le attività sottostanti nell'attività corrente con la stessa affinità di attività.
  • OnCreateNavigateUpTaskStack : questo metodo viene sottoposto a override quando è necessario avere il controllo completo sulla modalità di creazione dello stack sintetico.

Fotocamera

È disponibile una nuova interfaccia, Camera.IAutoFocusMoveCallback, che può essere usata per rilevare l'avvio o l'arresto dello stato attivo automatico. Un esempio di questa nuova interfaccia può essere visualizzato nel frammento di codice seguente:

public class AutoFocusCallbackActivity : Activity, Camera.IAutoFocusCallback
{
    public void OnAutoFocus(bool success, Camera camera)
    {
        // camera is an instance of the camera service object.

        if (success)
        {
            // Auto focus was successful - do something here.
        }
        else
        {
            // Auto focus didn't happen for some reason - react to that here.
        }
    }
}

La nuova classe MediaActionSound fornisce un set di API per la produzione di suoni per le varie azioni multimediali. Esistono diverse azioni che possono verificarsi con una fotocamera, che sono definite dall'enumerazione Android.Media.MediaActionSoundType:

  • MediaActionSoundType.FocusComplete – Questo suono che viene riprodotto quando lo stato attivo è completato.
  • MediaActionSoundType.ShutterClick – Questo suono verrà riprodotto quando viene scattata un'immagine ancora.
  • MediaActionSoundType.StartVideoRecording – Questo suono viene usato per indicare l'inizio della registrazione video.
  • MediaActionSoundType.StopVideoRecording – Questo suono verrà riprodotto per indicare la fine della registrazione video.

Un esempio di come usare la MediaActionSound classe può essere visualizzato nel frammento di codice seguente:

var mediaActionPlayer = new MediaActionSound();

// Preload the sound for a shutter click.
mediaActionPlayer.Load(MediaActionSoundType.ShutterClick);
var button = FindViewById<Button>(Resource.Id.MyButton);

// Play the sound on a button click.
button.Click += (sender, args) => mediaActionPlayer.Play(MediaActionSoundType.ShutterClick);

// This releases the preloaded resources. Don’t make any calls on
// mediaActionPlayer after this.
mediaActionPlayer.Release();

Connettività

Android Beam

Android Beam è una tecnologia basata su NFC che consente a due dispositivi Android di comunicare tra loro. Android 4.1 offre un supporto migliore per il trasferimento di file di grandi dimensioni. Quando si usa il nuovo metodo NfcAdapter.SetBeamPushUris() Android passerà tra meccanismi di trasporto alternativi (ad esempio Bluetooth) per ottenere una velocità di trasferimento veloce.

Individuazione dei servizi di rete

Android 4.1 contiene le nuove API per l'individuazione di servizi basati su DNS multicast. Ciò consente a un'applicazione di rilevare e connettere tramite Wi-Fi ad altri dispositivi, ad esempio stampanti, fotocamere e dispositivi multimediali. Queste nuove API si trovano nel Android.Net.Nsd pacchetto.

Per creare un servizio che può essere utilizzato da altri servizi, la NsdServiceInfo classe viene usata per creare un oggetto che definirà le proprietà di un servizio. Questo oggetto viene quindi fornito insieme a NsdManager.RegisterService() un'implementazione di NsdManager.ResolveListener. Le implementazioni di NsdManager.ResolveListener vengono usate per notificare una registrazione corretta e annullare la registrazione del servizio.

Per individuare i servizi in rete e l'implementazione di Nsd.DiscoveryListener passato a NsdManager.discoverServices().

Utilizzo rete

Un nuovo metodo consente ConnectivityManager.IsActiveNetworkMetered a un dispositivo di verificare se è connesso a una rete a consumo. Questo metodo può essere usato per gestire l'utilizzo dei dati informando accuratamente gli utenti che potrebbero essere previsti costi elevati per le operazioni dei dati.

Individuazione del servizio diretto WiFi

La WifiP2pManager classe è stata introdotta in Android 4.0 per supportare zeroconf. Zeroconf (rete di configurazione zero) è un set di tecniche che consentono ai dispositivi (computer, stampanti, telefoni) di connettersi automaticamente alle reti, con l'intervento di operatori di rete umani o di server di configurazione speciali.

In Jelly Bean è WifiP2pManager possibile individuare i dispositivi nelle vicinanze usando Bonjour o Upnp. Bonjour è l'implementazione di Zeroconf di Apple. Upnp è un set di protocolli di rete che supporta anche zeroconf. I metodi seguenti aggiunti a per supportare l'individuazione WiFiP2pManager del servizio Wi-Fi:

  • AddLocalService() : questo metodo viene usato per annunciare un'applicazione come servizio tramite Wi-Fi per l'individuazione da parte dei peer.
  • AddServiceRequest( ) : questo metodo consiste nell'inviare una richiesta di individuazione del servizio al framework. Viene usato per inizializzare l'individuazione del servizio Wi-Fi.
  • SetDnsSdResponseListeners() : questo metodo viene usato per registrare i callback da richiamare quando si riceve una risposta alle richieste di individuazione da Bonjour.
  • SetUpnpServiceResponseListener() : questo metodo viene usato per registrare i callback da richiamare quando si riceve una risposta alle richieste di individuazione Upnp.

Provider di contenuto

La ContentResolver classe ha ricevuto un nuovo metodo, AcquireUnstableContentProvider. Questo metodo consente a un'applicazione di acquisire un provider di contenuto "instabile". In genere, quando un'applicazione acquisisce un provider di contenuti e il provider di contenuti si arresta in modo anomalo, quindi l'applicazione. Con questa chiamata al metodo, un'applicazione non si arresta in modo anomalo se il provider di contenuti si arresta in modo anomalo. Al contrario, Android.OS.DeadObjectionException verrà generata da chiamate sul provider di contenuti per informare un'applicazione che il provider di contenuti è scomparso. Un provider di contenuti "instabile" è utile quando interagisce con i provider di contenuti di altre applicazioni. È meno probabile che il codice bug di un'altra applicazione influirà su un'altra applicazione.

Copiare e incollare con finalità

La Intent classe può ora avere un ClipData oggetto associato tramite la Intent.ClipData proprietà . Questo metodo consente di trasmettere dati aggiuntivi dagli Appunti con la finalità . Un'istanza di ClipData può contenere uno o più ClipData.Itemoggetti . ClipData.Item's sono elementi dei tipi seguenti:

  • Text : qualsiasi stringa di testo, HTML o qualsiasi stringa il cui formato è supportato dagli intervalli di stile Android predefiniti.
  • Finalità : qualsiasi Intent oggetto.
  • URI : può trattarsi di qualsiasi URI, ad esempio un segnalibro HTTP o l'URI di un provider di contenuto.

Servizi isolati

Un servizio isolato è un servizio che viene eseguito nel proprio processo speciale e non dispone di autorizzazioni proprie. L'unica comunicazione con il servizio consiste nell'avviare il servizio e associarlo tramite l'API del servizio. È possibile dichiarare un servizio come isolato impostando la proprietà IsolatedProcess="true" in ServiceAttribute che adorna una classe di servizio.

File media

La nuova Android.Media.MediaCodec classe fornisce un'API ai codec multimediali di basso livello. Le applicazioni possono eseguire query sul sistema per scoprire quali codec di basso livello sono disponibili nel dispositivo.

Le nuove Android.Media.Audiofx.AudioEffect sottoclassi sono state aggiunte per supportare la pre-elaborazione audio aggiuntiva sull'audio acquisito:

  • Android.Media.Audiofx.AcousticEchoCanceler : questa classe viene usata per la pre-elaborazione dell'audio per rimuovere il segnale da una parte remota da un segnale audio acquisito. Ad esempio, rimuovendo l'eco da un'applicazione di comunicazione vocale.
  • Android.Media.Audiofx.AutomaticGainControl : questa classe viene usata per normalizzare il segnale acquisito aumentando o abbassando un segnale di input in modo che il segnale di output sia costante.
  • Android.Media.Audiofx.NoiseSuppressor : questa classe rimuoverà il rumore di fondo dal segnale acquisito.

Non tutti i dispositivi supporteranno questi effetti. Il metodo AudioEffect.IsAvailable deve essere chiamato da un'applicazione per verificare se l'effetto audio in questione è supportato nel dispositivo che esegue l'applicazione.

La MediaPlayer classe supporta ora la riproduzione senza gap con il SetNextMediaPlayer() metodo . Questo nuovo metodo specifica il successivo MediaPlayer da avviare al termine della riproduzione del lettore multimediale corrente.

Le nuove classi seguenti forniscono meccanismi e interfaccia utente standard per selezionare dove verranno riprodotti i supporti:

  • MediaRouter : questa classe consente alle applicazioni di controllare il routing dei canali multimediali da un dispositivo a altoparlanti esterni o altri dispositivi.
  • MediaRouterActionProvider e MediaRouteButton : queste classi consentono di fornire un'interfaccia utente coerente per la selezione e la riproduzione di contenuti multimediali.

Notifications

Android 4.1 consente alle applicazioni maggiore flessibilità e controllo con la visualizzazione delle notifiche. Le applicazioni possono ora visualizzare notifiche più grandi e migliori agli utenti. Un nuovo metodo consente NotificationBuilder.SetStyle() di impostare uno dei tre nuovi stili nelle notifiche:

  • Notification.BigPictureStyle : si tratta di una classe helper che genererà notifiche che includono un'immagine. L'immagine seguente mostra un esempio di notifica con un'immagine grande:

Screenshot di esempio di una notifica BigPictureStyle

  • Notification.BigTextStyle – Si tratta di una classe helper che genererà notifiche con più righe di testo, ad esempio posta elettronica. Un esempio di questo nuovo stile di notifica può essere visualizzato nello screenshot seguente:

Screenshot di esempio di una notifica BigTextStyle

  • Notification.InboxStyle : si tratta di una classe helper che genererà notifiche che contengono un elenco di stringhe, ad esempio frammenti di codice da un messaggio di posta elettronica, come illustrato in questo screenshot:

Screenshot di esempio di una notifica Notification.InboxStyle

È possibile aggiungere fino a due pulsanti di azione nella parte inferiore di un messaggio di notifica quando la notifica usa lo stile normale o più grande. Un esempio può essere visualizzato nello screenshot seguente, in cui i pulsanti di azione sono visibili nella parte inferiore della notifica:

Screenshot di esempio dei pulsanti di azione visualizzati sotto un messaggio di notifica

La Notification classe ha ricevuto nuove costanti che consentono a uno sviluppatore di specificare uno dei cinque livelli di priorità per una notifica. Questi valori possono essere impostati in una notifica usando la Priority proprietà .

Autorizzazioni

Sono state aggiunte le nuove autorizzazioni seguenti:

  • READ_EXTERNAL_STORAGE - L'applicazione richiede l'accesso in sola lettura all'archiviazione esterna. Attualmente tutte le applicazioni hanno accesso in lettura per impostazione predefinita, ma le versioni future di Android richiederanno in modo esplicito l'accesso in lettura alle applicazioni.
  • READ_USER_DICTIONARY - Consente l'accesso in lettura al dizionario delle parole dell'utente.
  • READ_CALL_LOG - Consente a un'applicazione di ottenere informazioni sulle chiamate in ingresso e in uscita leggendo il log delle chiamate.
  • WRITE_CALL_LOG - Consente a un'applicazione di scrivere nel registro chiamate sul telefono.
  • WRITE_USER_DICTIONARY - Consente a un'applicazione di scrivere nel dizionario delle parole dell'utente.

Una modifica importante da notare READ_EXTERNAL_STORAGE : attualmente questa autorizzazione viene concessa automaticamente da Android. Le versioni future di Android richiederanno a un'applicazione di richiedere questa autorizzazione prima di concedere l'autorizzazione.

Riepilogo

Questo articolo ha introdotto alcune delle nuove API disponibili in Android 4.1 (livello API 16). Sono state evidenziate alcune modifiche per le animazioni e l'animazione del lancio di un'attività e sono state introdotte le nuove API per l'individuazione di rete di altri dispositivi usando protocolli come Bonjour o UPnP. Sono state evidenziate anche altre modifiche all'API, ad esempio la possibilità di tagliare e incollare i dati tramite finalità, la possibilità di usare servizi isolati o provider di contenuti "instabile".

In questo articolo sono stati introdotti gli aggiornamenti alle notifiche e sono state illustrate alcune delle nuove autorizzazioni introdotte con Android 4.1