传感器
一、介绍
1.类型介绍
Android 中传感器以三个浮点数为一组数据来描述设备所处的状态或周围的环境
当传感器测得状态发生变化时,调用SensorEventListener接口的OnSensorChanged(SensorEvent event)方法执行相关操作
这个方法的参数中的event传递了传感器的状态
在方法中可以用event.values[0]、event.values[1]和event.values[2]访问传感器测到的数据
传感器类型 常量
加速传感器 Sensor.TYPE_ACCELEROMETER
重力传感器 Sensor.TYPE_GRAVITY
陀螺仪 Sensor.TYPE_GYROSCOPE
方向传感器 Sensor.TYPE_ORIENTATION
光线传感器 Sensor.TYPE_LIGHT
2.使用
在android系统中开发传感器应用很简单,因为android系统为传感器支持提供了强大的管理服务。
开发传感器的应用步骤如下:
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(),取消监听传感器数据;
Android中常用的传感器。
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新增的一种传感器,这种传感器,可以返
可以通过如下方式获取所有传感器.
SensorManager mSensorManager;
List sensorList;
// 实例化传感器管理者
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 得到设置支持的所有传感器的List
sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
List sensorNameList = new ArrayList();
for (Sensor sensor : sensorList) {
Log.d(TAG, "onResume: "+sensor.getName());
}
private SensorManager sm;
//创建一个SensorManager来获取系统的传感器服务
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
/*
最常用的一个方法 注册事件
参数1 :SensorEventListener监听器
参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
*/
//加速度传感器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextViewx.setText(X_lateral + “”);
mtextViewy.setText(Y_longitudinal + “”);
mtextViewz.setText(Z_vertical + “”);
}
}
其他类似.
二、代码实例
重力加速度传感器 效果
Java代码
package com.bw.day09;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import day01.bw.com.myapplicationfour.R;
public class SpeedActivity extends AppCompatActivity implements SensorEventListener {
private TextView showSpeed;
private SensorManager manager;
private Sensor sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_speed);
initView();
initSensor();
}
//获取焦点的时候注册传感器
@Override
protected void onResume() {
super.onResume();
manager.registerListener(this,sensor,200);
}
//失去焦点之后
@Override
protected void onPause() {
super.onPause();
manager.unregisterListener(this);
}
private void initSensor() {
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
private void initView() {
showSpeed = findViewById(R.id.showSpeed);
}
//传感器的事件
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
float x = values[0];
float y = values[1];
float z = values[2];
showSpeed.setText("X轴加速度:"+x+"====Y轴加速度:"+y+"====Z轴加速度:"+z);
}
//传感器值变化的监听
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
摇一摇效果
Java代码
package com.bw.day09;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import day01.bw.com.myapplicationfour.R;
public class WXActivity extends AppCompatActivity implements SensorEventListener {
private ImageView up_Img;
private ImageView down_Img;
private SensorManager manager;
private Vibrator vibrator;
private TranslateAnimation animationup;
private TranslateAnimation animationdown;
private SoundPool soundPool;
private int soundId;
private Sensor sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wx);
initView();
initSensor();
}
@Override
protected void onResume() {
super.onResume();
manager.registerListener(this,sensor,100);
}
@Override
protected void onPause() {
super.onPause();
manager.unregisterListener(this);
}
private void initSensor() {
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC,100);
soundId = soundPool.load(this, R.raw.wx, 1000);
//初始化动画
animationup = new TranslateAnimation(0,0,0,-200);
animationdown = new TranslateAnimation(0,0,0,200);
animationup.setDuration(500);
animationdown.setDuration(500);
}
private void initView() {
up_Img = findViewById(R.id.up_Img);
down_Img = findViewById(R.id.down_Img);
}
@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(soundId,1.0f,1.0f,100,0,1.0f);
up_Img.startAnimation(animationup);
down_Img.startAnimation(animationdown);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
推荐阅读
-
华为下放P30 Pro拍照技术 荣耀20也要用夜视仪传感器了
-
外媒预测小米10:搭载1亿像素传感器、120Hz屏幕加持
-
OPPO Find X2搭载独家定制大底传感器 沈义人:awesome
-
Android利用传感器仿微信摇一摇功能
-
Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】
-
格科微25亿元建传感器基地:年产12亿CMOS芯片 产值100亿
-
比Fitbit更强大 研究者发明微型植入传感器
-
Gear S3智能手表将配备更多传感器 运动属性加持
-
OPPO Reno5 Pro+首发旗舰传感器IMX766:OPPO索尼联合打造
-
首发旗舰传感器IMX766 OPPO Reno5 Pro+亮点汇总:12月24日发