DevEcoStudio的及其传感器的使用
目录
1. 鸿蒙介绍
HarmonyOS是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机加粗样式、平板、智能穿戴、智慧屏、车机等多种终端设备。
2. 开发工具准备
-
需要前往官网下载Node.js的win64对应的LTS版本,以及DevEco Studio,需要注意的是DevEco Studio需要注册开发者身份后方可下载
-
若是下载时遇到gradle下载失败,可将proxy更换为阿里云的镜像库,或去第三方渠道下载gradle,在Files > Settings > Build, Execution, Deployment > Gradle界面查看gradle路径,将gradle复制到wrapper > dists 目录中对应的gradle文件夹中的临时文件夹
3. 第一个Harmony项目
-
打开DevEco Studio点击Create HarmonyOS Project,选择自己开发的设备和像用的模板
-
进入项目后点击Tools > HVD Manager,首次使用需要下载模拟器相关资源,下载完再点击Tools > HVD Manager则会在浏览器中弹出华为开发者联盟帐号登录界面,建议使用银行卡认证,亲身体验,人工审核真的巨慢
-
在设备中选择自己的设备后点击工具栏的三角形,则可在模拟器上运行自己的首个程序,由于是远程模拟器,所以对内存要求不高,但是对网速有一定要求,网络不好的地区可能会难以稳定运行,且运行时较为卡顿,若是有条件建议真机调试,模拟器在使用60分钟后会自动关闭,需手动重启
4. DevEcoStudio 和 AndroidStudio的不同
-
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"
}
]
}
}
-
AbilitySlice
鸿蒙项目中的Ability类似android的Activity,但是分为Ability和AbilitySlice,如我们最初的helloworld项目中的MainAbility和MainAbilitySlice分别继承了Ability和AbilitySlice,MainAbility中通过setMainRoute调用MainAbilitySlice的setUIContent显示页面,做个比喻Ability相当于身体而AbilitySlice则为皮肤
-
名词差异
为了方便android开发者转至鸿蒙,故其中的名词大多和android相差无几,不过还是有些许差异,鸿蒙文件目录中的entry类似于app,项目中的ability类似于activity,onStart类似于onCreate,resourse中的element类似于values
5. 传感器使用
"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"
}
}
]
@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;
}
}
}
@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. 常见问题
-
Error Deploying HAP
config.json中存在deviceType,可以更改它的值来适应不同设备,如wearable指智能手表,phone指手机,car指车载设备,忘记更改可能会出现以下错误
-
同时安装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内核安全,虽然现在可能对比安卓处于劣势,不过在面对美国制裁的今日,鸿蒙作为备选方案我个人还是看好它未来的发展
作者 :郑凯文
原文地址