Android实现传感器功能

Rachel ·
更新时间:2024-11-01
· 1797 次阅读

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测试效果:



传感器 Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号