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 ...
随机推荐
- SPOJ_10628_Count_on_a_Tree_(主席树+Tarjan)
描述 http://www.spoj.com/problems/COT/ 给出一棵n个节点的树,树上每一个节点有权值.m次询问,求书上u,v路径中第k小的权值. COT - Count on a tr ...
- 【Android 复习】:Android之ViewFlipper(二)
通过手势移动屏幕 上面是通过屏幕上的按钮来在屏幕间切换的,这看起来多少有点不符合Android的风格,如果要是能通过手势的左右滑动来实现屏幕的切换就比较优雅了. 通过android.view.Gest ...
- Linux上使用Qt Creator进行C/C++开发
目录[-] 1.安装Qt Creator和基础构建环境(以Ubuntu为例): 2.把自动完成快捷键"Ctrl+空格"改为"Alt+/"或者"Shif ...
- webbrowser控件事件
Beforenavigate2: Fired before navigate occurs in the given WebBrowser(window or frameset element). T ...
- 分布式基础通信协议:paxos,totem和gossip
转:http://blog.csdn.net/cloudresearch/article/details/23127985 背景: 在分布式中,最难解决的一个问题就是多个节点间数据同步问题.为了解决这 ...
- 《C语言程序设计现代方法》第2章 编程题
7 编写一个程序,要求用户输入一个美金数量,然后显示出如何使用最少的20美元.10美元.5美元和1美元来付款. 提示:将付款金额除以20,确定20美元的数量,然后从付款金额中减去20美元的总金额.对其 ...
- nyoj 经典的连续字串和
import java.util.Scanner; public class 字串和 { public static void main(String[] args) { // TODO Auto-g ...
- MAC 下安装opencv遇到问题的解决方法(安装homebrew, wget)
遇到问题: (1)Mac安装OpenCV下载ippicv_macosx_20141027.tgz失败解决方案 先附上当时的报错信息: -- ICV: Downloading ippicv_macosx ...
- JVM performance profiling (有待整理)
Agenda memory model 3 parts: heap, permgen (method area) , thread stack(pointer, local var) heap: yo ...
- Linux中查看系统资源占用情况的命令【转载】
用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载 ...