miércoles, 23 de enero de 2013

Android Screenshot

Hola que tal a todos, Muy feliz año 2013 en esta ocasión les quiero compartir una pequeña aplicación para demostrar como obtener un screenshot o una captura de pantalla de nuestra aplicación. Antes que nada una disculpa por no haber escrito tan constantemente como en anteriores ocasiones pero me he enfocado en mi trabajo y otros proyectos personales.

El como obtener una copia de una vista en android es muy sencillo, básicamente cualquier componente que nosotros necesitemos podemos copiar su bitmap en un punto determinado lo cual nos dará una imagen de este componente en el tiempo. Esta función es aplicable para nuestra vista principal también la cual nos dará el screenshot completo. El método se llama getDrawingCache(), lo que en realidad pasa es que esta vista regresa el cache que se utiliza para ser dibujada en pantalla en un objeto Bitmap, normalmente este cache esta des-habilitado y la función regresara null pero lo unico que tenemos que hacer antes de llamar al método es habilitarlo con la función: setDrawingCacheEnabled(true). Este bitmap luego puede ser transformado a algún otro formato compreso como PNG o JPEG  y guardado en nuestra SD card o cualquier otra locación.

Nota no hay que olvidarnos que luego de terminar es bueno des-habilitar el cache de nuestra vista ya que si no estaremos utilizando memoria en nuestra aplicación que no es necesaria. Muy bien a continuación el código de las funciones para tomar la imagen, transformarla a formato JPEG y guardarla en la carpeta de la Camara.


public void takeScreenshot(){
View v = findViewById(R.id.rootLayout);
v.setDrawingCacheEnabled(true);
Bitmap bitmap  = v.getDrawingCache();
String dest = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DCIM )
+File.separator+"Camera"+File.separator+"IMG_"+
new DateFormat().format("yyyyMMdd_hhmmss", new Date())
+".jpg";
Log.d(APP_TAG, "Writing to: "+dest);
File file = new File(dest);
try {
FileOutputStream stream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, stream);
stream.flush();
stream.close();
} catch (IOException e) {
Log.e(APP_TAG, "Error taking screenshot.",e);
}finally{
v.setDrawingCacheEnabled(false);
}
}

Este pequeño tutorial lo desarrolle a petición de un compañero desarrollador que tenia algunas dudas con esta tarea. Espero y les sea de utilidad. Si tienen alguna otra duda o quieren que publique algún otro tipo de tutorial siempre son bien recibidos los comentarios o pueden mandarme un email a cualquier hora. Un saludo a todos y espero ya poder volver a escribir con un poco mas de regularidad.

P.D si desean el codigo completo de esta aplicacion pueden clonar el repositorio de github donde esta almacenada el link es: git://github.com/ti3r/screenshot-android.git