Bienvenidos sean a este post, hoy continuaremos con lo iniciado en el post anterior sobre los sensores porque anteriormente hemos visto como trabajan de una forma muy estatica y ahora pasaremos a verlo trabajar con los sensores disponibles y mostrarnos sus valores en tiempo real, para ello vamos a crear una nueva app llamada Sensores2.

Anuncios

Como siempre abrimos Android Studio y seleccionamos Start a new Android Studio project, en el siguiente cuadro modificaremos el campo Application Name donde pondremos Sensores2, en Company Domain utilizaremos example.org, el resto quedara como esta, pulsamos Next para pasar al siguiente cuadro, en este elegimos Phone And Tablet, una version de API adecuada, en este caso recomiendo API 19 o similar, pulsen Next para pasar al siguiente cuadro, en este elegiremos Empty Activity y pulsen Next, en el ultimo cuadro dejaremos todo como aparece y pulsamos Finish para cerrar el cuadro y que comience la creacion de nuestra app. Una vez creada y dentro de Android Studio, iremos a nuestro layout llamado activity_main.xml donde reemplazaremos su codigo con el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/raiz"
    android:orientation="vertical">    
</LinearLayout>

Como pueden ver solo utilizaremos un LinearLayout, ahora pasemos a modificar la clase MainActivity con el siguiente codigo:

package org.example.sensores2;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends Activity implements SensorEventListener {

    private List< Sensor > listaSensores;
    private TextView aTextView[][] = new TextView[20][3];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout raiz = (LinearLayout) findViewById(R.id.raiz);
        SensorManager sm = (SensorManager) getSystemService(
                Context.SENSOR_SERVICE);
        if (sm!=null) {
            listaSensores = sm.getSensorList(Sensor.TYPE_ALL);
            int n = 0;
            for (Sensor sensor : listaSensores) {
                TextView mTextView = new TextView(this);
                mTextView.setText(sensor.getName());
                raiz.addView(mTextView);
                LinearLayout nLinearLayout = new LinearLayout(this);
                raiz.addView(nLinearLayout);
                for (int i = 0; i < 3; i++) {
                    aTextView[n][i] = new TextView(this);
                    aTextView[n][i].setText("?");
                    aTextView[n][i].setWidth(87);
                }
                TextView xTextView = new TextView(this);
                xTextView.setText(" X: ");
                nLinearLayout.addView(xTextView);
                nLinearLayout.addView(aTextView[n][0]);
                TextView yTextView = new TextView(this);
                yTextView.setText(" Y: ");
                nLinearLayout.addView(yTextView);
                nLinearLayout.addView(aTextView[n][1]);
                TextView zTextView = new TextView(this);
                zTextView.setText(" Z: ");
                nLinearLayout.addView(zTextView);
                nLinearLayout.addView(aTextView[n][2]);
                sm.registerListener(this, sensor,
                        SensorManager.SENSOR_DELAY_UI);
                n++;
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        synchronized (this) {
            int n = 0;
            for (Sensor sensor : listaSensores) {
                if (event.sensor == sensor) {
                    for (int i = 0; i < event.values.length; i++) {
                        aTextView[n][i].setText(String.valueOf(
                                event.values[i]));
                    }
                }
                n++;
            }
        }
    }
}
Anuncios

En este caso tenemos el layout vacio, para ello primero crearemos una lista de los sensores con el objeto listaSensores, y luego un objeto de la clase TextView llamado aTextView el cual tambien sera un array de dos dimensiones, en el metodo onCreate() crearemos el enlace a nuestro layout y lo llamaremos raiz, luego crearemos un objeto llamado sm de la clase SensorManager, en el cual usaremos getSystemService() para obtener el estado de nuestros sensores. Luego chequearemos si el objeto sm sea distinto de null en caso afirmativo lo primero que haremos es asignar la lista de nuestros sensores al objeto listaSensores, despues crearemos una variable llamada n con valor cero, despues en un bucle for crearemos un objeto de la clase TextView  llamado mTextView donde guardaremos el nombre del sensor, y este lo agregaremos a nuestro layout, luego crearemos un nuevo objeto llamado nLinearLayout de la clase LinearLayout el cual lo agregaremos al layout, despues tendremos un ciclo for donde estableceremos los valores por defecto de nuestros campos dentro del array aTextView, despues tendremos tres bloques iguales donde guardaremos las tres dimensiones de nuestros sensores (X,Y,Z), crearemos sus respectivos elementos TextView y los agregaremos dentro del layout llamado nLinearLayout, despues registraremos los eventos y por ultimo incrementaremos el valor de n. Despues vienen los dos metodos vistos en el post anterior, el primero como hasta ahora no lo cambiaremos y el segundo se encargara de asignar el valor del sensor cuando cambie el mismo, si probamos nuestra app obtendremos un resultado similar a este

android00

Como pueden ver en nuestro emulador funciono correctamente  trayendo los distintos valores de los sensores disponibles. Lamentablemente en mi equipo real no me funciono porque devuelve un error y se cierra pero en el emulador funciona perfectamente.

Nota: Esto es debido a que no reconoce el TYPE_ALL pero si lo modificamos por un sensor especifico funciona correctamente.
Anuncios

En resumen, hoy hemos visto como funcionan los sensores en tiempo real, hemos logrado crear nuestros elementos por medio de codigo Java y por medio de esto le hemos informado nuestros datos, espero les haya sido util sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00