Aprende Android Lección 04

En (aprende android) por benoffi7 el 26-09-2011

Cuarta lección de la serie que estoy armando sobre la programación en Android. Cada vez que me siento a preparar el tema, luego grabarlo y editarlo me agarra un entusiasmo enorme porque me gusta la idea de compartir conocimiento y saber que estoy contribuyendo un poco a la comunidad de desarrolladores.

 

Aqui les dejo los videos:

 

 

 

 

Aqui les dejo el code: Google Code – Aprende Android

Espero que hayan disfrutado de este nuevo video tutorial y cualquier duda o sugerencia los espero con los brazos abiertos en esta entrada!

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Aprende Android Lección 03

En (aprende android) por benoffi7 el 20-09-2011

Ya hemos llegado al tercer tutorial de Aprende Android y esto se va poniendo bueno con cada entrega de estos mini-tutoriales que estoy haciendo de manera de hobbie pero lo más serio posible.

 

A medida que avanzamos, aprendemos nuevos conceptos y vemos las posibilidades de la programación en Android. Mi humilde objetivo es darles un pantallazo general sobre estas nuevas herramientas e iniciarlos en el mundo Android.

 

Aqui los dos videos:

 

 

 

Aqui les dejo el code por si quieren echarle un vistazo.

 

Hasta el próximo tutorial!

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Windows oWindows = new Windows (8,beta)

En (reviews) por benoffi7 el 20-09-2011

Antes que nada, ¿algún titulo de blog más nerd que este?. Jejejeje. Caída día me sorprendo más de mi mismo. (?)

 

Vayamos a lo que nos compete y dejemos las tonterías solo por un tiempo.

 

Luego de varios intentos pude echarle una mirada al nuevo producto de los chicos de Microsoft. Su aun en beta, Windows 8. Hace varios meses se dejaban ver algunos videos sobre determinadas características de este nuevo SO y hace unas semanas se libero una descarga (en forma de ISO) para probar Windows 8 y poder programar algo en el. Como buena geek no me resistí y me lo baje para ver que andan haciendo los ex de Bill Gates.

 

Preparando el entorno

 

Lo primero es lo primero, tienen que tener el Windows 8. Aqui la pagina de descargas oficial (recomiendo la que dice Windows Developer Preview English, 32-bit (x86)). Este SO se puede instalar como cualquier otro SO pero YO no lo recomiendo a menos que sea una compu con los HD limpio y no su maquina principal. Estamos hablando de un producto en beta todavía. Mi solución fue la virtualización. Con el Virtual Box anda perfecto siguiendo esta configuración que me la acerco mi amigo @miguelos

 

Una imagen  un video y un álbum valen mas que mil palabras

 

 

 

Algunas impresiones

 

Este nuevo SO esta pensado más para tabletas o pantallas touchscreen porque es más “divertido” pasar las aplicaciones o moverse por el nuevo escritorio con el dedo con un mouse pero funciona igual de bien en una desktop o notebook normal pero sin la “magia”.

Windows 8 propone en sus comienzo una nueva forma de ver el escritorio en esta nueva gran app con el estilo Metro. Aqui encontramos los últimos updates en twitter o facebook, informacion del clima o nuestras acciones, los mails, etc. También aparecen los viejos iconos. Además podemos volver siempre al escritorio regular.

Esta previa viene con algunas apps ya cargadas (la del avioncito es genial) donde algunas esta bien preparadas como el lector de blogs o la de facebook y a otras les falta un golpe de horno como la de twitter. Supongo que son nativas esas.

Luego hubo cambios en la pantalla de desbloqueo (posibilidad de dibujar una forma sobre una imagen como contraseña) y en el administrador de tareas (muy completo ahora).

La forma de moverse entre las aplicaciones es simplemente genial. Creo que los chicos de Microsoft se encuentran justo entre lo muy nerd (Linux) y lo muy superficial (Mac OSX).

Veremos las próximas actualizaciones y su integración con su SO Móvil.

 

Si todavía no has probado este nuevo Windows 8, te invito a hacerlo y no perder la oportunidad. Si en cambio ya lo probaste, deja tu impresión acá así todos compartimos nuestras experiencias con este nuevo bebe.

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Resumen de entradas en la wiki Android Parte 3

En (wiki) por benoffi7 el 19-09-2011

Aqui nuevas cinco entradas en mi wiki de Android que os invito a participar y sumar su conocimiento para formar una gran biblioteca de snippets androianos.

 

  1. Bloquear orientación de la pantalla: quizás en algunas aplicaciones no queremos que se pueda rotar la pantalla porque nuestros layouts no están preparados para dicha orientación.

 

 

2. Evento onClick en un componente: uno de los fundamentos en la programación Android. Darle vida a un componente a través del click sobre ese elemento.

 

 

3. Find by id: otra pieza clave en el desarrollo en Android. Una simple linea y ya tenemos nuestros componentes XML en nuestras clases Java.

 

4. Fuentes personalizadas: para darle otro aspecto a nuestras interfaces de usuario.

 

 

5. Lanzar una nueva ventana: para movernos de un layout a otro y darle dinamismo a nuestra app.

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Visualizar una imagen de internet en Android

En (tutoriales) por benoffi7 el 15-09-2011

Si necesitamos tener una aplicación cuyos contenidos sean dinámicos y no estar liberando actualizaciones masivas todos los días y molestar al usuario podemos descargar dicho contenido de internet. Hoy veremos una forma media sencilla de como visualizar una imagen que se encuentra en internet solo introduciendo su URL. En este ejemplo, la URL la proporcionamos nosotros desde un editText pero tranquilamente podría ser una variable o un dato almacenado en una bd. Hay que recordar que dicha URL debe tener el protocolo http:// delante sino el ejemplo no funciona.

1) Primero debemos preparar el layout donde trabajaremos.

Agregamos un edittext, un button y un imageView


<EditText android:layout_height="wrap_content"
android:id="@+id/editText1" android:layout_width="match_parent">
</EditText>
<Button android:id="@+id/button1" android:text="Magia"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
</Button>
<ImageView android:layout_height="wrap_content" android:src="@drawable/icon"
android:id="@+id/imageView1" android:layout_width="wrap_content">
</ImageView>

 

 

2) Creamos una clase Java cuyo setContentView será este layout y “levantamos” dichos componentes y los almacenamos en nuestras variables globales.

 

private Button btn;
private ImageView m_imageView;

private EditText inputUrl;

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        inputUrl = (EditText)findViewById(R.id.editText1);
        m_imageView = (ImageView)findViewById(R.id.imageView1);
        btn=(Button)findViewById(R.id.button1);
        ...
3) Establecer el comportamiento del botón, que descargara la imagen.
No se asusten en este paso porque tirara un error que todavía falta codigo
por explicar.


btn.setOnClickListener(new OnClickListener()
{
     @Override
     public void onClick(View arg0)
     {
            String url=inputUrl.getText().toString();
            if (url.length()>0)
            {
               new DownloadImageTask().execute(url);
            }
      }
});

4) Crear un clase inside de la clase que estamos trabajando.


 class DownloadImageTask extends AsyncTask<String, Void, Drawable>
     {

          final ProgressDialog progressDialog = new ProgressDialog(main.this);

            protected void onPreExecute()
            {
                progressDialog.setTitle("");
                progressDialog.setMessage("Cargando imagen...");
                progressDialog.show();
            }

            protected Drawable doInBackground(String... urls)
            {
                Log.d("DEBUG", "drawable");

                return downloadImage(urls[0]);

            }

            protected void onPostExecute(Drawable imagen)
            {

                m_imageView.setImageDrawable(imagen);
                progressDialog.dismiss();
            }

            /**
 * Devuelve una imagen desde una URL
 * @param url Url de la imagen
 * @return Una imagen
 */
            private Drawable downloadImage(String imageUrl)
            {
                try
                {
                    URL url = new URL(imageUrl);
                    InputStream is = (InputStream)url.getContent();
                    return Drawable.createFromStream(is, "src");
                }
                catch (MalformedURLException e)
                {
                    e.printStackTrace();
                    return null;
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                    return null;
                }
            }
     }

Expliquemos un poco el codigo. Lo primero que hacemos es crear una tarea asíncrona. ¿Que es una tarea asíncrona? Es un hilo de ejecución adicional a nuestra aplicación para realizar una tarea que puede (o no) demorarse demasiado. Con este hilo, la aplicación funciona correctamente mientras este hilo hace su trabajo. Esta AsyncTask tiene cuatro métodos principales.

  1. onPreExecute: antes de ejecutarse. Seteamos el titulo, el mensaje y empezamos a mostrar el progress dialog.
  2. doInBackground: la tarea propiamente dicha la haremos acá. En nuestro caso descargar la imagen según la url que le hayamos pasado cuando hacemos click.
  3. onPostExecute: cuando el hilo finalizo cerramos el progress dialog y seteamos la imagen devuelta a nuestro imageView.
  4. downloadImage: [este método lo creamos nosotros. Los restantes tres son obligatorios por la implementación de la clase] acá descargamos la imagen haciendo una petición http

También deben agregar un permiso de uso de internet dentro del manifiesto (luego del tag application)

<uses-permission android:name="android.permission.INTERNET" />

Aqui un video de como debería funcionar el ejemplo:


Cualquier duda o comentario del ejemplo no duden en dejar un comentario en esta entrada.

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Feliz Día del Programador!!!!

En (off topic) por benoffi7 el 13-09-2011

Hoy y gracias a un decreto de Dmitry Medvedev se celebra en todo el mundo el día del Programador y como este es un blog de programación y soy un programador nos sumamos en este día festivo!

 

 

Los programadores debo reconocer que somos personas muy extrañas porque así lo requiere nuestra gran labor. Codificar y codificar miles de línea de codigo, acordarse de todas y cada una de ellas para que cuando surja un error poder encontrarlos. Son personas que están pensando todo el día en algoritmos complejos para solucionar problemas que no los dejan continuar con sus días. Personas que son sencillas en sus vidas 1.0 pero que atrás esconden una gran personalidad.

 

 

A lo largo de los años, el programador ha tenido que mutar y aprender nuevas como diseño, para que sus desarrollos no lo sean eficientes sino usables para el usuario, también a aprendido a tener un blog (con todo lo que ello significa, diseño, plugins, constancia, escritura, social media) por si tiene que escribir algún tutorial ofreciendo a la comunidad sus aprendizajes o si tiene que promocionar sus trabajos y también a usar las redes sociales para difundir sus proyectos, conseguir colaboradores o ponerse en contacto con sus pares en otras latitudes.

 

También ha sabido moverse a los largo de los años a través de lenguajes y plataformas. Así como un día empezó con .NET programando para el escritorio de Microsoft, luego con Java para hacerlo multiplaforma y también con JSF y los servlets y beans y más tarde todo cambio para moverse a los teléfonos celulares y programar contra una pantalla de 4 pulgadas como máximo y un sinfín de limitaciones pero un mundo de posibilidades que nos ofrecen las apps tanto de iPhone y Android.

 

 

 

El oficio de programador es muy complicado no solo por la presión e intensidad que imprime en cada codigo sino también porque siempre debe estar con lo ultimo tanto en lenguajes de programación como en plataformas de desarrollo y no quedarse obsoleto. Pero lo que mas me encanta de programar es la adrenalina de un nuevo proyecto y toda esa pasión inicial, la posibilidad de sentirse como Sherlock Holmes buscando errores en miles de miles de línea de codigo o sentirse un científico probando hipótesis ante un problema y descubrir la solución en el momento menos pensado y también la alegría de ver un trabajo terminado luego de meses de arduo trabajo.

 

 

 

A pesar de tener 23 años tengo una buena cantidad de experiencia programando. En la secundaria me recibí de Técnico en Informática orientado a Programación y en aquellos tiempos era la época de Pascal, Visual Basic o Delphi.

 

Luego en la Universidad donde me recibí de Analista de Sistemas aprendí a usar C#, C++ y Java tanto web como escritorio.

 

Y ahora programo con mis amigos y tenemos una compañía de aplicaciones de Android y nos manejamos nosotros solos pero con todo lo aprendido a lo largo de esos años maravillosos.

 

Les deseo un muy feliz día a todos y la mejor manera de celebrarlo es CODDING!!!!!!

 

 

Para todos aquellos que empezaron un proyecto con un simple formulario de altas, bajas y modificaciones y, a base de solicitudes del cliente, llegaron a crear un sistema de inteligencia artificial llamado Skynet

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Pantalla de inicio Android

En (tutoriales) por benoffi7 el 12-09-2011

La mayoría de las aplicaciones en Android, al abrirlas, tienen una simple pantalla donde muestran el logo de la compañía desarrolladora, el nombre de la app y quizás algún sonido corto. No hacen nada más que eso y duran algunos instantes. Aquí les muestro como implementar su propia splash creen.

 

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);

    // thread for displaying the SplashScreen
    Thread splashTread = new Thread() {
        @Override
        public void run() {
            try {
                int waited = 0;
                while(_active && (waited < _splashTime)) {
                    sleep(100);
                    if(_active) {
                        waited += 100;
                    }
                }
            } catch(InterruptedException e) {
                // do nothing
            } finally {
                finish();
                startActivity(new Intent()); // aqui ira su pantalla de inicio
                stop();
            }
        }
    };
    splashTread.start();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        _active = false;
    }
    return true;
}

Lo que hace este código es crear un hilo que dura el tiempo que queramos, en este caso 100 milisegundos y cuando finaliza dicho tiempo es lanzar la actividad que nosotros queramos. Acuérdensen que tiene que crear el layout splash (con los que ustedes quieran pero tiene que ser simple y claro) y además tienen que declarar esta clase en su manifiesto como siempre lo hacemos.

Cualquier duda no dejen de escribir un comentario en esta entrada. Muchas gracias!

[FIXED]

Gracias a un comentario me di cuenta que no puse la declaracion de las variables _active y -splashTime. Ambas deben declararse como globales

public class SplashScreen extends Activity
{
    protected boolean _active = true;
    protected int _splashTime = 2000;
    ...
}

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Aprende Android Lección 2

En (videos) por benoffi7 el 06-09-2011

Ya se ha publicado con exito el segundo tutorial de Aprende Android.

En esta segunda clase aprendemos dos componentes basicos de android. El TextView y el el Button.

Vemos algunas de sus propiedades y eventos.

[youtube]http://www.youtube.com/watch?v=Xu9K2TXtK9I[/youtube]

Aquí les dejo el code correspondiente del proyecto:

Gracias por leer, no se olviden de comentar y hasta la post que viene, amigos.

Enlaces de interés

Mi canal de YouTube

Wiki Android

Coffee And Cookies – Desarrollo de App Android

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Usando la Cámara en Android

En (tutoriales) por benoffi7 el 05-09-2011

Luego de mucho investigar he dado con el code para sacar, seleccionar y mostrar fotos en nuestra aplicación en Android. No usar la cámara propiamente dicha sino que lanza la aplicación Camera de nuestro dispositivo. Si nuestros objetivos son simples siempre es conveniente usar lo que ya esta hecho y obtener los datos obtenidos. Otros ejemplos son para ver videos en YouTube o escribir y mandar mails.

Este ejemplo cuenta con tres botones (sacar foto, seleccionar una del carrete y uno para mostrar) y un imageview que será el contenedor de la imagen seleccionada.

 

Antes que nada tenemos que definir dos variables globales:

  private static final int REQUEST_CAMERA = 1;
  private static final int REQUEST_SELECT_PHOTO = 0;

Lo primero que tenemos que hacer es levantar los componentes para luego usarlos:

        btn_camera=(Button)findViewById(R.id.button1);
        btn_seleccionar=(Button)findViewById(R.id.button2);
        btn_mostrar=(Button)findViewById(R.id.button3);
 

Ahora vamos a definir el comportamiento de los tres botones:

 

1) Botón de Cámara

 
String state = Environment.getExternalStorageState();
                if (Environment.MEDIA_MOUNTED.equals(state))
                {
                    long captureTime = System.currentTimeMillis();
                    photoPath = Environment.getExternalStorageDirectory() 
                     + "/DCIM/Camera/Point" + captureTime + ".jpg";
                    try
                    {
                        Intent intent = 
                        new Intent("android.media.action.IMAGE_CAPTURE");
                        File photo = new File(photoPath);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photo));
                        startActivityForResult
                        (Intent.createChooser(intent, "Capture Image"), REQUEST_CAMERA);
                    }
                    catch (Exception e)
                    {
                    }
                }
 
 

Lo que hacemos acá es lanzar el intento de la aplicación de la cámara. Lo ejecutamos como

ActivityForResult porque esperamos un resultado que será la imagen obtenida. El segundo parámetro

es la variable que definimos anteriormente para luego capturarla cuando vuelve a nuestra app y saber

de donde estamos volviendo ( porque podemos volver de muchos lados :) )

 

2) Botón seleccionar:

  btn_seleccionar.setOnClickListener(new OnClickListener()
        {
		@Override
		public void onClick(View v)
		{
			Intent ii = new Intent(Intent.ACTION_PICK) ;
			ii.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
			MediaStore.Images.Media.CONTENT_TYPE) ;
			startActivityForResult(ii,REQUEST_SELECT_PHOTO) ;
		}
		});
 

Acá hacemos algo parecido que el botón anterior pero lanzamos el intento del pick de la imagen.

Yo tengo la filosofía de que si algo esta hecho, funciona y se puede reutilizar para nuestro

beneficio hay que usarlo. No hay que perder el tiempo reinventando la rueda sino dándole nuevos y

mejores usos. Ademas hay que aprovechar todo lo hecho y todas sus funcionalidades ya implementadas.

Volviendo al code, vemos que el segundo parámetro del intento es la segunda variable que definimos

de manera global.

3) Botón mostrar

     btn_mostrar.setOnClickListener(new OnClickListener()
        {
		@Override
		public void onClick(View v)
		{
			if (path!=null)
			{
				File imgFile = new  File(path);
				if(imgFile.exists());
				{
					Bitmap myBitmap = 
                                              BitmapFactory.decodeFile(imgFile.getAbsolutePath());
					ImageView myImage = (ImageView) findViewById(R.id.imageView1);
					myImage.setImageBitmap(myBitmap);
				}
			}
		}
        });

Lo que hacemos aquí es recuperar el path obtenido tanto de haber sacado una foto o haber seleccionado una y creamos una imagen a partir de la ruta. Luego simplemente la mostramos en el imageview.

Ambos intentos (lanzar la cámara o el picker de fotos) fueron lanzados esperando un resultado. Al completar nuestra actividad en ellos (sacar una foto o seleccionar una) volvemos a nuestra app y debemos manejar los datos recibidos. Veamos el código para luego explicarlo.

 

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode)
        {
        case REQUEST_CAMERA:
                                if (!photoPath.equals("")&&(photoPath!=null))
                                {

                                    //oPunto.setPath(photoPath);
                                    //TODO mensaje de foto seleccionada
                                }

                            break ;
        case REQUEST_SELECT_PHOTO:

                            if( resultCode != 0 )
                            {

                                  Cursor c = managedQuery(data.getData(),null,null,null,null) ;
                                  if( c.moveToFirst() )
                                  {

                                      photoPath = c.getString(1) ;

                                      //oPunto.setPath(photoPath);
                                        //TODO mensaje de foto seleccionada
                                  }
                             }
        default: break;

        }

    }
 

Para saber de donde venimos hay que mirar las estrellas el requestCode. Según el resultado ejecutamos cierta lógica en nuestro codigo.

a) Si volvemos de la cámara lo que hacemos primero es convertir la imagen en un archivo para luego obtener su path y almacenarlo en la variable global path para que luego el botón “mostrar” pueda utilizarla.

b) Si volvemos del picker de fotos, creamos un cursor con toda la data obtenida. A pesar de ser solo una imagen, esta contiene muchos datos, agrupados en columnas. La segunda columna (la primera es la 0), contiene el path de nuestra imagen seleccionada. Lo guardamos en nuestra variable y listo.

Listo! Ya sabemos usar la cámara, seleccionar y mostrar cualquier foto. Algunas aclaraciones sobre el ejemplo. Aun no se porque, la cámara siempre se ejecuta en modo apaisado. He intentado muchos ejemplos que hay dando vuelta pero no logre hacerlo funcionar de la manera adecuada. Una ventaja de este code es que se guardan las imágenes en la sdcard y no en el directorio de nuestra aplicación.

 

Aqui les dejo un método que se usar cuando volvemos de la cámara.

 

public static File convertImageUriToFile (Uri imageUri, Activity activity)
	{
		Cursor cursor = null;
		try
		{
		    String [] proj={MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID, MediaStore.Images.ImageColumns.ORIENTATION};
		    cursor = activity.managedQuery( imageUri,
		            proj, // Which columns to return
		            null,       // WHERE clause; which rows to return (all rows)
		            null,       // WHERE clause selection arguments (none)
		            null); // Order-by clause (ascending by name)
		    int file_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		    int orientation_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION);
		    if (cursor.moveToFirst())
		    {
		        String orientation =  cursor.getString(orientation_ColumnIndex);
		        Log.d("PingDroid", "OR "+orientation);
		        return new File(cursor.getString(file_ColumnIndex));
		    }
		    return null;
		}
		catch (Exception ex)
		{
			return null;
		}
		finally
		{
		    if (cursor != null)
		    {
		        cursor.close();
		    }
		}
	}

No se los puedo explicar porque no es de mi autoría pero les digo que todo funciona de maravilla.

También les dejo el código para leerlo sin mis molestas aclaraciones.

 

http://www.mycodestock.com/code/3207/

 

Cualquier duda o comentario al respecto los invito a dejar su opinión en esta entrada.

Gracias por leer, no se olviden de comentar y hasta la post que viene, amigos.

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

Resumen de entradas en la wiki Parte 02

En (wiki) por benoffi7 el 01-09-2011

Segunda entrega sobre las publicaciones en mi wiki de Android.

 

Notificaciones: Para lanzar notificaciones a la barra de estado de nuestro Android. Muy útil para alertar o informar al usuario sin molestarlo.

 

 

Toast: Otra forma (mucho más simple) de mostrar un mensaje de información en Android.

 

 

Mandar un mail desde la app: Código sencillo para enviar un mail usando el cliente de correo predeterminado en el SO pero desde nuestra aplicación.

 

Mandar datos desde una activity a otra: Para enviar datos desde una actividad a otra y establecer cierto tipo de “comunicación”

 

Logs: herramienta imprescindible para los desarrolladores a la hora de depurar una aplicación y encontrar errores en la lógica de nuestro código. Ideal para ver “por donde anda” nuestra app y controlar a las variables.

 

Post Footer automatically generated by Add Post Footer Plugin for wordpress.