指南针不能在某些设备上工作

问题描述:

我们最近发布了iPhone应用程序的Android端口。该应用程序依赖于数字指南针的一些功能。这在大多数设备上都运行良好,但有一些指南针不起作用。对于描述,似乎设备不给我们任何onSensorChanged()消息。指南针不能在某些设备上工作

一对夫妇,似乎有问题的设备有:在Android 2.2 的HTC Desire 摩托罗拉Droid在Android 2.2.3

他们声称,其他的应用程序,利用指南针做工精细。

if (magnetometer != null && accelerometer != null) 
    { 
     if (compassOn) 
     { 
      sensorManager.registerListener(this, accelerometer, (int) (1000000/kSensorUpdateFrequencyFast)); 
      sensorManager.registerListener(this, magnetometer, (int) (1000000/kSensorUpdateFrequencyFast)); 
     } 
     else 
     { 
      sensorManager.registerListener(this, accelerometer, (int) (1000000/kSensorUpdateFrequencySlow)); 
      sensorManager.registerListener(this, magnetometer, (int) (1000000/kSensorUpdateFrequencySlow)); 
     } 
    } 

当磁力计和加速计在程序启动时初始化使用:

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

现在上面的代码表明,登记并不无论是否发生加速度

我们开始使用指南针== null或磁力计== null。我很确定磁力计不是零,因为如果它是我们隐藏指南针功能。那么这些手机上的加速度计可能是空的?

我的onSensorChanged()中的代码非常标准,它基于您可以在网上找到的无数例子。

那么,有没有人有任何想法,为什么指南针代码可能不会在这些设备上工作?

+0

FYI工作:似乎大多数(所有?)的是有问题的乡亲都在2.2.x中 – btschumy 2011-12-27 21:25:20

+0

我还注意到一些示例代码通过以下方式获取传感器: List sendorList = sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD); 传感器磁力计= sensorList.get(0); 这会帮助,而不是getDefaultSensor()? – btschumy 2011-12-27 21:34:03

我弄明白了。结果发现,在2.2中,除了标准的SENSOR_DELAY_UI,SENSOR_DELAY_NORMAL等之外,您不能使用传感器速率。文档声称您还可以指定通知之间的微秒数,但它们在撒谎。

一旦我使用的标准常量它开始于2.2

你还没有解释它是什么意思,指南针不起作用。

如果你没有得到有效的数据,这可能是这个设备众所周知的问题。与我的,我需要总是滚动它的手(水平和垂直)解锁指南针。有些应用程序称它为校准但对我来说这是荒谬的...我有HTC Desire。

+0

对不起,问题似乎是我们在注册接收它们后从未收到任何onSensorChanged()调用。这不是*我们刚收到无效数据的情况。 – btschumy 2011-12-28 16:17:15