HarmonyOS Developer 基于ArkTS开发常见问题

丶龙八夷
发布于 2023-4-6 13:53
浏览
0收藏

概述

Ability框架开发

UI开发

网络与连接开发

设备管理开发

数据管理开发

DFX开发

​使用hilog的格式参数类型为%d或者%s时,日志打印为何显示private​

相关资源

Ability框架开发

查看配置文件的所有字段说明

Stage模型下应用配置文件为“app.json5”和“module.json5”,各字段说明请查阅​​应用配置文件(Stage模型)​​。

FA模型下应用配置文件为“config.json”,各字段说明请查阅​​应用配置文件(FA模型)​​。

使Ability可以被其他应用调用

需要在“config.json”文件中将“abilities”字段的“visible”标签设置为“true”。

分别实现JS Ability跳转JS Ability和Java Ability(JS)

JS Ability跳转JS Ability,示例代码参考:

import router from '@system.router'
export default {
  launch() {
    router.push ({
      uri: 'pages/detail/detail',
    });
  },
}

JS Ability跳转Java Ability,使用FeatureAbility.startAbility实现跳转,具体能力说明参考​​JS FA如何调用PA​​。

示例代码参考:

async jumpJavaAbility() {
    var action = {};
    action.bundleName = 'com.huawei.cookbook';
    action.abilityName = 'com.huawei.myjsapplication.JavaAbility';
    await FeatureAbility.startAbility(action);
}

旋转屏幕,如何防止界面生命周期重启

适用于:HarmonyOS SDK 3.1.1.1版本,API8 FA模型

在config.json文件中添加configChanges属性为orientation。

在设备上设置Ability的landscape属性,运行后如何取消小窗显示

适用于:HarmonyOS SDK 3.0版本

由于代码中设置了smartWindowDeviceType为手机、平板,代码如下:

"smartWindowDeviceType": ["phone", "tablet"]

即选择了支持浮窗的设备为手机、平板,所以真机运行时会显示浮窗效果,如不需要显示取消设置即可。

跳转到其他应用时报错“[c4d4d3492eb8531, 0, 0] ContextDeal::startAbility fetchAbilities failed”

适用于:HarmonyOS SDK 3.0版本,API8 FA模型

一般用startAbility,实现如下:

function onStartRemoteAbility() {
console.info('onStartRemoteAbility begin');
let params;
let wantValue = {
    bundleName: 'ohos.samples.etsDemo',
    abilityName: 'ohos.samples.etsDemo.RemoteAbility',
    deviceId: getRemoteDeviceId(),
    parameters: params
};
console.info('onStartRemoteAbility want=' + JSON.stringify(wantValue));
featureAbility.startAbility({
    want: wantValue
}).then((data) => {
console.info('onStartRemoteAbility finished, ' + JSON.stringify(data));
});
console.info('onStartRemoteAbility end');
}

可参考​​PageAbility开发指导​​。

更新SDK后提示 “@ohos.application.Ability”/“@ohos.application.AbilityStage”等模块找不到或者无相关类型声明

问题现象

更新SDK后报错“Cannot find module '@ohos.application.AbilityStage' or its corresponding type declarations”,“Cannot find module '@ohos.application.Ability' or its corresponding type declarations”。

HarmonyOS Developer 基于ArkTS开发常见问题-鸿蒙开发者社区

解决措施

模块名有所变更,可以尝试替换为新的模块名(常用接口如下):

原有接口

新接口

@ohos.application.Ability

@ohos.app.ability.UIAbility

@ohos.application.AbilityStage

@ohos.app.ability.AbilityStage

  • 使用了旧接口@ohos.application.Ability。

import Ability from '@ohos.application.Ability';

可以通过直接修改import,来切换到新的namespace上:

import Ability from '@ohos.app.ability.UIAbility';
  • 使用了旧接口@ohos.application.AbilityStage。

import AbilityStage from '@ohos.application.AbilityStage';

可以通过直接修改import,来切换到新的namespace上:

import AbilityStage from '@ohos.app.ability.AbilityStage'

更多问题处理请参考​变更说明及适配指导​​。

编译hap包时,找不到registerEnvironmentCallback、unregisterEnvironmentCallback等接口

问题现象

编译hap包时,报错Property 'registerEnvironmentCallback' does not exist on type 'ApplicationContext',Property 'unregisterEnvironmentCallback' does not exist on type 'ApplicationContext'。

HarmonyOS Developer 基于ArkTS开发常见问题-鸿蒙开发者社区

解决措施

注册注销回调方法registerEnvironmentCallback、unregisterEnvironmentCallback接口名变更,需要替换为新的on、off接口。

代码示例

如原先使用了接口registerEnvironmentCallback、unregisterEnvironmentCallback:

import UIAbility from '@ohos.app.ability.UIAbility'
import common from '@ohos.app.ability.common';
let callbackId;
export default class EntryAbility extends UIAbility {
    onCreate() {
        console.log("onCreate");
        let environmentCallback = {
            onConfigurationUpdated(config){
                console.log("onConfigurationUpdated config:" + JSON.stringify(config));
            },
            onMemoryLevel(level){
                console.log("onMemoryLevel level:" + level);
            }
        }
        // 1. 获取applicationContext
        let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
        // 2. 注册回调函数environmentCallback
        callbackId = applicationContext.registerEnvironmentCallback(environmentCallback);
        console.log("registerEnvironmentCallback number: " + JSON.stringify(callbackId));
    }
    onDestroy() {
        console.log("onDestroy")
        // 1. 获取applicationContext
        let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
        // 2. 注销回调函数environmentCallback
        applicationContext.unregisterEnvironmentCallback(callbackId, (error) => {
            console.log("unregisterEnvironmentCallback success, err: " + JSON.stringify(error));
        });
    }
    // ...
};

可以修改为使用on、off:

import UIAbility from '@ohos.app.ability.UIAbility'
import common from '@ohos.app.ability.common';
let callbackId;
export default class EntryAbility extends UIAbility {
    onCreate() {
        console.log("onCreate")
        let environmentCallback = {
            onConfigurationUpdated(config) {
                console.log("onConfigurationUpdated config:" + JSON.stringify(config));
            },
            onMemoryLevel(level) {
                console.log("onMemoryLevel level:" + level);
            }
        }
        // 1. 获取applicationContext
        let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
// 2. 注册回调函数environmentCallback
        callbackId = applicationContext.on("environment", environmentCallback);
        console.log("registerEnvironmentCallback number: " + JSON.stringify(callbackId));
    }
    onDestroy() {
        console.log("onDestroy")
        // 1. 获取applicationContext
        let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
        // 2. 注销回调函数environmentCallback
        applicationContext.off("environment", callbackId, (error) => {
            console.log("unregisterEnvironmentCallback success, err: " + JSON.stringify(error));
        });
    }
    // ...
};

网络与连接开发

使用网络图片,运行应用无法加载图片

问题现象

做一个图片展示的demo,使用本地化图片(使用common路径),应用成功加载图片;使用网络化图片(使用图片地址),运行应用无法加载图片。

解决措施

加载网络图片需要授权:ohos.permission.INTERNET。

设备管理开发

如何获取系统API版本号(JS/ArkTS)

示例代码如下:

import deviceInfo from '@ohos.deviceInfo'
let sdkApiVersion = deviceInfo.sdkApiVersion
console.info('sdkApiVersion: '+sdkApiVersion)

开发智能穿戴应用,获取心率信息(JS)

请参考如下代码实现,其中heartRate即为心率值:

sensor.subscribeHeartRate({
  success: function(ret) {
    console.log('get heartrate value:' + ret.heartRate);
  },
  fail: function(data, code) {
    console.log('subscribe heartrate fail, code: ' + code + ', data: ' + data);
  },
});

详情请参考:​​JS API参考-传感器​​。

调用getThermalLevel获取热档位信息,返回undefined(JS/ArkTS)

存在服务异常,目前情况下,只能尝试重新调用。

数据管理开发

如何实现数据存储与获取(JS/ArkTS)

导入相关包:

import dataStorage from '@ohos.data.storage'
import featureAbility from '@ohos.ability.featureAbility'

数据存储:

context.getFilesDir((err, path) => {
    if (err) {
        console.info("Get the storage failed, path: " + path + '/mystore')
        return;
    }
    console.info('getFilesDir successful. path:' + JSON.stringify(path));
    let promisegetSt = dataStorage.getStorage(path + '/mystore')
    promisegetSt.then((storage) => {
        console.info('getStorage successful. storage:' + JSON.stringify(storage));
        storage.putSync('startup', 'auto')
        storage.flushSync()
    }).catch((err) => {
        console.info('getFilesDir failed. err:' + JSON.stringify(err));
        console.info("Get the storage failed, path: " + path + '/mystore')
    })
});

数据获取:

var context = featureAbility.getContext()
context.getFilesDir((err, path) => {
    if (err) {
        console.info("Get the storage failed, path: " + path + '/mystore')
        return;
    }
    console.info('getFilesDir successful. path:' + JSON.stringify(path));
    let promisegetSt = dataStorage.getStorage(path + '/mystore')
    promisegetSt.then((storage) => {
        console.info('getStorage successful. storage:' + JSON.stringify(storage));
        let value = storage.getSync('startup', 'default')
        console.info('getSync successful. value:' + value);
    }).catch((err) => {
        console.info('getFilesDir failed. err:' + JSON.stringify(err));
        console.info("Get the storage failed, path: " + path + '/mystore')
    })
});

rdb关系型数据库中TEXT类型保存超长文本失败

适用于:API8及以下版本

API7以及API8版本对TEXT文本存储长度限制在1024字节,在API9以上的版本中已经放开了限制。

DFX开发

使用hilog的格式参数类型为%d或者%s时,日志打印为何显示private

直接使用%d、%s等格式化参数时,标准系统默认使用private替换真实数据进行打印,防止数据泄露。

如果需要打印出真实数据,需要使用%{public}d替换%d或者%{public}s替换%s。




文章转载自:​​https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/faq-dfx-0000001455344924-V3​

标签
已于2023-4-6 13:53:05修改
收藏
回复
举报
回复
    相关推荐