橘子味的心
标题:9.9 Android位置传感器开发

Android 平台支持的位置传感器主要有三种:
  • TYPE_MAGNETIC_FIELD。
  • TYPE_ORIENTATION。
  • TYPE_PROXIMITY。

下面对这三种传感器做简单介绍。

磁场传感器

磁场传感器用于测量地球磁场的强度。获取磁场传感器实例的代码如下:
  1. private SensorManager mSensorManager;
  2. private Sensor mSensor;
  3. ...
  4. mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
  5. mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
磁场传感器获取的原始数据记录的是在三个方向上地球磁场的强度。通常情况下,这些数据并不会直接使用,而是和旋转向量传感器、加速度传感器的数据一起用于计算设备的位置数据。

方位传感器

方位传感器用于监测设备相对于地球坐标系的位置。方位传感器从 Android 2.2(API Level 8)就被淘汰,在之后的设备上的访问传感器都是软件传感器。

获取方位传感器实例的代码如下:
  1. private SensorManager mSensorManager;
  2. private Sensor mSensor;
  3. ...
  4. mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
  5. mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
以下代码演示了从方位传感器获取数据的过程:
  1. public class SensorActivity extends Activity implements SensorEventListener {
  2. private SensorManager mSensorManager;
  3. private Sensor mOrientation;
  4.  
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9.  
  10. mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
  11. mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
  12. }
  13.  
  14. @Override
  15. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  16. // Do something here if sensor accuracy changes.
  17. // You must implement this callback in your code.
  18. }
  19.  
  20. @Override
  21. protected void onResume() {
  22. super.onResume();
  23. mSensorManager.registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL);
  24. }
  25.  
  26. @Override
  27. protected void onPause() {
  28. super.onPause();
  29. mSensorManager.unregisterListener(this);
  30. }
  31.  
  32. @Override
  33. public void onSensorChanged(SensorEvent event) {
  34. float azimuth_angle = event.values[0];
  35. float pitch_angle = event.values[1];
  36. float roll_angle = event.values[2];
  37. // Do something with these orientation angles.
  38. }
  39. }

距离传感器

距离传感器用于探测 Android 设备与其他物体的距离,例如手机与耳朵的距离。获取距离传感器实例的代码如下:
  1. private SensorManager mSensorManager;
  2. private Sensor mSensor;
  3. ...
  4. mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
  5. mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
下列代码演示了使用距离传感器的方法:
  1. public class SensorActivity extends Activity implements SensorEventListener {
  2. private SensorManager mSensorManager;
  3. private Sensor mProximity;
  4.  
  5. @Override
  6. public final void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. // Get an instance of the sensor service, and use that to get an instance of
  10. // a particular sensor.
  11. mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
  12. mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
  13. }
  14.  
  15. @Override
  16. public final void onAccuracyChanged(Sensor sensor, int accuracy) {
  17. // Do something here if sensor accuracy changes.
  18. }
  19.  
  20. @Override
  21. public final void onSensorChanged(SensorEvent event) {
  22. float distance = event.values[0];
  23. // Do something with this sensor data.
  24. }
  25.  
  26. @Override
  27. protected void onResume() {
  28. // Register a listener for the sensor.
  29. super.onResume();
  30. mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
  31. }
  32.  
  33. @Override
  34. protected void onPause() {
  35. // Be sure to unregister the sensor when the activity pauses.
  36. super.onPause();
  37. mSensorManager.unregisterListener(this);
  38. }
  39. }