day09-Android传感器

  • 一、引入
  • 二、目前Android设备中可能出现的一些传感器类型包括
  • 三、使用步骤
  • 开发传感器的应用步骤如下:
  • 四、安卓常用的传感器
  • 1、方向传感器
  • 2、陀螺仪传感器
  • 3、磁场传感器
  • 4、重力传感器
  • 5、线性加速度传感器
  • 6、温度传感器
  • 7.光传感器
  • 8.压力传感器
  • android5.0新增的心率传感器
  • 五、相关代码 AND 效果图


一、引入

手机内置的传感器是一种微型的物理设备,它能够探测、感受外界的信号,将来自真实世界的数据提供给应用程序,应用程序然后使用传感器数据向用户通知真实世界的情况,或用来控制游戏进度、或实现增强现实等。至于具体如何去利用这些信息就要充分发挥开发者的想象力了。
传感器目前已经成为了智能手机的标配。比较常见的传感器有:方向传感器、磁场传感器、温度传感器、光传感器、压力传感器、加速度传感器、重力传感器、陀螺仪传感器等。传感器就像一个个触手,不断采集着外部的信息,并将这些信息传送回手机进一步处理。在Android的特色开发技术中,除了基于位置的服务外,传感器技术绝对是最值得期待的技术。通过在Android应用中添加传感器,可以充分激发开发者的想象力,开发出各种新奇的程序。比如电子罗盘、水平仪,各种感知型游戏。

二、目前Android设备中可能出现的一些传感器类型包括

方向传感器
磁场传感器
温度传感器
光传感器
压力传感器
加速度计
距离传感器
陀螺仪传感器
重力传感器(Android2.3开始)
线性加速度传感器(Android2.3开始)
旋转矢量传感器(Android2.3开始)
相对湿度传感器(Android2.3开始)
NFC(近场通信)传感器(Android2.3开始):NFC传感器与其他传感器不同,因为它使用与其他传感器完全不同的方式来访问。

三、使用步骤

开发传感器的应用步骤如下:

1.调用context的getsystemservice(context.SENSOR_SERVICE)方法获取SensorManager对象,
SensorManager对象代表系统的传感器管理服务。
2.调用SensorManager的getDefaultSensor(int type)方法来获取指定类型的传感器。
3,实现SensoreEventListener接口。
4.通常选择在activity的onResume()方法中调用SensorManager的registerListener()方法为指定的传感器注册监听器(SensoreEventListener),程序通过监听器(onSensorChanged())回调即可获取传感器传回来的事件数据。
5,在onPause中 unRegisterListener(),取消监听传感器数据;

四、安卓常用的传感器

1、方向传感器

a)方向传感器用于感应手机设备的摆放状态,方向传感器可以返回三个角度,这三个角度即可确定手机的摆放状态。
关于方向传感器返回的三个角度说明如下:
第一个角度:表示手机顶部朝向与正北方的夹角,当手机绕着z轴旋转时,该角度值发生变化。

第二个方向:表示手机顶部与尾部翘起来的角度,当手机绕着x轴倾斜时,该角度值发生变化。

第三个方向:表示手机左侧或者右侧翘起的角度。当手机绕着y轴倾斜时,该角度值发生变化。

2、陀螺仪传感器

陀螺仪传感器用于手机设备的旋转速度,陀螺仪传感器可以返回设备绕x,y,z这三个坐标值
(陀螺仪传感器的坐标系统和加速度传感器的坐标系统完全相同)的旋转速度,旋转速度的单位是弧度/秒,
旋转速度为正值代表逆时针旋转,负值代表顺时针旋转。
返回的三个角速度有如下说明:
第一个值:代表该设备绕x轴旋转的角速度。
第二个值:代表该设备绕y轴旋转的角速度。
第三个值:代表该设备绕z轴旋转的角速度。

3、磁场传感器

磁场传感器主要用于读取手机设备外部的磁场强度,即使周围没有任何直接的磁场,手机设备也始终处于
地球的磁场中,随着手机设备摆放状态的改变,周围的磁场在手机的x,y,z方向上的影响也会发生改变。
磁场传感器会返回三个数据,分别代表周围磁场分解到x,y,z三个方向上的磁场分量,磁场数据的单位是微特斯拉。

4、重力传感器

重力传感器会返回一个三维向量,这个三维向量可显示重力的方向和强度,重力传感器的坐标系统和
加速度传感器的坐标系统是相同的。
当设备处于静止状态时,重力传感器的输出,与加速度传感器的输出应该是相同的。

5、线性加速度传感器

线性加速度返回一个三维向量,可显示在各方向上的加速度(不包含重力加速度)。线性加速度传感器的
坐标系统与加速度传感器的坐标系统相同。

6、温度传感器

温度传感器用于获取手机设备所处的环境的温度,温度传感器会返回一个数据,代表手机设备周围的温度,
单位是摄氏度。

7.光传感器

光传感器用于获取手机设备所处环境的光的强度,光传感器会返回一个数据,代表手机设备周围光的强度。
单位勒克斯。

8.压力传感器

压力传感器用于获取手机设备所处环境的压力的大小,压力传感器会返回一个数据,代表设备周围压力的大小。

android5.0新增的心率传感器

心率传感器是5.0新增的一种传感器

五、相关代码 AND 效果图

Android传感器 android传感器前景_加速度传感器


Android传感器 android传感器前景_数据_02

public class AeecActivity extends AppCompatActivity implements SensorEventListener {
    private TextView text;
    private SensorManager sensorManager;
    private Sensor sensor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_aeec);
        initView();
        initSensor();
    }

    //获取焦点的时候 注册传感器的事件
    @Override
    protected void onResume() {
        super.onResume();
        //是用管理者去注册事件
        sensorManager.registerListener(this,sensor,200);
    }
    //失去脚垫时,注销事件
    @Override
    protected void onPause() {
        super.onPause();
        //注销事件
        sensorManager.unregisterListener(this);
    }

    //初始化传感器,获取要使用的传感器的实例
    @SuppressLint("ServiceCast")
    private void initSensor() {
        //获取传感器管理者对象
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        //获取我们要使用的传感器实例
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }

    private void initView() {
        text  = findViewById(R.id.text_aeec);
    }

    //传感器事件
    @Override
    public void onSensorChanged(SensorEvent event) {
        float[] values = event.values;
        float x = values[0];
        float y = values[1];
        float z = values[2];

        text.setText("X轴加速度 = "+x+"Y轴加速度 = "+y+"Z轴加速度 = "+z);
    }

    //传感器值变化回调
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

Android传感器 android传感器前景_ide_03


Android传感器 android传感器前景_ide_04

public class WXActivity extends AppCompatActivity implements SensorEventListener {
    private Vibrator vibrator;
    private ImageView image_up,image_down;
    private SensorManager sensorManager;
    private Sensor sensor;
    private SoundPool soundPool;
    private TranslateAnimation translateAnimationup;
    private TranslateAnimation translateAnimationdown;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wx);
        init();
        initData();
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this,sensor,200);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    private void initData() {
        //初始化传感器
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //初始化震动
        vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        //初始化音乐
        //最大数量   播放的类型   质量参数
        soundPool = new SoundPool(5,AudioManager.STREAM_MUSIC,0);
        //播放的优先级别
        soundPool.load(this,R.raw.wx,1);
        //初始化动画
        translateAnimationup = new TranslateAnimation(0,0,0,-50);
        translateAnimationdown = new TranslateAnimation(0,0,0,50);
    }

    private void init() {
        image_up = findViewById(R.id.image_up);
        image_down = findViewById(R.id.image_down);
    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        //实现摇一摇的逻辑
        float[] values = event.values;
        float x = values[0];
        float y = values[1];
        float z = values[2];

        if (Math.abs(x) > 15 || Math.abs(y) > 15 || Math.abs(z) > 15){
            //摇晃手机 实现预制效果
            long[] patten = {300,500};
            vibrator.vibrate(patten,-1);
            //声音效果
            soundPool.play(1,1,1,1,1,1);
            //动画效果
            translateAnimationup.setDuration(2000);
            translateAnimationdown.setDuration(2000);

            image_up.startAnimation(translateAnimationup);
            image_down.startAnimation(translateAnimationdown);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}