動作感應器

Android 平台提供多種感應器,可讓您監控裝置的動作。

感應器的可能架構會因感應器類型而異:

  • 重力、線性加速、旋轉向量、重要動作、步數計數器和步數偵測工具感應器分為硬體或軟體式感應器。
  • 加速計和陀螺儀感應器一律採用硬體。

大多數 Android 裝置都具備加速計,許多裝置現在也都內建陀螺儀。軟體式感應器的可用性更高,因為這類感應器通常會仰賴一或多個硬體感應器來產生資料。視裝置而定,這些軟體式感應器可以從加速計、磁力儀或陀螺儀產生資料。

動作感應器很適合用來監控裝置動作,例如傾斜、搖晃、旋轉或揮桿。動作通常反映的是使用者直接輸入的內容 (例如使用者在遊戲中駕駛車子,或是在遊戲中控制球),但也可以反映裝置所在的實體環境 (例如開車時隨著您移動)。在第一個案例中,您監控的是相對於裝置參考框架或應用程式參考框架的動作;在第二種情況下,您監控的是相對於全球參考框架的動作。動作感應器本身通常不會用於監控裝置位置,但可以與其他感應器 (例如地磁場感應器) 搭配使用,藉此判斷裝置相對於世界參照框架的位置 (詳情請參閱「位置感應器」)。

所有動作感應器都會針對每個 SensorEvent 傳回感應器值的多維陣列。舉例來說,在單一感應器事件期間,加速計會傳回三個座標軸的加速度資料,陀螺儀會傳回三個座標軸的旋轉資料。這些資料值會與其他 SensorEvent 參數一起傳回 float 陣列 (values)。表 1 摘要列出 Android 平台可用的動作感應器。

表 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 開放原始碼計畫重力感應器就會顯示為次要重力感應器。上述三個感應器都依賴陀螺儀:如果裝置沒有陀螺儀,這些感應器就不會顯示,無法使用。

使用重力感應器

重力感應器提供三維向量來表示重力的方向和大小。一般來說,這個感應器的用途是判斷裝置在空間內的相對方向。以下程式碼顯示如何取得預設重力感應器的執行個體:

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),旋轉向量的方向則等於旋轉軸的方向。

圖 1 旋轉向量感應器使用的座標系統。

旋轉向量的三個元素等於單位四元數的最後一個三個元件 (cos(已於可點選/2)、x*sin(while/2)、y*sin(還有 para/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 權限,應用程式才能在搭載 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) 以上版本,這個感應器會設有頻率限制

從概念上來說,加速感應器會使用下列關係測量自己套用至感應器本身的力 (Ad),藉此判斷裝置適用的加速功能 (Ad):

A_D=-(1/質)∑F_S

然而,根據下列關係,重力的力量一律會會影響測量的加速度:

A_D=-g-(1/mass)∑F_S

因此,當裝置放在桌上 (且沒有加速),加速計會讀取 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)。為了進行示範,程式碼範例使用 Alpha 值為 0.8。如果您使用這個篩選方法,可能需要選擇其他 Alpha 值。

加速計會使用標準感應器座標系統。就實務上而言,這表示當裝置以自然方向擺放在表格上時,適用下列條件:

  • 如果將裝置移至左側 (使其移至右側),x 加速度值為正值。
  • 如果將裝置置於底部 (使裝置朝外),則加速度為正值。
  • 如果以 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 軸看向 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。

另請參閱