无论是在Android手机还是其他Android设备,都会有传感器,传感器是硬件,传感器监听回调打印的参数都是硬件定义好的;
传感器分类:

传感器应用场景的例子:
光线传感器:手机能够通过感应到光线的变化自动调节亮度
距离传感器:手机碰到耳朵👂,接听电话/拨打电话的时候,会自动灭屏
加速度传感器:公交车防盗:例如:手机被小偷快速拿走放置在兜里,有个加速度(突然快 突然听),会自动播放报警音乐🎵
方向传感器:🧭指南针的功能
以前的时候,也是智能手机刚刚起步的年代,我买了个300多元的Android智能手机,那个时候我记得,接电话/打电话 手机碰到耳朵不会自动灭屏(这是因为没有距离传感器硬件),无法使用指南针🧭(这是因为没有方向传感器硬件),为什么会没有这些硬件呢:那是因为手机买的便宜,而这些传感器硬件是要花钱的,所以说传感器是由硬件来决定的,没有这个硬件,软件就搞不成。
这篇博客只讲解距离传感器,因为所有传感器的使用,代码都是类似的;
不同的是,传感器类型:
TYPE_PROXIMITY 是获取距离传感器
TYPE_ORIENTATION 方向传感器
TYPE_ACCELEROMETER 加速度传感器
TYPE_LIGHT 光线传感器
TYPE_MAGNETIC_FIELD 磁场传感器
TYPE_TEMPERATURE 温度传感器

不同的是,传感器级别:
SENSOR_DELAY_FASTEST 最快级别
SENSOR_DELAY_GAME 游戏级别
SENSOR_DELAY_NORMAL 正常级别
SENSOR_DELAY_UI 非常普通的级别

为什么要在onResume() 注册传感器监听, onPause() 解除传感器监听 ?
答:这个和Android-SurfaceView生命周期这篇博客很类似,也是在onResume() 注册 onPause() 解除,因为都是在操作硬件,操作硬件很耗费
距离传感器:
package liudeli.my_media1; 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.util.Log; public class MySensorActivity extends Activity { private final String TAG = MySensorActivity.class.getSimpleName(); // 定义传感器管理器 变量 private SensorManager sensorManager; // 定义传感器 变量 private Sensor sensor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 传感器管理在系统服务里面 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); /** * TYPE_PROXIMITY 是获取距离传感器 * TYPE_ORIENTATION 方向传感器 * TYPE_ACCELEROMETER 加速度传感器 * TYPE_LIGHT 光线传感器 * TYPE_MAGNETIC_FIELD 磁场传感器 * TYPE_TEMPERATURE 温度传感器 */ sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); // 是获取距离传感器 } /** * 在Activity到前台就要onResume,因为当Activity不再前台就会被销毁 */ @Override protected void onResume() { super.onResume(); /** * 注册传感器监听 * 参数一:sensorEventListener 监听传感器的变化 * 参数二:获取的传感器 * 参数三:传感器级别: * SENSOR_DELAY_FASTEST 最快级别 * SENSOR_DELAY_GAME 游戏级别 * SENSOR_DELAY_NORMAL 正常级别 * SENSOR_DELAY_UI 非常普通的级别 */ sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_GAME); // 设置游戏级别已经很高了 } private SensorEventListener sensorEventListener = new SensorEventListener() { /** * 传感器数据发生了改变,回调此方法 * @param event */ @Override public void onSensorChanged(SensorEvent event) { Log.d(TAG, "onSensorChanged:" + event.values[0] + "厘米"); } /** * 精确度改变,这个通常很难用到,设计到传感器的差异性才会回调此方法 * @param sensor * @param accuracy */ @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.d(TAG, "onAccuracyChanged:" + accuracy); } }; /** * 在Activity到前台就要onResume,因为当Activity不再前台就会被销毁 */ @Override protected void onPause() { super.onPause(); /** * 解除注册传感器监听 * 为什么 onPause就要销毁,因为这是操作硬件,只要是操作硬件就非常耗性能 */ sensorManager.unregisterListener(sensorEventListener, sensor); } }
Log传感器数据变化的信息: 为什么只返回 0.0 0.5 呢,这是传感器硬件已经规定好的:
2018-12-21 16:45:41.256 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:5.0厘米
2018-12-21 16:45:43.471 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:0.0厘米
2018-12-21 16:45:44.156 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:5.0厘米
2018-12-21 16:45:45.484 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:0.0厘米
2018-12-21 16:45:45.685 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:5.0厘米
2018-12-21 16:45:46.088 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:0.0厘米
2018-12-21 16:45:46.491 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:5.0厘米
2018-12-21 16:45:46.693 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:0.0厘米
2018-12-21 16:45:47.097 15294-15294/liudeli.my_media1 D/MySensorActivity: onSensorChanged:5.0厘米
浙公网安备 33010602011771号