martes, 31 de mayo de 2016

[Android] Hacer una llamada directa desde un WebView


El dia de hoy me encontre un comentario de una persona en YouTube que me preguntaba que el había intentado mandar una llamada directa desde un WebView por lo basandome en el post anterior me tome la libertad de publicar un pequeño video como lo haría espero les sirva






Tambien dejo el codigo que implemene


https://github.com/cobymotion/HacerLlamadaWebView


Disculpa por los problemas del audio pero hice el video en un lugar publico

domingo, 29 de mayo de 2016

[ANDROID] Como reproducir sonidos en tu aplicación de android


En este post explico tres escenarios distintos para reproducir sonidos utilizando la misma clase Media Player, espero les ayude







Les dejo el codigo completo en este repositorio de GitHub

https://github.com/cobymotion/UsoMediaPlayer





sábado, 28 de mayo de 2016

[Android] Algo nuevo y curioso, decide el nuevo nombre de Android N



Una de las cosas mas esperadas en el Google I/O 2016 son lo nuevo que google presenta para android, que tendrá  la nueva versión de android, pero una de las cosas mas curiosos es que no tiene nombre, aunque esto de cierta manera pareciera no muy relevante, es algo significativo de android, ya que esperamos la siguiente golosina, hablando un poquito de Google IO presentan algunas características nuevas como lo seran el Google Home y assistant que practicamente son reconocimientos de voz que nos permitiran interactuar con nuestro dispositvo, ademas de Allo y Duo las nuevas herramientas de comunicación que en el futuro encontraremos (que dan miedo el nivel de tecnología que pueden tener). Junto con este evento ya se ha mostrado el preview del android N que algunas cosas que se ven interesante es la parte de la multipantalla que vamos a poder tener en esta versión, la presentación de las notificaciones,  el rapido regresar a la ultima aplicación y las mejoras en el consumo de baterías. 




Video de DroidLife 



Video de Verge

Algo raro o curioso es que google ha dejado que los usuarios elijan el nombre del nuevo Android, por lo que puedes acceder a la pagina y dar tu sugerencia (espero que sea Nutella), esperemos se anuncie rápido el siguiente nombre de android. 

Pagina para sugerir el nombre: 


Blog del evento de Google IO 







[Debian] Conocer información del sistema



Debian así como las distribuciones de linux tienen una consola muy poderosa de android, por lo que podemos sacar la información del sistema con tan solo algunos comandos, algunos de ellos son los siguientes, todos los comandos son ejecutados como root.

Información de la marca 

root@PCLInux:/home/coby# dmidecode -s system-manufacturer

Nombre del producto

root@PCLInux:/home/coby# dmidecode -s system-manufacturer

Numero de serie del equipo 

root@PCLInux:/home/coby# dmidecode -s system-manufacturer

Características del procesador 

root@PCLInux:/home/coby# grep 'vendor_id' /proc/cpuinfo ; grep 'model name' /proc/cpuinfo ; grep 'cpu MHz' /proc/cpuinfo

Arquitectura del equipo 

root@PCLInux:/home/coby# uname -m

Cantidad de memoria en la maquina 

root@PCLInux:/home/coby# free -o -m

Distribucion de linux 

root@PCLInux:/home/coby# lsb_release -idc

Tarjeta de video 

root@PCLInux:/home/coby# lspci | grep -i vga



Espero les sirvan 


jueves, 26 de mayo de 2016

[ANDROID] Mensaje con mi ubicación II: Envio de SMS



Siguiendo con la continuación del post anterior vamos a contianuar con el proyecto, ya teniendo los permisos vamos a trabajar directamente con la funcionalidad. Empezaremos por poder darle una opción a nuestro ImageView que tenemos en nuestra vista para que al momento de presionar mande un mensaje de texto, ahorita lo estamos haciendo con un mensaje de texto de prueba solamente, por lo que empezaremos por agregarle un ID al boton para poder reconocerlo en la programación, entramos a activity_main.xml que tenemos en la carpeta de res/layout y agregamos una linea para el ID lo llamaremos botonsms, en este caso quedaria de la siguiente manera:




Nos vamos al menu Build -> Edit libraries and Dependencies para agregar la referencia de ButterKnife, que en este post explico su funcionamiento


Le damos clic en el simbolo de "+" y agregamos una libreria de dependency y agregamos com.jakewharton:butterknife:8.0.1 


Agregamos una de las librerias mas de ButterKnife pero la de compiler de la siguiente manera:


Abrimos del lado izquierdo el build.gradle module para hacer unos cambios en las dependencias, el primer cambio significativo es que antes del apartado de  dependencia agregaremos lo siguiente y cambiamos la ultima libreria que se agrego, modificaremos el compile por apt, quedando de la siguiente manera:

  buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-annotations:23.4.0'
    compile 'com.jakewharton:butterknife:8.0.1'
    apt 'com.jakewharton:butterknife-compiler:8.0.1'
}


 
 
Esperamos a que la aplicación recargue los cambios y entonces vamos a agregar un metodo que atendera el click del boton para que pueda ser detectado, lo hacemos ayudandonos de la libreria de Butterknife, entramos al ActivityMain.java y agregamos el siguiente metodo para mandar el mensaje, y probamos su funcionamiento.

@OnClick(R.id.botonsms)
    public void mandarsms(View view)
    {
        //numero al cual se le va a mandar el mensaje
        String num="3333221348";
        //mensaje que se mandara
        String mensaje="Este es un mensaje de prueba";
        // administrador para el envio de mensajes
        SmsManager manager = SmsManager.getDefault();
        //verificamos que tengamos el permiso
        if(ActivityCompat.checkSelfPermission(this,Manifest.permission.SEND_SMS)!=PackageManager.PERMISSION_GRANTED){
            //si no tenemos el permiso lo agregamos
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1234);
            return;
        }
        //mandamos el mensaje
        manager.sendTextMessage(num, null, mensaje, null,null);
        //Mostramos un mensaje que se envio el texto
        Snackbar.make(view, "Se envio el mensaje",Snackbar.LENGTH_LONG).show();
    }



Veremos que cuando presionamos el boton recibiremos el mensaje en el numero que se haya especificado



Dejo el proyecto en github hasta donde lo llevamos

https://github.com/cobymotion/MensajedeLocalizacion


 


miércoles, 25 de mayo de 2016

[JAVA] Buscar archivos PDF que contengan una palabra



Hoy vamos a ver como podemos hacer para buscar una palabra en una carpeta llena con PDF's y grabar en un archivo los nombres de los archivos los cuales contienen la palabra. Para esto utilizaremos la libreria de pdfBox de apache, en este caso el ejemplo que estamos probando fue con la versión 1.8.10 la cual funciono correctamente. En este caso bajamos el jar y lo agregamos a nuestro proyecto (el cual esta realizado en NetBeans), y ponemos el siguiente código:


import java.io.File;
import java.io.PrintWriter;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class LeerPdfPipucho {

    public static void main(String[] args) {
        LeerPdfPipucho leerPDF = new LeerPdfPipucho();
        String directory = leerPDF.getDirectory();
        String label = JOptionPane.showInputDialog(null, "Busca:");
        leerPDF.readPDF(directory, label);
    }

    /**
     * Metodo que permite mandar un JFileChooser que es una ventanita para poder
     * escoger el directorio     
     * @return la ruta especifica donde buscara el directorio
     */
    public String getDirectory() {
        String ruta = "";
        // componente de dialogo
        JFileChooser jfc = new JFileChooser();
        // configuramos para que solo sean directorios 
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        //mandamos el cuadro, esperamos una respuesta aprobatoria
        int dialogResult = jfc.showOpenDialog(null);
        if (dialogResult == JFileChooser.APPROVE_OPTION) {
            ruta = jfc.getSelectedFile().getAbsolutePath();
        }
        return ruta;
    }

    /**
     * Metodo que permite abrir PDF y buscar si contiene una palabra Si la
     * contiene guarda en un archivo de texto el nombre del archivo
     *
     * @param directory la ruta absoluta del directorio que busca los PDF
     * @param label La etiqueta a buscar
     */
    public void readPDF(String directory, String label) {
        File directoryFile = new File(directory); // carpeta donde estan los pdf                
        String[] listFiles = directoryFile.list();//extrae los nombres de archivo 
        String slash = System.getProperty("file.separator");
        if (listFiles.length == 0) 
            System.out.println("No hay archivos en la carpeta especificada");
        else {
            //creamos un flujo donde se pondran los nombres de los archivos que contienen los elementos
            PrintWriter pw =null;
            try {           
                pw = new PrintWriter("destination.txt");
                //recorro cada uno de los elementos 
                for (String file : listFiles) {
                    //preguntamos si es un pdf 
                    if(!file.toLowerCase().endsWith(".pdf"))
                        continue;
                    //carga el archivo                  
                    PDDocument pdf = PDDocument.load(new File
                    (directory + slash  +file)); 
                    //extramos su contenido
                    String content = new PDFTextStripper()
                                      .getText(pdf);
                    //cerramos el archivo
                    pdf.close();
                    //preguntamos si existe lo que se quiere buscar
                    if (content.contains(label)) {
                        //escribimos en el archivo de destino
                        pw.println(file);
                    }
                }             
            } catch (Exception e) {
                System.out.println("Hay un error al abrir el archivo");
            } finally{
                   pw.close();
            }
        }
    }
}

  


Les dejo el proyecto completo en Github, espero les sirva


martes, 24 de mayo de 2016

[JAVA] Conversiones entre Cadena y Date



Para convertir una fecha desde una cadena no siempre es una tarea tan sencilla ya que no hay un método directo que pueda consumir la cadena y me lo interprete en Java, mas si por ejemplo tenemos el formato que usamos aquí en México (dd-MM-yyyy), y muchas veces buscamos en las clases Calendar o Date en busca de una solución. En este caso usaremos una clase SimpleDateFormat para poder parsear (interpretarla correctamente para que se adapte a la clase) en un objeto de tipo Date.  

Supongamos que tenemos una fecha en formato de dias-mes-año, vamos a sumarle 30 días naturales, lo primero que tendríamos que hacer es import la librería necesaria

   //estas dos son las que se necesitan para la conversion string-date
   import java.text.ParseException;
   import java.text.SimpleDateFormat;
   //Estas son para complementar el ejercicio
   import java.util.Calendar;
   import java.util.Date;

Después declaramos el objeto SimpleDateFormat que es practicamente quien nos dara la traducción. 

    // la cadena que pasamos como parametro sera el formato en el que vamos recibir los datos
    // en esta clase la "m" minuscula corresponde a los minutos y la "M" mayuscula al nombre
    SimpleDateFormat parser = new SimpleDateFormat("dd-MM-yyyy"); 

Cuando vayamos a parsear nos pide que hay una Excepción por lo que nos pedirá que manejemos el problema y lo hacemos mediante un Try y Catch. 

   try {
       Date fecha = parser.parse(cadenaConFecha); // <- Aqui pedira un manejo de excepciones
   } catch (ParseException ex) {
            System.out.println(ex.toString());
   }
Por ultimo utilizaremos la clase Calendar para aumentarle los 30 dias y usaremos el mismo SimpleDateFormat para imprimir con el mismo formato 

            Calendar cal = Calendar.getInstance();
            cal.setTime(fecha);
            cal.add(Calendar.DAY_OF_YEAR, 30);

Aquí les dejo el ejemplo completo

package pruebajava;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author coby
 */
public class PruebaJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String fechaCadena = "12-12-2010";
       SimpleDateFormat parser = new SimpleDateFormat("dd-MM-yyyy"); 
        try {
            Date fecha = parser.parse(fechaCadena);
            Calendar cal = Calendar.getInstance();
            cal.setTime(fecha);
            cal.add(Calendar.DAY_OF_YEAR, 30);
            System.out.println("La fecha es " + parser.format(cal.getTime()));
        } catch (ParseException ex) {
            System.out.println(ex.toString());
        }
        
    }
    
}


Espero les haya servido


lunes, 23 de mayo de 2016

[ANDROID] Mensaje con mi ubicación I: Permisos en android 6.0

Basandonos en el post anterior de hacer una llamada desde un botón, esta vez vamos a generar una aplicación que envie un mensaje de texto(SMS) mediante un botón, dicho mensale llevara está vez  las coordenadas de nuestro GPS (para avisarle a alguien donde estamos sin necesidad de darnos mucho a notar, o simplemente si no requerimos hacer mucho para mandar la localización), esto para generar que permita encontrar. Nuestra aplicación estara en tres capitulos que voy a ir escribiendo.

Creamos un proyecto siguiendo las mismas instrucciones que el post anterior con los valores basicos, con la diferencia que esta vez escogeremos una actividad vacía.



Esto para simplificar totalmente el proceso y hacerlo lo mas sencillo posible, ya que este requiere de un poco de mas de trabajo.  Para esto solo pondre un boton con forma de imagen el cual descargue de la pagina de Material Icons.





Para que sea vea como lo vemos en la imagen utilizamos el siguiente codigo al layout 


    

    

Ahora pasaremos al punto fuerte de nuestra primera parte que son los permisos, como ya lo comentaba los permisos en android 6.0 son unos de los cambios mas significativos, en este caso para nuestra aplicación necesitamos dos permisos, que son los permitos para activar la localización así como los permisos que tenemos para el envio de los mensajes, para esto trabajaremos un poco con el codigo de Java. Para esto crearemos un metodo que se llamara verificarPermisos el cual hará el trabajo sucio. Llevara algo como lo siguiente: 

///metodo que usaremos para verificar los permisos
    private boolean verificarPermisos(){
        //preguntamos si los permisos ya estan actividos primero la localizacion y segundo el mensaje de texto
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED
         || ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)!= PackageManager.PERMISSION_GRANTED){
            ///si los permisos no estan pedimos autorización
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.SEND_SMS},1234);
            // retornamos falso ya que los permisos no estan activados y la aplicacion sigue por lo que si ejecutamos algo
            //antes de autorizar nos gerara problemas
            return false;
        }
        return true;
    }

Ahora para ayudar a las versiones anteriores agregaremos al Manifest los permisos que acabamos de verificar. 

 
    

Permisos simplemente verificara si estan activados, si no estan activados los pedira. Algo importante que veremos es que regresamos un falso, esto es porque los metodos no son sincronos por lo que no detiene la aplicación por lo que puede ser que mientras el usuario acepta o no, pueda ocurrior un error por eso se retorna falso. Tambien verificamos que el numero que le pusimos al final como 1234, es un codigo de petición, por lo que se usara para un Callback (metodo que se ejecutara despues de decidir la parte de los permisos), una vez terminado pasaremos a sobrescribir un metodo para los permisos. 

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResult )
    {
        String cadena ="";
        switch (requestCode){
            case 1234: //codigo que mandamos en el Request
                if(grantResult.length>1){
                    if(grantResult[0]!=PackageManager.PERMISSION_GRANTED)
                        cadena += "PERMISO DENEGADO: LOCALIZACION";
                    if(grantResult[1]!=PackageManager.PERMISSION_GRANTED) {
                        cadena += (cadena.isEmpty() ? "PERMISO DENEGADO:" : "");
                        cadena += " SMS ";
                    }
                }else
                    cadena = "NO TIENE PERMISOS LA APLICACION";
        }
        View view  = findViewById(android.R.id.content);
        Snackbar.make(view , cadena.isEmpty()?"Permisos Correctos":cadena,Snackbar.LENGTH_LONG).setAction("Intentar", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                verificarPermisos(); //vuelve a verificar los permisos
            }
        }).setActionTextColor(getResources().getColor(R.color.colorAccent))
        .show();
    }

Este metodo practicamente verfica que los dos permisos esten permitidos de lo contrario mandara un mensaje y el Snackbar podra reiniciar la verificación en caso que queramos nuevamente empezar. 

Para terminar no olvides agregar al metodo onCreate la llamada a verificar los permisos
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        boolean res = verificarPermisos();
        if(res)
            Log.w("ESTADO","Continua normalmente");
    }

https://github.com/cobymotion/MensajedeLocalizacion

sábado, 21 de mayo de 2016

[SublimeText] Ejecutar programas de Java aplicado a un entorno XFCE



Sublime Text es sin duda uno de los editores que mas gustan por su sencillez, simpleza y la cantidad de extensiones que podemos encontrar, ademas de la portabilidad y usa serie de opciones. En este caso la parte de la codificación es reconocido y dominado, pero también detrás de sublime hay un sistema de construcción, compilación y ejecución que se adapta a los programas mas sencillos, sin embargo muchos de ellos son demasiados básicos, como ejecutar el compilador y mostrar los elementos. En el caso de java tenemos disponible un sistema de construcción ya definido que lo podemos encontrar en:


Sin embargo solo compila y nos genera el archivo class de Java por lo que vamos a crear nuestro propio sistema de compilación y ejecución para java, cabe destacar que este procedimiento es con un entorno grafico de XFCE con Debian 8. Se preguntaran que tiene que ver esto, pero es importante ya que sublime tiene su propia consola pero no interactúa con el programa es decir, si mi programa tiene pausas de pantalla como en el caso de ingresar un valor pues nos vamos a encontrar que los valores nunca llegan a la ejecución de Java por lo que terminara mi programa en cuanto lo ejecutemos, para evitar esto lo ejecutaremos directamente en la terminal (ahí es donde entra XFCE), pero el procedimiento aplica para cualquiera solo sabiendo cual es la terminal que se usa o en el caso de Windows. 

Bueno empezamos para crear un archivo de configuración para esto vamos a la opción Tools- Build System - New Build System

Nos aparecerá un archivo en tipo JSON que modificaremos con el siguiente código:



{
    "cmd": ["javac", "-Xlint", "$file"],
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "working_dir": "${file_path}",
    "selector": "source.java",
    "variants":[
      {
        "name":"run-xterm",
        "shell_cmd":"xterm -hold -e 'java $file_base_name'",
        "shell":"true"
      },
      {
        "name":"run-xfce",
        "shell_cmd":"xfce4-terminal -x bash -c 'java $file_base_name ; read -p TERMINADO'",
        "shell":"true"
      }      

    ]
}



Explicando un poco, esta dividido el archivo en 3 secciones, la primer y principal vienen los siguientes campos:

cmd: este campo es obligatorio o se ponen con [ ] por si es una colección de valores, ahí se especifica la linea de comando que utilizaremos se puede decir por default en este caso es la compilación del programa. El paremtro $file sera el nombre del archivo que ejecutemos para el guardado (esto sublime se encarga automáticamente)

file_regex y working_dir: Estos parámetros son opcionales, pero los agregamos para evitar diferentes tipos de errores si el codigo es cambiado a otro contexto de ayuda. El file_regex es para buscar que el nombre del archivo venga con un formato correcto y working _dir para hacer las compilaciones y trabajos directamente en la carpeta donde el archivo esta almacenado.

selector: Aunque en la documentación oficial marca que es optativo se utiliza para que sublime reconozca el formato y si tiene un build configurado para esa compilación lo active.

Variants:  Son los cambios que quieras ejecutar en algún momento dado, ya mas personalizados, en este caso ahí tengo los elementos de la configuración de ejecución.

name: Los elementos name nos ayudaran a reconocer que quiero que se ejecute al momento de activar ejecución en sublime.

Shell_cmd y shell: Lo utilizamos para que los comandos se ejecuten directamente en la linea de comandos del sistema operativo como tal, en este caso tenemos dos opciones el xterm (consola común que varias distribuciones de linux tienen y la de xfce4-Terminal que viene en el entorno grafico de xfce)

Guardamos el archivo que este dentro de la user de donde esta instalado sublime, en este caso cuando le damos guardar directamente el programa nos lleva a ese path, mucho cuidado que quede con terminación sublime-build. Este procedimiento lo hacemos una sola vez, una ves terminado cerramos y abrimos sublime text.



Ya puedes codificar tus programas en java, ahora lo que vamos a ser es simplemente cuando quieras correr tus aplicaciones verificar que en Build-System este activada tu configuración



Y ahora puedes presionar shift + Ctrl + B y escoger la opción que quieras recordando que la primera es compilación, la segunda es ejecución en Xterm y la tercera ejecución en xfce-terminal


Si quieres repetir la ultima opción elegida puedes poner Ctrl + B solamente y se repetirá, también si es la primera vez que estas usando el comando en tu programa Ctrl+ B ejecutara la primer opción que tienes.

Si alguien hace un archivo para otra configuración ya sea lenguaje o plataforma compártelo para mejorar las opciones.


Editor: SublimeText

viernes, 20 de mayo de 2016

[ANDRIOID] Guardar un valor por medio de SharedPreferences

Andrid tiene varias maneras de almacenar o utilizar información para sus aplicaciones, en el caso del almacenamiento dentro del mismo dispositivo tiene tres opciones interesantes que sea podrían adaptar a los requerimientos de los proyectos que se quieran, sin ambargo, debemos tener presente que sigue siendo un telefono o un movil con capacidades limitadas por lo que no son exactamente buenos para que funcionen como repositorios de información, ademas que recurdemos que android tiene una visión de siempre conectado por lo que tampoco es algo que le tomaran tanta importancia a futuro. 

A mi, en lo particular puedo considerar tres formas basicas para almacenar información de manera local que son las preferencias compartidas (archivos de XML), archivos y un el funcional SQLite que aunque muy limitado podemos usar funciones de base de datos. 

En este caso el post es sobre las preferencias compartidas que son contraladas mediante una clase llamada "SharedPreferences".  Estas preferencias estan construidas para trabajar con datos muy basicos, por lo que consiste en formar un mapa de valores con relación "nombre - valor". Creo que es una de las clases mas sencillas de usar, esto ayuda a guardar configuraciones del usuario o recordar algunos valores una vez que la aplicación fue reabierta o cargada, primero para poder usar las preferencias tendremos que crear la instancia de las clases.

        //Se inicializa el objeto de preferencias
        // Existen mas metodos que el MODE_PRIVATE pero estan
        //depreciados en el caso de MODE_WORLD_READABLE y
        // MODE_WORLD_WRITEABLE por tener problemas de seguridad
        SharedPreferences sp = getSharedPreferences("mispreferencias",MODE_PRIVATE);
        

Como se menciona SharedPreferences es una clase muy sencilla solo almacena valores de tipos básicos por lo que el guardar elementos consiste en crear un Objeto Editor de la clase y simplemente agregar (put) los valores con el formato "nombre - valor", por ejemplo si queremos almacenar un dato suponiendo una aplicación como la siguiente:



Por ejemplo queremos que cuando de click en el botón guardar quede almacenado el nombre que este en el EditText ponemos el siguiente codigo:


        // Se obtiene el valor
        String nuevoNombre = texto.getText().toString();
        // Se crea el objeto para controlar las preferencias
        SharedPreferences sp = getSharedPreferences("mispreferencias",MODE_PRIVATE);
        //Se genera un Editor para modificar
        SharedPreferences.Editor editor = sp.edit();
        //asignamos el valor al map
        editor.putString("nombre",nuevoNombre);
        // guardamos cambios
        editor.commit();


Para obtener los datos solo tenemos que traer los valores de la siguiente manera, cabe mencionar que si revisa el código y ve que el get lleva dos parámetros, son el primero es el nombre del valor que andamos buscando, en el caso del segundo valor, es solamente un valor por default que se utiliza en caso de que el nombre no este funcionando, esto según la aplicación lo hacemos al crear la actividad  lo asignamos al EditText


        //Se inicializa el objeto de preferencias
        // Existen mas metodos que el MODE_PRIVATE pero estan
        //depreciados en el caso de MODE_WORLD_READABLE y
        // MODE_WORLD_WRITEABLE por tener problemas de seguridad
        SharedPreferences sp = getSharedPreferences("mispreferencias",MODE_PRIVATE);
        String nombre = sp.getString("nombre","NO HAY GUARDADO");
        //mostramos el valor guardado o si es la primera vez
        // y no hay guardado simplemente pone el valor por default
        texto.setText(nombre);

SharedPreferences tiene también una actividad que puede ser usada para tener un panel de configuraciones que posteriormente publicare. 

Les dejo un ejemplo de una aplicación la cual utiliza el concepto de sharedPreferences para almacenar un valor. Lo dejo en Github.


jueves, 19 de mayo de 2016

[JAVA] Ejecutar aplicacionees JAVA en Android Studio



Android Studio no cabe duda que vino a revolucionar la forma de programar para Android, aunque en mi punto de vista consume muchos recursos, por lo que muchas veces no es el editor que los programadores de Java (No de android) pudieran escoger. En esta caso cuando aprendes Android se requieren bases de Java por lo que muchas veces es necesario repasar algunos conceptos por lo que android studio permite programar directamente con Java, y solventar por ejemplo en un curso tener que tener instalado algún otro editor, para revisar algunos conceptos de Java. 

Para eso empezaremos creando un Nuevo proyecto con los datos referentes a cuando creas tus proyectos para android.


Para esto escogemos en este caso para que teléfono o tableta quieres trabajar, en este caso no hay tanta importancia. 


Una vez que escogimos la versión que sera compatible que no tiene mucha importancia, nos preguntara como queremos que se cree nuestra actividad por lo que en este caso le diremos que no queremos ninguna actividad (Add No Activity) y damos finalizar




Una vez que estamos ahí agregaremos un modulo nuevo en nuestro proyecto para esto nos vamos al menú File -> New -> New Module ....


Nos pedirá el tipo de modulo en este caso seleccionaremos una librería de Java



Luego nos pedirá el nombre que le daremos al modulo en este caso yo le llamare javaruntime y la clase la llamare Ejemplo.



Una vez creado el modulo aparecerá en el explorador del proyecto y encontraremos la clase, en este caso agregamos un poco de código para imprimir el hola mundo en consola y en una ventana emergente, de la siguiente manera: 



Una vez abierto el archivo ponemos el código


Ya tenemos código de Java listo para ser ejecutado, sin embargo si vamos a la parte de la ejecución me dirá que no puede ejecutar ya que no tiene un configuración definida para los programas de Java por lo que vamos a crearlo por lo que tenemos que configurar, nos vamos al apartado donde ejecutamos (app) veremos que aparece una tachita, vamos a darle clic en el menú emergente para que podamos editar la configuración. 


Ya que estamos ahí veremos una pantalla donde si nos vamos a la esquina superior izquierda veremos algo como lo siguiente, damos clic en el símbolo de "+" para agregar una nueva configuración



Ya que le dimos clic en el "+" nos dirá el tipo de configuración. en este caso escogeremos la opción de "Application".


Estando en la pantalla de aplicación agregaremos lo siguiente: 
  • Nombre: El nombre que usted quiera 
  • Nombre de la clase principal: Es el nombre de la clase que tiene el main en mi caso com.example.Ejemplo
  • Modulo: javaruntime porque asi se llama el modulo que yo use. 
Aplicamos los cambios y aceptamos 


Veremos que cuando aceptamos ya tendremos en la opción de ejecutar la configuración ya establecida por lo que me permitirá ejecutar directamente la aplicación presionando el símbolo play 



Ejecutamos y ya tendremos un modulo que permite utilizar Java para los requerimientos que se tengan. 

Dejo el proyecto en GitHub por si alguien lo necesita: 






miércoles, 18 de mayo de 2016

[Android] Atajos para el uso de emulador en android

Les dejo algunos atajos del teclado para el control del emulador

Inicio: Home del teléfono
F2: Menú del teléfono
Esc: opción de volver en el teléfono
F7: encendió / apagado
Ctrl+f11 o tecla 7: cambia la orientación del teléfono de horizontal a vertical
Ctrl+ F5: volumen +
Ctrl + F6: volumen -

Espero les sirva

lunes, 16 de mayo de 2016

[LINUX] Configurar servicios de red en Debian: HTTP, DNS, DHCP, FTP, SSH


Debian desde mi punto de vista y el de algunos muchos es el mejor o uno de las mejores distribuciones de linux que se puede decir "padre"(No depende de otra) , eso hace que a mi punto de vista es muy ligera, flexible, tiene una gran comunidad y documentación como pocas distribuciones por lo que es muy robusta. 

En este caso hice un pequeño manual de como configurar un pequeño servidor con las funciones mas básicas para una red Local y por cuestiones académicas fue probado en una maquina virtual, cabe mencionar que los servicios fueron configurados a lo mínimo por lo que no abarca aspectos de seguridad. Espero les sirva



domingo, 15 de mayo de 2016

[Android] Hacer una vista FullScreen basada en AppCompat



Vamos a ver como podemos desaparecer las Toolbar y la barra de indicadores de Android para tener una pantalla totalmente disponible, muchas veces necesario cuando desarrollas un juego o alguna aplicación que requiera toda la pantalla.

En el toda la clasificación de versiones de Android y los diferentes dispositivos que existen, es muy común que las aplicaciones ocupen un punto de equilibrio, si no estaríamos desarrollando para cada diferente versión. Android maneja una librería de compatibilidad para las versiones anteriores para que puedan utilizar nueva funcionalidad y la programación sea mas noble crea un conjunto de clases que en algunos casos permiten la funcionalidad como si estuviéramos en versiones mas avanzadas pero en este caso no es permitido el generar una pantalla fullscreen directamente en el Theme por lo que tendremos que codificar un poco mas.

En este caso empezaremos a crear el estilo para que la ventana se adapte, en este caso vamos a la carpeta /res/values y abrimos el archivo styles.xml, creamos el estilo agregando el siguiente código





 
.....









Una vez que se tiene solo abriremos el AndroidManifest.xml y buscamos la actividad que queremos aplicarle el nuevo estilo y con esto tendremos que cuando se abra la actividad la tendremos en pantalla completa




.....

    

        

         ......

        
        
        
        
    




Espero les haya servido.


sábado, 14 de mayo de 2016

[Android] Instalación de Android Studio (Windows) y algunos atajos de teclado


Les dejo un pequeño tutorial de como instalar Android Studio.





También algunos atajos que podrían ayudarte:


  • Alt + Intro: Activa la sugerencia rápida, por ejemplo permite importar a la clase o la implementación de algún código automático. 
  • Alt + Insert: Inserta un método
  • Ctrl + Alt + L: Da formato al código
  • Ctrl + Y: Borra linea 
  • Ctrl + Q: Muestra la documentación el código
  • F4: Salta la declaración
  • Ctrl + P : Muestra los parámetros del método 
  • Shift + F6: Cambia el nombre de un identificador