乐趣区

关于传感器:Android-app如何使用有效运动传感器

背景

明天有对设施的静止 跌落的检测
这里简略的理解了零碎的传感器接口 有如下几个接口 对大家进行举荐

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 again, 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;}
}

退出移动版