Seminario Android (Parte 1) - movilforum

24
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

Transcript of Seminario Android (Parte 1) - movilforum

Page 1: Seminario Android (Parte 1) - movilforum

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

Page 2: Seminario Android (Parte 1) - movilforum

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

Page 3: Seminario Android (Parte 1) - movilforum

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.

Page 4: Seminario Android (Parte 1) - movilforum

2. SDK

y el path para el eclipse

Page 5: Seminario Android (Parte 1) - movilforum

C:\Android\android-sdk-windows\tools\

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.

Page 6: Seminario Android (Parte 1) - movilforum

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.

Page 7: Seminario Android (Parte 1) - movilforum

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.

Page 8: Seminario Android (Parte 1) - movilforum

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

Page 9: Seminario Android (Parte 1) - movilforum

Ahora mismo vemos en conjunto.

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

El código...

02<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

03 android:layout_width="fill_parent"04 android:layout_height="fill_parent">05 <TextView06 android:id="@+id/label_a"07 android:layout_width="fill_parent"08 android:layout_height="wrap_content"

09 android:text="Operacion A:"/>

10 <EditText11 android:id="@+id/op_a"12 android:layout_width="fill_parent"13 android:layout_height="wrap_content"

14 android:background="@android:drawable/editbox_background"

15 android:layout_below="@id/label_a"/>16 <TextView

Page 10: Seminario Android (Parte 1) - movilforum

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 <EditText23 android:id="@+id/op_b"24 android:layout_width="fill_parent"25 android:layout_height="wrap_content"

26 android:background="@android:drawable/editbox_background"

27 android:layout_below="@id/label_b"/> 28 <Button29 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 <Button38 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 <Button46 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 <Button54 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"

Page 11: Seminario Android (Parte 1) - movilforum

60 android:text="/" /> 61 <TextView62 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 <TextView68 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

Page 12: Seminario Android (Parte 1) - movilforum

10 // Instancias OBJETOS a USAR11 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 OBJETOS20 this.op_a = (EditText) findViewById(R.id.op_a);21 this.op_b = (EditText) findViewById(R.id.op_b);

22 this.resultado = (TextView) findViewById(R.id.resultado);

23 }24 25 public void cSumar(View view) {

26 if(this.op_a.getText().toString().length() > 0 && this.op_b.getText().toString().length() > 0) {

27 this.valor_a = Double.parseDouble(this.op_a.getText().toString());

28 this.valor_b = Double.parseDouble(this.op_b.getText().toString());

29 this.resultado.setText(Double.toString((this.valor_a + this.valor_b)));

30 }31 }32 33 public void cRestar(View view) {

34 if(this.op_a.getText().toString().length() > 0 && this.op_b.getText().toString().length() > 0) {

35 this.valor_a = Double.parseDouble(this.op_a.getText().toString());

36 this.valor_b = Double.parseDouble(this.op_b.getText().toString());

37 this.resultado.setText(Double.toString((this.valor_a - this.valor_b)));

38 }39 }40 41 public void cMultiplicar(View view) {

42 if(this.op_a.getText().toString().length() > 0 && this.op_b.getText().toString().length() > 0) {

43 this.valor_a = Double.parseDouble(this.op_a.getText().toString());

44 this.valor_b =

Page 13: Seminario Android (Parte 1) - movilforum

Double.parseDouble(this.op_b.getText().toString());

45 this.resultado.setText(Double.toString((this.valor_a * this.valor_b)));

46 }47 }48 49 public void cDividir(View view) {

50 if(this.op_a.getText().toString().length() > 0 && this.op_b.getText().toString().length() > 0) {

51 this.valor_a = Double.parseDouble(this.op_a.getText().toString());

52 this.valor_b = Double.parseDouble(this.op_b.getText().toString());

53 if(this.valor_b != 0) {

54 this.resultado.setText(Double.toString((this.valor_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.

Page 14: Seminario Android (Parte 1) - movilforum

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,

Page 15: Seminario Android (Parte 1) - movilforum

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();

Page 16: Seminario Android (Parte 1) - movilforum

//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();

Page 17: Seminario Android (Parte 1) - movilforum

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);

}

@Overrideprotected boolean isRouteDisplayed() {

// TODO Auto-generated method stubreturn 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. */@Overridepublic boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) {

case 0:

Page 18: Seminario Android (Parte 1) - movilforum

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 [email protected] */

Page 19: Seminario Android (Parte 1) - movilforum

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 [email protected] * */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()

Page 20: Seminario Android (Parte 1) - movilforum

{ // 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>" +

Page 21: Seminario Android (Parte 1) - movilforum

"</IconStyle></Style><Style id=\"Amarilla\"><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>" + " </Icon></IconStyle></Style><Style id=\"Verde\"><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png</href>" + " </Icon></IconStyle></Style> " + "<Style id=\"Morada\"><IconStyle><Icon><href>http://maps.google.com/mapfiles/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.getString(0).equals(c.getString(5))) { if (name.contains("&")) name.replace("&", "Y"); power = c.getInt(6); if(power <=65 ) clasif="Roja";

Page 22: Seminario Android (Parte 1) - movilforum

if(power >65 && power <=75) clasif="Amarilla"; if(power >75 && power <=80) clasif="Verde"; if(power <80 && power < 85) clasif="Morada"; if(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.moveToNext(); } 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</kml>\n"); bw.close(); DB.close();

} catch (IOException e) {

Page 23: Seminario Android (Parte 1) - movilforum

// 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 ?

Page 24: Seminario Android (Parte 1) - movilforum

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.