Probando los sensores (Delphi XE5) – Parte I
La mayoría de dispositivos Android (teléfonos y tablets) actuales cuentan con un gran número de sensores, de diferentes tipos y de variada funcionalidad. Algunos más conocidos que otros y algunos más útiles que otros.
La idea de esta entrada y de las siguientes es mostrar cómo funcionan y cómo acceder a la información que nos proporcionan los diferentes sensores presentes.
Los sensores presentes en el dispositivo se gestionan utilizando la clase TSensorManager, que se encuentra en la unit System.Sensors. Además podemos encontrar otras units que completan las definiciones para cada una de las plataformas destino (System.IOS.Sensors, System.Win.Sensors, System.Mac.Sensors,…)
Para acceder al SensorManager, lo podemos hacer a través de la propiedad Current de la clase, que nos devolverá la instancia ya creada.
TSensorManager.Current… |
Los sensores están organizados o divididos por categorías.
Las disponibles están definidas en el enumerado TSensorCategory. Podemos hacer un recorrido por todas las categorías disponibles y mostrarlas utilizando el siguiente código:
var cat: TSensorCategory; … // Recorrido por las categorías disponibles for cat := Low(TSensorCategory) to High(TSensorCategory) do begin s := GetEnumName(TypeInfo(TSensorCategory), integer(cat)); Memo1.Lines.Add(IntToStr(Ord(cat)) + ' - ' + s); |
Dentro de cada una de las categorías, según el dispositivo, dispondremos de uno o varios sensores. Para acceder a los diferentes sensores de una categoría disponemos de la función GetSensorsByCategory; Esta función nos devolverá una array con los sensores disponibles en esa categoría.
Una vez que accedemos a un sensor, encontramos que todos las clases de sensores (TCustomLocationSensor, TCustomEnvironmentalSensor,…) derivan de la clase TCustomSensor, que posee la mayoría de métodos abstractos, que después se redefinen en las clases derivadas.
Una vez que activamos el TSensorManager, podemos acceder a las propiedades particulares de cada uno de los sensores.
Si utilizamos RTTI, podemos acceder a lista de propiedades para cada una de las clases de sensores. Si lo combinamos con la lista de sensores presentes (visto antes), tendremos la lista particular para nuestro dispositivo:
ClassName: TCustomLocationSensor Latitude Longitude ErrorRadius Altitude Speed TrueHeading MagneticHeading Address1 Address2 City StateProvince PostalCode CountryRegion ···························································· ClassName: TCustomEnvironmentalSensor Temperature Pressure Humidity WindDirection WindSpeed ···························································· ClassName: TCustomMotionSensor AccelerationX AccelerationY AccelerationZ AngleAccelX AngleAccelY AngleAccelZ Motion Speed ···························································· ClassName: TCustomOrientationSensor TiltX TiltY TiltZ DistanceX DistanceY DistanceZ HeadingX HeadingY HeadingZ MagHeading TrueHeading CompMagHeading CompTrueHeading···························································· ClassName: TCustomElectricalSensor Capacitance Resistance Inductance Current Voltage Power···························································· ClassName: TCustomMechanicalSensor SwitchState SwitchArrayState MultiValueState Force AbsPressure GaugePressure Strain Weight···························································· ClassName: TCustomBiometricSensor HumanPresence HumanProximity Touch···························································· ClassName: TCustomLightSensor Lux Temperature Chromacity ···························································· ClassName: TCustomScannerSensor |
Para algunas de estas clases, Embarcadero ha creado componentes que facilitan el trabajo de acceso a las propiedades, pero se puede acceder a las mismas funcionalidades a través del TSensorManager.
En próximas entradas iremos viendo algo más del funcionamiento de algunos de ellos.
Os adjunto el código fuente del proyecto de prueba, así como el compilado para Windows (exe) y el compilado para Android (apk).
<Código fuente>
<Compilado para Windows>
<Compilado para Android>
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Interesante aporte, muchas gracias :)
Muy interesante!!
Soy nuevo en el mundo android y me ha surgido una duda.
¿la cámara y el micrófono los trata como sensores o son otra cosa?
¿cómo podría sensar lo que viene del micrófono? (me interesa sobre todo poder detectar unos pulsos sonoros)
Desde ya muchas gracias
Hola Marcelo.
La cámara y el micrófono no se tratan con las clases de sensores. Poseen clases específicas para trabajar con ellos.
Para el micrófono, puedes buscar una demo de Danysoft, donde puedes ver cómo grabar y reproducir sonidos (youtube).
Y para el tema de la cámara creo que también se puede encontrar algun video de Embarcadero al respecto.
Un saludo.
Hola, muchísimas gracias por esto.
intento leer diversos sensores desde un Arduino conectado al ordenador.
¿Me puede ser útil esta unidad para controlar el puerto USB de una PC de escritorio?
No estoy seguro de si es la pregunta apropiada en en lugar correcto, desde ya te agradezco cualquier respuesta.
@victor
Hola Víctor.
Para un PC de escritorio, sea con VCL o FMX te puede ser útil la librería GLibWMI (http://neftali.clubdelphi.com/?p=589) que te dará información sobre gran parte de componentes del equipo.