目录
3)实现SensorEventListener接口,重写onSensorChanged和onAccuracyChanged方法
4)SensorManager对象调用registerListener注册监听器
传感器的应用如微信的摇一摇功能、NFC、手机自带的指南针等等。下面将学习Android传感器的使用。
传感器的定义
一种物理设备或者生物器官,能够探测、感受外界的信号,物理条件(如光,热, 湿度)或化学组成(如烟雾),并将探知的信息传递给其他的设备或者器官。
三大类型传感器
1、运动传感器
–运动传感器测量加速力和旋转力,它们包括加速度计,重力传感器,陀螺仪和旋转矢量传感器。
2、环境传感器
–环境传感器测量各种周围环境情况,如环境温度、气压、光强、湿度等。包括气压计,光度计和温度计。
3、位置传感器
–位置传感器测量设备的物理位置信息,包括方向传感器和磁力计。
传感器开发框架
1、SensorManager
–可以使用此类创建传感器服务的实例。这个类提供了多种方法来访问和列出传感器,注册和注销传感器事件监听器,并获取方向信息。该类还提供了几个传感器常量,用于报告传感器的精度,设置数据采集速率和校准传感器。
2、Sensor
–可以使用此类创建特定传感器的实例。这个类提供了各种方法,让你确定一个传感器的能力。
3、SensorEvent
–系统使用此类创建传感器事件对象,该对象提供有关传感器事件的信息。传感器事件对象包括以下信息:原始传感器数据,生成事件的传感器类型,数据的准确性以及事件的时间戳。
4、SensorEventListener
–可以使用此界面创建两种回传方法,当传感器值更改或传感器准确度发生变化时,会接收通知(传感器事件)。
一、使用传感器开发步骤
1、获取传感器信息
传感器的开发首先需要获取传感器的一些信息,获取信息需要以下步骤:
1)、获取传感器管理器
Android提供了一个sensorManager管理器,通过这个类可以获取到都有哪些传感器,获取sensorManager对象代码如下:
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
2)、获取设备的传感器对象列表
通过sensorManager管理器的getSensorList()方法,可以获取传感器对象列表,具体代码如下:
List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
3)、迭代获取Sensor对象,调用对应方法获取相关信息
for(Sensor s:allSensors){
sensor.getName(); //获得传感器名称
sensor.getType(); //获得传感器种类
sensor.getVendor(); //获得传感器供应商
sensor.getVersion(); //获得传感器版本
sensor.getResolution(); //获得精度值
sensor.getMaximumRange(); //获得最大范围
sensor.getPower(); //传感器使用时的耗电量
}
2、获取传感器传回数据
1)获得传感器管理器
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
2)调用特定方法获得需要的传感器
调用SensorManager 对象的getDefaultSensor方法,获取指定类型的传感器,例如这里使用光线传感器,具体代码:
Sensor mSensorOrientation = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
3)实现SensorEventListener接口,重写onSensorChanged和onAccuracyChanged方法
①:onSensorChanged(SensorEvent event);该方法在传感器的值发生改变的时候调用,其参数是一个SensorEvent 对象,通过该对象的values属性可以获取传感器的值,该值是一个数组,该变量最多有三个元素,而且传感器不同,对应元素代表的含义也不同
②:onAccuracyChanged(Sensor sensor , int accuracy);当传感器的进度发生改变时会回调,
参数说明:
sensor:传感器对象
accuracy:表示传感器新的精度
@Override
public void onSensorChanged(SensorEvent event) {
final float[] _Data = event.values;
this.mService.onSensorChanged(_Data[0],_Data[1],_Data[2]);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
4)SensorManager对象调用registerListener注册监听器
为传感器注册监听事件,通过调用sensorManager对象的registerListener()方法来注册监听事件。
第一个参数是上下文对象,第二个是传感器对象,第三个是传感器的延时时间的精密程 度,越精密越耗电。
- SENSOR_DELAY_FASTEST——延时:0ms
- SENSOR_DELAY_GAME——延时:20ms
- SENSOR_DELAY_UI——延时:60ms
- SENSOR_DELAY_NORMAL——延时:200ms
具体代码如下:
sm.registerListener(mContext, mSensorOrientation, android.hardware.SensorManager.SENSOR_DELAY_UI);
5)监听器的取消注册
sm. unregisterListener(this);
二、获取传感器信息的实例
先将前面第一个步骤:获取传感器信息,实例演示一下如何使用。
新建项目SensorDemo1。
修改activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt_show"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
修改MainActivity代码如下:
public class MainActivity extends AppCompatActivity {
private TextView txt_show;
private SensorManager sm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
txt_show = (TextView) findViewById(R.id.txt_show);
List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
StringBuilder sb = new StringBuilder();
sb.append("此手机有" + allSensors.size() + "个传感器,分别有:\n\n");
for(Sensor s:allSensors){
switch (s.getType()){
case Sensor.TYPE_ACCELEROMETER:
sb.append(s.getType() + " 加速度传感器(Accelerometer sensor)" + "\n");
break;
case Sensor.TYPE_GYROSCOPE:
sb.append(s.getType() + " 陀螺仪传感器(Gyroscope sensor)" + "\n");
break;
case Sensor.TYPE_LIGHT:
sb.append(s.getType() + " 光线传感器(Light sensor)" + "\n");
break;
case Sensor.TYPE_MAGNETIC_FIELD:
sb.append(s.getType() + " 磁场传感器(Magnetic field sensor)" + "\n");
break;
case Sensor.TYPE_ORIENTATION:
sb.append(s.getType() + " 方向传感器(Orientation sensor)" + "\n");
break;
case Sensor.TYPE_PRESSURE:
sb.append(s.getType() + " 气压传感器(Pressure sensor)" + "\n");
break;
case Sensor.TYPE_PROXIMITY:
sb.append(s.getType() + " 距离传感器(Proximity sensor)" + "\n");
break;
case Sensor.TYPE_TEMPERATURE:
sb.append(s.getType() + " 温度传感器(Temperature sensor)" + "\n");
break;
default:
sb.append(s.getType() + " 其他传感器" + "\n");
break;
}
sb.append("设备名称:" + s.getName() + "\n 设备版本:" + s.getVersion() + "\n 供应商:"
+ s.getVendor() + "\n\n");
}
txt_show.setText(sb.toString());
}
}
效果如下:
三、获取传感器传回数据的实例
实现前面第二个步骤:获取传感器传回数据,实例演示一下如何使用。下面实现采集方向传感器数据。
原理
新建项目SensorDemo2。
修改activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:id="@+id/tv_value1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="方位角"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_value2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="倾斜角"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_value3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="滚动角"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
修改MainActivity代码如下:
SENSOR_DELAY_FASTEST最灵敏
SENSOR_DELAY_GAME 游戏的时候,不过一般用这个就够了
SENSOR_DELAY_NORMAL 比较慢。
SENSOR_DELAY_UI 最慢的
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private TextView tv_value1;
private TextView tv_value2;
private TextView tv_value3;
private SensorManager sManager;
private Sensor mSensorOrientation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorOrientation = sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sManager.registerListener(this, mSensorOrientation, SensorManager.SENSOR_DELAY_UI);
bindViews();
}
private void bindViews() {
tv_value1 = (TextView) findViewById(R.id.tv_value1);
tv_value2 = (TextView) findViewById(R.id.tv_value2);
tv_value3 = (TextView) findViewById(R.id.tv_value3);
}
@Override
public void onSensorChanged(SensorEvent event) {
tv_value1.setText("方位角(沿Z轴):" + (float) (Math.round(event.values[0] * 100)) / 100);
tv_value2.setText("倾斜角(沿X轴):" + (float) (Math.round(event.values[1] * 100)) / 100);
tv_value3.setText("滚动角(沿Y轴):" + (float) (Math.round(event.values[2] * 100)) / 100);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onDestroy() {
super.onDestroy();
sManager.unregisterListener(this);
}
}
效果如下:
下篇文章将通过靠近屏幕黑屏和计步器两个案例实践一下传感器的应用。