viernes, 27 de mayo de 2016

Códigos postales de España programado en Gambas


Códigos postales de España
Gambas


xsetaseta@gmail.com


Encontré un fichero con los códigos postales de España y me puse manos a la obra para hacer un programa que buscara códigos postales.
Se realiza en gambas, una especie de Visual Basic para linux.
Debido a que tiene varios ficheros clasificados por provincias, y que no me quería complicarme mucho, no he utilizado SQLite, he utilizado la lectura secuencial, algo lenta, pero para los ordenadores de ahora es bastante rápida.
Espero que si se encuentra errores me los digáis.




Programa

Saludos.
Juan Galaz

miércoles, 25 de mayo de 2016

Municipios de España - Gambas

Página principal



Municipios de España
Gambas

xsetaseta@gmail.com


Había realizado una aplicación para android que buscaba municipios de España androj.html.
En gambas debía ser también sencillo  de hacer, y me puse manos a la obra.



Programa

Saludos.
Juan Galaz


lunes, 23 de mayo de 2016

Arduino - lector de RFID RC522


Arduino

RFID RC522


En este montaje realizamos un lector de tarjetas RFID RC522  - ISO/IEC 14443 Type A 13.56 MHz.
Basado en el chip  Philips/NXP MFRC522 RFID chip (Chip Datasheet) .
El módulo montado se puede comprar por menos de 3 € , y 10 tarjetas por menos de 2€ .

Tarjetas RFID.

Módulo.


Esquema.


Circuito montado.

Para realizar este montaje estuve viendo varias páginas donde explicaban diferentes modos de leer tarjetas RFID.
La mas completa es https://github.com/miguelbalboa/rfid  con una librería muy completa. Al principio no me funcionaba con arduino 1.05 daba errores al compilar, pero después de instalar la última versión 1.69 me funcionó.
Otra página  no utilizaba ningún tipo de librería https://labitat.dk/wiki/RFID_RC522-AN, funcionaba con cualquier versión de arduino.
La utilizada se encuentra en http://geekchickens.blogspot.com.es/, es una librería sencilla RFID, dos ficheros que se copian en un directorio que se llama RFID en el directorio de librerias  (libraries).
/* SETA43 http://seta43.duckdns.org/ http://seta43.blogspot.com.es/ */ /* basado en  GeekChickens //http://geekchickens.blogspot.com.es/ /* SDA es el pin 10 SCK es el pin 13 MOSI es el pin 11 MISO es el pin 12 RST es el pin 9 */
#include <SPI.h> #include <RFID.h>
 
#define SS_PIN 10 #define RST_PIN 9
#define DEBUG 0
 
RFID rfid(SS_PIN, RST_PIN);
 
int numero_serie[5]; unsigned char  usuariosON[10][5]={ 151,44,65,197,63,
                                   214,191,212,72,245,
                                   206,12,97,113,210,
                                   78,179,151,113,27,
                                   190,187,151,113,227, } ;
const int ledPinOK =  2; const int ledPinERROR =  3;    // Sound
void setup() {
  Serial.begin(9600);
  SPI.begin();
  pinMode(ledPinOK, OUTPUT);
  pinMode(ledPinERROR, OUTPUT);
  rfid.init();
  Serial.println("Inicia ");
#if DEBUG
  for(int z=0; z<5 ; z++)
   {
      Serial.print("Usuario "); Serial.print(z);Serial.print("-> ");
      for(int i=0; i<=4 ; i++)
                {
                  Serial.print(usuariosON[z][i]);
                  Serial.print(",");
                }
      Serial.println(" ");
   }
#endif  
   digitalWrite(ledPinOK, LOW);
   digitalWrite(ledPinERROR, LOW);
}
 
void loop() {
  int i,z;
 
    if (rfid.isCard())
    {
           if (rfid.readCardSerial())
            {
                Serial.print("Numero usuario: "); // guardamos el numero del usuario
                for(int i=0; i<=4 ; i++)
                {
                  numero_serie[i] = rfid.serNum[i];
                }

                for(i=0; i<=4 ; i++) // y lo imprimimos
                {
                  Serial.print(numero_serie[i]);
                  Serial.print(",");
                }               
               
                if(-1==detectarUsuario())
                {
                   //Error Usuario
                   for(z=1; z<12 ; z++)
                     if(z&1)
                       {
                        for(i=0; i<200 ; i++)  {digitalWrite(ledPinERROR, i&1); delay(1);}
                       }
                       else
                       {
                        delay(200);
                       }                          
                }
                else
                {
                 //Ok usuario
                  digitalWrite(ledPinOK, HIGH);
                  for(i=0; i<100 ; i++)  {digitalWrite(ledPinERROR, i&1); delay(3);}                 
                }
            
                delay(1000);
                digitalWrite(ledPinOK, LOW);
                digitalWrite(ledPinERROR, LOW);
             }
    }
    rfid.halt();
}
unsigned int detectarUsuario() {
 char f1;
 int z,i;
 Serial.println();
 Serial.println("Chequeando usuario");
  for(z=0; z<5 ; z++)
   {
     f1=0;
      for(i=0; i<=4 ; i++)
                {                 
                  if(usuariosON[z][i]==numero_serie[i]) f1++;
                }
      if(f1==5)
        {
          Serial.print("OK-Usuario ");
          Serial.println(z);
          return(z);
        }      
   }
  Serial.println("Error Usuario ");
  return(-1);

}

Existen un numero de tarjetas prefijadas en que pueden activar el pin 2 , para abrir una puerta o lo que se quiera.
Estas tarjetas se encuentran memorizada en la variable:
unsigned char  usuariosON[10][5]={ 151,44,65,197,63,
                                   214,191,212,72,245,
                                   206,12,97,113,210,
                                   78,179,151,113,27,
                                   190,187,151,113,227, } ;
Cualquier tarjeta que no este en la variable usuariosON activara el pin 3 y sonará un pitido de alarma durante unos segundos.
El programa es sencillo, sin muchas complicaciones, es simplemente una aproximación a la tarjetas RFID.
Si quisiéramos hacer una llave mas segura, deberíamos poner un teclado que nos pida una clave secreta asignada a dicha tarjeta.



PROGRAMAS


Saludos.
Juan Galaz

Bibliografía:
https://labitat.dk/wiki/RFID_RC522-AN
https://sites.google.com/a/mail.utec.edu.sv/arduino-seguridad-con-tecnologia-rfid/home
http://geekchickens.blogspot.com.es/search/label/RFID
https://github.com/miguelbalboa/rfid
https://es.wikipedia.org/wiki/RFID

jueves, 19 de mayo de 2016

ANDROID - Municipios de España - openRawResource


Android

ANDROID
Municipios de España
openRawResource

En esta aplicación para android realizo una especie de base de datos que busca los municipios de España.
No estoy muy orgulloso de esta aplicación pero hace su función de enseñar como se utiliza datos insertados en la propia aplicación.
Estos datos de municipios se colocan en el directorio /res/raw ,y solo son de lectura. El fichero con la base de datos de municipios se llama municipios0.txt , debemos tener en cuenta que a la hora de utilizar los recursos internos, la extensión no se utiliza.
La base de datos la he pasado a mayúsculas y quitado los acentos. Lo he hecho debido a que la búsqueda es secuencial y lenta, además de que normalmente en los dispositivos android es lento añadir acentos y cambiar de minúsculas a mayúsculas.

Vamos a intentar explicar  este pequeño trozo de código de la función Fbuscar.
Lo primero es coger el texto del municipio a buscar y cambiarlo a mayúsculas .
  miclave=Mclave.getText().toString();       
  miclave=miclave.toUpperCase();
  Mclave.setText(miclave);  
Utilizamos try para manejar los error de abrir ficheros.
Abrimos el fichero y utilizamos un buffer para aumentar la velocidad de acceso al fichero.
  ISentrada=getResources().openRawResource(R.raw.municipios0);
   BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
Leemos una por una todas las líneas del fichero.
Troceamos cada línea separando por el carácter ":" .
Si la segunda cadena que ha salido del troceo contiene la cadena a buscar miclave , se para la busqueda y se muestra.
    while ((Sentrada=BFentrada.readLine()) != null)
      {
      String SentradaT[]= Sentrada.split(":");
      if(SentradaT[2].contains(miclave)) {Mostrar(); break;}
      }
public void Fbuscar(View view)
    {        
        miclave=Mclave.getText().toString();       
        miclave=miclave.toUpperCase();
        Mclave.setText(miclave);     
        Contar();    
       
        try
        {
            if(ISentrada != null)    ISentrada.close();
            ISentrada=getResources().openRawResource(R.raw.municipios0);
            BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
           
            while ((Sentrada=BFentrada.readLine()) != null)
            {
            String SentradaT[]= Sentrada.split(":");
            if(SentradaT[2].contains(miclave))         {Mostrar(); break;}
            }
           
        }
        catch (IOException e)
        {
            Log.e("Municipios->",e.getMessage(),e);
        }       
    }


Me hubiera gustado no tener que abrir y cerrar el fichero para volver a la posición inicial, pero no he encontrado la función seek(0) para recursos internos, no se si existe o no. Esto hace al programa poco eficiente, pero funciona bien :( .


PROGRAMA

Saludos
Juan Galaz


Bibliografía:
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013


viernes, 13 de mayo de 2016

ANDROID - Cálculo bobinas núcleo de aire


Android

ANDROID
Cálculo bobinas núcleo de aire

En esta aplicación para android voy ha realizar el cálculo en micro henrios para una bobina con núcleo de aire.
Para el cálculo he empleado la formula que viene en el libro.

Handbook of electronics calculations for engineers and technicians
Milton Kaufman, Arthur H. Seidman


He visto otras formulas que se parecen, pero hay veces que mezclan el radio con el diámetro, por lo que me he decidido por esta.
Las  dimensiones deben estar en cm.

Hace años había realizado un programa en basic que luego trasladé a C para el cálculo de bobinas.


Como se ve en el nuevo, todo es mas interactivo y bonito.

Para este programa he empleado 4 SeekBar para cambiar los valores. Para cada cambio de valor se ejecuta la función de calculo() .
MBarraL = (SeekBar)findViewById(R.id.ABarraL);
MTextoL = (TextView)findViewById(R.id.A_Tlongitud);



MBarraL.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
        {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
            {
                longitud=progress+1;
                MTextoL.setText(longitud +" mm  Longitud");
                calculo();
            }
           

            @Override
            public void onStartTrackingTouch(SeekBar seekBar)                      {            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar)                      {            }           
        });


PROGRAMA

Saludos
Juan Galaz


Bibliografía:
https://danielme.com/tip-android-13-el-widget-seekbar/
http://www.jtech.ua.es/dadm/2011-2012/restringido/android/sesion03-apuntes.html

miércoles, 11 de mayo de 2016

ANDROID- WebView, Visión de páginas desde android


Android

ANDROID
WebView
Visión de páginas desde android

El poder ver páginas web, ya sean de tipo local o de internet, desde una aplicación de android permite dar mucho juego.
Mediante la utilización de WebView es muy fácil, pero muy vistoso.
activity_setaw_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <WebView
        android:id="@+id/Aweb"
        android:layout_width="317dp"
        android:layout_height="322dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>

SetawMainActivity.java
Vemos la dirección que se ve al abrir la aplicación.
package com.example.appweb;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class SetawMainActivity extends Activity {

    private WebView MWeb;
   
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setaw_main);
       
        MWeb=(WebView)findViewById(R.id.Aweb);
        MWeb.loadUrl("http://seta43.duckdns.org/androhx.html");    
    }      
}

AndroidManifest.xml
Debemos cambiar los permisos para acceder a internet.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.appweb"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".SetawMainActivity"
            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>

Visión del programa en un dispositivo físico.


Saludos
Juan Galaz


Bibliografía:
https://amatellanes.wordpress.com/2013/06/01/android-ejemplo-de-webview-en-android-parte-1/

jueves, 5 de mayo de 2016

ANDROID - ARDUINO - Programación JAVA - MAX7219 - Bluetooth - HC05 Conexión serie.


Android

ANDROID - ARDUINO
Anunciador con matriz de led controlado por android
Programación JAVA
MAX7219
Bluetooth  HC05
Conexión serie

En un montaje de electrónica, había realizado un marcador con el chip MAX7219. En este montaje el control lo había hecho utilizado un interprete de basic  en su modo trial  BASIC4Android. Me quedó las ganas de realizarlo en java, pero no había programado nunca en java. Ahora que tengo un poco de idea lo he realizado, quitándome la espina.
He de decir que ha sido difícil la programación, buscando por aquí y por allí encontré algún que otro ejemplo que me ayudo bastante. He de decir que al estar muy extendido android, existen infinidad de páginas y tutoriales que te ayuda a la programación.
El programa hace uso del bluetooth para manda los textos que se representan en la matriz de led. Utiliza la comunicación serie para transmitir la información, en el otro lado se encuentra el módulo HC05 que es un convertidor de bluetooth a serie.
En el terminal android debemos tener activado el bluetooth y emparejados los dispositivos.
Escribimos lo que queramos y lo mandamos a la matriz de caracteres.

Mediante eclipse diseñamos el interface gráfico.


activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText
        android:id="@+id/Aentrada"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="22dp"
        android:ems="10"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:inputType="text"
        android:text="@string/entrada"
        android:textSize="@dimen/abc_action_bar_subtitle_text_size" />

    <EditText
        android:id="@+id/Asalida"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/Aentrada"
        android:layout_below="@+id/Aentrada"
        android:layout_marginTop="26dp"
        android:ems="10"
        android:inputType="text"
        android:text="@string/salida"
        android:textSize="@dimen/abc_action_bar_title_text_size" >

    </EditText>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/Asalida"
        android:layout_marginTop="60dp"
        android:gravity="center" >

        <Button
            android:id="@+id/Aboton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend1"
            android:text="@string/boton1" />

        <Button
            android:id="@+id/Aboton2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend2"
            android:text="@string/boton2" />

        <Button
            android:id="@+id/Aboton3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend3"
            android:text="@string/boton3" />
    </LinearLayout>

    <Button
         android:id="@+id/Asalir"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="34dp"
        android:onClick="FunSalir"
        android:text="@string/salir" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/Aentrada"
        android:layout_alignParentTop="true"
        android:text="@string/hello_world" />

</RelativeLayout>

También hay que modificar el ficheros AndroidManifest.xml para poder utilizar el bluetooth.
Además impedimos que rote la pantalla.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.seta43blue"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />


    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>



La totalidad de los fichero los he comprimido y los he colocado en el enlace que se ve al final de página.
El programa en java es largo y solo explicare algún trozo.
El programa empieza con la función onCreate donde se mira si el dispositivo android tiene bluetooth, y si lo tiene activado.
Después lanzamos una función FunConectar2 donde se realiza la conexión al dispositivo.
 protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        Wentrada=(EditText)findViewById(R.id.Aentrada);
        Wsalida=(EditText)findViewById(R.id.Asalida);  
        Miblue = BluetoothAdapter.getDefaultAdapter();
                 
        if (Miblue == null)
        {
              AlertDialog.Builder dialog = new AlertDialog.Builder(this);
              dialog.setMessage("Sin soporte bluetooth");
              dialog.setCancelable(false);
              dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
                  {
                  public void onClick(DialogInterface dialog, int which)   { finish(); }                                            
                });
                dialog.show();
        }
       
        if (!Miblue.isEnabled())
        {
              AlertDialog.Builder dialog = new AlertDialog.Builder(this);
              dialog.setMessage("Activar bluetooth");
              dialog.setCancelable(false);
              dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
                  {
                  public void onClick(DialogInterface dialog, int which)   { finish(); }                                            
                });
                dialog.show();
        }
       
        AlertDialog.Builder dialog0 = new AlertDialog.Builder(this);
        dialog0.setMessage("Programa para conectar android y arduino.\nManda frases a la matriz de led.\nSETA43");
        dialog0.setCancelable(false);
        dialog0.setPositiveButton("OK", new DialogInterface.OnClickListener()
              {
              public void onClick(DialogInterface dialog, int which)   { FunConectar2(); }                                            
            });
        dialog0.show();
              
    }
La función FunConectar2 es la que realiza la conexión al dispositivo ya emparejado.
Crea un lista de dispositivos emparejados.
ArrayList <String> list = new ArrayList<String>();

Prueba a crear un createBluetoothSocket al dispositivo emparejado. Esto me creó una confusión debido a que no daba error aunque no existiese ese dispositivo, pero lo que creo que comprueba si dispone de conexión serie.
btSocket = createBluetoothSocket(device);

Prueba a crear un  btSocket.connect();  ,y si se se puede indica en pantalla ok->dirección desl dispositivo.
btSocket.connect();
Log.d(TAG, "....Conexion ok...");
Wentrada.setText("ok->" + address);

Para terminar creamos una clase donde se realiza la escritura y la lectura desde el bluetooth. ConnectedThread.
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();                          

La clase ConnectedThread tiene varias funciones: la própia de creación ConnectedThread  que se inicia con start, la run que no la usamos para nuestro ejemplo, y la write utilizada para mandar la cadena.
 private class ConnectedThread extends Thread
     {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
 
        public ConnectedThread(BluetoothSocket socket)
         {
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
            try
                {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
                }
            catch (IOException e) { }
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
         }
 
        public void run() {
           byte[] buffer = new byte[256]; 
           int bytes; 
            // Keep listening to the InputStream until an exception occurs
            while (true)
             {
                try {
                         bytes = mmInStream.read(buffer);
                         bytes=bytes+1; //No sirve para nada es para quitar aviso
                    //h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
                    }
                catch (IOException e) { break; }
             }
        }
 
        /* Call this from the main activity to send data to the remote device */
        public void write(String message) {
            Log.d(TAG, "...Data to send: " + message + "...");
            byte[] msgBuffer = message.getBytes();
            try
                {  mmOutStream.write(msgBuffer);  }
            catch (IOException e)
                {  Log.d(TAG, "...Error data send: " + e.getMessage() + "...");  }
        }

    }

Para termina creamos las funciones que mandan la cadena mediante la pulsación de los botones.
public void FunSend1(View view)
    {
        mConnectedThread.write(Wsalida.getText()+ "        " + "\n");
    }
public void FunSend2(View view)
    {
        mConnectedThread.write("/" + Wsalida.getText() + "\n");
    }  
public void FunSend3(View view)
    { 
        mConnectedThread.write("&"+ Wsalida.getText() + "\n");       
    }  

Perdonar si no explico muy bien los programa, estoy aprendiendo java y android.

Captura de pantalla del dispositivo físico.


PROGRAMA


Notas
Para depurar los programas  utilizamos la consola de eclipse.
  private static final String TAG = "bluetooth2";
 
Log.d(TAG, "...Conectando...");

Con el comando Log.d(TAG, "...Conectando..."); mandamos la cadena bluetooth2  ...Conectando...   a la consola android.
Para poder filtra todos los mensaje, que son muchos, configuramos de la siguiente forma:

Observamos  en la pantalla LogCat todos los mensajes que lleven la cadena bluetooth2.

Saludos
Juan Galaz


Bibliografía:
http://code.tutsplus.com/es/tutorials/create-a-bluetooth-scanner-with-androids-bluetooth-api--cms-24084
http://developer.android.com/intl/es/guide/topics/connectivity/bluetooth.html
http://www.tutorialspoint.com/android/android_bluetooth.htm
http://solderer.tv/data-transfer-between-android-and-arduino-via-bluetooth/
http://www.intorobotics.com/how-to-develop-simple-bluetooth-android-application-to-control-a-robot-remote/
http://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/
https://examples.javacodegeeks.com/category/android/core/bluetooth/

domingo, 1 de mayo de 2016

ANDROID - Prácticas de diálogos


Android

ANDROID

Prácticas de diálogos

En esta practicas realizamos  un programa donde es muestre varios diálogos.
Creamos la pantalla principal donde se encuentran 6 botones que activarán los diferentes diálogos.



El clásico diálogo donde aparece una información(setPositiveButton).
public void FunBoton1(View view)
    {
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
          dialog.setMessage("Pueba de diálogo");
          dialog.setCancelable(false);
          dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
              {
              public void onClick(DialogInterface dialog, int which) 
                  {                 
                  dialog.dismiss();
                 }                       
            });
            dialog.show();
    }

El clásico ListView (setItems)
 public void FunBoton2(View view)
    {
        final CharSequence[] items = {"Red1", "Red2", "Red3"};
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.setTitle("Selecciona adaptador"); 
        builder.setItems(items, new DialogInterface.OnClickListener()
            {     
            public void onClick(DialogInterface dialog, int item)
                {         
                    Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();     
                } 
        }); 
        AlertDialog alert = builder.create(); 
        alert.show();
    }


Parecido aListView (setSingleChoiceItems)
 public void FunBoton3(View view)
    {
        final CharSequence[] items = {"Red", "Green", "Blue"};         
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.setTitle("Pick a color"); 
        builder.setSingleChoiceItems(items, -1,new DialogInterface.OnClickListener()
            {     
            public void onClick(DialogInterface dialog, int item)
                {         
                    Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
                    alert.dismiss();
                } 
        }); 
        alert = builder.create();
        alert.show();
    }



Un cuadro de diálogo que se emplea para informar que se debe esperar mientras se está ejecutando algo. (ProgressDialog)
En este caso hago una espera de 2 segundos.
public void FunBoton4(View view)
     {
        final ProgressDialog MIdialog = ProgressDialog.show(MainActivity.this, "Dialogo","Espera 2 segundos...", true);
        new Thread()
            {
              public void run()
              {
                try { sleep(2000);  }
                catch (Exception e)    {  }
                MIdialog.dismiss();
              }
            }.start();       
     }


Un cuadro de diálogo donde indica el progreso en una barra.(ProgressDialog).
public void FunBoton5(View view)
    {       
        MiDialogo = new ProgressDialog(MainActivity.this); 
        MiDialogo.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
        MiDialogo.setMessage("Loading..."); 
        //MiDialogo.setCancelable(false);
        MiDialogo.setCancelable(true);
        MiDialogo.show();                  
        MiDialogo.setProgress(25);            
    }



Esto no es un diálogo, pero necesitaba representar ProgressBar y he creado un contador de cuenta atrás mediante la clase MyCountDownTimer.
He añadido un sonido cuando termina la cuenta atrás.
public void FunBoton6(View view)
    {
        if (!timerHasStarted) {
                countDownTimer.start();
                timerHasStarted = true;
                miText.setText("STOP");
            } else {
                countDownTimer.cancel();
                timerHasStarted = false;
                miText.setText("RESTART");
            }
    }
      
    //Cuenta atras
    public class MyCountDownTimer extends CountDownTimer
   {
        public MyCountDownTimer(long startTime, long interval)
                {
                       super(startTime, interval);
                }         
              @Override
        public void onFinish() {
                  miText.setText("Cuenta terminada!");
                  toneG.startTone(ToneGenerator.TONE_DTMF_S, 2000);
              }
              @Override
        public void onTick(long millisUntilFinished)
              {
                 int i;
                  miText.setText( " " + millisUntilFinished/100 );
                  i=(int)millisUntilFinished ;
                  i/=100;
                  miBarra.setProgress(i);
              }
     }


Como vemos en todos los diálogos que he creado el nombre de las distintas opciones las he creado en el propio programa java.
Para una mejor internacionalización deberíamos crear todas las cadenas en el fichero "strings.xml" , pero para este caso sirve.
Ejemplo de como se debería hacerse en el modo de strings.xml.
 res/values/strings.xml: En la aplicación (java)
<?xml version="1.0" encoding="utf-8"?>
<resources>
   
<string-array name="planets_array">
       
<item>Mercury</item>
       
<item>Venus</item>
       
<item>Earth</item>
       
<item>Mars</item>
   
</string-array>
</resources>
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);

PROGRAMA

Saludos
Juan Galaz


Bibliografía:
http://www.edu4java.com/es/androidlibro/mostrar-dialogo-android.html
http://devtroce.com/2012/01/19/mensajes-de-dialogo-popup-alertdialog/
http://www.tutorialandroid.com/medio/como-programar-una-rueda-de-espera-progressdialog/
http://developer.android.com/intl/es/guide/topics/resources/string-resource.html
http://developer.android.com/intl/es/samples/MediaRouter/res/values/arrays.html