ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android app如何使用有效运动传感器

2021-09-17 15:05:46  阅读:231  来源: 互联网

标签:app SensorManager private sensorManager 传感器 Android sensor public


背景

今天有对设备的运动 跌落的检测
这里简单的了解了系统的传感器接口 有如下几个接口 对大家进行推荐

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

标签:app,SensorManager,private,sensorManager,传感器,Android,sensor,public
来源: https://www.cnblogs.com/wnw-nicholas/p/15304639.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有