接上<Android传感器——获取本机传感器>

https://blog.csdn.net/nishigesb123/article/details/90143498

部分参考:https://developer.android.google.cn/guide/topics/sensors/sensors_overview.html


传感器监听器(Monitoring Sensor Events)

o monitor raw sensor data you need to implement two callback methods that are exposed through the SensorEventListener interface: onAccuracyChanged() and onSensorChanged(). The Android system calls these methods whenever the following occurs:

  • A sensor's accuracy changes.

    In this case the system invokes the onAccuracyChanged() method, providing you with a reference to the Sensor object that changed and the new accuracy of the sensor. Accuracy is represented by one of four status constants: SENSOR_STATUS_ACCURACY_LOWSENSOR_STATUS_ACCURACY_MEDIUM,SENSOR_STATUS_ACCURACY_HIGH, or SENSOR_STATUS_UNRELIABLE.

  • A sensor reports a new value.

    In this case the system invokes the onSensorChanged() method, providing you with a SensorEvent object. A SensorEvent object contains information about the new sensor data, including: the accuracy of the data, the sensor that generated the data, the timestamp at which the data was generated, and the new data that the sensor recorded.

The following code shows how to use the onSensorChanged() method to monitor data from the light sensor. This example displays the raw sensor data in a TextView that is defined in the main.xml file as sensor_data.

若要监视原始传感器数据,需要实现两个回调方法,这些回调方法通过SensorEventListener接口:onAccuracyChanged()onSensorChanged()。每当发生以下情况时,Android系统都会调用这些方法:

  • 传感器的精度会改变。

    在这种情况下,系统调用onAccuracyChanged()方法,为您提供对Sensor对象和传感器的新精度。精度由以下四个状态常量之一表示:SENSOR_STATUS_ACCURACY_LOWSENSOR_STATUS_ACCURACY_MEDIUM,SENSOR_STATUS_ACCURACY_HIGH,或SENSOR_STATUS_UNRELIABLE.

  • 传感器报告一个新值。

    在这种情况下,系统调用onSensorChanged()方法,为您提供SensorEvent对象。一个SensorEvent对象包含有关新传感器数据的信息,包括:数据的准确性、生成数据的传感器、生成数据的时间戳以及传感器记录的新数据。

下面的代码演示如何使用onSensorChanged()方法监视来自光传感器的数据。此示例将原始传感器数据显示在TextView在main.xml文件中定义为sensor_data.

public class SensorActivity extends Activity implements SensorEventListener {private SensorManager sensorManager;private Sensor mLight;@Overridepublic final void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);}@Overridepublic final void onAccuracyChanged(Sensor sensor, int accuracy) {// Do something here if sensor accuracy changes.}@Overridepublic final void onSensorChanged(SensorEvent event) {// The light sensor returns a single value.// Many sensors return 3 values, one for each axis.float lux = event.values[0];// Do something with this sensor value.}@Overrideprotected void onResume() {super.onResume();sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {super.onPause();sensorManager.unregisterListener(this);}
}

In this example, the default data delay (SENSOR_DELAY_NORMAL) is specified when the registerListener()method is invoked. The data delay (or sampling rate) controls the interval at which sensor events are sent to your application via the onSensorChanged() callback method. The default data delay is suitable for monitoring typical screen orientation changes and uses a delay of 200,000 microseconds. You can specify other data delays, such as SENSOR_DELAY_GAME (20,000 microsecond delay), SENSOR_DELAY_UI (60,000 microsecond delay), or SENSOR_DELAY_FASTEST (0 microsecond delay). As of Android 3.0 (API Level 11) you can also specify the delay as an absolute value (in microseconds).

The delay that you specify is only a suggested delay. The Android system and other applications can alter this delay. As a best practice, you should specify the largest delay that you can because the system typically uses a smaller delay than the one you specify (that is, you should choose the slowest sampling rate that still meets the needs of your application). Using a larger delay imposes a lower load on the processor and therefore uses less power.

There is no public method for determining the rate at which the sensor framework is sending sensor events to your application; however, you can use the timestamps that are associated with each sensor event to calculate the sampling rate over several events. You should not have to change the sampling rate (delay) once you set it. If for some reason you do need to change the delay, you will have to unregister and reregister the sensor listener.

It's also important to note that this example uses the onResume() and onPause() callback methods to register and unregister the sensor event listener. As a best practice you should always disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours because some sensors have substantial power requirements and can use up battery power quickly. The system will not disable sensors automatically when the screen turns off

补充说明

注册传感器监听器的所需要的三个参数(部分)

  • 监听回调接口
  • 传感器
  • 传感器数据的速度值

对?传感器数据的速度值这个参数常见又有如下几种可供选择

  • SENSOR_ DELAY _GAME:(20000微秒)如果利用传感器开发游戏, 建议使用该值。 一般大多数实时行较高的游戏使用该级别。
  • SENSOR_ DELAY NORMAL: (200000微秒)默认的获取传感器数据的速度,标准延迟,对于一般的益智类游戏或者EASY界别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧的现象。
  • SENSOR DELAY_ UI:(60000微秒) 若使用传感器更新UI,建议使用该值。
  • SENSOR DELAY _FASTEST:(0微秒延迟) 最低延迟,一般不是特别灵敏的处理不推荐使用,该模式可能造成手机电量大量消耗,而且由于传递的为大量的原始数据,算法处理不好将会影响游戏逻辑和U的性能。
        //注册传感器的监听器sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {//传感器数据变化,在该方中我们可以获取传感器变化的值}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {//传感器精度变化}},type_accelerometer,SensorManager.SENSOR_DELAY_NORMAL);}

另外,回调接口中传感器经度的变化可供参考如下:

传感器精度的变化精度通过四个状态常量代表

  • SENSOR_STATUS_ACCURAY_LoW:低
  • SENSOR STATUS ACCURACY MEDIUM:中
  • SENSOR_STATUS ACCURACYHIGH:高
  • SENSOR STATUS UNRELIABLE:不可靠

传感器坐标系

通常,传感器框架使用一个标准的3维坐标系来表达数据值。对于大多数传感器, 当设备放置默认的方向(看下图) 的时候,坐标系被定义和设备的屏幕相关。当设备放置为它默认的方向,X轴是水平并指向右边,Y轴是竖直并指向上方,并且Z轴指向屏幕面的外侧。在这个系统,坐标系统有负的2值。

这个坐标系被用于下面的传感器:

  • 加速度传感器 (Acceleration sensor)
  • 重力传感器(Gravity sensor)
  • 陀螺仪传感器 (Gyroscope)
  • 线性加速度传感器 (Linear acceleration sensor)
  • 磁场传 感器(Geomagnetic field sensor)

许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。

监听小案例

准备一个TextView用于显示数据

package com.example.sensor;import android.content.Context;
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.util.Log;
import android.widget.TextView;import java.util.List;public class MainActivity extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.content);//获取系统传感器管理器SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);//通过系统传感器管理器..获取本机所有传感器.List<Sensor> sensorList = sm.getSensorList(Sensor.TYPE_ALL);for(Sensor s :sensorList){Log.i("sensorList",s.toString());}//获取指定的某一个传感器,下面为加速度传感器Sensor type_accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);if(type_accelerometer!=null){Log.i("type_accelerometer",type_accelerometer.toString());}//注册传感器的监听器sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {//传感器数据变化,在该方中我们可以获取传感器变化的值float x=event.values[0];float y=event.values[1];float z=event.values[2];textView.setText("x="+x+"y="+y+"z="+z);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {//传感器精度变化}},type_accelerometer,SensorManager.SENSOR_DELAY_NORMAL);}
}

效果如下: 模拟器上可能看不出啥效果,真机上速度会实时变化(根据加速度)

摇一摇案例

使用加速度传感器~

直接在?的案例基础上修改

再准备一个TextView提示开始(其实可有可无)

package com.example.sensor;import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;import java.util.List;public class MainActivity extends AppCompatActivity {private TextView textView;private TextView textView_start;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.content);textView_start = findViewById(R.id.textView_start);//获取系统传感器管理器SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);//通过系统传感器管理器..获取本机所有传感器.List<Sensor> sensorList = sm.getSensorList(Sensor.TYPE_ALL);for (Sensor s : sensorList) {Log.i("sensorList", s.toString());}//获取指定的某一个传感器,下面为加速度传感器Sensor type_accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);if (type_accelerometer != null) {Log.i("type_accelerometer", type_accelerometer.toString());}//注册传感器的监听器sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {//传感器数据变化,在该方中我们可以获取传感器变化的值float x = event.values[0];float y = event.values[1];float z = event.values[2];textView.setText("x=" + x + "y=" + y + "z=" + z);//  System.out.println("x="+x+",y="+y+",z="+z);if ((Math.abs(x) + Math.abs(y) + Math.abs(z)) >= ringValue && flag == false) {flag = true;textView_start.setVisibility(View.VISIBLE);MediaPlayer mp = MediaPlayer.create(MainActivity.this, R.raw.test);mp.start();mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {mp.release();flag = false;textView_start.setVisibility(View.GONE);}});}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {//传感器精度变化}}, type_accelerometer, SensorManager.SENSOR_DELAY_NORMAL);}int ringValue = 40;//三维XYZ三个值的总和达到这个值表示为摇晃boolean flag = false;//表示是否已经在播放声音
}

效果如下:

Android传感器——传感器监听器及摇一摇案例相关推荐

  1. 玩转Android之加速度传感器的使用,模仿微信摇一摇

    Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇 ...

  2. 【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言~~~ 一.传感器的种类 传感器Sensor是一系列感应器的总称,是Android设备用来感知周围环境和运动信息的工具. 因为具体的感应信息依赖于相关硬件,所以虽然A ...

  3. Android移动开发-利用加速度传感器开发仿微信摇一摇功能的实现

    加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子.玩游戏等. 下面以摇 ...

  4. Android 使用加速度传感器实现摇一摇功能及优化

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得 ...

  5. android传感器实现摇一摇功能

    现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的"摇一摇"功能.前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容. 传感器有几种类型: 方向传感器: Sen ...

  6. android传感器摇一摇功能

    现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的"摇一摇"功能.前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容. 传感器有几种类型:        方向传 ...

  7. android开发利用传感器实现微信的摇一摇功能

    现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的"摇一摇"功能.前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容. 传感器有几种类型:        方向传 ...

  8. Android 传感器之《加速传感器》——摇一摇功能

    Android传感器开发参考网站: Android Developers镜像网站:http://wear.techbrood.com/guide/topics/sensors/sensors_over ...

  9. Android传感器的使用(1)——摇一摇切换图片

    在android应用程序中,很多时候需要与用户的动作行为进行互动,或者指定用户做某些行为从而完成某些动作,其中的一些行为就是触发了安卓当中的传感器,然后通过安卓封装的传感器动作,能够获取到用户的行为, ...

最新文章

  1. java uiautomation_Java UiAutomation類代碼示例
  2. Springboot项目中的favicon
  3. android源码framework下添加新资源的方法
  4. Android用户界面布局(layouts)
  5. liunx服务器数据库文件大小,linux如何查看数据库服务器大小
  6. 零基础入门Matlab(一篇两个小时就能学完的入门博客)
  7. 大卫科波菲尔优秀读后感范文4000字
  8. coreldraw橙子怎么画_cdr怎么画一杯橙汁?CorelDRAW简单绘制的一杯满满的橙汁教程...
  9. js实现数组按拼音排序
  10. node.js 使用数据校验 joi 报错:Cannot mix different versions of joi schemas
  11. mysql 正则表达式_MySQL的正则表达式
  12. GSCoolink GSV6201 TypeC/DP to HDMI2.1
  13. 微信公众号自定义分享实现(开发者)
  14. 数据封包解包协议之TCP封包解包
  15. Android性能测试 之 APPFPS的方法
  16. 毕业设计 - 题目_ 基于单片机的智能小车 - 嵌入式 物联网 本科毕设
  17. 1069 微博转发抽奖 (20分)
  18. Google API大全
  19. asp毕业设计——基于asp+sqlserver的个人日志系统设计与实现(毕业论文+程序源码)——个人日志系统
  20. aardio 谷歌浏览器自动化 (三) 等待

热门文章

  1. Linux查看实时网速的Shell
  2. 大学英语综合教程二 Unit 3 课文内容英译中 中英翻译
  3. 计算Fisher信息之Part(二)
  4. IntelliJ IDEA删除项目
  5. 包含C/C++开发文档的Docset文档库
  6. Ubuntu常见命令
  7. 十九、RTC实时时钟
  8. 力扣解法汇总969- 煎饼排序
  9. 经营性ICP与非经营性ICP有什么区别?
  10. 当人们在说大数据的时候到底在说什么?