生活随笔
收集整理的這篇文章主要介紹了
HarmonyOS之设备传感器的功能和使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、基本概念
- HarmonyOS 傳感器是應用訪問底層硬件傳感器的一種設備抽象概念。開發者根據傳感器提供的 Sensor API,可以查詢設備上的傳感器,訂閱傳感器的數據,并根據傳感器數據定制相應的算法,開發各類應用,比如指南針、運動健康、游戲等。
- 根據傳感器的用途,可以將傳感器分為六大類:運動類傳感器、環境類傳感器、方向類傳感器、光線類傳感器、健康類傳感器、其他類傳感器(如霍爾傳感器),每一大類傳感器包含不同類型的傳感器,某種類型的傳感器可能是單一的物理傳感器,也可能是由多個物理傳感器復合而成。
- 傳感器如下表所示:
分類API類名傳感器類型中文描述說明主要用途
運動類ohos.sensor.agent.
CategoryMotionAgentSENSOR_TYPE_ACCELEROMETER加速度傳感器測量三個物理軸(x、y 和 z)上,施加在設備上的加速度(包括重力加速度),單位 : m/s2檢測運動狀態
SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED未校準加速度傳感器測量三個物理軸(x、y 和 z)上,施加在設備上的未校準的加速度(包括重力加速度),單位 : m/s2檢測加速度偏差估值
SENSOR_TYPE_LINEAR_ACCELERATION線性加速度傳感器測量三個物理軸(x、y 和 z)上,施加在設備上的線性加速度(不包括重力加速度),單位 : m/s2檢測每個單軸方向上的線性加速度
SENSOR_TYPE_GRAVITY重力傳感器測量三個物理軸(x、y 和 z)上,施加在設備上的重力加速度,單位 : m/s2測量重力大小
SENSOR_TYPE_GYROSCOPE陀螺儀傳感器測量三個物理軸(x、y 和 z)上,設備的旋轉角速度,單位 : rad/s測量旋轉的角速度
SENSOR_TYPE_GYROSCOPE_UNCALIBRATED未校準陀螺儀傳感器測量三個物理軸(x、y 和 z)上,設備的未校準旋轉角速度,單位 : rad/s測量旋轉的角速度及偏差估值
SENSOR_TYPE_SIGNIFICANT_MOTION大幅度動作傳感器測量三個物理軸(x、y 和 z)上,設備是否存在大幅度運動;如果取值為1則代表存在大幅度運動,取值為0則代表沒有大幅度運動用于檢測設備是否存在大幅度運動
SENSOR_TYPE_DROP_DETECTION跌落檢測傳感器檢測設備的跌落狀態;如果取值為1則代表發生跌落,取值為0則代表沒有發生跌落用于檢測設備是否發生了跌落
SENSOR_TYPE_PEDOMETER_DETECTION計步器檢測傳感器檢測用戶的計步動作;如果取值為1則代表用戶產生了計步行走的動作;取值為0則代表用戶沒有發生運動用于檢測用戶是否有計步的動作
SENSOR_TYPE_PEDOMETER計步器傳感器統計用戶的行走步數用于提供用戶行走的步數數據
環境類ohos.sensor.agent.
CategoryEnvironmentAgentSENSOR_TYPE_AMBIENT_TEMPERATURE環境溫度傳感器測量環境溫度,單位 : 攝氏度 (°C)測量環境溫度
SENSOR_TYPE_MAGNETIC_FIELD磁場傳感器測量三個物理軸向(x、y、z)上,環境地磁場,單位 : μT創建指南針
SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED未校準磁場傳感器測量三個物理軸向(x、y、z)上,未校準環境地磁場,單位 : μT測量地磁偏差估值
SENSOR_TYPE_HUMIDITY濕度傳感器測量環境的相對濕度,以百分比 (%) 表示監測露點、絕對濕度和相對濕度
SENSOR_TYPE_BAROMETER氣壓計傳感器測量環境氣壓,單位 : hPa 或 mbar測量環境氣壓
SENSOR_TYPE_SAR比吸收率傳感器測量比吸收率,單位:W/kg測量設備的電磁波能量吸收比值
方向類ohos.sensor.agent.
CategoryOrientationAgentSENSOR_TYPE_6DOF6自由度傳感器測量上下、前后、左右方向上的位移,單位:m或mm;測量俯仰、偏擺、翻滾的角度,單位:rad檢測設備的三個平移自由度以及旋轉自由度,用于目標定位追蹤,如:VR
SENSOR_TYPE_SCREEN_ROTATION屏幕旋轉傳感器檢測設備屏幕的旋轉狀態用于檢測設備屏幕是否發生了旋轉
SENSOR_TYPE_DEVICE_ORIENTATION設備方向傳感器測量設備的旋轉方向,單位:rad用于檢測設備旋轉方向的角度值
SENSOR_TYPE_ORIENTATION方向傳感器測量設備圍繞所有三個物理軸(x、y、z)旋轉的角度值,單位:rad用于提供屏幕旋轉的3個角度值
SENSOR_TYPE_ROTATION_VECTOR旋轉矢量傳感器測量設備旋轉矢量,復合傳感器:由加速度傳感器、磁場傳感器、陀螺儀傳感器合成檢測設備相對于東北天坐標系的方向
SENSOR_TYPE_GAME_ROTATION_VECTOR游戲旋轉矢量傳感器測量設備游戲旋轉矢量,復合傳感器:由加速度傳感器、陀螺儀傳感器合成應用于游戲場景
SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR地磁旋轉矢量傳感器測量設備地磁旋轉矢量,復合傳感器:由加速度傳感器、磁場傳感器合成用于測量地磁旋轉矢量
光線類ohos.sensor.agent.
CategoryLightAgentSENSOR_TYPE_PROXIMITY接近光傳感器測量可見物體相對于設備顯示屏的接近或遠離狀態通話中設備相對人的位置
SENSOR_TYPE_TOFToF傳感器測量光在介質中行進一段距離所需的時間人臉識別
SENSOR_TYPE_AMBIENT_LIGHT環境光傳感器測量設備周圍光線強度,單位:lux自動調節屏幕亮度,檢測屏幕上方是否有遮擋
SENSOR_TYPE_COLOR_TEMPERATURE色溫傳感器測量環境中的色溫應用于設備的影像處理
SENSOR_TYPE_COLOR_RGBRGB顏色傳感器測量環境中的RGB顏色值通過三原色的反射比率實現顏色檢測
SENSOR_TYPE_COLOR_XYZXYZ顏色傳感器測量環境中的XYZ顏色值用于辨識真色色點,還原色彩更真實
健康類ohos.sensor.agent.
CategoryBodyAgentSENSOR_TYPE_HEART_RATE心率傳感器測量用戶的心率數值用于提供用戶的心率健康數據
SENSOR_TYPE_WEAR_DETECTION佩戴檢測傳感器檢測用戶是否佩戴用于檢測用戶是否佩戴智能穿戴
其他類ohos.sensor.agent.
CategoryOtherAgentSENSOR_TYPE_HALL霍爾傳感器測量設備周圍是否存在磁力吸引設備的皮套模式
SENSOR_TYPE_GRIP_DETECTOR手握檢測傳感器檢測設備是否有抓力施加用于檢查設備側邊是否被手握住
SENSOR_TYPE_MAGNET_BRACKET磁鐵支架傳感器檢測設備是否被磁吸檢測設備是否位于車內或者室內
SENSOR_TYPE_PRESSURE_DETECTOR按壓檢測傳感器檢測設備是否有壓力施加用于檢測設備的正上方是否存在按壓
二、運作機制和權限
① 運作機制
- HarmonyOS 傳感器包含如下四個模塊:Sensor API、Sensor Framework、Sensor Service、HD_IDL 層。
- HarmonyOS 傳感器運作機制如下所示:
- Sensor API:提供傳感器的基礎 API,主要包含查詢傳感器的列表、訂閱/取消傳感器的數據、執行控制命令等,簡化應用開發。
- Sensor Framework:主要實現傳感器的訂閱管理,數據通道的創建、銷毀、訂閱與取消訂閱,實現與 SensorService 的通信。
- Sensor Service:主要實現 HD_IDL 層數據接收、解析、分發,前后臺的策略管控,對該設備 Sensor 的管理,Sensor 權限管控等。
- HD_IDL 層:對不同的 FIFO、頻率進行策略選擇,以及對不同設備的適配。
② 權限
- 針對某些傳感器,開發者需要請求相應的權限,才能獲取到相應傳感器的數據。
- 傳感器權限如下表所示:
傳感器權限名敏感級別權限描述
| 加速度傳感器、加速度未校準傳感器、線性加速度傳感器 | ohos.permission.ACCELEROMETER | system_grant | 允許訂閱Motion組對應的加速度傳感器的數據 |
| 陀螺儀傳感器、陀螺儀未校準傳感器 | ohos.permission.GYROSCOPE | system_grant | 允許訂閱Motion組對應的陀螺儀傳感器的數據 |
| 計步器 | ohos.permission.ACTIVITY_MOTION | user_grant | 允許訂閱運動狀態 |
| 心率 | ohos.permission.READ_HEALTH_DATA | user_grant | 允許讀取健康數據 |
- 傳感器數據訂閱和取消訂閱接口成對調用,當不再需要訂閱傳感器數據時,開發者需要調用取消訂閱接口進行資源釋放。
三、應用場景
- 通過方向傳感器數據,可以感知用戶設備當前的朝向,從而達到為用戶指明方位的目的。
- 通過重力和陀螺儀傳感器數據,能感知設備傾斜和旋轉量,提高用戶在游戲場景中的體驗。
- 通過接近光傳感器數據,感知距離遮擋物的距離,使設備能夠自動亮滅屏,達到防誤觸目的。
- 通過氣壓計傳感器數據,可以準確的判斷設備當前所處的海拔。
- 通過環境光傳感器數據,設備能夠實現背光自動調節。
- 通過霍爾傳感器數據,設備可以實現皮套功能等。
四、傳感器的 API
- HarmonyOS 傳感器提供的功能有:查詢傳感器的列表、訂閱/取消訂閱傳感器數據、查詢傳感器的最小采樣時間間隔、執行控制命令。
- CategoryOrientationAgent 接口如下:
接口名描述
| getAllSensors() | 獲取屬于方向類別的傳感器列表 |
| getAllSensors(int) | 獲取屬于方向類別中特定類型的傳感器列表 |
| getSingleSensor(int) | 查詢方向類別中特定類型的默認sensor(如果存在多個則返回第一個) |
| setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long) | 以設定的采樣間隔訂閱給定傳感器的數據 |
| setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long, long) | 以設定的采樣間隔和時延訂閱給定傳感器的數據 |
| releaseSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation) | 取消訂閱指定傳感器的數據 |
| releaseSensorDataCallback(ICategoryOrientationDataCallback) | 取消訂閱的所有傳感器數據 |
接口名描述
| getSensorMinSampleInterval(int) | 查詢給定傳感器的最小采樣間隔 |
| runCommand(int, int, int) | 針對某個傳感器執行命令,刷新傳感器的數據 |
- CategoryEnvironmentData 的主要接口如下:
接口名描述
| getDeviceAltitude(float, float ) | 根據氣壓值獲取設備所在位置的海拔高度 |
- CategoryOrientationData 的主要接口如下:
接口名描述
| getDeviceRotationMatrix(float[], float[]) | 根據旋轉矢量獲取旋轉矩陣 |
| getDeviceOrientation(float[], float[]) | 根據旋轉矩陣獲取設備的方向 |
五、傳感器的使用流程
① 權限配置
- 如果設備上使用了上文中“傳感器權限列表”中的傳感器,需要請求相應的權限,開發者才能獲取到傳感器數據。
- 不同敏感級別的傳感器舉例:
敏感級別傳感器權限名權限描述
| system_grant | 加速度傳感器、加速度未校準傳感器、線性加速度傳感器 | ohos.permission.ACCELEROMETER | 允許訂閱Motion組對應的加速度傳感器的數據 |
| user_grant | 計步器 | ohos.permission.ACTIVITY_MOTION | 允許訂閱運動狀態 |
"reqPermissions": [{"name": "ohos.permission.ACCELEROMETER","reason": "","usedScene": {"ability": [".MainAbility"],"when": "inuse"}}]
-
- 對于需要用戶授權的權限,如計步器傳感器,需要進行如下權限配置:
"reqPermissions": [{"name": "ohos.permission.ACTIVITY_MOTION","reason": "","usedScene": {"ability": [".MainAbility"],"when": "inuse"}}]
- 由于敏感權限需要用戶授權,因此在應用啟動時或者調用訂閱數據接口前,需要調用權限檢查和請求權限接口:
@Overridepublic
void onStart(Intent intent
) {super.onStart(intent
);if (verifySelfPermission("ohos.permission.ACTIVITY_MOTION") != 0) {if (canRequestPermission("ohos.permission.ACTIVITY_MOTION")) {requestPermissionsFromUser(new String
[] {"ohos.permission.ACTIVITY_MOTION"}, 1);}}}@Overridepublic
void onRequestPermissionsFromUserResult(int requestCode
, String
[] permissions
,int[] grantResults
) {if (requestCode
== 1) {if (grantResults
.length
> 0 && grantResults
[0] == 0) {} else {}}}
② 使用傳感器
- 以使用方向類別的傳感器為例,運動類、環境類、健康類等類別的傳感器使用方法類似:
-
-
-
-
-
private
static final
long INTERVAL
= 100000000L;private Button btnSubscribe
;private Button btnUnsubscribe
;private CategoryOrientationAgent categoryOrientationAgent
= new
CategoryOrientationAgent();private ICategoryOrientationDataCallback orientationDataCallback
;private CategoryOrientation orientationSensor
;private
int matrix_length
= 9;private
int rotationVectorLength
= 9;@Overridepublic
void onStart(Intent intent
) {super.onStart(intent
);super.setUIContent(ResourceTable
.Layout_sensor_layout
);findComponent(rootComponent
);orientationDataCallback
= new
ICategoryOrientationDataCallback() {@Overridepublic
void onSensorDataModified(CategoryOrientationData categoryOrientationData
) {int dim
= categoryOrientationData
.getSensorDataDim(); float degree
= categoryOrientationData
.getValues()[0]; float[] rotationMatrix
= new
float[matrix_length
];CategoryOrientationData
.getDeviceRotationMatrix(rotationMatrix
, categoryOrientationData
.values
); float[] rotationAngle
= new
float[rotationVectorLength
];rotationAngle
= CategoryOrientationData
.getDeviceOrientation(rotationMatrix
, rotationAngle
); }@Overridepublic
void onAccuracyDataModified(CategoryOrientation categoryOrientation
, int index
) {}@Overridepublic
void onCommandCompleted(CategoryOrientation categoryOrientation
) {}};btnSubscribe
.setClickedListener(v
-> {orientationSensor
= categoryOrientationAgent
.getSingleSensor(CategoryOrientation
.SENSOR_TYPE_ORIENTATION
);if (orientationSensor
!= null
) {categoryOrientationAgent
.setSensorDataCallback(orientationDataCallback
, orientationSensor
, INTERVAL
);}});btnUnsubscribe
.setClickedListener(v
-> {if (orientationSensor
!= null
) {categoryOrientationAgent
.releaseSensorDataCallback(orientationDataCallback
, orientationSensor
);}});}private
void findComponent(Component component
) {btnSubscribe
= (Button
) component
.findComponentById(ResourceTable
.Id_btnSubscribe
);btnUnsubscribe
= (Button
) component
.findComponentById(ResourceTable
.Id_btnUnsubscribe
);}
總結
以上是生活随笔為你收集整理的HarmonyOS之设备传感器的功能和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。