lunedì 27 agosto 2012

Android Cloud Apps con Azure


La zona nuvolosa è presentato da DZone e Microsoft . Lasciate che i nostri tutorial, modelli di progettazione, e le notizie vi guiderà attraverso il labirinto di soluzioni cloud in costante aumento.Microsoft dispone di una serie di strumenti che consentono di distribuire Node.js , PHP e Java applicazioni sul proprio Windows Azure piattaforma.
Un recente studio condotto da Gartner prevede un aumento molto significativo dell'utilizzo nube da parte dei consumatori in pochi anni, grazie in gran parte per l'utilizzo sempre crescente di macchine fotografiche smartphone da parte della famiglia media. In questo contesto, potrebbe essere utile avere una applicazione per smartphone che è in grado di caricare / scaricare contenuti digitali da un provider cloud.
In questo articolo, ci sarà la costruzione di un prototipo di base Android che ci permetterà di inserire ilWindows Azure provider cloud, e utilizzare il Windows Azure Toolkit per Android (  disponibile pressoGitHub ) per fare tutte le operazioni di nube di base : carica contenuti al cloud stoccaggio, sfogliarelo stoccaggio, scaricare o cancellare i file in cloud storage. Una volta che tali operazioni siano attuate, vedremo come abilitare la nostra applicazione Android per ricevere server di notifiche push .
Per prima cosa, abbiamo bisogno di creare un account di archiviazione in the cloud Azure:
Un conto deposito è dotato di diverse opzioni come per la gestione dei dati : siamo in grado di mantenere i dati in memoria blob, da tavolo o coda. In questo articolo, useremo l'archiviazione blob per lavorare con le immagini. L'account di archiviazione ha una primaria e chiave di accesso secondaria , o uno dei due può essere utilizzato per eseguire operazioni sul conto deposito. Ognuno di questi tasti può essere rigenerato se compromessa.

1. Preliminari

In primo luogo, i prerequisiti:
  • Eclipse IDE per Java
  • Android plugin per Eclipse ( ADT )
  • Windows Azure Toolkit per Android
  • Windows Azure Abbonamento (si può arrivare a 90 giorni di prova gratuita )
Un getting-started documento a pagina GitHub Windows Azure Toolkit copre la procedura di installazione di tutto il software necessario in dettaglio.
L'intero progetto ( Cloid ) è liberamente disponibile a GitHub . Così qui ci siamo limitati a presentare le sezioni di codice più rilevanti con le schermate corrispondenti.
L'interfaccia utente è composta da un paio di schermate di attività di base, generato dalla schermata principale (in alto al centro):
Dal momento che usiamo una tecnologia non fine a se stessa, ma in base alle nostre esigenze, iniziamo specificando quello che vogliamo:

01.pubblico abstract class storage {
02. 
03./ ** Tutti i fornitori dovranno accesss al contesto * /
04.protetto contesto Contesto;
05. 
06./ ** Tutti i fornitori dovranno accesss a SharedPreferences * /
07.protetti prefs CloudPreferences;
08. 
09./ ** tutti i file da parte dei fornitori verranno salvate su scheda SD * /
10.protetto DOWNLOAD_PATH String = "/ sdcard / DCIM / Camera /" ;
11. 
12./ **
13.* @ throws OperationException
14.** /
15.pubblico di stoccaggio (ctx Context) throws OperationException {
16.context = ctx;
17.prefs = nuovi CloudPreferences (CTX);
18.}
19. 
20./ **
21.* @ throws OperationException
22.** /
23.pubblico abstract vuoto uploadToStorage (String percorso_file) throwsOperationException;
24. 
25./ **
26.* @ throws OperationException
27.** /
28.pubblico abstract vuoto downloadFromStorage (String nome_file) throwsOperationException;
29. 
30./ **
31.* @ throws OperationException
32.** /
33.pubblico abstract vuoto browseStorage () throws OperationException;
34. 
35./ **
36.* @ throws OperationException
37.** /
38.pubblico abstract vuoto deleteInStorage (file_name String) throwsOperationException;
39. 
40.}
Quanto sopra è il contratto che il nostro fornitore di cloud storage in grado di soddisfare. Ci fornire un'implementazione MockStorage che pretende di eseguire un comando, al fine di testare la nostra interfaccia utente (vale a dire i nostri articoli lista scorrevole, barra di avanzamento, messaggi di eccezione, ecc), in modo che possiamo poi basta collegare operazioni di stoccaggio Azure. Nota del nostro schermo le attività di cui sopra, che si può passare in qualsiasi momento tra Azure Storage e Storage Mock con la stampa della ginocchiera "Cloud ON / OFF" nella schermata Impostazioni, salvando le preferenze dopo.

01.pubblico class MockStorage estende Deposito {
02. 
03./ / qui il codice ...
04.@ Override
05.pubblico vuoto uploadToStorage (String percorso_file) throwsOperationException {
06. 
. 07doNothingButSleep ();
08./ / throw new OperationException ("messaggio di prova",
09./ / nuovo Throwable ("Motivo: carica test"));
10.}
11. 
12./ / altri metodi anche fare altro che dormire ...
13. 
14./ *** /
15.privato vuoto doNothingButSleep () {
16. 
17.provare {Thread.sleep (5000L);}
18.cattura (InterruptedException iex) { ritorno ;}
19.}

2. L'Azure Toolkit

Il Toolkit è dotato di una applicazione di esempio denominata "semplice", e due vasi di libreria:
  1. controllo accessi per android.jar in  wa-toolkit-android \ library \ accesscontrol \ bin   cartella
  2. Azure Storage per android.jar  in   wa-toolkit-android \ library \ storage \ bin   cartella
Qui useremo solo questi ultimi, dal momento che si accede direttamente archiviazione Blob Azure.Inutile dire che questo non è il metodo raccomandato , dato che le nostre credenziali saranno memorizzati sul portatile. Un approccio migliore sicurezza saggia sarebbe quella di accedere allo storage Azure tramite i servizi Web ospitati su entrambi nuvole Azure o altre pubbliche / private.
Una volta che il Toolkit è pronto per l'uso, abbiamo bisogno di pensare un po 'su Impostazioni . L'utilizzo di un deposito Azure Blob richiede solo 3 campi: un Nome account , una chiave di accesso , e uncontenitore per le nostre immagini. La chiave di accesso è piuttosto una stringa lunga (88 caratteri) ed è una specie di dolore di tipo, quindi un modo per fare il setup è quello di configurare l'Android res / valori / strings.xml file per impostare i valori di default:

1....
2.<- AZURE configurazione diretta ->
3.stringa name "azure_direct_account_name" > cloid </ stringa >
4.stringa name "azure_direct_access_key" > insert-accesso-chiave qui </stringa >
5.stringa name "azure_container" > foto </ stringa >
6....
Tuttavia, poiché potremmo voler sovrascrivere i valori di default di cui sopra (ad esempio, creare un altro contenitore), ci sarà anche salvare i valori nella schermata Impostazioni di Android SharedPreferences .
E ora, andiamo a implementare la AzureStorage classe.

3. Azure Blob storage Operations

3,1. Deposito di inizializzazione

Il costruttore AzureStorage ottiene i dati da preferenze Android (dalla sua superclasse), costruisce una stringa di connessione utilizzata per accedere all'account di archiviazione, crea un client Blob e recupera un riferimento al contenitore di immagini. Se l'utente ha modificato l'impostazione predefinita contenitore "immagini" in Impostazioni, poi un nuovo (vuoto) ne verrà creato uno nuovo con lo stesso nome. Un contenitore è un qualsiasi gruppo di macchie con un nome. No blob esiste al di fuori di un contenitore.

01./ / pacchetto qui
02./ / altre importazioni
03.importazione com.windowsazure.samples.android.storageclient.BlobProperties;
04.import com.windowsazure.samples.android.storageclient.CloudBlob;
05.importare com.windowsazure.samples.android.storageclient.CloudBlobClient;
. 06import com.windowsazure.samples.android.storageclient.CloudBlobContainer;
. 07import com.windowsazure.samples.android.storageclient.CloudBlockBlob;
. 08import com.windowsazure.samples.android.storageclient.CloudStorageAccount;
09. 
10.pubblico class AzureStorage estende Deposito {
11. 
12.privato contenitore CloudBlobContainer;
13. 
14./ * @ throws OperationException
15.** /
16.pubblico AzureStorage (ctx Context) throws OperationException {
17.Super (CTX);
18. 
19./ / imposta da preferenze
. 20acct_name String = prefs.getAccountName ();
21.String access_key prefs.getAccessKey = ();
22. 
23./ / ottiene stringa di connessione
24.storageConn String = "DefaultEndpointsProtocol = http;" +
25."AccountName =" + + acct_name
26."; AccountKey =" + access_key;
27. 
28./ / ottiene CloudBlobContainer
29.provare {
30./ / Recupera account di archiviazione da storageConn
31.CloudStorageAccount storageAccount = CloudStorageAccount.parse (conn);
32. 
33./ / Crea il cliente blob
34./ / per ottenere gli oggetti di riferimento per i contenitori e blob
35.CloudBlobClient blobClient storageAccount.createCloudBlobClient = ();
36. 
37./ / Recupera il riferimento a un contenitore creato in precedenza
38.contenitore = blobClient.getContainerReference (prefs.getContainer ());
39.container.createIfNotExist ();
40.}
41.cattura (Exception e) {
42.gettare nuova OperationException ( "Errore da initBlob:" + e.getMessage (), e);
43.}
44.}
45./ / codice ...
Useremo quel contenitore di riferimento CloudBlobContainer tutta la nostra attività cloud in arrivo.

3,2. Caricamento di immagini

Noi caricare un file dalla galleria di Android al cloud, mantenendo lo stesso nome. "Screener" è solo una utility di classe (vedi repository GitHub) che fa un certo numero di cose utili, ad esempio, l'estrazione di un nome di file dal suo percorso e impostando il diritto mime type ("image / jpeg", "image / jpeg", ecc ).
I due tipi di macchie sono macchie di pagina e blob di blocco . Il (molto) racconto breve è che blob pagina sono ottimizzati per le operazioni di lettura e scrittura, mentre macchie di blocco farci caricare file di grandi dimensioni in modo efficiente. In particolare siamo in grado di caricare più blocchi in parallelo per ridurre il tempo del caricamento. Qui si sta caricando un blob (immagine Gallery) come un insieme di blocchi.

01./ **
02.* @ throws OperationException * /
03.@ Override
04.pubblico vuoto uploadToStorage (String percorso_file) throwsOperationException {
05. 
06.provare {
07./ / Crea o sovrascrivere blob con contenuti da un file locale
08./ / utilizzare il nome stesso che nella memoria locale
09.CloudBlockBlob blob = container.getBlockBlobReference (
10.Screener.getNameFromPath (percorso_file));
11.origine file = nuovo file (percorso_file);
12.blob.upload ( nuovo FileInputStream (fonte), source.length ());
13.blob.getProperties () contentType = Screener.getImageMimeType (percorso_file).;
14.blob.uploadProperties ();
15.}
16.cattura (Exception e) {
17.gettare nuova OperationException ( "Errore da uploadToStorage:"
18.+ e.getMessage (), e);
19.}
20.}
Tenete a mente che non si verifica se il file esiste già nel cloud storage. Perciò sovrascrive qualsiasi file esistente con lo stesso nome di quello che stiamo caricando. Questo di solito non è auspicabile nel codice di produzione. Ecco il flusso schermo l'operazione di caricamento:

3,3. Navigando in cloud

Per la navigazione, abbiamo memorizzare tutte le nostre macchie nel nostro contenitore in un elenco di elementi che verranno visualizzate in Android come un elenco scorrevole di nomi di immagine in una sottoclasse di android.app.ListActivity . Una volta che una voce dell'elenco si fa clic ("toccato") da parte dell'utente, si desidera visualizzare alcune proprietà dell'immagine, come la dimensione dell'immagine (importante quando si decide di scaricare), il tipo MIME, e la data del suo ultimo operato.

01./ **
02.* @ throws OperationException
03.** /
04.@ Override
05.pubblico vuoto browseStorage () throws OperationException {
06. 
07.lista uri / / reset per aggiornare - nessun caching
. 08Item.itemList.clear ();
09. 
10./ / Loop su blob all'interno del contenitore
11.provare {
12.per (CloudBlob blob: container.listBlobs ()) {
13.blob.downloadAttributes ();
14.BlobProperties oggetti di scena blob.getProperties = ();
15.lungo Kdim = props.length / 1024 ;
16.tipo String = props.contentType;
17.Data LastModified = props.lastModified;
18. 
19.Item item = nuovo articolo (blob.getUri (), blob.getName (), Kdim, tipo, LastModified);
. 20Item.itemList.add (voce);
21./ loop / fine
22.}
23.cattura (Exception e) {
24.gettare nuova OperationException ( "Errore da browseStorage:" + e.getMessage (), e);
25.}
26.}
Ecco il flusso schermata dell'operazione Sfoglia. Premendo su un elemento della lista vengono visualizzati i dettagli e le operazioni sull'immagine, che vedremo al prossimo:

3,4. Download di immagini

Il nostro metodo di download è abbastanza semplice. Si noti che stiamo scaricando su scheda SD del telefono Android tramite l'utilizzo DOWNLOAD_PATH dalla superclasse.

01./ **
02.* @ throws OperationException
03.** /
04.@ Override
05.pubblico vuoto downloadFromStorage (String nome_file) throwsOperationException {
06. 
07.provare {
08.per (CloudBlob blob: container.listBlobs ()) {
09./ / Scarica l'oggetto e salvarlo in un file con lo stesso nome arg
10.se (blob.getName (). equals (nome_file)) {
11.blob.download ( nuovo FileOutputStream (DOWNLOAD_PATH
12.+ blob.getName ()));
13.rottura ;
14.}
15.}
16.}
17.cattura (Exception e) {
18.gettare nuova OperationException ( "Errore da downloadFromStorage:"
19.+ e.getMessage (), e);
20.}
21.}
E il flusso UI corrispondente. Invece di visualizzare l'immagine subito dopo il download, abbiamo scelto di includere un link alla Galleria (parte inferiore dello schermo), in cui l'immagine appena recuperato appare in cima alla pila della Galleria di immagini:

3,5. Eliminazione di immagini

L'operazione di eliminazione eseguita su un blob nella nube è piuttosto semplice:

01./ **
02.* @ throws OperationException * /
03.@ Override
04.pubblico vuoto deleteInStorage (String nome_file) throwsOperationException {
05. 
06.provare {
07./ / Recupera il riferimento a un blob denominato nome_file
08.CloudBlockBlob blob = container.getBlockBlobReference (file_name);
09./ / Cancella il blob
10.blob.delete ();
11.}
12.cattura (Exception e) {
13.gettare nuova OperationException ( "Errore da deleteInStorage:"
14.+ e.getMessage (), e);
15.}
16.}
E la sua interfaccia utente associato serie schermate. Si noti che dopo aver confermato l'operazione, e quando l'eliminazione completa, l'elenco degli elementi di navigazione viene aggiornata automaticamente, e possiamo vedere che l'immagine non è più sulla lista dei blob nel nostro contenitore.

3,6. Concludendo

I metodi AzureStorage vengono chiamati all'interno di un thread di lavoro di base, che si prenderà cura di tutte le operazioni di cloud:

01./ / chiamata all'interno di un thread
02.provare {
03./ / ottenere l'istanza di archiviazione dalla fabbrica
04.Conservazione store = StorageFactory.getStorageInstance ( questo ,
05.StorageFactory.Provider.AZURE_STORAGE);
06./ / della barra di avanzamento
07.incrementWorkCount ();
08. 
09./ / do ops
10.Interruttore (funzionamento) {
11. 
12.caso UPLOAD: store.uploadToStorage (path);
13.rottura ;
14.caso CONSULTA: store.browseStorage ();
15.rottura ;
16.caso DOWNLOAD: store.downloadFromStorage (path);
17./ / Galleria di aggiornamento
18.sendBroadcast ( nuovo Intent (Intent.ACTION_MEDIA_MOUNTED,
19.Uri.parse ( file :/ / " + Environment.getExternalStorageDirectory ())));
20.rottura ;
21.caso DELETE: store.deleteInStorage (path);
22.rottura ;
23./ / fine corsa
24.}
25.cattura (OperationException e) {
26.recordError (e);
27.}
Notate come stiamo dicendo la Galleria immagini di Android per aggiornare mediante l'emissione di una trasmissione, una volta un nuovo file viene scaricato dalla nube alla scheda SD. Ci sono diversi modi per farlo, ma senza quella chiamata, la Galleria non mostrerà la nuova immagine prima che il sistema dei media pianificata successiva scansione. Anche in questo caso, per il codice completo, fare riferimento a questo progetto su GitHub.
Abbiamo finito con le operazioni di base nuvola. Tutto quello che doveva fare era collegare il nostroAzureStorage classe di implementazione e ottenere un'istanza di esso attraverso una fabbrica, con un impatto minimo sulla preesistente codice.

4. Notifiche Push

Fino a questo punto abbiamo dimostrato dispositivo avviata la comunicazione con il cloud. Per cloud avviati o Push di comunicazione, La piattaforma Android utilizza Google Cloud Messaging (GCM).
In un precedente articolo , ho scritto su come integrare GCM in un'applicazione esistente Android. Qui si aggiunge una seconda serie di impostazioni per server push. Il nostro codice client si connetterà con qualsiasi server GCM e si imposta lo stato sulla nostra attività principale (ultimo schermo girato a destra) una volta che le informazioni nelle preferenze push sia impostato correttamente.

5. Conclusioni

La documentazione Toolkit è di tipo sparse (è per questo che la comunità ha bisogno di più articoli come questo). Inoltre, l'applicazione di esempio non copre molto (forse il motivo per cui si chiama "semplice"), e ha margini di miglioramento. Tuttavia, la libreria è completamente funzionale, e una volta a capire l'API, funziona tutto abbastanza bene. Naturalmente, questa applicazione in sé è piuttosto semplice e non copre un sacco di altre caratteristiche, come il controllo degli accessi, i permessi, i metadati, e le istantanee. Ma è un inizio.


Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.