经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android传感器数据获取的方法
来源:jb51  时间:2021/10/19 15:32:01  对本文有异议

本文实例为大家分享了Android传感器数据获取的具体代码,供大家参考,具体内容如下

接着上篇wifi列表获取,我们这篇接着说传感器。还是看代码

我们先自己定义一个传感器的工具类(因为我这边只是获取了部分的传感器,需要获取额外的传感器自己配置一下就行了,工具类通过重载提供了不同的构造方法):

  1. public class SensorUtils implements SensorEventListener {
  2. private SensorManager manager;
  3. /**
  4. * @param context 多个传感器
  5. * @param sensorList
  6. */
  7. public void RegisterSensor(Context context, List<Sensor> sensorList){
  8. manager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
  9. for(Sensor sensors : sensorList){
  10. manager.registerListener(this,sensors,SensorManager.SENSOR_DELAY_NORMAL);
  11. }
  12. }
  13. /**
  14. * @param context 单个传感器
  15. * @param sensor
  16. */
  17. public void RegisterSensor(Context context, Sensor sensor){
  18. manager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
  19. manager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL);
  20. }
  21. @Override
  22. public void onSensorChanged(SensorEvent event) {
  23. switch (event.sensor.getType()){
  24. case Sensor.TYPE_ACCELEROMETER:
  25. //给加速度传感器设置回调监听
  26. sensorCallBack.acceleratedCallBack(event);
  27. break;
  28. case Sensor.TYPE_GYROSCOPE:
  29. //给陀螺仪传感器设置回调监听
  30. sensorCallBack.gyroscopeCallBack(event);
  31. break;
  32. case Sensor.TYPE_MAGNETIC_FIELD:
  33. //给磁场传感器设置回调监听
  34. sensorCallBack.magneticFieldCallBack(event);
  35. break;
  36. case Sensor.TYPE_PRESSURE:
  37. //给气压计传感器设置回调监听
  38. sensorCallBack.pressureCallBack(event);
  39. break;
  40. }
  41. }
  42. @Override
  43. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  44. }
  45. //使用完之后记得取消注册
  46. public void UnRegisterSensor(){
  47. if (manager != null){
  48. manager.unregisterListener(this);
  49. }
  50. }
  51. public interface SensorCallBack{
  52. void acceleratedCallBack(SensorEvent event);
  53. void gyroscopeCallBack(SensorEvent event);
  54. void magneticFieldCallBack(SensorEvent event);
  55. void pressureCallBack(SensorEvent event);
  56. }
  57. private SensorCallBack sensorCallBack;
  58. public SensorUtils(SensorCallBack sensorCallBack){
  59. this.sensorCallBack = sensorCallBack;
  60. }
  61. }

然后我们在activity中去使用工具类:

  1. //初始化
  2. sensorUtils = new SensorUtils(this);
  3. sensorUtils.RegisterSensor(this, sensorList);

activity中别忘了实现SensorUtil中的回调监听

  1. public class SensorActivity extends BaseActivity<BaseViewModel, ActivitySensorBinding> implements SensorUtils.SensorCallBack{
  2. //do something
  3. }

然后在自己设置的回调监听中去实现自己想要的功能

  1. @Override
  2. public void acceleratedCallBack(SensorEvent event) {
  3. //可以做自己想要的操作
  4. if (event != null) {
  5. float[] values = event.values;
  6. float x1 = values[0];
  7. float y1 = values[1];
  8. float z1 = values[2];
  9. StringBuffer stringBuffer = new StringBuffer();
  10. stringBuffer.append(getString(R.string.accelerometer_number)).append("\n");
  11. stringBuffer.append(getString(R.string.x1)).append(x1).append("\n");
  12. stringBuffer.append(getString(R.string.y1)).append(y1).append("\n");
  13. stringBuffer.append(getString(R.string.z1)).append(z1);
  14. if (!viewDateBinding.scrollView.isMove()) {
  15. handler.post(() -> viewDateBinding.tvAccelerated.setText(stringBuffer.toString()));
  16. }
  17. if (flagAccelerated) {
  18. DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,stringBuffer.toString(),null,null,null));
  19. }
  20. flagAccelerated = false;
  21. }
  22. }
  23. @Override
  24. public void gyroscopeCallBack(SensorEvent event) {
  25. //可以做自己想要的操作
  26. if (event != null) {
  27. float x2 = event.values[0];
  28. float y2 = event.values[1];
  29. float z2 = event.values[2];
  30. StringBuffer stringBuffer = new StringBuffer();
  31. stringBuffer.append(getString(R.string.gyroscope_number)).append("\n");
  32. stringBuffer.append(getString(R.string.x2)).append(x2).append("\n");
  33. stringBuffer.append(getString(R.string.y2)).append(y2).append("\n");
  34. stringBuffer.append(getString(R.string.z2)).append(z2);
  35. if (!viewDateBinding.scrollView.isMove()) {
  36. handler.post(() -> viewDateBinding.tvGyroscope.setText(stringBuffer.toString()));
  37. }
  38. if (flagGyroscope) {
  39. DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,null,stringBuffer.toString(),null,null));
  40. }
  41. flagGyroscope = false;
  42. }
  43. }
  44. @SuppressLint("DefaultLocale")
  45. @Override
  46. public void magneticFieldCallBack(SensorEvent event) {
  47. //可以做自己想要的操作
  48. if (event != null) {
  49. float x3 = event.values[0];
  50. float y3 = event.values[1];
  51. float z3 = event.values[2];
  52. StringBuffer stringBuffer = new StringBuffer();
  53. stringBuffer.append(getString(R.string.magnetic_field_number)).append("\n");
  54. stringBuffer.append(getString(R.string.x3)).append(String.format("%.2f", x3)).append("\n");
  55. stringBuffer.append(getString(R.string.y3)).append(String.format("%.2f", y3)).append("\n");
  56. stringBuffer.append(getString(R.string.z3)).append(String.format("%.2f", z3));
  57. if (!viewDateBinding.scrollView.isMove()) {
  58. handler.post(() -> viewDateBinding.tvMagneticField.setText(stringBuffer.toString()));
  59. }
  60. if (flagMagneticField) {
  61. DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,null,null,stringBuffer.toString(),null));
  62. }
  63. flagMagneticField = false;
  64. }
  65. }
  66. @Override
  67. public void pressureCallBack(SensorEvent event) {
  68. //可以做自己想要的操作
  69. if (event != null) {
  70. float x4 = event.values[0];
  71. String str4 = getString(R.string.pressure_number) + x4;
  72. if (!viewDateBinding.scrollView.isMove()) {
  73. handler.post(() -> viewDateBinding.tvPressure.setText(str4));
  74. }
  75. if (flagPressure) {
  76. DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,null,null,null,str4));
  77. }
  78. flagPressure = false;
  79. }
  80. }

我这边是将数据通过按钮的点击事件存储进了数据库,注意传感器的回调是实时的,所以如果想要获取某一时刻,需要自己通过boolean去判断是否需要获取回调数据

最后,记得取消监听,因为我是在activity中去注册的,所以取消注册也是在activity中去做:

  1. protected void onStop() {
  2. super.onStop();
  3. sensorUtils.UnRegisterSensor();
  4. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号