2010-09-18 68 views
3

我正在製作我的第一個Android應用程序。作爲學習系統的玩具問題,我想製作一個簡單的應用程序,以文本形式顯示手機使用內置指南針指向的方向。第一個Android應用程序 - 如何訪問指南針

如何從我的代碼訪問指南針,並讓我的代碼知道方向更改?

我相信我需要SensorManager class但我很困惑如何使用它。我如何知道我想要羅盤傳感器?我如何告訴它在方向改變時做一個動作(更新文本)?

+1

上爲什麼不寫而不是問「我怎麼做這個」 – Falmarri 2010-09-18 22:31:26

回答

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); 

但是,請注意,這實際上是一個磁傳感器;因此如果你周圍有磁場干擾,它可能指向錯誤的方向。此外,您需要知道True North和Magnetic North之間的區別。由於此代碼使用磁性傳感器,因此您可以獲得Magnetic North,如果需要計算True North,則需要使用GeomagneticField.getDeclination()進行一些調整。

+0

這是怎麼回事,請參見「實施SensorEventListener一個簡單的應用程序類「的代碼?我對Java有點新鮮,以前我沒有看過這種語法。 – Greg 2010-09-22 00:24:11

+1

@Greg:這就是所謂的匿名類(你可以谷歌「匿名類java」)。 SensortEventListener是一個「接口」,我們可以編寫一個「實現」接口的類。由於這只是一個小例子,我使用了匿名類;但是,如果您的SensorEventListener類更復雜,則應該使用命名類。 – 2010-09-22 02:47:19

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"); 
}