Android app如何使用 有效运动传感器
时间:2022-08-05 02:00:00
背景
今天有对设备的运动 跌落的检测
以下是对系统传感器接口的简要了解 有以下接口 推荐给大家
Android 该平台提供多种传感器,可以让您监控设备的运动。
传感器的可能结构因传感器类型而异:
- 重力、线性加速度、旋转矢量、有效运动、计步器和步测器传感器可以基于硬件或软件。 - 加速度计传感器和陀螺仪传感器始终以硬件为基础。
大多数 Android 设备配有加速度计,现在很多设备都配有陀螺仪。基于软件的传感器更具可变性,
因为它通常依靠一个或多个硬件传感器来获取数据。这些基于软件的传感器可以从加速度计、磁力计或陀螺仪中获取数据。
运动传感器对监控设备运动(如倾斜、摇晃、旋转或摆动)非常有用。该移动通常是用户直接输入的反映(例如,用户在游戏中驾驶汽车或控制球),
但也可能反映设备的物理环境(比如开车时和你一起移动)。
在第一种情况下,您正在监控相对于设备参考系或应用参考系的运动;
在第二种情况下,您正在监控与世界参考系相比的运动。运动传感器本身通常不用于监控设备的位置,但可以与其他传感器(如地磁场传感器)一起使用,以确定设备相对于世界参考系统的位置
#使用有效运动传感器
让我们谈谈有效的运动传感器
每次检测到有效运动时,有效运动传感器都会触发事件,然后禁用。
有效运动是一种可能导致用户位置变化的运动,如步行、骑自行车或坐在车上。
以下代码显示了如何获得默认有效运动传感器的例子,以及如何注册事件侦听器:
private SensorManager sensorManager; private Sensor sensor; private TriggerEventListener triggerEventListener; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION); triggerEventListener = new TriggerEventListener() {
@Override public void onTrigger(TriggerEvent event) {
// Do work } }; sensorManager.requestTriggerSensor(triggerEventListener, mSensor);
TYPE_SIGNIFICANT_MOTION 没有数据 只是触发功能
TriggerEventListener
added in API 18
Here’s an example setup for a TriggerEventListener:
class TriggerListener extends TriggerEventListener {
public void onTrigger(TriggerEvent event) {
// Do Work. // As it is a one shot sensor, it will be canceled automatically. // SensorManager.requestTriggerSensor(this, mSigMotion); needs to // be called agai, if needed.
}
}
public class SensorActivity extends Activity {
private final SensorManager mSensorManager;
private final Sensor mSigMotion;
private final TriggerEventListener mListener = new TriggerEventListener();
public SensorActivity() {
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mSigMotion = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
}
protected void onResume() {
super.onResume();
mSensorManager.requestTriggerSensor(mListener, mSigMotion);
}
protected void onPause() {
super.onPause();
// Call disable to ensure that the trigger request has been canceled.
mSensorManager.cancelTriggerSensor(mListener, mSigMotion);
}
}
使用计步器传感器
注意:您必须声明 ACTIVITY_RECOGNITION 权限,以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。
计步器传感器提供自已激活传感器后最后一次重启以来用户迈出的步数。与步测器传感器相比,计步器的延迟时间更长(最多 10 秒),但精确度更高。
private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
使用步测器传感器
每次用户迈步时,步测器传感器都会触发事件。延迟时间预计将低于 2 秒。
注意:您必须声明 ACTIVITY_RECOGNITION 权限,以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。
private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
有效运动传感器 Demo
//对有效运动的封装
public class SignificantMotionSensorService extends android.app.Service {
public static final String SIGNIFICANT_MOTION_SENSOR_SERVICE_INTENT = "significant motion sensor service intent";
public static final String SIGNIFICANT_MOTION_SENSOR_SERVICE_INTENT_EXTRA_IS_MOVING = "moving";
private SensorManager sensorManager;
private Sensor sensor;
private SignificantMotionSensor significantMotionSensor;
@Override
public void onCreate() {
super.onCreate();
significantMotionSensor = new SignificantMotionSensor();
sensorManager.requestTriggerSensor(significantMotionSensor, sensor);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
private class SignificantMotionSensor extends TriggerEventListener {
public SignificantMotionSensor() {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
}
@Override
public void onTrigger(TriggerEvent event) {
//通过广播将时间发送出去
Intent i = new Intent(SIGNIFICANT_MOTION_SENSOR_SERVICE_INTENT);
i.putExtra(SIGNIFICANT_MOTION_SENSOR_SERVICE_INTENT_EXTRA_IS_MOVING, "true");
sendBroadcast(i);
sensorManager.requestTriggerSensor(significantMotionSensor, sensor);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}