SlideShare una empresa de Scribd logo
1. ¿ Qué es Android ?


                  Iniciación a lo más elemental, su tipo de linux.




                    Andy Rubin describió Android cómo :



  “La primera plataforma realmente abierta para terminales móviles. Todo el
software se ejecuta en el terminal sin los problemas de sistemas propietarios.”

       http://googleblog.blogspot.com/2007/11/wheres-my-gphone.html



Los terminales QVGA y los nuevo con WVGA cómo el Nexus o el Motorola Droid
están ganando a los desarrolladores que se han acostumbrado a desarrollar
una vez y no estar restringidos por los cambios de termales.

El primer termina con Android el G1 (Dream) salio en USA en Octubre de
2008, apenas un año depues de presentarse el sdk. Para finales de 2009 ya
habia más de 20 terminales con Android. La gran diferencia es que Android
soporta una gran cantidad de CPU, pantallas y redes (cdma, gsm, gsm japón)

Incluso terminales con teclado, sin él y con pantallas tactiles de varios tipos,
resistivas A y B. Android siempre ha sido una ruptura en lo que a “frameworks
móviles” se refiere. El SDK libre, puedes firmar desde el primer día, distribuir
entre tus testers. Mucha más documentación desde el primer día compara con
otras plataformas.

Respecto al lado técnico:

   •   No necesitas estar certificado para desarrollar.
   •   El proceso de aprobación del Market no tiene nada que ver con la
competencia.
    •    Puedes programar con el terminal que usas para tu vida diaria.
    •    Tienes el Android Market para vender tu aplicación de pago.
    •    Aplicaciones que dan utilidad nueva para los usuarios.
    •    El operador puede controlar los iconos del “home” de cualquier terminal
         o kernel.



Android tiene TRES objetivos claros .

    •    Un sistema operativo para móviles.
    •    Una plataforma para crear aplicaciones móviles. Programa una vez para
         todos.
    •    Terminales con el kernel de android y sus APIs que corren las
         aplicaciones.



Aplicaciones Nativas

Android viene normalmente con una herramientas pre-instaladas en
todas sus versiones.

Siempre vienen con :
➤       Cliente de correo
➤       Aplicación de SMS
➤       Calendario y Agenda
➤       Navegador basado en WebKit
➤       Reproductor de Música y Galería de fotos
➤       Aplicación de Cámara – Foto y Video
➤       Calculadora
➤       La pantalla de home
➤       Una Alarma

En otros casos vienen con :

➤       Cliente de Android Market
➤       Google Maps
➤        Gmail
➤       Google Talk
➤       YouTube



OEM y las capas sobre Android

La naturaleza opensource permite a varias compañías como HTC con el SENSE
o Motorola con el MOTORBLUR o Sony con su UI
Al final esto de-fragmenta las versiones. Al no ser suficiente con actualizar los
drivers de versión a versión si no que hay que actualizar la capa sobre el so.
Algunos van más lejos y no usan el kernel oficial si no unos suyos. Haciendo
todo mucho más complicado. Un caso de estos es Samsung.




                               2. SUS ORIGENES

                            Preparando el entorno de programación.

                                     Eclipse, SDK…



   1. Preparación previa

a) JDK




JDK no suele ser necesario en linux y mac, pero no esta de más bajarlo
si lo hay, así sabes que el emulador y cuando necesite algo más no
fallará

b) Eclipse

Eclipse classic en caso de cualquier duda.
2. SDK




y el path para el eclipse
C:Androidandroid-sdk-windowstools

3. Añadir componentes al SDK




4. Instalar el Plugin para Eclipse

Lo próximo es instalar el ADT Plugin ( hoy en día ADT 10.0.1 )para
Eclipse (Android Development Tools), que es el que nos va a facilitar la
vida y que unas veces adoraremos y otras maldeciremos. El proceso de
instalación para las últimas versiones de Eclipse es como sigue.

Abierto Eclipse nos vamos a "Help > Install new software...". Nos
aparece el diálogo de "Available Software" donde deberemos pulsar el
botón "Add..." para que aparezca otro diálogo, esta vez "Add
Repository". En el campo de nombre ponemos por ejemplo "Android
Plugin", en "location" metemos
https://dl-ssl.google.com/android/eclipse/ y le damos a OK.
Ahora en "Available Software" debería aparecernos para marcar
"Developer Tools" (si no, asegúrate de tener seleccionado el repositorio
que acabamos de añadir en "Work with"). Lo marcamos y pulsamos
"Next". Ahora el típico tema windows de siguiente, siguiente, siguiente...
finalizar.




Eclipse se reincida. Revisad los paths que cada uno este en su sitio.

A partir de ahora podrás, picar código, hacer debug y compilar.

Algún problema más :

Web oficial : http://developer.android.com/sdk/eclipse-adt.html


                               El Android Debug Bridge

Mas conocido como adb, es la estrella del sdk, lo encontraras en tools, vale
para enlazar el terminal con el sdk, ver su estado, conectar con el mandar
comandos, modificar el boot del terminal, el recovery e incluso en algunos se
puede hasta desbloquear. Lo más rápido que el terminal arranque, antes
podrás enviar código.

http://developer.android.com/guide/developing/tools/adb.html

                                        El Fastboot

Conviene tenerlo instalado, te permite flashear boots, imágenes a los
terminales que tengas conectados. Actualizaciones, meter el Developer
HBOOT y muchas más cosas.



Por otro lado antes de ponerse a programar en serio: Sqlite3

Las bases de datos de android, es importantísimo desde mi punto de vista.

web : http://developer.android.com/guide/developing/tools/sqlite3.html

Finalmente : ZIPALING

Que hace que tu apk ocupe mucho menos. Los datos de tu aplicación
comienzan en un punto. Optimiza tu aplicación. El problema es que la roms
oficiales antes de la 2.0.1 no lo suportaban todas. Si la rom no lo soporta no
pasa nada.
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
http://developer.android.com/guide/developing/tools/zipalign.html



                   3. UNA APLICACIÓN SENCILLA. LEYES BÁSICAS
                                       Introducción a los Kernel de Android
                                    ¿Que tiene el Kernel? A mi que desarrollo
                                               ¿Esto me influye ?



En un principio no nos vamos a preocupar por el kernel si no más bien de código de nuestra
aplicación. Pero cómo hemos visto, deberíais de usar un terminal físico unido al SDK y al Eclipse.
Para evitar usar el emulador. En el que el código corre a veces si a veces no. Los widgets suelen
tener bastantes problemas. Si por alguna razón vas a programar para un terminal con pantalla
resistivas hay que tener cuidado con los menús de tu aplicaciones. Algún terminales no tienen todas
las apis que deberían de tener para su versión de Android (ejemplo algunos 2.1 pre-1)


El kernel de Linux



Punto fuerte la capa de abstracción entre el Kernel y hardware.

¿ Que aprovecha Android ?

La seguridad

La gestión de memoria

Gestion de procesos

Red y drivers




La capa más baja de la arquitectura de Android es el núcleo del sistema.
Android se apoya en el kernel de Linux (en su versión 2.6). En esta capa de la
arquitectura Android tiene acceso a la gestión de memoria y de los procesos, la
pila de red y el modelo de drivers.

El núcleo actúa como una capa de abstracción entre el hardware y el resto de
las capas de la arquitectura. El desarrollador no accede directamente a esta
capa, para ello debe utilizar las librerías disponibles en capas superiores.
La máquina virtual Dalvik utiliza el kernel de Linux para realizar tareas a
bajo nivel. Es posible escribir aplicaciones en C/C++ para ejecutarlas
directamente en el kernel de Linux, aunque rara vez será necesario hacer esto.
Aún así, si tu aplicación requiere de mucha eficiencia y velocidad es posible
crear aplicaciones en C/C++ mediante el Native Development Kit (NDK) que
provee Android.

Ficheros ejecutables Dalvik (.dex)

La máquina virtual Dalvik utiliza los ficheros ejecutables Dalvik (.dex) que
están optimizados para garantizar el mínimo consumo de memoria.

En el proceso de compilación la máquina virtual utiliza los ficheros .class
generados y los combina en uno o más ficheros .dex. Reutiliza información
duplicada en múltiples ficheros .class para así reducir a la mitad el espacio
requerido de un fichero .jar tradicional. Por ejemplo, el tamaño del fichero .dex
del navegador web de Android ocupa unos 200K, mientras que la versión
equivalente de esta aplicación como fichero .jar ocupa unos 500K.


                                   kernel tree
                            http://android.git.kernel.org/




          Creando nuestra primera aplicación para Android
Ahora mismo vemos en conjunto.

TextView (objeto para mostrar texto)
EditText (caja de entrada de texto)
Button    (botón)

El código...


   <RelativeLayout xmlns:android="http://schemas.android.com/apk/r
02
   es/android"
03     android:layout_width="fill_parent"
04     android:layout_height="fill_parent">
05     <TextView
06          android:id="@+id/label_a"
07          android:layout_width="fill_parent"
08          android:layout_height="wrap_content"
            android:text="Operacion
09
   A:"/>
10     <EditText
11          android:id="@+id/op_a"
12          android:layout_width="fill_parent"
13          android:layout_height="wrap_content"
            android:background="@android:drawable/editbox_backgroun
14
   d"
15          android:layout_below="@id/label_a"/>
16       <TextView
17            android:id="@+id/label_b"
18            android:layout_width="fill_parent"
19            android:layout_height="wrap_content"
20            android:layout_below="@id/op_a"
21            android:text="Operando B:"/>
22        <EditText
23            android:id="@+id/op_b"
24            android:layout_width="fill_parent"
25            android:layout_height="wrap_content"
              android:background="@android:drawable/editbox_backgroun
26
     d"
27            android:layout_below="@id/label_b"/>
28        <Button
29            android:id="@+id/sumar"
30            android:layout_width="wrap_content"
31            android:layout_height="wrap_content"
32            android:layout_below="@id/op_b"
33            android:layout_alignParentLeft="true"
34            android:layout_marginLeft="1dip"
35            android:onClick="cSumar"
36            android:text="+" />
37        <Button
38            android:id="@+id/restar"
39            android:layout_width="wrap_content"
40            android:layout_height="wrap_content"
41            android:layout_toRightOf="@id/sumar"
42            android:layout_alignTop="@id/sumar"
43            android:onClick="cRestar"
44            android:text="-" />
45        <Button
46            android:id="@+id/multiplicar"
47            android:layout_width="wrap_content"
48            android:layout_height="wrap_content"
49            android:layout_toRightOf="@id/restar"
50            android:layout_alignTop="@id/restar"
51            android:onClick="cMultiplicar"
52            android:text="*" />
53        <Button
54            android:id="@+id/dividir"
55            android:layout_width="wrap_content"
56            android:layout_height="wrap_content"
57            android:layout_toRightOf="@id/multiplicar"
58            android:layout_alignTop="@id/sumar"
59            android:onClick="cDividir"
60         android:text="/" />
61     <TextView
62         android:id="@+id/texto_resultado"
63         android:layout_width="fill_parent"
64         android:layout_height="wrap_content"
65         android:layout_below="@id/dividir"
66         android:text="Resultado:"/>
67     <TextView
68         android:id="@+id/resultado"
69         android:layout_width="fill_parent"
70         android:layout_height="wrap_content"
71         android:layout_below="@id/texto_resultado"
72         android:text="Opera para resultado"/>
73 </RelativeLayout>




Y así sin mirar mucho.. atributos. (Android:id)

   • android:layout_width
   • android:layout_height, anchura y altura
   • android:layout_below: indica si el objeto está debajo de otro
   • android:layout_toRightOf
   • android:layout_alignTop: indican si están varios elementos en la
     misma fila sobre qué objeto se coloca a su derecha y su
     posicionamiento en altura
   • android:text es el texto por defecto en cada elemento
   • android:onClick es el nombre del método público a ejecutar al
     pulsar ese botón. Este método debe ser obligatoriamente público
     y tener como parámetro de entrada la vista



Los objetos....




01 package com.android.calc;
02
03 import android.app.Activity;
04 import android.os.Bundle;
05 import android.widget.*;
06 import android.view.*;
07
08 public class Calculadora extends Activity {
09
10    // Instancias OBJETOS a USAR
11    private double valor_a, valor_b;
12    private EditText op_a, op_b;
13    private TextView resultado;
14
15    public void onCreate(Bundle savedInstanceState) {
16        super.onCreate(savedInstanceState);
17        setContentView(R.layout.main);
18
19         // Asignamos OBJETOS
20         this.op_a = (EditText) findViewById(R.id.op_a);
21         this.op_b = (EditText) findViewById(R.id.op_b);
           this.resultado = (TextView)
22
   findViewById(R.id.resultado);
23     }
24
25     public void cSumar(View view) {
           if(this.op_a.getText().toString().length() > 0 &&
26
   this.op_b.getText().toString().length() > 0) {
               this.valor_a =
27
   Double.parseDouble(this.op_a.getText().toString());
               this.valor_b =
28
   Double.parseDouble(this.op_b.getText().toString());
               this.resultado.setText(Double.toString((this.valor_
29
   a + this.valor_b)));
30         }
31     }
32
33     public void cRestar(View view) {
           if(this.op_a.getText().toString().length() > 0 &&
34
   this.op_b.getText().toString().length() > 0) {
               this.valor_a =
35
   Double.parseDouble(this.op_a.getText().toString());
               this.valor_b =
36
   Double.parseDouble(this.op_b.getText().toString());
               this.resultado.setText(Double.toString((this.valor_
37
   a - this.valor_b)));
38         }
39     }
40
41     public void cMultiplicar(View view) {
           if(this.op_a.getText().toString().length() > 0 &&
42
   this.op_b.getText().toString().length() > 0) {
               this.valor_a =
43
   Double.parseDouble(this.op_a.getText().toString());
44             this.valor_b =
Double.parseDouble(this.op_b.getText().toString());
               this.resultado.setText(Double.toString((this.valor_
45
   a * this.valor_b)));
46         }
47     }
48
49     public void cDividir(View view) {
           if(this.op_a.getText().toString().length() > 0 &&
50
   this.op_b.getText().toString().length() > 0) {
               this.valor_a =
51
   Double.parseDouble(this.op_a.getText().toString());
               this.valor_b =
52
   Double.parseDouble(this.op_b.getText().toString());
53             if(this.valor_b != 0) {
                   this.resultado.setText(Double.toString((this.va
54
   lor_a / this.valor_b)));
55             }
56             else {
57                 this.resultado.setText("Inf");
58             }
59         }
60     }
61 }




              4. DESARROLLO PARA ANDROID 2.X Y 3.X

                                Espacio de Aplicaciones
                             Seguridad en las aplicaciones

                       Ten en cuenta los terminales y sus kernels.
Ten en cuenta que dependiendo de lo actual del API podrás hacer unas cosas u otras. Yo
                      recomiendo empezar con 2.0 y de ahí en adelante. .

 Bueno vamos a ver tienes una aplicación lista, no sabes donde colocarla en el sistema,
          permitir que me la instalen en la SD ? Colocarla en la carpeta protegida de
                        aplicaciones en el so ? Me la van a copiar así ?

               El Market y su opción de devolver el dinero en 24 horas...

    ¿Que dudas tenéis ? ¿Que experiencias en otras plataformas y otros Markets ?




                         5. ACABANDO UNA APLICACIÓN

                            Añadiendo más servicios de google a tu aplicación.

                                           ¿ Cómo se hace ?
                                       De pago, Anucios o Libre..




Quiere añadir que salve o lea de un kml tu aplicación ?
Pues no es sencillo. Un poco de código. Primero pintamos un mapa en KML,
se supone que el GPS está activo.




package com.Storer;

import   android.content.Context;
import   android.content.Intent;
import   android.database.Cursor;
import   android.database.sqlite.SQLiteDatabase;
import   android.os.Bundle;
import   android.view.Menu;
import   android.view.MenuItem;
import   android.view.View;
import   android.widget.LinearLayout;
import   android.widget.TextView;

import   com.Storer.R;
import   com.google.android.maps.GeoPoint;
import   com.google.android.maps.MapActivity;
import   com.google.android.maps.MapController;
import   com.google.android.maps.MapView;

/**
  * Crea el mapa de GoogleMaps y pinta la red que seleccionamos en
la lista
  * @author Ontic Soluciones
  * @see MiOverlay
  *
  */
public class PintaMapa extends MapActivity
{
      private MapView mapView;
      private Bundle b;
      private Cursor c;
      private Context context;
      private TextView text;

     /**
       * Llamado cuando se crea la Actividad.
       */
     public void onCreate(Bundle savedInstanceState)
     {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.mapa);
            context = getApplicationContext();;

            text = (TextView) findViewById(R.id.textMap);
            mapView = (MapView) findViewById(R.id.mapview);

            b=new Bundle();
//Llamada a Lista Tablas para elegir una wifi.
           Intent i = new Intent(this, ListaTablas.class);
           i.putExtras(b);
           startActivityForResult(i,3);
          }

     /**
       * Ejecutado cuando la actividad llamada nos envia el dato
que le pedimos. Lee el resultado que nos
       * envia y llama al mapa todo creaMapa pasandole como
parametros dichos datos.
       *
       */
     public void onActivityResult(int requestCode, int resultCode,
Intent data)
     {

          if(resultCode == RESULT_OK)
          {
               b =data.getExtras();
               String wifi = data.getStringExtra("wifi");
               String tabla = data.getStringExtra("tabla");
               super.onActivityResult(requestCode, resultCode,
data);
               creaMapa(wifi, tabla);
          }
     }

     public void onPause()
     {
          super.onPause();
     }

     /**
       * Crea el mapa de GoogleMaps y pinta un Overlay por encima
con puntos que representan a la red que
       * le pasamos como parámetro
       * @param wifi La mac de la red que tiene que pintar
       * @param tabla La tabla de la BBDD donde esta la red a
pintar.
       */
     private void creaMapa(String wifi, String tabla)
     {
           // TODO Auto-generated method stub
            MapController mc = mapView.getController();

           DataBaseHelper db = new DataBaseHelper(this);

           SQLiteDatabase DB = db.getReadableDatabase();

           c= DB.rawQuery("select lat, lng, ssid from "+tabla+"
where bssid='"+wifi+"'",null);
           c.moveToNext();
if(c.moveToFirst())
            mc.animateTo(new GeoPoint(c.getInt(0),c.getInt(1)));
            MiOverlay overlay = new MiOverlay(DB, this, wifi,
tabla);
            mapView.getOverlays().add(overlay);

            text.setText("SSID: "+c.getString(2)+ "nMAC: "+wifi);

           mapView.invalidate();
           @SuppressWarnings("deprecation")
           View zoomView = mapView.getZoomControls();
           LinearLayout myzoom = (LinearLayout)
findViewById(R.id.myzoom);
           myzoom.addView(zoomView);

            mapView.displayZoomControls(true);
            mc.setZoom(18);
     }

     @Override
     protected boolean isRouteDisplayed() {
          // TODO Auto-generated method stub
          return false;
     }

     /**
       * Crea el menu que se muestra cuando pulsamos el boton en el
terminal.
       */
     public boolean onCreateOptionsMenu(Menu menu)
     {
          menu.add(0, 0,
0,R.string.kml).setIcon(android.R.drawable.ic_menu_edit);
          menu.add(0, 1, 0,
R.string.anotherWifi).setIcon(android.R.drawable.ic_menu_mapmode);
          menu.add(0, 4, 0,
R.string.sendKml).setIcon(android.R.drawable.ic_dialog_email);

          return(super.onCreateOptionsMenu(menu));
    }


     /**
       * Detecta que opcion se ha elegido y lanza la actividad
correspondiente.
       */
     @Override
     public boolean onOptionsItemSelected(MenuItem item)
     {
          switch (item.getItemId())
          {
               case 0:
Intent i = new Intent(context, ListaKml.class);
                  startActivity(i);
                  return true;
              case 1:
               Intent intent = new Intent(context
,PintaMapa.class);
                    startActivity(intent);
                    finish();
                    return true;
              case 4:
               Intent inte = new Intent(context, SendKml.class);
               startActivity(inte);
               return true;
              default:

                   return super.onOptionsItemSelected(item);
          }
      }
}



Y en lo siguiente lee un parametro y crea un KLM en terminal.

/**
 *     This file is part of WiFiStorer.

    WiFiStorer is free software: you can redistribute it and/or
modify
    it under the terms of the GNU General Public License as
published by
    the Free Software Foundation, either version 3 of the License,
or
    (at your option) any later version.

      WiFiStorer is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      GNU General Public License for more details.

    You should have received a copy of the GNU General Public
License
    along with WiFiStorer. If not, see
<http://www.gnu.org/licenses/>.

      @author Ontic Soluciones
      @license GNU GPLv3
      @copyright 2010 Ontic Soluciones
      @link http://www.ontic.es
      @contact android@ontic.es
 */
package com.Storer;

import   java.io.BufferedWriter;
import   java.io.File;
import   java.io.FileNotFoundException;
import   java.io.FileWriter;
import   java.io.IOException;

import   android.content.Context;
import   android.database.Cursor;
import   android.database.sqlite.SQLiteDatabase;
import   android.os.Environment;


/**
  * Lee de la tabla que se le pasa como parámetro y crea un
documento .Kml de acuerdo con el estandar
  * de Google para mostrar las redes en GoogleEarth.
  * @license GNU GPLv3
     @copyright 2010 Ontic Soluciones
     @link http://www.ontic.es
     @contact android@ontic.es
  *
  */
public class Kml
{
         private BufferedWriter bw;
         private SQLiteDatabase DB = null;
         private DataBaseHelper db;
         private String tabla;
         private String clasif;
         private int power;

         /**
          * Constructor de la clase, crea una nueva instancia de
Kml
         * @param context el contexto de la actividad que lo
llama, para abrir un DBHelper
         * @param tabla la tabla a exportar
         */
        public Kml(Context context, String tabla)
        {
                db = new DataBaseHelper(context);
        DB = db.getReadableDatabase();
        this.tabla = tabla;
        }

        /**
         * Crea el fichero .kml en la tarjeta de memoria, y un
buffer va escribiendo los datos de la tabla
         * con el formato adecuado.
         */
        public void copiar()
{

                // TODO Auto-generated method stub
                 //Abrimos un File a la ruta donde se guardará
        File path = new
File(Environment.getExternalStorageDirectory().getAbsolutePath()
+"/kmls");
                //File path = new
File(Environment.getRootDirectory().getAbsolutePath()+"/kmls");
        if(!path.exists())
            path.mkdirs();

        //Creamos el fichero en la ruta
        //File f = new File(path, "t"+formato.format(new
java.util.Date()) + ".kml");
        File f = new File(path, tabla+".kml");

        //Creamos el Stream para escribir
        try
        {
                  bw = new BufferedWriter(new
FileWriter(f.getAbsolutePath()));
                } catch (FileNotFoundException e)
                {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                } catch (IOException e)
                {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                }
                String select = "select _id, lat, lng, alt, ssid,
bssid, pow, prot from "+tabla;
                Cursor c = DB.rawQuery(select, null);

                  select = "select distinct bssid from "+tabla+"
order by ssid";
                  Cursor d = DB.rawQuery(select, null);

                          try
                          {
                                bw.write("<?xml version="1.0"
encoding="UTF-8"?>n<kml
xmlns="http://earth.google.com/kml/2.x">n<Document>n" +
                                                "<Style
id="Azul"> <IconStyle> <Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/blue-
pushpin.png</href>" +
                                                "</Icon>
</IconStyle> </Style> <Style id="Roja"><IconStyle>" +
                                                "<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/red-
pushpin.png</href></Icon>" +
"</IconStyle></Sty
le><Style
id="Amarilla"><IconStyle><Icon><href>http://maps.google.com/mapf
iles/kml/pushpin/ylw-pushpin.png</href>" +
                                                "
</Icon></IconStyle></Style><Style
id="Verde"><IconStyle><Icon><href>http://maps.google.com/mapfile
s/kml/pushpin/grn-pushpin.png</href>" +
                                                "
</Icon></IconStyle></Style> " +
                                                "<Style
id="Morada"><IconStyle><Icon><href>http://maps.google.com/mapfil
es/kml/pushpin/purple-pushpin.png</href>" +
                                                "
</Icon></IconStyle></Style>");
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }

                          if(c.moveToFirst() && d.moveToFirst())
                 {
                        for(int j=0; j< d.getCount()-1; j++)
                        {
                                select = "select distinct ssid
from "+tabla+" where bssid='"+d.getString(0)+"'";
                                Cursor kml = DB.rawQuery(select,
null);
                                        kml.moveToFirst();

                                  try {
                                          String
name=kml.getString(0);
                                        bw.write("<Folder>n<name>
"+name+" ("+d.getString(0)+")</name>n");
                                                //C -> Toda la
tabla ; D -> Solo 1 red
                                                for(int i = 0; i<
c.getCount()-1; i++)
                                                {
                                                        if(d.getSt
ring(0).equals(c.getString(5)))
                                                        {
                                                                  i
f (name.contains("&"))

name.replace("&", "Y");
                                                                    p
ower = c.getInt(6);
                                                                    i
f(power <=65 )

clasif="Roja";
i
f(power >65 && power <=75)

clasif="Amarilla";
                                                                    i
f(power >75 && power <=80)

clasif="Verde";
                                                                    i
f(power <80 && power < 85)

clasif="Morada";
                                                                    i
f(power>85)

clasif="Azul";

                                                                   bw
.write("<Placemark id=""+kml.getString(0)+"" >n<name>"+name +

"</name>n" +

"<styleUrl>#"+clasif+"</styleUrl> " +

"<Point> <coordinates>"+((double)c.getInt(2))/1000000+","+
((double)c.getInt(1))/1000000+",0" +

" </coordinates></Point>n</Placemark>n");
                                                        }
                                                        c.moveToNe
xt();
                                                }
                                                d.moveToNext();
                                                c.moveToFirst();
                                                kml.moveToNext();

                                                bw.write("</Folder
>n");
                                        } catch (IOException e) {
                                                // TODO Auto-
generated catch block
                                                e.printStackTrace(
);
                                        }
                        }
                        try
                        {
                                        bw.write("</Document>n</k
ml>n");
                                        bw.close();
                                        DB.close();

                                } catch (IOException e) {
// TODO Auto-generated
catch block
                                                       e.printStackTrace();
                                          }
                   }
          }

}


Todo esto pertenece a WifiStorer y esta todo en Google Code,
aplicación desarrollada por Ontic.

http://code.google.com/p/wifistorer/




                             6. ANDROID MARKET



                                       Pagos, Actualizaciones

                               ¿ Que terminales usan mi aplicación ?

                          Cómo arreglo los bugs en un terminal.. especifico.
                             Me han pirateado mi aplicación, soluciones.



    Supongo que hoy en día tenéis claro que el pago del Market es ridículo.

           Lo mejor del market, que a fecha de hoy están cambiando.
 El saber por terminales y versiones quien descarga tu aplicaciones. Si le falla
a alguien te dice, modelo y kernel, para sabes si tiene uno modificado. De esta
 manera se arreglan los bugs de manera muy sencilla. Ni apple ni RIM tienen
  esto. Si falla en una pantalla muy pequeña o muy grande. Y a mucha gente,
está claro que no es fortuito. Visita semanal es mi recomendación. Se pueden
  hacer parches en el código. Para leer un terminal id. Pero no espero que la
      gente se los sepa. En este Gibut están todos los vendo id de todos los
                          terminales que van saliendo.



                          Vendor ID en los Kernels

                       https://github.com/HCDRJacob




                       ¿ Te han pirateado tu aplicación ?
Primer paso. Hacer valer tu © y comunicarte con los hosting donde los
                              cuelgan.

             Ver que versión esta en la red. Y por que....

                      Discutamos soluciones.

Más contenido relacionado

PDF
Entornos-de-Desarrollo-Eclipse-y-Android-SDK
PPT
Desarrollo android - 3 - entorno de desarrollo
PDF
Entendiendo android
PDF
02 5 o8a-10231485-2-7t
PDF
Curso de Android 4.x Unidad 02 SDK y AVD Manager
PDF
Tema 4.1 Introduccion Android
PDF
Introducción a Android: 10 cosas importantes que hay que entender
PDF
Ingeniería inversa básica en android tomo ii
Entornos-de-Desarrollo-Eclipse-y-Android-SDK
Desarrollo android - 3 - entorno de desarrollo
Entendiendo android
02 5 o8a-10231485-2-7t
Curso de Android 4.x Unidad 02 SDK y AVD Manager
Tema 4.1 Introduccion Android
Introducción a Android: 10 cosas importantes que hay que entender
Ingeniería inversa básica en android tomo ii

La actualidad más candente (20)

PDF
Conceptos y Generalidades de Android
PDF
FONTIC: Introducción al desarrollo en Android
PDF
Desarrollo en Android: Conceptos Básicos
DOCX
Sistema operativo android
PDF
392287381 lenguajes-para-programar-en-android
PDF
"Android de la A a la Z" -- Unidad 6
DOCX
"Android de la A a la Z" -- Unidad 2
PPT
Fundamentos del Desarrollo de Aplicaciones para Android
PDF
"Android de la A a la Z" -- Unidad 3
DOCX
Google crohme
PPTX
Android 24 01 getting started with android
PPT
Curso desarrollo en android
PPTX
PDF
Guia instalación NetBeans como entorno de desarrollo para Android:
PDF
"Android de la A a la Z" -- Unidad 1
PPT
Desarrollo android - 6 - multimedia
PDF
"Android de la A a la Z" -- Unidad 8
PPTX
Desarrollo de apps multiplataforma Movil
Conceptos y Generalidades de Android
FONTIC: Introducción al desarrollo en Android
Desarrollo en Android: Conceptos Básicos
Sistema operativo android
392287381 lenguajes-para-programar-en-android
"Android de la A a la Z" -- Unidad 6
"Android de la A a la Z" -- Unidad 2
Fundamentos del Desarrollo de Aplicaciones para Android
"Android de la A a la Z" -- Unidad 3
Google crohme
Android 24 01 getting started with android
Curso desarrollo en android
Guia instalación NetBeans como entorno de desarrollo para Android:
"Android de la A a la Z" -- Unidad 1
Desarrollo android - 6 - multimedia
"Android de la A a la Z" -- Unidad 8
Desarrollo de apps multiplataforma Movil
Publicidad

Destacado (20)

PDF
1 evaluacionpermame
PPSX
Presentación Face On en Networking Day movilforum
PDF
API Oasis WiFi versión 2.0
PPT
Hip hop
PPT
Web quest nash
PDF
Bloque I. Introducción a las Capacidades Corporate IP en móvil
PDF
Bloque III. Arquitectura Corporate IP en Symbian S60
PDF
Press coverage telefonica NFC. MWC 2013 - Servicios Financieros
PDF
Consorcio de transportes de asturias - NFC en el transporte público
PPTX
Mercadeo b2 b_innocacion y mic_cetics
PPT
Enfoque
PPT
Ayuda didactica
PDF
Bloque II. Arquitectura Corporate IP en J2ME/Blackberry
PDF
Aprendiendo a usar NDK Android Day(castellano)
PPT
Cómo hacer negocio de la mano de Telefónica_movilforum España_mfc10
PPT
Peligros del intenet_arroyo[1]
PPTX
Mi Concurso
PPSX
Dispositivos de salida
PDF
Revista soluciones movilforum 2010
PDF
JMC12 "Eficiencia energética en la gestión de infraestructuras"
1 evaluacionpermame
Presentación Face On en Networking Day movilforum
API Oasis WiFi versión 2.0
Hip hop
Web quest nash
Bloque I. Introducción a las Capacidades Corporate IP en móvil
Bloque III. Arquitectura Corporate IP en Symbian S60
Press coverage telefonica NFC. MWC 2013 - Servicios Financieros
Consorcio de transportes de asturias - NFC en el transporte público
Mercadeo b2 b_innocacion y mic_cetics
Enfoque
Ayuda didactica
Bloque II. Arquitectura Corporate IP en J2ME/Blackberry
Aprendiendo a usar NDK Android Day(castellano)
Cómo hacer negocio de la mano de Telefónica_movilforum España_mfc10
Peligros del intenet_arroyo[1]
Mi Concurso
Dispositivos de salida
Revista soluciones movilforum 2010
JMC12 "Eficiencia energética en la gestión de infraestructuras"
Publicidad

Similar a Seminario Android (Parte 1) - movilforum (20)

PDF
Guía básica de programación en android
PDF
PDF
Manual Android
PDF
Tutorial Eclipse
PDF
TUTORIAL ECLIPSE
PDF
Taller de prog. en android
PPT
Intro. a Android Instituto Bosc de la Coma en Olot
PPT
Taller de Android
PPT
Android QuickStart
PPT
Curso Introducción a android
PPTX
Sistema operativo
PPTX
PDF
Proyecto: Guía básica para la creación de Apps sencillas nativas sobre Android
DOCX
R esume libro el gran libro de android
PPTX
Sistema Operativo Androin
PPTX
Sistema operativo androin
PPTX
Sistema operativo androin
PDF
Breve introducción a Android Apps
PDF
Taller Android seedrocket
ODP
Android Pres3
Guía básica de programación en android
Manual Android
Tutorial Eclipse
TUTORIAL ECLIPSE
Taller de prog. en android
Intro. a Android Instituto Bosc de la Coma en Olot
Taller de Android
Android QuickStart
Curso Introducción a android
Sistema operativo
Proyecto: Guía básica para la creación de Apps sencillas nativas sobre Android
R esume libro el gran libro de android
Sistema Operativo Androin
Sistema operativo androin
Sistema operativo androin
Breve introducción a Android Apps
Taller Android seedrocket
Android Pres3

Más de videos (20)

PDF
Logros y retos evento movilforum 02/2016
PPTX
Presentación Atlantida en Networking Day moviforum
PPTX
Presentación Quetal en Networking Day moviforum
PPTX
Presentación GMTECH en Networking Day moviforum
PDF
Presentación movilok en Networking Day moviforum
PPTX
Presentación 3G mobile en Networking Day moviforum
PPTX
Presentación microestrategy en Networking Day moviforum
PPTX
Presentación Telnet en Networking Day moviforum
PPTX
Presentación Alma technology en Networking Day movilforum
PPTX
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...
PPTX
Presentación Icar Vision en Networking Day movilforum
PDF
Presentación Billage en Networking Day movilforum
PDF
Bases legales reto NFV/ Nfv challenge terms
PDF
Intrucciones reto NFV/ Instruction to apply to nfv challenge
PDF
9 creating cent_os 7_mages_for_dpdk_training
PDF
8 intel network builders overview
PDF
7 hands on
PDF
6 profiling tools
PDF
5 pipeline arch_rationale
PDF
4 dpdk roadmap(1)
Logros y retos evento movilforum 02/2016
Presentación Atlantida en Networking Day moviforum
Presentación Quetal en Networking Day moviforum
Presentación GMTECH en Networking Day moviforum
Presentación movilok en Networking Day moviforum
Presentación 3G mobile en Networking Day moviforum
Presentación microestrategy en Networking Day moviforum
Presentación Telnet en Networking Day moviforum
Presentación Alma technology en Networking Day movilforum
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...
Presentación Icar Vision en Networking Day movilforum
Presentación Billage en Networking Day movilforum
Bases legales reto NFV/ Nfv challenge terms
Intrucciones reto NFV/ Instruction to apply to nfv challenge
9 creating cent_os 7_mages_for_dpdk_training
8 intel network builders overview
7 hands on
6 profiling tools
5 pipeline arch_rationale
4 dpdk roadmap(1)

Último (20)

PPTX
Introduccion a servidores de Aplicaciones (1).pptx
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PDF
ACTIVIDAD 2.pdf j
PDF
SAP Transportation Management para LSP, TM140 Col18
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
DOCX
Las nuevas tecnologías en la salud - enfermería técnica.
DOCX
Trabajo colaborativo Grupo #2.docxmkkkkkkl
PDF
La electricidad y la electrónica .pdf n
PPTX
Administración se srevidores de apliaciones
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PDF
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Temas y subtemas de las fichas 1 y 2.pdf
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
PPT
Que son las redes de computadores y sus partes
PDF
Conceptos básicos de programación tecnología.pdf
PDF
Estrategia de apoyo tecnología grado 9-3
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PDF
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf
Introduccion a servidores de Aplicaciones (1).pptx
historia_web de la creacion de un navegador_presentacion.pptx
Presentación PASANTIAS AuditorioOO..pptx
ACTIVIDAD 2.pdf j
SAP Transportation Management para LSP, TM140 Col18
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
Las nuevas tecnologías en la salud - enfermería técnica.
Trabajo colaborativo Grupo #2.docxmkkkkkkl
La electricidad y la electrónica .pdf n
Administración se srevidores de apliaciones
REDES INFORMATICAS REDES INFORMATICAS.pptx
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Temas y subtemas de las fichas 1 y 2.pdf
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
Que son las redes de computadores y sus partes
Conceptos básicos de programación tecnología.pdf
Estrategia de apoyo tecnología grado 9-3
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf

Seminario Android (Parte 1) - movilforum

  • 1. 1. ¿ Qué es Android ? Iniciación a lo más elemental, su tipo de linux. Andy Rubin describió Android cómo : “La primera plataforma realmente abierta para terminales móviles. Todo el software se ejecuta en el terminal sin los problemas de sistemas propietarios.” http://googleblog.blogspot.com/2007/11/wheres-my-gphone.html Los terminales QVGA y los nuevo con WVGA cómo el Nexus o el Motorola Droid están ganando a los desarrolladores que se han acostumbrado a desarrollar una vez y no estar restringidos por los cambios de termales. El primer termina con Android el G1 (Dream) salio en USA en Octubre de 2008, apenas un año depues de presentarse el sdk. Para finales de 2009 ya habia más de 20 terminales con Android. La gran diferencia es que Android soporta una gran cantidad de CPU, pantallas y redes (cdma, gsm, gsm japón) Incluso terminales con teclado, sin él y con pantallas tactiles de varios tipos, resistivas A y B. Android siempre ha sido una ruptura en lo que a “frameworks móviles” se refiere. El SDK libre, puedes firmar desde el primer día, distribuir entre tus testers. Mucha más documentación desde el primer día compara con otras plataformas. Respecto al lado técnico: • No necesitas estar certificado para desarrollar. • El proceso de aprobación del Market no tiene nada que ver con la
  • 2. competencia. • Puedes programar con el terminal que usas para tu vida diaria. • Tienes el Android Market para vender tu aplicación de pago. • Aplicaciones que dan utilidad nueva para los usuarios. • El operador puede controlar los iconos del “home” de cualquier terminal o kernel. Android tiene TRES objetivos claros . • Un sistema operativo para móviles. • Una plataforma para crear aplicaciones móviles. Programa una vez para todos. • Terminales con el kernel de android y sus APIs que corren las aplicaciones. Aplicaciones Nativas Android viene normalmente con una herramientas pre-instaladas en todas sus versiones. Siempre vienen con : ➤ Cliente de correo ➤ Aplicación de SMS ➤ Calendario y Agenda ➤ Navegador basado en WebKit ➤ Reproductor de Música y Galería de fotos ➤ Aplicación de Cámara – Foto y Video ➤ Calculadora ➤ La pantalla de home ➤ Una Alarma En otros casos vienen con : ➤ Cliente de Android Market ➤ Google Maps ➤ Gmail ➤ Google Talk ➤ YouTube OEM y las capas sobre Android La naturaleza opensource permite a varias compañías como HTC con el SENSE o Motorola con el MOTORBLUR o Sony con su UI
  • 3. Al final esto de-fragmenta las versiones. Al no ser suficiente con actualizar los drivers de versión a versión si no que hay que actualizar la capa sobre el so. Algunos van más lejos y no usan el kernel oficial si no unos suyos. Haciendo todo mucho más complicado. Un caso de estos es Samsung. 2. SUS ORIGENES Preparando el entorno de programación. Eclipse, SDK… 1. Preparación previa a) JDK JDK no suele ser necesario en linux y mac, pero no esta de más bajarlo si lo hay, así sabes que el emulador y cuando necesite algo más no fallará b) Eclipse Eclipse classic en caso de cualquier duda.
  • 4. 2. SDK y el path para el eclipse
  • 5. C:Androidandroid-sdk-windowstools 3. Añadir componentes al SDK 4. Instalar el Plugin para Eclipse Lo próximo es instalar el ADT Plugin ( hoy en día ADT 10.0.1 )para Eclipse (Android Development Tools), que es el que nos va a facilitar la vida y que unas veces adoraremos y otras maldeciremos. El proceso de instalación para las últimas versiones de Eclipse es como sigue. Abierto Eclipse nos vamos a "Help > Install new software...". Nos aparece el diálogo de "Available Software" donde deberemos pulsar el botón "Add..." para que aparezca otro diálogo, esta vez "Add Repository". En el campo de nombre ponemos por ejemplo "Android Plugin", en "location" metemos https://dl-ssl.google.com/android/eclipse/ y le damos a OK.
  • 6. Ahora en "Available Software" debería aparecernos para marcar "Developer Tools" (si no, asegúrate de tener seleccionado el repositorio que acabamos de añadir en "Work with"). Lo marcamos y pulsamos "Next". Ahora el típico tema windows de siguiente, siguiente, siguiente... finalizar. Eclipse se reincida. Revisad los paths que cada uno este en su sitio. A partir de ahora podrás, picar código, hacer debug y compilar. Algún problema más : Web oficial : http://developer.android.com/sdk/eclipse-adt.html El Android Debug Bridge Mas conocido como adb, es la estrella del sdk, lo encontraras en tools, vale para enlazar el terminal con el sdk, ver su estado, conectar con el mandar comandos, modificar el boot del terminal, el recovery e incluso en algunos se puede hasta desbloquear. Lo más rápido que el terminal arranque, antes podrás enviar código. http://developer.android.com/guide/developing/tools/adb.html El Fastboot Conviene tenerlo instalado, te permite flashear boots, imágenes a los terminales que tengas conectados. Actualizaciones, meter el Developer HBOOT y muchas más cosas. Por otro lado antes de ponerse a programar en serio: Sqlite3 Las bases de datos de android, es importantísimo desde mi punto de vista. web : http://developer.android.com/guide/developing/tools/sqlite3.html Finalmente : ZIPALING Que hace que tu apk ocupe mucho menos. Los datos de tu aplicación comienzan en un punto. Optimiza tu aplicación. El problema es que la roms oficiales antes de la 2.0.1 no lo suportaban todas. Si la rom no lo soporta no pasa nada.
  • 7. zipalign [-f] [-v] <alignment> infile.apk outfile.apk http://developer.android.com/guide/developing/tools/zipalign.html 3. UNA APLICACIÓN SENCILLA. LEYES BÁSICAS Introducción a los Kernel de Android ¿Que tiene el Kernel? A mi que desarrollo ¿Esto me influye ? En un principio no nos vamos a preocupar por el kernel si no más bien de código de nuestra aplicación. Pero cómo hemos visto, deberíais de usar un terminal físico unido al SDK y al Eclipse. Para evitar usar el emulador. En el que el código corre a veces si a veces no. Los widgets suelen tener bastantes problemas. Si por alguna razón vas a programar para un terminal con pantalla resistivas hay que tener cuidado con los menús de tu aplicaciones. Algún terminales no tienen todas las apis que deberían de tener para su versión de Android (ejemplo algunos 2.1 pre-1) El kernel de Linux Punto fuerte la capa de abstracción entre el Kernel y hardware. ¿ Que aprovecha Android ? La seguridad La gestión de memoria Gestion de procesos Red y drivers La capa más baja de la arquitectura de Android es el núcleo del sistema. Android se apoya en el kernel de Linux (en su versión 2.6). En esta capa de la arquitectura Android tiene acceso a la gestión de memoria y de los procesos, la pila de red y el modelo de drivers. El núcleo actúa como una capa de abstracción entre el hardware y el resto de las capas de la arquitectura. El desarrollador no accede directamente a esta capa, para ello debe utilizar las librerías disponibles en capas superiores.
  • 8. La máquina virtual Dalvik utiliza el kernel de Linux para realizar tareas a bajo nivel. Es posible escribir aplicaciones en C/C++ para ejecutarlas directamente en el kernel de Linux, aunque rara vez será necesario hacer esto. Aún así, si tu aplicación requiere de mucha eficiencia y velocidad es posible crear aplicaciones en C/C++ mediante el Native Development Kit (NDK) que provee Android. Ficheros ejecutables Dalvik (.dex) La máquina virtual Dalvik utiliza los ficheros ejecutables Dalvik (.dex) que están optimizados para garantizar el mínimo consumo de memoria. En el proceso de compilación la máquina virtual utiliza los ficheros .class generados y los combina en uno o más ficheros .dex. Reutiliza información duplicada en múltiples ficheros .class para así reducir a la mitad el espacio requerido de un fichero .jar tradicional. Por ejemplo, el tamaño del fichero .dex del navegador web de Android ocupa unos 200K, mientras que la versión equivalente de esta aplicación como fichero .jar ocupa unos 500K. kernel tree http://android.git.kernel.org/ Creando nuestra primera aplicación para Android
  • 9. Ahora mismo vemos en conjunto. TextView (objeto para mostrar texto) EditText (caja de entrada de texto) Button (botón) El código... <RelativeLayout xmlns:android="http://schemas.android.com/apk/r 02 es/android" 03 android:layout_width="fill_parent" 04 android:layout_height="fill_parent"> 05 <TextView 06 android:id="@+id/label_a" 07 android:layout_width="fill_parent" 08 android:layout_height="wrap_content" android:text="Operacion 09 A:"/> 10 <EditText 11 android:id="@+id/op_a" 12 android:layout_width="fill_parent" 13 android:layout_height="wrap_content" android:background="@android:drawable/editbox_backgroun 14 d" 15 android:layout_below="@id/label_a"/> 16 <TextView
  • 10. 17 android:id="@+id/label_b" 18 android:layout_width="fill_parent" 19 android:layout_height="wrap_content" 20 android:layout_below="@id/op_a" 21 android:text="Operando B:"/> 22 <EditText 23 android:id="@+id/op_b" 24 android:layout_width="fill_parent" 25 android:layout_height="wrap_content" android:background="@android:drawable/editbox_backgroun 26 d" 27 android:layout_below="@id/label_b"/> 28 <Button 29 android:id="@+id/sumar" 30 android:layout_width="wrap_content" 31 android:layout_height="wrap_content" 32 android:layout_below="@id/op_b" 33 android:layout_alignParentLeft="true" 34 android:layout_marginLeft="1dip" 35 android:onClick="cSumar" 36 android:text="+" /> 37 <Button 38 android:id="@+id/restar" 39 android:layout_width="wrap_content" 40 android:layout_height="wrap_content" 41 android:layout_toRightOf="@id/sumar" 42 android:layout_alignTop="@id/sumar" 43 android:onClick="cRestar" 44 android:text="-" /> 45 <Button 46 android:id="@+id/multiplicar" 47 android:layout_width="wrap_content" 48 android:layout_height="wrap_content" 49 android:layout_toRightOf="@id/restar" 50 android:layout_alignTop="@id/restar" 51 android:onClick="cMultiplicar" 52 android:text="*" /> 53 <Button 54 android:id="@+id/dividir" 55 android:layout_width="wrap_content" 56 android:layout_height="wrap_content" 57 android:layout_toRightOf="@id/multiplicar" 58 android:layout_alignTop="@id/sumar" 59 android:onClick="cDividir"
  • 11. 60 android:text="/" /> 61 <TextView 62 android:id="@+id/texto_resultado" 63 android:layout_width="fill_parent" 64 android:layout_height="wrap_content" 65 android:layout_below="@id/dividir" 66 android:text="Resultado:"/> 67 <TextView 68 android:id="@+id/resultado" 69 android:layout_width="fill_parent" 70 android:layout_height="wrap_content" 71 android:layout_below="@id/texto_resultado" 72 android:text="Opera para resultado"/> 73 </RelativeLayout> Y así sin mirar mucho.. atributos. (Android:id) • android:layout_width • android:layout_height, anchura y altura • android:layout_below: indica si el objeto está debajo de otro • android:layout_toRightOf • android:layout_alignTop: indican si están varios elementos en la misma fila sobre qué objeto se coloca a su derecha y su posicionamiento en altura • android:text es el texto por defecto en cada elemento • android:onClick es el nombre del método público a ejecutar al pulsar ese botón. Este método debe ser obligatoriamente público y tener como parámetro de entrada la vista Los objetos.... 01 package com.android.calc; 02 03 import android.app.Activity; 04 import android.os.Bundle; 05 import android.widget.*; 06 import android.view.*; 07 08 public class Calculadora extends Activity { 09
  • 12. 10 // Instancias OBJETOS a USAR 11 private double valor_a, valor_b; 12 private EditText op_a, op_b; 13 private TextView resultado; 14 15 public void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.main); 18 19 // Asignamos OBJETOS 20 this.op_a = (EditText) findViewById(R.id.op_a); 21 this.op_b = (EditText) findViewById(R.id.op_b); this.resultado = (TextView) 22 findViewById(R.id.resultado); 23 } 24 25 public void cSumar(View view) { if(this.op_a.getText().toString().length() > 0 && 26 this.op_b.getText().toString().length() > 0) { this.valor_a = 27 Double.parseDouble(this.op_a.getText().toString()); this.valor_b = 28 Double.parseDouble(this.op_b.getText().toString()); this.resultado.setText(Double.toString((this.valor_ 29 a + this.valor_b))); 30 } 31 } 32 33 public void cRestar(View view) { if(this.op_a.getText().toString().length() > 0 && 34 this.op_b.getText().toString().length() > 0) { this.valor_a = 35 Double.parseDouble(this.op_a.getText().toString()); this.valor_b = 36 Double.parseDouble(this.op_b.getText().toString()); this.resultado.setText(Double.toString((this.valor_ 37 a - this.valor_b))); 38 } 39 } 40 41 public void cMultiplicar(View view) { if(this.op_a.getText().toString().length() > 0 && 42 this.op_b.getText().toString().length() > 0) { this.valor_a = 43 Double.parseDouble(this.op_a.getText().toString()); 44 this.valor_b =
  • 13. Double.parseDouble(this.op_b.getText().toString()); this.resultado.setText(Double.toString((this.valor_ 45 a * this.valor_b))); 46 } 47 } 48 49 public void cDividir(View view) { if(this.op_a.getText().toString().length() > 0 && 50 this.op_b.getText().toString().length() > 0) { this.valor_a = 51 Double.parseDouble(this.op_a.getText().toString()); this.valor_b = 52 Double.parseDouble(this.op_b.getText().toString()); 53 if(this.valor_b != 0) { this.resultado.setText(Double.toString((this.va 54 lor_a / this.valor_b))); 55 } 56 else { 57 this.resultado.setText("Inf"); 58 } 59 } 60 } 61 } 4. DESARROLLO PARA ANDROID 2.X Y 3.X Espacio de Aplicaciones Seguridad en las aplicaciones Ten en cuenta los terminales y sus kernels.
  • 14. Ten en cuenta que dependiendo de lo actual del API podrás hacer unas cosas u otras. Yo recomiendo empezar con 2.0 y de ahí en adelante. . Bueno vamos a ver tienes una aplicación lista, no sabes donde colocarla en el sistema, permitir que me la instalen en la SD ? Colocarla en la carpeta protegida de aplicaciones en el so ? Me la van a copiar así ? El Market y su opción de devolver el dinero en 24 horas... ¿Que dudas tenéis ? ¿Que experiencias en otras plataformas y otros Markets ? 5. ACABANDO UNA APLICACIÓN Añadiendo más servicios de google a tu aplicación. ¿ Cómo se hace ? De pago, Anucios o Libre.. Quiere añadir que salve o lea de un kml tu aplicación ? Pues no es sencillo. Un poco de código. Primero pintamos un mapa en KML,
  • 15. se supone que el GPS está activo. package com.Storer; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.Storer.R; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; /** * Crea el mapa de GoogleMaps y pinta la red que seleccionamos en la lista * @author Ontic Soluciones * @see MiOverlay * */ public class PintaMapa extends MapActivity { private MapView mapView; private Bundle b; private Cursor c; private Context context; private TextView text; /** * Llamado cuando se crea la Actividad. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mapa); context = getApplicationContext();; text = (TextView) findViewById(R.id.textMap); mapView = (MapView) findViewById(R.id.mapview); b=new Bundle();
  • 16. //Llamada a Lista Tablas para elegir una wifi. Intent i = new Intent(this, ListaTablas.class); i.putExtras(b); startActivityForResult(i,3); } /** * Ejecutado cuando la actividad llamada nos envia el dato que le pedimos. Lee el resultado que nos * envia y llama al mapa todo creaMapa pasandole como parametros dichos datos. * */ public void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == RESULT_OK) { b =data.getExtras(); String wifi = data.getStringExtra("wifi"); String tabla = data.getStringExtra("tabla"); super.onActivityResult(requestCode, resultCode, data); creaMapa(wifi, tabla); } } public void onPause() { super.onPause(); } /** * Crea el mapa de GoogleMaps y pinta un Overlay por encima con puntos que representan a la red que * le pasamos como parámetro * @param wifi La mac de la red que tiene que pintar * @param tabla La tabla de la BBDD donde esta la red a pintar. */ private void creaMapa(String wifi, String tabla) { // TODO Auto-generated method stub MapController mc = mapView.getController(); DataBaseHelper db = new DataBaseHelper(this); SQLiteDatabase DB = db.getReadableDatabase(); c= DB.rawQuery("select lat, lng, ssid from "+tabla+" where bssid='"+wifi+"'",null); c.moveToNext();
  • 17. if(c.moveToFirst()) mc.animateTo(new GeoPoint(c.getInt(0),c.getInt(1))); MiOverlay overlay = new MiOverlay(DB, this, wifi, tabla); mapView.getOverlays().add(overlay); text.setText("SSID: "+c.getString(2)+ "nMAC: "+wifi); mapView.invalidate(); @SuppressWarnings("deprecation") View zoomView = mapView.getZoomControls(); LinearLayout myzoom = (LinearLayout) findViewById(R.id.myzoom); myzoom.addView(zoomView); mapView.displayZoomControls(true); mc.setZoom(18); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } /** * Crea el menu que se muestra cuando pulsamos el boton en el terminal. */ public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0,R.string.kml).setIcon(android.R.drawable.ic_menu_edit); menu.add(0, 1, 0, R.string.anotherWifi).setIcon(android.R.drawable.ic_menu_mapmode); menu.add(0, 4, 0, R.string.sendKml).setIcon(android.R.drawable.ic_dialog_email); return(super.onCreateOptionsMenu(menu)); } /** * Detecta que opcion se ha elegido y lanza la actividad correspondiente. */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 0:
  • 18. Intent i = new Intent(context, ListaKml.class); startActivity(i); return true; case 1: Intent intent = new Intent(context ,PintaMapa.class); startActivity(intent); finish(); return true; case 4: Intent inte = new Intent(context, SendKml.class); startActivity(inte); return true; default: return super.onOptionsItemSelected(item); } } } Y en lo siguiente lee un parametro y crea un KLM en terminal. /** * This file is part of WiFiStorer. WiFiStorer is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. WiFiStorer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with WiFiStorer. If not, see <http://www.gnu.org/licenses/>. @author Ontic Soluciones @license GNU GPLv3 @copyright 2010 Ontic Soluciones @link http://www.ontic.es @contact android@ontic.es */
  • 19. package com.Storer; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Environment; /** * Lee de la tabla que se le pasa como parámetro y crea un documento .Kml de acuerdo con el estandar * de Google para mostrar las redes en GoogleEarth. * @license GNU GPLv3 @copyright 2010 Ontic Soluciones @link http://www.ontic.es @contact android@ontic.es * */ public class Kml { private BufferedWriter bw; private SQLiteDatabase DB = null; private DataBaseHelper db; private String tabla; private String clasif; private int power; /** * Constructor de la clase, crea una nueva instancia de Kml * @param context el contexto de la actividad que lo llama, para abrir un DBHelper * @param tabla la tabla a exportar */ public Kml(Context context, String tabla) { db = new DataBaseHelper(context); DB = db.getReadableDatabase(); this.tabla = tabla; } /** * Crea el fichero .kml en la tarjeta de memoria, y un buffer va escribiendo los datos de la tabla * con el formato adecuado. */ public void copiar()
  • 20. { // TODO Auto-generated method stub //Abrimos un File a la ruta donde se guardará File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +"/kmls"); //File path = new File(Environment.getRootDirectory().getAbsolutePath()+"/kmls"); if(!path.exists()) path.mkdirs(); //Creamos el fichero en la ruta //File f = new File(path, "t"+formato.format(new java.util.Date()) + ".kml"); File f = new File(path, tabla+".kml"); //Creamos el Stream para escribir try { bw = new BufferedWriter(new FileWriter(f.getAbsolutePath())); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String select = "select _id, lat, lng, alt, ssid, bssid, pow, prot from "+tabla; Cursor c = DB.rawQuery(select, null); select = "select distinct bssid from "+tabla+" order by ssid"; Cursor d = DB.rawQuery(select, null); try { bw.write("<?xml version="1.0" encoding="UTF-8"?>n<kml xmlns="http://earth.google.com/kml/2.x">n<Document>n" + "<Style id="Azul"> <IconStyle> <Icon> <href>http://maps.google.com/mapfiles/kml/pushpin/blue- pushpin.png</href>" + "</Icon> </IconStyle> </Style> <Style id="Roja"><IconStyle>" + "<Icon> <href>http://maps.google.com/mapfiles/kml/pushpin/red- pushpin.png</href></Icon>" +
  • 21. "</IconStyle></Sty le><Style id="Amarilla"><IconStyle><Icon><href>http://maps.google.com/mapf iles/kml/pushpin/ylw-pushpin.png</href>" + " </Icon></IconStyle></Style><Style id="Verde"><IconStyle><Icon><href>http://maps.google.com/mapfile s/kml/pushpin/grn-pushpin.png</href>" + " </Icon></IconStyle></Style> " + "<Style id="Morada"><IconStyle><Icon><href>http://maps.google.com/mapfil es/kml/pushpin/purple-pushpin.png</href>" + " </Icon></IconStyle></Style>"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(c.moveToFirst() && d.moveToFirst()) { for(int j=0; j< d.getCount()-1; j++) { select = "select distinct ssid from "+tabla+" where bssid='"+d.getString(0)+"'"; Cursor kml = DB.rawQuery(select, null); kml.moveToFirst(); try { String name=kml.getString(0); bw.write("<Folder>n<name> "+name+" ("+d.getString(0)+")</name>n"); //C -> Toda la tabla ; D -> Solo 1 red for(int i = 0; i< c.getCount()-1; i++) { if(d.getSt ring(0).equals(c.getString(5))) { i f (name.contains("&")) name.replace("&", "Y"); p ower = c.getInt(6); i f(power <=65 ) clasif="Roja";
  • 22. i f(power >65 && power <=75) clasif="Amarilla"; i f(power >75 && power <=80) clasif="Verde"; i f(power <80 && power < 85) clasif="Morada"; i f(power>85) clasif="Azul"; bw .write("<Placemark id=""+kml.getString(0)+"" >n<name>"+name + "</name>n" + "<styleUrl>#"+clasif+"</styleUrl> " + "<Point> <coordinates>"+((double)c.getInt(2))/1000000+","+ ((double)c.getInt(1))/1000000+",0" + " </coordinates></Point>n</Placemark>n"); } c.moveToNe xt(); } d.moveToNext(); c.moveToFirst(); kml.moveToNext(); bw.write("</Folder >n"); } catch (IOException e) { // TODO Auto- generated catch block e.printStackTrace( ); } } try { bw.write("</Document>n</k ml>n"); bw.close(); DB.close(); } catch (IOException e) {
  • 23. // TODO Auto-generated catch block e.printStackTrace(); } } } } Todo esto pertenece a WifiStorer y esta todo en Google Code, aplicación desarrollada por Ontic. http://code.google.com/p/wifistorer/ 6. ANDROID MARKET Pagos, Actualizaciones ¿ Que terminales usan mi aplicación ? Cómo arreglo los bugs en un terminal.. especifico. Me han pirateado mi aplicación, soluciones. Supongo que hoy en día tenéis claro que el pago del Market es ridículo. Lo mejor del market, que a fecha de hoy están cambiando. El saber por terminales y versiones quien descarga tu aplicaciones. Si le falla a alguien te dice, modelo y kernel, para sabes si tiene uno modificado. De esta manera se arreglan los bugs de manera muy sencilla. Ni apple ni RIM tienen esto. Si falla en una pantalla muy pequeña o muy grande. Y a mucha gente, está claro que no es fortuito. Visita semanal es mi recomendación. Se pueden hacer parches en el código. Para leer un terminal id. Pero no espero que la gente se los sepa. En este Gibut están todos los vendo id de todos los terminales que van saliendo. Vendor ID en los Kernels https://github.com/HCDRJacob ¿ Te han pirateado tu aplicación ?
  • 24. Primer paso. Hacer valer tu © y comunicarte con los hosting donde los cuelgan. Ver que versión esta en la red. Y por que.... Discutamos soluciones.