“20eed5401a5d7d29b1397def1c6ce9952d985076”上不存在“paddle/fluid/operators/where_op.h”
提交 2a962933 编写于 作者: Z zengyawen

update docs

Signed-off-by: Nzengyawen <zengyawen1@huawei.com>
上级 c7170386
# 常见问题 # 常见问题
- [开发语言常见问题](faqs-language.md) - [Ability开发常见问题](faqs-ability.md)
- [Ability框架开发常见问题](faqs-ability.md) - [ArkUI框架开发常见问题](faqs-arkui.md)
- [应用程序包管理开发常见问题](faqs-bundle.md) - [Web开发常见问题](faqs-arkui-web.md)
- [ArkUI组件(ArkTS)开发常见问题](faqs-ui-ets.md) - [包管理开发常见问题](faqs-bundle-management.md)
- [ArkUI Web组件(ArkTS)开发常见问题](faqs-web-arkts.md) - [资源管理开发常见问题](faqs-globalization.md)
- [UI框架(JS)开发常见问题](faqs-ui-js.md) - [事件通知开发常见问题](faqs-event-notification.md)
- [公共事件与通知开发常见问题](faqs-event-notification.md)
- [图形图像开发常见问题](faqs-graphics.md) - [图形图像开发常见问题](faqs-graphics.md)
- [窗口管理开发常见问题](faqs-window-manager.md)
- [媒体开发常见问题](faqs-multimedia.md)
- [安全基础能力开发常见问题](faqs-security.md)
- [程序访问控制开发常见问题](faqs-ability-access-control.md)
- [数据管理开发常见问题](faqs-distributed-data-management.md)
- [文件管理开发常见问题](faqs-file-management.md) - [文件管理开发常见问题](faqs-file-management.md)
- [媒体开发常见问题](faqs-media.md) - [网络管理开发常见问题](faqs-network-management.md)
- [网络与连接开发常见问题](faqs-connectivity.md)
- [数据管理开发常见问题](faqs-data-management.md)
- [设备管理开发常见问题](faqs-device-management.md)
- [DFX开发常见问题](faqs-dfx.md) - [DFX开发常见问题](faqs-dfx.md)
- [国际化开发常见问题](faqs-international.md) - [泛Sensor服务开发常见问题](faqs-sensor.md)
- [Native API使用常见问题](faqs-native.md) - [启动恢复开发常见问题](faqs-startup.md)
- [三四方库使用常见问题](faqs-third-party-library.md) - [分布式DeviceProfrofile开发常见问题](faqs-distributed-device-profile.md)
- [IDE使用常见问题](faqs-ide.md) - [SDK使用常见问题](faqs-sdk.md)
- [开发板使用常见问题](faqs-development-board.md) - [三四方库使用常见问题](faqs-third-fourth-party-library.md)
# 程序访问控制开发常见问题
## 在系统设置修改了应用权限,应用能否监听到权限变化
适用于:OpenHarmony 3.1 Beta5 API 9
在系统设置修改了应用权限,三方应用无法监听到权限变化的。
# Ability框架开发常见问题 # Ability开发常见问题
## 拉起Ability在界面上没反应 ## 如何获取设备横竖屏的状态变化通知
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 适用于:OpenHarmony 3.2 Beta5 API 9
1. 如果是通过startAbility的方式拉起,检查want中abilityName字段是否携带了bundleName做前缀,如果有,请删除; **问题现象**
2. 检查MainAbility.ts文件中onWindowStageCreate方法配置的Ability首页文件是否在main_pages.json中有定义,如果没有定义,请补齐; 当设备发生横竖屏变化时,开发者应如何获取到变化的事件通知?
3. SDK和OpenHarmony SDK系统推荐同一天的版本。 **解决措施**
参考文档:[OpenHarmony版本转测试信息](https://gitee.com/openharmony-sig/oh-inner-release-management/blob/master/Release-Testing-Version.md) 使用UIAbility.onConfigurationUpdate\(\)回调方法订阅系统环境变量的变化(包括语言,颜色模式,屏幕方向等)。
## 如何将Ability的UI界面设置成透明 **参考文档**
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 [订阅系统环境变量的变化](../application-models/subscribe-system-environment-variable-changes.md#在uiability组件中订阅回调)
将最上层容器组件背景色设置为透明,然后通过设置XComponent组件的opacity属性值为0.01来实现。 ## 点击服务卡片如何跳转至指定的页面
示例: 适用于:OpenHarmony 3.2 Beta5 API 9
``` **解决措施**
build() {
Stack() { 参考文档,配置卡片事件,指定需要跳转的目标Ability,然后在目标UIAbility的onWindowStageCreate\(\)中调用loadContent跳转至指定的page页面。
XComponent({
id: 'componentId', **参考链接**
type: 'surface',
}) [开发卡片事件](../application-models/arkts-ui-widget-configuration.md)
.width('100%')
.height('100%') ## 如何在Stage模型中创建后台服务
.opacity(0.01)
// 页面内容 适用于:Openharmony 3.2 Beta5
}
.width('100%') **问题现象**
.height('100%')
.backgroundColor('rgba(255,255,255, 0)') Stage模型中的ServiceExtensionAbility是系统接口,第三方应用不支持调用,如何在Stage模型中如何创建后台服务?
}
``` **解决措施**
Stage模型可通过后台任务实现该功能。
**参考链接**
[后台任务](../task-management/background-task-overview.md)
## FA和Stage模型中,应用是否可以创建并指定UIAbility运行在哪个进程
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
FA和Stage模型中,应用可以创建进程并指定UIAbility运行在某个进程。
- FA模型
FA模型支持多进程,默认情况下,同一应用的所有组件均在相同进程中运行,且大多数应用都不应该改变这一点。但是如果应用自身业务需要某个组件独立进程运行,可在config配置文件中配置;配置清单中,ability标签的process子标签可指定该组件在哪个进程中运行,应用可以设置通过该属性使每个组件均在各自的进程中运行,但process子标签仅支持系统应用配置,三方应用配置不生效。
- Stage模型
Stage模型支持多进程:Stage模型的进程模型由系统定义,三方应用不能配置多进程;如果需要自定义配置独立进程,需要申请特殊权限;配置清单中,module标签的process子标签可指定该Hap下Ability在哪个进程中运行,应用可以设置通过该属性使每个Hap的Ability组件均在各自的进程中运行。如果不配置,进程名默认为包名。
## Stage模型与FA模型在进程内对象共享方面有哪些差异
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
- Stage模型中,多个应用组件共享同一个ArkTS引擎实例,因此在Stage模型中,应用组件之间可以方便的共享对象和状态,同时减少复杂应用运行对内存的占用。
- FA模型中,每个应用组件独享一个ArkTS引擎实例。Stage模型作为主推的应用模型,开发者通过它能够更加便利地开发出分布式场景下的复杂应用。
## 调用方法的时候,如何解决方法内部的this变成undefined **参考链接**
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 [UIAbility组件与UI的数据同步](../application-models/uiability-data-sync-with-ui.md)
方式一:在调用方法的时候加上.bind(this)。 ## 如何使用AbilityStage的生命周期函数
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
在module.json5里的module中加上srcEntry字段"srcEntry": "./ets/myabilitystage/MyAbilityStage.ts"。
**参考链接**
[AbilityStage组件容器](../application-models/abilitystage.md)
## 多实例场景下当前Ability调用terminateSelf后,桌面最近任务列表如何设置不保留快照
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
可在module.json5配置文件中配置removeMissionAfterTerminate为true。
## 通过startAbility\(\)方法无法启动UIAbility实例
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
- 如果是通过startAbility的方式拉起,检查want中abilityName字段是否携带了bundleName做前缀,如果有,请删除。
- 检查MainAbility.ts文件中onWindowStageCreate方法配置的Ability首页文件是否在main\_pages.json中有定义,如果没有定义,请补齐。SDK和OpenHarmony SDK系统推荐同一天的版本。
## 调用方法的时候,方法内部的this变成了undefined
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
方式一:在调用方法的时候加上.bind\(this\)
方式二:使用箭头函数。 方式二:使用箭头函数。
## 如何解决must have required property 'startWindowIcon'报错 ## 启动UIAbility时报错:must have required property 'startWindowIcon'
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 适用于:Openharmony 3.2 Beta5 API 9
Ability配置中缺少startWindowIcon属性配置,需要在module.json5中abilities中配置startWindowIcon。 **解决措施**
参考文档:[Stage模型应用程序包结构](../quick-start/module-configuration-file.md) UIAbility配置中缺少startWindowIcon属性配置,需要在module.json5中abilities中配置startWindowIcon。
示例: **代码示例**
``` ```
{ {
...@@ -69,132 +137,230 @@ Ability配置中缺少startWindowIcon属性配置,需要在module.json5中abil ...@@ -69,132 +137,230 @@ Ability配置中缺少startWindowIcon属性配置,需要在module.json5中abil
} }
``` ```
## 如何获取设备横竖屏的状态变化的通知 **参考链接**
适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型 [Stage模型配置文件](../quick-start/module-configuration-file.md)
使用Ability的onConfigurationUpdated回调实现,系统语言、颜色模式以及Display相关的参数,比如方向、Density,发生变化时触发该回调。 ## Stage模型是否推荐使用globalThis获取Context
## Stage模型是否推荐用globalThis去获取Context 适用于:Openharmony 3.2 Beta5 API 9
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 不推荐,Stage模型使用globalThis去获取Context是错误的使用方式。
不推荐,Stage模型使用globalThis去获取Context是错误的使用方式。在Stage模型中,整个应用进程共用一个js虚拟机实例,其中可以运行多个Ability实例,共用一个global对象。在同一个js虚拟机内的不同的Ability中使用globalThis获取Context,存在被覆盖从而发生错误的风险。 在Stage模型中,整个应用进程共用一个js虚拟机实例,其中可以运行多个Ability实例,共用一个global对象。在同一个js虚拟机内的不同的Ability中使用globalThis获取Context,存在被覆盖从而发生错误的风险。
推荐使用方式参考:[Stage模型的Context详细介绍](../application-models/application-context-stage.md) **参考链接**
## 如何在应用A中去获取应用B的HAP的安装路径 [UIAbility组件与UI的数据同步](../application-models/uiability-data-sync-with-ui.md)
适用于:OpenHarmony SDK 3.0以上版本, API9 Stage模型 ## 部署HAP时上报安装内容过大错误
首先需要申请系统权限,具体参看文档:[自动化签名](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-auto-configuring-signature-information-0000001271659465)。导入bundle模块,通过调用bundle.getApplicationInfo()接口,通过Bundle名称获取应用信息。然后通过application.moduleSourceDirs获取应用存储路径。 适用于:Openharmony 3.2 Beta5 API 9
## FA卡片上架后在用户的服务中心展示时可否触发生命周期,从而实现用户没有打开过FA应用的情况下获取到用户的登录信息? **问题现象**
适用于:OpenHarmony SDK 3.2.5.5版本, API8 FA模型 部署hap时,上报如下错误:
服务卡片在添加卡片后就触发了oncreate()生命周期,在不启用app的情况下也可以显示相关的用户信息-静默登录,但服务卡片目前要在app安装之后手动添加。 Failure\[INSTALL\_FAILED\_SIZE\_TOO\_LARGE\] error while deploying hap?
## 如何获取context **解决措施**
适用于:OpenHarmony SDK 3.2.7.5版本, API9 Stage模型 将其拆分为多个HAP即可解决。
在MainAbility.ts文件中可以直接使用this.context获取context,在组件页面中可以使用getContext(this)获取context。 ## 调用方使用startAbilityForResult时,被调用方如何返回数据
## 访问控制管理模块abilityAccessCtrl中grantUserGrantedPermission方法在API8语法校验提示未定义 适用于:Openharmony 3.2 Beta5 API 9
适用于:OpenHarmony SDK 3.0版本, API8 FA模型 **解决措施**
当前SDK有fullSDK和publicSDK两个版本,IDE默认下载的是publicSDK。其中,publicSDK版本不会包含系统API,如果要用系统API,需要使用fullSDK。具体参考[full-SDK替换指南](../quick-start/full-sdk-switch-guide.md) 被调用方使用AbilityContext.terminateSelfWithResult方法,销毁被调用方ability,传递参数给startAbilityForResult回调函数
## public sdk支持哪几种ExtensionAbility(ServiceExtensionAbility、FormExtensionAbility、DataShareExtensionAbility) **参考链接**
适用于:OpenHarmony SDK 3.2.5.6版本, API9 Stage模型 [启动应用内的UIAbility并获取返回结果](../application-models/uiability-intra-device-interaction.md)
上述ExtensionAbility 中,public sdk 仅可以使用FormExtensionAbility。ServiceExtensionAbility和DataShareExtensionAbility 为系统接口,需要使用full sdk。
Public SDK : 面向应用开发者提供,不包含需要使用系统权限的系统接口。 ## 如何获取系统时间戳
Full SDK : 面向OEM厂商提供,包含了需要使用系统权限的系统接口。 适用于:Openharmony 3.2 Beta5 API 9
## 服务卡片无法循环播放gif图 **解决措施**
适用于:OpenHarmony SDK 3.2.5.6版本, API9 Stage模型 在Openharmony中使用@ohos.systemDateTime的getCurrentTime来获取系统系统时间和时区。
目前暂不支持播放GIF图片。 **代码示例**
## 如何通过卡片点击实现业务登录场景 使用@ohos.systemDateTime接口:
适用于:OpenHarmony SDK 3.2.5.5版本, API9 Stage模型 ```
try {
systemDateTime.getCurrentTime(true, (error, time) => {
if (error) {
console.info(`Failed to get currentTime. message: ${error.message}, code: ${error.code}`);
return;
}
console.info(`Succeeded in getting currentTime : ${time}`);
});
} catch(e) {
console.info(`Failed to get currentTime. message: ${e.message}, code: ${e.code}`);
}
```
可以通过点击卡片拉起响应的Ability后,通过Ability来实现业务登录场景。
## 如何跳转到设置中应用详情页面 **参考链接**
使用于:OpenHarmony SDK 3.2.6.5版本 [系统时间、时区](../reference/apis/js-apis-system-date-time.md#systemdatetimegetcurrenttime)
参考如下代码实现,示例: ## 如何获取当前应用程序缓存目录
``` 适用于:Openharmony 3.2 Beta5 API 9
this.context.startAbility(
{
action: "action.settings.app.info",
parameters: { "settingsParamBundleName": "your app bundlename" }
})
```
## 如何监听屏幕旋转 **解决措施**
使用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 在Openharmony中使用Context.cacheDir获取应用程序的缓存目录。
参考如下代码实现,示例: **参考链接**
``` [cacheDir](../application-models/application-context-stage.md#获取应用开发路径)
let listener = mediaquery.matchMediaSync('(orientation: landscape)')
onPortrait(mediaQueryResult) { ## 服务卡片生命周期回调函数在哪个js文件中调用
if (mediaQueryResult.matches) {
// do something here 适用于:Openharmony 3.2 Beta5 API 9
} else {
// do something here **解决措施**
}
} 新建卡片时会生成一个FormAblity.ts文件,其中包含卡片对应的生命周期。
listener.on('change', onPortrait)
``` 参考链接
[FormExtensionAbility](../reference/apis/js-apis-app-form-formExtensionAbility.md)
## 使用ServiceExtensionAbility和DataShareExtensionAbility的相关接口后DevEco Studio无法编译
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
使用ServiceExtensionAbility和DataShareExtensionAbility的相关接口后,DevEco Studio报错无法编译。
**问题原因**
当前SDK类型有:
- public-sdk : 面向应用开发者提供,不包含需要使用系统权限的系统接口。
- full-sdk : 面向OEM厂商提供,包含了需要使用系统权限的系统接口。
DevEco Studio默认下载是public-sdk。
**解决措施**
三方应用不支持开发ServiceExtensionAbility和DataShareExtensionAbility。若开发系统应用,请[下载full-sdk](../quick-start/full-sdk-switch-guide.md)
## 如何获取应用级别的temp路径和files路径
适用于:OpenHarmony 3.2 Beta5
**解决措施**
通过应用上下文context获取。如:this.context.getApplicationContext.tempDir来获取temp路径;this.context.getApplicationContext.filesDir来获取files路径。
**参考链接**
[获取应用开发路径](../application-models/application-context-stage.md#获取应用开发路径)
## FA卡片上架后在用户的服务中心展示时可否触发生命周期,从而实现用户没有打开过FA应用的情况下获取到用户的登录信息
适用于:OpenHarmony 3.2 Beta 5 API 9
## 如何控制checkbox选中切换过程中阴影背景的大小 **问题现象**
使用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 FA卡片的生命周期以及信息显示
设置checkbox组件padding属性,可控制阴影大小 **解决措施**
## 如何设置卡片背景为透明 服务卡片在添加卡片后就触发了oncreat()生命周期,在不启用app的情况下也可以显示相关的用户信息-静默登录,但服务卡片目前要在app安装之后手动添加。
适用:OpenHarmony SDK 3.2.5.5版本 ## 如何通过卡片点击实现业务登录场景
适用于: OpenHarmony 3.2 Beta5 API 9
**解决措施**
可以先创建FA模型的卡片,步骤如下:
1. 实现卡片生命周期接口
2. 配置卡片配置文件
3. 卡片信息的持久化
4. 卡片数据交互
1. 在卡片根目录widget新建widget/resources/styles/default.json文件 5. 开发卡片页面
2. 在default.json中书写如下代码: 6. 开发卡片事件:通过点击卡片拉起响应的Ability后,通过Ability来实现业务登录场景
**参考链接**
[FA卡片开发指导](../application-models/widget-development-fa.md)
## 如何跳转到设置中应用详情页面
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
参考如下代码实现,示例:
``` ```
{ this.context.startAbility(
"style": { {
"app_background": "#00000000" action: "action.settings.app.info",
} parameters: { "settingsParamBundleName": "your app bundlename" }
} })
``` ```
## FA卡片如何的传参和接参 ## stage模型,@Component组件内如何获取UIAbilityContext
适用:OpenHarmony SDK 3.2.5.5版本
使用featureAbility.getWant()和featureAbility.getContext()在json文件中router跳转发送数据,在js文件中用featureAbility方法接收 适用于:OpenHarmony 3.2 Beta5 API9
## router.disableAlertBeforeBackPage和router.enableAlertBeforeBackPage怎么触发 **解决措施**
适用:OpenHarmony SDK 3.2.5.5版本 可以通过UIAbility. Context获取。
需要满足两个条件 **代码示例**
1. router.disableAlertBeforeBackPage和router.enableAlertBeforeBackPage类似一个开关,disableAlertBeforeBackPage是返回上一级页面时关闭弹窗提示,enableAlertBeforeBackPage是打开弹窗提示,默认是关闭的,当你需要使用时,首先要在一个函数里面开启功能,然后再执行跳转 ```
import UIAbility from '@ohos.app.ability.UIAbility';
let UIAbilityContext = UIAbility.context;
let ApplicationContext = UIAbility.context.getApplicationContext();
@Entry
@Component
struct AbilityContextTest {
// abilityContext
@State UIabilityInfo: string = '获取 abilityInfo'
UIabilityContext: UIAbilityContext
aboutToAppear() {
// getContext获取Context,转为abilityContext
this.UIabilityContext = getContext(this) as UIAbilityContext
}
2. 必须要使用系统的返回按键才能触发效果。 build() {
Row() {
Column({ space: 20 }) {
Text(this.abilityInfo)
.fontSize(20)
.onClick(()=>{
this.UIabilityInfo = JSON.stringify(this.UIabilityContext.UIabilityInfo)
console.log(`ContextDemo abilityInfo= ${this.UIabilityInfo}`)
})
}
.width('100%')
}
.height('100%')
}
}
```
# Web开发常见问题
## Web组件的onUrlLoadIntercept返回结果是否影响onInterceptRequest
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
Web组件的onUrlLoadIntercept的不同返回结果对应不同的操作:
- onUrlLoadIntercept返回true则直接拦截URL请求。
- onUrlLoadIntercept返回false走onInterceptRequest回调。
**参考链接**
[onUrlloadIntercept](../reference/arkui-ts/ts-basic-components-web.md#onurlloadintercept)
## 为什么Web组件的onKeyEvent键盘事件不生效
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
Web组件设置onKeyEvent监听键盘事件,键盘按下或抬起该事件不触发。
**解决措施**
onKeyEvent为通用事件,当前Web组件不支持通用事件。Web组件监听键盘事件可以使用onInterceptKeyEvent回调函数。
**参考链接**
[onInterceptKeyEvent](../reference/arkui-ts/ts-basic-components-web.md#oninterceptkeyevent9)
## onInterceptRequest拦截URL并自定义HTML文件,页面加载失败
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
onInterceptRequest拦截页面Web的src的链接后返回自定义HTML,但是自定义HTML文件里面的script标签里的内容没有加载。
**解决措施**
设置拦截器时,如果只设置setResponseData,内核将无法识别到这是个HTML文件,需要同时设置setResponseEncoding、setResponseMimeType、setResponseHeader等参数。
**代码示例**
```
Web({ src: 'www.example.com', controller: this.controller })
.onInterceptRequest((event) => {
console.log('url:' + event.request.getRequestUrl())
this.responseweb = new WebResourceResponse();
var head1:Header = {
headerKey:"Connection",
headerValue:"keep-alive"
}
var length = this.heads.push(head1)
this.responseweb.setResponseHeader(this.heads)
this.responseweb.setResponseData(this.webdata)
this.responseweb.setResponseEncoding('utf-8')
this.responseweb.setResponseMimeType('text/html')
this.responseweb.setResponseCode(200)
this.responseweb.setReasonMessage('OK')
return this.responseweb
})
```
**参考链接**
[WebResourceResponse](../reference/arkui-ts/ts-basic-components-web.md#webresourceresponse)
## 如何在ArkTS代码中执行HTML内的JS函数
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
通过WebviewController中runJavaScript方法异步执行JavaScript脚本,并通过回调方式获取执行结果。
>**说明:**
>runJavaScript需要在loadUrl完成后,比如onPageEnd中调用。
**参考链接**
[runJavaScript](../reference/apis/js-apis-webview.md#runjavascript)
## 使用Web组件加载本地网页时,如何在本地网页中调用ArkTS中的函数
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
1. 准备一个html文件,例如:
```
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>标题</h1>
<h5 id="h5"></h5>
<h5 id = "h6"></h5>
<button onclick="handleFromH5">调用Arkts的方法</button>
<script type="text/javascript">
function handleFromH5(){
let result = window.objName.test();
document.getElementById('h6').innerHTML = result;
}
</script>
</body>
</html>
```
2. 在ArkTs中使用JavaScriptProxy方法将ArkTs里的对象注册到H5的window对象中,然后在h5中使用window对象调用该方法。比如下面例子,在ArkTs中将testObj这个对象以别名objName注册到h5的window对象上,在上面的h5中就可以使用window.objName去访问这个对象。
```
// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
controller: web_webview.WebviewController = new web_webview.WebviewController()
testObj = {
test: (data1, data2, data3) => {
console.log("data1:" + data1);
console.log("data2:" + data2);
console.log("data3:" + data3);
return "AceString";
},
toString: () => {
console.log('toString' + "interface instead.");
}
}
build() {
Row() {
Column() {
Web({ src:$rawfile('index.html'), controller:this.controller })
.javaScriptAccess(true)
.javaScriptProxy({
object: this.testObj,
name: "objName",
methodList: ["test", "toString"],
controller: this.controller,
})
}
.width('100%')
}
.height('100%')
}
}
```
**参考链接**
[javaScriptProxy](../reference/arkui-ts/ts-basic-components-web.md#javascriptproxy)
## Web组件domStorageAccess属性设置
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
设置是否开启文档对象模型存储接口(DOM Storage API)权限,默认未开启,控制web网页中localStorage的使用,对sessionStorage未做控制
**参考链接**
[domStorageAccess](../reference/arkui-ts/ts-basic-components-web.md#domstorageaccess)
# ArkUI框架开发常见问题
## 如何动态替换掉资源文件中的“%s”占位符
适用于OpenHarmony 3.2 Beta5 API 9
**问题现象**
引用String资源,如何动态替换资源文件中的“%s”占位符。
**解决措施**
在应用中,通过`$r('app.string.xx')`的形式引用应用资源,\$r的第二个参数可用于替换%s占位符。
**代码示例**
```
build() {
//do something
//引用的string资源,$r的第二个参数用于替换%s
Text($r('app.string.entry_desc','aaa'))
.fontSize(100)
.fontColor(Color.Black)
//do something
}
```
## 自定义弹窗能否在ts文件中定义和使用
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
自定义弹窗的定义和初始化需要用到属于ArkTS语法内容,必须在ets后缀文件中定义使用,不能在ts后缀文件中定义使用。
**参考链接**
[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md)
## 自定义弹窗中的变量如何传递给页面
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
在自定义弹窗内定义的变量内容,在关闭弹窗或变量变化时需要及时传递给页面,可以通过何种方式传递?
**解决措施**
- 方式一:使用组件的状态变量传递。
- 方式二:在初始化弹窗时,传递一个方法给自定义弹窗,在自定义弹窗中触发该方法,弹窗中变量作为方法的参数。
- 方式三:使用AppStorage或LocalStorage方式管理页面状态,实现自定义弹窗和页面之间状态的共享。
**代码示例**
- 方式一:
```
@CustomDialog
struct CustomDialog01 {
@Link inputValue: string
controller: CustomDialogController
build() {
Column() {
Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
TextInput({ placeholder: '', text: this.inputValue }).height(60).width('90%')
.onChange((value: string) => {
this.inputValue = value
})
}
}
}
@Entry
@Component
struct DialogDemo01 {
@State inputValue: string = 'click me'
dialogController: CustomDialogController = new CustomDialogController({
builder: CustomDialog01({
inputValue: $inputValue
})
})
build() {
Column() {
Button(this.inputValue)
.onClick(() => {
this.dialogController.open()
}).backgroundColor(0x317aff)
}.width('100%').margin({ top: 5 })
}
}
```
- 方式二:
```
@CustomDialog
struct CustomDialog02 {
private inputValue: string
changeInputValue: (val: string) => void
controller: CustomDialogController
build() {
Column() {
Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
TextInput({ placeholder: '', text: this.inputValue }).height(60).width('90%')
.onChange((value: string) => {
this.changeInputValue(value)
})
}
}
}
@Entry
@Component
struct DialogDemo02 {
@State inputValue: string = 'click me'
dialogController: CustomDialogController = new CustomDialogController({
builder: CustomDialog02({
inputValue: this.inputValue,
changeInputValue: (val: string) => {
this.inputValue = val
}
})
})
build() {
Column() {
Button(this.inputValue)
.onClick(() => {
this.dialogController.open()
}).backgroundColor(0x317aff)
}.width('100%').margin({ top: 5 })
}
}
```
- 方式三:
```
let storage = LocalStorage.GetShared()
@CustomDialog
struct CustomDialog03 {
@LocalStorageLink('inputVal') inputValue: string = ''
controller: CustomDialogController
build() {
Column() {
Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
TextInput({ placeholder: '', text: this.inputValue }).height(60).width('90%')
.onChange((value: string) => {
this.inputValue = value;
})
}
}
}
@Entry(storage)
@Component
struct DialogDemo03 {
@LocalStorageLink('inputVal') inputValue: string = ''
dialogController: CustomDialogController = new CustomDialogController({
builder: CustomDialog03()
})
build() {
Column() {
Button(this.inputValue)
.onClick(() => {
this.dialogController.open()
}).backgroundColor(0x317aff)
}.width('100%').margin({ top: 5 })
}
}
```
## 如何获取组件的宽高
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
组件的宽高信息用于计算布局区域大小以及偏移量等内容,如何获取宽高信息?
**解决措施**
- 方式一:使用组件区域变化事件onAreaChange,在组件初始化或组件尺寸发生变化时触发。
- 方式二:在点击或触摸事件中,事件的回调信息中存在目标元素的区域信息。
**参考链接**
[组件区域变化事件](../reference/arkui-ts/ts-universal-component-area-change-event.md)[点击事件](../reference/arkui-ts/ts-universal-events-click.md)[触摸事件](../reference/arkui-ts/ts-universal-events-touch.md)
## 如何一键清空TextInput、TextArea组件内容
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
TextInput,TextArea组件输入多字符后,需要实现点击清空。
**解决措施**
将状态变量赋值给TextInput或TextArea组件的text属性,在做点击清空事件时为状态变量赋值空字符串。
**代码示例**
```
struct Index {
@State text: string = 'Hello World'
controller: TextInputController = new TextInputController()
build() {
Row() {
Column() {
TextInput({ placeholder: 'Please input your words.', text: this.text,
controller:this.controller}).onChange((value) => {
this.text = value
})
Button("Clear TextInput").onClick(() => {
this.text = "";
})
}
.width('100%')
}
.height('100%')
}
}
```
## 如何设置自定义弹窗位置
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
自定义弹窗当前默认在窗口居中显示,当自定义弹窗需要与窗口边框对齐是需要设置自定义弹窗的对齐方式。
**解决措施**
初始化自定义弹窗时,通过alignment参数设置对齐方式,通过offset设置弹窗偏移量。
**参考链接**
[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md)
## 如何隐藏容器组件的溢出内容
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
当容器组件内容溢出时,表现为子组件边缘超出容器组件,需要进行隐藏设置。
**解决措施**
将通用属性-形状裁剪clip属性设置为true,表示按照容器边缘轮廓进行裁剪。此属性默认为false,表示不进行裁剪隐藏。
**参考链接**
[形状裁剪](../reference/arkui-ts/ts-universal-attributes-sharp-clipping.md)
## 自定义弹窗大小如何自适应内容
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
当自定义弹窗中存在可变化区域大小的子组件时,弹窗大小需要跟随自适应。
**解决措施**
- 方式一:采用弹窗容器默认样式。在默认样式中,弹窗容器高度自适应子节点,最大可为窗口高度的90%;弹窗容器的宽度根据栅格系统自适应,不跟随子节点变化。
- 方式二:当显示设置customStyle为true时,弹窗宽高跟随子节点内容适应。
**参考链接**
[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md)
## 如何理解自定义弹窗中的gridCount参数
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
gridCount参数是指弹窗宽度占栅格列数的个数。系统把窗口宽等分,等分的份数即为栅格列数,不同设备栅格列数不同。比如手机屏幕密度值在320vp<=水平宽度<600vp,所以栅格列数是4,则gridCount的有效值在\[1, 4\]
注意:仅采用弹窗默认样式时设置有效。
**参考链接**
[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md)
## 如何去除自定义弹窗的白色背景
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
使用自定义弹窗时,默认样式中存在白色背景。
**解决措施**
需要采用自定义样式来消除自定义弹窗的白色背景:
1. 在初始化自定义弹窗时设置customStyle为true。
2. 在定义弹窗时设置组件背景色backgroundColor。
**参考链接**
[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md)
## TextInput组件密码模式下,右边的眼睛图标能否支持自定义
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
TextInput组件设置type为InputType.Password时,右侧出现眼睛图标,不能修改图标样式。
**解决措施**
当前图标不支持自定义,可使用TextInput的showPasswordIcon属性隐藏图标,使用Image组件替代控制TextInput组件的type。
**参考链接**
[TextInput组件](../reference/arkui-ts/ts-basic-components-textinput.md)
## TextInput的onSubmit事件如何使用
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
TextInput的onSubmit事件怎么触发,以及事件回调的参数类型代表的含义。
**解决措施**
onSubmit事件在外接键盘或软键盘回车时触发该回调,回调的参数为当前软键盘回车键类型。通过TextInput的enterKeyType属性可以设置输入法回车键类型,软键盘回车键样式需要输入法的支持。
**参考链接**
[TextInput组件](../reference/arkui-ts/ts-basic-components-textinput.md)
## TextInput在聚焦时如何使光标回到起点
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
TextInput组件在聚焦时,光标位置会自动根据触摸点位置变化,如何使得聚焦时光标固定显示在起点位置?
**解决措施**
1. TextInput组件绑定onEditChange事件,该事件TextInput可进行输入时触发。
2. 在事件回调用TextInputController.caretPosition方法设置光标位置,不过需要用到setTimeout延迟方法。
**代码示例**
```
@Entry
@Component
struct TextInputDemo {
controller: TextInputController = new TextInputController()
build() {
Column() {
TextInput({ controller: this.controller })
.onEditChange((isEditing: boolean) => {
if (isEditing) {
setTimeout(() => {
this.controller.caretPosition(0)
}, 100)
}
})
}
}
}
```
**参考链接**
[TextInput组件](../reference/arkui-ts/ts-basic-components-textinput.md)
## 如何获取组件的属性信息
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**解决措施**
组件所有属性信息可通过通用属性-组件标识内getInspectorByKey获取。
**参考链接**
[组件标识](../reference/arkui-ts/ts-universal-attributes-component-id.md)
## 如何获取可滚动组件的当前滚动偏移量
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
可滚动组件包含List,Grid,Scroll等,在发生滚动时如何获取滚动偏移量?
**解决措施**
1. 可滚动组件在初始化时可设置scroller参数,绑定滚动控制器。
2. 通过控制器的currentOffset方法可获取水平和竖直方向的滚动偏移量。
**参考链接**
[Scroll](../reference/arkui-ts/ts-container-scroll.md#currentoffset)
## 如何实现文本竖向排列
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
使用Text组件时,无法将文本排列方向设置为竖向排列。
**解决措施**
Text组件当前文本排列方向固定为横向排列,要设置为竖向排列,可将文件拆分,使用Flex容器组件装填,设置主轴方向为竖向。
**代码示例**
```
@Entry
@Component
struct Index15 {
private message: string = '本文档适用于HarmonyOS应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用,快速了解工程目录的主要文件,熟悉HarmonyOS应用开发流程。';
build() {
Flex({ direction: FlexDirection.Column, wrap: FlexWrap.Wrap }) {
ForEach(this.message.split(''), (item, index) => {
Text(item)
.fontSize(30)
.flexShrink(0)
})
}
}
}
```
## 如何创建Toast窗口
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
应用做弱提示时,需要采用Toast窗口。
**解决措施**
可使用系统提供的@ohos.promptAction接口创建Toast窗口。
**参考链接**
[@ohos.promptAction \(弹窗\)](../reference/apis/js-apis-promptAction.md)
## Toast弹窗是否支持自定义背景或者字体颜色
适用于 OpenHarmony 3.2 Beta5 API 9 Stage模型
当前版本不支持Toast弹窗自定义背景和字体颜色。
**参考链接**
[@ohos.promptAction \(弹窗\)](../reference/apis/js-apis-promptAction.md)
## 如何将Ability的UI界面设置成透明
适用于:OpenHarmony SDK 3.2,API9
**问题现象**
如何设置Ability的UI界面为透明
**解决措施**
将最上层容器组件背景色设置为透明,然后通过设置XComponent组件的opacity属性值为0.01来实现。
示例:
```
build() {
Stack() {
XComponent({
id: 'componentId',
type: 'surface',
})
.width('100%')
.height('100%')
.opacity(0.01)
// 页面内容
}
.width('100%')
.height('100%')
.backgroundColor('rgba(255,255,255, 0)')
}
```
## constraintSize尺寸设置不生效
适用于:Openharmony 3.2 Beta5 API 9 stage模型
**问题现象**
constraintSize约束组件尺寸时,子组件内设置百分比宽度,例如width\('100%'\)会采用constraintSize约束中的最大宽乘百分比,导致撑开组件,看起来constraintSize设置没生效。
**解决措施**
可以在外层使用Scroll组件,设置constraintSize,当子组件占用空间超过设置的约束值时,会显示滚动条。
## 如何将背景颜色设置为透明
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
将backgroundColor设置为 '\#00000000'。
## Scroll组件滚动到达不了最底部
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
Scroll组件在未设置高度情况下,默认为窗口高度,当滚动区域外存在其他组件时,滚动底部区域会出现遮挡。
**解决措施**
Scroll组件需要设置Scroll高度,或者使用Flex布局限制Scroll高度。
## backgroundImage如何设置CenterCrop
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
CenterCrop是android中imageView,scaletype的设置,主要保证图片等比缩放裁剪,位置保持居中,要达到相同效果,应该怎么处理?
**解决措施**
可以使用通用属性backgroundImageSize\(ImageSize.cover\)和backgroundImagePosition\(Alignment.Center\)达到相同效果。
## 如何自定义Video组件控制栏样式
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**解决措施**
1. 通过设置属性controls为false关闭默认控制栏。
2. 设置Video组件的controller。
3. 通过ArkTS实现自定义的控制栏,并通过VideoController控制视频播放。
**代码示例**
```
// xxx.ets
@Entry@Componentstruct VideoCreateComponent {
@State videoSrc: Resource = $rawfile('video1.mp4')
@State previewUri: Resource = $r('app.media.poster1')
@State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
@State isAutoPlay: boolean = false
@State showControls: boolean = true
controller: VideoController = new VideoController()
build() {
Column() {
Video({
src: this.videoSrc,
previewUri: this.previewUri,
currentProgressRate: this.curRate,
controller: this.controller
}).width('100%').height(600)
.autoPlay(this.isAutoPlay)
.controls(this.showControls)
.onStart(() => {
console.info('onStart')
})
.onPause(() => {
console.info('onPause')
})
.onFinish(() => {
console.info('onFinish')
})
.onError(() => {
console.info('onError')
})
.onPrepared((e) => {
console.info('onPrepared is ' + e.duration)
})
.onSeeking((e) => {
console.info('onSeeking is ' + e.time)
})
.onSeeked((e) => {
console.info('onSeeked is ' + e.time)
})
.onUpdate((e) => {
console.info('onUpdate is ' + e.time)
})
Row() {
Button('src').onClick(() => {
this.videoSrc = $rawfile('video2.mp4') // 切换视频源
}).margin(5)
Button('previewUri').onClick(() => {
this.previewUri = $r('app.media.poster2') // 切换视频预览海报
}).margin(5)
Button('controls').onClick(() => {
this.showControls = !this.showControls // 切换是否显示视频控制栏
}).margin(5)
}
Row() {
Button('start').onClick(() => {
this.controller.start() // 开始播放
}).margin(5)
Button('pause').onClick(() => {
this.controller.pause() // 暂停播放
}).margin(5)
Button('stop').onClick(() => {
this.controller.stop() // 结束播放
}).margin(5)
Button('setTime').onClick(() => {
this.controller.setCurrentTime(10, SeekMode.Accurate) // 精准跳转到视频的10s位置
}).margin(5)
}
Row() {
Button('rate 0.75').onClick(() => {
this.curRate = PlaybackSpeed.Speed_Forward_0_75_X // 0.75倍速播放
}).margin(5)
Button('rate 1').onClick(() => {
this.curRate = PlaybackSpeed.Speed_Forward_1_00_X // 原倍速播放
}).margin(5)
Button('rate 2').onClick(() => {
this.curRate = PlaybackSpeed.Speed_Forward_2_00_X // 2倍速播放
}).margin(5)
}
}
}}
```
**参考链接**
[Video](../reference/arkui-ts/ts-media-components-video.md#start)
## 如何设置组件不同状态下的样式
**问题现象**
对应组件的不同状态(如无状态、按下、禁用、聚焦、点击),显示不同的样式。
**解决措施**
使用多态样式,在组件的StateStyles接口中,定义组件不同状态下的样式。
**代码示例**
```
//xxx.ts
@Entry
@Component
struct StyleExample {
@State isEnable: boolean = true;
@Styles pressedStyles() {
.backgroundColor("#ED6F21")
.borderRadius(10)
.borderStyle(BorderStyle.Dashed)
.borderWidth(2)
.borderColor('#33000000')
.width(120)
.height(30)
.opacity(1)
}
build() {
Flex({direction: FlexDirection.Column, alignItems: ItemAlign.Center}) {
Text("pressed")
.backgroundColor('#0A59F7')
.borderRadius(20)
.borderStyle(BorderStyle.Dotted)
.borderWidth(2)
.borderColor(Color.Red)
.width(100)
.height(25)
.opacity(1)
.fontSize(14)
.fontColor(Color.White)
.stateStyles({
pressed: this.pressedStyles
})
.margin({
bottom: 20
})
.textAlign(TextAlign.Center)
}
.width(350)
.height(300)
}
}
```
**参考链接**
[多态样式](../reference/arkui-ts/ts-universal-attributes-polymorphic-style.md)
## Scroll内Flex加宽高与滑动冲突
适用于:OpenHarmony 3.2 Beta5 API 9 Stage模型
**问题现象**
当在Scroll组件中添加容器组件,并设置该容器组件的尺寸时,会破坏滚动布局。
**解决措施**
Scroll组件中的容器组件不设置尺寸,大小由内容撑开。
## ArkTS使用position之后height不生效
适用于 OpenHarmony 3.2 Beta5 API 9
**问题现象**
ArkTS使用position之后height不生效
**解决措施**
容器组件在使用position之后会脱离文本流,导致容器脱离外层容器束缚,导致height不生效,可以将外层容器换成Stack可以解决这个问题。
## 焦点事件onBlur/onFocus回调无法触发
适用于 OpenHarmony 3.2 Beta5 API 9
**问题现象**
焦点事件onBlur/onFocus回调无法触发
**解决措施**
焦点事件默认情况下需要外接键盘的Tab键,或方向键触发,点击触发焦点事件需要添加焦点控制属性focusOnTouch。
**参考链接**
[焦点控制](../reference/arkui-ts/ts-universal-attributes-focus.md)
## scroll里面套一个grid,怎么禁用grid的滑动事件
适用于 OpenHarmony 3.2 Beta5 API 9
可以通过onScrollFrameBegin事件和scrollBy方法实现容器嵌套滚动。
可参考:[容器嵌套滚动样例](../reference/arkui-ts/ts-container-scroll.md#示例2)
## 如何实现一个组件不停地旋转
适用于 OpenHarmony 3.2 Beta5 API 9
可以通过[属性动画](../reference/arkui-ts/ts-animatorproperty.md)的方式实现。
## 列表目前无法键盘上下滑动,是否能力不支持
适用于 OpenHarmony 3.2 Beta5 API 9
**问题现象**
列表目前无法键盘上下滑动,是否能力不支持
**解决措施**
有以下两种方案:
1. 需要在列表子项中添加focusable\(true\)进行获焦。
2. 在每个item的外层嵌套一个可获焦组件,例如Button。
## 键盘移动焦点对象按下enter,为什么不会触发点击事件?
适用于 OpenHarmony 3.2 Beta5 API 9
组件的内置的点击事件和开发者自定义的onClick点击事件默认会和空格键绑定,并非与enter键绑定(UX规格)
## 多层组件嵌套button,如何阻止事件传递
适用于 OpenHarmony 3.2 Beta5 API 9
可以通过将button组件绑定参数stopPropagation来控制冒泡传递。
## ArkUI如何通过代码动态创建组件
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
ArkUI使用ArkTS声明式开发范式,开发者无法持有组件实例,在声明时通过渲染控制语法以及动态构建UI元素的方式,控制组件的创建。
**代码示例**
```
// 条件渲染语句创建组件
if(this.isTrue) {
Text("创建文本组件").fontSize(30)
}
// 循环渲染语句创建组件
ForEach(this.nums,(item) => {
Text(item + '').fontSize(30)
},item => JSON.stringify(item))
```
**参考链接**
[渲染控制语法](../quick-start/arkts-rendering-control-overview.md)
## 使用@Builder装饰器包含自定义组件的方法与普通方法的区别是什么
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
@Builder装饰的方法中使用了自定义组件,那么该方法每次被调用时,对应的自定义组件均会重新创建,普通方法中不使用@builder装饰,无法容纳自定义组件。
**参考链接**
[@BuilderParam](../quick-start/arkts-builderparam.md)
## 如何使用@BuilderParam装饰器进行组件传参
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
- 不带参数
对@BuilderParam修饰的属性进行赋值时不带参数(如:content: this.specificParam),则此属性的类型需定义成无返回值的函数(如:@BuilderParam content: \(\) =\> void)。
- 带参数
对@BuilderParam修饰的属性进行赋值时带参数(如:callContent: this.specificParam1\("111"\)),则此属性的类型需定义成any(如:@BuilderParam callContent: any)。
**参考链接**
[@BuilderParam](../quick-start/arkts-builderparam.md)
## 如何监听数组内对象属性变化
适用于:OpenHarmony 3.2 Beta5 API9
**问题现象**
数组内存储对象示例,需要对对象的属性变化进行监听。
**解决措施**
通过@Observed配合@ObjectLink装饰符实现。@Observed用于类,@ObjectLink用于变量。
**代码示例**
1. 在类上使用@Observed。
```
@Observed
class ClassA {
public name: string
public c: number
public id: number
constructor(c: number, name: string = 'OK') {
this.name = name
this.c = c
}
}
```
2. 在组件变量使用@ObjectLink。
```
@Component
struct ViewA {
label: string = 'ViewA1'
@ObjectLink a: ClassA
build() {
Row() {
Button(`ViewA [${this.label}] this.a.c= ${this.a.c} +1`)
.onClick(() => {
this.a.c += 1
})
}.margin({ top: 10 })
}
}
```
**参考链接**
[Observed和ObjectLink数据管理](../quick-start/arkts-observed-and-objectlink.md)
## 子组件使用@Link修饰成员变量时,如何通过父组件传值
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
子组件使用@Link接受父组件的值时,需要使用'\$'建立变量之间的引用关系。才能实现同步。
**代码示例**
@Link语义是从`$`操作符引出,即\$isPlaying是this.isPlaying内部状态的双向数据绑定。当单击子组件PlayButton中的按钮时,@Link变量更改,PlayButton与父组件中的Text和Button将同时进行刷新,同样地,当点击父组件中的Button修改this.isPlaying时,子组件PlayButton与父组件中的Text和Button也将同时刷新。
1. 在父组件使用@State装饰器,传递数据使用\$符创建引用。
```
@Entry
@Component
struct Player {
@State isPlaying: boolean = false
build() {
Column() {
PlayButton({ buttonPlaying: $isPlaying })
Text(`Player is ${this.isPlaying ? '' : 'not'} playing`).fontSize(18)
Button('Parent:' + this.isPlaying)
.margin(15)
.onClick(() => {
this.isPlaying = !this.isPlaying
})
}
}
}
```
2. 在子组件使用@Link接受数据。
```
@Component
struct PlayButton {
@Link buttonPlaying: boolean
build() {
Column() {
Button(this.buttonPlaying ? 'pause' : 'play')
.margin(20)
.onClick(() => {
this.buttonPlaying = !this.buttonPlaying
})
}
}
}
```
**参考链接**
[@Link](../quick-start/arkts-link.md)
## 父组件如何与孙子组件进行状态同步
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
- 方式一(推荐):使用@Provide和@Consume装饰器。在父组件使用@Provide,在孙子组件使用@Consume,可以实现父组件和孙子组件进行双向数据绑定。
- 方式二:使用@State和@Link装饰器。在父组件使用@State,在每一层子组件(子组件和孙子组件)都使用@Link。
**代码示例一**
1. 父组件中使用子组件,通过Provide提供reviewVote参数,供跨级传递给孙子组件。
```
@Entry
@Component
struct Father{
@Provide("reviewVote") reviewVotes: number = 0;
build() {
Column() {
Son()
Button(`Father: ${this.reviewVotes}`)
...
}
}
}
```
2. 子组件中使用孙组件。
```
@Component
struct Son{
build() {
Column() {
GrandSon()
}
}
}
```
3. 孙子组件中使用Consume来接受reviewVote的参数。
```
@Component
struct GrandSon{
@Consume("reviewVote") reviewVotes: number
build() {
Column() {
Button(`GrandSon: ${this.reviewVotes}`)
...
}.width('100%')
}
}
```
**代码示例二**
1. 父组件Father使用@State绑定数据reviewVote。
```
@Entry
@Component
struct Father {
@State reviewVotes: number = 0;
build() {
Column() {
Son({reviewVotes:$reviewVotes})
Button(`Father: ${this.reviewVotes}`)
...
}
}
}
```
2. 子组件Son中使用@Link接受由父组件Father传递的参数reviewVote。
```
@Component
struct Son{
@Link reviewVotes: number;
build() {
Column() {
Grandson({reviewVotes:$reviewVotes})
}
}
}
```
3. 孙子组件GrandSon使用@Link接受由Son组件传递的参数reviewVote。
```
@Component
struct Grandson{
@Link reviewVotes: number;
build() {
Column() {
Button(`Grandson: ${this.reviewVotes}`)
...
}.width('100%')
}
}
```
## Js如何定义callback函数
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
定义个callback函数的样例,**示例如下:**
1. 定义回调函数
```
// 页面中定义个2个参数,空返回的callback函数
myCallback: (a:number,b:string) => void
```
2. 在使用时进行初始化赋值
```
aboutToAppear() {
// callback函数初始化
this.myCallback= (a,b)=>{
console.info(`handle myCallback a=${a},b=${b}`)
}}
```
## 组件需要多次更新时如何优化性能
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
使用状态管理模块,目前已经支持最小化更新,当数据依赖变化时,不再是重新刷新整个自定义组件,而是只更新依赖数据的视图内容。
## 对象中函数的this如何指向外层
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
通过箭头函数实现。
**代码示例**
```
const obj = {
start:() => {
return this.num
}
}
```
## 如何实现页面加载前从接口获取数据
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
页面生命周期相关问题,在页面渲染前从接口获取数据,渲染时将数据渲染到页面上。
**解决措施**
在声明周期函数aboutToAppear中使用异步接口获取页面数据,数据变量使用@State修饰,数据获取完成后根据变量自动刷新页面。
**代码示例**
```
@Entry
@Component
struct Test6Page {
// 数据获取成功,会自动刷新页面
@State message: string = 'loading.....'
aboutToAppear(){
// 模拟异步接口获取数据
setTimeout(()=>{
this.message = 'new msg'
},3000)
}
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}
```
## Stage模型资源配置文件string.json是否支持配置占位符
适用于:Openharmony 3.2 Beta5 API 9
资源配置文件string.json文件本身不支持配置占位符,可以在对应的页面中通过定义变量,在实际组件使用Resources和变量拼接的方式达到实现占位符的同等效果。
## eTS文件和ts文件的区别
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
ArkTS基于兼容了TS语法,继承了TS的所有特性,当前,ArkTS在TS的基础上主要扩展了声明式UI能力,让开发者能够以更简洁、更自然的方式开发高性能应用。推荐用ArtTS开发UI相关内容,TS可以用来开发业务逻辑相关内容。
**参考链接**
[初识ArkTS](../quick-start/arkts-get-started.md)
## ArkTS如何发送邮箱验证码
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
ArkTS语言如何给邮箱发送邮箱验证码?用哪个接口?
**解决措施**
发送验证码需要请求服务端,然后服务端调用对应的短信验证码接口来实现该功能。可以通过短信服务实现相关功能。
## 如何将传感器的数据实时显示在UI的Text中
适用于:Openharmony 3.2 Beta5 API9
**问题现象**
ArkUI(ets)如何将传感器的数据实时显示在UI的Text中。
**解决措施**
传感器返回数据类型为double,可将double转为string,再显示在text中。
## 如何监听屏幕旋转
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
应用想监听屏幕是否进行旋转操作。
**解决措施**
屏幕旋转可使用媒体查询接口进行监听。
```
import mediaquery from '@ohos.mediaquery'
let listener = mediaquery.matchMediaSync('(orientation: landscape)'); //监听横屏事件
function onPortrait(mediaQueryResult) {
if (mediaQueryResult.matches) {
// do something here
} else {
// do something here
}
}
listener.on('change', onPortrait) // 注册回调
listener.off('change', onPortrait) // 去注册回调
```
**参考链接**
[媒体查询](../reference/apis/js-apis-mediaquery.md)
## DevEco Studio 升级到最新后ForEach不能遍历全部数据
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
升级DevEco Studio后,ForEach无法遍历全部数据。
**解决措施**
forEach\(\)功能进行了增强,其第三个参数keyGenerator如果传入参数时,需要确保数据源array中的每个元素生成的key不同,才能正常遍历。如果生成的key相同,则只能生成一个。
该第三个参数也可以不传,系统采用默认生成方式,也可以正常遍历出全部元素。
## 创建的单例换了页面后不生效问题
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
单例只有在同一个流程中才有效,换了页面后之前的实例都全是undefined。
**解决措施**
对于每个Page都会生成一个js文件,定义的单例会在每个js中都生成一份,所以单例的作用范围只是Page的范围。
如果想共享一个实例,创建范围需要提升至UIAbility或者App级别。
## 如何将时间格式的字符串string转换为Date对象
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
如果字符string满足格式“yyyy-MM-dd”格式,则可直接使用函数new Date\("yyyy-MM-dd"\)来获取对应的Date对象。
```
new Date("2021-05-23");
new Date("2020/2/29");
new Date("2020-14-03");
new Date("14-02-2021");
```
其他格式字符串可使用new Date\(year:number,month:number,day?:number,hour?:number,mintue?:number,second?:number,ms?:number\)方法来获取Date对象。
```
根据参数创建日期的语法:
new Date(yearValue, IndexOfMonth, dayValue, hours, minutes, seconds)
```
其中每一个参数换算为对应时间参数传入即可。
- yearValue:应符合 ISO 8061 YYYY 格式。例如 2021。如果我们以 YY 格式指定一个值,它将会被错误地接受。例如,仅将 2021 提到 21 会被认为是 1921 年而不是 2021 年。
- IndexOfMonth:从索引 0 开始。因此,从 Month 值中减去 1。例如,对于 3 月,该值为 3,但 monthIndex 将为 2(即 3-1 = 2)。本月指数通常应在 0-11 范围内
- dayValue:表示一个月中的某天。它应在 1-31 范围内,具体取决于一个月中的天数。例如:对于 21-05-2021,日期值为 21
- hours:一天中的小时。例如 10 点。
- minutes:过去一个小时的分钟数
- seconds:保留超过一分钟的秒数。
## ArkTS如何把string转为byte数组
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
参考如下代码实现,示例:
```
stringToArray(str:string) {
var arr = [];
for(var i = 0,j = str.length;i<j;++i) {
arr.push(str.charCodeAt(i))
}
return arr;
}
```
## ArkTS如何实现字符串编解码
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
通过util工具函数模块中的TextEncoder和TextDecoder进行解码。
**参考链接**
[TextEncoder](../reference/apis/js-apis-util.md#textencoder)[TextDecoder](../reference/apis/js-apis-util.md#textdecoder)
## 如何导入和导出namespace命名空间
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
通过export和import导入导出
- namespace导数据库出
```
namespace Util{
export function getTime(){
return Date.now()
}
}
export default Util
```
- namespace导入
```
import Util from './util'
Util.getTime()
```
## worker线程中能否进行关系型数据库的操作
适用于:Openharmony 3.2 Beta5 API 9
当前不支持将UI主线程中的rdb数据库对象发送给Worker线程后进行操作。Worker线程中使用rdb数据库,需要重新获取rdb数据库的对象。
## 如何获取应用resource目录下的文件
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
- 方式一:使用\$r或者\$rawfile访问。适合静态访问,程序运行时不改变资源路径。
- 方式二:使用ResourceManage访问。适合动态访问,程序运行时可动态改变资源路径。
**参考链接**
[资源访问](../quick-start/resource-categories-and-access.md)[资源管理](../reference/apis/js-apis-resource-manager.md#getstring)
## XML格式如何转为JSON格式
适用于:Openharmony 3.2 Beta5 API 9
**问题现象**
服务端返回的数据是通过base64编码后XML格式,需要转为JSON格式进行后续的处理。
**解决措施**
使用util工具中的base64相关接口进行解码操作,然后使用convertxml组件解析XML格式数据。
**代码示例**
```
import convertxml from '@ohos.convertxml';
import util from '@ohos.util';
@Entry
@Component
struct Faq_4_31 {
@State message: string = 'base64转json'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
/* 原数据,GBK编码
<?xml version="1.0" encoding="GBK"?>
<data>
<asset_no>xxxxx</asset_no>
<machine_sn>xxxx</machine_sn>
<bios_id>xxxx</bios_id>
<responsible_emp_name><![CDATA[xxxx]]></responsible_emp_name>
<responsible_account><![CDATA[xxxx xxxx]]></responsible_account>
<responsible_emp_no>xxxx</responsible_emp_no>
<responsible_dept><![CDATA[xxxx]]></responsible_dept>
<user_dept><![CDATA[xxxx]]></user_dept>
<user_name><![CDATA[xxx]]></user_name>
<cur_domain_account>xxxx</cur_domain_account>
<asset_loc><![CDATA[--]]></asset_loc>
<asset_loc_cur><![CDATA[]]></asset_loc_cur>
<asset_type>1</asset_type>
<asset_use>For Outsourcing Staff/xxxx</asset_use>
<overdue_date></overdue_date>
<asset_status>xxxx</asset_status>
<asset_period>xxxx</asset_period>
<license></license>
</data>
*/
let src = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iR0JLIj8+CjxkYXRhPgo8YXNzZXRfbm8+eHh4eHg8L2Fzc2V0X25vPgo8bWFjaGluZV9zbj54eHh4PC9tYWNoaW5lX3NuPgo8Ymlvc19pZD54eHh4PC9iaW9zX2lkPgo8cmVzcG9uc2libGVfZW1wX25hbWU+PCFbQ0RBVEFbeHh4eF1dPjwvcmVzcG9uc2libGVfZW1wX25hbWU+CjxyZXNwb25zaWJsZV9hY2NvdW50PjwhW0NEQVRBW3h4eHggeHh4eF1dPjwvcmVzcG9uc2libGVfYWNjb3VudD4KPHJlc3BvbnNpYmxlX2VtcF9ubz54eHh4PC9yZXNwb25zaWJsZV9lbXBfbm8+CjxyZXNwb25zaWJsZV9kZXB0PjwhW0NEQVRBW3h4eHhdXT48L3Jlc3BvbnNpYmxlX2RlcHQ+Cjx1c2VyX2RlcHQ+PCFbQ0RBVEFbeHh4eF1dPjwvdXNlcl9kZXB0Pgo8dXNlcl9uYW1lPjwhW0NEQVRBW3h4eF1dPjwvdXNlcl9uYW1lPgo8Y3VyX2RvbWFpbl9hY2NvdW50Pnh4eHg8L2N1cl9kb21haW5fYWNjb3VudD4KPGFzc2V0X2xvYz48IVtDREFUQVstLV1dPjwvYXNzZXRfbG9jPgo8YXNzZXRfbG9jX2N1cj48IVtDREFUQVtdXT48L2Fzc2V0X2xvY19jdXI+Cjxhc3NldF90eXBlPjE8L2Fzc2V0X3R5cGU+Cjxhc3NldF91c2U+Rm9yIE91dHNvdXJjaW5nIFN0YWZmL3h4eHg8L2Fzc2V0X3VzZT4KPG92ZXJkdWVfZGF0ZT48L292ZXJkdWVfZGF0ZT4KPGFzc2V0X3N0YXR1cz54eHh4PC9hc3NldF9zdGF0dXM+Cjxhc3NldF9wZXJpb2Q+eHh4eDwvYXNzZXRfcGVyaW9kPgo8bGljZW5zZT48L2xpY2Vuc2U+CjwvZGF0YT4='
let base64 = new util.Base64Helper();
// base解码
let src_uint8Array = base64.decodeSync(src);
// 解码为utf-8的字符串
let textDecoder = util.TextDecoder.create("utf-8",{ignoreBOM: true})
let src_str = textDecoder.decodeWithStream(src_uint8Array)
//替换encoding字段
src_str = src_str.replace("GBK","utf-8")
console.log('Test src_str: ' + JSON.stringify(src_str));
// 转换 xml-> json
let conv = new convertxml.ConvertXML();
let options = {trim : false, declarationKey:"_declaration",
instructionKey : "_instruction", attributesKey : "_attributes",
textKey : "_text", cdataKey:"_cdata", doctypeKey : "_doctype",
commentKey : "_comment", parentKey : "_parent", typeKey : "_type",
nameKey : "_name", elementsKey : "_elements"}
let src_json = JSON.stringify(conv.convertToJSObject(src_str, options));
console.log('Test json: ' + JSON.stringify(src_json));
})
}
.width('100%')
}
.height('100%')
}
}
```
## 通过try/catch语句获取到错误码401是什么意思
适用于:Openharmony 3.2 Beta5 API 9
**问题原因**
1. 必选参数没有传入。
2. 参数类型错误。
3. 参数为undefined。
**参考链接**
[通用错误码](../reference/errorcodes/errorcode-universal.md)
# 包管理开发常见问题
## 如何判断某个应用是否为系统应用
适用于OpenHarmony 3.2 Beta5 API 9
**解决措施**
使用bundleManager模块的getApplicationInfo接口(仅系统应用可以使用)获取待检验应用的ApplicaitonInfo,根据ApplicaitonInfo中systemApp字段判断,若为true,则是系统应用,否则为非系统应用。
**参考链接**
[bundleManager模块](../reference/apis/js-apis-bundleManager.md)
## 如何获取应用配置的versionCode和versionName
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
首先通过@ohos.bundle.bundleManager模块bundleManager.getBundleInfoForSelf\(\)接口获取包信息BundleInfo,然后分别通过BundleInfo.versionCode、BundleInfo.versionName获取所需信息。
**代码示例**
```
import bundleManager from '@ohos.bundle.bundleManager';
import hilog from '@ohos.hilog';
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT;
try {
bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {
const versionCode = data.versionCode;
const versionName = data.versionName;
hilog.info(0x0000, 'testTag', `successfully. versionCode: ${versionCode}, versionName: ${versionName}`);
}).catch(err => {
hilog.error(0x0000, 'testTag', 'failed. Cause: %{public}s', err.message);
});
} catch (err) {
hilog.error(0x0000, 'testTag', 'failed: %{public}s', err.message);
}
```
**参考链接**
[getBundleInfoForSelf](../reference/apis/js-apis-bundleManager.md#bundlemanagergetbundleinfoforself)
## 如何获取应用自身的bundleName
适用于:Openharmony 3.2 Beta5 API9
**解决措施**
可以通过UIAbilityContext.abilityInfo.bundleName获取。
**代码示例**
```
import common from '@ohos.app.ability.common';
const context = getContext(this) as common.UIAbilityContext
console.log(`bundleName: ${context.abilityInfo.bundleName}`)
```
**参考链接**
[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontext)[AbilityInfo](../reference/apis/js-apis-bundleManager-abilityInfo.md#abilityinfo)
## 如何获取App版本号,版本名,屏幕分辨率等信息
适用于:OpenHarmony 3.2 Beta5
**解决措施**
1. 通过@ohos.bundle.bundleManager模块中的bundleManager查询bundleInfo。
在bundleInfo中包含App版本号、版本名信息。
```
import bundleManager from '@ohos.bundle.bundleManager';
...
bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION).then((bundleInfo)=>{
let versionName = bundleInfo.versionName;//应用版本名
let versionNo = bundleInfo.versionCode;//应用版本号
}).catch((error)=>{
console.error("get bundleInfo failed,error is "+error)
})
```
2. 在模块@ohos.app.ability.Configuration中获取screenDensity,其中包含屏幕分辨率信息。
```
import common from '@ohos.app.ability.common';
...
let context = getContext(this) as common.UIAbilityContext;
let screenDensity = context.config.screenDensity;
```
## 如何获取应用自身的源文件路径
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
- 方式一:使用应用上下文context获取。
```
this.uiAbilityContext.abilityInfo.applicationInfo.codePath
```
- 方式二:使用@ohos.bundle.bundleManager获取。
1. 导入@ohos.bundle.bundleManager模块,使用bundleManager.getBundleInfoForSelf\(\)获取bundleInfo信息。
2. 使用bundleInfo.appInfo.codePath获取应用源文件路径。
```
import bundleManager from '@ohos.bundle.bundleManager';
bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION).then((bundleInfo)=>{
this.sourcePath = bundleInfo.appInfo.codePath;
})
```
## 能否在本应用中获取到其他应用的HAP包信息
适用于:OpenHarmony 3.2 Beta API 9
根据OpenHarmony的安全设计规范,SDK不提供接口能力给三方应用查询其他应用的包信息(包括但不限于应用名称、版本号等)。
# 应用程序包管理开发常见问题
## 如何获取应用配置的versionCode和versionName
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
通过@ohos.bundle模块bundle.getBundleInfo()接口获取包信息bundleInfo,然后分别通过bundleInfo.versionCode、bundleInfo.versionName
参考文档:[Bundle模块](../reference/apis/js-apis-Bundle.md#bundlegetbundleinfo)
## 如何获取应用自身的bundleName
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
通过可以context.abilityInfo.bundleName获取。
参考文档:[AbilityInfo](../reference/apis/js-apis-bundle-AbilityInfo.md)
## 如何获取应用图标
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
通过\@ohos.bundle模块 getAbilityIcon 接口获取,需要配置权限:ohos.permission.GET_BUNDLE_INFO。
参考文档:[Bundle模块](../reference/apis/js-apis-Bundle.md#bundlegetbundleinfo)
## 如何判断某个应用是否为系统应用
使用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
使用bundle模块的getApplicationInfo接口获取待检验的应用的ApplicationInfo,根据ApplicationInfo中systemApp字段判断,若为true,则是系统应用,否则为非系统应用。
# 网络与连接开发常见问题
## 网络请求中extraData支持哪几种的数据格式
适用于:OpenHarmony SDK 3.2.2.5版本, API9 Stage模型
extraData代表发送请求的额外数据,支持如下数据:
1. 当HTTP请求为POST、PUT方法时,此字段为HTTP请求的content。
2. 当HTTP请求为GET、OPTIONS、DELETE、TRACE、CONNECT方法时,此字段为HTTP请求的参数补充,参数内容会拼接到URL中进行发送。
3. 开发者传入string对象,开发者需要自行编码,将编码后的string传入。
## 如何理解http请求的错误码28
适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型
错误码28代表CURLE_OPERATION_TIMEDOUT,操作超时。网络请求底层使用libcurl库,更多错误码可以查看相应文档。
参考文档:[Curl错误码](https://curl.se/libcurl/c/libcurl-errors.html)
## \@ohos.net.http.d.ts的response错误码返回6是什么意思?
适用于:OpenHarmony SDK 3.2.3.5版本
6表示地址无法解析主机,可以尝试ping一下request中的url,确认是否可以ping通。
更多错误码参考[Curl错误码](https://curl.se/libcurl/c/libcurl-errors.html)
## 调用camera拍摄的照片怎么上传到服务器
适用于:所有版本
具体开发参考文档:[上传下载](https://gitee.com/openharmony/app_samples/tree/master/Network/UploadDownload)
## OpenHarmony的http接口如何设置cookie
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
HttpRequestOptions中的header是一个Object类型,可以直接在header里设置cookie,具体开发参考文档:[数据请求](../reference/apis/js-apis-http.md#request)
## http请求的官方示例代码里的extra data部分怎么写
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
1. 鼠标移到extraData, ctrl+鼠标左键,跳转到sdk中,里面有关于extraData的传参说明。可以发现文档中对extraData的定义为 extraData?: string | Object,也就是extraData支持string 和 Object两种类型。
2. 这两种写法都可以实现:
a.extraData:"data to send";
b. extraData:{ data:"data to send", },
## 设备连接wifi后,如何获取当前设备的IP地址
适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型
使用wifi模块获取ipInfo,然后转换为IP常用格式,注意wifi.getIpInfo()接口需要权限 ohos.permission.GET_WIFI_INFO。
示例:
```
import wifi from '@ohos.wifi'
@Entry
@Component
struct Page {
@State ip: string = '点击获取ip'
resolveIP(ip) {
if (ip < 0 || ip > 0xFFFFFFFF) {
throw ("The number is not normal!");
}
return (ip >>> 24) + "." + (ip >> 16 & 0xFF) + "." + (ip >> 8 & 0xFF) + "." + (ip & 0xFF);
}
build() {
Row() {
Column() {
Text(this.ip)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(()=>{
this.ip = this.resolveIP(wifi.getIpInfo().ipAddress)
})
}
.width('100%')
}
.height('100%')
}
}
```
## 如何判断当前是否有网络
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
通过如下hasDefaultNet接口判断是否有网络,注意需要申请 ohos.permission.GET_NETWORK_INFO 权限
```
connection.hasDefaultNet().then((has)=> {
console.log("hasDefaultNet " + JSON.stringify(has))
})
```
# 数据管理开发常见问题
## 如何将PixelMap的数据存储到数据库中
适用于:OpenHarmony SDK 3.2.3.5版本
PixelMap应该被转换成相应的ArrayBuffer再放进数据库。
参考文档:[readPixelsToBuffer](../reference/apis/js-apis-image.md#readpixelstobuffer7-1)
## 如何获取rdb关系型数据库文件
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
开发者可使用hdc_std命令拷贝文件,其中文件路径为: /data/app/el2/100/database/包名/entry/db/ ,然后拷贝该路径下后缀为 .db、.db-shm、.db-wal的文件,拷贝完成后,可以通过SQLite工具打开该数据库文件。
示例:
```
hdc_std file recv /data/app/el2/100/database/com.xxxx.xxxx/entry/db/test.db ./test.db
```
## 数据库在系统层面是否有锁机制,开发过程中是否需要关系数据库加锁问题
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
系统提供的分布式数据服务、关系型数据库和首选项均有锁机制,开发者无需关注。
## 数据库中加事务与不加事务的区别?
适用于:所有版本
在rdb中进行数据操作时,有可能会导致操作失败,出现意料之外的情况。当对数据库进行大量操作时,此种情况会导致部分数据操作失败,部分操作成功,导致部分数据丢失,可能会导致应用程序发生异常甚至崩溃。加事务后,则会将某一批操作组合成一个整体,要么同时成功,要么同时失败,则不会导致强关联的数据部分缺失的情况出现。
## 关系型数据库rdb支持哪些数据类型?
适用于:OpenHarmony SDK 3.0版本以上,API9 Stage模型
关系型数据库rdb支持的数据类型有:number、string、boolean。其中number为数组类型,支持Double,Long,Float,Int,Int64,最大精度为十进制17位数字。
## 如何查看数据库db文件
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
1. 执行 hdc_std shell 命令进入系统
2. 找到绝对路径:/data/app/el2/&lt;userId默认是100&gt;/database/&lt;bundleName&gt;
或找到沙箱路径:
a. 执行 ps -ef | grep hapName 命令找到对应应用的进程ID,
b. 数据库沙箱路径为:/proc/&lt;应用进程ID&gt;/root/data/storage/el2/database/。
3. 在数据库的绝对路径或者沙箱路径下执行 find ./ -name "\*.db" 即可找到数据库文件。
## 如何存储长文本数据
适用于:OpenHarmony SDK 3.2.5.5版本,API 9
- 首选项Preferences数据中的Value为string类型时最大支持8192字节。
- 分布式数据管理KV数据模型Value最大支持4M。
## Stage模型数据共享DataShare开发
适用于:OpenHarmony SDK 3.2.5.5版本,API 9
Stage模型DataShare不可与FA模型DataAbility混用,连接的服务端应用需使用DataShareExtensionAbility实现。
# 开发板使用常见问题
## 如何获取开发板上截屏图片?
适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型
- 方法一:点击开发板下拉控制中心的截屏按钮,截屏图片通过相册可以查看。
- 方法二:通过截屏脚本一键截屏,可以在电脑上查看。操作方法:Windows上连接开发板,然后电脑上新建文本文件,拷贝如下脚本内容,文件名后缀改为.bat文件(需要提前配置好hdc的环境变量),点击运行后,截屏图片与脚本在同一目录。
示例:
```
set filepath=/data/%date:~0,4%%date:~5,2%%date:~8,2%%time:~1,1%%time:~3,2%%time:~6,2%.png
echo %filepath%
: pause
hdc_std shell snapshot_display -f %filepath%
: pause
hdc_std file recv %filepath% .
: pause
```
## RK3568板子和previewer上展示的效果差异较大,如何把previewer的尺寸调整成实际板子一样。
适用于:IDE 3.0.0.991
1. 给预览器新建Profile
![zh-cn_image_0000001361254285](figures/zh-cn_image_0000001361254285.png)
2. 新建Profile的具体参数可参考如下配置:
Device type : default
Resolution: 720\*1280
DPI: 240
## 开发板安装驱动后设备仍然无法识别,设备管理器错误识别为其他设备:FT232R USB UART ()
可能原因:开发版的USB串口驱动没有安装。
解决办法:搜索FT232R USB UART确定,下载安装驱动即可。
## 在开发板上登录需要认证网络如何进行认证
适用于:OpenHarmony SDK 3.2.2.5版本
连接需要认证的网络后,用浏览器打开任意网址就可以进入认证页面。
如果开发板上没有浏览器,可以安装[浏览器Sample应用](https://gitee.com/openharmony/app_samples/tree/master/device/Browser)
# 设备管理开发常见问题
## 如何获取设备的dpi值
适用于:OpenHarmony 3.2 Beta5,API9 Stage模型
**问题现象**
获取设备的dpi信息。
**解决措施**
导入@ohos.display包,通过getDefaultDisplaySync方法获取。
**示例代码**
```
import display from '@ohos.display';
let displayClass = null;
try {
displayClass = display.getDefaultDisplaySync();
console.info('Test densityDPI:' + JSON.stringify(data.densityDPI));
} catch (exception) {
console.error('Failed to obtain the default display object. Code: ' + JSON.stringify(exception));
}
```
## 如何获取当前运行设备类型
适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型
导入\@ohos.deviceInfo包,然后通过deviceInfo.deviceType获取设备类型。
参考文档:[设备信息](../reference/apis/js-apis-device-info.md)
## 如何获取设备系统版本
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过[deviceInfo](../reference/apis/js-apis-device-info.md)对象的osFullName属性获取设备系统版本。
## OpenHarmony设备如何获取UDID?
适用于:OpenHarmony SDK3.0, API9 Stage模型
1. 如果想获取连接设备的udid,可使用 hdc shell bm get --udid命令;
2. 如果想在代码中获得,参考文档 [udid](../reference/apis/js-apis-device-info.md)
## 开发快捷键功能
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
快捷键功能开发请使用组合按键api,具体可参考[组合按键(InputConsumer)](../reference/apis/js-apis-inputconsumer.md)
# DFX开发常见问题 # DFX开发常见问题
## 程序打开直接崩溃了,如何定位问题 ## hilog日志如何落盘存储
使用于:OpenHarmony SDK 3.2.5.5版本 适用于:OpenHarmony 3.2Beta API 9
1. 通过业务日志打印,定位崩溃的代码位置。 **问题现象**
2. 通过Crash文件查看报错信息,Crash文件路径是:/data/log/faultlog/faultlogger/。 hilog日志如何落盘存储
## UiTest测试框架无法获取控件问题 **解决措施**
使用于:OpenHarmony SDK 3.2.5.5版本 使用命令:hilog -w start -f ckTest -l 1M -n 5 -m zlib -j 11
检查系统配置项 persist.ace.testmode.enabled 是开启。 文件保存在目录:/data/log/hilog/
通过hdc_std shell param get persist.ace.testmode.enabled 查看,若配置项为0, 参数解释:
可通过命令hdc_std shell param set persist.ace.testmode.enabled 1 开启配置。 ```
-w 开启日志落盘任务,start表示开始,stop表示停止。
-f 设置日志文件名
-l 设置单个日志文件大小,单位可以是:B/K/M/G
-n 设置最大日志文件编号,当文件计数超过此编号时,日志文件旋转。范围:【2,1000】
-m 设置日志文件压缩算法
-j 任务ID,范围:[10,0xffffffffff)
更多参数含义请使用hilog --help查看。
```
## C++代码中hilog的格式参数类型为%d或者%s时,日志打印为何显示private
直接使用%d、%s等格式化参数时,标准系统默认使用private替换真实数据进行打印,防止数据泄露。如果需要打印出真实数据,需要使用%{public}d替换%d或者%{public}s替换%s。
## 如何解决hilog.debug日志无法打印
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过hdc_std命令 hdc_std shell hilog -b D开启调试开关
## 应用如何打印日志是使用hilog还是console,hilog接口参数domain的设置范围是什么
适用于:OpenHarmony SDK 3.2.2.5版本
推荐使用[hilog日志系统](../reference/apis/js-apis-hilog.md)进行日志打印,接口参数domain的设置范围可以参考[开发指南](../reference/apis/js-apis-hilog.md#hilogisloggable)
## hilog日志打印长度限制是多少,是否可以配置
适用于:OpenHarmony SDK 3.2.2.5版本
日志打印的长度限制为1024个字符,该长度不能配置。
## hilog接口的tag参数是否支持用空格隔开的多个字符串
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
不支持。
## hilog中没有使用{public}标识的数据,如何打印真实数据
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
使用命令:hdc_std shell hilog -p off
# 数据管理开发常见问题
## 关系型数据库rdb中如何进行加密
适用于:Openharmony 3.1 Beta5 API 9
**解决措施**
创建关系型数据库,可通过StoreConfig管理关系型数据库配置,其中encrypt属性指定数据库是否加密。
**参考链接**
[关系型数据库](../reference/apis/js-apis-data-relationalStore.md#storeconfig)
## 关系型数据库rdb中使用TRUNCATE TABLE语句无法清空表数据
适用于:OpenHarmony SDK 3.2.9.2版本,API9
**问题现象**
通过TRUNCATE TABLE语句清空表数据时报错。
**解决措施**
关系型数据库rdb使用Sqlite数据库, 它不支持 TRUNCATE TABLE 语句,建议使用delete语句,如:DELETE FROM sqlite\_sequence WHERE name = 'table\_name' ,另外发生该错误会抛出空异常。
## 关系型数据库rdb支持哪些数据类型
适用于:OpenHarmony SDK 3.0版本以上,API 9 Stage模型
**解决措施**
关系型数据库rdb支持的数据类型有:number、string、boolean。其中number为数字类型,支持Double,Long,Float,Int,Int64,最大精度为十进制17位数字。
## 如何将PixelMap的数据存储到数据库中
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
存储PixelMap的数据
**解决措施**
PixelMap应该被转换成相应的ArrayBuffer再放进数据库。
**参考链接**
[readPixelsToBuffer](../reference/apis/js-apis-image.md#readpixelstobuffer7-1)
## 如何获取rdb关系型数据库文件
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
关系型数据库的获取问题
**解决措施**
开发者可使用hdc命令拷贝文件,其中文件路径为: /data/app/el2/100/database/包名/entry/rdb/ ,然后拷贝该路径下的文件,拷贝完成后,可以通过SQLite工具打开该数据库文件。
示例:
```
hdc file recv /data/app/el2/100/database/<bundleName>/entry/db/<tableName> ./<path>
```
## 数据库在系统层面是否有锁机制,开发过程中是否需要关系数据库加锁问题
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
关系型数据库的加锁疑问
**解决措施**
系统提供的分布式数据服务、关系型数据库和首选项均有锁机制,开发者无需关注。
## 在@ohos.data.storage轻量级存储中,调用put方法保存数据后,再重启应用后调用get方法为什么无法获取到保存的值
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
关系型数据库的保存以及重启时的调用
**解决措施**
在storage轻量级存储中,调用put方法,只是将数据保存在内存中,并不会持久化到硬盘中,在退出应用后会将内存中的数据清空。如果想持久化到硬盘中,则在调用put方法后需要再调用flush或flushSync接口才行。数据持久化后重启应用时就可以通过get方法获取到之前保存的数据。
## rdb关系型数据库中TEXT类型保存超长文本失败
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
API8版本rdb关系型数据库中TEXT类型保存超长文本失败
**解决措施**
API9版本之前对TEXT文本存储长度限制在1024字节,所以会存在超长文本保存失败的情况。
在API9的版本中已经放开了长度限制。
# 分布式设备开发常见问题
## OpenHarmony设备如何查看IMEI号
适用于:Openharmony 3.2 Beta5 API 9
**解决方案**
通过HuksTag接口的HUKS\_TAG\_ATTESTATION\_ID\_IMEI参数可以获取。[参考文档](../reference/apis/js-apis-huks.md)
# 公共事件与通知开发常见问题 # 事件通知开发常见问题
## emitter数据大小限制 ## 如何封装一个通用的commonEvent工具类
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 适用于OpenHarmony 3.1 Beta5 API 9
emitter数据大小限制不超过10240。 **问题现象**
## 如何实现点击Notification通知打开对应App 封装一个通用的commonEvent工具类:希望在创建订阅者的同时注册一个自定义的回调函数,然后在收到事件通知的同时能调用这个自定义的回调函数。
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 **解决措施**
通过配置Notification.publish发布通知接口的参数NotificationRequest中wantAgent属性实现 ```
import commonEvent from '@ohos.commonEventManager';
参考文档:[Notification](../reference/apis/js-apis-notification.md#notificationpublish)[WantAgent](../reference/apis/js-apis-app-ability-wantAgent.md) export class SubscribeEvent {
private static subscriber = null
// 自定义的回调函数变量
private static callback = null
/**
* 创建订阅者
* @param subscribeInfo 订阅事件
* @callback 用户自定义回调函数
*/
static createSubscriber(subscribeInfo, callback:(a,b)=>void) {
this.callback = callback
commonEvent.createSubscriber(subscribeInfo, (err, subscriber) => {
if (err) {
console.error('CreateSubscriberCallBack err = ' + JSON.stringify(err))
} else {
this.subscriber = subscriber;
this.subscribe(this.subscriber)
console.info('Create subscriber succeed')
}
})
}
示例: /**
* 订阅公共事件
* @param subscriber 订阅者
*/
private static subscribe(subscriber) {
if (subscriber != null) {
commonEvent.subscribe(subscriber, (err, data) => {
if (err) {
console.error('subscribe err = ' + JSON.stringify(err))
} else {
console.info('SubscribeCallBack data= ' + JSON.stringify(data))
this.callback('hello callback', data)
}
})
} else {
console.info("Need create subscriber")
}
}
}
```ts @Entry
import WantAgent from '@ohos.app.ability.wantAgent'; @Component
struct Faq10_1 {
@State message: string = ''
async function publishNotification() { build() {
let wantAgentInfo = { Row() {
wants: [ Column() {
{ Text('订阅:' + this.message)
bundleName: "com.example.myapplication", .fontSize(30)
abilityName: "EntryAbility", .fontWeight(FontWeight.Bold)
.onClick(() => {
let subscribeInfo = {
events: ["myEvent"]
};
let callback = (a,b) => {
this.message = a
}
SubscribeEvent.createSubscriber(subscribeInfo,callback)
})
Text('发布')
.fontSize(30)
.fontWeight(FontWeight.Bold)
.onClick(() => {
//公共事件相关信息
let options = {
code: 0, //公共事件的初始代码
data: "initial data",//公共事件的初始数据
isOrdered: true //有序公共事件
}
//发布公共事件回调
function publishCB(err) {
if (err) {
console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("publish");
}
}
//发布公共事件
try {
commonEvent.publish("myEvent", options, publishCB);
} catch (err) {
console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
}
})
} }
], .width('100%')
operationType: WantAgent.OperationType.START_ABILITIES, }
requestCode: 0, .height('100%')
} }
const wantAgent = await WantAgent.getWantAgent(wantAgentInfo)
let contentType = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT;
await Notification.publish({
content: {
contentType: contentType,
normal: {
title: "测试标题",
text: "测试内容",
}
},
id: 1,
wantAgent: wantAgent
})
prompt.showToast({ message: "发送成功" })
} }
``` ```
**参考链接**
[公共事件模块](../reference/apis/js-apis-commonEventManager.md)
## 如何让事件只在一个UIAbility实例中传递
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
应该如何实现事件只在一个UIAbility实例中订阅和触发
**解决措施**
在UIAbility中使用EventHub订阅事件,EventHub模块提供了事件中心,提供订阅、取消订阅、触发事件的能力
**代码示例**
```
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
onForeground() {
this.context.eventHub.on('myEvent', this.eventFunc);
// 结果:
// eventFunc is called,undefined,undefined
this.context.eventHub.emit('myEvent');
// 结果:
// eventFunc is called,1,undefined
this.context.eventHub.emit('myEvent', 1);
// 结果:
// eventFunc is called,1,2
this.context.eventHub.emit('myEvent', 1, 2);
}
eventFunc(argOne, argTwo) {
console.log('eventFunc is called, ${argOne}, ${argTwo}');
}}
```
**参考链接**
[使用EventHub进行数据](../application-models/uiability-data-sync-with-ui.md#使用eventhub进行数据通信)
# 文件管理开发常见问题 # 文件管理开发常见问题
## fileio.rmdir是递归删除吗? ## 如何获取系统截屏图片的保存路径
适用于:OpenHarmony SDK 3.2.6.3版本,API9 Stage模型 适用于OpenHarmony 3.2 Beta5 API 9
是递归删除。 **解决措施**
## 如何实现如果文件不存在则创建文件 截图图片保存路径:/storage/media/100/local/files/Pictures/Screenshots/
适用于:OpenHarmony SDK 3.2.6.3版本,API9 Stage模型 ## 如何修改设备中文件目录为可读写权限
可以通过调用函数fileio.open(filePath, 0o100, 0o666)来实现,第二个参数0o100表示若文件不存在,则创建文件。使用该选项时必须指定第三个参数 mode。 适用于OpenHarmony 3.2 Beta5 API 9
## 使用fileio进行文件复制,传入沙箱路径报错call fail callback fail, code: 202, data: json arguments illegal) **问题现象**
适用于:OpenHarmony SDK 3.2.6.3版本,API9 Stage模型 使用hdc命令向设备上发送文件时,报错:权限不足。
使用fileio模块进行文件复制时,文件路径前缀中不能以“file:///”开头。 **解决措施**
## fileIo将数据写入流文件writeSync接口,length传参问题 输入命令 hdc shell mount -o remount,rw /,正确执行无提示信息。
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
一个中文字符length为3,英文字符为1,当前buffer为string类型时,length项需要开发者手动换算;如果要写入全部内容,可直接忽略length项,length长度超长时会导致接口报错。
## 如何读取应用沙箱之外的文件
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
fileio中接口入参为path时只能是从context获取到的本应用沙箱路径,若要访问其他路径的数据,如公共数据图片视频等,需要通过数据所有者打开文件返回fd进行操作。
比如向mediaLibrary请求读取/写入某文件,然后通过打开代表特定文件的URI后返回的fd进行操作,操作步骤如下:
1. 通过媒体查询获取文件fileAsset对象;
2. 通过fileAsset.open方法返回的fd;
3. 将fd作为fileIo接口参数进行文件读写操作;
## 如何解决文件的中文内容乱码
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
读取文件内容的buffer数据后,通过util.TextDecoder对文件内容进行解码。
示例:
```
import util from '@ohos.util'
async function readFile(path) {
let stream = fileio.createStreamSync(path, "r+");
let readOut = await stream.read(new ArrayBuffer(4096));
let textDecoder = new util.TextDecoder("utf-8", { ignoreBOM: true });
let buffer = new Uint8Array(readOut.buffer)
let readString = textDecoder.decode(buffer, { stream: false });
console.log("[Demo] 读取的文件内容:" + readString);
}
```
## 调用媒体库getAlbums方法,没有收到返回,也没有捕获到异常是为什么
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
getAlbums方法需要权限:ohos.permission.READ_MEDIA,从[OpenHarmony权限定义列表](../security/permission-list.md)查询知道ohos.permission.READ_MEDIA权限是需要用户授权。
1. 在module.json5中配置权限:
```
"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA"
}
]
```
2. 在MainAbility.ts -&gt; onWindowStageCreate页面加载前需要增加用户授权代码:
```
import abilityAccessCtrl from '@ohos.abilityAccessCtrl.d.ts';
private requestPermissions() {
let permissionList: Array<string> = [
"ohos.permission.READ_MEDIA"
];
let atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(this.context, permissionList)
.then(data => {
console.info(`request permission data result = ${data.authResults}`)
})
.catch(err => {
console.error(`fail to request permission error:${err}`)
})
}
```
## 如何解决多次通过媒体库FetchFileResult获取文件应用崩溃
适用于:OpenHarmonySDK 3.2.5.5版本,API9 Stage模型
通过FetchFileResult.close()方法,在FetchFileResult对象每次调用完,释放并使其失效。
## 在Stage模型下调用mediaLibrary.getMediaLibrary()接口,IDE报错
适用于:OpenHarmonySDK 3.2.5.5版本,API9 Stage模型
Stage模型下,获取媒体库实例应该调用mediaLibrary.getMediaLibrary(context: Context)。
## 调用mediaLibrary.getFileAssets()接口返回的内容如何排序
适用于:OpenHarmonySDK 3.2.5.5版本,API9 Stage模型
通过[MediaFetchOptions](../reference/apis/js-apis-medialibrary.md#mediafetchoptions7)对象参数里面的order属性进行排序。
# 资源管理开发常见问题
## 如何读取rawfile中的xml文件并转化为String类型
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
通过resourceManager的getRawFileContent接口获取xml数据,再通过String.fromCharCode将获取的数据转化为String类型。
**代码示例**
```
resourceManager.getRawFileContent('test.xml', (error, value) => {
if (error != null) {
console.log("error is " + error);
} else {
let rawFile = value;
let xml = String.fromCharCode.apply(null, rawFile)
}
});
```
**参考链接**
[资源管理](../reference/apis/js-apis-resource-manager.md)
## Stage模型下如何获取资源
适用于:OpenHarmony 3.1 Beta5 API 9
**解决措施**
Stage模型支持了通过context获取resourceManager对象的方式,再调用其内部获取资源的接口,无需再导入包。此方式不适用于FA模型。
**代码示例**
```
const context = getContext(this) as any
context
.resourceManager
.getString($r('app.string.entry_desc').id)
.then(value => {
this.message = value.toString()
})
```
## 如何通过接口获取resource目录的路径
适用于:Openharmony 3.1 Beta5 API 9
**问题现象**
希望获取resource目录的路径,从而使用文件管理接口操作文件。
**解决措施**
由于应用以hap形式进行安装,安装完成后不会解压hap包,所以在程序运行时无法获取resource路径。
可以考虑如下两种方式获取资源文件:
1. 使用\$r或者\$rawfile访问。适合静态访问,程序运行时不改变资源路径。
2. 使用ResourceManage访问。适合动态访问,程序运行时可动态改变资源路径。
**参考链接**
[资源分类与访问](../quick-start/resource-categories-and-access.md) [资源管理](../reference/apis/js-apis-resource-manager.md)
## 资源管理内的getPluralString方法获取value值有误
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
getPluralString接口获取value值有误,显示复数值(other)。
**解决措施**
getPluralString接口只支持英文系统,不支持中文。
## 如何获取resources目录中自定义的string字段
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
使用ResourceManager模块的getStringValue方法获取。
**参考链接**
[资源管理](../reference/apis/js-apis-resource-manager.md#getstringvalue9)
## AppScope中的资源如图片,文字等如何引用
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
通过\$r\('app.type.name'\)的形式来引用,type代表资源类型,如color,string,media等,name代表资源命名。
## Resource类型如何转为String
适用于:OpenHarmony 3.2 Beta5 API 9
**解决措施**
Resource为string支持限定词目录使用this.context.resourceManager.getStringSync\(\$r\('app.string.test'\).id\),可以同步转换,不支持\$r\('app.string.test', 2\)方式。
**参考链接**
[ResourceManager\(资源管理\)](../reference/apis/js-apis-resource-manager.md#getstringsync9)
## form\_config.json文件中是否可以使用$引用常量
适用于:OpenHarmony 3.2 Beta5 API 9
form\_config.json文件中不支持使用\$引用常量。
# 图形图像开发常见问题 # 图形图像开发常见问题
## 调用window实例的setSystemBarProperties接口时,设置isStatusBarLightIcon和isNavigationBarLightIcon属性不生效 ## 如何获取设备的dpi值
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 适用于:OpenHarmony 3.2 Beta5,API 9 Stage模型
状态栏字体高亮属性的本质就只是让字体变成白色。调用window实例的setSystemBarProperties接口时,如果设置了状态栏内容颜色statusBarContentColor,就以开发者设置的颜色为准,isStatusBarLightIcon状态栏字体高亮属性就不生效;同理,如果设置了导航栏内容颜色navigationBarContentColor,isNavigationBarLightIcon导航栏字体高亮属性就不生效。 **解决措施**
## 如何设置系统状态栏样式 导入@ohos.display包,通过getDefaultDisplaySync\(\)方法获取。
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 **代码示例**
导入\@ohos.window模块,开发者可以使用window.setSystemBarProperties()接口设置状态栏样式属性,达到自定义样式的效果。 ```
import display from '@ohos.display';
## 如何隐藏状态栏,实现沉浸式效果 let displayClass = null;
try {
适用于:OpenHarmony SDK 3.2.6.3版本,API9 Stage模型 displayClass = display.getDefaultDisplaySync();
console.info('Test densityDPI:' + JSON.stringify(displayClass.densityDPI));
1. 可以在onWindowStageCreate方法获取windowClass对象。 } catch (exception) {
console.error('Failed to obtain the default display object. Code: ' + JSON.stringify(exception));
```ts }
onWindowStageCreate(windowStage) { ```
// Main window is created, set main page for this ability
console.log("[Demo] EntryAbility onWindowStageCreate") ## 如何隐藏状态栏实现沉浸式效果
windowStage.getMainWindow((err, data) => {
if (err.code) { 适用于:OpenHarmony 3.2 Beta5,API 9 Stage模型
console.error('Failed to obtain the main window.')
return; **解决措施**
}
// 获取到窗口对象 1. 可以在onWindowStageCreate方法获取windowClass对象。
globalThis.windowClass = data;
}) ```
} onWindowStageCreate(windowStage) {
``` // Main window is created, set main page for this ability
console.log("[Demo] MainAbility onWindowStageCreate")
2. 设置窗口全屏,隐藏状态栏。 windowStage.getMainWindow((err, data) => {
if (err.code) {
```ts console.error('Failed to obtain the main window.')
globalThis.windowClass.setFullScreen(isFullScreen, (err, data) => { return;
if (err.code) { }
console.error('Failed to enable the full-screen mode. Cause:' + JSON.stringify(err)); // 获取到窗口对象
return; globalThis.windowClass = data;
} })
console.info('Succeeded in enabling the full-screen mode. Data: ' + JSON.stringify(data)); }
}); ```
```
2. 设置窗口全屏,隐藏状态栏。
```
globalThis.windowClass.setFullScreen(isFullScreen, (err, data) => {
if (err.code) {
console.error('Failed to enable the full-screen mode. Cause:' + JSON.stringify(err));
return;
}
console.info('Succeeded in enabling the full-screen mode. Data: ' + JSON.stringify(data));
});
```
## 如何获取窗口的宽高信息 ## 如何获取窗口的宽高信息
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 适用于:OpenHarmony SDK 3.2 Beta5,API 9 Stage模型
通过\@ohos.window模块,可以使用getProperties()接口获取窗口属性,然后通过窗口属性的windowRect获取窗口宽高信息 **解决措施**
示例: 引入窗口模块@ohos.window,获取指定窗口对象Window后,在该对象上使用getWindowProperties\(\)获取窗口各个属性,在属性windowRect中获取窗口宽高信息。
**代码示例**
```ts
let promise = windowClass.getProperties();
promise.then((data)=> {
console.info('Succeeded in obtaining the window properties. Data: ' + JSON.stringify(data.windowRect));
}).catch((err)=>{
console.error('Failed to obtain the window properties. Cause: ' + JSON.stringify(err));
});
``` ```
import window from '@ohos.window';
## 如何设置系统状态栏颜色 let windowClass = null;
try {
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 let promise = window.getLastWindow(this.context);
promise.then((data)=> {
参考如下方式实现,示例: //获取窗口对象
windowClass = data;
try {
```ts //获取窗口属性
window.getTopWindow(globalThis.mainContext).then(win => { let properties = windowClass.getWindowProperties();
var systemBarProperties = { let rect = properties.windowRect;
statusBarColor: '#19B6FF', // 状态栏背景颜色 //rect.width: 窗口宽度;rect.height: 窗口高度
navigationBarColor: '#19B6FF', // 导航栏背景颜色 } catch (exception) {
isStatusBarLightIcon: false, // 状态栏图标是否为高亮状态。 console.error('Failed to obtain the window properties. Cause: ' + JSON.stringify(exception));
isNavigationBarLightIcon: true, // 导航栏图标是否为高亮状态。 }
statusBarContentColor: '#0D0500', // 状态栏文字颜色 console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data));
navigationBarContentColor: '#FFA500' // 导航栏文字颜色 }).catch((err)=>{
}; console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err));
win.setSystemBarProperties(systemBarProperties).catch(err => { });} catch (exception) {
INDEX_LOGGER.info(`set System Bar Properties failed:${err}`) console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(exception));
}) }
})
.catch(err => {
INDEX_LOGGER.info(`get top window failed:${err}`)
})
``` ```
# IDE使用常见问题
## 如何解决报错“npm ERR! code SELF_SIGNED_CERT_IN_CHAIN”
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
1. 在Dev Eco Studio terminal中执行npm config set strict-ssl=false;
2. 在Dev Eco Studio terminal中执行npm install。
## 手工更新DevEco的SDK后,编译HAP报错“Cannot find module 'xxx\ets\x.x.x.x\build-tools\ArkTS-loader\node_modules\webpack\bin\webpack.js'”
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
1. 到SDK的ets\x.x.x.x\build-tools\ets-loader目录下执行npm install;
2. 到SDK的js\x.x.x.x\build-tools\ace-loader目录下执行npm install。 完成步骤后重新编辑。
## 如何通过命令行打包HAP
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
方式一:运行hvigor assembleHap。
方式二:在工程的package.json的scripts中,定义构建任务脚本后,运行npm buildOhosHaps。“buildOhosHaps”字段可以自定义。
```
"scripts": {
"buildOhosHaps": "hvigor assembleHap"
},
```
## DevEco创建新工程为什么选不到API9
适用于:DevEco Studio 3.0 Beta4 3.0.0.993(B06)版本
创建新工程的时候,首先要选择OpenHarmony页签再创建工程就可以选到API9。
## 下载时收不到回调且无法返回错误码
适用于:OpenHarmony所有版本
1. 重装hdc命令: hdc_std重裝 拉起 设备连接
2. 关闭日志限流 :hdc_std shell hilog -Q pidoff 打开"
## IDE点击run按钮后,报错:error: unknow option. usage: aa start &lt;options&gt;
适用于:OpenHarmony SDK 3.2.5.6版本,API9 Stage模型
报错原因:aa命令参数错误,执行打开应用操作报错。
有2种处理方法:
1. 检查SDK版本和OS版本,确保SDK版本和OS版本一致。
2. 点击设备上app图标,手动启动app进行使用。
## IDE运行app报错:The hdc_std version of the SDK does not match the hdcd version of the device.
适用于:OpenHarmony SDK 3.2.5.6版本,API9 Stage模型
hdc 和 hdcd版本不匹配 ,请更新IDE至Dev Eco 3.0.1.993及以上版本。
旧版本IDE检测不匹配会拦截安装,新版本IDE仅提醒不影响正常使用。
## 如何在OpenHarmony 的SDK中加入自定义的\*.d.ts文件
适用于:OpenHarmony SDK 3.1.7.7版本 , API8 FA模型
将dts文件命名为\@ohos.xxxx.d.ts , 放入SDK的路径中,重启IDE。
引入时会有代码提醒。
## 如何替换full-SDK
适用于:OpenHarmony SDK 3.2.7.5版本
参考文档[full-SDK替换指南](../quick-start/full-sdk-switch-guide.md)
# 国际化开发常见问题
## AppScope中的资源如图片,文字等的引用方式是什么
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过$r('app.type.name')的形式来引用,type代表资源类型,如color,string,media等,name代表资源命名
## Resource类型转为string
适用于:OpenHarmony SDK3.0, API9 Stage模型
Resource为string支持限定词目录使用this.context.resourceManager.getStringSync(\\$r('app.string.test').id),可以同步转换,不支持\$r('app.string.test', 2)方式。更多用法请参考[ResourceManager(资源管理)](../reference/apis/js-apis-resource-manager.md#getstringsync9)
## form_config.json文件中使用$引用常量为什么不生效
适用于:OpenHarmony SDK 3.2.6.5, API9 Stage模型
form_config.json文件中不支持使用$引用常量。
# 开发语言常见问题
## TS语言在生成器函数中编译失败,有哪些使用限制
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
TS语言的使用在生成器函数中存在以下限制:
- 表达式仅允许在字符串(${expression})、if条件、ForEach的参数和组件的参数中使用;
- 这些表达式中的任何一个都不能导致任何应用程序状态变量(\@State、\@Link、\@Prop)的改变,否则会导致未定义和潜在不稳定的框架行为;
- 生成器函数内部不能有局部变量。
上述限制都不适用于事件处理函数(例如onClick)的匿名函数实现。
错误示例:
```
build() {
let a: number = 1 // invalid: variable declaration not allowed
Column() {
Text('Hello ${this.myName.toUpperCase()}') // ok.
ForEach(this.arr.reverse(), ..., ...) // invalid: Array.reverse modifies the @State array variable in place
}
buildSpecial() // invalid: no function calls
Text(this.calcTextValue()) // this function call is ok.
}
```
## 如何动态替换掉资源文件中的“%s”占位符
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
在应用中,通过"$r('app.string.xx')"的形式引用应用资源,$r的第二个参数可用于替换%s占位符。
示例:
```
build() {
//do something
//引用的string资源,$r的第二个参数用于替换%s
Text($r('app.string.entry_desc','aaa'))
.fontSize(100)
.fontColor(Color.Black)
//do something
}
```
## 如何读取Resource中的xml文件并转化为String类型
适用于:OpenHarmony SDK 3.2.2.5版本, API9 Stage模型
1. 通过resourceManager的RawFile接口获取Uint8Array格式数据。
2. 通过String.fromCharCode将Uint8Array格式数据转化为String类型。
参考文档:[资源管理](../reference/apis/js-apis-resource-manager.md)
示例:
```
resourceManager.getRawFile(path, (error, value) => {
if (error != null) {
console.log("error is " + error);
} else {
let rawFile = value;
let xml = String.fromCharCode.apply(null, rawFile)
}
});
```
## 如何将Resource资源对象转成string类型
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
通过\@ohos.resourceManager模块 resourceManager.getString()方法获取字符串。
参考文档:[资源管理](../reference/apis/js-apis-resource-manager.md#getstring)
## class全局静态变量无法使用的问题
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
Page和Ability打包后会对import的对象分别形成两个不同的闭包,即打包出两个Global对象。因此,所引用的静态变量并不是同一对象,所以无法通过class静态变量方式定义全局变量。建议使用AppStorage进行全局变量管理。
## Stage模型下如何获取资源
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
Stage模型支持了通过context获取resourceManager对象的方式,再调用其内部获取资源的接口,无需再导入包,此方式FA模型不适用。
示例:
```
const context = getContext(this) as any
context
.resourceManager
.getString($r('app.string.entry_desc').id)
.then(value => {
this.message = value.toString()
})
```
## 如何实现页面加载前从接口获取数据
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
aboutToAppear函数中使用异步接口获取页面数据,使用\@State修饰变量,数据获取完成后根据变量自动刷新页面。
```
@Entry
@Component
struct Test6Page {
// 数据获取成功,会自动刷新页面
@State message: string = 'loading.....'
aboutToAppear(){
// 模拟异步接口获取数据
setTimeout(()=>{
this.message = 'new msg'
},3000)
}
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}
```
## worker线程与主线程是否运行在相同的全局上下文中
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
worker线程与主线程不在同一个上下文中,它们使用数据通信的方式交互。
## OpenHarmony上url编码使用哪个接口
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
使用全局函数encodeURI进行编码,使用decodeURI进行解码。例如空格字符,编码后为%20。
## OpenHarmony有解析xml的接口吗
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
使用ConvertXML的convert接口可以将xml文本解析为JavaScript对象。参考文档:[convertxml API文档](../reference/apis/js-apis-convertxml.md)
## 应用图标一多设置
适用于:OpenHarmony SDK3.0, API9 Stage模型
借助资源限定词能力,实现应用图标的一多配置,具体使用参考[资源使用](../key-features/multi-device-app-dev/resource-usage.md)
## Stage模型资源配置文件string.json文件中支持配置占位符吗
适用于:OpenHarmony SDK3.2.6.3, API9 Stage模型
资源配置文件string.json文件本身不支持配置占位符,可以在对应的页面中通过定义变量,在实际组件使用Resources和变量拼接的方式达到实现占位符的同等效果。
## OpenHarmony的systemTime.getCurrentTime()接口和JS的new Date().getTime()有区别吗
适用于:OpenHarmony SDK3.2.6.3, API9 Stage模型
systemTime.getCurrentTime(false)和new Date().getTime()一样,都是返回1970年1月1日至今的毫秒数;systemTime.getCurrentTime(true)返回1970年1月1日至今的纳秒数。两种方式都是系统时间。
## \@BuilderParam装饰器,组件传参问题
适用于:OpenHarmony SDK3.2.6.5, API9 Stage模型
\@BuilderParam修饰的属性进行赋值时不带参数(如:content: this.specificParam),则此属性的类型需定义成无返回值的函数(如:\@BuilderParam content: () =&gt; void);若带参数(如:callContent: this.specificParam1("111")),则此属性的类型需定义成any(如:\@BuilderParam callContent: any;)。
## ArkTS如何把string转成byte数组
适用于:所有版本
参考如下代码实现,示例:
```
function stringToByte(str) {
var bytes = new Array();
var len,c;
len = str.length;
for(var i = 0;i<len;i++) {
c = str.charCodeAt(i);
if( c >= 0x010000 && c<= 0x10FFFF) {
bytes.push(((c>>18) & 0x07) | 0xf0);
bytes.push(((c>>12) & 0x3F) | 0x80);
bytes.push(((c>>6) & 0x3f) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000800 && c<= 0x00FFF){
bytes.push(((c>>12) & 0x07) | 0xf0);
bytes.push(((c>>6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000800 && c<= 0x0007FF) {
bytes.push(((c>>6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else {
bytes.push(c & 0xFF)
}
}
return bytes;
}
```
## 创建woker时报错“Too many wokers,the number of worker exceeds the maximum”如何处理
使用于:OpenHarmony SDK 3.2.6.5版本
这是因为每个应用的worker上限为7个,因此在worker使用完成后需要通过termiate方法释放worker。参考[worker开发指南](../reference/apis/js-apis-worker.md#terminate)
## OpenHarmony推荐的多线程解决方案是什么
使用于:OpenHarmony SDK 3.2.6.5版本 API9 Stage模型
OpenHarmony推荐使用worker来处理多线程场景。
参考文档:[启动一个worker](../reference/apis/js-apis-worker.md)
## 使用\@Builder装饰包含自定义组件的方法与普通方法的区别是什么
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
\@Builder装饰的方法中使用了自定义组件,那么该方法每次被调用时,对应的自定义组件均会重新创建。
## 状态管理中\@Watch监听,数组内对象属性变化无法触发watch回调函数
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
使用\@Watch监听的对象,只能监听一层数据变化,多层次数据变更无法监听,同\@State状态管理机制一致
## 如何监听\@State深层数据变化
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过\@Observed配合\@ObjectLink装饰符实现。
## 如何实现字符串编解码
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过util工具函数模块中的TextEncoder和TextDecoder进行解码。
参考文档:[TextEncoder](../reference/apis/js-apis-util.md#textencoder)[TextDecoder](../reference/apis/js-apis-util.md#textdecoder)
## 如何导入和导出namespace命名空间
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
- namespace导出
```
namespace Util{
export function getTime(){
return Date.now()
}
}
export default Util
```
- namespace导入
```
import Util from './util'
Util.getTime()
```
## worker线程中能进行关系型数据库的操作吗
适用于:OpenHarmony SDK 3.2.5.5版本, API9 Stage模型
不支持。
# 媒体开发常见问题
## 如何设置前置拍照
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
1. 设置相机位置camera.CameraPosition.CAMERA_POSITION_FRONT
2. 根据相机位置和类型创建CameraInput实例
参考文档:[相机管理](../reference/apis/js-apis-camera.md)
示例:
```
//默认设置后置相机,通过设置isFrontCamera来切换相机
let cameraId
let cameraInput
for(let cameraIndex = 0; cameraIndex < this.cameraArray.length; cameraIndex++) {
let faceType = this.cameraArray[cameraIndex].cameraPosition
switch(faceType) {
case camera.CameraPosition.CAMERA_POSITION_FRONT://前置相机
if(this.isFrontCamera){
cameraId = this.cameraArray[cameraIndex].cameraId
}
break
case camera.CameraPosition.CAMERA_POSITION_BACK://后置相机
if(!this.isFrontCamera){
cameraId = this.cameraArray[cameraIndex].cameraId
}
break
case camera.CameraPosition.CAMERA_POSITION_UNSPECIFIED:
default:
break
}
}
cameraInput = await this.cameraManager.createCameraInput(cameraId)
```
## 如何进行图片剪切
适用于:OpenHarmony 3.2.5.6版本,API9 Stage模型
1. **通过传入的uri创建图片源实例ImageSource对象。**
```
let path = this.context.getApplicationContext().fileDirs + "test.jpg";
const imageSourceApi = image.createImageSource(path);
```
2. **设置解码参数,通过图片解码获取PixelMap图像对象,解码过程中同时支持图像处理操作。**
- 设置desiredSize支持按尺寸缩放,如果设置为全0,则不进行缩放。
- 设置desiredRegion支持按矩形区域裁剪,如果设置为全0,则不进行裁剪。
- 设置rotateDegrees支持旋转角度,以图像中心点顺时针旋转。
```
const decodingOptions = {
desiredSize: {
height:0,
width:0
},
//按矩形区域裁剪
desiredRegion: {
size: {
height:100,
width:100
},
x:0,
y:0
},
//旋转90度
rotate:90
}
imageSourceApi.createPixelMap(decodingOptions).then(pixelMap => {
this.handlePixelMap(pixelMap)
})
```
3. 解码完成获取到PixelMap对象后,可以进行后续处理,比如渲染显示等。
## 如何申请设备上的媒体读写权限
适用于:OpenHarmonySDK 3.2.5.5版本,API9 Stage模型
1. 在module.json5配置文件中配置媒体读写权限ohos.permission.READ_MEDIA和ohos.permission.WRITE_MEDIA。
示例:
```
{
"module" : {
"requestPermissions":[
{
"name" : "ohos.permission.READ_MEDIA",
"reason": "$string:reason"
},
{
"name" : "ohos.permission.WRITE_MEDIA",
"reason": "$string:reason"
}
]
}
}
```
2. 这两个权限的授权方式均为user_grant,因此需要调用requestPermissionsFromUser接口,以动态弹窗的方式向用户申请授权。
```
import abilityAccessCtrl from '@ohos.abilityAccessCtrl.d.ts';
let permissions: Array<string> = ['ohos.permission.READ_MEDIA','ohos.permission.WRITE_MEDIA']
let atManager = abilityAccessCtrl.createAtManager();
// context为调用方UIAbility的UIAbilityContext
atManager.requestPermissionsFromUser(context, permissions).then((data) => {
console.log("Succeed to request permission from user with data: " + JSON.stringify(data))
}).catch((error) => {
console.log("Failed to request permission from user with error: " + JSON.stringify(error))
})
```
## MP4格式的视频为什么播放不了
适用于:OpenHarmonySDK 3.2.7.5版本,API9 Stage模型
暂不支持h.265编码格式的MP4视频播放。
## 为什么视频创建至十几个时新创建的视频无法播放甚至崩溃
适用于:OpenHarmonySDK 3.2.7.5版本,API9 Stage模型
当前限制最多创建13个媒体播放实例。
# 媒体开发常见问题
## 使用XComponent组件显示相机的预览输出流时,如何获取相机的帧数据
适用于:OpenHarmony 3.2 版本 API 9 Stage模型
**问题现象**
目前接口不支持实时预览相机的帧数据,只能绑定一个动作来获取,比如拍照动作。
**解决措施**
通过创建双路预览来实现。
1. Xcomponent来创建预览流。
```
// 获取PreviewOutput(预览输出类)实例
const surfaceId = globalThis.mxXComponentController.getXComponentSurfaceld();
this.mPreviewOutput = await Camera.createPreviewOutput(surfaceld) ;
```
2. 使用imageReceiver来监听图像信息。
```
// 添加双路预览
const fullWidth = this.mFullScreenSize.width;
const fullHeight = this.mFullScreenSize.height;
const imageReceiver = await image.createImageReceiver(fullwidth, fullHeight,
formatImage, capacityImage) ;
const photoSurfaceId = await imageReceiver.getReceivingSurfaceld();
this.mPreviewOutputDouble = await Camera.createPreviewOutput ( photoSurfaceld)
```
## 如何获取前置摄像头的预览图像
适用于:OpenHarmony 3.2版本 API 9 Stage模型
**解决措施**
1. 使用系统相机框架@ohos.multimedia.camera获取物理摄像头信息。
```
let cameraManager = await camera.getCameraManager(context);
let camerasInfo = await cameraManager.getSupportedCameras();
let cameraDevice = this.camerasInfo[0];
```
2. 创建并启动物理摄像头输入流通道。
```
let cameraInput = await cameraManager.createCameraInput(cameraDevice);
await this.cameraInput.open();
```
3. 拿到物理摄像头信息查询摄像头支持预览流支持的输出格式,结合XComponent提供的surfaceId创建预览输出通道。
```
let outputCapability = await this.cameraManager.getSupportedOutputCapability(cameraDevice);
let previewProfile = this.outputCapability.previewProfiles[0];
let previewOutput = await cameraManager.createPreviewOutput(previewProfile, previewId);
```
4. 创建相机会话,在会话中添加摄像头输入流和预览输出流,然后启动会话,预览画面就会在XComponent组件上送显。
```
let captureSession = await cameraManager.createCaptureSession();
await captureSession.beginConfig();
await captureSession.addInput(cameraInput);
await captureSession.addOutput(previewOutput);
await this.captureSession.commitConfig()
await this.captureSession.start();
```
## 如何设置相机焦距
适用于:OpenHarmony 3.2版本 API 9 Stage模型
**解决措施**
1. 判断当前摄像头是否为前置摄像头,前置摄像头不支持设置焦距。
2. 通过captureSession.getZoomRatioRange\(\)接口获取设备焦距设置支持的最大、最小范围。
3. 判断目标焦距参数大小是否在步骤二获取的范围内,然后通过captureSession.setZoomRatio\(\)接口设置相机焦距。
## 如何后台播放音乐
适用于:OpenHarmony 3.2版本 API 9 Stage模型
**问题现象**
无法后台播放音乐。
**解决措施**
AVSession对媒体播放做了管控,当三方应用从前台切入后台或者进入锁屏状态,媒体播放会被强制暂停而应用不感知,如果要开发后台播放功能,应该启动后台任务管理的长时任务中播放音乐,同时接入AVSession能力,允许控制中心的播控面板控制三方应用的播放功能。
**参考链接**
[后台任务管理的长时任务开发指导参考](../task-management/continuous-task-dev-guide.md)
[AVSession开发指导参考](../media/using-avsession-developer.md)
## 创建多个视频组件无法播放
适用于:OpenHarmony 3.2版本 API 9 Stage模型
**问题现象**
创建十几个视频组件无法播放甚至崩溃。
**解决措施**
当前限制最多创建13个媒体播放实例。
## 如何直接调起图片库
适用于:OpenHarmony 3.2版本 API 9 Stage模型
**解决措施**
```
let want = {
bundleName: 'com.ohos.photos',
abilityName: 'com.ohos.photos.MainAbility',
parameters: {
uri: 'detail'
}
};
let context = getContext(this) as common.UIAbilityContext;
context.startAbility(want);
```
# Native API使用常见问题
## Native API是否有类似Canvas绘制接口
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
Native API中的[Drawing](../reference/native-apis/_drawing.md)接口可以提供2D绘制功能。
## 运行Native HAP的时候,导入的命名空间报错Obj is not a valid object
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
检查模块根目录(注意不是工程根目录)下的build-profile.json5文件,如果设备是32位,需要在abiFilters参数中配置armeabi-v7a,如果设备是64位,需要在abiFilters参数中配置arm64-v8a。
## 运行Native HAP的时候,报错install parse profile prop check error
适用于:OpenHarmony SDK 3.2.6.3版本,API9 Stage模型
检查模块根目录(注意不是工程根目录)下的build-profile.json5文件,如果设备是32位,需要在abiFilters参数中配置armeabi-v7a,如果设备是64位,需要在abiFilters参数中配置arm64-v8a。
## 在Native代码中使用OH_LOG_Print打印日志,报错undefined symbol: OH_LOG_Print
适用于:OpenHarmony SDK 3.2.6.3版本,API9 Stage模型
需要修改CMakeLists.txt文件,在target_link_libraries最后追加libhilog_ndk.z.so。
## 如何获取到模块 package.json 文件中的 “version” 值
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
1. 在编译工具Hvigor脚本文件hvigorfile.js中,通过subModule.getPackageJsonPath方法获取module中package.json文件位置。
2. 使用nodejs能力读取package.json文件中version字段,写入build-profile.json5文件buildOption.cppFlags字段。
示例:
```
// module hvigorfile.js
const subModule = require('@ohos/hvigor')(__filename)
const fs = require("fs-extra")
const path = require("path")
const packageJsonPath = subModule.getPackageJsonPath()
const buildProfilePath = path.resolve(packageJsonPath, '../build-profile.json5')
const packageJsonData = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
let buildProfileData = fs.readFileSync(buildProfilePath, 'utf8')
buildProfileData = buildProfileData.replace(/\"cppFlags\"\:(.*)\,/, `"cppFlags": "-D NWEBEX_VERSION=${packageJsonData.version}",`)
fs.writeFileSync(buildProfilePath, buildProfileData, 'utf8')
const ohosPlugin = require('@ohos/hvigor-ohos-plugin').hapTasks(subModule) // 该插件执行了C++编译任务,读取了build-profile.json5文件
module.exports = {
ohos: ohosPlugin
}
```
```
// hello.cpp 读取
#define _NWEBEX_VERSION(v) #v
#define _NWEBEX_VER2STR(v) _NWEBEX_VERSION(v)
static napi_value Add(napi_env env, napi_callback_info info)
{
napi_value fixed_version_value = nullptr;
napi_create_string_utf8(env, _NWEBEX_VER2STR(NWEBEX_VERSION), NAPI_AUTO_LENGTH, &fixed_version_value);
return fixed_version_value;
}
```
## 如何遍历rawfiles中的文件
适用于:OpenHarmony SDK 3.2版本以上,API9 Stage模型
使用Native API中的OH_ResourceManager_OpenRawDir()方法获取到rawfile的根目录,然后对其进行遍历。可参考文档:[Native开发指导](../reference/native-apis/rawfile.md)
# 网络管理开发常见问题
## http网络请求中extraData支持的数据格式有哪些
适用于:OpenHarmony 3.2 Beta API 9
**解决措施**
extraData代表发送请求的额外数据,支持如下数据:
- 当HTTP请求为POST、PUT方法时,此字段为HTTP请求的content。
- 当HTTP请求为GET、OPTIONS、DELETE、TRACE、CONNECT方法时,此字段为HTTP请求的参数补充,参数内容会拼接到URL中进行发送。
- 开发者传入string对象,开发者需要自行编码,将编码后的string传入。
## http请求的错误码28是什么意思
适用于:OpenHarmony 3.2 Beta API 9
**问题现象**
发起http请求后报错,错误码28。
**解决措施**
错误码28代表CURLE\_OPERATION\_TIMEDOUT,操作超时。网络请求底层使用libcurl库,更多错误码可以查看相应文档。
**参考链接**
[http常见响应码](../reference/apis/js-apis-http.md#responsecode)[Curl错误码](https://curl.se/libcurl/c/libcurl-errors.html)
## http请求中response错误码返回6是什么意思
适用于:OpenHarmony 3.2 Beta API 9
**问题现象**
发起http请求后,返回信息中response错误码为6。
**解决措施**
错误码6表示地址无法解析主机,可以尝试ping一下request中的URL,确认是否可以ping通。
**参考链接**
更多错误码参考[Response常用错误码](../reference/apis/js-apis-http.md#responsecode)或者[Curl错误码](https://curl.se/libcurl/c/libcurl-errors.html)
## @ohos/axios三方件post请求queryParams参数场景下如何传参
适用于:OpenHarmony 3.2 Beta API 9
**问题现象**
三方件@ohos/axios中发起post请求,以queryParams形式传递参数(将参数拼接在URL后)。
**解决措施**
- 方式一:使用axios.post接口只接收一个参数,Url.URLSearchParams需要转成字符串拼接在url后面。
```
let params:Url.URLSearchParams = new Url.URLSearchParams()
params.append('ctl', 'sug')
params.append('query', 'wangjunkai')
params.append('cfrom', '1099a')
axios.post('http://10.100.195.234:3000/save?' + params.toString()).then(res => {
this.message = "request result: " + JSON.stringify(res.data);
}).catch(err => {
this.message = "request error: " + err.message;
})
```
- 方式二:使用axios接口只接收一个config对象,请求参数写在config对象的params中。
```
axios({
url: 'http://10.100.195.234:3000/save',
method: 'post',
params: {
ctl: 'sug',
query: 'wangjunkai',
cfrom: '1099a'
}
}).then(res => {
this.message = "request result: " + JSON.stringify(res.data);
}).catch(err => {
this.message = "request error: " + err.message;
})
```
## connection.getNetCapabilities\(mNetHandle\)无法正常返回结果
适用于:OpenHarmony 3.2 beta2 API 9
**问题现象**
在网络连接管理中,调用connection.getNetCapabilities\(\)函数时无法取到数据。
**原因分析**
this指向存在问题,用\(err,data\)=\>\{\}可以进入回调函数并且拿到返回结果数据,不能使用function\(err,data\),因为function声明的函数内存在自己的this,无法指向全局的this。
**解决措施**
getNetCapabilities的第二个参数把function\(err,data\)改成\(err,data\)
## http请求如何以json形式进行传输
适用于:OpenHarmony 3.2 Beta API 9
**解决措施**
在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析html或仅仅展示一个文本等。
设置该参数值为application/json,请求中的数据就会以json形式进行传输。
```
this.options = {
method: http.RequestMethod.GET,
extraData: this.extraData,
header: { 'Content-Type': 'application/json' },
readTimeout: 50000,
connectTimeout: 50000
}
```
## 调用camera拍摄的照片如何上传到服务器
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
应用调用摄像头拍照后如何将图片上传到服务器?
**解决措施**
启动应用,获取权限后系统会访问远程服务器,将拍摄照片保存在本地,通过上传接口将文件从个人手机传送至远程服务器。
**参考链接**
[上传下载](../reference/apis/js-apis-request.md)
## 手机网络正常,调用connection.hasDefaultNet\(\)接口失败
适用于:OpenHarmony 3.2 Beta API 9
**问题现象**
手机可以上网,浏览器可以正常打开网页,但是hasDefaultNet这个方法调用失败,回调函数走到了失败的回调。
**解决措施**
connection.hasDefaultNet 接口需要注明需要权限ohos.permission.GET\_NETWORK\_INFO
权限申请链接:[访问控制授权申请](../security/accesstoken-guidelines.md)
## 如何理解connection.getDefaultNet返回对象netHandle中的netId
适用于:OpenHarmony 3.2 Beta API 9
**问题现象**
netId的值如0、100分别代表什么含义?
**解决措施**
正常情况下,netHandle里的netId为0时表示没联网,大于等于100时为有网状态。
## 如何使用http请求从网络上获取数据
适用于:OpenHarmony 3.2 Beta API 9
**解决措施**
使用@ohos.net.http模块来发起http网络请求。
1. 导入http模块,创建http请求对象。
2. 设置请求地址URLl和参数,发起http请求。
3. 获取请求结果response,并解析数据。
**参考链接**
详细信息请参考:[http数据请求](../connectivity/http-request.md)
## 如何使用JS封装网络请求
适用于:OpenHarmony 3.2 Beta API 9
**解决措施**
OpenHarmony网络请求支持JS语言开发方式,可直接使用。具体使用参考如下文档:[网络连接](../reference/apis/js-apis-http.md)
## 基于JS开发智能手表应用,如何编写网络请求
适用于:OpenHarmony 3.2 Beta API 9
**解决措施**
OpenHarmony网络请求支持JS语言开发方式,可直接使用。具体使用参考如下文档:[网络连接](../reference/apis/js-apis-http.md)
## 应用增加权限"ohos.permission.NOTIFICATION\_CONTROLLER",编译后无法启动
适用于:OpenHarmony 3.2 Beta API 9
**问题现象**
启动报错:error: install failed due to grant request permissions failed.
**解决措施**
权限"ohos.permission.NOTIFICATION\_CONTROLLER为系统级“system core”权限,第三方应用无法获取该权限。
## WiFi模块中使用wifi.getIpInfo\(\).ipAddress报错
适用于:OpenHarmony 3.2Beta API 9
**问题现象**
WiFi模块中使用wifi.getIpInfo\(\).ipAddress,报错Error: assertion \(wifiDevicePtr != nullptr\) failed: Wifi device instance is null
**解决措施**
权限不足。请先检查是否申请了相关的操作权限,权限相关信息可参考[权限管理](../security/accesstoken-overview.md)
# SDK使用常见问题
## cmake中arm64-v8a/armeabi-v7a这层目录的宏定义是什么
适用于:OpenHarmony 3.1 Beta5 API 9
**解决方案**
arm64-v8a及armeabi-v7a目录如下所示:
```
entry
├─ libs
│ ├─ arm64-v8a
│ │ └─ libMyDemo.so
│ └─ armeabi-v7a
│ └─ libMyDemo.so
└─ src
└─ main
└─ cpp
└─ CMakeLists.txt
```
访问到目录的宏定义为:\$\{CMAKE\_CURRENT\_SOURCE\_DIR\}/../../../libs/$\{OHOS\_ARCH\}/xxxx.so
CMAKE\_CURRENT\_SOURCE\_DIR:CMakeList.txt文件所在目录。
OHOS\_ARCH:设置应用程序二进制接口ABI,类型为 armeabi-v7a、arm64-v8a,默认值是 arm64-v8a。
**使用示例**
CMakeLists.txt 中添加链接库。
```
target_link_libraries(entry PUBLIC
libace_napi.z.so
libhilog_ndk.z.so
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libMyDemo.so
)
```
# 安全基础能力开发常见问题
## HUKS中AES GCM模式加密,单次最多可对多少字节数据加密
适用于:OpenHarmony 3.1 Beta5 API 9
**解决措施**
HUKS中AES GCM模式加密时,单次最多可对64字节的数据进行加密。
**代码示例**
```
/* 进行密钥加密操作 */
await huks.init(srcKeyAlias, encryptOptions).then((data) => {
console.info(`test init data: ${JSON.stringify(data)}`);
handle = data.handle;
}).catch((err) => {
console.info('test init err information: ' + JSON.stringify(err));
});
encryptOptions.inData = aesCipherStringToUint8Array(cipherInData.slice(0,64)); // 截取64字节
await huks.update(handle, encryptOptions).then(async (data) => {
console.info(`test update data ${JSON.stringify(data)}`);
encryptUpdateResult = Array.from(data.outData);
}).catch((err) => {
console.info('test update err information: ' + err);
});
encryptOptions.inData = aesCipherStringToUint8Array(cipherInData.slice(64,80)); // 剩余数据
```
## 在CryptoFramework中,打印Md的digest接口返回结果为乱码
适用于:OpenHarmony 3.1 Beta5 API 9
**问题现象**
在CryptoFramework中,打印Md的digest接口返回结果显示为乱码,无法识别。
**解决措施**
digest接口返回的Md计算结果DataBlob是Uint8Array类型,需要转成十六进制字符串再打印,也可以用网页在线版MD5加密工具验证结果。
# 泛Sensor服务开发常见问题
## 是否对个人开发者开放PPG和ECG血压监测传感器的的数据获取接口
适用于OpenHarmony 3.1 Beta5 API 9
PPG和ECG的血压监测传感器属于可穿戴设备传感器,传感器数据设计个人隐私数据,暂未对个人开发者开放接口。
# 启动恢复开发常见问题
## 如何获取设备系统版本
适用于Openharmony 3.2 Beta5 API 9
**解决措施**
可通过[deviceInfo](../reference/apis/js-apis-device-info.md)对象的osFullName属性获取设备系统版本。
**代码示例**
```
import deviceInfo from '@ohos.deviceInfo'
let v = deviceInfo.osFullName
```
## OpenHarmony设备如何获取UDID
适用于Openharmony 3.2 Beta5 API 9
**解决措施**
- 方式一:通过命令行(hdc shell bm get --udid)查询。
- 方式二:在代码中获得,请参考文档[udid](../reference/apis/js-apis-device-info.md)
## 如何获取设备信息
适用于Openharmony 3.2 Beta5 API 9
可以使用deviceInfo模块获取设备信息,如设备型号等。
**参考链接**
[设备信息](../reference/apis/js-apis-device-info.md)
## 开发中如何实现App不被屏保中断
适用于Openharmony 3.2 Beta5 API 9
**解决方案**
输入命令hdc shell "power-shell setmode 602" 可达到不息屏的效果。
# 三四方库使用常见问题
## 如何获取可用的三方库
适用于OpenHarmony 3.1 Beta5 API 9
通过ohpm可以获取的三四方库在Gitee上做了汇总([OpenHarmony上可直接使用的三方组件汇总](https://gitee.com/openharmony-tpc/tpc_resource)),针对于不同功能三方库内容做了分类,开发者可以根据需要进行参考。
## 网络相关的三方库有哪些
适用于OpenHarmony 3.1 Beta5 API 9
网络相关的三方库有[Axios](https://gitee.com/openharmony-sig/axios)、httpclient、okdownload等,具体分类可以参考[三四方库网络分类](https://gitee.com/openharmony-tpc/tpc_resource?_from=gitee_search#%E7%BD%91%E7%BB%9C)
## 如何使用ohpm引入三四方库
适用于OpenHarmony 3.1 Beta5 API 9
**解决措施**
- 方式一:
1. 打开Terminal窗口,通过如下指令进入到entry目录。
```
cd entry
```
2. 以引入“dayjs”为例,执行以下指令进行安装。
```
ohpm install dayjs
```
3. 在对应的js文件中直接引用。
```
import dayjs from 'dayjs';
```
- 方式二:
1. 打开工程目录下的entry目录,找到该目录下的oh-package.json5文件。
2. 在oh-package.json5文件中写入想要安装的三方库,以“dayjs”为例,示例如下:
```
{
"dependencies": {
"dayjs": "^1.10.4",
}
}
```
3. 打开Terminal窗口,通过如下指令进入到entry目录。
```
cd entry
```
4. 执行指令进行安装。
```
ohpm install
```
5. 在对应的js文件中直接引用。
```
import dayjs from 'dayjs';
```
# 三四方库使用常见问题
## 报错“Stage model module … does not support including OpenHarmony npm packages or modules in FA model. OpenHarmony build tasks will not be executed, and OpenHarmony resources will not be packed. ”如何解决
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
三四方件未适配API9 Stage模型,无法使用。
## 项目是否支持传递依赖
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
比如项目A依赖项目B,项目B依赖项目C,那项目A是否能直接使用项目C提供的接口?
不支持。由于项目打包使用npm工具,npm不支持传递依赖。可以在项目A增加项目C的依赖来解决问题。
## 如何获取可用的三方库
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
参见:[OpenHarmony上可直接使用的三方组件汇总](https://gitee.com/openharmony-sig/third_party_app_libs)
## 网络相关的三方库有哪些
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
网络相关的三方库有[Axios](https://gitee.com/openharmony-sig/axios)
## 如何使用npm引入三四方库
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
- 方法一:
1. 打开Terminal窗口,通过如下指令进入到entry目录。
```
cd entry
```
2. 以引入“dayjs”为例,执行以下指令进行安装。
```
npm install dayjs --save
```
3. 在对应的js文件中直接引用。
```
import dayjs from 'dayjs';
```
- 方法二:
1. 打开工程目录下的entry目录,找到该目录下的package.json文件。
2. 在package.json文件中写入想要安装的三方npm,以“dayjs”为例,示例如下:
```
{
"dependencies": {
"dayjs": "^1.10.4",
}
}
```
3. 打开Terminal窗口,通过如下指令进入到entry目录。
```
cd entry
```
4. 执行指令进行安装。
```
npm install
```
5. 在对应的js文件中直接引用。
```
import dayjs from 'dayjs';
```
# ArkUI组件(ArkTS)开发常见问题
## 在Stage模型下,如何通过router实现页面跳转
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
1. 对于通过页面路由router实现页面跳转,首先要在main_pages.json配置文件中将所有跳转的页面加入pages列表;
2. 页面路由需要在页面渲染完成之后才能调用,在onInit和onReady生命周期中页面还处于渲染阶段,禁止调用页面路由方法。
参考文档:[页面路由](../reference/apis/js-apis-router.md)
## router通过调用push方法进堆栈的page是否会被回收
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
调用push进入堆栈的page不回收,调用back方法出栈后可以被回收。
## 如何将容器定位到屏幕的最底部?
适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型
可以使用Stack堆叠容器,设置子组件在容器内的最底部。
示例:
```
build() {
Stack({alignContent : Alignment.Bottom}) {
//容器位于最底部
Stack() {
Column()
.width('100%')
.height('100%')
.backgroundColor(Color.Yellow)
}
.width('100%')
.height('10%')
}
.width('100%')
.height('100%')
.backgroundColor('rgba(255,255,255, 0)')
}
```
## CustomDialog是否支持在TS文件中使用
适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型
不支持,CustomDialog当前只支持在ArkTS的Page中使用。
参考文档:[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md)
## 如何将CustomDialog中的变量传递给Page页面中的变量
适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型
利用自定义的回调函数,当点击弹窗的confirm按钮时,将data数据从自定义弹窗组件中传递给当前的page的页面。
示例:
```
// 弹窗组件
@CustomDialog
struct MyDialog {
controller: CustomDialogController
title: string
confirm: (data: string) => void
data: string = ''
build() {
Row() {
Column({ space: 10 }) {
Text(this.title)
.fontSize(30)
.fontColor(Color.Blue)
TextInput({ placeholder: "输入内容", text: this.data })
.onChange((data) => {
this.data = data // 获取输入框数据
})
Button('confirm')
.onClick(() => {
this.confirm(this.data) // 将输入框数据通过回调函数传给主页面
this.controller.close()
}).backgroundColor(0xffffff).fontColor(Color.Red)
}.width("50%")
}.height("50%")
}
}
// main页面
@Entry
@Component
struct DialogTest {
@State dialogTitle: string = ''
@State dialogData: string = ''
dialogController: CustomDialogController = new CustomDialogController({
builder: MyDialog({
title: this.dialogTitle, // 绑定数据
data: this.dialogData,
confirm: this.confirm.bind(this) // 绑定自定义的回调函数,这里要修改this的指向
})
})
confirm(data: string) {
this.dialogData = data
console.info(`recv dialog data: ${data}`) // 获取弹窗输入的信息
}
build() {
Row() {
Column({ space: 10 }) {
Button('点击打开弹窗')
.onClick(() => {
this.dialogTitle = '弹窗'
this.dialogController.open()
})
Text(`接受弹窗的数据:`)
.fontSize(20)
TextInput({ placeholder: "输入内容", text: this.dialogData })
.width("50%")
.onChange((data) => {
this.dialogData = data // 获取输入框数据
})
}.width("100%")
}.height("100%")
}
}
```
## List组件上添加了Text组件后,List组件无法拖动到底部
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
在List的父容器加上代码layoutWeight(1)。原理:List属于可滚动容器组件,默认高度是占满全屏幕高度,当出现其他固定高度的组件占领了屏幕的部分高度时,需要开发人员显性的指定List组件占满剩余高度,而不是全屏幕高度。
## 栅格布局子组件如何居中?
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
GridContainer内子组件默认水平左对齐,居中显示可以参考以下处理方式:
内部嵌套布局组件Row,设置Row属性justifyContent(FlexAlign.Center),内部嵌套子组件可保持居中显示,参考[栅格布局](../reference/arkui-ts/ts-container-gridcontainer.md)文档。
示例:
```
GridContainer({ sizeType: SizeType.SM, columns: 12 }) {
Row() {
Text('1')
.useSizeType({
sm: { span: 4, offset: 0 },
})
.backgroundColor(0x46F2B4)
}.justifyContent(FlexAlign.Center) // 该属性设置使子组件居中显示
}
```
## 如何获取状态栏和导航栏高度?
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
在加载窗口内容之前,采用systemAvoidAreaChange事件监听。
示例:
```ts
import Window from '@ohos.window';
import UIAbility from '@ohos.app.ability.UIAbility';
/**
* 设置沉浸式窗口,并获取状态栏和导航栏高度
* @param mainWindow 主窗口对象
*/
async function enterImmersion(mainWindow: window.Window) {
mainWindow.on("systemAvoidAreaChange", (area: window.AvoidArea) => {
AppStorage.SetOrCreate<number>("topHeight", area.topRect.height);
AppStorage.SetOrCreate<number>("bottomHeight", area.bottomRect.height);
})
await mainWindow.setFullScreen(true)
await mainWindow.setSystemBarEnable(["status", "navigation"])
await mainWindow.sArkTSystemBarProperties({
navigationBarColor: "#00000000",
statusBarColor: "#00000000",
navigationBarContentColor: "#FF0000",
statusBarContentColor: "#FF0000"
})
}
export default class EntryAbility extends UIAbility {
// do something
async onWindowStageCreate(windowStage: window.WindowStage) {
let mainWindow = await windowStage.getMainWindow()
await enterImmersion(mainWindow)
windowStage.loadContent('pages/index')
}
// do something
}
```
## 在容器组件嵌套的场景下,如何解决手势拖拽事件出现错乱的问题
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
gesture的属性distance默认值是5,把gesture的属性distance设成1就可以解决。
## 如何获取组件的高度
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
组件宽高变化可通过onAreaChange组件区域变化事件获取。
示例:
```ts
Column() {
Text(this.value)
.backgroundColor(Color.Green).margin(30).fontSize(20)
.onClick(() => {
this.value = this.value + 'Text'
})
.onAreaChange((oldValue: Area, newValue: Area) => {
console.info(`Ace: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
this.size = JSON.stringify(newValue)
})
```
## 如何获取List组件的偏移量
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
List组件绑定Scoller控制器,通过currentOffset方式获取当前的滚动偏移量。
示例:
```ts
Column() {
List({ space: 20, initialIndex: 0,scroller: this.scroller}) {
ForEach(this.arr, (item) => {
ListItem() {
Text('' + item)
.width('100%').height(100).fontSize(16)
.textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)
}.editable(true)
}, item => item)
}
.listDirection(Axis.Vertical) // 排列方向
.editMode(this.editFlag)
.onScroll((xOffset: number, yOffset: number) => {
console.info("yOffset======="+this.scroller.currentOffset().yOffset)
})
}.width('100%')
```
## 页面使用router携带param跳转后,下一个页面如何获取param
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
```ts
// 3.1.5.5版本之前,取值方式为:router.getParams().key
private value: string = router.getParams().value;
// 从3.1.6.5版本起,取值方式为:router.getParams()['key']
private value: string = router.getParams()['value'];
```
## RichText组件是否支持跳转到本地page页面
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
不支持。
## 使用router或Navigator实现页面跳转时,如何关闭页面间转场动效
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
1. 参考[页面间转场示例](../reference/arkui-ts/ts-page-transition-animation.md#示例)在当前页面和目标页面中定义pageTransition方法。
2. 将页面入场组件PageTransitionEnter和页面退场组件PageTransitionExit的动效参数duration都设置为0。
## UI开发中,像素单位如何选择
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
Vp保证了不同分辨率下 视觉效果的等价性,比如一个图标,在不同分辨率下都是视觉效果是等价。
lpx相当于百分比视图,按比例扩大或者缩小。
如果关注Item等效性的,比如按钮、文字、列表基本上都是VP;比如关注布局,比如1/2之类的网格,lpx更好。
## ArkTS中颜色的格式说明
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
颜色可以使用两种格式,例如 0x7F000000 或者 '\#7F000000' ,其中前两位是透明度,后六位是RGB。
```ts
fontColor(0x7F000000)
fontColor( '#7F000000' )
```
## 如何在Page页面中监听返回操作
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
在Page页面返回时,系统会调用\@Entry修饰的自定义组件的onBackPress()回调,可以在回调函数中实现相关业务诉求。参考[自定义组件生命周期回调函数](../reference/arkui-ts/ts-custom-component-lifecycle.md)
## TextInput组件密码模式下,右边的眼睛图标是否支持自定义?
适用于:OpenHarmony SDK3.0, API9 Stage模型
TextInput组件设置type为InputType.Password时,右侧出现眼睛图标,showPasswordIcon控制图标显示隐藏,不支持自定义。更多信息可参考文档:[TextInput组件](../reference/arkui-ts/ts-basic-components-textinput.md)
## Image图片加载目前只能加载https的,不能加载http的
适用于:OpenHarmony SDK3.2.5.5, API9 Stage模型
http是不安全的,会被白名单过滤掉,建议使用https。
## TextView布局设置间距与显示界面不符合
适用于:OpenHarmony SDK3.2.5.5, API9 Stage模型
TextView默认设置align属性为居中,文本从左到右显示,需要设置align属性为Start。
## constraintSize尺寸设置不生效
适用于:OpenHarmony SDK3.0, API9 Stage模型
constraintSize约束组件尺寸时,子组件内设置百分比宽度,例如width('100%')会采用constraintSize约束中的最大宽乘百分比,导致撑开组件,看起来constraintSize设置没生效
## 如何将背景颜色设置为透明
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
将backgroundColor设置为 '\#00000000' 。
## Scroll组件滚动到达不了最底部
适用于:OpenHarmony SDK3.0, API9 Stage模型
Scroll组件在未设置高度情况下,默认为窗口高度,当滚动区域外存在其他组件时,滚动底部区域会出现遮挡,需要设置Scroll高度,或者使用Flex布局限制Scroll高度
## 输入框组件TextInput回车事件onSubmit使用
适用于:OpenHarmony SDK3.0, API9 Stage模型
onSubmit事件在回车键或软键盘回车触发该回调,参数为当前软键盘回车键类型,通过enterKeyType属性可以设置输入法回车键类型,软键盘回车键样式需要输入法的支持,具体文档参考[Textinput组件](../reference/arkui-ts/ts-basic-components-textinput.md)
## 页面路由时,页面栈内的数量限制是多少
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
页面路由栈支持的最大页面数量是32,当超出此限制时,使用router.push接口页面无法完成跳转 。
## 页面路由携带PixelMap对象参数,跳转页面无法获取
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
页面路由只支持普通对象类型,普通JSON数据结构,可以采用localStorage存储PixelMap对象,在跳转页面获取
## TextInput组件在onEditChange激活的时候通过.caretPosition(0)让光标回到起点
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
onEditChange事件在输入框聚焦时触发,这时光标位置和手势触发位置有关,在使用caretPosition同步处理无法改变光标位置,需要使用异步处理,在setTimeout中执行可以进行
## TextInput是否有方法设置内容为全部选中
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
TextInput组件暂不支持设置内容全选。
## input的输入框的type属性是date,但无法选择时间
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
input 组件的 type 设置为 date,只是会有相关格式提示,本质上还是输入控件,如果需要实现日期选择效果,需要使用 picker 组件。
## ArkTS TextInput输入时,弹出的输入法框把页面布局挤压变形
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
用Flex布局就会有挤压变形情况,改成Column布局就不会产生挤压
## 子组件使用\@Link修饰成员变量时,父组件传值如何传值
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
子组件使用\@Link修饰时,父组件传值需要添加"$"
示例:
```
@Component
struct FoodImageDisplay {
@Link imageSrc: Resource
build() {
Stack({ alignContent: Alignment.BottomStart }) {
Image(this.imageSrc)
.objectFit(ImageFit.Contain)
Text('Tomato')
.fontSize(26)
.fontWeight(500)
.margin({ left: 26, bottom: 17.4 })
}
.backgroundColor('#FFedf2f5')
.height(357)
}
}
@Entry
@Component
struct FoodDetail {
@State imageSrc: Resource = $r('app.media.Tomato')
build() {
Column() {
FoodImageDisplay({imageSrc:$imageSrc})
}
.alignItems(HorizontalAlign.Center)
}
}
```
## 如何多个pageAbility之间共享变量
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
1. 可以使用轻量级数据库
2. 可以使用持久化数据管理
3. 可以使用emitter事件通信
## 如何自定义Video组件控制栏样式
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
1. 通过设置属性controls为false关闭默认控制栏
2. 设置Video组件的controller
3. 通过ArkTS实现自定义的控制栏,并通过VideoController控制视频播放
## 对ArkTS组件多次更新时如何优化性能
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过将需要更新的ArkTS组件抽离成自定义组件,并更新该自定义组件内\@State绑定的变量,以此实现组件的局部刷新。
## 如何优化Tab组件性能
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
Tab组件处于某一页签时。其他页签并不会被系统卸载,所以会占用部分内存。可以通过if渲染控制判断当前页签是否是需要显示的页签,若不是则不加载,以此来实现卸载其他不显示的页签并释放这部分内存。
## 如何设置组件不同状态下的样式
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过设置组件的多态样式,实现组件不同状态(无状态、按下、禁用、聚焦、点击)的样式
参考文档:[多态样式](../reference/arkui-ts/ts-universal-attributes-polymorphic-style.md)
## 焦点事件onBlur/onFocus回调无法触发
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
焦点事件默认情况下需要外接键盘的Tab键,或方向键触发,点击触发焦点事件需要添加焦点控制属性focusOnTouch
参考文档:[焦点控制](../reference/arkui-ts/ts-universal-attributes-focus.md)
## Scroll内Flex加宽高与滑动冲突
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
Scroll支持单个子组件,子组件高度应由内容高度决定,当内容中存在异步加载的图片组件导致滚动布局异常时,可约束子组件最小高度constraintSize({ minHeight: '100%' })
## 页面路由跳转后如何阻止其返回原页面
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
通过router.clear()接口清空页面栈中的所有历史页面,保留当前页面作为栈顶页面。
参考文档:[页面路由](../reference/apis/js-apis-router.md)
## 如何实现将TextInput组件内容进行一次性清空
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
可以参考如下实现:
```
struct Index {
@State text: string = 'Hello World'
controller: TextInputController = new TextInputController()
build() {
Row() {
Column() {
TextInput({ placeholder: 'Please input your words.', text: this.text,
controller:this.controller}).onChange((value) => {
this.text = value
})
Button("Clear TextInput").onClick(() => {
this.text = "";
})
}
.width('100%')
}
.height('100%')
}
}
```
## Tabs组件在点击Tab项时是否支持禁止切换
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
不支持。
## 使用 \@state修饰成员变量“id”会报错,报错原因:TypeError: cannot read property 'get' of undefined
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
id添加为唯一值,成为关键字。
## 基于OpenHarmony开发的应用,是否支持使用fontFamily属性设置不同的字体
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
基于OpenHarmony开发的应用,默认字体'HarmonyOS Sans',且当前只支持这种字体。
## 父组件如何与其孙子组件进行状态同步
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
- 方式一(推荐):使用\@Provide和\@Consume装饰器。在父组件使用\@Provide,在孙子组件使用\@Consume,可以实现父组件和孙子组件进行双向数据绑定。
- 方式二:使用\@State和\@Link装饰器。在父组件使用\@State,在每一层子组件(子组件和孙子组件)都使用\@Link。
## 字符超长中间显示省略号
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
代码示例
```
beautySub(str,len) {
var reg = /[\u4e00-\u9fa5]/g;
//减少字符,达到优化
var slice = str.substring(0,len)
var charNum = (~~(slice.match(reg) && slice.match(reg).length))
//减1是为了处理万一超过字符串,不显示多一个不是汉字的字符,
var realen = slice.length*2 - charNum-1
return str.substr(0,realen) + (realen < str.length ? "..." : "") +str.substr(str.length-realen,str.length)
}
```
## richText 组件怎么加上滚动条
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
RichText底层是web,可以参考html的语法,在div上加上的overflow:auto的滚动样式。
## scroll里面套一个grid,怎么禁用grid的滑动事件?
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
可以通过onScrollBegin事件和scrollBy方法实现容器嵌套滚动。
参考:[容器嵌套滚动样例](../reference/arkui-ts/ts-container-scroll.md#示例2)
## 能否去除自定义弹窗组件的白色背景
适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型
当前不支持。原因是当前的UI样式在框架后端写死了,无法更改。
## 组件背景图片设置backgroundImage方法是否支持svg图片格式
适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型
当前不支持。
## 自定义弹窗组件如何设置弹窗位置
适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型
自定义弹窗组件中参数alignment可以指定弹窗的位置。比如设置弹窗在底部:alignment : DialogAlignment.Bottom。
参考文档:[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md)
## scroller如何判断回弹动画的结束误差
适用于:OpenHarmony SDK 3.2.5.3版本,API8 FA模型
目前可以在触摸结束之后,计算同方向的变化,如果变化方向相反,说明出现回弹了,就规避不处理了。
## 如何实现应用数据持久化存储
通过PersistentStorage类实现管理应用持久化数据,可以将特定标记的持久化数据链接到AppStorage中,并由AppStorage接口访问对应持久化数据。
示例:
```
AppStorage.Link('varA')
PersistentStorage.PersistProp("varA", "111");
@Entry
@Componentstruct Index {
@StorageLink('varA') varA: string = ''
build() {
Column() {
Text('varA: ' + this.varA).fontSize(20)
Button('Set').width(100).height(100).onClick(() => {
this.varA += '333'
})
}
.width('100%')
.height('100%')
}
}
```
# UI框架(JS)开发常见问题
## 如何取出xml文件中对应的字段
适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型
convertxml中convert方法提供了转换xml文本为JavaScript对象的能力。
示例:
```
import convertxml from '@ohos.convertxml';
// xml格式的字符串
let xml =
'<?xml version="1.0" encoding="utf-8"?>' +
'<note importance="high" logged="true">' +
' <title>Happy</title>' +
' <todo>Work</todo>' +
' <todo>Play</todo>' +
'</note>';
let conv = new convertxml.ConvertXML();
// 转换选项, 参考文档使用
let options = {
trim: false,
declarationKey: "_declaration",
instructionKey: "_instruction",
attributesKey: "_attributes",
textKey: "_text",
cdataKey: "_cdata",
doctypeKey: "_doctype",
commentKey: "_comment",
parentKey: "_parent",
typeKey: "_type",
nameKey: "_name",
elementsKey: "_elements"
}
let result: any = conv.convert(xml, options) // 将xml文本转为JS对象
console.log('Test: ' + JSON.stringify(result))
console.log('Test: ' + result._declaration._attributes.version) // xml字符串中version字段信息
console.log('Test: ' + result._elements[0]._elements[0]._elements[0]._text) // xml字符串中title字段内容
```
参考文档:[xml转换JavaScript](../reference/apis/js-apis-convertxml.md)
## 如何将时间转为时分秒格式
示例:
```
export default class DateTimeUtil{
/**
* 时分秒
*/
getTime() {
const DATETIME = new Date()
return this.concatTime(DATETIME.getHours(),DATETIME.getMinutes(),DATETIME.getSeconds())
}
/**
* 年月日
*/
getDate() {
const DATETIME = new Date()
return this.concatDate(DATETIME.getFullYear(),DATETIME.getMonth()+1,DATETIME.getDate())
}
/**
* 日期不足两位补充0
* @param value-数据值
*/
fill(value:number) {
return (value> 9 ? '' : '0') + value
}
/**
* 年月日格式修饰
* @param year
* @param month
* @param date
*/
concatDate(year: number, month: number, date: number){
return `${year}${this.fill(month)}${this.fill(date)}`
}
/**
* 时分秒格式修饰
* @param hours
* @param minutes
* @param seconds
*/
concatTime(hours:number,minutes:number,seconds:number){
return `${this.fill(hours)}${this.fill(minutes)}${this.fill(seconds)}`
}
}
```
\ No newline at end of file
# ArkUI Web组件(ArkTS)开发常见问题
## Web组件domStorageAccess属性设置
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
设置是否开启文档对象模型存储接口(DOM Storage API)权限,默认未开启,控制web网页中localStorage的使用,对sessionStorage未做控制
## Web组件加载的html页面内如何检测网络状态
适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型
1. 配置应用权限:ohos.permission.INTERNET 、 ohos.permission.GET_NETWORK_INFO
2. html中通过window.navigator.onLine获取网络状态
## Web组件加载h5页面,首次加载无法设置拼接UserAgent参数
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
默认UserAgent通过WebController获取。一个WebController对象只能控制一个Web组件,且必须在Web组件和WebController绑定后,才能调用WebController上的方法,因此在初次加载前设置默认UserAgent + 自定义字符串拼接,可采用此方式:
1. 使用\@State定义初始userAgent,绑定到Web组件;
2. 在web组件的onUrlLoadIntercept回调中,通过WebController获取默认userAgent,修改Web组件绑定的userAgent。
参考代码如下:
```
@Entry
@Component
struct Index {
private controller: WebController = new WebController()
@State userAgentPa: string = ''
build() {
Row() {
Column() {
Web({ src: 'www.example.com', controller: this.controller })
.width('100%')
.userAgent(this.userAgentPa)
.onUrlLoadIntercept((event) => {
let userAgent = this.controller.getDefaultUserAgent();
this.userAgentPa = userAgent + ' 111111111'
console.log("userAgent onUrlLoadIntercept: " + userAgent);
return false;
})
}
.width('100%').alignItems(HorizontalAlign.Start).backgroundColor(Color.Green)
}
.height('100%')
}
}
```
## 加载Lottie动画的逻辑应该写在onAppear函数中还是应该写在onReady函数中
适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型
onAppear方法只是定位完Canvas的位置,onReady方法才是测量完成,加载动画的逻辑应该写在onReady函数中。
## 调用deleteJavaScriptRegister后是否需要调用refresh接口
适用于:所有版本
不需要。
## 页面如何传递数据给Web组件
适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型
1. 使用WebController创建两个消息端口。
2. 将消息端口1发送到HTML侧,由HTML侧保存并使用。
3. 将消息端口0在应用侧注册回调事件。
4. 使用应用侧的端口0给HTML侧消息端口1发送消息。
使用参考:[Web组件](../reference/arkui-ts/ts-basic-components-web.md)
# 窗口管理开发常见问题
## 如何获取状态栏和导航栏高度
适用于OpenHarmony 3.2 Beta5 API 9
**解决措施**
在加载窗口内容之前,采用systemAvoidAreaChange事件监听。
**代码示例**
```
// MainAbility.ts
import window from '@ohos.window';
/**
* 设置沉浸式窗口,并获取状态栏和导航栏高度
* @param mainWindow 主窗口对象
*/
async function enterImmersion(mainWindow: window.Window) {
mainWindow.on("systemBarTintChange", (data) => {
let avoidAreaRect = data.regionTint[0].region; //data.regionTint是个数组,包含状态栏、导航栏的矩形区域坐标。
})
await mainWindow.setFullScreen(true)
await mainWindow.setSystemBarEnable(["status", "navigation"])
await mainWindow.systemBarProperties({
navigationBarColor: "#00000000",
statusBarColor: "#00000000",
navigationBarContentColor: "#FF0000",
statusBarContentColor: "#FF0000"
})
}
export default class MainAbility extends Ability {
// do something
async onWindowStageCreate(windowStage: window.WindowStage) {
let mainWindow = await windowStage.getMainWindow()
await enterImmersion(mainWindow)
windowStage.loadContent('pages/index')
}
// do something
}
```
## 应用如何设置隐藏顶部的状态栏
适用于OpenHarmony 3.2 Beta5 API 9
**解决措施**
在UIAbility的onWindowStageCreate的生命周期中设置setWindowSystemBarEnable接口即可。
**代码示例**
```
onWindowStageCreate(windowStage){
windowStage.getMainWindowSync().setWindowSystemBarEnable([])
......
}
```
**参考链接**
[窗口基础能力文档](../reference/apis/js-apis-window.md)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册