SlideShare una empresa de Scribd logo
1 de 49
Taller

Mi Primera Aplicación Android




                    Alberto Alonso Ruibal
                    alberto.ruibal@mobialia.com
                    http://www.mobialia.com
                    T: @mobialia @albertoruibal
Nuestra aplicación: Wikiplaces

Obtendrá los lugares de la Wikipedia cerca de
nuestra posición mostrándolos en un mapa y en una
lista
Veremos ejemplos de:
●   Layouts, ListViews, PreferenceActivity...
●   API de geolocalización
●   API de Google Maps
●   Obtención de datos mediante JSON
Desarrollar para Android
●   Lenguaje Java
●   También posible en C, hay un
    NDK
●   API muy completa y sencilla
●   SDK para Linux/Windows/Mac
    con emulador
●   Eclipse IDE (es la opción oficial,
    hay otras posibilidades como
    IntelliJ IDEA)
El SDK de Android
●   http://developer.android.com/sdk/
●   En el SDK/AVD manager se seleccionan las
    plataformas necesarias y se descargan
●   También permite configurar los dispositivos
    emulados
(Virtual Devices)
El emulador
●   Permite simular distintos dispositivos / tamaños
    de pantala
●   Completamente funcional aunque algo lento
Eclipse IDE
IDE muy versátil para Java, PHP, C++...
http://www.eclipse.org
Instalación del plugin ADT
●   Abrir Eclipse
●   Seleccionar Help → Software Updates… →
    Available Software
●   En la ventana escoger “Add Site” , e introducir la
    ubicación:
https://dl-ssl.google.com/android/eclipse/
Crear un nuevo proyecto en Eclipse
File->New->Android Project
Cubrimos los detalles con:
Project name: WikiPlaces
Build Target : Google APIs 1.6
Application name: WikiPlaces
Package name:
 com.mobialia.wikiplaces
Create Activity: WikiPlaces
Min SDK Version: 4
Pulsa Finish
Componentes de una aplicación
Se definen en el AndroidManifest.xml, en el cual
también se indican los permisos necesarios, la
versión de Android exigida, etc
●   Actividades
●   Servicios
●   Intents: sistema de comunicación entre
    aplicaciones/actividades
Estructura de directorios
src/             Código fuente
gen/             Archivos generados a partir de los recursos
assets/          Ficheros a los que va a acceder la aplicación
res/             Carpeta de recursos
| drawable-hdpi/ Imágenes alta resolución (dpi)
| drawable-ldpi/ Imágenes baja resolución
| drawable-mdpi/ Imágenes media resolución
| layout/        Disposición de elementos en pantalla
| raw/           Archivos de datos (sonidos por ejemplo)
| values/        Definición de textos, colores, estilos, etc
| values-es/     Cadenas localidadas a un idimoa linguaxe
Primera actividad: Dashboard

Vamos a implementar en la clase WikiPlacesActivity
un Dashboard desde el cual accederemos a las
distintas secciones de la aplicación:
●   Ver un mapa
●   Ver una lista
●   Actualizar los datos
●   Acceder a las preferencias
Utilizaremos los patrones Dashboard y ActionBar
http://www.google.com/events/io/2010/sessions/android-ui-design-patterns.html
Ciclo de vida de las Actividades
Hay varios métodos
dentro de nuestra
actividad que son
llamados cuando
cambia de estado
Definición del Layout
●   ViewGroups:
    LinearLayout,
    TableLayout,
    RelativeLayout...
●   Views: TextView,
    ListView, o
    personalizadas
●   Editor WYSIWYG: pero
    siempre es mejor acudir
    al XML
Dashboard: Layout
Crearemos un res/layout/dashboard.xml para el cual
nos debería llegar con:
●   LinearLayout
●   Button, ImageButton,Textview
Simplificaremos el layout utilizando:
●   values/strings.xml para las cadenas de texto
●   values/colors.xml para los colores
●   values/styles.xml para los estilos
http://www.alonsoruibal.com/using-styles-on-android-layouts/
Dashboard: Activity
En la clase WikiplacesActivity introduciremos:
public void onCreate(Bundle bundle) {
    super.onCreate(icicle);
    // Quitamos la barra de título
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    requestWindowFeature(Window.FEATURE_PROGRESS);
    // Establecemos el contenido
    setContentView(R.layout.dashboard);
}
Dashboard: Botones con imágenes
 ●   drawable_hdpi/dashboard_preferences_default.png
 ●   drawable_hdpi/dashboard_preferences_selected.png
 ●   drawable/dashboard_preferences.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" android:drawable="@drawable/dashboard_preferences_selected"/>
  <item android:state_pressed="true" android:drawable="@drawable/dashboard_preferences_selected"/>
  <item android:state_focused="false" android:state_pressed="false"
android:drawable="@drawable/dashboard_preferences_default"/>
</selector>
 ●   Y en nuestro layout ponemos:
<Button style="@style/DashBoardAction"
 android:drawableTop="@drawable/dashboard_preferences"
 android:text="@string/dashboard_preferences"
 android:onClick="onPreferencesAction"
/>
 ●   Al pulsarlo llamará al método onPreferencesAction de nuestra
     actividad
public void onPreferencesAction(View v) {
...
}
Lanzando otra actividad: Intents
 ●   Por ejemplo, para lanzar una nueva actividad
     cuando pulsamos el botón de preferencias:
public void onPreferencesAction(View v) {
  Intent intent = new Intent(getApplicationContext(), PreferencesActivity.class);
  startActivity(intent);
}
 ●   Creamos la nueva clase de la actividad: también
     debemos añadirla en el AndroidManifest.xml:
     <activity android:name="PreferencesActivity"
            android:label="@string/app_name">
       <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.EMBED" />
       </intent-filter>
     </activity>
Actividad para las prefencias
●   La clase de la Actividad es tremendamente sencilla:
public class PreferencesActivity extends PreferenceActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     // Load the preferences from an XML
     addPreferencesFromResource(R.layout.preferences);
  }
}
●   En layout/preferences.xml definimos los campos que
    va a tener nuestra pantalla de preferencias con
    ListPreference, CheckboxPreference,
    EditTextPrefrence...
Definiendo preferencias en el XML
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android">
      <ListPreference
          android:key="distance"
          android:title="@string/preferences_distance"
          android:summary="@string/preferences_distance_summary"
          android:entries="@array/distances_texts"
          android:entryValues="@array/distances_values"
          android:dialogTitle="@string/preferences_distance"
          android:defaultValue="20"
          android:selectable="true"
          />
     <CheckBoxPreference
          android:key="satellite"
          android:title="@string/preferences_satellite"
          android:summary="@string/preferences_satellite_summary"
          android:defaultValue="false"/>
     <CheckBoxPreference
          android:key="fullscreen"
          android:title="@string/preferences_fullscreen"
          android:summary="@string/preferences_fullscreen_summary"
          android:defaultValue="false"/>
</PreferenceScreen>
Obteniendo valores de preferencias
●   Ya de nuevo en el onResume de WikiplacesActivity
    vamos a obtener la preferencia “fullscreen” y actuar en
    función de su valor:
SharedPreferences sharedPref =
   PreferenceManager.getDefaultSharedPreferences(this);
fullscreen = sharedPref.getBoolean("fullscreen", false);

if (fullscreen) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                         WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
    getWindow().setFlags(0,
                         WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
Obteniendo la ubicación (I)
●   Para hacer que nuestra actividad principal obtenga la ubicación,
    primero añadimos los permisos en el AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
●   Después implementamos LocationListener
.... implements LocationListener

public void onLocationChanged(Location location) {
  Log.d(TAG, “Location Received!!!!”);
}

public void onProviderDisabled(String provider) {}

public void onProviderEnabled(String provider) {}

public void onStatusChanged(String provider, int status, Bundle extras) {}
Obteniendo la ubicación (II)
●   Ahora solicitamos actualizaciones de la ubicación con dos proveedores
    de ubicación (sí dos!):
manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

Criteria criteria = new Criteria();
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);

criteria.setAccuracy(Criteria.ACCURACY_FINE);
providerFine = manager.getBestProvider(criteria, true);

criteria.setAccuracy(Criteria.ACCURACY_COARSE);
providerCoarse = manager.getBestProvider(criteria, true);

if (providerCoarse != null) manager.requestLocationUpdates(providerCoarse, 5*60000, 100,
this); // update each 5 minutes
if (providerFine != null) manager.requestLocationUpdates(providerFine, 5*60000, 100, this
); // update each 5 minutes

http://www.alonsoruibal.com/using-two-locationproviders-on-android/
Simulando la ubicación en el
              emulador
●   Nuestro ordenador no
    tiene GPS, pero el
    emulador nos permite
    “simular” ubicaciones
    introduciendo longitud
    y latitud
Obteniendo los datos a mostrar
●   Añadir a la aplicación el permiso para conectarse Internet
<uses-permission android:name="android.permission.INTERNET" />
●   Utilizaremos los servicios de GeoNames
    http://www.geonames.org/
●   Primero creamos una cuenta en
    http://www.geonames.org/login
●   Y habilitamos los “Free Web Services” en:
    http://www.geonames.org/manageaccount
●   Para el ejemplo podremos usar la cuenta “mobialia” en lugar
    de crear una
Servicio JSON de GeoNames
 ●   Acrónimo de JavaScript Object Notation
 ●   Más fácil de utilizar que los servicios XML
 ●   Utilizaremos el WebService:
     findNearbyWikipediaJSON al que le pasamos,
     “lat”, “lng”, “radius”, “maxRows” y “username”
 ●   Ejemplo de petición JSON a Geonames:
http://api.geonames.org/findNearbyWikipediaJSON?lat=47&lng=9&username=mobialia
Almacenando los datos recibidos
●   Creamos una clase contenedora “Wikiplace” con los campos
    que nos devuelve el WebService JSON
●   Otra clase “WikiplacesData” nos gestionará las peticiones al
    servidor y almacenará los resultados en memoria, en un
    ArrayList<Wikiplace>
●   Android tiene integrada una librería para procesar JSON:
JSONObject base = new JSONObject(dataString);
JSONArray data = base.getJSONArray("geonames");

for (int i = 0; i < data.length(); i++) {
   JSONObject obj = data.getJSONObject(i);
   Wikiplace wikiplace = new Wikiplace();
   wikiplace.setLat(obj.getDouble("lat"));
   ..
Mostrando un Mapa: MapActivity
●   Creamos una actividad que extienda MapActivity
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    //..
    setContentView(R.layout.wikiplaces_map);

    mapView = (MapView)findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapView.getController().setZoom(14);
    //...
}
●   Y definimos el layout wikiplaces_map.xml, pero antes
    debemos obtener una API key
Obteniendo una clave para el mapa
●   Debemos ir a esta URL
http://code.google.com/intl/gl/android/maps-api-signup.html
●   Nos pedirá el “Certificate fingerprint”, que se obtiene así:
keytool -list -keystore ~/.android/debug.keystore
●   Luego ponemos la API key en el tag XML del mapa:
    <com.google.android.maps.MapView
       android:id="@+id/mapview"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1"
       android:clickable="true"
       android:apiKey="0ty0JlR1lTjC5kB1dCPHOPbNscmPlSKGDA1KQug"
    />
Overlays sobre el Mapa
●   En primer lugar añadiremos un overlay que
    muestre nuestra ubicación:
List<Overlay> overlays = mapView.getOverlays();
myLocationOverlay = new MyLocationOverlay(this, mapView
);
overlays.add(myLocationOverlay);

●   El siguiente paso será hacer un overlay
    personalizado en el que mostremos los datos
    de Wikiplaces
Overlays personalizados (I)
●   Extendemos la clase Overlay:
public class WikiplacesOverlay extends Overlay {

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
  Projection projection = mapView.getProjection();
  // Por cada uno de los lugares obtenemos su geopoint...
  // ..
  // Transformamos el geoPoint en píxeles
  Point point = new Point();
  projection.toPixels(geoPoint, point);
  // Y finalmente pintamos “algo” en esa ubicación
  Paint paint = new Paint();
  paint.setColor(Color.BLACK);
  canvas.drawText(“texto”, point.x, point.y, paint);
}
Overlays personalizados (II)
●   El Overlay tiene un método que se llama
    cuando el usuario pulsa en la pantalla
@Override
public boolean onTap(GeoPoint point, MapView mapView) {
  /...
}
●   Para buscar el GeoPoint más cercano nos
    recorremos los Wikiplaces utilizando un
    DistanceCalculator
Añadiendo un menú (I)
    ●   Primero creamos el menú interceptando
        onCreateOptionsMenu
public static final int MENU_MY_LOCATION = 1;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
  menu.add(0, MENU_MY_LOCATION, 0,
R.string.menu_my_location).setIcon(drawable.ic_menu_mylocation);
        return true;
}
Añadiendo un menú (II)
●   Respondemos a la acción cuando el menú es seleccionado
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    GeoPoint geoPoint = null;
    switch (item.getItemId()) {
        case MENU_MY_LOCATION:
         geoPoint = myLocationOverlay.getMyLocation();
         if (geoPoint != null) mapView.getController().animateTo(geoPoint);
         return true;
    }
    return false;
}
Pedir datos al tener la ubicación
●   En el WikiplacesActivity:
public void onLocationChanged(Location location) {
  geoPoint = location2GeoPoint(location);
  wikiplacesData.setLocationPoint(geoPoint);
  wikiplacesData.getDataFromServer(this);
}
●   Hay que convertir el location a un Geopoint:
private GeoPoint location2GeoPoint(Location location) {
   if (location == null) return null;
   int latitude = (int) (location.getLatitude()*1E6);
   int longitude = (int) (location.getLongitude()*1E6);
   return new GeoPoint(latitude, longitude);
}
Mostrar los datos en una lista
●   Creamos una nueva actividad WikiplacesListActivity
    extendiendo ListActivity
●   Creamos el layout/wikiplaces_list.xml:
<ListView android:id="@id/android:list"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:layout_weight="1"
 android:drawSelectorOnTop="false"
 android:background="@color/background"
 android:cacheColorHint="#00000000"
/>
●   Creamos un adapter personalizado
setContentView(R.layout.wikiplaces_list);
adapter = new WikiplacesAdapter(getApplicationContext());
setListAdapter(adapter);
Adapter personalizado
●   El adapter gestiona los datos a mostrar en la lista
public class WikiplacesAdapter extends BaseAdapter {

●   Definimos un layout para cada elemento de la lista
    en layout/wikiplaces_adapter.xml
●   El método getView devolverá la vista
    correspondiente a un elemento
public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout ll = (LinearLayout) LayoutInflater.from(mContext
).inflate(R.layout.wikiplaces_adapter, parent, false);
    Wikiplace wikiplace = wikiplacesData.getWikiplace(position);
    TextView title = (TextView) ll.findViewById(R.id.Title);
    title.setText(wikiplace.getTitle());
}
Respondiendo al click en la lista
●   Cuando se pulsa sobre un elemento de la lista
    se llama al método onListItemClick de la
    actividad:
@Override
protected void onListItemClick(ListView l, View v, int position,
long id) {
   super.onListItemClick(l, v, position, id);
   Log.d(TAG, “Elemento seleccionado”);
}
Pasando parámetros en un intent
●    Al intent podemos pasarle un Bundle en los
     extras:
    Intent intent = new Intent(this, WikiplacesDetailActivity.class);
    Bundle bundle = new Bundle();
    bundle.putInt("selectedPlace", position);
    bundle.putBoolean("calledFromMap", false);
    intent.putExtras(bundle);
    startActivity(intent);

●    Y en el onCreate de la actividad llamada:
    Bundle extras = getIntent().getExtras();
    selectedPlace = extras.getInt("selectedPlace");
    calledFromMap = extras.getBoolean("calledFromMap");
Actividad con el detalle
●   Crearemos una actividad
    WikiplacesDetailActivity en la cual mostraremos
    los detalles para un lugar seleccionado
●   Desde esta actividad añadiremos botones para
    lanzar un navegador web con la URL de
    wikipedia o Google Maps Navigation con las
    instrucciones de navegación
Lanzar el navegador web
●   Respondemos a la pulsación del botón “web”
●   Creamos un intent “ACTION_VIEW” pasándole
    la URL que queremos mostrar
public void onWebAction(View v) {
  String uri = "http://" +
        wikiplacesData.getWikiplace(selectedPlace).getWikipediaUrl();
  Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW,
                               Uri.parse(uri));
  startActivity(myIntent);
}
Lanzando Google Maps Navigation
● En el layout del detalle creamos un botón con
  android:onClick=“onNavigateAction”
● En el Activity, creamos el método asociado que

  lanzará el intent de Google Maps Navigation
public void onNavigateAction(View v) {
 GeoPoint point = gasStationData.getWikiplace(selectedPlace).getGeoPoint();

    String uri = "google.navigation:q="
     +Double.valueOf(point.getLatitudeE6()/1000000+","
     +Double.valueOf(point.getLongitudeE6())/1000000;

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri));
    startActivity(myIntent);
}
Monetizar las aplicaciones

Hay tres opciones:
●   Vender directamente en
    Android Market
●   Insertar publicidad en las
    aplicaciones: Admob
●   Desarrollar por encargo
Insertando anuncios de AdMob (I)
●   Crear una cuenta en http://www.admob.com
●   Crear la aplicación en “Sites & Apps” y obtener el Publisher ID
●   1) Descargar GoogleAdMobAdsSdk-4.1.0.jar, situarlo en /lib y
    añadirlo al Build Path del proyecto
●   2) Añadir en AndroidManifest.xml la definición del AdActivity y
    los permisos INTERNET y ACCESS_NETWORK_STATE
    ...
    <!-- Ad Activity definition -->
    <activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation"/>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Insertando anuncios de AdMob (II)

●   3) Añadimos en cada XML de layout con anuncio la
    definición del namespace ads
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
●   4) Añadimos el AdView en el layout donde
    mostaremos el anuncio:
<com.google.ads.AdView
 android:id="@+id/adView"
 style="@style/Ad"
 ads:adUnitId="a14d77a33a8b395"
 ads:adSize="BANNER"
/>
Insertando anuncios de AdMob (III)
5) Cargamos el anuncio desde cada actividad:
AdRequest adRequest = new AdRequest();
AdView adView = (AdView)this.findViewById(R.id.adView)
adView.loadAd(adRequest);

6) Como extra, establecemos la ubicación cuando
dispongamos de ella:
adRequest.setLocation(location);
Otras consideraciones sobre AdMob
●   Podemos poner anuncios sin geolocalización,
    pero obtenemos mejores ratios si la habilitamos
●   “Debemos” especificar cuáles son nuestros
    terminales de prueba en el onCreate():
AdManager.setTestDevices( new String[]
{ "122E56EF9F911CBBA412F67B094A786A" } );
●   Interesante posibilidad de introducir “House
    Ads”
Publicar en Android Market
Crear una cuenta de desarrollador:
http://market.android.com/publish
Antes de publicarla es necesario
exportar un fichero APK firmado
con un certificado definitivo
Vemos ejemplo práctico...
Exportar APK firmado
En el menú contextual del proyecto:
Android Tools-> Export Signed Application package
●   Muy importante el nombre del paquete
●   El certificado se genera desde Eclipse
●   Obligatorio antes de publicar unha aplicación en
    el Market
●   Las actualizaciones sucesivas de la aplicación
    deben ser firmadas con el mismo certificado
●   Mucho cuidado con perder el certificado!!!
Mobialia
Start-up desarrollando exclusivamente
aplicaciones Android
●   Mobialia Chess
●   Connect-4
●   Gasolineras España
●   ...
http://www.mobialia.com
Consultas, preguntas...



Gracias por vuesta atención



               Alberto Alonso Ruibal
               alberto.ruibal@mobialia.com
               http://www.mobialia.com
               T: @mobialia @albertoruibal

Más contenido relacionado

Destacado

Android de la A a la z componentes de una aplicacion ulises gonzalez
Android de la A a la z   componentes de una aplicacion ulises gonzalezAndroid de la A a la z   componentes de una aplicacion ulises gonzalez
Android de la A a la z componentes de una aplicacion ulises gonzalezAndroid UNAM
 
Taller Android Navaja Negra 5 ED
Taller Android Navaja Negra 5 EDTaller Android Navaja Negra 5 ED
Taller Android Navaja Negra 5 EDmirojo
 
Arquitectura, aplicaciones y seguridad en Android
Arquitectura, aplicaciones y seguridad en AndroidArquitectura, aplicaciones y seguridad en Android
Arquitectura, aplicaciones y seguridad en AndroidEventos Creativos
 

Destacado (6)

LIBRO DE ANDROID
LIBRO DE ANDROID LIBRO DE ANDROID
LIBRO DE ANDROID
 
Android de la A a la z componentes de una aplicacion ulises gonzalez
Android de la A a la z   componentes de una aplicacion ulises gonzalezAndroid de la A a la z   componentes de una aplicacion ulises gonzalez
Android de la A a la z componentes de una aplicacion ulises gonzalez
 
Android development session 2 - intent and activity
Android development   session 2 - intent and activityAndroid development   session 2 - intent and activity
Android development session 2 - intent and activity
 
Taller Android Navaja Negra 5 ED
Taller Android Navaja Negra 5 EDTaller Android Navaja Negra 5 ED
Taller Android Navaja Negra 5 ED
 
Android Platform Architecture
Android Platform ArchitectureAndroid Platform Architecture
Android Platform Architecture
 
Arquitectura, aplicaciones y seguridad en Android
Arquitectura, aplicaciones y seguridad en AndroidArquitectura, aplicaciones y seguridad en Android
Arquitectura, aplicaciones y seguridad en Android
 

Similar a LabAndroid: Taller "Mi Primera Aplicación Android"

MobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidMobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidAlberto Ruibal
 
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...leofishman
 
Appcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en AndroidAppcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en AndroidAlberto Ruibal
 
Tema 4 3_1_interfaces_de_usuario
Tema 4 3_1_interfaces_de_usuarioTema 4 3_1_interfaces_de_usuario
Tema 4 3_1_interfaces_de_usuarioCarlos A. Iglesias
 
Tema 4 3_3_interfaces_de_usuario
Tema 4 3_3_interfaces_de_usuarioTema 4 3_3_interfaces_de_usuario
Tema 4 3_3_interfaces_de_usuarioCarlos A. Iglesias
 
IOF Labs Weekend - Android (27082011)
IOF Labs Weekend - Android (27082011)IOF Labs Weekend - Android (27082011)
IOF Labs Weekend - Android (27082011)repcax
 
Tema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuarioTema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuarioCarlos A. Iglesias
 
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidTutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidLuis Ernesto Castillo Alfaro
 
Sesion 11 Teoria.pdf
Sesion 11 Teoria.pdfSesion 11 Teoria.pdf
Sesion 11 Teoria.pdfDianaSullcav
 
UDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualUDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualAnder Martinez
 

Similar a LabAndroid: Taller "Mi Primera Aplicación Android" (20)

MobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidMobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a Android
 
Android bootcamp 101 v2.0
Android bootcamp 101 v2.0Android bootcamp 101 v2.0
Android bootcamp 101 v2.0
 
Android
AndroidAndroid
Android
 
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
 
Introduccion a Android
Introduccion a AndroidIntroduccion a Android
Introduccion a Android
 
Appcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en AndroidAppcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en Android
 
Tema 4.5 interfaces
Tema 4.5 interfacesTema 4.5 interfaces
Tema 4.5 interfaces
 
Clases de Programación Android
Clases de Programación AndroidClases de Programación Android
Clases de Programación Android
 
Tema 4 3_1_interfaces_de_usuario
Tema 4 3_1_interfaces_de_usuarioTema 4 3_1_interfaces_de_usuario
Tema 4 3_1_interfaces_de_usuario
 
Tema 4 3_3_interfaces_de_usuario
Tema 4 3_3_interfaces_de_usuarioTema 4 3_3_interfaces_de_usuario
Tema 4 3_3_interfaces_de_usuario
 
IOF Labs Weekend - Android (27082011)
IOF Labs Weekend - Android (27082011)IOF Labs Weekend - Android (27082011)
IOF Labs Weekend - Android (27082011)
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Tema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuarioTema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuario
 
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidTutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
 
Un atlas en la palma de la mano
Un atlas en la palma de la manoUn atlas en la palma de la mano
Un atlas en la palma de la mano
 
Curso Desarrollo Android
Curso Desarrollo AndroidCurso Desarrollo Android
Curso Desarrollo Android
 
Sesion 11 Teoria.pdf
Sesion 11 Teoria.pdfSesion 11 Teoria.pdf
Sesion 11 Teoria.pdf
 
Android Superstar - Buenas Prácticas
Android Superstar - Buenas PrácticasAndroid Superstar - Buenas Prácticas
Android Superstar - Buenas Prácticas
 
UDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualUDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextual
 
DotNetDom: El futuro de Xamarin
DotNetDom: El futuro de XamarinDotNetDom: El futuro de Xamarin
DotNetDom: El futuro de Xamarin
 

Último

El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramDIDIERFERNANDOGUERRE
 

Último (20)

El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ram
 

LabAndroid: Taller "Mi Primera Aplicación Android"

  • 1. Taller Mi Primera Aplicación Android Alberto Alonso Ruibal alberto.ruibal@mobialia.com http://www.mobialia.com T: @mobialia @albertoruibal
  • 2. Nuestra aplicación: Wikiplaces Obtendrá los lugares de la Wikipedia cerca de nuestra posición mostrándolos en un mapa y en una lista Veremos ejemplos de: ● Layouts, ListViews, PreferenceActivity... ● API de geolocalización ● API de Google Maps ● Obtención de datos mediante JSON
  • 3. Desarrollar para Android ● Lenguaje Java ● También posible en C, hay un NDK ● API muy completa y sencilla ● SDK para Linux/Windows/Mac con emulador ● Eclipse IDE (es la opción oficial, hay otras posibilidades como IntelliJ IDEA)
  • 4. El SDK de Android ● http://developer.android.com/sdk/ ● En el SDK/AVD manager se seleccionan las plataformas necesarias y se descargan ● También permite configurar los dispositivos emulados (Virtual Devices)
  • 5. El emulador ● Permite simular distintos dispositivos / tamaños de pantala ● Completamente funcional aunque algo lento
  • 6. Eclipse IDE IDE muy versátil para Java, PHP, C++... http://www.eclipse.org Instalación del plugin ADT ● Abrir Eclipse ● Seleccionar Help → Software Updates… → Available Software ● En la ventana escoger “Add Site” , e introducir la ubicación: https://dl-ssl.google.com/android/eclipse/
  • 7. Crear un nuevo proyecto en Eclipse File->New->Android Project Cubrimos los detalles con: Project name: WikiPlaces Build Target : Google APIs 1.6 Application name: WikiPlaces Package name: com.mobialia.wikiplaces Create Activity: WikiPlaces Min SDK Version: 4 Pulsa Finish
  • 8. Componentes de una aplicación Se definen en el AndroidManifest.xml, en el cual también se indican los permisos necesarios, la versión de Android exigida, etc ● Actividades ● Servicios ● Intents: sistema de comunicación entre aplicaciones/actividades
  • 9. Estructura de directorios src/ Código fuente gen/ Archivos generados a partir de los recursos assets/ Ficheros a los que va a acceder la aplicación res/ Carpeta de recursos | drawable-hdpi/ Imágenes alta resolución (dpi) | drawable-ldpi/ Imágenes baja resolución | drawable-mdpi/ Imágenes media resolución | layout/ Disposición de elementos en pantalla | raw/ Archivos de datos (sonidos por ejemplo) | values/ Definición de textos, colores, estilos, etc | values-es/ Cadenas localidadas a un idimoa linguaxe
  • 10. Primera actividad: Dashboard Vamos a implementar en la clase WikiPlacesActivity un Dashboard desde el cual accederemos a las distintas secciones de la aplicación: ● Ver un mapa ● Ver una lista ● Actualizar los datos ● Acceder a las preferencias Utilizaremos los patrones Dashboard y ActionBar http://www.google.com/events/io/2010/sessions/android-ui-design-patterns.html
  • 11. Ciclo de vida de las Actividades Hay varios métodos dentro de nuestra actividad que son llamados cuando cambia de estado
  • 12. Definición del Layout ● ViewGroups: LinearLayout, TableLayout, RelativeLayout... ● Views: TextView, ListView, o personalizadas ● Editor WYSIWYG: pero siempre es mejor acudir al XML
  • 13. Dashboard: Layout Crearemos un res/layout/dashboard.xml para el cual nos debería llegar con: ● LinearLayout ● Button, ImageButton,Textview Simplificaremos el layout utilizando: ● values/strings.xml para las cadenas de texto ● values/colors.xml para los colores ● values/styles.xml para los estilos http://www.alonsoruibal.com/using-styles-on-android-layouts/
  • 14. Dashboard: Activity En la clase WikiplacesActivity introduciremos: public void onCreate(Bundle bundle) { super.onCreate(icicle); // Quitamos la barra de título requestWindowFeature(Window.FEATURE_NO_TITLE); requestWindowFeature(Window.FEATURE_PROGRESS); // Establecemos el contenido setContentView(R.layout.dashboard); }
  • 15. Dashboard: Botones con imágenes ● drawable_hdpi/dashboard_preferences_default.png ● drawable_hdpi/dashboard_preferences_selected.png ● drawable/dashboard_preferences.xml: <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:drawable="@drawable/dashboard_preferences_selected"/> <item android:state_pressed="true" android:drawable="@drawable/dashboard_preferences_selected"/> <item android:state_focused="false" android:state_pressed="false" android:drawable="@drawable/dashboard_preferences_default"/> </selector> ● Y en nuestro layout ponemos: <Button style="@style/DashBoardAction" android:drawableTop="@drawable/dashboard_preferences" android:text="@string/dashboard_preferences" android:onClick="onPreferencesAction" /> ● Al pulsarlo llamará al método onPreferencesAction de nuestra actividad public void onPreferencesAction(View v) { ... }
  • 16. Lanzando otra actividad: Intents ● Por ejemplo, para lanzar una nueva actividad cuando pulsamos el botón de preferencias: public void onPreferencesAction(View v) { Intent intent = new Intent(getApplicationContext(), PreferencesActivity.class); startActivity(intent); } ● Creamos la nueva clase de la actividad: también debemos añadirla en el AndroidManifest.xml: <activity android:name="PreferencesActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.EMBED" /> </intent-filter> </activity>
  • 17. Actividad para las prefencias ● La clase de la Actividad es tremendamente sencilla: public class PreferencesActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML addPreferencesFromResource(R.layout.preferences); } } ● En layout/preferences.xml definimos los campos que va a tener nuestra pantalla de preferencias con ListPreference, CheckboxPreference, EditTextPrefrence...
  • 18. Definiendo preferencias en el XML <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <ListPreference android:key="distance" android:title="@string/preferences_distance" android:summary="@string/preferences_distance_summary" android:entries="@array/distances_texts" android:entryValues="@array/distances_values" android:dialogTitle="@string/preferences_distance" android:defaultValue="20" android:selectable="true" /> <CheckBoxPreference android:key="satellite" android:title="@string/preferences_satellite" android:summary="@string/preferences_satellite_summary" android:defaultValue="false"/> <CheckBoxPreference android:key="fullscreen" android:title="@string/preferences_fullscreen" android:summary="@string/preferences_fullscreen_summary" android:defaultValue="false"/> </PreferenceScreen>
  • 19. Obteniendo valores de preferencias ● Ya de nuevo en el onResume de WikiplacesActivity vamos a obtener la preferencia “fullscreen” y actuar en función de su valor: SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); fullscreen = sharedPref.getBoolean("fullscreen", false); if (fullscreen) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } else { getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN); }
  • 20. Obteniendo la ubicación (I) ● Para hacer que nuestra actividad principal obtenga la ubicación, primero añadimos los permisos en el AndroidManifest.xml <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ● Después implementamos LocationListener .... implements LocationListener public void onLocationChanged(Location location) { Log.d(TAG, “Location Received!!!!”); } public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {}
  • 21. Obteniendo la ubicación (II) ● Ahora solicitamos actualizaciones de la ubicación con dos proveedores de ubicación (sí dos!): manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(false); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAccuracy(Criteria.ACCURACY_FINE); providerFine = manager.getBestProvider(criteria, true); criteria.setAccuracy(Criteria.ACCURACY_COARSE); providerCoarse = manager.getBestProvider(criteria, true); if (providerCoarse != null) manager.requestLocationUpdates(providerCoarse, 5*60000, 100, this); // update each 5 minutes if (providerFine != null) manager.requestLocationUpdates(providerFine, 5*60000, 100, this ); // update each 5 minutes http://www.alonsoruibal.com/using-two-locationproviders-on-android/
  • 22. Simulando la ubicación en el emulador ● Nuestro ordenador no tiene GPS, pero el emulador nos permite “simular” ubicaciones introduciendo longitud y latitud
  • 23. Obteniendo los datos a mostrar ● Añadir a la aplicación el permiso para conectarse Internet <uses-permission android:name="android.permission.INTERNET" /> ● Utilizaremos los servicios de GeoNames http://www.geonames.org/ ● Primero creamos una cuenta en http://www.geonames.org/login ● Y habilitamos los “Free Web Services” en: http://www.geonames.org/manageaccount ● Para el ejemplo podremos usar la cuenta “mobialia” en lugar de crear una
  • 24. Servicio JSON de GeoNames ● Acrónimo de JavaScript Object Notation ● Más fácil de utilizar que los servicios XML ● Utilizaremos el WebService: findNearbyWikipediaJSON al que le pasamos, “lat”, “lng”, “radius”, “maxRows” y “username” ● Ejemplo de petición JSON a Geonames: http://api.geonames.org/findNearbyWikipediaJSON?lat=47&lng=9&username=mobialia
  • 25. Almacenando los datos recibidos ● Creamos una clase contenedora “Wikiplace” con los campos que nos devuelve el WebService JSON ● Otra clase “WikiplacesData” nos gestionará las peticiones al servidor y almacenará los resultados en memoria, en un ArrayList<Wikiplace> ● Android tiene integrada una librería para procesar JSON: JSONObject base = new JSONObject(dataString); JSONArray data = base.getJSONArray("geonames"); for (int i = 0; i < data.length(); i++) { JSONObject obj = data.getJSONObject(i); Wikiplace wikiplace = new Wikiplace(); wikiplace.setLat(obj.getDouble("lat")); ..
  • 26. Mostrando un Mapa: MapActivity ● Creamos una actividad que extienda MapActivity public void onCreate(Bundle icicle) { super.onCreate(icicle); //.. setContentView(R.layout.wikiplaces_map); mapView = (MapView)findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); mapView.getController().setZoom(14); //... } ● Y definimos el layout wikiplaces_map.xml, pero antes debemos obtener una API key
  • 27. Obteniendo una clave para el mapa ● Debemos ir a esta URL http://code.google.com/intl/gl/android/maps-api-signup.html ● Nos pedirá el “Certificate fingerprint”, que se obtiene así: keytool -list -keystore ~/.android/debug.keystore ● Luego ponemos la API key en el tag XML del mapa: <com.google.android.maps.MapView android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:clickable="true" android:apiKey="0ty0JlR1lTjC5kB1dCPHOPbNscmPlSKGDA1KQug" />
  • 28. Overlays sobre el Mapa ● En primer lugar añadiremos un overlay que muestre nuestra ubicación: List<Overlay> overlays = mapView.getOverlays(); myLocationOverlay = new MyLocationOverlay(this, mapView ); overlays.add(myLocationOverlay); ● El siguiente paso será hacer un overlay personalizado en el que mostremos los datos de Wikiplaces
  • 29. Overlays personalizados (I) ● Extendemos la clase Overlay: public class WikiplacesOverlay extends Overlay { @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { Projection projection = mapView.getProjection(); // Por cada uno de los lugares obtenemos su geopoint... // .. // Transformamos el geoPoint en píxeles Point point = new Point(); projection.toPixels(geoPoint, point); // Y finalmente pintamos “algo” en esa ubicación Paint paint = new Paint(); paint.setColor(Color.BLACK); canvas.drawText(“texto”, point.x, point.y, paint); }
  • 30. Overlays personalizados (II) ● El Overlay tiene un método que se llama cuando el usuario pulsa en la pantalla @Override public boolean onTap(GeoPoint point, MapView mapView) { /... } ● Para buscar el GeoPoint más cercano nos recorremos los Wikiplaces utilizando un DistanceCalculator
  • 31. Añadiendo un menú (I) ● Primero creamos el menú interceptando onCreateOptionsMenu public static final int MENU_MY_LOCATION = 1; @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, MENU_MY_LOCATION, 0, R.string.menu_my_location).setIcon(drawable.ic_menu_mylocation); return true; }
  • 32. Añadiendo un menú (II) ● Respondemos a la acción cuando el menú es seleccionado @Override public boolean onOptionsItemSelected(MenuItem item) { GeoPoint geoPoint = null; switch (item.getItemId()) { case MENU_MY_LOCATION: geoPoint = myLocationOverlay.getMyLocation(); if (geoPoint != null) mapView.getController().animateTo(geoPoint); return true; } return false; }
  • 33. Pedir datos al tener la ubicación ● En el WikiplacesActivity: public void onLocationChanged(Location location) { geoPoint = location2GeoPoint(location); wikiplacesData.setLocationPoint(geoPoint); wikiplacesData.getDataFromServer(this); } ● Hay que convertir el location a un Geopoint: private GeoPoint location2GeoPoint(Location location) { if (location == null) return null; int latitude = (int) (location.getLatitude()*1E6); int longitude = (int) (location.getLongitude()*1E6); return new GeoPoint(latitude, longitude); }
  • 34. Mostrar los datos en una lista ● Creamos una nueva actividad WikiplacesListActivity extendiendo ListActivity ● Creamos el layout/wikiplaces_list.xml: <ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:drawSelectorOnTop="false" android:background="@color/background" android:cacheColorHint="#00000000" /> ● Creamos un adapter personalizado setContentView(R.layout.wikiplaces_list); adapter = new WikiplacesAdapter(getApplicationContext()); setListAdapter(adapter);
  • 35. Adapter personalizado ● El adapter gestiona los datos a mostrar en la lista public class WikiplacesAdapter extends BaseAdapter { ● Definimos un layout para cada elemento de la lista en layout/wikiplaces_adapter.xml ● El método getView devolverá la vista correspondiente a un elemento public View getView(int position, View convertView, ViewGroup parent) { LinearLayout ll = (LinearLayout) LayoutInflater.from(mContext ).inflate(R.layout.wikiplaces_adapter, parent, false); Wikiplace wikiplace = wikiplacesData.getWikiplace(position); TextView title = (TextView) ll.findViewById(R.id.Title); title.setText(wikiplace.getTitle()); }
  • 36. Respondiendo al click en la lista ● Cuando se pulsa sobre un elemento de la lista se llama al método onListItemClick de la actividad: @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Log.d(TAG, “Elemento seleccionado”); }
  • 37. Pasando parámetros en un intent ● Al intent podemos pasarle un Bundle en los extras: Intent intent = new Intent(this, WikiplacesDetailActivity.class); Bundle bundle = new Bundle(); bundle.putInt("selectedPlace", position); bundle.putBoolean("calledFromMap", false); intent.putExtras(bundle); startActivity(intent); ● Y en el onCreate de la actividad llamada: Bundle extras = getIntent().getExtras(); selectedPlace = extras.getInt("selectedPlace"); calledFromMap = extras.getBoolean("calledFromMap");
  • 38. Actividad con el detalle ● Crearemos una actividad WikiplacesDetailActivity en la cual mostraremos los detalles para un lugar seleccionado ● Desde esta actividad añadiremos botones para lanzar un navegador web con la URL de wikipedia o Google Maps Navigation con las instrucciones de navegación
  • 39. Lanzar el navegador web ● Respondemos a la pulsación del botón “web” ● Creamos un intent “ACTION_VIEW” pasándole la URL que queremos mostrar public void onWebAction(View v) { String uri = "http://" + wikiplacesData.getWikiplace(selectedPlace).getWikipediaUrl(); Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)); startActivity(myIntent); }
  • 40. Lanzando Google Maps Navigation ● En el layout del detalle creamos un botón con android:onClick=“onNavigateAction” ● En el Activity, creamos el método asociado que lanzará el intent de Google Maps Navigation public void onNavigateAction(View v) { GeoPoint point = gasStationData.getWikiplace(selectedPlace).getGeoPoint(); String uri = "google.navigation:q=" +Double.valueOf(point.getLatitudeE6()/1000000+"," +Double.valueOf(point.getLongitudeE6())/1000000; Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)); startActivity(myIntent); }
  • 41. Monetizar las aplicaciones Hay tres opciones: ● Vender directamente en Android Market ● Insertar publicidad en las aplicaciones: Admob ● Desarrollar por encargo
  • 42. Insertando anuncios de AdMob (I) ● Crear una cuenta en http://www.admob.com ● Crear la aplicación en “Sites & Apps” y obtener el Publisher ID ● 1) Descargar GoogleAdMobAdsSdk-4.1.0.jar, situarlo en /lib y añadirlo al Build Path del proyecto ● 2) Añadir en AndroidManifest.xml la definición del AdActivity y los permisos INTERNET y ACCESS_NETWORK_STATE ... <!-- Ad Activity definition --> <activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation"/> </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 43. Insertando anuncios de AdMob (II) ● 3) Añadimos en cada XML de layout con anuncio la definición del namespace ads <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" ● 4) Añadimos el AdView en el layout donde mostaremos el anuncio: <com.google.ads.AdView android:id="@+id/adView" style="@style/Ad" ads:adUnitId="a14d77a33a8b395" ads:adSize="BANNER" />
  • 44. Insertando anuncios de AdMob (III) 5) Cargamos el anuncio desde cada actividad: AdRequest adRequest = new AdRequest(); AdView adView = (AdView)this.findViewById(R.id.adView) adView.loadAd(adRequest); 6) Como extra, establecemos la ubicación cuando dispongamos de ella: adRequest.setLocation(location);
  • 45. Otras consideraciones sobre AdMob ● Podemos poner anuncios sin geolocalización, pero obtenemos mejores ratios si la habilitamos ● “Debemos” especificar cuáles son nuestros terminales de prueba en el onCreate(): AdManager.setTestDevices( new String[] { "122E56EF9F911CBBA412F67B094A786A" } ); ● Interesante posibilidad de introducir “House Ads”
  • 46. Publicar en Android Market Crear una cuenta de desarrollador: http://market.android.com/publish Antes de publicarla es necesario exportar un fichero APK firmado con un certificado definitivo Vemos ejemplo práctico...
  • 47. Exportar APK firmado En el menú contextual del proyecto: Android Tools-> Export Signed Application package ● Muy importante el nombre del paquete ● El certificado se genera desde Eclipse ● Obligatorio antes de publicar unha aplicación en el Market ● Las actualizaciones sucesivas de la aplicación deben ser firmadas con el mismo certificado ● Mucho cuidado con perder el certificado!!!
  • 48. Mobialia Start-up desarrollando exclusivamente aplicaciones Android ● Mobialia Chess ● Connect-4 ● Gasolineras España ● ... http://www.mobialia.com
  • 49. Consultas, preguntas... Gracias por vuesta atención Alberto Alonso Ruibal alberto.ruibal@mobialia.com http://www.mobialia.com T: @mobialia @albertoruibal