Visualizzazione post con etichetta android. Mostra tutti i post
Visualizzazione post con etichetta android. Mostra tutti i post

22 giugno 2009

Richieste HTTP GET, POST, REST con Android

Dopo il tutorial su cos'è rest ecco un' implementazione per poter utilizzare REST sulla piattaforma Android.

In particolare ciò che ho creato è una classe di utilità in cui sono presenti una serie di metodi utili per l'esecuzionedi richieste di tipo GET e POST ed un wrapper mediante il quale è possibile eseguire una chiamata REST modellata in base al tipo di method che gli si passa in input.

public class RestUtils {
private final static String METHOD_POST = "post";
private final static String METHOD_GET= "get";
private final static String TAG= "RestUtils";

/***
* Esegue una richiesta REST
*
* @param host : hostname
* @param method : methodo (GET,POST supportati per ora)
* @param path : percorso
* @param parameters : parametri
* @return : Stringa contenente la response
* @throws RestRequestException : Eccezione personalizzata
*/
public static String doRESTRequest (String host, String method, String path, Map<String,String> parameters)
throws RestRequestException{

return doRESTRequest(host, "80", method, path, parameters);
}

/***
* Esegue una richiesta REST
*
* @param host : hostname
* @param port : porta
* @param method : methodo (GET,POST supportati per ora)
* @param path : percorso
* @param parameters : parametri
* @return : Stringa contenente la response
* @throws RestRequestException : Eccezione personalizzata
*/
public static String doRESTRequest (String host, String port, String method, String path, Map<String,String> parameters)
throws RestRequestException{

String returnString = null;
try{

String url = host+":"+port+path;
Log.i(TAG,METHOD_GET+" Request - URL : "+url );

if (METHOD_GET.equalsIgnoreCase(method)){
returnString = doGETRequest(url,parameters);
}else if (METHOD_POST.equalsIgnoreCase(method)){
returnString = doPOSTRequest(url, parameters);
}
}catch(GetRequestException e){
throw new RestRequestException(e.getMessage());
}catch(PostRequestException e){
throw new RestRequestException(e.getMessage());
}

return returnString;

}

/***
* Metodo per eseguire una request di tipo GET
* @param url : url della request
* @return : stringa contenente la response
* @throws GetRequestException : Eccezione modellata
*/
public static String doGETRequest(String url,Map<String, String> parameters) throws GetRequestException{
String paramStr = composeParametersForGetRequest(parameters);

if (paramStr!=null && paramStr.length() > 0 ) url = url +"?"+paramStr;
String websiteData = null;

try {
Log.i(TAG,"GetRequest - url : "+url);
DefaultHttpClient client = new DefaultHttpClient();
URI uri = new URI(url);
HttpGet method = new HttpGet(uri);
HttpResponse res = client.execute(method);
InputStream data = res.getEntity().getContent();
websiteData = parseISToString(data);
} catch (ClientProtocolException e) {
throw new GetRequestException(e.getMessage());
} catch (IOException e) {
throw new GetRequestException(e.getMessage());
} catch (URISyntaxException e) {
throw new GetRequestException(e.getMessage());
}finally{
Log.i(TAG,"GetRequest - Request & Response completed");
}
return websiteData;
}

public static String doPOSTRequest(String url,Map<String, String> parameters)
throws PostRequestException{

String returnString = null;
// Creo un nuovo HttpClient e l'Header del post
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httppost.setHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded");

try {
// aggiungo i dati alla richiesta
List<NameValuePair> nameValuePairs = composeParametersForPostRequest(parameters);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

// Eseguo la richiesta HTTP
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() == 200) {
returnString = EntityUtils.toString(response.getEntity());
response = null;

}
} catch (ClientProtocolException e) {
throw new PostRequestException(e.getMessage());
} catch (IOException e) {
throw new PostRequestException(e.getMessage());
}

return returnString;

}

public static List<NameValuePair> composeParametersForPostRequest(Map<String,String> parameters){

List<String> chiavi = new ArrayList<String>(parameters.keySet());
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

for (int i = 0 ; i < chiavi.size(); i++){
String chiave = chiavi.get(i);
nameValuePairs.add(new BasicNameValuePair(chiave, parameters.get(chiave)));
}

return nameValuePairs;
}

/***
* Metodo per comporre la parte di URL relativa ai parametri
* @param parameters : mappa di parametri
* @return : Stringa contenente i parametri concatenati
*/
public static String composeParametersForGetRequest(Map<String, String> parameters){
String paramStr = "";
List<String> chiavi = new ArrayList<String>(parameters.keySet());

for (int i = 0 ; i < chiavi.size(); i++){
String chiave = chiavi.get(i);
paramStr += chiave+"=";
paramStr += URLEncoder.encode(parameters.get(chiave));
paramStr += "&";
}
return paramStr;
}
}


Innanzitutto noterete che mancano alcune componenti per cui non potrete compilare questa classe:
- Metodi per la conversione da Stringa ad InputStream e viceversa che potrete trovare su questo post.
- Eccezioni personalizzate...potete ricrearvele voi, l'importante è che estandano Exception.

Adesso analizziamo i metodi :
- doRESTRequest : ci sono 2 overload utilizzabili uno in cui è possibile utilizzare una porta diversa da quella di default (80). Tramite questo metodo è possibile eseguire qualsiasi tipo di richiesta REST in base al parametro method che può essere "get" o "post". Gli altri parametri sono facilmente intuibili e troverete un esempio più avanti.
- doGETRequest : è un metodo che dato un url ed una mappa di parametri esegue una richiesta di tipo GET e restituisce una stringa contenente la response.
- doPOSTRequest : è un metodo che dato un url e una mappa di parametri esegue una richiesta di tipo POST e restituisce una stringa contenente la response.
- composeParametersForPostRequest : metodo per comporre i parametri in maniera adeguata per poter eseguire una richiesta di tipo POST.
- composeParametersForGetRequest : metodo per comporre i parametri in maniera adeguata per completare l'url per una richiesta di tipo GET.

Vediamo un esempio di utilizzo della classe di utilità per una richiesta di tipo POST. L'esempio utilizza le API REST di Yahoo per eseguire una ricerca :

Map<String,String> paramz = new HashMap<String,String>();
paramz.put("appid", "YahooDemo");
paramz.put("query", "umbrella");
paramz.put("results", "10");
try {
String retString = RestUtils.doRESTRequest("http://api.search.yahoo.com", "POST", "/WebSearchService/V1/webSearch", paramz);
Log.i(TAG,"Return : "+retString);
} catch (RestRequestException e) {
Log.e(TAG,"Eccezione : ",e);
}


Spero che questo post vi sia stato di aiuto.
Accetto domande e proponimenti a riguardo.

08 giugno 2009

Anatomia di un applicazione Android

Ci sono 4 blocchi fondamentali in un applicazione Android:

* Activity
* Intent Receiver
* Service
* Content Provider

Naturalmente la maggiorparte delle applicazioni non sviluppano tutti e 4 i blocchi, ma con una qualsiasi combinazione degli stessi.

Dopo aver deciso quali componenti sono necessari per la tua applicazione, è necessario elencarli in un file chiamato AndroidManifest.xml.

E' un file XML dove vengono dichiarate le componenti di un' applicazione e quali sono i relativi requisiti e capacità. Per poterne sapere di più è possibile guardare la documentazione relativa al file di manifest di Android.

Vediamo i 4 macro blocchi in dettaglio...


Activity
Le Activities sono le componenti più comuni presenti tra i 4 blocchi.
Un attività è di solito una schermata di un' applicazione.
Ogni attività è implementata in una singola classe che estende la classe base Activity.
La tua classe visualizzerà una User Interface composta da Views e risponderà a degli eventi.
La maggiorparte delle applicazioni sono composte da molteplici schermate.
Ad esempio un applicazione per l'invio di messaggi avrà una schermata in cui si avrà a disposizione l'elenco dei contatti a cui poter inviare il messaggio, una seconda scermata in cui si eseguirà la scrittura vera e propria del messaggio e schermate in cui modificare i setting o consultare la lista di messaggi in ingresso.

Ciascuna di queste schermate sarà implementata come un attività.
Muoversi su un altra schermata consisterà allo START di una nuova attività.
In alcuni casi un attività può restituire un valore all' attività precedente.

Quando viene aperta una nuova schermata, quella precedente viene messa in pausa ed inserita all'interno di un history stack.

L'utente potrà navigare indietro mediante questa history. Si può inoltra forzare l'eliminazione di una attitivà dall' history stack nel caso in cui non si ritenesse appropriata la relativa permanenza.
Android mantiene uno stack per ogni applicazione lanciata dalla schermata HOME.

Intent and Intent Filters
Android usa una classe speciale chiamata Intent per muoversi da una schermata all'altra.
Un intent descrive cosa vuole fare un applicazione. Le due parti più importanti della struttura dati di un intent sono le azioni e i dati su cui si basano.
Tipicalmente valori per le azioni sono MAIN (la pagina principale delle attività), VIEW, PICK, EDIT, etc.
I dati sono espressi come URI.
Per esempio, per visualizzare le informazioni di un contatto, si dovrà creare un intent con l'azione VIEW e i dati settati all'interno dell' URI che rappresentano la persona.

C'è una classe connessa chiamata IntentFilter.
Mentre un intent è effettivamente una richiesta di eseguire qualcosa, un intent filter è una descrizione di quali intents un attività è capace di gestire.
Un attività che è capace di visualizzare le informazioni di un contatto pubblicherà un IntentFilter che dice che essa conosce il modo di gestire l'azione VIEW che verrà applicata ai dati per rappresentare la persona. Le attività pubblicano i propri IntentFilters nel file AndroidManifest.xml.
Navigare da schermata a schermata è compiuto risolvendo gli intents.
Per navigare in avanti, un attività chiama il metodo startActivity(myIntent).
Il sistema cerca l'intent filter tra tutte le applicazioni installate e prende quello che ha il miglior match con myIntent.
La nuova activity verrà informata dell'intent, che causerà la propria esecuzione.
Il processo di risoluzione degli intent viene eseguito a run time quando la startActivity viene chiamata e questo offre 2 benefici:
* Le attività possono riusare funzionalità da altre componenti semplicemente eseguendo una richiesta mediante una Intent.
* Le attività possono essere rimpiazzare in ogni istante da un Activity con lo stesso IntentFilter.

Intent Receiver
Puoi usare un IntentReceiver quando desideri eseguire qualcosa nella tua applicazione in relazione ad un evento esterno. Per esempio, quando il telefono suona, oppure quando una rete è disponibile, oppure quando è mezzanotte. Gli intent receivers non visualizzano una UI, sebbene esse possano usare il NotificationManager per alertare l'utente che qualcosa di interessante stà succedendo.

Gli Intent receivers sono registrati sempre nel file AndroidManifest.xml, ma si possono registrare tramite il codice mediante l'uso dell'istruzione:
Context.registerReceiver();

La tua applicazione non deve essere in esecuzione per ricevere delle chiamate agli intent receivers.
Il sistema eseguirà la tua applicazione, se necessario, quando l'event receiver viene triggerato.

Le applicazioni possono anche inviare il proprio intent in broadcast alle altre applicazioni mediante l'istruzione:
 Context.broadcastIntent();


Service

Un Service è un codice che è in esecuzione come long-lived e viene eseguito senza una UI.
Un buon esempio è il media player che riproduce delle canzoni da una play list.
Mediante una schermata l'utente potrà scegliere i brani da inserire o eliminare dalla playlist. Ma l'utente vorrà anche uscire da questa gestione, in questo caso l'attività del player potrà eseguire un nuovo servizio usando l'istruzione :
Context.startService();

In questo modo il servizio sarà eseguito in background per poter continuare l'esecuzione della musica.
Il sistema quindi continuerà ad eseguire il servizio finchè esso avrà necessità di essere eseguito.
Nota che è possibile connettersi ad un servizio (e farlo partire se esso non è ancora in esecuzione) mediante il comando:
Context.bindService();

Quando si è connessi con un service, puoi comunicare con esso mediante una serie di interfaccie esposte dal servizio.

Content Provider

Le applicazioni possono immagazzinare i dati in files, in un database SQLite, o mediante qualsiasi altro meccanismo abbia senso utilizzare.
Un content provider, comunque, è utile nel caso si voglia che i dati della propria applicazione siano condivisi con altre applicazioni. Un content provider è una classe che implementa un set standard di metodi per permettere alle altre applicazioni di salvare o utilizzare i tipi di dati che sono gestiti dal content provider.

Spero che questo post sia stato utile...buon divertimento :|

15 maggio 2009

Eseguire un backup completo del sistema Android

Il "googleFonino" per quanto stupendo, potente, figo sia naturalmente permettendo l'installazione di applicazioni al di fuori del google Market è soggetto e sarà soggetto come qualsiasi altro dispositivo a problemi legati a software non affidabile.
In questo articolo descriverò brevemente come poter eseguire di tanto in tanto un backup del tuo telefonino in maniera tale da poterlo ripristinare con facilità ad uno stato sicuramente funzionante.

E' necessario innanzitutto far partire android in Recovery mode (HOME+pulsante di accensione) da spento.
Dopo questo primo passo è necessario eseguire un backup (ALT+B)
Nel caso ti interessasse avere maggiori informazioni sullà modalità di recoveri puoi istruirti tramite questo link.

Una volta che nandroid ha eseguito il backup sulla sd, basta recuperare i files dal telefonino e copiarli sul proprio pc.

Scaricati fastboot.exe, e lo usi con i files di nandroid tramite i seguenti comandi:

fastboot.exe flash boot boot.img
fastboot.exe flash recovery recovery.img
fastboot.exe flash system system.img
fastboot.exe flash userdata data.img
fastboot.exe flash cache cache.img

Spero che questo post sia stato utile a molti di voi androidiani.

21 gennaio 2009

Htc G1, arriva in Europa il Google phone

"The wait is over": l'attesa è finita. Così recita lo slogan scelto da T-Mobile per accompagnare l'Htc G1 sulla terraferma del continente europeo. Il primo smartphone equipaggiato con la piattaforma Android, sviluppata da Google, sarà disponibile a partire da fine gennaio anche in Olanda, Repubblica Ceca e Austria. Dal 2 febbraio sarà venduto in Germania e, a seguire, in Polonia. L'Htc G1 aveva già varcato l'Oceano dopo il lancio negli Usa: dallo scorso autunno il telefonino è in vendita anche in Gran Bretagna. Sempre per merito di T-Mobile. Nei cinque nuovi paesi europei il G1 sarà proposto a prezzi stracciati.

Sottoscrivendo il solito contratto con un vincolo di fedeltà di 24 mesi, basterà versare 1 euro per mettersi in tasca il primo GooglePhone. Negli Stati Uniti, lo smartphone con Android, sistema operativo peraltro derivato da Linux, si acquista a 179 dollari.
Nonostante i prezzi aggressivi, giustificati anche dalla necessità di rintuzzare l'Apple iPhone, la dotazione dell'Htc è di tutto rispetto.
Vanta antenna Gps, che opera insieme con Google Maps, e connessioni Umts, Bluetooth e Wi-Fi. In più, il touchscreen da 3,2 pollici (480x320 pixel) ruota rivelando una tastiera Qwerty completa. Non manca nemmeno la fotocamera da 3,2 Mpixel. Con l'apertura di nuovi mercati in Europa, T-Mobile punta a superare il milione di unità vendute in breve tempo: secondo alcune stime, il numero di G1 venduti solo negli Stati Uniti sono tra 400 mila e 600 mila unità (stando ai dati più ottimistici).
E in Italia? Ancora sconosciuti i tempi di commercializzazione di Android; il fatto, però, che lo smartphone sia distribuito da T-Mobile lascia pensare a un possibile accordo con Tim.
Entrambi i gestori sono membri del consorzio Freemove Alliance, oltre che della Open Handset Alliance che comprende provider telefonici e aziende produttrici impegnate nello sviluppo di Android. In quest'ultima categoria rientra, però, anche Vodafone. Dunque, nel Bel Paese, il G1 deve ancora trovare un operatore che decida di importarlo. Anche perché il dispositivo necessita di un pacchetto ad hoc per la navigazione sul Web che consenta di sfruttare appieno le funzioni connesse; per esempio, per scaricare le numerose applicazioni accessorie dall'Android Market che prende spunto dall'AppStore per l'iPhone. E poi il sistema operativo di Google è stato studiato per apparecchi fortemente orientati all'Internet in mobilità. A conti fatti, è ragionevole supporre che in Italia il telefonino sarà in vendita per l'estate. Nel frattempo, stando ad alcune indiscrezioni, Htc starebbe già lavorando al suo successore: il G2. Si vocifera che avrà un display più ampio e funzioni migliorate.

Fonte : Il Sole 24 Ore