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);
}
}); } }

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

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

    随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌.今天来简单介绍下Android中 ...

  2. Android开发10:传感器器及地图相关应用

    前言 啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了. 一起进入我们今天的相关内容~这次我们将一起学习使用 ...

  3. Android 开发手记一NDK编程实例

    在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...

  4. Android开发之重力传感器

    重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图 假设当地的重力加速度值为g 当手机正面朝上的时候,z的值为q,反面朝上的时候, ...

  5. Android开发手记(28) Handler和Looper

    Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道.平 ...

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

    在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用.本文 ...

  7. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  8. Android开发手记(17) 数据存储二 文件存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 本文主要介绍如何使用文件来存储 ...

  9. Android开发手记(32) 使用摄像头拍照

    在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面. 我们要添加如下权限: <uses-permission android:na ...

随机推荐

  1. 数学(容斥计数):LNOI 2016 方

    Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...

  2. JavaScript---网络编程(10)--DHTML技术演示(3)-多选框

    这节讲述多选框的使用,当然,肯定是结合css和Javascript一起的. checkbox的使用1: 演示代码: <html> <head> <meta http-eq ...

  3. JavaScript---网络编程(4)-Date、Math、Global和自定义对象

    本节博客进行Date对象.Math对象.Global对象和自定义对象的用法演示. 首先是一个out.js文件内容(输出到网页中的自定义输出方法): function println(parma){ d ...

  4. 进程与线程(四) linux进程间通信的方式总结

    1概述: 上文说到,每个进程都有自己的地址空间,包括什么呢?向下生长得栈,向上生长的堆,代码段,数据段等,这些都是进程私有的,如何实现通信的呢?通信需要媒介,这个媒介很重要. 对于研发人员来说,进程不 ...

  5. ab apache Benchmarking中链接的写法 记得加上/

    C:\wamp\bin\apache\Apache2.2.21\bin>ab.exe -n5 -c5 http://www.baidu.com ab.exe: invalid URL Usage ...

  6. Idea实现WebService实例 转

    作者:http://blog.csdn.net/dreamfly88/article/details/52350370 因为工作需要,数据传输部分需要使用webservice实现,经过两天的研究,实现 ...

  7. switch语法中break,default作用说明

    转自:http://cjhbest999.iteye.com/blog/1137124 关于java中switch使用的一些说明 switch(表达式) { case 常量表达式1:语句1; .... ...

  8. 【JAVA - SSM】之MyBatis插入数据后获取自增主键

    很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: (1)先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段 ...

  9. android考试题

    一.选择题 1. Math.round(11.5)等于多少(    ). Math.round(-11.5) 等于多少(   C  ). A.11 ,-11    B.11 ,-12 C.12 ,-1 ...

  10. 服装销售系统数据库课程设计(MVC)

    <数据库课程设计> 名称:Jia服装销售网站 姓名:陈文哲 学号:…… 班级:11软件工程 指导老师:索剑 目录 目录 1 需求分析 3 一:销售部门机构情况 3 二:销售部门的业务活动情 ...