大多數(shù) Android 設備都(dōu)有內(nèi)置傳感器,用來測量運動、屏幕方向和(hé)各種環境條件。這(zhè)些傳感器能(néng)夠提供高度精确的原始數(shù)據,非常适合用來監測設備的三維移動或定位,或監測設備周圍環境的變化。例如(rú),遊戲可(kě)以跟蹤設備重力傳感器的讀數(shù),以推斷出複雜(zá)的用戶手勢和(hé)動作(zuò),如(rú)傾斜、搖晃、旋轉或揮動。同樣,天氣應用可(kě)以使用設備的溫度傳感器和(hé)濕度傳感器來計算和(hé)報告露點,旅行(xíng)應用則可(kě)以使用地(dì)磁場傳感器和(hé)加速度計來報告羅盤方位。
請(qǐng)參閱以下(xià)相關資源:
傳感器
動态傳感器
位置傳感器
環境傳感器
Accelerometer Play
API 演示 (OS - RotationVectorDemo)
Android 平台支持三大類傳感器:
動态傳感器
這(zhè)類傳感器測量三個軸向上(shàng)的加速力和(hé)旋轉力。這(zhè)個類别中包含加速度計、重力傳感器、陀螺儀和(hé)旋轉矢量傳感器。
環境傳感器
這(zhè)類傳感器測量各種環境參數(shù),如(rú)環境氣溫、氣壓、照度和(hé)濕度。這(zhè)個類别中包含氣壓計、光(guāng)度計和(hé)溫度計。
位置傳感器
這(zhè)類傳感器測量設備的物(wù)理位置。這(zhè)個類别中包含屏幕方向傳感器和(hé)磁力計。
您可(kě)以利用 Android 傳感器框架訪問(wèn)設備上(shàng)提供的傳感器并獲取原始傳感器數(shù)據。傳感器框架提供多個類和(hé)接口,可(kě)幫助您執行(xíng)各種與傳感器相關的任務。例如(rú),您可(kě)以使用傳感器框架執行(xíng)以下(xià)操作(zuò):
确定設備上(shàng)有哪些傳感器。
确定單個傳感器的特性,例如(rú)最大量程、制造商、功率要(yào)求和(hé)分辨率。
獲取原始傳感器數(shù)據并定義獲取傳感器數(shù)據的最低(dī)頻(pín)率。
注冊和(hé)取消注冊用于監控傳感器變化的傳感器事件監聽器。
本主題簡要(yào)介紹 Android 平台所支持的傳感器以及傳感器框架。
傳感器簡介
利用 Android 傳感器框架,您可(kě)以訪問(wèn)多種類型的傳感器。有些傳感器基于硬件,有些基于軟件。基于硬件的傳感器是內(nèi)置在手機或平闆設備中的物(wù)理組件。這(zhè)類傳感器通(tōng)過直接測量特定的環境屬性(如(rú)加速度、地(dì)磁場強度或角度變化)來采集數(shù)據。基于軟件的傳感器不是物(wù)理設備,它們隻是模仿基于硬件的傳感器。基于軟件的傳感器從(cóng)一(yī)個或多個基于硬件的傳感器獲取數(shù)據,有時(shí)被稱為(wèi)虛拟傳感器或合成傳感器。比如(rú)線性加速度傳感器和(hé)重力傳感器就是基于軟件的傳感器。表 1 總結了(le) Android 平台支持的傳感器。
很(hěn)少(shǎo)有 Android 設備擁有所有類型的傳感器。例如(rú),大多數(shù)手機設備和(hé)平闆電腦都(dōu)有加速度計和(hé)磁力計,但(dàn)很(hěn)少(shǎo)有氣壓計或溫度計。此外(wài),一(yī)個設備可(kě)以有多個特定類型的傳感器。例如(rú),一(yī)個設備可(kě)以有兩個重力傳感器,分别具有不同的量程。
表 1. Android 平台支持的傳感器類型。
傳感器 | 類型 | 說明(míng) | 常見(jiàn)用途 |
---|---|---|---|
TYPE_ |
硬件 | 測量在所有三個物(wù)理軸向(x、y 和(hé) z)上(shàng)施加在設備上(shàng)的加速力(包括重力),以 m/s2 為(wèi)單位。 | 動态檢測(搖晃、傾斜等)。 |
TYPE_ |
硬件 | 以攝氏度 (°C) 為(wèi)單位測量環境室溫。請(qǐng)參見(jiàn)下(xià)面的備注。 | 監測氣溫。 |
TYPE_ |
軟件或硬件 | 測量在所有三個物(wù)理軸向(x、y、z)上(shàng)施加在設備上(shàng)的重力,單位為(wèi) m/s2。 | 動态檢測(搖晃、傾斜等)。 |
TYPE_ |
硬件 | 測量設備在三個物(wù)理軸向(x、y 和(hé) z)上(shàng)的旋轉速率,以 rad/s 為(wèi)單位。 | 旋轉檢測(旋轉、轉動等)。 |
TYPE_ |
硬件 | 測量環境光(guāng)級(照度),以 lx 為(wèi)單位。 | 控制屏幕亮度。 |
TYPE_ |
軟件或硬件 | 測量在所有三個物(wù)理軸向(x、y 和(hé) z)上(shàng)施加在設備上(shàng)的加速力(不包括重力),以 m/s2 為(wèi)單位。 | 監測單個軸向上(shàng)的加速度。 |
TYPE_ |
硬件 | 測量所有三個物(wù)理軸向(x、y、z)上(shàng)的環境地(dì)磁場,以 μT 為(wèi)單位。 | 創建羅盤。 |
TYPE_ |
軟件 | 測量設備圍繞所有三個物(wù)理軸(x、y、z)旋轉的度數(shù)。從(cóng) API 級别 3 開(kāi)始,您可(kě)以結合使用重力傳感器、地(dì)磁場傳感器和(hé) getRotationMatrix() 方法來獲取設備的傾角矩陣和(hé)旋轉矩陣。 |
确定設備位置。 |
TYPE_ |
硬件 | 測量環境氣壓,以 hPa 或 mbar 為(wèi)單位。 | 監測氣壓變化。 |
TYPE_ |
硬件 | 測量物(wù)體相對于設備顯示屏幕的距離,以 cm 為(wèi)單位。該傳感器通(tōng)常用于确定手機是否被舉到人(rén)的耳邊。 | 通(tōng)話過程中手機的位置。 |
TYPE_ |
硬件 | 測量環境的相對濕度,以百分比 (%) 表示。 | 監測露點、絕對濕度和(hé)相對濕度。 |
TYPE_ |
軟件或硬件 | 通(tōng)過提供設備旋轉矢量的三個元素來檢測設備的屏幕方向。 | 動态檢測和(hé)旋轉檢測。 |
TYPE_ |
硬件 | 測量設備的溫度,以攝氏度 (°C) 為(wèi)單位。該傳感器的實現因設備而異。在 API 級别 14 中,該傳感器已被 TYPE_ 傳感器取代 |
監測溫度。 |
傳感器框架
您可(kě)以利用 Android 傳感器框架來訪問(wèn)這(zhè)些傳感器并獲取傳感器的原始數(shù)據。傳感器框架是 android.hardware 軟件包的一(yī)部分,包含了(le)以下(xià)類和(hé)接口:
SensorManager
您可(kě)以使用這(zhè)個類來創建傳感器服務的實例。該類提供了(le)各種方法來訪問(wèn)和(hé)列出傳感器,注冊和(hé)取消注冊傳感器事件監聽器,以及獲取屏幕方向信息。它還提供了(le)幾個傳感器常量,用于報告傳感器精确度,設置數(shù)據采集頻(pín)率和(hé)校準傳感器。
Sensor
您可(kě)以使用這(zhè)個類來創建特定傳感器的實例。該類提供了(le)各種方法來确定傳感器的特性。
SensorEvent
系統使用這(zhè)個類來創建傳感器事件對象,該對象提供有關傳感器事件的信息。傳感器事件對象中包含以下(xià)信息:原始傳感器數(shù)據、生成事件的傳感器類型、數(shù)據的準确度和(hé)事件的時(shí)間(jiān)戳。
SensorEventListener
您可(kě)以使用此接口創建兩種回調方法,以在傳感器值或傳感器精确度發生變化時(shí)接收通(tōng)知(傳感器事件)。
在典型的應用中,您可(kě)以使用這(zhè)些與傳感器相關的 API 來執行(xíng)兩個基本任務:
識别傳感器和(hé)傳感器特性
如(rú)果應用具有依賴于特定傳感器類型或特性的功能(néng),則在運行(xíng)時(shí)識别傳感器和(hé)傳感器特性非常有用。例如(rú),您可(kě)能(néng)希望識别設備上(shàng)的所有傳感器,以便于停用依賴于不存在的傳感器的應用功能(néng)。同樣,您可(kě)能(néng)希望識别特定類型的所有傳感器,以便選擇可(kě)以為(wèi)應用帶來最佳性能(néng)的傳感器實現。
監控傳感器事件
您可(kě)以通(tōng)過監控傳感器事件來獲取原始傳感器數(shù)據。每當傳感器檢測到它所測量的參數(shù)發生變化時(shí),就會發生傳感器事件。傳感器事件為(wèi)您提供 4 項信息:觸發事件的傳感器的名稱、事件的時(shí)間(jiān)戳、事件的準确度以及觸發事件的原始傳感器數(shù)據。
傳感器可(kě)用性
傳感器的可(kě)用性不僅取決于設備,還取決于 Android 版本。這(zhè)是因為(wèi) Android 傳感器的引入曆經了(le)多個平台版本。例如(rú),許多傳感器是在 Android 1.5(API 級别 3)中引入的,但(dàn)有些傳感器直到 Android 2.3(API 級别 9)才實現并可(kě)供使用。同樣,在 Android 2.3(API 級别 9)和(hé) Android 4.0(API 級别 14)中也引入了(le)幾個傳感器。有兩個傳感器已被棄用,并由更新、更好的傳感器取代。
表 2 總結了(le)每個傳感器在不同平台上(shàng)的可(kě)用性。這(zhè)裏僅列出了(le) 4 個平台,因為(wèi)隻有這(zhè)些平台涉及到傳感器更改。被列為(wèi)棄用的傳感器仍可(kě)在後續平台上(shàng)使用(前提是設備上(shàng)有相關傳感器),這(zhè)符合 Android 的向前兼容性政策。
表 2. 傳感器在不同平台上(shàng)的可(kě)用性。
傳感器 | Android 4.0 (API 級别 14) |
Android 2.3 (API 級别 9) |
Android 2.2 (API 級别 8) |
Android 1.5 (API 級别 3) |
---|---|---|---|---|
TYPE_ |
可(kě)用 | 可(kě)用 | 可(kě)用 | 可(kě)用 |
TYPE_ |
可(kě)用 | 不可(kě)用 | 不可(kě)用 | 不可(kě)用 |
TYPE_ |
可(kě)用 | 可(kě)用 | 不可(kě)用 | 不可(kě)用 |
TYPE_ |
可(kě)用 | 可(kě)用 | 不可(kě)用1 | 不可(kě)用1 |
TYPE_ |
可(kě)用 | 可(kě)用 | 可(kě)用 | 可(kě)用 |
TYPE_ |
可(kě)用 | 可(kě)用 | 不可(kě)用 | 不可(kě)用 |
TYPE_ |
可(kě)用 | 可(kě)用 | 可(kě)用 | 可(kě)用 |
TYPE_ |
可(kě)用2 | 可(kě)用2 | 可(kě)用2 | 可(kě)用 |
TYPE_ |
可(kě)用 | 可(kě)用 | 不可(kě)用1 | 不可(kě)用1 |
TYPE_ |
可(kě)用 | 可(kě)用 | 可(kě)用 | 可(kě)用 |
TYPE_ |
可(kě)用 | 不可(kě)用 | 不可(kě)用 | 不可(kě)用 |
TYPE_ |
可(kě)用 | 可(kě)用 | 不可(kě)用 | 不可(kě)用 |
TYPE_ |
可(kě)用2 | 可(kě)用 | 可(kě)用 | 可(kě)用 |