[关闭]
@coder-pig 2015-11-13T09:41:50.000000Z 字数 4770 阅读 1928

Android基础入门教程——10.10 传感器专题(1)——相关介绍

Android基础入门教程


1.传感器相关介绍:

  说到传感器,相信大家都不会陌生吧,比如微信的摇一摇就用到了加速度传感器;
传感器的定义:一种物理设备或者生物器官,能够探测、感受外界的信号,物理条件(如光,热,
适度)或化学组成(如烟雾),并将探知的信息传递给其他的设备或者器官!
传感器的种类:可以从不同的角度对传感器进行划分,转换原理(传感器工作的基本物理或化学
效应);用途;输出信号以及制作材料和工艺等。一般是按工作原来来分:物理传感器与化学传感器
两类!手机上搭载的基本都是物理传感器,手机上搭载的传感器有下面这些:

  • 方向传感器(Orientation sensor)
  • 加速感应器(Accelerometer sensor)
  • 陀螺仪传感器(Gyroscope sensor)
  • 磁场传感器(Magnetic field sensor)
  • 距离传感器(Proximity sensor)
  • 光线传感器(Light sensor)
  • 气压传感器(Pressure sensor)
  • 温度传感器(Temperature sensor)
  • 重力感应器(Gravity sensor,Android 2.3引入)
  • 线性加速感应器(Linear acceleration sensor ,Android 2.3引入)
  • 旋转矢量传感器(Rotation vector sensor,Android 2.3)
  • 相对湿度传感器(Relative humidity sensor,Android 4.0)
  • 近场通信(NFC)传感器(Android 2.3引入),NFC和其他不一样,具有读写功能。

当然除了这些以外还有其他比如心率传感器,记步传感器,指纹传感器等,
关于Android设备所支持的传感器类型可见官方文档:Sensor Summary部分的内容~


2.如何查看自己手机所支持的传感器有哪些?

上面说的这么多种肯定不是所有手机都具备的,每台手机上搭载的传感器类型
以及数目都可能是不一样的,比如我手头上的Nexus 5支持的传感器类型有:
重力,光线,距离,气压和陀螺仪!而令意外moto x 二代则有重力,光线,
距离和红外传感器!关于自己手机支持的传感器类型,你可以到相关的评测
网站比如:中关村手机在线,太平洋等,搜索到自己的机型查看相关参数!
当然,我们也可以自己写代码来看看自己手机支持的传感器类型~

代码示例

运行效果图

代码实现

activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4. <ScrollView
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <TextView
  8. android:id="@+id/txt_show"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent" />
  11. </ScrollView>
  12. </RelativeLayout>

MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2. private TextView txt_show;
  3. private SensorManager sm;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
  9. txt_show = (TextView) findViewById(R.id.txt_show);
  10. List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
  11. StringBuilder sb = new StringBuilder();
  12. sb.append("此手机有" + allSensors.size() + "个传感器,分别有:\n\n");
  13. for(Sensor s:allSensors){
  14. switch (s.getType()){
  15. case Sensor.TYPE_ACCELEROMETER:
  16. sb.append(s.getType() + " 加速度传感器(Accelerometer sensor)" + "\n");
  17. break;
  18. case Sensor.TYPE_GYROSCOPE:
  19. sb.append(s.getType() + " 陀螺仪传感器(Gyroscope sensor)" + "\n");
  20. break;
  21. case Sensor.TYPE_LIGHT:
  22. sb.append(s.getType() + " 光线传感器(Light sensor)" + "\n");
  23. break;
  24. case Sensor.TYPE_MAGNETIC_FIELD:
  25. sb.append(s.getType() + " 磁场传感器(Magnetic field sensor)" + "\n");
  26. break;
  27. case Sensor.TYPE_ORIENTATION:
  28. sb.append(s.getType() + " 方向传感器(Orientation sensor)" + "\n");
  29. break;
  30. case Sensor.TYPE_PRESSURE:
  31. sb.append(s.getType() + " 气压传感器(Pressure sensor)" + "\n");
  32. break;
  33. case Sensor.TYPE_PROXIMITY:
  34. sb.append(s.getType() + " 距离传感器(Proximity sensor)" + "\n");
  35. break;
  36. case Sensor.TYPE_TEMPERATURE:
  37. sb.append(s.getType() + " 温度传感器(Temperature sensor)" + "\n");
  38. break;
  39. default:
  40. sb.append(s.getType() + " 其他传感器" + "\n");
  41. break;
  42. }
  43. sb.append("设备名称:" + s.getName() + "\n 设备版本:" + s.getVersion() + "\n 供应商:"
  44. + s.getVendor() + "\n\n");
  45. }
  46. txt_show.setText(sb.toString());
  47. }
  48. }

3.Sensor传感器相关的方法以及使用套路

从2中的例子我们可以大概地总结下获取Sensor传感器以及获取传感器相关的一些信息
流程如下:

1)Sensor传感器的相关方法


Step 1:获得传感器管理器

  1. SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
  1. List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
  1. for(Sensor s:allSensors){
  2. sensor.getName(); //获得传感器名称
  3. sensor.getType(); //获得传感器种类
  4. sensor.getVendor(); //获得传感器供应商
  5. sensor.getVersion(); //获得传感器版本
  6. sensor.getResolution(); //获得精度值
  7. sensor.getMaximumRange(); //获得最大范围
  8. sensor.getPower(); //传感器使用时的耗电量
  9. }

2)传感器的使用套路

一般我们是很少说直接去获取Sensor,然后获取上面这些信息的!因为这没什么
大的作用,我们更多的时候是去获取传感器采集到的数据,比如获取当前的大气压,
或者方向传感器三个角的值,或者陀螺仪的值这样~而大部分的传感器数据采集都是
下面的一个套路:

~Step 1:获得传感器管理器:

  1. SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);

~Step 2:调用特定方法获得需要的传感器:

比如这里获取的是方向传感器,想获得什么传感器自己查API~:

  1. Sensor mSensorOrientation = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);

~Step 3:实现SensorEventListener接口,重写onSensorChanged和onAccuracyChanged的方法!

onSensorChanged:当传感器的值变化时会回调
onAccuracyChanged:当传感器的进度发生改变时会回调

  1. @Override
  2. public void onSensorChanged(SensorEvent event) {
  3. final float[] _Data = event.values;
  4. this.mService.onSensorChanged(_Data[0],_Data[1],_Data[2]);
  5. }
  6. @Override
  7. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  8. }

我们一般获取传感器数据的来源就是这个SensorEvent,这个类中有一个values的变量
类型是Float[],该变量最多有只有三个元素,而且传感器不同,对应元素代表的含义也不同,
比如方向传感器中第一个元素是方位角的值,而气压传感器中第一个值则是气压值!

~Step 4:SensorManager对象调用registerListener注册监听器:

  1. ms.registerListener(mContext, mSensorOrientation, android.hardware.SensorManager.SENSOR_DELAY_UI);

方法也很简单,对应的参数:上下文对象Sensor传感器对象
以及传感器的延时时间的精度密度,有四个可选值:
SENSOR_DELAY_FASTEST——延时:0ms
SENSOR_DELAY_GAME——延时:20ms
SENSOR_DELAY_UI——延时:60ms
SENSOR_DELAY_NORMAL——延时:200ms
当然低延时意味着更频繁的检车,更意味着更多的电量消耗,如果不是要求精度非常高的建议
别使用太高精度的,一般用第三个较多~自己衡量衡量吧~

~Step 5:监听器的取消注册:

用完就放,一个很好的习惯,一般我们可以把他写到Activity或者Service的销毁方法中:

  1. public void destroy(){
  2. ms.unregisterListener(mContext, mSensorOrientation);
  3. }

好的,套路非常简单~


4.本节示例代码下载:

SensorDemo1.zip


本节小结:

好的,本节给大家讲解了下Android中的传感器的介绍以及如何了解自己手机所支持的传感器,
除了网上查,也可以自己写代码测,然后还讲解了Sensor传感器相关信息获取的方法流程,最后
还讲解了采集传感器数据的套路,后面我们会针对一些常用的传感器的用法进行剖析,敬请期待~

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注