Permiso de escritura a tu aplicación Android

Hace poco trabajando en un pequeño proyecto con Android, me vi en la necesidad de crear una pequeña base de datos con SQLite y que obviamente estaría en la memoria de mi teléfono, pero por alguna razón tenia errores de acceso al crearla, pues si, se debía agregar el permiso para que nuestra aplicación pueda escribir en memoria y esto directamente se realiza en el archivo AndroidManifest.xml generado en nuestro proyecto.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="pe.com.mkella.simpleamp"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="16"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name=".MainActivity"                  
                  android:theme="@style/AppTheme"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>        
    </application>
</manifest>

Podemos ver la línea de código cuyo tag tiene uses-permission es esta especificando el permiso de acceso a escritura, esto nos facilitara el trabajo definitivamente. Es algo que me trajo de cabeza en su momento, espero les sirva para los que recién empiezan con esto.

IntelliJ IDEA – Mas que una herramienta inteligente

Ya llevo un par de meses desarrollando con esta excelente herramienta y la verdad me viene muy bien, mas un trabajando con algunos proyectos con Android. Estuve probando la versión de Android Studio y esta mas que interesante, pero aun he tenido algunos inconvenientes sobre todo al momento de compilación, cosa que no me pasan con IntelliJ IDEA, que por cierto Android Studio esta basado en IntelliJ IDEA. Este IDE maneja dos tipos e licencia, la Community Edition que tiene todo lo necesario para trabajo con Java SE, Scala, Groovy y sobre todo con Android y la Ultimate Edition que contiene ademas de lo mencionado todo lo relacionado a Java EE, frameworks como Spring, Hibernate, etc. realmente muy bueno. Lo que mas me agrada de esta herramienta es la simpleza como es que se maneja la gestión de sus proyectos, totalmente personalizable, integración con aplicaciones para control de versiones (git, subversion, mercurial, etc.) y repositorios de código en la nube tales como Github. En fin, una gran cantidad de características que lo hacen muy util y mas que aceptable.

Captura de pantalla 2015-04-06 a las 23.51.08

Corregir error “invalid command-line parameter” en Eclipse y SDK Android

Hace poco instalando Eclipse y el SDK de Android en Windows 7 (si lo se, un lapsus xD), siguiendo estas indicaciones, se me presento un pequeño inconveniente luego de instalar el SDK desde un ejecutable el cual recomiendan, resulta que luego de tener todo instalado y luego de crear un aplicacion simple, al ejecutarla tenia el siguiente error en la consola:

invalid command-line parameter: C:\Program Files\Android\android-sdk\tools/emulator-arm.exe

Y bueno, vaya sorpresa que me lleve, resulta que este error se da porque dentro de la configuracion en Eclipse en el SDK location, se tiene que especificar la ruta en donde tienes instalado el SDK, tal como se muesta en la imagen:

Pero por un posible bug, este no acepta espacios en blanco dentro de la ruta que se especifica. Entonces buscando algo de información vi que para esto existen alguna posibles soluciones:

  1. La primera, es bajarte el SDK en zip y colocarlo en una ruta que tu desees considerando lo antes mencionado
  2. O tambien puedes aplicar el siguiente comando para crearle una especie de link en un directorio especifico como por ejemplo en “C:\Android”, de la ruta del SDK instalado, de la siguiente manera:
MKLINK /J C:\Android "C:\Program Files\Android\android-sdk\"
Y bueno con esto ya colocaríamos la ruta del link creado en el “SDK Location”.

Evaluar extensión de archivo con java

Una forma simple de poder hacer esta validación es implementando el método accept de la clase FilenameFilter, entonces imaginemos que queremos saber si tenemos uno o mas archivos “zip” en el directorio “/home/nachxs/Documentos/ClasesPrueba”, para esto solo haremos lo siguiente:

package evalextension;

import java.io.File;
import java.io.FilenameFilter;

/**
*
* @author nachxs
*/
public class Main {

  public static void main(String[] args) {
    String path = "/home/nachxs/Documentos/ClasesPrueba";
    File fi = new File(path);
    File[] listaObjetos = fi.listFiles();
    for (int i = 0; i < listaObjetos.length; i++) {
        if (new EvaluaExtension().accept(listaObjetos[i], ".zip")) {
           System.out.println("Se encontro archivos zip: " + listaObjetos[i].getPath());
        }
    }
  }
}

class EvaluaExtension implements FilenameFilter {

    public boolean accept(File dir, String extension) {
        return dir.getName().endsWith(extension);
    }
}

Este es el directorio en donde realizmos la busqueda:

Básico para muchos, pero para otros espero les sirva.

Crear servicio para Socket Java

Hace poco desarrollando una pequeña aplicación en Java, el cual consistía en el manejo de un Socket me vi en la necesidad de ver la forma de como asociar este Socket a un servicio ya que iba a manejar “n” servicios, y todo esto sobre un servidor Linux.

Como sabemos cada vez que se crea un proceso o servicio en Linux, este recae o se asocia a un PID el cual es guardado en un archivo en una ruta especifica, entonces veremos como asociar este Socket a un PID y dado el panorama al tener varios Sockets tendremos varios PID’s. Entonces para esto asumimos que ya tenemos nuestra aplicación compilada, en mi caso tendré la clase (compilada) del servicio en la ruta “/home/nachxs/bin/classes” y ademas manejaremos un JDK el cual lo tengo instalado en “/opt/jdk_1.6.0”, una vez definido esto solo creamos un script el cual contiene lo siguiente:

#! /bin/bash
. /etc/init.d/functions

RETVAL=$?
PATH_SERVICE=/home/nachxs/bin/classes
PATH=.:/opt/jdk1.6.0/bin:/usr/bin
export PATH_SERVICE
export PATH

start(){
   echo -n $"Iniciando servicios"
   exec java -Xrs -cp $PATH_SERVICE org.servicio.Servidor01 /dev/null 2>&1 &
   echo $! > /var/run/Servicio01.pid
   RETVAL=$?
   [ $RETVAL -eq 0 ] && success || failure
   echo
   return $RETVAL
}

stop(){
    echo -n "Deteniendo servicios"
    kill -15  `cat /var/run/Servicio01.pid`
    rm -rf /var/run/Servicio01.pid
    RETVAL=$?	[ $RETVAL -eq 0 ] && success || failure
    echo
    return $RETVAL
}

case "$1" in
   start)
          start
          ;;
   stop)
          stop
          ;;
   restart|reload)
          stop
          start
;;
   *)
   echo $"Usage: $0 {start|stop|restart|reload}"
   exit 1
;;
esac

exit 0
exit $RETVAL

Entonces como se podran dar cuenta, tenemos “seteado” el PATH_SERVICE y el PATH con las ruta indicada anteriormente, ahora solo nos quedaria dar permiso de ejecucion al script y listo. Al ejecutar el script este creara el Socket al puerto que hayan definido en su clase y este asociado a un PID. Ahora si queremos tener varios servicios asociados a diferentes Sockets solo tendriamos que adaptar el script para cada servicio.

 

TIP: Convertir fecha y hora de String a java.sql.Date/Time

Esta es una forma simple de poder convertir fechas y hora de formato String a formato java.sql.Date y java.sql.Time respectivamente:

Convirtiendo Fecha de String a java.sql.Date:

String fecString = "2010-12-30"
java.sql.Date fecFormatoDate = null;
try {
      SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd", new Locale("es", "ES"));
      fecFormatoDate = new java.sql.Date(sdf.parse(fecString).getTime());
      System.out.println("Fecha con el formato java.sql.Date: " + fecFormatoDate);
} catch (Exception ex) {
      System.out.println("Error al obtener el formato de la fecha/hora: " + ex.getMessage());
}

Convirtiendo Fecha de String a java.sql.Time:

String horString = "10:28:31"
java.sql.Time fecFormatoTime = null;
try {
      SimpleDateFormat sdf = new java.text.SimpleDateFormat("hh:mm:ss", new Locale("es", "ES"));
      fecFormatoTime = new java.sql.Time(sdf.parse(horString).getTime());
      System.out.println("Fecha con el formato java.sql.Time: " + fecFormatoTime);
} catch (Exception ex) {
      System.out.println("Error al obtener el formato de la fecha/hora: " + ex.getMessage());
}