day09-Android传感器
- 一、引入
- 二、目前Android设备中可能出现的一些传感器类型包括
- 三、使用步骤
- 开发传感器的应用步骤如下:
- 四、安卓常用的传感器
- 1、方向传感器
- 2、陀螺仪传感器
- 3、磁场传感器
- 4、重力传感器
- 5、线性加速度传感器
- 6、温度传感器
- 7.光传感器
- 8.压力传感器
- android5.0新增的心率传感器
- 五、相关代码 AND 效果图
一、引入
手机内置的传感器是一种微型的物理设备,它能够探测、感受外界的信号,将来自真实世界的数据提供给应用程序,应用程序然后使用传感器数据向用户通知真实世界的情况,或用来控制游戏进度、或实现增强现实等。至于具体如何去利用这些信息就要充分发挥开发者的想象力了。
传感器目前已经成为了智能手机的标配。比较常见的传感器有:方向传感器、磁场传感器、温度传感器、光传感器、压力传感器、加速度传感器、重力传感器、陀螺仪传感器等。传感器就像一个个触手,不断采集着外部的信息,并将这些信息传送回手机进一步处理。在Android的特色开发技术中,除了基于位置的服务外,传感器技术绝对是最值得期待的技术。通过在Android应用中添加传感器,可以充分激发开发者的想象力,开发出各种新奇的程序。比如电子罗盘、水平仪,各种感知型游戏。
二、目前Android设备中可能出现的一些传感器类型包括
方向传感器
磁场传感器
温度传感器
光传感器
压力传感器
加速度计
距离传感器
陀螺仪传感器
重力传感器(Android2.3开始)
线性加速度传感器(Android2.3开始)
旋转矢量传感器(Android2.3开始)
相对湿度传感器(Android2.3开始)
NFC(近场通信)传感器(Android2.3开始):NFC传感器与其他传感器不同,因为它使用与其他传感器完全不同的方式来访问。
三、使用步骤
开发传感器的应用步骤如下:
1.调用context的getsystemservice(context.SENSOR_SERVICE)方法获取SensorManager对象,
SensorManager对象代表系统的传感器管理服务。
2.调用SensorManager的getDefaultSensor(int type)方法来获取指定类型的传感器。
3,实现SensoreEventListener接口。
4.通常选择在activity的onResume()方法中调用SensorManager的registerListener()方法为指定的传感器注册监听器(SensoreEventListener),程序通过监听器(onSensorChanged())回调即可获取传感器传回来的事件数据。
5,在onPause中 unRegisterListener(),取消监听传感器数据;
四、安卓常用的传感器
1、方向传感器
a)方向传感器用于感应手机设备的摆放状态,方向传感器可以返回三个角度,这三个角度即可确定手机的摆放状态。
关于方向传感器返回的三个角度说明如下:
第一个角度:表示手机顶部朝向与正北方的夹角,当手机绕着z轴旋转时,该角度值发生变化。
第二个方向:表示手机顶部与尾部翘起来的角度,当手机绕着x轴倾斜时,该角度值发生变化。
第三个方向:表示手机左侧或者右侧翘起的角度。当手机绕着y轴倾斜时,该角度值发生变化。
2、陀螺仪传感器
陀螺仪传感器用于手机设备的旋转速度,陀螺仪传感器可以返回设备绕x,y,z这三个坐标值
(陀螺仪传感器的坐标系统和加速度传感器的坐标系统完全相同)的旋转速度,旋转速度的单位是弧度/秒,
旋转速度为正值代表逆时针旋转,负值代表顺时针旋转。
返回的三个角速度有如下说明:
第一个值:代表该设备绕x轴旋转的角速度。
第二个值:代表该设备绕y轴旋转的角速度。
第三个值:代表该设备绕z轴旋转的角速度。
3、磁场传感器
磁场传感器主要用于读取手机设备外部的磁场强度,即使周围没有任何直接的磁场,手机设备也始终处于
地球的磁场中,随着手机设备摆放状态的改变,周围的磁场在手机的x,y,z方向上的影响也会发生改变。
磁场传感器会返回三个数据,分别代表周围磁场分解到x,y,z三个方向上的磁场分量,磁场数据的单位是微特斯拉。
4、重力传感器
重力传感器会返回一个三维向量,这个三维向量可显示重力的方向和强度,重力传感器的坐标系统和
加速度传感器的坐标系统是相同的。
当设备处于静止状态时,重力传感器的输出,与加速度传感器的输出应该是相同的。
5、线性加速度传感器
线性加速度返回一个三维向量,可显示在各方向上的加速度(不包含重力加速度)。线性加速度传感器的
坐标系统与加速度传感器的坐标系统相同。
6、温度传感器
温度传感器用于获取手机设备所处的环境的温度,温度传感器会返回一个数据,代表手机设备周围的温度,
单位是摄氏度。
7.光传感器
光传感器用于获取手机设备所处环境的光的强度,光传感器会返回一个数据,代表手机设备周围光的强度。
单位勒克斯。
8.压力传感器
压力传感器用于获取手机设备所处环境的压力的大小,压力传感器会返回一个数据,代表设备周围压力的大小。
android5.0新增的心率传感器
心率传感器是5.0新增的一种传感器
五、相关代码 AND 效果图
public class AeecActivity extends AppCompatActivity implements SensorEventListener {
private TextView text;
private SensorManager sensorManager;
private Sensor sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aeec);
initView();
initSensor();
}
//获取焦点的时候 注册传感器的事件
@Override
protected void onResume() {
super.onResume();
//是用管理者去注册事件
sensorManager.registerListener(this,sensor,200);
}
//失去脚垫时,注销事件
@Override
protected void onPause() {
super.onPause();
//注销事件
sensorManager.unregisterListener(this);
}
//初始化传感器,获取要使用的传感器的实例
@SuppressLint("ServiceCast")
private void initSensor() {
//获取传感器管理者对象
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//获取我们要使用的传感器实例
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
private void initView() {
text = findViewById(R.id.text_aeec);
}
//传感器事件
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
float x = values[0];
float y = values[1];
float z = values[2];
text.setText("X轴加速度 = "+x+"Y轴加速度 = "+y+"Z轴加速度 = "+z);
}
//传感器值变化回调
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
public class WXActivity extends AppCompatActivity implements SensorEventListener {
private Vibrator vibrator;
private ImageView image_up,image_down;
private SensorManager sensorManager;
private Sensor sensor;
private SoundPool soundPool;
private TranslateAnimation translateAnimationup;
private TranslateAnimation translateAnimationdown;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wx);
init();
initData();
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this,sensor,200);
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
private void initData() {
//初始化传感器
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//初始化震动
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
//初始化音乐
//最大数量 播放的类型 质量参数
soundPool = new SoundPool(5,AudioManager.STREAM_MUSIC,0);
//播放的优先级别
soundPool.load(this,R.raw.wx,1);
//初始化动画
translateAnimationup = new TranslateAnimation(0,0,0,-50);
translateAnimationdown = new TranslateAnimation(0,0,0,50);
}
private void init() {
image_up = findViewById(R.id.image_up);
image_down = findViewById(R.id.image_down);
}
@Override
public void onSensorChanged(SensorEvent event) {
//实现摇一摇的逻辑
float[] values = event.values;
float x = values[0];
float y = values[1];
float z = values[2];
if (Math.abs(x) > 15 || Math.abs(y) > 15 || Math.abs(z) > 15){
//摇晃手机 实现预制效果
long[] patten = {300,500};
vibrator.vibrate(patten,-1);
//声音效果
soundPool.play(1,1,1,1,1,1);
//动画效果
translateAnimationup.setDuration(2000);
translateAnimationdown.setDuration(2000);
image_up.startAnimation(translateAnimationup);
image_down.startAnimation(translateAnimationdown);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}