未验证 提交 294c7e01 编写于 作者: O openharmony_ci 提交者: Gitee

!17556 新增FAQ

Merge pull request !17556 from zengyawen/master
# 常见问题
- [开发语言常见问题](faqs-language.md)
- [Ability框架开发常见问题](faqs-ability.md)
- [应用程序包管理开发常见问题](faqs-bundle.md)
- [ArkUI组件(ArkTS)开发常见问题](faqs-ui-ets.md)
- [ArkUI Web组件(ArkTS)开发常见问题](faqs-web-arkts.md)
- [UI框架(JS)开发常见问题](faqs-ui-js.md)
- [公共事件与通知开发常见问题](faqs-event-notification.md)
- [Ability开发常见问题](faqs-ability.md)
- [ArkUI框架开发常见问题](faqs-arkui.md)
- [Web开发常见问题](faqs-arkui-web.md)
- [包管理开发常见问题](faqs-bundle-management.md)
- [资源管理开发常见问题](faqs-globalization.md)
- [事件通知开发常见问题](faqs-event-notification.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-media.md)
- [网络与连接开发常见问题](faqs-connectivity.md)
- [数据管理开发常见问题](faqs-data-management.md)
- [设备管理开发常见问题](faqs-device-management.md)
- [网络管理开发常见问题](faqs-network-management.md)
- [DFX开发常见问题](faqs-dfx.md)
- [国际化开发常见问题](faqs-international.md)
- [Native API使用常见问题](faqs-native.md)
- [三四方库使用常见问题](faqs-third-party-library.md)
- [IDE使用常见问题](faqs-ide.md)
- [开发板使用常见问题](faqs-development-board.md)
- [泛Sensor服务开发常见问题](faqs-sensor.md)
- [启动恢复开发常见问题](faqs-startup.md)
- [分布式DeviceProfrofile开发常见问题](faqs-distributed-device-profile.md)
- [SDK使用常见问题](faqs-sdk.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() {
XComponent({
id: 'componentId',
type: 'surface',
})
.width('100%')
.height('100%')
.opacity(0.01)
// 页面内容
}
.width('100%')
.height('100%')
.backgroundColor('rgba(255,255,255, 0)')
}
```
**解决措施**
参考文档,配置卡片事件,指定需要跳转的目标Ability,然后在目标UIAbility的onWindowStageCreate\(\)中调用loadContent跳转至指定的page页面。
**参考链接**
[开发卡片事件](../application-models/arkts-ui-widget-configuration.md)
## 如何在Stage模型中创建后台服务
适用于:Openharmony 3.2 Beta5
**问题现象**
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
}
```
## 如何获取设备横竖屏的状态变化的通知
**参考链接**
适用于: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)
参考如下代码实现,示例:
## 如何获取当前应用程序缓存目录
```
this.context.startAbility(
{
action: "action.settings.app.info",
parameters: { "settingsParamBundleName": "your app bundlename" }
})
```
适用于:Openharmony 3.2 Beta5 API 9
## 如何监听屏幕旋转
**解决措施**
使用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
在Openharmony中使用Context.cacheDir获取应用程序的缓存目录。
参考如下代码实现,示例:
**参考链接**
```
let listener = mediaquery.matchMediaSync('(orientation: landscape)')
onPortrait(mediaQueryResult) {
if (mediaQueryResult.matches) {
// do something here
} else {
// do something here
}
}
listener.on('change', onPortrait)
```
[cacheDir](../application-models/application-context-stage.md#获取应用开发路径)
## 服务卡片生命周期回调函数在哪个js文件中调用
适用于:Openharmony 3.2 Beta5 API 9
**解决措施**
新建卡片时会生成一个FormAblity.ts文件,其中包含卡片对应的生命周期。
参考链接
[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
**解决措施**
参考如下代码实现,示例:
```
{
"style": {
"app_background": "#00000000"
}
}
this.context.startAbility(
{
action: "action.settings.app.info",
parameters: { "settingsParamBundleName": "your app bundlename" }
})
```
## FA卡片如何的传参和接参
适用:OpenHarmony SDK 3.2.5.5版本
## stage模型,@Component组件内如何获取UIAbilityContext
使用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)
此差异已折叠。
# 包管理开发常见问题
## 如何判断某个应用是否为系统应用
适用于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开发常见问题
## 程序打开直接崩溃了,如何定位问题
## 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
import WantAgent from '@ohos.app.ability.wantAgent';
@Entry
@Component
struct Faq10_1 {
@State message: string = ''
async function publishNotification() {
let wantAgentInfo = {
wants: [
{
bundleName: "com.example.myapplication",
abilityName: "EntryAbility",
build() {
Row() {
Column() {
Text('订阅:' + this.message)
.fontSize(30)
.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}`);
}
})
}
],
operationType: WantAgent.OperationType.START_ABILITIES,
requestCode: 0,
.width('100%')
}
.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属性不生效
适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型
状态栏字体高亮属性的本质就只是让字体变成白色。调用window实例的setSystemBarProperties接口时,如果设置了状态栏内容颜色statusBarContentColor,就以开发者设置的颜色为准,isStatusBarLightIcon状态栏字体高亮属性就不生效;同理,如果设置了导航栏内容颜色navigationBarContentColor,isNavigationBarLightIcon导航栏字体高亮属性就不生效。
## 如何设置系统状态栏样式
适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型
导入\@ohos.window模块,开发者可以使用window.setSystemBarProperties()接口设置状态栏样式属性,达到自定义样式的效果。
## 如何隐藏状态栏,实现沉浸式效果
适用于:OpenHarmony SDK 3.2.6.3版本,API9 Stage模型
1. 可以在onWindowStageCreate方法获取windowClass对象。
```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) {
console.error('Failed to obtain the main window.')
return;
}
// 获取到窗口对象
globalThis.windowClass = data;
})
}
```
2. 设置窗口全屏,隐藏状态栏。
```ts
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));
});
```
## 如何获取设备的dpi值
适用于:OpenHarmony 3.2 Beta5,API 9 Stage模型
**解决措施**
导入@ohos.display包,通过getDefaultDisplaySync\(\)方法获取。
**代码示例**
```
import display from '@ohos.display';
let displayClass = null;
try {
displayClass = display.getDefaultDisplaySync();
console.info('Test densityDPI:' + JSON.stringify(displayClass.densityDPI));
} catch (exception) {
console.error('Failed to obtain the default display object. Code: ' + JSON.stringify(exception));
}
```
## 如何隐藏状态栏实现沉浸式效果
适用于:OpenHarmony 3.2 Beta5,API 9 Stage模型
**解决措施**
1. 可以在onWindowStageCreate方法获取windowClass对象。
```
onWindowStageCreate(windowStage) {
// Main window is created, set main page for this ability
console.log("[Demo] MainAbility onWindowStageCreate")
windowStage.getMainWindow((err, data) => {
if (err.code) {
console.error('Failed to obtain the main window.')
return;
}
// 获取到窗口对象
globalThis.windowClass = 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));
});
```
## 如何设置系统状态栏颜色
适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型
参考如下方式实现,示例:
```ts
window.getTopWindow(globalThis.mainContext).then(win => {
var systemBarProperties = {
statusBarColor: '#19B6FF', // 状态栏背景颜色
navigationBarColor: '#19B6FF', // 导航栏背景颜色
isStatusBarLightIcon: false, // 状态栏图标是否为高亮状态。
isNavigationBarLightIcon: true, // 导航栏图标是否为高亮状态。
statusBarContentColor: '#0D0500', // 状态栏文字颜色
navigationBarContentColor: '#FFA500' // 导航栏文字颜色
};
win.setSystemBarProperties(systemBarProperties).catch(err => {
INDEX_LOGGER.info(`set System Bar Properties failed:${err}`)
})
})
.catch(err => {
INDEX_LOGGER.info(`get top window failed:${err}`)
})
import window from '@ohos.window';
let windowClass = null;
try {
let promise = window.getLastWindow(this.context);
promise.then((data)=> {
//获取窗口对象
windowClass = data;
try {
//获取窗口属性
let properties = windowClass.getWindowProperties();
let rect = properties.windowRect;
//rect.width: 窗口宽度;rect.height: 窗口高度
} catch (exception) {
console.error('Failed to obtain the window properties. Cause: ' + JSON.stringify(exception));
}
console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data));
}).catch((err)=>{
console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err));
});} catch (exception) {
console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(exception));
}
```
# 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';
```
此差异已折叠。
# 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)
# full-SDK编译指南
# 如何编译full-SDK
**full-SDK**是提供OpenHarmony全量接口的SDK,包含了系统应用所需要的高权限API,用于厂商开发应用。
......
# full-SDK替换指南
# 如何替换full-SDK
**public-SDK**是提供给应用开发的工具包,跟随DevEco Studio下载,不包含系统应用所需要的高权限API
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册