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

domingo, 22 de mayo de 2016