diff --git a/CODEOWNERS b/CODEOWNERS
index 4f7ab1dad900229e988205402075da217e03f536..b3a89aecb5c1bf1907db23aabcb7d61adecc8ab3 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -435,6 +435,7 @@ zh-cn/application-dev/reference/apis/js-apis-system-bluetooth.md @cheng_guohong
zh-cn/application-dev/reference/apis/js-apis-system-brightness.md @aqxyjay @zengyawen @aqxyjay @alien0208
zh-cn/application-dev/reference/apis/js-apis-system-cipher.md @gaoyong @zengyawen @niejiteng @jumozhanjiang
zh-cn/application-dev/reference/apis/js-apis-system-configuration.md @Buda-Liu @ningningW @budda-wang @tomatodevboy
+zh-cn/application-dev/reference/apis/js-apis-system-date-time.md @feng-aiwen @ningningW @illybyy @murphy1984
zh-cn/application-dev/reference/apis/js-apis-system-device.md @mupceet @zengyawen @handyohos @nan-xiansen
zh-cn/application-dev/reference/apis/js-apis-system-fetch.md @zhang-hai-feng @zengyawen @jyh926 @gaoxi785
zh-cn/application-dev/reference/apis/js-apis-system-file.md @panqinxu @zengyawen @bubble_mao @jinhaihw
@@ -520,7 +521,7 @@ zh-cn/application-dev/reference/apis/js-apis-bundleManager.md @shuaytao @RayShih
zh-cn/application-dev/reference/apis/js-apis-bundleMonitor.md @shuaytao @RayShih @wangzhen107 @inter515
zh-cn/application-dev/reference/apis/js-apis-colorSpaceManager.md @zhangqiang183 @ge-yafang @wind_zj @zxg-gitee
zh-cn/application-dev/reference/apis/js-apis-commonEventManager.md @jayleehw @RayShih @li-weifeng2 @currydavids
-zh-cn/application-dev/reference/apis/js-apis-configPolicy.md @Buda-Liu @ningningW @budda-wang @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-configPolicy.md @liuzuming @ningningW @yangqing3
zh-cn/application-dev/reference/apis/js-apis-cooperate.md @yuanxinying @ningningW @cococoler @alien0208
zh-cn/application-dev/reference/apis/js-apis-cryptoFramework.md @gaoyong @zengyawen @niejiteng @jumozhanjiang
zh-cn/application-dev/reference/apis/js-apis-cert.md @gaoyong @zengyawen @niejiteng @jumozhanjiang
@@ -528,8 +529,13 @@ zh-cn/application-dev/reference/apis/js-apis-curve.md @huaweimaxuchu @HelloCreas
zh-cn/application-dev/reference/apis/js-apis-defaultAppManager.md @shuaytao @RayShih @wangzhen107 @inter515
zh-cn/application-dev/reference/apis/js-apis-distributedBundle.md @shuaytao @RayShih @wangzhen107 @inter515
zh-cn/application-dev/reference/apis/js-apis-distributedKVStore.md @feng-aiwen @ge-yafang @gong-a-shi @logic42
-zh-cn/application-dev/reference/apis/js-apis-enterprise-adminManager.md @Buda-Liu @ningningW @budda-wang @yangqing3
-zh-cn/application-dev/reference/apis/js-apis-enterprise-dateTimeManager.md @Buda-Liu @ningningW @budda-wang @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-enterprise-accountManager.md @liuzuming @ningningW @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-enterprise-adminManager.md @liuzuming @ningningW @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-enterprise-dateTimeManager.md @liuzuming @ningningW @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-enterprise-deviceControl.md @liuzuming @ningningW @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-enterprise-deviceInfo.md @liuzuming @ningningW @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-enterprise-networkManager.md @liuzuming @ningningW @yangqing3
+zh-cn/application-dev/reference/apis/js-apis-enterprise-wifiManager.md @liuzuming @ningningW @yangqing3
zh-cn/application-dev/reference/apis/js-apis-fileAccess.md @panqinxu @zengyawen @bubble_mao @jinhaihw
zh-cn/application-dev/reference/apis/js-apis-fileExtensionInfo.md @panqinxu @zengyawen @bubble_mao @jinhaihw
zh-cn/application-dev/reference/apis/js-apis-freeInstall.md @shuaytao @RayShih @wangzhen107 @inter515
diff --git a/en/application-dev/file-management/medialibrary-filepath-guidelines.md b/en/application-dev/file-management/medialibrary-filepath-guidelines.md
index 4c7e2ecd4db6723a66930e624bd4b36b556330d1..1e310ef9312499bb131affb620ac7758e5033778 100644
--- a/en/application-dev/file-management/medialibrary-filepath-guidelines.md
+++ b/en/application-dev/file-management/medialibrary-filepath-guidelines.md
@@ -136,7 +136,7 @@ async function copySandbox2Public() {
console.error('file asset get failed, message = ' + err);
}
let fdPub = await fileAsset.open('rw');
- let fdSand = await fs.open(sandboxDirPath + 'testFile.txt', OpenMode.READ_WRITE);
+ let fdSand = await fs.open(sandboxDirPath + 'testFile.txt', fs.OpenMode.READ_WRITE);
await fs.copyFile(fdSand.fd, fdPub);
await fileAsset.close(fdPub);
await fs.close(fdSand.fd);
@@ -174,7 +174,7 @@ async function example() {
const context = getContext(this);
let media = mediaLibrary.getMediaLibrary(context);
const path = await media.getPublicDirectory(DIR_DOCUMENTS);
- media.createAsset(mediaType, "testFile.text", path).then((asset) => {
+ media.createAsset(mediaType, "testFile.txt", path).then((asset) => {
console.info("createAsset successfully:" + JSON.stringify(asset));
}).catch((err) => {
console.error("createAsset failed with error: " + err);
diff --git a/en/application-dev/file-management/medialibrary-resource-guidelines.md b/en/application-dev/file-management/medialibrary-resource-guidelines.md
index 7d120ec9a4fa9fd38ba92be97ee7fdd5a6f33816..054591847ffa156f5ee85cf5e2412b215750e283 100644
--- a/en/application-dev/file-management/medialibrary-resource-guidelines.md
+++ b/en/application-dev/file-management/medialibrary-resource-guidelines.md
@@ -42,14 +42,11 @@ async function example() {
const context = getContext(this);
let media = mediaLibrary.getMediaLibrary(context);
const fetchFileResult = await media.getFileAssets(option);
- fetchFileResult.getFirstObject().then((fileAsset) => {
+ fetchFileResult.getFirstObject().then(async (fileAsset) => {
console.log('getFirstObject.displayName : ' + fileAsset.displayName);
for (let i = 1; i < fetchFileResult.getCount(); i++) {
- fetchFileResult.getNextObject().then((fileAsset) => {
- console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
- }).catch((err) => {
- console.error('Failed to get next object: ' + err);
- });
+ let fileAsset = await fetchFileResult.getNextObject();
+ console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
}
}).catch((err) => {
console.error('Failed to get first object: ' + err);
@@ -75,14 +72,11 @@ async function example() {
const context = getContext(this);
let media = mediaLibrary.getMediaLibrary(context);
const fetchFileResult = await media.getFileAssets(option);
- fetchFileResult.getFirstObject().then((fileAsset) => {
+ fetchFileResult.getFirstObject().then(async (fileAsset) => {
console.info('getFirstObject.displayName : ' + fileAsset.displayName);
for (let i = 1; i < fetchFileResult.getCount(); i++) {
- fetchFileResult.getNextObject().then((fileAsset) => {
- console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
- }).catch((err) => {
- console.error('Failed to get next object: ' + err);
- });
+ let fileAsset = await fetchFileResult.getNextObject();
+ console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
}
}).catch((err) => {
console.error('Failed to get first object: ' + err);
@@ -108,14 +102,11 @@ async function example() {
const context = getContext(this);
let media = mediaLibrary.getMediaLibrary(context);
const fetchFileResult = await media.getFileAssets(option);
- fetchFileResult.getFirstObject().then((fileAsset) => {
+ fetchFileResult.getFirstObject().then(async (fileAsset) => {
console.info('getFirstObject.displayName : ' + fileAsset.displayName);
for (let i = 1; i < fetchFileResult.getCount(); i++) {
- fetchFileResult.getNextObject().then((fileAsset) => {
- console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
- }).catch((err) => {
- console.error('Failed to get next object: ' + err);
- });
+ let fileAsset = await fetchFileResult.getNextObject();
+ console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
}
}).catch((err) => {
console.error('Failed to get first object: ' + err);
diff --git a/zh-cn/application-dev/Readme-CN.md b/zh-cn/application-dev/Readme-CN.md
index 603a38b9ac205ab36eec595899f2a66afe409565..b81af1f250ccdf126e45ebeccc44f7c29c02a975 100644
--- a/zh-cn/application-dev/Readme-CN.md
+++ b/zh-cn/application-dev/Readme-CN.md
@@ -17,7 +17,6 @@
- 应用程序包结构
- [Stage模型应用程序包结构](quick-start/application-package-structure-stage.md)
- [FA模型应用程序包结构](quick-start/application-package-structure-fa.md)
- - [HAR包结构](quick-start/har-structure.md)
- 应用程序包多HAP机制
- [多HAP机制设计目标](quick-start/multi-hap-objective.md)
- [多HAP构建视图](quick-start/multi-hap-build-view.md)
@@ -26,11 +25,11 @@
- [多HAP运行机制及数据通信方式](quick-start/multi-hap-principles.md)
- [应用程序包安装和卸载流程](quick-start/application-package-install-uninstall.md)
- 共享包
+ - [共享包概述](quick-start/shared-guide.md)
- [HAR](quick-start/har-package.md)
- HSP
- - [HSP概述](quick-start/hsp-guide.md)
- [应用内HSP开发指导](quick-start/in-app-hsp.md)
- - [应用间HSP开发指导](quick-start/cross-app-hsp.md)
+ - [应用间HSP开发指导(仅对系统应用开放)](quick-start/cross-app-hsp.md)
- 应用配置文件(Stage模型)
- [应用配置文件概述(Stage模型)](quick-start/application-configuration-file-overview-stage.md)
- [app.json5配置文件](quick-start/app-configuration-file.md)
diff --git a/zh-cn/application-dev/application-dev-guide-for-gitee.md b/zh-cn/application-dev/application-dev-guide-for-gitee.md
index 21267735bd801a4e6bfdd366699a584659c43e4c..b8320cd4c830d9fbcd6e012ce54dbfcf34c3248c 100644
--- a/zh-cn/application-dev/application-dev-guide-for-gitee.md
+++ b/zh-cn/application-dev/application-dev-guide-for-gitee.md
@@ -40,6 +40,8 @@
- [应用测试](application-test/Readme-CN.md)
- [IDL工具规格及使用说明书](IDL/idl-guidelines.md)
- [Native API的相关指导](napi/Readme-CN.md)
+- [文件管理](file-management/medialibrary-overview.md)
+- [一次开发,多端部署](key-features/multi-device-app-dev/foreword.md)
### 工具
diff --git a/zh-cn/application-dev/application-dev-guide.md b/zh-cn/application-dev/application-dev-guide.md
index 2942726a14e480b66b3bbfb839a892fb4c97cf76..15439726df413f25a8d3612e0b10ca9868ca322c 100644
--- a/zh-cn/application-dev/application-dev-guide.md
+++ b/zh-cn/application-dev/application-dev-guide.md
@@ -40,6 +40,8 @@
- [应用测试](application-test/arkxtest-guidelines.md)
- [IDL工具规格及使用说明书](IDL/idl-guidelines.md)
- [Native API的相关指导](napi/napi-guidelines.md)
+- [文件管理](file-management/medialibrary-overview.md)
+- [一次开发,多端部署](key-features/multi-device-app-dev/foreword.md)
### 工具
diff --git a/zh-cn/application-dev/application-models/enterprise-extensionAbility.md b/zh-cn/application-dev/application-models/enterprise-extensionAbility.md
index b418036d0faacb55d22a3ae4ed96d5db25a60c1a..158b3eb4801466805d8261919edc479a96f3b7b1 100644
--- a/zh-cn/application-dev/application-models/enterprise-extensionAbility.md
+++ b/zh-cn/application-dev/application-models/enterprise-extensionAbility.md
@@ -2,18 +2,16 @@
## EnterpriseAdminExtensionAbility简介
-企业设备管理扩展能力,是MDM应用必备组件。当开发者为企业开发MDM(Mobilie Device Management)应用时,需继承EnterpriseAdminExtensionAbility,在EnterpriseAdminExtensionAbility实例中实现MDM业务逻辑,EnterpriseAdminExtensionAbility实现了系统管理状态变化通知功能,并定义了管理应用激活、去激活、应用安装、卸载事件等回调接口。
+企业设备管理扩展能力,是MDM(Mobile Device Management)应用必备组件。当开发者为企业开发MDM应用时,需继承EnterpriseAdminExtensionAbility,在EnterpriseAdminExtensionAbility实例中实现MDM业务逻辑,EnterpriseAdminExtensionAbility实现了系统管理状态变化通知功能,并定义了管理应用激活、去激活、应用安装、卸载事件等回调接口。
## 约束与限制
-- **_功能限制_**
-
- 仅支持设备管理员应用使用。
+ 仅支持设备管理员应用使用。(功能限制)
-## 场景:监听设备管理器激活、去激活、应用安装、卸载事件
+## 场景:监听设备管理器激活、去激活、应用安装、卸载事件
-## 概述
+### 概述
onAdminEnabled:由企业管理员或者员工部署MDM应用,激活设备管理器,系统通知MDM应用已激活DeviceAdmin权限。MDM应用可在onAdminEnabled回调函数中进行初始化策略设置。
@@ -23,7 +21,7 @@ onBundleAdded: 企业应用管理场景下,企业管理员订阅应用安装
onBundleRemoved: 企业应用管理场景下,企业管理员取消订阅应用安装卸载事件。
-## 接口说明
+### 接口说明
| 类名 | 接口名称 | 描述 |
| :------------------------------ | ----------------------------------------- | ---------------------------- |
@@ -32,13 +30,13 @@ onBundleRemoved: 企业应用管理场景下,企业管理员取消订阅应用
| EnterpriseAdminExtensionAbility | onAdminEnabled(): void | 设备管理器应用激活回调方法 |
| EnterpriseAdminExtensionAbility | onBundleRemoved(bundleName: string): void | 应用卸载回调方法 |
-## 开发步骤
+### 开发步骤
-开发者在实现EnterpriseAdminExtensionAbility的时候,需先激活设备管理员应用,并在设备管理员应用的代码目录下载新建ExtensionAbility,具体步骤如下。
+开发者在实现EnterpriseAdminExtensionAbility的时候,需先激活设备管理员应用,并在设备管理员应用的代码目录下新建ExtensionAbility,具体步骤如下。
1. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为EnterpriseExtAbility。
2. 在EnterpriseExtAbility目录,右键选择“New > TypeScript File”,新建一个TypeScript文件并命名为EnterpriseExtAbility.ts。
-3. 打开EnterpriseExtAbility.ts文件,导入EnterpriseAdminExtensionAbility模块,自定义类继承EnterpriseAdminExtensionAbility并加上需要的应用通知回调方法,如onAdminEnabled()、onAdminDisabled()等回调方法。当设备管理员应用被激活或则去激活时,则可以在对应回调方法中接受系统发送通知。
+3. 打开EnterpriseExtAbility.ts文件,导入EnterpriseAdminExtensionAbility模块,自定义类继承EnterpriseAdminExtensionAbility并加上需要的应用通知回调方法,如onAdminEnabled()、onAdminDisabled()等回调方法。当设备管理员应用被激活或者去激活时,则可以在对应回调方法中接受系统发送通知。
```ts
import EnterpriseAdminExtensionAbility from '@ohos.enterprise.EnterpriseAdminExtensionAbility';
diff --git a/zh-cn/application-dev/connectivity/http-request.md b/zh-cn/application-dev/connectivity/http-request.md
index ff6ec5ed4113c8c9c14cb6a1613dd86dab7ff232..8c4c663fcc800a1998168aed065fd3e568a5e329 100644
--- a/zh-cn/application-dev/connectivity/http-request.md
+++ b/zh-cn/application-dev/connectivity/http-request.md
@@ -30,7 +30,7 @@ HTTP数据请求功能主要由http模块提供。
| on\('dataProgress'\)10+ | 订阅HTTP流式响应数据接收进度事件。 |
| off\('dataProgress'\)10+ | 取消订阅HTTP流式响应数据接收进度事件。 |
-## 开发步骤
+## request接口开发步骤
1. 从@ohos.net.http.d.ts中导入http命名空间。
2. 调用createHttp()方法,创建一个HttpRequest对象。
@@ -83,7 +83,7 @@ httpRequest.request(
console.info('error:' + JSON.stringify(err));
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
- // 当该请求使用完毕时,调用destroy方法主动销毁。
+ // 当该请求使用完毕时,调用destroy方法主动销毁
httpRequest.destroy();
}
}
diff --git a/zh-cn/application-dev/connectivity/socket-connection.md b/zh-cn/application-dev/connectivity/socket-connection.md
index ab896fdfe7ac0b9c5669b2df7e12614b30867c9d..c9c195c94451b77476afa6cafca456ce96a5ad50 100644
--- a/zh-cn/application-dev/connectivity/socket-connection.md
+++ b/zh-cn/application-dev/connectivity/socket-connection.md
@@ -49,6 +49,7 @@ TLS Socket连接主要由tls_socket模块提供。具体接口说明如下表。
| 接口名 | 功能描述 |
| -------- | -------- |
+| constructTLSSocketInstance() | 创建一个TLSSocket对象。 |
| bind() | 绑定IP地址和端口号。 |
| close(type: 'error') | 关闭连接。 |
| connect() | 连接到指定的IP地址和端口。 |
diff --git a/zh-cn/application-dev/media/audio-capturer.md b/zh-cn/application-dev/media/audio-capturer.md
index 3d4ecec3a0bb0bbfa9ba8987f140e41659df4f59..451362be0bc16f24039f8aabea0c1bc7e12eb15f 100644
--- a/zh-cn/application-dev/media/audio-capturer.md
+++ b/zh-cn/application-dev/media/audio-capturer.md
@@ -27,32 +27,42 @@ AudioCapturer提供了用于获取原始音频文件的方法。开发者可以
详细API含义可参考:[音频管理API文档AudioCapturer](../reference/apis/js-apis-audio.md#audiocapturer8)
-1. 使用createAudioCapturer()创建一个AudioCapturer实例。
+1. 使用createAudioCapturer()创建一个全局的AudioCapturer实例。
在audioCapturerOptions中设置音频采集器的相关参数。该实例可用于音频采集、控制和获取采集状态,以及注册通知回调。
```js
- import audio from '@ohos.multimedia.audio';
-
- let audioStreamInfo = {
- samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
- channels: audio.AudioChannel.CHANNEL_1,
- sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
- encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
- }
-
- let audioCapturerInfo = {
- source: audio.SourceType.SOURCE_TYPE_MIC,
- capturerFlags: 0 // 0是音频采集器的扩展标志位,默认为0
- }
-
- let audioCapturerOptions = {
- streamInfo: audioStreamInfo,
- capturerInfo: audioCapturerInfo
- }
-
- let audioCapturer = await audio.createAudioCapturer(audioCapturerOptions);
- console.log('AudioRecLog: Create audio capturer success.');
+ import audio from '@ohos.multimedia.audio';
+ import fs from '@ohos.file.fs'; //便于步骤3 read函数调用
+
+ //音频渲染相关接口自测试
+ @Entry
+ @Component
+ struct AudioRenderer {
+ @State message: string = 'Hello World'
+ private audioCapturer : audio.AudioCapturer; //供全局调用
+
+ async initAudioCapturer(){
+ let audioStreamInfo = {
+ samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
+ channels: audio.AudioChannel.CHANNEL_1,
+ sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
+ encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
+ }
+
+ let audioCapturerInfo = {
+ source: audio.SourceType.SOURCE_TYPE_MIC,
+ capturerFlags: 0 // 0是音频采集器的扩展标志位,默认为0
+ }
+
+ let audioCapturerOptions = {
+ streamInfo: audioStreamInfo,
+ capturerInfo: audioCapturerInfo
+ }
+
+ this.audioCapturer = await audio.createAudioCapturer(audioCapturerOptions);
+ console.log('AudioRecLog: Create audio capturer success.');
+ }
```
2. 调用start()方法来启动/恢复采集任务。
@@ -60,23 +70,18 @@ AudioCapturer提供了用于获取原始音频文件的方法。开发者可以
启动完成后,采集器状态将变更为STATE_RUNNING,然后应用可以开始读取缓冲区。
```js
- import audio from '@ohos.multimedia.audio';
-
- async function startCapturer() {
- let state = audioCapturer.state;
+ async startCapturer() {
+ let state = this.audioCapturer.state;
// Capturer start时的状态应该是STATE_PREPARED、STATE_PAUSED和STATE_STOPPED之一.
- if (state != audio.AudioState.STATE_PREPARED || state != audio.AudioState.STATE_PAUSED ||
- state != audio.AudioState.STATE_STOPPED) {
- console.info('Capturer is not in a correct state to start');
- return;
- }
- await audioCapturer.start();
-
- state = audioCapturer.state;
- if (state == audio.AudioState.STATE_RUNNING) {
- console.info('AudioRecLog: Capturer started');
- } else {
- console.error('AudioRecLog: Capturer start failed');
+ if (state == audio.AudioState.STATE_PREPARED || state == audio.AudioState.STATE_PAUSED ||
+ state == audio.AudioState.STATE_STOPPED) {
+ await this.audioCapturer.start();
+ state = this.audioCapturer.state;
+ if (state == audio.AudioState.STATE_RUNNING) {
+ console.info('AudioRecLog: Capturer started');
+ } else {
+ console.error('AudioRecLog: Capturer start failed');
+ }
}
}
```
@@ -86,91 +91,88 @@ AudioCapturer提供了用于获取原始音频文件的方法。开发者可以
参考以下示例,将采集到的数据写入文件。
```js
- import fs from '@ohos.file.fs';
-
- let state = audioCapturer.state;
- // 只有状态为STATE_RUNNING的时候才可以read.
- if (state != audio.AudioState.STATE_RUNNING) {
- console.info('Capturer is not in a correct state to read');
- return;
- }
-
- const path = '/data/data/.pulse_dir/capture_js.wav'; // 采集到的音频文件存储路径
- let file = fs.openSync(filePath, 0o2);
- let fd = file.fd;
- if (file !== null) {
- console.info('AudioRecLog: file created');
- } else {
- console.info('AudioRecLog: file create : FAILED');
- return;
- }
-
- if (fd !== null) {
- console.info('AudioRecLog: file fd opened in append mode');
- }
-
- let numBuffersToCapture = 150; // 循环写入150次
- let count = 0;
- while (numBuffersToCapture) {
- let bufferSize = await audioCapturer.getBufferSize();
- let buffer = await audioCapturer.read(bufferSize, true);
- let options = {
- offset: count * this.bufferSize,
- length: this.bufferSize
+ async readData(){
+ let state = this.audioCapturer.state;
+ // 只有状态为STATE_RUNNING的时候才可以read.
+ if (state != audio.AudioState.STATE_RUNNING) {
+ console.info('Capturer is not in a correct state to read');
+ return;
}
- if (typeof(buffer) == undefined) {
- console.info('AudioRecLog: read buffer failed');
+ const path = '/data/data/.pulse_dir/capture_js.wav'; // 采集到的音频文件存储路径
+ let file = fs.openSync(path, 0o2);
+ let fd = file.fd;
+ if (file !== null) {
+ console.info('AudioRecLog: file created');
} else {
- let number = fs.writeSync(fd, buffer, options);
- console.info(`AudioRecLog: data written: ${number}`);
- }
- numBuffersToCapture--;
- count++;
+ console.info('AudioRecLog: file create : FAILED');
+ return;
+ }
+ if (fd !== null) {
+ console.info('AudioRecLog: file fd opened in append mode');
+ }
+ let numBuffersToCapture = 150; // 循环写入150次
+ let count = 0;
+ while (numBuffersToCapture) {
+ this.bufferSize = await this.audioCapturer.getBufferSize();
+ let buffer = await this.audioCapturer.read(this.bufferSize, true);
+ let options = {
+ offset: count * this.bufferSize,
+ length: this.bufferSize
+ }
+ if (typeof(buffer) == undefined) {
+ console.info('AudioRecLog: read buffer failed');
+ } else {
+ let number = fs.writeSync(fd, buffer, options);
+ console.info(`AudioRecLog: data written: ${number}`);
+ }
+ numBuffersToCapture--;
+ count++;
+ }
}
```
4. 采集完成后,调用stop方法,停止录制。
```js
- async function StopCapturer() {
- let state = audioCapturer.state;
- // 只有采集器状态为STATE_RUNNING或STATE_PAUSED的时候才可以停止
- if (state != audio.AudioState.STATE_RUNNING && state != audio.AudioState.STATE_PAUSED) {
- console.info('AudioRecLog: Capturer is not running or paused');
- return;
- }
-
- await audioCapturer.stop();
-
- state = audioCapturer.state;
- if (state == audio.AudioState.STATE_STOPPED) {
- console.info('AudioRecLog: Capturer stopped');
- } else {
- console.error('AudioRecLog: Capturer stop failed');
- }
- }
+ async StopCapturer() {
+ let state = this.audioCapturer.state;
+ // 只有采集器状态为STATE_RUNNING或STATE_PAUSED的时候才可以停止
+ if (state != audio.AudioState.STATE_RUNNING && state != audio.AudioState.STATE_PAUSED) {
+ console.info('AudioRecLog: Capturer is not running or paused');
+ return;
+ }
+
+ await this.audioCapturer.stop();
+
+ state = this.audioCapturer.state;
+ if (state == audio.AudioState.STATE_STOPPED) {
+ console.info('AudioRecLog: Capturer stopped');
+ } else {
+ console.error('AudioRecLog: Capturer stop failed');
+ }
+ }
```
5. 任务结束,调用release()方法释放相关资源。
```js
- async function releaseCapturer() {
- let state = audioCapturer.state;
- // 采集器状态不是STATE_RELEASED或STATE_NEW状态,才能release
- if (state == audio.AudioState.STATE_RELEASED || state == audio.AudioState.STATE_NEW) {
- console.info('AudioRecLog: Capturer already released');
- return;
- }
-
- await audioCapturer.release();
-
- state = audioCapturer.state;
- if (state == audio.AudioState.STATE_RELEASED) {
- console.info('AudioRecLog: Capturer released');
- } else {
- console.info('AudioRecLog: Capturer release failed');
- }
- }
+ async releaseCapturer() {
+ let state = this.audioCapturer.state;
+ // 采集器状态不是STATE_RELEASED或STATE_NEW状态,才能release
+ if (state == audio.AudioState.STATE_RELEASED || state == audio.AudioState.STATE_NEW) {
+ console.info('AudioRecLog: Capturer already released');
+ return;
+ }
+
+ await this.audioCapturer.release();
+
+ state = this.audioCapturer.state;
+ if (state == audio.AudioState.STATE_RELEASED) {
+ console.info('AudioRecLog: Capturer released');
+ } else {
+ console.info('AudioRecLog: Capturer release failed');
+ }
+ }
```
6. (可选)获取采集器相关信息
@@ -178,23 +180,20 @@ AudioCapturer提供了用于获取原始音频文件的方法。开发者可以
通过以下代码,可以获取采集器的相关信息。
```js
- // 获取当前采集器状态
- let state = audioCapturer.state;
-
- // 获取采集器信息
- let audioCapturerInfo : audio.AuduioCapturerInfo = await audioCapturer.getCapturerInfo();
-
- // 获取音频流信息
- let audioStreamInfo : audio.AudioStreamInfo = await audioCapturer.getStreamInfo();
-
- // 获取音频流ID
- let audioStreamId : number = await audioCapturer.getAudioStreamId();
-
- // 获取纳秒形式的Unix时间戳
- let audioTime : number = await audioCapturer.getAudioTime();
-
- // 获取合理的最小缓冲区大小
- let bufferSize : number = await audioCapturer.getBufferSize();
+ async getAudioCapturerInfo(){
+ // 获取当前采集器状态
+ let state = this.audioCapturer.state;
+ // 获取采集器信息
+ let audioCapturerInfo : audio.AudioCapturerInfo = await this.audioCapturer.getCapturerInfo();
+ // 获取音频流信息
+ let audioStreamInfo : audio.AudioStreamInfo = await this.audioCapturer.getStreamInfo();
+ // 获取音频流ID
+ let audioStreamId : number = await this.audioCapturer.getAudioStreamId();
+ // 获取纳秒形式的Unix时间戳
+ let audioTime : number = await this.audioCapturer.getAudioTime();
+ // 获取合理的最小缓冲区大小
+ let bufferSize : number = await this.audioCapturer.getBufferSize();
+ }
```
7. (可选)使用on('markReach')方法订阅采集器标记到达事件,使用off('markReach')取消订阅事件。
@@ -202,12 +201,13 @@ AudioCapturer提供了用于获取原始音频文件的方法。开发者可以
注册markReach监听后,当采集器采集的帧数到达设定值时,会触发回调并返回设定的值。
```js
- audioCapturer.on('markReach', (reachNumber) => {
- console.info('Mark reach event Received');
- console.info(`The Capturer reached frame: ${reachNumber}`);
- });
-
- audioCapturer.off('markReach'); // 取消markReach事件的订阅,后续将无法监听到“标记到达”事件
+ async markReach(){
+ this.audioCapturer.on('markReach', 10, (reachNumber) => {
+ console.info('Mark reach event Received');
+ console.info(`The Capturer reached frame: ${reachNumber}`);
+ });
+ this.audioCapturer.off('markReach'); // 取消markReach事件的订阅,后续将无法监听到“标记到达”事件
+ }
```
8. (可选)使用on('periodReach')方法订阅采集器区间标记到达事件,使用off('periodReach')取消订阅事件。
@@ -215,40 +215,43 @@ AudioCapturer提供了用于获取原始音频文件的方法。开发者可以
注册periodReach监听后,**每当**采集器采集的帧数到达设定值时,会触发回调并返回设定的值。
```js
- audioCapturer.on('periodReach', (reachNumber) => {
- console.info('Period reach event Received');
- console.info(`In this period, the Capturer reached frame: ${reachNumber}`);
- });
-
- audioCapturer.off('periodReach'); // 取消periodReach事件的订阅,后续将无法监听到“区间标记到达”事件
+ async periodReach(){
+ this.audioCapturer.on('periodReach', 10, (reachNumber) => {
+ console.info('Period reach event Received');
+ console.info(`In this period, the Capturer reached frame: ${reachNumber}`);
+ });
+ this.audioCapturer.off('periodReach'); // 取消periodReach事件的订阅,后续将无法监听到“区间标记到达”事件
+ }
```
9. 如果应用需要在采集器状态更新时进行一些操作,可以订阅该事件,当采集器状态更新时,会受到一个包含有事件类型的回调。
```js
- audioCapturer.on('stateChange', (state) => {
- console.info(`AudioCapturerLog: Changed State to : ${state}`)
- switch (state) {
- case audio.AudioState.STATE_PREPARED:
- console.info('--------CHANGE IN AUDIO STATE----------PREPARED--------------');
- console.info('Audio State is : Prepared');
- break;
- case audio.AudioState.STATE_RUNNING:
- console.info('--------CHANGE IN AUDIO STATE----------RUNNING--------------');
- console.info('Audio State is : Running');
- break;
- case audio.AudioState.STATE_STOPPED:
- console.info('--------CHANGE IN AUDIO STATE----------STOPPED--------------');
- console.info('Audio State is : stopped');
- break;
- case audio.AudioState.STATE_RELEASED:
- console.info('--------CHANGE IN AUDIO STATE----------RELEASED--------------');
- console.info('Audio State is : released');
- break;
- default:
- console.info('--------CHANGE IN AUDIO STATE----------INVALID--------------');
- console.info('Audio State is : invalid');
- break;
- }
- });
+ async stateChange(){
+ this.audioCapturer.on('stateChange', (state) => {
+ console.info(`AudioCapturerLog: Changed State to : ${state}`)
+ switch (state) {
+ case audio.AudioState.STATE_PREPARED:
+ console.info('--------CHANGE IN AUDIO STATE----------PREPARED--------------');
+ console.info('Audio State is : Prepared');
+ break;
+ case audio.AudioState.STATE_RUNNING:
+ console.info('--------CHANGE IN AUDIO STATE----------RUNNING--------------');
+ console.info('Audio State is : Running');
+ break;
+ case audio.AudioState.STATE_STOPPED:
+ console.info('--------CHANGE IN AUDIO STATE----------STOPPED--------------');
+ console.info('Audio State is : stopped');
+ break;
+ case audio.AudioState.STATE_RELEASED:
+ console.info('--------CHANGE IN AUDIO STATE----------RELEASED--------------');
+ console.info('Audio State is : released');
+ break;
+ default:
+ console.info('--------CHANGE IN AUDIO STATE----------INVALID--------------');
+ console.info('Audio State is : invalid');
+ break;
+ }
+ });
+ }
```
\ No newline at end of file
diff --git a/zh-cn/application-dev/media/audio-renderer.md b/zh-cn/application-dev/media/audio-renderer.md
index c99137e34763e598fa687cd7211870d2432a2c98..0f9436fc3b7d9e015d71869dc9739e7f5124e154 100644
--- a/zh-cn/application-dev/media/audio-renderer.md
+++ b/zh-cn/application-dev/media/audio-renderer.md
@@ -28,47 +28,59 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
详细API含义可参考:[音频管理API文档AudioRenderer](../reference/apis/js-apis-audio.md#audiorenderer8)
-1. 使用createAudioRenderer()创建一个AudioRenderer实例。
+1. 使用createAudioRenderer()创建一个全局的AudioRenderer实例,以便后续步骤使用。
在audioRendererOptions中设置相关参数。该实例可用于音频渲染、控制和获取渲染状态,以及注册通知回调。
```js
- import audio from '@ohos.multimedia.audio';
-
- let audioStreamInfo = {
- samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
- channels: audio.AudioChannel.CHANNEL_1,
- sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
- encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
- }
- let audioRendererInfo = {
- content: audio.ContentType.CONTENT_TYPE_SPEECH,
- usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION,
- rendererFlags: 0 // 0是音频渲染器的扩展标志位,默认为0
- }
- let audioRendererOptions = {
- streamInfo: audioStreamInfo,
- rendererInfo: audioRendererInfo
- }
-
- let audioRenderer = await audio.createAudioRenderer(audioRendererOptions);
- console.log("Create audio renderer success.");
+ import audio from '@ohos.multimedia.audio';
+ import fs from '@ohos.file.fs';
+
+ //音频渲染相关接口自测试
+ @Entry
+ @Component
+ struct AudioRenderer1129 {
+ private audioRenderer: audio.AudioRenderer;
+ private bufferSize;//便于步骤3 write函数调用使用
+ private audioRenderer1: audio.AudioRenderer; //便于步骤14 完整示例调用使用
+ private audioRenderer2: audio.AudioRenderer; //便于步骤14 完整示例调用使用
+
+ async initAudioRender(){
+ let audioStreamInfo = {
+ samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
+ channels: audio.AudioChannel.CHANNEL_1,
+ sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
+ encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
+ }
+ let audioRendererInfo = {
+ content: audio.ContentType.CONTENT_TYPE_SPEECH,
+ usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION,
+ rendererFlags: 0 // 0是音频渲染器的扩展标志位,默认为0
+ }
+ let audioRendererOptions = {
+ streamInfo: audioStreamInfo,
+ rendererInfo: audioRendererInfo
+ }
+ this.audioRenderer = await audio.createAudioRenderer(audioRendererOptions);
+ console.log("Create audio renderer success.");
+ }
+ }
```
2. 调用start()方法来启动/恢复播放任务。
```js
- async function startRenderer() {
- let state = audioRenderer.state;
+ async startRenderer() {
+ let state = this.audioRenderer.state;
// Renderer start时的状态应该是STATE_PREPARED、STATE_PAUSED和STATE_STOPPED之一.
if (state != audio.AudioState.STATE_PREPARED && state != audio.AudioState.STATE_PAUSED &&
- state != audio.AudioState.STATE_STOPPED) {
+ state != audio.AudioState.STATE_STOPPED) {
console.info('Renderer is not in a correct state to start');
return;
}
-
- await audioRenderer.start();
-
- state = audioRenderer.state;
+
+ await this.audioRenderer.start();
+
+ state = this.audioRenderer.state;
if (state == audio.AudioState.STATE_RUNNING) {
console.info('Renderer started');
} else {
@@ -81,111 +93,97 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
3. 调用write()方法向缓冲区写入数据。
- 将需要播放的音频数据读入缓冲区,重复调用write()方法写入。
+ 将需要播放的音频数据读入缓冲区,重复调用write()方法写入。请注意引入“import fs from '@ohos.file.fs';”,具体请参考步骤1。
```js
- import fs from '@ohos.file.fs';
- import audio from '@ohos.multimedia.audio';
-
- async function writeBuffer(buf) {
- // 写入数据时,渲染器的状态必须为STATE_RUNNING
- if (audioRenderer.state != audio.AudioState.STATE_RUNNING) {
- console.error('Renderer is not running, do not write');
- return;
- }
- let writtenbytes = await audioRenderer.write(buf);
- console.info(`Actual written bytes: ${writtenbytes} `);
- if (writtenbytes < 0) {
- console.error('Write buffer failed. check the state of renderer');
- }
- }
-
- // 此处是渲染器的合理的最小缓冲区大小(也可以选择其它大小的缓冲区)
- const bufferSize = await audioRenderer.getBufferSize();
- let dir = globalThis.fileDir; //不可直接访问,没权限,切记!!!一定要使用沙箱路径
- const filePath = dir + '/file_example_WAV_2MG.wav'; // 需要渲染的音乐文件 实际路径为:/data/storage/el2/base/haps/entry/files/file_example_WAV_2MG.wav
- console.info(`file filePath: ${ filePath}`);
-
- let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
- let stat = await fs.stat(filePath); //音乐文件信息
- let buf = new ArrayBuffer(bufferSize);
- let len = stat.size % this.bufferSize == 0 ? Math.floor(stat.size / this.bufferSize) : Math.floor(stat.size / this.bufferSize + 1);
- for (let i = 0;i < len; i++) {
- let options = {
- offset: i * this.bufferSize,
- length: this.bufferSize
- }
- let readsize = await fs.read(file.fd, buf, options)
- let writeSize = await new Promise((resolve,reject)=>{
- this.audioRenderer.write(buf,(err,writeSize)=>{
- if(err){
- reject(err)
- }else{
- resolve(writeSize)
- }
+ async writeData(){
+ // 此处是渲染器的合理的最小缓冲区大小(也可以选择其它大小的缓冲区)
+ this.bufferSize = await this.audioRenderer.getBufferSize();
+ let dir = globalThis.fileDir; //不可直接访问,没权限,切记!!!一定要使用沙箱路径
+ const filePath = dir + '/file_example_WAV_2MG.wav'; // 需要渲染的音乐文件 实际路径为:/data/storage/el2/base/haps/entry/files/file_example_WAV_2MG.wav
+ console.info(`file filePath: ${ filePath}`);
+
+ let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
+ let stat = await fs.stat(filePath); //音乐文件信息
+ let buf = new ArrayBuffer(this.bufferSize);
+ let len = stat.size % this.bufferSize == 0 ? Math.floor(stat.size / this.bufferSize) : Math.floor(stat.size / this.bufferSize + 1);
+ for (let i = 0;i < len; i++) {
+ let options = {
+ offset: i * this.bufferSize,
+ length: this.bufferSize
+ }
+ let readsize = await fs.read(file.fd, buf, options)
+ let writeSize = await new Promise((resolve,reject)=>{
+ this.audioRenderer.write(buf,(err,writeSize)=>{
+ if(err){
+ reject(err)
+ }else{
+ resolve(writeSize)
+ }
+ })
})
- })
+ }
+
+ fs.close(file)
+ await this.audioRenderer.stop(); //停止渲染
+ await this.audioRenderer.release(); //释放资源
}
-
- fs.close(file)
- await audioRenderer.stop(); //停止渲染
- await audioRenderer.release(); //释放资源
```
4. (可选)调用pause()方法或stop()方法暂停/停止渲染音频数据。
```js
- async function pauseRenderer() {
- let state = audioRenderer.state;
- // 只有渲染器状态为STATE_RUNNING的时候才能暂停
- if (state != audio.AudioState.STATE_RUNNING) {
- console.info('Renderer is not running');
- return;
- }
-
- await audioRenderer.pause();
-
- state = audioRenderer.state;
- if (state == audio.AudioState.STATE_PAUSED) {
- console.info('Renderer paused');
- } else {
- console.error('Renderer pause failed');
- }
- }
-
- async function stopRenderer() {
- let state = audioRenderer.state;
- // 只有渲染器状态为STATE_RUNNING或STATE_PAUSED的时候才可以停止
- if (state != audio.AudioState.STATE_RUNNING && state != audio.AudioState.STATE_PAUSED) {
- console.info('Renderer is not running or paused');
- return;
- }
-
- await audioRenderer.stop();
-
- state = audioRenderer.state;
- if (state == audio.AudioState.STATE_STOPPED) {
- console.info('Renderer stopped');
- } else {
- console.error('Renderer stop failed');
- }
- }
+ async pauseRenderer() {
+ let state = this.audioRenderer.state;
+ // 只有渲染器状态为STATE_RUNNING的时候才能暂停
+ if (state != audio.AudioState.STATE_RUNNING) {
+ console.info('Renderer is not running');
+ return;
+ }
+
+ await this.audioRenderer.pause();
+
+ state = this.audioRenderer.state;
+ if (state == audio.AudioState.STATE_PAUSED) {
+ console.info('Renderer paused');
+ } else {
+ console.error('Renderer pause failed');
+ }
+ }
+
+ async stopRenderer() {
+ let state = this.audioRenderer.state;
+ // 只有渲染器状态为STATE_RUNNING或STATE_PAUSED的时候才可以停止
+ if (state != audio.AudioState.STATE_RUNNING && state != audio.AudioState.STATE_PAUSED) {
+ console.info('Renderer is not running or paused');
+ return;
+ }
+
+ await this.audioRenderer.stop();
+
+ state = this.audioRenderer.state;
+ if (state == audio.AudioState.STATE_STOPPED) {
+ console.info('Renderer stopped');
+ } else {
+ console.error('Renderer stop failed');
+ }
+ }
```
5. (可选)调用drain()方法清空缓冲区。
```js
- async function drainRenderer() {
- let state = audioRenderer.state;
- // 只有渲染器状态为STATE_RUNNING的时候才能使用drain()
- if (state != audio.AudioState.STATE_RUNNING) {
- console.info('Renderer is not running');
- return;
- }
-
- await audioRenderer.drain();
- state = audioRenderer.state;
+ async drainRenderer() {
+ let state = this.audioRenderer.state;
+ // 只有渲染器状态为STATE_RUNNING的时候才能使用drain()
+ if (state != audio.AudioState.STATE_RUNNING) {
+ console.info('Renderer is not running');
+ return;
}
+
+ await this.audioRenderer.drain();
+ state = this.audioRenderer.state;
+ }
```
6. 任务完成,调用release()方法释放相关资源。
@@ -193,22 +191,22 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
AudioRenderer会使用大量的系统资源,所以请确保完成相关任务后,进行资源释放。
```js
- async function releaseRenderer() {
- let state = audioRenderer.state;
- // 渲染器状态不是STATE_RELEASED或STATE_NEW状态,才能release
- if (state == audio.AudioState.STATE_RELEASED || state == audio.AudioState.STATE_NEW) {
- console.info('Renderer already released');
- return;
- }
- await audioRenderer.release();
+ async releaseRenderer() {
+ let state = this.audioRenderer.state;
+ // 渲染器状态不是STATE_RELEASED或STATE_NEW状态,才能release
+ if (state == audio.AudioState.STATE_RELEASED || state == audio.AudioState.STATE_NEW) {
+ console.info('Renderer already released');
+ return;
+ }
+ await this.audioRenderer.release();
- state = audioRenderer.state;
- if (state == audio.AudioState.STATE_RELEASED) {
- console.info('Renderer released');
- } else {
- console.info('Renderer release failed');
- }
+ state = this.audioRenderer.state;
+ if (state == audio.AudioState.STATE_RELEASED) {
+ console.info('Renderer released');
+ } else {
+ console.info('Renderer release failed');
}
+ }
```
7. (可选)获取渲染器相关信息
@@ -216,26 +214,22 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
通过以下代码,可以获取渲染器的相关信息。
```js
- // 获取当前渲染器状态
- let state = audioRenderer.state;
-
- // 获取渲染器信息
- let audioRendererInfo : audio.AudioRendererInfo = await audioRenderer.getRendererInfo();
-
- // 获取音频流信息
- let audioStreamInfo : audio.AudioStreamInfo = await audioRenderer.getStreamInfo();
-
- // 获取音频流ID
- let audioStreamId : number = await audioRenderer.getAudioStreamId();
-
- // 获取纳秒形式的Unix时间戳
- let audioTime : number = await audioRenderer.getAudioTime();
-
- // 获取合理的最小缓冲区大小
- let bufferSize : number = await audioRenderer.getBufferSize();
-
- // 获取渲染速率
- let renderRate : audio.AudioRendererRate = await audioRenderer.getRenderRate();
+ async getRenderInfo(){
+ // 获取当前渲染器状态
+ let state = this.audioRenderer.state;
+ // 获取渲染器信息
+ let audioRendererInfo : audio.AudioRendererInfo = await this.audioRenderer.getRendererInfo();
+ // 获取音频流信息
+ let audioStreamInfo : audio.AudioStreamInfo = await this.audioRenderer.getStreamInfo();
+ // 获取音频流ID
+ let audioStreamId : number = await this.audioRenderer.getAudioStreamId();
+ // 获取纳秒形式的Unix时间戳
+ let audioTime : number = await this.audioRenderer.getAudioTime();
+ // 获取合理的最小缓冲区大小
+ let bufferSize : number = await this.audioRenderer.getBufferSize();
+ // 获取渲染速率
+ let renderRate : audio.AudioRendererRate = await this.audioRenderer.getRenderRate();
+ }
```
8. (可选)设置渲染器相关信息
@@ -243,17 +237,17 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
通过以下代码,可以设置渲染器的相关信息。
```js
- // 设置渲染速率为正常速度
- let renderRate : audio.AudioRendererRate = audio.AudioRendererRate.RENDER_RATE_NORMAL;
- await audioRenderer.setRenderRate(renderRate);
-
- // 设置渲染器音频中断模式为SHARE_MODE
- let interruptMode : audio.InterruptMode = audio.InterruptMode.SHARE_MODE;
- await audioRenderer.setInterruptMode(interruptMode);
-
- // 设置一个流的音量为0.5
- let volume : number = 0.5;
- await audioRenderer.setVolume(volume);
+ async setAudioRenderInfo(){
+ // 设置渲染速率为正常速度
+ let renderRate : audio.AudioRendererRate = audio.AudioRendererRate.RENDER_RATE_NORMAL;
+ await this.audioRenderer.setRenderRate(renderRate);
+ // 设置渲染器音频中断模式为SHARE_MODE
+ let interruptMode : audio.InterruptMode = audio.InterruptMode.SHARE_MODE;
+ await this.audioRenderer.setInterruptMode(interruptMode);
+ // 设置一个流的音量为0.5
+ let volume : number = 0.5;
+ await this.audioRenderer.setVolume(volume);
+ }
```
9. (可选)使用on('audioInterrupt')方法订阅渲染器音频中断事件,使用off('audioInterrupt')取消订阅事件。
@@ -267,45 +261,45 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
需要说明的是,本模块的订阅音频中断事件与[AudioManager](../reference/apis/js-apis-audio.md#audiomanager)模块中的on('interrupt')稍有不同。自api9以来,on('interrupt')和off('interrupt')均被废弃。在AudioRenderer模块,当开发者需要监听焦点变化事件时,只需要调用on('audioInterrupt')函数,当应用内部的AudioRenderer对象在start\stop\pause等动作发生时,会主动请求焦点,从而发生焦点转移,相关的AudioRenderer对象即可获取到对应的回调信息。但对除AudioRenderer的其他对象,例如FM、语音唤醒等,应用不会创建对象,此时可调用AudioManager中的on('interrupt')获取焦点变化通知。
```js
- audioRenderer.on('audioInterrupt', (interruptEvent) => {
- console.info('InterruptEvent Received');
- console.info(`InterruptType: ${interruptEvent.eventType}`);
- console.info(`InterruptForceType: ${interruptEvent.forceType}`);
- console.info(`AInterruptHint: ${interruptEvent.hintType}`);
-
- if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) {
- switch (interruptEvent.hintType) {
+ async subscribeAudioRender(){
+ this.audioRenderer.on('audioInterrupt', (interruptEvent) => {
+ console.info('InterruptEvent Received');
+ console.info(`InterruptType: ${interruptEvent.eventType}`);
+ console.info(`InterruptForceType: ${interruptEvent.forceType}`);
+ console.info(`AInterruptHint: ${interruptEvent.hintType}`);
+
+ if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) {
+ switch (interruptEvent.hintType) {
// 音频框架发起的强制暂停操作,为防止数据丢失,此时应该停止数据的写操作
- case audio.InterruptHint.INTERRUPT_HINT_PAUSE:
- isPlay = false;
- break;
+ case audio.InterruptHint.INTERRUPT_HINT_PAUSE:
+ console.info('isPlay is false');
+ break;
// 音频框架发起的强制停止操作,为防止数据丢失,此时应该停止数据的写操作
- case audio.InterruptHint.INTERRUPT_HINT_STOP:
- isPlay = false;
- break;
+ case audio.InterruptHint.INTERRUPT_HINT_STOP:
+ console.info('isPlay is false');
+ break;
// 音频框架发起的强制降低音量操作
- case audio.InterruptHint.INTERRUPT_HINT_DUCK:
- break;
+ case audio.InterruptHint.INTERRUPT_HINT_DUCK:
+ break;
// 音频框架发起的恢复音量操作
- case audio.InterruptHint.INTERRUPT_HINT_UNDUCK:
- break;
- }
- } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) {
- switch (interruptEvent.hintType) {
+ case audio.InterruptHint.INTERRUPT_HINT_UNDUCK:
+ break;
+ }
+ } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) {
+ switch (interruptEvent.hintType) {
// 提醒App开始渲染
- case audio.InterruptHint.INTERRUPT_HINT_RESUME:
- startRenderer();
- break;
+ case audio.InterruptHint.INTERRUPT_HINT_RESUME:
+ this.startRenderer();
+ break;
// 提醒App音频流被中断,由App自主决定是否继续(此处选择暂停)
- case audio.InterruptHint.INTERRUPT_HINT_PAUSE:
- isPlay = false;
- pauseRenderer();
- break;
+ case audio.InterruptHint.INTERRUPT_HINT_PAUSE:
+ console.info('isPlay is false');
+ this.pauseRenderer();
+ break;
+ }
}
- }
- });
-
- audioRenderer.off('audioInterrupt'); // 取消音频中断事件的订阅,后续将无法监听到音频中断事件
+ });
+ }
```
10. (可选)使用on('markReach')方法订阅渲染器标记到达事件,使用off('markReach')取消订阅事件。
@@ -313,12 +307,14 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
注册markReach监听后,当渲染器渲染的帧数到达设定值时,会触发回调并返回设定的值。
```js
- audioRenderer.on('markReach', (reachNumber) => {
- console.info('Mark reach event Received');
- console.info(`The renderer reached frame: ${reachNumber}`);
- });
-
- audioRenderer.off('markReach'); // 取消markReach事件的订阅,后续将无法监听到“标记到达”事件
+ async markReach(){
+ this.audioRenderer.on('markReach', 50, (position) => {
+ if (position == 50) {
+ console.info('ON Triggered successfully');
+ }
+ });
+ this.audioRenderer.off('markReach'); // 取消markReach事件的订阅,后续将无法监听到“标记到达”事件
+ }
```
11. (可选)使用on('periodReach')方法订阅渲染器区间标记到达事件,使用off('periodReach')取消订阅事件。
@@ -326,12 +322,13 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
注册periodReach监听后,**每当**渲染器渲染的帧数到达设定值时,会触发回调并返回设定的值。
```js
- audioRenderer.on('periodReach', (reachNumber) => {
- console.info('Period reach event Received');
- console.info(`In this period, the renderer reached frame: ${reachNumber} `);
- });
-
- audioRenderer.off('periodReach'); // 取消periodReach事件的订阅,后续将无法监听到“区间标记到达”事件
+ async periodReach(){
+ this.audioRenderer.on('periodReach',10, (reachNumber) => {
+ console.info(`In this period, the renderer reached frame: ${reachNumber} `);
+ });
+
+ this.audioRenderer.off('periodReach'); // 取消periodReach事件的订阅,后续将无法监听到“区间标记到达”事件
+ }
```
12. (可选)使用on('stateChange')方法订阅渲染器音频状态变化事件。
@@ -339,10 +336,12 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
注册stateChange监听后,当渲染器的状态发生改变时,会触发回调并返回当前渲染器的状态。
```js
- audioRenderer.on('stateChange', (audioState) => {
- console.info('State change event Received');
- console.info(`Current renderer state is: ${audioState}`);
- });
+ async stateChange(){
+ this.audioRenderer.on('stateChange', (audioState) => {
+ console.info('State change event Received');
+ console.info(`Current renderer state is: ${audioState}`);
+ });
+ }
```
13. (可选)对on()方法的异常处理。
@@ -350,21 +349,24 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
在使用on()方法时,如果传入的字符串错误或传入的参数类型错误,程序会抛出异常,需要用try catch来捕获。
```js
- try {
- audioRenderer.on('invalidInput', () => { // 字符串不匹配
- })
- } catch (err) {
- console.info(`Call on function error, ${err}`); // 程序抛出401异常
- }
- try {
- audioRenderer.on(1, () => { // 入参类型错误
- })
- } catch (err) {
- console.info(`Call on function error, ${err}`); // 程序抛出6800101异常
+ async errorCall(){
+ try {
+ this.audioRenderer.on('invalidInput', () => { // 字符串不匹配
+ })
+ } catch (err) {
+ console.info(`Call on function error, ${err}`); // 程序抛出401异常
+ }
+ try {
+ this.audioRenderer.on(1, () => { // 入参类型错误
+ })
+ } catch (err) {
+ console.info(`Call on function error, ${err}`); // 程序抛出6800101异常
+ }
}
```
14. (可选)on('audioInterrupt')方法完整示例。
+ 请注意:在调用前声明audioRenderer1与audioRenderer2对象,具体请参考步骤1。
同一个应用中的AudioRender1和AudioRender2在创建时均设置了焦点模式为独立,并且调用on('audioInterrupt')监听焦点变化。刚开始AudioRender1拥有焦点,当AudioRender2获取到焦点时,audioRenderer1将收到焦点转移的通知,打印相关日志。如果AudioRender1和AudioRender2不将焦点模式设置为独立,则监听处理中的日志在应用运行过程中永远不会被打印。
```js
async runningAudioRender1(){
@@ -383,31 +385,31 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
streamInfo: audioStreamInfo,
rendererInfo: audioRendererInfo
}
-
+
//1.1 创建对象
- audioRenderer1 = await audio.createAudioRenderer(audioRendererOptions);
+ this.audioRenderer1 = await audio.createAudioRenderer(audioRendererOptions);
console.info("Create audio renderer 1 success.");
-
+
//1.2 设置焦点模式为独立模式 :1
- audioRenderer1.setInterruptMode(1).then( data => {
+ this.audioRenderer1.setInterruptMode(1).then( data => {
console.info('audioRenderer1 setInterruptMode Success!');
}).catch((err) => {
console.error(`audioRenderer1 setInterruptMode Fail: ${err}`);
});
-
+
//1.3 设置监听
- audioRenderer1.on('audioInterrupt', async(interruptEvent) => {
+ this.audioRenderer1.on('audioInterrupt', async(interruptEvent) => {
console.info(`audioRenderer1 on audioInterrupt : ${JSON.stringify(interruptEvent)}`)
});
-
+
//1.4 启动渲染
- await audioRenderer1.start();
+ await this.audioRenderer1.start();
console.info('startAudioRender1 success');
-
+
//1.5 获取缓存区大小,此处是渲染器的合理的最小缓冲区大小(也可以选择其它大小的缓冲区)
- const bufferSize = await audioRenderer1.getBufferSize();
+ const bufferSize = await this.audioRenderer1.getBufferSize();
console.info(`audio bufferSize: ${bufferSize}`);
-
+
//1.6 获取原始音频数据文件
let dir = globalThis.fileDir; //不可直接访问,没权限,切记!!!一定要使用沙箱路径
const path1 = dir + '/music001_48000_32_1.wav'; // 需要渲染的音乐文件 实际路径为:/data/storage/el2/base/haps/entry/files/music001_48000_32_1.wav
@@ -416,14 +418,14 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
let stat = await fs.stat(path1); //音乐文件信息
let buf = new ArrayBuffer(bufferSize);
let len = stat.size % this.bufferSize == 0 ? Math.floor(stat.size / this.bufferSize) : Math.floor(stat.size / this.bufferSize + 1);
-
+
//1.7 通过audioRender对缓存区的原始音频数据进行渲染
for (let i = 0;i < len; i++) {
let options = {
offset: i * this.bufferSize,
length: this.bufferSize
}
- let readsize = await fs.read(file.fd, buf, options)
+ let readsize = await fs.read(file1.fd, buf, options)
let writeSize = await new Promise((resolve,reject)=>{
this.audioRenderer1.write(buf,(err,writeSize)=>{
if(err){
@@ -432,13 +434,13 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
resolve(writeSize)
}
})
- })
+ })
}
fs.close(file1)
- await audioRenderer1.stop(); //停止渲染
- await audioRenderer1.release(); //释放资源
+ await this.audioRenderer1.stop(); //停止渲染
+ await this.audioRenderer1.release(); //释放资源
}
-
+
async runningAudioRender2(){
let audioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000,
@@ -455,31 +457,31 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
streamInfo: audioStreamInfo,
rendererInfo: audioRendererInfo
}
-
+
//2.1 创建对象
- audioRenderer2 = await audio.createAudioRenderer(audioRendererOptions);
+ this.audioRenderer2 = await audio.createAudioRenderer(audioRendererOptions);
console.info("Create audio renderer 2 success.");
-
+
//2.2 设置焦点模式为独立模式 :1
- audioRenderer2.setInterruptMode(1).then( data => {
+ this.audioRenderer2.setInterruptMode(1).then( data => {
console.info('audioRenderer2 setInterruptMode Success!');
}).catch((err) => {
console.error(`audioRenderer2 setInterruptMode Fail: ${err}`);
});
-
+
//2.3 设置监听
- audioRenderer2.on('audioInterrupt', async(interruptEvent) => {
+ this.audioRenderer2.on('audioInterrupt', async(interruptEvent) => {
console.info(`audioRenderer2 on audioInterrupt : ${JSON.stringify(interruptEvent)}`)
});
-
+
//2.4 启动渲染
- await audioRenderer2.start();
+ await this.audioRenderer2.start();
console.info('startAudioRender2 success');
-
+
//2.5 获取缓存区大小
- const bufferSize = await audioRenderer2.getBufferSize();
+ const bufferSize = await this.audioRenderer2.getBufferSize();
console.info(`audio bufferSize: ${bufferSize}`);
-
+
//2.6 获取原始音频数据文件
let dir = globalThis.fileDir; //不可直接访问,没权限,切记!!!一定要使用沙箱路径
const path2 = dir + '/music002_48000_32_1.wav'; // 需要渲染的音乐文件 实际路径为:/data/storage/el2/base/haps/entry/files/music002_48000_32_1.wav
@@ -488,14 +490,14 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
let stat = await fs.stat(path2); //音乐文件信息
let buf = new ArrayBuffer(bufferSize);
let len = stat.size % this.bufferSize == 0 ? Math.floor(stat.size / this.bufferSize) : Math.floor(stat.size / this.bufferSize + 1);
-
+
//2.7 通过audioRender对缓存区的原始音频数据进行渲染
for (let i = 0;i < len; i++) {
let options = {
offset: i * this.bufferSize,
length: this.bufferSize
}
- let readsize = await fs.read(file.fd, buf, options)
+ let readsize = await fs.read(file2.fd, buf, options)
let writeSize = await new Promise((resolve,reject)=>{
this.audioRenderer2.write(buf,(err,writeSize)=>{
if(err){
@@ -504,28 +506,17 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可
resolve(writeSize)
}
})
- })
+ })
}
fs.close(file2)
- await audioRenderer2.stop(); //停止渲染
- await audioRenderer2.release(); //释放资源
+ await this.audioRenderer2.stop(); //停止渲染
+ await this.audioRenderer2.release(); //释放资源
}
-
- async writeBuffer(buf, audioRender) {
- let writtenbytes;
- await audioRender.write(buf).then((value) => {
- writtenbytes = value;
- console.info(`Actual written bytes: ${writtenbytes} `);
- });
- if (typeof(writtenbytes) != 'number' || writtenbytes < 0) {
- console.error('get Write buffer failed. check the state of renderer');
- }
- }
-
+
//综合调用入口
async test(){
- await runningAudioRender1();
- await runningAudioRender2();
+ await this.runningAudioRender1();
+ await this.runningAudioRender2();
}
-
+
```
\ No newline at end of file
diff --git a/zh-cn/application-dev/quick-start/Readme-CN.md b/zh-cn/application-dev/quick-start/Readme-CN.md
index 82996bf0813c9e9d640bec4dd9fa5fbb2fe81510..34d3bb66aa5367e975ea54ff28d803b54953f79e 100755
--- a/zh-cn/application-dev/quick-start/Readme-CN.md
+++ b/zh-cn/application-dev/quick-start/Readme-CN.md
@@ -11,7 +11,6 @@
- 应用程序包结构
- [Stage模型应用程序包结构](application-package-structure-stage.md)
- [FA模型应用程序包结构](application-package-structure-fa.md)
- - [HAR包结构](har-structure.md)
- 应用程序包多HAP机制
- [多HAP机制设计目标](multi-hap-objective.md)
- [多HAP构建视图](multi-hap-build-view.md)
@@ -20,6 +19,12 @@
- [多HAP运行机制及数据通信方式](multi-hap-principles.md)
- [应用程序包安装和卸载流程](application-package-install-uninstall.md)
- [应用程序包更新流程](application-package-update.md)
+ - 共享包
+ - [共享包概述](shared-guide.md)
+ - [HAR](har-package.md)
+ - HSP
+ - [应用内HSP开发指导](in-app-hsp.md)
+ - [应用间HSP开发指导(仅对系统应用开放)](cross-app-hsp.md)
- 应用程序包快速修复
- [快速修复概述](quickfix-principles.md)
- [快速修复调试指导](quickfix-debug.md)
diff --git a/zh-cn/application-dev/quick-start/application-package-structure-stage.md b/zh-cn/application-dev/quick-start/application-package-structure-stage.md
index b484f0ab579c178fd2e1dd0a62452ee54c0e2157..41c5bc2431533a746a6367d2a90fa64809036ded 100644
--- a/zh-cn/application-dev/quick-start/application-package-structure-stage.md
+++ b/zh-cn/application-dev/quick-start/application-package-structure-stage.md
@@ -4,7 +4,7 @@
基于[Stage模型](application-configuration-file-overview-stage.md)开发的应用,经编译打包后,其应用程序包结构如下图**应用程序包结构(Stage模型)**所示。开发者需要熟悉应用程序包结构相关的基本概念。
-- 在开发态,一个应用包含一个或者多个Module,可以在[DevEco Studio](https://developer.harmonyos.com/cn/develop/deveco-studio/)工程中[创建一个或者多个Module](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/ohos-adding-deleting-module-0000001218760594-V3)。Module是OpenHarmony应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。Module分为“Ability”和“Library”两种类型,“Ability”类型的Module对应于编译后的HAP(Harmony Ability Package);“Library”类型的Module对应于[HAR](har-structure.md)(Harmony Ability Resources)包,即编译后的.tgz文件。
+- 在开发态,一个应用包含一个或者多个Module,可以在[DevEco Studio](https://developer.harmonyos.com/cn/develop/deveco-studio/)工程中[创建一个或者多个Module](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/ohos-adding-deleting-module-0000001218760594-V3)。Module是OpenHarmony应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。Module分为“Ability”和“Library”两种类型,“Ability”类型的Module对应于编译后的HAP(Harmony Ability Package);“Library”类型的Module对应于[HAR](har-package.md)(Harmony Archive),或者[HSP](shared-guide.md)(Harmony Shared Package)。
一个Module可以包含一个或多个[UIAbility](../application-models/uiability-overview.md)组件,如**Module与UIAbility组件关系示意图**所示。
**图1** Module与UIAbility组件关系示意图
diff --git a/zh-cn/application-dev/quick-start/cross-app-hsp.md b/zh-cn/application-dev/quick-start/cross-app-hsp.md
index 8b9d5f8832629a6d19659f027b9476ad45397cdd..91a8972480dc84591d93ed4284243b342eaf7aa5 100644
--- a/zh-cn/application-dev/quick-start/cross-app-hsp.md
+++ b/zh-cn/application-dev/quick-start/cross-app-hsp.md
@@ -1,17 +1,23 @@
# 应用间HSP开发指导
应用间`HSP`用于不同应用间的代码、资源共享。
-应用间`HSP`的宿主应用是一种特殊状态的应用,只能由一个[HSP](hsp-guide.md)包组成,不会独立运行在设备上,而是被普通应用模块的依赖项引用。当普通应用运行时,通过动态调用的方式使用应用间`HSP`提供的能力,从而实现应用自身所需要的功能。
+应用间`HSP`的宿主应用是一种特殊状态的应用,只能由一个`HSP`组成,不会独立运行在设备上,而是被普通应用模块的依赖项引用。当普通应用运行时,通过动态调用的方式使用应用间`HSP`提供的能力,从而实现应用自身所需要的功能。
+
+## 注意事项
+1. 应用间`HSP`的代码会运行再开发者应用的进程中,调用相关代码时,需要做好异常捕获与容错处理,防止由于应用间`HSP`功能异常导致的稳定性问题。
+2. 一个应用可以同时依赖多个应用间`HSP`。
+3. 应用间`HSP`会影响开发者应用自身的启动时间,依赖过多的应用间`HSP`可能会导致启动时延发生明显的劣化,建议将依赖的数目控制在16个以内。
+4. 当前三方开发者开发者只能使用系统提供的应用间`HSP`,不支持开发并发布自己的应用间`HSP`。
## 应用间HSP的使用
应用间HSP会分为两部分对外发布:
-一部分为[HAR包](har-package.md),这部分`HAR`包中不会包含具体的功能实现代码,而仅仅包含导出的对象与方法,所以体积很小。应用开发者将`HAR`包集成到自身的工程中,然后就可以通过调用`HAR`包中提供的对象与方法完成自身的应用功能。
+一部分为[HAR](har-package.md),这部分`HAR`中不会包含具体的功能实现代码,而仅仅包含导出的对象与方法,所以体积很小。应用开发者将`HAR`集成到自身的工程中,然后就可以通过调用`HAR`中提供的对象与方法完成自身的应用功能。
-另外一部分为[HSP](hsp-guide.md),这部分为应用间`HSP`的具体实现,里面包含js/ts代码、C++库、资源和配置文件。这部分会上架到应用市场或者集成到系统版本中。
+另外一部分为HSP,这部分为应用间`HSP`的具体实现,里面包含js/ts代码、C++库、资源和配置文件。这部分会上架到应用市场或者集成到系统版本中。
-### 集成应用间HSP的HAR包
-`HAR`包中的`index.d.ets`文件是应用间`HSP`导出的声明文件的入口,所有需要导出的接口,统一在`index.d.ets`文件中定义。`index.d.ets`文件路径如下:
+### 集成应用间HSP的HAR
+`HAR`中的`index.d.ets`文件是应用间`HSP`导出的声明文件的入口,所有需要导出的接口,统一在`index.d.ets`文件中定义。`index.d.ets`文件路径如下:
```
src
├── main
@@ -110,8 +116,8 @@ extern "C" __attribute__((constructor)) void RegisterLibaModule(void) {
napi_module_register(&demoModule);
}
```
-### 使用HAR包导出的能力
-引用`HAR`包前,需要先配置对`HAR`的依赖,配置方式可参考[文档](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-development-npm-package-0000001222578434#section89674298391)。`HAR`包配置成功后,在配置模块的`module.json`中会生成相关依赖项信息,如下所示:
+### 使用HAR导出的能力
+引用`HAR`前,需要先配置对`HAR`的依赖,配置方式可参考[文档](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-development-npm-package-0000001222578434#section89674298391)。`HAR`配置成功后,在配置模块的`module.json`中会生成相关依赖项信息,如下所示:
```json
"dependencies": [
{
@@ -122,8 +128,8 @@ extern "C" __attribute__((constructor)) void RegisterLibaModule(void) {
]
```
其中`bundleName`为应用间`HSP`的`bundle`名称,`moduleName`为应用间`HSP`的模块名称,`versionCode`为应用间`HSP`的版本号。
-#### **使用HAR包中的ArkUI组件**
-`HAR`共享包的依赖配置成功后,可以引用`HAR`共享包的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过`import`引入`HAR`共享包导出的ArkUI组件,示例如下所示:
+#### **使用HAR中的ArkUI组件**
+`HAR`的依赖配置成功后,可以引用`HAR`的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过`import`引入`HAR`导出的ArkUI组件,示例如下所示:
``` ts
import { UIComponent } from 'liba'
@@ -133,7 +139,7 @@ struct Index {
@State message: string = 'Hello World'
build() {
Row() {
- // 引用HAR共享包的ArkUI组件
+ // 引用HAR的ArkUI组件
UIComponent()
Column() {
Text(this.message)
@@ -147,8 +153,8 @@ struct Index {
}
```
-#### **使用HAR包中的ts方法**
-通过`import`引用`HAR`共享包导出的ts类和方法,示例如下所示:
+#### **使用HAR中的ts方法**
+通过`import`引用`HAR`导出的ts类和方法,示例如下所示:
``` ts
import { foo1 } from 'liba'
import { foo2 } from 'liba'
@@ -160,7 +166,7 @@ struct Index {
Column() {
Button('Button')
.onClick(()=>{
- // 引用HAR共享包的ts方法
+ // 引用HAR的ts方法
foo1();
foo2();
})
@@ -171,8 +177,8 @@ struct Index {
}
}
```
-#### **使用HAR包中的native方法**
-通过`import`引用`HAR`共享包导出的native方法,示例如下所示:
+#### **使用HAR中的native方法**
+通过`import`引用`HAR`导出的native方法,示例如下所示:
``` ts
import { nativeHello } from 'liba'
@@ -183,7 +189,7 @@ struct Index {
Column() {
Button('Button')
.onClick(()=>{
- // 引用HAR共享包的native方法
+ // 引用HAR的native方法
nativeHello();
})
}
@@ -196,26 +202,20 @@ struct Index {
## 应用间HSP的分发方式
应用间`HSP`由于并未直接完整的集成到开发者应用中去,所以需要提前预置在系统版本中或者随开发者应用同步安装到设备上,主要有以下两种形式:
-1. 随系统发布,部分常用应用间`HSP`会预置在系统版本中
+1. 随系统发布,部分常用应用间`HSP`会预置在系统版本中。
2. 随应用发布,即用户在应用市场下载应用时,如果应用依赖了一个或者多个应用间`HSP`,同时设备上没有安装这个其依赖的应用间`HSP`时,应用市场会为用户同时下载普通应用以及其依赖的应用间`HSP`。从而保证普通应用能够正常使用共享库的功能。
### 应用间HSP的调试方式
开发者本地调试应用间`HSP`相关的功能时,可能并不具备上述分发的条件,此时可以通过`bm`相关指令本地完成应用间`HSP`的分发,主要步骤如下:
-1. 获取到应用间`HSP`的安装包
-2. 通过`bm`指令先安装应用间`HSP`的安装包
+1. 获取到应用间`HSP`的安装包。
+2. 通过`bm`指令先安装应用间`HSP`的安装包。
```
bm install -s sharebundle.hsp
```
-3. 通过`bm`指令后安装开发者自身的应用`hap`
+3. 通过`bm`指令后安装开发者自身的应用`hap`。
```
bm install -p feature.hap
```
-4. 启动开发者自身的应用,调试相关功能
+4. 启动开发者自身的应用,调试相关功能。
-**注意**:步骤2和步骤3不可以颠倒,否则会由于缺少必要的应用间`HSP`导致开发者的应用安装失败。更多`bm`相关指令可以参考[文档](https://gitee.com/openharmony/bundlemanager_bundle_framework#bm%E5%B7%A5%E5%85%B7%E5%91%BD%E4%BB%A4)。
-
-## 注意事项
-1. 应用间`HSP`的代码会运行再开发者应用的进程中,调用相关代码时,需要做好异常捕获与容错处理,防止由于应用间`HSP`功能异常导致的稳定性问题
-2. 一个应用可以同时依赖多个应用间`HSP`
-3. 应用间`HSP`会影响开发者应用自身的启动时间,依赖过多的应用间HSP可能会导致启动时延发生明显的劣化,建议将依赖的数目控制在16个以内。
-4. 当前三方开发者开发者只能使用系统提供的应用间`HSP`,不支持开发并发布自己的应用间`HSP`。
\ No newline at end of file
+**注意**:步骤2和步骤3不可以颠倒,否则会由于缺少必要的应用间`HSP`导致开发者的应用安装失败。更多`bm`相关指令可以参考[文档](https://gitee.com/openharmony/bundlemanager_bundle_framework#bm%E5%B7%A5%E5%85%B7%E5%91%BD%E4%BB%A4)。
\ No newline at end of file
diff --git a/zh-cn/application-dev/quick-start/har-package.md b/zh-cn/application-dev/quick-start/har-package.md
index ed82cdf4949b6946feab4f462655346dca070223..88e4c47a32bf2d7fe0162c177ae638ef12ee053a 100644
--- a/zh-cn/application-dev/quick-start/har-package.md
+++ b/zh-cn/application-dev/quick-start/har-package.md
@@ -1,8 +1,8 @@
# HAR
-HAR(Harmony Archive)是Harmony静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR共享包,可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
+HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
## 创建HAR模块
-HAR包对应DevEco Studio工程中的“Library”类型的[Module](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/ohos-adding-deleting-module-0000001218760594-V3),可以通过DevEco Studio创建一个HAR模块。HAR模块默认不开启混淆能力,开启混淆能力,需要把HAR模块的build-profile.json5文件中的artifactType字段设置为obfuscation,配置如下所示:
+HAR对应DevEco Studio工程中的“Library”类型的[Module](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/ohos-adding-deleting-module-0000001218760594-V3),可以通过DevEco Studio创建一个HAR模块。HAR模块默认不开启混淆能力,开启混淆能力,需要把HAR模块的build-profile.json5文件中的artifactType字段设置为obfuscation,配置如下所示:
```json
{
@@ -19,7 +19,7 @@ artifactType字段有以下两种取值,默认缺省为original。
需要对代码资产进行保护时,建议开启混淆能力,混淆能力开启后,DevEco Studio在构建HAR时,会对代码进行编译、混淆及压缩处理,保护代码资产。
注意:artifactType字段设置为obfuscation时,apiType字段必须设置为stageMode,因为Stage模型才支持混淆。
-## HAR共享包开发注意事项
+## HAR开发注意事项
- HAR不支持在配置文件中声明abilities、extensionAbilities组件。
- HAR不支持在配置文件中声明pages页面。
- HAR不支持在build-profile.json5文件的buildOption中配置worker。
@@ -27,7 +27,7 @@ artifactType字段有以下两种取值,默认缺省为original。
- Stage模型的HAR,不能引用AppScope内的内容。在编译构建时APPScope中的内容不会打包到HAR中,导致HAR资源引用失败。
## 导出HAR的ArkUI组件、接口、资源
-index.ets文件是HAR共享包导出声明文件的入口,HAR共享包需要导出的接口,统一在index.ets文件中导出。index.ets文件是DevEco Studio默认自动生成的,用户也可以自定义,在模块的package.json文件中的main字段配置入口声明文件,配置如下所示:
+index.ets文件是HAR导出声明文件的入口,HAR需要导出的接口,统一在index.ets文件中导出。index.ets文件是DevEco Studio默认自动生成的,用户也可以自定义,在模块的package.json文件中的main字段配置入口声明文件,配置如下所示:
```json
{
"main": "index.ets"
@@ -84,17 +84,17 @@ export { func } from './src/main/ts/test'
export { func2 } from './src/main/ts/test'
```
### 资源
-HAR模块编译打包时会把资源打包到HAR包中。在编译构建HAP时,DevEco Studio会从HAP模块及依赖的模块中收集资源文件,如果不同模块下的资源文件出现重名冲突时,DevEco Studio会按照以下优先级进行覆盖(优先级由高到低):
+HAR模块编译打包时会把资源打包到HAR中。在编译构建HAP时,DevEco Studio会从HAP模块及依赖的模块中收集资源文件,如果不同模块下的资源文件出现重名冲突时,DevEco Studio会按照以下优先级进行覆盖(优先级由高到低):
- AppScope(仅API9的Stage模型支持)。
- HAP包自身模块。
- 依赖的HAR模块,如果依赖的多个HAR之间有资源冲突,会按照依赖顺序进行覆盖(依赖顺序在前的优先级较高)。
## 引用HAR的ArkUI组件、接口、资源
-引用HAR共享包前,需要先配置对HAR的依赖,配置方式可[参考](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-development-npm-package-0000001222578434#section89674298391)。
+引用HAR前,需要先配置对HAR的依赖,配置方式可[参考](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-development-npm-package-0000001222578434#section89674298391)。
-### 引用HAR共享包的ArkUI组件
+### 引用HAR的ArkUI组件
-HAR共享包的依赖配置成功后,可以引用HAR共享包的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过`import`引入HAR共享包导出的ArkUI组件,示例如下所示:
+HAR的依赖配置成功后,可以引用HAR的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过`import`引入HAR导出的ArkUI组件,示例如下所示:
```js
// entry/src/main/ets/pages/index.ets
import { MainPage } from "@ohos/library"
@@ -105,7 +105,7 @@ struct Index {
@State message: string = 'Hello World'
build() {
Row() {
- // 引用HAR共享包的ArkUI组件
+ // 引用HAR的ArkUI组件
MainPage()
Column() {
Text(this.message)
@@ -118,8 +118,8 @@ struct Index {
}
}
```
-### 引用HAR共享包的类和方法
-通过`import`引用HAR共享包导出的ts类和方法,示例如下所示:
+### 引用HAR的类和方法
+通过`import`引用HAR导出的ts类和方法,示例如下所示:
```js
// entry/src/main/ets/pages/index.ets
import { Log } from "@ohos/library"
@@ -133,7 +133,7 @@ struct Index {
Column() {
Button('Button')
.onClick(()=>{
- // 引用HAR共享包的类和方法
+ // 引用HAR的类和方法
Log.info("har msg");
func();
})
@@ -144,8 +144,8 @@ struct Index {
}
}
```
-### 引用HAR共享包的资源
-通过`$r`引用HAR共享包中的资源,例如在HAR模块的`src/main/resources`里添加字符串资源(在string.json中定义,name:hello_har)和图片资源(icon_har.png),然后在Entry模块中引用该字符串和图片资源的示例如下所示:
+### 引用HAR的资源
+通过`$r`引用HAR中的资源,例如在HAR模块的`src/main/resources`里添加字符串资源(在string.json中定义,name:hello_har)和图片资源(icon_har.png),然后在Entry模块中引用该字符串和图片资源的示例如下所示:
```js
// entry/src/main/ets/pages/index.ets
@Entry
@@ -154,11 +154,11 @@ struct Index {
build() {
Row() {
Column() {
- // 引用HAR共享包的字符串资源
+ // 引用HAR的字符串资源
Text($r("app.string.hello_har"))
.fontSize(50)
.fontWeight(FontWeight.Bold)
- // 引用HAR共享包的图片资源
+ // 引用HAR的图片资源
Image($r("app.media.icon_har"))
}
.width('100%')
diff --git a/zh-cn/application-dev/quick-start/har-structure.md b/zh-cn/application-dev/quick-start/har-structure.md
deleted file mode 100644
index cc154c35d98365155bffb2ee8bb995ef51d69571..0000000000000000000000000000000000000000
--- a/zh-cn/application-dev/quick-start/har-structure.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# HAR包结构
-
-
-[HAR(Harmony Archive)](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-development-npm-package-0000001222578434)是Harmony静态共享包,可以包含代码、C++库、资源和module.json文件(Stage模型)或config.json文件(FA模型)等,用于实现多个模块或多个工程间的代码共享。
-
-HAR包不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
-
-HAR包对应DevEco Studio工程中的“Library”类型的[Module](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/ohos-adding-deleting-module-0000001218760594-V3)。
-
diff --git a/zh-cn/application-dev/quick-start/hsp-guide.md b/zh-cn/application-dev/quick-start/hsp-guide.md
deleted file mode 100644
index e2a5e3cc161ac493652b89bd5240cfb80c4f7bbd..0000000000000000000000000000000000000000
--- a/zh-cn/application-dev/quick-start/hsp-guide.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# HSP概述
-
-`HSP`(`Harmony Shared Package`)是Harmony动态共享包,可以包含代码、C++库、资源和配置文件。
-`HSP`与[HAR(Harmony Achive)](har-package.md)都是为了实现代码和资源的共享,最大的不同之处在于,`HAR`中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝。**而`HSP`中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。**
-
-**图1** `HAR`和`HSP`在`APP`包中的形态示意图
-
-
-**HSP旨在解决HAR包存在的几个问题:**
-- 多个`HAP`引用相同`HAR`包,导致的`APP`包大小膨胀问题
-- 多个`HAP`引用相同`HAR`包,`HAR`包中的一些状态变量无法共享的问题
-
-**HSP的一些约束:**
-- `HSP`及其使用方都必须是`Stage`模型
-- `HSP`及其使用方都必须使用`esmodule`编译模式
-- `HSP`不支持在配置文件中声明`abilities`、`extensionAbilities`标签
-
-`HSP`按照使用场景可以分为[应用内HSP](in-app-hsp.md)和[应用间HSP](cross-app-hsp.md)。它们在配置文件和使用方式等方面有所区别。
\ No newline at end of file
diff --git a/zh-cn/application-dev/quick-start/in-app-hsp.md b/zh-cn/application-dev/quick-start/in-app-hsp.md
index 2c456b608da986d0063c5821f6a515ec13e69761..177700e909363128a4df4da45de0e1d7c56f36f8 100644
--- a/zh-cn/application-dev/quick-start/in-app-hsp.md
+++ b/zh-cn/application-dev/quick-start/in-app-hsp.md
@@ -110,7 +110,7 @@ export { nativeMulti } from './utils/nativeTest'
"library": "file:../library"
}
```
-然后就可以像使用`HAR`包一样调用`HSP`的对外接口了。
+然后就可以像使用`HAR`一样调用`HSP`的对外接口了。
例如,上面的`library`已经导出了下面这些接口:
```ts
// library/src/main/ets/index.ets
diff --git a/zh-cn/application-dev/quick-start/shared-guide.md b/zh-cn/application-dev/quick-start/shared-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..a90453ac7072e643d78e8f98c229ce0c0848e17f
--- /dev/null
+++ b/zh-cn/application-dev/quick-start/shared-guide.md
@@ -0,0 +1,19 @@
+# 共享包概述
+
+OpenHarmony提供了两种共享包,[HAR(Harmony Achive)](har-package.md)静态共享包,和HSP(Harmony Shared Package)动态共享包。
+
+HAR与HSP都是为了实现代码和资源的共享,都可以包含代码、C++库、资源和配置文件,最大的不同之处在于:HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝;而HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。
+
+**图1** `HAR`和`HSP`在`APP`包中的形态示意图
+
+
+**HSP旨在解决HAR存在的几个问题:**
+- 多个`HAP`引用相同的`HAR`,导致的`APP`包大小膨胀问题。
+- 多个`HAP`引用相同的`HAR`,`HAR`中的一些状态变量无法共享的问题。
+
+**HSP的一些约束:**
+- `HSP`及其使用方都必须是`Stage`模型。
+- `HSP`及其使用方都必须使用`esmodule`编译模式。
+- `HSP`不支持在配置文件中声明`abilities`、`extensionAbilities`标签。
+
+`HSP`按照使用场景可以分为[应用内HSP](in-app-hsp.md)和[应用间HSP](cross-app-hsp.md)。它们在配置文件和使用方式等方面有所区别。
\ No newline at end of file
diff --git a/zh-cn/application-dev/reference/apis/Readme-CN.md b/zh-cn/application-dev/reference/apis/Readme-CN.md
index 61ad63f47a5a890ba32c81e4b2d92f222d3555ac..1b60c450840997a0834a1bb6635a747b8f7f6a47 100755
--- a/zh-cn/application-dev/reference/apis/Readme-CN.md
+++ b/zh-cn/application-dev/reference/apis/Readme-CN.md
@@ -130,6 +130,15 @@
- [CommonEventPublishData](js-apis-inner-commonEvent-commonEventPublishData.md)
- [CommonEventSubscriber](js-apis-inner-commonEvent-commonEventSubscriber.md)
- [CommonEventSubscribeInfo](js-apis-inner-commonEvent-commonEventSubscribeInfo.md)
+ - notification
+ - [NotificationActionButton](js-apis-inner-notification-notificationActionButton.md)
+ - [NotificationCommonDef](js-apis-inner-notification-notificationCommonDef.md)
+ - [NotificationContent](js-apis-inner-notification-notificationContent.md)
+ - [NotificationFlags](js-apis-inner-notification-notificationFlags.md)
+ - [NotificationRequest](js-apis-inner-notification-notificationRequest.md)
+ - [NotificationSlot](js-apis-inner-notification-notificationSlot.md)
+ - [NotificationTemplate](js-apis-inner-notification-notificationTemplate.md)
+ - [NotificationUserInput](js-apis-inner-notification-notificationUserInput.md)
- 包管理
- [@ohos.bundle.appControl (appControl模块)](js-apis-appControl.md)
- [@ohos.bundle.bundleManager (bundleManager模块)](js-apis-bundleManager.md)
@@ -189,7 +198,7 @@
- [@ohos.intl (国际化-Intl)](js-apis-intl.md)
- [@ohos.resourceManager (资源管理)](js-apis-resource-manager.md)
-- 资源调度
+- 后台任务
- [@ohos.distributedMissionManager (分布式任务管理)](js-apis-distributedMissionManager.md)
- [@ohos.reminderAgentManager (后台代理提醒)](js-apis-reminderAgentManager.md)
- [@ohos.resourceschedule.backgroundTaskManager (后台任务管理)](js-apis-resourceschedule-backgroundTaskManager.md)
diff --git a/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md b/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md
index 9d5752add2c1eef78d49b861fd2d151879e4506e..5476cf1786c2cb57d833aaf44fc5dd3716f60b9c 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md
@@ -139,7 +139,7 @@ grantUserGrantedPermission(tokenID: number, permissionName: Permissions, permiss
| --------- | ------------------- | ---- | ------------------------------------------------------------ |
| tokenID | number | 是 | 目标应用的身份标识。可通过应用的[ApplicationInfo](js-apis-bundleManager-applicationInfo.md)获得。 |
| permissionName | Permissions | 是 | 被授予的权限名称,合法的权限名取值可在[系统权限定义列表](../../security/permission-list.md)中查询。 |
-| permissionFlags | number | 是 | 授权选项,1表示下次仍需弹窗,2表示允许、禁止后不再提醒,3表示系统授权不允许更改。 |
+| permissionFlags | number | 是 | 授权选项
- 0表示权限未经过用户主动设置。
- 1表示当次用户若选择禁止该权限,下次权限弹窗仍可以弹出申请用户授权。
- 2表示当次用户若选择禁止该权限,下次不会再弹出权限弹窗,需要用户在setting的权限管理中进行授权。
- 4表示当次权限设置为系统授权,用户不可更改这个权限授权状态。 |
**返回值:**
@@ -196,7 +196,7 @@ grantUserGrantedPermission(tokenID: number, permissionName: Permissions, permiss
| --------- | ------------------- | ---- | ------------------------------------------------------------ |
| tokenID | number | 是 | 目标应用的身份标识。可通过应用的[ApplicationInfo](js-apis-bundleManager-applicationInfo.md)获得。|
| permissionName | Permissions | 是 | 被授予的权限名称,合法的权限名取值可在[系统权限定义列表](../../security/permission-list.md)中查询。 |
-| permissionFlags | number | 是 | 授权选项,1表示下次仍需弹窗,2表示允许、禁止后不再提醒,3表示系统授权不允许更改。 |
+| permissionFlags | number | 是 | 授权选项
- 0表示权限未经过用户主动设置。
- 1表示当次用户若选择禁止该权限,下次权限弹窗仍可以弹出申请用户授权。
- 2表示当次用户若选择禁止该权限,下次不会再弹出权限弹窗,需要用户在setting的权限管理中进行授权。
- 4表示当次权限设置为系统授权,用户不可更改这个权限授权状态。 |
| callback | AsyncCallback<void> | 是 | 授予应用user grant权限。当授予权限成功时,err为undefine;否则为错误对象。 |
**错误码:**
@@ -250,7 +250,7 @@ revokeUserGrantedPermission(tokenID: number, permissionName: Permissions, permis
| --------- | ------------------- | ---- | ------------------------------------------------------------ |
| tokenID | number | 是 | 目标应用的身份标识。可通过应用的[ApplicationInfo](js-apis-bundleManager-applicationInfo.md)获得。 |
| permissionName | Permissions | 是 | 被撤销的权限名称,合法的权限名取值可在[系统权限定义列表](../../security/permission-list.md)中查询。 |
-| permissionFlags | number | 是 | 授权选项,1表示下次仍需弹窗,2表示允许、禁止后不再提醒,3表示系统授权不允许更改。 |
+| permissionFlags | number | 是 | 授权选项
- 0表示权限未经过用户主动设置。
- 1表示当次用户若选择禁止该权限,下次权限弹窗仍可以弹出申请用户授权。
- 2表示当次用户若选择禁止该权限,下次不会再弹出权限弹窗,需要用户在setting的权限管理中进行授权。
- 4表示当次权限设置为系统授权,用户不可更改这个权限授权状态。 |
**返回值:**
@@ -307,7 +307,7 @@ revokeUserGrantedPermission(tokenID: number, permissionName: Permissions, permis
| --------- | ------------------- | ---- | ------------------------------------------------------------ |
| tokenID | number | 是 | 目标应用的身份标识。可通过应用的[ApplicationInfo](js-apis-bundleManager-applicationInfo.md)获得。 |
| permissionName | Permissions | 是 | 被撤销的权限名称,合法的权限名取值可在[系统权限定义列表](../../security/permission-list.md)中查询。 |
-| permissionFlags | number | 是 | 授权选项,1表示下次仍需弹窗,2表示允许、禁止后不再提醒,3表示系统授权不允许更改。 |
+| permissionFlags | number | 是 | 授权选项
- 0表示权限未经过用户主动设置。
- 1表示当次用户若选择禁止该权限,下次权限弹窗仍可以弹出申请用户授权。
- 2表示当次用户若选择禁止该权限,下次不会再弹出权限弹窗,需要用户在setting的权限管理中进行授权。
- 4表示当次权限设置为系统授权,用户不可更改这个权限授权状态。 |
| callback | AsyncCallback<void> | 是 | 撤销应用user grant权限。当撤销权限成功时,err为undefine;否则为错误对象。 |
**错误码:**
@@ -461,6 +461,7 @@ on(type: 'permissionStateChange', tokenIDList: Array<number>, permissionLi
```js
import abilityAccessCtrl, {Permissions} from '@ohos.abilityAccessCtrl';
+import bundle from '@ohos.bundle.bundleManager';
let atManager = abilityAccessCtrl.createAtManager();
let appInfo = bundle.getApplicationInfoSync('com.example.myapplication', 0, 100);
@@ -511,6 +512,7 @@ off(type: 'permissionStateChange', tokenIDList: Array<number>, permissionL
```js
import abilityAccessCtrl, {Permissions} from '@ohos.abilityAccessCtrl';
+import bundle from '@ohos.bundle.bundleManager';
let atManager = abilityAccessCtrl.createAtManager();
let appInfo = bundle.getApplicationInfoSync('com.example.myapplication', 0, 100);
@@ -582,7 +584,7 @@ requestPermissionsFromUser(context: Context, permissionList: Array<Permission
以下错误码的详细介绍请参见[程序访问控制错误码](../errorcodes/errorcode-access-token.md)。
| 错误码ID | 错误信息 |
| -------- | -------- |
-| 12100001 | Parameter invalid. |
+| 12100001 | The parameter is invalid. The context is invalid when it does not belong to the application itself. |
**示例:**
@@ -628,7 +630,7 @@ requestPermissionsFromUser(context: Context, permissionList: Array<Permission
以下错误码的详细介绍请参见[程序访问控制错误码](../errorcodes/errorcode-access-token.md)。
| 错误码ID | 错误信息 |
| -------- | -------- |
-| 12100001 | Parameter invalid. |
+| 12100001 | The parameter is invalid. The context is invalid when it does not belong to the application itself. |
**示例:**
diff --git a/zh-cn/application-dev/reference/apis/js-apis-audio.md b/zh-cn/application-dev/reference/apis/js-apis-audio.md
index 6f465e2fdf0399169ef4547d49f75614838b56ba..db745bb80dcc33cb613dd4303caa605b3ed63b39 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-audio.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-audio.md
@@ -4539,15 +4539,15 @@ let filePath = path + '/StarWars10s-2C-48000-4SW.wav';
let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
let stat = await fs.stat(path);
let buf = new ArrayBuffer(bufferSize);
-let len = stat.size % this.bufferSize == 0 ? Math.floor(stat.size / this.bufferSize) : Math.floor(stat.size / this.bufferSize + 1);
+let len = stat.size % bufferSize == 0 ? Math.floor(stat.size / bufferSize) : Math.floor(stat.size / bufferSize + 1);
for (let i = 0;i < len; i++) {
let options = {
- offset: i * this.bufferSize,
- length: this.bufferSize
+ offset: i * bufferSize,
+ length: bufferSize
}
let readsize = await fs.read(file.fd, buf, options)
let writeSize = await new Promise((resolve,reject)=>{
- this.audioRenderer.write(buf,(err,writeSize)=>{
+ audioRenderer.write(buf,(err,writeSize)=>{
if(err){
reject(err)
}else{
@@ -4593,15 +4593,15 @@ let filePath = path + '/StarWars10s-2C-48000-4SW.wav';
let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
let stat = await fs.stat(path);
let buf = new ArrayBuffer(bufferSize);
-let len = stat.size % this.bufferSize == 0 ? Math.floor(stat.size / this.bufferSize) : Math.floor(stat.size / this.bufferSize + 1);
+let len = stat.size % bufferSize == 0 ? Math.floor(stat.size / bufferSize) : Math.floor(stat.size / bufferSize + 1);
for (let i = 0;i < len; i++) {
let options = {
- offset: i * this.bufferSize,
- length: this.bufferSize
+ offset: i * bufferSize,
+ length: bufferSize
}
let readsize = await fs.read(file.fd, buf, options)
try{
- let writeSize = await this.audioRenderer.write(buf);
+ let writeSize = await audioRenderer.write(buf);
} catch(err) {
console.error(`audioRenderer.write err: ${err}`);
}
diff --git a/zh-cn/application-dev/reference/apis/js-apis-avsession.md b/zh-cn/application-dev/reference/apis/js-apis-avsession.md
index 768b57c04e43a854debf590f38fd26c040089efc..88dbe5801d5c290b5c995b006ff38b1193a553f4 100755
--- a/zh-cn/application-dev/reference/apis/js-apis-avsession.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-avsession.md
@@ -26,6 +26,8 @@ createAVSession(context: Context, tag: string, type: AVSessionType): Promise\ void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -626,6 +632,8 @@ off(type: 'sessionServiceDie', callback?: () => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -858,6 +866,8 @@ avSession.sendSystemControlCommand(avcommand, function (err) {
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 类型 | 可读 | 可写 | 说明 |
| :-------- | :----- | :--- | :--- | :---------------------------- |
@@ -877,6 +887,8 @@ setAVMetadata(data: AVMetadata): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -931,6 +943,8 @@ setAVMetadata(data: AVMetadata, callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -982,6 +996,8 @@ setAVPlaybackState(state: AVPlaybackState): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1028,6 +1044,8 @@ setAVPlaybackState(state: AVPlaybackState, callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1281,6 +1299,8 @@ setLaunchAbility(ability: WantAgent): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1351,6 +1371,8 @@ setLaunchAbility(ability: WantAgent, callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1501,6 +1523,8 @@ getController(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -1535,6 +1559,8 @@ getController(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1571,6 +1597,8 @@ getOutputDevice(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -1603,6 +1631,8 @@ getOutputDevice(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1637,6 +1667,8 @@ activate(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -1669,6 +1701,8 @@ activate(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1703,6 +1737,8 @@ deactivate(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -1737,6 +1773,8 @@ deactivate(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1771,6 +1809,8 @@ destroy(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -1801,9 +1841,10 @@ destroy(callback: AsyncCallback\): void
销毁当前会话,使当前会话完全失效。结果通过callback异步回调方式返回。
-
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1838,6 +1879,8 @@ on(type: 'play'|'pause'|'stop'|'playNext'|'playPrevious'|'fastForward'|'rewind',
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1887,6 +1930,8 @@ on(type: 'seek', callback: (time: number) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1918,6 +1963,8 @@ on(type: 'setSpeed', callback: (speed: number) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1949,6 +1996,8 @@ on(type: 'setLoopMode', callback: (mode: LoopMode) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -1980,6 +2029,8 @@ on(type: 'toggleFavorite', callback: (assetId: string) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2044,6 +2095,8 @@ on(type: 'handleKeyEvent', callback: (event: KeyEvent) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2075,6 +2128,8 @@ on(type: 'outputDeviceChange', callback: (device: OutputDeviceInfo) => void): vo
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2139,6 +2194,8 @@ off(type: 'play' | 'pause' | 'stop' | 'playNext' | 'playPrevious' | 'fastForward
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2174,6 +2231,8 @@ off(type: 'seek', callback?: (time: number) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2203,6 +2262,8 @@ off(type: 'setSpeed', callback?: (speed: number) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2232,6 +2293,8 @@ off(type: 'setLoopMode', callback?: (mode: LoopMode) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2261,6 +2324,8 @@ off(type: 'toggleFavorite', callback?: (assetId: string) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2321,6 +2386,8 @@ off(type: 'handleKeyEvent', callback?: (event: KeyEvent) => void): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2350,6 +2417,8 @@ off(type: 'outputDeviceChange', callback?: (device: OutputDeviceInfo) => void):
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2436,6 +2505,8 @@ getAVPlaybackState(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -2468,6 +2539,8 @@ getAVPlaybackState(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2721,6 +2794,8 @@ getAVMetadata(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -2753,6 +2828,8 @@ getAVMetadata(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2787,6 +2864,8 @@ getOutputDevice(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -2818,6 +2897,8 @@ getOutputDevice(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2852,6 +2933,8 @@ sendAVKeyEvent(event: KeyEvent): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2896,6 +2979,8 @@ sendAVKeyEvent(event: KeyEvent, callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -2937,6 +3022,8 @@ getLaunchAbility(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -2972,6 +3059,8 @@ getLaunchAbility(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3009,6 +3098,8 @@ getRealPlaybackPositionSync(): number
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -3037,6 +3128,8 @@ isActive(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -3070,6 +3163,8 @@ isActive(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3105,6 +3200,8 @@ destroy(): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -3137,6 +3234,8 @@ destroy(callback: AsyncCallback\): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3171,6 +3270,8 @@ getValidCommands(): Promise\>
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**返回值:**
| 类型 | 说明 |
@@ -3204,6 +3305,8 @@ getValidCommands(callback: AsyncCallback\>): void
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3239,6 +3342,8 @@ sendControlCommand(command: AVControlCommand): Promise\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3292,6 +3397,8 @@ sendControlCommand(command: AVControlCommand, callback: AsyncCallback\): v
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3429,6 +3536,8 @@ on(type: 'metadataChange', filter: Array\ | 'all', callback: (
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3466,6 +3575,8 @@ on(type: 'playbackStateChange', filter: Array\ | 'all', c
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3602,6 +3713,8 @@ on(type: 'sessionDestroy', callback: () => void)
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3633,6 +3746,8 @@ on(type: 'activeStateChange', callback: (isActive: boolean) => void)
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3664,6 +3779,8 @@ on(type: 'validCommandChange', callback: (commands: Array\
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3696,6 +3813,8 @@ on(type: 'outputDeviceChange', callback: (device: OutputDeviceInfo) => void): vo
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3727,6 +3846,8 @@ off(type: 'metadataChange', callback?: (data: AVMetadata) => void)
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3755,6 +3876,8 @@ off(type: 'playbackStateChange', callback?: (state: AVPlaybackState) => void)
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3873,6 +3996,8 @@ off(type: 'sessionDestroy', callback?: () => void)
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3901,6 +4026,8 @@ off(type: 'activeStateChange', callback?: (isActive: boolean) => void)
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3929,6 +4056,8 @@ off(type: 'validCommandChange', callback?: (commands: Array\ void):
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
@@ -3998,6 +4129,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口。
+
| 名称 | 类型 | 说明 |
| ----- | ------ | ---- |
| audio | string | 音频 |
@@ -4027,6 +4160,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 类型 | 说明 |
| -------------- | ------ | ------------ |
| play | string | 播放 |
@@ -4047,6 +4182,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 类型 | 必填 | 说明 |
| --------- | ------------------------------------------------- | ---- | -------------- |
| command | [AVControlCommandType](#avcontrolcommandtype) | 是 | 命令 |
@@ -4058,6 +4195,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 类型 | 必填 | 说明 |
| --------------- |-------------------------| ---- |---------------------------------------------------------------------|
| assetId | string | 是 | 媒体ID。 |
@@ -4110,6 +4249,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 类型 | 必填 | 说明 |
| ------------ | ------------------------------------- | ---- | ------- |
| state | [PlaybackState](#playbackstate) | 否 | 播放状态 |
@@ -4125,6 +4266,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 类型 | 必填 | 说明 |
| ----------- | ------ | ---- | ------------------ |
| elapsedTime | number | 是 | 已用时间,单位毫秒(ms)。 |
@@ -4136,6 +4279,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 类型 | 必填 | 说明 |
| ---------- | -------------- | ---- | ---------------------- |
| isRemote | boolean | 是 | 设备是否连接。 |
@@ -4148,6 +4293,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 值 | 说明 |
| --------------------------- | ---- | ----------- |
| PLAYBACK_STATE_INITIAL | 0 | 初始状态 |
@@ -4165,6 +4312,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 值 | 说明 |
| ------------------ | ---- | -------- |
| LOOP_MODE_SEQUENCE | 0 | 顺序播放 |
@@ -4178,6 +4327,8 @@ controller.off('outputDeviceChange');
**系统能力:** SystemCapability.Multimedia.AVSession.Core
+**系统接口:** 该接口为系统接口
+
| 名称 | 值 | 说明 |
| ------------------------------ | ------- | ------------------------------- |
| ERR_CODE_SERVICE_EXCEPTION | 6600101 | Session service exception. |
diff --git a/zh-cn/application-dev/reference/apis/js-apis-bundleManager-overlayModuleInfo.md b/zh-cn/application-dev/reference/apis/js-apis-bundleManager-overlayModuleInfo.md
new file mode 100755
index 0000000000000000000000000000000000000000..aaf0668397c0db56c7e0a0ff22eabab2325fc20d
--- /dev/null
+++ b/zh-cn/application-dev/reference/apis/js-apis-bundleManager-overlayModuleInfo.md
@@ -0,0 +1,18 @@
+# OverlayModuleInfo
+
+> **说明:**
+> 本模块首批接口从API version 10 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
+
+OverlayModuleInfo信息,系统应用可以通过[overlay.getOverlayModuleInfoByBundleName](js-apis-overlay.md#overlaygetoverlaymoduleinfobybundlename)获取指定应用的overlay特征module的OverlayModuleInfo信息,三方应用可以通过[overlay.getOverlayModuleInfo](js-apis-overlay.md#overlaygetoverlaymoduleinfo)获取当前应用中overlay特征module的OverlayModuleInfo信息。
+
+## OverlayModuleInfo
+
+ **系统能力:** 以下各项对应的系统能力均为SystemCapability.BundleManager.BundleFramework.Overlay。
+
+| 名称 | 类型 | 可读 | 可写 | 说明 |
+| --------------------- | ---------------------------------------------------| ---- | ---- | ---------------------------------------------- |
+| bundleName | string | 是 | 否 | overlay特征module所属的应用的bundle名称。 |
+| moduleName | string | 是 | 否 | overlay特征module的HAP名称。 |
+| targetModuleName | string | 是 | 否 | overlay特征module指定的目标module的HAP名称。 |
+| priority | number | 是 | 否 | overlay特征module的优先级。 |
+| state | number | 是 | 否 | overlay特征module的禁用使能状态。0代表禁用状态; 1代表使能状态。 |
\ No newline at end of file
diff --git a/zh-cn/application-dev/reference/apis/js-apis-cert.md b/zh-cn/application-dev/reference/apis/js-apis-cert.md
index 8ee8bd2309e88546bc98bdb344d8e2757f86bfac..c3451703a6d58475333c37600fa88556b627bedb 100755
--- a/zh-cn/application-dev/reference/apis/js-apis-cert.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-cert.md
@@ -104,6 +104,11 @@ createX509Cert(inStream : EncodingBlob, callback : AsyncCallback\) : v
| inStream | [EncodingBlob](#encodingblob) | 是 | X509证书序列化数据 |
| callback | AsyncCallback\ | 是 | 回调函数。表示X509证书对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------- |
+| 19020001 | memory error. |
**示例:**
@@ -146,6 +151,12 @@ createX509Cert(inStream : EncodingBlob) : Promise\
| ------- | ---------------- |
| Promise\ | 表示X509证书对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------- |
+| 19020001 | memory error. |
+
**示例:**
```js
@@ -184,6 +195,11 @@ verify(key : cryptoFramework.PubKey, callback : AsyncCallback\) : void
| key | cryptoFramework.PubKey | 是 | 用于验签的公钥对象 |
| callback | AsyncCallback\ | 是 | 回调函数。使用AsyncCallback的第一个error参数判断是否验签成功,error为null表示成功,不为null表示失败 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------ |
+| 19030001 | crypto operation error. |
**示例:**
@@ -235,6 +251,12 @@ verify(key : cryptoFramework.PubKey) : Promise\
| -------------- | ----------- |
| Promise\ | Promise对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------ |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -275,6 +297,13 @@ getEncoded(callback : AsyncCallback\) : void
| -------- | --------------------------------------------- | ---- | -------------------------------- |
| callback | AsyncCallback\<[EncodingBlob](#encodingblob)> | 是 | 回调函数。表示X509证书序列化数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
**示例:**
@@ -318,6 +347,14 @@ getEncoded() : Promise\
| --------------------------------------- | ---------------------- |
| Promise\<[EncodingBlob](#encodingblob)> | 表示X509证书序列化数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -356,6 +393,13 @@ getPublicKey() : cryptoFramework.PubKey
| ------ | ---------------- |
| cryptoFramework.PubKey | X509证书公钥对象:仅用于X509Cert的verify接口 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -398,6 +442,15 @@ checkValidityWithDate(date: string) : void
| -------- | -------------- | ---- | ---------- |
| date | string | 是 | 日期(格式:YYMMDDHHMMSSZ 或 YYYYMMDDHHMMSSZ,时间必须以Z结尾:表示标准时间) |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19030001 | crypto operation error.|
+| 19030003 | the certificate has not taken effect. |
+| 19030004 | the certificate has expired.|
+
**示例:**
```js
@@ -513,6 +566,14 @@ getIssuerName() : DataBlob
| --------------------- | ---------------------- |
| [DataBlob](#datablob) | 表示X509证书颁发者名称 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -549,6 +610,14 @@ getSubjectName() : DataBlob
| --------------------- | -------------------- |
| [DataBlob](#datablob) | 表示X509证书主体名称 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -585,6 +654,14 @@ getNotBeforeTime() : string
| ------ | ------------------------------------------------------------ |
| string | 表示X509证书有效期起始时间(格式:YYMMDDHHMMSSZ 或 YYYYMMDDHHMMSSZ,时间以Z结尾:表示标准时间) |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -621,6 +698,14 @@ getNotAfterTime() : string
| ------ | ------------------------------------------------------------ |
| string | 表示X509证书有效期截止时间(格式:YYMMDDHHMMSSZ 或 YYYYMMDDHHMMSSZ,时间以Z结尾:表示标准时间) |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -657,6 +742,14 @@ getSignature() : DataBlob
| --------------------- | -------------------- |
| [DataBlob](#datablob) | 表示X509证书签名数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -693,6 +786,14 @@ getSignatureAlgName() : string
| ------ | ------------------------ |
| string | 表示X509证书签名算法名称 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -729,6 +830,14 @@ getSignatureAlgOid() : string
| ------ | --------------------------------- |
| string | 表示X509证书签名算法对象标志符OID |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -765,6 +874,14 @@ getSignatureAlgParams() : DataBlob
| --------------------- | ------------------------ |
| [DataBlob](#datablob) | 表示X509证书签名算法参数 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -801,6 +918,13 @@ getKeyUsage() : DataBlob
| --------------------- | -------------------- |
| [DataBlob](#datablob) | 表示X509证书秘钥用途 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -837,6 +961,14 @@ getExtKeyUsage() : DataArray
| ----------------------- | ------------------------ |
| [DataArray](#dataarray) | 表示X509证书扩展秘钥用途 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -909,6 +1041,14 @@ getSubjectAltNames() : DataArray
| ----------------------- | ------------------------ |
| [DataArray](#dataarray) | 表示X509证书主体可选名称 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -945,6 +1085,14 @@ getIssuerAltNames() : DataArray
| ----------------------- | -------------------------- |
| [DataArray](#dataarray) | 表示X509证书颁发者可选名称 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error.|
+
**示例:**
```js
@@ -982,6 +1130,11 @@ createX509Crl(inStream : EncodingBlob, callback : AsyncCallback\) : voi
| inStream | [EncodingBlob](#encodingblob) | 是 | 表示证书吊销列表序列化数据 |
| callback | AsyncCallback\ | 是 | 回调函数。表示证书吊销列表对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------- |
+| 19020001 | memory error. |
**示例:**
@@ -1024,6 +1177,12 @@ createX509Crl(inStream : EncodingBlob) : Promise\
| ----------------- | -------------------- |
| Promise\ | 表示证书吊销列表对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------- |
+| 19020001 | memory error. |
+
**示例:**
```js
@@ -1145,6 +1304,13 @@ getEncoded(callback : AsyncCallback\) : void
| -------- | ---------------------------- | ---- | ------------------------------------------ |
| callback | AsyncCallback\ | 是 | 回调函数,表示X509证书吊销列表的序列化数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
**示例:**
@@ -1188,6 +1354,14 @@ getEncoded() : Promise\
| ---------------------- | -------------------------------- |
| Promise\ | 表示X509证书吊销列表的序列化数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1227,6 +1401,11 @@ verify(key : cryptoFramework.PubKey, callback : AsyncCallback\) : void
| key | cryptoFramework.PubKey | 是 | 表示用于验签的公钥对象 |
| callback | AsyncCallback\ | 是 | 回调函数,使用AsyncCallback的第一个error参数判断是否验签成功,error为null表示成功,error不为null表示失败。 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19030001 | crypto operation error. |
**示例:**
@@ -1279,6 +1458,12 @@ verify(key : cryptoFramework.PubKey) : Promise\
| ---- | ------------------------------------------------------------ |
| Promise\ | Promise对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1356,6 +1541,14 @@ getIssuerName() : DataBlob
| --------------------- | ------------------------------ |
| [DataBlob](#datablob) | 表示X509证书吊销列表颁发者名称 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1392,6 +1585,14 @@ getLastUpdate() : string
| ------ | ------------------------------------ |
| string | 表示X509证书吊销列表最后一次更新日期 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1428,6 +1629,14 @@ getNextUpdate() : string
| ------ | ------------------------------------ |
| string | 表示X509证书吊销列表下一次更新的日期 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1470,6 +1679,13 @@ getRevokedCert(serialNumber : number) : X509CrlEntry
| ---------------------- | --------------------- |
| X509CrlEntry | 表示被吊销X509证书对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1518,6 +1734,13 @@ getRevokedCertWithCert(cert : X509Cert) : X509CrlEntry
| ------------ | -------------------- |
| X509CrlEntry | 表示被吊销X509证书对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1560,6 +1783,12 @@ getRevokedCerts(callback : AsyncCallback>) : void
| -------- | ----------------------------------- | ---- | -------------------------------- |
| callback | AsyncCallback> | 是 | 回调函数。表示被吊销X509证书列表 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19030001 | crypto operation error. |
**示例:**
@@ -1603,6 +1832,13 @@ getRevokedCerts() : Promise>
| ----------------------------- | ---------------------- |
| Promise> | 表示被吊销X509证书列表 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1641,6 +1877,14 @@ getTbsInfo() : DataBlob
| --------------------- | ------------------------------- |
| [DataBlob](#datablob) | 表示证书吊销列表的tbsCertList信息 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1681,6 +1925,14 @@ getSignature() : DataBlob
| --------------------- | ------------------------------ |
| [DataBlob](#datablob) | 表示X509证书吊销列表的签名数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1717,6 +1969,14 @@ getSignatureAlgName() : string
| ------ | -------------------------------- |
| string | 表示X509证书吊销列表签名的算法名 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1753,6 +2013,14 @@ getSignatureAlgOid() : string
| ------ | --------------------------------------------- |
| string | 表示X509证书吊销列表签名算法的对象标志符OID。 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1789,6 +2057,14 @@ getSignatureAlgParams() : DataBlob
| --------------------- | ---------------------------------- |
| [DataBlob](#datablob) | 表示X509证书吊销列表签名的算法参数 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1831,6 +2107,14 @@ createCertChainValidator(algorithm :string) : CertChainValidator
| ------------------ | -------------------- |
| CertChainValidator | 表示证书链校验器对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -1846,7 +2130,7 @@ let validator = cryptoCert.createCertChainValidator("PKIX");
### 属性
-**系统能力:** SystemCapability.Security.CryptoFramework
+**系统能力:** SystemCapability.Security.Cert
| 名称 | 类型 | 可读 | 可写 | 说明 |
| ------- | ------ | ---- | ---- | -------------------------- |
@@ -1869,6 +2153,19 @@ validate(certChain : CertChainData, callback : AsyncCallback\) : void
| certChain | [CertChainData](#certchaindata) | 是 | 表示X509证书链序列化数据 |
| callback | AsyncCallback\ | 是 | 回调函数。使用AsyncCallback的第一个error参数判断是否校验成功,error为null表示成功,error不为null表示失败 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+| 19030002 | the certificate signature verification failed. |
+| 19030003 | the certificate has not taken effect. |
+| 19030004 | the certificate has expired. |
+| 19030005 | failed to obtain the certificate issuer. |
+| 19030006 | the key cannot be used for signing a certificate. |
+| 19030007 | the key cannot be used for digital signature. |
**示例:**
@@ -1916,6 +2213,20 @@ validate(certChain : CertChainData) : Promise\
| -------------- | ----------- |
| Promise\ | Promise对象 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ------------------------------------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+| 19030002 | the certificate signature verification failed. |
+| 19030003 | the certificate has not taken effect. |
+| 19030004 | the certificate has expired. |
+| 19030005 | failed to obtain the certificate issuer. |
+| 19030006 | the key cannot be used for signing a certificate. |
+| 19030007 | the key cannot be used for digital signature. |
+
**示例:**
```js
@@ -1980,6 +2291,13 @@ getEncoded(callback : AsyncCallback\) : void
| -------- | --------------------------------------------- | ---- | ------------------------------------ |
| callback | AsyncCallback\<[EncodingBlob](#encodingblob)> | 是 | 回调函数。表示被吊销证书的序列化数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
**示例:**
@@ -2011,6 +2329,14 @@ getEncoded() : Promise\
| --------------------------------------- | -------------------------- |
| Promise\<[EncodingBlob](#encodingblob)> | 表示被吊销证书的序列化数据 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
@@ -2063,6 +2389,13 @@ getCertIssuer() : DataBlob
| --------------------- | ----------------------- |
| [DataBlob](#datablob) | 表示被吊销证书的颁发者信息 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | -------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+
**示例:**
```js
@@ -2091,6 +2424,14 @@ getRevocationDate() : string
| ------ | ------------------ |
| string | 表示证书被吊销的日期 |
+**错误码:**
+
+| 错误码ID | 错误信息 |
+| -------- | ----------------------- |
+| 19020001 | memory error. |
+| 19020002 | runtime error. |
+| 19030001 | crypto operation error. |
+
**示例:**
```js
diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-relationalStore.md b/zh-cn/application-dev/reference/apis/js-apis-data-relationalStore.md
index 4c94720c13746c8a1ff26203755b29a34106a649..564bde75b6d087feca5e8945eab230ad6551e372 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-data-relationalStore.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-data-relationalStore.md
@@ -30,7 +30,7 @@ getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<Rd
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------------------------- | ---- | ------------------------------------------------------------ |
-| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-ability-context.md)。 |
+| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-inner-application-uiAbilityContext.md)。 |
| config | [StoreConfig](#storeconfig) | 是 | 与此RDB存储相关的数据库配置。 |
| callback | AsyncCallback<[RdbStore](#rdbstore)> | 是 | 指定callback回调函数,返回RdbStore对象。 |
@@ -108,7 +108,7 @@ getRdbStore(context: Context, config: StoreConfig): Promise<RdbStore>
| 参数名 | 类型 | 必填 | 说明 |
| ------- | -------------------------------- | ---- | ------------------------------------------------------------ |
-| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-ability-context.md)。 |
+| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-inner-application-uiAbilityContext.md)。 |
| config | [StoreConfig](#storeconfig) | 是 | 与此RDB存储相关的数据库配置。 |
**返回值**:
@@ -188,7 +188,7 @@ deleteRdbStore(context: Context, name: string, callback: AsyncCallback<void&g
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | ------------------------------------------------------------ |
-| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-ability-context.md)。 |
+| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-inner-application-uiAbilityContext.md)。 |
| name | string | 是 | 数据库名称。 |
| callback | AsyncCallback<void> | 是 | 指定callback回调函数。 |
@@ -249,7 +249,7 @@ deleteRdbStore(context: Context, name: string): Promise<void>
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------- | ---- | ------------------------------------------------------------ |
-| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-ability-context.md)。 |
+| context | Context | 是 | 应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-inner-application-uiAbilityContext.md)。 |
| name | string | 是 | 数据库名称。 |
**返回值**:
@@ -2612,9 +2612,9 @@ store.sync(relationalStore.SyncMode.SYNC_MODE_PUSH, predicates, function (err, r
let predicates = new relationalStore.RdbPredicates('EMPLOYEE');
predicates.inDevices(['12345678abcde']);
let promise = store.sync(relationalStore.SyncMode.SYNC_MODE_PUSH, predicates);
-promise.then((resultSet) =>{
+promise.then((result) =>{
console.info(`Sync done.`);
- for (let i = 0; i < resultSet.length; i++) {
+ for (let i = 0; i < result.length; i++) {
console.info(`device= ${result[i][0]}, status= ${result[i][1]}`);
}
}).catch((err) => {
@@ -2693,10 +2693,12 @@ try {
首先需要获取resultSet对象。
```js
+let resultSet = null;
let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
predicates.equalTo("AGE", 18);
let promise = store.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]);
-promise.then((resultSet) => {
+promise.then((result) => {
+ resultSet = result;
console.info(`resultSet columnNames: ${resultSet.columnNames}`);
console.info(`resultSet columnCount: ${resultSet.columnCount}`);
});
@@ -2867,7 +2869,7 @@ goToRow(position: number): boolean
let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
let promise = store.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]);
promise.then((resultSet) => {
- resultSet.(5);
+ resultSet.goToRow(5);
resultSet.close();
}).catch((err) => {
console.error(`query failed, err: ${err}`);
diff --git a/zh-cn/application-dev/reference/apis/js-apis-distributedKVStore.md b/zh-cn/application-dev/reference/apis/js-apis-distributedKVStore.md
index 3b61f968c98f5bd3ac708e912b8f39e7f776a029..84206aabcfe16da05849f39ad6f308eda9db28b8 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-distributedKVStore.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-distributedKVStore.md
@@ -28,7 +28,7 @@ import distributedKVStore from '@ohos.data.distributedKVStore';
| 名称 | 类型 | 必填 | 说明 |
| ---------- | --------------------- | ---- | ------------------------------------------------------------ |
-| context | Context | 是 |应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-ability-context.md)。 |
+| context | Context | 是 |应用的上下文。
FA模型的应用Context定义见[Context](js-apis-inner-app-context.md)。
Stage模型的应用Context定义见[Context](js-apis-inner-application-uiAbilityContext.md)。 |
| bundleName | string | 是 | 调用方的包名。 |
## Constants
@@ -1242,7 +1242,7 @@ reset(): Query
| 类型 | 说明 |
| -------------- | --------------------- |
-| [Query](query) | 返回重置的Query对象。 |
+| [Query](#query) | 返回重置的Query对象。 |
**示例:**
@@ -1278,7 +1278,7 @@ equalTo(field: string, value: number|string|boolean): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1312,7 +1312,7 @@ notEqualTo(field: string, value: number|string|boolean): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1345,7 +1345,7 @@ greaterThan(field: string, value: number|string|boolean): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1380,7 +1380,7 @@ lessThan(field: string, value: number|string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1415,7 +1415,7 @@ greaterThanOrEqualTo(field: string, value: number|string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1450,7 +1450,7 @@ lessThanOrEqualTo(field: string, value: number|string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1483,7 +1483,7 @@ isNull(field: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1517,7 +1517,7 @@ inNumber(field: string, valueList: number[]): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1551,7 +1551,7 @@ inString(field: string, valueList: string[]): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1585,7 +1585,7 @@ notInNumber(field: string, valueList: number[]): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1619,7 +1619,7 @@ notInString(field: string, valueList: string[]): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1653,7 +1653,7 @@ like(field: string, value: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1687,7 +1687,7 @@ unlike(field: string, value: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1714,7 +1714,7 @@ and(): Query
| 类型 | 说明 |
| -------------- | -------------- |
-| [Query](query) | 返回查询对象。 |
+| [Query](#query) | 返回查询对象。 |
**示例:**
@@ -1743,7 +1743,7 @@ or(): Query
| 类型 | 说明 |
| -------------- | -------------- |
-| [Query](query) | 返回查询对象。 |
+| [Query](#query) | 返回查询对象。 |
**示例:**
@@ -1778,7 +1778,7 @@ orderByAsc(field: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1812,7 +1812,7 @@ orderByDesc(field: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1847,7 +1847,7 @@ limit(total: number, offset: number): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1883,7 +1883,7 @@ isNotNull(field: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1910,7 +1910,7 @@ beginGroup(): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1939,7 +1939,7 @@ endGroup(): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -1974,7 +1974,7 @@ prefixKey(prefix: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -2008,7 +2008,7 @@ setSuggestIndex(index: string): Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -2042,7 +2042,7 @@ deviceId(deviceId:string):Query
| 类型 | 说明 |
| -------------- | --------------- |
-| [Query](query) | 返回Query对象。 |
+| [Query](#query) | 返回Query对象。 |
**示例:**
@@ -3086,7 +3086,7 @@ getEntries(query: Query, callback: AsyncCallback<Entry[]>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------------------------- | ---- | ----------------------------------------------- |
-| query | [Query](query) | 是 | 表示要匹配的键前缀。 |
+| query | [Query](#query) | 是 | 表示要匹配的键前缀。 |
| callback | AsyncCallback<[Entry](#entry)[]> | 是 | 回调函数。返回与指定Query对象匹配的键值对列表。 |
**错误码:**
@@ -3148,7 +3148,7 @@ getEntries(query: Query): Promise<Entry[]>
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------- | ---- | -------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -3414,7 +3414,7 @@ getResultSet(query: Query): Promise<KVStoreResultSet>
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------- | ---- | -------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -3661,7 +3661,7 @@ getResultSize(query: Query, callback: AsyncCallback<number>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------------- | ---- | ------------------------------------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
| callback | AsyncCallback<number> | 是 | 回调函数。返回与指定Query对象匹配的结果数。 |
**错误码:**
@@ -3719,7 +3719,7 @@ getResultSize(query: Query): Promise<number>
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------- | ---- | -------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -4548,7 +4548,7 @@ sync(deviceIds: string[], query: Query, mode: SyncMode, delayMs?: number): void
| --------- | --------------------- | ---- | ---------------------------------------------- |
| deviceIds | string[] | 是 | 同一组网环境下,需要同步的设备的deviceId列表。 |
| mode | [SyncMode](#syncmode) | 是 | 同步模式。 |
-| query | [Query](query) | 是 | 表示数据库的查询谓词条件 |
+| query | [Query](#query) | 是 | 表示数据库的查询谓词条件 |
| delayMs | number | 否 | 可选参数,允许延时时间,单位:ms(毫秒)。 |
**错误码:**
@@ -5324,7 +5324,7 @@ getEntries(query: Query, callback: AsyncCallback<Entry[]>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------------------------- | ---- | ----------------------------------------------------- |
-| query | [Query](query) | 是 | 表示要匹配的键前缀。 |
+| query | [Query](#query) | 是 | 表示要匹配的键前缀。 |
| callback | AsyncCallback<[Entry](#entry)[]> | 是 | 回调函数。返回本设备与指定Query对象匹配的键值对列表。 |
**错误码:**
@@ -5386,7 +5386,7 @@ getEntries(query: Query): Promise<Entry[]>
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------- | ---- | -------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -5453,7 +5453,7 @@ getEntries(deviceId: string, query: Query, callback: AsyncCallback<Entry[]>
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------------------------- | ---- | ------------------------------------------------------- |
| deviceId | string | 是 | 键值对所属的设备ID。 |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
| callback | AsyncCallback<[Entry](#entry)[]> | 是 | 回调函数。返回与指定设备ID和Query对象匹配的键值对列表。 |
**错误码:**
@@ -5522,7 +5522,7 @@ getEntries(deviceId: string, query: Query): Promise<Entry[]>
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------- | ---- | -------------------- |
| deviceId | string | 是 | 键值对所属的设备ID。 |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -5830,7 +5830,7 @@ getResultSet(deviceId: string, query: Query, callback: AsyncCallback<KVStoreR
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
| deviceId | string | 是 | KVStoreResultSet对象所属的设备ID。 |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
| callback | AsyncCallback<[KVStoreResultSet](#kvstoreresultset)> | 是 | 回调函数。返回与指定设备ID和Query对象匹配的KVStoreResultSet对象。 |
**错误码:**
@@ -5902,7 +5902,7 @@ getResultSet(deviceId: string, query: Query): Promise<KVStoreResultSet>
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------- | ---- | ---------------------------------- |
| deviceId | string | 是 | KVStoreResultSet对象所属的设备ID。 |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -5975,7 +5975,7 @@ getResultSet(query: Query): Promise<KVStoreResultSet>
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------- | ---- | -------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -6041,7 +6041,7 @@ getResultSet(deviceId: string, query: Query): Promise<KVStoreResultSet>
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------- | ---- | ---------------------------------- |
| deviceId | string | 是 | KVStoreResultSet对象所属的设备ID。 |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -6341,7 +6341,7 @@ getResultSize(query: Query, callback: AsyncCallback<number>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------------- | ---- | ------------------------------------------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
| callback | AsyncCallback<number> | 是 | 回调函数。返回与本设备指定Query对象匹配的结果数。 |
**错误码:**
@@ -6399,7 +6399,7 @@ getResultSize(query: Query): Promise<number>
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------- | ---- | -------------- |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
@@ -6463,7 +6463,7 @@ getResultSize(deviceId: string, query: Query, callback: AsyncCallback<number&
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------------- | ---- | --------------------------------------------------- |
| deviceId | string | 是 | KVStoreResultSet对象所属的设备ID。 |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
| callback | AsyncCallback<number> | 是 | 回调函数。返回与指定设备ID和Query对象匹配的结果数。 |
**错误码:**
@@ -6527,7 +6527,7 @@ getResultSize(deviceId: string, query: Query): Promise<number>
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------- | ---- | ---------------------------------- |
| deviceId | string | 是 | KVStoreResultSet对象所属的设备ID。 |
-| query | [Query](query) | 是 | 表示查询对象。 |
+| query | [Query](#query) | 是 | 表示查询对象。 |
**返回值:**
diff --git a/zh-cn/application-dev/reference/apis/js-apis-emitter.md b/zh-cn/application-dev/reference/apis/js-apis-emitter.md
index 64187e6a825c930ddadbd4cfa75401d1ecac1ea8..c77ef0bc116f020640db7c0d920bbb82c409867d 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-emitter.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-emitter.md
@@ -161,4 +161,4 @@ emitter.emit(innerEvent, eventData);
| 名称 | 类型 | 可读 | 可写 | 说明 |
| ---- | ------------------ | ---- | ---- | -------------- |
-| data | [key: string]: any | 是 | 是 | 发送事件时传递的数据,数据类型支持字符串、整型和布尔型。 |
+| data | [key: string]: any | 是 | 是 | 发送事件时传递的数据,数据类型支持字符串、整型和布尔型。
其中字符串长度最大为10240字节。 |
diff --git a/zh-cn/application-dev/reference/apis/js-apis-file-picker.md b/zh-cn/application-dev/reference/apis/js-apis-file-picker.md
index a14b82314a97c1e7d99e69ecf1291bb32b718ece..7e7b6963fae8fe2194cab97a8fb8db45b363eea5 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-file-picker.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-file-picker.md
@@ -393,7 +393,7 @@ async function example() {
console.error('DocumentViewPicker.save failed with err: ' + err);
});
} catch (err) {
- console.errort('DocumentViewPicker failed with err: ' + err);
+ console.error('DocumentViewPicker failed with err: ' + err);
}
}
```
@@ -429,7 +429,7 @@ async function example() {
console.info('DocumentViewPicker.save successfully, DocumentSaveResult uri: ' + JSON.stringify(DocumentSaveResult));
});
} catch (err) {
- console.errort('DocumentViewPicker failed with err: ' + err);
+ console.error('DocumentViewPicker failed with err: ' + err);
}
}
```
@@ -462,7 +462,7 @@ async function example() {
console.info('DocumentViewPicker.save successfully, DocumentSaveResult uri: ' + JSON.stringify(DocumentSaveResult));
});
} catch (err) {
- console.errort('DocumentViewPicker failed with err: ' + err);
+ console.error('DocumentViewPicker failed with err: ' + err);
}
}
```
diff --git a/zh-cn/application-dev/reference/apis/js-apis-fileAccess.md b/zh-cn/application-dev/reference/apis/js-apis-fileAccess.md
index 2f66868a47a28345d007b1320abbd349800f41d8..dcaf26d5b4cc123caf8eb62d8accf752fc2d8b3b 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-fileAccess.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-fileAccess.md
@@ -6,6 +6,7 @@ fileAccess模块是基于extension机制实现的一个对公共文件访问和
>
>- 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
>- 本模块接口为系统接口,三方应用不支持调用,当前只支持filepicker、文件管理器调用。
+>- 本模块支持对错误码进行处理,错误码及其适配方式[参考文档](../errorcodes/errorcode-filemanagement.md#错误码适配指导)。
## 导入模块
@@ -1017,6 +1018,241 @@ access(sourceFileUri: string, callback: AsyncCallback<boolean>) : void;
};
```
+## FileAccessHelper.getFileInfoFromUri10+
+
+getFileInfoFromUri(uri: string) : Promise;
+
+以异步方法获取uri对应的[FileInfo](#fileinfo)对象。使用promise异步回调。
+
+**系统能力**:SystemCapability.FileManagement.UserFileService
+
+**需要权限**:ohos.permission.FILE_ACCESS_MANAGER
+
+**参数:**
+
+ | 参数名 | 类型 | 必填 | 说明 |
+ | --- | --- | --- | -- |
+ | uri | string | 是 | 文件(夹)的Uri |
+
+**返回值:**
+
+| 类型 | 说明 |
+| --- | -- |
+| [FileInfo](#fileinfo) | FileInfo对象 |
+
+**示例:**
+
+ ```js
+ // 以媒体库uri为例
+ // 示例代码sourceUri表示Download目录,该uri是对应的fileInfo中uri
+ // 开发者应根据自己实际获取的uri进行开发
+ let sourceUri = "datashare:///media/file/6";
+ try {
+ // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
+ let fileInfo = await fileAccessHelper.getFileInfoFromUri(sourceUri);
+ } catch (error) {
+ console.error("getFileInfoFromUri failed, errCode:" + error.code + ", errMessage:" + error.message);
+ };
+ ```
+
+## FileAccessHelper.getFileInfoFromUri10+
+
+getFileInfoFromUri(uri: string, callback: AsyncCallback) : void;
+
+以异步方法获取uri对应的[FileInfo](#fileinfo)对象。使用callback异步回调。
+
+**系统能力**:SystemCapability.FileManagement.UserFileService
+
+**需要权限**:ohos.permission.FILE_ACCESS_MANAGER
+
+**参数:**
+
+ | 参数名 | 类型 | 必填 | 说明 |
+ | --- | --- | --- | -- |
+ | uri | string | 是 | 文件(夹)的Uri |
+ | callback | AsyncCallback<string> | 是 | uri对应的FileInfo对象 |
+
+**示例:**
+
+ ```js
+ // 以媒体库uri为例
+ // 示例代码sourceUri表示Download目录,该uri是对应的fileInfo中uri
+ // 开发者应根据自己实际获取的uri进行开发
+ let sourceUri = "datashare:///media/file/6";
+ try {
+ // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
+ fileAccessHelper.getFileInfoFromUri(sourceUri, function (err, fileInfo) {
+ if (err) {
+ console.error("Failed to getFileInfoFromUri in async, errCode:" + err.code + ", errMessage:" + err.message);
+ return;
+ }
+ console.log("getFileInfoFromUri success, fileInfo: " + JSON.stringify(fileInfo));
+ });
+ } catch (error) {
+ console.error("getFileInfoFromUri failed, errCode:" + error.code + ", errMessage:" + error.message);
+ };
+ ```
+
+
+## FileAccessHelper.getFileInfoFromRelativePath10+
+
+getFileInfoFromRelativePath(relativePath: string) : Promise;
+
+以异步方法获取relativePath对应的[FileInfo](#fileinfo)对象。使用promise异步回调。
+
+**系统能力**:SystemCapability.FileManagement.UserFileService
+
+**需要权限**:ohos.permission.FILE_ACCESS_MANAGER
+
+**参数:**
+
+ | 参数名 | 类型 | 必填 | 说明 |
+ | --- | --- | --- | -- |
+ | relativePath | string | 是 | 文件(夹)的相对路径 |
+
+**返回值:**
+
+| 类型 | 说明 |
+| --- | -- |
+| [FileInfo](#fileinfo) | FileInfo对象 |
+
+**示例:**
+
+ ```js
+ // 以媒体库relativePath为例
+ // 示例代码relativePath表示Download目录,该relativePath是对应的fileInfo中relativePath
+ // 开发者应根据自己实际获取的relativePath进行开发
+ let relativePath = "Download/";
+ try {
+ // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
+ let fileInfo = await fileAccessHelper.getFileInfoFromRelativePath(relativePath);
+ } catch (error) {
+ console.error("getFileInfoFromRelativePath failed, errCode:" + error.code + ", errMessage:" + error.message);
+ };
+ ```
+
+## FileAccessHelper.getFileInfoFromRelativePath10+
+
+getFileInfoFromRelativePath(relativePath: string, callback: AsyncCallback) : void;
+
+以异步方法获取relativePath对应的[FileInfo](#fileinfo)对象。使用callback异步回调。
+
+**系统能力**:SystemCapability.FileManagement.UserFileService
+
+**需要权限**:ohos.permission.FILE_ACCESS_MANAGER
+
+**参数:**
+
+ | 参数名 | 类型 | 必填 | 说明 |
+ | --- | --- | --- | -- |
+ | relativePath | string | 是 | 文件(夹)的相对路径 |
+ | callback | AsyncCallback<string> | 是 | relativePath对应的FileInfo对象 |
+
+**示例:**
+
+ ```js
+ // 以媒体库relativePath为例
+ // 示例代码relativePath表示Download目录,该relativePath是对应的fileInfo中relativePath
+ // 开发者应根据自己实际获取的relativePath进行开发
+ let relativePath = "Download/";
+ try {
+ // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
+ fileAccessHelper.getFileInfoFromRelativePath(relativePath, function (err, fileInfo) {
+ if (err) {
+ console.error("Failed to getFileInfoFromRelativePath in async, errCode:" + err.code + ", errMessage:" + err.message);
+ return;
+ }
+ console.log("getFileInfoFromRelativePath success, fileInfo: " + JSON.stringify(fileInfo));
+ });
+ } catch (error) {
+ console.error("getFileInfoFromRelativePath failed, errCode:" + error.code + ", errMessage:" + error.message);
+ };
+ ```
+
+## FileAccessHelper.getThumbnail10+
+
+getThumbnail(uri: string, size: image.Size) : Promise<image.PixelMap>
+
+通过指定uri和尺寸获取媒体文件的Pixelmap对象,使用Promise异步回调。
+
+**系统能力**:SystemCapability.FileManagement.UserFileService
+
+**需要权限**:ohos.permission.FILE_ACCESS_MANAGER
+
+**参数:**
+
+| 参数名 | 类型 | 必填 | 说明 |
+| ------ | ----------------------------------- | ---- | ----------- |
+| uri | string | 是 | 媒体文件uri |
+| size | [image.Size](js-apis-image.md#size) | 是 | 缩略图尺寸 |
+
+**返回值:**
+
+| 类型 | 说明 |
+| :---------------------------- | :----------------- |
+| Promise<image.PixelMap> | 返回的Pixelmap对象 |
+
+**示例:**
+
+```js
+// 以媒体库uri为例
+// 示例代码targetUri表示Download目录下某个媒体文件(图片、音频、视频),该uri是对应的fileInfo中uri
+// 开发者应根据自己实际获取的uri进行开发
+let targetUri = "datashare:///media/image/100";
+let size = { width: 128, height: 128 };
+try {
+ // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
+ let pixelMap = await fileAccessHelper.getThumbnail(targetUri, size);
+ let imageInfo = await pixelMap.getImageInfo();
+ console.log("getThumbnail sucess, pixelMap.width: " + imageInfo.size.width);
+ console.log("getThumbnail sucess, pixelMap.height: " + imageInfo.size.height);
+} catch (error) {
+ console.error("getThumbnail failed, errCode:" + error.code + ", errMessage:" + error.message);
+};
+```
+
+## FileAccessHelper.getThumbnail10+
+
+ getThumbnail(uri: string, size: image.Size, callback: AsyncCallback<image.PixelMap>) : void
+
+通过指定uri和尺寸获取媒体文件的Pixelmap对象,使用callback异步回调。
+
+**系统能力**:SystemCapability.FileManagement.UserFileService
+
+**需要权限**:ohos.permission.FILE_ACCESS_MANAGER
+
+**参数:**
+
+| 参数名 | 类型 | 必填 | 说明 |
+| -------- | ----------------------------------- | ---- | ------------------ |
+| uri | string | 是 | 媒体文件uri |
+| size | [image.Size](js-apis-image.md#size) | 是 | 缩略图尺寸 |
+| callback | AsyncCallback<image.PixelMap> | 是 | 返回的Pixelmap对象 |
+
+**示例:**
+
+```js
+// 以媒体库uri为例
+// 示例代码targetUri表示Download目录下某个媒体文件(图片、音频、视频),该uri是对应的fileInfo中uri
+// 开发者应根据自己实际获取的uri进行开发
+let targetUri = "datashare:///media/image/100";
+let size = { width: 128, height: 128 };
+try {
+ // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
+ fileAccessHelper.getThumbnail(targetUri, size, async(err, pixelMap) => {
+ if (err) {
+ console.error("Failed to getThumbnail in async, errCode:" + err.code + ", errMessage:" + err.message);
+ return;
+ }
+ let imageInfo = await pixelMap.getImageInfo();
+ console.log("getThumbnail sucess, pixelMap.width: " + imageInfo.size.width);
+ console.log("getThumbnail sucess, pixelMap.height: " + imageInfo.size.height);
+ });
+} catch (error) {
+ console.error("getThumbnail failed, errCode:" + error.code + ", errMessage:" + error.message);
+};
+```
+
## RootIterator.next
next( ) : { value: RootInfo, done: boolean }
@@ -1063,6 +1299,7 @@ FileIterator表示文件夹的迭代器对象,可以通过next同步方法获
| ------ | ------ | -------- | ------ | -------- |
| deviceType | number | 是 | 否 |设备类型 |
| uri | string | 是 | 否 | 设备根目录Uri |
+| relativePath10+ | string | 是 | 否 | 根目录的相对路径 |
| displayName | string | 是 | 否 | 设备名称 |
| deviceFlags | number | 是 | 否 | 设备支持的能力 |
@@ -1079,6 +1316,7 @@ FileIterator表示文件夹的迭代器对象,可以通过next同步方法获
| 名称 | 类型 | 可读 | 可写 | 说明 |
| ------ | ------ | -------- | ------ | -------- |
| uri | string | 是 | 否 | 文件(夹)的uri |
+| relativePath10+ | string | 是 | 否 | 文件(夹)的相对路径 |
| fileName | string | 是 | 否 | 文件(夹)的名称 |
| mode | number | 是 | 否 | 文件(夹)的权限信息 |
| size | number | 是 | 否 | 文件(夹)的大小 |
diff --git a/zh-cn/application-dev/reference/apis/js-apis-http.md b/zh-cn/application-dev/reference/apis/js-apis-http.md
index 1cdf224165953ca89bc5d02298ff045a4f45b23c..c863823c195a7fdf57cc8a6592b8734b5de4b4eb 100644
--- a/zh-cn/application-dev/reference/apis/js-apis-http.md
+++ b/zh-cn/application-dev/reference/apis/js-apis-http.md
@@ -67,7 +67,7 @@ httpRequest.request(
## http.createHttp
-createHttp\(\): HttpRequest
+createHttp(): HttpRequest
创建一个HTTP请求,里面包括发起请求、中断请求、订阅/取消订阅HTTP Response Header事件。每一个HttpRequest对象对应一个HTTP请求。如需发起多个HTTP请求,须为每个HTTP请求创建对应HttpRequest对象。
@@ -88,11 +88,11 @@ let httpRequest = http.createHttp();
## HttpRequest
-HTTP请求任务。在调用HttpRequest的方法前,需要先通过[createHttp\(\)](#httpcreatehttp)创建一个任务。
+HTTP请求任务。在调用HttpRequest的方法前,需要先通过[createHttp()](#httpcreatehttp)创建一个任务。
### request
-request\(url: string, callback: AsyncCallback\\):void
+request(url: string, callback: AsyncCallback\):void
根据URL地址,发起HTTP网络请求,使用callback方式作为异步方法。
@@ -140,7 +140,7 @@ httpRequest.request("EXAMPLE_URL", (err, data) => {
### request
-request\(url: string, options: HttpRequestOptions, callback: AsyncCallback\\):void
+request(url: string, options: HttpRequestOptions, callback: AsyncCallback\):void
根据URL地址和相关配置项,发起HTTP网络请求,使用callback方式作为异步方法。
@@ -223,7 +223,7 @@ httpRequest.request("EXAMPLE_URL",
### request
-request\(url: string, options? : HttpRequestOptions\): Promise\
+request(url: string, options? : HttpRequestOptions): Promise\
根据URL地址,发起HTTP网络请求,使用Promise方式作为异步方法。
@@ -309,7 +309,7 @@ promise.then((data) => {
### destroy
-destroy\(\): void
+destroy(): void
中断请求任务。
@@ -323,7 +323,7 @@ httpRequest.destroy();
### request210+
-request2(url: string, callback: AsyncCallback): void
+request2(url: string, callback: AsyncCallback\): void
根据URL地址和相关配置项,发起HTTP网络请求并返回流式响应,使用callback方式作为异步方法。
@@ -359,7 +359,7 @@ request2(url: string, callback: AsyncCallback): void
```js
httpRequest.request2("EXAMPLE_URL", (err) => {
if (!err) {
- console.info(request2 OK!);
+ console.info("request2 OK!");
} else {
console.info("request2 ERROR : err = " + JSON.stringify(err));
}
@@ -368,7 +368,7 @@ httpRequest.request2("EXAMPLE_URL", (err) => {
### request210+
-request2(url: string, options: HttpRequestOptions, callback: AsyncCallback): void
+request2(url: string, options: HttpRequestOptions, callback: AsyncCallback\): void
根据URL地址和相关配置项,发起HTTP网络请求并返回流式响应,使用callback方式作为异步方法。
@@ -437,7 +437,7 @@ httpRequest.request2("EXAMPLE_URL",
connectTimeout: 60000
}, (err) => {
if (!err) {
- console.info(request2 OK!);
+ console.info("request2 OK!");
} else {
console.info("request2 ERROR : err = " + JSON.stringify(err));
}
@@ -445,7 +445,7 @@ httpRequest.request2("EXAMPLE_URL",
```
### request210+
-request2\(url: string, options? : HttpRequestOptions\): Promise\
+request2(url: string, options? : HttpRequestOptions): Promise\
根据URL地址,发起HTTP网络请求并返回流式响应,使用Promise方式作为异步方法。
@@ -518,20 +518,20 @@ let promise = httpRequest.request("EXAMPLE_URL", {
}
});
promise.then(() => {
- console.info(request2 OK!);
+ console.info("request2 OK!");
}).catch((err) => {
console.info("request2 ERROR : err = " + JSON.stringify(err));
});
```
-### on\('headerReceive'\)
+### on('headerReceive')
-on\(type: 'headerReceive', callback: AsyncCallback