Creando una App que use el sensor de proximidad de tu dispositivo Android


Puede que desconozcas la cantidad de funcionalidades y servicios que brindan los dispositivos móviles, y quedes impactado cuando encuentres alguna App nueva que haga uso de los mismos. Hoy te mostraré una nueva funcionalidad y realizaremos un programa sencillo donde haremos uso de la misma.

¿De qué funcionalidad hablo? Pues te hablo del sensor de proximidad. ¿Para qué nos sirve? Su objetivo principal es retornar la variación de distancia existente entre un objeto y el dispositivo. Estos sensores pueden variar su potencia en dependencia del modelo del teléfono y cuan actual sea la versión del mismo.

El ejemplo que te traigo, es una App que hace uso de este sensor y puede detectar cuándo alguien sostiene el dispositivo en su mano. Lo que haremos será cambiar el color de fondo a rojo en caso de que se active el mismo.

Manos a la obra

Lo primero que harás, es abrir el ADT y crear un nuevo proyecto (ya hablamos de esto en el primer tutorial sobre Android, “Como programar en Android”). Luego debes preparar la parte visual, para esto abres el XML y creas una interfaz parecida a la que les muestro a continuación.

Interfaz de la App

Fig1: Interfaz de la App

A continuación te muestro el código XML de la interfaz:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools=<em>"http://schemas.android.com/tools"</em>
android:layout_width=<em>"match_parent"</em>
android:layout_height=<em>"match_parent"</em>
android:orientation=<em>"vertical"</em>
android:id=<em>"@+id/fondo"</em>
android:background=<em>"@android:color/black"</em>
tools:context=<em>".MainActivity"</em> >

<Button
android:id=<em>"@+id/button1"</em>
android:layout_width=<em>"wrap_content"</em>
android:layout_height=<em>"wrap_content"</em>
android:text=<em>"Activar Sensor"</em> android:layout_gravity=<em>"center_horizontal"</em>/>
</LinearLayout>

En este ejemplo en específico lo que inserté fue un LinearLayout con orientación vertical, que no es más que un contenedor que puede tener dentro otros componentes, tales como botones, cuadros de texto, entre otros.

Este componente puede servir para organizar nuestra pantalla o como en este ejemplo para poner un fondo a la App, utilizando la propiedad android:background que nos da la opción de dar color.

Además debemos crearle un id con android:id para más adelante poder llamarlo desde la clase java. Luego insertamos un botón con el que activaremos el sensor. Debes conocer que para insertar los componentes podemos hacerlo desde la parte visual (arrastrando los mismos desde la paleta hacia el área de trabajo) o crearlos puramente a código, esta segunda forma nos facilita más control sobre los mismos.

Crear interfaz visual

Fig2: Crear interfaz visual

Bien, hecho esto solo resta hacer el trabajo desde java.

Abrimos el fichero .java para su edición, en mi caso es MainActivity.java (por defecto se creó nada más que se conformó la App) y creamos la clase de la siguiente forma:

public class MainActivity extends Activity implements SensorEventListener {

/*
Primero se le especifica a la clase MainActivity que implemente el SensorEventListener, esto se hace para manipular los eventos del sensor y ejecutar nuestro código cuando cambie.
*/

  LinearLayout fondo;
  Button activador;
  Sensor s;
  SensorManager sensorM;

/*
Se declaran las variables que se utilizan más adelante. Sensor y SensorManger son para utilizar el sensor de proximidad mientras que <em>fondo</em> y <em>activador</em> son los componentes que se creó en el visual que se llamaran desde esta clase java para controlarlos.
*/
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fondo = (LinearLayout) findViewById(R.id.fondo);
    activador = (Button) findViewById(R.id.button1);

    /*
    Se captura desde el visual el LinearLayuot y el botón gracias a los ID fondo y button1 que se le asignó a ambos componentes en el XML
    */

    activador.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View arg0) {

        sensorM = (SensorManager) getSystemService(SENSOR_SERVICE);
        s = sensorM.getDefaultSensor(Sensor.TYPE_PROXIMITY);                                     
        sensorM.registerListener(MainActivity.this,s,
        SensorManager.SENSOR_DELAY_NORMAL);
        activador.setText("Activado");
      }
    });

    /*
    Al botón activador se le agrega un evento onClick (Significa al hacer click) que permite, que al pulsar sobre él, se ejecute la acción programada. Para esto se crea un Listener(Escucha) de tipo OnClick y se le adiciona al botón.
    En su evento principal se escribe el código que activa el sensor: Se le asigna al Manejador del Sensor (sensorM) el servicio del sistema que controla los sensores, después al sensor que se creó se le agrega específicamente el tipo de sensor que queremos utilizar, en este caso de proximidad y se le cambia el texto al botón para que diga “Activado”. Con esto ya está activado el sensor y procesando los datos que  recibe.
    */

  }

  @Override
  public void onAccuracyChanged(Sensor arg0, int arg1) {
    // TODO Auto-generated method stub
  }

  @Override
  public void onSensorChanged(SensorEvent evento) {
    // TODO Auto-generated method stub
    float valor=Float.parseFloat(String.valueOf(evento.values[0]));
    if (valor <= 10)
	fondo.setBackgroundColor(Color.BLACK);
    else
	fondo.setBackgroundColor(Color.RED);
  }

/*
El evento que interesa es OnSensorChanged, el código escrito en este evento se ejecuta cada vez que algún valor de distancia cambia. Primero se captura en forma de número flotante el valor de proximidad del sensor. Si el número que devuelve es mayor que 10 se activa la App cambiando el fondo de la misma a rojo y en caso contrario no se activa la pantalla.
*/

}

Una vez que hemos terminado de hacer esto, compilamos la App y buscamos el archivo .apk en la carpeta bin del proyecto en que estamos trabajando (por defecto es en C:\Users\\workspace). Este archivo es el instalador de la App, lista para ser copiado e instalado en tu móvil o tablet.

Concluyendo

Bueno esto todo, espero te sea útil este artículo donde aprendiste un poco más sobre Android, y como dato curioso, te cuento, que la mayoría de los juegos hechos para plataformas móviles utilizan los sensores disponibles en los teléfonos, para una u otra funcionalidad. Además no solo existe el sensor de proximidad, sino también el de temperatura, luz, acelerómetro, orientación, giroscopio, ruido, magnético y presión, pero no hablaré de ellos ahora, porque los veremos en próximos artículos.

Te recomiendo que si no conoces los sensores que posee tu teléfono, instales la App: Sensor Box (Se encuentra en la Tienda de Google) u otra App que les diga cuál de ellos está presente. Hasta la próxima, cualquier duda o sugerencia puedes dejarla en los comentarios.

Demo sensor de proximidad