android 方向sensor,Android开发者指南-方位传感器-Position Sensor[原创译文]

Android 平台提供了两种传感器来检测设备的方位:地磁传感器和方向传感器。 Android

平台还提供了一种传感器,用于检测屏幕表面与其它物体的邻近程度,即被称为距离传感器。

地磁传感器和距离传感器是基于硬件的。大部分手持和桌面设备都内置了地磁传感器。手持设备通常还内置了距离传感器,用于检测与人脸的靠近程度(比如在通话过程中)。

而方向传感器是基于软件的,它的数据来自加速度传感器和地磁传感器。

注意: 自 Android 2.2 (API Level 8) 起,方向传感器已过时。

方位传感器用于确定设备相对地球的物理方位。比如,你可以用地磁传感器和加速度传感器来确定设备相对北极点的方位。

你还可以用方向传感器(或类似的基于传感器的判断方向的方法)来确定设备相对你自己参照系的方位。

方位传感器通常不会用于监测设备的移动情况,诸如震动、倾斜、冲击(详见 运动传感器)。

地磁传感器和方向传感器在 SensorEvent 中返回以多维数组表示的传感器数据。 比如,方向传感器在传感器事件中提供了三个坐标轴方向的地磁强度。

同理,方向传感器还在事件中给出了方位角(侧倾度)、俯仰度和翻滚度。 关于传感器使用的坐标系,请参阅 传感器的坐标系。 距离传感器在事件中给出的是一个值。表 1列出了 Android 平台支持的所有方位传感器。

表 1. Android 平台支持的方位传感器

传感器

传感器事件中的数据

说明

计量单位

SensorEvent.values[0]

x 轴的地磁强度

μT

SensorEvent.values[1]

y 轴的地磁强度

SensorEvent.values[2]

z 轴的地磁强度

SensorEvent.values[0]

侧倾度(围绕 z 轴的角度)

SensorEvent.values[1]

俯仰度(围绕 x 轴的角度)

SensorEvent.values[2]

翻滚度(围绕 y 轴的角度)

SensorEvent.values[0]

与物体的距离2

cm

1 此传感器在 Android 2.2 (API Level 8)

之后已过时。传感器框架为检测设备的方向提供了替代的方法,参见使用方向传感器。

2 某些距离传感器只提供二进制的距离值。

方向传感器用于监测设备相对地球的方位(其实是地球磁场)。以下代码展示了如何获取缺省的方向传感器的一个实例:

privateSensorManagermSensorManager;privateSensormSensor;...mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

方向传感器的数据来自设备的地磁传感器和加速度传感器。利用这两种硬件传感器,方向传感器提供了以下三个方向的数据:

侧倾度(围绕 z 轴的旋转角)。这是指设备 y 轴与地磁北极间的夹角。例如,如果设备的 y 轴指向地磁北极则该值为 0,如果

y 轴指向南方则该值为 180。 同理,y 轴指向东方则该值为 90,而指向西方则该值为 270。

俯仰度(围绕 x 轴的旋转角)。当 z 轴的正值部分朝向 y 轴的正值部分旋转时,该值为正。 当 z 轴的正值部分朝向 y

轴的负值部分旋转时,该值为负。取值范围为 -180 度到 180 度。

翻滚度(围绕 y 轴的旋转角)。当 z 轴的正值部分朝向 x 轴的正值部分旋转时,该值为正。 当 z 轴的正值部分朝向 x

轴的负值部分旋转时,该值为负。取值范围为 -90 度到 90 度。

以上定义与航空学上的不同,那里的 X 轴是指飞机的长轴(从机尾至机首)。

并且,由于历史的原因,翻滚度也是以顺时针方向为正(从数学上讲,应该是逆时针方向为正)。

方向传感器的数据是对加速度和地磁传感器的原始数据进行处理之后再报送出来的。

因为处理工作比较繁重,方向传感器的精度和准确度会有所降低(只有在翻滚度为 0 时此传感器的数据才是可靠的)。 因此,方向传感器自

Android 2.2 (API level 8) 开始已经过时了。 作为直接使用方向传感器原始数据的替代方案,我们建议你结合

getRotationMatrix() 和 getOrientation() 方法来来计算方向值。你还可以用 remapCoordinateSystem() 方法来把方向值转换为应用程序自定义参照系的坐标。

以下例程展示了如何直接向方向传感器请求方向数据。我们建议你只在设备翻滚度可以忽略时才使用这种方式。

publicclassSensorActivityextendsActivityimplementsSensorEventListener{privateSensorManagermSensorManager;privateSensormOrientation;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);mOrientation=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}@OverridepublicvoidonAccuracyChanged(Sensorsensor,intaccuracy){// 执行一些传感器精度变动后的相关工作// 必须实现本回调方法的代码}@OverrideprotectedvoidonResume(){super.onResume();mSensorManager.registerListener(this,mOrientation,SensorManager.SENSOR_DELAY_NORMAL);}@OverrideprotectedvoidonPause(){super.onPause();mSensorManager.unregisterListener(this);}@OverridepublicvoidonSensorChanged(SensorEventevent){floatazimuth_angle=event.values[0];floatpitch_angle=event.values[1];floatroll_angle=event.values[2];// 利用这些方向角度执行工作}}

通常你不需要对方向传感器的数据进行任何处理或过滤,当然以应用程序自定义参照系进行坐标转换除外。 Accelerometer Play

范例展示了如何把加速度传感器数据转换为其它参照系坐标的过程;方向传感器也可以采用类似的技术来完成转换。

地磁传感器使你能监测地球磁场的变化。以下代码展示了如何获取缺省的地磁传感器的一个实例:

privateSensorManagermSensorManager;privateSensormSensor;...mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

此传感器提供了三维坐标轴方向上的原始的磁场强度数据(单位μT)。通常,你不需要直接使用此传感器。

取而代之的是,你可以用旋转向量传感器来测量旋转的原始数据,或者联合使用加速度计、地磁传感器、 getRotationMatrix() 方法来获取旋转矩阵和倾角矩阵。然后,你可以通过 a

href="http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation(float[],

float[])">getOrientation() 和 getInclination() 根据这些矩阵数据得到侧倾度和地磁倾角数据。

距离传感器使你能检测设备距离某物体的远近程度。以下代码展示了如何获取缺省的距离传感器的一个实例:

privateSensorManagermSensorManager;privateSensormSensor;...mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

距离传感器通常用于确定用户头部与手持设备屏幕表面的距离(比如,用户拨打或接听电话时)。 大部分距离传感器返回的是绝对距离,单位是

cm,但某些传感器只能返回远近程度值。 以下代码展示了距离传感器的使用:

publicclassSensorActivityextendsActivityimplementsSensorEventListener{privateSensorManagermSensorManager;privateSensormProximity;@OverridepublicfinalvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取传感器设备的一个实例,并用它获取某个特定的传感器mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);mProximity=mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);}@OverridepublicfinalvoidonAccuracyChanged(Sensorsensor,intaccuracy){// 在这里进行一些传感器精度改变后的处理}@OverridepublicfinalvoidonSensorChanged(SensorEventevent){floatdistance=event.values[0];// 处理当前的传感器数据}@OverrideprotectedvoidonResume(){// 注册一个传感器侦听器super.onResume();mSensorManager.registerListener(this,mProximity,SensorManager.SENSOR_DELAY_NORMAL);}@OverrideprotectedvoidonPause(){// 请在 activity 暂停时确保注销传感器super.onPause();mSensorManager.unregisterListener(this);}}

注意: 某些距离传感器返回的是代表远近程度的二进制数值。

这种情况下,传感器通常把最大量程表示为“远”,小于量程的值则为“近”。 “远”值典型为> 5

cm,但这因传感器而异。 你可以用 getMaximumRange() 方法来确定传感器的最大量程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
感谢您的提问。要实现指南针功能,我们需要使用AndroidSensor传感器)API。下面是一些基本步骤: 1. 获取SensorManager对象。您可以通过以下方式获取: ```java SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); ``` 2. 获取方向传感器。我们需要使用Android设备上的方向传感器来获取设备的方向。您可以使用以下代码获取方向传感器: ```java Sensor orientationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); ``` 请注意,`Sensor.TYPE_ORIENTATION`在Android API级别20中被弃用。您应该使用`Sensor.TYPE_ROTATION_VECTOR`代替。 3. 创建SensorEventListener。我们需要实现`SensorEventListener`接口来接收传感器数据。您可以使用以下代码来创建一个SensorEventListener: ```java private final SensorEventListener sensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { // 当传感器数据更新时调用此方法 // 在这里更新指南方向 } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // 当传感器精度发生变化时调用此方法 } }; ``` 4. 注册SensorEventListener。您需要在Activity的生命周期方法(例如`onResume()`)中注册`SensorEventListener`,以便在传感器数据更新时接收通知。您可以使用以下代码进行注册: ```java sensorManager.registerListener(sensorEventListener, orientationSensor, SensorManager.SENSOR_DELAY_UI); ``` 请注意,`SENSOR_DELAY_UI`表示传感器数据应该以与UI线程更新相同的频率更新。您可以使用其他常量来指定更新频率。 5. 实现指南方向。您需要使用传感器数据来计算设备的方向,并更新指南方向。您可以使用以下代码来获取设备的方向: ```java float[] orientationValues = new float[3]; SensorManager.getOrientation(event.values, orientationValues); float azimuth = Math.toDegrees(orientationValues[0]); ``` 请注意,`azimuth`表示设备的方向,以度为单位。 6. 更新指南方向。您需要在UI线程中更新指南方向。您可以使用以下代码来更新指南方向: ```java runOnUiThread(new Runnable() { @Override public void run() { compassView.setDirection(azimuth); } }); ``` 请注意,`compassView`是一个自定义视图,用于绘制指南针。 这些是实现指南针功能的基本步骤。您需要根据自己的需求进行调整和修改。祝您好运!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值