第一个安卓应用 - 如何访问指南针

3
我正在制作我的第一个Android应用程序。作为学习系统的玩具问题,我想制作一个简单的应用程序,显示手机指向方向的文本,使用内置指南针。
如何从我的代码中访问指南针,并使我的代码意识到方向的变化?
我相信我将需要SensorManager类,但我不知道如何使用它。我如何告诉它我想要指南针传感器?我如何告诉它在方向改变时执行操作(更新文本)?

1
为什么不写一个更简单的应用程序,而不是问“我该怎么做”? - Falmarri
3个回答

11
// First, get an instance of the SensorManager
SensorManager sMan = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

// Second, get the sensor you're interested in
Sensor magnetField = sMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

// Third, implement a SensorEventListener class
SensorEventListener magnetListener = new SensorEventListener() {
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // do things if you're interested in accuracy changes
    }
    public void onSensorChanged(SensorEvent event) {
        // implement what you want to do here
    }
};

// Finally, register your listener
sMan.registerListener(magnetListener, magnetField, SensorManager.SENSOR_DELAY_NORMAL);

然而请注意,这实际上是一种磁传感器;因此,如果你周围有磁干扰,它可能会指向错误的方向。另外,你需要知道真北和磁北之间的区别。由于这段代码使用磁传感器,因此你获得的是磁北方向,但是如果你需要计算真北方向,则需要使用GeomagneticField.getDeclination()进行一些调整。


你的代码中,"implement a SensorEventListener class" 这一部分是在做什么?我对Java还比较新,从未见过那个语法。 - Greg
1
@Greg:这被称为匿名类(你可以谷歌“anonymous class java”)。SensortEventListener是一个“接口”,我们可以编写一个实现接口的类。由于这只是一个小例子,我使用了匿名类;但是,如果您的SensorEventListener类更复杂,您应该使用命名类。 - Lie Ryan

5
请查看API演示。已经编写了一个应用程序,可以访问指南针和加速度计。也许这会给您更好的思路,如何完成您的任务。
您可以在以下位置找到它:
/android-sdk-linux_86/samples/android-8/ApiDemos/src/com/example/android/apis/os/sensor.java
希望对您有所帮助。

0

首先,您应该检查系统上是否存在罗盘传感器

PackageManager m = getPackageManager();
if(!m.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
        Log.d("COMPASS_SENSOR", "Device has no compass");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接