Android 平台提供多種感應器,可讓您監控裝置動作。
感應器的可能架構因感應器類型而異:
- 重力、線性加速、旋轉向量、重要動作、步數計數器和步數偵測器感應器則是硬體或軟體。
- 加速計和陀螺儀感應器一律以硬體為基礎。
大多數 Android 裝置都搭載加速計,但許多裝置現在都內建陀螺儀。軟體型感應器的可用性比較大,因為其經常仰賴一或多個硬體感應器來取得資料。視裝置而定,這些軟體式感應器可從加速計和磁力儀或陀螺儀取得資料。
動作感應器很適合用來監控傾斜、晃動、旋轉或揮動等裝置動作。這類動作通常反映了使用者直接輸入內容 (例如在遊戲中轉乘車輛,或是使用者在遊戲中控制球的使用者),但也可能反映裝置所在的實體環境 (例如在開車時隨著你移動)。在第一個案例中,您監控的動作是相對於裝置參考影格或應用程式的參考影格;在第二種案例中,您監控的動作是相對於世界參考影格。動作感應器本身通常並不用於監控裝置位置,但可搭配地理磁場感應器等其他感應器使用,以判斷裝置相對於全球參考影格的位置 (詳情請參閱「位置感應器」)。
所有動作感應器都會為每個 SensorEvent
傳回多個感應器值的多維陣列。舉例來說,在單一感應器事件期間,加速計會傳回三個座標軸的加速度資料,而陀螺儀會傳回三個座標軸的旋轉速率。這些資料值會透過 float
陣列 (values
) 和其他 SensorEvent
參數傳回。表 1 概述 Android 平台提供的動作感應器。
感應器 | 感應器事件資料 | 說明 | 測量單位 |
---|---|---|---|
TYPE_ACCELEROMETER |
SensorEvent.values[0] |
沿著 X 軸的加速度 (包括重力)。 | 公尺/秒2 |
SensorEvent.values[1] |
沿著 Y 軸的加速度 (包括重力)。 | ||
SensorEvent.values[2] |
沿著 Z 軸的加速度 (包括重力)。 | ||
TYPE_ACCELEROMETER_UNCALIBRATED |
SensorEvent.values[0] |
沿著 X 軸測量的加速度,沒有任何偏誤補償。 | 公尺/秒2 |
SensorEvent.values[1] |
沿著 Y 軸測量的加速度,沒有任何偏誤補償。 | ||
SensorEvent.values[2] |
沿著 Z 軸測量的加速度,沒有任何偏誤補償。 | ||
SensorEvent.values[3] |
沿著 X 軸測量的加速,預估偏誤補償。 | ||
SensorEvent.values[4] |
沿著 Y 軸測量的加速,預估偏誤補償。 | ||
SensorEvent.values[5] |
沿著 Z 軸測量加速度,並提供預估偏誤補償。 | ||
TYPE_GRAVITY |
SensorEvent.values[0] |
沿著 X 軸的重力製度。 | 公尺/秒2 |
SensorEvent.values[1] |
沿著 Y 軸的重力。 | ||
SensorEvent.values[2] |
沿著 Z 軸的重力。 | ||
TYPE_GYROSCOPE |
SensorEvent.values[0] |
沿著 X 軸的旋轉速率。 | Rad/秒 |
SensorEvent.values[1] |
Y 軸的旋轉速率。 | ||
SensorEvent.values[2] |
沿著 Z 軸的旋轉速率。 | ||
TYPE_GYROSCOPE_UNCALIBRATED |
SensorEvent.values[0] |
圍繞 X 軸的旋轉速率 (不含偏移補償)。 | Rad/秒 |
SensorEvent.values[1] |
Y 軸周圍的旋轉速率 (不含偏移補償)。 | ||
SensorEvent.values[2] |
Z 軸的旋轉速率 (不含偏移補償)。 | ||
SensorEvent.values[3] |
沿著 X 軸預估的偏移值。 | ||
SensorEvent.values[4] |
Y 軸周圍的預估偏移值。 | ||
SensorEvent.values[5] |
Z 軸周圍的預估偏移值。 | ||
TYPE_LINEAR_ACCELERATION |
SensorEvent.values[0] |
沿著 X 軸的加速度 (不含重力)。 | 公尺/秒2 |
SensorEvent.values[1] |
沿著 Y 軸的加速度 (不含重力)。 | ||
SensorEvent.values[2] |
沿著 Z 軸的加速度 (不含重力)。 | ||
TYPE_ROTATION_VECTOR |
SensorEvent.values[0] |
沿著 X 軸的旋轉向量元件 (x * sin(詳細說明/2))。 | 無單位 |
SensorEvent.values[1] |
沿著 Y 軸的旋轉向量元件 (y * sin(詳細說明/2))。 | ||
SensorEvent.values[2] |
沿著 Z 軸的旋轉向量元件 (z * sin(詳細說明/2))。 | ||
SensorEvent.values[3] |
旋轉向量的純量元件 ((cos(proxima/2))1。 | ||
TYPE_SIGNIFICANT_MOTION |
無 | 無 | 無 |
TYPE_STEP_COUNTER |
SensorEvent.values[0] |
自上次重新啟動感應器後,使用者採取的步驟數。 | 操作步驟 |
TYPE_STEP_DETECTOR |
無 | 無 | 無 |
1 純量元件是選用值,
旋轉向量感應器和重力感應器是動作偵測及監控中最常用的感應器。旋轉向量感應器尤其具多元性,並可用於多種動作相關工作,例如偵測手勢、監控角度變化,以及監控相對方向變更。舉例來說,如果您要開發遊戲、擴增實境應用程式、2D 或 3D 指南針,或相機穩定應用程式,則適合使用旋轉向量感應器。在大多數情況下,使用這些感應器會比加速計和地磁場感應器或方向感應器更適合。
Android 開放原始碼計畫感應器
Android 開放原始碼計畫 (AOSP) 提供三種軟體動作感應器:重力感應器、線性加速感應器和旋轉向量感應器。這些感應器已在 Android 4.0 中更新,現在除了其他感應器外,還會使用裝置的陀螺儀 (包括其他感應器),提升穩定性和效能。如要試用這些感應器,可以使用 getVendor()
方法和 getVersion()
方法 (廠商為 Google LLC,版本編號為 3) 識別這些感應器。由於 Android 系統會將這三個感應器視為次要感應器,因此必須根據廠商和版本號碼識別這些感應器。舉例來說,如果裝置製造商有自己的重力感應器,Android 開放原始碼計畫重力感應器會顯示為次要重力感應器。這三個感應器都依賴陀螺儀:如果裝置沒有陀螺儀,這些感應器就不會顯示,也無法使用。
使用重力感應器
重力感應器提供 3D 向量,表示重力的方向和規模。一般來說,這個感應器可用於判斷裝置在空間中的相對方向。以下程式碼顯示如何取得預設重力感應器的例項:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
單位與加速感應器 (m/s2) 使用的單位相同,且座標系統與加速感應器使用的單位相同。
注意:裝置處於靜止狀態時,重力感應器的輸出內容應與加速計的輸出內容相同。
使用線性加速計
線性加速感應器提供 3D 向量,代表各裝置軸的加速度 (不包括重力)。您可以使用這個值執行手勢偵測。此值也可以做為使用死結的存取導覽系統的輸入內容。以下程式碼說明如何取得預設線性加速感應器的例項:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
從概念上來說,這個感應器會根據下列關係提供加速資料:
linear acceleration = acceleration - acceleration due to gravity
一般來說,如果您想在不受重力影響的情況下取得加速資料,通常會使用這個感應器。舉例來說,您可以利用這個感應器瞭解車輛的行駛速度。線性加速感應器一律具有必須移除的位移。最簡單的做法是在應用程式中建構校正步驟。在校正期間,您可以要求使用者將裝置設為資料表,然後讀取全部三個軸的位移。接著,您可以從加速感應器的直接讀數減去該偏移值,進而得出實際的線性加速。
感應器座標系統與加速感應器使用的相同,也是測量單位 (m/s2)。
使用旋轉向量感應器
旋轉向量會以角度和軸的組合,代表裝置的螢幕方向,其中裝置會以軸 (x、y 或 z) 為中心旋轉的角度 基準。以下程式碼說明如何取得預設旋轉向量感應器的例項:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
旋轉向量的三個元素會以下列方式表示:
旋轉向量的規模等於 sin(proxima/2),旋轉向量的方向等於旋轉軸。
旋轉向量的三個元素等於單位四元數 (cos(proxima/2)、x*sin(詳細說明/2)、y*sin(dicate/2)、z*sin(靈感/2) 的最後三個元件。旋轉向量的元素沒有單位。x、y 和 z 軸的定義與加速感應器相同。參考座標系統定義為直接或正規基礎 (參見圖 1)。此座標系統具有下列特性:
- X 會定義為向量產品 Y x Z。它是位於裝置目前位置的正切線,點上大約東部。
- Y 是裝置目前位置的地面切線,指向北極的地磁。
- Z 指向天空,且與地平面垂直。
如需瞭解如何使用旋轉向量感應器的範例應用程式,請參閱 RotationVectorDemo.java。
使用重要的動作感應器
重要動作感應器會在偵測到重要動作時觸發事件,然後自行停用。「重要動作」是指可能導致使用者位置改變的動作,例如步行、騎單車或坐在移動中的車輛。以下程式碼說明如何取得預設重要動作感應器的例項,以及如何註冊事件監聽器:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val mSensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION) val triggerEventListener = object : TriggerEventListener() { override fun onTrigger(event: TriggerEvent?) { // Do work } } mSensor?.also { sensor -> sensorManager.requestTriggerSensor(triggerEventListener, sensor) }
Java
private SensorManager sensorManager; private Sensor sensor; private TriggerEventListener triggerEventListener; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION); triggerEventListener = new TriggerEventListener() { @Override public void onTrigger(TriggerEvent event) { // Do work } }; sensorManager.requestTriggerSensor(triggerEventListener, mSensor);
詳情請參閱 TriggerEventListener
。
使用計步器感應器
步數計數器感應器會提供使用者自上次重新啟動感應器後所走的步數。步驟計數器的延遲時間較長 (最多 10 秒),但準確度比步數偵測工具感應器更準確。
注意: 您必須宣告 ACTIVITY_RECOGNITION
權限,應用程式才能在搭載 Android 10 (API 級別 29) 以上版本的裝置上使用這個感應器。
以下程式碼說明如何取得預設步數計數器感應器的例項:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
為了在執行應用程式的裝置上節省電量,建議您使用 JobScheduler
類別,以特定時間間隔從計步計數器感應器擷取目前的值。雖然不同類型的應用程式需要不同的感應器讀取間隔,但除非應用程式需要感應器的即時資料,否則建議您盡可能延長這個間隔時間。
使用計步偵測器感應器
步數偵測工具感應器會在使用者完成步數時觸發事件。延遲時間預計會低於 2 秒。
注意: 您必須宣告 ACTIVITY_RECOGNITION
權限,應用程式才能在搭載 Android 10 (API 級別 29) 以上版本的裝置上使用這個感應器。
以下程式碼說明如何取得預設計步偵測器感應器的例項:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
使用原始資料
下列感應器為應用程式提供裝置套用的線性和旋轉力原始資料。為了有效運用這些感應器的值,您需要篩除環境中的因素,例如重力。您可能還需要為值的趨勢套用平滑的演算法,以減少雜訊。
使用加速計
加速感應器會測量套用至裝置的加速情形,包括重力。以下程式碼顯示如何取得預設加速感應器的例項:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
注意: 如果應用程式指定的是 Android 12 (API 級別 31) 以上版本,則這個感應器具有頻率限制。
概念上,加速感應器會使用以下關係測量套用至感應器本身的力 (Fs),判斷套用至裝置的加速 (Ad):
然而,重力的力會持續根據以下關係影響測得的加速:
因此,當裝置坐在桌上時 (沒有加速),加速計就會顯示 g = 9.81 m/s2 的規模。同樣地,當裝置處於自由摔落狀態時,因此快速加速行駛至地面 (9.81 公尺/s2),其加速計就會讀取 g = 0 m/s2 的規模。因此,如要測量裝置的實際加速度,您必須從加速計資料中移除重力所佔的比重。您可以套用高通過濾鏡。反之,低通道過濾器可用來隔離重力。以下範例說明如何執行這項操作:
Kotlin
override fun onSensorChanged(event: SensorEvent) { // In this example, alpha is calculated as t / (t + dT), // where t is the low-pass filter's time-constant and // dT is the event delivery rate. val alpha: Float = 0.8f // Isolate the force of gravity with the low-pass filter. gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0] gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1] gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2] // Remove the gravity contribution with the high-pass filter. linear_acceleration[0] = event.values[0] - gravity[0] linear_acceleration[1] = event.values[1] - gravity[1] linear_acceleration[2] = event.values[2] - gravity[2] }
Java
public void onSensorChanged(SensorEvent event){ // In this example, alpha is calculated as t / (t + dT), // where t is the low-pass filter's time-constant and // dT is the event delivery rate. final float alpha = 0.8; // Isolate the force of gravity with the low-pass filter. gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; // Remove the gravity contribution with the high-pass filter. linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; }
注意:您可以利用許多不同技術篩選感應器資料。上述程式碼範例使用簡單的篩選器常數 (alpha) 建立低傳遞篩選器,這個篩選器常數衍生自時間常數 (t),這大致表示篩選器加入感應器事件和感應器的事件傳送率 (dt)。程式碼範例使用 Alpha 值 0.8 做為示範。如果使用這個篩選方法,可能需要選擇其他 Alpha 值。
加速計使用標準感應器座標系統。從實務上來說,這表示當裝置以自然方向平放在資料表上時,適用下列條件:
- 如果您將裝置向左推至左側 (讓裝置向右移動),x 加速值就會是正數。
- 如果把裝置推到底部 (使其遠離自己),y 加速值就會是正值。
- 如果裝置加速度為 A m/s2 的天空,z 加速度值等於 A + 9.81,等同於裝置的加速度 (+A m/s2) 減去重力 (-9.81 m/s2) 的力量。
- 固定裝置將會有 +9.81 的加速度值,對應於裝置的加速度 (0 m/s2 減去重力的力量,也就是 -9.81m/s2)。
一般來說,加速計是一種感應器,適合用於監控裝置動作。幾乎每部 Android 手機和平板電腦都有加速計,而且與其他動作感應器相比,耗電量大約低 10 倍。這種做法的缺點是,您可能需要導入低傳遞和高通道濾鏡,才能消除重力作業並減少雜訊。
使用陀螺儀
陀螺儀可測量以裝置 x、y 和 Z 軸為圈數的旋轉速率。以下程式碼顯示如何取得預設陀螺儀的例項:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
注意: 如果應用程式指定的是 Android 12 (API 級別 31) 以上版本,則這個感應器具有頻率限制。
感應器的座標系統與加速感應器相同。旋轉會以逆時針方向為正數,也就是說,如果觀察器在來源裝置以 x 軸、y 軸或 z 軸上的某個正面位置查看,就會回報正向旋轉,如果裝置似乎是逆時針旋轉。這是正旋轉的標準數學定義,且與方向感應器使用的捲動定義不同。
通常,陀螺儀的輸出內容會隨著時間整合,以便計算說明時間角度中角度變化的旋轉情形。例如:
Kotlin
// Create a constant to convert nanoseconds to seconds. private val NS2S = 1.0f / 1000000000.0f private val deltaRotationVector = FloatArray(4) { 0f } private var timestamp: Float = 0f override fun onSensorChanged(event: SensorEvent?) { // This timestep's delta rotation to be multiplied by the current rotation // after computing it from the gyro sample data. if (timestamp != 0f && event != null) { val dT = (event.timestamp - timestamp) * NS2S // Axis of the rotation sample, not normalized yet. var axisX: Float = event.values[0] var axisY: Float = event.values[1] var axisZ: Float = event.values[2] // Calculate the angular speed of the sample val omegaMagnitude: Float = sqrt(axisX * axisX + axisY * axisY + axisZ * axisZ) // Normalize the rotation vector if it's big enough to get the axis // (that is, EPSILON should represent your maximum allowable margin of error) if (omegaMagnitude > EPSILON) { axisX /= omegaMagnitude axisY /= omegaMagnitude axisZ /= omegaMagnitude } // Integrate around this axis with the angular speed by the timestep // in order to get a delta rotation from this sample over the timestep // We will convert this axis-angle representation of the delta rotation // into a quaternion before turning it into the rotation matrix. val thetaOverTwo: Float = omegaMagnitude * dT / 2.0f val sinThetaOverTwo: Float = sin(thetaOverTwo) val cosThetaOverTwo: Float = cos(thetaOverTwo) deltaRotationVector[0] = sinThetaOverTwo * axisX deltaRotationVector[1] = sinThetaOverTwo * axisY deltaRotationVector[2] = sinThetaOverTwo * axisZ deltaRotationVector[3] = cosThetaOverTwo } timestamp = event?.timestamp?.toFloat() ?: 0f val deltaRotationMatrix = FloatArray(9) { 0f } SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector); // User code should concatenate the delta rotation we computed with the current rotation // in order to get the updated rotation. // rotationCurrent = rotationCurrent * deltaRotationMatrix; }
Java
// Create a constant to convert nanoseconds to seconds. private static final float NS2S = 1.0f / 1000000000.0f; private final float[] deltaRotationVector = new float[4](); private float timestamp; public void onSensorChanged(SensorEvent event) { // This timestep's delta rotation to be multiplied by the current rotation // after computing it from the gyro sample data. if (timestamp != 0) { final float dT = (event.timestamp - timestamp) * NS2S; // Axis of the rotation sample, not normalized yet. float axisX = event.values[0]; float axisY = event.values[1]; float axisZ = event.values[2]; // Calculate the angular speed of the sample float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ); // Normalize the rotation vector if it's big enough to get the axis // (that is, EPSILON should represent your maximum allowable margin of error) if (omegaMagnitude > EPSILON) { axisX /= omegaMagnitude; axisY /= omegaMagnitude; axisZ /= omegaMagnitude; } // Integrate around this axis with the angular speed by the timestep // in order to get a delta rotation from this sample over the timestep // We will convert this axis-angle representation of the delta rotation // into a quaternion before turning it into the rotation matrix. float thetaOverTwo = omegaMagnitude * dT / 2.0f; float sinThetaOverTwo = sin(thetaOverTwo); float cosThetaOverTwo = cos(thetaOverTwo); deltaRotationVector[0] = sinThetaOverTwo * axisX; deltaRotationVector[1] = sinThetaOverTwo * axisY; deltaRotationVector[2] = sinThetaOverTwo * axisZ; deltaRotationVector[3] = cosThetaOverTwo; } timestamp = event.timestamp; float[] deltaRotationMatrix = new float[9]; SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector); // User code should concatenate the delta rotation we computed with the current rotation // in order to get the updated rotation. // rotationCurrent = rotationCurrent * deltaRotationMatrix; }
標準陀螺儀提供原始旋轉資料,而不經過任何篩選或校正雜訊和偏移 (偏差)。實際上,陀螺儀的雜訊和漂移將會產生需要補償的錯誤。一般來說,您可以透過監控其他感應器 (例如重力感應器或加速計) 來判斷偏移 (偏誤) 和噪音。
使用未校正的陀螺儀
未校正的陀螺儀與陀螺儀類似,差別在於旋轉率不會套用陀螺儀偏移。工廠校正和溫度補償仍適用於旋轉速率。未校正的陀螺儀適用於後續處理和融化方向資料。一般來說,gyroscope_event.values[0]
會靠近 uncalibrated_gyroscope_event.values[0] - uncalibrated_gyroscope_event.values[3]
。也就是
calibrated_x ~= uncalibrated_x - bias_estimate_x
注意:未經校正的感應器可提供更多原始結果,且可能包含部分偏誤,但透過校正功能套用的校正後,其測量結果所包含的跳轉次數較少。有些應用程式可能偏好這些未校正的結果,因為這樣較順暢且更可靠。例如,如果應用程式嘗試自行進行感應器融合,引入校正實際上可能會扭曲結果。
除了旋轉速率以外,未校正的陀螺儀也提供各軸周圍的預估偏移。以下程式碼顯示如何取得預設未校正的預設陀螺儀執行個體:
Kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);
其他程式碼範例
BatchStepSensor 範例進一步示範如何使用本頁涵蓋的 API。