Android开发手记(22) 传感器的使用

Android的传感器主要包括八大传感器,他们分别是:加速度传感器(accelerometer)、陀螺仪(gyroscope)、方向传感器(orientation)、磁力传感器(magnetic field)、环境光照传感器(light)、温度传感器(temperature)、距离传感器(proximity)和压力传感器(pressure)。本文先对传感器的使用做一个总体的介绍,然后再详细介绍每一种传感器的具体参数获取。

〇、总体介绍

Android传感器的使用,先通过SensorManager获取系统提供的传感器服务。然后通过得到的Sensor服务,实例化一个需要使用到的传感器。之后实例化一个SensorEventListener,来监听传感器的变化信息。最后注册此SensorEventListener即可。

// 获取系统提供的传感器服务
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 实例化需要使用的传感器(以加速度传感器为例)
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 实例化传感器事件监听器
SensorEventListener sel = SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
                // 获取传感器变化信息
                // sensorEvent.values 存储了传感器的数值
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
                // 获取传感器精度变化信息
        }
};
// 注册传感器事件监听器,第三个参数为采样时间
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);

传感器的名称和对应类型为:

名称 英文 类型
加速度传感器 accelerometer Sensor.TYPE_ACCELEROMETER
陀螺仪 gyroscope Sensor.TYPE_GYROSCOPE
方向传感器 orientation Sensor.TYPE_ORIENTATION
磁场传感器 magnetic field Sensor.TYPE_MAGNETIC_FIELD
环境光照传感器 light Sensor.TYPE_LIGHT
温度传感器 temperature Sensor.TYPE_AMBIENT_TEMPERATURE
距离传感器 proximity Sensor.TYPE_PROXIMITY
压力传感器 pressure Sensor.TYPE_PRESSURE

一、加速度传感器(TYPE_ACCELEROMETER)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为X轴方向上的加速度,value[1]为Y轴方向上的加速度,value[2]为Z轴方向上的加速度。单位为m/s2

         btnAcc = (Button) findViewById(R.id.btnAcc);
        btnAcc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "加速度传感器加速度" + "\nX轴:" + value[0]
                                + "\nY轴:" + value[1] + "\nZ轴:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

二、陀螺仪(TYPE_GYROSCOPE

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为X轴方向上的角速度,value[1]为Y轴方向上的角速度,value[2]为Z轴方向上的角速度。单位为rad/s。

        btnGys = (Button)findViewById(R.id.btnGys);
        btnGys.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "陀螺仪传感器角速度" + "\nX轴:" + value[0]
                                + "\nY轴:" + value[1] + "\nZ轴:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

三、方向传感器(TYPE_ORIENTATION

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为Yaw轴方向上的角度,value[1]为Pitch轴方向上的角度,value[2]为Roll轴方向上的角度。单位为degree。其中,在手机平面内顺时针旋转为Yaw增加方向,将手机屏幕向上从左往右看,手机逆时针旋转为Pitch增加方向。手机屏幕向上,从后往前看,手机逆时针旋转为Roll增加方向。

        btnOri = (Button)findViewById(R.id.btnOri);
        btnOri.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "姿态传感器角度" + "\nYaw:" + value[0]
                                + "\nPitch:" + value[1] + "\nRoll:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

四、磁场传感器(TYPE_MAGNETIC_FIELD)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为X轴方向上的磁场强度,value[1]为Y轴方向上的磁场强度,value[2]为Z轴方向上的磁场强度。单位为μT。

        btnMage = (Button)findViewById(R.id.btnMage);
        btnMage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "磁场传感器微特斯拉" + "\nX轴:" + value[0]
                                + "\nY轴:" + value[1] + "\nZ轴:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

五、环境光照传感器(TYPE_LIGHT)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前环境光照强度,单位为lux。

        btnLight = (Button)findViewById(R.id.btnLight);
        btnLight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "光照传感器" + "\n光强(lux):" + value[0];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

六、温度传感器(TYPE_AMBIENT_TEMPERATURE)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前环境温度,单位为摄氏度。

        btnTemp = (Button)findViewById(R.id.btnTemp);
        btnTemp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "温度传感器" + "\n温度(℃):" + value[0];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

七、距离传感器(TYPE_PROXIMITY)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前距离,单位为厘米。距离传感器可以空来探测用户是否在打电话的时候将手机贴到了耳边,从而熄灭屏幕避免误触。

        btnPxm = (Button)findViewById(R.id.btnPxm);
        btnPxm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "距离传感器" + "\n距离(厘米):" + value[0];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

八、压力传感器(TYPE_PRESSURE)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前压力,压力的返回数值为0~1中间的值,没有具体单位。

        btnPre = (Button)findViewById(R.id.btnPre);
        btnPre.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "压力传感器" + "\n压力:" + value[0];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

九、完整代码:

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private Button btnAcc;
    private Button btnGys;
    private Button btnOri;
    private Button btnMage;
    private Button btnLight;
    private Button btnTemp;
    private Button btnPxm;
    private Button btnPrs;
    private TextView textView;
    private SensorManager sensorManager;
    private SensorEventListener sel;
    private Sensor sensor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        btnAcc = (Button) findViewById(R.id.btnAcc);
        btnAcc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "加速度传感器加速度" + "\nX轴:" + value[0]
                                + "\nY轴:" + value[1] + "\nZ轴:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

        btnGys = (Button)findViewById(R.id.btnGys);
        btnGys.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "陀螺仪传感器角速度" + "\nX轴:" + value[0]
                                + "\nY轴:" + value[1] + "\nZ轴:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

        btnOri = (Button)findViewById(R.id.btnOri);
        btnOri.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "姿态传感器角度" + "\nYaw:" + value[0]
                                + "\nPitch:" + value[1] + "\nRoll:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

        btnMage = (Button)findViewById(R.id.btnMage);
        btnMage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "磁场传感器微特斯拉" + "\nX轴:" + value[0]
                                + "\nY轴:" + value[1] + "\nZ轴:" + value[2];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

        btnLight = (Button)findViewById(R.id.btnLight);
        btnLight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "光照传感器" + "\n光强(lux):" + value[0];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

        btnTemp = (Button)findViewById(R.id.btnTemp);
        btnTemp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "温度传感器" + "\n温度(℃):" + value[0];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

        btnPxm = (Button)findViewById(R.id.btnPxm);
        btnPxm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sensorManager.unregisterListener(sel);
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
                sel = new SensorEventListener() {
                    @Override
                    public void onSensorChanged(SensorEvent sensorEvent) {
                        float[] value = sensorEvent.values;
                        String str = "距离传感器" + "\n距离(厘米):" + value[0];
                        textView.setText(str);
                    }

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

                    }
                };
                sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
        });

    }

}

时间: 2024-08-02 19:19:30

Android开发手记(22) 传感器的使用的相关文章

Android开发之方向传感器的使用? (2011-10-13 20:56:05)转载▼

Android开发之方向传感器的使用 (2011-10-13 20:56:05) 转载▼ 标签: android 传感器 方向 指南针 杂谈 分类: 3GAndroid学习笔记 Android中的方向传感器在生活中是一个很好的应用,典型的例子是指南针的使用,我们先来简单介绍一下传感器中三个参数x,y,z的含义,以一幅图来说明.                                      图 1 补充说明:图中的坐标轴x,y,z和传感器中的X,Y,Z没有任何联系! 如上图所示,绿色部

(转)Android开发--常用的传感器总结

随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌.今天来简单介绍下Android中传感器的使用以及一些常用的传感器. 一.传感器的使用 1.首先我们需要获得传感器管理对象:通过 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 2.为SensorManager对象添加监听事件,通过

Android开发--常用的传感器总结

随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌.今天来简单介绍下Android中传感器的使用以及一些常用的传感器.     一.传感器的使用 1.首先我们需要获得传感器管理对象:通过  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 2.为SensorManager对象添加监听

Android开发手记(15) 拨打电话和收发短信

1.Intent简介 Android组价之间的通信,由Intent来协助完成.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用. Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts.分别通过startActivity();startService();startBroadcasts();来执行操作. 在

Android开发之重力传感器

重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,推荐学习Android应用开发入门教程. 首先来看一副图 假设当地的重力加速度值为g当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g当手机右侧面朝上的时候,x的值为g,右侧面朝上的时候,x的值为-g当手机上侧面朝上的时候,y的值为g,右侧面朝上的时候,y的值为-g了解了重力传感器中X,Y,Z的含义之后下面我们就开始学习如何使用首先我们创建一个传感器管理器和一个传感器监听器,管理

Android开发手记(16) 数据存储一 SharedPreferences

SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据.这类似于C++中Map的数据存储方式(实际上在最后生成的.xml文件内,就是以Map格式存储的). 获取SharedPreferences的两种方式: 1.调用Context对象的getSharedPreferences()方法 2.调用Activity对象的getPrefer

Android开发手记(13) 几种Alertdialog的使用

本文主要讨论七种形式的AlertDialog,及其编写方法. 1.退出 在用户退出的时候提示用户是否退出,含有“确定”和“退出”两个按键. 1 btnExit.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View view) { 4 final AlertDialog.Builder alertDlg = new AlertDialog.Builder(MainActivity

Android开发手记(11) 滑动条SeekBar

安卓滑动条的操作特别简单,通过getProgress()可以获得SeekBar的位置,通过setProgress(int progress)可以设置SeekBar的位置.要想动态获取用户对SeekBar的操作的话,只需要设置setOnSeekBarChangeListener即可. setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() 示例代码如下: 1 import android.support.v7.app.App

Android开发手记(24) Log的使用及颜色的更改

在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用.本文简单介绍了Android中Log的使用以及在Android Studio中 Log 颜色的更改. 要使用 Log,我们需要首先 import android.util.Log,其中Log常用的方法有5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字