WEB开发网
开发学院手机开发Windows Phone开发 Windows Phone 7 数字罗盘使用指南 阅读

Windows Phone 7 数字罗盘使用指南

 2012-03-23 11:15:54 来源:WEB开发网   
核心提示:图1:WP7两个版本间传感器支持的差异 需要注意的是,对于Windows Phone 7设备来说,Windows Phone 7 数字罗盘使用指南(3),Compass并不是必须的,换句话说,而是把地磁的南北极等同于地理的南北极, 希望有HTC设备的朋友们可以测试一下,微软并没有对其进行强制规定,硬件厂商可以根据自己
图1:WP7两个版本间传感器支持的差异
 
  需要注意的是,对于Windows Phone 7设备来说,Compass并不是必须的。换句话说,微软并没有对其进行强制规定,硬件厂商可以根据自己的意愿来选择是否对其生产的Windows Phone 7设备加入数字罗盘的支持。例如,对于我的三星Focus i917而言,它支持加速度传感器和Compass,但是却并不支持Gyro。
 
4.  如何判断你的Windows Phone 7设备是否支持数字罗盘
  如何判断Windows Phone 7设备是否支持某种传感器,我们可以通过Microsoft.Devices.Sensors命名空间下,各个传感器的IsSupported属性获得。例如,判断设备是否支持数字罗盘,我们可以使用下面的语句:
 
 
 Compass compass;
if (!Compass.IsSupported)
{
    statusTextBlock.Text = "device does not support compass";
ApplicationBar.IsVisible = false;
 }
 
 
5. Compass提供的数据
    Windows Phone 7的Compass,可以提供的数据及其含义如下:
    (1)HeadingAccuracy -- 数字罗盘方向指示的精度,该数值一般用来指示是否需要校准。
    (2)MagneticHeading -- 与地磁北极的偏角,一般用角度来表示。 
    (3)TrueHeading -- 与地理北极的偏角,一般用角度来表示。 
    (4)MagnetometerReading -- 从磁力计得到的原始数据,以微特斯拉为单位,用XNA中的 Vector3 作为数据类型。
    注:Windows Phone 7的Compass提供了TrueHeading,从数字罗盘的分类上看,它还实现了gyro的功能。但是,从MSDN的文档《Sensors Overview for Windows Phone》来看,其compass提供的应该是与地磁北极的偏角:
    “The Compass, or magnetometer, sensor can be used to determine the angle by which the device is rotated relative to the Earth’s magnetic north pole. An application can also use raw magnetometer readings to detect magnetic forces around the device.”
    所以,对于这一点,我还是存在疑惑。
 
6. 如何为Windows Phone 7应用程序加入Compass?
   关于这一点,我们可以参考MSDN上的这篇文章:《How to: Get Data from the Compass Sensor for Windows Phone》。需要注意的有以下几点:
 
    (1)我们需要添加对Microsoft.Devices.Sensors以及Microsoft.Xna.Framework的引用。
 
    (2)我们需要在xaml对应的cs文件中,声明对命名空间的引入:
 
using Microsoft.Devices.Sensors;
using Microsoft.Xna.Framework;
using System.Windows.Threading;
 
(3)手机竖屏模式与横屏模式对Compass的影响。应用程序从Compass类中获得的角度信息会根据手机的姿态有所调整,其中主要是横屏和竖屏模式的区别。判断手机处于哪种状态,可以通过加速度传感器中Z轴的值来实现。
 
void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
{
 Vector3 v = e.SensorReading.Acceleration;

 bool isCompassUsingNegativeZAxis = false;

if (Math.Abs(v.Z) < Math.Cos(Math.PI / 4) &&
               (v.Y < Math.Sin(7 * Math.PI / 4)))
{
 isCompassUsingNegativeZAxis = true;
  }

Dispatcher.BeginInvoke(() => { orientationTextBlock.Text = (isCompassUsingNegativeZAxis) ? "portrait mode" : "flat mode"; });
}
 
 

7. Compass的校准

   由于受到外部电磁场的干扰,会使得手机的Compass数据精度降低,在这种情况下,我们必须提示用户远离磁场干扰,并且对Compass进行校准。在Windows Phone 7上,与CurrentValueChanged一样,OS为Compass提供了校准事件处理compass_Calibrate。在OS检测到heading accuracy的绝对值大于20度时,就会触发该事件。在对Compass进行校准时,一般显示一个图片,提示用户对手机进行绕“8”字移动。

 

void compass_Calibrate(object sender, CalibrationEventArgs e)
{
  Dispatcher.BeginInvoke(() => { calibrationStackPanel.Visibility = Visibility.Visible; });
 calibrating = true;
}

 

 

 

8. 实际测试结果分析

  对三星Focus i917(已升级到Mango,版本号为7720.68)进行Compass测试,获得的结果如下图2所示:

Screen Capture

图2:三星Focus i917设备的Compass测试结果

 

   进行测试时,手机处于竖屏模式(flat mode),而非横屏模式(portrait mode)。另外,从magnetic heading与true heading的结果来看,这两个数值相同,因此,我猜想:由于受设备的传感器的限制,OS并没有区分地磁南北极与地理南北极,而是把地磁的南北极等同于地理的南北极。

   希望有HTC设备的朋友们可以测试一下,是否支持Gyro?如果支持的话,从Compass获得的magnetic heading与true heading值是否一致?

上一页  1 2 3 

Tags:Windows Phone 数字

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接