Android平台提供两个让你确定设备位置的传感器:磁场传感器和方位传感器。Android平台也提供了一个让你确定一个对象面对设备多远的传感器(称为距离传感器)。磁场传感器和距离传感器是基于硬件的。大部分手机和平台厂商包含磁场传感器。同样的,手机厂商通常包含一个距离传感器确定什么时候手机靠近用户的脸(例如,当打电话的时候)。方位传感器是基于软件的,并且从加速度和磁场传感器产生数据。
注意:方位传感器在Android2.2中已经被启用(API Level8)。
位置传感器对于确定设备在真实世界参考系中的物理位置是非常有用的。例如,你能使用磁场传感器结合加速度传感器来确定设备相对于磁北极的位置。你也能使用方位传感器(或者类似于传感器定位方法)类确定设备在你的应用程序的参考系中的位置。位置传感器通常不用于检测设备的运动,例如震动,倾斜或推力(更多信息,查阅Motion Sensor)。
磁场传感器和方位传感器为每个SensorEvent返回多维数组的传感器数值。例如,方位传感器提供
表1.Android平台支持的位置传感器
传感器 |
传感器事件数据 |
描述 |
测量单位 |
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
沿x轴方向磁场强度 |
uT |
|
SensorEvent.values[1] |
沿y轴方向磁场强度 |
|
|
SensorEvent.values[2] |
沿z轴方向磁场强度 |
|
TYPE_ORIENTATION1 |
SensorEvent.values[0] |
Azimuth(与z轴的角度) |
Degrees |
|
SensorEvent.values[1] |
Pitch(与x轴的角度) |
|
|
SensorEvent.values[2] |
Roll(与y轴的角度) |
|
TYPE_PROXIMITY |
SensorEvent.values[0] |
与对象的距离2 |
cm |
1.这个传感器在Android2.2中被弃用(API Level 8)。传感器框架提供了可选的方法用于获取设备方位,它在Using the Orientation Sensor中被讨论。
2.一些距离传感器仅仅提供二进制数据代表远近。
使用方位传感器
————————————————————————————————————————————
方位传感器让你检测设备相对于地球参考系的位置(特别是,磁北极)。下面的代码向你展示了如何获取默认的方位传感器实例:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
方位传感器通过使用设备的磁场传感器结合设备的加速度传感器获取数据。使用这两个硬件传感器,方位传感器提供以下面三个尺寸提供数据:
Azimuth(与z轴的角度)。这是地磁北极和设备的y轴的之间的角度。例如,如果设备的y轴和地磁北极对齐值为0,并且如何设备的y轴指向南值为180。同样,当y轴指向东值是90,并且当它指向西的时候值是270。
Pitch(与x轴的角度)。当正z轴旋转到正y轴的时候这个值是正数,并且当正z轴传转到负y轴的时候它使负数。这个值的范围是180度至-180度。
Roll(与y轴的角度)。当正z轴旋转到正x轴的时候这个值是整数,并且当正z轴旋转到负x轴的时候它是负值。值的范围是90度值-90度。
使用磁场传感器
—————————————————————————————————————————————————————————————
磁场传感器让你监测地球磁场的变化。下面的代码像你展示了如何获取一个默认的磁场传感器实例:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
这个传感器为三个坐标轴分别提供原始磁场强度数据(以uT)。通常你不需要直接使用这个传感器。相反,你能使用旋转矢量传感器来确定原始旋转运动,或者你能使用加速度和磁场传感器结合getRotationMatrix()方法来获取旋转矩阵和倾角矩阵。你然后能使用getOrientation()和getInclinaton()方法获取方位和地磁倾角数据。
使用距离传感器
—————————————————————————————————————————————————————————————
距离传感器让你确定一个物体力设备有多远。下面的代码显示了如何获取默认的距离传感器实例:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
距离传感器通常被用于确定人头离手机正面有多远(例如,当用户打或者接听电话的时候)。大部分距离传感器返回以厘米为单位的绝对距离,但是一些仅仅返回远近值。下面的代码像你显示如何使用距离传感器:
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get an instance of the sensor service, and use that to get an instance of
// a particular sensor.
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
}
@Override
public final void onSensorChanged(SensorEvent event) {
float distance = event.values[0];
// Do something with this sensor data.
}
@Override
protected void onResume() {
// Register a listener for the sensor.
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
// Be sure to unregister the sensor when the activity pauses.
super.onPause();
mSensorManager.unregisterListener(this);
}
}
注意:
一些距离传感器返回二进制值代表“近“或者”远“。在这种情况下,传感器通常在远的状态报告它的最大范围值,和在近状态返回最小值。代表性的,远值是一个大于5厘米的值,但是传感器和传感器之间可能不同。你能通过使用getMaximunRange()方法确定传感器的最大范围。