Android 平台提供多種感應器,可讓你監控動作 裝置本身的狀態
感測器可用的架構會因感應器類型而異:
- 重力、線性加速、旋轉向量、顯著動態、階梯 而步數偵測器則是以硬體為基礎或 軟體型式
- 加速計和陀螺儀感應器皆為硬體式。
大多數 Android 裝置都具備加速計,許多裝置現在都內建 陀螺儀。軟體式感應器的可用性 變數,因為這類模型通常會仰賴一或多個硬體感應器來產生 資料。視裝置而定,這些軟體式感應器可以導出 數據。
動作感應器很適合用來監控裝置動作,例如傾斜、搖晃、旋轉或 揮桿。動作通常是使用者直接輸入的動作 (例如使用者 遊戲中的汽車,或使用者在遊戲中控制球的 3D),但它也可能反映 裝置坐著的實際環境 (例如開車時隨身攜帶移動) 您的車輛)。在第一種情況中,您監控的是與裝置參考範圍相關的動作 或您應用程式的參考架構第二種例子就是監��� 全世界的參考架構動作感應器本身通常不是用於監控動作 但也可以和其他感應器 (例如地磁場感應器) 搭配使用, 根據世界參考架構判斷裝置的相對位置 (詳情請參閱「位置感應器」一文 資訊)。
所有動作感應器都會針對每個 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 軸的旋轉速率。 | 雷/秒 |
SensorEvent.values[1] |
Y 軸的旋轉速率。 | ||
SensorEvent.values[2] |
沿著 Z 軸的旋轉速率。 | ||
TYPE_GYROSCOPE_UNCALIBRATED |
SensorEvent.values[0] |
圍繞 X 軸的旋轉速率 (不含偏移補償)。 | 雷/秒 |
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(while/2))。 | 無單位 |
SensorEvent.values[1] |
沿著 Y 軸的旋轉向量元件 (y * sin(while/2))。 | ||
SensorEvent.values[2] |
沿著 Z 軸的旋轉向量元件 (z * sin(while/2))。 | ||
SensorEvent.values[3] |
旋轉向量的純量元件 ((cos(chunk/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 軸 (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(while/2) 和 旋轉向量等於旋轉軸的方向。
旋轉向量的三個元素等於單位的最後三個元件 Quternion (cos(while/2), x*sin(還有 2, y*sin(while/2), z*sin(while/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
敬上
您的應用程式必須獲得授權,才能在搭載 Chrome 的裝置上使用這個感應器
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
敬上
您的應用程式必須獲得授權,才能在搭載 Chrome 的裝置上使用這個感應器
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) 或 也就是 頻率限制。
從概念上來說,加速感應器會決定要採用的加速度 (Ad) 測量感應器帶有的力量 使用以下關係來取代 (F):
然而,根據 以下關係:
因此,當裝置放在桌上 (而非加速), 加速計會讀取 g = 9.81 m/s2 的規模。同樣地,當裝置位於 自由掉落,因此會在 9.81 公尺/秒2快速加速朝地面, 加速計會讀取 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)。程式碼範例 為了進行示範,使用的是 0.8 Alpha 值如果您使用這個篩選方法,您可能需要 選擇不同的 Alpha 值
加速計會使用標準感應器 座標 系統。具體來說,這表示裝置版面配置時,適用下列條件 平放於桌子上:
- 如果將裝置在左側推到右側 (移至右側),則會加 x 加速度值。 帶有正面的評價
- 如果將裝置置於底部 (使裝置朝外),則加速度的值為 正面影響。
- 如果以 m/s 的加速度將裝置推向天空2, z 加速值等於 A + 9.81,相當於裝置的加速 (+A) m/s2) 減重重力 (-9.81 公尺/秒2)。
- 靜息裝置的加速度將為 +9.81,也就是與 裝置的加速度 (0 公尺/秒2 減去重力力量,也就是 -9.81) m/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 用法