Lo sbarco di Google nel pianeta Mobile Internet: primo impatto ed esempi pratici. Riccardo Solimena (Java Italian Portal) Stefano Sanna (JUG Sardegna Onlus) Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Outline ● Who we are ● Android: brevissima introduzione ● Code, please! DEMO! ● Architecture, library, tools ● Android vs Java ME vs iPhone ● Conclusioni Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Riccardo Solimena ● Java Experienced Consultant @ Capgemini – ● ● Past: Java Tech Lead @ Links M&T Technical Writer @ – Java Italian Portal – Java Journal, Keep in tech, Programmazione.it – http://www.google-phone-android.com Musician @ – http://www.youtube.com/riccardosolimena – http://www.sevenotes.com Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Stefano Sanna ● Java ME Tech Lead @ beeweeb technologies ● Professional developer @ JME, iPhone, Android ● Technical writer @ ● – Book “Java Micro Edition” (Hoepli, 2007) – DEV, Java Journal, Computer Programming Blogger @ http://www.gerdavax.it Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Android ● ● Android è una piattaforma open source per la telefonia mobile basata su Linux e Java Dal blog ufficiale: “Android is the first truly open and comprehensive platform for mobile devices. It includes an operating system, user-interface and applications -- all of the software to run a mobile phone, but without the proprietary obstacles that have hindered mobile innovation” Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Non solo Google... Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Caratteristiche principali ● Android è una piattaforma ricca e moderna: – Componenti di sistema riusabili e sostituibili – Dalvik virtual machine – Browser integrato (basato sul motore WebKit) – Grafica avanzata 2D e 3D (OpenGL ES 1.0) – Database SQLite – Ricco supporto ai formati multimediali: MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF – GSM, EDGE, 3G; Bluetooth e WiFi – Fotocamera, GPS, bussola e accelerometro Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Principali caratteristiche ● ● ● ● ● Linguaggio: Java Libreria: Java SE (Apache Harmony, esclusa la parte visual) + Apache Http + Android libraries Dalvik Virtual Machine: ottimizzata per device mobili; totalmente indipendente dalla JVM Sun (e non compatibile con il bytecode standard di Java) Kernel Linux: sistema operativo robusto, efficiente, portabile OPEN SOURCE! Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 HTC G1: il primo! ● 528Mhz Qualcomm 7201 processor ● 64MB RAM, 128MB ROM, 1GB MicroSD card ● 3.1MP camera (no flash) 2048 x 1536 ● Quad Band, UMTS, HSDPA ● Bluetooth, 802.11b/g ● ● Display 3.17" HVGA (480 x 320) GPS + compass Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 HTC G1: per gli utenti ● WebKit browser ● Supporto SMS e MMS ● Audio: MP3, AAC, AAC+, WMA MPEG4, WAV, MIDI, REAL AUDIO, OGG ● Video: H.264, streaming, 3GPP, MPEG4, 3GP ● Email: POP, IMAP, SMTP, AOL e GMail ● IM: AIM, MSN, Yahoo!, GTalk ● Android Market + OTA application delivery Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Cominciamo dai link! ● SDK e documentazione: – ● Sorgente della piattaforma: – ● http://source.android.com/ Open Handset Alliance: – ● http://code.google.com/android http://www.openhandsetalliance.com Android Market: – http://www.android.com/market/ Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Code, please! ● Anziché partire dalla teoria, dall'architettura, dalla documentazione, dalle classi... PARTIAMO DAL CODICE ● Vogliamo realizzare una applicazione di supporto al Java Day, con la lista dei talk, i dettagli di ciascun intervento e la mappa di Roma centrata sulla sede dell'evento Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 DEMO Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Struttura dell'applicazione SQLiteDatabase ListaTalk (Activity) JavaDayMap (Activity) Geocoder ListView MapView ItemAdapter MapController Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Progetto Android Delizioso sorgente Java! File di supporto Immagini XML di layout della UI Stringhe, vettori... Descrittore dell'applicazione Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Modelliamo il talk public class Talk { // getter e setter omessi per brevità... private int keyId; private String talkName; private int numRoom; private String abstractTalk; private String speech; private String time; public Talk(int keyId, String talkName, int numRoom, String abstractTalk, String speech, String time) { super(); this.keyId = keyId; this.talkName = talkName; this.numRoom = numRoom; this.abstractTalk = abstractTalk; this.speech = speech; this.time = time; } Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Tutto inizia con un'Activity... public class ListaTalk extends Activity { private ArrayList<Talk> talkItems; private ListView talkList; private TalkItemAdapter adapter; private TalkDAO talkDAO; private Cursor talkCursor; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); talkList = (ListView)findViewById(R.id.talkList); talkItems = new ArrayList<Talk>(); int resID = R.layout.talk_item; adapter = new TalkItemAdapter(this, resID, talkItems); talkList.setAdapter(adapter); // inizializzazione popup (next slide) talkDAO = new TalkDAO(this); talkDAO.open(); populateTodoList(); } Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Creiamo la popup final Builder builder = new AlertDialog.Builder(this); talkList.setOnItemClickListener(new OnItemClickListener() { //@Override public void onItemClick(AdapterView<?> a, View v, int pos, long arg3) { Talk talkSelected = (Talk)talkList.getItemAtPosition(pos); builder.setTitle( ... ); builder.setMessage( ... ); builder..setPositiveButton("Chiudi", new android.content.DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, final int arg1) { } }).show(); } }); Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Riempire l'elemento della lista public class TalkItemAdapter extends ArrayAdapter<Talk> { int layoutID; public TalkItemAdapter(Context _context, int _resource, List<Talk> _talkItems) { super(_context, _resource, _talkItems); layoutID = _resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout todoView; Talk item = getItem(position); String talkName = item.getTalkName(); String time = item.getTime(); Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Riempire l'elemento della lista if (convertView == null) { todoView = new LinearLayout(getContext()); String inflater = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi = (LayoutInflater) getContext().getSystemService(inflater); vi.inflate(layoutID, todoView, true); } else { todoView = (LinearLayout) convertView; } TextView talkNameView = (TextView) todoView.findViewById(R.id.row); TextView talkTimeView = (TextView) todoView.findViewById(R.id.rowTime); talkNameView.setText(talkName); talkTimeView.setText(time); return todoView; } } Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Dov'è l'interfaccia grafica? ● ● ● Android consente di definire i componenti grafici e il loro layout sulla UI attraverso file XML Ad ogni componente è associato un riferimento univoco attraverso la classe R (resources) Nel codice è possibile: – caricare layout e componenti XML e assegnarli alla vista corrente – modificarne i parametri – create nuove viste programmaticamente Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 ListaTalk <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/talkList" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 TalkItem <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/notepad_paper"> <TextView android:id="@+id/rowTime" android:layout_width="wrap_content" android:layout_height="fill_parent" android:padding="10dp" android:scrollbars="vertical" android:fadingEdge="vertical" android:textColor="@color/notepad_text" android:layout_alignParentRight="true" /> <TextView android:id="@+id/row" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:scrollbars="vertical" android:fadingEdge="vertical" android:textColor="@color/notepad_text" android:layout_alignParentLeft="@+id/rowTime" /> </LinearLayout> Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Piccola rivoluzione ● ● Una applicazione può: – estendere Activity di libreria (ad esempio, la MapActivity) – invocare Activity di sistema (ad esempio, per avviare il browser o effettuare una chiamata) – esportare le proprie activity rendendole disponibili ad altre applicazioni (ad esempio, per l'accesso ad un servizio o una procedura proprietaria) Le Activity e i messaggi (Intent) per attivarle sono definite nel Manifest dell'applicazione Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Manifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.javaday.android.roma2009" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/ app_name"> <activity android:name=".ListaTalk" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> .... </manifest> Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Richiamare le mappe @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("Map"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { startActivity(new Intent("it.javaday.android.roma2009.MAP")); return super.onOptionsItemSelected(item); } Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Location-based Service ● Android è equipaggiato con una ricca libreria per la realizzazione di applicazioni georeferenziate integrate con i servizi di Google: – LocationManager: per determinare la posizione corrente con GPS o sistemi alternativi – Geocoder: per la trasformazione di indirizzi in coordinate geografiche e viceversa – MapView: per la visualizzazione di mappe, complete di controlli di zoom, scrolling e sovrapposizione di layer personalizzati e interattivi Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Visualizzare una mappa ● Per visualizzare una mappa (centrata su un indirizzo noto) all'interno di una applicazione occorre: – includere la libreria com.google.android.maps e richiedere la user-permission INTERNET – scrivere una nuova Activity che estenda MapView – ottenere le Android Maps API Key associate ai propri certificati di sviluppo e di pubblicazione (maggiori dettagli sul sito http://code.google.com/android) Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Mappe nell'applicazione ● Nel Manifest occorre specificare l'uso della libreria e ottenere i permessi per la localizzazione (se si usa il GPS) e la connettività: <application ...> <uses-library android:name="com.google.android.maps" /> <activity android:name=".JavaDayMap" android:label="@string/app_name"> <intent-filter> <action android:name="it.javaday.android.roma2009.MAP" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"/> Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Estendiamo MapActivity public class JavaDayMap extends MapActivity { private MapView mapView; private MapController mapController; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // map code here!!!!!! } Slide successive @Override protected boolean isRouteDisplayed() { return false; } } Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Usiamo il Geocoder Il Geocoder trasforma l'indirizzo testuale in latitudine/longitudine try { Geocoder coder = new Geocoder(getApplicationContext()); List<Address> result = coder.getFromLocationName("Roma, Via Vasca Navale", 1); Double lat = result.get(0).getLatitude() * 1E6; Double lon = result.get(0).getLongitude() * 1E6; GeoPoint geopoint = new GeoPoint(lat.intValue(), lon.intValue()); } Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Mostriamo la mappa mapView = (MapView) findViewById(R.id.mapview); MapView.LayoutParams lp = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT, 160, 430, MapView.LayoutParams.BOTTOM_CENTER); View zoomControls = mapView.getZoomControls(); mapView.addView(zoomControls, lp); mapView.displayZoomControls(true); mapController = mapView.getController(); mapController.setCenter(geopoint); mapController.setZoom(17); Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Architettura di Android Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Quattro entità fondamentali ● ● ● ● Activity: moduli applicativi visuali e componibili con cui interagisce l'utente (una mappa, una lista di messaggi...) Service: logiche applicative prive di UI, invocabili da Activity ed eseguibili in background Broadcast Intent Receiver: consente l'interazione dell'applicazione con gli eventi del telefono, ricevendo e inviando notifiche Content Provider: consentono salvataggio, ricerca e condivisione dati tra applicazioni Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 View e widget ● Android dispone di una ricca libreria di viste e widget, altamente configurabili e personalizzabili Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Ambiente di sviluppo ● ● SDK dedicato che comprende compilatore per il formato .dex (Dalvik Executable) ed emulatore Plug-in per Eclipse che consente la gestione di progetti Android all'interno dell'ambiente di sviluppo Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Android Market ● ● ● Sulla scia dell'App Store dell'iPhone, Android dispone di un sistema integrato di distribuzione delle applicazioni: l'Android Market Attualmente dispone di poco meno di 1000 applicazioni (contro le 15000 dell'App Store) ed è limitato a software gratuito Attivo in USA e UK, in primavera arriverà in altre nazioni (Italia inclusa!) e consentirà la vendita di applicazioni. Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Android vs Java ME ● ● Java ME è la tecnologia di mobile computing più diffusa in assoluto, ma soffre di alcuni problemi: – il disegno originale è del 2001: la retrocompatibilità comincia a pesare – la frammentarietà delle implementazioni rende difficoltoso il porting e precaria la compatibilità Android è stato progettato per dispositivi moderni: un confronto con Java ME è quasi fuori luogo. D'altro canto, però, Android gira su un solo telefono: probabilmente tra 1-2 anni la situazione cambierà... Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Android vs iPhone OS ● Android e iPhone OS hanno caratteristiche simili, anche se: – Android sembra pensato per i programmatori: l'architettura modulare di Android consente mash-up tra applicazioni; è possibile interazione a basso livello e esecuzione in background; – iPhone OS è evidentemente pensato per gli utenti: il look & feel di CocoaTouch, l'interfaccia multitouch e le guideline di iPhone OS sono estremamente innovativi e hanno segnato un punto di svolta per il mondo della telefonia mobile Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 G1 o iPhone? ● ● ● Questo è ciò che si chiedono tutti: Google o Apple? iPhone o anti-iPhone? Il presente è certamente iPhone: oltre 10M di terminali, 15K applicazioni, 500M download Android sarà protagonista (?) del 2009, con la commercializzazione di nuovi dispositivi e l'allargamento a nuovi mercati Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 Conclusioni ● ● ● Android è una piattaforma di sviluppo potente, flessibile e innovativa: il futuro della telefonia mobile passerà certamente per questa strada L'architettura modulare e l'integrazione con i servizi di Google consente lo sviluppo di applicazioni Mobile Internet avanzate L'Android Market potrà essere una buona opportunità per gli sviluppatori indipendenti Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009 GRAZIE! ● ● Riccardo Solimena – web: http://www.riccardosolimena.com – Skype: riccardo.solimena – email: [email protected] Stefano Sanna – web: http://www.gerdavax.it – Skype: gerdavax – email: [email protected] Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna Javaday Roma III Edizione – 24 gennaio 2009