DevEcoStudio的及其传感器的使用

DevEcoStudio的及其传感器的使用

1. 鸿蒙介绍

HarmonyOS是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机加粗样式、平板、智能穿戴、智慧屏、车机等多种终端设备。

2. 开发工具准备

  1. 需要前往官网下载Node.js的win64对应的LTS版本,以及DevEco Studio,需要注意的是DevEco Studio需要注册开发者身份后方可下载
    在这里插入图片描述
    在这里插入图片描述

  2. 若是下载时遇到gradle下载失败,可将proxy更换为阿里云的镜像库,或去第三方渠道下载gradle,在Files > Settings > Build, Execution, Deployment > Gradle界面查看gradle路径,将gradle复制到wrapper > dists 目录中对应的gradle文件夹中的临时文件夹
    在这里插入图片描述

3. 第一个Harmony项目

  1. 打开DevEco Studio点击Create HarmonyOS Project,选择自己开发的设备和像用的模板
    在这里插入图片描述

  2. 进入项目后点击Tools > HVD Manager,首次使用需要下载模拟器相关资源,下载完再点击Tools > HVD Manager则会在浏览器中弹出华为开发者联盟帐号登录界面,建议使用银行卡认证,亲身体验,人工审核真的巨慢
    在这里插入图片描述

  3. 在设备中选择自己的设备后点击工具栏的三角形,则可在模拟器上运行自己的首个程序,由于是远程模拟器,所以对内存要求不高,但是对网速有一定要求,网络不好的地区可能会难以稳定运行,且运行时较为卡顿,若是有条件建议真机调试,模拟器在使用60分钟后会自动关闭,需手动重启
    在这里插入图片描述

4. DevEcoStudio 和 AndroidStudio的不同

  1. config.json

    config.json在DevEcoStudio中和AndroidStudio中的AndroidMainifest.xml作用相似,但是一个为json语言,config.json由xml,由“app”、“deviceConfig”和“module”三个部分组成,app为全局的配置信息,类似android的builde.gradle的defaultConfig,表明应用版本号以及运行所需要的api版本和目标api版本等等,deviceConfig包含在具体设备上的应用配置信息,module对象包含HAP包的配置信息
{
    
    
  "app": {
    
    
    "bundleName": "com.example.myapplication", // 包名
    "vendor": "example", //对开发厂商的描述
    "version": {
    
     //版本信息
      "code": 1,
      "name": "1.0"
    },
    "apiVersion": {
    
     //api版本信息
      "compatible": 3,
      "target": 4,
      "releaseType": "Beta1"
    }
  },
  "deviceConfig": {
    
    },//应用配置信息
  "module": {
    
     //HAP 包的配置信息
    "package": "com.example.myapplication",
    "name": ".MyApplication",
    "deviceType": [
      "phone"
    ],
    "distro": {
    
     //HAP具体描述
      "deliveryWithInstall": true,
      "moduleName": "entry",
      "moduleType": "entry"
    },
    "abilities": [
      {
    
    
        "skills": [ //Ability能接受Intent的特征
          {
    
    
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "orientation": "unspecified",
        "name": "com.example.myapplication.MainAbility",
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "MyApplication",
        "type": "page",
        "launchType": "standard"
      }
    ]
  }
}
  1. AbilitySlice

    鸿蒙项目中的Ability类似android的Activity,但是分为Ability和AbilitySlice,如我们最初的helloworld项目中的MainAbility和MainAbilitySlice分别继承了Ability和AbilitySlice,MainAbility中通过setMainRoute调用MainAbilitySlice的setUIContent显示页面,做个比喻Ability相当于身体而AbilitySlice则为皮肤
    在这里插入图片描述在这里插入图片描述
  2. 名词差异

    为了方便android开发者转至鸿蒙,故其中的名词大多和android相差无几,不过还是有些许差异,鸿蒙文件目录中的entry类似于app,项目中的ability类似于activity,onStart类似于onCreate,resourse中的element类似于values

5. 传感器使用

  1. 权限配置

    需要在config.json中先进行配置,注意reqPermissions与abilities为同级

    "abilities": [
      {
    
    
        "skills": [
          {
    
    
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "orientation": "unspecified",
        "name": "com.example.myapplication.MainAbility",
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "MyApplication",
        "type": "page",
        "launchType": "standard"
      }
    ],
    "reqPermissions": [
      {
    
    
        "name": "ohos.permission.ACCELEROMETER",//授予加速器权限
        "reason": "",
        "usedScene": {
    
    
          "ability": [
            ".MainAbility"
          ],
          "when": "inuse"
        }
      }
    ]
  1. 权限检查和请求

@Override
public 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);
        }
    }
    // ...
}
 
@Override
public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions,
        int[] grantResults) {
    
    
    switch (requestCode) {
    
    
        case 1: {
    
    
            // 匹配requestPermissionsFromUser的requestCode
            if (grantResults.length > 0 && grantResults[0] == 0) {
    
    
                // 权限被授予
            } else {
    
    
                // 权限被拒绝
            }
            return;
        }
    }
}
  1. 使用传感器

@Override
public void onStart(Intent intent) {
    
    
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_sensor_layout);
    findComponent(rootComponent);
 
    // 创建传感器回调对象。
    orientationDataCallback = new ICategoryOrientationDataCallback() {
    
    
        @Override
        public 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); // 获取设备的方向
        }
 
        @Override
        public void onAccuracyDataModified(CategoryOrientation categoryOrientation, int i) {
    
    
            // 使用变化的精度
        }
 
        @Override
        public 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(Resource.Id.btnSubscribe);
    btnUnsubscribe = (Button) component.findComponentById(Resource.Id.btnUnsubscribe);
}

6. 常见问题

  1. Error Deploying HAP

    config.json中存在deviceType,可以更改它的值来适应不同设备,如wearable指智能手表,phone指手机,car指车载设备,忘记更改可能会出现以下错误
    在这里插入图片描述
  2. 同时安装DevEcoStudio1.0,DevEcoStudio2.0时报错

    同时安装多个DevEcoStudio版本时需要选择新的安装路径,并修改新安装DevEco Studio的“idea.properties”中的缓存路径

7. 注意事项

DevEco Studio 1.0 和2.0 不同,开发鸿蒙应用使用2.0,且对比1.0缺失部分功能,如平行视界等,我本来想试试平行视界,鼓捣了半天才发现只有DevEco Studio 1.0有MagicWindow
在这里插入图片描述

8. 总结

鸿蒙作为打通移动领域和物联网领域的操作系统,极大的方便了开发者在众多智能终端中开发应用,同时微内核可显著提升TEE内核安全,虽然现在可能对比安卓处于劣势,不过在面对美国制裁的今日,鸿蒙作为备选方案我个人还是看好它未来的发展

作者 :郑凯文
原文地址

猜你喜欢

转载自blog.csdn.net/fjnu_se/article/details/112170665