鴻蒙OS 傳感器開發(fā)指導(dǎo)

2020-09-18 15:47 更新

場景介紹

  • 通過方向傳感器數(shù)據(jù),可以感知用戶設(shè)備當(dāng)前的朝向,從而達(dá)到為用戶指明方位的目的。
  • 通過重力和陀螺儀傳感器數(shù)據(jù),能感知設(shè)備傾斜和旋轉(zhuǎn)量,提高用戶在游戲場景中的體驗。
  • 通過接近光傳感器數(shù)據(jù),感知距離遮擋物的距離,使設(shè)備能夠自動亮滅屏,達(dá)到防誤觸目的。
  • 通過氣壓計傳感器數(shù)據(jù),可以準(zhǔn)確的判斷設(shè)備當(dāng)前所處的海拔。
  • 通過環(huán)境光傳感器數(shù)據(jù),設(shè)備能夠?qū)崿F(xiàn)背光自動調(diào)節(jié)。

接口說明

HarmonyOS 傳感器提供的功能有:查詢傳感器的列表、訂閱/取消訂閱傳感器數(shù)據(jù)、查詢傳感器的最小采樣時間間隔、執(zhí)行控制命令。

以訂閱方向類別的傳感器數(shù)據(jù)為例,本節(jié)示例涉及的接口如下:

接口名 描述
getAllSensors() 獲取屬于方向類別的傳感器列表。
getAllSensors(int) 獲取屬于方向類別中特定類型的傳感器列表。
getSingleSensor(int) 查詢方向類別中特定類型的默認(rèn)sensor(如果存在多個則返回第一個)。
setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long) 以設(shè)定的采樣間隔訂閱給定傳感器的數(shù)據(jù)。
setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long, long) 以設(shè)定的采樣間隔和時延訂閱給定傳感器的數(shù)據(jù)。
releaseSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation) 取消訂閱指定傳感器的數(shù)據(jù)。
releaseSensorDataCallback(ICategoryOrientationDataCallback) 取消訂閱的所有傳感器數(shù)據(jù)。
接口名 描述
getSensorMinSampleInterval(int) 查詢給定傳感器的最小采樣間隔。
runCommand(int, int, int) 針對某個傳感器執(zhí)行命令,刷新傳感器的數(shù)據(jù)。

開發(fā)步驟

權(quán)限配置

如果設(shè)備上使用了[表2]中的傳感器,需要請求相應(yīng)的權(quán)限,開發(fā)者才能獲取到傳感器數(shù)據(jù)。

敏感級別 傳感器 HarmonyOS權(quán)限名 權(quán)限描述
system_grant 加速度傳感器、加速度未校準(zhǔn)傳感器、線性加速度傳感器 ohos.permission.ACCELEROMETER 允許訂閱Motion組對應(yīng)的加速度傳感器的數(shù)據(jù)。
user_grant 計步器 ohos.permission.ACTIVITY_MOTION 允許訂閱運動狀態(tài)。

開發(fā)者需要在 config.json 里面配置權(quán)限:

  • 開發(fā)者如果需要獲取加速度的數(shù)據(jù),需要進(jìn)行如下權(quán)限配置。

  1. "reqPermissions": [
  2. {
  3. "name": "ohos.permission.ACCELEROMETER",
  4. "reason": "",
  5. "usedScene": {
  6. "ability": [
  7. ".MainAbility"
  8. ],
  9. "when": "inuse"
  10. }
  11. }
  12. ]

  • 對于需要用戶授權(quán)的權(quán)限,如計步器傳感器,需要進(jìn)行如下權(quán)限配置。

  1. "reqPermissions": [
  2. {
  3. "name": "ohos.permission.ACTIVITY_MOTION",
  4. "reason": "",
  5. "usedScene": {
  6. "ability": [
  7. ".MainAbility"
  8. ],
  9. "when": "inuse"
  10. }
  11. }
  12. ]

由于敏感權(quán)限需要用戶授權(quán),因此,開發(fā)者在應(yīng)用啟動時或者調(diào)用訂閱數(shù)據(jù)接口前,需要調(diào)用權(quán)限檢查和請求權(quán)限接口。

  1. @Override
  2. public void onStart(Intent intent) {
  3. super.onStart(intent);
  4. if (verifySelfPermission("ohos.permission.ACTIVITY_MOTION") != 0) {
  5. if (canRequestPermission("ohos.permission.ACTIVITY_MOTION")) {
  6. requestPermissionsFromUser(new String[] {"ohos.permission.ACTIVITY_MOTION"}, 1);
  7. }
  8. }
  9. // ...
  10. }
  11. @Override
  12. public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions,
  13. int[] grantResults) {
  14. switch (requestCode) {
  15. case 1: {
  16. // 匹配requestPermissionsFromUser的requestCode
  17. if (grantResults.length > 0 && grantResults[0] == 0) {
  18. // 權(quán)限被授予
  19. } else {
  20. // 權(quán)限被拒絕
  21. }
  22. return;
  23. }
  24. }
  25. }

使用傳感器

以使用方向類別的傳感器為例,運動類、環(huán)境類、健康類等類別的傳感器使用方法類似。

  1. 獲取待訂閱數(shù)據(jù)的傳感器。

  1. 創(chuàng)建傳感器回調(diào)。

  1. 訂閱傳感器數(shù)據(jù)。

  1. 接收并處理傳感器數(shù)據(jù)。

  1. 取消訂閱傳感器數(shù)據(jù)。

  1. private Button btnSubscribe;
  2. private Button btnUnsubscribe;
  3. private CategoryOrientationAgent categoryOrientationAgent = new CategoryOrientationAgent();
  4. private ICategoryOrientationDataCallback orientationDataCallback;
  5. private CategoryOrientation orientationSensor;
  6. private long interval = 100000000;
  7. @Override
  8. public void onStart(Intent intent) {
  9. super.onStart(intent);
  10. super.setUIContent(ResourceTable.Layout_sensor_layout);
  11. findComponent(rootComponent);
  12. // 創(chuàng)建傳感器回調(diào)對象。
  13. orientationDataCallback = new ICategoryOrientationDataCallback() {
  14. @Override
  15. public void onSensorDataModified(CategoryOrientationData categoryOrientationData) {
  16. // 對接收的categoryOrientationData傳感器數(shù)據(jù)對象解析和使用
  17. int dim = categoryOrientationData.getSensorDataDim(); //獲取傳感器的維度信息
  18. float degree = categoryOrientationData.getValues()[0]; // 獲取方向類傳感器的第一維數(shù)據(jù)
  19. }
  20. @Override
  21. public void onAccuracyDataModified(CategoryOrientation categoryOrientation, int i) {
  22. // 使用變化的精度
  23. }
  24. @Override
  25. public void onCommandCompleted(CategoryOrientation categoryOrientation) {
  26. // 傳感器執(zhí)行命令回調(diào)
  27. }
  28. };
  29. btnSubscribe.setClickedListener(v -> {
  30. // 獲取傳感器對象,并訂閱傳感器數(shù)據(jù)
  31. orientationSensor = categoryOrientationAgent.getSingleSensor(
  32. CategoryOrientation.SENSOR_TYPE_ORIENTATION);
  33. if (orientationSensor != null) {
  34. categoryOrientationAgent.setSensorDataCallback(
  35. orientationDataCallback, orientationSensor, interval);
  36. }
  37. });
  38. // 取消訂閱傳感器數(shù)據(jù)
  39. btnUnsubscribe.setClickedListener(v -> {
  40. if (orientationSensor != null) {
  41. categoryOrientationAgent.releaseSensorDataCallback(
  42. orientationDataCallback, orientationSensor);
  43. }
  44. });
  45. }
  46. private void findComponent(Component component) {
  47. btnSubscribe = (Button) component.findComponentById(Resource.Id.btnSubscribe);
  48. btnUnsubscribe = (Button) component.findComponentById(Resource.Id.btnUnsubscribe);
  49. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號