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 ...
随机推荐
- Cookies和Session理论总结
今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结.本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Sessi ...
- 计算几何(凸包):SHTSC 2012 信用卡凸包
这道题是水题,发现平移某些边,答案就是圆心的凸包+一个圆的周长. 不要忽视精度误差! #include <algorithm> #include <iostream> #inc ...
- response常见应用、response细节、输出随机图片、定时刷新网页
response常见应用 向客户端输出中文数据 分别以OutputStream和PrintWriter输出 多学一招:使用HTML语言里面的<meta>标签来控制浏览器行为 思考:用O ...
- PowerDesigner 的常用小技巧 转
中小 订阅 修改外键命名规则 选择Database—>Edit Current DBMS选择Scripts->Objects->Reference->ConstName可以发现 ...
- AppScan修复漏洞:启用不安全的HTTP方法
最近对于系统使用Appscan扫描出中危漏洞“启用不安全的HTTP方法,找了很多修复方法都不能达到效果. 漏洞截图: 漏洞描述: 危险级别 中危险 影响页面 整个WEB页面. 简短描述 管 ...
- Angular.js vs Ember.js
Angular.js 拥抱 HTML/CSS Misko Hevery(Angular.js的开发者之一)回答了这一问题,他的主要观点如下: 在HTML中加入太多逻辑不是好做法.Angular.js只 ...
- LCD framebuffer驱动设计文档
内容提要:1. android display相关的名词2. 调试LCD驱动需要注意的步骤3. 关于帧缓冲区及I/O内存---------------------------------------- ...
- javascript如何监听页面刷新和页面关闭事件
本文转之http://www.qqtimezone.top 在我们的日常生活中,时常遇到这么一种情况,当我们在点击一个链接.关闭页面.表单提交时等情况,会提示我们是否确认该操作等信息. 这里就给大家讲 ...
- Intellij 中的git操作 转!
http://blog.csdn.net/lovesummerforever/article/details/50032937 Git原理以后会分章节介绍,本次主要说一下intellij怎样操作git ...
- Notepad++强大的代码补全和代码提示功能的方法
最近写项目,经常要打开一些文件去修改一些代码段.那么我的项目都是使用ied大型编辑器去写的,每次修改文件,哪怕是一个标点都要用一分钟时间去打开软件.当然,后来我也考虑到使用记事本,但总感觉不是很爽. ...