无论是在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厘米