1

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

一些似乎有问题的设备是: Android 2.2 上的 HTC Desire Android 2.2.3 上的摩托罗拉 Droid

他们声称使用指南针的其他应用程序工作正常。

我们使用以下方法启动指南针:

    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() 中的代码非常标准,并且基于您可以在网络上找到的无数示例。

那么,是否有人对为什么指南针代码可能无法在这些设备上运行有任何想法?

4

2 回答 2

1

我确实想通了。事实证明,在 2.2 中,您不能使用标准 SENSOR_DELAY_UI、SENSOR_DELAY_NORMAL 等以外的传感器速率。文档声称您还可以指定通知之间的微秒数,但它们在撒谎。

一旦我使用了标准常量,它就开始在 2.2 上工作

于 2011-12-29T15:09:00.373 回答
0

你还没有解释这意味着什么,指南针不起作用。

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

于 2011-12-28T11:25:32.903 回答