動作感應器

Android 平台提供多種感應器,可讓你監控動作 裝置本身的狀態

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

  • 重力、線性加速、旋轉向量、顯著動態、階梯 而步數偵測器則是以硬體為基礎或 軟體型式
  • 加速計和陀螺儀感應器皆為硬體式。

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

動作感應器很適合用來監控裝置動作,例如傾斜、搖晃、旋轉或 揮桿。動作通常是使用者直接輸入的動作 (例如使用者 遊戲中的汽車,或使用者在遊戲中控制球的 3D),但它也可能反映 裝置坐著的實際環境 (例如開車時隨身攜帶移動) 您的車輛)。在第一種情況中,您監控的是與裝置參考範圍相關的動作 或您應用程式的參考架構第二種例子就是監測 全世界的參考架構動作感應器本身通常不是用於監控動作 但也可以和其他感應器 (例如地磁場感應器) 搭配使用, 根據世界參考架構判斷裝置的相對位置 (詳情請參閱「位置感應器」一文 資訊)。

所有動作感應器都會針對每個 SensorEvent 傳回感應器值的多維陣列。舉例來說,發生單一感應器事件時,加速計會傳回 三個座標軸的加速力資料,陀螺儀會傳迴旋轉速率 三個座標軸的資料。這些資料值會在 float 陣列中傳回 (values) 與其他SensorEvent 參數。表 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 開放原始碼計畫 重力感應器顯示為次要重力感應器。這三種感應器都仰賴 陀螺儀:如果裝置沒有陀螺儀,這些感應器就不會顯示, 使用。

使用重力感應器

重力感應器提供 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) 和 旋轉向量等於旋轉軸的方向。

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

旋轉向量的三個元素等於單位的最後三個元件 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):

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)。程式碼範例 為了進行示範,使用的是 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 用法

另請參閱