Friday, November 9, 2012

"Google Play no acepta archivos APK firmados con el certificado de depuración. Crea un certificado nuevo que sea válido durante al menos 50 años."

He tratado de subir mi primera aplicación de android al market Google Play y me apareció el siguiente error:

"Google Play no acepta archivos APK firmados con el certificado de depuración. Crea un certificado nuevo que sea válido durante al menos 50 años."

Qué es lo que ocurre? El APK debe ser firmado para que no se pueda modificar a menos que se tenga la llave privada con la que se generó la firma. Sin esta firma, los dispositivos Android no querrán instalar una aplicación.
En un principio, cuando se está desarrollando, la aplicación se firma con una llave de debug, que sirve para poder depurarlo y probar la aplicación en tu dispositivo mientras haces pruebas. Para publicarlo en el market, esta firma debe cambiar ya que la firma de debug no es aceptada.

Si utilizan Basic4Android, hay una forma muy sencilla para solucionar este problema. Solo sigan este tutorial.
Pero no es mi caso, yo uso Eclipse. En el sitio de android developers se puede encontrar información al respecto. Aquí lo hay que hacer según android developers:



  • Obtain a suitable private key
  • Compile the application in release mode
  • Sign your application with your private key
  • Align the final APK package


  • Si están haciendo una aplicación nativa pueden utilizar el wizard de exportar de Eclipse el cual realiza todos estos pasos.

    Yo estoy trabajando en una aplicación multi-plataforma utilizando Rhomobile por lo que requiere seguir los pasos descritos, pero es muy fácil:

    Generar una clave privada, se debe usar un keytool. En Windows abrir consola y utilizar el siguiente comando:


    $ keytool -genkey -v -keystore nombre-de-mi-llave.keystore
    -alias nombre_alias -keyalg RSA -keysize 2048 -validity 10000

    Donde deben reemplazar "nombre-de-mi-llave" y "nombre_alias" por el que gusten. Cuando corran ese comando se les pedirá ciertos datos, incluida una clave la cual deben guardar muy bien ya que si alguien tiene acceso a ella y a la llave pueden manipular su aplicación.
    Si quieren más detalles sobre el comando lean aquí

    Una vez generada la llave. Abran su proyecto y vayan al build.yml y bajo android agreguen lo siguiente bajo production, de tal manera que se vea así:


    android:
      android_title: 0
      version: 2.3.3
      emulator: rhomobile
      production:
        certificate: E:/nombre-de-mi-llave
        password: "clave_de_la_llave"
        alias: "nombre_alias"


    ahora abran la consola de nuevo, vayan a la carpeta de su proyecto y corran el comando:

    rake device:android:production

    de manera que compile nuevamente el proyecto, pero esta vez utilizando la llave indicada para firmar el apk. Cuando corran esto se les pedirá que completen nuevamente los campos que fueron solicitados cuando generaron la llave. Terminado de correr el comando podrán navegar a la carpeta de su aplicación/bin/target y encontrarán el APK firmado y listo para ser subido a Google Play :)

    Bookmark and Share

    Monday, October 29, 2012

    Barra de búsqueda simple - Ruby on Rails


    Es muy sencillo agregar una barra de búsqueda en una aplicación de rails. Aquí un pequeño tutorial:

    1. Crear un form para enviar la solicitud con la palabra a buscar

    Por ejemplo en su index.html.erb coloquen el siguiente código para obtener un formulario como el de la imagen arriba:


    <%= form_tag({:controller => "products", :action => "index"}, :method => :get) do %>
    
        <%= text_field_tag "searchbox", params[:searchbox] %>
    
        <%= submit_tag "Buscar", :name => nil %>
    
    <% end %>

    Recuerden editar el controlador y la acción a la que ustedes necesitan, éstas debe corresponder a la misma que renderea el index.html.erb donde están colocando el código.

    2. Agregar código que incorpore la búsqueda:

    En el archivo del modelo, en este caso sería product.rb, colocar el siguiente código para filtrar los resultados según los parámetros ingresados en la búsqueda.


    def self.search(search)
    
     if search 
    
        where('title LIKE ?', "%#{search}%")
    
      else
    
        scoped
    
      end
    
    end

    En este caso deseo que mi búsqueda filtre de acuerdo al campo "title", ustedes deben editar eso de acuerdo a sus necesidades.

    3. Por ultimo, realizar la búsqueda/filtrado en el controlador para entregar los resultados a la vista index.html.erb, luego en products_controller.erb


    def index
    
      @products = Product.search(params[:searchbox])
    
        respond_to do |format|
    
          format.html # index.html.erb
    
        end
    
      end
    
    
    y listo, los resultados ahora serán filtrados cuando hagan clic en el botón buscar.

    Aquí algunos libros que les pueden ayudar a programar en Rails:

    Bookmark and Share

    Sunday, October 21, 2012

    Utilizar una Roku en Chile

    Como comenté en el post anterior, la Roku es una cajita muy poderosa a bajo precio, pero tiene la desventaja que está hecha para ser utilizada en Estados Unidos. Pero como (casi) todo, tiene una forma de funciona fuera de ese país.

    En pocas palabras, esto es lo que se debe hacer:

    1. Engañar la IP de la Roku
    2. Crear una cuenta de Roku
    3. Conseguir/comprar contenido para ver a través de la Roku.
    Detalles de los pasos a seguir:

    1. Para engañar la IP de la Roku hay que contratar un servicio que lo haga. Existen varios sistemas pagados y otros gratis. Hay que te tener cuidado cual contratar ya que podrían ver todos los datos que transfieres por internet incluyendo claves. En particular, el que más me convenció a mi fue Hide My Ass (https://hidemyass.com/vpn/). Con planes que van desde $11.52usd mensuales a $78.66usd anuales ($6.55usd mensual). Al contratar HMA, bajas un programita y con las credenciales que te pasan puedes engañar la IP de donde te conectas, le indicas un lugar de donde te deseas conectar y listo. El único problema es que ese programita sirve para Windows, Mac o Linux, pero qué hacer con la Roku? Para esto la nueva IP debe venir desde el router de donde se conecta la Roku.  HMA tiene sugerencias para lograrlo, desde sugerencias de routers hasta tutoriales para modificar el firmware de éstos y conectarse al VPN.
    Personalmente, compré un router adicional y traté de flashearlo (instalarle el nuevo firmware DD-WRT que es el que se necesita), pero no tuve mucho éxito. Terminé encontrando un sitio, FlashRouters, en estados unidos que te los venden flasheados y listos para conectarlos con HMA, sólo hay que ingresar las credenciales. Incluso si quieres, les puedes dar las credenciales a ellos y te lo dejan listo llegar y enchufar. 
    Si tienen internet movistar y están conectados a través de PPPoE, deben tener 2 routers. El router flasheado lo deben conectar al segundo router (un router que probablemente ya usaban y tenían en su casa) y ese router va conectado al modem. Si conectan el router flasheado directamente al modem no podrán tener internet, ya que no pueden conectarse al VPN y al PPPoE al mismo tiempo.

    2. Para poder habilitar los canales de interés en la Roku: Amazon, Netflix, Crackle, etc. Es necesario tener una tarjeta de crédito americana. Pero qué pasa si no tienen? Se puede arreglar. Hablen con el servicio al cliente de Roku, conectados a través de la VPN de estados unidos (cuando hablé con ellos revisaron la IP de donde estaba "comunicándome").  Por lo que al servicio al cliente les deben decir que no cuentan con una tarjeta americana, pero se encuentran en estado unidos y desean utilizar la Roku. Para ese caso ellos habilitarán una cuenta sin tarjeta y te advertirán que no podrás comprar canales ni cosas on-demand. Les dices que estás al tanto y listo. Los canales mencionados anteriormente no necesitan ser comprados (Ver punto 3).


    3. Existe contenido para ver en la Roku que requiere que tengan una suscripción de antemano.

    • Amazon Prime: Pagando $79usd anuales obtienes streaming ilimitado de ciertas películas habilitadas por Amazon. La biblioteca de películas habilitadas no es menor, pero de todas formas si quieren ver lo estrenos también lo pueden pagando ya que será cobrada la tarjeta de crédito que tengan en Amazon y no en Roku.
    • Netflix: Si tienen el Netflix chileno contratado con eso basta. Al detectar la IP americana accederán a la biblioteca de películas de Estados Unidos (mucho más surtida que la Chilena)
    • Crackle: Acceso a películas gratis.
    • Hulu: Ideal para ver series, pero sólo podrán tener acceso a este canal si contratan Hulu Plus, el cual requiere una tarjeta de crédito americana para suscribirse. Se pueden comprar tarjetas pre pagadas en estados unidos.


    Bookmark and Share

    Tuesday, October 9, 2012

    Roku - televisión por internet


    La roku es una pequeña cajita que sirve para ver televisión por internet. La gracia es que la conectes a tu pantalla para ver canales de streaming, y se conecta a internet de manera inalámbrica, como lo hace apple TV, pero significativamente más económico.

    Personalmente me compré el Roku 2 XD Streaming Player 1080p, pero existen varios modelos de los cuales puedes elegir según tu bolsillo y preferencias. El más económico comienza en 50USD en amazon.

    Mi roku 2 incluye un control remoto con botones de acceso directo a Netflix, Pandora y Crackle. Es bastante agradable. Me gusta que utilice poco espacio y es bastante rápido como software para moverse entre canales. Además de los canales ya mencionados, es posible conectarse a Amazon Prime, Hulu Plus y muchos más.

    Otra de las características de la Roku 2 XD es que puede mostrar películas en HD 1080p, a diferencia de la Roku HD.

    La letra chica de la cajita:

    *Para funcionar necesita estar en estados unidos
    *Tener una tarjeta de crédito de estados unidos (para poder comprar películas que no se puedan ver gratis)

    Pero no se decepcionen, existe una solución para estos requisitos. Les comentaré como arreglarlo más adelante.

    Bookmark and Share

    Wednesday, September 12, 2012

    Sliding Drawer en Android

    Sliding Drawer o cajón deslizable (?)

    Lo que hace el Sliding Drawer es esconder contenido de un usuario dejando sólo una lengüeta visible, así el usuario puede deslizar la lengüeta para ver el contenido.

    Como bien dice en http://developer.android.com este "cajón" se puede utilizar de manera vertical u horizontal. El xml está compuesto por dos hijos, uno referente al la lengüeta y otro al contenido de éste.

    La plantilla que http://developer.android.com utiliza un imageView para la lengüeta, yo utilicé en este caso un botón, de manera de no tener que lidiar con imagenes. Pero lo pueden cambiar a un imageView si desean. A su vez, cambié el tipo del contenido de GridView a un simple TextView para agregar texto.

    Primero, necesitan uno (o dos) templates para el fondo de la lengüeta y del contenido del cajón. En este caso yo use una plantilla de un fondo azul el cual debe colocarse en la carpeta drawable en un archivo llamado blue.xml por ejemplo.

    El contenido de éste archivo es el siguiente:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" >
            <shape>
                <solid
                    android:color="#449def" />
                <stroke
                    android:width="1dp"
                    android:color="#2f6699" />
                <corners
                    android:radius="3dp" />
                <padding
                    android:left="10dp"
                    android:top="10dp"
                    android:right="10dp"
                    android:bottom="10dp" />
            </shape>
        </item>
        <item>
            <shape>
                <gradient
                    android:startColor="#449def"
                    android:endColor="#2f6699"
                    android:angle="270" />
                <stroke
                    android:width="1dp"
                    android:color="#2f6699" />
                <corners
                    android:radius="4dp" />
                <padding
                    android:left="10dp"
                    android:top="10dp"
                    android:right="10dp"
                    android:bottom="10dp" />
            </shape>
        </item>
    </selector>
    La lengüeta es lo que tiene el texto "ayuda". Los otros botones que ven son del  proyecto en el que estoy trabajando, no tienen nada que ver con el sliding drawer

    Luego el xml del sliding drawer lo deben colocar dentro de un relativeLayout (o un FrameLayout) (en el xml del layout donde quieren que se vea)

    Así quedó mi sliding drawer:

     <SlidingDrawer
         android:id="@+id/drawer"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:handle="@+id/handle"
         android:content="@+id/content">
         <Button
             android:id="@id/handle"
             android:layout_width="88dip"
             android:layout_height="44dip"
             android:background="@drawable/blue"
             android:text="ayuda"
             android:textColor="#ffffff"/>
    
         <TextView
             android:id="@id/content"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:background="@drawable/blue"
             android:textColor="#ffffff"
             android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut condimentum commodo purus sit amet cursus. Pellentesque euismod nulla et mauris porttitor sit amet consectetur quam euismod. Proin augue ligula, commodo sit amet pellentesque at, bibendum in augue. Vestibulum a metus sit amet lacus porta molestie. Curabitur porta laoreet ipsum quis tincidunt. Nulla facilisi. Quisque dictum mollis ante id blandit. Nam in elit sit amet eros varius posuere id id dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis et nibh pretium nisl semper porta elementum sed justo. Sed et enim arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ac nunc eu est adipiscing condimentum id nec nisl. Proin massa erat, ultrices at ullamcorper in, consectetur nec tortor. Sed sed erat ante. Morbi eu nunc mauris." />
         </SlidingDrawer>
    
    

    Bookmark and Share

    Friday, September 7, 2012

    Verificar que una URL es de una imagen en Java/Android

    Si es necesario verificar que una URL es una enlace a una image, bastan 3 líneas de código para hacerlo:


    URLConnection connection = new URL("http://foo.bar/w23afv").openConnection();
    String contentType = connection.getHeaderField("Content-Type");
    boolean image = contentType.startsWith("image/");


    Lo que hace es ver si el encabezado del contenido de la página donde te lleva la url comienza con image/.

    Solución sacada de stackoverflow

    Bookmark and Share

    Friday, August 24, 2012

    Finalizar servidor en ubuntu

    En ubuntu se puede correr un servidor para utilizar una página web en localhost, el servidor se inicia a través de la consola comunmente: rails server, para una aplicación de Rails por ejemplo. Pero qué pasa cuando cerraste el terminal y el servidor sigue andando?

    Con el siguiente comando puedes ver los servidores que están andando y así obtener el PID para posteriormente cerrarlo.

    lsof -i :3000

    Al ejecutar ese comando en consola aparecerá una lista similar a la siguiente:


    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    ruby                3926 user      5u     IPv4    110440      0t0           TCP *:3000 (LISTEN)


    Como ven el PID aquí es el 3926, y podrán terminalo ejecutando lo siguiente

    kill -9 3926

    Bookmark and Share

    Tuesday, August 21, 2012

    Eliminar nombre de aplicación en barra de estado en Android

    Por defecto, las aplicaciones en android muestran una barra de estado con el nombre de la aplicación. Esto muchas veces se ve feo y se puede sacar de dos formas: De forma dinámica en una actividad y en el manifesto.

    Aquí la segunda forma, más rapida y requiere menos código:


    <activity android:name=".ActivityName"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
    </activity>

    Así se configura el estilo de la aplicación, se le saca la barra y se coloca en pantalla entera.


    Bookmark and Share

    Sunday, August 19, 2012

    Patrón de fondo en aplicaciones Android

    Buscando cómo colocar un patrón de fondo en una aplicación Android, me encontré con un excelente tutorial de Matt Swanson.

    Aquí lo que aparecía en el tutorial:


    1. Tener un imagen que pueda ser utilizada de patrón. Ésta se puede obtener del sitio Subtle Patterns donde hay decenas de patrones que se pueden elegir.
    2. Colocar el archivo nombrepatronescogido.png en la carpeta drawable.
    3. Crear el fondo con el patrón: Para esto creen un archivo xml en la carpeta drawable, llámenlo patron_de_fondo.xml por ejemplo. Dentro de este archivo colocar el siguiente código:
    4. <?xml version="1.0" encoding="utf-8"?>
      <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
          android:src="@drawable/patron_de_fondo"
          android:tileMode="repeat" />
    5. Agregar el fondo a alguna vista. Para ello deben agregar la linea android:background="@drawable/patron_de_fondo" a un layout, ejemplo:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/background_repeating"
        android:orientation="vertical" >
    </LinearLayout>

    Y listo, la aplicación ya tiene un lindo fondo.

    Bookmark and Share

    Friday, July 27, 2012

    Java: Como codificar una URL en UTF-8

    Existe una forma muy simple para codificar un String de URL en UTF-8:

     try{
       String encodedurl = URLEncoder.encode(url.toString(),"UTF-8"); 
       System.out.println(encodedurl);
      }catch(UnsupportedEncodingException e){
       System.err.println(e);
      }

    Al método donde agreguen estas lineas deberán agregar

       throws UnsupportedEncodingException

    Bookmark and Share

    Thursday, June 14, 2012

    Problema encontrando MySql2 luego de actualizar Ubuntu

    Si tienen problema encontrando MySql2 al actualizar Ubuntu a 12.04, luego de correr rails console por ejemplo, intenten lo siguiente:

    Desinstalen mysql2:
    gem uninstall mysql2

    Instalar de nuevo:
    Bundle install

    Así mysql2 empezará a utilizar la nueva librería de Ubuntu y el problema se habrá solucionado.

    Bookmark and Share

    Wednesday, May 30, 2012

    Pasando parámetros a un Intent en Android

    Hay distintas maneras de lograr esto (como en todo).  De las formas más sencillas es pasando datos como extras. Aquí el siguiente ejemplo:


    Intent myIntent = new Intent(this, MICLASE.class);
    
    myIntent.putExtra("una_llave", "valor_a_pasar");
    
    startActivity(myIntent);

    Más información de: putExtra()

    Luego en la clase MICLASE.java se pueden recuperar así:

    dentro del método onCreate(...)


    Bundle bundle = getIntent().getExtras();
    
     if(bundle.getString("una_llave")!= null)
     {
    
         //TODO hacer lo que se quiera con el string
     }


    Bookmark and Share

    Buscar archivos en Linux que contengan cierto texto

    Si quieren buscar un archivo en Linux que contengan cierto texto. Inicien una consola y diríjanse a la carpeta padre donde quieren buscar. Luego ingresen el siguiente comando:

    find . | xargs grep 'texto' -sl

    Pueden reemplazar donde dice "texto" por el texto que quieren buscar.

    Bookmark and Share

    Wednesday, May 16, 2012

    Agregar todos los archivos que no han sido versionados a SVN

    En  ubuntu se pueden agregar todos los archivos que no han sido versionados con una simple linea de comando:

    svn add . --force

    o bien:

    svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add


    No se si sea la mejor opción, pero hace el trabajo que uno necesita.
    Se pueden encontrar otras alternativas aquí.

    Bookmark and Share

    Monday, May 7, 2012

    Utlizando tildes y 'ñ' en controladores de RoR

    Si en su base de datos y parámetros utlizan palabras con tildes y con 'ñ' deben asegurarse que se está codificando en utf-8.

    En particular, para que un controlador acepte estos caracteres, deben colocar:

    #coding: utf-8
    al inicio del controlador, antes de class MiController < ApplicationController

    Bookmark and Share

    Sunday, April 15, 2012

    Rellenando un spinner manualmente (Android)

    Hay distintas formas para llenar un spinner en Android. En la página de desarrolladores de Android, hay un tutorial para llenar un spinner a través de una lista estática creada en la carpeta de recursos, pero qué pasa si uno la quiere llenar de forma dinámica, donde los valores que se incluyan dependen de cierto parámetro?
    Para este problema encontré un tutorial muy bueno, fácil y rápido para solucionar este problema.

    Primero, debemos crear un adpatador del tipo CharSequence donde agregaremos los items que queremos. Para eso tenemos las siguientes lineas de código:

     ArrayAdapter <CharSequence> adapter =
      new ArrayAdapter <CharSequence> (this, android.R.layout.simple_spinner_item );
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    

    No deben cambiar nada de lo de arriba.
    Luego deben agregar los itemes a mostrar de la forma

    adapter.add("item 1");

    Luego asignamos estos datos al spinner que queremos:


    Spinner s = (Spinner) findViewById(R.id.mi_spinner);
    
            		s.setAdapter(adapter);


    y listo!

    Bookmark and Share

    Friday, April 6, 2012

    Diálogo de selección multiple

    Encontré un excelente tutorial para crear diálogos de multiselección en Android, lo comparto con ustedes aquí un poco modificado y con algunos comentarios y sugerencias para que no tengan los mismos problemas que yo:


    Primero, deben decidir desde donde quieren mostrar este diálogo, es decir qué quieren que gatille el diálogo. Puede ser un botón cualquiera, un botón  en el menú de opciones o puedes querer que se gatille cada vez que se inicie una nueva actividad (un Intent nuevo).

    Independiente de cómo quieran que se gatille, deben realizar la misma llamada en los correspondientes métodos donde se gatillan las actividades de cada una de las cosas de arriba. Es decir, para el caso del botón colocarlo en el OnClick(...), en el caso del menú de opciones en el onOptionsItemSelected(...) y en el caso de una actividad, en el onCreate(...). Lo que deben colocar es:

    showDialog( 0 );

    Antes de crear el diálogo. Debemos crear un arreglo de las opciones a mostrar en el diálogo como atributos de la clase, de esta manera:

    public CharSequence[] dialogOptions = {"opción 1", "opción 2", "opción 3"};
    y también crear un arreglo de booleanos donde se guardará la información sobre las opciones seleccionadas. Este segundo arreglo debe tener el mismo largo:

    public boolean[] dialogSelections =  new boolean[ dialogOptions.length ];
    Luego se deben crear 3 métodos, en la misma clase donde se llama a showDialogo(0);
    El primero crea el diálogo:


    @Override
    
     protected Dialog onCreateDialog( int id ) {
    
      return new AlertDialog.Builder( this )
              .setTitle( "Título del diálogo")
                    .setMultiChoiceItems( dialogOptions, dialogSelections, new DialogSelectionClickHandler() )
                    .setPositiveButton( "OK", new DialogButtonClickHandler() )
                    .create();
     }
    
    
    
    
    en el setMultiChoiceItems, se le entregan las opciones a desplegar, el arreglo donde guardar la selección y un Handler que puede realizar algo cada vez que se seleccionar una opción. Este último es algo así:


    public class DialogSelectionClickHandler implements OnMultiChoiceClickListener {
    
      @Override
    
      public void onClick(DialogInterface arg0, int arg1, boolean arg2{
        //no hace nada por ahora
       //si se saca la selección no funciona
      }
     }
    
    
    Si no necesitan hacer nada, le recomiendo que lo coloquen igual. Al menos a mi no me guardaba la selección a menos que tuviera el método creado.

    Por último, el método que realiza la acción una vez que se hace click en el botón "aceptar" u "ok", como le hayan llamado. Este es el método:


    public class DialogButtonClickHandler implements DialogInterface.OnClickListene {
    
      public void onClick( DialogInterface dialog, int clicked ) {
    
       switch( clicked ) {
        case DialogInterface.BUTTON_POSITIVE:
         //realizan sus acciones acá.
    
         break;
       }
      }
     }
    
    Eso es todo.


    Bookmark and Share

    Saturday, March 31, 2012

    Cargando datos iniciales en el ambiente de producción

    Si han cargado datos en el archivo seed.rb de rails y desean cargar estos datos en el ambiente de producción en lugar de el de desarrollo. No basta con correr rake db:seed, deben indicarle a rails que quieren correr los datos en la base de datos de producción. Esto se hace con este sencillo código:

     rake db:seed RAILS_ENV=production

    Recuerden estar en la carpeta adecuada de su aplicación.

    Bookmark and Share

    Tuesday, January 31, 2012

    Un HelloWorld de GoogleMaps en Android [Tutorial]

    Asumiendo que ya tienen un proyecto creado, deben seguir las siguientes instrucciones para hacer funcionar GoogleMaps en su applicación Android:

    1. Antes que todo, deben saber que para hacer funcionar los mapas, deben conseguir una API key, una clave, gratuita proporcionada por Google. Ésta es única para cada computador, por lo que si trabajan colaborativamente, no podrán usar una sola clave para el proyecto, cada uno debe tener la suya.

    Las instrucciones las pueden obtener aquí http://code.google.com/intl/es/android/add-ons/google-apis/mapkey.html  (en inglés) Si necesitan ayuda con eso, escriban en los comentarios.


    Ahora que tienen la apikey, seguimos con nuestr aplicación:

    2.  Creen una nueva vista (donde mostrarán el mapa). Vayan a la carpeta res/layout y creen un archivo nuevo, llámenlo mapview.xml .
    3.  Creen una nueva clase, llámenla GoogleMapActivity (aparecerá como GoogleMapActivity.java)
    4. El GoogleMap debe extender de MapActivity para poder hacer funcionar el mapa. El código base que deben tener en esa clase es:

    package el.nombre.de.su.paquete;
    
    import android.os.Bundle;
    import com.google.android.maps.MapActivity;
    
    public class GoogleMapActivity extends MapActivity {
    
        /*Se llama cuando la actividad se crea inicialmente*/
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
    
          /*Configuramos el contenido para que se muestre en la vista que creamos en el paso 2.*/
            setContentView(R.layout.mapview);
        }
    
        @Override
        protected boolean isRouteDisplayed() {
            return false;
        }
    }

    5. En el manifest se deben agregar algunas líneas de código:

    <uses-permission android:name="android.permission.INTERNET"/>
    
    esto debe ir dentro de los tags:
     <manifest> </manifest>

    y dentro de los tags 
    <aplication> </aplication>
    deben agregar:

    <uses-library android:name="com.google.android.maps"></uses-library>

    6. Y con eso ya estamos listos. Ahora para llamar al mapa con un boton, hay que agregar el botón al main.xml de res/layout, llamar a la actividad desde la actividad principal con el siguiente código por ejemplo:


    Button btn_map = (Button) findViewById(R.id.button2);
    btn_map.setOnClickListener(new OnClickListener() {
    
    @Override
    public void onClick(View v) {
     Intent myIntent = new Intent(this, GoogleMapActivity.class);
         startActivity(myIntent);
     }
    });

    y agregar la actividad al manifiesto:
         
     <activity android:name=".GoogleMapActivity"></activity>

    OJO: Recuerden que en las propiedades del proyecto el target debe estar configurado para un Google APIs



    Este tutorial fue posible gracias a este link (en inglés).

    Bookmark and Share

    Saturday, January 28, 2012

    Abrir la consola desde cualquier carpeta

    No es nada nuevo, pero siempre se me olvida qué es lo que hay que instalar para poder abrir una consola desde cualquier carpeta.

    En Ubuntu 11.10, se puede ir al "Ubuntu Software Center" y buscar el programa:

    nautilus-open-terminal

    Una vez instalado, es recomendable reiniciar el computador.

    Ahora podrán abrir una carpeta cualquiera, hacer click derecho y tendrán en el menú una nueva opción que te permite abrir una consola "Open in Terminal". Así la consola estará ubicada en esa carpeta y no es necesario navegar a ese directorio de forma manual.

    Bookmark and Share

    Wednesday, January 25, 2012

    Accediendo a la Bios teniendo FreeDOS

    Para acceder a la BIOS al arrancar el computador, presionar la tecla "del" o "supr" antes de que aparezca el menu de FreeDOS.

    Bookmark and Share

    Monday, January 16, 2012

    Widget de entradas relacionadas

    Hoy encontré un widget que me gustó mucho y quiero compartirlo con ustedes.
    Se trada de Link Within un widget que publica entradas (posts) relacionadas al post actual, al final de éste.

    Es muy fácil agregarlo a blogger y no requiere registrarse. Basta colocar su mail, la url de su blog, indicar donde se aloja su blog y la cantidad de entradas y luego hacer click en agregar widget y listo! Tienen posts relacionados en cada una de las entradas de su blog.

    No solo funciona con Blogger, también sirve para blogs de Wordpress y TypePad.

    En caso que sus entradas tengas fotos, estos links incluirán la primera foto. En caso que no lo tengan, sólo será un link de texto.

    Bookmark and Share
    Related Posts Plugin for WordPress, Blogger...