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

Android开发手记(22) 传感器的使用的更多相关文章
- (转)Android开发--常用的传感器总结
随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌.今天来简单介绍下Android中 ...
- Android开发10:传感器器及地图相关应用
前言 啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了. 一起进入我们今天的相关内容~这次我们将一起学习使用 ...
- Android 开发手记一NDK编程实例
在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...
- Android开发之重力传感器
重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图 假设当地的重力加速度值为g 当手机正面朝上的时候,z的值为q,反面朝上的时候, ...
- Android开发手记(28) Handler和Looper
Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道.平 ...
- Android开发手记(24) Log的使用及颜色的更改
在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用.本文 ...
- Android开发手记(18) 数据存储三 SQLite存储数据
Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...
- Android开发手记(17) 数据存储二 文件存储数据
Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 本文主要介绍如何使用文件来存储 ...
- Android开发手记(32) 使用摄像头拍照
在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面. 我们要添加如下权限: <uses-permission android:na ...
随机推荐
- [转]Unity 3D旋转矢量方向及二维平面基于一点选择另一点(Rotate a Vector3 direction & Rotate a point about another point in 2D )
http://specialwolf.blog.163.com/blog/static/124466832201301332432766/ ****************************** ...
- wpa_supplicant对wep,wpa,wpa2的psk和隐藏ap的scan_ssid扫描配置
# 请不要修改下面这一行内容,否则将不能正常工作ctrl_interface=/var/run/wpa_supplicant # 确保只有root用户能读取WPA的配置ctrl_interface_g ...
- DataSet用法详细
转自:http://www.cnblogs.com/zeroone/archive/2012/06/08/2541299.html DataSet用法详细 一.特点介绍 1.处理脱机数据,在多层应用程 ...
- FZU 2213 Common Tangents 第六届福建省赛
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2213 题目大意:两个圆,并且知道两个圆的圆心和半径,求这两个圆共同的切线有多少条,若有无数条,输出-1,其他条 ...
- 如何设置textarea光标默认为第一行第一个字符
判断文本区是否有内容,如果没有那么光标肯定是在第一行第一个为止的,记住,空格回车也算是有内容在的,也会影响光标的位置
- Redis 和 Memcached 的区别详解
Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较: Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支 ...
- HOWTO: Setup XCode 6.1 to work with OpenCV3 libraries
HOWTO: Setup XCode 6.1 to work with OpenCV3 libraries Overview This post demonstrates how to setup y ...
- ar技术序章-SDK介绍和选择
转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...
- 一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频.
- Ueditor自定义默认宽度高度
如题. 最近需要使用到网页后台富文本编辑器.经过同学推荐,最后决定使用百度家的Ueditor. 官方地址:http://ueditor.baidu.com/website/ 贴吧地址:ueditor讨 ...