Android实现传感器功能
Android传感器概述:动作传感器、环境传感器、位置传感器等,如方向传感器(电子罗盘)、重力传感器(横纵切换)。Android SDK支持的传感器并不是每一部Android手机均支持。
动作传感器:在三个轴上测量加速度和旋转角度,包括加速度、重力、陀螺仪;
环境传感器:测量环境参数,包括湿度、光线、温度;
位置传感器:测量设备物理位置,包括方向、磁力。
ASF(Android传感器框架)功能:确定当前Android设备内置传感器;确定传感器技术指标,如传感器测量的最大范围、制造商等;获取传感器回传数据,以及定义回传数据的精度;注册和注销传感器事件监听器,用于监听数据回传。
硬件传感器:加速、温度、陀螺仪、光线、磁场、重力(视情况而定)、线性加速(视情况而定)、湿度、压力、临近、旋转向量
软件传感器:方向。
SensorManager类:创建sensor service实例。访问、枚举、注册、注销监听器、精度、频率等。
Sensor类:提供获取传感器参数。
SensorEvent类:创建传感器事件对象,该对象提供与传感器有关信息,事件对象包括的信息有原始传感器回传数据、类型、精度以及触发事件。
SensorEventListener接口:包含两个回调方法,当传感器回传值或精度发生变化时,系统调用这两个方法。
动作传感器(Motion):监听设备动作的传感器有5个,加速、陀螺仪纯硬件传感器,重力、线性加速、旋转。监测Android手机的动作,如倾斜、震动等。设备的移动通常是对用户输入的直接反应,如游戏中控制小球;设备所处物理环境也会反应在设备的动作上,如手机放在车上。所有动作传感器均会返回3个浮点数值(长度为3的数组)。
重力Demo:设备从左到右推动,X轴加速度为正值;反向Y轴加速度为正值,若向上以Am/s方加速度推动,则Z轴加速度为A+9.81,若计算实际加速度,需要减9.81。
位置传感器:磁场、方向传感器,邻近传感器(测量设备正面到某一个邻近物体的距离)。对于确定设备在真实世界中的物理位置非常有用。前两者返回三个值,邻近返回一个值。
方向传感器:
SensorEvent.values[0]:绕着Z轴旋转的角度。若Y轴正对北方(正常拿手机方向),该值为0,反之,为南,该值180,Y轴指向东方,该值90,反之270。
SensorEvent.values[1]:绕着X轴旋转的角度,当从Z轴正方向朝Y轴正方向,该值为正值,反之,为负值,该值在-180到180中间变动。
SensorEvent.values[2]:绕着Y轴旋转的角度。当从Z轴正方向朝X轴正方向,该值为正值,反之,为负值,该值在-180到180中间变动。
邻近传感器:SensorEvent.values[0]:手机正面距离邻近物体的距离(CM)。
环境传感器:Android提供了4个传感器检测外部环境,如湿度、温度、压强、光线,并不是所有传感器均有,需要提前判断。环境传感器只返回一个值。
TYPE_AMBIENT_TEMPERATURE:event.values[0] ℃ 温度
TYPE_LIGHT:event.values[0] lx 光线
TYPE_PRESSURE:event.values[0] hPa 压强
TYPE_RELATIVE_HUMIDITY:event.values[0] RH(%) 湿度
一、获得当前设备所有的传感器列表
import android.hardware.Sensor; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import java.util.List; public class MainActivity extends AppCompatActivity { private TextView tvSensor; private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvSensor = (TextView) findViewById(R.id.tvSensor); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor:sensors){ tvSensor.append(sensor.getName()+"\n"); } } }
二、动作传感器示例
import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements SensorEventListener { private TextView tvAccelerometer; private SensorManager sensorManager; private float[] gravity = new float[3]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()){ case Sensor.TYPE_ACCELEROMETER: final float alpha = (float)0.8; gravity[0] = alpha*gravity[0]+(1-alpha)*event.values[0]; gravity[1] = alpha*gravity[1]+(1-alpha)*event.values[1]; gravity[2] = alpha*gravity[2]+(1-alpha)*event.values[2]; String accelerometer = "加速度\n"+"X:"+(event.values[0]-gravity[0])+"\n"+"Y:"+ (event.values[1]-gravity[1])+"\n"+"Z:"+(event.values[2]-gravity[2]); Log.d("Z",String.valueOf((event.values[2]-gravity[2]))); tvAccelerometer.setText(accelerometer); break; case Sensor.TYPE_GRAVITY: gravity[0] = event.values[0]; gravity[1] = event.values[1]; gravity[2] = event.values[2]; break; case Sensor.TYPE_PROXIMITY: setTitle(String.valueOf(event.values[0])); default: break; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } protected void onResume(){ super.onResume(); sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_FASTEST); sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL); } protected void onPause(){ super.onPause(); sensorManager.unregisterListener(this); } }
以下是小米2s测试效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。