From 0127408e1af1e7601aa66906294e548f7ca56b43 Mon Sep 17 00:00:00 2001 From: jiaoyuens Date: Tue, 22 Feb 2022 14:19:57 +0800 Subject: [PATCH 001/282] delete install zlib* issue:https://gitee.com/openharmony/docs/issues/I4SIO3 Signed-off-by: jiaoyuens --- .../quick-start/quickstart-lite-package-environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-package-environment.md b/zh-cn/device-dev/quick-start/quickstart-lite-package-environment.md index dfbbfd4a90a..afd8bf414e2 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-package-environment.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-package-environment.md @@ -17,7 +17,7 @@ 使用如下apt-get命令安装编译所需的必要的库和工具: ``` -sudo apt-get install build-essential gcc g++ make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils gcc-arm-linux-gnueabi cpio device-tree-compiler +sudo apt-get install build-essential gcc g++ make libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils gcc-arm-linux-gnueabi cpio device-tree-compiler ``` ## 安装hb -- Gitee From 53cf91ca92020f67d9169448178c5cc65dce84f0 Mon Sep 17 00:00:00 2001 From: zhanghongchuan33 Date: Fri, 25 Feb 2022 14:24:30 +0800 Subject: [PATCH 002/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9div=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhanghongchuan33 --- .../reference/arkui-js/js-components-container-div.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md index 63a626f9d7d..254ac1cc82a 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md @@ -287,7 +287,7 @@

ScrollOffset

获取元素内容的滚动偏移。

-
说明:
  • 需要设置overflow样式为scroll。
+
说明:
  • 需要设置overflow样式为scroll,默认滚动方向与容器方向一致。
-- Gitee From 1d15a82c85b745aabc98c41e7f111b191a7c5b48 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Thu, 24 Feb 2022 20:34:26 +0800 Subject: [PATCH 003/282] add medialibrary Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 1385 +++++++++++++++++ 1 file changed, 1385 insertions(+) create mode 100644 zh-cn/application-dev/reference/apis/js-apis-medialibrary.md diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md new file mode 100644 index 00000000000..26e3b530eaf --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -0,0 +1,1385 @@ +媒体库管理 +========== + + 导入模块 +--------- + +``` +import medialibrary from '@ohos.multimedia.medialibrary'; +``` + +权限 +---- + +- ohos.permission.MEDIA_LOCATION +- ohos.permission.MEDIA_READ +- ohos.permission.MEDIA_WRITE + + +## getMediaLibrary +--------------- + +function getMediaLibrary(context: Context): MediaLibrary; + +获取媒体库。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------- | ---- | -------------------- | +| context | Context | 是 | API 8接口此参数是必填参数,传入context,获取媒体库 | + +**返回值:** + +| 类型 | 说明 | +| ------------ | :----- | +| MediaLibrary | 媒体库实例 | + +**示例:** + +``` +var media = mediaLibrary.getMediaLibrary(context); +``` + +## medialibrary.getFileAssets + + +getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; + +获取文件资源,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------------- | ---- | ----------------------------------- | +| options | MediaFetchOptions | 是 | 媒体获取选项。 | +| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步获取FetchFileResult之后的回调。 | + +**示例:** + +``` +medialibrary.getFileAssets(fetchOp, (error, data) => { + // do something + }); +``` +## medialibrary.getFileAssets + +getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; + +获取文件资源,使用Promise方式返回结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------- | ---- | -------------- | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项。 | + +**返回值** + +| 类型 | 说明 | +| -------------------------------------------- | ---------------- | +| [FetchFileResult](#FetchFileResult.getCount) | 媒体数据结果集。 | + +**示例:** + +``` +let fetchFileResult = await medialibrary.getFileAssets(fileNoArgsfetchOp); +``` + +## medialibrary.on + +on(type: 'Device'|'Album'| 'SmartAlbum'|'Image'|'Audio'|'Video'|'File'| 'Remote file', callback: () => {}): void; + +打开媒体文件变更和上线通知,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------- | ---- | ------------------- | +| type | type | 是 | 媒体类型。 | +| callback | AsyncCallback<void> | 是 | 回调返回空。 | + +**示例:** + +``` +medialibrary.on(['image','video','audio'], () => { + this.sendNotify('image'); +}) +``` +## medialibrary.off + +off(type: 'Device'|'Album'| 'SmartAlbum'|'Image'|'Audio'|'Video'|'File'| 'Remote file', callback?: () => {}): void; + +关闭媒体文件变更和设备上线通知,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------- | ---- | ------------------- | +| type | type | 是 | 媒体类型。 | +| callback | AsyncCallback<void> | 是 | 回调返回空。 | + +**示例:** + +``` +medialibrary.off(['image','video','audio'], () => { + this.sendNotify('image'); +}) +``` + +## medialibrary.createAsset + +createAsset(mediaType: MediaType, displayName: string, relativePath: string, callback: AsyncCallback<FileAsset>): void; + +创建媒体资源,使用callback方式返回结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | -------------------------------------- | ---- | ------------------------------------- | +| mediaType | [MediaType](#MediaType) | 是 | 媒体类型。 | +| displayName | string | 是 | 展示文件名。 | +| relativePath | string | 是 | 相对路径。 | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取媒体数据FileAsset之后的回调。 | + +**示例:** + +``` +medialibrary.createAsset(mediaType, displayName, rp, (createAssetErr, fileObj) => { + // do something + }); +``` + +## medialibrary.createAsset + +createAsset(mediaType: MediaType, displayName: string, relativePath: string): Promise<FileAsset>; + +创建媒体资源,使用Promise方式返回结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | ----------------------- | ---- | ------------ | +| mediaType | [MediaType](#MediaType) | 是 | 媒体类型。 | +| displayName | string | 是 | 展示文件名。 | +| relativePath | string | 是 | 相对路径。 | + +**返回值** + +| 类型 | 说明 | +| ----------------------- | ----------------- | +| [FileAsset](#FileAsset) | 媒体数据FileAsset | + +**示例:** + +``` +asset = await medialibrary.createAsset(mediaType, "image01.jpg", path); +``` + +## medialibrary.deleteAsset + +deleteAsset(uri: string, callback: AsyncCallback<void>): void; + +删除媒体资源,使用callback方式返回结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ---------------------- | +| uri | string | 是 | 文件uri。 | +| callback | AsyncCallback<void> | 是 | 回调返回空。 | + +**示例:** + +``` +medialibrary.deleteAsset(fileAsset.uri, (deleteAssetErr, deleteRows) => { + // do something + }); +``` + +## medialibrary.deleteAsset + +deleteAsset(uri: string): Promise<void>; + +删除媒体资源,使用promise方式返回结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | --------- | +| uri | string | 是 | 文件uri。 | + +**返回值:** + +| 类型 | 说明 | +| ------------- | ------------------------------------------------- | +| Promise<void> | Promise实例,用于异步获取结果。本调用将返回空值。 | + +**示例:** + +``` +await medialibrary.deleteAsset(asset.uri); +``` + +## medialibrary.getAlbums + +getAlbums(options: MediaFetchOptions, callback: AsyncCallback): void; + +获取实体相册,使用callback 方式返回结果。 + +**参数** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ----------------------------- | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体文件获取条件。 | +| callback | AsyncCallback<Array<[Album](#Album)>> | 是 | 异步获取Album列表之后的回调。 | + +**示例:** + +``` +medialibrary.getAlbums(AlbumNoArgsfetchOp, getAlbumsCallBack); +``` + +## medialibrary.getAlbums + +getAlbums(options: MediaFetchOptions): Promise; + +获取实体相册,使用 promise 方式返回结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------- | ---- | ------------------ | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体文件获取条件。 | + +**返回值:** + +| 类型 | 说明 | +| ------------------------------- | ------------- | +| Promise> | 返回Album列表 | + +**示例:** + +``` +let albumList = await medialibrary.getAlbums(AlbumNoArgsfetchOp); +``` + +## medialibrary.getActivePeers + +getActivePeers(callback: AsyncCallback): void; + +获取活动对端设备 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------ | ---- | ---------------------- | +| callback | AsyncCallback> | 是 | 回调表示成功还是失败。 | + +**示例:** + +``` +medialibrary.getActivePeers((err, data) => { + // do something + }); +``` + +## medialibrary.getActivePeers + +getActivePeers(): Promise; + +获取活动对端设备 + +**参数:** + +返回值: + +| 类型 | 说明 | +| ------------------------------------- | ----------------------------------- | +| Promise> | Promise实例,用于获取异步返回结果。 | + +**示例:** + +``` +peerInfoList = medialibrary.getActivePeers(); +``` + +## medialibrary.getAllPeers + +getAllPeers(callback: AsyncCallback): void; + +获取所有对端设备 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------ | ---- | ---------------------- | +| callback | AsyncCallback> | 是 | 回调表示成功还是失败。 | + +**示例:** + +``` +medialibrary.getAllPeers((err, data) => { + // do something + }); +``` + +## medialibrary.getAllPeers + +getAllPeers(): Promise; + +获取所有对端设备 + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------- | ----------------------------------- | +| Promise> | Promise实例,用于获取异步返回结果。 | + +**示例:** + +peerInfoList = media.getAllPeers(); + +## medialibrary.release + +release(callback: AsyncCallback<void>): void; + +释放MediaLibrary实例 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ---------------------- | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | + +**示例:** + +``` +medialibrary.release((err, data) => { + // do something + }); +``` + +## medialibrary.release + +release(): Promise<void>; + +释放MediaLibrary实例 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------------- | +| Promise<void> | Promise实例,用于获取异步返回结果。 | + +**示例:** + +``` +medialibrary.release() +``` + + + + + +## FileAsset.isDirectory + +isDirectory(callback: AsyncCallback<boolean>): void; + +判断fileAsset是否为目录,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ----------------------------- | +| callback | AsyncCallback<boolean> | 是 | 当前FileAsset是否是目录的回调 | + +**示例:** + +``` +asset.isDirectory((err, isDirectory) => { + // do something + }); +``` + +## FileAsset.isDirectory + +isDirectory():Promise<boolean>; + +判断fileAsset是否为目录,使用Promise方式返回异步结果。 + +**返回值:** + +| 类型 | 说明 | +| ---------------- | ------------------------------------------ | +| Promise<boolean> | Promise实例,返回当前FileAsset是否是目录。 | + +**示例:** + +``` +let isDirectory = await asset.isDirectory(); +``` + +## FileAsset.commitModify + +commitModify(callback: AsyncCallback<void>): void; + +修改文件的元数据,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| callback | AsyncCallback<void> | 是 | 回调返回空 | + +**示例:** + +``` +await asset.commitModify(); +``` + +## FileAsset.commitModify + +commitModify(): Promise<void>; + +修改文件的元数据,使用promise方式返回异步结果。 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<void> | Promise返回空。 | + +**示例:** + +``` +asset.commitModify(commitModifyCallBack); +function commitModifyCallBack(err, commitModify) { + // do something + + } +``` + +## FileAsset.open + +open(mode: string, callback: AsyncCallback<number>): void; + +打开当前文件,使用callback方式返回异步结果。 + +**参数** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| mode | string | 是 | 打开文件方式 | +| callback | AsyncCallback<number> | 是 | 回调返回文件句柄 | + +**示例:** + +``` +asset.open('Rw').then((openError, fd) => { + // do something + } +``` + +## FileAsset.open + +open(mode: string): Promise<number>; + +打开当前文件,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------ | +| mode | string | 是 | 打开文件方式 | + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<number> | Promise返回文件句柄。 | + +**示例:** + +``` +asset.open('Rw').then((openError, fd) => { + // do something + } +``` + +## FileAsset.close + +close(fd: number, callback: AsyncCallback<void>): void; + +关闭当前文件,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| fd | number | 是 | 文件描述符 | +| callback | AsyncCallback<void> | 是 | 回调返回空 | + +**示例:** + +``` +fileAsset.close(fd).then((closeErr) => { + // do something + } +``` + +## FileAsset.close + +close(fd: number): Promise<void>; + +关闭当前文件,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ---------- | +| fd | number | 是 | 文件描述符 | + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<void> | Promise返回空。 | + +**示例:** + +``` +fileAsset.close(fd).then((closeErr) => { + // do something + } +``` + +## FileAsset.getThumbnail + +getThumbnail(callback: AsyncCallback<image.PixelMap>): void; + +获取文件的缩略图,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| callback | AsyncCallback<image.PixelMap> | 是 | 回调返回缩略图的PixelMap | + +**示例:** + +``` +data1.getThumbnail(size, (err2, pixelmap) => { + console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); +``` + +## FileAsset.getThumbnail + +getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; + +获取文件的缩略图,传入缩略图尺寸,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| size | [Size](#Size) | 是 | 缩略图尺寸 | +| callback | AsyncCallback<image.PixelMap> | 是 | 回调返回缩略图的PixelMap | + +**示例:** + +``` +data1.getThumbnail(size, (err2, pixelmap) => { + console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); +``` + +## FileAsset.getThumbnail + +getThumbnail(size?: Size): Promise<image.PixelMap>; + +获取文件的缩略图,传入缩略图尺寸,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------- | ---- | ---------- | +| size | [Size](#Size) | 否 | 缩略图尺寸 | + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<image.PixelMap> | Promise返回缩略图的PixelMap。 | + +**示例:** + +``` +data1.getThumbnail(size, (err2, pixelmap) => { + console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); +``` + +## FileAsset.favorite + +favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; + +将文件设置为收藏文件,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------------------- | ---- | -------------- | +| isFavorite | boolean | 是 | 是否为收藏文件 | +| callback | AsyncCallback<void> | 是 | 回调返回空 | + +**示例:** + +``` +await asset.favorite(true); +``` + +## FileAsset.favorite + +favorite(isFavorite: boolean): Promise<void>; + +将文件设置为收藏文件,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------- | ---- | -------------- | +| isFavorite | boolean | 是 | 是否为收藏文件 | + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<void> | Promise返回空。 | + +**示例:** + +``` +await asset.favorite(true); +``` + +## FileAsset.isFavorite + +isFavorite(callback: AsyncCallback<boolean>): void; + +判断该文件是否为收藏文件,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ---------------------- | +| callback | AsyncCallback<boolean> | 是 | 回调表示是否为收藏文件 | + +**示例:** + +``` +asset.favorite(true, (err) => { + // do something + }); +``` + +## FileAsset.isFavorite + +isFavorite():Promise<boolean>; + +判断该文件是否为收藏文件,使用promise方式返回异步结果。 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<boolean> | Promise回调表示是否是收藏文件。 | + +**示例:** + +``` +let isFavorite = await asset.isFavorite(); +``` + +## FileAsset.trash + +trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; + +当文件被定位时,将文件放到垃圾文件夹,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| isTrash | boolean | 是 | 是否为收藏文件 | +| callback | AsyncCallback<void> | 是 | 回调返回空 | + +**示例:** + +``` +asset.trash(true, (err) => { + // do something + }); +``` + +## FileAsset.trash + +trash(isTrash: boolean,): Promise<void>; + +当文件被定位时,将文件放到垃圾文件夹,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------- | ---- | -------------- | +| isTrash | boolean | 是 | 是否放入回收站 | + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<void> | Promise返回空。 | + +**示例:** + +``` +await asset.trash(true); +``` + +## FileAsset.isTrash + +isTrash(callback: AsyncCallback<boolean>): void; + +当文件被定位,判断文件是否为垃圾文件,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| callback | AsyncCallback<boolean> | 是 | 回调返回表示文件是否为垃圾文件 | + +**示例:** + +``` +asset.isTrash((err, isTrash) => { + // do something + }); +``` + +## FileAsset.isTrash + +isTrash():Promise<boolean>; + +当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ----------------------------- | +| Promise<void> | Promise回调表示文件是否为垃圾文件。 | + +**示例:** + +``` +let isTrash = await asset.isTrash(); +``` + +**FetchFileResult** + +文件检索结果集。 + +## FetchFileResult.getCount + +getCount(): number; + +获取文件检索结果中的文件总数。 + +**返回值**: + +| 类型 | 说明 | +| ------ | ------------------ | +| number | 检索到的文件总数。 | + +**示例**: + +``` +var resultnum = FetchFileResult.getCount(); +``` + +## FetchFileResult.isAfterLast + +isAfterLast(): boolean; + +检查结果集是否指向最后一行。 + +**返回值**: + +| 类型 | 说明 | +| ------- | ------------------------------------------------------------ | +| boolean | 当读到最后一条记录后,再继续读就到结果集尾了,没有记录了,执行isAfterLast()方法就返回true,否则返回false。 | + +**示例**: + +``` +var result = FetchFileResult.isAfterLast(); +``` + +## FetchFileResult.close + +close(): void; + +释放 FetchFileResult 实例并使其失效。无法调用其他方法。 + +**示例**: + +``` +var result = FetchFileResult.close(); +``` + +## FetchFileResult.getFirstObject + +getFirstObject(callback: AsyncCallback<FileAsset>): void; + +获取文件检索结果中的第一个文件资产。此方法使用回调返回FileAsset。 + +**参数**: + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | --------------------------------------------- | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取结果集中第一个FileAsset完成后的回调。 | + +**示例**: + +``` +data.getFirstObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); +}) +``` + +## FetchFileResult.getFirstObject + +getFirstObject(): Promise<FileAsset>; + +获取文件检索结果中的第一个文件资产。此方法使用返回FileAsset。 + +**返回值**: + +| 类型 | 说明 | +| ------------------ | -------------------------------------- | +| Promise<[FileAsset](#FileAsset)> | Promise方式返回FileAsset | + + +**示例**: + +``` +const fileAsset = await queryResultSet_.getFirstObject(); +}) +``` + +## FetchFileResult.getNextObject + + getNextObject(callback: AsyncCallback<FileAsset>): void; + +获取文件检索结果中的下一个文件资产。此方法使用callback形式返回结果。 + +**参数**: + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | -------------------------------------- | ---- | ------------------------------------------- | +| callbacke | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回结果集中下一个FileAsset之后的回调。 | + +**示例**: + +``` +data.getNextObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); +}) +``` + +## FetchFileResult.getNextObject + + getNextObject(): Promise<FileAsset>; + +获取文件检索结果中的下一个文件资产。此方法使用promise方式来异步返回FileAsset。 + +**返回值**: + +| 类型 | 说明 | +| -------------------------------- | ------------------- | +| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象。 | + +**示例**: + +``` +var result = FetchFileResult.getNextObject +``` + +## FetchFileResult.getLastObject + +getLastObject(callback: AsyncCallback<FileAsset>): void; + +获取文件检索结果中的最后一个文件资产。此方法使用callback回调来返回FileAsset。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | ----------------------------- | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调。 | + +**示例**: + +``` +data.getLastObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); +}) +``` + + + +## FetchFileResult.getLastObject + +getLastObject(): Promise<FileAsset>; + +获取文件检索结果中的最后一个文件资产。此方法使用Promise方式来返回FileAsset。 + +**返回值**: + +| 类型 | 说明 | +| -------------------------------- | ------------------- | +| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象。 | + +**示例**: + +``` +var result = FetchFileResult.getLastObject() +``` + +## FetchFileResult.getPositionObject + +getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void; + +获取文件检索结果中具有指定索引的文件资产。此方法使用回调来返回FileAsset。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | ----------------------------- | +| index | number | 是 | 要获取的文件的索引。 | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调。 | + +**示例**: + +``` +data. getPositionObject(1,(err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); +}) +``` + +## FetchFileResult.getPositionObject + +getPositionObject(index: number): Promise<FileAsset>; + +获取文件检索结果中具有指定索引的文件资产。此方法使用Promise形式返回文件Asset。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| ----- | ------ | ---- | -------------------- | +| index | number | 是 | 要获取的文件在结果集中的位置。 | + +**返回值**: + +| 类型 | 说明 | +| -------------------------------- | ------------------- | +| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象。 | + +**示例**: + +``` +data.getPositionObject(1,(err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); +}) +``` + +## FetchFileResult.getAllObject + +getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; + +获取文件检索结果中的所有文件资产。此方法使用Callback回调来返回FileAsset结果集。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------- | ---- | --------------------------------- | +| callback | AsyncCallback> | 是 | 异步返回FileAsset列表之后的回调。 | + +**示例**: + +``` +data.getAllObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); +}) +``` + +## FetchFileResult.getAllObject + +getAllObject(): Promise<Array<FileAsset>>; + +获取文件检索结果中的所有文件资产。此方法使用Promise来返回FileAsset结果集。 + +**返回值**: + +| 类型 | 说明 | +| --------------------------------------- | ----------------------- | +| Promise> | 返回FileAsset对象列表。 | + +**示例**: + +``` +var data = FetchFileResult.getAllObject(); +``` + + + + + +## Album.commitModify + +commitModify(callback: AsyncCallback<void>): void; + +更新相册属性修改到数据库中。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ----------------------------- | +| callback | AsyncCallback<void> | 是 | 回调返回空 | + +**示例**: + +``` +album.albumName = 'hello'; +album.commitModify((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); +}) +``` + +## Album.commitModify + +commitModify(): Promise<void>; + +更新相册属性修改到数据库中。 + +**返回值**: + +| 类型 | 说明 | +| ------------- | ---------------------------------------------------- | +| Promise<void> | Promise调用返回空 | + +**示例**: + +``` +album.albumName = 'hello'; +await album.commitModify(); +``` + +## Album.getFileAssets + +getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; + +按照检索条件获取相册中的文件。此方法使用Callback回调来返回文件结果集。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------------- | ---- | ----------------------------------- | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项。 | +| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步返回FetchFileResult之后的回调。 | + +**示例**: + +``` +album.getFileAssets(fileNoArgsfetchOp, getFileAssetsCallBack); +}) +function getFileAssetsCallBack(err, fetchFileResult) { + // do something +} +``` + +## Album.getFileAssets + + getFileAssets(options?: MediaFetchOptions): Promise<FetchFileResult>; + +按照检索条件获取相册中的文件。此方法使用异步回调来返回文件结果集。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------- | ---- | -------------- | +| options | [MediaFetchOptions](#MediaFetchOptions) | 否 | 媒体检索选项。 | + +**返回值**: + +| 类型 | 说明 | +| ----------------------------------------------------- | ------------------------- | +| Promise<[FetchFileResult](#FetchFileResult.getCount)> | 返回FetchFileResult对象。 | + +**示例**: + +``` +let albumFetchFileResult = await album.getFileAssets(fileNoArgsfetchOp); +``` + + + + + +## SmartAlbum.getFileAssets + +getFileAssets(callback: AsyncCallback<FetchFileResult>): void; + +获取智能相册中的文件资源 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +| ------- | ----------------- | ---- | -------------- | +| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步返回FetchFileResult之后的回调。 | + +**示例**: + +``` +favSmartAlbum.getFileAssets(getFileAssetsCallBack); +function getFileAssetsCallBack(err, fSmartFetchFileResult) { + // do something + } +``` + +## SmartAlbum.getFileAssets + +getFileAssets(): Promise<FetchFileResult>; + +获取智能相册中的文件资源 + +**返回值**: + +| 类型 | 说明 | +| ----------------------------------------------------- | ----------------------- | +| Promise<[FetchFileResult](#FetchFileResult.getCount)> | 返回FetchFileResult对象 | + +**示例**: + +``` + let fSmartFetchFileResult = await favSmartAlbum.getFileAssets(); +``` + + + +FileAsset +--------- + +**属性:** + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------ | --------- | ---- | ---- | ------------ | +| id | number | 是 | 否 | 文件资源编号 | +| uri | string | 是 | 否 | 文件资源uri | +| mimeType | string | 是 | 否 | 文件扩展 | +| mediaType | MediaType | 是 | 否 | 媒体类型 | +| displayName | string | 是 | 是 | 显示文件名 | +| title | string | 是 | 是 | 文件标题 | +| relativePath | string | 是 | 是 | 相对路径 | +| parent | number | 是 | 否 | 父目录id | +| size | number | 是 | 否 | 文件大小 | +| dateAdded | number | 是 | 否 | 添加日期 | +| dateModified | number | 是 | 否 | 修改日期 | +| dateTaken | number | 是 | 否 | 拍摄日期 | +| artist | string | 是 | 否 | 创建者 | +| audioAlbum | string | 是 | 否 | 音频相册 | +| width | number | 是 | 否 | 图片宽度 | +| height | number | 是 | 否 | 图片高度 | +| orientation | number | 是 | 是 | 图片方向 | +| duration | number | 是 | 否 | 持续时间 | +| albumId | number | 是 | 否 | 相册编号 | +| albumUri | string | 是 | 否 | 相册uri | +| albumName | string | 是 | 否 | 相册名称 | + +Album +--------- +实体相册。 + +**属性** + +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| ------------ | ------ | ---- | ---- | -------------- | +| albumId | number | 是 | 否 | 相册ID | +| albumName | string | 是 | 是 | 相册名 | +| albumUri | string | 是 | 否 | 相册Uri | +| dateModified | number | 是 | 否 | 修改日期 | +| count | number | 是 | 否 | 相册中文件数量 | +| relativePath | string | 是 | 否 | 相对路径 | +| coverUri | string | 是 | 否 | 封面文件Uri | + +SmartAlbum +--------- + +智能相册 + +**属性:** + +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| ------------- | ------ | ---- | ---- | ------------- | +| albumName | string | 是 | 是 | 相册名。 | +| albumUri | string | 是 | 否 | 相册目录。 | +| albumTag | string | 是 | 是 | 相册标签。 | +| albumCapacity | number | 是 | 否 | 相册容量。 | +| categoryId | number | 是 | 否 | 相册分类ID。 | +| categoryName | strign | 是 | 否 | 相册分类名。 | +| coverUri | string | 是 | 否 | 封面文件uri。 | + + + +MediaType +--------- + +枚举,媒体类型。 + +| 名称 | 默认值 | 描述 | +| ----- | ------ | ------ | +| FILE | 0 | 文件。 | +| IMAGE | 1 | 图片。 | +| VIDEO | 2 | 视频。 | +| AUDIO | 3 | 音频。 | + +FileKey +------- + +枚举,文件关键信息。 + +| 名称 | 默认值 | 可读 | 可写 | 描述 | +| ------------- | ------------------- | ---- | ---- | -------------------- | +| ID | file_id | 是 | 否 | 文件编号。 | +| RELATIVE_PATH | relative_path | 是 | 是 | 相对路径。 | +| DISPLAY_NAME | display_name | 是 | 是 | 显示名字。 | +| PARENT | parent | 是 | 否 | 父目录。 | +| MIME_TYPE | mime_type | 是 | 否 | 该资源的媒体类型。 | +| MEDIA_TYPE | media_type | 是 | 否 | 媒体类型。 | +| SIZE | size | 是 | 否 | 文件大小。 | +| DATE_ADDED | date_added | 是 | 否 | 添加日期。 | +| DATE_MODIFIED | date_modified | 是 | 否 | 修改日期。 | +| DATE_TAKEN | date_taken | 是 | 否 | 表示拍摄日期 | +| TITLE | title | 是 | 是 | 表示标题 | +| ARTIST | artist | 是 | 否 | 创建者。 | +| AUDIOALBUM | audio_album | 是 | 否 | 表示音频相册。 | +| DURATION | duration | 是 | 否 | 表示媒体文件时长 | +| WIDTH | width | 是 | 否 | 表示图片宽。 | +| HEIGHT | height | 是 | 否 | 表示图片高。 | +| ORIENTATION | orientation | 是 | 否 | 图片显示方向。 | +| ALBUM_ID | bucket_id | 是 | 否 | 媒体文件所在相册ID。 | +| ALBUM_NAME | bucket_display_name | 是 | 否 | 媒体文件所在相册名。 | + +DirectoryType +------------- + +枚举,目录类型。 + +| 名称 | 默认值 | 描述 | +| ---------------------- | ------ | ------------------ | +| DIR_CDSA | 0 | 表示CDSA规范路径。 | +| DIR_VIDEO | 1 | 表示视频路径。 | +| DIR_IMAGE | 2 | 表示图片路径。 | +| DIR_AUDIO | 3 | 表示音频路径。 | +| DIR_AUDIO_RINGS | 4 | 表示铃声音频路径。 | +| DIR_AUDIO_NOTICE | 5 | 表示提示音频路径。 | +| DIR_AUDIO_CLOCK | 6 | 表示时钟音频路径。 | +| DIR_DOCUMENTS | 7 | 表示文档路径。 | +| DIR_DOWNLOAD | 8 | 表示下载路径。 | +| DIR_DOWNLOAD_BLUETOOTH | 9 | 表示蓝牙下载路径。 | + +PrivateAlbumType +----------------- + +枚举,智能相册类型。 + +| 名称 | 默认值 | 描述 | +| ------------- | ------ | -------------------- | +| TYPE_FAVORITE | 0 | 表示收藏文件类型。 | +| TYPE_TRASH | 1 | 表示回收站文件类型。 | + +DeviceType +----------- + +枚举,设备类型。 + +| 名称 | 默认值 | 描述 | +| ------------ | ------ | ------------ | +| TYPE_UNKNOWN | 0 | 未识别设备。 | +| TYPE_LAPTOP | 1 | 笔记本电脑。 | +| TYPE_PHONE | 2 | 手机。 | +| TYPE_TABLET | 3 | 平板电脑。 | +| TYPE_WATCH | 4 | 智能手表。 | +| TYPE_CAR | 5 | 车载设备。 | +| TYPE_TV | 6 | 电视设备。 | + +## MediaFetchOptions + +检索条件。 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------- | ------------- | ---- | ---- | ---------------- | +| selections | string | 是 | 是 | 检索条件 | +| selectionArgs | Array | 是 | 是 | 检索条件的值 | +| order | string | 是 | 是 | 检索结果排序方式 | +| uri | string | 是 | 是 | 文件URI | +| networkId | string | 是 | 是 | 对端设备网络ID | +| extendArgs | string | 是 | 是 | 扩展的检索参数 | + + + +## PeerInfo + +对端设备信息。 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ---------- | ---------- | ---- | ---- | -------------- | +| deviceName | string | 是 | 否 | 设备名称 | +| networkId | string | 是 | 否 | 对端设备网络ID | +| deviceType | DeviceType | 是 | 否 | 设备类型 | +| isOnline | boolean | 是 | 否 | 是否在线 | + + + +## Size + +图片尺寸。 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------ | ------ | ---- | ---- | ---- | +| width | number | 是 | 是 | 宽 | +| height | number | 是 | 是 | 高 | -- Gitee From ea524e4c973cc4f2b40f189ba6468a69762066b3 Mon Sep 17 00:00:00 2001 From: wangyanhandsome Date: Sat, 26 Feb 2022 11:09:08 +0800 Subject: [PATCH 004/282] modify the link Signed-off-by: wangyanhandsome --- .../reference/apis/js-apis-bluetooth.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-bluetooth.md b/zh-cn/application-dev/reference/apis/js-apis-bluetooth.md index 631329ebb32..4a21a3d900e 100755 --- a/zh-cn/application-dev/reference/apis/js-apis-bluetooth.md +++ b/zh-cn/application-dev/reference/apis/js-apis-bluetooth.md @@ -239,7 +239,7 @@ getRemoteDeviceClass(deviceId: string): DeviceClass | 类型 | 说明 | | -------- | -------- | -| [DeviceClass](#DeviceClass) | 远程设备的类别。 | +| [DeviceClass](#deviceclass) | 远程设备的类别。 | **示例:** @@ -1982,7 +1982,7 @@ if (retWriteDesc) { setBLEMtuSize(mtu: number): boolean -client协商远端蓝牙低功耗设备的最大传输单元(Maximum Transmission Unit, MTU),调用connect接口连接成功后才能使用。 +client协商远端蓝牙低功耗设备的最大传输单元(Maximum Transmission Unit, MTU),调用[connect](#connect)接口连接成功后才能使用。 **参数:** @@ -2196,7 +2196,7 @@ let deviceName = gattClient.getDeviceName().then((data) => { getRssiValue(callback: AsyncCallback<number>): void -client获取远端蓝牙低功耗设备的信号强度 (Received Signal Strength Indication, RSSI),调用[connect](#connect-boolean)接口连接成功后才能使用。 +client获取远端蓝牙低功耗设备的信号强度 (Received Signal Strength Indication, RSSI),调用[connect](#connect)接口连接成功后才能使用。 **参数:** @@ -2225,7 +2225,7 @@ let rssi = gattClient.getRssiValue((err, data)=> { getRssiValue(): Promise<number> -client获取远端蓝牙低功耗设备的信号强度 (Received Signal Strength Indication, RSSI),调用[connect](#connect-boolean)接口连接成功后才能使用。 +client获取远端蓝牙低功耗设备的信号强度 (Received Signal Strength Indication, RSSI),调用[connect](#connect)接口连接成功后才能使用。 **返回值:** @@ -2277,7 +2277,7 @@ let rssi = gattClient.getRssiValue().then((data) => { | -------- | -------- | -------- | -------- | -------- | | uuid | string | 是 | 是 | spp单据的uuid。 | | isPrimary | boolean | 是 | 是 | 是否是安全通道。 | -| type | [SppType](#SppType) | 是 | 是 | Spp链路类型。 | +| type | [SppType](#spptype) | 是 | 是 | Spp链路类型。 | ## SppType @@ -2297,8 +2297,8 @@ let rssi = gattClient.getRssiValue().then((data) => { | -------- | -------- | -------- | -------- | -------- | | serviceUuid | string | 是 | 是 | 特定服务(service)的UUID,例如:00001888-0000-1000-8000-00805f9b34fb。 | | isPrimary | boolean | 是 | 是 | 如果是主服务设置为true,否则设置为false。 | -| characteristics | Array<[BLECharacteristic](#BLECharacteristic)> | 是 | 是 | 当前服务包含的特征列表。 | -| includeServices | Array<[GattService](#GattService)> | 是 | 是 | 当前服务依赖的其它服务。 | +| characteristics | Array<[BLECharacteristic](#blecharacteristic)> | 是 | 是 | 当前服务包含的特征列表。 | +| includeServices | Array<[GattService](#gattservice)> | 是 | 是 | 当前服务依赖的其它服务。 | ## BLECharacteristic @@ -2310,7 +2310,7 @@ let rssi = gattClient.getRssiValue().then((data) => { | serviceUuid | string | 是 | 是 | 特定服务(service)的UUID,例如:00001888-0000-1000-8000-00805f9b34fb。 | | characteristicUuid | string | 是 | 是 | 特定特征(characteristic)的UUID,例如:00002a11-0000-1000-8000-00805f9b34fb。 | | characteristicValue | ArrayBuffer | 是 | 是 | 特征对应的二进制值。 | -| descriptors | Array<[BLEDescriptor](#BLEDescriptor)> | 是 | 是 | 特定特征的描述符列表。 | +| descriptors | Array<[BLEDescriptor](#bledescriptor)> | 是 | 是 | 特定特征的描述符列表。 | ## BLEDescriptor @@ -2415,7 +2415,7 @@ let rssi = gattClient.getRssiValue().then((data) => { | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | | deviceId | string | 是 | 否 | 表示远端设备地址,例如:"XX:XX:XX:XX:XX:XX"。 | -| state | [ProfileConnectionState](#ProfileConnectionState) | 是 | 是 | 表示BLE连接状态的枚举。 | +| state | [ProfileConnectionState](#profileconnectionState) | 是 | 是 | 表示BLE连接状态的枚举。 | ## ProfileConnectionState @@ -2448,8 +2448,8 @@ let rssi = gattClient.getRssiValue().then((data) => { | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | | interval | number | 是 | 是 | 表示扫描结果上报延迟时间,默认值为0。 | -| dutyMode | [ScanDuty](#ScanDuty) | 是 | 是 | 表示扫描模式,默认值为SCAN_MODE_LOW_POWER。 | -| matchMode | [MatchMode](#MatchMode) | 是 | 是 | 表示硬件的过滤匹配模式,默认值为MATCH_MODE_AGGRESSIVE。 | +| dutyMode | [ScanDuty](#scanduty) | 是 | 是 | 表示扫描模式,默认值为SCAN_MODE_LOW_POWER。 | +| matchMode | [MatchMode](#matchmode) | 是 | 是 | 表示硬件的过滤匹配模式,默认值为MATCH_MODE_AGGRESSIVE。 | ## ScanDuty @@ -2517,8 +2517,8 @@ let rssi = gattClient.getRssiValue().then((data) => { | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | | serviceUuids | Array<string> | 是 | 是 | 表示要广播的服务 UUID 列表。 | -| manufactureData | Array<[ManufactureData](#ManufactureData)> | 是 | 是 | 表示要广播的广播的制造商信息列表。 | -| serviceData | Array<[ServiceData](#ServiceData)> | 是 | 是 | 表示要广播的服务数据列表。 | +| manufactureData | Array<[ManufactureData](#manufacturedata)> | 是 | 是 | 表示要广播的广播的制造商信息列表。 | +| serviceData | Array<[ServiceData](#servicedata)> | 是 | 是 | 表示要广播的服务数据列表。 | ## ManufactureData @@ -2557,8 +2557,8 @@ let rssi = gattClient.getRssiValue().then((data) => { | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| majorClass | [MajorClass](#MajorClass) | 是 | 否 | 表示蓝牙设备主要类别的枚举。 | -| majorMinorClass | [MajorMinorClass](#MajorMinorClass) | 是 | 否 | 表示主要次要蓝牙设备类别的枚举。 | +| majorClass | [MajorClass](#majorclass) | 是 | 否 | 表示蓝牙设备主要类别的枚举。 | +| majorMinorClass | [MajorMinorClass](#majorminorclass) | 是 | 否 | 表示主要次要蓝牙设备类别的枚举。 | | classOfDevice | number | 是 | 否 | 表示设备类别。 | -- Gitee From 71d38a1c4ccd04ce0330227d82e59b9aaef6145f Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Sat, 26 Feb 2022 17:58:06 +0800 Subject: [PATCH 005/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: Ie16eed96face8b77e2e2071e459f20a293c63ad5 --- .../figures/zh-cn_image_0000001164217678.png | Bin 11524 -> 0 bytes .../reference/apis/figures/zh-cn_image_url.png | Bin 0 -> 3683 bytes .../figures/zh-cn_image_url.png:Zone.Identifier | 3 +++ .../reference/apis/js-apis-media.md | 14 +++++++------- 4 files changed, 10 insertions(+), 7 deletions(-) delete mode 100644 zh-cn/application-dev/reference/apis/figures/zh-cn_image_0000001164217678.png create mode 100644 zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png create mode 100644 zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier diff --git a/zh-cn/application-dev/reference/apis/figures/zh-cn_image_0000001164217678.png b/zh-cn/application-dev/reference/apis/figures/zh-cn_image_0000001164217678.png deleted file mode 100644 index 1e2cc34bf20dcd27dc9dff6a3eb6eb56dd4809c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11524 zcmd72Wmp_t*EQIli;omA-D$(7TjGjJkLA# zch7fS^K<5!`BSHA@3T*>Q?l2owd<3nx&jU+IVJ!Az)@0^)dm0%K`;C7(NSNvm^YIR z001pONmfeN2jR#>ERM0M{&?#{B(g~X67%wDFBVIVYafPC+fQc;nTcL?!Ku{48&@0! z3eu>79@sS{dTIv>L=wql9bqgO&4-&ixsKP|91-OeYldrnL!2LL$^a*982Y?1s(vzu z=shg~slQGBdEaUXv7rqL4W^|g$fKfl3Aeqb~N)8JpIc^A29{sOqCoUl^B?UBnI?T`E*!#5G{!a(%I0yr4u~ z1dP2G+V=lcJ9>ct3F9l%nX%`c6W+Pte^>S16>5gy5XtXOu^|*i`4Blzvjl=g9t^V? zb1bQ#@A5xgpAsU9G3QwSGEk!#gHaM*MLRigoTt* KO+XZ6xA@K#`LAw_n$tb&0 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 M^L0fs{=e7%AE1N<0{{R3 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier b/zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier new file mode 100644 index 00000000000..a831910b363 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +LastWriterPackageFamilyName=Microsoft.ScreenSketch_8wekyb3d8bbwe +ZoneId=3 diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 90b9f701b25..59e5ff0b3d2 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -362,7 +362,7 @@ Codec MIME类型枚举 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----------- | ------------------------- | ---- | ---- | ------------------------------------------------------------ | -| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、本地绝对路径:file:///data/data/ohos.xxx.xxx/files/test.mp4
![zh-cn_image_0000001164217678](figures/zh-cn_image_0000001164217678.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
4、fd类型播放:开发中
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | +| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、fd类型播放:fd:///xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | | loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。 | | currentTime | number | 是 | 否 | 音频的当前播放位置。 | | duration | number | 是 | 否 | 音频时长。 | @@ -714,7 +714,7 @@ audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----------- | ---------------------------------- | ---- | ---- | ------------------------------------------------------------ | -| url | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. 本地绝对路径:file:///data/data/ohos.xxx.xxx/files/test.mp4
![zh-cn_image_0000001164217678](figures/zh-cn_image_0000001164217678.png)
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | +| url | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd:///xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | | loop | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。 | | currentTime | number | 是 | 否 | 视频的当前播放位置。 | | duration | number | 是 | 否 | 视频时长,返回-1表示直播模式 | @@ -1555,7 +1555,7 @@ let audioRecorderConfig = { audioSampleRate : 22050, numberOfChannels : 2, format : media.AudioOutputFormat.AAC_ADTS, - uri : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.m4a', // 文件需先由调用者创建,并给予适当的权限 + uri : 'file://1', // 文件需先由调用者创建,并给予适当的权限 location : { latitude : 30, longitude : 130}, } audioRecorder.on('prepare', () => { //设置'prepare'事件回调 @@ -1750,7 +1750,7 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 | | format | [AudioOutputFormat](#audiooutputformat) | 否 | 音量输出封装格式,默认设置为MPEG_4。 | | location8+ | [Location](#location8) | 否 | 音频采集的地理位置。 | -| uri | string | 是 | 音频输出URI。支持:
1. 文件的绝对路径:file:///data/data/ohos.xxx.xxx/cache/test.mp4![zh-cn_image_0000001164217678](figures/zh-cn_image_0000001164217678.png)
2. 文件的fd路径:file://1 (fd number)
文件需要由调用者创建,并赋予适当的权限。 | +| uri | string | 是 | 视频输出URI:file://1 (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | ## AudioEncoder @@ -1816,7 +1816,7 @@ let videoConfig = { audioSourceType : 1, videoSourceType : 0, profile : videoProfile, - url : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.mp4', // 文件需先由调用者创建,并给予适当的权限 + url : 'file://1', // 文件需先由调用者创建,并给予适当的权限 orientationHint : 0, location : { latitude : 30, longitude : 130 }, } @@ -1885,7 +1885,7 @@ let videoConfig = { audioSourceType : 1, videoSourceType : 0, profile : videoProfile, - url : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.mp4', // 文件需先由调用者创建,并给予适当的权限 + url : 'file://1', // 文件需先由调用者创建,并给予适当的权限 orientationHint : 0, location : { latitude : 30, longitude : 130 }, } @@ -2340,7 +2340,7 @@ videoRecorder.on('error', (error) => { // 设置'error'事件回调 | profile | [VideoRecorderProfile](#videorecorderprofile8+) | 是 | 视频录制的profile。 | | orientationHint | number | 否 | 录制视频的旋转角度。 | | location | [Location](#location8) | 否 | 录制视频的地理位置。 | -| uri | string | 是 | 视频输出URI。支持:
1. 文件的绝对路径:file:///data/data/ohos.xxx.xxx/cache/test.mp4![zh-cn_image_0000001164217678](figures/zh-cn_image_0000001164217678.png)
2. 文件的fd路径:file://1 (fd number)
文件需要由调用者创建,并赋予适当的权限。 | +| url | string | 是 | 视频输出URL:file://1 (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | ## AudioSourceType8+ -- Gitee From 0d9b91d201ec33ce0b2db759197fc173021b9af6 Mon Sep 17 00:00:00 2001 From: zengsiyu Date: Sat, 26 Feb 2022 19:11:48 +0800 Subject: [PATCH 006/282] fix: remove IsNotificationEnabledSelf Signed-off-by: zengsiyu Change-Id: If8edd25a7595b8380a41efa38f2b9dd4d728786b --- .../reference/apis/js-apis-notification.md | 55 ------------------- 1 file changed, 55 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-notification.md b/zh-cn/application-dev/reference/apis/js-apis-notification.md index 101947cd5e3..b5afd3db131 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-notification.md +++ b/zh-cn/application-dev/reference/apis/js-apis-notification.md @@ -2001,61 +2001,6 @@ Notification.isSupportTemplate(templateName).then((data) => { -## Notiifcation.isNotificationEnabledSelf - -isNotificationEnabledSelf(callback: AsyncCallback\): void - -查询应用通知是否使能。 - -- 参数 - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------ | ---- | -------------------------- | -| callback | AsyncCallback\ | 是 | 查询模板是否存在的回调函数 | - -- 示例 - -```javascript -function isNotificationEnabledSelfCallback(err, enabled) { - console.info("isNotificationEnabledSelf"); - if (err.code) { - console.info("failed " + JSON.stringify(err)); - } else { - console.info("isNotificationEnabledSelf " + JSON.stringify(enabled)); - } -}; - -Notification.isNotificationEnabledSelf(isNotificationEnabledSelfCallback); -``` - - - -## Notiifcation.isNotificationEnabledSelf - -isNotificationEnabledSelf(): Promise\ - -查询应用通知是否使能。 - -- 返回值 - -| 类型 | 说明 | -| ------------------ | --------------- | -| Promise\ | Promise方式返回 | - -- 示例 - -```javascript -Notification.isNotificationEnabledSelf() - .then((enabled) => { - console.info("isNotificationEnabledSelf " + JSON.stringify(enabled)); - }) - .catch((err) => { - console.info("isNotificationEnabledSelf failed " + JSON.stringify(err)); - }); -``` - - - ## Notification.requestEnabledNotification requestEnabledNotification(callback: AsyncCallback\): void -- Gitee From 9168b304a17057ee6b1bd6d1f62d8bdd73ca7d27 Mon Sep 17 00:00:00 2001 From: huye Date: Sat, 26 Feb 2022 17:46:02 +0800 Subject: [PATCH 007/282] web api Signed-off-by: huye --- .../reference/arkui-ts/ts-media-components-web.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) mode change 100644 => 100755 zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md old mode 100644 new mode 100755 index c729b54fb4e..9a3a3a1e1f3 --- a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md @@ -116,11 +116,11 @@ accessStep(step: number): boolean ### deleteJavaScriptRegister -deleteJavaScriptRegister(options: { name: string }): void +deleteJavaScriptRegister(name: string): void 清空指定对象已注册的JavaScript方法。 -- options参数说明 +- 参数 | 参数名 | 参数类型 | 必填 | 默认值 | 参数描述 | | ---- | ------ | ---- | ---- | ----------------------- | @@ -175,11 +175,11 @@ loadData(options: { data: string, mimeType: string, encoding: string, baseUrl?: ### loadUrl -loadUrl(url: string, additionalHttpHeaders?: Array<{ key: string, value: string }>): void +loadUrl(options:{ url: string, headers?: Array<{ key: string, value: string }> }): void 加载URL。 -- 参数 +- options参数说明 | 参数名 | 参数类型 | 必填 | 默认值 | 参数描述 | | --------------------- | ------------------------------------- | ---- | ---- | ---------- | @@ -220,11 +220,11 @@ registerJavaScriptProxy(options: { obj: object, name: string, methodList: string ### runJavaScript -runJavaScript(script: string, callback?: (result: string) => void): void +runJavaScript(options: { script: string, callback?: (result: string) => void }): void 执行JavaScript脚本。 -- 参数 +- options参数说明 | 参数名 | 参数类型 | 必填 | 默认值 | 参数描述 | | -------- | ------------------------ | ---- | ---- | ------------------------------------ | -- Gitee From b3b5feacec0ac99269303d5f91d34028359eeefb Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Mon, 28 Feb 2022 16:33:22 +0800 Subject: [PATCH 008/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: I83d447fc47f7b295753d309ee02bdf29ac5109c8 --- zh-cn/application-dev/media/audio-playback.md | 89 +++++++++++-- zh-cn/application-dev/media/video-playback.md | 126 ++++++++++++++++-- .../reference/apis/js-apis-media.md | 8 +- 3 files changed, 195 insertions(+), 28 deletions(-) diff --git a/zh-cn/application-dev/media/audio-playback.md b/zh-cn/application-dev/media/audio-playback.md index 757d99fdc6c..f7a61025f2b 100644 --- a/zh-cn/application-dev/media/audio-playback.md +++ b/zh-cn/application-dev/media/audio-playback.md @@ -25,6 +25,9 @@ AudioPlayer支持的src媒体源输入类型可参考:[src属性说明](../reference/apis/js-apis-media.md#audioplayer_属性) ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + function SetCallBack(audioPlayer) { audioPlayer.on('dataLoad', () => { //设置'dataLoad'事件回调,src属性设置成功后,触发此回调 console.info('audio set source success'); @@ -79,8 +82,19 @@ function printfDescription(obj) { //1、创建实例 let audioPlayer = media.createAudioPlayer(); SetCallBack(audioPlayer); //设置事件回调 -//2、用户选择音频,设置uri -audioPlayer.src = 'file:///data/data/ohos.xxx.xxx/files/test.mp3'; //设置src属性,并触发'dataLoad'事件回调 +/* 用户选择视频设置fd(本地播放) */ +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); + +audioPlayer.src = fdPath; //设置src属性,并触发'dataLoad'事件回调 //3、播放音频 audioPlayer.play(); //需等待'dataLoad'事件回调完成后,才可调用play进行播放,触发'play'事件回调 //4、跳转播放位置 @@ -111,6 +125,9 @@ audioPlayer = undefined; ### 正常播放场景 ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + function SetCallBack(audioPlayer) { audioPlayer.on('dataLoad', () => { //设置'dataLoad'事件回调,src属性设置成功后,触发此回调 console.info('audio set source success'); @@ -128,13 +145,27 @@ function SetCallBack(audioPlayer) { let audioPlayer = media.createAudioPlayer(); //创建一个音频播放实例 SetCallBack(audioPlayer); //设置事件回调 -/* 用户选择音频,设置uri */ -audioPlayer.src = 'file:///data/data/ohos.xxx.xxx/files/test.mp3'; //设置src属性,并触发'dataLoad'事件回调 +/* 用户选择视频设置fd(本地播放) */ +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); + +audioPlayer.src = fdPath; //设置src属性,并触发'dataLoad'事件回调 ``` ### 切歌场景 ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + function SetCallBack(audioPlayer) { audioPlayer.on('dataLoad', () => { //设置'dataLoad'事件回调,src属性设置成功后,触发此回调 console.info('audio set source success'); @@ -152,16 +183,42 @@ function SetCallBack(audioPlayer) { let audioPlayer = media.createAudioPlayer(); //创建一个音频播放实例 SetCallBack(audioPlayer); //设置事件回调 -/* 用户选择音频,设置uri */ -audioPlayer.src = 'file:///data/data/ohos.xxx.xxx/files/test.mp3'; //设置src属性,并触发'dataLoad'事件回调 +/* 用户选择视频设置fd(本地播放) */ +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); + +audioPlayer.src = fdPath; //设置src属性,并触发'dataLoad'事件回调 /* 播放一段时间后,下发切歌指令 */ audioPlayer.reset(); -audioPlayer.src = 'file:///data/data/ohos.xxx.xxx/files/next.mp3'; + +/* 用户选择视频设置fd(本地播放) */ +let fdNextPath = 'fd://' +let nextPath = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; +await fileIO.open(nextPath).then(fdNumber) => { + fdNextPath = fdNextPath + " + fdNumber; + console.info('open fd sucess fd is' + fdNextPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); +audioPlayer.src = fdNextPath; ``` ### 单曲循环场景 ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + function SetCallBack(audioPlayer) { audioPlayer.on('dataLoad', () => { //设置'dataLoad'事件回调,src属性设置成功后,触发此回调 console.info('audio set source success'); @@ -179,7 +236,19 @@ function SetCallBack(audioPlayer) { let audioPlayer = media.createAudioPlayer(); //创建一个音频播放实例 SetCallBack(audioPlayer); //设置事件回调 -/* 用户选择音频,设置uri */ -audioPlayer.src = 'file:///data/data/ohos.xxx.xxx/files/test.mp3'; //设置src属性,并触发'dataLoad'事件回调 -audioPlayer.loop = true; //设置循环播放属性 + +/* 用户选择视频设置fd(本地播放) */ +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); + +audioPlayer.src = fdPath; //设置src属性,并触发'dataLoad'事件回调 +audioPlayer.loop = true; //设置循环播放属性 ``` \ No newline at end of file diff --git a/zh-cn/application-dev/media/video-playback.md b/zh-cn/application-dev/media/video-playback.md index 5fe625c1dfb..4b7bec8c8bb 100644 --- a/zh-cn/application-dev/media/video-playback.md +++ b/zh-cn/application-dev/media/video-playback.md @@ -30,10 +30,21 @@ VideoPlayer支持的url媒体源输入类型可参考:[url属性说明](../reference/apis/js-apis-media.md#videoplayer_属性) +Xcomponent创建方法可参考:[Xcomponent创建方法](#Xcomponent创建方法) + ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID +// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用 +LoadXcomponent() { + surfaceID = this.$element('Xcomponent').getXComponentSurfaceId(); + console.info('LoadXcomponent surfaceID is' + surfaceID); +} + // 函数调用发生错误时用于上报错误信息 function failureCallback(error) { console.info(`error happened,error Name is ${error.name}`); @@ -67,10 +78,19 @@ await media.createVideoPlayer().then((video) => { } }, failureCallback).catch(catchCallback); -// 用户选择视频设置url -videoPlayer.url = 'file:///data/data/ohos.xxx.xxx/files/test.mp4'; +// 用户选择视频设置fd(本地播放) +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); -// 该处需要调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中 +videoPlayer.url = fdPath; // 设置surfaceID用于显示视频画面 await videoPlayer.setDisplaySurface(surfaceID).then(() => { @@ -147,9 +167,18 @@ surfaceID = undefined; ### 正常播放场景 ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID +// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用 +LoadXcomponent() { + surfaceID = this.$element('Xcomponent').getXComponentSurfaceId(); + console.info('LoadXcomponent surfaceID is' + surfaceID); +} + // 函数调用发生错误时用于上报错误信息 function failureCallback(error) { console.info(`error happened,error Name is ${error.name}`); @@ -191,10 +220,19 @@ await media.createVideoPlayer().then((video) => { // 设置事件回调 SetCallBack(videoPlayer); -// 用户选择视频设置url -videoPlayer.url = 'file:///data/data/ohos.xxx.xxx/files/test.mp4'; +// 用户选择视频设置fd(本地播放) +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); -// 该处需要调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中 +videoPlayer.url = fdPath; // 设置surfaceID用于显示视频画面 await videoPlayer.setDisplaySurface(surfaceID).then(() => { @@ -215,9 +253,18 @@ await videoPlayer.play().then(() => { ### 切视频场景 ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID +// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用 +LoadXcomponent() { + surfaceID = this.$element('Xcomponent').getXComponentSurfaceId(); + console.info('LoadXcomponent surfaceID is' + surfaceID); +} + // 函数调用发生错误时用于上报错误信息 function failureCallback(error) { console.info(`error happened,error Name is ${error.name}`); @@ -259,10 +306,19 @@ await media.createVideoPlayer().then((video) => { // 设置事件回调 SetCallBack(videoPlayer); -// 用户选择视频设置url -videoPlayer.url = 'file:///data/data/ohos.xxx.xxx/files/test.mp4'; +// 用户选择视频设置fd(本地播放) +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); -// 该处需要调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中 +videoPlayer.url = fdPath; // 设置surfaceID用于显示视频画面 await videoPlayer.setDisplaySurface(surfaceID).then(() => { @@ -285,7 +341,19 @@ await videoPlayer.reset().then(() => { console.info('reset success'); }, failureCallback).catch(catchCallback); -videoPlayer.url = 'file:///data/data/ohos.xxx.xxx/files/next.mp4'; +// 用户选择视频设置fd(本地播放) +let fdNextPath = 'fd://' +let nextPath = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/02.mp4'; +await fileIO.open(nextPath).then(fdNumber) => { + fdNextPath = fdNextPath + " + fdNumber; + console.info('open fd sucess fd is' + fdNextPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); + +videoPlayer.url = fdNextPath; // 设置surfaceID用于显示视频画面 await videoPlayer.setDisplaySurface(surfaceID).then(() => { @@ -306,9 +374,18 @@ await videoPlayer.play().then(() => { ### 单个视频循环场景 ```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID +// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用 +LoadXcomponent() { + surfaceID = this.$element('Xcomponent').getXComponentSurfaceId(); + console.info('LoadXcomponent surfaceID is' + surfaceID); +} + // 函数调用发生错误时用于上报错误信息 function failureCallback(error) { console.info(`error happened,error Name is ${error.name}`); @@ -350,10 +427,19 @@ await media.createVideoPlayer().then((video) => { // 设置事件回调 SetCallBack(videoPlayer); -// 用户选择视频设置url -videoPlayer.url = 'file:///data/data/ohos.xxx.xxx/files/test.mp4'; +// 用户选择视频设置fd(本地播放) +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + " + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); -// 该处需要调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中 +videoPlayer.url = fdPath; // 设置surfaceID用于显示视频画面 await videoPlayer.setDisplaySurface(surfaceID).then(() => { @@ -372,4 +458,16 @@ videoPlayer.loop = true; await videoPlayer.play().then(() => { console.info('play success'); }, failureCallback).catch(catchCallback); -``` \ No newline at end of file +``` + +### Xcomponent创建方法 + +```js +播放视频中获取surfaceID依赖了Xcomponent,需要创建一个和xxx.js同名的xxx.hml文件,xxx.hml里面需要添加如下代码: + // 设置窗口宽高等属性 + +``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 59e5ff0b3d2..e667f592008 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -362,7 +362,7 @@ Codec MIME类型枚举 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----------- | ------------------------- | ---- | ---- | ------------------------------------------------------------ | -| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、fd类型播放:fd:///xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | +| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | | loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。 | | currentTime | number | 是 | 否 | 音频的当前播放位置。 | | duration | number | 是 | 否 | 音频时长。 | @@ -714,7 +714,7 @@ audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----------- | ---------------------------------- | ---- | ---- | ------------------------------------------------------------ | -| url | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd:///xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | +| url | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | | loop | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。 | | currentTime | number | 是 | 否 | 视频的当前播放位置。 | | duration | number | 是 | 否 | 视频时长,返回-1表示直播模式 | @@ -1750,7 +1750,7 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 | | format | [AudioOutputFormat](#audiooutputformat) | 否 | 音量输出封装格式,默认设置为MPEG_4。 | | location8+ | [Location](#location8) | 否 | 音频采集的地理位置。 | -| uri | string | 是 | 视频输出URI:file://1 (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | +| uri | string | 是 | 视频输出URI:file://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | ## AudioEncoder @@ -2340,7 +2340,7 @@ videoRecorder.on('error', (error) => { // 设置'error'事件回调 | profile | [VideoRecorderProfile](#videorecorderprofile8+) | 是 | 视频录制的profile。 | | orientationHint | number | 否 | 录制视频的旋转角度。 | | location | [Location](#location8) | 否 | 录制视频的地理位置。 | -| url | string | 是 | 视频输出URL:file://1 (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | +| url | string | 是 | 视频输出URL:file://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | ## AudioSourceType8+ -- Gitee From 122e3050049a59e4b24eef46640657159cb4f8a3 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Mon, 28 Feb 2022 16:37:35 +0800 Subject: [PATCH 009/282] update docs Signed-off-by: shawn_he --- .../reference/apis/js-apis-bytrace.md | 277 +++----- .../reference/apis/js-apis-call.md | 465 +++++++------- .../reference/apis/js-apis-hiappevent.md | 497 ++++----------- .../reference/apis/js-apis-hichecker.md | 126 ++++ .../reference/apis/js-apis-hidebug.md | 170 +++++ .../reference/apis/js-apis-hitracechain.md | 259 ++++---- .../reference/apis/js-apis-hitracemeter.md | 128 ++-- .../reference/apis/js-apis-power.md | 234 +++---- .../reference/apis/js-apis-radio.md | 378 +++++------ .../reference/apis/js-apis-runninglock.md | 599 ++++++------------ .../reference/apis/js-apis-sim.md | 385 ++++++----- .../reference/apis/js-apis-sms.md | 308 ++++----- 12 files changed, 1777 insertions(+), 2049 deletions(-) create mode 100644 en/application-dev/reference/apis/js-apis-hichecker.md create mode 100644 en/application-dev/reference/apis/js-apis-hidebug.md diff --git a/en/application-dev/reference/apis/js-apis-bytrace.md b/en/application-dev/reference/apis/js-apis-bytrace.md index a79e890d2a2..ff5fbcee930 100644 --- a/en/application-dev/reference/apis/js-apis-bytrace.md +++ b/en/application-dev/reference/apis/js-apis-bytrace.md @@ -1,197 +1,110 @@ -# Performance Tracing +# Performance Tracing ->![](../../public_sys-resources/icon-note.gif) **NOTE:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > - The APIs of this module are no longer maintained since API version 8. It is recommended that you use the APIs of [hiTraceMeter](js-apis-hitracemeter.md) instead. > - The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## Modules to Import + +## Modules to Import ``` import bytrace from '@ohos.bytrace'; ``` -## Required Permissions - -None - -## bytrace.startTrace - -startTrace\(name: string, taskId: number, expectedTime?: number\): void - -Starts a trace of a task. **expectedTime** is an optional parameter, which specifies the expected duration of the trace. - -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

name

-

string

-

Yes

-

Name of the trace task to start.

-

taskId

-

number

-

Yes

-

Task ID.

-

expectedTime

-

number

-

No

-

Expected duration of the trace, in ms.

-
- - >![](../../public_sys-resources/icon-note.gif) **NOTE:** - >If multiple trace tasks with the same name need to be performed at the same time or a trace task needs to be performed multiple times concurrently, different **taskId**s must be specified in **startTrace**. If the trace tasks with the same name are not performed at the same time, the same **taskId** can be used. For details, see the **bytrace.finishTrace** example. - -- Example - - ``` - bytrace.startTrace("myTestFunc", 1); - bytrace.startTrace("myTestFunc", 1, 5); // The expected duration of the trace is 5 ms. - ``` - - -## bytrace.finishTrace - -finishTrace\(name: string, taskId: number\): void + +## System Capabilities + +SystemCapability.Developtools.Bytrace + + +## bytrace.startTrace + +startTrace(name: string, taskId: number, expectedTime?: number): void + +Starts a trace task. **expectedTime** is an optional parameter, which specifies the expected duration of the trace. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the trace task to start.| +| taskId | number | Yes| Task ID.| +| expectedTime | number | No| Expected duration of the trace, in ms.| + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> If multiple trace tasks with the same name need to be performed at the same time or a trace task needs to be performed multiple times concurrently, different task IDs must be specified in **startTrace**. If the trace tasks with the same name are not performed at the same time, the same taskId can be used. For details, see the bytrace.finishTrace example. + +**Example** + +``` +bytrace.startTrace("myTestFunc", 1); +bytrace.startTrace("myTestFunc", 1, 5); // The expected duration of the trace is 5 ms. +``` + + +## bytrace.finishTrace + +finishTrace(name: string, taskId: number): void Stops a trace task. -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

name

-

string

-

Yes

-

Name of the trace task to stop.

-

taskId

-

number

-

Yes

-

Task ID.

-
- - >![](../../public_sys-resources/icon-note.gif) **NOTE:** - >To stop a trace task, the values of **name** and **taskId** in **finishTrace** must be the same as those in **startTrace**. - -- Example - - ``` - bytrace.finishTrace("myTestFunc", 1); - ``` - - ``` - // Start track tasks with the same name concurrently. - bytrace.startTrace("myTestFunc", 1); - ...... // Service flow - bytrace.startTrace ("myTestFunc", 2); // The second trace task starts while the first task is still running. The first and second tasks have the same name but different task IDs. - ...... // Service flow - bytrace.finishTrace("myTestFunc", 1); - ...... // Service flow - bytrace.finishTrace("myTestFunc", 2); - ``` - - ``` - // Start track tasks with the same name at different times. - bytrace.startTrace("myTestFunc", 1); - ...... // Service flow - bytrace.finishTrace("myTestFunc", 1); // The first trace task ends. - ...... // Service flow - bytrace.startTrace("myTestFunc", 1); // The second trace task starts after the first task ends. The two tasks have the same name and task ID. - ...... // Service flow - bytrace.finishTrace("myTestFunc", 1); - ``` - - -## bytrace.traceByValue - -traceByValue\(name: string, value: number\): void +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the trace task to start.| +| taskId | number | Yes| Task ID.| + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> To stop a trace task, the values of name and task ID in **finishTrace** must be the same as those in **startTrace**. + +**Example** + +``` +bytrace.finishTrace("myTestFunc", 1); +``` + +``` +// Start track tasks with the same name concurrently. +bytrace.startTrace("myTestFunc", 1); +// Service flow +bytrace.startTrace("myTestFunc", 2); // The second trace task starts while the first task is still running. The first and second tasks have the same name but different task IDs. +// Service flow +bytrace.finishTrace("myTestFunc", 1); +// Service flow +bytrace.finishTrace("myTestFunc", 2); +``` + +``` +// Start track tasks with the same name at different times. +bytrace.startTrace("myTestFunc", 1); +// Service flow +bytrace.finishTrace("myTestFunc", 1); // The first trace task ends. +// Service flow +bytrace.startTrace("myTestFunc", 1); // The second trace task starts after the first task ends. The two tasks have the same name and task ID. +// Service flow +bytrace.finishTrace("myTestFunc", 1); +``` + + +## bytrace.traceByValue + +traceByValue(name: string, value: number): void Traces the value changes of a variable. -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

name

-

string

-

Yes

-

Name of the variable to trace.

-

value

-

number

-

Yes

-

Value of the variable to trace.

-
- -- Example - - ``` - let traceCount = 3; - bytrace.traceByValue("myTestCount", traceCount); - ...... - traceCount = 5; - bytrace.traceByValue("myTestCount", traceCount); - ``` +**Parameters** +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the variable.| +| value | number | Yes| Value of the variable.| + +**Example** + +``` +let traceCount = 3; +bytrace.traceByValue("myTestCount", traceCount); +traceCount = 4; +bytrace.traceByValue("myTestCount", traceCount); +// Service flow +``` diff --git a/en/application-dev/reference/apis/js-apis-call.md b/en/application-dev/reference/apis/js-apis-call.md index 14584a1f0e3..cb892795387 100644 --- a/en/application-dev/reference/apis/js-apis-call.md +++ b/en/application-dev/reference/apis/js-apis-call.md @@ -1,6 +1,6 @@ # Call ->**Note:** +>**NOTE** > >The initial APIs of this module are supported since API version 6. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -19,20 +19,20 @@ Initiates a call. This function uses an asynchronous callback to return the exec Before using this API, you must declare the **ohos.permission.PLACE\_CALL** permission (a system permission). -- Parameters - - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | phoneNumber | string | Yes|Phone number.| - | callback |AsyncCallback<boolean>|Yes|Callback used to return the result.
- **true**: success
-**false**: failure| - -- Example +**Parameters** - ``` - call.dial("138xxxxxxxx", (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +| Name| Type| Mandatory| Description| +| ----------- | ---------------------------- | ---- | ------------------------------------------------- | +| phoneNumber | string | Yes| Phone number.| +| callback | AsyncCallback<boolean> | Yes| Callback used to return the result.
- **true**: success
- **false**: failure| + +**Example** + +``` +call.dial("138xxxxxxxx", (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.dial @@ -43,24 +43,23 @@ Initiates a call. You can set call options as needed. This function uses an asyn Before using this API, you must declare the **ohos.permission.PLACE\_CALL** permission (a system permission). -- Parameters - - | Parameter| Type| Mandatory| Description| - | ----------- | ---------------------------- | ---- | ------------------------------------------------- | - | phoneNumber | string | Yes| Phone number.| - | options | DialOptions | Yes| Call options. For details, see [DialOptions](#DialOptions).| - | callback | AsyncCallback<boolean> | Yes| Callback used to return the result.
- **true**: success
-**false**: failure| +**Parameters** +| Name| Type| Mandatory| Description| +| ----------- | ---------------------------- | ---- | ------------------------------------------------- | +| phoneNumber | string | Yes| Phone number.| +| options | DialOptions | Yes| Call options. For details, see [DialOptions](#DialOptions).| +| callback | AsyncCallback<boolean> | Yes| Callback used to return the result.
- **true**: success
- **false**: failure| -- Example +**Example** - ``` - call.dial("138xxxxxxxx", { - extras: false - }, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.dial("138xxxxxxxx", { + extras: false +}, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.dial @@ -71,31 +70,31 @@ Initiates a call. You can set call options as needed. This function uses a promi Before using this API, you must declare the **ohos.permission.PLACE\_CALL** permission (a system permission). -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | ----------- | ---- | ------------------------------------------- | - | phoneNumber | string | Yes| Phone number.| - | options | DialOptions | Yes| Call options. For details, see [DialOptions](#DialOptions).| +| Name| Type| Mandatory| Description| +| ----------- | ----------- | ---- | ------------------------------------------- | +| phoneNumber | string | Yes| Phone number.| +| options | DialOptions | Yes| Call options. For details, see [DialOptions](#DialOptions).| -- Return values +**Return value** - | Type| Description| - | ---------------------- | --------------------------------- | - | Promise<boolean> | Promise used to return the result.| +| Type| Description| +| ---------------------- | --------------------------------- | +| Promise<boolean> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = call.dial("138xxxxxxxx", { - extras: false - }); - promise.then(data => { - console.log(`dial success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`dial fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = call.dial("138xxxxxxxx", { + extras: false +}); +promise.then(data => { + console.log(`dial success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`dial fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## call.hasCall @@ -103,19 +102,19 @@ hasCall\(callback: AsyncCallback\): void Checks whether a call is in progress. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ---------------------------- | ---- | ------------------------------------------------------------ | - | callback | AsyncCallback<boolean> | Yes| Callback used to return the result:
- **true**: A call is in progress.
- **false**: No call is in progress. | +| Name| Type| Mandatory| Description| +| -------- | ---------------------------- | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback<boolean> | Yes| Callback used to return the result:
- **true**: A call is in progress.
- **false**: No call is in progress. | -- Example +**Example** - ``` - call.hasCall((err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.hasCall((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.hasCall @@ -124,22 +123,22 @@ hasCall\(\): Promise Checks whether a call is in progress. This function uses a promise to return the result. -- Return values +**Return value** - | Type| Description| - | ---------------------- | --------------------------------------- | - | Promise<boolean> | Promise used to return the result.| +| Type| Description| +| ---------------------- | --------------------------------------- | +| Promise<boolean> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = call.hasCall(); - promise.then(data => { - console.log(`hasCall success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`hasCall fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = call.hasCall(); +promise.then(data => { + console.log(`hasCall success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`hasCall fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## call.getCallState @@ -148,19 +147,19 @@ getCallState\(callback: AsyncCallback\): void Obtains the call status. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------------------------------------------- | ---- | ------------------------------------ | - | callback | AsyncCallback<[CallState](#CallState)> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | -------------------------------------------- | ---- | ------------------------------------ | +| callback | AsyncCallback<[CallState](#CallState)> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - call.getCallState((err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.getCallState((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.getCallState @@ -169,118 +168,118 @@ getCallState\(\): Promise Obtains the call status. This function uses a promise to return the result. -- Return values +**Return value** - | Type| Description| - | -------------------------------------- | ----------------------------------------- | - | Promise<[CallState](#CallState)> | Promise used to return the result.| +| Type| Description| +| -------------------------------------- | ----------------------------------------- | +| Promise<[CallState](#CallState)> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = call.getCallState(); - promise.then(data => { - console.log(`getCallState success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`getCallState fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = call.getCallState(); +promise.then(data => { + console.log(`getCallState success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`getCallState fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## call.isEmergencyPhoneNumber7+ isEmergencyPhoneNumber\(phoneNumber: string, callback: AsyncCallback\): void -Checks whether the call number is an emergency number. This function uses an asynchronous callback to return the result. +Checks whether the call number of the SIM card in the specified slot is an emergency number. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | ---------------------------- | ---- | ------------------------------------------------------------ | - | phoneNumber | string | Yes| Phone number.| - | callback | AsyncCallback<boolean> | Yes| Callback used to return the result.
- **true**: The called number is an emergency number.
- **false**: The called number is not an emergency number.| +| Name| Type| Mandatory| Description| +| ----------- | ---------------------------- | ---- | ------------------------------------------------------------ | +| phoneNumber | string | Yes| Phone number.| +| callback | AsyncCallback<boolean> | Yes| Callback used to return the result.
- **true**: The called number is an emergency number.
- **false**: The called number is not an emergency number.| -- Example +**Example** - ``` - call.isEmergencyPhoneNumber("138xxxxxxxx", (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.isEmergencyPhoneNumber("138xxxxxxxx", (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.isEmergencyPhoneNumber7+ isEmergencyPhoneNumber\(phoneNumber: string, options: EmergencyNumberOptions, callback: AsyncCallback\): void -Checks whether the call number is an emergency number. This function uses an asynchronous callback to return the result. +Checks whether the call number of the SIM card in the specified slot is an emergency number. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | ---------------------------- | ---- | ------------------------------------------------------------ | - | phoneNumber | string | Yes| Phone number.| - | options | EmergencyNumberOptions | Yes| Emergency number options defined in [EmergencyNumberOptions](#EmergencyNumberOptions).| - | callback | AsyncCallback<boolean> | Yes| Callback used to return the result.
- **true**: The called number is an emergency number.
- **false**: The called number is not an emergency number.| +| Name| Type| Mandatory| Description| +| ----------- | ---------------------------- | ---- | ------------------------------------------------------------ | +| phoneNumber | string | Yes| Phone number.| +| options | EmergencyNumberOptions | Yes| Emergency number options defined in [EmergencyNumberOptions](#EmergencyNumberOptions).| +| callback | AsyncCallback<boolean> | Yes| Callback used to return the result.
- **true**: The called number is an emergency number.
- **false**: The called number is not an emergency number.| -- Example +**Example** - ``` - call.isEmergencyPhoneNumber("112", {slotId: 1}, (err, value) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.isEmergencyPhoneNumber("112", {slotId: 1}, (err, value) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.isEmergencyPhoneNumber7+ isEmergencyPhoneNumber\(phoneNumber: string, options?: EmergencyNumberOptions\): Promise -Checks whether the call number is an emergency number. This function uses a promise to return the result. +Checks whether the call number of the SIM card in the specified slot is an emergency number. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | ---------------------- | ---- | ------------------------------------------------------------ | - | phoneNumber | string | Yes| Phone number.| - | options | EmergencyNumberOptions | Yes| Emergency number options defined in [EmergencyNumberOptions](#EmergencyNumberOptions).| +| Name| Type| Mandatory| Description| +| ----------- | ---------------------- | ---- | ------------------------------------------------------------ | +| phoneNumber | string | Yes| Phone number.| +| options | EmergencyNumberOptions | Yes| Emergency number options defined in [EmergencyNumberOptions](#EmergencyNumberOptions).| -- Return values +**Return value** - | Type| Description| - | ---------------------- | --------------------------------------------------- | - | Promise<boolean> | Promise used to return the result.| +| Type| Description| +| ---------------------- | --------------------------------------------------- | +| Promise<boolean> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = call.isEmergencyPhoneNumber("138xxxxxxxx", {slotId: 1}); - promise.then(data => { - console.log(`isEmergencyPhoneNumber success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`isEmergencyPhoneNumber fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = call.isEmergencyPhoneNumber("138xxxxxxxx", {slotId: 1}); +promise.then(data => { + console.log(`isEmergencyPhoneNumber success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`isEmergencyPhoneNumber fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## call.formatPhoneNumber7+ formatPhoneNumber\(phoneNumber: string, callback: AsyncCallback\): void -Formats a phone number. This function uses an asynchronous callback to return the result. +Formats a phone number based on the specified ISO country code. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | --------------------------- | ---- | ------------------------------------ | - | phoneNumber | string | Yes| Phone number.| - | callback | AsyncCallback<string> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| ----------- | --------------------------- | ---- | ------------------------------------ | +| phoneNumber | string | Yes| Phone number.| +| callback | AsyncCallback<string> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - call.formatPhoneNumber("138xxxxxxxx", (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.formatPhoneNumber("138xxxxxxxx", (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.formatPhoneNumber7+ @@ -289,23 +288,23 @@ formatPhoneNumber\(phoneNumber: string, options: NumberFormatOptions, callback: Formats a phone number based on specified formatting options. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | --------------------------- | ---- | ------------------------------------------------------------ | - | phoneNumber | string | Yes| Phone number.| - | options | NumberFormatOptions | Yes| Number formatting options defined in [NumberFormatOptions](#NumberFormatOptions).| - | callback | AsyncCallback<string> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| ----------- | --------------------------- | ---- | ------------------------------------------------------------ | +| phoneNumber | string | Yes| Phone number.| +| options | NumberFormatOptions | Yes| Number formatting options defined in [NumberFormatOptions](#NumberFormatOptions).| +| callback | AsyncCallback<string> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - call.formatPhoneNumber("138xxxxxxxx",{ - countryCode: "CN" - }, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.formatPhoneNumber("138xxxxxxxx",{ + countryCode: "CN" +}, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.formatPhoneNumber7+ @@ -314,31 +313,31 @@ formatPhoneNumber\(phoneNumber: string, options?: NumberFormatOptions\): Promise Formats a phone number based on specified formatting options. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | ------------------- | ---- | ------------------------------------------------------------ | - | phoneNumber | string | Yes| Phone number.| - | options | NumberFormatOptions | Yes| Number formatting options defined in [NumberFormatOptions](#NumberFormatOptions).| +| Name| Type| Mandatory| Description| +| ----------- | ------------------- | ---- | ------------------------------------------------------------ | +| phoneNumber | string | Yes| Phone number.| +| options | NumberFormatOptions | Yes| Number formatting options defined in [NumberFormatOptions](#NumberFormatOptions).| -- Return values +**Return value** - | Type| Description| - | --------------------- | ------------------------------------------- | - | Promise<string> | Promise used to return the result.| +| Type| Description| +| --------------------- | ------------------------------------------- | +| Promise<string> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = call.formatPhoneNumber("138xxxxxxxx", { - countryCode: "CN" - }); - promise.then(data => { - console.log(`formatPhoneNumber success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`formatPhoneNumber fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = call.formatPhoneNumber("138xxxxxxxx", { + countryCode: "CN" +}); +promise.then(data => { + console.log(`formatPhoneNumber success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`formatPhoneNumber fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## call.formatPhoneNumberToE1647+ @@ -350,23 +349,23 @@ The phone number must match the specified country code. For example, for a China All country codes are supported. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | --------------------------- | ---- | ----------------------------------------------------- | - | phoneNumber | string | Yes| Phone number.| - | countryCode | string | Yes| Country code, for example, **CN** (China). All country codes are supported.| - | callback | AsyncCallback<string> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| ----------- | --------------------------- | ---- | ----------------------------------------------------- | +| phoneNumber | string | Yes| Phone number.| +| countryCode | string | Yes| Country code, for example, **CN** (China). All country codes are supported.| +| callback | AsyncCallback<string> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - call.formatPhoneNumberToE164("138xxxxxxxx",{ - countryCode: "CN" - }, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +call.formatPhoneNumberToE164("138xxxxxxxx",{ + countryCode: "CN" +}, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## call.formatPhoneNumberToE1647+ @@ -379,59 +378,59 @@ The phone number must match the specified country code. For example, for a China All country codes are supported. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ----------- | ------ | ---- | ---------------------------------------- | - | phoneNumber | string | Yes| Phone number.| - | countryCode | string | Yes| Country code, for example, **CN** (China). All country codes are supported.| +| Name| Type| Mandatory| Description| +| ----------- | ------ | ---- | ---------------------------------------- | +| phoneNumber | string | Yes| Phone number.| +| countryCode | string | Yes| Country code, for example, **CN** (China). All country codes are supported.| -- Return values +**Return value** - | Type| Description| - | --------------------- | ------------------------------------------------------------ | - | Promise<string> | Promise used to return the result.| +| Type| Description| +| --------------------- | ------------------------------------------------------------ | +| Promise<string> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = call.formatPhoneNumberToE164("138xxxxxxxx", { - countryCode: "CN" - }); - promise.then(data => { - console.log(`formatPhoneNumberToE164 success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`formatPhoneNumberToE164 fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = call.formatPhoneNumberToE164("138xxxxxxxx", { + countryCode: "CN" +}); +promise.then(data => { + console.log(`formatPhoneNumberToE164 success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`formatPhoneNumberToE164 fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## DialOptions Provides an option for determining whether a call is a video call. -| Name| Type| Mandatory| Description| -| -------- | -------- | -------- | -------- | -| extras | boolean | No|Indication of a video call. The options are as follows:
- **true**: video call
- **false**: voice call| +| Parameter| Type| Mandatory| Description| +| ------ | ------- | ---- | ------------------------------------------------------------ | +| extras | boolean | No| Indication of a video call. The options are as follows:
- **true**: video call
- **false**: voice call| ## CallState Enumerates call states. | Variable| Value| Description| -| -------- | -------- | -------- | -| CALL_STATE_UNKNOWN | -1 | The call status fails to be obtained and is unknown.| -| CALL_STATE_IDLE | 0 | No call is in progress.| -| CALL_STATE_RINGING | 1 | The call is in the ringing or waiting state.| -| CALL_STATE_OFFHOOK | 2 | At least one call is in dialing, active, or on hold, and no new incoming call is ringing or waiting.| +| ------------------ | ---- | ------------------------------------------------------------ | +| CALL_STATE_UNKNOWN | -1 | The call status fails to be obtained and is unknown.| +| CALL_STATE_IDLE | 0 | No call is in progress.| +| CALL_STATE_RINGING | 1 | The call is in the ringing or waiting state.| +| CALL_STATE_OFFHOOK | 2 | At least one call is in dialing, active, or on hold, and no new incoming call is ringing or waiting.| ## EmergencyNumberOptions7+ Provides an option for determining whether a number is an emergency number for the SIM card in the specified slot. -| Name| Type| Mandatory| Description| -| -------- | -------- | -------- | -------- | -| slotId | number | No|SIM card slot ID.
- **0**: slot 1
- **1**: slot 2| +| Parameter| Type| Mandatory| Description| +| ------ | ------ | ---- | ------------------------------------------ | +| slotId | number | No| SIM card slot ID.
- **0**: slot 1
- **1**: slot 2| ## NumberFormatOptions7+ Provides an option for number formatting. -| Name| Type| Mandatory| Description| -| -------- | -------- | -------- | -------- | -| countryCode | string | No|Country code, for example, **CN** (China). All country codes are supported. The default value is **CN**.| +| Parameter| Type| Mandatory| Description| +| ----------- | ------ | ---- | ---------------------------------------------------------- | +| countryCode | string | No| Country code, for example, **CN** (China). All country codes are supported. The default value is **CN**.| diff --git a/en/application-dev/reference/apis/js-apis-hiappevent.md b/en/application-dev/reference/apis/js-apis-hiappevent.md index a2db965ba8d..0d8534643b5 100644 --- a/en/application-dev/reference/apis/js-apis-hiappevent.md +++ b/en/application-dev/reference/apis/js-apis-hiappevent.md @@ -1,418 +1,157 @@ -# HiAppEvent +# Application dotting ->![](../../public_sys-resources/icon-note.gif) **NOTE:** ->The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## Modules to Import + +## Modules to Import ``` import hiAppEvent from '@ohos.hiAppEvent'; ``` + ## System Capabilities SystemCapability.HiviewDFX.HiAppEvent -## hiAppEvent.write -write\(eventName: string, eventType: EventType, keyValues: object, callback: AsyncCallback\): void +## hiAppEvent.write + +write(eventName: string, eventType: EventType, keyValues: object, callback: AsyncCallback<void>): void Writes event information to the event file of the current day. This function supports JSON parameters and uses an asynchronous callback to return the result. -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

eventName

-

string

-

Yes

-

Indicates the application event name.

-

eventType

-

EventType

-

Yes

-

Indicates the application event type.

-

keyValues

-

object

-

Yes

-

Indicates an array of JSON parameters of the application event. A key must be a string, and a value must be a string, number, boolean, or Array (which can only be a string, number, or boolean).

-

callback

-

AsyncCallback<void>

-

No

-

Indicates the callback function, which can be used to process the received return value.

-
  • Value 0 indicates that the event verification is successful, and the event will be written to the event file asynchronously.
  • A value greater than 0 indicates that invalid parameters are present in the event, and the event will be written to the event file asynchronously after the invalid parameters are ignored.
  • A value smaller than 0 indicates that the event verification fails, and the event will not be written to the event file.
-
- -- Example - - ``` - hiAppEvent.write("test_event", hiAppEvent.EventType.FAULT, {"int_data":100, "str_data":"strValue"}, (err, value) => { - if (err) { - // Event writing exception: Write the event to the event file after the invalid parameters in the event are ignored, or stop writing the event if the event verification fails. - console.error(`failed to write event because ${err.code}`); - return; - } - +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| eventName | string | Yes| App event name.| +| eventType | [EventType](#eventtype) | Yes| Application event type.| +| keyValues | object | Yes| Array of JSON parameters of the application event. A key must be a string, and a value must be a string, number, boolean, or Array (which can only be a string, number, or boolean).| +| callback | AsyncCallback<void> | No| Callback used to process the received return value.
- The value **0** indicates that the event parameter verification is successful, and the event will be written to the event file asynchronously.
- A value greater than **0** indicates that invalid parameters are present in the event, and the event will be written to the event file asynchronously after the invalid parameters are ignored.
- A value smaller than **0** indicates that the event parameter verification fails, and the event will not be written to the event file asynchronously.| + +**Example** + +``` +hiAppEvent.write("test_event", hiAppEvent.EventType.FAULT, {"int_data":100, "str_data":"strValue"}, (err, value) => { + if (err) { + // Event writing exception: Write the event to the event file after the invalid parameters in the event are ignored, or stop writing the event if the event verification fails. + console.error(`failed to write event because ${err.code}`); + return; + } + + // Event writing succeeded. + console.log(`success to write event: ${value}`); +}); +``` + + +## hiAppEvent.write + +write(eventName: string, eventType: EventType, keyValues: object): Promise<void> + +Writes event information to the event file of the current day. This function supports JSON parameters and uses a promise to return the result. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| eventName | string | Yes| App event name.| +| eventType | [EventType](#eventtype) | Yes| Application event type.| +| keyValues | object | Yes| Array of JSON parameters of the application event. A key must be a string, and a value must be a string, number, boolean, or Array (which can only be a string, number, or boolean).| + +**Return value** + +| Type| Description| +| -------- | -------- | +| Promise<void> | Promise used to process the callback in the then() and catch() methods when event writing succeeded or failed.| + +**Example** + +``` +hiAppEvent.write("test_event", hiAppEvent.EventType.FAULT, {"int_data":100, "str_data":"strValue"}) + .then((value) => { // Event writing succeeded. console.log(`success to write event: ${value}`); + }).catch((err) => { + // Event writing exception: Write the event to the event file after the invalid parameters in the event are ignored, or stop writing the event if the event verification fails. + console.error(`failed to write event because ${err.code}`); }); - ``` +``` -## hiAppEvent.write +## hiAppEvent.configure -write\(eventName: string, eventType: EventType, keyValues: object\): Promise +configure(config: ConfigOption): boolean -Writes event information to the event file of the current day. This function supports JSON parameters and uses a promise to return the result. +Configures the application event logging function, such as setting the event logging switch and maximum size of the directory that stores the event logging files. -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

eventName

-

string

-

Yes

-

Indicates the application event name.

-

eventType

-

EventType

-

Yes

-

Indicates the application event type.

-

keyValues

-

object

-

Yes

-

Indicates an array of JSON parameters of the application event. A key must be a string, and a value must be a string, number, boolean, or Array (which can only be a string, number, or boolean).

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to process the callback in the then() and catch() methods when event writing succeeded or failed.

-
- -- Example - - ``` - hiAppEvent.write("test_event", hiAppEvent.EventType.FAULT, {"int_data":100, "str_data":"strValue"}) - .then((value) => { - // Event writing succeeded. - console.log(`success to write event: ${value}`); - }).catch((err) => { - // Event writing exception: Write the event to the event file after the invalid parameters in the event are ignored, or stop writing the event if the event verification fails. - console.error(`failed to write event because ${err.code}`); - }); - ``` - - -## hiAppEvent.configure - -configure\(config: ConfigOption\): boolean +**Parameters** -Configures the application event logging function, such as setting the event logging switch and maximum size of the directory that stores the event logging files. +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| config | [ConfigOption](#configoption) | Yes| Configuration items for application event logging.| -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

config

-

ConfigOption

-

Yes

-

Configuration items for application event logging.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

Returns true if the configuration is successful; returns false otherwise.

-
- -- Example - - ``` - // Configure the application event logging switch. - hiAppEvent.configure({ - disable: true - }); - - // Configure the maximum size of the directory that stores the event logging files. - hiAppEvent.configure({ - maxStorage: '100M' - }); - ``` +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the configuration is successful; returns **false** otherwise.| + +**Example** +``` +// Set the application event logging switch. +hiAppEvent.configure({ + disable: true +}); + +// Configure the maximum size of the directory that stores the event logging files. +hiAppEvent.configure({ + maxStorage: '100M' +}); +``` -## ConfigOption +## ConfigOption Provides the configuration items for application event logging. - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

disable

-

boolean

-

No

-

Application event logging switch. The value true means to disable the application event logging function, and the value false means the opposite.

-

maxStorage

-

string

-

No

-

Maximum size of the event file storage directory. The default value is 10M. If the specified size is exceeded, the oldest event logging files in the storage directory will be deleted to free up space.

-
- -## EventType +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| disable | boolean | No| Application event logging switch. The value true means to disable the application event logging function, and the value false means the opposite.| +| maxStorage | string | No| Maximum size of the event file storage directory. The default value is **10M**. If the specified size is exceeded, the oldest event logging files in the storage directory will be deleted to free up space.| + + +## EventType Enumerates event types. - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

FAULT

-

1

-

Fault event

-

STATISTIC

-

2

-

Statistical event

-

SECURITY

-

3

-

Security event

-

BEHAVIOR

-

4

-

Behavior event

-
- -## Event +| Name| Default Value| Description| +| -------- | -------- | -------- | +| FAULT | 1 | Fault event| +| STATISTIC | 2 | Statistical event| +| SECURITY | 3 | Security event| +| BEHAVIOR | 4 | Behavior event| + + +## Event Provides constants that define the names of all predefined events. - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

USER_LOGIN

-

string

-

Yes

-

No

-

User login event.

-

USER_LOGOUT

-

string

-

Yes

-

No

-

User logout event.

-

DISTRIBUTED_SERVICE_START

-

string

-

Yes

-

No

-

Distributed service startup event.

-
- -## Param +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| USER_LOGIN | string | Yes| No| User login event.| +| USER_LOGOUT | string | Yes| No| User logout event.| +| DISTRIBUTED_SERVICE_START | string | Yes| No| Distributed service startup event.| -Provides constants that define the names of all predefined event parameters. - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

USER_ID

-

string

-

Yes

-

No

-

Custom user ID.

-

DISTRIBUTED_SERVICE_NAME

-

string

-

Yes

-

No

-

Distributed service name.

-

DISTRIBUTED_SERVICE_INSTANCE_ID

-

string

-

Yes

-

No

-

Distributed service instance ID.

-
+## Param + +Provides constants that define the names of all predefined event parameters. +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| USER_ID | string | Yes| No| Custom user ID.| +| DISTRIBUTED_SERVICE_NAME | string | Yes| No| Distributed service name.| +| DISTRIBUTED_SERVICE_INSTANCE_ID | string | Yes| No| Distributed service instance ID.| diff --git a/en/application-dev/reference/apis/js-apis-hichecker.md b/en/application-dev/reference/apis/js-apis-hichecker.md new file mode 100644 index 00000000000..dec8de1c541 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-hichecker.md @@ -0,0 +1,126 @@ +# HiChecker + +> **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import hichecker from '@ohos.hichecker'; +``` + + +## System Capabilities + +SystemCapability.HiviewDFX.HiChecker + +## Rule Constants + +Provides the constants of all rule types. + +| Name| Type| Description| +| ---------------------------------- | -------- | ------------------------------------------------------ | +| RULE_CAUTION_PRINT_LOG | BigInt | Alarm rule, which is programmed to print a log when an alarm is generated.| +| RULE_CAUTION_TRIGGER_CRASH | BigInt | Alarm rule. When an alarm is generated, the application exits.| +| RULE_THREAD_CHECK_SLOW_PROCESS | BigInt | Caution rule, which is programmed to detect whether any time-consuming function is invoked.| +| RULE_CHECK_SLOW_EVENT | BigInt | Caution rule, which is programmed to detect whether the event distribution or processing time has exceeded the specified time threshold.| +| RULE_CHECK_ABILITY_CONNECTION_LEAK | BigInt | Caution rule, which is programmed to detect whether ability leakage has occurred.| + + +## hichecker.addRule + +addRule(rule: BigInt): void + +Adds one or more rules. HiChecker detects unexpected operations or gives feedback based on the added rules. + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | ---------------- | +| rule | BigInt | Yes| Rule to be added.| + +**Example** + +``` +// Add a rule. +hichecker.addRule(hichecker.RULE_CAUTION_PRINT_LOG); + +// Add multiple rules. +hichecker.addRule( + hichecker.RULE_CAUTION_PRINT_LOG | hichecker.RULE_CAUTION_TRIGGER_CRASH); +``` + +## hichecker.removeRule + +removeRule(rule: BigInt): void + +Removes one or more rules. The removed rules will become ineffective. + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | ---------------- | +| rule | BigInt | Yes| Rule to be removed.| + +**Example** + +``` +// Remove a rule. +hichecker.removeRule(hichecker.RULE_CAUTION_PRINT_LOG); + +// Remove multiple rules. +hichecker.removeRule( + hichecker.RULE_CAUTION_PRINT_LOG | hichecker.RULE_CAUTION_TRIGGER_CRASH); +``` + +## hichecker.getRule + +getRule(): BigInt + +Obtains a collection of thread, process, and alarm rules that have been added. + +**Return value** + +| Type| Description| +| ------ | ---------------------- | +| BigInt | Collection of added rules.| + +**Example** + +``` +// Add a rule. +hichecker.addRule(hichecker.RULE_THREAD_CHECK_SLOW_PROCESS); + +// Obtain the collection of added rules. +hichecker.getRule(); // return 1n; +``` + +## hichecker.contains + +contains(rule: BigInt): boolean + +Checks whether the specified rule exists in the collection of added rules. If the rule is of the thread level, this operation is performed only on the current thread. + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | ---------------- | +| rule | BigInt | Yes| Rule to be checked.| + +**Return value** + +| Type| Description| +| ------- | ---------------------------------------------------------- | +| boolean | Returns **true** if the rule exists in the collection of added rules; returns **false** otherwise.| + +**Example** + +``` +// Add a rule. +hichecker.addRule(hichecker.RULE_THREAD_CHECK_SLOW_PROCESS); + +// Check whether the added rule exists in the collection of added rules. +hichecker.contains(hichecker.RULE_THREAD_CHECK_SLOW_PROCESS); // return true; +hichecker.contains(hichecker.RULE_CAUTION_PRINT_LOG); // return false; +``` diff --git a/en/application-dev/reference/apis/js-apis-hidebug.md b/en/application-dev/reference/apis/js-apis-hidebug.md new file mode 100644 index 00000000000..78b6282ce68 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-hidebug.md @@ -0,0 +1,170 @@ +# HiDebug + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + +You can run the hidebug command to obtain the memory usage of an application, including the static heap memory (native heap) and proportional set size (PSS) occupied by the application process. You can also export VM memory slices and collect VM CPU profiling data. + +## Modules to Import + +``` +import hidebug from '@ohos.hidebug'; +``` + + +## System Capabilities +SystemCapability.HiviewDFX.HiProfiler.HiDebug + + +## hidebug.getNativeHeapSize + +getNativeHeapSize(): bigint + +Obtains the total size of the native heap memory. + + +- **Return value** + | Type| Description| + | -------- | -------- | + | bigint | Total size of the native heap memory.| + + +- **Example** + ``` + let nativeHeapSize = hidebug.getNativeHeapSize(); + ``` + + +## hidebug.getNativeHeapAllocatedSize + +getNativeHeapAllocatedSize(): bigint + +Obtains the size of the allocated native heap memory. + + +- **Return value** + | Type| Description| + | -------- | -------- | + | bigint | Size of the allocated native heap memory.| + + +- **Example** + ``` + let nativeHeapAllocatedSize = hidebug.getNativeHeapAllocatedSize(); + ``` + + +## hidebug.getNativeHeapFreeSize + +getNativeHeapFreeSize(): bigint + +Obtains the size of the free native heap memory. + + +- **Return value** + | Type| Description| + | -------- | -------- | + | bigint | Size of the free native heap memory.| + + +- **Example** + ``` + let nativeHeapFreeSize = hidebug.getNativeHeapFreeSize(); + ``` + + +## hidebug.getPss + +getPss(): bigint + +Obtains the PSS of this process. + + +- **Return value** + | Type| Description| + | -------- | -------- | + | bigint | PSS of the process.| + + +- **Example** + ``` + let pss = hidebug.getPss(); + ``` + + +## hidebug.getSharedDirty + +getSharedDirty(): bigint + +Obtains the size of the shared dirty memory of this process. + + +- **Return value** + | Type| Description| + | -------- | -------- | + | bigint | Size of the shared dirty memory of the process.| + + +- **Example** + ``` + let sharedDirty = hidebug.getSharedDirty()); + ``` + + +## hidebug.startProfiling + +startProfiling(filename : string) : void + +Starts the profiling method. `startProfiling()` and `stopProfiling()` are called in pairs. `startProfiling()` always occurs before `stopProfiling()`; that is, calling the functions in the following sequences is prohibited: `start->start->stop`, `start->stop->stop`, and `start->start->stop->stop`. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------ | ---- | ------------------------------------------------------------ | +| filename | string | Yes| User-defined profile name. The `filename.json` file is generated in the `files` directory of the application based on the specified `filename`.| + +**Example** + +```js +hidebug.startProfiling("cpuprofiler-20220216"); +// Code block +// ... +// Code block +hidebug.stopProfiling(); +``` + + + +## hidebug.stopProfiling + +stopProfiling() : void + +Stops the profiling method. `stopProfiling()` and `startProfiling()` are called in pairs. `stopProfiling()` always occurs after `startProfiling()`; that is, calling the functions in the following sequences is prohibited: `start->start->stop`, `start->stop->stop`, and `start->start->stop->stop`. + +**Example** + +```js +hidebug.startProfiling("cpuprofiler-20220216"); +// Code block +// ... +// Code block +hidebug.stopProfiling(); +``` + +## hidebug.dumpHeapData + +dumpHeapData(filename : string) : void + +Exports the heap data. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------ | ---- | ------------------------------------------------------------ | +| filename | string | Yes| User-defined heap file name. The `filename.heapsnapshot` file is generated in the `files` directory of the app based on the specified `filename`.| + +**Example** + +```js +hidebug.dumpHeapData("heap-20220216"); +``` diff --git a/en/application-dev/reference/apis/js-apis-hitracechain.md b/en/application-dev/reference/apis/js-apis-hitracechain.md index 370e48bd2a3..70ac9e5d594 100644 --- a/en/application-dev/reference/apis/js-apis-hitracechain.md +++ b/en/application-dev/reference/apis/js-apis-hitracechain.md @@ -1,6 +1,6 @@ # Distributed Call Chain Tracing -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import @@ -68,20 +68,24 @@ begin(name: string, flags: number = HiTraceFlag.DEFAULT): HiTraceId Starts call chain tracing. This API works in synchronous manner. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | name | string | Yes| Traced service name.| - | flags | number | Yes| [Trace flag combination](#hitraceflag).| -- Return value - | Type| Description| - | -------- | -------- | - | [HiTraceId](#hitraceid) | **HiTraceId** instance.| - -- Example - ``` - let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC | hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); - ``` +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Traced service name.| +| flags | number | Yes| Trace flag combination. For details, see [HiTraceFlag](#hitraceflag).| + +**Return value** + +| Type| Description| +| -------- | -------- | +| [HiTraceId](#hitraceid) | **HiTraceId** instance.| + +**Example** + +``` +let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC | hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); +``` ## hiTraceChain.end @@ -89,17 +93,19 @@ end(id: HiTraceId): void Stops call chain tracing. This API works in synchronous manner. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| + +**Example** -- Example - ``` - let asyncTraceId = hiTraceChain.begin("business"); - // End the call chain tracing after the service logic is executed for several times. - hiTraceChain.end(asyncTraceId); - ``` +``` +let asyncTraceId = hiTraceChain.begin("business"); +// End the call chain tracing after the service logic is executed for several times. +hiTraceChain.end(asyncTraceId); +``` ## hiTraceChain.getId @@ -107,17 +113,19 @@ getId(): HiTraceId Obtains the trace ID. This API works in synchronous manner. -- Return value - | Type| Description| - | -------- | -------- | - | [HiTraceId](#hitraceid) | **HiTraceId** instance.| +**Return value** + +| Type| Description| +| -------- | -------- | +| [HiTraceId](#hitraceid) | **HiTraceId** instance.| -- Example - ``` - let traceId = hiTraceChain.begin("business"); - // Obtain the current trace ID after the service logic is executed for several times. - let curTraceId = hiTraceChain.getId(); - ``` +**Example** + +``` +let traceId = hiTraceChain.begin("business"); +// Obtain the current trace ID after the service logic is executed for several times. +let curTraceId = hiTraceChain.getId(); +``` ## hiTraceChain.setId @@ -125,17 +133,19 @@ setId(id: HiTraceId): void Sets a trace ID. This API works in synchronous manner. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| -- Example - ``` - let traceId = hiTraceChain.begin("business"); - // Set the current trace ID after the service logic is executed for several times. - hiTraceChain.setId(asyncTraceId); - ``` +**Example** + +``` +let traceId = hiTraceChain.begin("business"); +// Set the current trace ID after the service logic is executed for several times. +hiTraceChain.setId(asyncTraceId); +``` ## hiTraceChain.clearId @@ -143,12 +153,13 @@ clearId(): void Clears the trace ID. This API works in synchronous manner. -- Example - ``` - let traceId = hiTraceChain.begin("business"); - // Clear the current trace ID after the service logic is executed for several times. - hiTraceChain.clearId(); - ``` +**Example** + +``` +let traceId = hiTraceChain.begin("business"); +// Clear the current trace ID after the service logic is executed for several times. +hiTraceChain.clearId(); +``` ## hiTraceChain.createSpan @@ -156,17 +167,19 @@ createSpan(): HiTraceId Creates a trace span. This API works in synchronous manner. -- Return value - | Type| Description| - | -------- | -------- | - | [HiTraceId](#hitraceid) | **HiTraceId** instance.| +**Return value** -- Example - ``` - let traceId = hiTraceChain.begin("business"); - // Create a trace span after the service logic is executed for several times. - let spanTraceId = hiTraceChain.createSpan(); - ``` +| Type| Description| +| -------- | -------- | +| [HiTraceId](#hitraceid) | **HiTraceId** instance.| + +**Example** + +``` +let traceId = hiTraceChain.begin("business"); +// Create a trace span after the service logic is executed for several times. +let spanTraceId = hiTraceChain.createSpan(); +``` ## hiTraceChain.tracepoint @@ -174,20 +187,22 @@ tracepoint(mode: HiTraceCommunicationMode, type: HiTraceTracepointType, id: HiTr Triggers a trace point. This API works in synchronous manner. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | mode | [HiTraceCommunicationMode](#hitracecommunicationmode) | Yes| Communication mode for the trace point.| - | type | [HiTraceTracepointType](#hitracetracepointtype)| Yes| Trace point type.| - | id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance for trace point triggering.| - | msg | string | No| Trace description passed for trace point triggering.| - -- Example - ``` - let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC | hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); - // Trigger the trace point after the service logic is executed for several times. - hiTraceChain.tracepoint(hiTraceChain.HiTraceCommunicationMode.THREAD, hiTraceChain.HiTraceTracepointType.SS, asyncTraceId, "Just a example"); - ``` +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| mode | [HiTraceCommunicationMode](#hitracecommunicationmode) | Yes| Communication mode for the trace point.| +| type | [HiTraceTracepointType](#hitracetracepointtype)| Yes| Trace point type.| +| id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance for trace point triggering.| +| msg | string | No| Trace description passed for trace point triggering.| + +**Example** + +``` +let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC | hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); +// Trigger the trace point after the service logic is executed for several times. +hiTraceChain.tracepoint(hiTraceChain.HiTraceCommunicationMode.THREAD, hiTraceChain.HiTraceTracepointType.SS, asyncTraceId, "Just a example"); +``` ## hiTraceChain.isValid @@ -195,20 +210,24 @@ isValid(id: HiTraceId): boolean Checks whether a **HiTraceId** instance is valid. This API works in synchronous manner. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| -- Return value - | Type| Description| - | -------- | -------- | - | boolean | Returns **true** if the **HiTraceId** instance is valid; returns **false** otherwise.| - -- Example - ``` - let traceId = hiTraceChain.begin("business"); - let traceIdIsvalid = hiTraceChain.isValid(traceId); - ``` +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the **HiTraceId** instance is valid; returns **false** otherwise.| + +**Example** + +``` +let traceId = hiTraceChain.begin("business"); +let traceIdIsvalid = hiTraceChain.isValid(traceId); +``` ## hiTraceChain.isFlagEnabled @@ -216,21 +235,26 @@ isFlagEnabled(id: HiTraceId, flag: HiTraceFlag): boolean Checks whether the specified trace flag in the **HiTraceId** instance is enabled. This API works in synchronous manner. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| - | flag | [HiTraceFlag](#hitraceflag) | Yes| Specified trace flag.| -- Return value - | Type| Description| - | -------- | -------- | - | boolean | Returns **true** if the specified trace flag in the **HiTraceId** instance is enabled; returns **false** otherwise.| -- Example - ``` - let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC); - // The value of enabledDoNotCreateSpanFlag is true. - let enabledDoNotCreateSpanFlag = hiTraceChain.isFlagEnabled(asyncTraceId, hiTraceChain.HiTraceFlag.INCLUDE_ASYNC); - ``` +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| +| flag | [HiTraceFlag](#hitraceflag) | Yes| Specified trace flag.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified trace flag in the **HiTraceId** instance is enabled; returns **false** otherwise.| + +**Example** + +``` +let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC); +// The value of enabledDoNotCreateSpanFlag is true. +let enabledDoNotCreateSpanFlag = hiTraceChain.isFlagEnabled(asyncTraceId, hiTraceChain.HiTraceFlag.INCLUDE_ASYNC); +``` ## hiTraceChain.enableFlag @@ -238,16 +262,17 @@ enableFlag(id: HiTraceId, flag: HiTraceFlag): void Enables the specified trace flag in the **HiTraceId** instance. This API works in synchronous manner. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| - | flag | [HiTraceFlag](#hitraceflag) | Yes| Specified trace flag.| - -- Example - ``` - let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC); - hiTraceChain.enable(asyncTraceId, hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); - // The value of enabledDoNotCreateSpanFlag is true. - let enabledDoNotCreateSpanFlag = hiTraceChain.isFlagEnabled(asyncTraceId, hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); - ``` +**Parameters** +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| id | [HiTraceId](#hitraceid) | Yes| **HiTraceId** instance.| +| flag | [HiTraceFlag](#hitraceflag) | Yes| Specified trace flag.| + +**Example** + +``` +let asyncTraceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC); +hiTraceChain.enable(asyncTraceId, hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); +// The value of enabledDoNotCreateSpanFlag is true. +let enabledDoNotCreateSpanFlag = hiTraceChain.isFlagEnabled(asyncTraceId, hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN); +``` diff --git a/en/application-dev/reference/apis/js-apis-hitracemeter.md b/en/application-dev/reference/apis/js-apis-hitracemeter.md index fc8599f907a..14e6b745d1e 100644 --- a/en/application-dev/reference/apis/js-apis-hitracemeter.md +++ b/en/application-dev/reference/apis/js-apis-hitracemeter.md @@ -1,6 +1,6 @@ # Performance Tracing -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -22,22 +22,24 @@ startTrace(name: string, taskId: number, expectedTime?: number): void Starts a trace task. **expectedTime** is an optional parameter, which specifies the expected duration of the trace. +If multiple trace tasks with the same name need to be performed at the same time or a trace task needs to be performed multiple times concurrently, different task IDs must be specified in **startTrace**. -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | name | string | Yes| Name of the trace task to start.| - | taskId | number | Yes| Task ID.| - | expectedTime | number | No| Expected duration of the trace, in ms.| +If the trace tasks with the same name are not performed at the same time, the same taskId can be used. For a specific example, refer to an example in [hiTraceMeter.finishTrace](#hitracemeterfinishtrace). - > ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** - > If multiple trace tasks with the same name need to be performed at the same time or a trace task needs to be performed multiple times concurrently, different task IDs must be specified in **startTrace**. If the trace tasks with the same name are not performed at the same time, the same task ID can be used. For details, see the **hiTraceMeter.finishTrace** example. +**Parameters** -- Example - ``` - hiTraceMeter.startTrace("myTestFunc", 1); - hiTraceMeter.startTrace("myTestFunc", 1, 5); // The expected duration of the trace task is 5 ms. - ``` +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the trace task to start.| +| taskId | number | Yes| Task ID.| +| expectedTime | number | No| Expected duration of the trace, in ms.| + +**Example** + +``` +hiTraceMeter.startTrace("myTestFunc", 1); +hiTraceMeter.startTrace("myTestFunc", 1, 5); // The expected duration of the trace task is 5 ms. +``` ## hiTraceMeter.finishTrace @@ -46,42 +48,42 @@ finishTrace(name: string, taskId: number): void Stops a trace task. +To stop a trace task, the values of name and task ID in **finishTrace** must be the same as those in [startTrace](#hitracemeterstarttrace). + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the trace task to start.| +| taskId | number | Yes| Task ID.| + +**Example** + +``` +hiTraceMeter.finishTrace("myTestFunc", 1); +``` + +``` +// Start track tasks with the same name concurrently. +hiTraceMeter.startTrace("myTestFunc", 1); +// Service flow +hiTraceMeter.startTrace("myTestFunc", 2); // The second trace task starts while the first task is still running. The first and second tasks have the same name but different task IDs. +// Service flow +hiTraceMeter.finishTrace("myTestFunc", 1); +// Service flow +hiTraceMeter.finishTrace("myTestFunc", 2); +``` -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | name | string | Yes| Name of the trace task to start.| - | taskId | number | Yes| Task ID.| - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** - > To stop a trace task, the values of name and task ID in **finishTrace** must be the same as those in **startTrace**. - -- Example - ``` - hiTraceMeter.finishTrace("myTestFunc", 1); - ``` - - ``` - // Start track tasks with the same name concurrently. - hiTraceMeter.startTrace("myTestFunc", 1); - // Service flow - hiTraceMeter.startTrace("myTestFunc", 2); // The second trace task starts while the first task is still running. The first and second tasks have the same name but different task IDs. - // Service flow - hiTraceMeter.finishTrace("myTestFunc", 1); - // Service flow - hiTraceMeter.finishTrace("myTestFunc", 2); - ``` - - ``` - // Start track tasks with the same name at different times. - hiTraceMeter.startTrace("myTestFunc", 1); - // Service flow - hiTraceMeter.finishTrace("myTestFunc", 1); // The first trace task ends. - // Service flow - hiTraceMeter.startTrace("myTestFunc", 1); // The second trace task starts after the first task ends. The two tasks have the same name and task ID. - // Service flow - hiTraceMeter.finishTrace("myTestFunc", 1); - ``` +``` +// Start track tasks with the same name at different times. +hiTraceMeter.startTrace("myTestFunc", 1); +// Service flow +hiTraceMeter.finishTrace("myTestFunc", 1); // The first trace task ends. +// Service flow +hiTraceMeter.startTrace("myTestFunc", 1); // The second trace task starts after the first task ends. The two tasks have the same name and task ID. +// Service flow +hiTraceMeter.finishTrace("myTestFunc", 1); +``` ## hiTraceMeter.traceByValue @@ -90,18 +92,18 @@ traceByValue(name: string, value: number): void Traces the value changes of a variable. +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the variable.| +| value | number | Yes| Value of the variable.| -- Parameters - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | name | string | Yes| Name of the variable.| - | value | number | Yes| Value of the variable.| - -- Example - ``` - let traceCount = 3; - hiTraceMeter.traceByValue("myTestCount", traceCount); - traceCount = 4; - hiTraceMeter.traceByValue("myTestCount", traceCount); - // Service flow - ``` +**Example** +``` +let traceCount = 3; +hiTraceMeter.traceByValue("myTestCount", traceCount); +traceCount = 4; +hiTraceMeter.traceByValue("myTestCount", traceCount); +// Service flow +``` diff --git a/en/application-dev/reference/apis/js-apis-power.md b/en/application-dev/reference/apis/js-apis-power.md index 6932b76b924..6cd3cbf21a4 100644 --- a/en/application-dev/reference/apis/js-apis-power.md +++ b/en/application-dev/reference/apis/js-apis-power.md @@ -1,9 +1,10 @@ -# Power Management +# Power Management ->![](../../public_sys-resources/icon-note.gif) **NOTE:** ->The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## Modules to Import + +## Modules to Import ``` import power from '@ohos.power'; @@ -14,163 +15,94 @@ import power from '@ohos.power'; SystemCapability.PowerManager.PowerManager -## power.shutdownDevice +## power.shutdownDevice -shutdownDevice\(reason: string\): void +shutdownDevice(reason: string): void Shuts down the system. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

reason

-

string

-

Yes

-

Reason for system shutdown.

-
- -- Example - - ``` - power.shutdownDevice("shutdown_test"); - console.info('power_shutdown_device_test success') - ``` - - -## power.rebootDevice - -rebootDevice\(reason: string\): void - -Reboots the system. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

reason

-

string

-

Yes

-

Reason for system reboot.

-
- -- Example - - ``` - power.rebootDevice("reboot_test"); - console.info('power_reboot_device_test success') - ``` - - -## power.isScreenOn - -isScreenOn\(callback: AsyncCallback\): void +Before using this API, you must declare the **ohos.permission.SHUTDOWN** permission. -Checks the screen status of the current device. +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| reason | string | Yes| Reason for system shutdown.| + +**Example** + +``` +power.shutdownDevice("shutdown_test"); +console.info('power_shutdown_device_test success') +``` + + +## power.rebootDevice -- Parameters - - - - - - - - - - - - - - -

Type

-

Type

-

Mandatory

-

Description

-

callback

-

AsyncCallback<boolean>

-

Yes

-

Callback used to obtain the return value.

-

The value true indicates that the screen is on, and value false indicates the opposite.

-
- - -- Example - - ``` - power.isScreenOn((error, screenOn) => { - if (typeof error === "undefined") { - console.info('screenOn status is ' + screenOn); - } else { - console.log('error: ' + error); - } - }) - ``` - - -## power.isScreenOn - -isScreenOn\(\): Promise +rebootDevice(reason: string): void + +Restarts the device. + +Before using this API, you must declare the **ohos.permission.REBOOT** permission (to reboot) or the **ohos.permission.REBOOT_RECOVERY** permission (to reboot and enter the recovery mode) + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| reason | string | Yes| Reason for system reboot.| + +**Example** + +``` +power.rebootDevice("reboot_test"); +console.info('power_reboot_device_test success') +``` + + +## power.isScreenOn + +isScreenOn(callback: AsyncCallback<boolean>): void Checks the screen status of the current device. -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise used to asynchronously obtain the return value. The value true indicates that the screen is on, and value false indicates the opposite.

-
- -- Example - - ``` - power.isScreenOn() - .then(screenOn => { +**Parameters** + +| Type| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<boolean> | Yes| Callback used to obtain the return value.
The value **true** indicates that the screen is on, and value **false** indicates the opposite.| + +**Example** + +``` +power.isScreenOn((error, screenOn) => { + if (typeof error === "undefined") { console.info('screenOn status is ' + screenOn); - }) - .catch(error => { + } else { console.log('error: ' + error); - }) - ``` + } +}) +``` +## power.isScreenOn + +isScreenOn(): Promise<boolean> + +Checks the screen status of the current device. + +**Return value** +| Type| Description| +| -------- | -------- | +| Promise<boolean> | Promise used to asynchronously obtain the return value.
The value **true** indicates that the screen is on, and value **false** indicates the opposite.| + +**Example** + +``` +power.isScreenOn() +.then(screenOn => { + console.info('screenOn status is ' + screenOn); +}) +.catch(error => { + console.log('error: ' + error); +}) +``` diff --git a/en/application-dev/reference/apis/js-apis-radio.md b/en/application-dev/reference/apis/js-apis-radio.md index 0c5c2e4e316..a59cb7b5346 100644 --- a/en/application-dev/reference/apis/js-apis-radio.md +++ b/en/application-dev/reference/apis/js-apis-radio.md @@ -1,6 +1,6 @@ # Radio ->**Note:** +>**NOTE** > >The initial APIs of this module are supported since API version 6. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -19,21 +19,21 @@ Obtains the radio access technologies (RATs) used by the CS and PS domains. This Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ------------------------------------------------------------ | ---- | -------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\<{psRadioTech: [RadioTechnology](#RadioTechnology), csRadioTech:[RadioTechnology](#RadioTechnology)}\> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\<{psRadioTech: [RadioTechnology](#RadioTechnology), csRadioTech:[RadioTechnology](#RadioTechnology)}\> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - radio.getRadioTech(slotId, (err, data) =>{ - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +let slotId = 0; +radio.getRadioTech(slotId, (err, data) =>{ + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## radio.getRadioTech @@ -44,52 +44,52 @@ Obtains the RAT used by the CS and PS domains. This function uses a promise to r Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ------------------------------------------------------------ | ----------------------------------------------- | - | Promise<{psRadioTech: [RadioTechnology](#RadioTechnology), csRadioTech: [RadioTechnology](#RadioTechnology)}> | Promise used to return the result.| +| Type| Description| +| ------------------------------------------------------------ | ----------------------------------------------- | +| Promise<{psRadioTech: [RadioTechnology](#RadioTechnology), csRadioTech: [RadioTechnology](#RadioTechnology)}> | Promise used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - let promise = radio.getRadioTech(slotId); - promise.then(data => { - console.log(`getRadioTech success, data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getRadioTech fail, err->${JSON.stringify(err)}`); - }); - ``` +``` +let slotId = 0; +let promise = radio.getRadioTech(slotId); +promise.then(data => { + console.log(`getRadioTech success, data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getRadioTech fail, err->${JSON.stringify(err)}`); +}); +``` ## radio.getNetworkState getNetworkState\(callback: AsyncCallback\): void -Obtains the network status. This function uses an asynchronous callback to return the result. +Obtains the network status of the SIM card in the specified slot. This function uses an asynchronous callback to return the result. Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ---------------------------------------------- | ---- | ---------- | - | callback | AsyncCallback\<[NetworkState](#NetworkState)\> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ---------------------------------------------- | ---- | ---------- | +| callback | AsyncCallback\<[NetworkState](#NetworkState)\> | Yes| Callback invoked to traverse the entries in the container.| -- Example +**Example** - ``` - radio.getNetworkState((err, data) =>{ - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +radio.getNetworkState((err, data) =>{ + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## radio.getNetworkState @@ -100,21 +100,21 @@ Obtains the network status of the SIM card in the specified slot. This function Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ---------------------------------------------- | ---- | -------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\<[NetworkState](#NetworkState)\> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ---------------------------------------------- | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\<[NetworkState](#NetworkState)\> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - radio.getNetworkState(slotId, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +let slotId = 0; +radio.getNetworkState(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## radio.getNetworkState @@ -125,29 +125,29 @@ Obtains the network status of the SIM card in the specified slot. This function Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | No| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | No| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ---------------------------------------- | --------------------------- | - | Promise\<[NetworkState](#NetworkState)\> | Promise used to return the result.| +| Type| Description| +| ---------------------------------------- | --------------------------- | +| Promise\<[NetworkState](#NetworkState)\> | Promise used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - let promise = radio.getNetworkState(slotId); - promise.then(data => { - console.log(`getNetworkState success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getNetworkState fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let slotId = 0; +let promise = radio.getNetworkState(slotId); +promise.then(data => { + console.log(`getNetworkState success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getNetworkState fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## radio.getNetworkSelectionMode @@ -156,21 +156,21 @@ getNetworkSelectionMode\(slotId: number, callback: AsyncCallback - **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\<[NetworkSelectionMode](#NetworkSelectionMode)\> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\<[NetworkSelectionMode](#NetworkSelectionMode)\> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - radio.getNetworkSelectionMode(slotId, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +let slotId = 0; +radio.getNetworkSelectionMode(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## radio.getNetworkSelectionMode @@ -179,29 +179,29 @@ getNetworkSelectionMode\(slotId: number\): Promise Obtains the network selection mode of the SIM card in the specified slot. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | -------------------------------------------------------- | ------------------------------- | - | Promise\<[NetworkSelectionMode](#NetworkSelectionMode)\> | Promise used to return the result.| +| Type| Description| +| -------------------------------------------------------- | ------------------------------- | +| Promise\<[NetworkSelectionMode](#NetworkSelectionMode)\> | Promise used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - let promise = radio.getNetworkSelectionMode(slotId); - promise.then(data => { - console.log(`getNetworkSelectionMode success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getNetworkSelectionMode fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let slotId = 0; +let promise = radio.getNetworkSelectionMode(slotId); +promise.then(data => { + console.log(`getNetworkSelectionMode success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getNetworkSelectionMode fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## radio.getISOCountryCodeForNetwork7+ @@ -210,21 +210,21 @@ getISOCountryCodeForNetwork\(slotId: number, callback: AsyncCallback\): Obtains the ISO country code of the network with which the SIM card in the specified slot is registered. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ----------------------- | ---- | ---------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\ | Yes| Callback used to return the result, which is a country code, for example, **CN** (China).| +| Name| Type| Mandatory| Description| +| -------- | ----------------------- | ---- | ---------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result, which is a country code, for example, **CN** (China).| -- Example +**Example** - ``` - let slotId = 0; - radio.getISOCountryCodeForNetwork(slotId, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +let slotId = 0; +radio.getISOCountryCodeForNetwork(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## radio.getISOCountryCodeForNetwork7+ @@ -233,29 +233,29 @@ getISOCountryCodeForNetwork\(slotId: number\): Promise Obtains the ISO country code of the network with which the SIM card in the specified slot is registered. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ----------------- | ------------------------------------------------------------ | - | Promise\ | Promise used to return the result, which is an ISO country code, for example, **CN** (China).| +| Type| Description| +| ----------------- | ------------------------------------------------------------ | +| Promise\ | Promise used to return the result, which is an ISO country code, for example, **CN** (China).| -- Example +**Example** - ``` - let slotId = 0; - let promise = radio.getISOCountryCodeForNetwork(slotId); - promise.then(data => { - console.log(`getISOCountryCodeForNetwork success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getISOCountryCodeForNetwork fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let slotId = 0; +let promise = radio.getISOCountryCodeForNetwork(slotId); +promise.then(data => { + console.log(`getISOCountryCodeForNetwork success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getISOCountryCodeForNetwork fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## radio.getSignalInformation @@ -264,21 +264,21 @@ getSignalInformation\(slotId: number, callback: AsyncCallback - **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\\> | Yes| Callback used to return the result, which is a list of [SignalInformation](#SignalInformation) objects.| +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\\> | Yes| Callback used to return the result, which is a list of [SignalInformation](#SignalInformation) objects.| -- Example +**Example** - ``` - let slotId = 0; - radio.getSignalInformation(slotId, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +let slotId = 0; +radio.getSignalInformation(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## radio.getSignalInformation @@ -287,78 +287,78 @@ getSignalInformation\(slotId: number\): Promise\> Obtains a list of signal strengths of the network with which the SIM card in the specified slot is registered. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ----------------------------------------------------------- | ------------------------------------------------------------ | - | Promise\\> | Promise used to return the result, which is a list of [SignalInformation](#SignalInformation) objects.| +| Type| Description| +| ----------------------------------------------------------- | ------------------------------------------------------------ | +| Promise\\> | Promise used to return the result, which is a list of [SignalInformation](#SignalInformation) objects.| -- Example +**Example** - ``` - let slotId = 0; - let promise = radio.getSignalInformation(slotId); - promise.then(data => { - console.log(`getSignalInformation success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`getSignalInformation fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let slotId = 0; +let promise = radio.getSignalInformation(slotId); +promise.then(data => { + console.log(`getSignalInformation success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`getSignalInformation fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## radio.isRadioOn7+ isRadioOn\(callback: AsyncCallback\): void -Checks whether radio is turned on. This function uses an asynchronous callback to return the result. +Checks whether the radio service is enabled. This function uses an asynchronous callback to return the result. Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ------------------------ | ---- | ------------------------------------------------------- | - | callback | AsyncCallback\ | Yes| Callback used to return the result.
- **true**: Radio is turned on.
- **false**: Radio is turned off.| +| Name| Type| Mandatory| Description| +| -------- | ------------------------ | ---- | ------------------------------------------------------- | +| callback | AsyncCallback\ | Yes| Callback used to return the result.
- **true**: The radio service is enabled.
- **false**: The radio service is disabled.| -- Example +**Example** - ``` - radio.isRadioOn((err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +radio.isRadioOn((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## radio.isRadioOn7+ isRadioOn\(\): Promise -Checks whether radio is turned on. This function uses a promise to return the result. +Checks whether the radio service is enabled. This function uses a promise to return the result. Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. -- Return values +**Return value** - | Type| Description| - | ------------------ | ------------------------------------------------------------ | - | Promise\ | Promise used to return the result.
- **true**: Radio is turned on.
- **false**: Radio is turned off.| +| Type| Description| +| ------------------ | ------------------------------------------------------------ | +| Promise\ | Promise used to return the result.
- **true**: The radio service is enabled.
- **false**: The radio service is disabled.| -- Example +**Example** - ``` - let promise = radio.isRadioOn(); - promise.then(data => { - console.log(`isRadioOn success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`isRadioOn fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = radio.isRadioOn(); +promise.then(data => { + console.log(`isRadioOn success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`isRadioOn fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## RadioTechnology @@ -394,7 +394,7 @@ Defines the signal strength. ## NetworkType -Enumerates network types. +Network type. | Variable| Value| Description| | -------------------- | ---- | ------------------------------------------------------------ | @@ -424,7 +424,7 @@ Defines the network registration status. ## RegState -Enumerates network registration states. +Defines the network registration status. | Variable| Value| Description| | ----------------------------- | ---- | -------------------------- | diff --git a/en/application-dev/reference/apis/js-apis-runninglock.md b/en/application-dev/reference/apis/js-apis-runninglock.md index 106d47b814e..beefced18a8 100644 --- a/en/application-dev/reference/apis/js-apis-runninglock.md +++ b/en/application-dev/reference/apis/js-apis-runninglock.md @@ -1,403 +1,226 @@ -# Running Lock +# Running Lock ->![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE:** ->The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## Modules to Import + +## Modules to Import ``` import runninglock from '@ohos.runningLock'; ``` + ## System Capabilities SystemCapability.PowerManager.PowerManager -## RunningLockType - -Enumerates the types of running locks. - - - - - - - - - - - - - - - - -

Description

-

Default Value

-

Description

-

BACKGROUND

-

1

-

A lock that prevents the system from hibernating.

-

PROXIMITY_SCREEN_CONTROL

-

2

-

A lock that determines whether to turn on or off the screen based on the distance away from the screen.

-
- -## runninglock.isRunningLockTypeSupported - -isRunningLockTypeSupported\(type: RunningLockType, callback: AsyncCallback\): void - -Checks whether a specified type of **RunningLock** is supported. This function uses an asynchronous callback to return the result. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

type

-

RunningLockType

-

Yes

-

Type of the RunningLock object.

-

callback

-

AsyncCallback<boolean>

-

Yes

-

Callback used to obtain the return value.

-

The value true indicates that the specified type of RunningLock is supported, and value false indicates the opposite.

-
- -- Example - - ``` - runningLock.isRunningLockTypeSupported(runningLock.RunningLockType.BACKGROUND, (error, supported) => { - if (typeof error === "undefined") { - console.info('BACKGROUND support status is ' + supported); - } else { - console.log('error: ' + error); - } - }) - ``` - - -## runninglock.isRunningLockTypeSupported - -isRunningLockTypeSupported\(type: RunningLockType\): Promise - -Checks whether a specified type of **RunningLock** is supported. This function uses a promise to return the result. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

type

-

RunningLockType

-

Yes

-

Type of the RunningLock object.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise used to asynchronously obtain the return value. The value true indicates that the specified type of RunningLock is supported, and value false indicates the opposite.

-
- -- Example - - ``` - runningLock.isRunningLockTypeSupported(runningLock.RunningLockType.PROXIMITY_SCREEN_CONTROL) - .then(supported => { - console.info('PROXIMITY_SCREEN_CONTROL support status is ' + supported); - }) - .catch(error => { +## RunningLockType + +Enumerates the types of **RunningLock** objects. + +| Name| Default Value| Description| +| -------- | -------- | -------- | +| BACKGROUND | 1 | Defines a **RunningLock** object.| +| PROXIMITY_SCREEN_CONTROL | 2 | A lock that determines whether to turn on or off the screen based on the distance away from the screen.| + + +## isRunningLockTypeSupported + +isRunningLockTypeSupported(type: RunningLockType, callback: AsyncCallback<boolean>): void + +Checks whether a specified type of RunningLock is supported. This function uses an asynchronous callback to return the result. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| type | RunningLockType | Yes| Type of the **RunningLock** object.| +| callback | AsyncCallback<boolean> | Yes| Callback used to obtain the return value.
The value **true** indicates that the specified type of **RunningLock** is supported, and value **false** indicates the opposite.| + +**Example** + +``` +runningLock.isRunningLockTypeSupported(runningLock.RunningLockType.BACKGROUND, (error, supported) => { + if (typeof error === "undefined") { + console.info('BACKGROUND support status is ' + supported); + } else { console.log('error: ' + error); - }); - ``` - - -## runninglock.createRunningLock - -createRunningLock\(name: string, type: RunningLockType, callback: AsyncCallback\): void - -Creates a **RunningLock** object. - -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

name

-

string

-

Yes

-

Name of the RunningLock object.

-

type

-

RunningLockType

-

Yes

-

Type of the RunningLock object to be created.

-

callback

-

AsyncCallback<RunningLock>

-

Yes

-

Callback used to obtain the return value.

-
- -- Example - - ``` - runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) - .then(runninglock => { - var used = runninglock.isUsed(); - console.info('runninglock is used: ' + used); - runninglock.lock(500); - used = runninglock.isUsed(); - console.info('after lock runninglock is used ' + used); - }) - .catch(error => { - console.log('create runningLock test error: ' + error); - }) - ``` - - -## runninglock.createRunningLock - -createRunningLock\(name: string, type: RunningLockType\): Promise - -Creates a **RunningLock** object. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

name

-

string

-

Yes

-

Name of the RunningLock object.

-

type

-

RunningLockType

-

Yes

-

Type of the RunningLock object to be created.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<RunningLock>

-

Promise used to asynchronously obtain the returned RunningLock object.

-
- -- Example - - ``` - runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) - .then(runninglock => { - console.info('create runningLock success'); - }) - .catch(error => { - console.log('create runningLock test error: ' + error); - }) - ``` - - -## RunningLock - -Defines a **RunningLock** object. - -### lock - -lock\(timeout: number\): void - -Locks and holds a **RunningLock** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

timeout

-

number

-

No

-

Duration for locking and holding the RunningLock object.

-
- -- Example - - ``` - runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) - .then(runningLock => { - runningLock.lock(100) - console.info('create runningLock success') - }) - .catch(error => { - console.log('Lock runningLock test error: ' + error) - }); - ``` - - -### unlock - -unlock\(\): void - -Releases a **Runninglock** object. - -- Example - - ``` - runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) - .then(runningLock => { - runningLock.unlock() - console.info('unLock runningLock success') - }) - .catch(error => { - console.log('unLock runningLock test error: ' + error) - }); - ``` - - -### isUsed - -isUsed\(\): boolean - -Checks the status of the **Runninglock** object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

Returns true if the Runninglock object is held; returns false if the Runninglock object is released.

-
- -- Example - - ``` - runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) - .then(runningLock => { - var used = runningLock.isUsed() - console.info('runningLock used status: ' + used) - }) - .catch(error => { - console.log('runningLock isUsed test error: ' + error) - }); - ``` + } +}) +``` + + +## isRunningLockTypeSupported + +isRunningLockTypeSupported(type: RunningLockType): Promise<boolean> + +Checks whether a specified type of **RunningLock** is supported. This function uses an asynchronous callback to return the result. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| type | RunningLockType | Yes| Type of the **RunningLock** object.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| Promise<boolean> | Promise used to asynchronously obtain the return value. The value **true** indicates that the specified type of **RunningLock** is supported, and value **false** indicates the opposite.| + +**Example** + +``` +runningLock.isRunningLockTypeSupported(runningLock.RunningLockType.PROXIMITY_SCREEN_CONTROL) +.then(supported => { + console.info('PROXIMITY_SCREEN_CONTROL support status is ' + supported); +}) +.catch(error => { + console.log('error: ' + error); +}); +``` + + +## createRunningLock + +createRunningLock(name: string, type: RunningLockType, callback: AsyncCallback<RunningLock>): void + +Creates a **RunningLock** object. + +Before using this API, you must declare the **ohos.permission.RUNNING_LOCK** permission. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the **RunningLock** object.| +| type | RunningLockType | Yes| Type of the **RunningLock** object to be created.| +| callback | AsyncCallback<[RunningLock](#runninglock)> | Yes| Callback used to obtain the return value.| + +**Example** + +``` +runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) +.then(runninglock => { + var used = runninglock.isUsed(); + console.info('runninglock is used: ' + used); + runninglock.lock(500); + used = runninglock.isUsed(); + console.info('after lock runninglock is used ' + used); +}) +.catch(error => { + console.log('create runningLock test error: ' + error); +}) +``` + + +## createRunningLock +createRunningLock(name: string, type: RunningLockType): Promise<RunningLock> +Creates a **RunningLock** object. + +Before using this API, you must declare the **ohos.permission.RUNNING_LOCK** permission. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| name | string | Yes| Name of the **RunningLock** object.| +| type | RunningLockType | Yes| Type of the **RunningLock** object to be created.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| Promise<[RunningLock](#runninglock)> | Promise used to asynchronously obtain the returned **RunningLock** object.| + +**Example** + +``` +runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) +.then(runninglock => { + console.info('create runningLock success'); +}) +.catch(error => { + console.log('create runningLock test error: ' + error); +}) +``` + + +## RunningLock + +Defines a **RunningLock** object. + + +### lock + +lock(timeout: number): void + +Locks and holds a **RunningLock** object. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| timeout | number | No| Duration for locking and holding the **RunningLock** object.| + +**Example** + +``` +runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) +.then(runningLock => { + runningLock.lock(100) + console.info('create runningLock success') +}) +.catch(error => { + console.log('Lock runningLock test error: ' + error) +}); +``` + + +### unlock + +unlock(): void + +Releases a **Runninglock** object. + +**Example** + +``` +runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) +.then(runningLock => { + runningLock.unlock() + console.info('unLock runningLock success') +}) +.catch(error => { + console.log('unLock runningLock test error: ' + error) +}); +``` + + +### isUsed + +isUsed(): boolean + +Checks the status of the **Runninglock** object. + +**Return value** +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the **Runninglock** object is held; returns **false** if the **Runninglock** object is released.| + +**Example** + +``` +runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) +.then(runningLock => { + var used = runningLock.isUsed() + console.info('runningLock used status: ' + used) +}) +.catch(error => { + console.log('runningLock isUsed test error: ' + error) +}); +``` diff --git a/en/application-dev/reference/apis/js-apis-sim.md b/en/application-dev/reference/apis/js-apis-sim.md index bf7ff76d158..4af4fa4a29e 100644 --- a/en/application-dev/reference/apis/js-apis-sim.md +++ b/en/application-dev/reference/apis/js-apis-sim.md @@ -1,6 +1,6 @@ # SIM Management ->**Note:** +>**NOTE** > >The initial APIs of this module are supported since API version 6. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -18,21 +18,20 @@ Obtains the integrated circuit card identity (ICCID) of the SIM card in the spe Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | --------------------------- | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback<string> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | --------------------------- | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback<string> | Yes| Callback used to return the result.| +**Example** -- Example - - ``` - sim.getSimIccId(0, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sim.getSimIccId(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sim.getSimIccId @@ -43,28 +42,28 @@ Obtains the ICCID of the SIM card in the specified slot. This function uses a pr Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | --------------------- | ---------------------------------- | - | Promise<string> | Promise used to return the result.| +| Type| Description| +| --------------------- | ---------------------------------- | +| Promise<string> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = sim.getSimIccId(0); - promise.then(data => { - console.log(`getSimIccId success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getSimIccId fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = sim.getSimIccId(0); +promise.then(data => { + console.log(`getSimIccId success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getSimIccId fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sim.getDefaultVoiceSlotId7+ @@ -72,19 +71,19 @@ getDefaultVoiceSlotId\(callback: AsyncCallback\): void Obtains the default slot ID of the SIM card that provides voice services. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | --------------------------- | ---- | ---------- | - | callback | AsyncCallback<number> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | --------------------------- | ---- | ---------- | +| callback | AsyncCallback<number> | Yes| Callback invoked to traverse the entries in the container.| -- Example +**Example** - ``` - sim.getDefaultVoiceSlotId((err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sim.getDefaultVoiceSlotId((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sim.getDefaultVoiceSlotId7+ @@ -93,22 +92,22 @@ getDefaultVoiceSlotId\(\): Promise Obtains the default slot ID of the SIM card that provides voice services. This function uses a promise to return the result. -- Return values +**Return value** - | Type| Description| - | ----------------- | --------------------------------------- | - | Promise\ | Promise used to return the result.| +| Type| Description| +| ----------------- | --------------------------------------- | +| Promise\ | Promise used to return the result.| -- Example +**Example** - ``` - let promise = sim.getDefaultVoiceSlotId(); - promise.then(data => { - console.log(`getDefaultVoiceSlotId success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getDefaultVoiceSlotId fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = sim.getDefaultVoiceSlotId(); +promise.then(data => { + console.log(`getDefaultVoiceSlotId success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getDefaultVoiceSlotId fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sim.getISOCountryCodeForSim @@ -116,20 +115,20 @@ getISOCountryCodeForSim\(slotId: number, callback: AsyncCallback\): voi Obtains the ISO country code of the SIM card in the specified slot. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ----------------------- | ---- | ---------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\ | Yes| Callback used to return the result, which is a country code, for example, **CN** (China).| +| Name| Type| Mandatory| Description| +| -------- | ----------------------- | ---- | ---------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result, which is a country code, for example, **CN** (China).| -- Example +**Example** - ``` - sim.getISOCountryCodeForSim(0, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sim.getISOCountryCodeForSim(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sim.getISOCountryCodeForSim @@ -138,28 +137,28 @@ getISOCountryCodeForSim\(slotId: number\): Promise Obtains the ISO country code of the SIM card in the specified slot. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ----------------- | ------------------------------------------------------------ | - | Promise\ | Promise used to return the result, which is a country code, for example, **CN** (China).| +| Type| Description| +| ----------------- | ------------------------------------------------------------ | +| Promise\ | Promise used to return the result, which is a country code, for example, **CN** (China).| -- Example +**Example** - ``` - let promise = sim.getISOCountryCodeForSim(0); - promise.then(data => { - console.log(`getISOCountryCodeForSim success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getISOCountryCodeForSim fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = sim.getISOCountryCodeForSim(0); +promise.then(data => { + console.log(`getISOCountryCodeForSim success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getISOCountryCodeForSim fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sim.getSimOperatorNumeric @@ -168,20 +167,20 @@ getSimOperatorNumeric\(slotId: number, callback: AsyncCallback\): void Obtains the public land mobile network (PLMN) ID of the SIM card in the specified slot. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ----------------------- | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\ | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ----------------------- | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result.| -- Example +**Example** - ``` - sim.getSimOperatorNumeric(0, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sim.getSimOperatorNumeric(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sim.getSimOperatorNumeric @@ -190,28 +189,28 @@ getSimOperatorNumeric\(slotId: number\): Promise Obtains the PLMN ID of the SIM card in the specified slot. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ----------------- | ------------------------------------------------ | - | Promise\ | Promise used to return the result.| +| Type| Description| +| ----------------- | ------------------------------------------------ | +| Promise\ | Promise used to return the result.| -- Example +**Example** - ``` - let promise = sim.getSimOperatorNumeric(0); - promise.then(data => { - console.log(`getSimOperatorNumeric success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getSimOperatorNumeric fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = sim.getSimOperatorNumeric(0); +promise.then(data => { + console.log(`getSimOperatorNumeric success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getSimOperatorNumeric fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sim.getSimSpn @@ -220,20 +219,20 @@ getSimSpn\(slotId: number, callback: AsyncCallback\): void Obtains the service provider name (SPN) of the SIM card in the specified slot. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ----------------------- | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\ | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ----------------------- | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result.| -- Example +**Example** - ``` - sim.getSimSpn(0, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sim.getSimSpn(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sim.getSimSpn @@ -242,28 +241,28 @@ getSimSpn\(slotId: number\): Promise Obtains the SPN of the SIM card in the specified slot. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ----------------- | ----------------------------------------- | - | Promise\ | Promise used to return the result.| +| Type| Description| +| ----------------- | ----------------------------------------- | +| Promise\ | Promise used to return the result.| -- Example +**Example** - ``` - let promise = sim.getSimSpn(0); - promise.then(data => { - console.log(`getSimSpn success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getSimSpn fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = sim.getSimSpn(0); +promise.then(data => { + console.log(`getSimSpn success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getSimSpn fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sim.getSimState @@ -272,20 +271,20 @@ getSimState\(slotId: number, callback: AsyncCallback\): void Obtains the status of the SIM card in the specified slot. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------------------------------------- | ---- | ----------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\<[SimState](#SimState)\> | Yes| Callback used to return the result. For details, see [SimState](#SimState).| +| Name| Type| Mandatory| Description| +| -------- | -------------------------------------- | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\<[SimState](#SimState)\> | Yes| Callback used to return the result, For details, see [SimState](#SimState).| -- Example +**Example** - ``` - sim.getSimState(0, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sim.getSimState(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sim.getSimState @@ -294,28 +293,28 @@ getSimState\(slotId: number\): Promise Obtains the status of the SIM card in the specified slot. This function uses a promise to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | -------------------------------- | ------------------------------------------ | - | Promise\<[SimState](#SimState)\> | Promise used to return the result.| +| Type| Description| +| -------------------------------- | ------------------------------------------ | +| Promise\<[SimState](#SimState)\> | Promise used to return the result.| -- Example +**Example** - ``` - let promise = sim.getSimState(0); - promise.then(data => { - console.log(`getSimState success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getSimState fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = sim.getSimState(0); +promise.then(data => { + console.log(`getSimState success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getSimState fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sim.getSimGid1 @@ -325,20 +324,20 @@ Obtains the group identifier level 1 (GID1) of the SIM card in the specified slo Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ----------------------- | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback\ | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ----------------------- | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result.| -- Example +**Example** - ``` - sim.getSimGid1(0, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sim.getSimGid1(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sim.getSimGid1 @@ -349,28 +348,28 @@ Obtains the GID1 of the SIM card in the specified slot. This function uses a pro Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | -------------------------------------- | - | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | ----------------- | ------------------------------------------------------------ | - | Promise\ | Promise used to return the result.| +| Type| Description| +| ----------------- | ------------------------------------------------------------ | +| Promise\ | Promise used to return the result.| -- Example +**Example** - ``` - let promise = sim.getSimGid1(0); - promise.then(data => { - console.log(`getSimGid1 success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.log(`getSimGid1 fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = sim.getSimGid1(0); +promise.then(data => { + console.log(`getSimGid1 success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getSimGid1 fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## SimState diff --git a/en/application-dev/reference/apis/js-apis-sms.md b/en/application-dev/reference/apis/js-apis-sms.md index d1e0be717b9..65fcef6b4fb 100644 --- a/en/application-dev/reference/apis/js-apis-sms.md +++ b/en/application-dev/reference/apis/js-apis-sms.md @@ -1,6 +1,6 @@ # SMS ->**Note:** +>**NOTE** > >The initial APIs of this module are supported since API version 6. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -16,24 +16,24 @@ createMessage\(pdu: Array, specification: string, callback: AsyncCallba Creates an SMS message instance based on the protocol data unit (PDU) and the specified SMS protocol. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------------- | -------------------------------------------------- | ---- | ------------------------------------------------------------ | - | pdu | Array<number> | Yes| Protocol data unit, which is obtained from the received SMS message.| - | specification | string | Yes| SMS protocol type. The options are as follows:
- **3gpp**: GSM/UMTS/LTE SMS
- **3gpp2**: CDMA SMS| - | callback | AsyncCallback<[ShortMessage](#ShortMessage)> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| ------------- | -------------------------------------------------- | ---- | ------------------------------------------------------------ | +| pdu | Array<number> | Yes| PDU, which is obtained from the received SMS message.| +| specification | string | Yes| SMS protocol type. The options are as follows:
- **3gpp**: GSM/UMTS/LTE SMS
- **3gpp2**: CDMA SMS| +| callback | AsyncCallback<[ShortMessage](#ShortMessage)> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - const specification = '3gpp'; - // Display PDUs using numbers in an array, for example, [0x08, 0x91, ...]. - const pdu = [0x08, 0x91]; - sms.createMessage(pdu, specification, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +const specification = '3gpp'; +// Display PDUs using numbers in an array, for example, [0x08, 0x91, ...]. +const pdu = [0x08, 0x91]; +sms.createMessage(pdu, specification, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sms.createMessage @@ -42,32 +42,32 @@ createMessage\(pdu: Array, specification: string\): Promise - **3gpp**: GSM/UMTS/LTE SMS
- **3gpp2**: CDMA SMS| +| Name| Type| Mandatory| Description| +| ------------- | ------------------- | ---- | ------------------------------------------------------------ | +| pdu | Array<number> | Yes| PDU, which is obtained from the received SMS message.| +| specification | string | Yes| SMS protocol type. The options are as follows:
- **3gpp**: GSM/UMTS/LTE SMS
- **3gpp2**: CDMA SMS| -- Return values +**Return value** - | Type| Description| - | -------------------------------------------- | --------------------------------- | - | Promise<[ShortMessage](#ShortMessage)> | Promise used to return the result.| +| Type| Description| +| -------------------------------------------- | --------------------------------- | +| Promise<[ShortMessage](#ShortMessage)> | Promise used to return the result.| -- Example +**Example** - ``` - const specification = '3gpp'; - // Display PDUs using numbers in an array, for example, [0x08, 0x91, ...]. - const pdu = [0x08, 0x91]; - let promise = sms.createMessage(pdu, specification); - promise.then(data => { - console.log(`createMessage success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`createMessage fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +const specification = '3gpp'; +// Display PDUs using numbers in an array, for example, [0x08, 0x91, ...]. +const pdu = [0x08, 0x91]; +let promise = sms.createMessage(pdu, specification); +promise.then(data => { + console.log(`createMessage success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`createMessage fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sms.sendMessage @@ -77,29 +77,29 @@ Sends an SMS message. Before using this API, you must declare the **ohos.permission.SEND_MESSAGES** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [SendMessageOptions](#SendMessageOptions) | Yes| Options (including the callback) for sending an SMS message. For details, see [SendMessageOptions](#SendMessageOptions).| +| Name| Type| Mandatory| Description| +| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [SendMessageOptions](#SendMessageOptions) | Yes| Options (including the callback) for sending an SMS message. For details, see [SendMessageOptions](#SendMessageOptions).| -- Example +**Example** - ``` - let sendCallback = function (err, data) { - console.log(`sendCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - } - let deliveryCallback = function (err, data) { - console.log(`deliveryCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - } - let slotId = 0; - let content ='SMS message content'; - let destinationHost = '+861xxxxxxxxxx'; - let serviceCenter = '+861xxxxxxxxxx'; - let destinationPort = 1000; - let options = {slotId, content, destinationHost, serviceCenter, destinationPort, sendCallback, deliveryCallback}; - sms.sendMessage(options); - ``` +``` +let sendCallback = function (err, data) { + console.log(`sendCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +} +let deliveryCallback = function (err, data) { + console.log(`deliveryCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +} +let slotId = 0; +let content ='SMS message content'; +let destinationHost = '+861xxxxxxxxxx'; +let serviceCenter = '+861xxxxxxxxxx'; +let destinationPort = 1000; +let options = {slotId, content, destinationHost, serviceCenter, destinationPort, sendCallback, deliveryCallback}; +sms.sendMessage(options); +``` ## sms.getDefaultSmsSlotId7+ @@ -108,19 +108,19 @@ getDefaultSmsSlotId\(callback: AsyncCallback\): void Obtains the default slot of the SIM card used to send SMS messages. This function uses an asynchronous callback to return the result. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | --------------------------- | ---- | ---------------------------------------- | - | callback | AsyncCallback<number> | Yes| Callback used to return the result.
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| -------- | --------------------------- | ---- | ---------------------------------------- | +| callback | AsyncCallback<number> | Yes| Callback used to return the result,
- **0**: slot 1
- **1**: slot 2| -- Example +**Example** - ``` - sms.getDefaultSmsSlotId((err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +sms.getDefaultSmsSlotId((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sms.getDefaultSmsSlotId7+ @@ -129,22 +129,22 @@ getDefaultSmsSlotId\(\): Promise Obtains the default slot of the SIM card used to send SMS messages. This function uses a promise to return the result. -- Return values +**Return value** - | Type| Description| - | --------------- | ------------------------------------------------------------ | - | Promise | Promise used to return the result.
- **0**: slot 1
- **1**: slot 2| +| Type| Description| +| --------------- | ------------------------------------------------------------ | +| Promise | Promise used to return the result.
- **0**: slot 1
- **1**: slot 2| -- Example +**Example** - ``` - let promise = call.getDefaultSmsSlotId(); - promise.then(data => { - console.log(`getDefaultSmsSlotId success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`getDefaultSmsSlotId fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let promise = call.getDefaultSmsSlotId(); +promise.then(data => { + console.log(`getDefaultSmsSlotId success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`getDefaultSmsSlotId fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sms.setSmscAddr7+ @@ -155,23 +155,23 @@ Sets the short message service center (SMSC) address. This function uses an asyn Before using this API, you must declare the **ohos.permission.SET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ------------------------- | ---- | ----------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | smscAddr | string | Yes| SMSC address. | - | callback | AsyncCallback<void> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ------------------------- | ---- | ----------------------------------------- | +| slotId | number | Yes| SIM card slot ID:
- **0**: slot 1
- **1**: slot 2| +| smscAddr | string | Yes| SMSC address. | +| callback | AsyncCallback<void> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - let smscAddr = '+861xxxxxxxxxx'; - sms.setSmscAddr(slotId, smscAddr, (err,data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +let slotId = 0; +let smscAddr = '+861xxxxxxxxxx'; +sms.setSmscAddr(slotId, smscAddr, (err,data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sms.setSmscAddr7+ @@ -182,31 +182,31 @@ Sets the SMSC address. This function uses a promise to return the result. Before using this API, you must declare the **ohos.permission.SET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | ------ | ---- | ----------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | smscAddr | string | Yes| SMSC address.| +| Name| Type| Mandatory| Description| +| -------- | ------ | ---- | ----------------------------------------- | +| slotId | number | Yes| SIM card slot ID:
- **0**: slot 1
- **1**: slot 2| +| smscAddr | string | Yes| SMSC address. | -- Return values +**Return value** - | Type| Description| - | ------------------- | ------------------------------- | - | Promise<void> | Promise used to return the result.| +| Type| Description| +| ------------------- | ------------------------------- | +| Promise<void> | Promise used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - let smscAddr = '+861xxxxxxxxxx'; - let promise = sms.setSmscAddr(slotId, smscAddr); - promise.then(data => { - console.log(`setSmscAddr success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`setSmscAddr fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let slotId = 0; +let smscAddr = '+861xxxxxxxxxx'; +let promise = sms.setSmscAddr(slotId, smscAddr); +promise.then(data => { + console.log(`setSmscAddr success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`setSmscAddr fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## sms.getSmscAddr7+ @@ -217,21 +217,21 @@ Obtains the SMSC address. This function uses an asynchronous callback to return Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | -------- | --------------------------- | ---- | ----------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| - | callback | AsyncCallback<string> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | --------------------------- | ---- | ----------------------------------------- | +| slotId | number | Yes| SIM card slot ID:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback<string> | Yes| Callback used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - sms.getSmscAddr(slotId, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); - }); - ``` +``` +let slotId = 0; +sms.getSmscAddr(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` ## sms.getSmscAddr7+ @@ -242,29 +242,29 @@ Obtains the SMSC address. This function uses a promise to return the result. Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. -- Parameters +**Parameters** - | Name| Type| Mandatory| Description| - | ------ | ------ | ---- | ----------------------------------------- | - | slotId | number | Yes| SIM card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | ----------------------------------------- | +| slotId | number | Yes| SIM card slot ID:
- **0**: slot 1
- **1**: slot 2| -- Return values +**Return value** - | Type| Description| - | --------------------- | --------------------------------------------- | - | Promise<string> | Promise used to return the result.| +| Type| Description| +| --------------------- | --------------------------------------------- | +| Promise<string> | Promise used to return the result.| -- Example +**Example** - ``` - let slotId = 0; - let promise = sms.getSmscAddr(slotId); - promise.then(data => { - console.log(`getSmscAddr success, promise: data->${JSON.stringify(data)}`); - }).catch(err => { - console.error(`getSmscAddr fail, promise: err->${JSON.stringify(err)}`); - }); - ``` +``` +let slotId = 0; +let promise = sms.getSmscAddr(slotId); +promise.then(data => { + console.log(`getSmscAddr success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`getSmscAddr fail, promise: err->${JSON.stringify(err)}`); +}); +``` ## ShortMessage @@ -281,13 +281,13 @@ Defines an SMS message instance. | isSmsStatusReportMessage | boolean | Whether the received SMS message is an SMS delivery status report. The default value is **false**.
SMS delivery status report: a message sent from the SMSC to show the current status of the SMS message you delivered.| | messageClass | [ShortMessageClass](#ShortMessageClass) | SMS message type.| | pdu | Array<number> | PDU in the SMS message.| -|protocolId|number|Protocol identifier used for delivering the SMS message.| -|scAddress|string|SMSC address.| -|scTimestamp|number|SMSC timestamp.| -|status|number|SMS message status sent by the SMSC in the **SMS-STATUS-REPORT** message.| -|userRawData|Array<number>|User data excluding the data header.| -|visibleMessageBody|string|SMS message body.| -|visibleRawAddress|string|Sender address to be displayed on the UI.| +| protocolId | number | ID of the protocol used for sending SMS messages.| +| scAddress | string | Address of the short message service center (SMSC).| +| scTimestamp | number | SMSC timestamp.| +| status | number | SMS message status sent by the SMSC in the **SMS-STATUS-REPORT** message.| +| userRawData | Array<number> | User data except the data header.| +| visibleMessageBody | string | SMS message body.| +| visibleRawAddress | string | Sender address.| ## ShortMessageClass @@ -315,7 +315,7 @@ For example, you can specify the SMS message type by the optional parameter **co | destinationHost | string | Yes| Destination address of the SMS message.| | content | string \| Array<number> | Yes| SMS message type. If the content is comprised of character strings, the SMS message is a text message. If the content is comprised of byte arrays, the SMS message is a data message.| | serviceCenter | string | No| SMSC address. By default, the SMSC address in the SIM card is used.| -| destinationPort | number | No| Destination port of the SMS message. This parameter is mandatory only for a data message. | +| destinationPort | number | No| Destination port of the SMS message. This parameter is mandatory only for a data message. Otherwise, it is optional.| | sendCallback | AsyncCallback<[ISendShortMessageCallback](#ISendShortMessageCallback)> | No| Callback used to return the SMS message sending result. For details, see [ISendShortMessageCallback](#ISendShortMessageCallback).| | deliveryCallback | AsyncCallback<[IDeliveryShortMessageCallback](#IDeliveryShortMessageCallback)> | No| Callback used to return the SMS message delivery report. For details, see [IDeliveryShortMessageCallback](#IDeliveryShortMessageCallback).| @@ -333,7 +333,7 @@ Provides the callback for the SMS message delivery report. It consists of three ## IDeliveryShortMessageCallback -Provides the callback for the SMS message delivery report. +Provides the callback for the SMS message delivery report. Return the SMS delivery report. | Name| Type| Mandatory| Description| | ------ | ------------------- | ---- | -------------- | @@ -346,7 +346,7 @@ Enumerates SMS message sending results. | Name| Value| Description| | ------------------------------------ | ---- | ------------------------------------------------------ | -| SEND_SMS_SUCCESS | 0 | The SMS message is sent successfully.| +| SEND_SMS_SUCCESS | 0 | SMS message sent successfully.| | SEND_SMS_FAILURE_UNKNOWN | 1 | Failed to send the SMS message due to unknown reasons.| | SEND_SMS_FAILURE_RADIO_OFF | 2 | Failed to send the SMS message because the modem is shut down.| | SEND_SMS_FAILURE_SERVICE_UNAVAILABLE | 3 | Failed to send the SMS message because the network is unavailable or SMS message sending or receiving is not supported.| -- Gitee From 3aef177e4a2588b0ef014fba60fefc83df150c0e Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Mon, 28 Feb 2022 16:37:40 +0800 Subject: [PATCH 010/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: Icf06c30a78c3eda9cda06e54c41b95f6458faf3b --- zh-cn/application-dev/media/audio-playback.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/media/audio-playback.md b/zh-cn/application-dev/media/audio-playback.md index f7a61025f2b..a3149c3573b 100644 --- a/zh-cn/application-dev/media/audio-playback.md +++ b/zh-cn/application-dev/media/audio-playback.md @@ -82,7 +82,7 @@ function printfDescription(obj) { //1、创建实例 let audioPlayer = media.createAudioPlayer(); SetCallBack(audioPlayer); //设置事件回调 -/* 用户选择视频设置fd(本地播放) */ +//2、用户选择音频,设置uri let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; await fileIO.open(path).then(fdNumber) => { -- Gitee From 31e6db7b20471da910151e965a0a21dece5b53c6 Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Mon, 28 Feb 2022 19:14:29 +0800 Subject: [PATCH 011/282] modify settings api Signed-off-by: lvxiaoqiang --- .../reference/apis/js-apis-settings.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-settings.md b/zh-cn/application-dev/reference/apis/js-apis-settings.md index 2f8fd145e1c..39aaf3e3bec 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-settings.md +++ b/zh-cn/application-dev/reference/apis/js-apis-settings.md @@ -19,9 +19,9 @@ import settings from '@ohos.settings'; 无 -## settings.getUri +## settings.getUriSync -getUri(name: string): string +getUriSync(name: string): string 获取数据项的URI。 @@ -38,13 +38,13 @@ getUri(name: string): string - 示例: ``` // 获取数据项的URI - let urivar = settings.getUri('settings.screen.brightness'); + let urivar = settings.getUriSync('settings.screen.brightness'); ``` -## settings.getValue +## settings.getValueSync -getValue(dataAbilityHelper: DataAbilityHelper, name: string, defValue: string): string +getValueSync(dataAbilityHelper: DataAbilityHelper, name: string, defValue: string): string 获取数据项的值。 @@ -66,18 +66,18 @@ getValue(dataAbilityHelper: DataAbilityHelper, name: string, defValue: string): //获取数据项亮度的值(该数据项在数据库中已存在) let brightness = 'settings.screen.brightness'; - let uri = settings.getUri(brightness); + let uri = settings.getUriSync(brightness); let helper = featureAbility.acquireDataAbilityHelper(uri); - let value = settings.getValue(helper, brightness, '10'); + let value = settings.getValueSync(helper, brightness, '10'); ``` -## settings.setValue +## settings.setValueSync -setValue(dataAbilityHelper: DataAbilityHelper, name: string, value: string): boolean +setValueSync(dataAbilityHelper: DataAbilityHelper, name: string, value: string): boolean 设置数据项的值。 -如果数据库中已经存在该数据项,则setValue方法将更新该数据项的值;如果数据库中尚未存在该数据项,则setValue方法将向数据库中插入该数据项。 +如果数据库中已经存在该数据项,则setValueSync方法将更新该数据项的值;如果数据库中尚未存在该数据项,则setValueSync方法将向数据库中插入该数据项。 使用此方法需获取ohos.permission.WRITE_SYSTEM_SETTING权限。 @@ -97,9 +97,9 @@ setValue(dataAbilityHelper: DataAbilityHelper, name: string, value: string): boo ``` import featureAbility from '@ohos.featureAbility'; - //更新数据项亮度的值(该数据项在数据库中已存在,故setValue方法将更新该数据项的值) + //更新数据项亮度的值(该数据项在数据库中已存在,故setValueSync方法将更新该数据项的值) let brightness = 'settings.screen.brightness'; - let uri = settings.getUri(brightness); + let uri = settings.getUriSync(brightness); let helper = featureAbility.acquireDataAbilityHelper(uri); - let ret = settings.setValue(helper, brightness, '100'); + let ret = settings.setValueSync(helper, brightness, '100'); ``` -- Gitee From f460308844cb471b0a9a1da258e6282043d15044 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Mon, 28 Feb 2022 19:20:17 +0800 Subject: [PATCH 012/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 101 ++++++++++++++---- 1 file changed, 79 insertions(+), 22 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 26e3b530eaf..a0f63fb29de 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -83,12 +83,16 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; **示例:** ``` -let fetchFileResult = await medialibrary.getFileAssets(fileNoArgsfetchOp); +medialibrary.getFileAssets(fileNoArgsfetchOp).then(function(fetchFileResult){ + console.info("getFileAssets successfully:"+ JSON.stringify(dir)); +}).catch(function(err){ + console.info("getFileAssets failed with error:"+ err); +}); ``` ## medialibrary.on -on(type: 'Device'|'Album'| 'SmartAlbum'|'Image'|'Audio'|'Video'|'File'| 'Remote file', callback: () => {}): void; +on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; 打开媒体文件变更和上线通知,使用callback方式返回异步结果。 @@ -97,18 +101,18 @@ on(type: 'Device'|'Album'| 'SmartAlbum'|'Image'|'Audio'|'Video'|'File'| 'Remote | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | | type | type | 是 | 媒体类型。 | -| callback | AsyncCallback<void> | 是 | 回调返回空。 | +| callback | callback<void> | 是 | 回调返回空。 | **示例:** ``` -medialibrary.on(['image','video','audio'], () => { +medialibrary.on('imageChange', () => { this.sendNotify('image'); }) ``` ## medialibrary.off -off(type: 'Device'|'Album'| 'SmartAlbum'|'Image'|'Audio'|'Video'|'File'| 'Remote file', callback?: () => {}): void; +off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; 关闭媒体文件变更和设备上线通知,使用callback方式返回异步结果。 @@ -117,12 +121,12 @@ off(type: 'Device'|'Album'| 'SmartAlbum'|'Image'|'Audio'|'Video'|'File'| 'Remote | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | | type | type | 是 | 媒体类型。 | -| callback | AsyncCallback<void> | 是 | 回调返回空。 | +| callback | callback<void> | 是 | 回调返回空。 | **示例:** ``` -medialibrary.off(['image','video','audio'], () => { +medialibrary.off('imageChange', () => { this.sendNotify('image'); }) ``` @@ -173,7 +177,11 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr **示例:** ``` -asset = await medialibrary.createAsset(mediaType, "image01.jpg", path); +medialibrary.createAsset(mediaType, "image01.jpg", path).then(function(asset){ + console.info("createAsset successfully:"+ JSON.stringify(asset)); +}).catch(function(err){ + console.info("createAsset failed with error:"+ err); +}); ``` ## medialibrary.deleteAsset @@ -218,7 +226,11 @@ deleteAsset(uri: string): Promise<void>; **示例:** ``` -await medialibrary.deleteAsset(asset.uri); +medialibrary.deleteAsset(asset.uri).then(()=>{ + console.info("deleteAsset successfully"); +}).catch(function(err){ + console.info("deleteAsset failed with error:"+ err); +}); ``` ## medialibrary.getAlbums @@ -261,7 +273,11 @@ getAlbums(options: MediaFetchOptions): Promise; **示例:** ``` -let albumList = await medialibrary.getAlbums(AlbumNoArgsfetchOp); +medialibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ + console.info("getAlbums successfully:"+ JSON.stringify(albumList)); +}).catch(function(err){ + console.info("getAlbums failed with error:"+ err); +}); ``` ## medialibrary.getActivePeers @@ -417,7 +433,11 @@ isDirectory():Promise<boolean>; **示例:** ``` -let isDirectory = await asset.isDirectory(); +asset.isDirectory().then(function(isDirectory){ + console.info("isDirectory result:"+ isDirectory); +}).catch(function(err){ + console.info("isDirectory failed with error:"+ err); +}); ``` ## FileAsset.commitModify @@ -435,7 +455,9 @@ commitModify(callback: AsyncCallback<void>): void; **示例:** ``` -await asset.commitModify(); +asset.commitModify(function(err){ + // do something +}); ``` ## FileAsset.commitModify @@ -634,7 +656,9 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; **示例:** ``` -await asset.favorite(true); +asset.favorite(true,function(err){ + // do something +}); ``` ## FileAsset.favorite @@ -658,7 +682,11 @@ favorite(isFavorite: boolean): Promise<void>; **示例:** ``` -await asset.favorite(true); +asset.favorite(true).then(function() { + console.info("favorite successfully"); +}).catch(function(err){ + console.info("favorite failed with error:"+ err); +}); ``` ## FileAsset.isFavorite @@ -696,7 +724,11 @@ isFavorite():Promise<boolean>; **示例:** ``` -let isFavorite = await asset.isFavorite(); +asset.isFavorite().then(function(isFavorite){ + console.info("isFavorite result:"+ isFavorite); +}).catch(function(err){ + console.info("isFavorite failed with error:"+ err); +}); ``` ## FileAsset.trash @@ -741,7 +773,11 @@ trash(isTrash: boolean,): Promise<void>; **示例:** ``` -await asset.trash(true); +asset.trash(true).then(function() { + console.info("trash successfully"); +}).catch(function(err){ + console.info("trash failed with error:"+ err); +}); ``` ## FileAsset.isTrash @@ -779,7 +815,11 @@ isTrash():Promise<boolean>; **示例:** ``` -let isTrash = await asset.isTrash(); +asset.isTrash().then(function(isTrash){ + console.info("isTrash result:"+ isTrash); +}).catch(function(err){ + console.info("isTrash failed with error:"+ err); +}); ``` **FetchFileResult** @@ -874,8 +914,11 @@ getFirstObject(): Promise<FileAsset>; **示例**: ``` -const fileAsset = await queryResultSet_.getFirstObject(); -}) +queryResultSet_.getFirstObject().then(function(fileAsset){ + console.info("getFirstObject successfully:"+ JSON.stringify(fileAsset)); +}).catch(function(err){ + console.info("getFirstObject failed with error:"+ err); +}); ``` ## FetchFileResult.getNextObject @@ -1106,7 +1149,11 @@ commitModify(): Promise<void>; ``` album.albumName = 'hello'; -await album.commitModify(); +album.commitModify().then(function() { + console.info("commitModify successfully"); +}).catch(function(err){ + console.info("commitModify failed with error:"+ err); +}); ``` ## Album.getFileAssets @@ -1153,7 +1200,11 @@ function getFileAssetsCallBack(err, fetchFileResult) { **示例**: ``` -let albumFetchFileResult = await album.getFileAssets(fileNoArgsfetchOp); +album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ + console.info("getFileAssets successfully:"+ JSON.stringify(albumFetchFileResult)); +}).catch(function(err){ + console.info("getFileAssets failed with error:"+ err); +}); ``` @@ -1196,7 +1247,11 @@ getFileAssets(): Promise<FetchFileResult>; **示例**: ``` - let fSmartFetchFileResult = await favSmartAlbum.getFileAssets(); +favSmartAlbum.getFileAssets().then(function(fSmartFetchFileResult){ + console.info("getFileAssets successfully:"+ JSON.stringify(fSmartFetchFileResult)); +}).catch(function(err){ + console.info("getFileAssets failed with error:"+ err); +}); ``` @@ -1383,3 +1438,5 @@ DeviceType | ------ | ------ | ---- | ---- | ---- | | width | number | 是 | 是 | 宽 | | height | number | 是 | 是 | 高 | + + -- Gitee From 4a178785c3cc0be9160c88c1f5afab263936726c Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Mon, 28 Feb 2022 19:33:23 +0800 Subject: [PATCH 013/282] modify settings api Signed-off-by: lvxiaoqiang --- .../reference/apis/js-apis-settings.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-settings.md b/en/application-dev/reference/apis/js-apis-settings.md index afb02dba1e8..bc2b4d022ac 100644 --- a/en/application-dev/reference/apis/js-apis-settings.md +++ b/en/application-dev/reference/apis/js-apis-settings.md @@ -19,9 +19,9 @@ import settings from '@ohos.settings'; None -## settings.getUri +## settings.getUriSync -getUri(name: string): string +getUriSync(name: string): string Obtains the URI of a data item. @@ -38,13 +38,13 @@ Obtains the URI of a data item. - Example ``` // Obtain the URI of a data item. - let urivar = settings.getUri('settings.screen.brightness'); + let urivar = settings.getUriSync('settings.screen.brightness'); ``` -## settings.getValue +## settings.getValueSync -getValue(dataAbilityHelper: DataAbilityHelper, name: string, defValue: string): string +getValueSync(dataAbilityHelper: DataAbilityHelper, name: string, defValue: string): string Obtains the value of a data item. @@ -66,18 +66,18 @@ Obtains the value of a data item. // Obtain the value of 'settings.screen.brightness' (this data item already exists in the database). let brightness = 'settings.screen.brightness'; - let uri = settings.getUri(brightness); + let uri = settings.getUriSync(brightness); let helper = featureAbility.acquireDataAbilityHelper(uri); - let value = settings.getValue(helper, brightness, '10'); + let value = settings.getValueSync(helper, brightness, '10'); ``` -## settings.setValue +## settings.setValueSync -setValue(dataAbilityHelper: DataAbilityHelper, name: string, value: string): boolean +setValueSync(dataAbilityHelper: DataAbilityHelper, name: string, value: string): boolean Sets the value of a data item. -If the specified data item exists in the database, the **setValue** method updates the value of the data item. If the data item does not exist in the database, the **setValue** method inserts the data item into the database. +If the specified data item exists in the database, the **setValueSync** method updates the value of the data item. If the data item does not exist in the database, the **setValueSync** method inserts the data item into the database. To use this method, you must have the **ohos.permission.WRITE_SYSTEM_SETTING** permission. @@ -97,10 +97,10 @@ To use this method, you must have the **ohos.permission.WRITE_SYSTEM_SETTING** p ``` import featureAbility from '@ohos.featureAbility'; - // Update the value of 'settings.screen.brightness'. (As this data item exists in the database, the setValue method + // Update the value of 'settings.screen.brightness'. (As this data item exists in the database, the setValueSync method will update the value of the data item.) let brightness = 'settings.screen.brightness'; - let uri = settings.getUri(brightness); + let uri = settings.getUriSync(brightness); let helper = featureAbility.acquireDataAbilityHelper(uri); - let ret = settings.setValue(helper, brightness, '100'); + let ret = settings.setValueSync(helper, brightness, '100'); ``` -- Gitee From ba79300505a9fcdf94eac9da6f175382d7a74980 Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Mon, 28 Feb 2022 19:47:46 +0800 Subject: [PATCH 014/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: I54985f2a30af1928f2e8c1b55285736e6455e9cf --- zh-cn/application-dev/media/audio-recorder.md | 65 ++++++++++++++++++- zh-cn/application-dev/media/video-recorder.md | 33 +++++++++- 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/media/audio-recorder.md b/zh-cn/application-dev/media/audio-recorder.md index 0d1acf4df17..f5e7b7905fb 100644 --- a/zh-cn/application-dev/media/audio-recorder.md +++ b/zh-cn/application-dev/media/audio-recorder.md @@ -23,6 +23,11 @@ 包含流程:创建实例,设置录制参数,录制音频,暂停录制,恢复录制,停止录制,释放资源等流程。 ```js +import media from '@ohos.multimedia.media' +import mediaLibrary from '@ohos.multimedia.mediaLibrary' + +let testFdNumber; + function SetCallBack(audioRecorder) { audioRecorder.on('prepare', () => { // 设置'prepare'事件回调 console.log('prepare success'); @@ -57,6 +62,31 @@ function SetCallBack(audioRecorder) { }); } +// pathName是传入的录制文件名,例如:01.mp3 +// 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA +async function getFd(pathName) { + let displayName = pathName; + const mediaTest = mediaLibrary.getMediaLibrary(); + let fileKeyObj = mediaLibrary.FileKey; + let mediaType = mediaLibrary.MediaType.VIDEO; + let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); + let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath); + if (dataUri != undefined) { + let args = dataUri.id.toString(); + let fetchOp = { + selections : fileKeyObj.ID + "=?", + selectionArgs : [args], + } + let fetchFileResult = await mediaTest.getFileAssets(fetchOp); + let fileAsset = await fetchFileResult.getAllObject(); + let fdNumber = await fileAsset[0].open('Rw'); + fdNumber = "fd://" + fdNumber.toString(); + testFdNumber = fdNumber; + } +} + +await getFd('01.mp3'); + // 1.创建实例 let audioRecorder = media.createAudioRecorder(); // 2.设置回调 @@ -68,7 +98,7 @@ let audioRecorderConfig = { audioSampleRate : 22050, numberOfChannels : 2, format : media.AudioOutputFormat.AAC_ADTS, - uri : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.m4a', // 文件需先由调用者创建,并给予适当的权限 + uri : testFdNumber, // testFdNumber由getFd生成 location : { latitude : 30, longitude : 130}, } audioRecorder.prepare(audioRecorderConfig); @@ -92,6 +122,11 @@ audioRecorder = undefined; 与全流程场景不同,不包括暂停录制,恢复录制的过程。 ```js +import media from '@ohos.multimedia.media' +import mediaLibrary from '@ohos.multimedia.mediaLibrary' + +let testFdNumber; + function SetCallBack(audioPlayer) { audioRecorder.on('prepare', () => { // 设置'prepare'事件回调 console.log('prepare success'); @@ -108,6 +143,32 @@ function SetCallBack(audioPlayer) { console.log('audio recorder release success'); }); } + +// pathName是传入的录制文件名,例如:01.mp3 +// 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA +async function getFd(pathName) { + let displayName = pathName; + const mediaTest = mediaLibrary.getMediaLibrary(); + let fileKeyObj = mediaLibrary.FileKey; + let mediaType = mediaLibrary.MediaType.VIDEO; + let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); + let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath); + if (dataUri != undefined) { + let args = dataUri.id.toString(); + let fetchOp = { + selections : fileKeyObj.ID + "=?", + selectionArgs : [args], + } + let fetchFileResult = await mediaTest.getFileAssets(fetchOp); + let fileAsset = await fetchFileResult.getAllObject(); + let fdNumber = await fileAsset[0].open('Rw'); + fdNumber = "fd://" + fdNumber.toString(); + testFdNumber = fdNumber; + } +} + +await getFd('01.mp3'); + // 1.创建实例 let audioRecorder = media.createAudioRecorder(); // 2.设置回调 @@ -119,7 +180,7 @@ let audioRecorderConfig = { audioSampleRate : 22050, numberOfChannels : 2, format : media.AudioOutputFormat.AAC_ADTS, - uri : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.m4a', // 文件需先由调用者创建,并给予适当的权限 + uri : testFdNumber, // testFdNumber由getFd生成 location : { latitude : 30, longitude : 130}, } audioRecorder.prepare(audioRecorderConfig) diff --git a/zh-cn/application-dev/media/video-recorder.md b/zh-cn/application-dev/media/video-recorder.md index 0537f4f1da6..0c9be94fde1 100644 --- a/zh-cn/application-dev/media/video-recorder.md +++ b/zh-cn/application-dev/media/video-recorder.md @@ -23,6 +23,36 @@ 包含流程:创建实例,设置录制参数,录制视频,暂停录制,恢复录制,停止录制,释放资源等流程。 ```js +import media from '@ohos.multimedia.media' +import mediaLibrary from '@ohos.multimedia.mediaLibrary' + +let testFdNumber; + +// pathName是传入的录制文件名,例如:01.mp4 +// 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA +async function getFd(pathName) { + let displayName = pathName; + const mediaTest = mediaLibrary.getMediaLibrary(); + let fileKeyObj = mediaLibrary.FileKey; + let mediaType = mediaLibrary.MediaType.VIDEO; + let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); + let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath); + if (dataUri != undefined) { + let args = dataUri.id.toString(); + let fetchOp = { + selections : fileKeyObj.ID + "=?", + selectionArgs : [args], + } + let fetchFileResult = await mediaTest.getFileAssets(fetchOp); + let fileAsset = await fetchFileResult.getAllObject(); + let fdNumber = await fileAsset[0].open('Rw'); + fdNumber = "fd://" + fdNumber.toString(); + testFdNumber = fdNumber; + } +} + +await getFd('01.mp4'); + let videoProfile = { audioBitrate : 48000, audioChannels : 2, @@ -40,7 +70,7 @@ let videoConfig = { audioSourceType : 1, videoSourceType : 0, profile : videoProfile, - url : 'file:///data/media/01.mp4', + url : testFdNumber, // testFdNumber由getFd生成 orientationHint : 0, location : { latitude : 30, longitude : 130 }, } @@ -61,6 +91,7 @@ function catchCallback(error) { let videoRecorder = null; // videoRecorder空对象在createVideoRecorder成功后赋值 let surfaceID = null; // 用于保存getInputSurface返回的surfaceID + // 创建videoRecorder对象 await media.createVideoRecorder().then((recorder) => { console.info('case createVideoRecorder called'); -- Gitee From 9de6ff703f73aab9ef447d3d995dc50ec5b35377 Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Mon, 28 Feb 2022 20:03:58 +0800 Subject: [PATCH 015/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: Ia4f92266712aed6715dd357c089bd25318198f49 --- zh-cn/application-dev/media/audio-recorder.md | 4 ++-- zh-cn/application-dev/media/video-recorder.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/media/audio-recorder.md b/zh-cn/application-dev/media/audio-recorder.md index f5e7b7905fb..7e52686c95e 100644 --- a/zh-cn/application-dev/media/audio-recorder.md +++ b/zh-cn/application-dev/media/audio-recorder.md @@ -62,7 +62,7 @@ function SetCallBack(audioRecorder) { }); } -// pathName是传入的录制文件名,例如:01.mp3 +// pathName是传入的录制文件名,例如:01.mp3,生成后的文件地址:/storage/media/100/local/files/Movies/01.mp3 // 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA async function getFd(pathName) { let displayName = pathName; @@ -144,7 +144,7 @@ function SetCallBack(audioPlayer) { }); } -// pathName是传入的录制文件名,例如:01.mp3 +// pathName是传入的录制文件名,例如:01.mp3,生成后的文件地址:/storage/media/100/local/files/Movies/01.mp3 // 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA async function getFd(pathName) { let displayName = pathName; diff --git a/zh-cn/application-dev/media/video-recorder.md b/zh-cn/application-dev/media/video-recorder.md index 0c9be94fde1..e684b2230ad 100644 --- a/zh-cn/application-dev/media/video-recorder.md +++ b/zh-cn/application-dev/media/video-recorder.md @@ -28,7 +28,7 @@ import mediaLibrary from '@ohos.multimedia.mediaLibrary' let testFdNumber; -// pathName是传入的录制文件名,例如:01.mp4 +// pathName是传入的录制文件名,例如:01.mp4,生成后的文件地址:/storage/media/100/local/files/Movies/01.mp4 // 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA async function getFd(pathName) { let displayName = pathName; -- Gitee From 041cd9fe4dd89833c1a28351c49a2f5e3102cbf2 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Mon, 28 Feb 2022 20:32:09 +0800 Subject: [PATCH 016/282] fix code issue Signed-off-by: panqiangbiao --- .../application-dev/reference/apis/js-apis-medialibrary.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index a0f63fb29de..fefa0009c91 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -92,7 +92,7 @@ medialibrary.getFileAssets(fileNoArgsfetchOp).then(function(fetchFileResult){ ## medialibrary.on -on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; +on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; 打开媒体文件变更和上线通知,使用callback方式返回异步结果。 @@ -112,7 +112,7 @@ medialibrary.on('imageChange', () => { ``` ## medialibrary.off -off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; +off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback?: Callback<void>): void; 关闭媒体文件变更和设备上线通知,使用callback方式返回异步结果。 @@ -121,7 +121,7 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | | type | type | 是 | 媒体类型。 | -| callback | callback<void> | 是 | 回调返回空。 | +| callback | callback<void> | 否 | 回调返回空。 | **示例:** -- Gitee From cb1a1e38b2469fefe7be9f56fd0a6227ff83e1be Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Mon, 28 Feb 2022 21:12:23 +0800 Subject: [PATCH 017/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: I0b77dfe7530bb2324927715afd520d6751f2a922 --- zh-cn/application-dev/media/audio-playback.md | 8 ++++---- zh-cn/application-dev/media/video-playback.md | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/zh-cn/application-dev/media/audio-playback.md b/zh-cn/application-dev/media/audio-playback.md index a3149c3573b..5cc15af551d 100644 --- a/zh-cn/application-dev/media/audio-playback.md +++ b/zh-cn/application-dev/media/audio-playback.md @@ -86,7 +86,7 @@ SetCallBack(audioPlayer); //设置事件回调 let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); @@ -149,7 +149,7 @@ SetCallBack(audioPlayer); //设置事件回调 let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); @@ -187,7 +187,7 @@ SetCallBack(audioPlayer); //设置事件回调 let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); @@ -241,7 +241,7 @@ SetCallBack(audioPlayer); //设置事件回调 let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); diff --git a/zh-cn/application-dev/media/video-playback.md b/zh-cn/application-dev/media/video-playback.md index 4b7bec8c8bb..708a3e20e8d 100644 --- a/zh-cn/application-dev/media/video-playback.md +++ b/zh-cn/application-dev/media/video-playback.md @@ -82,7 +82,7 @@ await media.createVideoPlayer().then((video) => { let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); @@ -224,7 +224,7 @@ SetCallBack(videoPlayer); let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); @@ -310,7 +310,7 @@ SetCallBack(videoPlayer); let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); @@ -345,7 +345,7 @@ await videoPlayer.reset().then(() => { let fdNextPath = 'fd://' let nextPath = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/02.mp4'; await fileIO.open(nextPath).then(fdNumber) => { - fdNextPath = fdNextPath + " + fdNumber; + fdNextPath = fdNextPath + '' + fdNumber; console.info('open fd sucess fd is' + fdNextPath); }, (err) => { console.info('open fd failed err is' + err); @@ -431,7 +431,7 @@ SetCallBack(videoPlayer); let fdPath = 'fd://' let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; await fileIO.open(path).then(fdNumber) => { - fdPath = fdPath + " + fdNumber; + fdPath = fdPath + '' + fdNumber; console.info('open fd sucess fd is' + fdPath); }, (err) => { console.info('open fd failed err is' + err); -- Gitee From c8ff535207583bbe3c2511e7b80af4b20e300ded Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Tue, 1 Mar 2022 09:17:42 +0800 Subject: [PATCH 018/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: I07733b90b68427f192ee0464bf0d03b638b8bef7 --- zh-cn/application-dev/media/audio-playback.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/media/audio-playback.md b/zh-cn/application-dev/media/audio-playback.md index 5cc15af551d..a142a8b0106 100644 --- a/zh-cn/application-dev/media/audio-playback.md +++ b/zh-cn/application-dev/media/audio-playback.md @@ -203,7 +203,7 @@ audioPlayer.reset(); let fdNextPath = 'fd://' let nextPath = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; await fileIO.open(nextPath).then(fdNumber) => { - fdNextPath = fdNextPath + " + fdNumber; + fdNextPath = fdNextPath + '' + fdNumber; console.info('open fd sucess fd is' + fdNextPath); }, (err) => { console.info('open fd failed err is' + err); -- Gitee From 5691076b2932274b641c46da93355a99debd6401 Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Tue, 1 Mar 2022 10:09:29 +0800 Subject: [PATCH 019/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: I789665e47fee13cfb17df8239ddc1cecde52dfd8 --- .../reference/apis/js-apis-media.md | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index e667f592008..0bf62e41003 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1,4 +1,4 @@ -# 媒体服务 +媒体服务 媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。 @@ -639,7 +639,19 @@ audioPlayer.on('error', (error) => { //设置'error'事件回调 console.info(`audio error called, errCode is ${error.code}`); console.info(`audio error called, errMessage is ${error.message}`); }); -audioPlayer.src = 'file:///data/data/ohos.xxx.xxx/files/test.mp4'; //设置src属性,并触发'dataLoad'事件回调 + +// 用户选择视频设置fd(本地播放) +let fdPath = 'fd://' +let path = 'data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; +await fileIO.open(path).then(fdNumber) => { + fdPath = fdPath + '' + fdNumber; + console.info('open fd sucess fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}),catch((err) => { + console.info('open fd failed err is' + err); +}); +audioPlayer.src = fdPath; //设置src属性,并触发'dataLoad'事件回调 ``` ### on('timeUpdate') @@ -1555,7 +1567,7 @@ let audioRecorderConfig = { audioSampleRate : 22050, numberOfChannels : 2, format : media.AudioOutputFormat.AAC_ADTS, - uri : 'file://1', // 文件需先由调用者创建,并给予适当的权限 + uri : 'fd://1', // 文件需先由调用者创建,并给予适当的权限 location : { latitude : 30, longitude : 130}, } audioRecorder.on('prepare', () => { //设置'prepare'事件回调 @@ -1681,7 +1693,7 @@ let audioRecorderConfig = { audioSampleRate : 22050, numberOfChannels : 2, format : media.AudioOutputFormat.AAC_ADTS, - uri : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.m4a', // 文件需先由调用者创建,并给予适当的权限 + uri : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 location : { latitude : 30, longitude : 130}, } audioRecorder.on('error', (error) => { // 设置'error'事件回调 @@ -1750,7 +1762,7 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 | | format | [AudioOutputFormat](#audiooutputformat) | 否 | 音量输出封装格式,默认设置为MPEG_4。 | | location8+ | [Location](#location8) | 否 | 音频采集的地理位置。 | -| uri | string | 是 | 视频输出URI:file://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | +| uri | string | 是 | 视频输出URI:fd://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | ## AudioEncoder @@ -1816,7 +1828,7 @@ let videoConfig = { audioSourceType : 1, videoSourceType : 0, profile : videoProfile, - url : 'file://1', // 文件需先由调用者创建,并给予适当的权限 + url : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 orientationHint : 0, location : { latitude : 30, longitude : 130 }, } @@ -1885,7 +1897,7 @@ let videoConfig = { audioSourceType : 1, videoSourceType : 0, profile : videoProfile, - url : 'file://1', // 文件需先由调用者创建,并给予适当的权限 + url : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 orientationHint : 0, location : { latitude : 30, longitude : 130 }, } @@ -2340,7 +2352,7 @@ videoRecorder.on('error', (error) => { // 设置'error'事件回调 | profile | [VideoRecorderProfile](#videorecorderprofile8+) | 是 | 视频录制的profile。 | | orientationHint | number | 否 | 录制视频的旋转角度。 | | location | [Location](#location8) | 否 | 录制视频的地理位置。 | -| url | string | 是 | 视频输出URL:file://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | +| url | string | 是 | 视频输出URL:fd://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | ## AudioSourceType8+ -- Gitee From 1b65d5352a9d5616f6294e7f987e69001334c53f Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 1 Mar 2022 14:15:22 +0800 Subject: [PATCH 020/282] add permission Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 604 +++++++++++------- 1 file changed, 359 insertions(+), 245 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index fefa0009c91..8f7785f12ae 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -8,13 +8,6 @@ import medialibrary from '@ohos.multimedia.medialibrary'; ``` -权限 ----- - -- ohos.permission.MEDIA_LOCATION -- ohos.permission.MEDIA_READ -- ohos.permission.MEDIA_WRITE - ## getMediaLibrary --------------- @@ -23,6 +16,10 @@ function getMediaLibrary(context: Context): MediaLibrary; 获取媒体库。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -48,12 +45,16 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 获取文件资源,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------------------- | ---- | ----------------------------------- | -| options | MediaFetchOptions | 是 | 媒体获取选项。 | -| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步获取FetchFileResult之后的回调。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------------- | ---- | --------------------------------- | +| options | MediaFetchOptions | 是 | 媒体获取选项 | +| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步获取FetchFileResult之后的回调 | **示例:** @@ -68,17 +69,21 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; 获取文件资源,使用Promise方式返回结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------- | --------------------------------------- | ---- | -------------- | -| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------- | ---- | ------------ | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项 | **返回值** -| 类型 | 说明 | -| -------------------------------------------- | ---------------- | -| [FetchFileResult](#FetchFileResult.getCount) | 媒体数据结果集。 | +| 类型 | 说明 | +| -------------------------------------------- | -------------- | +| [FetchFileResult](#FetchFileResult.getCount) | 媒体数据结果集 | **示例:** @@ -96,12 +101,16 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| 打开媒体文件变更和上线通知,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型。 | -| callback | callback<void> | 是 | 回调返回空。 | +| type | type | 是 | 媒体类型 | +| callback | callback<void> | 是 | 回调返回空 | **示例:** @@ -116,12 +125,16 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' 关闭媒体文件变更和设备上线通知,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型。 | -| callback | callback<void> | 否 | 回调返回空。 | +| type | type | 是 | 媒体类型 | +| callback | callback<void> | 否 | 回调返回空 | **示例:** @@ -137,14 +150,18 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal 创建媒体资源,使用callback方式返回结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------------ | -------------------------------------- | ---- | ------------------------------------- | -| mediaType | [MediaType](#MediaType) | 是 | 媒体类型。 | -| displayName | string | 是 | 展示文件名。 | -| relativePath | string | 是 | 相对路径。 | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取媒体数据FileAsset之后的回调。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | -------------------------------------- | ---- | ----------------------------------- | +| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | +| displayName | string | 是 | 展示文件名 | +| relativePath | string | 是 | 相对路径 | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取媒体数据FileAsset之后的回调 | **示例:** @@ -160,13 +177,17 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr 创建媒体资源,使用Promise方式返回结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------------ | ----------------------- | ---- | ------------ | -| mediaType | [MediaType](#MediaType) | 是 | 媒体类型。 | -| displayName | string | 是 | 展示文件名。 | -| relativePath | string | 是 | 相对路径。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | ----------------------- | ---- | ---------- | +| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | +| displayName | string | 是 | 展示文件名 | +| relativePath | string | 是 | 相对路径 | **返回值** @@ -190,12 +211,16 @@ deleteAsset(uri: string, callback: AsyncCallback<void>): void; 删除媒体资源,使用callback方式返回结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------- | ---- | ---------------------- | -| uri | string | 是 | 文件uri。 | -| callback | AsyncCallback<void> | 是 | 回调返回空。 | +| uri | string | 是 | 文件uri | +| callback | AsyncCallback<void> | 是 | 回调返回空 | **示例:** @@ -211,17 +236,21 @@ deleteAsset(uri: string): Promise<void>; 删除媒体资源,使用promise方式返回结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | --------- | -| uri | string | 是 | 文件uri。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------- | +| uri | string | 是 | 文件uri | **返回值:** | 类型 | 说明 | | ------------- | ------------------------------------------------- | -| Promise<void> | Promise实例,用于异步获取结果。本调用将返回空值。 | +| Promise<void> | Promise实例,用于异步获取结果。本调用将返回空值 | **示例:** @@ -239,12 +268,16 @@ getAlbums(options: MediaFetchOptions, callback: AsyncCallback> | 是 | 异步获取Album列表之后的回调。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------- | ---- | --------------------------- | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体文件获取条件 | +| callback | AsyncCallback<Array<[Album](#Album)>> | 是 | 异步获取Album列表之后的回调 | **示例:** @@ -258,11 +291,15 @@ getAlbums(options: MediaFetchOptions): Promise; 获取实体相册,使用 promise 方式返回结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------- | --------------------------------------- | ---- | ------------------ | -| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体文件获取条件。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------- | ---- | ---------------- | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体文件获取条件 | **返回值:** @@ -286,11 +323,15 @@ getActivePeers(callback: AsyncCallback): void; 获取活动对端设备 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------ | ---- | ---------------------- | -| callback | AsyncCallback> | 是 | 回调表示成功还是失败。 | +| callback | AsyncCallback> | 是 | 回调表示成功还是失败 | **示例:** @@ -306,13 +347,17 @@ getActivePeers(): Promise; 获取活动对端设备 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore + **参数:** 返回值: -| 类型 | 说明 | -| ------------------------------------- | ----------------------------------- | -| Promise> | Promise实例,用于获取异步返回结果。 | +| 类型 | 说明 | +| ------------------------------------- | --------------------------------- | +| Promise> | Promise实例,用于获取异步返回结果 | **示例:** @@ -326,11 +371,15 @@ getAllPeers(callback: AsyncCallback): void; 获取所有对端设备 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------ | ---- | ---------------------- | -| callback | AsyncCallback> | 是 | 回调表示成功还是失败。 | +| callback | AsyncCallback> | 是 | 回调表示成功还是失败 | **示例:** @@ -346,11 +395,15 @@ getAllPeers(): Promise; 获取所有对端设备 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore + **返回值:** -| 类型 | 说明 | -| ------------------------------------- | ----------------------------------- | -| Promise> | Promise实例,用于获取异步返回结果。 | +| 类型 | 说明 | +| ------------------------------------- | --------------------------------- | +| Promise> | Promise实例,用于获取异步返回结果 | **示例:** @@ -362,11 +415,15 @@ release(callback: AsyncCallback<void>): void; 释放MediaLibrary实例 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------- | ---- | ---------------------- | -| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败 | **示例:** @@ -382,11 +439,15 @@ release(): Promise<void>; 释放MediaLibrary实例 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值:** | 类型 | 说明 | | ------------- | ----------------------------------- | -| Promise<void> | Promise实例,用于获取异步返回结果。 | +| Promise<void> | Promise实例,用于获取异步返回结果 | **示例:** @@ -404,6 +465,10 @@ isDirectory(callback: AsyncCallback<boolean>): void; 判断fileAsset是否为目录,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -424,11 +489,15 @@ isDirectory():Promise<boolean>; 判断fileAsset是否为目录,使用Promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值:** | 类型 | 说明 | | ---------------- | ------------------------------------------ | -| Promise<boolean> | Promise实例,返回当前FileAsset是否是目录。 | +| Promise<boolean> | Promise实例,返回当前FileAsset是否是目录 | **示例:** @@ -446,6 +515,10 @@ commitModify(callback: AsyncCallback<void>): void; 修改文件的元数据,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -466,11 +539,15 @@ commitModify(): Promise<void>; 修改文件的元数据,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值:** | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<void> | Promise返回空。 | +| Promise<void> | Promise返回空 | **示例:** @@ -488,11 +565,15 @@ open(mode: string, callback: AsyncCallback<number>): void; 打开当前文件,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| mode | string | 是 | 打开文件方式 | +| mode | string | 是 | 打开文件方式 | | callback | AsyncCallback<number> | 是 | 回调返回文件句柄 | **示例:** @@ -509,6 +590,10 @@ open(mode: string): Promise<number>; 打开当前文件,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -519,7 +604,7 @@ open(mode: string): Promise<number>; | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<number> | Promise返回文件句柄。 | +| Promise<number> | Promise返回文件句柄 | **示例:** @@ -535,11 +620,15 @@ close(fd: number, callback: AsyncCallback<void>): void; 关闭当前文件,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| fd | number | 是 | 文件描述符 | +| fd | number | 是 | 文件描述符 | | callback | AsyncCallback<void> | 是 | 回调返回空 | **示例:** @@ -556,6 +645,10 @@ close(fd: number): Promise<void>; 关闭当前文件,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -566,7 +659,7 @@ close(fd: number): Promise<void>; | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<void> | Promise返回空。 | +| Promise<void> | Promise返回空 | **示例:** @@ -582,6 +675,10 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -601,11 +698,15 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,传入缩略图尺寸,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| size | [Size](#Size) | 是 | 缩略图尺寸 | +| size | [Size](#Size) | 是 | 缩略图尺寸 | | callback | AsyncCallback<image.PixelMap> | 是 | 回调返回缩略图的PixelMap | **示例:** @@ -621,6 +722,10 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; 获取文件的缩略图,传入缩略图尺寸,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -631,7 +736,7 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<image.PixelMap> | Promise返回缩略图的PixelMap。 | +| Promise<image.PixelMap> | Promise返回缩略图的PixelMap | **示例:** @@ -646,12 +751,16 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; 将文件设置为收藏文件,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ---------- | ------------------- | ---- | -------------- | | isFavorite | boolean | 是 | 是否为收藏文件 | -| callback | AsyncCallback<void> | 是 | 回调返回空 | +| callback | AsyncCallback<void> | 是 | 回调返回空 | **示例:** @@ -667,6 +776,10 @@ favorite(isFavorite: boolean): Promise<void>; 将文件设置为收藏文件,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -677,7 +790,7 @@ favorite(isFavorite: boolean): Promise<void>; | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<void> | Promise返回空。 | +| Promise<void> | Promise返回空 | **示例:** @@ -695,6 +808,10 @@ isFavorite(callback: AsyncCallback<boolean>): void; 判断该文件是否为收藏文件,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -715,11 +832,15 @@ isFavorite():Promise<boolean>; 判断该文件是否为收藏文件,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值:** | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<boolean> | Promise回调表示是否是收藏文件。 | +| Promise<boolean> | Promise回调表示是否是收藏文件 | **示例:** @@ -737,11 +858,15 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; 当文件被定位时,将文件放到垃圾文件夹,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| isTrash | boolean | 是 | 是否为收藏文件 | +| isTrash | boolean | 是 | 是否为收藏文件 | | callback | AsyncCallback<void> | 是 | 回调返回空 | **示例:** @@ -758,6 +883,10 @@ trash(isTrash: boolean,): Promise<void>; 当文件被定位时,将文件放到垃圾文件夹,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -768,7 +897,7 @@ trash(isTrash: boolean,): Promise<void>; | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<void> | Promise返回空。 | +| Promise<void> | Promise返回空 | **示例:** @@ -786,6 +915,10 @@ isTrash(callback: AsyncCallback<boolean>): void; 当文件被定位,判断文件是否为垃圾文件,使用callback方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -806,11 +939,15 @@ isTrash():Promise<boolean>; 当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值:** | 类型 | 说明 | | ------------- | ----------------------------- | -| Promise<void> | Promise回调表示文件是否为垃圾文件。 | +| Promise<void> | Promise回调表示文件是否为垃圾文件 | **示例:** @@ -832,11 +969,15 @@ getCount(): number; 获取文件检索结果中的文件总数。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值**: -| 类型 | 说明 | -| ------ | ------------------ | -| number | 检索到的文件总数。 | +| 类型 | 说明 | +| ------ | ---------------- | +| number | 检索到的文件总数 | **示例**: @@ -850,11 +991,15 @@ isAfterLast(): boolean; 检查结果集是否指向最后一行。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值**: | 类型 | 说明 | | ------- | ------------------------------------------------------------ | -| boolean | 当读到最后一条记录后,再继续读就到结果集尾了,没有记录了,执行isAfterLast()方法就返回true,否则返回false。 | +| boolean | 当读到最后一条记录后,再继续读就到结果集尾了,没有记录了,执行isAfterLast()方法就返回true,否则返回false | **示例**: @@ -868,6 +1013,10 @@ close(): void; 释放 FetchFileResult 实例并使其失效。无法调用其他方法。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **示例**: ``` @@ -880,11 +1029,15 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的第一个文件资产。此方法使用回调返回FileAsset。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------- | ---- | --------------------------------------------- | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取结果集中第一个FileAsset完成后的回调。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | ------------------------------------------- | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取结果集中第一个FileAsset完成后的回调 | **示例**: @@ -904,11 +1057,15 @@ getFirstObject(): Promise<FileAsset>; 获取文件检索结果中的第一个文件资产。此方法使用返回FileAsset。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值**: | 类型 | 说明 | | ------------------ | -------------------------------------- | -| Promise<[FileAsset](#FileAsset)> | Promise方式返回FileAsset | +| Promise<[FileAsset](#FileAsset)> | Promise方式返回FileAsset | **示例**: @@ -927,11 +1084,15 @@ queryResultSet_.getFirstObject().then(function(fileAsset){ 获取文件检索结果中的下一个文件资产。此方法使用callback形式返回结果。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: -| 参数名 | 类型 | 必填 | 说明 | -| --------- | -------------------------------------- | ---- | ------------------------------------------- | -| callbacke | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回结果集中下一个FileAsset之后的回调。 | +| 参数名 | 类型 | 必填 | 说明 | +| --------- | -------------------------------------------- | ---- | ----------------------------------------- | +| callbacke | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回结果集中下一个FileAsset之后的回调 | **示例**: @@ -951,11 +1112,15 @@ data.getNextObject((err, value) => { 获取文件检索结果中的下一个文件资产。此方法使用promise方式来异步返回FileAsset。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值**: | 类型 | 说明 | | -------------------------------- | ------------------- | -| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象。 | +| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象 | **示例**: @@ -969,11 +1134,15 @@ getLastObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的最后一个文件资产。此方法使用callback回调来返回FileAsset。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------- | ---- | ----------------------------- | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调。 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | --------------------------- | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调 | **示例**: @@ -995,11 +1164,15 @@ getLastObject(): Promise<FileAsset>; 获取文件检索结果中的最后一个文件资产。此方法使用Promise方式来返回FileAsset。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值**: | 类型 | 说明 | | -------------------------------- | ------------------- | -| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象。 | +| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象 | **示例**: @@ -1013,12 +1186,16 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void 获取文件检索结果中具有指定索引的文件资产。此方法使用回调来返回FileAsset。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------- | ---- | ----------------------------- | -| index | number | 是 | 要获取的文件的索引。 | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调。 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | --------------------------- | +| index | number | 是 | 要获取的文件的索引 | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调 | **示例**: @@ -1038,17 +1215,21 @@ getPositionObject(index: number): Promise<FileAsset>; 获取文件检索结果中具有指定索引的文件资产。此方法使用Promise形式返回文件Asset。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: | 参数 | 类型 | 必填 | 说明 | | ----- | ------ | ---- | -------------------- | -| index | number | 是 | 要获取的文件在结果集中的位置。 | +| index | number | 是 | 要获取的文件在结果集中的位置 | **返回值**: | 类型 | 说明 | | -------------------------------- | ------------------- | -| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象。 | +| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象 | **示例**: @@ -1068,11 +1249,15 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; 获取文件检索结果中的所有文件资产。此方法使用Callback回调来返回FileAsset结果集。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | --------------------------------------------- | ---- | --------------------------------- | -| callback | AsyncCallback> | 是 | 异步返回FileAsset列表之后的回调。 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------- | ---- | ------------------------------- | +| callback | AsyncCallback> | 是 | 异步返回FileAsset列表之后的回调 | **示例**: @@ -1092,11 +1277,15 @@ getAllObject(): Promise<Array<FileAsset>>; 获取文件检索结果中的所有文件资产。此方法使用Promise来返回FileAsset结果集。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值**: -| 类型 | 说明 | -| --------------------------------------- | ----------------------- | -| Promise> | 返回FileAsset对象列表。 | +| 类型 | 说明 | +| --------------------------------------- | --------------------- | +| Promise> | 返回FileAsset对象列表 | **示例**: @@ -1114,11 +1303,15 @@ commitModify(callback: AsyncCallback<void>): void; 更新相册属性修改到数据库中。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: | 参数 | 类型 | 必填 | 说明 | | -------- | ------------------- | ---- | ----------------------------- | -| callback | AsyncCallback<void> | 是 | 回调返回空 | +| callback | AsyncCallback<void> | 是 | 回调返回空 | **示例**: @@ -1139,6 +1332,10 @@ commitModify(): Promise<void>; 更新相册属性修改到数据库中。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **返回值**: | 类型 | 说明 | @@ -1162,12 +1359,16 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 按照检索条件获取相册中的文件。此方法使用Callback回调来返回文件结果集。 +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE + +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core + **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------------------- | ---- | ----------------------------------- | -| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项。 | -| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步返回FetchFileResult之后的回调。 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------------- | ---- | --------------------------------- | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项 | +| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步返回FetchFileResult之后的回调 | **示例**: @@ -1185,58 +1386,15 @@ function getFileAssetsCallBack(err, fetchFileResult) { 按照检索条件获取相册中的文件。此方法使用异步回调来返回文件结果集。 -**参数**: +**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -| 参数 | 类型 | 必填 | 说明 | -| ------- | --------------------------------------- | ---- | -------------- | -| options | [MediaFetchOptions](#MediaFetchOptions) | 否 | 媒体检索选项。 | - -**返回值**: - -| 类型 | 说明 | -| ----------------------------------------------------- | ------------------------- | -| Promise<[FetchFileResult](#FetchFileResult.getCount)> | 返回FetchFileResult对象。 | - -**示例**: - -``` -album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ - console.info("getFileAssets successfully:"+ JSON.stringify(albumFetchFileResult)); -}).catch(function(err){ - console.info("getFileAssets failed with error:"+ err); -}); -``` - - - - - -## SmartAlbum.getFileAssets - -getFileAssets(callback: AsyncCallback<FetchFileResult>): void; - -获取智能相册中的文件资源 +**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core **参数**: -| 参数 | 类型 | 必填 | 说明 | -| ------- | ----------------- | ---- | -------------- | -| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步返回FetchFileResult之后的回调。 | - -**示例**: - -``` -favSmartAlbum.getFileAssets(getFileAssetsCallBack); -function getFileAssetsCallBack(err, fSmartFetchFileResult) { - // do something - } -``` - -## SmartAlbum.getFileAssets - -getFileAssets(): Promise<FetchFileResult>; - -获取智能相册中的文件资源 +| 参数 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------- | ---- | ------------ | +| options | [MediaFetchOptions](#MediaFetchOptions) | 否 | 媒体检索选项 | **返回值**: @@ -1247,8 +1405,8 @@ getFileAssets(): Promise<FetchFileResult>; **示例**: ``` -favSmartAlbum.getFileAssets().then(function(fSmartFetchFileResult){ - console.info("getFileAssets successfully:"+ JSON.stringify(fSmartFetchFileResult)); +album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ + console.info("getFileAssets successfully:"+ JSON.stringify(albumFetchFileResult)); }).catch(function(err){ console.info("getFileAssets failed with error:"+ err); }); @@ -1287,6 +1445,7 @@ FileAsset Album --------- + 实体相册。 **属性** @@ -1301,106 +1460,77 @@ Album | relativePath | string | 是 | 否 | 相对路径 | | coverUri | string | 是 | 否 | 封面文件Uri | -SmartAlbum ---------- - -智能相册 - -**属性:** - -| 名称 | 参数型 | 可读 | 可写 | 说明 | -| ------------- | ------ | ---- | ---- | ------------- | -| albumName | string | 是 | 是 | 相册名。 | -| albumUri | string | 是 | 否 | 相册目录。 | -| albumTag | string | 是 | 是 | 相册标签。 | -| albumCapacity | number | 是 | 否 | 相册容量。 | -| categoryId | number | 是 | 否 | 相册分类ID。 | -| categoryName | strign | 是 | 否 | 相册分类名。 | -| coverUri | string | 是 | 否 | 封面文件uri。 | - - - MediaType --------- 枚举,媒体类型。 -| 名称 | 默认值 | 描述 | -| ----- | ------ | ------ | -| FILE | 0 | 文件。 | -| IMAGE | 1 | 图片。 | -| VIDEO | 2 | 视频。 | -| AUDIO | 3 | 音频。 | +| 名称 | 默认值 | 描述 | +| ----- | ------ | ---- | +| FILE | 0 | 文件 | +| IMAGE | 1 | 图片 | +| VIDEO | 2 | 视频 | +| AUDIO | 3 | 音频 | FileKey ------- 枚举,文件关键信息。 -| 名称 | 默认值 | 可读 | 可写 | 描述 | -| ------------- | ------------------- | ---- | ---- | -------------------- | -| ID | file_id | 是 | 否 | 文件编号。 | -| RELATIVE_PATH | relative_path | 是 | 是 | 相对路径。 | -| DISPLAY_NAME | display_name | 是 | 是 | 显示名字。 | -| PARENT | parent | 是 | 否 | 父目录。 | -| MIME_TYPE | mime_type | 是 | 否 | 该资源的媒体类型。 | -| MEDIA_TYPE | media_type | 是 | 否 | 媒体类型。 | -| SIZE | size | 是 | 否 | 文件大小。 | -| DATE_ADDED | date_added | 是 | 否 | 添加日期。 | -| DATE_MODIFIED | date_modified | 是 | 否 | 修改日期。 | -| DATE_TAKEN | date_taken | 是 | 否 | 表示拍摄日期 | -| TITLE | title | 是 | 是 | 表示标题 | -| ARTIST | artist | 是 | 否 | 创建者。 | -| AUDIOALBUM | audio_album | 是 | 否 | 表示音频相册。 | -| DURATION | duration | 是 | 否 | 表示媒体文件时长 | -| WIDTH | width | 是 | 否 | 表示图片宽。 | -| HEIGHT | height | 是 | 否 | 表示图片高。 | -| ORIENTATION | orientation | 是 | 否 | 图片显示方向。 | -| ALBUM_ID | bucket_id | 是 | 否 | 媒体文件所在相册ID。 | -| ALBUM_NAME | bucket_display_name | 是 | 否 | 媒体文件所在相册名。 | +| 名称 | 默认值 | 可读 | 可写 | 描述 | +| ------------- | ------------------- | ---- | ---- | ------------------ | +| ID | file_id | 是 | 否 | 文件编号 | +| RELATIVE_PATH | relative_path | 是 | 是 | 相对路径 | +| DISPLAY_NAME | display_name | 是 | 是 | 显示名字 | +| PARENT | parent | 是 | 否 | 父目录 | +| MIME_TYPE | mime_type | 是 | 否 | 该资源的媒体类型 | +| MEDIA_TYPE | media_type | 是 | 否 | 媒体类型 | +| SIZE | size | 是 | 否 | 文件大小 | +| DATE_ADDED | date_added | 是 | 否 | 添加日期 | +| DATE_MODIFIED | date_modified | 是 | 否 | 修改日期 | +| DATE_TAKEN | date_taken | 是 | 否 | 表示拍摄日期 | +| TITLE | title | 是 | 是 | 表示标题 | +| ARTIST | artist | 是 | 否 | 创建者 | +| AUDIOALBUM | audio_album | 是 | 否 | 表示音频相册 | +| DURATION | duration | 是 | 否 | 表示媒体文件时长 | +| WIDTH | width | 是 | 否 | 表示图片宽 | +| HEIGHT | height | 是 | 否 | 表示图片高 | +| ORIENTATION | orientation | 是 | 否 | 图片显示方向 | +| ALBUM_ID | bucket_id | 是 | 否 | 媒体文件所在相册ID | +| ALBUM_NAME | bucket_display_name | 是 | 否 | 媒体文件所在相册名 | DirectoryType ------------- 枚举,目录类型。 -| 名称 | 默认值 | 描述 | -| ---------------------- | ------ | ------------------ | -| DIR_CDSA | 0 | 表示CDSA规范路径。 | -| DIR_VIDEO | 1 | 表示视频路径。 | -| DIR_IMAGE | 2 | 表示图片路径。 | -| DIR_AUDIO | 3 | 表示音频路径。 | -| DIR_AUDIO_RINGS | 4 | 表示铃声音频路径。 | -| DIR_AUDIO_NOTICE | 5 | 表示提示音频路径。 | -| DIR_AUDIO_CLOCK | 6 | 表示时钟音频路径。 | -| DIR_DOCUMENTS | 7 | 表示文档路径。 | -| DIR_DOWNLOAD | 8 | 表示下载路径。 | -| DIR_DOWNLOAD_BLUETOOTH | 9 | 表示蓝牙下载路径。 | - -PrivateAlbumType ------------------ - -枚举,智能相册类型。 - -| 名称 | 默认值 | 描述 | -| ------------- | ------ | -------------------- | -| TYPE_FAVORITE | 0 | 表示收藏文件类型。 | -| TYPE_TRASH | 1 | 表示回收站文件类型。 | +| 名称 | 默认值 | 描述 | +| ---------------------- | ------ | ---------------- | +| DIR_CDSA | 0 | 表示CDSA规范路径 | +| DIR_VIDEO | 1 | 表示视频路径 | +| DIR_IMAGE | 2 | 表示图片路径 | +| DIR_AUDIO | 3 | 表示音频路径 | +| DIR_AUDIO_RINGS | 4 | 表示铃声音频路径 | +| DIR_AUDIO_NOTICE | 5 | 表示提示音频路径 | +| DIR_AUDIO_CLOCK | 6 | 表示时钟音频路径 | +| DIR_DOCUMENTS | 7 | 表示文档路径 | +| DIR_DOWNLOAD | 8 | 表示下载路径 | +| DIR_DOWNLOAD_BLUETOOTH | 9 | 表示蓝牙下载路径 | DeviceType ----------- 枚举,设备类型。 -| 名称 | 默认值 | 描述 | -| ------------ | ------ | ------------ | -| TYPE_UNKNOWN | 0 | 未识别设备。 | -| TYPE_LAPTOP | 1 | 笔记本电脑。 | -| TYPE_PHONE | 2 | 手机。 | -| TYPE_TABLET | 3 | 平板电脑。 | -| TYPE_WATCH | 4 | 智能手表。 | -| TYPE_CAR | 5 | 车载设备。 | -| TYPE_TV | 6 | 电视设备。 | +| 名称 | 默认值 | 描述 | +| ------------ | ------ | ---------- | +| TYPE_UNKNOWN | 0 | 未识别设备 | +| TYPE_LAPTOP | 1 | 笔记本电脑 | +| TYPE_PHONE | 2 | 手机 | +| TYPE_TABLET | 3 | 平板电脑 | +| TYPE_WATCH | 4 | 智能手表 | +| TYPE_CAR | 5 | 车载设备 | +| TYPE_TV | 6 | 电视设备 | ## MediaFetchOptions @@ -1415,21 +1545,6 @@ DeviceType | networkId | string | 是 | 是 | 对端设备网络ID | | extendArgs | string | 是 | 是 | 扩展的检索参数 | - - -## PeerInfo - -对端设备信息。 - -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ---------- | ---------- | ---- | ---- | -------------- | -| deviceName | string | 是 | 否 | 设备名称 | -| networkId | string | 是 | 否 | 对端设备网络ID | -| deviceType | DeviceType | 是 | 否 | 设备类型 | -| isOnline | boolean | 是 | 否 | 是否在线 | - - - ## Size 图片尺寸。 @@ -1439,4 +1554,3 @@ DeviceType | width | number | 是 | 是 | 宽 | | height | number | 是 | 是 | 高 | - -- Gitee From 6f28ae0c7641ab90c97f780a322055062ca3e887 Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Tue, 1 Mar 2022 14:27:25 +0800 Subject: [PATCH 021/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: Ic23d195be5160282f55b3362e041135c944e4075 --- .../reference/apis/js-apis-media.md | 148 +++--------------- 1 file changed, 21 insertions(+), 127 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 0bf62e41003..69477e2e0e2 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -34,64 +34,7 @@ createAudioPlayer(): [AudioPlayer](#audioplayer) **示例:** ```js -var audioPlayer = media.createAudioPlayer(); -``` - -## media.createAudioPlayerAsync8+ - -createAudioPlayerAsync(callback: AsyncCallback\<[AudioPlayer](#audioplayer)>): void - -异步方式创建音频播放实例。通过注册回调函数获取返回值。 - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------------------ | ---- | ------------------------------ | -| callback | AsyncCallback<[AudioPlayer](#audioplayer)> | 是 | 异步创建音频播放实例回调方法。 | - -**示例:** - -```js -media.createAudioPlayerAsync((error, audio) => { - if (typeof(audio) != 'undefined') { - audioPlayer = audio; - console.info('audio createAudioPlayerAsync success'); - } else { - console.info(`audio createAudioPlayerAsync fail, error:${error.message}`); - } -}); -``` - -## media.createAudioPlayerAsync8+ - -createAudioPlayerAsync: Promise<[AudioPlayer](#audioplayer)> - -异步方式创建音频播放实例。通过Promise获取返回值。 - -**返回值:** - -| 类型 | 说明 | -| ------------------------------------ | ----------------------------------- | -| Promise<[AudioPlayer](#audioplayer)> | 异步创建音频播放实例Promise返回值。 | - -**示例:** - -```js -function failureCallback(error) { - console.info(`audio failureCallback, error:${error.message}`); -} -function catchCallback(error) { - console.info(`audio catchCallback, error:${error.message}`); -} - -await media.createAudioPlayerAsync.then((audio) => { - if (typeof(audio) != 'undefined') { - audioPlayer = audio; - console.info('audio createAudioPlayerAsync success'); - } else { - console.info('audio createAudioPlayerAsync fail'); - } -}, failureCallback).catch(catchCallback); +let audioPlayer = media.createAudioPlayer(); ``` ## media.createVideoPlayer8+ @@ -109,6 +52,8 @@ createVideoPlayer(callback: AsyncCallback\<[VideoPlayer](#videoplayer8)>): void **示例:** ```js +let videoPlayer + media.createVideoPlayer((error, video) => { if (typeof(video) != 'undefined') { videoPlayer = video; @@ -134,6 +79,8 @@ createVideoPlayer: Promise<[VideoPlayer](#videoplayer8)> **示例:** ```js +let videoPlayer + function failureCallback(error) { console.info(`video failureCallback, error:${error.message}`); } @@ -169,66 +116,9 @@ createAudioRecorder(): AudioRecorder let audiorecorder = media.createAudioRecorder(); ``` -## media.createAudioRecorderAsync8+ +## media.createVideoRecorder8+ -createAudioRecorderAsync(callback: AsyncCallback\<[AudioRecorder](#audiorecorder)>): void - -异步方式创建音频录制实例。通过注册回调函数获取返回值。 - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ---------------------------------------------- | ---- | ------------------------------ | -| callback | AsyncCallback<[AudioRecorder](#audiorecorder)> | 是 | 异步创建音频录制实例回调方法。 | - -**示例:** - -```js -media.createAudioRecorderAsync((error, audio) => { - if (typeof(audio) != 'undefined') { - audioRecorder = audio; - console.info('audio createAudioRecorderAsync success'); - } else { - console.info(`audio createAudioRecorderAsync fail, error:${error.message}`); - } -}); -``` - -## media.createAudioRecorderAsync8+ - -createAudioRecorderAsync: Promise<[AudioRecorder](#audiorecorder)> - -异步方式创建音频录制实例。通过Promise获取返回值。 - -**返回值:** - -| 类型 | 说明 | -| ---------------------------------------- | ----------------------------------- | -| Promise<[AudioRecorder](#audiorecorder)> | 异步创建音频录制实例Promise返回值。 | - -**示例:** - -```js -function failureCallback(error) { - console.info(`audio failureCallback, error:${error.message}`); -} -function catchCallback(error) { - console.info(`audio catchCallback, error:${error.message}`); -} - -await media.createAudioRecorderAsync.then((audio) => { - if (typeof(audio) != 'undefined') { - audioRecorder = audio; - console.info('audio createAudioRecorderAsync success'); - } else { - console.info('audio createAudioRecorderAsync fail'); - } -}, failureCallback).catch(catchCallback); -``` - -## media.createVideoRecorderAsync8+ - -createVideoRecorderAsync(callback: AsyncCallback\<[VideoRecorder](#videorecorder8)>): void +createVideoRecorder(callback: AsyncCallback\<[VideoRecorder](#videorecorder8)>): void 异步方式创建视频录制实例。通过注册回调函数获取返回值。 @@ -241,19 +131,21 @@ createVideoRecorderAsync(callback: AsyncCallback\<[VideoRecorder](#videorecorder **示例:** ```js -media.createVideoRecorderAsync((error, video) => { +let videoRecorder + +media.createVideoRecorder((error, video) => { if (typeof(video) != 'undefined') { videoRecorder = video; - console.info('video createVideoRecorderAsync success'); + console.info('video createVideoRecorder success'); } else { - console.info(`video createVideoRecorderAsync fail, error:${error.message}`); + console.info(`video createVideoRecorder fail, error:${error.message}`); } }); ``` -## media.createVideoRecorderAsync8+ +## media.createVideoRecorder8+ -createVideoRecorderAsync: Promise<[VideoRecorder](#videorecorder8)> +createVideoRecorder: Promise<[VideoRecorder](#videorecorder8)> 异步方式创建视频录制实例。通过Promise获取返回值。 @@ -266,6 +158,8 @@ createVideoRecorderAsync: Promise<[VideoRecorder](#videorecorder8)> **示例:** ```js +let videoRecorder + function failureCallback(error) { console.info(`video failureCallback, error:${error.message}`); } @@ -273,12 +167,12 @@ function catchCallback(error) { console.info(`video catchCallback, error:${error.message}`); } -await media.createVideoRecorderAsync.then((video) => { +await media.createVideoRecorder.then((video) => { if (typeof(video) != 'undefined') { videoRecorder = video; - console.info('video createVideoRecorderAsync success'); + console.info('video createVideoRecorder success'); } else { - console.info('video createVideoRecorderAsync fail'); + console.info('video createVideoRecorder fail'); } }, failureCallback).catch(catchCallback); ``` @@ -1542,7 +1436,7 @@ audioPlayer.getTrackDescription((error, arrlist) => { ## AudioRecorder -音频录制管理类,用于录制音频媒体。在调用AudioRecorder的方法前,需要先通过[createAudioRecorder()](#media.createaudiorecorder) 或[createAudioRecorderAsync()](#media.createaudiorecorderasync8)构建一个[AudioRecorder](#audiorecorder)实例。 +音频录制管理类,用于录制音频媒体。在调用AudioRecorder的方法前,需要先通过[createAudioRecorder()](#media.createaudiorecorder) 构建一个[AudioRecorder](#audiorecorder)实例。 音频录制demo可参考:[音频录制开发指导](../../media/audio-recorder.md) @@ -1785,7 +1679,7 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' ## VideoRecorder8+ -视频录制管理类,用于录制视频媒体。在调用VideoRecorder的方法前,需要先通过[createVideoRecorderAsync()](#media.createvideorecorderasync8)构建一个[VideoRecorder](#videorecorder8)实例。 +视频录制管理类,用于录制视频媒体。在调用VideoRecorder的方法前,需要先通过[createVideoRecorder()](#media.createvideorecorder8)构建一个[VideoRecorder](#videorecorder8)实例。 视频录制demo可参考:[视频录制开发指导](../../media/video-recorder.md) -- Gitee From 0d8d01ebe9d8f050c6b388dcf5f79470b657ffd8 Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Tue, 1 Mar 2022 14:37:25 +0800 Subject: [PATCH 022/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: I2e16922d3835fde1e91088e524b56a7f90aa092b --- .../reference/apis/figures/zh-cn_image_url.png:Zone.Identifier | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier diff --git a/zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier b/zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier deleted file mode 100644 index a831910b363..00000000000 --- a/zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -LastWriterPackageFamilyName=Microsoft.ScreenSketch_8wekyb3d8bbwe -ZoneId=3 -- Gitee From 6f73e5365974c924d49a37653fd511fbd9231f42 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 1 Mar 2022 14:40:48 +0800 Subject: [PATCH 023/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 62 ++++++++++--------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 8f7785f12ae..83ef26bc388 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -10,7 +10,6 @@ import medialibrary from '@ohos.multimedia.medialibrary'; ## getMediaLibrary ---------------- function getMediaLibrary(context: Context): MediaLibrary; @@ -35,6 +34,8 @@ function getMediaLibrary(context: Context): MediaLibrary; **示例:** ``` +import featureAbility from '@ohos.ability.featureAbility'; +var context = featureAbility.getContext() var media = mediaLibrary.getMediaLibrary(context); ``` @@ -61,7 +62,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe ``` medialibrary.getFileAssets(fetchOp, (error, data) => { // do something - }); +}); ``` ## medialibrary.getFileAssets @@ -168,7 +169,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal ``` medialibrary.createAsset(mediaType, displayName, rp, (createAssetErr, fileObj) => { // do something - }); +}); ``` ## medialibrary.createAsset @@ -227,7 +228,7 @@ deleteAsset(uri: string, callback: AsyncCallback<void>): void; ``` medialibrary.deleteAsset(fileAsset.uri, (deleteAssetErr, deleteRows) => { // do something - }); +}); ``` ## medialibrary.deleteAsset @@ -338,7 +339,7 @@ getActivePeers(callback: AsyncCallback): void; ``` medialibrary.getActivePeers((err, data) => { // do something - }); +}); ``` ## medialibrary.getActivePeers @@ -386,7 +387,7 @@ getAllPeers(callback: AsyncCallback): void; ``` medialibrary.getAllPeers((err, data) => { // do something - }); +}); ``` ## medialibrary.getAllPeers @@ -430,7 +431,7 @@ release(callback: AsyncCallback<void>): void; ``` medialibrary.release((err, data) => { // do something - }); +}); ``` ## medialibrary.release @@ -455,10 +456,6 @@ release(): Promise<void>; medialibrary.release() ``` - - - - ## FileAsset.isDirectory isDirectory(callback: AsyncCallback<boolean>): void; @@ -480,7 +477,7 @@ isDirectory(callback: AsyncCallback<boolean>): void; ``` asset.isDirectory((err, isDirectory) => { // do something - }); +}); ``` ## FileAsset.isDirectory @@ -555,8 +552,7 @@ commitModify(): Promise<void>; asset.commitModify(commitModifyCallBack); function commitModifyCallBack(err, commitModify) { // do something - - } +} ``` ## FileAsset.open @@ -581,7 +577,7 @@ open(mode: string, callback: AsyncCallback<number>): void; ``` asset.open('Rw').then((openError, fd) => { // do something - } +}); ``` ## FileAsset.open @@ -611,7 +607,7 @@ open(mode: string): Promise<number>; ``` asset.open('Rw').then((openError, fd) => { // do something - } +}); ``` ## FileAsset.close @@ -636,7 +632,7 @@ close(fd: number, callback: AsyncCallback<void>): void; ``` fileAsset.close(fd).then((closeErr) => { // do something - } +}); ``` ## FileAsset.close @@ -666,7 +662,7 @@ close(fd: number): Promise<void>; ``` fileAsset.close(fd).then((closeErr) => { // do something - } +}); ``` ## FileAsset.getThumbnail @@ -688,8 +684,9 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -data1.getThumbnail(size, (err2, pixelmap) => { +data1.getThumbnail(size, (err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); +}); ``` ## FileAsset.getThumbnail @@ -712,8 +709,9 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -data1.getThumbnail(size, (err2, pixelmap) => { +data1.getThumbnail(size, (err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); +}); ``` ## FileAsset.getThumbnail @@ -741,8 +739,9 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; **示例:** ``` -data1.getThumbnail(size, (err2, pixelmap) => { +data1.getThumbnail(size, (err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); +}); ``` ## FileAsset.favorite @@ -823,7 +822,7 @@ isFavorite(callback: AsyncCallback<boolean>): void; ``` asset.favorite(true, (err) => { // do something - }); +}); ``` ## FileAsset.isFavorite @@ -874,7 +873,7 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; ``` asset.trash(true, (err) => { // do something - }); +}); ``` ## FileAsset.trash @@ -930,7 +929,7 @@ isTrash(callback: AsyncCallback<boolean>): void; ``` asset.isTrash((err, isTrash) => { // do something - }); +}); ``` ## FileAsset.isTrash @@ -1156,8 +1155,6 @@ data.getLastObject((err, value) => { }) ``` - - ## FetchFileResult.getLastObject getLastObject(): Promise<FileAsset>; @@ -1293,10 +1290,6 @@ getAllObject(): Promise<Array<FileAsset>>; var data = FetchFileResult.getAllObject(); ``` - - - - ## Album.commitModify commitModify(callback: AsyncCallback<void>): void; @@ -1412,7 +1405,16 @@ album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ }); ``` +## PeerInfo + +对端设备信息。 +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ---------- | ---------- | ---- | ---- | -------------- | +| deviceName | string | 是 | 否 | 设备名称 | +| networkId | string | 是 | 否 | 对端设备网络ID | +| deviceType | DeviceType | 是 | 否 | 设备类型 | +| isOnline | boolean | 是 | 否 | 是否在线 | FileAsset --------- -- Gitee From da23944e9a63c626bb1cf0d2d336236e9d546084 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 1 Mar 2022 14:44:56 +0800 Subject: [PATCH 024/282] fix issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 212 +++++++++--------- 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 83ef26bc388..5d0c4daf331 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -15,9 +15,9 @@ function getMediaLibrary(context: Context): MediaLibrary; 获取媒体库。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -46,9 +46,9 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 获取文件资源,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -70,9 +70,9 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; 获取文件资源,使用Promise方式返回结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -102,9 +102,9 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| 打开媒体文件变更和上线通知,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -126,9 +126,9 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' 关闭媒体文件变更和设备上线通知,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -151,9 +151,9 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal 创建媒体资源,使用callback方式返回结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -178,9 +178,9 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr 创建媒体资源,使用Promise方式返回结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -212,9 +212,9 @@ deleteAsset(uri: string, callback: AsyncCallback<void>): void; 删除媒体资源,使用callback方式返回结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -237,9 +237,9 @@ deleteAsset(uri: string): Promise<void>; 删除媒体资源,使用promise方式返回结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -269,9 +269,9 @@ getAlbums(options: MediaFetchOptions, callback: AsyncCallback; 获取实体相册,使用 promise 方式返回结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -324,9 +324,9 @@ getActivePeers(callback: AsyncCallback): void; 获取活动对端设备 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore +**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore **参数:** @@ -348,9 +348,9 @@ getActivePeers(): Promise; 获取活动对端设备 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore +**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore **参数:** @@ -372,9 +372,9 @@ getAllPeers(callback: AsyncCallback): void; 获取所有对端设备 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore +**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore **参数:** @@ -396,9 +396,9 @@ getAllPeers(): Promise; 获取所有对端设备 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.DistributedCore +**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore **返回值:** @@ -416,9 +416,9 @@ release(callback: AsyncCallback<void>): void; 释放MediaLibrary实例 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -440,9 +440,9 @@ release(): Promise<void>; 释放MediaLibrary实例 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值:** @@ -462,9 +462,9 @@ isDirectory(callback: AsyncCallback<boolean>): void; 判断fileAsset是否为目录,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -486,9 +486,9 @@ isDirectory():Promise<boolean>; 判断fileAsset是否为目录,使用Promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值:** @@ -512,9 +512,9 @@ commitModify(callback: AsyncCallback<void>): void; 修改文件的元数据,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -536,9 +536,9 @@ commitModify(): Promise<void>; 修改文件的元数据,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值:** @@ -561,9 +561,9 @@ open(mode: string, callback: AsyncCallback<number>): void; 打开当前文件,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数** @@ -586,9 +586,9 @@ open(mode: string): Promise<number>; 打开当前文件,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -616,9 +616,9 @@ close(fd: number, callback: AsyncCallback<void>): void; 关闭当前文件,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -641,9 +641,9 @@ close(fd: number): Promise<void>; 关闭当前文件,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -671,9 +671,9 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -695,9 +695,9 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,传入缩略图尺寸,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -720,9 +720,9 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; 获取文件的缩略图,传入缩略图尺寸,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -750,9 +750,9 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; 将文件设置为收藏文件,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -775,9 +775,9 @@ favorite(isFavorite: boolean): Promise<void>; 将文件设置为收藏文件,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -807,9 +807,9 @@ isFavorite(callback: AsyncCallback<boolean>): void; 判断该文件是否为收藏文件,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -831,9 +831,9 @@ isFavorite():Promise<boolean>; 判断该文件是否为收藏文件,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值:** @@ -857,9 +857,9 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; 当文件被定位时,将文件放到垃圾文件夹,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -882,9 +882,9 @@ trash(isTrash: boolean,): Promise<void>; 当文件被定位时,将文件放到垃圾文件夹,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -914,9 +914,9 @@ isTrash(callback: AsyncCallback<boolean>): void; 当文件被定位,判断文件是否为垃圾文件,使用callback方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -938,9 +938,9 @@ isTrash():Promise<boolean>; 当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值:** @@ -968,9 +968,9 @@ getCount(): number; 获取文件检索结果中的文件总数。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -990,9 +990,9 @@ isAfterLast(): boolean; 检查结果集是否指向最后一行。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -1012,9 +1012,9 @@ close(): void; 释放 FetchFileResult 实例并使其失效。无法调用其他方法。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **示例**: @@ -1028,9 +1028,9 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的第一个文件资产。此方法使用回调返回FileAsset。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1056,9 +1056,9 @@ getFirstObject(): Promise<FileAsset>; 获取文件检索结果中的第一个文件资产。此方法使用返回FileAsset。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -1083,9 +1083,9 @@ queryResultSet_.getFirstObject().then(function(fileAsset){ 获取文件检索结果中的下一个文件资产。此方法使用callback形式返回结果。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1111,9 +1111,9 @@ data.getNextObject((err, value) => { 获取文件检索结果中的下一个文件资产。此方法使用promise方式来异步返回FileAsset。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -1133,9 +1133,9 @@ getLastObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的最后一个文件资产。此方法使用callback回调来返回FileAsset。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1161,9 +1161,9 @@ getLastObject(): Promise<FileAsset>; 获取文件检索结果中的最后一个文件资产。此方法使用Promise方式来返回FileAsset。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -1183,9 +1183,9 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void 获取文件检索结果中具有指定索引的文件资产。此方法使用回调来返回FileAsset。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1212,9 +1212,9 @@ getPositionObject(index: number): Promise<FileAsset>; 获取文件检索结果中具有指定索引的文件资产。此方法使用Promise形式返回文件Asset。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1246,9 +1246,9 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; 获取文件检索结果中的所有文件资产。此方法使用Callback回调来返回FileAsset结果集。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1274,9 +1274,9 @@ getAllObject(): Promise<Array<FileAsset>>; 获取文件检索结果中的所有文件资产。此方法使用Promise来返回FileAsset结果集。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -1296,9 +1296,9 @@ commitModify(callback: AsyncCallback<void>): void; 更新相册属性修改到数据库中。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1325,9 +1325,9 @@ commitModify(): Promise<void>; 更新相册属性修改到数据库中。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -1352,9 +1352,9 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 按照检索条件获取相册中的文件。此方法使用Callback回调来返回文件结果集。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: @@ -1379,9 +1379,9 @@ function getFileAssetsCallBack(err, fetchFileResult) { 按照检索条件获取相册中的文件。此方法使用异步回调来返回文件结果集。 -**需要权限:**ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE -**系统能力:**SystemCapability.Multimedia.MediaLibrary.Core +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: -- Gitee From e984e9c976a0859ab7334029eaae5e266ba1facd Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 1 Mar 2022 14:56:37 +0800 Subject: [PATCH 025/282] add permission Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 5d0c4daf331..bc2cd94d4d1 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -15,7 +15,7 @@ function getMediaLibrary(context: Context): MediaLibrary; 获取媒体库。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -46,7 +46,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 获取文件资源,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -70,7 +70,7 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; 获取文件资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -102,7 +102,7 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| 打开媒体文件变更和上线通知,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -126,7 +126,7 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' 关闭媒体文件变更和设备上线通知,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -151,7 +151,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal 创建媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -178,7 +178,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr 创建媒体资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -212,7 +212,7 @@ deleteAsset(uri: string, callback: AsyncCallback<void>): void; 删除媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -237,7 +237,7 @@ deleteAsset(uri: string): Promise<void>; 删除媒体资源,使用promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -269,7 +269,7 @@ getAlbums(options: MediaFetchOptions, callback: AsyncCallback; 获取实体相册,使用 promise 方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -324,7 +324,7 @@ getActivePeers(callback: AsyncCallback): void; 获取活动对端设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -348,7 +348,7 @@ getActivePeers(): Promise; 获取活动对端设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -372,7 +372,7 @@ getAllPeers(callback: AsyncCallback): void; 获取所有对端设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -396,7 +396,7 @@ getAllPeers(): Promise; 获取所有对端设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -416,7 +416,7 @@ release(callback: AsyncCallback<void>): void; 释放MediaLibrary实例 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -440,7 +440,7 @@ release(): Promise<void>; 释放MediaLibrary实例 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -462,7 +462,7 @@ isDirectory(callback: AsyncCallback<boolean>): void; 判断fileAsset是否为目录,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -486,7 +486,7 @@ isDirectory():Promise<boolean>; 判断fileAsset是否为目录,使用Promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -512,7 +512,7 @@ commitModify(callback: AsyncCallback<void>): void; 修改文件的元数据,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -536,7 +536,7 @@ commitModify(): Promise<void>; 修改文件的元数据,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -561,7 +561,7 @@ open(mode: string, callback: AsyncCallback<number>): void; 打开当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -586,7 +586,7 @@ open(mode: string): Promise<number>; 打开当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -616,7 +616,7 @@ close(fd: number, callback: AsyncCallback<void>): void; 关闭当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -641,7 +641,7 @@ close(fd: number): Promise<void>; 关闭当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -671,7 +671,7 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -695,7 +695,7 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,传入缩略图尺寸,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -720,7 +720,7 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; 获取文件的缩略图,传入缩略图尺寸,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -750,7 +750,7 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; 将文件设置为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -775,7 +775,7 @@ favorite(isFavorite: boolean): Promise<void>; 将文件设置为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -807,7 +807,7 @@ isFavorite(callback: AsyncCallback<boolean>): void; 判断该文件是否为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -831,7 +831,7 @@ isFavorite():Promise<boolean>; 判断该文件是否为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -857,7 +857,7 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; 当文件被定位时,将文件放到垃圾文件夹,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -882,7 +882,7 @@ trash(isTrash: boolean,): Promise<void>; 当文件被定位时,将文件放到垃圾文件夹,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -914,7 +914,7 @@ isTrash(callback: AsyncCallback<boolean>): void; 当文件被定位,判断文件是否为垃圾文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -938,7 +938,7 @@ isTrash():Promise<boolean>; 当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -968,7 +968,7 @@ getCount(): number; 获取文件检索结果中的文件总数。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -990,7 +990,7 @@ isAfterLast(): boolean; 检查结果集是否指向最后一行。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1012,7 +1012,7 @@ close(): void; 释放 FetchFileResult 实例并使其失效。无法调用其他方法。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1028,7 +1028,7 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的第一个文件资产。此方法使用回调返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1056,7 +1056,7 @@ getFirstObject(): Promise<FileAsset>; 获取文件检索结果中的第一个文件资产。此方法使用返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1083,7 +1083,7 @@ queryResultSet_.getFirstObject().then(function(fileAsset){ 获取文件检索结果中的下一个文件资产。此方法使用callback形式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1111,7 +1111,7 @@ data.getNextObject((err, value) => { 获取文件检索结果中的下一个文件资产。此方法使用promise方式来异步返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1133,7 +1133,7 @@ getLastObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的最后一个文件资产。此方法使用callback回调来返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1161,7 +1161,7 @@ getLastObject(): Promise<FileAsset>; 获取文件检索结果中的最后一个文件资产。此方法使用Promise方式来返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1183,7 +1183,7 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void 获取文件检索结果中具有指定索引的文件资产。此方法使用回调来返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1212,7 +1212,7 @@ getPositionObject(index: number): Promise<FileAsset>; 获取文件检索结果中具有指定索引的文件资产。此方法使用Promise形式返回文件Asset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1246,7 +1246,7 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; 获取文件检索结果中的所有文件资产。此方法使用Callback回调来返回FileAsset结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1274,7 +1274,7 @@ getAllObject(): Promise<Array<FileAsset>>; 获取文件检索结果中的所有文件资产。此方法使用Promise来返回FileAsset结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1296,7 +1296,7 @@ commitModify(callback: AsyncCallback<void>): void; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1325,7 +1325,7 @@ commitModify(): Promise<void>; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1352,7 +1352,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 按照检索条件获取相册中的文件。此方法使用Callback回调来返回文件结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1379,7 +1379,7 @@ function getFileAssetsCallBack(err, fetchFileResult) { 按照检索条件获取相册中的文件。此方法使用异步回调来返回文件结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core -- Gitee From 69f91a397a77a248cf4e4acd4bdb869cd0529c1d Mon Sep 17 00:00:00 2001 From: sunyaozu Date: Mon, 28 Feb 2022 17:41:35 +0800 Subject: [PATCH 026/282] add syscap to i18n and intl Signed-off-by: sunyaozu --- .../reference/apis/js-apis-i18n.md | 125 ++++++++++-- .../reference/apis/js-apis-intl.md | 193 +++++++++++------- 2 files changed, 231 insertions(+), 87 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-i18n.md b/zh-cn/application-dev/reference/apis/js-apis-i18n.md index 5d636d4ef4a..5dfcf16cf0b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-i18n.md +++ b/zh-cn/application-dev/reference/apis/js-apis-i18n.md @@ -13,17 +13,14 @@ import i18n from '@ohos.i18n'; ``` -## 权限 - -无 - - ## i18n.getDisplayLanguage getDisplayLanguage(language: string, locale: string, sentenceCase?: boolean): string 获取指定语言的本地化显示文本。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -49,6 +46,8 @@ getDisplayCountry(country: string, locale: string, sentenceCase?: boolean): stri 获取指定国家的本地化显示文本。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -74,6 +73,8 @@ isRTL(locale: string): boolean 获取是否为从右至左显示语言。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 说明 | | -------- | -------- | -------- | @@ -97,6 +98,8 @@ getSystemLanguage(): string 获取系统语言。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -114,6 +117,8 @@ getSystemRegion(): string 获取系统地区。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -131,6 +136,8 @@ getSystemLocale(): string 获取系统区域。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -148,6 +155,8 @@ getCalendar(locale: string, type? : string): Calendar 获取日历对象。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -174,6 +183,8 @@ setTime(date: Date): void 设置日历对象内部的时间日期。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -193,6 +204,8 @@ setTime(time: number): void 设置日历对象内部的时间日期, time为从1970.1.1 00:00:00 GMT逝去的毫秒数。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -211,6 +224,8 @@ set(year: number, month: number, date:number, hour?: number, minute?: number, se 设置日历对象的年、月、日、时、分、秒。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -234,6 +249,8 @@ setTimeZone(timezone: string): void 设置日历对象的时区。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -252,6 +269,8 @@ getTimeZone(): string 获取日历对象的时区。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -271,6 +290,8 @@ getFirstDayOfWeek(): number 获取日历对象的一周起始日。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -289,6 +310,8 @@ setFirstDayOfWeek(value: number): void 设置每一周的起始日。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -307,6 +330,8 @@ getMinimalDaysInFirstWeek(): number 获取一年中第一周的最小天数。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -325,6 +350,8 @@ setMinimalDaysInFirstWeek(value: number): void 设置一年中第一周的最小天数。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -343,6 +370,8 @@ get(field: string): number 获取日历对象中与field相关联的值。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -367,6 +396,8 @@ getDisplayName(locale: string): string 获取日历对象在locale所指定的区域的名字。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -390,6 +421,8 @@ isWeekend(date?: Date): boolean 判断给定的日期是否在日历中是周末。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -419,6 +452,8 @@ constructor(country: string, options?: PhoneNumberFormatOptions) 创建电话号码格式化对象。 +**系统能力**:SystemCapability.Global.I18n + 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -437,6 +472,8 @@ isValidNumber(number: string): boolean 判断传入的电话号码格式是否正确。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -460,6 +497,8 @@ format(number: string): string 对电话号码进行格式化。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -484,7 +523,7 @@ format(number: string): string | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| type | string | 是 | 是 | 表示对电话号码格式化的类型,取值范围:"E164", "INTERNATIONAL", "NATIONAL", "RFC3966"。 | +| type | string | 是 | 是 | 表示对电话号码格式化的类型,取值范围:"E164", "INTERNATIONAL", "NATIONAL", "RFC3966"。
**系统能力**:SystemCapability.Global.I18n | ## UnitInfo8+ @@ -495,7 +534,7 @@ format(number: string): string | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | | unit | string | 是 | 是 | 单位的名称,如:"meter", "inch", "cup"等。 | -| measureSystem | string | 是 | 是 | 单位的度量体系,取值包括:"SI", "US", "UK"。 | +| measureSystem | string | 是 | 是 | 单位的度量体系,取值包括:"SI", "US", "UK"。
**系统能力**:SystemCapability.Global.I18n | ## Util8+ @@ -507,6 +546,8 @@ unitConvert(fromUnit: UnitInfo, toUnit: UnitInfo, value: number, locale: string, 将fromUnit的单位转换为toUnit的单位,并根据区域与风格进行格式化。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -536,6 +577,8 @@ getInstance(): IndexUtil 创建并返回IndexUtil对象。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -558,6 +601,8 @@ getIndexList(): Array<string> 获取当前locale对应的索引列表。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -576,6 +621,8 @@ addLocale(locale: string) 将新的locale对应的索引加入当前索引列表。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -594,6 +641,8 @@ getIndex(text: string): string 获取text对应的索引。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -620,6 +669,8 @@ isDigit(char: string): boolean 判断字符串char是否是数字。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -642,6 +693,8 @@ isSpaceChar(char: string): boolean 判断字符串char是否是空格符。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -664,6 +717,8 @@ isWhitespace(char: string): boolean 判断字符串char是否是空白符。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -686,6 +741,8 @@ isRTL(char: string): boolean 判断字符串char是否是从右到左语言的字符。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -708,6 +765,8 @@ isIdeograph(char: string): boolean 判断字符串char是否是表意文字。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -730,6 +789,8 @@ isLetter(char: string): boolean 判断字符串char是否是字母。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -752,6 +813,8 @@ isLowerCase(char: string): boolean 判断字符串char是否是小写字母。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -774,6 +837,8 @@ isUpperCase(char: string): boolean 判断字符串char是否是大写字母。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -796,6 +861,8 @@ getType(char: string): string 获取输入字符串的一般类别值。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -818,6 +885,8 @@ getLineInstance(locale: string): BreakIterator 获取一个用于断句的[BreakIterator](#breakiterator8)对象。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -843,6 +912,8 @@ setLineBreakText(text: string): void 设置[BreakIterator](#breakiterator8)要处理的文本。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -861,6 +932,8 @@ getLineBreakText(): string 获取[BreakIterator](#breakiterator8)当前处理的文本。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -880,6 +953,8 @@ current(): number 获取[BreakIterator](#breakiterator8)对象在当前处理的文本中的位置。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -899,6 +974,8 @@ first(): number 将[BreakIterator](#breakiterator8)对象设置到第一个可断句的分割点。第一个分割点总是被处理的文本的起始位置。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -918,6 +995,8 @@ last(): number 将[BreakIterator](#breakiterator8)对象的位置设置到最后一个可断句的分割点。最后一个分割点总是被处理文本末尾的下一个位置。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -937,6 +1016,8 @@ next(index?: number): number 如果index给出,并且index是一个正数将[BreakIterator](#breakiterator8)向后移动number个可断句的分割点,如果n是一个负数,向前移动相应个分割点。若index没有给出,则相当于index = 1。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -963,6 +1044,8 @@ previous(): number 将[BreakIterator](#breakiterator8)移动到前一个分割点处。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -984,6 +1067,8 @@ following(offset: number): number 将[BreakIterator](#breakiterator8)设置到由offset指定的位置的后面一个分割点。返回移动后[BreakIterator](#breakiterator8)的位置。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -1010,6 +1095,8 @@ isBoundary(offset: number): boolean 如果offset所指定的文本位置是一个分割点,那么返回true,否则返回false。如果返回true, 将[BreakIterator](#breakiterator8)对象设置到offset所指定的位置, 否则相当于调用[following](#following8)(offset)。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -1029,12 +1116,14 @@ isBoundary(offset: number): boolean ``` -## i18n.is24HourClock +## i18n.is24HourClock8+ is24HourClock(): boolean 判断系统时间是否为24小时制。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -1046,12 +1135,14 @@ is24HourClock(): boolean ``` -## i18n.set24HourClock +## i18n.set24HourClock8+ set24HourClock(option: boolean): boolean 修改系统时间的24小时制设置。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -1069,12 +1160,14 @@ set24HourClock(option: boolean): boolean ``` -## i18n.addPreferredLanguage +## i18n.addPreferredLanguage8+ addPreferredLanguage(language: string, index?: number): boolean 在系统偏好语言列表中的指定位置添加偏好语言。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -1095,12 +1188,14 @@ addPreferredLanguage(language: string, index?: number): boolean ``` -## i18n.removeDisplayLanguage +## i18n.removeDisplayLanguage8+ removeDisplayLanguage(index: number): boolean 删除系统偏好语言列表中指定位置的偏好语言。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -1119,12 +1214,14 @@ removeDisplayLanguage(index: number): boolean ``` -## i18n.getPreferredLanguageList +## i18n.getPreferredLanguageList8+ getPreferredLanguageList(): Array 获取系统偏好语言列表。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -1136,12 +1233,14 @@ getPreferredLanguageList(): Array ``` -## i18n.getFirstPreferredLanguage +## i18n.getFirstPreferredLanguage8+ getFirstPreferredLanguage(): string 获取与Hap资源最佳匹配的偏好语言。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | diff --git a/zh-cn/application-dev/reference/apis/js-apis-intl.md b/zh-cn/application-dev/reference/apis/js-apis-intl.md index acc6e97ba97..eb6a9804cff 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-intl.md +++ b/zh-cn/application-dev/reference/apis/js-apis-intl.md @@ -13,11 +13,6 @@ import Intl from '@ohos.intl'; ``` -## 权限列表 - -无 - - ## Locale @@ -25,16 +20,16 @@ import Intl from '@ohos.intl'; | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| language | string | 是 | 否 | 与区域设置关联的语, 如:zh。 | -| script | string | 是 | 否 | 语言的书写方式,如:Hans。 | -| region | string | 是 | 否 | 与区域设置相关的地区,如:CN。 | -| baseName | string | 是 | 否 | Locale的基本核心信息(由语言脚本与地区组成),如:zh-Hans-CN。 | -| caseFirst | string | 是 | 否 | 区域的整理规则是否考虑大小写,取值包括:"upper", "lower", "false"。 | -| calendar | string | 是 | 否 | 区域的日历信息,取值包括:"buddhist", "chinese", "coptic","dangi", "ethioaa", "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamic-umalqura", "islamic-tbla", "islamic-civil", "islamic-rgsa", "iso8601", "japanese", "persian", "roc", "islamicc"。 | -| collation | string | 是 | 否 | 区域的排序规则,取值包括:"big5han", "compat", "dict", "direct", "ducet", "eor", "gb2312", "phonebk", "phonetic", "pinyin", "reformed", "searchjl", "stroke", "trad", "unihan", "zhuyin"。 | -| hourCycle | string | 是 | 否 | 区域的时制信息,取值包括:"h12", "h23", "h11", "h24"。 | -| numberingSystem | string | 是 | 否 | 区域使用的数字系统,取值包括:"adlm", "ahom", "arab", "arabext", "bali", "beng", "bhks", "brah", "cakm", "cham", "deva", "diak", "fullwide", "gong", "gonm", "gujr", "guru", "hanidec", "hmng", "hmnp", "java", "kali", "khmr", "knda", "lana", "lanatham", "laoo", "latn", "lepc", "limb", "mathbold", "mathdbl", "mathmono", "mathsanb", "mathsans", "mlym", "modi", "mong", "mroo", "mtei", "mymr", "mymrshan", "mymrtlng", "newa", "nkoo", "olck", "orya", "osma", "rohg", "saur", "segment", "shrd", "sind", "sinh", "sora", "sund", "takr", "talu", "tamldec", "telu", "thai", "tibt", "tirh", "vaii", "wara", "wcho"。 | -| numeric | boolean | 是 | 否 | 是否对数字字符具有特殊的排序规则处理。 | +| language | string | 是 | 否 | 与区域设置关联的语, 如:zh。
**系统能力**:SystemCapability.Global.I18n | +| script | string | 是 | 否 | 语言的书写方式,如:Hans。
**系统能力**:SystemCapability.Global.I18n | +| region | string | 是 | 否 | 与区域设置相关的地区,如:CN。
**系统能力**:SystemCapability.Global.I18n | +| baseName | string | 是 | 否 | Locale的基本核心信息(由语言脚本与地区组成),如:zh-Hans-CN。
**系统能力**:SystemCapability.Global.I18n | +| caseFirst | string | 是 | 否 | 区域的整理规则是否考虑大小写,取值包括:"upper", "lower", "false"。
**系统能力**:SystemCapability.Global.I18n | +| calendar | string | 是 | 否 | 区域的日历信息,取值包括:"buddhist", "chinese", "coptic","dangi", "ethioaa", "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamic-umalqura", "islamic-tbla", "islamic-civil", "islamic-rgsa", "iso8601", "japanese", "persian", "roc", "islamicc"。
**系统能力**:SystemCapability.Global.I18n | +| collation | string | 是 | 否 | 区域的排序规则,取值包括:"big5han", "compat", "dict", "direct", "ducet", "eor", "gb2312", "phonebk", "phonetic", "pinyin", "reformed", "searchjl", "stroke", "trad", "unihan", "zhuyin"。
**系统能力**:SystemCapability.Global.I18n | +| hourCycle | string | 是 | 否 | 区域的时制信息,取值包括:"h12", "h23", "h11", "h24"。
**系统能力**:SystemCapability.Global.I18n | +| numberingSystem | string | 是 | 否 | 区域使用的数字系统,取值包括:"adlm", "ahom", "arab", "arabext", "bali", "beng", "bhks", "brah", "cakm", "cham", "deva", "diak", "fullwide", "gong", "gonm", "gujr", "guru", "hanidec", "hmng", "hmnp", "java", "kali", "khmr", "knda", "lana", "lanatham", "laoo", "latn", "lepc", "limb", "mathbold", "mathdbl", "mathmono", "mathsanb", "mathsans", "mlym", "modi", "mong", "mroo", "mtei", "mymr", "mymrshan", "mymrtlng", "newa", "nkoo", "olck", "orya", "osma", "rohg", "saur", "segment", "shrd", "sind", "sinh", "sora", "sund", "takr", "talu", "tamldec", "telu", "thai", "tibt", "tirh", "vaii", "wara", "wcho"。
**系统能力**:SystemCapability.Global.I18n | +| numeric | boolean | 是 | 否 | 是否对数字字符具有特殊的排序规则处理。
**系统能力**:SystemCapability.Global.I18n | ### constructor @@ -43,6 +38,8 @@ constructor(locale: string, options?: options) 创建区域对象 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -61,6 +58,8 @@ toString(): string 将区域信息转换为字符串 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -79,6 +78,8 @@ maximize(): Locale 最大化区域信息,若缺少脚本与地区信息,则补齐。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -97,6 +98,8 @@ minimize(): Locale 最小化区域信息,若包含脚本与地区信息,则去除。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -118,6 +121,8 @@ constructor(locale: string, options?: DateTimeOptions) 创建时间日期格式化对象。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -136,6 +141,8 @@ constructor(locales: Array<string>, options?: DateTimeOptions) 创建时间日期格式化对象。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -154,6 +161,8 @@ format(date: Date): string 格式化时间日期字符串。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -178,6 +187,8 @@ formatRange(fromDate: Date, toDate: Date): string 格式化时间日期段字符串。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -204,6 +215,8 @@ resolvedOptions(): DateTimeOptions 获取DateTimeFormat对象的格式化选项。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -222,25 +235,25 @@ resolvedOptions(): DateTimeOptions | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| locale | string | 是 | 否 | 区域参数, 如:zh-Hans-CN。 | -| dateStyle | string | 是 | 是 | 日期显示格式,取值包括:"long", "short", "medium", "full"。 | -| timeStyle | string | 是 | 是 | 时间显示格式,取值包括:"long", "short", "medium", "full"。 | -| hourCycle | string | 是 | 是 | 时制格式,取值包括:"h11", "h12", "h23", "h24"。 | -| timeZone | string | 是 | 是 | 使用的时区(合法的IANA时区ID)。 | -| numberingSystem | string | 是 | 是 | 数字系统,取值包括:"adlm", "ahom", "arab", "arabext", "bali", "beng", "bhks", "brah", "cakm", "cham", "deva", "diak", "fullwide", "gong", "gonm", "gujr", "guru", "hanidec", "hmng", "hmnp", "java", "kali", "khmr", "knda", "lana", "lanatham", "laoo", "latn", "lepc", "limb", "mathbold", "mathdbl", "mathmono", "mathsanb", "mathsans", "mlym", "modi", "mong", "mroo", "mtei", "mymr", "mymrshan", "mymrtlng", "newa", "nkoo", "olck", "orya", "osma", "rohg", "saur", "segment", "shrd", "sind", "sinh", "sora", "sund", "takr", "talu", "tamldec", "telu", "thai", "tibt", "tirh", "vaii", "wara", "wcho"。 | -| hour12 | boolean | 是 | 是 | 是否使用12小时制。 | -| weekday | string | 是 | 是 | 工作日的显示格式,取值包括:"long", "short", "narrow"。 | -| era | string | 是 | 是 | 时代的显示格式,取值包括:"long", "short", "narrow"。 | -| year | string | 是 | 是 | 年份的显示格式,取值包括:"numeric", "2-digit"。 | -| month | string | 是 | 是 | 月份的显示格式,取值包括:"numeric", "2-digit", "long", "short", "narrow"。 | -| day | string | 是 | 是 | 日期的显示格式,取值包括:"numeric", "2-digit"。 | -| hour | string | 是 | 是 | 小时的显示格式,取值包括:"numeric", "2-digit"。 | -| minute | string | 是 | 是 | 分钟的显示格式,取值包括:"numeric", "2-digit"。 | -| second | string | 是 | 是 | 秒钟的显示格式,取值包括:"numeric", "2-digit"。 | -| timeZoneName | string | 是 | 是 | 时区名称的本地化表示。 | -| dayPeriod | string | 是 | 是 | 时段的显示格式,取值包括:"long", "short", "narrow"。 | -| localeMatcher | string | 是 | 是 | 要使用的区域匹配算法,取值包括:"lookup", "best fit"。 | -| formatMatcher | string | 是 | 是 | 要使用的格式匹配算法,取值包括:"basic", "best fit"。 | +| locale | string | 是 | 否 | 区域参数, 如:zh-Hans-CN。
**系统能力**:SystemCapability.Global.I18n | +| dateStyle | string | 是 | 是 | 日期显示格式,取值包括:"long", "short", "medium", "full"。
**系统能力**:SystemCapability.Global.I18n | +| timeStyle | string | 是 | 是 | 时间显示格式,取值包括:"long", "short", "medium", "full"。
**系统能力**:SystemCapability.Global.I18n | +| hourCycle | string | 是 | 是 | 时制格式,取值包括:"h11", "h12", "h23", "h24"。
**系统能力**:SystemCapability.Global.I18n | +| timeZone | string | 是 | 是 | 使用的时区(合法的IANA时区ID)。
**系统能力**:SystemCapability.Global.I18n | +| numberingSystem | string | 是 | 是 | 数字系统,取值包括:"adlm", "ahom", "arab", "arabext", "bali", "beng", "bhks", "brah", "cakm", "cham", "deva", "diak", "fullwide", "gong", "gonm", "gujr", "guru", "hanidec", "hmng", "hmnp", "java", "kali", "khmr", "knda", "lana", "lanatham", "laoo", "latn", "lepc", "limb", "mathbold", "mathdbl", "mathmono", "mathsanb", "mathsans", "mlym", "modi", "mong", "mroo", "mtei", "mymr", "mymrshan", "mymrtlng", "newa", "nkoo", "olck", "orya", "osma", "rohg", "saur", "segment", "shrd", "sind", "sinh", "sora", "sund", "takr", "talu", "tamldec", "telu", "thai", "tibt", "tirh", "vaii", "wara", "wcho"。
**系统能力**:SystemCapability.Global.I18n | +| hour12 | boolean | 是 | 是 | 是否使用12小时制。
**系统能力**:SystemCapability.Global.I18n | +| weekday | string | 是 | 是 | 工作日的显示格式,取值包括:"long", "short", "narrow"。
**系统能力**:SystemCapability.Global.I18n | +| era | string | 是 | 是 | 时代的显示格式,取值包括:"long", "short", "narrow"。
**系统能力**:SystemCapability.Global.I18n | +| year | string | 是 | 是 | 年份的显示格式,取值包括:"numeric", "2-digit"。
**系统能力**:SystemCapability.Global.I18n | +| month | string | 是 | 是 | 月份的显示格式,取值包括:"numeric", "2-digit", "long", "short", "narrow"。
**系统能力**:SystemCapability.Global.I18n | +| day | string | 是 | 是 | 日期的显示格式,取值包括:"numeric", "2-digit"。
**系统能力**:SystemCapability.Global.I18n | +| hour | string | 是 | 是 | 小时的显示格式,取值包括:"numeric", "2-digit"。
**系统能力**:SystemCapability.Global.I18n | +| minute | string | 是 | 是 | 分钟的显示格式,取值包括:"numeric", "2-digit"。
**系统能力**:SystemCapability.Global.I18n | +| second | string | 是 | 是 | 秒钟的显示格式,取值包括:"numeric", "2-digit"。
**系统能力**:SystemCapability.Global.I18n | +| timeZoneName | string | 是 | 是 | 时区名称的本地化表示。
**系统能力**:SystemCapability.Global.I18n | +| dayPeriod | string | 是 | 是 | 时段的显示格式,取值包括:"long", "short", "narrow"。
**系统能力**:SystemCapability.Global.I18n | +| localeMatcher | string | 是 | 是 | 要使用的区域匹配算法,取值包括:"lookup", "best fit"。
**系统能力**:SystemCapability.Global.I18n | +| formatMatcher | string | 是 | 是 | 要使用的格式匹配算法,取值包括:"basic", "best fit"。
**系统能力**:SystemCapability.Global.I18n | ## NumberFormat @@ -252,6 +265,8 @@ constructor(locale: string, options?: NumberOptions) 创建数字格式化对象。 +**系统能力**:SystemCapability.Global.I18n + 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -270,6 +285,8 @@ constructor(locales: Array<string>, options?: NumberOptions) 创建数字格式化对象。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -288,6 +305,8 @@ format(number: number): string; 格式化数字字符串。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -312,6 +331,8 @@ resolvedOptions(): NumberOptions 获取NumberFormat 对象的格式化选项。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -331,25 +352,25 @@ resolvedOptions(): NumberOptions | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| locale | string | 是 | 否 | 区域参数, 如:"zh-Hans-CN"。 | -| currency | string | 是 | 是 | 货币单位, 如:"EUR","CNY","USD"等。 | -| currencySign | string | 是 | 是 | 货币单位的符号显示,取值包括: "symbol","narrowSymbol","code","name" 。 | -| currencyDisplay | string | 是 | 是 | 货币的显示方式,取值包括:"symbol", "narrowSymbol", "code", "name"。 | -| unit | string | 是 | 是 | 单位名称,如:"meter","inch",“hectare”等。 | -| unitDisplay | string | 是 | 是 | 单位的显示格式,取值包括:"long", "short", "medium"。 | -| unitUsage | string | 是 | 是 | 单位的使用场景,取值包括:"default", "area-land-agricult", "area-land-commercl", "area-land-residntl", "length-person", "length-person-small", "length-rainfall", "length-road", "length-road-small", "length-snowfall", "length-vehicle", "length-visiblty", "length-visiblty-small", "length-person-informal", "length-person-small-informal", "length-road-informal", "speed-road-travel", "speed-wind", "temperature-person", "temperature-weather", "volume-vehicle-fuel"。 | -| signDisplay | string | 是 | 是 | 数字符号的显示格式,取值包括:"auto", "never", "always", "expectZero"。 | -| compactDisplay | string | 是 | 是 | 紧凑型的显示格式,取值包括:"long", "short"。 | -| notation | string | 是 | 是 | 数字的格式化规格,取值包括:"standard", "scientific", "engineering", "compact"。 | -| localeMatcher | string | 是 | 是 | 要使用的区域匹配算法,取值包括:"lookup", "best fit"。 | -| style | string | 是 | 是 | 数字的显示格式,取值包括:"decimal", "currency", "percent", "unit"。 | -| numberingSystem | string | 是 | 是 | 数字系统,取值包括:"adlm", "ahom", "arab", "arabext", "bali", "beng", "bhks", "brah", "cakm", "cham", "deva", "diak", "fullwide", "gong", "gonm", "gujr", "guru", "hanidec", "hmng", "hmnp", "java", "kali", "khmr", "knda", "lana", "lanatham", "laoo", "latn", "lepc", "limb", "mathbold", "mathdbl", "mathmono", "mathsanb", "mathsans", "mlym", "modi", "mong", "mroo", "mtei", "mymr", "mymrshan", "mymrtlng", "newa", "nkoo", "olck", "orya", "osma", "rohg", "saur", "segment", "shrd", "sind", "sinh", "sora", "sund", "takr", "talu", "tamldec", "telu", "thai", "tibt", "tirh", "vaii", "wara", "wcho"。 | -| useGrouping | boolean | 是 | 是 | 是否分组显示。 | -| miniumumIntegerDigits | number | 是 | 是 | 表示要使用的最小整数位数,取值范围:1~21。 | -| miniumumFractionDigits | number | 是 | 是 | 表示要使用的最小分数位数,取值范围:0~20。 | -| maxiumumFractionDigits | number | 是 | 是 | 表示要使用的最大分数位数,取值范围:1~21。 | -| miniumumSignificantDigits | number | 是 | 是 | 表示要使用的最低有效位数,取值范围:1~21。 | -| maxiumumSignificantDigits | number | 是 | 是 | 表示要使用的最大有效位数,取值范围:1~21。 | +| locale | string | 是 | 否 | 区域参数, 如:"zh-Hans-CN"。
**系统能力**:SystemCapability.Global.I18n | +| currency | string | 是 | 是 | 货币单位, 如:"EUR","CNY","USD"等。
**系统能力**:SystemCapability.Global.I18n | +| currencySign | string | 是 | 是 | 货币单位的符号显示,取值包括: "symbol","narrowSymbol","code","name" 。
**系统能力**:SystemCapability.Global.I18n | +| currencyDisplay | string | 是 | 是 | 货币的显示方式,取值包括:"symbol", "narrowSymbol", "code", "name"。
**系统能力**:SystemCapability.Global.I18n | +| unit | string | 是 | 是 | 单位名称,如:"meter","inch",“hectare”等。
**系统能力**:SystemCapability.Global.I18n | +| unitDisplay | string | 是 | 是 | 单位的显示格式,取值包括:"long", "short", "medium"。
**系统能力**:SystemCapability.Global.I18n | +| unitUsage | string | 是 | 是 | 单位的使用场景,取值包括:"default", "area-land-agricult", "area-land-commercl", "area-land-residntl", "length-person", "length-person-small", "length-rainfall", "length-road", "length-road-small", "length-snowfall", "length-vehicle", "length-visiblty", "length-visiblty-small", "length-person-informal", "length-person-small-informal", "length-road-informal", "speed-road-travel", "speed-wind", "temperature-person", "temperature-weather", "volume-vehicle-fuel"。
**系统能力**:SystemCapability.Global.I18n | +| signDisplay | string | 是 | 是 | 数字符号的显示格式,取值包括:"auto", "never", "always", "expectZero"。
**系统能力**:SystemCapability.Global.I18n | +| compactDisplay | string | 是 | 是 | 紧凑型的显示格式,取值包括:"long", "short"。
**系统能力**:SystemCapability.Global.I18n | +| notation | string | 是 | 是 | 数字的格式化规格,取值包括:"standard", "scientific", "engineering", "compact"。
**系统能力**:SystemCapability.Global.I18n | +| localeMatcher | string | 是 | 是 | 要使用的区域匹配算法,取值包括:"lookup", "best fit"。
**系统能力**:SystemCapability.Global.I18n | +| style | string | 是 | 是 | 数字的显示格式,取值包括:"decimal", "currency", "percent", "unit"。
**系统能力**:SystemCapability.Global.I18n | +| numberingSystem | string | 是 | 是 | 数字系统,取值包括:"adlm", "ahom", "arab", "arabext", "bali", "beng", "bhks", "brah", "cakm", "cham", "deva", "diak", "fullwide", "gong", "gonm", "gujr", "guru", "hanidec", "hmng", "hmnp", "java", "kali", "khmr", "knda", "lana", "lanatham", "laoo", "latn", "lepc", "limb", "mathbold", "mathdbl", "mathmono", "mathsanb", "mathsans", "mlym", "modi", "mong", "mroo", "mtei", "mymr", "mymrshan", "mymrtlng", "newa", "nkoo", "olck", "orya", "osma", "rohg", "saur", "segment", "shrd", "sind", "sinh", "sora", "sund", "takr", "talu", "tamldec", "telu", "thai", "tibt", "tirh", "vaii", "wara", "wcho"。
**系统能力**:SystemCapability.Global.I18n | +| useGrouping | boolean | 是 | 是 | 是否分组显示。
**系统能力**:SystemCapability.Global.I18n | +| miniumumIntegerDigits | number | 是 | 是 | 表示要使用的最小整数位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | +| miniumumFractionDigits | number | 是 | 是 | 表示要使用的最小分数位数,取值范围:0~20。
**系统能力**:SystemCapability.Global.I18n | +| maxiumumFractionDigits | number | 是 | 是 | 表示要使用的最大分数位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | +| miniumumSignificantDigits | number | 是 | 是 | 表示要使用的最低有效位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | +| maxiumumSignificantDigits | number | 是 | 是 | 表示要使用的最大有效位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | ## Collator8+ @@ -361,6 +382,8 @@ constructor() 创建排序对象。 +**系统能力**:SystemCapability.Global.I18n + - 示例: ``` var collator = new Intl.Collator(); @@ -373,6 +396,8 @@ constructor(locale: string | Array<string>, options?: CollatorOptions) 创建排序对象。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -392,6 +417,8 @@ compare(first: string, second: string): number 依据Collator的排序策略对两个字符串进行比较。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -416,6 +443,8 @@ resolvedOptions(): CollatorOptions 返回Collator对象的属性。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -434,13 +463,13 @@ resolvedOptions(): CollatorOptions | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| localeMatcher | string | 是 | 是 | locale匹配算法,取值范围:"best fit", "lookup"。 | -| usage | string | 是 | 是 | 比较的用途,取值范围:"sort", "search"。 | -| sensitivity | string | 是 | 是 | 表示字符串中的哪些差异会导致非零结果值,取值范围:"base", "accent", "case", "variant"。 | -| ignorePunctuation | boolean | 是 | 是 | 表示是否忽略标点符号,取值范围:true, false。 | -| collation | string | 是 | 是 | 排序规则,取值范围:"big5han", "compat", "dict", "direct", "ducet", "eor", "gb2312", "phonebk", "phonetic", "pinyin", "reformed", "searchjl", "stroke", "trad", "unihan", "zhuyin"。 | -| numeric | boolean | 是 | 是 | 是否使用数字排序,取值范围:true, false。 | -| caseFirst | string | 是 | 是 | 表示大写、小写的排序顺序,取值范围:"upper", "lower", "false"。 | +| localeMatcher | string | 是 | 是 | locale匹配算法,取值范围:"best fit", "lookup"。
**系统能力**:SystemCapability.Global.I18n | +| usage | string | 是 | 是 | 比较的用途,取值范围:"sort", "search"。
**系统能力**:SystemCapability.Global.I18n | +| sensitivity | string | 是 | 是 | 表示字符串中的哪些差异会导致非零结果值,取值范围:"base", "accent", "case", "variant"。
**系统能力**:SystemCapability.Global.I18n | +| ignorePunctuation | boolean | 是 | 是 | 表示是否忽略标点符号,取值范围:true, false。
**系统能力**:SystemCapability.Global.I18n | +| collation | string | 是 | 是 | 排序规则,取值范围:"big5han", "compat", "dict", "direct", "ducet", "eor", "gb2312", "phonebk", "phonetic", "pinyin", "reformed", "searchjl", "stroke", "trad", "unihan", "zhuyin"。
**系统能力**:SystemCapability.Global.I18n | +| numeric | boolean | 是 | 是 | 是否使用数字排序,取值范围:true, false。
**系统能力**:SystemCapability.Global.I18n | +| caseFirst | string | 是 | 是 | 表示大写、小写的排序顺序,取值范围:"upper", "lower", "false"。
**系统能力**:SystemCapability.Global.I18n | ## PluralRules8+ @@ -452,6 +481,8 @@ constructor() 创建PluralRules对象。 +**系统能力**:SystemCapability.Global.I18n + - 示例: ``` var pluralRules = new Intl.PluralRules(); @@ -464,6 +495,8 @@ constructor(locale: string | Array<string>, options?: PluralRulesOptions) 创建PluralRules对象。 +**系统能力**:SystemCapability.Global.I18n + 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -482,6 +515,8 @@ select(n: number): string 返回一个字符串表示该数字的单复数类别。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -505,13 +540,13 @@ select(n: number): string | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| localeMatcher | string | 是 | 是 | locale匹配算法,取值包括:"best fit", "lookup"。 | -| type | string | 是 | 是 | 排序的类型,取值包括:"cardinal", "ordinal"。 | -| minimumIntegerDigits | number | 是 | 是 | 表示要使用的最小整数位数,取值范围:1~21。 | -| minimumFractionDigits | number | 是 | 是 | 表示要使用的最小分数位数,取值范围:0~20。 | -| maximumFractionDigits | number | 是 | 是 | 表示要使用的最大分数位数,取值范围:1~21。 | -| minimumSignificantDigits | number | 是 | 是 | 表示要使用的最低有效位数,取值范围:1~21。 | -| maximumSignificantDigits | number | 是 | 是 | 表示要使用的最大有效位数,取值范围:1~21。 | +| localeMatcher | string | 是 | 是 | locale匹配算法,取值包括:"best fit", "lookup"。
**系统能力**:SystemCapability.Global.I18n | +| type | string | 是 | 是 | 排序的类型,取值包括:"cardinal", "ordinal"。
**系统能力**:SystemCapability.Global.I18n | +| minimumIntegerDigits | number | 是 | 是 | 表示要使用的最小整数位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | +| minimumFractionDigits | number | 是 | 是 | 表示要使用的最小分数位数,取值范围:0~20。
**系统能力**:SystemCapability.Global.I18n | +| maximumFractionDigits | number | 是 | 是 | 表示要使用的最大分数位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | +| minimumSignificantDigits | number | 是 | 是 | 表示要使用的最低有效位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | +| maximumSignificantDigits | number | 是 | 是 | 表示要使用的最大有效位数,取值范围:1~21。
**系统能力**:SystemCapability.Global.I18n | ## RelativeTimeFormat8+ @@ -523,6 +558,8 @@ constructor() 创建相对时间格式化对象。 +**系统能力**:SystemCapability.Global.I18n + - 示例: ``` var relativetimefmt = new Intl.RelativeTimeFormat(); @@ -535,6 +572,8 @@ constructor(locale: string | Array<string>, options?: RelativeTimeFormatIn 创建相对时间格式化对象。 +**系统能力**:SystemCapability.Global.I18n + 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -553,6 +592,8 @@ format(value: numeric, unit: string): string 依据locale和格式化选项,对value和unit进行格式化。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -577,6 +618,8 @@ formatToParts(value: numeric, unit: string): Array<Object> 返回一个对象数组,表示可用于自定义区域设置格式的相对时间格式。 +**系统能力**:SystemCapability.Global.I18n + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -601,6 +644,8 @@ resolvedOptions(): RelativeTimeFormatResolvedOptions 获取RelativeTimeFormat对象的格式化选项。 +**系统能力**:SystemCapability.Global.I18n + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -619,9 +664,9 @@ resolvedOptions(): RelativeTimeFormatResolvedOptions | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| localeMatcher | string | 是 | 是 | locale匹配算法,取值包括:"best fit", "lookup"。 | -| numeric | string | 是 | 是 | 输出消息的格式,取值包括:"always", "auto"。 | -| style | string | 是 | 是 | 国际化消息的长度,取值包括:"long", "short", "narrow"。 | +| localeMatcher | string | 是 | 是 | locale匹配算法,取值包括:"best fit", "lookup"。
**系统能力**:SystemCapability.Global.I18n | +| numeric | string | 是 | 是 | 输出消息的格式,取值包括:"always", "auto"。
**系统能力**:SystemCapability.Global.I18n | +| style | string | 是 | 是 | 国际化消息的长度,取值包括:"long", "short", "narrow"。
**系统能力**:SystemCapability.Global.I18n | ## RelativeTimeFormatResolvedOptions8+ @@ -630,7 +675,7 @@ resolvedOptions(): RelativeTimeFormatResolvedOptions | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| locale | string | 是 | 是 | 包含区域设置信息的字符串,包括语言以及可选的脚本和区域。 | -| numeric | string | 是 | 是 | 输出消息的格式,取值包括:"always", "auto"。 | -| style | string | 是 | 是 | 国际化消息的长度,取值包括:"long", "short", "narrow"。 | -| numberingSystem | string | 是 | 是 | 使用的数字系统。 | +| locale | string | 是 | 是 | 包含区域设置信息的字符串,包括语言以及可选的脚本和区域。
**系统能力**:SystemCapability.Global.I18n | +| numeric | string | 是 | 是 | 输出消息的格式,取值包括:"always", "auto"。
**系统能力**:SystemCapability.Global.I18n | +| style | string | 是 | 是 | 国际化消息的长度,取值包括:"long", "short", "narrow"。
**系统能力**:SystemCapability.Global.I18n | +| numberingSystem | string | 是 | 是 | 使用的数字系统。
**系统能力**:SystemCapability.Global.I18n | -- Gitee From 5cc14128fdc4a47f2d04b167377eac05b0b70a89 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 1 Mar 2022 15:56:31 +0800 Subject: [PATCH 027/282] test Signed-off-by: YOUR_NAME --- .../reference/apis/js-apis-webgl.md | 1282 ++++++++--------- .../reference/apis/js-apis-webgl2.md | 982 +++++++------ 2 files changed, 1067 insertions(+), 1197 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-webgl.md b/zh-cn/application-dev/reference/apis/js-apis-webgl.md index b199eb4b732..e247718d3eb 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-webgl.md +++ b/zh-cn/application-dev/reference/apis/js-apis-webgl.md @@ -1,696 +1,586 @@ -# WebGL - -> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 - - -WebGL标准图形API,对应OpenGL ES 2.0特性集。更多信息请参考[WebgGL™标准](https://www.khronos.org/registry/webgl/specs/latest/1.0/)。 - - - - -## 导入模块 - -``` -import webgl from 'ohos.webglnapi' -``` - - -## 系统能力 - -SystemCapability.Graphic.Graphic2D.WebGL - - -## 调用方式 - -``` -// 获取canvas组件实例 -const el = this.$refs.canvas -// 从canvas组件实例获取WebGL上下文 -const gl = el.getContext('webgl'); -// 调用WebGL API -gl.clearColor(0.0, 0.0, 0.0, 1.0); -gl.flush(); -``` - - -## GLenum - -| 名称 | 类型 | -| -------- | -------- | -| GLenum | number | - - -## GLboolean - -| 名称 | 类型 | -| -------- | -------- | -| GLboolean | boolean | - - -## GLbitfield - -| 名称 | 类型 | -| -------- | -------- | -| GLbitfield | number | - - -## GLbyte - -| 名称 | 类型 | -| -------- | -------- | -| GLbyte | number | - - -## GLshort - -| 名称 | 类型 | -| -------- | -------- | -| GLshort | number | - - -## GLint - -| 名称 | 类型 | -| -------- | -------- | -| GLint | number | - - -## GLsizei - -| 名称 | 类型 | -| -------- | -------- | -| GLsizei | number | - - -## GLintptr - -| 名称 | 类型 | -| -------- | -------- | -| GLintptr | number | - - -## GLsizeiptr - -| 名称 | 类型 | -| -------- | -------- | -| GLsizeiptr | number | - - -## GLubyte - -| 名称 | 类型 | -| -------- | -------- | -| GLubyte | number | - - -## GLushort - -| 名称 | 类型 | -| -------- | -------- | -| GLushort | number | - - -## GLuint - -| 名称 | 类型 | -| -------- | -------- | -| GLuint | number | - - -## GLfloat - -| 名称 | 类型 | -| -------- | -------- | -| GLfloat | number | - - -## GLclampf - -| 名称 | 类型 | -| -------- | -------- | -| GLclampf | number | - - -## TexImageSource - -| 名称 | 类型 | -| -------- | -------- | -| TexImageSource | ImageData | - - -## Float32List - -| 名称 | 类型 | -| -------- | -------- | -| Float32List | array | - - -## Int32List - -| 名称 | 类型 | -| -------- | -------- | -| Int32List | array | - - -## WebGLPowerPreference - -| 名称 | 类型 | -| -------- | -------- | -| WebGLPowerPreference | string | - - -## webgl.WebGLContextAttributes - -WebGLContextAttributes - - -| 名称 | 参数类型 | 必填 | -| -------- | -------- | -------- | -| alpha | boolean | 否 | -| depth | boolean | 否 | -| stencil | boolean | 否 | -| antialias | boolean | 否 | -| premultipliedAlpha | boolean | 否 | -| preserveDrawingBuffer | boolean | 否 | -| powerPreference | WebGLPowerPreference | 否 | -| failIfMajorPerformanceCaveat | boolean | 否 | -| desynchronized | boolean | 否 | - - -## webgl.WebGLBuffer - -WebGLBuffer - - -## webgl.WebGLFrameBuffer - -WebGLFrameBuffer - - -## webgl.WebGLProgram - -WebGLProgram - - -## webgl.WebGLRenderbuffer - -WebGLRenderbuffer - - -## webgl.WebGLShader - -WebGLShader - - -## webgl.WebGLTexture - -WebGLTexture - - -## webgl.WebGLUniformLocation - -WebGLUniformLocation - - -## webgl.WebGLActiveInfo - -WebGLActiveInfo - -| 名称 | 参数类型 | 必填 | -| -------- | -------- | -------- | -| size | [GLint](#glint) | 是 | -| type | [GLenum](#glenum) | 是 | -| name | string | 是 | - - -## webgl.WebGLShaderPrecisionFormat - -WebGLShaderPrecisionFormat - -| 名称 | 参数类型 | 必填 | -| -------- | -------- | -------- | -| rangeMin | [GLint](#glint) | 是 | -| rangeMax | [GLint](#glint) | 是 | -| precision | [GLint](#glint) | 是 | - - -## webgl.WebGLRenderingContextBase - -WebGLRenderingContextBase - - -### 属性 - -| 名称 | 参数类型 | 必填 | -| -------- | -------- | -------- | -| DEPTH_BUFFER_BIT | [GLenum](#glenum) | 是 | -| STENCIL_BUFFER_BIT | [GLenum](#glenum) | 是 | -| COLOR_BUFFER_BIT | [GLenum](#glenum) | 是 | -| POINTS | [GLenum](#glenum) | 是 | -| LINES | [GLenum](#glenum) | 是 | -| LINE_LOOP | [GLenum](#glenum) | 是 | -| LINE_STRIP | [GLenum](#glenum) | 是 | -| TRIANGLES | [GLenum](#glenum) | 是 | -| TRIANGLE_STRIP | [GLenum](#glenum) | 是 | -| TRIANGLE_FAN | [GLenum](#glenum) | 是 | -| ZERO | [GLenum](#glenum) | 是 | -| ONE | [GLenum](#glenum) | 是 | -| SRC_COLOR | [GLenum](#glenum) | 是 | -| ONE_MINUS_SRC_COLOR | [GLenum](#glenum) | 是 | -| SRC_ALPHA | [GLenum](#glenum) | 是 | -| ONE_MINUS_SRC_ALPHA | [GLenum](#glenum) | 是 | -| DST_ALPHA | [GLenum](#glenum) | 是 | -| ONE_MINUS_DST_ALPHA | [GLenum](#glenum) | 是 | -| DST_COLOR | [GLenum](#glenum) | 是 | -| ONE_MINUS_DST_COLOR | [GLenum](#glenum) | 是 | -| SRC_ALPHA_SATURATE | [GLenum](#glenum) | 是 | -| FUNC_ADD | [GLenum](#glenum) | 是 | -| BLEND_EQUATION | [GLenum](#glenum) | 是 | -| BLEND_EQUATION_RGB | [GLenum](#glenum) | 是 | -| BLEND_EQUATION_ALPHA | [GLenum](#glenum) | 是 | -| FUNC_SUBTRACT | [GLenum](#glenum) | 是 | -| FUNC_REVERSE_SUBTRACT | [GLenum](#glenum) | 是 | -| BLEND_DST_RGB | [GLenum](#glenum) | 是 | -| BLEND_SRC_RGB | [GLenum](#glenum) | 是 | -| BLEND_DST_ALPHA | [GLenum](#glenum) | 是 | -| BLEND_SRC_ALPHA | [GLenum](#glenum) | 是 | -| CONSTANT_COLOR | [GLenum](#glenum) | 是 | -| ONE_MINUS_CONSTANT_COLOR | [GLenum](#glenum) | 是 | -| CONSTANT_ALPHA | [GLenum](#glenum) | 是 | -| ONE_MINUS_CONSTANT_ALPHA | [GLenum](#glenum) | 是 | -| BLEND_COLOR | [GLenum](#glenum) | 是 | -| ARRAY_BUFFER | [GLenum](#glenum) | 是 | -| ELEMENT_ARRAY_BUFFER | [GLenum](#glenum) | 是 | -| ARRAY_BUFFER_BINDING | [GLenum](#glenum) | 是 | -| ELEMENT_ARRAY_BUFFER_BINDING | [GLenum](#glenum) | 是 | -| STREAM_DRAW | [GLenum](#glenum) | 是 | -| STATIC_DRAW | [GLenum](#glenum) | 是 | -| DYNAMIC_DRAW | [GLenum](#glenum) | 是 | -| BUFFER_SIZE | [GLenum](#glenum) | 是 | -| BUFFER_USAGE | [GLenum](#glenum) | 是 | -| CURRENT_VERTEX_ATTRIB | [GLenum](#glenum) | 是 | -| FRONT | [GLenum](#glenum) | 是 | -| BACK | [GLenum](#glenum) | 是 | -| FRONT_AND_BACK | [GLenum](#glenum) | 是 | -| CULL_FACE | [GLenum](#glenum) | 是 | -| BLEND | [GLenum](#glenum) | 是 | -| DITHER | [GLenum](#glenum) | 是 | -| STENCIL_TEST | [GLenum](#glenum) | 是 | -| DEPTH_TEST | [GLenum](#glenum) | 是 | -| SCISSOR_TEST | [GLenum](#glenum) | 是 | -| POLYGON_OFFSET_FILL | [GLenum](#glenum) | 是 | -| SAMPLE_ALPHA_TO_COVERAGE | [GLenum](#glenum) | 是 | -| SAMPLE_COVERAGE | [GLenum](#glenum) | 是 | -| NO_ERROR | [GLenum](#glenum) | 是 | -| INVALID_ENUM | [GLenum](#glenum) | 是 | -| INVALID_VALUE | [GLenum](#glenum) | 是 | -| INVALID_OPERATION | [GLenum](#glenum) | 是 | -| OUT_OF_MEMORY | [GLenum](#glenum) | 是 | -| CW | [GLenum](#glenum) | 是 | -| CCW | [GLenum](#glenum) | 是 | -| ALIASED_POINT_SIZE_RANGE | [GLenum](#glenum) | 是 | -| ALIASED_LINE_WIDTH_RANGE | [GLenum](#glenum) | 是 | -| CULL_FACE_MODE | [GLenum](#glenum) | 是 | -| FRONT_FACE | [GLenum](#glenum) | 是 | -| DEPTH_RANGE | [GLenum](#glenum) | 是 | -| DEPTH_WRITEMASK | [GLenum](#glenum) | 是 | -| DEPTH_CLEAR_VALUE | [GLenum](#glenum) | 是 | -| DEPTH_FUNC | [GLenum](#glenum) | 是 | -| STENCIL_CLEAR_VALUE | [GLenum](#glenum) | 是 | -| STENCIL_FUNC | [GLenum](#glenum) | 是 | -| STENCIL_FAIL | [GLenum](#glenum) | 是 | -| STENCIL_PASS_DEPTH_FAIL | [GLenum](#glenum) | 是 | -| STENCIL_PASS_DEPTH_PASS | [GLenum](#glenum) | 是 | -| STENCIL_REF | [GLenum](#glenum) | 是 | -| STENCIL_VALUE_MASK | [GLenum](#glenum) | 是 | -| STENCIL_WRITEMASK | [GLenum](#glenum) | 是 | -| STENCIL_BACK_FUNC | [GLenum](#glenum) | 是 | -| STENCIL_BACK_FAIL | [GLenum](#glenum) | 是 | -| STENCIL_BACK_PASS_DEPTH_FAIL | [GLenum](#glenum) | 是 | -| STENCIL_BACK_PASS_DEPTH_PASS | [GLenum](#glenum) | 是 | -| STENCIL_BACK_REF | [GLenum](#glenum) | 是 | -| STENCIL_BACK_VALUE_MASK | [GLenum](#glenum) | 是 | -| STENCIL_BACK_WRITEMASK | [GLenum](#glenum) | 是 | -| VIEWPORT | [GLenum](#glenum) | 是 | -| SCISSOR_BOX | [GLenum](#glenum) | 是 | -| COLOR_CLEAR_VALUE | [GLenum](#glenum) | 是 | -| COLOR_WRITEMASK | [GLenum](#glenum) | 是 | -| UNPACK_ALIGNMENT | [GLenum](#glenum) | 是 | -| PACK_ALIGNMENT | [GLenum](#glenum) | 是 | -| MAX_TEXTURE_SIZE | [GLenum](#glenum) | 是 | -| MAX_VIEWPORT_DIMS | [GLenum](#glenum) | 是 | -| SUBPIXEL_BITS | [GLenum](#glenum) | 是 | -| RED_BITS | [GLenum](#glenum) | 是 | -| GREEN_BITS | [GLenum](#glenum) | 是 | -| BLUE_BITS | [GLenum](#glenum) | 是 | -| ALPHA_BITS | [GLenum](#glenum) | 是 | -| DEPTH_BITS | [GLenum](#glenum) | 是 | -| STENCIL_BITS | [GLenum](#glenum) | 是 | -| POLYGON_OFFSET_UNITS | [GLenum](#glenum) | 是 | -| POLYGON_OFFSET_FACTOR | [GLenum](#glenum) | 是 | -| TEXTURE_BINDING_2D | [GLenum](#glenum) | 是 | -| SAMPLE_BUFFERS | [GLenum](#glenum) | 是 | -| SAMPLES | [GLenum](#glenum) | 是 | -| SAMPLE_COVERAGE_VALUE | [GLenum](#glenum) | 是 | -| SAMPLE_COVERAGE_INVERT | [GLenum](#glenum) | 是 | -| COMPRESSED_TEXTURE_FORMATS | [GLenum](#glenum) | 是 | -| DONT_CARE | [GLenum](#glenum) | 是 | -| FASTEST | [GLenum](#glenum) | 是 | -| NICEST | [GLenum](#glenum) | 是 | -| GENERATE_MIPMAP_HINT | [GLenum](#glenum) | 是 | -| BYTE | [GLenum](#glenum) | 是 | -| UNSIGNED_BYTE | [GLenum](#glenum) | 是 | -| SHORT | [GLenum](#glenum) | 是 | -| UNSIGNED_SHORT | [GLenum](#glenum) | 是 | -| INT | [GLenum](#glenum) | 是 | -| UNSIGNED_INT | [GLenum](#glenum) | 是 | -| FLOAT | [GLenum](#glenum) | 是 | -| DEPTH_COMPONENT | [GLenum](#glenum) | 是 | -| ALPHA | [GLenum](#glenum) | 是 | -| RGB | [GLenum](#glenum) | 是 | -| RGBA | [GLenum](#glenum) | 是 | -| LUMINANCE | [GLenum](#glenum) | 是 | -| LUMINANCE_ALPHA | [GLenum](#glenum) | 是 | -| UNSIGNED_SHORT_4_4_4_4 | [GLenum](#glenum) | 是 | -| UNSIGNED_SHORT_5_5_5_1 | [GLenum](#glenum) | 是 | -| UNSIGNED_SHORT_5_6_5 | [GLenum](#glenum) | 是 | -| FRAGMENT_SHADER | [GLenum](#glenum) | 是 | -| VERTEX_SHADER | [GLenum](#glenum) | 是 | -| MAX_VERTEX_ATTRIBS | [GLenum](#glenum) | 是 | -| MAX_VERTEX_UNIFORM_VECTORS | [GLenum](#glenum) | 是 | -| MAX_VARYING_VECTORS | [GLenum](#glenum) | 是 | -| MAX_COMBINED_TEXTURE_IMAGE_UNITS | [GLenum](#glenum) | 是 | -| MAX_VERTEX_TEXTURE_IMAGE_UNITS | [GLenum](#glenum) | 是 | -| MAX_TEXTURE_IMAGE_UNITS | [GLenum](#glenum) | 是 | -| MAX_FRAGMENT_UNIFORM_VECTORS | [GLenum](#glenum) | 是 | -| SHADER_TYPE | [GLenum](#glenum) | 是 | -| DELETE_STATUS | [GLenum](#glenum) | 是 | -| LINK_STATUS | [GLenum](#glenum) | 是 | -| VALIDATE_STATUS | [GLenum](#glenum) | 是 | -| ATTACHED_SHADERS | [GLenum](#glenum) | 是 | -| ACTIVE_UNIFORMS | [GLenum](#glenum) | 是 | -| ACTIVE_ATTRIBUTES | [GLenum](#glenum) | 是 | -| SHADING_LANGUAGE_VERSION | [GLenum](#glenum) | 是 | -| CURRENT_PROGRAM | [GLenum](#glenum) | 是 | -| NEVER | [GLenum](#glenum) | 是 | -| LESS | [GLenum](#glenum) | 是 | -| EQUAL | [GLenum](#glenum) | 是 | -| LEQUAL | [GLenum](#glenum) | 是 | -| GREATER | [GLenum](#glenum) | 是 | -| NOTEQUAL | [GLenum](#glenum) | 是 | -| GEQUAL | [GLenum](#glenum) | 是 | -| ALWAYS | [GLenum](#glenum) | 是 | -| KEEP | [GLenum](#glenum) | 是 | -| REPLACE | [GLenum](#glenum) | 是 | -| INCR | [GLenum](#glenum) | 是 | -| DECR | [GLenum](#glenum) | 是 | -| INVERT | [GLenum](#glenum) | 是 | -| INCR_WRAP | [GLenum](#glenum) | 是 | -| DECR_WRAP | [GLenum](#glenum) | 是 | -| VENDOR | [GLenum](#glenum) | 是 | -| RENDERER | [GLenum](#glenum) | 是 | -| VERSION | [GLenum](#glenum) | 是 | -| NEAREST | [GLenum](#glenum) | 是 | -| LINEAR | [GLenum](#glenum) | 是 | -| NEAREST_MIPMAP_NEAREST | [GLenum](#glenum) | 是 | -| LINEAR_MIPMAP_NEAREST | [GLenum](#glenum) | 是 | -| NEAREST_MIPMAP_LINEAR | [GLenum](#glenum) | 是 | -| LINEAR_MIPMAP_LINEAR | [GLenum](#glenum) | 是 | -| TEXTURE_MAG_FILTER | [GLenum](#glenum) | 是 | -| TEXTURE_MIN_FILTER | [GLenum](#glenum) | 是 | -| TEXTURE_WRAP_S | [GLenum](#glenum) | 是 | -| TEXTURE_WRAP_T | [GLenum](#glenum) | 是 | -| TEXTURE_2D | [GLenum](#glenum) | 是 | -| TEXTURE | [GLenum](#glenum) | 是 | -| TEXTURE_CUBE_MAP | [GLenum](#glenum) | 是 | -| TEXTURE_BINDING_CUBE_MAP | [GLenum](#glenum) | 是 | -| TEXTURE_CUBE_MAP_POSITIVE_X | [GLenum](#glenum) | 是 | -| TEXTURE_CUBE_MAP_NEGATIVE_X | [GLenum](#glenum) | 是 | -| TEXTURE_CUBE_MAP_POSITIVE_Y | [GLenum](#glenum) | 是 | -| TEXTURE_CUBE_MAP_NEGATIVE_Y | [GLenum](#glenum) | 是 | -| TEXTURE_CUBE_MAP_POSITIVE_Z | [GLenum](#glenum) | 是 | -| TEXTURE_CUBE_MAP_NEGATIVE_Z | [GLenum](#glenum) | 是 | -| TEXTURE0 | [GLenum](#glenum) | 是 | -| TEXTURE1 | [GLenum](#glenum) | 是 | -| TEXTURE2 | [GLenum](#glenum) | 是 | -| TEXTURE3 | [GLenum](#glenum) | 是 | -| TEXTURE4 | [GLenum](#glenum) | 是 | -| TEXTURE5 | [GLenum](#glenum) | 是 | -| TEXTURE6 | [GLenum](#glenum) | 是 | -| TEXTURE7 | [GLenum](#glenum) | 是 | -| TEXTURE8 | [GLenum](#glenum) | 是 | -| TEXTURE9 | [GLenum](#glenum) | 是 | -| TEXTURE10 | [GLenum](#glenum) | 是 | -| TEXTURE11 | [GLenum](#glenum) | 是 | -| TEXTURE12 | [GLenum](#glenum) | 是 | -| TEXTURE13 | [GLenum](#glenum) | 是 | -| TEXTURE14 | [GLenum](#glenum) | 是 | -| TEXTURE15 | [GLenum](#glenum) | 是 | -| TEXTURE16 | [GLenum](#glenum) | 是 | -| TEXTURE17 | [GLenum](#glenum) | 是 | -| TEXTURE18 | [GLenum](#glenum) | 是 | -| TEXTURE19 | [GLenum](#glenum) | 是 | -| TEXTURE20 | [GLenum](#glenum) | 是 | -| TEXTURE21 | [GLenum](#glenum) | 是 | -| TEXTURE22 | [GLenum](#glenum) | 是 | -| TEXTURE23 | [GLenum](#glenum) | 是 | -| TEXTURE24 | [GLenum](#glenum) | 是 | -| TEXTURE25 | [GLenum](#glenum) | 是 | -| TEXTURE26 | [GLenum](#glenum) | 是 | -| TEXTURE27 | [GLenum](#glenum) | 是 | -| TEXTURE28 | [GLenum](#glenum) | 是 | -| TEXTURE29 | [GLenum](#glenum) | 是 | -| TEXTURE30 | [GLenum](#glenum) | 是 | -| TEXTURE31 | [GLenum](#glenum) | 是 | -| ACTIVE_TEXTURE | [GLenum](#glenum) | 是 | -| REPEAT | [GLenum](#glenum) | 是 | -| CLAMP_TO_EDGE | [GLenum](#glenum) | 是 | -| MIRRORED_REPEAT | [GLenum](#glenum) | 是 | -| FLOAT_VEC2 | [GLenum](#glenum) | 是 | -| FLOAT_VEC3 | [GLenum](#glenum) | 是 | -| FLOAT_VEC4 | [GLenum](#glenum) | 是 | -| INT_VEC2 | [GLenum](#glenum) | 是 | -| INT_VEC3 | [GLenum](#glenum) | 是 | -| INT_VEC4 | [GLenum](#glenum) | 是 | -| BOOL | [GLenum](#glenum) | 是 | -| BOOL_VEC2 | [GLenum](#glenum) | 是 | -| BOOL_VEC3 | [GLenum](#glenum) | 是 | -| BOOL_VEC4 | [GLenum](#glenum) | 是 | -| FLOAT_MAT2 | [GLenum](#glenum) | 是 | -| FLOAT_MAT3 | [GLenum](#glenum) | 是 | -| FLOAT_MAT4 | [GLenum](#glenum) | 是 | -| SAMPLER_2D | [GLenum](#glenum) | 是 | -| SAMPLER_CUBE | [GLenum](#glenum) | 是 | -| VERTEX_ATTRIB_ARRAY_ENABLED | [GLenum](#glenum) | 是 | -| VERTEX_ATTRIB_ARRAY_SIZE | [GLenum](#glenum) | 是 | -| VERTEX_ATTRIB_ARRAY_STRIDE | [GLenum](#glenum) | 是 | -| VERTEX_ATTRIB_ARRAY_TYPE | [GLenum](#glenum) | 是 | -| VERTEX_ATTRIB_ARRAY_NORMALIZED | [GLenum](#glenum) | 是 | -| VERTEX_ATTRIB_ARRAY_POINTER | [GLenum](#glenum) | 是 | -| VERTEX_ATTRIB_ARRAY_BUFFER_BINDING | [GLenum](#glenum) | 是 | -| IMPLEMENTATION_COLOR_READ_TYPE | [GLenum](#glenum) | 是 | -| IMPLEMENTATION_COLOR_READ_FORMAT | [GLenum](#glenum) | 是 | -| COMPILE_STATUS | [GLenum](#glenum) | 是 | -| LOW_FLOAT | [GLenum](#glenum) | 是 | -| MEDIUM_FLOAT | [GLenum](#glenum) | 是 | -| HIGH_FLOAT | [GLenum](#glenum) | 是 | -| LOW_INT | [GLenum](#glenum) | 是 | -| MEDIUM_INT | [GLenum](#glenum) | 是 | -| HIGH_INT | [GLenum](#glenum) | 是 | -| FRAMEBUFFER | [GLenum](#glenum) | 是 | -| RENDERBUFFER | [GLenum](#glenum) | 是 | -| RGBA4 | [GLenum](#glenum) | 是 | -| RGB5_A1 | [GLenum](#glenum) | 是 | -| RGB565 | [GLenum](#glenum) | 是 | -| DEPTH_COMPONENT16 | [GLenum](#glenum) | 是 | -| STENCIL_INDEX8 | [GLenum](#glenum) | 是 | -| DEPTH_STENCIL | [GLenum](#glenum) | 是 | -| RENDERBUFFER_WIDTH | [GLenum](#glenum) | 是 | -| RENDERBUFFER_HEIGHT | [GLenum](#glenum) | 是 | -| RENDERBUFFER_INTERNAL_FORMAT | [GLenum](#glenum) | 是 | -| RENDERBUFFER_RED_SIZE | [GLenum](#glenum) | 是 | -| RENDERBUFFER_GREEN_SIZE | [GLenum](#glenum) | 是 | -| RENDERBUFFER_BLUE_SIZE | [GLenum](#glenum) | 是 | -| RENDERBUFFER_ALPHA_SIZE | [GLenum](#glenum) | 是 | -| RENDERBUFFER_DEPTH_SIZE | [GLenum](#glenum) | 是 | -| RENDERBUFFER_STENCIL_SIZE | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_OBJECT_NAME | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE | [GLenum](#glenum) | 是 | -| COLOR_ATTACHMENT0 | [GLenum](#glenum) | 是 | -| DEPTH_ATTACHMENT | [GLenum](#glenum) | 是 | -| STENCIL_ATTACHMENT | [GLenum](#glenum) | 是 | -| DEPTH_STENCIL_ATTACHMENT | [GLenum](#glenum) | 是 | -| NONE | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_COMPLETE | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_INCOMPLETE_ATTACHMENT | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_INCOMPLETE_DIMENSIONS | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_UNSUPPORTED | [GLenum](#glenum) | 是 | -| FRAMEBUFFER_BINDING | [GLenum](#glenum) | 是 | -| RENDERBUFFER_BINDING | [GLenum](#glenum) | 是 | -| MAX_RENDERBUFFER_SIZE | [GLenum](#glenum) | 是 | -| INVALID_FRAMEBUFFER_OPERATION | [GLenum](#glenum) | 是 | -| UNPACK_FLIP_Y_WEBGL | [GLenum](#glenum) | 是 | -| UNPACK_PREMULTIPLY_ALPHA_WEBGL | [GLenum](#glenum) | 是 | -| CONTEXT_LOST_WEBGL | [GLenum](#glenum) | 是 | -| UNPACK_COLORSPACE_CONVERSION_WEBGL | [GLenum](#glenum) | 是 | -| BROWSER_DEFAULT_WEBGL | [GLenum](#glenum) | 是 | -| canvas | HTMLCanvasElement \| OffscreenCanvas | 是 | -| drawingBufferWidth | [GLsizei](#glsizei) | 是 | -| drawingBufferHeight | [GLsizei](#glsizei) | 是 | - - -### 方法 - -| 方法 | 返回值类型 | -| -------- | -------- | -| getContextAttributes() | WebGLContextAttributes \| null | -| isContextLost() | boolean | -| getSupportedExtensions() | string[] \| null | -| getExtension(name: string) | any | -| activeTexture(texture: GLenum) | void | -| attachShader(program: WebGLProgram, shader: WebGLShader) | void | -| bindAttribLocation(program: WebGLProgram, index: GLuint, name: string) | void | -| bindBuffer(target: GLenum, buffer: WebGLBuffer \| null) | void | -| bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer \| null) | void | -| bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | -| bindTexture(target: GLenum, texture: WebGLTexture \| null) | void | -| blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | -| blendEquation(mode: GLenum) | void | -| blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum) | void | -| blendFunc(sfactor: GLenum, dfactor: GLenum) | void | -| blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) | void | -| checkFramebufferStatus(target: GLenum) | GLenum | -| clear(mask: GLbitfield) | void | -| clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | -| clearDepth(depth: GLclampf) | void | -| clearStencil(s: GLint) | void | -| colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) | void | -| compileShader(shader: WebGLShader) | void | -| copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) | void | -| copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | -| createBuffer() | WebGLBuffer \| null | -| createFramebuffer() | WebGLFramebuffer \| null | -| createProgram() | WebGLProgram \| null | -| createRenderbuffer() | WebGLRenderbuffer \| null | -| createShader(type: GLenum) | WebGLShader \| null | -| createTexture() | WebGLTexture \| nullvoid | -| cullFace(mode: GLenum) | void | -| deleteBuffer(buffer: WebGLBuffer \| null) | void | -| deleteFramebuffer(framebuffer: WebGLFramebuffer \| null) | void | -| deleteProgram(program: WebGLProgram \| null) | void | -| deleteRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | void | -| deleteShader(shader: WebGLShader \| null) | void | -| deleteTexture(texture: WebGLTexture \| null) | void | -| depthFunc(func: GLenum) | void | -| depthMask(flag: GLboolean) | void | -| depthRange(zNear: GLclampf, zFar: GLclampf) | void | -| detachShader(program: WebGLProgram, shader: WebGLShader) | void | -| disable(cap: GLenum) | void | -| disableVertexAttribArray(index: GLuint) | void | -| drawArrays(mode: GLenum, first: GLint, count: GLsizei) | void | -| drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr) | void | -| enable(cap: GLenum) | void | -| enableVertexAttribArray(index: GLuint) | void | -| finish() | void | -| flush() | void | -| framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | -| framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture \| null, level: GLint) | void | -| frontFace(mode: GLenum) | void | -| generateMipmap(target: GLenum) | void | -| getActiveAttrib(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | -| getActiveUniform(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | -| getAttachedShaders(program: WebGLProgram) | WebGLShader[] \| null | -| getAttribLocation(program: WebGLProgram, name: string) | GLint | -| getBufferParameter(target: GLenum, pname: GLenum) | any | -| getParameter(pname: GLenum) | any | -| getError() | GLenum | -| getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum) | any | -| getProgramParameter(program: WebGLProgram, pname: GLenum) | any | -| getProgramInfoLog(program: WebGLProgram) | string \| null | -| getRenderbufferParameter(target: GLenum, pname: GLenum) | any | -| getShaderParameter(shader: WebGLShader, pname: GLenum) | any | -| getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum) | WebGLShaderPrecisionFormat \| null | -| getShaderInfoLog(shader: WebGLShader) | string \| null | -| getShaderSource(shader: WebGLShader) | string \| null | -| getTexParameter(target: GLenum, pname: GLenum) | any | -| getUniform(program: WebGLProgram, location: WebGLUniformLocation) | any | -| getUniformLocation(program: WebGLProgram, name: string) | WebGLUniformLocation \| null | -| getVertexAttrib(index: GLuint, pname: GLenum) | any | -| getVertexAttribOffset(index: GLuint, pname: GLenum) | GLintptr | -| hint(target: GLenum, mode: GLenum) | void | -| isBuffer(buffer: WebGLBuffer \| null) | GLboolean | -| isEnabled(cap: GLenum) | GLboolean | -| isFramebuffer(framebuffer: WebGLFramebuffer \| null) | GLboolean | -| isProgram(program: WebGLProgram \| null) | GLboolean | -| isRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | GLboolean | -| isShader(shader: WebGLShader \| null) | GLboolean | -| isTexture(texture: WebGLTexture \| null) | GLboolean | -| lineWidth(width: GLfloat) | void | -| linkProgram(program: WebGLProgram) | void | -| pixelStorei(pname: GLenum, param: GLint \| GLboolean) | void | -| polygonOffset(factor: GLfloat, units: GLfloat) | void | -| renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | -| sampleCoverage(value: GLclampf, invert: GLboolean) | void | -| scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | -| shaderSource(shader: WebGLShader, source: string) | void | -| stencilFunc(func: GLenum, ref: GLint, mask: GLuint) | void | -| stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint) | void | -| stencilMask(mask: GLuint) | void | -| stencilMaskSeparate(face: GLenum, mask: GLuint) | void | -| stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum) | void | -| stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum) | void | -| texParameterf(target: GLenum, pname: GLenum, param: GLfloat) | void | -| texParameteri(target: GLenum, pname: GLenum, param: GLint) | void | -| uniform1f(location: WebGLUniformLocation \| null, x: GLfloat) | void | -| uniform2f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat) | void | -| uniform3f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat) | void | -| uniform4f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | -| uniform1i(location: WebGLUniformLocation \| null, x: GLint) | void | -| uniform2i(location: WebGLUniformLocation \| null, x: GLint, y: GLint) | void | -| uniform3i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint) | void | -| uniform4i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint, w: GLint) | void | -| useProgram(program: WebGLProgram \| null) | void | -| validateProgram(program: WebGLProgram) | void | -| vertexAttrib1f(index: GLuint, x: GLfloat) | void | -| vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat) | void | -| vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) | void | -| vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | -| vertexAttrib1fv(index: GLuint, values: Float32List) | void | -| vertexAttrib2fv(index: GLuint, values: Float32List) | void | -| vertexAttrib3fv(index: GLuint, values: Float32List) | void | -| vertexAttrib4fv(index: GLuint, values: Float32List) | void | -| vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr) | void | -| viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | - - -## webgl.WebGLRenderingContextOverloads - -WebGLRenderingContextOverloads - -| 方法 | 返回值类型 | -| -------- | -------- | -| bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum) | void | -| bufferData(target: GLenum, data: BufferSource \| null, usage: GLenum) | void | -| bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource) | void | -| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView) | void | -| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView) | void | -| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | -| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | -| texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | -| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | -| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | -| uniform1fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform2fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform3fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform4fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform1iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniform2iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniform3iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniform4iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniformMatrix2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | -| uniformMatrix3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | -| uniformMatrix4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | +# webgl + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +WebGL标准图形API,对应OpenGL ES 2.0特性集。更多信息请参考[WebGL™标准](https://www.khronos.org/registry/webgl/specs/latest/1.0/)。 + + +## 导入模块 + +``` +import webgl from '@ohos.webglnapi' +``` + + +## 调用方式 + +hml内创建canvas,示例如下: + + +``` +
+ + +
+``` + +js内获取canvas实例,示例如下: + + +``` +// 获取canvas组件实例 +const el = this.$refs.canvas1; +// 从canvas组件实例获取WebGL上下文 +const gl = el.getContext('webgl'); +// 调用WebGL API +gl.clearColor(0.0, 0.0, 0.0, 1.0); +``` + + +## Type + + **表1** Type + +| 名称 | 类型 | 说明 | +| -------- | -------- | -------- | +| GLenum | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLboolean | boolean | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLbitfield | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLbyte | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLshort | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLint | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLsizei | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLintptr | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLsizeiptr | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLubyte | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLushort | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLuint | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLfloat | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| GLclampf | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| TexImageSource | ImageData | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| Float32List | array | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| Int32List | array | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLPowerPreference | string | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | + + +## Interface + + **表2** Interface + +| 名称 | 说明 | +| -------- | -------- | +| [WebGLContextAttributes](#webglcontextattributes) | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLBuffer | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLFrameBuffer | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLProgram | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLRenderbuffer | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLShader | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLTexture | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLUniformLocation | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLActiveInfo](#webglactiveinfo) | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLShaderPrecisionFormat](#webglshaderprecisionformat) | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLRenderingContextBase](#webglrenderingcontextbase) | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLRenderingContextOverloads](#webglrenderingcontextoverloads) | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL | + + +## WebGLContextAttributes + +WebGLContextAttributes + + + | 名称 | 参数类型 | 必填 | +| -------- | -------- | -------- | +| alpha | boolean | 否 | +| depth | boolean | 否 | +| stencil | boolean | 否 | +| antialias | boolean | 否 | +| premultipliedAlpha | boolean | 否 | +| preserveDrawingBuffer | boolean | 否 | +| powerPreference | WebGLPowerPreference | 否 | +| failIfMajorPerformanceCaveat | boolean | 否 | +| desynchronized | boolean | 否 | + + +## WebGLActiveInfo + +WebGLActiveInfo + + | 名称 | 参数类型 | 必填 | +| -------- | -------- | -------- | +| size | GLint | 是 | +| type | GLenum | 是 | +| name | string | 是 | + + +## WebGLShaderPrecisionFormat + +WebGLShaderPrecisionFormat + + | 名称 | 参数类型 | 必填 | +| -------- | -------- | -------- | +| rangeMin | GLint | 是 | +| rangeMax | GLint | 是 | +| precision | GLint | 是 | + + +## WebGLRenderingContextBase + +WebGLRenderingContextBase + + +### 属性 + + | 名称 | 参数类型 | 必填 | +| -------- | -------- | -------- | +| DEPTH_BUFFER_BIT | GLenum | 是 | +| STENCIL_BUFFER_BIT | GLenum | 是 | +| COLOR_BUFFER_BIT | GLenum | 是 | +| POINTS | GLenum | 是 | +| LINES | GLenum | 是 | +| LINE_LOOP | GLenum | 是 | +| LINE_STRIP | GLenum | 是 | +| TRIANGLES | GLenum | 是 | +| TRIANGLE_STRIP | GLenum | 是 | +| TRIANGLE_FAN | GLenum | 是 | +| ZERO | GLenum | 是 | +| ONE | GLenum | 是 | +| SRC_COLOR | GLenum | 是 | +| ONE_MINUS_SRC_COLOR | GLenum | 是 | +| SRC_ALPHA | GLenum | 是 | +| ONE_MINUS_SRC_ALPHA | GLenum | 是 | +| DST_ALPHA | GLenum | 是 | +| ONE_MINUS_DST_ALPHA | GLenum | 是 | +| DST_COLOR | GLenum | 是 | +| ONE_MINUS_DST_COLOR | GLenum | 是 | +| SRC_ALPHA_SATURATE | GLenum | 是 | +| FUNC_ADD | GLenum | 是 | +| BLEND_EQUATION | GLenum | 是 | +| BLEND_EQUATION_RGB | GLenum | 是 | +| BLEND_EQUATION_ALPHA | GLenum | 是 | +| FUNC_SUBTRACT | GLenum | 是 | +| FUNC_REVERSE_SUBTRACT | GLenum | 是 | +| BLEND_DST_RGB | GLenum | 是 | +| BLEND_SRC_RGB | GLenum | 是 | +| BLEND_DST_ALPHA | GLenum | 是 | +| BLEND_SRC_ALPHA | GLenum | 是 | +| CONSTANT_COLOR | GLenum | 是 | +| ONE_MINUS_CONSTANT_COLOR | GLenum | 是 | +| CONSTANT_ALPHA | GLenum | 是 | +| ONE_MINUS_CONSTANT_ALPHA | GLenum | 是 | +| BLEND_COLOR | GLenum | 是 | +| ARRAY_BUFFER | GLenum | 是 | +| ELEMENT_ARRAY_BUFFER | GLenum | 是 | +| ARRAY_BUFFER_BINDING | GLenum | 是 | +| ELEMENT_ARRAY_BUFFER_BINDING | GLenum | 是 | +| STREAM_DRAW | GLenum | 是 | +| STATIC_DRAW | GLenum | 是 | +| DYNAMIC_DRAW | GLenum | 是 | +| BUFFER_SIZE | GLenum | 是 | +| BUFFER_USAGE | GLenum | 是 | +| CURRENT_VERTEX_ATTRIB | GLenum | 是 | +| FRONT | GLenum | 是 | +| BACK | GLenum | 是 | +| FRONT_AND_BACK | GLenum | 是 | +| CULL_FACE | GLenum | 是 | +| BLEND | GLenum | 是 | +| DITHER | GLenum | 是 | +| STENCIL_TEST | GLenum | 是 | +| DEPTH_TEST | GLenum | 是 | +| SCISSOR_TEST | GLenum | 是 | +| POLYGON_OFFSET_FILL | GLenum | 是 | +| SAMPLE_ALPHA_TO_COVERAGE | GLenum | 是 | +| SAMPLE_COVERAGE | GLenum | 是 | +| NO_ERROR | GLenum | 是 | +| INVALID_ENUM | GLenum | 是 | +| INVALID_VALUE | GLenum | 是 | +| INVALID_OPERATION | GLenum | 是 | +| OUT_OF_MEMORY | GLenum | 是 | +| CW | GLenum | 是 | +| CCW | GLenum | 是 | +| LINE_WIDTH | GLenum | 是 | +| ALIASED_POINT_SIZE_RANGE | GLenum | 是 | +| ALIASED_LINE_WIDTH_RANGE | GLenum | 是 | +| CULL_FACE_MODE | GLenum | 是 | +| FRONT_FACE | GLenum | 是 | +| DEPTH_RANGE | GLenum | 是 | +| DEPTH_WRITEMASK | GLenum | 是 | +| DEPTH_CLEAR_VALUE | GLenum | 是 | +| DEPTH_FUNC | GLenum | 是 | +| STENCIL_CLEAR_VALUE | GLenum | 是 | +| STENCIL_FUNC | GLenum | 是 | +| STENCIL_FAIL | GLenum | 是 | +| STENCIL_PASS_DEPTH_FAIL | GLenum | 是 | +| STENCIL_PASS_DEPTH_PASS | GLenum | 是 | +| STENCIL_REF | GLenum | 是 | +| STENCIL_VALUE_MASK | GLenum | 是 | +| STENCIL_WRITEMASK | GLenum | 是 | +| STENCIL_BACK_FUNC | GLenum | 是 | +| STENCIL_BACK_FAIL | GLenum | 是 | +| STENCIL_BACK_PASS_DEPTH_FAIL | GLenum | 是 | +| STENCIL_BACK_PASS_DEPTH_PASS | GLenum | 是 | +| STENCIL_BACK_REF | GLenum | 是 | +| STENCIL_BACK_VALUE_MASK | GLenum | 是 | +| STENCIL_BACK_WRITEMASK | GLenum | 是 | +| VIEWPORT | GLenum | 是 | +| SCISSOR_BOX | GLenum | 是 | +| COLOR_CLEAR_VALUE | GLenum | 是 | +| COLOR_WRITEMASK | GLenum | 是 | +| UNPACK_ALIGNMENT | GLenum | 是 | +| PACK_ALIGNMENT | GLenum | 是 | +| MAX_TEXTURE_SIZE | GLenum | 是 | +| MAX_VIEWPORT_DIMS | GLenum | 是 | +| SUBPIXEL_BITS | GLenum | 是 | +| RED_BITS | GLenum | 是 | +| GREEN_BITS | GLenum | 是 | +| BLUE_BITS | GLenum | 是 | +| ALPHA_BITS | GLenum | 是 | +| DEPTH_BITS | GLenum | 是 | +| STENCIL_BITS | GLenum | 是 | +| POLYGON_OFFSET_UNITS | GLenum | 是 | +| POLYGON_OFFSET_FACTOR | GLenum | 是 | +| TEXTURE_BINDING_2D | GLenum | 是 | +| SAMPLE_BUFFERS | GLenum | 是 | +| SAMPLES | GLenum | 是 | +| SAMPLE_COVERAGE_VALUE | GLenum | 是 | +| SAMPLE_COVERAGE_INVERT | GLenum | 是 | +| COMPRESSED_TEXTURE_FORMATS | GLenum | 是 | +| DONT_CARE | GLenum | 是 | +| FASTEST | GLenum | 是 | +| NICEST | GLenum | 是 | +| GENERATE_MIPMAP_HINT | GLenum | 是 | +| BYTE | GLenum | 是 | +| UNSIGNED_BYTE | GLenum | 是 | +| SHORT | GLenum | 是 | +| UNSIGNED_SHORT | GLenum | 是 | +| INT | GLenum | 是 | +| UNSIGNED_INT | GLenum | 是 | +| FLOAT | GLenum | 是 | +| DEPTH_COMPONENT | GLenum | 是 | +| ALPHA | GLenum | 是 | +| RGB | GLenum | 是 | +| RGBA | GLenum | 是 | +| LUMINANCE | GLenum | 是 | +| LUMINANCE_ALPHA | GLenum | 是 | +| UNSIGNED_SHORT_4_4_4_4 | GLenum | 是 | +| UNSIGNED_SHORT_5_5_5_1 | GLenum | 是 | +| UNSIGNED_SHORT_5_6_5 | GLenum | 是 | +| FRAGMENT_SHADER | GLenum | 是 | +| VERTEX_SHADER | GLenum | 是 | +| MAX_VERTEX_ATTRIBS | GLenum | 是 | +| MAX_VERTEX_UNIFORM_VECTORS | GLenum | 是 | +| MAX_VARYING_VECTORS | GLenum | 是 | +| MAX_COMBINED_TEXTURE_IMAGE_UNITS | GLenum | 是 | +| MAX_VERTEX_TEXTURE_IMAGE_UNITS | GLenum | 是 | +| MAX_TEXTURE_IMAGE_UNITS | GLenum | 是 | +| MAX_FRAGMENT_UNIFORM_VECTORS | GLenum | 是 | +| SHADER_TYPE | GLenum | 是 | +| DELETE_STATUS | GLenum | 是 | +| LINK_STATUS | GLenum | 是 | +| VALIDATE_STATUS | GLenum | 是 | +| ATTACHED_SHADERS | GLenum | 是 | +| ACTIVE_UNIFORMS | GLenum | 是 | +| ACTIVE_ATTRIBUTES | GLenum | 是 | +| SHADING_LANGUAGE_VERSION | GLenum | 是 | +| CURRENT_PROGRAM | GLenum | 是 | +| NEVER | GLenum | 是 | +| LESS | GLenum | 是 | +| EQUAL | GLenum | 是 | +| LEQUAL | GLenum | 是 | +| GREATER | GLenum | 是 | +| NOTEQUAL | GLenum | 是 | +| GEQUAL | GLenum | 是 | +| ALWAYS | GLenum | 是 | +| KEEP | GLenum | 是 | +| REPLACE | GLenum | 是 | +| INCR | GLenum | 是 | +| DECR | GLenum | 是 | +| INVERT | GLenum | 是 | +| INCR_WRAP | GLenum | 是 | +| DECR_WRAP | GLenum | 是 | +| VENDOR | GLenum | 是 | +| RENDERER | GLenum | 是 | +| VERSION | GLenum | 是 | +| NEAREST | GLenum | 是 | +| LINEAR | GLenum | 是 | +| NEAREST_MIPMAP_NEAREST | GLenum | 是 | +| LINEAR_MIPMAP_NEAREST | GLenum | 是 | +| NEAREST_MIPMAP_LINEAR | GLenum | 是 | +| LINEAR_MIPMAP_LINEAR | GLenum | 是 | +| TEXTURE_MIN_FILTER | GLenum | 是 | +| TEXTURE_WRAP_S | GLenum | 是 | +| TEXTURE_WRAP_T | GLenum | 是 | +| TEXTURE_2D | GLenum | 是 | +| TEXTURE | GLenum | 是 | +| TEXTURE_CUBE_MAP | GLenum | 是 | +| TEXTURE_BINDING_CUBE_MAP | GLenum | 是 | +| TEXTURE_CUBE_MAP_POSITIVE_X | GLenum | 是 | +| TEXTURE_CUBE_MAP_NEGATIVE_X | GLenum | 是 | +| TEXTURE_CUBE_MAP_POSITIVE_Y | GLenum | 是 | +| TEXTURE_CUBE_MAP_NEGATIVE_Y | GLenum | 是 | +| TEXTURE_CUBE_MAP_POSITIVE_Z | GLenum | 是 | +| TEXTURE_CUBE_MAP_NEGATIVE_Z | GLenum | 是 | +| MAX_CUBE_MAP_TEXTURE_SIZE | GLenum | 是 | +| TEXTURE0 | GLenum | 是 | +| TEXTURE1 | GLenum | 是 | +| TEXTURE2 | GLenum | 是 | +| TEXTURE3 | GLenum | 是 | +| TEXTURE4 | GLenum | 是 | +| TEXTURE5 | GLenum | 是 | +| TEXTURE6 | GLenum | 是 | +| TEXTURE7 | GLenum | 是 | +| TEXTURE8 | GLenum | 是 | +| TEXTURE9 | GLenum | 是 | +| TEXTURE10 | GLenum | 是 | +| TEXTURE11 | GLenum | 是 | +| TEXTURE12 | GLenum | 是 | +| TEXTURE13 | GLenum | 是 | +| TEXTURE14 | GLenum | 是 | +| TEXTURE15 | GLenum | 是 | +| TEXTURE16 | GLenum | 是 | +| TEXTURE17 | GLenum | 是 | +| TEXTURE18 | GLenum | 是 | +| TEXTURE19 | GLenum | 是 | +| TEXTURE20 | GLenum | 是 | +| TEXTURE21 | GLenum | 是 | +| TEXTURE22 | GLenum | 是 | +| TEXTURE23 | GLenum | 是 | +| TEXTURE24 | GLenum | 是 | +| TEXTURE25 | GLenum | 是 | +| TEXTURE26 | GLenum | 是 | +| TEXTURE27 | GLenum | 是 | +| TEXTURE28 | GLenum | 是 | +| TEXTURE29 | GLenum | 是 | +| TEXTURE30 | GLenum | 是 | +| TEXTURE31 | GLenum | 是 | +| ACTIVE_TEXTURE | GLenum | 是 | +| REPEAT | GLenum | 是 | +| CLAMP_TO_EDGE | GLenum | 是 | +| MIRRORED_REPEAT | GLenum | 是 | +| FLOAT_VEC2 | GLenum | 是 | +| FLOAT_VEC3 | GLenum | 是 | +| FLOAT_VEC4 | GLenum | 是 | +| INT_VEC2 | GLenum | 是 | +| INT_VEC3 | GLenum | 是 | +| INT_VEC4 | GLenum | 是 | +| BOOL | GLenum | 是 | +| BOOL_VEC2 | GLenum | 是 | +| BOOL_VEC3 | GLenum | 是 | +| BOOL_VEC4 | GLenum | 是 | +| FLOAT_MAT2 | GLenum | 是 | +| FLOAT_MAT3 | GLenum | 是 | +| FLOAT_MAT4 | GLenum | 是 | +| SAMPLER_2D | GLenum | 是 | +| SAMPLER_CUBE | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_ENABLED | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_SIZE | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_STRIDE | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_TYPE | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_NORMALIZED | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_POINTER | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_BUFFER_BINDING | GLenum | 是 | +| IMPLEMENTATION_COLOR_READ_TYPE | GLenum | 是 | +| IMPLEMENTATION_COLOR_READ_FORMAT | GLenum | 是 | +| COMPILE_STATUS | GLenum | 是 | +| LOW_FLOAT | GLenum | 是 | +| MEDIUM_FLOAT | GLenum | 是 | +| HIGH_FLOAT | GLenum | 是 | +| LOW_INT | GLenum | 是 | +| MEDIUM_INT | GLenum | 是 | +| HIGH_INT | GLenum | 是 | +| FRAMEBUFFER | GLenum | 是 | +| RENDERBUFFER | GLenum | 是 | +| RGBA4 | GLenum | 是 | +| RGB5_A1 | GLenum | 是 | +| RGB565 | GLenum | 是 | +| DEPTH_COMPONENT16 | GLenum | 是 | +| STENCIL_INDEX8 | GLenum | 是 | +| DEPTH_STENCIL | GLenum | 是 | +| RENDERBUFFER_WIDTH | GLenum | 是 | +| RENDERBUFFER_HEIGHT | GLenum | 是 | +| RENDERBUFFER_INTERNAL_FORMAT | GLenum | 是 | +| RENDERBUFFER_RED_SIZE | GLenum | 是 | +| RENDERBUFFER_GREEN_SIZE | GLenum | 是 | +| RENDERBUFFER_BLUE_SIZE | GLenum | 是 | +| RENDERBUFFER_ALPHA_SIZE | GLenum | 是 | +| RENDERBUFFER_DEPTH_SIZE | GLenum | 是 | +| RENDERBUFFER_STENCIL_SIZE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE | GLenum | 是 | +| COLOR_ATTACHMENT0 | GLenum | 是 | +| DEPTH_ATTACHMENT | GLenum | 是 | +| STENCIL_ATTACHMENT | GLenum | 是 | +| DEPTH_STENCIL_ATTACHMENT | GLenum | 是 | +| NONE | GLenum | 是 | +| FRAMEBUFFER_COMPLETE | GLenum | 是 | +| FRAMEBUFFER_INCOMPLETE_ATTACHMENT | GLenum | 是 | +| FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT | GLenum | 是 | +| FRAMEBUFFER_INCOMPLETE_DIMENSIONS | GLenum | 是 | +| FRAMEBUFFER_UNSUPPORTED | GLenum | 是 | +| FRAMEBUFFER_BINDING | GLenum | 是 | +| RENDERBUFFER_BINDING | GLenum | 是 | +| MAX_RENDERBUFFER_SIZE | GLenum | 是 | +| INVALID_FRAMEBUFFER_OPERATION | GLenum | 是 | +| UNPACK_FLIP_Y_WEBGL | GLenum | 是 | +| UNPACK_PREMULTIPLY_ALPHA_WEBGL | GLenum | 是 | +| CONTEXT_LOST_WEBGL | GLenum | 是 | +| UNPACK_COLORSPACE_CONVERSION_WEBGL | GLenum | 是 | +| BROWSER_DEFAULT_WEBGL | GLenum | 是 | +| canvas | HTMLCanvasElement \| OffscreenCanvas | 是 | +| drawingBufferWidth | GLsizei | 是 | +| drawingBufferHeight | GLsizei | 是 | + + +### 方法 + + | 方法 | 返回值类型 | +| -------- | -------- | +| getContextAttributes() | WebGLContextAttributes \| null | +| isContextLost() | boolean | +| getSupportedExtensions() | string[] \| null | +| getExtension(name: string) | any | +| activeTexture(texture: GLenum) | void | +| attachShader(program: WebGLProgram, shader: WebGLShader) | void | +| bindAttribLocation(program: WebGLProgram, index: GLuint, name: string) | void | +| bindBuffer(target: GLenum, buffer: WebGLBuffer \| null) | void | +| bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer \| null) | void | +| bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | +| bindTexture(target: GLenum, texture: WebGLTexture \| null) | void | +| blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | +| blendEquation(mode: GLenum) | void | +| blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum) | void | +| blendFunc(sfactor: GLenum, dfactor: GLenum) | void | +| blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) | void | +| checkFramebufferStatus(target: GLenum) | GLenum | +| clear(mask: GLbitfield) | void | +| clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | +| clearDepth(depth: GLclampf) | void | +| clearStencil(s: GLint) | void | +| colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) | void | +| compileShader(shader: WebGLShader) | void | +| copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) | void | +| copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| createBuffer() | WebGLBuffer \| null | +| createFramebuffer() | WebGLFramebuffer \| null | +| createProgram() | WebGLProgram \| null | +| createRenderbuffer() | WebGLRenderbuffer \| null | +| createShader(type: GLenum) | WebGLShader \| null | +| createTexture() | WebGLTexture \| null | +| cullFace(mode: GLenum) | void | +| deleteBuffer(buffer: WebGLBuffer \| null) | void | +| deleteFramebuffer(framebuffer: WebGLFramebuffer \| null) | void | +| deleteProgram(program: WebGLProgram \| null) | void | +| deleteRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | void | +| deleteShader(shader: WebGLShader \| null) | void | +| deleteTexture(texture: WebGLTexture \| null) | void | +| depthFunc(func: GLenum) | void | +| depthMask(flag: GLboolean) | void | +| depthRange(zNear: GLclampf, zFar: GLclampf) | void | +| detachShader(program: WebGLProgram, shader: WebGLShader) | void | +| disable(cap: GLenum) | void | +| disableVertexAttribArray(index: GLuint) | void | +| drawArrays(mode: GLenum, first: GLint, count: GLsizei) | void | +| drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr) | void | +| enable(cap: GLenum) | void | +| enableVertexAttribArray(index: GLuint) | void | +| finish() | void | +| flush() | void | +| framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | +| framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture \| null, level: GLint) | void | +| frontFace(mode: GLenum) | void | +| generateMipmap(target: GLenum) | void | +| getActiveAttrib(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | +| getActiveUniform(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | +| getAttachedShaders(program: WebGLProgram) | WebGLShader[] \| null | +| getAttribLocation(program: WebGLProgram, name: string) | GLint | +| getBufferParameter(target: GLenum, pname: GLenum) | any | +| getParameter(pname: GLenum) | any | +| getError() | GLenum | +| getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum) | any | +| getProgramParameter(program: WebGLProgram, pname: GLenum) | any | +| getProgramInfoLog(program: WebGLProgram) | string \| null | +| getRenderbufferParameter(target: GLenum, pname: GLenum) | any | +| getShaderParameter(shader: WebGLShader, pname: GLenum) | any | +| getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum) | WebGLShaderPrecisionFormat \| null | +| getShaderInfoLog(shader: WebGLShader) | string \| null | +| getShaderSource(shader: WebGLShader) | string \| null | +| getTexParameter(target: GLenum, pname: GLenum) | any | +| getUniform(program: WebGLProgram, location: WebGLUniformLocation) | any | +| getUniformLocation(program: WebGLProgram, name: string) | WebGLUniformLocation \| null | +| getVertexAttrib(index: GLuint, pname: GLenum) | any | +| getVertexAttribOffset(index: GLuint, pname: GLenum) | GLintptr | +| hint(target: GLenum, mode: GLenum) | void | +| isBuffer(buffer: WebGLBuffer \| null) | GLboolean | +| isEnabled(cap: GLenum) | GLboolean | +| isFramebuffer(framebuffer: WebGLFramebuffer \| null) | GLboolean | +| isProgram(program: WebGLProgram \| null) | GLboolean | +| isRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | GLboolean | +| isShader(shader: WebGLShader \| null) | GLboolean | +| isTexture(texture: WebGLTexture \| null) | GLboolean | +| lineWidth(width: GLfloat) | void | +| linkProgram(program: WebGLProgram) | void | +| pixelStorei(pname: GLenum, param: GLint \| GLboolean) | void | +| polygonOffset(factor: GLfloat, units: GLfloat) | void | +| renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | +| sampleCoverage(value: GLclampf, invert: GLboolean) | void | +| scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| shaderSource(shader: WebGLShader, source: string) | void | +| stencilFunc(func: GLenum, ref: GLint, mask: GLuint) | void | +| stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint) | void | +| stencilMask(mask: GLuint) | void | +| stencilMaskSeparate(face: GLenum, mask: GLuint) | void | +| stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum) | void | +| stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum) | void | +| texParameterf(target: GLenum, pname: GLenum, param: GLfloat) | void | +| texParameteri(target: GLenum, pname: GLenum, param: GLint) | void | +| uniform1f(location: WebGLUniformLocation \| null, x: GLfloat) | void | +| uniform2f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat) | void | +| uniform3f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat) | void | +| uniform4f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | +| uniform1i(location: WebGLUniformLocation \| null, x: GLint) | void | +| uniform2i(location: WebGLUniformLocation \| null, x: GLint, y: GLint) | void | +| uniform3i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint) | void | +| uniform4i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint, w: GLint) | void | +| useProgram(program: WebGLProgram \| null) | void | +| validateProgram(program: WebGLProgram) | void | +| vertexAttrib1f(index: GLuint, x: GLfloat) | void | +| vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat) | void | +| vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) | void | +| vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | +| vertexAttrib1fv(index: GLuint, values: Float32List) | void | +| vertexAttrib2fv(index: GLuint, values: Float32List) | void | +| vertexAttrib3fv(index: GLuint, values: Float32List) | void | +| vertexAttrib4fv(index: GLuint, values: Float32List) | void | +| vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr) | void | +| viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | + + +## WebGLRenderingContextOverloads + +WebGLRenderingContextOverloads + + | 方法 | 返回值类型 | +| -------- | -------- | +| bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum) | void | +| bufferData(target: GLenum, data: BufferSource \| null, usage: GLenum) | void | +| bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource) | void | +| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView) | void | +| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void; | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| uniform1fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform2fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform3fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform4fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform1iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniform2iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniform3iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniform4iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniformMatrix2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | +| uniformMatrix3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | +| uniformMatrix4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | diff --git a/zh-cn/application-dev/reference/apis/js-apis-webgl2.md b/zh-cn/application-dev/reference/apis/js-apis-webgl2.md index ab0618b8e9f..013597f09d7 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-webgl2.md +++ b/zh-cn/application-dev/reference/apis/js-apis-webgl2.md @@ -1,501 +1,481 @@ -# WebGL2 - -> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 - - -WebGL标准图形API,对应OpenGL ES 3.0特性集。更多信息请参考[WebgGL™标准](https://www.khronos.org/registry/webgl/specs/latest/2.0/)。 - - - -## 导入模块 - -``` -import webgl from 'ohos.webglnapi' -``` - - -## 系统能力 - -SystemCapability.Graphic.Graphic2D.WebGL2 - - -## 调用方式 - -``` -// 获取canvas组件实例 -const el = this.$refs.canvas -// 从canvas组件实例获取WebGL上下文 -const gl = el.getContext('webgl'); -const gl2 = el.getContext('webgl2'); -// 调用WebGL API -gl2.readBuffer(gl.COLOR_ATTACHMENT0) -``` - - -## GLenum - -| 名称 | 类型 | -| -------- | -------- | -| GLenum | number | - - -## Glint64 - -| 名称 | 类型 | -| -------- | -------- | -| Glint64 | number | - - -## Gluint64 - -| 名称 | 类型 | -| -------- | -------- | -| Gluint64 | number | - - -## Uint32List - -| 名称 | 类型 | -| -------- | -------- | -| Uint32List | array | - - -## webgl.webGL2RenderingContexBase - -WebGL2RenderingContexBase - - -### 属性 - -| 名称 | 参数类型 | 必填 | -| -------- | ------- | --------- | -| READ_BUFFER | [GLenum](#GLenum) | 是 | -| UNPACK_ROW_LENGTH | [GLenum](#GLenum) | 是 | -| UNPACK_SKIP_ROWS | [GLenum](#GLenum) | 是 | -| UNPACK_SKIP_PIXELS | [GLenum](#GLenum) | 是 | -| PACK_ROW_LENGTH | [GLenum](#GLenum) | 是 | -| PACK_SKIP_ROWS | [GLenum](#GLenum) | 是 | -| PACK_SKIP_PIXELS | [GLenum](#GLenum) | 是 | -| COLOR | [GLenum](#GLenum) | 是 | -| DEPTH | [GLenum](#GLenum) | 是 | -| STENCIL | [GLenum](#GLenum) | 是 | -| RED | [GLenum](#GLenum) | 是 | -| RGB8 | [GLenum](#GLenum) | 是 | -| RGBA8 | [GLenum](#GLenum) | 是 | -| RGB10_A2 | [GLenum](#GLenum) | 是 | -| TEXTURE_BINDING_3D | [GLenum](#GLenum) | 是 | -| UNPACK_SKIP_IMAGES | [GLenum](#GLenum) | 是 | -| UNPACK_IMAGE_HEIGHT | [GLenum](#GLenum) | 是 | -| TEXTURE_3D | [GLenum](#GLenum) | 是 | -| TEXTURE_WRAP_R | [GLenum](#GLenum) | 是 | -| MAX_3D_TEXTURE_SIZE | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_2_10_10_10_REV | [GLenum](#GLenum) | 是 | -| MAX_ELEMENTS_VERTICES | [GLenum](#GLenum) | 是 | -| MAX_ELEMENTS_INDICES | [GLenum](#GLenum) | 是 | -| TEXTURE_MIN_LOD | [GLenum](#GLenum) | 是 | -| TEXTURE_MAX_LOD | [GLenum](#GLenum) | 是 | -| TEXTURE_BASE_LEVEL | [GLenum](#GLenum) | 是 | -| TEXTURE_MAX_LEVEL | [GLenum](#GLenum) | 是 | -| MIN | [GLenum](#GLenum) | 是 | -| MAX | [GLenum](#GLenum) | 是 | -| DEPTH_COMPONENT24 | [GLenum](#GLenum) | 是 | -| MAX_TEXTURE_LOD_BIAS | [GLenum](#GLenum) | 是 | -| TEXTURE_COMPARE_MODE | [GLenum](#GLenum) | 是 | -| TEXTURE_COMPARE_FUNC | [GLenum](#GLenum) | 是 | -| CURRENT_QUERY | [GLenum](#GLenum) | 是 | -| QUERY_RESULT | [GLenum](#GLenum) | 是 | -| QUERY_RESULT_AVAILABLE | [GLenum](#GLenum) | 是 | -| STREAM_READ | [GLenum](#GLenum) | 是 | -| STREAM_COPY | [GLenum](#GLenum) | 是 | -| STATIC_READ | [GLenum](#GLenum) | 是 | -| STATIC_COPY | [GLenum](#GLenum) | 是 | -| DYNAMIC_READ | [GLenum](#GLenum) | 是 | -| DYNAMIC_COPY | [GLenum](#GLenum) | 是 | -| MAX_DRAW_BUFFERS | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER0 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER1 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER2 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER3 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER4 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER5 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER6 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER7 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER8 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER9 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER10 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER11 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER12 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER13 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER14 | [GLenum](#GLenum) | 是 | -| DRAW_BUFFER15 | [GLenum](#GLenum) | 是 | -| MAX_FRAGMENT_UNIFORM_COMPONENTS | [GLenum](#GLenum) | 是 | -| MAX_VERTEX_UNIFORM_COMPONENTS | [GLenum](#GLenum) | 是 | -| SAMPLER_3D | [GLenum](#GLenum) | 是 | -| SAMPLER_2D_SHADOW | [GLenum](#GLenum) | 是 | -| FRAGMENT_SHADER_DERIVATIVE_HINT | [GLenum](#GLenum) | 是 | -| PIXEL_PACK_BUFFER | [GLenum](#GLenum) | 是 | -| PIXEL_UNPACK_BUFFER | [GLenum](#GLenum) | 是 | -| PIXEL_PACK_BUFFER_BINDING | [GLenum](#GLenum) | 是 | -| PIXEL_UNPACK_BUFFER_BINDING | [GLenum](#GLenum) | 是 | -| FLOAT_MAT2x3 | [GLenum](#GLenum) | 是 | -| FLOAT_MAT2x4 | [GLenum](#GLenum) | 是 | -| FLOAT_MAT3x2 | [GLenum](#GLenum) | 是 | -| FLOAT_MAT3x4 | [GLenum](#GLenum) | 是 | -| FLOAT_MAT4x2 | [GLenum](#GLenum) | 是 | -| FLOAT_MAT4x3 | [GLenum](#GLenum) | 是 | -| SRGB | [GLenum](#GLenum) | 是 | -| SRGB8 | [GLenum](#GLenum) | 是 | -| SRGB8_ALPHA8 | [GLenum](#GLenum) | 是 | -| COMPARE_REF_TO_TEXTURE | [GLenum](#GLenum) | 是 | -| RGBA32F | [GLenum](#GLenum) | 是 | -| RGB32F | [GLenum](#GLenum) | 是 | -| RGBA16F | [GLenum](#GLenum) | 是 | -| RGB16F | [GLenum](#GLenum) | 是 | -| VERTEX_ATTRIB_ARRAY_INTEGER | [GLenum](#GLenum) | 是 | -| MAX_ARRAY_TEXTURE_LAYERS | [GLenum](#GLenum) | 是 | -| MIN_PROGRAM_TEXEL_OFFSET | [GLenum](#GLenum) | 是 | -| MAX_PROGRAM_TEXEL_OFFSET | [GLenum](#GLenum) | 是 | -| MAX_VARYING_COMPONENTS | [GLenum](#GLenum) | 是 | -| TEXTURE_2D_ARRAY | [GLenum](#GLenum) | 是 | -| TEXTURE_BINDING_2D_ARRAY | [GLenum](#GLenum) | 是 | -| R11F_G11F_B10F | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_10F_11F_11F_REV | [GLenum](#GLenum) | 是 | -| RGB9_E5 | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_5_9_9_9_REV | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_BUFFER_MODE | [GLenum](#GLenum) | 是 | -| MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_VARYINGS | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_BUFFER_START | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_BUFFER_SIZE | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN | [GLenum](#GLenum) | 是 | -| RASTERIZER_DISCARD | [GLenum](#GLenum) | 是 | -| MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS | [GLenum](#GLenum) | 是 | -| MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS | [GLenum](#GLenum) | 是 | -| INTERLEAVED_ATTRIBS | [GLenum](#GLenum) | 是 | -| SEPARATE_ATTRIBS | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_BUFFER | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_BUFFER_BINDING | [GLenum](#GLenum) | 是 | -| RGBA32UI | [GLenum](#GLenum) | 是 | -| RGB32UI | [GLenum](#GLenum) | 是 | -| RGBA16UI | [GLenum](#GLenum) | 是 | -| RGB16UI | [GLenum](#GLenum) | 是 | -| RGBA8UI | [GLenum](#GLenum) | 是 | -| RGB8UI | [GLenum](#GLenum) | 是 | -| RGBA32I | [GLenum](#GLenum) | 是 | -| RGB32I | [GLenum](#GLenum) | 是 | -| RGBA16I | [GLenum](#GLenum) | 是 | -| RGB16I | [GLenum](#GLenum) | 是 | -| RGBA8I | [GLenum](#GLenum) | 是 | -| RGB8I | [GLenum](#GLenum) | 是 | -| RED_INTEGER | [GLenum](#GLenum) | 是 | -| RGB_INTEGER | [GLenum](#GLenum) | 是 | -| RGBA_INTEGER | [GLenum](#GLenum) | 是 | -| SAMPLER_2D_ARRAY | [GLenum](#GLenum) | 是 | -| SAMPLER_2D_ARRAY_SHADOW | [GLenum](#GLenum) | 是 | -| SAMPLER_CUBE_SHADOW | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_VEC2 | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_VEC3 | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_VEC4 | [GLenum](#GLenum) | 是 | -| INT_SAMPLER_2D | [GLenum](#GLenum) | 是 | -| INT_SAMPLER_3D | [GLenum](#GLenum) | 是 | -| INT_SAMPLER_CUBE | [GLenum](#GLenum) | 是 | -| INT_SAMPLER_2D_ARRAY | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_SAMPLER_2D | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_SAMPLER_3D | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_SAMPLER_CUBE | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_SAMPLER_2D_ARRAY | [GLenum](#GLenum) | 是 | -| DEPTH_COMPONENT32F | [GLenum](#GLenum) | 是 | -| DEPTH32F_STENCIL8 | [GLenum](#GLenum) | 是 | -| FLOAT_32_UNSIGNED_INT_24_8_REV | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_RED_SIZE | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_GREEN_SIZE | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_BLUE_SIZE | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_DEFAULT | [GLenum](#GLenum) | 是 | -| UNSIGNED_INT_24_8 | [GLenum](#GLenum) | 是 | -| DEPTH24_STENCIL8 | [GLenum](#GLenum) | 是 | -| UNSIGNED_NORMALIZED | [GLenum](#GLenum) | 是 | -| DRAW_FRAMEBUFFER_BINDING | [GLenum](#GLenum) | 是 | -| READ_FRAMEBUFFER | [GLenum](#GLenum) | 是 | -| DRAW_FRAMEBUFFER | [GLenum](#GLenum) | 是 | -| READ_FRAMEBUFFER_BINDING | [GLenum](#GLenum) | 是 | -| RENDERBUFFER_SAMPLES | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER | [GLenum](#GLenum) | 是 | -| MAX_COLOR_ATTACHMENTS | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT1 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT2 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT3 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT4 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT5 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT6 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT7 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT8 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT9 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT10 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT11 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT12 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT13 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT14 | [GLenum](#GLenum) | 是 | -| COLOR_ATTACHMENT15 | [GLenum](#GLenum) | 是 | -| FRAMEBUFFER_INCOMPLETE_MULTISAMPLE | [GLenum](#GLenum) | 是 | -| MAX_SAMPLES | [GLenum](#GLenum) | 是 | -| HALF_FLOAT | [GLenum](#GLenum) | 是 | -| RG | [GLenum](#GLenum) | 是 | -| RG_INTEGER | [GLenum](#GLenum) | 是 | -| R8 | [GLenum](#GLenum) | 是 | -| RG8 | [GLenum](#GLenum) | 是 | -| R16F | [GLenum](#GLenum) | 是 | -| R32F | [GLenum](#GLenum) | 是 | -| RG16F | [GLenum](#GLenum) | 是 | -| RG32F | [GLenum](#GLenum) | 是 | -| R8I | [GLenum](#GLenum) | 是 | -| R8UI | [GLenum](#GLenum) | 是 | -| R16I | [GLenum](#GLenum) | 是 | -| R16UI | [GLenum](#GLenum) | 是 | -| R32I | [GLenum](#GLenum) | 是 | -| R32UI | [GLenum](#GLenum) | 是 | -| RG8I | [GLenum](#GLenum) | 是 | -| RG8UI | [GLenum](#GLenum) | 是 | -| RG16I | [GLenum](#GLenum) | 是 | -| RG16UI | [GLenum](#GLenum) | 是 | -| RG32I | [GLenum](#GLenum) | 是 | -| RG32UI | [GLenum](#GLenum) | 是 | -| VERTEX_ARRAY_BINDING | [GLenum](#GLenum) | 是 | -| R8_SNORM | [GLenum](#GLenum) | 是 | -| RG8_SNORM | [GLenum](#GLenum) | 是 | -| RGB8_SNORM | [GLenum](#GLenum) | 是 | -| SIGNED_NORMALIZED | [GLenum](#GLenum) | 是 | -| COPY_READ_BUFFER | [GLenum](#GLenum) | 是 | -| COPY_WRITE_BUFFER | [GLenum](#GLenum) | 是 | -| COPY_READ_BUFFER_BINDING | [GLenum](#GLenum) | 是 | -| COPY_WRITE_BUFFER_BINDING | [GLenum](#GLenum) | 是 | -| UNIFORM_BUFFER | [GLenum](#GLenum) | 是 | -| UNIFORM_BUFFER_BINDING | [GLenum](#GLenum) | 是 | -| UNIFORM_BUFFER_START | [GLenum](#GLenum) | 是 | -| UNIFORM_BUFFER_SIZE | [GLenum](#GLenum) | 是 | -| MAX_VERTEX_UNIFORM_BLOCKS | [GLenum](#GLenum) | 是 | -| MAX_FRAGMENT_UNIFORM_BLOCKS | [GLenum](#GLenum) | 是 | -| MAX_COMBINED_UNIFORM_BLOCKS | [GLenum](#GLenum) | 是 | -| MAX_UNIFORM_BUFFER_BINDINGS | [GLenum](#GLenum) | 是 | -| MAX_UNIFORM_BLOCK_SIZE | [GLenum](#GLenum) | 是 | -| MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS | [GLenum](#GLenum) | 是 | -| MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS | [GLenum](#GLenum) | 是 | -| UNIFORM_BUFFER_OFFSET_ALIGNMENT | [GLenum](#GLenum) | 是 | -| ACTIVE_UNIFORM_BLOCKS | [GLenum](#GLenum) | 是 | -| UNIFORM_TYPE | [GLenum](#GLenum) | 是 | -| UNIFORM_SIZE | [GLenum](#GLenum) | 是 | -| UNIFORM_BLOCK_INDEX | [GLenum](#GLenum) | 是 | -| UNIFORM_OFFSET | [GLenum](#GLenum) | 是 | -| UNIFORM_ARRAY_STRIDE | [GLenum](#GLenum) | 是 | -| UNIFORM_MATRIX_STRIDE | [GLenum](#GLenum) | 是 | -| UNIFORM_IS_ROW_MAJOR | [GLenum](#GLenum) | 是 | -| UNIFORM_BLOCK_BINDING | [GLenum](#GLenum) | 是 | -| UNIFORM_BLOCK_DATA_SIZE | [GLenum](#GLenum) | 是 | -| UNIFORM_BLOCK_ACTIVE_UNIFORMS | [GLenum](#GLenum) | 是 | -| UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES | [GLenum](#GLenum) | 是 | -| UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER | [GLenum](#GLenum) | 是 | -| UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER | [GLenum](#GLenum) | 是 | -| INVALID_INDEX | [GLenum](#GLenum) | 是 | -| MAX_VERTEX_OUTPUT_COMPONENTS | [GLenum](#GLenum) | 是 | -| MAX_FRAGMENT_INPUT_COMPONENTS | [GLenum](#GLenum) | 是 | -| MAX_SERVER_WAIT_TIMEOUT | [GLenum](#GLenum) | 是 | -| OBJECT_TYPE | [GLenum](#GLenum) | 是 | -| SYNC_CONDITION | [GLenum](#GLenum) | 是 | -| SYNC_STATUS | [GLenum](#GLenum) | 是 | -| SYNC_FLAGS | [GLenum](#GLenum) | 是 | -| SYNC_FENCE | [GLenum](#GLenum) | 是 | -| SYNC_GPU_COMMANDS_COMPLETE | [GLenum](#GLenum) | 是 | -| UNSIGNALED | [GLenum](#GLenum) | 是 | -| SIGNALED | [GLenum](#GLenum) | 是 | -| ALREADY_SIGNALED | [GLenum](#GLenum) | 是 | -| TIMEOUT_EXPIRED | [GLenum](#GLenum) | 是 | -| CONDITION_SATISFIED | [GLenum](#GLenum) | 是 | -| WAIT_FAILED | [GLenum](#GLenum) | 是 | -| SYNC_FLUSH_COMMANDS_BIT | [GLenum](#GLenum) | 是 | -| VERTEX_ATTRIB_ARRAY_DIVISOR | [GLenum](#GLenum) | 是 | -| ANY_SAMPLES_PASSED | [GLenum](#GLenum) | 是 | -| ANY_SAMPLES_PASSED_CONSERVATIVE | [GLenum](#GLenum) | 是 | -| SAMPLER_BINDING | [GLenum](#GLenum) | 是 | -| RGB10_A2UI | [GLenum](#GLenum) | 是 | -| INT_2_10_10_10_REV | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_PAUSED | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_ACTIVE | [GLenum](#GLenum) | 是 | -| TRANSFORM_FEEDBACK_BINDING | [GLenum](#GLenum) | 是 | -| TEXTURE_IMMUTABLE_FORMAT | [GLenum](#GLenum) | 是 | -| MAX_ELEMENT_INDEX | [GLenum](#GLenum) | 是 | -| TEXTURE_IMMUTABLE_LEVELS | [GLenum](#GLenum) | 是 | -| TIMEOUT_IGNORED | [GLenum](#GLenum) | 是 | -| MAX_CLIENT_WAIT_TIMEOUT_WEBGL | [GLenum](#GLenum) | 是 | - - -### 方法 - -| 方法 | 返回值类型 | -| -------- | ---------- | -| copyBufferSubData(readTarget:  GLenum,  writeTarget:  GLenum,  readOffset:  GLintptr,  writeOffset:  GLintptr,  size:  GLsizeiptr) | void | -| getBufferSubData(target:  GLenum,  srcByteOffset:  GLintptr,  dstBuffer:  ArrayBufferView,  dstOffset?:  GLuint,  length?:  GLuint) | void | -| blitFramebuffer(srcX0:  GLint,  srcY0:  GLint,  srcX1:  GLint,  srcY1:  GLint,  dstX0:  GLint,  dstY0:  GLint,  dstX1:  GLint,  dstY1:  GLint,  mask:  GLbitfield,  filter:  GLenum) | void | -| framebufferTextureLayer(target:  GLenum,  attachment:  GLenum,  texture:  WebGLTexture \| null,  level:  GLint,  layer:  GLint) | void | -| invalidateFramebuffer(target:  GLenum,  attachments:  GLenum[]) | void | -| invalidateSubFramebuffer(target:  GLenum,  attachments:  GLenum[],  x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei) | void | -| readBuffer(src:  GLenum) | void | -| getInternalformatParameter(target:  GLenum,  internalformat:  GLenum,  pname:  GLenum) | any | -| renderbufferStorageMultisample(target:  GLenum,  samples:  GLsizei,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei) | void | -| texStorage2D(target:  GLenum,  levels:  GLsizei,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei) | void | -| texStorage3D(target:  GLenum,  levels:  GLsizei,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView \| null) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView,  srcOffset:  GLuint) | void | -| texSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView \| null,  srcOffset?:  GLuint) | void | -| copyTexSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei) | void | -| compressedTexImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| compressedTexSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| getFragDataLocation(program:  WebGLProgram,  name:  string) | GLint | -| uniform1ui(location:  WebGLUniformLocation \| null,  v0:  GLuint) | void | -| uniform2ui(location:  WebGLUniformLocation \| null,  v0:  GLuint,  v1:  GLuint) | void | -| uniform3ui(location:  WebGLUniformLocation \| null,  v0:  GLuint,  v1:  GLuint,  v2:  GLuint) | void | -| uniform4ui(location:  WebGLUniformLocation \| null,  v0:  GLuint,  v1:  GLuint,  v2:  GLuint,  v3:  GLuint) | void | -| uniform1uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform2uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform3uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform4uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix3x2fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix4x2fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix2x3fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix4x3fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix2x4fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix3x4fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| vertexAttribI4i(index:  GLuint,  x:  GLint,  y:  GLint,  z:  GLint,  w:  GLint) | void | -| vertexAttribI4iv(index:  GLuint,  values:  Int32List) | void | -| vertexAttribI4ui(index:  GLuint,  x:  GLuint,  y:  GLuint,  z:  GLuint,  w:  GLuint) | void | -| vertexAttribI4uiv(index:  GLuint,  values:  Uint32List) | void | -| vertexAttribIPointer(index:  GLuint,  size:  GLint,  type:  GLenum,  stride:  GLsizei,  offset:  GLintptr) | void | -| vertexAttribDivisor(index:  GLuint,  divisor:  GLuint) | void | -| drawArraysInstanced(mode:  GLenum,  first:  GLint,  count:  GLsizei,  instanceCount:  GLsizei) | void | -| drawElementsInstanced(mode:  GLenum,  count:  GLsizei,  type:  GLenum,  offset:  GLintptr,  instanceCount:  GLsizei) | void | -| drawRangeElements(mode:  GLenum,  start:  GLuint,  end:  GLuint,  count:  GLsizei,  type:  GLenum,  offset:  GLintptr) | void | -| drawBuffers(buffers:  GLenum[]) | void | -| clearBufferfv(buffer:  GLenum,  drawbuffer:  GLint,  values:  Float32List,  srcOffset?:  GLuint) | void | -| clearBufferiv(buffer:  GLenum,  drawbuffer:  GLint,  values:  Int32List,  srcOffset?:  GLuint) | void | -| clearBufferuiv(buffer:  GLenum,  drawbuffer:  GLint,  values:  Uint32List,  srcOffset?:  GLuint) | void | -| clearBufferfi(buffer:  GLenum,  drawbuffer:  GLint,  depth:  GLfloat,  stencil:  GLint) | void | -| createQuery() | WebGLQuery \| null | -| deleteQuery(query:  WebGLQuery \| null) | void | -| isQuery(query:  WebGLQuery \| null) | GLboolean | -| beginQuery(target:  GLenum,  query:  WebGLQuery) | void | -| endQuery(target:  GLenum) | void | -| getQuery(target:  GLenum,  pname:  GLenum) | WebGLQuery \| null | -| getQueryParameter(query:  WebGLQuery,  pname:  GLenum) | any | -| createSampler() | WebGLSampler \| null | -| deleteSampler(sampler:  WebGLSampler \| null) | void | -| isSampler(sampler:  WebGLSampler \| null) | GLboolean | -| bindSampler(unit:  GLuint,  sampler:  WebGLSampler \| null) | void | -| samplerParameteri(sampler:  WebGLSampler,  pname:  GLenum,  param:  GLint) | void | -| samplerParameterf(sampler:  WebGLSampler,  pname:  GLenum,  param:  GLfloat) | void | -| getSamplerParameter(sampler:  WebGLSampler,  pname:  GLenum) | any | -| fenceSync(condition:  GLenum,  flags:  GLbitfield) | WebGLSync \| null | -| isSync(sync:  WebGLSync \| null) | GLboolean | -| deleteSync(sync:  WebGLSync \| null) | void | -| clientWaitSync(sync:  WebGLSync,  flags:  GLbitfield,  timeout:  GLuint64) | GLenum | -| waitSync(sync:  WebGLSync,  flags:  GLbitfield,  timeout:  GLint64) | void | -| getSyncParameter(sync:  WebGLSync,  pname:  GLenum) | any | -| createTransformFeedback() | WebGLTransformFeedback \| null | -| deleteTransformFeedback(tf:  WebGLTransformFeedback \| null) | void | -| isTransformFeedback(tf:  WebGLTransformFeedback \| null) | GLboolean | -| bindTransformFeedback(target:  GLenum,  tf:  WebGLTransformFeedback \| null) | void | -| beginTransformFeedback(primitiveMode:  GLenum) | void | -| endTransformFeedback() | void | -| transformFeedbackVaryings(program:  WebGLProgram,  varyings:  string[],  bufferMode:  GLenum) | void | -| getTransformFeedbackVarying(program:  WebGLProgram,  index:  GLuint) | WebGLActiveInfo \| null | -| pauseTransformFeedback() | void | -| resumeTransformFeedback() | void | -| bindBufferBase(target:  GLenum,  index:  GLuint,  buffer:  WebGLBuffer \| null) | void | -| bindBufferRange(target:  GLenum,  index:  GLuint,  buffer:  WebGLBuffer \| null,  offset:  GLintptr,  size:  GLsizeiptr) | void | -| getIndexedParameter(target:  GLenum,  index:  GLuint) | any | -| getUniformIndices(program:  WebGLProgram,  uniformNames:  string[]) | GLuint[] \| null | -| getActiveUniforms(program:  WebGLProgram,  uniformIndices:  GLuint[],  pname:  GLenum) | any | -| getUniformBlockIndex(program:  WebGLProgram,  uniformBlockName:  string) | GLuint | -| getActiveUniformBlockParameter(program:  WebGLProgram,  uniformBlockIndex:  GLuint,  pname:  GLenum) | any | -| getActiveUniformBlockName(program:  WebGLProgram,  uniformBlockIndex:  GLuint) | string \| null | -| uniformBlockBinding(program:  WebGLProgram,  uniformBlockIndex:  GLuint,  uniformBlockBinding:  GLuint) | void | -| createVertexArray() | WebGLVertexArrayObject \| null | -| deleteVertexArray(vertexArray:  WebGLVertexArrayObject \| null) | void | -| isVertexArray(vertexArray:  WebGLVertexArrayObject \| null) | GLboolean | -| bindVertexArray(array:  WebGLVertexArrayObject \| null) | void | - - -## webgl.WebGL2RenderingContextOverloads - -WebGL2RenderingContextOverloads - -| 方法 | 返回值类型 | -| -------- | ---------- | -| bufferData(target:  GLenum,  size:  GLsizeiptr,  usage:  GLenum) | void | -| bufferData(target:  GLenum,  srcData:  BufferSource \| null,  usage:  GLenum) | void | -| bufferSubData(target:  GLenum,  dstByteOffset:  GLintptr,  srcData:  BufferSource) | void | -| bufferData(target:  GLenum,  srcData:  ArrayBufferView,  usage:  GLenum,  srcOffset:  GLuint,  length?:  GLuint) | void | -| bufferSubData(target:  GLenum,  dstByteOffset:  GLintptr,  srcData:  ArrayBufferView,  srcOffset:  GLuint,  length?:  GLuint) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  pixels:  ArrayBufferView \| null) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  pixels:  ArrayBufferView \| null) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView,  srcOffset:  GLuint) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView,  srcOffset:  GLuint) | void | -| compressedTexImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| compressedTexSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| uniform1fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform2fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform3fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform4fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform1iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform2iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform3iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform4iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix2fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix3fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix4fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| readPixels(x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  dstData:  ArrayBufferView \| null) | void | -| readPixels(x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  offset:  GLintptr) | void | -| readPixels(x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  dstData:  ArrayBufferView,  dstOffset:  GLuint) | void | - - -## webgl.WebGLQuery - -WebGLQuery - - -## webgl.WebGLSampler - -WebGLSampler - - -## webgl.WebGLSync - -WebGLSync - - -## webgl.WebGLTransformFeedback - -WebGLTransformFeedback - - -## webgl.WebGLVertexArrayObject - -WebGLVertexArrayObject \ No newline at end of file +# webgl2 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) ** 说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +WebGL标准图形API,对应OpenGL ES 3.0特性集。更多信息请参考[WebGL™标准](https://www.khronos.org/registry/webgl/specs/latest/2.0/)。 + + +## 导入模块 + +``` +import webgl from '@ohos.webglnapi' +``` + + +## 调用方式 + +hml内创建canvas,示例如下: + + +``` +
+ + +
+``` + +js内获取canvas实例,示例如下: + + +``` +// 获取canvas组件实例 +const el = this.$refs.canvas1; +// 从canvas组件实例获取WebGL上下文 +const gl = el.getContext('webgl'); +// 调用WebGL API +gl.clearColor(0.0, 0.0, 0.0, 1.0); +``` + + +## Type + + ** 表1** Type + +| 名称 | 类型 | 说明 | +| -------- | -------- | -------- | +| GLenum | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| GLint64 | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| GLuint64 | number | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| Uint32List | array | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | + + +## Interface + + ** 表2** Interface + +| 名称 | 说明 | +| -------- | -------- | +| [WebGL2RenderingContextBase](#webgl2renderingcontextbase) | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| [WebGL2RenderingContextOverloads](#webgl2renderingcontextoverloads) | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLQuery | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLSampler | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLSync | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLTransformFeedback | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLVertexArrayObject | **系统能力:** SystemCapability.Graphic.Graphic2D.WebGL2 | + + +## WebGL2RenderingContextBase + +WebGL2RenderingContextBase + + +### 属性 + + | 名称 | 参数类型 | 必填 | +| -------- | -------- | -------- | +| READ_BUFFER | GLenum | 是 | +| UNPACK_ROW_LENGTH | GLenum | 是 | +| UNPACK_SKIP_ROWS | GLenum | 是 | +| UNPACK_SKIP_PIXELS | GLenum | 是 | +| PACK_ROW_LENGTH | GLenum | 是 | +| PACK_SKIP_ROWS | GLenum | 是 | +| PACK_SKIP_PIXELS | GLenum | 是 | +| COLOR | GLenum | 是 | +| DEPTH | GLenum | 是 | +| STENCIL | GLenum | 是 | +| RED | GLenum | 是 | +| RGB8 | GLenum | 是 | +| RGBA8 | GLenum | 是 | +| RGB10_A2 | GLenum | 是 | +| TEXTURE_BINDING_3D | GLenum | 是 | +| UNPACK_SKIP_IMAGES | GLenum | 是 | +| UNPACK_IMAGE_HEIGHT | GLenum | 是 | +| TEXTURE_3D | GLenum | 是 | +| TEXTURE_WRAP_R | GLenum | 是 | +| MAX_3D_TEXTURE_SIZE | GLenum | 是 | +| UNSIGNED_INT_2_10_10_10_REV | GLenum | 是 | +| MAX_ELEMENTS_VERTICES | GLenum | 是 | +| MAX_ELEMENTS_INDICES | GLenum | 是 | +| TEXTURE_MIN_LOD | GLenum | 是 | +| TEXTURE_MAX_LOD | GLenum | 是 | +| TEXTURE_BASE_LEVEL | GLenum | 是 | +| TEXTURE_MAX_LEVEL | GLenum | 是 | +| MIN | GLenum | 是 | +| MAX | GLenum | 是 | +| DEPTH_COMPONENT24 | GLenum | 是 | +| MAX_TEXTURE_LOD_BIAS | GLenum | 是 | +| TEXTURE_COMPARE_MODE | GLenum | 是 | +| TEXTURE_COMPARE_FUNC | GLenum | 是 | +| CURRENT_QUERY | GLenum | 是 | +| QUERY_RESULT | GLenum | 是 | +| QUERY_RESULT_AVAILABLE | GLenum | 是 | +| STREAM_READ | GLenum | 是 | +| STREAM_COPY | GLenum | 是 | +| STATIC_READ | GLenum | 是 | +| STATIC_COPY | GLenum | 是 | +| DYNAMIC_READ | GLenum | 是 | +| DYNAMIC_COPY | GLenum | 是 | +| MAX_DRAW_BUFFERS | GLenum | 是 | +| DRAW_BUFFER0 | GLenum | 是 | +| DRAW_BUFFER1 | GLenum | 是 | +| DRAW_BUFFER2 | GLenum | 是 | +| DRAW_BUFFER3 | GLenum | 是 | +| DRAW_BUFFER4 | GLenum | 是 | +| DRAW_BUFFER5 | GLenum | 是 | +| DRAW_BUFFER6 | GLenum | 是 | +| DRAW_BUFFER7 | GLenum | 是 | +| DRAW_BUFFER8 | GLenum | 是 | +| DRAW_BUFFER9 | GLenum | 是 | +| DRAW_BUFFER10 | GLenum | 是 | +| DRAW_BUFFER11 | GLenum | 是 | +| DRAW_BUFFER12 | GLenum | 是 | +| DRAW_BUFFER13 | GLenum | 是 | +| DRAW_BUFFER14 | GLenum | 是 | +| DRAW_BUFFER15 | GLenum | 是 | +| MAX_FRAGMENT_UNIFORM_COMPONENTS | GLenum | 是 | +| MAX_VERTEX_UNIFORM_COMPONENTS | GLenum | 是 | +| SAMPLER_3D | GLenum | 是 | +| SAMPLER_2D_SHADOW | GLenum | 是 | +| FRAGMENT_SHADER_DERIVATIVE_HINT | GLenum | 是 | +| PIXEL_PACK_BUFFER | GLenum | 是 | +| PIXEL_UNPACK_BUFFER | GLenum | 是 | +| PIXEL_PACK_BUFFER_BINDING | GLenum | 是 | +| PIXEL_UNPACK_BUFFER_BINDING | GLenum | 是 | +| FLOAT_MAT2x3 | GLenum | 是 | +| FLOAT_MAT2x4 | GLenum | 是 | +| FLOAT_MAT3x2 | GLenum | 是 | +| FLOAT_MAT3x4 | GLenum | 是 | +| FLOAT_MAT4x2 | GLenum | 是 | +| FLOAT_MAT4x3 | GLenum | 是 | +| SRGB | GLenum | 是 | +| SRGB8 | GLenum | 是 | +| SRGB8_ALPHA8 | GLenum | 是 | +| COMPARE_REF_TO_TEXTURE | GLenum | 是 | +| RGBA32F | GLenum | 是 | +| RGB32F | GLenum | 是 | +| RGBA16F | GLenum | 是 | +| RGB16F | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_INTEGER | GLenum | 是 | +| MAX_ARRAY_TEXTURE_LAYERS | GLenum | 是 | +| MIN_PROGRAM_TEXEL_OFFSET | GLenum | 是 | +| MAX_PROGRAM_TEXEL_OFFSET | GLenum | 是 | +| MAX_VARYING_COMPONENTS | GLenum | 是 | +| TEXTURE_2D_ARRAY | GLenum | 是 | +| TEXTURE_BINDING_2D_ARRAY | GLenum | 是 | +| R11F_G11F_B10F | GLenum | 是 | +| UNSIGNED_INT_10F_11F_11F_REV | GLenum | 是 | +| RGB9_E5 | GLenum | 是 | +| UNSIGNED_INT_5_9_9_9_REV | GLenum | 是 | +| TRANSFORM_FEEDBACK_BUFFER_MODE | GLenum | 是 | +| MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS | GLenum | 是 | +| TRANSFORM_FEEDBACK_VARYINGS | GLenum | 是 | +| TRANSFORM_FEEDBACK_BUFFER_START | GLenum | 是 | +| TRANSFORM_FEEDBACK_BUFFER_SIZE | GLenum | 是 | +| TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN | GLenum | 是 | +| RASTERIZER_DISCARD | GLenum | 是 | +| MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS | GLenum | 是 | +| MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS | GLenum | 是 | +| INTERLEAVED_ATTRIBS | GLenum | 是 | +| SEPARATE_ATTRIBS | GLenum | 是 | +| TRANSFORM_FEEDBACK_BUFFER | GLenum | 是 | +| TRANSFORM_FEEDBACK_BUFFER_BINDING | GLenum | 是 | +| RGBA32UI | GLenum | 是 | +| RGB32UI | GLenum | 是 | +| RGBA16UI | GLenum | 是 | +| RGB16UI | GLenum | 是 | +| RGBA8UI | GLenum | 是 | +| RGB8UI | GLenum | 是 | +| RGBA32I | GLenum | 是 | +| RGB32I | GLenum | 是 | +| RGBA16I | GLenum | 是 | +| RGB16I | GLenum | 是 | +| RGBA8I | GLenum | 是 | +| RGB8I | GLenum | 是 | +| RED_INTEGER | GLenum | 是 | +| RGB_INTEGER | GLenum | 是 | +| RGBA_INTEGER | GLenum | 是 | +| SAMPLER_2D_ARRAY | GLenum | 是 | +| SAMPLER_2D_ARRAY_SHADOW | GLenum | 是 | +| SAMPLER_CUBE_SHADOW | GLenum | 是 | +| UNSIGNED_INT_VEC2 | GLenum | 是 | +| UNSIGNED_INT_VEC3 | GLenum | 是 | +| UNSIGNED_INT_VEC4 | GLenum | 是 | +| INT_SAMPLER_2D | GLenum | 是 | +| INT_SAMPLER_3D | GLenum | 是 | +| INT_SAMPLER_CUBE | GLenum | 是 | +| INT_SAMPLER_2D_ARRAY | GLenum | 是 | +| UNSIGNED_INT_SAMPLER_2D | GLenum | 是 | +| UNSIGNED_INT_SAMPLER_3D | GLenum | 是 | +| UNSIGNED_INT_SAMPLER_CUBE | GLenum | 是 | +| UNSIGNED_INT_SAMPLER_2D_ARRAY | GLenum | 是 | +| DEPTH_COMPONENT32F | GLenum | 是 | +| DEPTH32F_STENCIL8 | GLenum | 是 | +| FLOAT_32_UNSIGNED_INT_24_8_REV | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_RED_SIZE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_GREEN_SIZE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_BLUE_SIZE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE | GLenum | 是 | +| FRAMEBUFFER_DEFAULT | GLenum | 是 | +| UNSIGNED_INT_24_8 | GLenum | 是 | +| DEPTH24_STENCIL8 | GLenum | 是 | +| UNSIGNED_NORMALIZED | GLenum | 是 | +| DRAW_FRAMEBUFFER_BINDING | GLenum | 是 | +| READ_FRAMEBUFFER | GLenum | 是 | +| DRAW_FRAMEBUFFER | GLenum | 是 | +| READ_FRAMEBUFFER_BINDING | GLenum | 是 | +| RENDERBUFFER_SAMPLES | GLenum | 是 | +| FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER | GLenum | 是 | +| MAX_COLOR_ATTACHMENTS | GLenum | 是 | +| COLOR_ATTACHMENT1 | GLenum | 是 | +| COLOR_ATTACHMENT2 | GLenum | 是 | +| COLOR_ATTACHMENT3 | GLenum | 是 | +| COLOR_ATTACHMENT4 | GLenum | 是 | +| COLOR_ATTACHMENT5 | GLenum | 是 | +| COLOR_ATTACHMENT6 | GLenum | 是 | +| COLOR_ATTACHMENT7 | GLenum | 是 | +| COLOR_ATTACHMENT8 | GLenum | 是 | +| COLOR_ATTACHMENT9 | GLenum | 是 | +| COLOR_ATTACHMENT10 | GLenum | 是 | +| COLOR_ATTACHMENT11 | GLenum | 是 | +| COLOR_ATTACHMENT12 | GLenum | 是 | +| COLOR_ATTACHMENT13 | GLenum | 是 | +| COLOR_ATTACHMENT14 | GLenum | 是 | +| COLOR_ATTACHMENT15 | GLenum | 是 | +| FRAMEBUFFER_INCOMPLETE_MULTISAMPLE | GLenum | 是 | +| MAX_SAMPLES | GLenum | 是 | +| HALF_FLOAT | GLenum | 是 | +| RG | GLenum | 是 | +| RG_INTEGER | GLenum | 是 | +| R8 | GLenum | 是 | +| RG8 | GLenum | 是 | +| R16F | GLenum | 是 | +| R32F | GLenum | 是 | +| RG16F | GLenum | 是 | +| RG32F | GLenum | 是 | +| R8I | GLenum | 是 | +| R8UI | GLenum | 是 | +| R16I | GLenum | 是 | +| R16UI | GLenum | 是 | +| R32I | GLenum | 是 | +| R32UI | GLenum | 是 | +| RG8I | GLenum | 是 | +| RG8UI | GLenum | 是 | +| RG16I | GLenum | 是 | +| RG16UI | GLenum | 是 | +| RG32I | GLenum | 是 | +| RG32UI | GLenum | 是 | +| VERTEX_ARRAY_BINDING | GLenum | 是 | +| R8_SNORM | GLenum | 是 | +| RG8_SNORM | GLenum | 是 | +| RGB8_SNORM | GLenum | 是 | +| SIGNED_NORMALIZED | GLenum | 是 | +| COPY_READ_BUFFER | GLenum | 是 | +| COPY_WRITE_BUFFER | GLenum | 是 | +| COPY_READ_BUFFER_BINDING | GLenum | 是 | +| COPY_WRITE_BUFFER_BINDING | GLenum | 是 | +| UNIFORM_BUFFER | GLenum | 是 | +| UNIFORM_BUFFER_BINDING | GLenum | 是 | +| UNIFORM_BUFFER_START | GLenum | 是 | +| UNIFORM_BUFFER_SIZE | GLenum | 是 | +| MAX_VERTEX_UNIFORM_BLOCKS | GLenum | 是 | +| MAX_FRAGMENT_UNIFORM_BLOCKS | GLenum | 是 | +| MAX_COMBINED_UNIFORM_BLOCKS | GLenum | 是 | +| MAX_UNIFORM_BUFFER_BINDINGS | GLenum | 是 | +| MAX_UNIFORM_BLOCK_SIZE | GLenum | 是 | +| MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS | GLenum | 是 | +| MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS | GLenum | 是 | +| UNIFORM_BUFFER_OFFSET_ALIGNMENT | GLenum | 是 | +| ACTIVE_UNIFORM_BLOCKS | GLenum | 是 | +| UNIFORM_TYPE | GLenum | 是 | +| UNIFORM_SIZE | GLenum | 是 | +| UNIFORM_BLOCK_INDEX | GLenum | 是 | +| UNIFORM_OFFSET | GLenum | 是 | +| UNIFORM_ARRAY_STRIDE | GLenum | 是 | +| UNIFORM_MATRIX_STRIDE | GLenum | 是 | +| UNIFORM_IS_ROW_MAJOR | GLenum | 是 | +| UNIFORM_BLOCK_BINDING | GLenum | 是 | +| UNIFORM_BLOCK_DATA_SIZE | GLenum | 是 | +| UNIFORM_BLOCK_ACTIVE_UNIFORMS | GLenum | 是 | +| UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES | GLenum | 是 | +| UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER | GLenum | 是 | +| UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER | GLenum | 是 | +| INVALID_INDEX | GLenum | 是 | +| MAX_VERTEX_OUTPUT_COMPONENTS | GLenum | 是 | +| MAX_FRAGMENT_INPUT_COMPONENTS | GLenum | 是 | +| MAX_SERVER_WAIT_TIMEOUT | GLenum | 是 | +| OBJECT_TYPE | GLenum | 是 | +| SYNC_CONDITION | GLenum | 是 | +| SYNC_STATUS | GLenum | 是 | +| SYNC_FLAGS | GLenum | 是 | +| SYNC_FENCE | GLenum | 是 | +| SYNC_GPU_COMMANDS_COMPLETE | GLenum | 是 | +| UNSIGNALED | GLenum | 是 | +| SIGNALED | GLenum | 是 | +| ALREADY_SIGNALED | GLenum | 是 | +| TIMEOUT_EXPIRED | GLenum | 是 | +| CONDITION_SATISFIED | GLenum | 是 | +| WAIT_FAILED | GLenum | 是 | +| SYNC_FLUSH_COMMANDS_BIT | GLenum | 是 | +| VERTEX_ATTRIB_ARRAY_DIVISOR | GLenum | 是 | +| ANY_SAMPLES_PASSED | GLenum | 是 | +| ANY_SAMPLES_PASSED_CONSERVATIVE | GLenum | 是 | +| SAMPLER_BINDING | GLenum | 是 | +| RGB10_A2UI | GLenum | 是 | +| INT_2_10_10_10_REV | GLenum | 是 | +| TRANSFORM_FEEDBACK | GLenum | 是 | +| TRANSFORM_FEEDBACK_PAUSED | GLenum | 是 | +| TRANSFORM_FEEDBACK_ACTIVE | GLenum | 是 | +| TRANSFORM_FEEDBACK_BINDING | GLenum | 是 | +| TEXTURE_IMMUTABLE_FORMAT | GLenum | 是 | +| MAX_ELEMENT_INDEX | GLenum | 是 | +| TEXTURE_IMMUTABLE_LEVELS | GLenum | 是 | +| TIMEOUT_IGNORED | GLint64 | 是 | +| MAX_CLIENT_WAIT_TIMEOUT_WEBGL | GLenum | 是 | + + +### 方法 + + | 方法 | 返回值类型 | +| -------- | -------- | +| copyBufferSubData(readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) | void | +| getBufferSubData(target: GLenum, srcByteOffset: GLintptr, dstBuffer: ArrayBufferView, dstOffset?: GLuint, length?: GLuint) | void | +| blitFramebuffer(srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum) | void | +| framebufferTextureLayer(target: GLenum, attachment: GLenum, texture: WebGLTexture \| null, level: GLint, layer: GLint) | void | +| invalidateFramebuffer(target: GLenum, attachments: GLenum[]) | void | +| invalidateSubFramebuffer(target: GLenum, attachments: GLenum[], x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| readBuffer(src: GLenum) | void | +| getInternalformatParameter(target: GLenum, internalformat: GLenum, pname: GLenum) | any | +| renderbufferStorageMultisample(target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | +| texStorage2D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | +| texStorage3D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView \| null) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint) | void | +| texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView \| null, srcOffset?: GLuint) | void | +| copyTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| getFragDataLocation(program: WebGLProgram, name: string) | GLint | +| uniform1ui(location: WebGLUniformLocation \| null, v0: GLuint) | void | +| uniform2ui(location: WebGLUniformLocation \| null, v0: GLuint, v1: GLuint) | void | +| uniform3ui(location: WebGLUniformLocation \| null, v0: GLuint, v1: GLuint, v2: GLuint) | void | +| uniform4ui(location: WebGLUniformLocation \| null, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint) | void | +| uniform1uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform2uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform3uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform4uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix3x2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix4x2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix2x3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix4x3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix2x4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix3x4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| vertexAttribI4i(index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint) | void | +| vertexAttribI4iv(index: GLuint, values: Int32List) | void | +| vertexAttribI4ui(index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) | void | +| vertexAttribI4uiv(index: GLuint, values: Uint32List) | void | +| vertexAttribIPointer(index: GLuint, size: GLint, type: GLenum, stride: GLsizei, offset: GLintptr) | void | +| vertexAttribDivisor(index: GLuint, divisor: GLuint) | void | +| drawArraysInstanced(mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei) | void | +| drawElementsInstanced(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, instanceCount: GLsizei) | void | +| drawRangeElements(mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, offset: GLintptr) | void | +| drawBuffers(buffers: GLenum[]) | void | +| clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Float32List, srcOffset?: GLuint) | void | +| clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Int32List, srcOffset?: GLuint) | void | +| clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Uint32List, srcOffset?: GLuint) | void | +| clearBufferfi(buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint) | void | +| createQuery() | WebGLQuery \| null | +| deleteQuery(query: WebGLQuery \| null) | void | +| isQuery(query: WebGLQuery \| null) | GLboolean | +| beginQuery(target: GLenum, query: WebGLQuery) | void | +| endQuery(target: GLenum) | void | +| getQuery(target: GLenum, pname: GLenum) | WebGLQuery \| null | +| getQueryParameter(query: WebGLQuery, pname: GLenum) | any | +| createSampler() | WebGLSampler \| null | +| deleteSampler(sampler: WebGLSampler \| null) | void | +| isSampler(sampler: WebGLSampler \| null) | GLboolean | +| bindSampler(unit: GLuint, sampler: WebGLSampler \| null) | void | +| samplerParameteri(sampler: WebGLSampler, pname: GLenum, param: GLint) | void | +| samplerParameterf(sampler: WebGLSampler, pname: GLenum, param: GLfloat) | void; | +| getSamplerParameter(sampler: WebGLSampler, pname: GLenum) | any | +| fenceSync(condition: GLenum, flags: GLbitfield) | WebGLSync \| null | +| isSync(sync: WebGLSync \| null) | GLboolean | +| deleteSync(sync: WebGLSync \| null) | void | +| clientWaitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLuint64) | GLenum | +| waitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLint64) | void | +| getSyncParameter(sync: WebGLSync, pname: GLenum) | any | +| createTransformFeedback() | WebGLTransformFeedback \| null | +| deleteTransformFeedback(tf: WebGLTransformFeedback \| null) | void | +| isTransformFeedback(tf: WebGLTransformFeedback \| null) | GLboolean | +| bindTransformFeedback(target: GLenum, tf: WebGLTransformFeedback \| null) | void | +| beginTransformFeedback(primitiveMode: GLenum) | void | +| endTransformFeedback() | void | +| transformFeedbackVaryings(program: WebGLProgram, varyings: string[], bufferMode: GLenum) | void | +| getTransformFeedbackVarying(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | +| pauseTransformFeedback() | void | +| resumeTransformFeedback() | void | +| bindBufferBase(target: GLenum, index: GLuint, buffer: WebGLBuffer \| null) | void | +| bindBufferRange(target: GLenum, index: GLuint, buffer: WebGLBuffer \| null, offset: GLintptr, size: GLsizeiptr) | void | +| getIndexedParameter(target: GLenum, index: GLuint) | any | +| getUniformIndices(program: WebGLProgram, uniformNames: string[]) | GLuint[] \| null | +| getActiveUniforms(program: WebGLProgram, uniformIndices: GLuint[], pname: GLenum) | any | +| getUniformBlockIndex(program: WebGLProgram, uniformBlockName: string) | GLuint | +| getActiveUniformBlockParameter(program: WebGLProgram, uniformBlockIndex: GLuint, pname: GLenum) | any | +| getActiveUniformBlockName(program: WebGLProgram, uniformBlockIndex: GLuint) | string \| null | +| uniformBlockBinding(program: WebGLProgram, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint) | void | +| createVertexArray() | WebGLVertexArrayObject \| null | +| deleteVertexArray(vertexArray: WebGLVertexArrayObject \| null) | void | +| isVertexArray(vertexArray: WebGLVertexArrayObject \| null) | GLboolean | +| bindVertexArray(array: WebGLVertexArrayObject \| null) | void | + + +## WebGL2RenderingContextOverloads + +WebGL2RenderingContextOverloads + + | 方法 | 返回值类型 | +| -------- | -------- | +| bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum) | void | +| bufferData(target: GLenum, srcData: BufferSource \| null, usage: GLenum) | void | +| bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: BufferSource) | void | +| bufferData(target: GLenum, srcData: ArrayBufferView, usage: GLenum, srcOffset: GLuint, length?: GLuint) | void | +| bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: ArrayBufferView, srcOffset: GLuint, length?: GLuint) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint) | void | +| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| uniform1fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform2fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform3fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform4fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform1iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform2iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform3iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform4iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView \| null) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, offset: GLintptr) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView, dstOffset: GLuint) | void | -- Gitee From 44372e788cd4b69f69d4e6520235569f3ea4ea65 Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Tue, 1 Mar 2022 16:08:48 +0800 Subject: [PATCH 028/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: Ic5b137ef701cceb527578f680027ca770e851ade --- zh-cn/application-dev/reference/apis/js-apis-media.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 69477e2e0e2..bea1ca77749 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1,4 +1,4 @@ -媒体服务 +#媒体服务 媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。 -- Gitee From 24bbcf1c9dcd9963e17a11f3da766f5f02e3617a Mon Sep 17 00:00:00 2001 From: hwgaizw Date: Tue, 1 Mar 2022 16:09:29 +0800 Subject: [PATCH 029/282] =?UTF-8?q?=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?Signed-off-by:=20hwgaizw=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hwgaizw Change-Id: If77531c14d987c536b5e31681ed06c8793e99901 --- zh-cn/application-dev/reference/apis/js-apis-media.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index bea1ca77749..4bb4bc846c0 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1,4 +1,4 @@ -#媒体服务 +# 媒体服务 媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。 -- Gitee From 16a0ea03055fd9a475ea474f2109dd4bab8e6de9 Mon Sep 17 00:00:00 2001 From: l00520400 Date: Tue, 1 Mar 2022 16:26:53 +0800 Subject: [PATCH 030/282] =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: l00520400 Change-Id: I999fd3a6711aff0762ddfe6699273f1947413efc Signed-off-by: l00520400 --- zh-cn/application-dev/security/Readme-CN.md | 4 ++ .../security/accesstoken-guidelines.md | 45 +++++++++++++++++++ .../security/accesstoken-overview.md | 18 ++++++++ 3 files changed, 67 insertions(+) create mode 100644 zh-cn/application-dev/security/accesstoken-guidelines.md create mode 100644 zh-cn/application-dev/security/accesstoken-overview.md diff --git a/zh-cn/application-dev/security/Readme-CN.md b/zh-cn/application-dev/security/Readme-CN.md index 57303b1522c..37cd1817e37 100644 --- a/zh-cn/application-dev/security/Readme-CN.md +++ b/zh-cn/application-dev/security/Readme-CN.md @@ -10,3 +10,7 @@ - Hap包签名工具 - [Hap包签名工具开发指导](hapsigntool-guidelines.md) + +- 访问控制 + - [访问控制开发概述](accesstoken-overview.md) + - [访问控制开发指导](accesstoken-guidelines.md) diff --git a/zh-cn/application-dev/security/accesstoken-guidelines.md b/zh-cn/application-dev/security/accesstoken-guidelines.md new file mode 100644 index 00000000000..398795358ba --- /dev/null +++ b/zh-cn/application-dev/security/accesstoken-guidelines.md @@ -0,0 +1,45 @@ +# 访问控制开发指导 + +## 场景介绍 + +当应用申请的权限需要用户授权,即申请的权限为user_grant权限时,可以通过权限校验,判断当前调用者是否具备相应权限。 + +## 接口说明 +接口的具体说明可以查阅[API参考](../reference/apis/js-apis-abilityAccessCtrl.md) +| 接口名 | 描述 | +| ------------------------------------------------------------ | ---------------- | +| verifyAccessToken(tokenID: number, permissionName: string): Promise<GrantStatus> | 校验应用是否授予权限,使用Promise方式异步返回结果。 | + +## 开发步骤 +对访问者进行权限校验的开发步骤为: + +1. 获取调用者的身份标识: tokenId +2. 识别需要校验的权限: permissionNameUser +3. 对当前调用者进行权限校验 + +代码示例如下: + +```js + import {describe, beforeEach, afterEach, it, expect} from 'deccjsunit/index' + import abilityAccessCtrl from '@ohos.abilityAccessCtrl' + import bundle from '@ohos.bundle' + + var permissionNameUser = "ohos.permission.ALPHA"; + var bundleFlag = 0; + var tokenID = undefined; + var userID = 100; + var appInfo = await bundle.getApplicationInfo('ohos.acts.security.access_token.normal', bundleFlag, userID); + tokenID = appInfo.accessTokenId; + console.log("AccessTokenTest accessTokenId:" + appInfo.accessTokenId + ", name:" + appInfo.name + + ", bundleName:" + appInfo.bundleName) + var atManager = abilityAccessCtrl.createAtManager(); + var result = await atManager.verifyAccessToken(tokenID, permissionNameUser); + if (result == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { + // 执行操作 + } else { + // 申请动态授权,使用接口:requestPermissionsFromUser + } + +``` +> **说明:** +动态授权申请接口的使用详见[API参考](../reference/apis/js-apis-ability-context.md) \ No newline at end of file diff --git a/zh-cn/application-dev/security/accesstoken-overview.md b/zh-cn/application-dev/security/accesstoken-overview.md new file mode 100644 index 00000000000..4488ab090a7 --- /dev/null +++ b/zh-cn/application-dev/security/accesstoken-overview.md @@ -0,0 +1,18 @@ +# 访问控制开发指南 + +## 功能简介 +ATM(AccessTokenManager)是OpenHarmony上基于AccessToken构建的统一的应用权限管理能力。 + +当前,ATM模块对三方应用提供了权限校验功能,三方应用可以检查当前访问者是否具有所需的权限。 + + +## 基本概念 + +当前,ATM提供的应用权限校验功能是基于统一管理的TokenID(Token identity)。 + +- TokenID:32bits的设备内唯一标识符,用于标识每个应用的Accestoken信息。 +- Accestoken信息:主要包括应用身份标识APPID、用户ID、应用分身索引、应用APL(Ability Privilege Level)、应用权限信息等。 + +## 约束与限制 + + - 三方应用不允许自定义权限,系统权限定义信息详见[权限定义信息](https://gitee.com/openharmony/resources/blob/master/systemres/main/config.json) \ No newline at end of file -- Gitee From 9a735dad8ba3eba2daf2108e55af1b3797c65ee8 Mon Sep 17 00:00:00 2001 From: l00520400 Date: Tue, 1 Mar 2022 16:44:53 +0800 Subject: [PATCH 031/282] Signed-off-by: l00520400 Change-Id: Id4fa807aaa90645904ffd0de4fda6b22d3f26165 Signed-off-by: l00520400 Change-Id: I49b6d615b35f71ab9d869010c4c8e4b95552e223 --- zh-cn/application-dev/security/accesstoken-overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/application-dev/security/accesstoken-overview.md b/zh-cn/application-dev/security/accesstoken-overview.md index 4488ab090a7..1fef21e91a1 100644 --- a/zh-cn/application-dev/security/accesstoken-overview.md +++ b/zh-cn/application-dev/security/accesstoken-overview.md @@ -3,7 +3,7 @@ ## 功能简介 ATM(AccessTokenManager)是OpenHarmony上基于AccessToken构建的统一的应用权限管理能力。 -当前,ATM模块对三方应用提供了权限校验功能,三方应用可以检查当前访问者是否具有所需的权限。 +当前,ATM模块对应用提供了权限校验功能,应用可以检查当前访问者是否具有所需的权限。 ## 基本概念 @@ -15,4 +15,4 @@ ATM(AccessTokenManager)是OpenHarmony上基于AccessToken构建的统一的应 ## 约束与限制 - - 三方应用不允许自定义权限,系统权限定义信息详见[权限定义信息](https://gitee.com/openharmony/resources/blob/master/systemres/main/config.json) \ No newline at end of file + - 应用不允许自定义权限,系统权限定义信息详见[权限定义信息](https://gitee.com/openharmony/resources/blob/master/systemres/main/config.json) \ No newline at end of file -- Gitee From 698f18c2f4bc6c0fba257dbb722c73e17e798041 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 1 Mar 2022 17:00:23 +0800 Subject: [PATCH 032/282] -amend Signed-off-by: YOUR_NAME --- zh-cn/application-dev/reference/apis/js-apis-webgl2.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-webgl2.md b/zh-cn/application-dev/reference/apis/js-apis-webgl2.md index 013597f09d7..7a6147cd44e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-webgl2.md +++ b/zh-cn/application-dev/reference/apis/js-apis-webgl2.md @@ -1,6 +1,6 @@ # webgl2 -> ![icon-note.gif](public_sys-resources/icon-note.gif) ** 说明:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 @@ -41,7 +41,7 @@ gl.clearColor(0.0, 0.0, 0.0, 1.0); ## Type - ** 表1** Type + **表1** Type | 名称 | 类型 | 说明 | | -------- | -------- | -------- | @@ -53,7 +53,7 @@ gl.clearColor(0.0, 0.0, 0.0, 1.0); ## Interface - ** 表2** Interface + **表2** Interface | 名称 | 说明 | | -------- | -------- | -- Gitee From f8b3225c4ac19b57dd0665f27876d5a5190f2ecb Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Tue, 1 Mar 2022 17:17:19 +0800 Subject: [PATCH 033/282] update docs Signed-off-by: ester.zhou --- .../arkui-ts/ts-basic-components-button.md | 4 +- .../reference/arkui-ts/ts-container-column.md | 189 +++++++----------- 2 files changed, 74 insertions(+), 119 deletions(-) diff --git a/en/application-dev/reference/arkui-ts/ts-basic-components-button.md b/en/application-dev/reference/arkui-ts/ts-basic-components-button.md index 0c017d6aff1..8f39a509ef8 100644 --- a/en/application-dev/reference/arkui-ts/ts-basic-components-button.md +++ b/en/application-dev/reference/arkui-ts/ts-basic-components-button.md @@ -9,9 +9,9 @@ The **** component represents a component that can trigger actions. None -## Child Component +## Child Components -This component can contain child components. +This component can contain a single child component. ## APIs diff --git a/en/application-dev/reference/arkui-ts/ts-container-column.md b/en/application-dev/reference/arkui-ts/ts-container-column.md index 5aebfdd7cac..a1638e11f80 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-column.md +++ b/en/application-dev/reference/arkui-ts/ts-container-column.md @@ -1,134 +1,89 @@ -# Column +# Column ->![](../../public_sys-resources/icon-note.gif) **NOTE:** ->This component is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> This component is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version. -The **** component lays out child components vertically. -## Required Permissions +The **** component lays out child components vertically. + + +## Required Permissions None -## Child Components - -This component can contain child components. - -## APIs - -Column\(value:\{space?: Length\}\) - -- Parameters - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Default Value

-

Description

-

space

-

Length

-

No

-

0

-

Space between any two adjacent child components in the vertical layout.

-
- - -## Attributes - - - - - - - - - - - - - - -

Name

-

Type

-

Default Value

-

Description

-

alignItems

-

HorizontalAlign

-

Center

-

Alignment mode of child components in the horizontal direction.

-
- -- HorizontalAlign enums - - - - - - - - - - - - - - - - -

Name

-

Description

-

Start

-

Aligned with the start edge in the same direction as the language in use.

-

Center

-

Center alignment. This is the default alignment mode.

-

End

-

Aligned with the end edge in the same direction as the language in use.

-
- - -## Example + +## Child Components + +Supported + + +## APIs + +Column(value:{space?: Length}) + + +- Parameters + | Name| Type| Mandatory| Default Value| Description| + | -------- | -------- | -------- | -------- | -------- | + | space | Length | No| 0 | Space between two adjacent child components in the vertical layout.| + + +## Attributes + +| Name| Type| Default Value| Description| +| -------- | -------- | -------- | -------- | +| alignItems | HorizontalAlign | HorizontalAlign.Center | Alignment mode of the child components in the horizontal direction.| +| justifyContent8+ | [FlexAlign](ts-container-flex.md) | FlexAlign.Start | Alignment mode of the child components in the vertical direction.| + +- HorizontalAlign enums + | Name| Description| + | -------- | -------- | + | Start | Aligned with the start edge in the same direction as the language in use.| + | Center | Center aligned. This is the default alignment mode.| + | End | Aligned with the end edge in the same direction as the language in use.| + + + +## Example ``` @Entry @Component struct ColumnExample { build() { - Column({ space: 5 }) { - Text('space').fontSize(9).fontColor(0xCCCCCC).width('90%') - Column({ space: 5 }) { - Column().width('100%').height(50).backgroundColor(0xAFEEEE) - Column().width('100%').height(50).backgroundColor(0x00FFFF) - }.width('90%').height(107).border({ width: 1 }) - - Text('alignItems(Start)').fontSize(9).fontColor(0xCCCCCC).width('90%') - Column() { - Column().width('50%').height(50).backgroundColor(0xAFEEEE) - Column().width('50%').height(50).backgroundColor(0x00FFFF) - }.alignItems(HorizontalAlign.Start).width('90%').border({ width: 1 }) - - Text('alignItems(End)').fontSize(9).fontColor(0xCCCCCC).width('90%') - Column() { - Column().width('50%').height(50).backgroundColor(0xAFEEEE) - Column().width('50%').height(50).backgroundColor(0x00FFFF) - }.alignItems(HorizontalAlign.End).width('90%').border({ width: 1 }) + Column() { + Text('space').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column({ space: 5 }) { + Column().width('100%').height(30).backgroundColor(0xAFEEEE) + Column().width('100%').height(30).backgroundColor(0x00FFFF) + }.width('90%').height(100).border({ width: 1 }) + + Text('alignItems(Start)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column() { + Column().width('50%').height(30).backgroundColor(0xAFEEEE) + Column().width('50%').height(30).backgroundColor(0x00FFFF) + }.alignItems(HorizontalAlign.Start).width('90%').border({ width: 1 }) + + Text('alignItems(End)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column() { + Column().width('50%').height(30).backgroundColor(0xAFEEEE) + Column().width('50%').height(30).backgroundColor(0x00FFFF) + }.alignItems(HorizontalAlign.End).width('90%').border({ width: 1 }) + + Text('justifyContent(Center)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column() { + Column().width('30%').height(30).backgroundColor(0xAFEEEE) + Column().width('30%').height(30).backgroundColor(0x00FFFF) + }.height('15%').border({ width: 1 }).justifyContent(FlexAlign.Center) + + Text('justifyContent(End)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column() { + Column().width('30%').height(30).backgroundColor(0xAFEEEE) + Column().width('30%').height(30).backgroundColor(0x00FFFF) + }.height('15%').border({ width: 1 }).justifyContent(FlexAlign.End) }.width('100%').padding({ top: 5 }) } } ``` -![](figures/column.gif) - +![zh-cn_image_0000001219982721](figures/Column.png) -- Gitee From ef38208ba09002a7b74c8e7f2165b6e258b2d0bc Mon Sep 17 00:00:00 2001 From: l00520400 Date: Tue, 1 Mar 2022 17:21:09 +0800 Subject: [PATCH 034/282] add info Signed-off-by: l00520400 Change-Id: Ie986714aa183eb6a25d5c79086364dc83fdc7001 Signed-off-by: l00520400 --- .../reference/apis/js-apis-abilityAccessCtrl.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 2e0ff9bc5d3..f7a50c58358 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md +++ b/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md @@ -216,4 +216,13 @@ let promise = AtManager.getPermissionFlags(tokenID, "ohos.permission.GRANT_SENSI promise.then(data => { console.log(`promise: data->${JSON.stringify(data)}`); }); -``` \ No newline at end of file +``` + +### GrantStatus + +表示授权状态的枚举。 + +| 名称 | 默认值 | 描述 | +| ----------------------------- | ---------------------- | ----------------------- | +| PERMISSION_DENIED | -1 | 表示未授权。 | +| PERMISSION_GRANTED | 0 | 表示已授权。 | \ No newline at end of file -- Gitee From 0b9b6b528f3a463231b8bd9ca95eab051872409a Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 1 Mar 2022 17:47:46 +0800 Subject: [PATCH 035/282] update docs Signed-off-by: shawn_he --- en/device-dev/subsystems/Readme-EN.md | 9 +- .../subsystems/subsys-dfx-hilog-lite.md | 2 +- .../subsys-dfx-hisysevent-listening.md | 208 +++++------ .../subsys-dfx-hisysevent-logging-config.md | 186 ++++++++++ .../subsys-dfx-hisysevent-logging.md | 341 +++++------------- .../subsystems/subsys-dfx-hisysevent-query.md | 103 ++++++ .../subsys-dfx-hisysevent-querying.md | 173 --------- .../subsystems/subsys-dfx-hisysevent.md | 6 +- 8 files changed, 473 insertions(+), 555 deletions(-) create mode 100644 en/device-dev/subsystems/subsys-dfx-hisysevent-logging-config.md create mode 100644 en/device-dev/subsystems/subsys-dfx-hisysevent-query.md delete mode 100644 en/device-dev/subsystems/subsys-dfx-hisysevent-querying.md diff --git a/en/device-dev/subsystems/Readme-EN.md b/en/device-dev/subsystems/Readme-EN.md index 020980c386e..0e088b60b74 100644 --- a/en/device-dev/subsystems/Readme-EN.md +++ b/en/device-dev/subsystems/Readme-EN.md @@ -3,7 +3,6 @@ - [Compilation and Building](subsys-build.md) - [Building Guidelines for Mini and Small Systems](subsys-build-mini-lite.md) - [Building Guidelines for Standard Systems](subsys-build-standard-large.md) - - [Build System Coding Specifications and Best Practices](subsys-build-gn-coding-style-and-best-practice.md) - [Distributed Remote Startup](subsys-remote-start.md) - [Graphics](subsys-graphics.md) - [Graphics](subsys-graphics-overview.md) @@ -80,12 +79,10 @@ - [Testing](subsys-testguide-test.md) - [DFX](subsys-dfx.md) - [DFX](subsys-dfx-overview.md) - - [Development Guidelines on HiLog ](subsys-dfx-hilog-rich.md) - - [Development Guidelines on HiLog\_Lite](subsys-dfx-hilog-lite.md) - - [HiTrace Development](subsys-dfx-hitrace.md) - - [HiCollie Development](subsys-dfx-hicollie.md) - - [Development Guidelines on HiSysEvent](subsys-dfx-hisysevent.md) + - [HiLog Development](subsys-dfx-hilog-rich.md) + - [HiLog_Lite Development](subsys-dfx-hilog-lite.md) - [HiSysEvent Development](subsys-dfx-hisysevent.md) + - [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md) - [HiSysEvent Logging](subsys-dfx-hisysevent-logging.md) - [HiSysEvent Listening](subsys-dfx-hisysevent-listening.md) - [HiSysEvent Query](subsys-dfx-hisysevent-query.md) diff --git a/en/device-dev/subsystems/subsys-dfx-hilog-lite.md b/en/device-dev/subsystems/subsys-dfx-hilog-lite.md index 432bb0d18f9..6f65a7c76ec 100644 --- a/en/device-dev/subsystems/subsys-dfx-hilog-lite.md +++ b/en/device-dev/subsystems/subsys-dfx-hilog-lite.md @@ -1,4 +1,4 @@ -# Development Guidelines on HiLog\_Lite +# HiLog\_Lite Development ## Overview diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md index f36ae618c20..b7106bf6f4e 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md @@ -1,146 +1,124 @@ # HiSysEvent Listening +- [Overview](#section315316685112) + - [Introduction](#section123181433335224) + - [Constraints](#section123181433375224) +- [Development Guidelines](#section315316685113) + - [Available APIs](#section0342191810519) + - [Development Example](#section123181432175110) + ## Overview -HiSysEvent supports listening for events across processes. You can register a listener to listen for concerned events on a real-time basis. For example, you can enable the battery module to listen for power consumption event for power usage analysis. - -## Available APIs - -**Table 1** HiSysEvent listener APIs - - - - - - - - - - - - - -

API

-

Description

-

bool HiSysEventManager::AddEventListener(std::shared_ptr<HiSysEventSubscribeCallBack> listener, std::vector<struct ListenerRule>& rules)

-

Registers a listener for system events. You can listen for certain events by specifying rules.

-

Input arguments:

-
  • listener: callback object for system events.
  • rules: rules for event listening.
-

Return values

-
  • 0: Repeated registration is successful.
  • 1: Initial registration is successful.
  • Other values: Registration has failed.
-

bool HiSysEventManager::RemoveListener(std::shared_ptr<HiSysEventSubscribeCallBack> listener)

-

Removes the listener for system events.

-

Input arguments:

-
  • listener: callback object for system events.
-

Return value: none

-
- -**Table 2** HiSysEvent listener rules - - - - - - - - - - - - - - - - -

Attribute

-

Description

-

uint32_t ruleType

-

Rule type. The matching scope includes domain and eventName. The value can be any of the following:

-
  • 1: whole word matching.
  • 2: prefix matching.
  • 3: regular expression matching.
  • Other values: invalid matching mode.
-

std::string domain

-
  • domain: domain to which the event belongs. By default, an empty string indicates that the domain is successfully matched.
-

std::string eventName

-
  • eventName: event name. By default, an empty string indicates that the event name is successfully matched.
-
- -**Table 3** HiSysEvent callback object - - - - - - - - - - -

API

-

Description

-

void HiSysEventSubscribeCallBack::OnHandle(const std::string& domain, const std::string& eventName, const int eventType, const std::string& eventDetail)

-

Callback object for system events.

-

Input arguments:

-
  • domain: domain to which the event belongs.
  • eventName: event name.
  • eventType: event type.
  • eventDetail: JSON string containing event information.
-

Return value: none

-
- -## How to Develop - -### **C++** - -In this example, you'll be instructed to register a listener for all system events that belong to the **HIVIEWDFX** domain. +### Introduction + +HiSysEvent supports listening for events across processes. You can register a listener to listen for concerned events on a real-time basis. For example, you can enable the battery module to listen for power consumption events for power usage analysis. + +### Constraints + +Before subscribing to system events, you need to configure HiSysEvent logging. For details, see [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md). + +## Development Guidelines + +### Available APIs + +**Table 1** EventListener APIs + +| API| Description| +| -------- | --------- | +|bool HiSysEventManager::AddEventListener(std::shared_ptr<HiSysEventSubscribeCallBackBase> listener, std::vector<ListenerRule>& rules)|Registers a listener for system events. You can listen for certain events by specifying rules.

Input arguments:
  • **listener**: callback object for system events.
  • **rules**: rules for event listening.
Return value:
  • **0**: Repeated registration is successful.
  • **1**: Initial registration is successful.
  • Other values: Registration has failed.
| +|bool HiSysEventManager::RemoveListener(std::shared_ptr<HiSysEventSubscribeCallBackBase> listener)|Removes the listener for system events.

Input argument:
  • **listener**: callback object for system events.
Return value:
  None.| + +**Table 2** Description of ListenerRule + +| API| Description| +| -------- | --------- | +|ListenerRule(const std::string& tag, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event tag.

Input arguments:
  • **tag**: indicates the event tag for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, lowercase letters, and digits.
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| +|ListenerRule(const std::string& domain, const std::string& eventName, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event domain and event name.

Input arguments:
  • **domain**: indicates the event domain for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, digits, and underscores (_).
  • **eventName**: indicates the event name for the **ListenerRule** object. The value is a string of 1 to 32 characters, including uppercase letters, digits, and underscores (_).
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| +|ListenerRule(const std::string& domain, const std::string& eventName, const std::string& tag, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event domain, event name, and event tag.

Input arguments:
  • **tag**: indicates the event tag for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, lowercase letters, and digits.
  • **domain**: indicates the event domain for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, digits, and underscores (_).
  • **eventName**: indicates the event name for the **ListenerRule** object. The value is a string of 1 to 32 characters, including uppercase letters, digits, and underscores (_).
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| + +**Table 3** Description of RuleType + +| Enum| Description| +| ------------ | ------------- | +| WHOLE_WORD | Whole word matching| +| PREFIX | Prefix matching| +| REGULAR | Regular expression matching| + +**Table 4** Description of HiSysEventSubscribeCallBackBase + +| API| Description| +| -------- | --------- | +|void HiSysEventSubscribeCallBackBase::OnHandle(const std::string& domain, const std::string& eventName, const int eventType, const std::string& eventDetail)|Provides the callback of system events.

Input arguments:
  • **domain**: indicates the domain to which the event belongs.
  • **eventName**: indicates the event name.
  • **eventType**: indicates the event type.
  • **eventDetail**: indicates the event information, in JSON format.
Return value:
  None.| + +### Development Example + +C++ 1. Develop the source code. - - Import the corresponding header file: + Import the **DemoListener.h** header file, which contains the **DemoListener** class for implementing the custom event callback. - hisysevent\_manager.h + ``` + #ifndef DEMO_LISTENER_H + #define DEMO_LISTENER_H - - Implement the callback API. + #include "hisysevent_subscribe_callback.h" - HiSysEventSubscribeCallBack::OnHandle\(const std::string& domain, const std::string& eventName, const int eventType, const std::string& eventDetail\) + #include - - Register a callback object. + class DemoListener : public OHOS::HiviewDFX::HiSysEventSubscribeCallBackNative { + public: + explicit DemoListener() : HiSysEventSubscribeCallBackNative() {} + void OnHandle(const std::string& domain, const std::string& eventName, const int eventType, + const std::string& eventDetail); + virtual ~DemoListener() {} + void OnServiceDied(); + }; - HiSysEventManager::AddEventListener\(std::shared\_ptr listener, std::vector& rules\) + #endif DEMO_LISTENER_H + ``` + Create the **DemoListener.cpp** file, and add the implementation logic of the custom event callback API in the **DemoListener** class. ``` - // Register a listener for all system events that belong to the HIVIEWDFX domain. - #include "hisysevent_manager.h" + #include "demo_listener.h" + #include - namespace OHOS { - namespace HiviewDFX { - // Implement the API for registering a listener for callback objects. - void HiSysEventToolListener::OnHandle(const std::string& domain, const std::string& eventName, + + void DemoListener::OnHandle(const std::string& domain, const std::string& eventName, const int eventType, const std::string& eventDetail) { std::cout << eventDetail << std::endl; } - - void HiSysEventToolListener::OnServiceDied() + + void DemoListener::OnServiceDied() { std::cout << std::string("service disconnect, exit") << std::endl; exit(0); } - } // namespace HiviewDFX - } // namespace OHOS - - // Register a listener for callback objects. - auto toolListener = std::make_shared(); - struct ListenerRule rule; - rule.ruleType = 1; // 1: default type - rule.domain = "HIVIEWDFX"; - std::vector sysRules; - sysRules.push_back(rule); - HiSysEventManager::AddEventListener(toolListener, sysRules); ``` -2. Modify the **BUILD.gn** file. - - In the **BUILD.gn** file, add the **libhisyseventmanager** library that depends on the** hisysevent\_native** component. + Call the **AddEventListener** API of the **HiSysEventManager** class to add a listener for system events. ``` - external_deps = [ "hisysevent_native:libhisyseventmanager", ] + auto demoListener = std::make_shared(); + // Add a ListenerRule object based on the event tag, with RuleType left unspecified (in this case, ruleType is defaulted to WHOLE_WORD). + ListenerRule tagRule("dfx"); + // Add a ListenerRule object based on the event tag, with RuleType set as REGULAR. + ListenerRule regRule("dfx.*", RuleType::REGULAR); + // Add a ListenerRule object based on the event domain and event name, with RuleType set as PREFIX. + ListenerRule domainNameRule("HIVIEWDFX", "APP_USAGE", RuleType::PREFIX); + std::vector sysRules; + sysRules.push_back(tagRule); + sysRules.push_back(regRule); + sysRules.push_back(domainNameRule); + HiSysEventManager::AddEventListener(demoListener, sysRules); ``` +2. Configure the **BUILD.gn** file. + In the **BUILD.gn** file, add the **libhisyseventmanager** library that depends on the **hisysevent\_native** component. + + ``` + external_deps = [ "hisysevent_native:libhisyseventmanager", ] + ``` diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-logging-config.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-logging-config.md new file mode 100644 index 00000000000..eb960a33ba1 --- /dev/null +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-logging-config.md @@ -0,0 +1,186 @@ +# HiSysEvent Logging Configuration + +- [Overview](#section315316685115) + - [Basic Concepts](#section123181432175143) + - [Constraints](#section123181432175114) +- [Writing a YAML File](#section123181432175113) + - [Writing Rules](#section123181432175133) + - [Example](#section123181432175123) +- [Verifying the YAML File](#section123181432175115) + - [Configuring the YAML File Path](#section123181432175135) + - [Compiling the YAML File](#section123181432175137) + - [Logging and Querying Events](#section123181432175139) + +## Overview + +If HiSysEvent logging is required for a component, you need to define a YAML file and [configure the YAML file path](#section123181432175135) in the **bundle.js** file. During compilation, the OpenHarmony compilation framework will use the Python compilation script to parse and verify all the YAML files configured in the **bundle.js** file. On completion, the compilation framework will summarize the configuration information in the YAML files and convert the information into a JSON file named **hisysevent.def**. After that, the compilation framework will put the JSON file to a specified path as the basis for the system to determine whether to log system events. + +### Basic Concepts + +Understanding the following concepts would be helpful for you in configuring HiSysEvent logging. + +- Event domain + Represents the domain to which an event belongs. It is specified by the **domain** field in the YAML file. For details, see [domain](#section123181432175123) in the example YAML file. + +- Event name + Indicates the events in an event domain. For details, see [EVENT\_NAMEA/EVENT\_NAMEB](#section123181432175123) in the example YAML file. + +- Parameter + Defines the key values in an event name. For details, see [__BASE/NAME1/NAME2](#section123181432175123) in the example YAML file. + + +### Constraints + +- Each YAML file can contain only one event domain, and the domain name cannot be the same as that defined in other YAML files. + +- Zero or more event names can be defined for one event domain. The event names in the same event domain must be unique. + +- Multiple parameters can be defined for one event name. The parameters in the same event name must be unique. There must be one and only one parameter named **\__BASE** in each event name. See Table 1 for the fields of this parameter and Table 2 for the fields of other custom parameters. + + **Table 1** Fields in the \__BASE parameter + + | Field| Description| + | ----- | ----- | + | type | Indicates the type of the event. This field is mandatory.

Value:
  • **FAULT**: fault
  • **STATISTIC**: statistics
  • **SECURITY**: security
  • **BEHAVIOR**: user behavior
| + | level | Indicates the level of the event. This field is mandatory.

Value:
  • **CRITICAL**: critical
  • **MINOR**: minor
| + | tag | Indicates the tag of the event. This field is mandatory.

Rule:
  • You can define a maximum of five tags,separated with a space.
  • A single tag can contain a maximum of 16 characters, including a to z, A to Z, and 0 to 9.
| + | desc | Describes the event name. This field is mandatory.

Rule:
  • The description contains 3 to 128 characters, including a to z, A to Z, 0 to 9, and underscores (_).
| + + **Table 2** Description of custom parameters + + | Field| Description| + | ----- | ----- | + | type | Indicates the type of a parameter. This field is mandatory.

Value:
  • BOOL
  • UINT8
  • UINT16
  • INT32
  • UINT32
  • UINT64
  • FLOAT
  • DOUBLE
  • STRING
| + | arrsize | Specifies the length of the parameter of the array type. This field is optional.

Value range:
  • 1-100
| + | desc | Describes the parameter. This field is mandatory.

Rule:
  • The description contains 3 to 128 characters, including a to z, A to Z, 0 to 9, and underscores (_).
| + +## Writing a YAML File + +### Writing Rules + +- Event domain naming rules: + - The name must start with a letter and can contain only uppercase letters, digits, and underscores (_). + - The name contains 1 to 16 characters. +- Event naming rules: + - The name must start with a letter and can contain only uppercase letters, digits, and underscores (_). + - The name contains 1 to 32 characters. + - The number of internal event names in an event domain cannot exceed 4096. +- Parameter naming rules: + - The name must start with a letter and can contain only uppercase letters, digits, and underscores (_). + - The name contains 1 to 32 characters. + - The number of parameters in an event domain cannot exceed 128. + +### Example + +- In the example YAML file, the event domain name is **MODULEA**. The event domain contains two events named **EVENT\_NAMEA** and **EVENT\_NAMEB**. +- **EVENT\_NAMEA** is defined as a critical event of the fault type. The event contains the **NAME1** parameter of the string type, the **NAME2** parameter of the string type, and the **NAME3** parameter of the unsigned short integer type. Therefore, you can perform [real-time subscription](subsys-dfx-hisysevent-listening.md) to the event based on the event domain **MODULEA** and event name **EVENT\_NAMEA**. +- **EVENT\_NAMEB** is defined as a general event of the statistics type. The event contains the **NAME1** parameter of the unsigned short integer type and the **NAME2** parameter of the integer type. Because two event tags named **tag1** and **tag2** are defined for **EVENT\_NAMEB** in the **\__BASE** parameter, you can perform [real-time subscription](subsys-dfx-hisysevent-read.md) to the event based on the event domain **MODULEA** and event name **EVENT\_NAMEB**, or based on the event tag. + + ``` + ########################################## + # HiSysEvent definition for MODULEA + ########################################## + + domain: MODULEA + + EVENT_NAMEA: + __BASE: {type: FAULT, level: CRITICAL, desc: event name a} + NAME1: {type: STRING, desc: name1} + NAME2: {type: STRING, desc: name2} + NAME3: {type: UINT16, desc: name3} + + EVENT_NAMEB: + __BASE: {type: STATISTIC, level: MINOR, tag: tag1 tag2, desc: event name b} + NAME1: {type: UINT16, desc: name1} + NAME2: {type: INT32, desc: name2} + ``` + +## Verifying the YAML File + +### Configuring the YAML File Path + +In the **bundle.js** file, use the ```hisysevent_config``` attribute to specify the YAML file path. + +``` +{ + "name": "@ohos/moduel_a", + "description": "module a", + "version": "3.1", + "license": "Apache License 2.0", + "publishAs": "code-segment", + "segment": { + "destPath": "moduel_a_path" + }, + "dirs": {}, + "scripts": {}, + "component": { + "name": "hisysevent_native", + "subsystem": "hiviewdfx", + "adapted_system_type": [ + "standard" + ], + "rom": "", + "ram": "", + "hisysevent_config": [ + "//moduel_a_path/yaml_file1.yaml", + "//moduel_a_path/yaml_file2.yaml" + ], + "deps": { + "components": [ + "hilog_native", + "hitrace_native", + "ipc", + "safwk", + "samgr_standard", + "utils_base" + ], + "third_party": [] + }, + "build": { + } + } +} +``` + +>![](../public_sys-resources/icon-note.gif) **Note:** +>The YAML file can be placed in any directory of the component project as needed. You only need to specify the path in the **bundle.js** file. + +### Compiling the YAML File + +- Perform full compilation. + + - During full compilation of the system, the configuration in the YAML files of all components are summarized. After the compilation is complete, the **hisysevent.def** file will be generated in the specified directory. + + ``` + cd absolute path of the project's root directory + ./build --product-name + ``` + + - To obtain the **hisysevent.def** file generated after full compilation, run the following command: + + ``` + cd absolute path of the project's root directory + find out -name hisysevent.def -type f + ``` + +- Single-file compilation: + + You can also compile the YAML file of a single component by running the following commands: + + ``` + cd absolute path of the project's root directory + ./build/ohos/hisysevent/gen_def_from_all_yaml.py --yaml-list --def-path + ``` + + **Table 3** Parameters for single-file compilation + + | Parameter| Description| + | ------ | ------ | + | --yaml-list | Specifies the paths of the YAML files to be compiled. If there are multiple YAML file paths, separate each of them with a space.| + | --def-path | Specifies the path of the **hisysevent.def** file generated after compilation.| + +### Logging and Querying Events + +1. Push the **hisysevent.def** file to the **/system/etc/hiview/** directory of the device by using the [hdc_std tool](subsys-toolchain-hdc-guide.md). + +2. Trigger logging of the custom system events in the YAML file. Then, run [hisysevent -l](subsys-dfx-hisysevent-tool.md) to query historical system events to find out if the logging of the custom system events is successful. diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-logging.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-logging.md index feadce49bca..e0c70f789d5 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-logging.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-logging.md @@ -1,281 +1,106 @@ # HiSysEvent Logging -## Overview - -HiSysEvent provides event logging APIs for OpenHarmony to record important information of key processes during system running, helping you locate faults. In addition, you can upload the log data to the cloud for big data analytics. - -## Available APIs - -The following table lists the C++ APIs provided by the **HiSysEvent** class. - -For details about the **HiSysEvent** class, see the API reference. - -**Table 1** C++ APIs provided by HiSysEvent +- [Overview](#section77571101789) + - [Introduction](#section123133332175224) + - [Constraints](#section123181432175224) +- [Development Guidelines](#section314416685113) + - [Available APIs](#section13480315886) + - [Development Example](#section112771171317) - - - - - - - - - -

API

-

Description

-

template<typename... Types> static int Write(const std::string &domain, const std::string &eventName, EventType type, Types... keyValues)

-

Logs system events.

-

Input arguments:

-
  • domain: Indicates the domain related to the event. You can use a preconfigured domain or customize a domain as needed. The name of a custom domain can contain a maximum of 16 characters, including digits (0-9) and uppercase letters (A-Z). It must start with a letter.
  • eventName: Indicates the event name. The value contains a maximum of 32 characters, including digits (0 to 9), letters (A-Z), and underscore (_). It must start with a letter and cannot end with an underscore (_).
  • type: Indicates the event type. For details, see EventType.
  • keyValues: Indicates the key-value pairs of event parameters. It can be in the format of the basic data type, std::string, std::vector<basic data type>, or std:vector<std::string>. The value contains a maximum of 48 characters, including digits (0 to 9), letters (A-Z), and underscore (_). It must start with a letter and cannot end with an underscore (_). The number of parameter names cannot exceed 32.
-

Return value: Returns 0 if the operation is successful; returns a value less than 0 otherwise.

-
- -**Table 2** Description of HiSysEvent::Domain APIs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

API

-

Description

-

static const std::string AAFWK

-

Ability management framework

-

static const std::string APPEXECFWK

-

Application framework

-

static const std::string ACCOUNT

-

Account subsystem

-

static const std::string ACE

-

ACE subsystem

-

static const std::string AI

-

AI subsystem

-

static const std::string BARRIER_FREE

-

Accessibility subsystem

-

static const std::string BIOMETRICS

-

Biometric recognition subsystem

-

static const std::string CCRUNTIME

-

C/C++ operating environment subsystem

-

static const std::string COMMUNICATION

-

Communication subsystem

-

static const std::string DEVELOPTOOLS

-

Development toolchain subsystem

-

static const std::string DISTRIBUTED_DATAMGR

-

Distributed data management subsystem

-

static const std::string DISTRIBUTED_SCHEDULE

-

Distributed scheduler subsystem

-

static const std::string GLOBAL

-

Globalization subsystem

-

static const std::string GRAPHIC

-

Graphics subsystem

-

static const std::string HIVIEWDFX

-

DFX subsystem

-

static const std::string IAWARE

-

Scheduling and resource management subsystem

-

static const std::string INTELLI_ACCESSORIES

-

Smart accessory subsystem

-

static const std::string INTELLI_TV

-

Smart TV subsystem

-

static const std::string IVI_HARDWARE

-

IVI-dedicated hardware subsystem

-

static const std::string LOCATION

-

Location subsystem

-

static const std::string MSDP

-

MSDP subsystem

-

static const std::string MULTI_MEDIA

-

Multimedia subsystem

-

static const std::string MULTI_MODAL_INPUT

-

Multimodal input subsystem

-

static const std::string NOTIFICATION

-

Common event and notification subsystem

-

static const std::string POWERMGR

-

Power management subsystem

-

static const std::string ROUTER

-

Router subsystem

-

static const std::string SECURITY

-

Security subsystem

-

static const std::string SENSORS

-

Pan-sensor subsystem

-

static const std::string SOURCE_CODE_TRANSFORMER

-

Application porting subsystem

-

static const std::string STARTUP

-

Startup subsystem

-

static const std::string TELEPHONY

-

Telephony subsystem

-

static const std::string UPDATE

-

Update subsystem

-

static const std::string USB

-

USB subsystem

-

static const std::string WEARABLE_HARDWARE

-

Wearable-dedicated hardware subsystem

-

static const std::string WEARABLE

-

Wearable-dedicated service subsystem

-

static const std::string OTHERS

-

Others

-
- -**Table 3** Description of HiSysEvent::EventType APIs +## Overview - - - - - - - - - - - - - - - - - - -

API

-

Description

-

FAULT

-

Fault event

-

STATISTIC

-

Statistical event

-

SECURITY

-

Security event

-

BEHAVIOR

-

System behavior event

-
+### Introduction -## How to Develop +HiSysEvent provides event logging APIs for OpenHarmony to record important information of key processes during system running, helping you locate faults. In addition, you can upload the log data to the cloud for big data analytics. -**C++** +### Constraints + +Before logging system events, you need to configure HiSysEvent logging. For details, see [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md). + +## Development Guidelines + +### Available APIs + +The following table lists the C++ APIs provided by the HiSysEvent class. + +For details about the HiSysEvent class, see the API reference. + +**Table 1** C++ APIs provided by HiSysEvent + +| API| Description| +| -------- | --------- | +| template<typename... Types> static int Write(const std::string &domain, const std::string &eventName, EventType type, Types... keyValues) | Logs system events.

Input arguments:
  • **domain**: Indicates the domain related to the event. You can use a preconfigured domain or customize a domain as needed. The name of a custom domain can contain a maximum of 16 characters, including digits (0-9) and uppercase letters (A-Z). It must start with a letter.
  • **eventName**: Indicates the event name. The value contains a maximum of 32 characters, including digits (0 to 9), letters (A-Z), and underscores (_). It must start with a letter and cannot end with an underscore.
  • **type**: Indicates the event type. For details, see EventType.
  • **keyValues**: Indicates the key-value pairs of event parameters. It can be in the format of the basic data type, std::string, std::vector<basic data type>, or std:vector<std::string>. The value contains a maximum of 48 characters, including digits (0 to 9), letters (A-Z), and underscores (_). It must start with a letter and cannot end with an underscore. The number of parameter names cannot exceed 32.
Return value:
  • **0**: The logging is successful.
  • Negative value: The logging has failed.
| + +**Table 2** Description of HiSysEvent::Domain APIs + +| API| Description| +| -------- | --------- | +| static const std::string AAFWK | Atomic ability subsystem| +| static const std::string APPEXECFWK | User program framework subsystem| +| static const std::string ACCOUNT | Account subsystem| +| static const std::string ACE | JS application framework| +| static const std::string AI | AI subsystem| +| static const std::string BARRIER_FREE | Accessibility subsystem| +| static const std::string BIOMETRICS | Biometric recognition subsystem| +| static const std::string CCRUNTIME |C/C++ operating environment subsystem| +| static const std::string COMMUNICATION | Public communication subsystem| +| static const std::string DEVELOPTOOLS | Development toolchain subsystem| +| static const std::string DISTRIBUTED_DATAMGR | Distributed data management subsystem| +| static const std::string DISTRIBUTED_SCHEDULE | Distributed Scheduler subsystem| +| static const std::string GLOBAL | Globalization subsystem| +| static const std::string GRAPHIC | Graphics subsystem| +| static const std::string HIVIEWDFX | DFX subsystem| +| static const std::string IAWARE | Scheduling and resource management subsystem| +| static const std::string INTELLI_ACCESSORIES | Smart accessory subsystem| +| static const std::string INTELLI_TV | Smart TV subsystem| +| static const std::string IVI_HARDWARE | IVI-dedicated hardware subsystem| +| static const std::string LOCATION | LBS subsystem| +| static const std::string MSDP | MSDP subsystem| +| static const std::string MULTI_MEDIA | Media subsystem| +| static const std::string MULTI_MODAL_INPUT | Multimode input subsystem| +| static const std::string NOTIFICATION | Common event and notification subsystem| +| static const std::string POWERMGR | Power management subsystem| +| static const std::string ROUTER | Router subsystem| +| static const std::string SECURITY | Security subsystem| +| static const std::string SENSORS | Pan-sensor subsystem| +| static const std::string SOURCE_CODE_TRANSFORMER | Application porting subsystem| +| static const std::string STARTUP | Startup subsystem| +| static const std::string TELEPHONY | Telephony subsystem| +| static const std::string UPDATE | Update subsystem| +| static const std::string USB | USB subsystem| +| static const std::string WEARABLE_HARDWARE | Wearable-dedicated hardware subsystem| +| static const std::string WEARABLE_HARDWARE | Wearable-dedicated service subsystem| +| static const std::string OTHERS | Others| + +**Table 3** Description of HiSysEvent::EventType + +| Name| Description| +| -------- | --------- | +| FAULT | Fault event| +| STATISTIC | Statistical event| +| SECURITY | Security event| +| BEHAVIOR | System behavior event| + +### Development Example + +C++ 1. Develop the source code. - Include the **HiSysEvent** header file in the class definition header file or class implementation source file. For example: + Include the HiSysEvent header file in the class definition header file or class implementation source file. For example: ``` #include "hisysevent.h" ``` - Add the event logging code. For example, if you want to log events specific to the app start time \(**start\_app**\), then add the following code to the service implementation source file: + Add the event logging code. For example, if you want to log events specific to the app start time (start\_app), then add the following code to the service implementation source file: ``` HiSysEvent::Write(HiSysEvent::Domain::AAFWK, "start_app", HiSysEvent::EventType::FAULT, "app_name", "com.demo"); ``` -2. Configure compilation information. Specifically, add the subsystem SDK dependency to **BUILD.gn**. +2. Configure compilation information. Specifically, add the subsystem SDK dependency to **BUILD.gn**. ``` external_deps = [ "hisysevent_native:libhisysevent" ] ``` - - diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md new file mode 100644 index 00000000000..32946d0d0ee --- /dev/null +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md @@ -0,0 +1,103 @@ +# HiSysEvent Query + +- [Overview](#section279684125212) +- [Development Guidelines](#section315316761113) + - [Available APIs](#section03869128521) + - [Development Example](#section14286111855212) + +## Overview + +HiSysEvent provides an API for you to query system events. You can query concerned events by specifying search criteria. For example, for a power consumption module, you can query required system events for analysis. + +## Development Guidelines + +### Available APIs + +**Table 1** HiSysEvent query API + +| API| Description| +| -------- | --------- | +| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<struct QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBackBase> queryCallBack) | Queries system events by specifying search criteria such as the time segment, event domain, and event name.

Input arguments:
  • **queryArg**: event query parameter.
  • **queryRules**: event filtering rules.
  • **queryRules**: callback object for query results.
Return value:
  • **true**: The query is successful.
  • **false**: The query has failed.
| + + +**Table 2** Description of QueryArg + +| Attribute| Description| +| -------- | --------- | +| beginTime | Start time, in the **long long int** format.| +| endTime | End time, in the **long long int** format.| +| maxEvents | Maximum number of returned events, in the **int** format.| + +**Table 3** Description of QueryRule + +| Attribute| Description| +| -------- | --------- | +| ruleType | Rule type, in the **uint32_t** format. The default value is **0**.| +| domain | Domain to which the event belongs, in the **string** format. By default, an empty string indicates that the domain is successfully matched.| +| eventList | Event name list, in the std::vector<std::string> format. By default, an empty string indicates that the event names on the list are successfully matched.| + +**Table 4** Description of HiSysEventQueryCallBackBase + +| API| Description| +| -------- | --------- | +| void HiSysEventQueryCallBackBase::OnQuery(const ::std::vector<std::string>& sysEvent, const ::std::vector<int64_t>& seq) | Callback object for event query.

Input arguments:
  • **sysEvent**: event set.
  • **seq**: event sequence set.
Return value:
  None.| +| void HiSysEventQueryCallBackBase::OnComplete(int32_t reason, int32_t total) | Callback object for completion of event query.

Input arguments:
  • **reason**: reason for completion of event query. The default value is **0**.
  • **total**: total number of events returned in this query.
Return value:
  None.| + +### Development Example + +C++ + +1. Develop the source code. + + - Import the corresponding header file: + + hisysevent\_manager.h + + - Implement the callback API. + + void HiSysEventQueryCallBackBase::OnQuery\(const ::std::vector& sysEvent, const ::std::vector& seq\) + + void HiSysEventQueryCallBackBase::OnComplete\(int32\_t reason, int32\_t total\) + + - Invoke the query API in the corresponding service logic. + + HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) + + + ``` + // In this example, you'll query all system events. + #include "hisysevent_manager.h" + #include + + namespace OHOS { + namespace HiviewDFX { + // Implement the query callback API. + void HiSysEventToolQuery::OnQuery(const ::std::vector& sysEvent, + const ::std::vector& seq) + { + for_each(sysEvent.cbegin(), sysEvent.cend(), [](const std::string &tmp) { + std::cout << tmp << std::endl; + }); + } + + void HiSysEventToolQuery::OnComplete(int32_t reason, int32_t total) + { + return; + } + } // namespace HiviewDFX + } // namespace OHOS + + // Invoke the query callback API to obtain system events. + auto queryCallBack = std::make_shared(); + struct QueryArg args(clientCmdArg.beginTime, clientCmdArg.endTime, clientCmdArg.maxEvents); + std::vector mRules; + HiSysEventManager::QueryHiSysEvent(args, mRules, queryCallBack); + ``` + +2. Modify the **BUILD.gn** file. + + In the **BUILD.gn** file, add the **libhisyseventmanager** library that depends on the **hisysevent\_native** component. + + ``` + external_deps = [ "hisysevent_native:libhisyseventmanager", ] + ``` diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-querying.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-querying.md deleted file mode 100644 index ba64df110c2..00000000000 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-querying.md +++ /dev/null @@ -1,173 +0,0 @@ -# HiSysEvent Query - -## Overview - -HiSysEvent provides an API for you to query system events. You can query concerned events by specifying search criteria. For example, for a power consumption module, you can query required system events for analysis. - -## Available APIs - -**Table 1** HiSysEvent query API - - - - - - - - - - -

API

-

Description

-

bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<struct QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBack> queryCallBack)

-

Queries system events by specifying search criteria such as the time segment, event domain, and event name.

-

Input arguments:

-
  • queryArg: event query parameter.
  • queryRules: event filtering rules.
  • queryCallBack: callback object for query results.
-

Return values

-
  • true: Operation successful.
  • false: Operation failed.
-
- -**Table 2** HiSysEvent query parameters - - - - - - - - - - - - - - - - -

Attribute

-

Description

-

long long beginTime

-

Start time.

-

long long endTime

-

End time.

-

int maxEvents

-

Maximum number of query records.

-
- -**Table 3** HiSysEvent query rules - - - - - - - - - - - - - - - - -

Attribute

-

Description

-

uint32_t ruleType

-

Rule type. The default value is 0.

-

std::string domain;

-
  • domain: domain to which the event belongs. By default, an empty string indicates that the domain is successfully matched.
-

std::vector<std::string> eventList

-
  • eventList: event name list. By default, an empty string indicates that the event names on the list are successfully matched.
-
- -**Table 4** HiSysEvent query callback objects - - - - - - - - - - - - - -

API

-

Description

-

void HiSysEventQueryCallBack::OnQuery(const ::std::vector<std::string>& sysEvent, const ::std::vector<int64_t>& seq)

-

Callback object for event query.

-

Input arguments:

-
  • sysEvent: event set.
  • seq: event sequence set.
-

Return value: none

-

void HiSysEventQueryCallBack::OnComplete(int32_t reason, int32_t total)

-

Callback object for completion of event query.

-

Input arguments:

-
  • reason: reason for completion of event query. The default value is 0.
  • total: total number of events returned in this query.
-

Return value: none

-
- -## How to Develop - -### **C++** - -In this example, you'll be instructed to query all system events. - -1. Develop the source code. - - - Import the corresponding header file: - - hisysevent\_manager.h - - - Implement the callback API. - - void HiSysEventQueryCallBack::OnQuery\(const ::std::vector& sysEvent, const ::std::vector& seq\) - - void HiSysEventQueryCallBack::OnComplete\(int32\_t reason, int32\_t total\) - - - Invoke the query API in the corresponding service logic. - - HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) - - - ``` - // In this example, you'll query all system events. - #include "hisysevent_manager.h" - #include - - namespace OHOS { - namespace HiviewDFX { - // Implement the query callback API. - void HiSysEventToolQuery::OnQuery(const ::std::vector& sysEvent, - const ::std::vector& seq) - { - for_each(sysEvent.cbegin(), sysEvent.cend(), [](const std::string &tmp) { - std::cout << tmp << std::endl; - }); - } - - void HiSysEventToolQuery::OnComplete(int32_t reason, int32_t total) - { - return; - } - } // namespace HiviewDFX - } // namespace OHOS - - // Invoke the query callback API to obtain system events. - auto queryCallBack = std::make_shared(); - struct QueryArg args(clientCmdArg.beginTime, clientCmdArg.endTime, clientCmdArg.maxEvents); - std::vector mRules; - HiSysEventManager::QueryHiSysEvent(args, mRules, queryCallBack); - ``` - -2. Modify the **BUILD.gn** file. - - In the **BUILD.gn** file, add the **libhisyseventmanager** library that depends on the** hisysevent\_native** component. - - ``` - external_deps = [ "hisysevent_native:libhisyseventmanager", ] - ``` - - diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent.md b/en/device-dev/subsystems/subsys-dfx-hisysevent.md index 38fe0b8f890..b29223652d0 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent.md @@ -1,10 +1,12 @@ -# HiSysEvent Development +# DHiSysEvent Development + +- **[HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md)** - **[HiSysEvent Logging](subsys-dfx-hisysevent-logging.md)** - **[HiSysEvent Listening](subsys-dfx-hisysevent-listening.md)** -- **[HiSysEvent Query](subsys-dfx-hisysevent-querying.md)** +- **[HiSysEvent Query](subsys-dfx-hisysevent-query.md)** - **[HiSysEvent Tool Usage](subsys-dfx-hisysevent-tool.md)** -- Gitee From d68cdfcd2bd5863279e43a9753ea30ac3896729e Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 1 Mar 2022 09:55:26 +0000 Subject: [PATCH 036/282] update zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md. Signed-off-by: Austin --- zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md | 1 - 1 file changed, 1 deletion(-) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md index 2cb47608d34..b169474cf33 100644 --- a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md @@ -52,7 +52,6 @@ OHOS # task 6 1 6 0 Pending 0x688000 0x137000 0x11c518 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa1ddf 0.89 wms_server 8 1 1 1000 Running 0x2bf000 0x8f000 0x2a8c6 0.0 shell - 9 5 5 101 Pending 0x11ea000 0x2f9000 0x20429d 0.97 com.huawei.launcher 11 1 11 0 Pending 0x4d4000 0x112000 0xe0ad7 0.0 deviceauth_service 12 1 12 0 Pending 0x34f000 0xbd000 0x519ee 0.0 sensor_service 13 1 13 2 Pending 0x34e000 0xb3000 0x523d9 0.0 ai_server -- Gitee From 69b67c6b576132bfa8e7d726045f70bcbd49a2cd Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 1 Mar 2022 09:56:47 +0000 Subject: [PATCH 037/282] update zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md. Signed-off-by: Austin --- zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md index 255a6ae2594..3fc9e2fe3f7 100644 --- a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md @@ -55,7 +55,6 @@ kill [-l [_signo_] | _-s signo_ | _-signo_] _pid..._ 6 1 6 0 Pending 0x688000 0x137000 0x11bca0 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa1cdf 0.88 wms_server 8 1 8 2 Pending 0x1f5000 0x48000 0x47dc2 0.2 mksh - 10 5 5 101 Pending 0x11ec000 0x2f9000 0x206047 0.93 com.huawei.launcher 12 1 12 0 Pending 0x4d4000 0x112000 0xe0882 0.0 deviceauth_service 13 1 13 0 Pending 0x34f000 0xbd000 0x51799 0.0 sensor_service 14 1 14 2 Pending 0x34e000 0xb3000 0x52184 0.0 ai_server @@ -80,7 +79,6 @@ kill [-l [_signo_] | _-s signo_ | _-signo_] _pid..._ 6 1 6 0 Pending 0x688000 0x137000 0x11c1ba 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa21f9 0.89 wms_server 8 1 8 2 Pending 0x1f5000 0x48000 0x482dc 0.2 mksh - 10 5 5 101 Pending 0x11ec000 0x2f9000 0x206561 0.93 com.huawei.launcher 12 1 12 0 Pending 0x4d4000 0x112000 0xe0d9c 0.0 deviceauth_service 13 1 13 0 Pending 0x34f000 0xbd000 0x51cb3 0.0 sensor_service 14 1 14 2 Pending 0x34e000 0xb3000 0x5269e 0.0 ai_server -- Gitee From 84c842947a8b26306e916b6ba96c4148d7be2c9c Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 1 Mar 2022 09:59:04 +0000 Subject: [PATCH 038/282] update zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-top.md. Signed-off-by: Austin --- zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-top.md | 1 - 1 file changed, 1 deletion(-) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-top.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-top.md index e6465cac255..4507fc19cc3 100644 --- a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-top.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-top.md @@ -52,7 +52,6 @@ OHOS:/$ top 6 1 6 0 Pending 0x688000 0x137000 0x11c1ba 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa21f9 0.87 wms_server 8 1 8 2 Pending 0x1f5000 0x48000 0x462dc 0.0 mksh - 9 5 5 101 Pending 0x11ea000 0x2f9000 0x204561 0.94 com.huawei.launcher 11 1 11 0 Pending 0x4d4000 0x112000 0xe0d9c 0.0 deviceauth_service 12 1 12 0 Pending 0x34f000 0xbd000 0x51cb3 0.0 sensor_service 13 1 13 2 Pending 0x34e000 0xb3000 0x5269e 0.0 ai_server -- Gitee From 7120a450e71d27943611a2d303192f43b33ead22 Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 1 Mar 2022 10:00:30 +0000 Subject: [PATCH 039/282] update zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md. Signed-off-by: Austin --- zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md | 1 - 1 file changed, 1 deletion(-) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md index 7798cb435ed..559d76ec855 100644 --- a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md @@ -59,7 +59,6 @@ OHOS # 6 1 6 0 Pending 0x688000 0x137000 0x11c518 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa1ddf 0.95 wms_server 8 1 1 1000 Running 0x2bf000 0x8f000 0x2a8c6 0.0 shell - 9 5 5 101 Pending 0x11ea000 0x2f9000 0x20429d 1.2 com.huawei.launcher 11 1 11 0 Pending 0x4d4000 0x112000 0xe0ad7 0.0 deviceauth_service 12 1 12 0 Pending 0x34f000 0xbd000 0x519ee 0.0 sensor_service 13 1 13 2 Pending 0x34e000 0xb3000 0x523d9 0.0 ai_server -- Gitee From 33fe719a47814a139d5242fe296f3a6af695aa12 Mon Sep 17 00:00:00 2001 From: wangyong1995626wywz Date: Tue, 1 Mar 2022 18:12:01 +0800 Subject: [PATCH 040/282] Revise some interfaces and improve the interface description Description 1.Restore the format of that version 2. Fix the parameter error 3. Improve the missing use case of the XTS use case 4. Modify the error that the return value is inconsistent with the comparison 5.Improve the interface description against the interface API document #I4U5XE:improve containers class API interface reference description Signed-off-by: wangyong1995626wywz --- .../reference/apis/js-apis-arraylist.md | 59 ++++---- .../reference/apis/js-apis-deque.md | 11 +- .../reference/apis/js-apis-hashmap.md | 40 +++--- .../reference/apis/js-apis-hashset.md | 16 +-- .../reference/apis/js-apis-lightweightmap.md | 77 ++++++---- .../reference/apis/js-apis-lightweightset.md | 62 ++++---- .../reference/apis/js-apis-linkedlist.md | 65 +++++---- .../reference/apis/js-apis-list.md | 63 ++++---- .../reference/apis/js-apis-plainarray.md | 88 +++++++----- .../reference/apis/js-apis-queue.md | 19 +-- .../reference/apis/js-apis-stack.md | 14 +- .../reference/apis/js-apis-treemap.md | 69 +++++---- .../reference/apis/js-apis-treeset.md | 24 ++-- .../reference/apis/js-apis-vector.md | 136 ++++++++++++------ 14 files changed, 424 insertions(+), 319 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-arraylist.md b/zh-cn/application-dev/reference/apis/js-apis-arraylist.md index 79d8e65485b..efda37f74d4 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-arraylist.md +++ b/zh-cn/application-dev/reference/apis/js-apis-arraylist.md @@ -55,15 +55,15 @@ add(element: T): boolean **示例:** -``` -let arrayList = new ArrayList(); -arrayList.add("a"); -arrayList.add(1); -let b = [1, 2, 3]; -arrayList.add(b); -let c = {name: "lala", age: "13"}; -arrayList.add(false); -``` + ``` + let arrayList = new ArrayList(); + let result = arrayList.add("a"); + let result1 = arrayList.add(1); + let b = [1, 2, 3]; + let result2 = arrayList.add(b); + let c = {name: "lala", age: "13"}; + let result3 = arrayList.add(false); + ``` ### insert @@ -109,9 +109,9 @@ has(element: T): boolean ``` let arrayList = new ArrayList(); -arrayList.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = arrayList.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); arrayList.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); -arrayList.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result1 = arrayList.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` ### getIndexOf @@ -143,7 +143,7 @@ arrayList.add(2); arrayList.add(1); arrayList.add(2); arrayList.add(4); -arrayList.getIndexOf(2); +let result = arrayList.getIndexOf(2); ``` ### getLastIndexOf @@ -175,7 +175,7 @@ arrayList.add(2); arrayList.add(1); arrayList.add(2); arrayList.add(4); -arrayList.getLastIndexOf(2); +let result = arrayList.getLastIndexOf(2); ``` ### removeByIndex @@ -205,7 +205,7 @@ arrayList.add(4); arrayList.add(5); arrayList.add(2); arrayList.add(4); -arrayList.removeByIndex(2); +let result = arrayList.removeByIndex(2); ``` ### remove @@ -234,7 +234,7 @@ arrayList.add(2); arrayList.add(4); arrayList.add(5); arrayList.add(4); -arrayList.remove(2); +let result = arrayList.remove(2); ``` ### removeByRange @@ -264,7 +264,7 @@ arrayList.removeByRange(2, 6); ``` ### replaceAllElements -replaceAllElements(callbackfn: (value: T, index?: number, arraylist?: ArrayList<T>) => T, +replaceAllElements(callbackfn: (value: T, index?: number, arrlist?: ArrayList<T>) => T, thisArg?: Object): void 用户操作ArrayList中的元素,用操作后的元素替换原元素并返回操作后的元素。 @@ -280,9 +280,9 @@ callbackfn的参数说明: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 当前遍历到的元素 | -| index | number | 否 | 当前遍历到的下标值 | -| arraylist | ArrayList<T> | 否 | 当前调用replaceAllElements方法的实例对象 | +| value | T | 是 | 当前遍历到的元素。 | +| index | number | 否 | 当前遍历到的下标值。 | +| arrlist | ArrayList<T> | 否 | 当前调用replaceAllElements方法的实例对象。 | **示例:** @@ -301,7 +301,7 @@ arrayList.replaceAllElements((value, index) => { ``` ### forEach -forEach(callbackfn: (value: T, index?: number, arraylist?: ArrayList<T>) => void, +forEach(callbackfn: (value: T, index?: number, arrlist?: ArrayList<T>) => void, thisArg?: Object): void 通过回调函数来遍历ArrayList实例对象上的元素以及元素对应的下标。 @@ -319,7 +319,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | T | 是 | 当前遍历到的元素。 | | index | number | 否 | 当前遍历到的下标值。 | -| arraylist | ArrayList<T> | 否 | 当前调用forEach方法的实例对象。 | +| arrlist | ArrayList<T> | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -391,9 +391,9 @@ arrayList.add(2); arrayList.add(4); arrayList.add(5); arrayList.add(4); -arrayList.subArrayList(2, 4); -arrayList.subArrayList(4, 3); -arrayList.subArrayList(2, 6); +let result1 = arrayList.subArrayList(2, 4); +let result2 = arrayList.subArrayList(4, 3); +let result3 = arrayList.subArrayList(2, 6); ``` ### clear @@ -415,7 +415,8 @@ arrayList.clear(); ### clone clone(): ArrayList<T> -克隆一个与ArrayList一模一样的实例,并返回克隆后的实例,修改克隆后的实例并不会影响原实例。 +克隆一个与ArrayList相同的实例,并返回克隆后的实例。修改克隆后的实例并不会影响原实例。 + **返回值:** @@ -431,7 +432,7 @@ arrayList.add(2); arrayList.add(4); arrayList.add(5); arrayList.add(4); -arrayList.clone(); +let result = arrayList.clone(); ``` ### getCapacity @@ -453,7 +454,7 @@ arrayList.add(2); arrayList.add(4); arrayList.add(5); arrayList.add(4); -arrayList.getCapacity(); +let result = arrayList.getCapacity(); ``` ### convertToArray @@ -475,7 +476,7 @@ arrayList.add(2); arrayList.add(4); arrayList.add(5); arrayList.add(4); -arrayList.convertToArray(); +let result = arrayList.convertToArray(); ``` ### isEmpty @@ -497,7 +498,7 @@ arrayList.add(2); arrayList.add(4); arrayList.add(5); arrayList.add(4); -arrayList.isEmpty(); +let result = arrayList.isEmpty(); ``` ### increaseCapacityTo diff --git a/zh-cn/application-dev/reference/apis/js-apis-deque.md b/zh-cn/application-dev/reference/apis/js-apis-deque.md index 222bf5f5150..96440fe9281 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-deque.md +++ b/zh-cn/application-dev/reference/apis/js-apis-deque.md @@ -104,9 +104,9 @@ has(element: T): boolean ``` let deque = new Deque(); -deque.has("Ahfbrgrbgnutfodgorrogorg"); +let result = deque.has("Ahfbrgrbgnutfodgorrogorg"); deque.insertFront("Ahfbrgrbgnutfodgorrogorg"); -deque.has("Ahfbrgrbgnutfodgorrogorg"); +let result1 = deque.has("Ahfbrgrbgnutfodgorrogorg"); ``` ### popFirst @@ -130,7 +130,7 @@ deque.insertFront(4); deque.insertEnd(5); deque.insertFront(2); deque.insertFront(4); -deque.popFirst(); +let result = deque.popFirst(); ``` ### popLast @@ -155,6 +155,7 @@ deque.insertFront(5); deque.insertFront(2); deque.insertFront(4); deque.popLast(); +let result = deque.popLast(); ``` ### forEach @@ -211,7 +212,7 @@ deque.insertEnd(2); deque.insertEnd(4); deque.insertFront(5); deque.insertFront(4); -deque.getFirst(); +let result = deque.getFirst(); ``` ### getLast @@ -234,7 +235,7 @@ deque.insertFront(2); deque.insertFront(4); deque.insertFront(5); deque.insertFront(4); -deque.getLast(); +let result = deque.getLast(); ``` ### [Symbol.iterator] diff --git a/zh-cn/application-dev/reference/apis/js-apis-hashmap.md b/zh-cn/application-dev/reference/apis/js-apis-hashmap.md index b2c3bd80907..004c08485c7 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-hashmap.md +++ b/zh-cn/application-dev/reference/apis/js-apis-hashmap.md @@ -53,7 +53,7 @@ isEmpty(): boolean ``` const hashMap = new HashMap(); -hashMap.isEmpty(); +let result = hashMap.isEmpty(); ``` @@ -79,9 +79,9 @@ hasKey(key: K): boolean ``` let hashMap = new HashMap(); -hashMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = hashMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); hashMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); -hashMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result1 = hashMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` @@ -107,9 +107,9 @@ hasValue(value: V): boolean ``` let hashMap = new HashMap(); -hashMap.hasValue(123); +let result = hashMap.hasValue(123); hashMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); -hashMap.hasValue(123); +let result1 = hashMap.hasValue(123); ``` @@ -137,7 +137,7 @@ get(key: K): V let hashMap = new HashMap(); hashMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); hashMap.set("sdfs", 356); -hashMap.get("sdfs"); +let result = hashMap.get("sdfs"); ``` @@ -145,13 +145,13 @@ hashMap.get("sdfs"); setAll(map: HashMap): void -将一个HashMap中的所有元素组添加到另一个hashmap中。 +将一个HashMap中的所有元素组添加到另一个hashMap中。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| map | HashMap | 是 | 被添加元素的hashmap。 | +| map | HashMap | 是 | 被添加元素的hashMap。 | **示例:** @@ -181,13 +181,13 @@ set(key: K, value: V): Object | 类型 | 说明 | | -------- | -------- | -| Object | 返回添加后的hashmap。 | +| Object | 返回添加后的hashMap。 | **示例:** ``` let hashMap = new HashMap(); -hashMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +let result = hashMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); ``` @@ -195,13 +195,13 @@ hashMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); remove(key: K): V -删除指定的元素。 +删除指定key所对应元素。。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | K | 是 | 依据key指定删除的元素。 | +| key | K | 是 | 指定key。 | **返回值:** @@ -215,7 +215,7 @@ remove(key: K): V let hashMap = new HashMap(); hashMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); hashMap.set("sdfs", 356); -hashMap.remove("sdfs"); +let result = hashMap.remove("sdfs"); ``` @@ -239,7 +239,7 @@ hashMap.clear(); keys(): IterableIterator<K> -返回包含此映射中包含的键的新迭代器对象。 +返回包含此映射中包含的键名的新迭代器对象。 **返回值:** @@ -291,7 +291,7 @@ while(temp != undefined) { ### replace -replace(key: K, value: V): boolean +replace(key: K, newValue: V): boolean 对HashMap中一组数据进行更新(替换)。 @@ -300,7 +300,7 @@ replace(key: K, value: V): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | key | K | 是 | 依据key指定替换的元素。 | -| value | V | 是 | 成员数据的新值。 | +| newValue | V | 是 | 替换成员数据的值。 | **返回值:** @@ -313,13 +313,13 @@ replace(key: K, value: V): boolean ``` let hashMap = new HashMap(); hashMap.set("sdfs", 123); -hashMap.replace("sdfs", 357); +let result = hashMap.replace("sdfs", 357); ``` ### forEach -forEach(callbackfn: (value: V, key?: K, hashMap?: HashMap) => void, thisArg?: Object): void +forEach(callbackfn: (value: V, key?: K, map?: HashMap) => void, thisArg?: Object): void 通过回调函数来遍历HashMap实例对象上的元素以及元素对应的下标。 @@ -335,7 +335,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | V | 是 | 当前遍历到的元素键值对的值。 | | key | K | 是 | 当前遍历到的元素键值对的键。 | -| hashMap | HashMap | 否 | 当前调用forEach方法的实例对象。 | +| map | HashMap | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -353,7 +353,7 @@ hashMap.forEach((value, key) => { entries(): IterableIterator<[K, V]> -返回包含此映射中包含的元素的新迭代器对象。 +返回包含此映射中包含的键值对的新迭代器对象。 **返回值:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-hashset.md b/zh-cn/application-dev/reference/apis/js-apis-hashset.md index 5dd797f1c6e..8a0556e94cd 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-hashset.md +++ b/zh-cn/application-dev/reference/apis/js-apis-hashset.md @@ -79,9 +79,9 @@ has(value: T): boolean ``` let hashSet = new HashSet(); -hashSet.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = hashSet.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); -hashSet.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result1 = hashSet.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` @@ -107,7 +107,7 @@ add(value: T): boolean ``` let hashSet = new HashSet(); -hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` @@ -135,7 +135,7 @@ remove(value: T): boolean let hashSet = new HashSet(); hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); hashSet.add("sdfs"); -hashSet.remove("sdfs"); +let result = hashSet.remove("sdfs"); ``` @@ -184,7 +184,7 @@ while(temp != undefined) { ### forEach -forEach(callbackfn: (value: T, key?: T, hashSet?: HashSet<T>) => void, thisArg?: Object): void +forEach(callbackfn: (value: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object): void 通过回调函数来遍历实例对象上的元素以及元素对应的下标。 @@ -200,7 +200,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | T | 是 | 当前遍历到的元素键值对的值。 | | key | T | 否 | 当前遍历到的元素键值对的值(和value相同)。 | -| hashSet | HashSet<T> | 否 | 当前调用forEach方法的实例对象。 | +| set | HashSet<T> | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -217,13 +217,13 @@ hashSet.forEach((value, key) => { ### entries entries(): IterableIterator<[T, T]> -返回包含此映射中包含的元素的新迭代器对象。 +返回包含此映射中包含的键值对的新迭代器对象。 **返回值:** | 类型 | 说明 | | -------- | -------- | -| IterableIterator<[T, T]> | 返回一个迭代器 | +| IterableIterator<[T, T]> | 返回一个迭代器。 | **示例:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-lightweightmap.md b/zh-cn/application-dev/reference/apis/js-apis-lightweightmap.md index 41ed19c4588..8c8601d225c 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-lightweightmap.md +++ b/zh-cn/application-dev/reference/apis/js-apis-lightweightmap.md @@ -53,7 +53,7 @@ isEmpty(): boolean ``` const lightWeightMap = new LightWeightMap(); -lightWeightMap.isEmpty(); +let result = lightWeightMap.isEmpty(); ``` @@ -97,21 +97,22 @@ hasKey(key: K): boolean; | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | K | 是 | 指定元素。 | +| key | K | 是 | 指定key。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| boolean | 包含指定元素返回true,否则返回false。 | +| boolean | 包含指定key返回true,否则返回false。 | **示例:** ``` let lightWeightMap = new LightWeightMap(); +let result = lightWeightMap.hasKey; lightWeightMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); -lightWeightMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result1 = lightWeightMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` @@ -137,9 +138,9 @@ hasValue(value: V): boolean ``` let lightWeightMap = new LightWeightMap(); -lightWeightMap.hasValue(123); +let result = lightWeightMap.hasValue(123); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); -lightWeightMap.hasValue(123); +let result1 = lightWeightMap.hasValue(123); ``` @@ -187,7 +188,7 @@ get(key: K): V let lightWeightMap = new LightWeightMap(); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); lightWeightMap.set("sdfs", 356); -lightWeightMap.get("sdfs"); +let result = lightWeightMap.get("sdfs"); ``` @@ -215,7 +216,7 @@ getIndexOfKey(key: K): number let lightWeightMap = new LightWeightMap(); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); lightWeightMap.set("sdfs", 356); -lightWeightMap.getIndexOfKey("sdfs"); +let result = lightWeightMap.getIndexOfKey("sdfs"); ``` @@ -243,7 +244,7 @@ getIndexOfValue(value: V): number let lightWeightMap = new LightWeightMap(); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); lightWeightMap.set("sdfs", 356); -lightWeightMap.getIndexOfValue(123); +let result = lightWeightMap.getIndexOfValue(123); ``` @@ -271,7 +272,7 @@ getKeyAt(index: number): K let lightWeightMap = new LightWeightMap(); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); lightWeightMap.set("sdfs", 356); -lightWeightMap.getKeyAt(1); +let result = lightWeightMap.getKeyAt(1); ``` @@ -279,13 +280,13 @@ lightWeightMap.getKeyAt(1); setAll(map: LightWeightMap): void -将一个LightWeightMap中的所有元素组添加到另一个LightWeightMap中。 +将一个LightWeightMap中的所有元素组添加到另一个lightWeightMap中。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| map | LightWeightMap | 是 | 被添加元素的LightWeightMap。 | +| map | LightWeightMap | 是 | 被添加元素的lightWeightMap。 | **示例:** @@ -314,13 +315,13 @@ set(key: K, value: V): Object | 类型 | 说明 | | -------- | -------- | -| Object | 返回添加数据后的LightWeightMap。 | +| Object | 返回添加数据后的lightWeightMap。 | **示例:** ``` let lightWeightMap = new LightWeightMap(); -lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +let result = lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); ``` @@ -328,13 +329,13 @@ lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); remove(key: K): V -删除指定的元素。 +删除并返回指定key映射的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | K | 是 | 依据key指定删除的元素。 | +| key | K | 是 | 指定key。 | **返回值:** @@ -356,13 +357,13 @@ lightWeightMap.remove("sdfs"); removeAt(index: number): boolean -删除指定下标的元素。 +删除指定下标对应的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| index | number | 是 | 指定想要删除元素下标 | +| index | number | 是 | 指定下标。 | **返回值:** @@ -376,7 +377,7 @@ removeAt(index: number): boolean let lightWeightMap = new LightWeightMap(); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); lightWeightMap.set("sdfs", 356); -lightWeightMap.removeAt(1); +let result = lightWeightMap.removeAt(1); ``` @@ -384,13 +385,13 @@ lightWeightMap.removeAt(1); setValueAt(index: number, newValue: V): boolean -向LightWeightMap中具体位置替换键值对中的值。 +替换指定下标对应键值对中的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| index | number | 是 | 指定替换数据下标。 | +| index | number | 是 | 指定下标。 | | newValue | V | 是 | 替换键值对中的值。 | **返回值:** @@ -413,19 +414,19 @@ lightWeightMap.setValueAt(1, 3546); getValueAt(index: number): V -获取LightWeightMap中具体位置键值对中的值。 +获取指定下标对应键值对中的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| index | number | 是 | 指定查询数据下标 | +| index | number | 是 | 指定下标。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| V | 返回指定位置中键值对的值。 | +| V | 返回指定下标对应键值对中的元素。 | **示例:** @@ -433,7 +434,7 @@ getValueAt(index: number): V let lightWeightMap = new LightWeightMap(); lightWeightMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); lightWeightMap.set("sdfs", 356); -lightWeightMap.getValueAt(1); +let result = lightWeightMap.getValueAt(1); ``` @@ -509,7 +510,7 @@ while(temp != undefined) { ### forEach -forEach(callbackfn: (value: V, key?: K, lightWeightMap?: LightWeightMap) => void, thisArg?: Object): void +forEach(callbackfn: (value: V, key?: K, map?: LightWeightMap) => void, thisArg?: Object): void 通过回调函数来遍历实例对象上的元素以及元素对应的下标。 @@ -525,7 +526,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | V | 是 | 当前遍历到的元素键值对的值。 | | key | K | 是 | 当前遍历到的元素键值对的键。 | -| lightWeightMap | LightWeightMap | 否 | 当前调用forEach方法的实例对象。 | +| map | LightWeightMap | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -543,7 +544,7 @@ lightWeightMap.forEach((value, key) => { entries(): IterableIterator<[K, V]> -返回包含此映射中包含的元素的新迭代器对象。 +返回包含此映射中包含的键值对的新迭代器对象。 **返回值:** @@ -566,6 +567,26 @@ while(temp != undefined) { } ``` +### toString + +toString(): string + +将此映射中包含的键值对拼接成字符串,并返回字符串类型。 + +**返回值:** + + | 类型 | 说明 | + | -------- | -------- | + | string | 返回一个字符串。 | + +**示例:** + + ``` + let lightWeightMap = new LightWeightMap(); + lightWeightMap.set("A", 123); + lightWeightMap.set("sdfs", 356); + let iter = lightWeightMap.toString(); + ``` ### [Symbol.iterator] diff --git a/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md b/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md index c88e9d47622..2780befaf7d 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md +++ b/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md @@ -53,12 +53,12 @@ isEmpty(): boolean ``` const lightWeightSet = new LightWeightSet(); -lightWeightSet.isEmpty(); +let result = lightWeightSet.isEmpty(); ``` ### add -add(value: T): boolean +add(obj: T): boolean 向此容器中添加数据。 @@ -66,7 +66,7 @@ add(value: T): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 添加的成员数据。 | +| obj | T | 是 | 添加的成员数据。 | **返回值:** @@ -78,7 +78,7 @@ add(value: T): boolean ``` let lightWeightSet = new LightWeightSet(); -lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` @@ -92,7 +92,7 @@ addAll(set: LightWeightSet<T>): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| set | LightWeightSet<T> | 是 | 提供添加元素的LightWeightSet。 | +| set | LightWeightSet<T> | 是 | 提供添加元素的lightWeightSet。 | **示例:** @@ -102,7 +102,7 @@ lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightSet.add("sdfs"); let set = new LightWeightSet(); set.add("sfage"); -lightWeightSet.addAll(set); +let result = lightWeightSet.addAll(set); ``` @@ -138,29 +138,29 @@ let result = lightWeightSet.hasAll(set); ### has -has(value: T): boolean; +has(key: T): boolean -判断此容器中是否含有该指定value。 +判断此容器中是否含有该指定key。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 指定元素 | +| value | T | 是 | 指定key | **返回值:** | 类型 | 说明 | | -------- | -------- | -| boolean | 包含指定元素返回true,否则返回false。 | +| boolean | 包含指定key返回true,否则返回false。 | **示例:** ``` let lightWeightSet = new LightWeightSet(); -lightWeightSet.has(123); +let result = lightWeightSet.has(123); lightWeightSet.add(123); -lightWeightSet.has(123); +let result = lightWeightSet.has(123); ``` @@ -195,7 +195,7 @@ let result = lightWeightSet.equal(obj); ### ensureCapacityTo -ensureCapacityTo(minimumCapacity: number): void +increaseCapacityTo(minimumCapacity: number): void 将当前容器扩容至可以容纳指定数量元素。 @@ -229,7 +229,7 @@ getIndexOf(key: T): number | 类型 | 说明 | | -------- | -------- | -| number | 在LightWeightSet中指定数据的下标。 | +| number | 在lightWeightSet中指定数据的下标。 | **示例:** @@ -237,7 +237,7 @@ getIndexOf(key: T): number let lightWeightSet = new LightWeightSet(); lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightSet.add("sdfs"); -lightWeightSet.getIndexOf("sdfs"); +let result = lightWeightSet.getIndexOf("sdfs"); ``` @@ -245,13 +245,13 @@ lightWeightSet.getIndexOf("sdfs"); remove(key: T): T -删除指定的元素。 +删除并返回指定key对应的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | T | 是 | 依据key指定删除的元素。 | +| key | T | 是 | 指定key。 | **返回值:** @@ -265,7 +265,7 @@ remove(key: T): T let lightWeightSet = new LightWeightSet(); lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightSet.add("sdfs"); -lightWeightSet.remove("sdfs"); +let result = lightWeightSet.remove("sdfs"); ``` @@ -273,13 +273,13 @@ lightWeightSet.remove("sdfs"); removeAt(index: number): boolean -删除指定下标的元素。 +删除指定下标所对应的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| index | number | 是 | 指定想要删除元素下标。 | +| index | number | 是 | 指定下标。 | **返回值:** @@ -293,7 +293,7 @@ removeAt(index: number): boolean let lightWeightSet = new LightWeightSet(); lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightSet.add("sdfs"); -lightWeightSet.removeAt(1); +let result = lightWeightSet.removeAt(1); ``` @@ -301,19 +301,19 @@ lightWeightSet.removeAt(1); getValueAt(index: number): T -获取此容器中具体位置的元素。 +获取此容器中指定下标对应的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| index | number | 是 | 指定查询数据下标。 | +| index | number | 是 | 指定下标。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| T | 返回指定位置中元素。 | +| T | 返回指定下标对应的元素。 | **参数:** @@ -321,7 +321,7 @@ getValueAt(index: number): T let lightWeightSet = new LightWeightSet(); lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightSet.add("sdfs"); -lightWeightSet.getValueAt(1); +let result = lightWeightSet.getValueAt(1); ``` @@ -359,7 +359,7 @@ toString(): String let lightWeightSet = new LightWeightSet(); lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightSet.add("sdfs"); -lightWeightSet.toString(); +let result = lightWeightSet.toString(); ``` @@ -381,7 +381,7 @@ toArray(): Array<T> let lightWeightSet = new LightWeightSet(); lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); lightWeightSet.add("sdfs"); -lightWeightSet.toString(); +let result = lightWeightSet.toArray(); ``` @@ -389,7 +389,7 @@ lightWeightSet.toString(); values(): IterableIterator<T> -返回包含此映射中包含的键的新迭代器对象。 +返回包含此映射中包含的键值的新迭代器对象。 **返回值:** @@ -414,7 +414,7 @@ while(index < lightWeightSet.length) { ### forEach -forEach(callbackfn: (value: T, key?: T, lightWeightSet?: LightWeightSet<T>) => void, thisArg?: Object): void +forEach(callbackfn: (value: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object): void 通过回调函数来遍历LightWeightSet实例对象上的元素以及元素对应的下标。 @@ -430,7 +430,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | T | 是 | 当前遍历到的元素。 | | key | T | 否 | 当前遍历到的元素(和value相同)。 | -| lightWeightSet | LightWeightSet<T> | 否 | 当前调用forEach方法的实例对象。 | +| set | LightWeightSet<T> | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -448,7 +448,7 @@ lightWeightSet.forEach((value, key) => { entries(): IterableIterator<[T, T]> -返回包含此映射中包含的键的新迭代器对象。 +返回包含此映射中包含的键值对的新迭代器对象。 **返回值:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-linkedlist.md b/zh-cn/application-dev/reference/apis/js-apis-linkedlist.md index 24a6202ab65..93785e13e76 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-linkedlist.md +++ b/zh-cn/application-dev/reference/apis/js-apis-linkedlist.md @@ -27,7 +27,7 @@ SystemCapability.Utils.Lang ### constructor -constructor(_head?: NodeObj<T>, _tail?: NodeObj<T>) +constructor(head?: NodeObj<T>, tail?: NodeObj<T>) LinkedList的构造函数。 @@ -35,8 +35,8 @@ LinkedList的构造函数。 | 参数名 | 类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| _head | NodeObj<T> | 是 | 否 | 节点对象,含有element、next指向和prev指向。 | -| _tail | NodeObj<T> | 是 | 否 | 节点对象,含有element、next指向和prev指向。 | +| head | NodeObj<T> | 是 | 否 | 节点对象,含有element、next指向和prev指向。 | +| tail | NodeObj<T> | 是 | 否 | 节点对象,含有element、next指向和prev指向。 | **示例:** @@ -67,12 +67,12 @@ add(element: T): boolean ``` let linkedList = new LinkedList(); -linkedList.add("a"); -linkedList.add(1); +let result = linkedList.add("a"); +let result = linkedList.add(1); let b = [1, 2, 3]; linkedList.add(b); let c = {name : "lala", age : "13"}; -linkedList.add(false); +let result3 = linkedList.add(false); ``` ### addFirst @@ -101,7 +101,7 @@ linkedList.addFirst(false); ### insert -insert(element: T, index: number): void +insert(index: number, element: T): void 在长度范围内任意插入指定元素。 @@ -116,9 +116,9 @@ insert(element: T, index: number): void ``` let linkedList = new LinkedList(); -linkedList.insert("A", 0); -linkedList.insert(0, 1); -linkedList.insert(true, 2); +linkedList.insert(0, "A"); +linkedList.insert(1, 0); +linkedList.insert(2, true); ``` ### has @@ -143,9 +143,9 @@ has(element: T): boolean ``` let linkedList = new LinkedList(); -linkedList.has("Ahfbrgrbgnutfodgorrogorg"); +let result1 = linkedList.has("Ahfbrgrbgnutfodgorrogorg"); linkedList.add("Ahfbrgrbgnutfodgorrogorg"); -linkedList.has("Ahfbrgrbgnutfodgorrogorg"); +let result = linkedList.has("Ahfbrgrbgnutfodgorrogorg"); ``` ### get @@ -177,7 +177,7 @@ linkedList.add(2); linkedList.add(1); linkedList.add(2); linkedList.add(4); -linkedList.get(2); +let result = linkedList.get(2); ``` ### getLastIndexOf @@ -209,7 +209,7 @@ linkedList.add(2); linkedList.add(1); linkedList.add(2); linkedList.add(4); -linkedList.getLastIndexOf(2); +let result = linkedList.getLastIndexOf(2); ``` ### getIndexOf @@ -241,7 +241,7 @@ linkedList.add(2); linkedList.add(1); linkedList.add(2); linkedList.add(4); -linkedList.getIndexOf(2); +let result = linkedList.getIndexOf(2); ``` ### removeByIndex @@ -271,7 +271,7 @@ linkedList.add(4); linkedList.add(5); linkedList.add(2); linkedList.add(4); -linkedList.removeByIndex(2); +let result = linkedList.removeByIndex(2); ``` ### removeFirst @@ -295,7 +295,7 @@ linkedList.add(4); linkedList.add(5); linkedList.add(2); linkedList.add(4); -linkedList.removeFirst(); +let result = linkedList.removeFirst(); ``` ### removeLast @@ -319,14 +319,14 @@ linkedList.add(4); linkedList.add(5); linkedList.add(2); linkedList.add(4); -linkedList.removeLast(); +let result = linkedList.removeLast(); ``` ### remove remove(element: T): boolean -删除指定的元素。 +删除查找到的第一个指定的元素。 **参数:** @@ -348,7 +348,7 @@ linkedList.add(2); linkedList.add(4); linkedList.add(5); linkedList.add(4); -linkedList.remove(2); +let result = linkedList.remove(2); ``` ### removeFirstFound @@ -377,7 +377,7 @@ linkedList.add(2); linkedList.add(4); linkedList.add(5); linkedList.add(4); -linkedList.removeFirstFound(4); +let result = linkedList.removeFirstFound(4); ``` ### removeLastFound @@ -406,7 +406,7 @@ linkedList.add(2); linkedList.add(4); linkedList.add(5); linkedList.add(4); -linkedList.removeLastFound(4); +let result = linkedList.removeLastFound(4); ``` ### clone @@ -430,11 +430,11 @@ linkedList.add(2); linkedList.add(4); linkedList.add(5); linkedList.add(4); -linkedList.clone(); +let result = linkedList.clone(); ``` ### forEach -forEach(callbackfn: (value: T, index?: number, linkedlist?: LinkedList<T>) => void, +forEach(callbackfn: (value: T, index?: number, LinkedList?: LinkedList<T>) => void, thisArg?: Object): void 通过回调函数来遍历LinkedList实例对象上的元素以及元素对应的下标。 @@ -452,7 +452,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | T | 是 | 当前遍历到的元素。 | | index | number | 否 | 当前遍历到的下标值。 | -| linkedlist | LinkedList<T> | 否 | 当前调用forEach方法的实例对象。 | +| LinkedList | LinkedList<T> | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -484,8 +484,7 @@ linkedList.clear(); ``` ### set -set(index: number, element: T): void - +set(index: number, element: T): T 将此LinkedList中指定位置的元素替换为指定元素。 **参数:** @@ -495,6 +494,12 @@ set(index: number, element: T): void | index | number | 是 | 查找的下标值。 | | element | T | 是 | 用来替换的元素。 | +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| T | 返回替换后的元素。 | + **示例:** ``` @@ -503,7 +508,7 @@ linkedList.add(2); linkedList.add(4); linkedList.add(5); linkedList.add(4); -linkedList.set(2, "b"); +let result = linkedList.set(2, "b"); ``` ### convertToArray @@ -524,7 +529,7 @@ linkedList.add(2); linkedList.add(4); linkedList.add(5); linkedList.add(4); -linkedList.convertToArray(); +let result = linkedList.convertToArray(); ``` ### getFirst @@ -547,7 +552,7 @@ linkedList.add(2); linkedList.add(4); linkedList.add(5); linkedList.add(4); -linkedList.getFirst(); +let result = linkedList.getFirst(); ``` ### getLast diff --git a/zh-cn/application-dev/reference/apis/js-apis-list.md b/zh-cn/application-dev/reference/apis/js-apis-list.md index 4c832c5776d..f8d0856f180 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-list.md +++ b/zh-cn/application-dev/reference/apis/js-apis-list.md @@ -27,7 +27,7 @@ SystemCapability.Utils.Lang ### constructor -constructor(_head?: NodeObj<T>) +constructor(head?: NodeObj<T>) List的构造函数。 @@ -35,7 +35,7 @@ List的构造函数。 | 参数名 | 类型 | 可读 | 说明 | | -------- | -------- | -------- | -------- | -| _head | NodeObj<T> | 是 | 节点对象,含有element、next指向。 | +| head | NodeObj<T> | 是 | 节点对象,含有element、next指向。 | **示例:** @@ -66,12 +66,12 @@ add(element: T): boolean ``` let list = new List; -list.add("a"); -list.add(1); +let result = list.add("a"); +let result1 = list.add(1); let b = [1, 2, 3]; list.add(b); let c = {name : "lala", age : "13"}; -list.add(false); +let result3 = list.add(false); ``` ### insert @@ -118,9 +118,9 @@ has(element: T): boolean ``` let list = new List(); -list.has("Ahfbrgrbgnutfodgorrogorg"); +let result = list.has("Ahfbrgrbgnutfodgorrogorg"); list.add("Ahfbrgrbgnutfodgorrogorg"); -list.has("Ahfbrgrbgnutfodgorrogorg"); +let result1 = list.has("Ahfbrgrbgnutfodgorrogorg"); ``` ### get @@ -152,7 +152,7 @@ list.add(2); list.add(1); list.add(2); list.add(4); -list.get(2); +let result = list.get(2); ``` ### getLastIndexOf @@ -184,7 +184,7 @@ list.add(2); list.add(1); list.add(2); list.add(4); -list.getLastIndexOf(2); +let result = list.getLastIndexOf(2); ``` ### getIndexOf @@ -203,7 +203,7 @@ getIndexOf(element: T): number | 类型 | 说明 | | -------- | -------- | -| number | 返回第一次找到指定元素的下标,没有找到返回-1 | +| number | 返回第一次找到指定元素的下标,没有找到返回-1。 | **示例:** @@ -217,6 +217,7 @@ list.add(1); list.add(2); list.add(4); list.getIndexOf(2); +let result = list.getIndexOf(2); ``` ### equal @@ -251,7 +252,7 @@ obj1.add(4); obj1.add(5); list.equal(obj1); let obj2 = {name : "lala", age : "13"}; -list.equal(obj2); +let result = list.equal(obj2); ``` ### removeByIndex @@ -281,7 +282,7 @@ list.add(4); list.add(5); list.add(2); list.add(4); -list.removeByIndex(2); +let result = list.removeByIndex(2); ``` ### remove @@ -294,7 +295,7 @@ remove(element: T): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| element | T | 是 | 指定元素 | +| element | T | 是 | 指定元素。 | **返回值:** @@ -310,7 +311,7 @@ list.add(2); list.add(4); list.add(5); list.add(4); -list.remove(2); +let result = list.remove(2); ``` ### replaceAllElements @@ -332,7 +333,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | T | 是 | 当前遍历到的元素。 | | index | number | 否 | 当前遍历到的下标值。 | -| list | List<T> | 否 | 当前调用replaceAllElements方法的实例对象 | +| list | List<T> | 否 | 当前调用replaceAllElements方法的实例对象。 | **示例:** @@ -351,7 +352,7 @@ list.replaceAllElements((value, index) => { ``` ### forEach -forEach(callbackfn: (value: T, index?: number, list?: List<T>) => void, +forEach(callbackfn: (value: T, index?: number, List?: List<T>) => void, thisArg?: Object): void 通过回调函数来遍历List实例对象上的元素以及元素对应的下标。 @@ -360,8 +361,8 @@ thisArg?: Object): void | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| callbackfn | function | 是 | 回调函数 | -| thisArg | Object | 否 | callbackfn被调用时用作this值 | +| callbackfn | function | 是 | 回调函数。 | +| thisArg | Object | 否 | callbackfn被调用时用作this值。 | callbackfn的参数说明: @@ -369,7 +370,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | T | 是 | 当前遍历到的元素。 | | index | number | 否 | 当前遍历到的下标值。 | -| list | List<T> | 否 | 当前调用forEach方法的实例对象 | +| List | List<T> | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -431,7 +432,7 @@ getSubList(fromIndex: number, toIndex: number): List<T> | 类型 | 说明 | | -------- | -------- | -| List<T> | 返回List对象实例 | +| List<T> | 返回List对象实例。 | **示例:** @@ -441,9 +442,9 @@ list.add(2); list.add(4); list.add(5); list.add(4); -list.subList(2, 4); -list.subList(4, 3); -list.subList(2, 6); +let result = list.subList(2, 4); +let result1 = list.subList(4, 3); +let result2 = list.subList(2, 6); ``` ### clear @@ -463,7 +464,7 @@ list.clear(); ``` ### set -set(index: number, element: T): void +set(index: number, element: T): T 将此 List 中指定位置的元素替换为指定元素。 **参数:** @@ -473,6 +474,12 @@ set(index: number, element: T): void | index | number | 是 | 查找的下标值。 | | element | T | 是 | 用来替换的元素。 | +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| T | 返回替换后的元素 | + **示例:** ``` @@ -504,7 +511,7 @@ list.add(2); list.add(4); list.add(5); list.add(4); -list.convertToArray(); +let result = list.convertToArray(); ``` ### isEmpty @@ -526,7 +533,7 @@ list.add(2); list.add(4); list.add(5); list.add(4); -list.isEmpty(); +let result = list.isEmpty(); ``` ### getFirst @@ -549,7 +556,7 @@ list.add(2); list.add(4); list.add(5); list.add(4); -list.getFirst(); +let result = list.getFirst(); ``` ### getLast @@ -572,7 +579,7 @@ list.add(2); list.add(4); list.add(5); list.add(4); -list.getLast(); +let result = list.getLast(); ``` ### [Symbol.iterator] diff --git a/zh-cn/application-dev/reference/apis/js-apis-plainarray.md b/zh-cn/application-dev/reference/apis/js-apis-plainarray.md index 65183ed8035..ab5dc6d0d61 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-plainarray.md +++ b/zh-cn/application-dev/reference/apis/js-apis-plainarray.md @@ -53,7 +53,7 @@ isEmpty(): boolean ``` const plainArray = new PlainArray(); -plainArray.isEmpty(); +let result = plainArray.isEmpty(); ``` @@ -67,13 +67,13 @@ has(key: number): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | number | 是 | 查询的元素。 | +| key | number | 是 | 指定key。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| boolean | 包含指定元素返回true,否则返回false。 | +| boolean | 包含指定key返回true,否则返回false。 | **示例:** @@ -81,7 +81,7 @@ has(key: number): boolean let plainArray = new PlainArray(); plainArray.has(1); plainArray.add(1, "sddfhf"); -plainArray.has(1); +let result1 = plainArray.has(1); ``` @@ -109,7 +109,7 @@ get(key: number): T let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); -plainArray.get(1); +let result = plainArray.get(1); ``` @@ -123,13 +123,13 @@ getIndexOfKey(key: number): number; | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | number | 是 | 被查找的元素。 | +| key | number | 是 | 指定key。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| number | 返回指定元素第一次出现时的下标值,查找失败返回-1。 | +| number | 返回指定key第一次出现时的下标值,查找失败返回-1。 | **示例:** @@ -137,7 +137,7 @@ getIndexOfKey(key: number): number; let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); -plainArray.getIndexOfKey("sdfs"); +let result = plainArray.getIndexOfKey("sdfs"); ``` @@ -151,7 +151,7 @@ getIndexOfValue(value: T): number; | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 被查找的元素。 | +| value | T | 是 | 指定元素。 | **返回值:** @@ -165,7 +165,7 @@ getIndexOfValue(value: T): number; let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); -plainArray.getIndexOfValue("sddfhf"); +let result = plainArray.getIndexOfValue("sddfhf"); ``` @@ -179,13 +179,13 @@ getKeyAt(index: number): number; | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| index | number | 是 | 所查找的下标。 | +| index | number | 是 | 指定下标。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| number | 返回该下标对应的元素键值对中key值,失败返回undefined。 | +| number | 返回该下标对应的元素键值对中key值,失败返回-1。 | **示例:** @@ -193,17 +193,41 @@ getKeyAt(index: number): number; let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); -plainArray.getKeyAt(1); +let result = plainArray.getKeyAt(1); ``` +### getValueAt + +getValueAt(index: number): T + +查找指定下标元素键值对中Value值,否则返回undefined。 + +**参数:** + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | index | number | 是 | 指定下标。 | + +**返回值:** + + | 类型 | 说明 | + | -------- | -------- | + | T | 返回该下标对应的元素键值对中key值,失败返回undefined。 | + +**示例:** + + ``` + let plainArray = new PlainArray(); + plainArray.add(1, "sddfhf"); + plainArray.add(2, "sffdfhf"); + let result = plainArray.getKeyAt(1); + ``` ### clone clone(): PlainArray<T> -克隆一个实例,并返回克隆后的实例。 - -修改克隆后的实例并不会影响原实例。 +克隆一个实例,并返回克隆后的实例。修改克隆后的实例并不会影响原实例。 **返回值:** @@ -223,7 +247,7 @@ let newPlainArray = plainArray.clone(); ### add -add(key: number, value: T): boolean +add(key: number, value: T): void 向容器中添加一组数据。 @@ -234,12 +258,6 @@ add(key: number, value: T): boolean | key | number | 是 | 添加成员数据的键名。 | | value | T | 是 | 添加成员数据的值。 | -**返回值:** - -| 类型 | 说明 | -| -------- | -------- | -| boolean | 成功添加返回true,否则返回false。 | - **示例:** ``` @@ -252,13 +270,13 @@ plainArray.add(1, "sddfhf"); remove(key: number): T -删除指定的元素。 +删除指定key对应元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | number | 是 | 根据key删除的指定元素。 | +| key | number | 是 | 指定key。 | **返回值:** @@ -273,14 +291,15 @@ let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); plainArray.remove(2); +let result = plainArray.remove(2); ``` ### removeAt -removeAt(index: number): boolean; +removeAt(index: number): T -删除指定下标的元素。 +删除指定下标对应的元素。 **参数:** @@ -292,7 +311,7 @@ removeAt(index: number): boolean; | 类型 | 说明 | | -------- | -------- | -| boolean | 成功删除元素返回true,否则返回false。 | +| T | 返回删除的元素。 | **示例:** @@ -301,6 +320,7 @@ let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); plainArray.removeAt(1); +let result = plainArray.removeAt(1); ``` @@ -329,22 +349,22 @@ removeRangeFrom(index: number, size: number): number let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); -plainArray.removeAt(1, 3); +let result = plainArray.removeRangeFrom(1, 3); ``` ### setValueAt -setValueAt(index: number, newValue: T): void +setValueAt(index: number, value: T): void -向容器中具体位置替换键值对中的值。 +替换容器中指定下标对应键值对中的键值。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | index | number | 是 | 指定替换数据下标。 | -| newValue | T | 是 | 替换键值对中的值。 | +| value | T | 是 | 替换键值对中的值。 | **示例:** @@ -374,7 +394,7 @@ toString(): String let plainArray = new PlainArray(); plainArray.add(1, "sddfhf"); plainArray.add(2, "sffdfhf"); -plainArray.toString(); +let result = plainArray.toString(); ``` @@ -396,7 +416,7 @@ plainArray.clear(); ### forEach -forEach(callbackfn: (value: T, key?: number, plainArray?: PlainArray) => void, thisArg?: Object): void +forEach(callbackfn: (value: T, key?: number, PlainArray?: PlainArray) => void, thisArg?: Object): void 通过回调函数来遍历实例对象上的元素以及元素对应的下标。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-queue.md b/zh-cn/application-dev/reference/apis/js-apis-queue.md index 1ccf500073f..bfabc48531a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-queue.md +++ b/zh-cn/application-dev/reference/apis/js-apis-queue.md @@ -60,12 +60,13 @@ add(element: T): boolean ``` let queue = new Queue(); -queue.add("a"); +let result = queue.add("a"); +let result1 = queue.add(1); queue.add(1); let b = [1, 2, 3]; queue.add(b); let c = {name : "lala", age : "13"}; -queue.add(false); +let result3 = queue.add(c); ``` ### pop @@ -89,7 +90,7 @@ queue.add(4); queue.add(5); queue.add(2); queue.add(4); -queue.pop(); +let result = queue.pop(); ``` ### getFirst @@ -112,11 +113,11 @@ queue.add(2); queue.add(4); queue.add(5); queue.add(2); -queue.getFirst(); +let result = queue.getFirst(); ``` ### forEach -forEach(callbackfn: (value: T, index?: number, queue?: Queue<T>) => void, +forEach(callbackfn: (value: T, index?: number, Queue?: Queue<T>) => void, thisArg?: Object): void 通过回调函数来遍历Queue实例对象上的元素以及元素对应的下标。 @@ -132,9 +133,9 @@ callbackfn的参数说明: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 当前遍历到的元素 | -| index | number | 否 | 当前遍历到的下标值 | -| queue | Queue<T> | 否 | 当前调用forEach方法的实例对象 | +| value | T | 是 | 当前遍历到的元素。 | +| index | number | 否 | 当前遍历到的下标值。 | +| Queue | Queue<T> | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -161,7 +162,7 @@ queue.forEach((value, index) => { | 类型 | 说明 | | -------- | -------- | -| IterableIterator<T> | 返回一个迭代器 | +| IterableIterator<T> | 返回一个迭代器。 | **示例:** ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-stack.md b/zh-cn/application-dev/reference/apis/js-apis-stack.md index bac8197f592..0341c7ca836 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-stack.md +++ b/zh-cn/application-dev/reference/apis/js-apis-stack.md @@ -60,12 +60,12 @@ push(item: T): T ``` let stack = new Stack(); -stack.push("a"); -stack.push(1); +let result = stack.push("a"); +let result1 = stack.push(1); let b = [1, 2, 3]; stack.push(b); let c = {name : "lala", age : "13"}; -stack.push(false); +let result3 = stack.push(c); ``` ### pop @@ -89,7 +89,7 @@ stack.push(4); stack.push(5); stack.push(2); stack.push(4); -stack.pop(); +let result = stack.pop(); ``` ### peek @@ -112,7 +112,7 @@ stack.push(2); stack.push(4); stack.push(5); stack.push(2); -stack.peek(); +let result = stack.peek(); ``` ### locate @@ -141,7 +141,7 @@ stack.push(2); stack.push(4); stack.push(5); stack.push(2); -stack.locate(2); +let result = stack.locate(2); ``` ### forEach @@ -197,7 +197,7 @@ stack.push(2); stack.push(4); stack.push(5); stack.push(4); -stack.isEmpty(); +let result = stack.isEmpty(); ``` ### [Symbol.iterator] diff --git a/zh-cn/application-dev/reference/apis/js-apis-treemap.md b/zh-cn/application-dev/reference/apis/js-apis-treemap.md index c66771b269d..e31c6540de6 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-treemap.md +++ b/zh-cn/application-dev/reference/apis/js-apis-treemap.md @@ -21,7 +21,7 @@ SystemCapability.Utils.Lang | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| length | number | 是 | 否 | TreeMap的元素个数 | +| length | number | 是 | 否 | TreeMap的元素个数。 | ### constructor @@ -59,7 +59,7 @@ isEmpty(): boolean; ``` const treeMap = new TreeMap(); -treeMap.isEmpty(); +let result = treeMap.isEmpty(); ``` @@ -73,21 +73,21 @@ hasKey(key: K): boolean; | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | K | 是 | 指定元素 | +| key | K | 是 | 指定key | **返回值:** | 类型 | 说明 | | -------- | -------- | -| boolean | 包含指定元素返回true,否则返回false。 | +| boolean | 包含指定key返回true,否则返回false。 | **示例:** ``` let treeMap = new TreeMap(); -treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); -treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result1 = treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` @@ -95,7 +95,7 @@ treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); hasValue(value: V): boolean -判断此容器中是否含有该指定value。 +判断此容器中是否含有该指定元素。 **参数:** @@ -113,9 +113,9 @@ hasValue(value: V): boolean ``` let treeMap = new TreeMap(); -treeMap.hasValue(123); +let result = treeMap.hasValue(123); treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); -treeMap.hasValue(123); +let result1 = treeMap.hasValue(123); ``` @@ -129,7 +129,7 @@ get(key: K): V | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | K | 是 | 查找的指定key。 | +| key | K | 是 | 指定key。 | **返回值:** @@ -143,7 +143,7 @@ get(key: K): V let treeMap = new TreeMap(); treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); treeMap.set("sdfs", 356); -treeMap.get("sdfs"); +let result = treeMap.get("sdfs"); ``` @@ -151,13 +151,13 @@ treeMap.get("sdfs"); getFirstKey(): K; -获取容器中排序第一的数据。 +获取容器中排序第一的key。 **返回值:** | 类型 | 说明 | | -------- | -------- | -| K | 返回排序第一的数据。 | +| K | 返回排序第一的key。 | **示例:** @@ -173,13 +173,13 @@ let result = treeMap.getFirstKey(); getLastKey(): K; -获取容器中排序最后的数据。 +获取容器中排序最后的key。 **返回值:** | 类型 | 说明 | | -------- | -------- | -| K | 返回排序最后的数据 | +| K | 返回排序最后的key | **示例:** @@ -195,13 +195,13 @@ let result = treeMap.getLastKey(); setAll(map: TreeMap): void -将一个treemap中的所有元素组添加到另一个treemap中。 +将一个treemap中的所有元素组添加到另一个treeMap中。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| map | TreeMap | 是 | 被添加元素的TreeMap。 | +| map | TreeMap | 是 | 被添加元素的treeMap。 | **示例:** @@ -230,7 +230,7 @@ set(key: K, value: V): Object | 类型 | 说明 | | -------- | -------- | -| Object | 返回添加后的treemap | +| Object | 返回添加后的treeMap | **示例:** @@ -244,13 +244,13 @@ treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); remove(key: K): V; -删除指定的元素。 +删除指定key对应的元素。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | K | 是 | 依据key指定删除的元素。 | +| key | K | 是 | 指定key。 | **返回值:** @@ -268,9 +268,9 @@ treeMap.remove("sdfs"); ``` -### getLowerByKey +### getLowerKey -getLowerByKey(key: K): K +getLowerKey(key: K): K 获取容器中比传入key排序靠前一位的key。 @@ -293,13 +293,13 @@ let treeMap = new TreeMap(); treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); treeMap.set("sdfs", 356); treeMap.set("zdfgsd", 356); -let result = treeMap.getLowerByKey("sdfs"); +let result = treeMap.getLowerKey("sdfs"); ``` -### getHigherByKey +### getHigherKey -getHigherByKey(key: K): K +getHigherKey(key: K): K 获取容器中比传入key排序靠后一位的key。 @@ -322,12 +322,11 @@ let treeMap = new TreeMap(); treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); treeMap.set("sdfs", 356); treeMap.set("zdfgsd", 356); -let result = treeMap.getHigherByKey("sdfs"); +let result = treeMap.getHigherKey("sdfs"); ``` - ### replace -replace(key: K, value: V): boolean +replace(key: K, newValue: V): boolean 对TreeMap中一组数据进行更新(替换)。 @@ -335,21 +334,21 @@ replace(key: K, value: V): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | K | 是 | 依据key指定替换的元素。 | -| value | V | 是 | 成员数据的新值。 | +| key | K | 是 | 指定key。 | +| newValue | V | 是 | 替换的元素。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| boolean | 成功对已有数据进行替换返回true,否则返回false。 | +| boolean | 对指定key对应的元素替换成功返回true,否则返回false。 | **示例:** ``` let treeMap = new TreeMap(); treeMap.set("sdfs", 123); -treeMap.replace("sdfs", 357); +let result = treeMap.replace("sdfs", 357); ``` @@ -425,7 +424,7 @@ while(temp != undefined) { ### forEach -forEach(callbackfn: (value: V, key?: K, treeMap?: TreeMap) => void, thisArg?: Object): void +forEach(callbackfn: (value: V, key?: K, map?: TreeMap) => void, thisArg?: Object): void 通过回调函数来遍历实例对象上的元素以及元素对应的下标。 @@ -441,7 +440,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | V | 是 | 当前遍历到的元素键值对的值。 | | key | K | 是 | 当前遍历到的元素键值对的键。 | -| treeMap | TreeMap | 否 | 当前调用forEach方法的实例对象。 | +| map | TreeMap | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -459,7 +458,7 @@ treeMap.forEach((value, key) => { entries(): IterableIterator<[K, V]> -返回包含此映射中包含的元素的新迭代器对象。 +返回包含此映射中包含的键值对的新迭代器对象。 **返回值:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-treeset.md b/zh-cn/application-dev/reference/apis/js-apis-treeset.md index ccc118ddc5f..48c65fea232 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-treeset.md +++ b/zh-cn/application-dev/reference/apis/js-apis-treeset.md @@ -59,7 +59,7 @@ isEmpty(): boolean ``` const treeSet = new TreeSet(); -treeSet.isEmpty(); +let result = treeSet.isEmpty(); ``` @@ -67,7 +67,7 @@ treeSet.isEmpty(); has(value: T): boolean -判断此容器中是否含有该指定value。 +判断此容器中是否含有该指定元素。 **参数:** @@ -87,7 +87,7 @@ has(value: T): boolean let treeSet = new TreeSet(); treeSet.has(123); treeSet.add(123); -treeSet.has(123); +let result1 = treeSet.has(123); ``` @@ -156,13 +156,13 @@ add(value: T): boolean ``` let treeSet = new TreeSet(); -treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` ### remove -remove(key: T): boolean +remove(value: T): boolean; 删除指定的元素。 @@ -170,7 +170,7 @@ remove(key: T): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| key | T | 是 | 指定的元素。 | +| value | T | 是 | 指定的元素。 | **返回值:** @@ -184,7 +184,7 @@ remove(key: T): boolean let treeSet = new TreeSet(); treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); treeSet.add("sdfs"); -treeSet.remove("sdfs"); +let result = treeSet.remove("sdfs"); ``` @@ -233,7 +233,7 @@ getHigherValue(key: T): T | 类型 | 说明 | | -------- | -------- | -| T | 返回排序中传入元素后一位的数据 | +| T | 返回排序中传入元素后一位的数据。 | **示例:** @@ -278,7 +278,7 @@ popLast(): T | 类型 | 说明 | | -------- | -------- | -| T | 返回删除的数据 | +| T | 返回删除的数据。 | **返回值:** @@ -335,7 +335,7 @@ while(temp != undefined) { ### forEach -forEach(callbackfn: (value: T, key?: T, treeSet?: TreeSet<T>) => void, thisArg?: Object): void +forEach(callbackfn: (value: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object): void 通过回调函数来遍历实例对象上的元素以及元素对应的下标。 @@ -351,7 +351,7 @@ callbackfn的参数说明: | -------- | -------- | -------- | -------- | | value | T | 是 | 当前遍历到的元素。 | | key | T | 否 | 当前遍历到的元素(和value相同)。 | -| treeSet | TreeSet<T> | 否 | 当前调用forEach方法的实例对象。 | +| set | TreeSet<T> | 否 | 当前调用forEach方法的实例对象。 | **示例:** @@ -369,7 +369,7 @@ treeSet.forEach((value, key) => { entries(): IterableIterator<[T, T]> -返回包含此映射中包含的元素的新迭代器对象。 +返回包含此映射中包含的键值对的新迭代器对象。 **返回值:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-vector.md b/zh-cn/application-dev/reference/apis/js-apis-vector.md index c3e4ed2235f..d19a085e419 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-vector.md +++ b/zh-cn/application-dev/reference/apis/js-apis-vector.md @@ -48,24 +48,24 @@ add(element: T): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| element | T | 是 | 添加进去的元素 | +| element | T | 是 | 添加进去的元素。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| boolean | 插入成功返回true,失败返回false | +| boolean | 插入成功返回true,失败返回false。 | **示例:** ``` let vector = new Vector(); -vector.add("a"); -vector.add(1); +let result = vector.add("a"); +let result1 = vector.add(1); let b = [1, 2, 3]; vector.add(b); let c = {name : "lala", age : "13"}; -vector.add(false); +let result3 = vector.add(c); ``` ### insert @@ -78,8 +78,8 @@ insert(element: T, index: number): void | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| element | T | 是 | 被插入的元素 | -| index | number | 是 | 被插入的位置索引 | +| element | T | 是 | 被插入的元素。 | +| index | number | 是 | 被插入的位置索引。 | **示例:** @@ -100,21 +100,21 @@ has(element: T): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| element | T | 是 | 指定的元素 | +| element | T | 是 | 指定的元素。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| boolean | 是否包含指定元素 | +| boolean | 是否包含指定元素。 | **示例:** ``` let vector = new Vector(); -vector.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = vector.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); vector.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); -vector.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result = vector.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); ``` ### getIndexOf @@ -127,13 +127,13 @@ getIndexOf(element: T): number | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| element | T | 是 | 指定的元素 | +| element | T | 是 | 指定的元素。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| number | 返回指定元素第一次出现时的下标值,查找失败返回-1 | +| number | 返回指定元素第一次出现时的下标值,查找失败返回-1。 | **示例:** @@ -146,7 +146,7 @@ vector.add(2); vector.add(1); vector.add(2); vector.add(4); -vector.getIndexOf(2); +let result = vector.getIndexOf(2); ``` ### getLastIndexOf @@ -178,7 +178,7 @@ vector.add(2); vector.add(1); vector.add(2); vector.add(4); -vector.getLastIndexOf(2); +let result = vector.getLastIndexOf(2); ``` ### removeByIndex @@ -208,7 +208,7 @@ vector.add(4); vector.add(5); vector.add(2); vector.add(4); -vector.removeByIndex(2); +let result = vector.removeByIndex(2); ``` ### remove @@ -237,7 +237,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.remove(2); +let result = vector.remove(2); ``` ### removeByRange @@ -282,9 +282,9 @@ callbackfn的参数说明: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 当前遍历到的元素 | -| index | number | 否 | 当前遍历到的下标值 | -| vector | Vector<T> | 否 | 当前调用replaceAllElements方法的实例对象 | +| value | T | 是 | 当前遍历到的元素。 | +| index | number | 否 | 当前遍历到的下标值。 | +| vector | Vector<T> | 否 | 当前调用replaceAllElements方法的实例对象。 | **示例:** @@ -377,8 +377,8 @@ subVector(fromIndex: number, toIndex: number): Vector<T> | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| fromIndex | number | 是 | 起始下标 | -| toIndex | number | 是 | 终止下标 | +| fromIndex | number | 是 | 起始下标。 | +| toIndex | number | 是 | 终止下标。 | **返回值:** @@ -394,9 +394,9 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.subVector(2,4); -vector.subVector(4,3); -vector.subVector(2,6); +let result = vector.subVector(2,4); +let result1 = vector.subVector(4,3); +let result2 = vector.subVector(2,6); ``` @@ -419,15 +419,13 @@ vector.clear(); ### clone clone(): Vector<T> -克隆一个与Vector相同的实例,并返回克隆后的实例。 - -修改克隆后的实例并不会影响原实例。 +克隆一个与Vector相同的实例,并返回克隆后的实例。修改克隆后的实例并不会影响原实例。 **返回值:** | 类型 | 说明 | | -------- | -------- | -| Vector<T> | 返回Vector对象实例 | +| Vector<T> | 返回Vector对象实例。 | **示例:** @@ -437,7 +435,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.clone(); +let result = vector.clone(); ``` ### getCapacity @@ -459,7 +457,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.getCapacity(); +let result = vector.getCapacity(); ``` ### convertToArray @@ -481,7 +479,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.convertToArray(); +let result = vector.convertToArray(); ``` ### isEmpty @@ -503,7 +501,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.isEmpty(); +let result = vector.isEmpty(); ``` ### increaseCapacityTo @@ -565,13 +563,12 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.toSting(); +let result = vector.toSting(); ``` ### copyToArray -copyToArray(array: Array<T>): void; - +copyToArray(array: Array<T>): void 将Vector实例中的元素按照下标复制到指定数组。 **参数:** @@ -589,7 +586,7 @@ vector.add(4); vector.add(5); vector.add(4); let array = ["a", "b", "c", "d", "e", "f"]; -vector.copyToArray(array); +let result = vector.copyToArray(array); ``` ### getFirstElement @@ -612,7 +609,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.getFirstElement(); +let result = vector.getFirstElement(); ``` ### getLastElement @@ -635,7 +632,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.getLastElement(); +let result = vector.getLastElement(); ``` ### getLastIndexFrom @@ -666,12 +663,12 @@ vector.add(4); vector.add(5); vector.add(4); vector.add("a"); -vector.getLastIndexFrom(4,3); +let result = vector.getLastIndexFrom(4,3); ``` ### getIndexFrom -getIndexFrom(element: T, index: number): number; +getIndexFrom(element: T, index: number): number 从指定索引向前搜索,返回该元素的下标索引。 @@ -697,11 +694,11 @@ vector.add(4); vector.add(5); vector.add(4); vector.add("a"); -vector.getIndexFrom(4, 3); +let result = vector.getIndexFrom(4, 3); ``` ### setLength -setLength(newSize: number): void; +setLength(newSize: number): void 设置Vector实例的元素个数。 @@ -723,6 +720,59 @@ vector.setLength(8); vector.setLength(2); ``` +### get +get(index: number): T +根据下标值获取Vector实例中的元素。 + +**参数:** + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | index | number | 是 | 查找的下标值。 | + +**返回值:** + + | 类型 | 说明 | + | -------- | -------- | + | T | 返回获取到的元素。 | + +**示例:** + + ``` + let vector = new Vector(); + vector.add(2); + vector.add(4); + vector.add(5); + vector.add(4); + let result = vector.get(2); + ``` +### set +set(index: number, element: T): T +替换指定下标对应的元素。 + +**参数:** + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | index | number | 是 | 指定下标。 | + +**返回值:** + + | 类型 | 说明 | + | -------- | -------- | + | T | 返回替换后的元素。 | + +**示例:** + + ``` + let vector = new Vector(); + vector.add(2); + vector.add(4); + vector.add(5); + vector.add(4); + let result = vector.set(2, "A"); + ``` + ### [Symbol.iterator] [Symbol.iterator]\(): IterableIterator<T> -- Gitee From c4c9e17f36605cb1daed50b86a347af0add670ee Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 1 Mar 2022 18:14:53 +0800 Subject: [PATCH 041/282] update docs Signed-off-by: shawn_he --- en/application-dev/reference/apis/js-apis-hichecker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/application-dev/reference/apis/js-apis-hichecker.md b/en/application-dev/reference/apis/js-apis-hichecker.md index dec8de1c541..70022fd0211 100644 --- a/en/application-dev/reference/apis/js-apis-hichecker.md +++ b/en/application-dev/reference/apis/js-apis-hichecker.md @@ -22,7 +22,7 @@ Provides the constants of all rule types. | Name| Type| Description| | ---------------------------------- | -------- | ------------------------------------------------------ | | RULE_CAUTION_PRINT_LOG | BigInt | Alarm rule, which is programmed to print a log when an alarm is generated.| -| RULE_CAUTION_TRIGGER_CRASH | BigInt | Alarm rule. When an alarm is generated, the application exits.| +| RULE_CAUTION_TRIGGER_CRASH | BigInt | Alarm rule, which is programmed to force the application to exit when an alarm is generated.| | RULE_THREAD_CHECK_SLOW_PROCESS | BigInt | Caution rule, which is programmed to detect whether any time-consuming function is invoked.| | RULE_CHECK_SLOW_EVENT | BigInt | Caution rule, which is programmed to detect whether the event distribution or processing time has exceeded the specified time threshold.| | RULE_CHECK_ABILITY_CONNECTION_LEAK | BigInt | Caution rule, which is programmed to detect whether ability leakage has occurred.| -- Gitee From 2549f3a54951836158babba4018206ac783aaae6 Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 1 Mar 2022 10:16:25 +0000 Subject: [PATCH 042/282] update zh-cn/device-dev/bundles/bundles-standard-rules.md. Signed-off-by: Austin --- zh-cn/device-dev/bundles/bundles-standard-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/device-dev/bundles/bundles-standard-rules.md b/zh-cn/device-dev/bundles/bundles-standard-rules.md index d52a49caa45..8560d653ac5 100644 --- a/zh-cn/device-dev/bundles/bundles-standard-rules.md +++ b/zh-cn/device-dev/bundles/bundles-standard-rules.md @@ -182,7 +182,7 @@ hpm install username@server MINGW64 /f/showcase/demo/demo $ hpm list +--demo@1.0.0 -| +--@huawei/media@1.0.2 +| +--@demo/media@1.0.2 | +--@demo/sport_hi3518ev300_liteos_a@1.0.0 | | +--@demo/app@4.0.1 | | | +--@demo/build@4.0.1 -- Gitee From 51d3ad1269a0b43c75c1fabca5cb8cdd799dc38a Mon Sep 17 00:00:00 2001 From: jackd320 Date: Tue, 1 Mar 2022 12:15:22 +0000 Subject: [PATCH 043/282] update zh-cn/application-dev/reference/apis/js-apis-update.md. Signed-off-by: jackd320 --- .../reference/apis/js-apis-update.md | 98 +++++++++++++------ 1 file changed, 67 insertions(+), 31 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-update.md b/zh-cn/application-dev/reference/apis/js-apis-update.md index 96153284d2d..b0f789003d7 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-update.md +++ b/zh-cn/application-dev/reference/apis/js-apis-update.md @@ -25,6 +25,8 @@ getUpdater(upgradeFile: string, updateType?: UpdateTypes): Updater 获取本地升级Updater。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -54,6 +56,8 @@ getUpdaterForOther(upgradeFile: string, device: string, updateType?: UpdateTypes 获取升级对象给待升级设备。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -84,6 +88,8 @@ getUpdaterFromOther(upgradeFile: string, device: string, updateType?: UpdateType 获取其它设备为本设备升级的Updater。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -116,6 +122,8 @@ getNewVersionInfo(callback: AsyncCallback\): void 获取新版本信息,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -139,6 +147,8 @@ getNewVersionInfo(): Promise\ 获取新版本信息,使用promise方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **返回值:** | 类型 | 说明 | @@ -163,6 +173,8 @@ checkNewVersion(callback: AsyncCallback\): void 检查新版本,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -186,6 +198,8 @@ checkNewVersion(): Promise\ 检查新版本,使用promise方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **返回值:** | 类型 | 说明 | @@ -210,6 +224,8 @@ verifyUpdatePackage(upgradeFile: string, certsFile: string): void 升级前检查升级包是否有效。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -232,6 +248,8 @@ rebootAndCleanUserData(): Promise\ 重启设备并清除用户分区数据。 +**系统能力**:SystemCapability.Updater.update_service + **返回值:** | 类型 | 说明 | @@ -254,6 +272,8 @@ rebootAndCleanUserData(callback: AsyncCallback\): void 重启设备并清除用户分区数据。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -274,6 +294,8 @@ applyNewVersion(): Promise\ 重启设备后安装升级包。 +**系统能力**:SystemCapability.Updater.update_service + **返回值:** | 类型 | 说明 | @@ -296,6 +318,8 @@ applyNewVersion(callback: AsyncCallback\): void 重启设备后安装升级包。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -316,6 +340,8 @@ download(): void 下载新版本,并监听下载进程。 +**系统能力**:SystemCapability.Updater.update_service + **示例:** ``` @@ -333,6 +359,8 @@ updater.upgrade():void 启动升级。 +**系统能力**:SystemCapability.Updater.update_service + **示例:** ``` @@ -350,6 +378,8 @@ setUpdatePolicy(policy: UpdatePolicy, callback: AsyncCallback\): void 设置升级策略,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -379,6 +409,8 @@ setUpdatePolicy(policy: UpdatePolicy): Promise\ 设置升级策略,使用promise方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -414,6 +446,8 @@ getUpdatePolicy(callback: AsyncCallback\): void 获取升级策略信息,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -437,6 +471,8 @@ getUpdatePolicy(): Promise\ 获取升级策略,通过promise方式作为异步方法。 +**系统能力**:SystemCapability.Updater.update_service + **返回值:** | 类型 | 说明 | @@ -461,8 +497,8 @@ update.getUpdatePolicy().then(value => { | 参数名 | 说明 | | ------ | -------- | -| OTA | OTA升级 | -| patch | 补丁升级 | +| OTA | OTA升级
**系统能力**:SystemCapability.Updater.update_service| +| patch | 补丁升级
**系统能力**:SystemCapability.Updater.update_service| ## PackageTypes @@ -470,13 +506,13 @@ update.getUpdatePolicy().then(value => { | 参数名 | 默认值 | 说明 | | -------------------- | ------ | -------------- | -| PACKAGE_TYPE_NORMAL | 1 | 通用升级包 | -| PACKAGE_TYPE_BASE | 2 | 基础升级包 | -| PACKAGE_TYPE_CUST | 3 | 定制升级包 | -| PACKAGE_TYPE_PRELOAD | 4 | 预装升级包 | -| PACKAGE_TYPE_COTA | 5 | 参数配置升级包 | -| PACKAGE_TYPE_VERSION | 6 | 版本升级包 | -| PACKAGE_TYPE_PATCH | 7 | 补丁包 | +| PACKAGE_TYPE_NORMAL | 1 | 通用升级包
**系统能力**:SystemCapability.Updater.update_service| +| PACKAGE_TYPE_BASE | 2 | 基础升级包
**系统能力**:SystemCapability.Updater.update_service| +| PACKAGE_TYPE_CUST | 3 | 定制升级包
**系统能力**:SystemCapability.Updater.update_service| +| PACKAGE_TYPE_PRELOAD | 4 | 预装升级包
**系统能力**:SystemCapability.Updater.update_service| +| PACKAGE_TYPE_COTA | 5 | 参数配置升级包
**系统能力**:SystemCapability.Updater.update_service| +| PACKAGE_TYPE_VERSION | 6 | 版本升级包
**系统能力**:SystemCapability.Updater.update_service| +| PACKAGE_TYPE_PATCH | 7 | 补丁包
**系统能力**:SystemCapability.Updater.update_service| ## InstallMode @@ -484,9 +520,9 @@ update.getUpdatePolicy().then(value => { | 参数名 | 默认值 | 说明 | | ------------------- | ------ | -------- | -| INSTALL_MODE_NORMAL | 0 | 正常升级 | -| INSTALL_MODE_NIGHT | 1 | 夜间升级 | -| INSTALL_MODE_AUTO | 2 | 自动升级 | +| INSTALL_MODE_NORMAL | 0 | 正常升级
**系统能力**:SystemCapability.Updater.update_service| +| INSTALL_MODE_NIGHT | 1 | 夜间升级
**系统能力**:SystemCapability.Updater.update_service| +| INSTALL_MODE_AUTO | 2 | 自动升级
**系统能力**:SystemCapability.Updater.update_service| ## NewVersionStatus @@ -494,10 +530,10 @@ update.getUpdatePolicy().then(value => { | 参数名 | 默认值 | 说明 | | ------------------- | ------ | ---------------- | -| VERSION_STATUS_ERR | -1 | 检测版本时出错 | -| VERSION_STATUS_NEW | 0 | 检测到新版本 | -| VERSION_STATUS_NONE | 1 | 没有检测到新版本 | -| VERSION_STATUS_BUSY | 2 | 检测版本时忙 | +| VERSION_STATUS_ERR | -1 | 检测版本时出错
**系统能力**:SystemCapability.Updater.update_service| +| VERSION_STATUS_NEW | 0 | 检测到新版本
**系统能力**:SystemCapability.Updater.update_service| +| VERSION_STATUS_NONE | 1 | 没有检测到新版本
**系统能力**:SystemCapability.Updater.update_service| +| VERSION_STATUS_BUSY | 2 | 检测版本时忙
**系统能力**:SystemCapability.Updater.update_service| ## UpdatePolicy @@ -505,9 +541,9 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | ------------------- | --------------------------- | ---- | -------------- | -| autoDownload | bool | 是 | 自动升级开关 | -| installMode | [InstallMode](#installmode) | 是 | 安装模式 | -| autoUpgradeInterval | Array\ | 是 | 自动升级时间段 | +| autoDownload | bool | 是 | 自动升级开关
**系统能力**:SystemCapability.Updater.update_service| +| installMode | [InstallMode](#installmode) | 是 | 安装模式
**系统能力**:SystemCapability.Updater.update_service| +| autoUpgradeInterval | Array\ | 是 | 自动升级时间段
**系统能力**:SystemCapability.Updater.update_service| ## NewVersionInfo @@ -515,10 +551,10 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | --------------- | ------------------------------------------- | ---- | -------- | -| status | [NewVersionStatus](#newversionstatus) | 是 | 升级状态 | -| errMsg | string | 是 | 错误信息 | -| checkResults | Array<[CheckResult](#checkresult)> | 是 | 检测结果 | -| descriptionInfo | Array\<[DescriptionInfo](#descriptioninfo)> | 是 | 描述信息 | +| status | [NewVersionStatus](#newversionstatus) | 是 | 升级状态
**系统能力**:SystemCapability.Updater.update_service| +| errMsg | string | 是 | 错误信息
**系统能力**:SystemCapability.Updater.update_service| +| checkResults | Array<[CheckResult](#checkresult)> | 是 | 检测结果
**系统能力**:SystemCapability.Updater.update_service| +| descriptionInfo | Array\<[DescriptionInfo](#descriptioninfo)> | 是 | 描述信息
**系统能力**:SystemCapability.Updater.update_service| ## CheckResult @@ -526,12 +562,12 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | ------------- | ----------------------------- | ---- | ------------ | -| versionName | string | 是 | 版本名称 | -| versionCode | number | 是 | 版本编码 | -| size | number | 是 | 版本大小 | -| verifyInfo | string | 是 | 版本校验信息 | -| packageType | [PackageTypes](#packagetypes) | 是 | 版本类型 | -| descriptionId | string | 是 | 版本描述信息 | +| versionName | string | 是 | 版本名称
**系统能力**:SystemCapability.Updater.update_service| +| versionCode | number | 是 | 版本编码
**系统能力**:SystemCapability.Updater.update_service| +| size | number | 是 | 版本大小
**系统能力**:SystemCapability.Updater.update_service| +| verifyInfo | string | 是 | 版本校验信息
**系统能力**:SystemCapability.Updater.update_service| +| packageType | [PackageTypes](#packagetypes) | 是 | 版本类型
**系统能力**:SystemCapability.Updater.update_service| +| descriptionId | string | 是 | 版本描述信息
**系统能力**:SystemCapability.Updater.update_service| ## DescriptionInfo @@ -539,5 +575,5 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | ------------- | -------- | ---- | ----------------- | -| descriptionId | string | 是 | 版本versionId信息 | -| content | string | 是 | 版本changelog信息 | \ No newline at end of file +| descriptionId | string | 是 | 版本versionId信息
**系统能力**:SystemCapability.Updater.update_service| +| content | string | 是 | 版本changelog信息
**系统能力**:SystemCapability.Updater.update_service| \ No newline at end of file -- Gitee From 328b99bd6015647778e7f10992cca52673e8ddca Mon Sep 17 00:00:00 2001 From: maosiping Date: Tue, 1 Mar 2022 21:30:41 +0800 Subject: [PATCH 044/282] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E7=AE=A1=E7=90=86net.connection=E7=9B=B8=E5=85=B3API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: maosiping --- .../reference/apis/js-apis-net-connection.md | 712 ++++++++++++++++++ 1 file changed, 712 insertions(+) create mode 100644 zh-cn/application-dev/reference/apis/js-apis-net-connection.md diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md new file mode 100644 index 00000000000..a25539ba4f2 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -0,0 +1,712 @@ +# 蜂窝数据 + +> **说明:** +> +>本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +```typescript +import connection from '@ohos.net.connection' +``` + +## connection.getDefaultNet + +getDefaultNet(callback: AsyncCallback\): void + +获取默认网络,使用callback方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| callback | AsyncCallback\<[NetHandle](#NetHandle)> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.getDefaultNet(function (error, netHandle) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(netHandle)) +}) +``` + +## connection.getDefaultNet + +getDefaultNet(): Promise\ + +获取默认网络,使用Promise方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +| Promise\<[NetHandle](#NetHandle)> | 以Promise形式返回 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + console.log(JSON.stringify(netHandle)) +}) +``` + +## connection.hasDefaultNet + +hasDefaultNet(callback: AsyncCallback\): void + +判断是否有默认网络,使用callback方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| callback | AsyncCallback\ | 是 | 回调函数 | + +**示例:** + +```javascript +connection.hasDefaultNet(function (error, has) { + console.log(JSON.stringify(error)) + console.log(has) +}) +``` + +## connection.hasDefaultNet + +hasDefaultNet(): Promise\ + +判断是否有默认网络,使用Promise方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +| Promise\ | 以Promise形式返回 | + +**示例:** + +```javascript +connection.hasDefaultNet().then(function (has) { + console.log(has) +}) +``` + +## connection.getConnectionProperties + +getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback\): void + +查询netHandle对应的网络的连接信息,使用callback方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| netHandle | [NetHandle](#NetHandle) | 是 | 对应网络 | +| callback | AsyncCallback\<[ConnectionProperties](#ConnectionProperties)> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getConnectionProperties(netHandle, function (error, info) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(info)) + }) +}) +``` + +## connection.getConnectionProperties + +getConnectionProperties(netHandle: NetHandle): Promise\ + +查询netHandle对应的网络的连接信息,使用Promise方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| netHandle | [NetHandle](#NetHandle) | 是 | 对应网络 | + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +| Promise\<[ConnectionProperties](#ConnectionProperties)> | 以Promise形式返回 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getConnectionProperties(netHandle).then(function (info) { + console.log(JSON.stringify(info)) + }) +}) +``` + +## connection.getNetCapabilities + +getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback\): void + +查询netHandle对应的网络的能力信息,使用callback方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| netHandle | [NetHandle](#NetHandle) | 是 | 对应网络 | +| callback | AsyncCallback\<[NetCapabilities](#NetCapabilities)> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getNetCapabilities(netHandle, function (error, info) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(info)) + }) +}) +``` + +## connection.getNetCapabilities + +getNetCapabilities(netHandle: NetHandle): Promise\ + +查询netHandle对应的网络的能力信息,使用Promise方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| netHandle | [NetHandle](#NetHandle) | 是 | 对应网络 | + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +| Promise\<[NetCapabilities](#NetCapabilities)> | 以Promise形式返回 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getNetCapabilities(netHandle).then(function (info) { + console.log(JSON.stringify(info)) + }) +}) +``` + +## connection.getAddressesByName + +getAddressesByName(host: string, callback: AsyncCallback\>): void + +使用默认网络将host解析成IP,返回所有IP,使用callback方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| host | string | 是 | 需要解析的域名 | +| callback | AsyncCallback\> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getAddressesByName(netHandle, function (error, info) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(info)) + }) +}) +``` + +## connection.getAddressesByName + +getAddressesByName(netHandle: NetHandle): Promise\> + +使用默认网络将host解析成IP,返回所有IP,使用Promise方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| host | string | 是 | 需要解析的域名 | + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +| Promise\> | 以Promise形式返回 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getAddressesByName(netHandle).then(function (info) { + console.log(JSON.stringify(info)) + }) +}) +``` + +## connection.createNetConnection + +createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnection + +获取一个netSpecifier指定的网络的句柄 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| netSpecifier | [NetSpecifier](#NetSpecifier) | 否 | 关注的网络的各项特征,不指定则关注默认网络 | +| timeout | number | 否 | 获取netSpecifier指定的网络时的超时时间,前提是netSpecifier存在 | + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +|[NetConnection](#NetConnection) | 所关注的网络的句柄 | + +**示例:** + +```javascript +// 关注默认网络 +let netConnection1 = connection.createNetConnection() + +// 关注蜂窝网络 +let netConnection2 = connection.createNetConnection({ + netCapabilities: { + networkCap: [0] + } +}) +``` + +## connection.NetConnection + +网络连接的句柄 + +### connection.NetConnection.on('netAvailable') + +on(type: 'netAvailable', callback: Callback\): void + +监听网络可用事件 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| type | string | 是 | 监听的事件,固定'netAvailable' | +| callback | Callback\<[NetHandle](#NetHandle)>> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.createNetConnection().on('netAvailable', function (data) { + console.log(JSON.stringify(data)) +}) +``` + +### connection.NetConnection.on('netCapabilitiesChange') + +on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, netCap: NetCapabilities }>): void + +监听网络能力变化事件 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| type | string | 是 | 监听的事件,固定'netCapabilitiesChange' | +| callback | Callback<{ netHandle: [NetHandle](#NetHandle), netCap: [NetCapabilities](#NetCapabilities) }> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.createNetConnection().on('netCapabilitiesChange', function (data) { + console.log(JSON.stringify(data)) +}) +``` + +### connection.NetConnection.on('netConnectionPropertiesChange') + +on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHandle, connectionProperties: ConnectionProperties }>): void + +监听网络连接信息变化事件 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| type | string | 是 | 监听的事件,固定'netConnectionPropertiesChange' | +| callback | Callback<{ netHandle: [NetHandle](#NetHandle), connectionProperties: [ConnectionProperties](#ConnectionProperties) }> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.createNetConnection().on('netConnectionPropertiesChange', function (data) { + console.log(JSON.stringify(data)) +}) +``` + +### connection.NetConnection.on('netLost') + +on(type: 'netLost', callback: Callback\): void + +监听网络丢失事件 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| type | string | 是 | 监听的事件,固定'netLost' | +| callback | Callback\<[NetHandle](#NetHandle)>> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.createNetConnection().on('netLost', function (data) { + console.log(JSON.stringify(data)) +}) +``` + +### connection.NetConnection.on('netUnavailable') + +on(type: 'netUnavailable', callback: Callback\): void + +监听网络不可用事件 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| type | string | 是 | 监听的事件,固定'netUnavailable' | +| callback | Callback\> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.createNetConnection().on('netUnavailable', function (data) { + console.log(JSON.stringify(data)) +}) +``` + +### connection.NetConnection.register + +register(callback: AsyncCallback\): void + +注册网络的监听 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| callback | Callback\> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.createNetConnection().register(function (error) { + console.log(JSON.stringify(error)) +}) +``` + +### connection.NetConnection.unregister + +unregister(callback: AsyncCallback\): void + +注销网络的监听 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| callback | Callback\> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.createNetConnection().unregister(function (error) { + console.log(JSON.stringify(error)) +}) +``` + +## connection.NetHandle + +网络的句柄 + +| 变量 | 类型 | 说明 | +| ----- | ----- | ----- | +| netId | number | 对应网络的编号 | + +### connection.NetHandle.getAddressesByName + +getAddressesByName(host: string, callback: AsyncCallback\>): void + +使用对应网络将host解析成IP,返回所有IP,使用callback方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| host | string | 是 | 需要解析的域名 | +| callback | AsyncCallback\> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getAddressesByName(netHandle, function (error, info) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(info)) + }) +}) +``` + +### connection.NetHandle.getAddressesByName + +getAddressesByName(netHandle: NetHandle): Promise\> + +使用对应网络将host解析成IP,返回所有IP,使用Promise方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| host | string | 是 | 需要解析的域名 | + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +| Promise\> | 以Promise形式返回 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getAddressesByName(netHandle).then(function (info) { + console.log(JSON.stringify(info)) + }) +}) +``` + +### connection.NetHandle.getAddressByName + +getAddressByName(host: string, callback: AsyncCallback\): void + +使用对应网络将host解析成IP,返回一个IP,使用callback方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| host | string | 是 | 需要解析的域名 | +| callback | AsyncCallback\<[NetAddress](#NetAddress)> | 是 | 回调函数 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getAddressByName(netHandle, function (error, info) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(info)) + }) +}) +``` + +### connection.NetHandle.getAddressByName + +getAddressByName(netHandle: NetHandle): Promise\ + +使用对应网络将host解析成IP,返回一个IP,使用Promise方式作为异步方法。 + +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ----- | ---- | ----- | +| host | string | 是 | 需要解析的域名 | + +**返回值:** + +| 类型 | 说明 | +| ----- | ----- | +| Promise\<[NetAddress](#NetAddress)> | 以Promise形式返回 | + +**示例:** + +```javascript +connection.getDefaultNet().then(function (netHandle) { + connection.getAddressByName(netHandle).then(function (info) { + console.log(JSON.stringify(info)) + }) +}) +``` + +## connection.NetSpecifier + +网络的特征 + +| 变量 | 类型 | 说明 | +| ----- | ----- | ----- | +| netCapabilities | [NetCapabilities](#NetCapabilities) | 网络的能力集 | +| bearerPrivateIdentifier | string | 网络标识符,WIFI网络的标识符是"wifi",蜂窝网络的标识符是"slot0"(对应SIM卡1) | + +## connection.NetCapabilities + +网络的能力集 + +| 变量 | 类型 | 说明 | +| ----- | ----- | ----- | +| linkUpBandwidthKbps | number | 带宽上限 | +| linkDownBandwidthKbps | number | 带宽下限 | +| networkCap | Array<[NetCap](#NetCap)> | 网络具体能力 | +| bearerTypes | Array<[NetBearType](#NetBearType)> | 网络类型 | + +## connection.NetCap + +网络具体能力 + +| 变量 | 值 | 说明 | +| ------ | ----- | ----- | +| NET_CAPABILITY_INTERNET | 12 | 联网能力 | +| NET_CAPABILITY_VALIDATED | 16 | 网络可用 | + +## connection.NetBearType + +网络类型 + +| 变量 | 值 | 说明 | +| ------ | ----- | ----- | +| BEARER_CELLULAR | 0 | 蜂窝网络 | +| BEARER_WIFI | 1 | WIFI网络 | + +## connection.ConnectionProperties + +网络连接信息 + +| 变量 | 类型 | 说明 | +| ----- | ----- | ----- | +| interfaceName | string | 网卡名称 | +| domains | string | 所属域,默认"" | +| linkAddresses | Array<[LinkAddress](#LinkAddress)> | 链路信息 | +| routes | Array<[RouteInfo](#RouteInfo)> | 路由信息 | +| mtu | number | 最大传输单元 | + +## connection.LinkAddress + +网络链路信息 + +| 变量 | 类型 | 说明 | +| ----- | ----- | ----- | +| address | [NetAddress](#NetAddress) | 链路地址 | +| prefixLength | number | 地址前缀长度 | + +## connection.RouteInfo + +网络路由信息 + +| 变量 | 类型 | 说明 | +| ----- | ----- | ----- | +| interface | string | 网卡名称 | +| destination | [LinkAddress](#LinkAddress) | 目的地址 | +| gateway | [NetAddress](#NetAddress) | 网关地址 | +| hasGateway | boolean | 是否有网关 | +| isDefaultRoute | boolean | 是否为默认路由 | + +## connection.NetAddress + +地址 + +| 变量 | 类型 | 说明 | +| ----- | ----- | ----- | +| address | string | 一个IPv4地址或者IPv6地址 | +| family | number | IPv4 = 1, IPv6 = 2, 默认IPv4 | +| port | number | 端口,取值范围\[0, 65535] | -- Gitee From c553bcae47a15da9c20cce6ae83af5dfda3dd731 Mon Sep 17 00:00:00 2001 From: xuyong Date: Wed, 2 Mar 2022 09:18:34 +0800 Subject: [PATCH 045/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuyong --- zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-listening.md | 2 +- zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-listening.md b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-listening.md index b42a258f2c7..01bb60ea61e 100644 --- a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-listening.md +++ b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-listening.md @@ -77,7 +77,7 @@ HiSysEvent提供了跨进程订阅机制,开发者可以通过注册订阅接 void OnServiceDied(); }; - #endif DEMO_LISTENER_H + #endif // DEMO_LISTENER_H ``` 增加DemoListener.cpp文件,在DemoListener类中根据实际需求自定义订阅回调接口的实现逻辑: diff --git a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md index 426b6117382..48867c40c86 100644 --- a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md +++ b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md @@ -55,7 +55,7 @@ C++接口实例。 - 实现对应的查询回调接口: - void HiSysEventQueryCallBack::OnQuery\(const ::std::vector& sysEvent, const ::std::vector& seq\) + void HiSysEventQueryCallBack::OnQuery\(const ::std::vector<std::string>& sysEvent, const ::std::vector& seq\) void HiSysEventQueryCallBack::OnComplete\(int32\_t reason, int32\_t total\) -- Gitee From 471eca2f961a81c184e39ad99365ad4ee0e18118 Mon Sep 17 00:00:00 2001 From: maosiping Date: Wed, 2 Mar 2022 10:20:24 +0800 Subject: [PATCH 046/282] change readme Signed-off-by: maosiping --- .../reference/apis/js-apis-net-connection.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md index a25539ba4f2..cba80c21a2f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -1,4 +1,4 @@ -# 蜂窝数据 +# 网络 > **说明:** > @@ -6,7 +6,7 @@ ## 导入模块 -```typescript +```javascript import connection from '@ohos.net.connection' ``` @@ -73,7 +73,7 @@ hasDefaultNet(callback: AsyncCallback\): void | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | -| callback | AsyncCallback\ | 是 | 回调函数 | +| callback | AsyncCallback\ | 是 | 回调函数,有默认网络返回true。 | **示例:** @@ -98,7 +98,7 @@ hasDefaultNet(): Promise\ | 类型 | 说明 | | ----- | ----- | -| Promise\ | 以Promise形式返回 | +| Promise\ | 以Promise形式返回,有默认网络返回true。 | **示例:** @@ -329,7 +329,7 @@ let netConnection2 = connection.createNetConnection({ 网络连接的句柄 -### connection.NetConnection.on('netAvailable') +### on('netAvailable') on(type: 'netAvailable', callback: Callback\): void @@ -354,7 +354,7 @@ connection.createNetConnection().on('netAvailable', function (data) { }) ``` -### connection.NetConnection.on('netCapabilitiesChange') +### on('netCapabilitiesChange') on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, netCap: NetCapabilities }>): void @@ -379,7 +379,7 @@ connection.createNetConnection().on('netCapabilitiesChange', function (data) { }) ``` -### connection.NetConnection.on('netConnectionPropertiesChange') +### on('netConnectionPropertiesChange') on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHandle, connectionProperties: ConnectionProperties }>): void @@ -404,7 +404,7 @@ connection.createNetConnection().on('netConnectionPropertiesChange', function (d }) ``` -### connection.NetConnection.on('netLost') +### on('netLost') on(type: 'netLost', callback: Callback\): void @@ -429,7 +429,7 @@ connection.createNetConnection().on('netLost', function (data) { }) ``` -### connection.NetConnection.on('netUnavailable') +### on('netUnavailable') on(type: 'netUnavailable', callback: Callback\): void @@ -454,7 +454,7 @@ connection.createNetConnection().on('netUnavailable', function (data) { }) ``` -### connection.NetConnection.register +### register register(callback: AsyncCallback\): void @@ -478,7 +478,7 @@ connection.createNetConnection().register(function (error) { }) ``` -### connection.NetConnection.unregister +### unregister unregister(callback: AsyncCallback\): void @@ -510,7 +510,7 @@ connection.createNetConnection().unregister(function (error) { | ----- | ----- | ----- | | netId | number | 对应网络的编号 | -### connection.NetHandle.getAddressesByName +### getAddressesByName getAddressesByName(host: string, callback: AsyncCallback\>): void @@ -538,7 +538,7 @@ connection.getDefaultNet().then(function (netHandle) { }) ``` -### connection.NetHandle.getAddressesByName +### getAddressesByName getAddressesByName(netHandle: NetHandle): Promise\> @@ -570,7 +570,7 @@ connection.getDefaultNet().then(function (netHandle) { }) ``` -### connection.NetHandle.getAddressByName +### getAddressByName getAddressByName(host: string, callback: AsyncCallback\): void @@ -598,7 +598,7 @@ connection.getDefaultNet().then(function (netHandle) { }) ``` -### connection.NetHandle.getAddressByName +### getAddressByName getAddressByName(netHandle: NetHandle): Promise\ -- Gitee From e231fccb7208fa934b2676e686bc695c70cc646c Mon Sep 17 00:00:00 2001 From: duangavin123 Date: Wed, 2 Mar 2022 02:21:31 +0000 Subject: [PATCH 047/282] update zh-cn/device-dev/Readme-CN.md. Signed-off-by: duangavin123 --- zh-cn/device-dev/Readme-CN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/device-dev/Readme-CN.md b/zh-cn/device-dev/Readme-CN.md index 992ec8d7ec5..ef6b8a2e52d 100644 --- a/zh-cn/device-dev/Readme-CN.md +++ b/zh-cn/device-dev/Readme-CN.md @@ -90,7 +90,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

OpenHarmony贡献功能组件

- +

参考

@@ -160,7 +160,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

OpenHarmony贡献功能组件

- +

参考

-- Gitee From e5048cacf503a667bf57f07f49fa865945eb106e Mon Sep 17 00:00:00 2001 From: duangavin123 Date: Wed, 2 Mar 2022 02:23:29 +0000 Subject: [PATCH 048/282] update zh-cn/device-dev/Readme-CN.md. Signed-off-by: duangavin123 --- zh-cn/device-dev/Readme-CN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/device-dev/Readme-CN.md b/zh-cn/device-dev/Readme-CN.md index ef6b8a2e52d..978bdbf97ff 100644 --- a/zh-cn/device-dev/Readme-CN.md +++ b/zh-cn/device-dev/Readme-CN.md @@ -90,7 +90,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

OpenHarmony贡献功能组件

- +

参考

@@ -160,7 +160,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

OpenHarmony贡献功能组件

- +

参考

-- Gitee From c0a1347c062c3fde0799d7bff5a3e824bca31885 Mon Sep 17 00:00:00 2001 From: duangavin123 Date: Wed, 2 Mar 2022 02:25:45 +0000 Subject: [PATCH 049/282] update zh-cn/device-dev/bundles/Readme-CN.md. Signed-off-by: duangavin123 --- zh-cn/device-dev/bundles/Readme-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/device-dev/bundles/Readme-CN.md b/zh-cn/device-dev/bundles/Readme-CN.md index 20c3daa088f..6ddc8aac75a 100755 --- a/zh-cn/device-dev/bundles/Readme-CN.md +++ b/zh-cn/device-dev/bundles/Readme-CN.md @@ -1,6 +1,6 @@ # Bundle开发指南 -- [开发规范](oem_bundle_standard_des.md) +- [开发规范](bundles-standard-rules.md ) - [开发指南](bundles-guide.md) - [概述](bundles-guide-overview.md) - [安装hpm命令行工具](bundles-guide-prepare.md) -- Gitee From 3317088e4c1047e70a91b23990c3503cd6c3afe1 Mon Sep 17 00:00:00 2001 From: maosiping Date: Wed, 2 Mar 2022 11:12:54 +0800 Subject: [PATCH 050/282] change readme Signed-off-by: maosiping --- .gitignore | 1 + .../reference/apis/@ohos.net.connection.d.ts | 509 ++++++++++++++++++ .../reference/apis/js-apis-net-connection.md | 114 ++-- 3 files changed, 567 insertions(+), 57 deletions(-) create mode 100644 zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts diff --git a/.gitignore b/.gitignore index a82da52d73e..c25ef95e663 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ Network Trash Folder Temporary Items .apdisk +.idea \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts b/zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts new file mode 100644 index 00000000000..639a6ef4268 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts @@ -0,0 +1,509 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {AsyncCallback, Callback} from "./basic"; +import http from "./@ohos.net.http"; +import socket from "./@ohos.net.socket"; + +/** + * Provides interfaces to manage and use data networks. + * + * @since 8 + * @sysCap SystemCapability.Communication.NetManager.Core + */ +declare namespace connection { + type HttpRequest = http.HttpRequest; + type TCPSocket = socket.TCPSocket; + type UDPSocket = socket.UDPSocket; + + /** + * Create a network connection with optional netSpefifier and timeout. + * + * @param netSpecifier Indicates the network specifier. See {@link NetSpecifier}. + * @param timeout The time in milliseconds to attempt looking for a suitable network before + * {@link NetConnection#netUnavailable} is called. + */ + function createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnection; + + /** + * Obtains the data network that is activated by default. + * + *

To call this method, you must have the {@code ohos.permission.GET_NETWORK_INFO} permission. + * + * @param callback Returns the {@link NetHandle} object; + * returns {@code null} if the default network is not activated. + * @permission ohos.permission.GET_NETWORK_INFO + */ + function getDefaultNet(callback: AsyncCallback): void; + function getDefaultNet(): Promise; + + /** + * Obtains the list of data networks that are activated. + * + *

To invoke this method, you must have the {@code ohos.permission.GET_NETWORK_INFO} permission. + * + * @param callback Returns the {@link NetHandle} object; returns {@code null} if no network is activated. + * @permission ohos.permission.GET_NETWORK_INFO + */ + function getAllNets(callback: AsyncCallback>): void; + function getAllNets(): Promise>; + + /** + * Queries the connection properties of a network. + * + *

This method requires the {@code ohos.permission.GET_NETWORK_INFO} permission. + * + * @param netHandle Indicates the network to be queried. + * @param callback Returns the {@link ConnectionProperties} object. + * @permission ohos.permission.GET_NETWORK_INFO + */ + function getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback): void; + function getConnectionProperties(netHandle: NetHandle): Promise; + + /** + * Obtains {@link NetCapabilities} of a {@link NetHandle} object. + * + *

To invoke this method, you must have the {@code ohos.permission.GET_NETWORK_INFO} permission. + * + * @param netHandle Indicates the handle. See {@link NetHandle}. + * @param callback Returns {@link NetCapabilities}; returns {@code null} if {@code handle} is invalid. + * @permission ohos.permission.GET_NETWORK_INFO + */ + function getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback): void; + function getNetCapabilities(netHandle: NetHandle): Promise; + + /** + * Checks whether the default data network is activated. + * + * @param callback Returns {@code true} if the default data network is activated; returns {@code false} otherwise. + */ + function hasDefaultNet(callback: AsyncCallback): void; + function hasDefaultNet(): Promise; + + /** + * Enables the airplane mode for a device. + * + * @systemapi Hide this for inner system use. Only used for system app. + */ + function enableAirplaneMode(callback: AsyncCallback): void; + function enableAirplaneMode(): Promise; + + /** + * Disables the airplane mode for a device. + * + * @systemapi Hide this for inner system use. Only used for system app. + */ + function disableAirplaneMode(callback: AsyncCallback): void; + function disableAirplaneMode(): Promise; + + /** + * Reports the network state is connected. + * + * @param netHandle Indicates the network whose state is to be reported. + * @permission ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET + */ + function reportNetConnected(netHandle: NetHandle, callback: AsyncCallback): void; + function reportNetConnected(netHandle: NetHandle): Promise; + + /** + * Reports the network state is disconnected. + * + * @param netHandle Indicates the network whose state is to be reported. + * @permission ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET + */ + function reportNetDisconnected(netHandle: NetHandle, callback: AsyncCallback): void; + function reportNetDisconnected(netHandle: NetHandle): Promise; + + /** + * Resolves the host name to obtain all IP addresses based on the default data network. + * + * @param host Indicates the host name or the domain. + * @param callback Returns the NetAddress list. + * @permission ohos.permission.GET_NETWORK_INFO + */ + function getAddressesByName(host: string, callback: AsyncCallback>): void; + function getAddressesByName(host: string): Promise>; + + export interface NetConnection { + on(type: 'netAvailable', callback: Callback): void; + + on(type: 'netBlockStatusChange', callback: Callback<{ netHandle: NetHandle, blocked: boolean }>): void; + + on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, netCap: NetCapabilities }>): void; + + on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHandle, connectionProperties: ConnectionProperties }>): void; + + on(type: 'netLost', callback: Callback): void; + + on(type: 'netUnavailable', callback: Callback): void; + + /** + * Receives status change notifications of a specified network. + * + * @permission ohos.permission.GET_NETWORK_INFO + */ + register(callback: AsyncCallback): void; + + /** + * Cancels listening for network status changes. + */ + unregister(callback: AsyncCallback): void; + } + + export interface NetSpecifier { + netCapabilities: NetCapabilities; + bearerPrivateIdentifier?: string; + } + + export interface NetHandle { + netId: number; + + /** + * Binds a TCPSocket or UDPSocket to the current network. All data flows from + * the socket will use this network, without being subject to {@link setAppNet}. + * Before using this method, ensure that the socket is disconnected. + * + * @param socketParam Indicates the TCPSocket or UDPSocket object. + */ + bindSocket(socketParam: TCPSocket | UDPSocket, callback: AsyncCallback): void; + bindSocket(socketParam: TCPSocket | UDPSocket): Promise; + + /** + * Accesses a specified URL. + * + * @param url Indicates a URL connection. + * @param callback Returns a {@code URLConnection} object matching the given {@code url}. + */ + openConnection(url: string, callback: AsyncCallback): void; + openConnection(url: string, proxy: NetProxy, callback: AsyncCallback): void; + openConnection(url: string, proxy?: NetProxy): Promise; + + /** + * Resolves a host name to obtain all IP addresses based on the specified NetHandle. + * + * @param host Indicates the host name or the domain. + * @param callback Returns the NetAddress list. + */ + getAddressesByName(host: string, callback: AsyncCallback>): void; + getAddressesByName(host: string): Promise>; + + /** + * Resolves a host name to obtain the first IP address based on the specified NetHandle. + * + * @param host Indicates the host name or the domain. + * @return Returns the first NetAddress. + */ + getAddressByName(host: string, callback: AsyncCallback): void; + getAddressByName(host: string): Promise; + } + + export interface NetCapabilities { + linkUpBandwidthKbps?: number; + linkDownBandwidthKbps?: number; + networkCap?: Array; + bearerTypes: Array; + } + + export enum NetCap { + /** + * Indicates that the network can access the carrier's MMSC to send and receive multimedia messages. + */ + NET_CAPABILITY_MMS = 0, + + /** + * Indicates that the network can access the carrier's SUPL server. + */ + NET_CAPABILITY_SUPL = 1, + + /** + * Indicates that the network can access the carrier's DUN or Tethering gateway. + */ + NET_CAPABILITY_DUN = 2, + + /** + * Indicates that the network can access the FOTA server for remote device upgrade. + */ + NET_CAPABILITY_FOTA = 3, + + /** + * Indicates that the network can access the IMS server. + */ + NET_CAPABILITY_IMS = 4, + + /** + * Indicates that the network can access the carrier's CBS server. + */ + NET_CAPABILITY_CBS = 5, + + /** + * Indicates that the network can be used for Wi-Fi Direct. + */ + NET_CAPABILITY_WIFI_P2P = 6, + + /** + * Indicates that the network can access the carrier's Initial Attach server. + */ + NET_CAPABILITY_IA = 7, + + /** + * Indicates that the network can access the carrier's RCS server. + */ + NET_CAPABILITY_RCS = 8, + + /** + * Indicates that the network can access the carrier's XCAP server. + */ + NET_CAPABILITY_XCAP = 9, + + /** + * Indicates that the network can access the carrier's IMS emergency call server. + */ + NET_CAPABILITY_EIMS = 10, + + /** + * Indicates that the network traffic is not metered. + */ + NET_CAPABILITY_NOT_METERED = 11, + + /** + * Indicates that the network can access the Internet. + */ + NET_CAPABILITY_INTERNET = 12, + + /** + * Indicates that the network is not restricted. + */ + NET_CAPABILITY_NOT_RESTRICTED = 13, + + /** + * Indicates that the network is trusted. + */ + NET_CAPABILITY_TRUSTED = 14, + + /** + * Indicates that the network does not use a VPN. + */ + NET_CAPABILITY_NOT_VPN = 15, + + /** + * Indicates that the network is available. + */ + NET_CAPABILITY_VALIDATED = 16, + + /** + * Indicates that this network was found to have a captive portal in place last time it was + * probed. + */ + NET_CAPABILITY_CAPTIVE_PORTAL = 17, + + /** + * Indicates that the network is unavailable during roaming. + */ + NET_CAPABILITY_NOT_ROAMING = 18, + + /** + * Indicates that the network is available only for foreground applications. + */ + NET_CAPABILITY_FOREGROUND = 19, + + /** + * Indicates that the network is not congested. + */ + NET_CAPABILITY_NOT_CONGESTED = 20, + + /** + * Indicates that the network is not suspended. + */ + NET_CAPABILITY_NOT_SUSPENDED = 21, + + /** + * Indicates that traffic that goes through this network is paid by oem. For example, + * this network can be used by system apps to upload telemetry data. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_OEM_PAID = 22, + + /** + * Indicates that the network can access the Mission Critical server of the carrier. + */ + NET_CAPABILITY_MCX = 23, + + /** + * Indicates that the network was tested to only provide partial connectivity. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_PARTIAL_CONNECTIVITY = 24, + + /** + * Indicates that the network extends cap + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_HW_BASE = NET_CAPABILITY_PARTIAL_CONNECTIVITY, + + /** + * Indicates that the network can access the BIP0 server. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_BIP0 = NET_CAPABILITY_HW_BASE + 1, + + /** + * Indicates that the network can access the BIP1 server. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_BIP1 = NET_CAPABILITY_HW_BASE + 2, + + /** + * Indicates that the network can access the BIP2 server. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_BIP2 = NET_CAPABILITY_HW_BASE + 3, + + /** + * Indicates that the network can access the BIP3 server. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_BIP3 = NET_CAPABILITY_HW_BASE + 4, + + /** + * Indicates that the network can access the BIP4 server. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_BIP4 = NET_CAPABILITY_HW_BASE + 5, + + /** + * Indicates that the network can access the BIP5 server. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_BIP5 = NET_CAPABILITY_HW_BASE + 6, + + /** + * Indicates that the network can access the BIP6 server. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_BIP6 = NET_CAPABILITY_HW_BASE + 7, + + /** + * Indicates that the network can access internal default servers. + * + * @systemapi Hide this for inner system use. + */ + NET_CAPABILITY_INTERNAL_DEFAULT + } + + export enum NetBearType { + /** + * Indicates that the network is based on a cellular network. + */ + BEARER_CELLULAR = 0, + + /** + * Indicates that the network is based on a Wi-Fi network. + */ + BEARER_WIFI = 1, + + /** + * Indicates that the network is based on a Bluetooth network. + */ + BEARER_BLUETOOTH = 2, + + /** + * Indicates that the network is an Ethernet network. + */ + BEARER_ETHERNET = 3, + + /** + * Indicates that the network is a VPN. + */ + BEARER_VPN = 4, + + /** + * Indicates that the network is a Wi-Fi Aware network. + */ + BEARER_WIFI_AWARE = 5, + + /** + * Indicates that the network is a LoWPAN network. + */ + BEARER_LOWPAN = 6 + } + + export interface ConnectionProperties { + interfaceName: string; + isUsePrivateDns: boolean; + privateDnsServerName: string; + domains: string; + httpProxy: HttpProxy; + linkAddresses: Array; + dnses: Array; + routes: Array; + mtu: number; + } + + export interface HttpProxy { + host: string; + port: number; + parsedExclusionList: Array; + } + + export interface RouteInfo { + interface: string; + destination: LinkAddress; + gateway: NetAddress; + hasGateway: boolean; + isDefaultRoute: boolean; + } + + export interface LinkAddress { + address: NetAddress; + prefixLength: number; + } + + /** + * @since 7 + */ + export interface NetAddress { + address: string; + family?: number; // IPv4 = 1; IPv6 = 2, default is IPv4 + port?: number; // [0, 65535] + } + + export interface NetProxy { + type: ProxyType; + address: NetAddress; + } + + export enum ProxyType { + /** + * Represents proxy for high level protocols such as HTTP or FTP. + */ + HTTP, + /** + * Represents a SOCKS (V4 or V5) proxy. + */ + SOCKS + } +} + +export default connection; \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md index cba80c21a2f..4be6ce47414 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -24,7 +24,7 @@ getDefaultNet(callback: AsyncCallback\): void | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | -| callback | AsyncCallback\<[NetHandle](#NetHandle)> | 是 | 回调函数 | +| callback | AsyncCallback\<[NetHandle](#nethandle)> | 是 | 回调函数 | **示例:** @@ -49,7 +49,7 @@ getDefaultNet(): Promise\ | 类型 | 说明 | | ----- | ----- | -| Promise\<[NetHandle](#NetHandle)> | 以Promise形式返回 | +| Promise\<[NetHandle](#nethandle)> | 以Promise形式返回 | **示例:** @@ -122,8 +122,8 @@ getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback\ | 是 | 回调函数 | +| netHandle | [NetHandle](#nethandle) | 是 | 对应网络 | +| callback | AsyncCallback\<[ConnectionProperties](#connectionproperties)> | 是 | 回调函数 | **示例:** @@ -150,13 +150,13 @@ getConnectionProperties(netHandle: NetHandle): Promise\ | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | -| netHandle | [NetHandle](#NetHandle) | 是 | 对应网络 | +| netHandle | [NetHandle](#nethandle) | 是 | 对应网络 | **返回值:** | 类型 | 说明 | | ----- | ----- | -| Promise\<[ConnectionProperties](#ConnectionProperties)> | 以Promise形式返回 | +| Promise\<[ConnectionProperties](#connectionproperties)> | 以Promise形式返回 | **示例:** @@ -182,8 +182,8 @@ getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback\ | 是 | 回调函数 | +| netHandle | [NetHandle](#nethandle) | 是 | 对应网络 | +| callback | AsyncCallback\<[NetCapabilities](#netcapabilities)> | 是 | 回调函数 | **示例:** @@ -210,13 +210,13 @@ getNetCapabilities(netHandle: NetHandle): Promise\ | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | -| netHandle | [NetHandle](#NetHandle) | 是 | 对应网络 | +| netHandle | [NetHandle](#nethandle) | 是 | 对应网络 | **返回值:** | 类型 | 说明 | | ----- | ----- | -| Promise\<[NetCapabilities](#NetCapabilities)> | 以Promise形式返回 | +| Promise\<[NetCapabilities](#netcapabilities)> | 以Promise形式返回 | **示例:** @@ -243,7 +243,7 @@ getAddressesByName(host: string, callback: AsyncCallback\>): | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | | host | string | 是 | 需要解析的域名 | -| callback | AsyncCallback\> | 是 | 回调函数 | +| callback | AsyncCallback\> | 是 | 回调函数 | **示例:** @@ -276,7 +276,7 @@ getAddressesByName(netHandle: NetHandle): Promise\> | 类型 | 说明 | | ----- | ----- | -| Promise\> | 以Promise形式返回 | +| Promise\> | 以Promise形式返回 | **示例:** @@ -292,7 +292,7 @@ connection.getDefaultNet().then(function (netHandle) { createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnection -获取一个netSpecifier指定的网络的句柄 +获取一个netSpecifier指定的网络的句柄。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -302,14 +302,14 @@ createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnectio | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | -| netSpecifier | [NetSpecifier](#NetSpecifier) | 否 | 关注的网络的各项特征,不指定则关注默认网络 | -| timeout | number | 否 | 获取netSpecifier指定的网络时的超时时间,前提是netSpecifier存在 | +| netSpecifier | [NetSpecifier](#netspecifier) | 否 | 指定网络的各项特征,不指定则关注默认网络。 | +| timeout | number | 否 | 获取netSpecifier指定的网络时的超时时间,仅netSpecifier存在时生效。 | **返回值:** | 类型 | 说明 | | ----- | ----- | -|[NetConnection](#NetConnection) | 所关注的网络的句柄 | +|[NetConnection](#netconnection) | 所关注的网络的句柄 | **示例:** @@ -325,7 +325,7 @@ let netConnection2 = connection.createNetConnection({ }) ``` -## connection.NetConnection +## NetConnection 网络连接的句柄 @@ -333,7 +333,7 @@ let netConnection2 = connection.createNetConnection({ on(type: 'netAvailable', callback: Callback\): void -监听网络可用事件 +监听网络可用事件。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -344,7 +344,7 @@ on(type: 'netAvailable', callback: Callback\): void | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | | type | string | 是 | 监听的事件,固定'netAvailable' | -| callback | Callback\<[NetHandle](#NetHandle)>> | 是 | 回调函数 | +| callback | Callback\<[NetHandle](#nethandle)>> | 是 | 回调函数 | **示例:** @@ -358,7 +358,7 @@ connection.createNetConnection().on('netAvailable', function (data) { on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, netCap: NetCapabilities }>): void -监听网络能力变化事件 +监听网络能力变化事件。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -369,7 +369,7 @@ on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, net | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | | type | string | 是 | 监听的事件,固定'netCapabilitiesChange' | -| callback | Callback<{ netHandle: [NetHandle](#NetHandle), netCap: [NetCapabilities](#NetCapabilities) }> | 是 | 回调函数 | +| callback | Callback<{ netHandle: [NetHandle](#nethandle), netCap: [NetCapabilities](#netcapabilities) }> | 是 | 回调函数 | **示例:** @@ -383,7 +383,7 @@ connection.createNetConnection().on('netCapabilitiesChange', function (data) { on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHandle, connectionProperties: ConnectionProperties }>): void -监听网络连接信息变化事件 +监听网络连接信息变化事件。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -394,7 +394,7 @@ on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHan | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | | type | string | 是 | 监听的事件,固定'netConnectionPropertiesChange' | -| callback | Callback<{ netHandle: [NetHandle](#NetHandle), connectionProperties: [ConnectionProperties](#ConnectionProperties) }> | 是 | 回调函数 | +| callback | Callback<{ netHandle: [NetHandle](#nethandle), connectionProperties: [ConnectionProperties](#connectionproperties) }> | 是 | 回调函数 | **示例:** @@ -408,7 +408,7 @@ connection.createNetConnection().on('netConnectionPropertiesChange', function (d on(type: 'netLost', callback: Callback\): void -监听网络丢失事件 +监听网络丢失事件。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -419,7 +419,7 @@ on(type: 'netLost', callback: Callback\): void | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | | type | string | 是 | 监听的事件,固定'netLost' | -| callback | Callback\<[NetHandle](#NetHandle)>> | 是 | 回调函数 | +| callback | Callback\<[NetHandle](#nethandle)>> | 是 | 回调函数 | **示例:** @@ -433,7 +433,7 @@ connection.createNetConnection().on('netLost', function (data) { on(type: 'netUnavailable', callback: Callback\): void -监听网络不可用事件 +监听网络不可用事件。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -458,7 +458,7 @@ connection.createNetConnection().on('netUnavailable', function (data) { register(callback: AsyncCallback\): void -注册网络的监听 +注册网络的监听。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -482,7 +482,7 @@ connection.createNetConnection().register(function (error) { unregister(callback: AsyncCallback\): void -注销网络的监听 +注销网络的监听。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -502,7 +502,7 @@ connection.createNetConnection().unregister(function (error) { }) ``` -## connection.NetHandle +## NetHandle 网络的句柄 @@ -525,7 +525,7 @@ getAddressesByName(host: string, callback: AsyncCallback\>): | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | | host | string | 是 | 需要解析的域名 | -| callback | AsyncCallback\> | 是 | 回调函数 | +| callback | AsyncCallback\> | 是 | 回调函数 | **示例:** @@ -558,7 +558,7 @@ getAddressesByName(netHandle: NetHandle): Promise\> | 类型 | 说明 | | ----- | ----- | -| Promise\> | 以Promise形式返回 | +| Promise\> | 以Promise形式返回 | **示例:** @@ -585,7 +585,7 @@ getAddressByName(host: string, callback: AsyncCallback\): void | 参数名 | 类型 | 必填 | 说明 | | ----- | ----- | ---- | ----- | | host | string | 是 | 需要解析的域名 | -| callback | AsyncCallback\<[NetAddress](#NetAddress)> | 是 | 回调函数 | +| callback | AsyncCallback\<[NetAddress](#netaddress)> | 是 | 回调函数 | **示例:** @@ -618,7 +618,7 @@ getAddressByName(netHandle: NetHandle): Promise\ | 类型 | 说明 | | ----- | ----- | -| Promise\<[NetAddress](#NetAddress)> | 以Promise形式返回 | +| Promise\<[NetAddress](#netaddress)> | 以Promise形式返回 | **示例:** @@ -630,80 +630,80 @@ connection.getDefaultNet().then(function (netHandle) { }) ``` -## connection.NetSpecifier +## NetSpecifier -网络的特征 +网络的特征。 | 变量 | 类型 | 说明 | | ----- | ----- | ----- | -| netCapabilities | [NetCapabilities](#NetCapabilities) | 网络的能力集 | +| netCapabilities | [NetCapabilities](#netcapabilities) | 网络的能力集 | | bearerPrivateIdentifier | string | 网络标识符,WIFI网络的标识符是"wifi",蜂窝网络的标识符是"slot0"(对应SIM卡1) | -## connection.NetCapabilities +## NetCapabilities -网络的能力集 +网络的能力集。 | 变量 | 类型 | 说明 | | ----- | ----- | ----- | | linkUpBandwidthKbps | number | 带宽上限 | | linkDownBandwidthKbps | number | 带宽下限 | -| networkCap | Array<[NetCap](#NetCap)> | 网络具体能力 | -| bearerTypes | Array<[NetBearType](#NetBearType)> | 网络类型 | +| networkCap | Array<[NetCap](#netcap)> | 网络具体能力 | +| bearerTypes | Array<[NetBearType](#netbearType)> | 网络类型 | -## connection.NetCap +## NetCap -网络具体能力 +网络具体能力。 | 变量 | 值 | 说明 | | ------ | ----- | ----- | | NET_CAPABILITY_INTERNET | 12 | 联网能力 | | NET_CAPABILITY_VALIDATED | 16 | 网络可用 | -## connection.NetBearType +## NetBearType -网络类型 +网络类型。 | 变量 | 值 | 说明 | | ------ | ----- | ----- | | BEARER_CELLULAR | 0 | 蜂窝网络 | | BEARER_WIFI | 1 | WIFI网络 | -## connection.ConnectionProperties +## ConnectionProperties -网络连接信息 +网络连接信息。 | 变量 | 类型 | 说明 | | ----- | ----- | ----- | | interfaceName | string | 网卡名称 | | domains | string | 所属域,默认"" | -| linkAddresses | Array<[LinkAddress](#LinkAddress)> | 链路信息 | -| routes | Array<[RouteInfo](#RouteInfo)> | 路由信息 | +| linkAddresses | Array<[LinkAddress](#linkaddress)> | 链路信息 | +| routes | Array<[RouteInfo](#routeinfo)> | 路由信息 | | mtu | number | 最大传输单元 | -## connection.LinkAddress +## LinkAddress -网络链路信息 +网络链路信息。 | 变量 | 类型 | 说明 | | ----- | ----- | ----- | -| address | [NetAddress](#NetAddress) | 链路地址 | +| address | [NetAddress](#netaddress) | 链路地址 | | prefixLength | number | 地址前缀长度 | -## connection.RouteInfo +## RouteInfo -网络路由信息 +网络路由信息。 | 变量 | 类型 | 说明 | | ----- | ----- | ----- | | interface | string | 网卡名称 | -| destination | [LinkAddress](#LinkAddress) | 目的地址 | -| gateway | [NetAddress](#NetAddress) | 网关地址 | +| destination | [LinkAddress](#linkaddress) | 目的地址 | +| gateway | [NetAddress](#netaddress) | 网关地址 | | hasGateway | boolean | 是否有网关 | | isDefaultRoute | boolean | 是否为默认路由 | -## connection.NetAddress +## NetAddress -地址 +地址。 | 变量 | 类型 | 说明 | | ----- | ----- | ----- | -- Gitee From 2403ab0146cf6cd0733292e3a19bc5025dd82dc2 Mon Sep 17 00:00:00 2001 From: maosiping Date: Wed, 2 Mar 2022 11:17:25 +0800 Subject: [PATCH 051/282] change readme Signed-off-by: maosiping --- .gitignore | 3 +- .../reference/apis/@ohos.net.connection.d.ts | 509 ------------------ 2 files changed, 1 insertion(+), 511 deletions(-) delete mode 100644 zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts diff --git a/.gitignore b/.gitignore index c25ef95e663..ffcc20feb50 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,4 @@ .AppleDesktop Network Trash Folder Temporary Items -.apdisk -.idea \ No newline at end of file +.apdisk \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts b/zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts deleted file mode 100644 index 639a6ef4268..00000000000 --- a/zh-cn/application-dev/reference/apis/@ohos.net.connection.d.ts +++ /dev/null @@ -1,509 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {AsyncCallback, Callback} from "./basic"; -import http from "./@ohos.net.http"; -import socket from "./@ohos.net.socket"; - -/** - * Provides interfaces to manage and use data networks. - * - * @since 8 - * @sysCap SystemCapability.Communication.NetManager.Core - */ -declare namespace connection { - type HttpRequest = http.HttpRequest; - type TCPSocket = socket.TCPSocket; - type UDPSocket = socket.UDPSocket; - - /** - * Create a network connection with optional netSpefifier and timeout. - * - * @param netSpecifier Indicates the network specifier. See {@link NetSpecifier}. - * @param timeout The time in milliseconds to attempt looking for a suitable network before - * {@link NetConnection#netUnavailable} is called. - */ - function createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnection; - - /** - * Obtains the data network that is activated by default. - * - *

To call this method, you must have the {@code ohos.permission.GET_NETWORK_INFO} permission. - * - * @param callback Returns the {@link NetHandle} object; - * returns {@code null} if the default network is not activated. - * @permission ohos.permission.GET_NETWORK_INFO - */ - function getDefaultNet(callback: AsyncCallback): void; - function getDefaultNet(): Promise; - - /** - * Obtains the list of data networks that are activated. - * - *

To invoke this method, you must have the {@code ohos.permission.GET_NETWORK_INFO} permission. - * - * @param callback Returns the {@link NetHandle} object; returns {@code null} if no network is activated. - * @permission ohos.permission.GET_NETWORK_INFO - */ - function getAllNets(callback: AsyncCallback>): void; - function getAllNets(): Promise>; - - /** - * Queries the connection properties of a network. - * - *

This method requires the {@code ohos.permission.GET_NETWORK_INFO} permission. - * - * @param netHandle Indicates the network to be queried. - * @param callback Returns the {@link ConnectionProperties} object. - * @permission ohos.permission.GET_NETWORK_INFO - */ - function getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback): void; - function getConnectionProperties(netHandle: NetHandle): Promise; - - /** - * Obtains {@link NetCapabilities} of a {@link NetHandle} object. - * - *

To invoke this method, you must have the {@code ohos.permission.GET_NETWORK_INFO} permission. - * - * @param netHandle Indicates the handle. See {@link NetHandle}. - * @param callback Returns {@link NetCapabilities}; returns {@code null} if {@code handle} is invalid. - * @permission ohos.permission.GET_NETWORK_INFO - */ - function getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback): void; - function getNetCapabilities(netHandle: NetHandle): Promise; - - /** - * Checks whether the default data network is activated. - * - * @param callback Returns {@code true} if the default data network is activated; returns {@code false} otherwise. - */ - function hasDefaultNet(callback: AsyncCallback): void; - function hasDefaultNet(): Promise; - - /** - * Enables the airplane mode for a device. - * - * @systemapi Hide this for inner system use. Only used for system app. - */ - function enableAirplaneMode(callback: AsyncCallback): void; - function enableAirplaneMode(): Promise; - - /** - * Disables the airplane mode for a device. - * - * @systemapi Hide this for inner system use. Only used for system app. - */ - function disableAirplaneMode(callback: AsyncCallback): void; - function disableAirplaneMode(): Promise; - - /** - * Reports the network state is connected. - * - * @param netHandle Indicates the network whose state is to be reported. - * @permission ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET - */ - function reportNetConnected(netHandle: NetHandle, callback: AsyncCallback): void; - function reportNetConnected(netHandle: NetHandle): Promise; - - /** - * Reports the network state is disconnected. - * - * @param netHandle Indicates the network whose state is to be reported. - * @permission ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET - */ - function reportNetDisconnected(netHandle: NetHandle, callback: AsyncCallback): void; - function reportNetDisconnected(netHandle: NetHandle): Promise; - - /** - * Resolves the host name to obtain all IP addresses based on the default data network. - * - * @param host Indicates the host name or the domain. - * @param callback Returns the NetAddress list. - * @permission ohos.permission.GET_NETWORK_INFO - */ - function getAddressesByName(host: string, callback: AsyncCallback>): void; - function getAddressesByName(host: string): Promise>; - - export interface NetConnection { - on(type: 'netAvailable', callback: Callback): void; - - on(type: 'netBlockStatusChange', callback: Callback<{ netHandle: NetHandle, blocked: boolean }>): void; - - on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, netCap: NetCapabilities }>): void; - - on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHandle, connectionProperties: ConnectionProperties }>): void; - - on(type: 'netLost', callback: Callback): void; - - on(type: 'netUnavailable', callback: Callback): void; - - /** - * Receives status change notifications of a specified network. - * - * @permission ohos.permission.GET_NETWORK_INFO - */ - register(callback: AsyncCallback): void; - - /** - * Cancels listening for network status changes. - */ - unregister(callback: AsyncCallback): void; - } - - export interface NetSpecifier { - netCapabilities: NetCapabilities; - bearerPrivateIdentifier?: string; - } - - export interface NetHandle { - netId: number; - - /** - * Binds a TCPSocket or UDPSocket to the current network. All data flows from - * the socket will use this network, without being subject to {@link setAppNet}. - * Before using this method, ensure that the socket is disconnected. - * - * @param socketParam Indicates the TCPSocket or UDPSocket object. - */ - bindSocket(socketParam: TCPSocket | UDPSocket, callback: AsyncCallback): void; - bindSocket(socketParam: TCPSocket | UDPSocket): Promise; - - /** - * Accesses a specified URL. - * - * @param url Indicates a URL connection. - * @param callback Returns a {@code URLConnection} object matching the given {@code url}. - */ - openConnection(url: string, callback: AsyncCallback): void; - openConnection(url: string, proxy: NetProxy, callback: AsyncCallback): void; - openConnection(url: string, proxy?: NetProxy): Promise; - - /** - * Resolves a host name to obtain all IP addresses based on the specified NetHandle. - * - * @param host Indicates the host name or the domain. - * @param callback Returns the NetAddress list. - */ - getAddressesByName(host: string, callback: AsyncCallback>): void; - getAddressesByName(host: string): Promise>; - - /** - * Resolves a host name to obtain the first IP address based on the specified NetHandle. - * - * @param host Indicates the host name or the domain. - * @return Returns the first NetAddress. - */ - getAddressByName(host: string, callback: AsyncCallback): void; - getAddressByName(host: string): Promise; - } - - export interface NetCapabilities { - linkUpBandwidthKbps?: number; - linkDownBandwidthKbps?: number; - networkCap?: Array; - bearerTypes: Array; - } - - export enum NetCap { - /** - * Indicates that the network can access the carrier's MMSC to send and receive multimedia messages. - */ - NET_CAPABILITY_MMS = 0, - - /** - * Indicates that the network can access the carrier's SUPL server. - */ - NET_CAPABILITY_SUPL = 1, - - /** - * Indicates that the network can access the carrier's DUN or Tethering gateway. - */ - NET_CAPABILITY_DUN = 2, - - /** - * Indicates that the network can access the FOTA server for remote device upgrade. - */ - NET_CAPABILITY_FOTA = 3, - - /** - * Indicates that the network can access the IMS server. - */ - NET_CAPABILITY_IMS = 4, - - /** - * Indicates that the network can access the carrier's CBS server. - */ - NET_CAPABILITY_CBS = 5, - - /** - * Indicates that the network can be used for Wi-Fi Direct. - */ - NET_CAPABILITY_WIFI_P2P = 6, - - /** - * Indicates that the network can access the carrier's Initial Attach server. - */ - NET_CAPABILITY_IA = 7, - - /** - * Indicates that the network can access the carrier's RCS server. - */ - NET_CAPABILITY_RCS = 8, - - /** - * Indicates that the network can access the carrier's XCAP server. - */ - NET_CAPABILITY_XCAP = 9, - - /** - * Indicates that the network can access the carrier's IMS emergency call server. - */ - NET_CAPABILITY_EIMS = 10, - - /** - * Indicates that the network traffic is not metered. - */ - NET_CAPABILITY_NOT_METERED = 11, - - /** - * Indicates that the network can access the Internet. - */ - NET_CAPABILITY_INTERNET = 12, - - /** - * Indicates that the network is not restricted. - */ - NET_CAPABILITY_NOT_RESTRICTED = 13, - - /** - * Indicates that the network is trusted. - */ - NET_CAPABILITY_TRUSTED = 14, - - /** - * Indicates that the network does not use a VPN. - */ - NET_CAPABILITY_NOT_VPN = 15, - - /** - * Indicates that the network is available. - */ - NET_CAPABILITY_VALIDATED = 16, - - /** - * Indicates that this network was found to have a captive portal in place last time it was - * probed. - */ - NET_CAPABILITY_CAPTIVE_PORTAL = 17, - - /** - * Indicates that the network is unavailable during roaming. - */ - NET_CAPABILITY_NOT_ROAMING = 18, - - /** - * Indicates that the network is available only for foreground applications. - */ - NET_CAPABILITY_FOREGROUND = 19, - - /** - * Indicates that the network is not congested. - */ - NET_CAPABILITY_NOT_CONGESTED = 20, - - /** - * Indicates that the network is not suspended. - */ - NET_CAPABILITY_NOT_SUSPENDED = 21, - - /** - * Indicates that traffic that goes through this network is paid by oem. For example, - * this network can be used by system apps to upload telemetry data. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_OEM_PAID = 22, - - /** - * Indicates that the network can access the Mission Critical server of the carrier. - */ - NET_CAPABILITY_MCX = 23, - - /** - * Indicates that the network was tested to only provide partial connectivity. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_PARTIAL_CONNECTIVITY = 24, - - /** - * Indicates that the network extends cap - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_HW_BASE = NET_CAPABILITY_PARTIAL_CONNECTIVITY, - - /** - * Indicates that the network can access the BIP0 server. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_BIP0 = NET_CAPABILITY_HW_BASE + 1, - - /** - * Indicates that the network can access the BIP1 server. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_BIP1 = NET_CAPABILITY_HW_BASE + 2, - - /** - * Indicates that the network can access the BIP2 server. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_BIP2 = NET_CAPABILITY_HW_BASE + 3, - - /** - * Indicates that the network can access the BIP3 server. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_BIP3 = NET_CAPABILITY_HW_BASE + 4, - - /** - * Indicates that the network can access the BIP4 server. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_BIP4 = NET_CAPABILITY_HW_BASE + 5, - - /** - * Indicates that the network can access the BIP5 server. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_BIP5 = NET_CAPABILITY_HW_BASE + 6, - - /** - * Indicates that the network can access the BIP6 server. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_BIP6 = NET_CAPABILITY_HW_BASE + 7, - - /** - * Indicates that the network can access internal default servers. - * - * @systemapi Hide this for inner system use. - */ - NET_CAPABILITY_INTERNAL_DEFAULT - } - - export enum NetBearType { - /** - * Indicates that the network is based on a cellular network. - */ - BEARER_CELLULAR = 0, - - /** - * Indicates that the network is based on a Wi-Fi network. - */ - BEARER_WIFI = 1, - - /** - * Indicates that the network is based on a Bluetooth network. - */ - BEARER_BLUETOOTH = 2, - - /** - * Indicates that the network is an Ethernet network. - */ - BEARER_ETHERNET = 3, - - /** - * Indicates that the network is a VPN. - */ - BEARER_VPN = 4, - - /** - * Indicates that the network is a Wi-Fi Aware network. - */ - BEARER_WIFI_AWARE = 5, - - /** - * Indicates that the network is a LoWPAN network. - */ - BEARER_LOWPAN = 6 - } - - export interface ConnectionProperties { - interfaceName: string; - isUsePrivateDns: boolean; - privateDnsServerName: string; - domains: string; - httpProxy: HttpProxy; - linkAddresses: Array; - dnses: Array; - routes: Array; - mtu: number; - } - - export interface HttpProxy { - host: string; - port: number; - parsedExclusionList: Array; - } - - export interface RouteInfo { - interface: string; - destination: LinkAddress; - gateway: NetAddress; - hasGateway: boolean; - isDefaultRoute: boolean; - } - - export interface LinkAddress { - address: NetAddress; - prefixLength: number; - } - - /** - * @since 7 - */ - export interface NetAddress { - address: string; - family?: number; // IPv4 = 1; IPv6 = 2, default is IPv4 - port?: number; // [0, 65535] - } - - export interface NetProxy { - type: ProxyType; - address: NetAddress; - } - - export enum ProxyType { - /** - * Represents proxy for high level protocols such as HTTP or FTP. - */ - HTTP, - /** - * Represents a SOCKS (V4 or V5) proxy. - */ - SOCKS - } -} - -export default connection; \ No newline at end of file -- Gitee From 9783ae9f3406fb0d3465400dd38589fe1839b6fa Mon Sep 17 00:00:00 2001 From: maosiping Date: Wed, 2 Mar 2022 11:21:31 +0800 Subject: [PATCH 052/282] change readme Signed-off-by: maosiping --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ffcc20feb50..a82da52d73e 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,4 @@ .AppleDesktop Network Trash Folder Temporary Items -.apdisk \ No newline at end of file +.apdisk -- Gitee From 73c82ebe1220589566ac9e45511270be3433b9b9 Mon Sep 17 00:00:00 2001 From: PaDaBoo Date: Wed, 2 Mar 2022 11:41:42 +0800 Subject: [PATCH 053/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E6=A0=87=E8=AF=86=E5=92=8C=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: PaDaBoo --- .../apis/js-apis-data-preferences.md | 107 ++++++++++-------- .../reference/apis/js-apis-data-storage.md | 2 +- 2 files changed, 62 insertions(+), 47 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md index 543b429ce1a..68da7c3cd1a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md +++ b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md @@ -4,7 +4,7 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 ## 导入模块 @@ -23,13 +23,13 @@ import data_Preferences from '@ohos.data.preferences' ## data_Preferences.getPreferences -### 系统能力 -SystemCapability.DistributedDataManager.Preferences.Core - getPreferences(context: Context, name: string, callback: AsyncCallback<Preferences>): void 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用callback形式返回结果。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -55,13 +55,13 @@ getPreferences(context: Context, name: string, callback: AsyncCallback<Prefer ## data_Preferences.getPreferences -### 系统能力 -SystemCapability.DistributedDataManager.Preferences.Core - getPreferences(context: Context, name: string): Promise<Preferences> 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用Promise方式作为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -90,13 +90,13 @@ getPreferences(context: Context, name: string): Promise<Preferences> ## data_Preferences.deletePreferences -### 系统能力 -SystemCapability.DistributedDataManager.Preferences.Core - deletePreferences(context: Context, name: string, callback: AsyncCallback<void>) 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用callback方式作为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -120,13 +120,13 @@ deletePreferences(context: Context, name: string, callback: AsyncCallback<voi ## data_Preferences.deletePreferences -### 系统能力 -SystemCapability.DistributedDataManager.Preferences.Core - deletePreferences(context: Context, name: string): Promise<void> 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -153,15 +153,15 @@ deletePreferences(context: Context, name: string): Promise<void> ## data_Preferences.removePreferencesFromCache -### 系统能力 -SystemCapability.DistributedDataManager.Preferences.Core - removePreferencesFromCache(context: Context, name: string, callback: AsyncCallback<Preferences>): void 从内存中移除指定文件对应的Preferences单实例。移除Preferences单实例时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -185,14 +185,15 @@ removePreferencesFromCache(context: Context, name: string, callback: AsyncCallba ## data_Preferences.removePreferencesFromCache -### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - removePreferencesFromCache(context: Context, name: string): Promise<void> 从内存中移除指定文件对应的Preferences单实例。移除Preferences单实例时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -224,14 +225,15 @@ removePreferencesFromCache(context: Context, name: string): Promise<void> ### get -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): void 获取键对应的值,如果值为null或者非默认值类型,返回默认数据。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -253,14 +255,15 @@ get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): ### get -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - get(key: string, defValue: ValueType): Promise<ValueType> 获取键对应的值,如果值为null或者非默认值类型,返默认数据。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -285,14 +288,15 @@ get(key: string, defValue: ValueType): Promise<ValueType> ### put -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - put(key: string, value: ValueType, callback: AsyncCallback<void>): void 首先获取指定文件对应的Preferences实例,然后借助Preferences API将数据写入Preferences实例,通过flush或者flushSync将Preferences实例持久化。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -314,14 +318,15 @@ put(key: string, value: ValueType, callback: AsyncCallback<void>): void ### put -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - put(key: string, value: ValueType): Promise<void> 首先获取指定文件对应的Preferences实例,然后借助Preferences API将数据写入Preferences实例,通过flush或者flushSync将Preferences实例持久化。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -346,14 +351,15 @@ put(key: string, value: ValueType): Promise<void> ### has -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - has(key: string, callback: AsyncCallback<boolean>): boolean 检查存储对象是否包含名为给定key的存储。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -381,14 +387,15 @@ has(key: string, callback: AsyncCallback<boolean>): boolean ### has -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - has(key: string): Promise<boolean> 检查存储对象是否包含名为给定key的存储。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -414,14 +421,15 @@ has(key: string): Promise<boolean> ### delete -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - delete(key: string, callback: AsyncCallback<void>): void 从存储对象中删除名为给定key的存储。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -442,14 +450,15 @@ delete(key: string, callback: AsyncCallback<void>): void ### delete -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - delete(key: string): Promise<void> 从存储对象删除名为给定key的存储。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -473,14 +482,15 @@ delete(key: string): Promise<void> ### flush -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - flush(callback: AsyncCallback<void>): void 将当前preferences对象中的修改保存到当前的preferences,并异步存储到文件中。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -500,14 +510,15 @@ flush(callback: AsyncCallback<void>): void ### flush -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - flush(): Promise<void> 将当前preferences对象中的修改保存到当前的preferences,并异步存储到文件中。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -526,14 +537,15 @@ flush(): Promise<void> ### clear -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - clear(callback: AsyncCallback<void>): void 清除此存储对象中的所有存储。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -553,14 +565,15 @@ clear(callback: AsyncCallback<void>): void ### clear -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - clear(): Promise<void> 清除此存储对象中的所有存储。 此方法为异步方法。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -579,12 +592,13 @@ clear(): Promise<void> ### on('change') -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - on(type: 'change', callback: Callback<{ key : string }>): void 订阅数据变更者类,订阅的key的值发生变更后,在执行flush方法后,callback方法会被回调。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 说明 | | -------- | -------- | -------- | @@ -604,12 +618,13 @@ on(type: 'change', callback: Callback<{ key : string }>): void ### off('change') -#### 系统能力 SystemCapability.DistributedDataManager.Preferences.Core - off(type: 'change', callback: Callback<{ key : string }>): void 当不再进行订阅数据变更时,使用此接口取消订阅。 +### 系统能力### +SystemCapability.DistributedDataManager.Preferences.Core + - 参数: | 参数名 | 类型 | 说明 | | -------- | -------- | -------- | diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-storage.md b/zh-cn/application-dev/reference/apis/js-apis-data-storage.md index 8c47d4e3531..8bfce043074 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-data-storage.md +++ b/zh-cn/application-dev/reference/apis/js-apis-data-storage.md @@ -4,7 +4,7 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 从API Version 8开始,该接口不再维护,推荐使用新接口 [@ohos.data.preferences](js-apis-data-preferences.md) +> 从API Version 9开始,该接口不再维护,推荐使用新接口 [@ohos.data.preferences](js-apis-data-preferences.md) ## 导入模块 -- Gitee From 07c6c38f7494daa2e0313db02c312411e8fdb014 Mon Sep 17 00:00:00 2001 From: maosiping Date: Wed, 2 Mar 2022 14:29:05 +0800 Subject: [PATCH 054/282] change readme Signed-off-by: maosiping --- .../reference/apis/js-apis-net-connection.md | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md index 4be6ce47414..a738636b763 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -65,8 +65,6 @@ hasDefaultNet(callback: AsyncCallback\): void 判断是否有默认网络,使用callback方式作为异步方法。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -90,8 +88,6 @@ hasDefaultNet(): Promise\ 判断是否有默认网络,使用Promise方式作为异步方法。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **返回值:** @@ -335,8 +331,6 @@ on(type: 'netAvailable', callback: Callback\): void 监听网络可用事件。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -360,8 +354,6 @@ on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, net 监听网络能力变化事件。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -385,8 +377,6 @@ on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHan 监听网络连接信息变化事件。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -410,8 +400,6 @@ on(type: 'netLost', callback: Callback\): void 监听网络丢失事件。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -435,8 +423,6 @@ on(type: 'netUnavailable', callback: Callback\): void 监听网络不可用事件。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -484,8 +470,6 @@ unregister(callback: AsyncCallback\): void 注销网络的监听。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -516,8 +500,6 @@ getAddressesByName(host: string, callback: AsyncCallback\>): 使用对应网络将host解析成IP,返回所有IP,使用callback方式作为异步方法。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -544,8 +526,6 @@ getAddressesByName(netHandle: NetHandle): Promise\> 使用对应网络将host解析成IP,返回所有IP,使用Promise方式作为异步方法。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -576,8 +556,6 @@ getAddressByName(host: string, callback: AsyncCallback\): void 使用对应网络将host解析成IP,返回一个IP,使用callback方式作为异步方法。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** @@ -604,8 +582,6 @@ getAddressByName(netHandle: NetHandle): Promise\ 使用对应网络将host解析成IP,返回一个IP,使用Promise方式作为异步方法。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** -- Gitee From 28356de30934c73ebcf4285355626dfa30f16c7e Mon Sep 17 00:00:00 2001 From: maosiping Date: Wed, 2 Mar 2022 14:30:12 +0800 Subject: [PATCH 055/282] change readme Signed-off-by: maosiping --- zh-cn/application-dev/reference/apis/js-apis-net-connection.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md index a738636b763..0320816196a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -290,8 +290,6 @@ createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnectio 获取一个netSpecifier指定的网络的句柄。 -**需要权限**:ohos.permission.GET_NETWORK_INFO - **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** -- Gitee From 6d6bd59958dcdbd2c8c0b5a25cc7b6b8d846dcf5 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Wed, 2 Mar 2022 14:52:52 +0800 Subject: [PATCH 056/282] update docs Signed-off-by: annie_wangli --- .../reference/apis/Readme-EN.md | 12 +- .../apis/js-apis-storage-statistics.md | 183 ++++++++++++++++++ .../reference/apis/js-apis-volumemanager.md | 167 ++++++++++++++++ 3 files changed, 360 insertions(+), 2 deletions(-) create mode 100644 en/application-dev/reference/apis/js-apis-storage-statistics.md create mode 100644 en/application-dev/reference/apis/js-apis-volumemanager.md diff --git a/en/application-dev/reference/apis/Readme-EN.md b/en/application-dev/reference/apis/Readme-EN.md index d350833093a..5e372b0913e 100644 --- a/en/application-dev/reference/apis/Readme-EN.md +++ b/en/application-dev/reference/apis/Readme-EN.md @@ -19,7 +19,7 @@ - [Media](js-apis-media.md) - Security - [User Authentication](js-apis-useriam-userauth.md) - - [Access Control](js-apis-abilityAccessCtrl.md) + - [Access Control](js-apis-abilityAccessCtrl.md) - Data Management - [File Management](js-apis-fileio.md) - [Lightweight Storage](js-apis-data-storage.md) @@ -27,8 +27,16 @@ - [Relational Database](js-apis-data-rdb.md) - [Result Set](js-apis-data-resultset.md) - [DataAbilityPredicates](js-apis-data-ability.md) +- File Management + - [File Management](js-apis-fileio.md) + - [Statfs](js-apis-statfs.md) + - [Environment](js-apis-environment.md) + - [Public File Access and Management](js-apis-filemanager.md) + - [App Storage Statistics](js-apis-storage-statistics.md) + - [Volume Management](js-apis-volumemanager.md) - Account Management - [Distributed Account Management](js-apis-distributed-account.md) + - [App Account Management](js-apis-appAccount.md) - Telephony Service - [Call](js-apis-call.md) - [SMS](js-apis-sms.md) @@ -38,7 +46,7 @@ - [WLAN](js-apis-wifi.md) - Device Management - [Sensors](js-apis-sensor.md) - - [Vibration](js-apis-vibrator.md) + - [Vibrator](js-apis-vibrator.md) - [Brightness](js-apis-brightness.md) - [Battery Info](js-apis-battery-info.md) - [Power Management](js-apis-power.md) diff --git a/en/application-dev/reference/apis/js-apis-storage-statistics.md b/en/application-dev/reference/apis/js-apis-storage-statistics.md new file mode 100644 index 00000000000..75a68449a7e --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-storage-statistics.md @@ -0,0 +1,183 @@ +# App Storage Statistics + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + +## Modules to Import + +```js +import storagestatistics from "@ohos.storagestatistics"; +``` + +## System Capabilities + +SystemCapability.FileManagement.StorageService.SpatialStatistics + +## storagestatistics.getTotalSizeOfVolume + +getTotalSizeOfVolume(volumeUuid: string): Promise<number> + +Asynchronously obtains the total space of the specified volume. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------ | ---- | ---- | + | volumeUuid | string | Yes| Universally unique identifier (UUID) of the volume.| + +- Return value + + | Type| Description| + | --------------------- | ---------------- | + | Promise<number> | Promise used to return the total space of the volume.| + +- Example + + ```js + let uuid = ""; + storagestatistics.getTotalSizeOfVolume(uuid).then(function(number){ + console.info("getTotalSizeOfVolume successfully:"+ number); + }).catch(function(err){ + console.info("getTotalSizeOfVolume failed with error:"+ err); + }); + ``` + +## storagestatistics.getTotalSizeOfVolume + +getTotalSizeOfVolume(volumeUuid: string, callback:AsyncCallback<number>):void + +Asynchronously obtains the total space of the specified volume. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------------------------------------ | ---- | -------------------------- | + | volumeUuid | string | Yes| UUID of the volume.| + | callback | callback:AsyncCallback<number> | Yes| Callback invoked to return the total space of the volume.| + +- Example + + ```js + let uuid = ""; + storagestatistics.getTotalSizeOfVolume(uuid, function(error, number){ + // Do something + }); + ``` + + + +## storagestatistics.getFreeSizeOfVolume + +getFreeSizeOfVolume(volumeUuid: string): Promise<number> + +Asynchronously obtains the available space of the specified volume. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------ | ---- | ---- | + | volumeUuid | string | Yes| UUID of the volume.| + +- Return value + + | Type| Description| + | --------------------- | ------------------ | + | Promise<number> | Promise used to return the available space of the volume.| + +- Example + + ```js + let uuid = ""; + storagestatistics.getFreeSizeOfVolume(uuid).then(function(number){ + console.info("getFreeSizeOfVolume successfully:"+ number); + }).catch(function(err){ + console.info("getFreeSizeOfVolume failed with error:"+ err); + }); + + ``` + +## storagestatistics.getFreeSizeOfVolume + +getFreeSizeOfVolume(volumeUuid: string, callback:AsyncCallback<number>):void + +Asynchronously obtains the available space of the specified volume. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------------------------------------ | ---- | ---------------------------- | + | volumeUuid | string | Yes| UUID of the volume.| + | callback | callback:AsyncCallback<number> | Yes| Callback invoked to return the available space of the volume.| + +- Example + + ```js + let uuid = ""; + storagestatistics.getFreeSizeOfVolume(uuid, function(error, number){ + // Do something + }); + ``` + +## storagestatistics.getBundleStats + +getBundleStats(volumeUuid: string, packageName:String, ): Promise<BundleStats> + +Asynchronously obtains the bundle status on the specified volume. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ----------- | ------ | ---- | -------- | + | volumeUuid | string | Yes| UUID of the volume.| + | packageName | string | Yes| Bundle name of the app.| + +- Return value + + | Type| Description| + | ------------------------------------------ | -------------------------- | + | Promise<[Bundlestats](#bundlestats)> | Promise used to return the bundle status on the volume.| + +- Example + + ```js + let uuid = ""; + let packageName = ""; + storagestatistics.getBundleStats(uuid, packageName).then(function(BundleStats){ + console.info("getBundleStats successfully:"+ JSON.stringify(BundleStats)); + }).catch(function(err){ + console.info("getBundleStats failed with error:"+ err); + }); + ``` + +## storagestatistics.getBundleStats + +getBundleStats(volumeUuid: string, callback:AsyncCallback<BundleStats>):void + +Asynchronously obtains the bundle status on the specified volume. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | --------------------------------------------------------- | ---- | ------------------------------------ | + | volumeUuid | string | Yes| UUID of the volume.| + | callback | callback:AsyncCallback<[Bundlestats](#bundlestats)> | Yes| Callback invoked to return the bundle status on the volume.| + +- Example + + ```js + let uuid = ""; + let packageName = ""; + storagestatistics.getBundleStats(uuid, packageName, function(error, BundleStats){ + // Do something + }); + ``` + +## BundleStats + +### Attributes + +| Name| Type| Description| +| --------- | ------ | -------------- | +| appSize | number | Size of the app.| +| cacheSize | number | Size of the cached data.| +| dataSize | number | Total data size of the app.| diff --git a/en/application-dev/reference/apis/js-apis-volumemanager.md b/en/application-dev/reference/apis/js-apis-volumemanager.md new file mode 100644 index 00000000000..71dd8f92014 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-volumemanager.md @@ -0,0 +1,167 @@ +# Volume Management + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + +## Modules to Import + +```js +import volumemanager from "@ohos.volumemanager"; +``` + +## System Capabilities + +SystemCapability.FileManagement.StorageService.Volume + +## volumemanager.getAllVolumes + +getAllVolumes(): Promise<Volume[]> + +Asynchronously obtains information about all available volumes. This method uses a promise to return the result. + +- Return value + + | Type| Description| + | ---------------------------------- | -------------------------- | + | Promise<[Volume](#volume)[]> | Promise used to return the execution result.| + +- Example + + ```js + volumemanager.getAllVolumes().then(function(volumes){ + // do something + }); + ``` + +## volumemanager.getAllVolumes + +getAllVolumes(callback:AsyncCallback<Volume[]>):void + +Asynchronously obtains information about all available volumes. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------------------------------------------------- | ---- | ------------------------------------ | + | callback | callback:AsyncCallback<[Volume](#volume)[]> | Yes| Callback invoked to return the volume information obtained.| + +- Example + + ```js + let uuid = ""; + volumemanager.getAllVolumes(uuid, function(error, volumes){ + // do something + }); + ``` + + +## volumemanager.mount + +mount(volumeId: string): Promise<boolean> + +Asynchronously mounts a volume. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------ | ---- | ---- | + | volumeId | string | Yes| Volume ID.| + +- Return value + + | Type| Description| + | ---------------------- | ---------- | + | Promise<boolean> | Promise used to return the execution result.| + +- Example + + ```js + let volumeId = ""; + volumemanager.mount(volumeId).then(function(flag){ + // do something + }); + ``` + +## volumemanager.mount + +mount(volumeId: string, callback:AsyncCallback<boolean>):void + +Asynchronously mounts a volume. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------------------------------------- | ---- | -------------------- | + | volumeId | string | Yes| Volume ID.| + | callback | callback:AsyncCallback<boolean> | Yes| Callback invoked to return the execution result.| + +- Example + + ```js + let volumeId = ""; + volumemanager.mount(volumeId, function(error, flag){ + // do something + }); + ``` + +## volumemanager.unmount + +unmount(volumeId: string): Promise<boolean> + +Asynchronously unmounts a volume. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------ | ---- | ---- | + | volumeId | string | Yes| Volume ID.| + +- Return value + + | Type| Description| + | ---------------------- | ---------- | + | Promise<boolean> | Promise used to return the execution result.| + +- Example + + ```js + let volumeId = ""; + volumemanager.unmount(volumeId).then(function(flag){ + // do something + }); + ``` + +## volumemanager.unmount + +unmount(volumeId: string, callback:AsyncCallback<boolean>):void + +Asynchronously unmounts a volume. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------------------------------------- | ---- | -------------------- | + | volumeId | string | Yes| Volume ID.| + | callback | callback:AsyncCallback<boolean> | Yes| Callback invoked to return the execution result.| + +- Example + + ```js + let volumeId = ""; + volumemanager.unmount(volumeId, function(error, flag){ + // do something + }); + ``` + +## Volume + +### Attributes + +| Name| Type| Description| +| ----------- | ------- | -------------------- | +| id | number | Volume ID.| +| uuid | string | Universally unique identifier (UUID) of the volume.| +| description | string | Description of the volume.| +| removeAble | boolean | Whether the volume is a removable storage device.| +| state | int | Current volume status.| +| path | string | Mount address of the volume.| -- Gitee From e264ef699c5ffafd84756429453f7c27d315f240 Mon Sep 17 00:00:00 2001 From: zengyawen Date: Wed, 2 Mar 2022 14:55:58 +0800 Subject: [PATCH 057/282] update docs Signed-off-by: zengyawen --- en/application-dev/Readme-EN.md | 1 - en/application-dev/quick-start/Readme-EN.md | 3 - .../figures/en-us_image_0000001167850660.png | Bin 5353 -> 0 bytes .../quick-start/start-overview.md | 62 --------- .../quick-start/start-with-js.md | 114 ----------------- en/application-dev/quick-start/start.md | 7 -- .../reference/apis/js-apis-bluetooth.md | 4 +- .../reference/apis/js-apis-data-resultset.md | 3 +- .../arkui-js/js-components-common-methods.md | 2 +- .../ui/ui-ts-creating-project.md | 3 +- zh-cn/application-dev/Readme-CN.md | 1 - .../application-dev/quick-start/Readme-CN.md | 4 - .../figures/zh-cn_image_0000001089359413.png | Bin 8806 -> 0 bytes .../figures/zh-cn_image_0000001167690688.png | Bin 3940 -> 0 bytes .../figures/zh-cn_image_0000001167850660.png | Bin 5353 -> 0 bytes .../figures/zh-cn_image_0000001168898456.png | Bin 14509 -> 0 bytes .../figures/zh-cn_image_0000001169221404.png | Bin 27630 -> 0 bytes .../figures/zh-cn_image_0000001213130527.png | Bin 9067 -> 0 bytes .../figures/zh-cn_image_0000001213883165.png | Bin 18627 -> 0 bytes .../figures/zh-cn_image_0000001214043107.png | Bin 6839 -> 0 bytes .../figures/zh-cn_image_0000001238733799.png | Bin 43046 -> 0 bytes .../figures/zh-cn_image_0000001238853759.png | Bin 34048 -> 0 bytes .../quick-start/start-overview.md | 35 ------ .../quick-start/start-with-ets.md | 118 ------------------ .../quick-start/start-with-js.md | 105 ---------------- zh-cn/application-dev/quick-start/start.md | 8 -- .../security/hapsigntool-guidelines.md | 3 +- 27 files changed, 7 insertions(+), 466 deletions(-) delete mode 100644 en/application-dev/quick-start/figures/en-us_image_0000001167850660.png delete mode 100644 en/application-dev/quick-start/start-overview.md delete mode 100644 en/application-dev/quick-start/start-with-js.md delete mode 100644 en/application-dev/quick-start/start.md delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001089359413.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001167690688.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001167850660.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001168898456.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001169221404.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001213130527.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001213883165.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001214043107.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001238733799.png delete mode 100644 zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001238853759.png delete mode 100644 zh-cn/application-dev/quick-start/start-overview.md delete mode 100644 zh-cn/application-dev/quick-start/start-with-ets.md delete mode 100644 zh-cn/application-dev/quick-start/start-with-js.md delete mode 100644 zh-cn/application-dev/quick-start/start.md diff --git a/en/application-dev/Readme-EN.md b/en/application-dev/Readme-EN.md index 206b69d6dc6..dd682c80aab 100644 --- a/en/application-dev/Readme-EN.md +++ b/en/application-dev/Readme-EN.md @@ -3,7 +3,6 @@ - [Application Development Overview](application-dev-guide.md) - [DevEco Studio \(OpenHarmony\) User Guide](quick-start/deveco-studio-user-guide-for-openharmony.md) - [Directory Structure](quick-start/package-structure.md) -- [Getting Started](quick-start/start.md) - [ArkUI](ui/ui-arkui.md) - [JavaScript-based Web-like Development Paradigm](ui/ui-arkui-js.md) diff --git a/en/application-dev/quick-start/Readme-EN.md b/en/application-dev/quick-start/Readme-EN.md index ae9b9c0c16f..cb35fe17513 100644 --- a/en/application-dev/quick-start/Readme-EN.md +++ b/en/application-dev/quick-start/Readme-EN.md @@ -11,7 +11,4 @@ - [Configuring the OpenHarmony App Signature](configuring-openharmony-app-signature.md) - [Installing and Running Your OpenHarmony App](installing-openharmony-app.md) - [Directory Structure](package-structure.md) -- [Getting Started](start.md) - - [Preparations](start-overview.md) - - [Getting Started with JavaScript](start-with-js.md) diff --git a/en/application-dev/quick-start/figures/en-us_image_0000001167850660.png b/en/application-dev/quick-start/figures/en-us_image_0000001167850660.png deleted file mode 100644 index 469ca774dde99530329d5e7bd62a5a40fb16237b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5353 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 CHLaNd diff --git a/en/application-dev/quick-start/start-overview.md b/en/application-dev/quick-start/start-overview.md deleted file mode 100644 index 90ba0afd829..00000000000 --- a/en/application-dev/quick-start/start-overview.md +++ /dev/null @@ -1,62 +0,0 @@ -# Preparations - -## Task Description - -This document is intended for novices at developing apps. You will learn the development procedure from the following sections to build two pages and implement redirection from the first page to the second one. The following figure shows how the pages look on the [Previewer](https://developer.harmonyos.com/en/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252). - -For best results, use the [latest version of DevEco Studio](https://developer.harmonyos.com/en/develop/deveco-studio#download) for your development. - -![](figures/3.png) - -**Table 1** Comparison between ArkUI paradigms - - - - - - - - - - - - - - - - - - - - - - - - -

Comparison Item

-

JavaScript-based Web-like Development Paradigm

-

TypeScript-based Declarative Development Paradigm

-

Language

-

JS

-

eTS

-

Paradigm

-

Web-like paradigm

-

Declarative paradigm

-

Execution

-

Handled by the framework; data-driven automatic UI update

-

Handled by the framework; data-driven automatic UI update

-

Advantages

-

Simple and easy to use

-

Simplified development, less memory usage, and higher running performance

-
- -## Before You Start - -1. Install DevEco Studio and configure the development environment. For details, see [Configuring the OpenHarmony SDK](configuring-openharmony-sdk.md). -2. Create a project as instructed in [Creating an OpenHarmony Project](create-openharmony-project.md). - - If you are using the JavaScript language, select **Empty Ability** for **Template** and **JS** for **Language**. - -3. Use the [previewer](https://developer.harmonyos.com/en/docs/documentation/doc-guides/previewer-0000001054328973#EN-US_TOPIC_0000001056725592__section16523172216252) or [emulator](https://developer.harmonyos.com/en/docs/documentation/doc-guides/run_simulator-0000001053303709) to run the project. - -Now you have created your first OpenHarmony project. You can continue the development by following instructions in [Getting Started with JavaScript](start-with-js.md). - diff --git a/en/application-dev/quick-start/start-with-js.md b/en/application-dev/quick-start/start-with-js.md deleted file mode 100644 index bee0ea91534..00000000000 --- a/en/application-dev/quick-start/start-with-js.md +++ /dev/null @@ -1,114 +0,0 @@ -# Getting Started with JavaScript - -For best results, use the [latest version of DevEco Studio](https://developer.harmonyos.com/en/develop/deveco-studio#download) for your development. - -## Building the First Page - -1. Add a **Text** and a **Button** component to the first page. - - In the **Project** window, choose **entry** \> **src** \> **main** \> **js** \> **default** \> **pages** \> **index**, open the **index.hml** file, and add the components. - - ``` - -

- - - Hello World - - - -
- ``` - -2. Open the **index.css** file and set text and button styles. - - ``` - /* index.css */ - .container { - flex-direction: column; /* Arrange container items vertically. */ - justify-content: center; /* Center the items along the main axis of the container. */ - align-items: center; /* Center the items along the cross axis of the container. */ - width:100%; - height:100%; - } - /* Set the style for the component of the text class. */ - .text{ - font-size: 42px; - } - /* Set the style for the component of the button class. */ - .button { - width: 240px; - height: 60px; - background-color: #007dff; - font-size: 30px; - text-color: white; - margin-top: 20px; - } - ``` - -3. [Preview](https://developer.harmonyos.com/en/docs/documentation/doc-guides/previewer-0000001054328973#EN-US_TOPIC_0000001056725592__section16523172216252) or [run your app on the emulator](https://developer.harmonyos.com/en/docs/documentation/doc-guides/run_simulator-0000001053303709). The following figure shows the running effect. - - ![](figures/1.png) - - -## Creating the Second Page - -1. In the **Project** window, choose **entry** \> **src** \> **main** \> **js** \> **default**, right-click the **pages** folder, and then choose **New** \> **JS Page**. Name the new page **details** and press **Enter**. - - Below is the structure of the **pages** folder: - - ![](figures/en-us_image_0000001167850660.png) - -2. Open the **details.hml** file, add the **** component, and set its layout. - - ``` - -
- - Hi there - -
- ``` - -3. Open the **details.css** file and set the text style. - - ``` - /* details.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width:100%; - height:100%; - } - .text { - font-size: 42px; - text-align: center; - } - ``` - - -## Implementing Page Redirection - -1. Open the **index.js** file and import the router module. The page router finds the target page based on its URI for the redirection. The sample code is as follows: - - ``` - // index.js - import router from '@system.router'; - - export default { - launch() { - router.push ({ - uri:'pages/details/details', // Specify the page to be redirected to. - }) - } - } - ``` - -2. [Preview](https://developer.harmonyos.com/en/docs/documentation/doc-guides/previewer-0000001054328973#EN-US_TOPIC_0000001056725592__section16523172216252) or [run your app on the emulator](https://developer.harmonyos.com/en/docs/documentation/doc-guides/run_simulator-0000001053303709) again. The following figure shows the running effect. - - ![](figures/2.png) - - -Congratulations! You have finished developing your app in JavaScript. - diff --git a/en/application-dev/quick-start/start.md b/en/application-dev/quick-start/start.md deleted file mode 100644 index 1e4c7a3ff55..00000000000 --- a/en/application-dev/quick-start/start.md +++ /dev/null @@ -1,7 +0,0 @@ -# Getting Started - -- **[Preparations](start-overview.md)** - -- **[Getting Started with JavaScript](start-with-js.md)** - - diff --git a/en/application-dev/reference/apis/js-apis-bluetooth.md b/en/application-dev/reference/apis/js-apis-bluetooth.md index 41295611985..588c942cb2b 100644 --- a/en/application-dev/reference/apis/js-apis-bluetooth.md +++ b/en/application-dev/reference/apis/js-apis-bluetooth.md @@ -2111,7 +2111,7 @@ let deviceName = gattClient.getDeviceName().then((data) => { getRssiValue(callback: AsyncCallback<number>): void -Obtains the received signal strength indication (RSSI) of the peer BLE device. This method uses an asynchronous callback to return the result. It can be used only after a connection is set up by calling [connect](#connect-boolean). +Obtains the received signal strength indication (RSSI) of the peer BLE device. This method uses an asynchronous callback to return the result. It can be used only after a connection is set up by calling [connect](#connect). **Parameters:** @@ -2140,7 +2140,7 @@ let rssi = gattClient.getRssiValue((err, data)=> { getRssiValue(): Promise<number> -Obtains the RSSI of the peer BLE device. This method uses a promise to return the result. It can be used only after a connection is set up by calling [connect](#connect-boolean). +Obtains the RSSI of the peer BLE device. This method uses a promise to return the result. It can be used only after a connection is set up by calling [connect](#connect). **Return values:** diff --git a/en/application-dev/reference/apis/js-apis-data-resultset.md b/en/application-dev/reference/apis/js-apis-data-resultset.md index c672898f183..4a13518debf 100644 --- a/en/application-dev/reference/apis/js-apis-data-resultset.md +++ b/en/application-dev/reference/apis/js-apis-data-resultset.md @@ -8,7 +8,7 @@ SystemCapability.DistributedDataManager.RelationalStore.Core ## Usage -The **resultSet** object is obtained by using [**RdbStore.query\(\)**](js-apis-data-rdb.md#section6231155031814). +The **resultSet** object is obtained by using [**RdbStore.query\(\)**](js-apis-data-rdb.md#query). ``` import dataRdb from '@ohos.data.rdb'; @@ -795,4 +795,3 @@ Closes the result set. }) ``` - diff --git a/en/application-dev/reference/arkui-js/js-components-common-methods.md b/en/application-dev/reference/arkui-js/js-components-common-methods.md index 221a5a9de52..3ae0be9a4dd 100644 --- a/en/application-dev/reference/arkui-js/js-components-common-methods.md +++ b/en/application-dev/reference/arkui-js/js-components-common-methods.md @@ -586,7 +586,7 @@ Obtains the size of the element and its position relative to the window. ## createIntersectionObserver -createIntersectionObserver\(param?: [ObserverParam](#table143341035121917)\):[Observer](#table4506633141711) +createIntersectionObserver\(param?: ObserverParam):Observer Gets notified of the visibility of an element on the current page. diff --git a/en/application-dev/ui/ui-ts-creating-project.md b/en/application-dev/ui/ui-ts-creating-project.md index 57482cce585..06eaa9f6052 100644 --- a/en/application-dev/ui/ui-ts-creating-project.md +++ b/en/application-dev/ui/ui-ts-creating-project.md @@ -61,8 +61,7 @@ Before creating a project, you need to install DevEco Studio. For details, see ![](figures/en-us_image_0000001148858818.png) - Before the installation, you must configure an application signature. For details, see [Configuring the OpenHarmony App Signature](https://gitee.com/openharmony/docs/blob/master/en/application-dev/quick-start/configuring-the-openharmony-app-signature.md). After the installation is complete, click the **Run** icon on the screen to open the application. **Hello World** is displayed in the center of the screen. + Before the installation, you must configure an application signature. For details, see [Configuring the OpenHarmony App Signature](../quick-start/configuring-openharmony-app-signature.md). After the installation is complete, click the **Run** icon on the screen to open the application. **Hello World** is displayed in the center of the screen. ![](figures/en-us_image_0000001158896538.png) - diff --git a/zh-cn/application-dev/Readme-CN.md b/zh-cn/application-dev/Readme-CN.md index e91b5d97f37..562b3b8779e 100644 --- a/zh-cn/application-dev/Readme-CN.md +++ b/zh-cn/application-dev/Readme-CN.md @@ -3,7 +3,6 @@ - [应用开发导读](application-dev-guide.md) - [DevEco Studio(OpenHarmony)使用指南](quick-start/deveco-studio-user-guide-for-openharmony.md) - [包结构说明](quick-start/package-structure.md) -- [快速入门](quick-start/start.md) - [Ability框架](ability/Readme-CN.md) - 方舟开发框架(ArkUI) - [基于JS扩展的类Web开发范式](ui/ui-arkui-js.md) diff --git a/zh-cn/application-dev/quick-start/Readme-CN.md b/zh-cn/application-dev/quick-start/Readme-CN.md index 510edabac9f..e530b16bc6e 100755 --- a/zh-cn/application-dev/quick-start/Readme-CN.md +++ b/zh-cn/application-dev/quick-start/Readme-CN.md @@ -10,7 +10,3 @@ - [配置OpenHarmony应用签名信息](configuring-openharmony-app-signature.md) - [安装运行OpenHarmony应用](installing-openharmony-app.md) - [包结构说明](package-structure.md) -- 快速入门 - - [开发准备](start-overview.md) - - [使用JS语言开发](start-with-js.md) - - [使用eTS语言开发](start-with-ets.md) diff --git a/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001089359413.png b/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001089359413.png deleted file mode 100644 index 85345789b60927729e9243798fe122c64ca92687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8806 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 diff --git a/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001167850660.png b/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001167850660.png deleted file mode 100644 index 469ca774dde99530329d5e7bd62a5a40fb16237b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5353 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 CHLaNd diff --git a/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001168898456.png b/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001168898456.png deleted file mode 100644 index b62a4291cbe98e250fd9dcc65e9f91ba67445575..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14509 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 bMf!wq{(D9A>HhgOM7pOsMvu$1>|*{8Fz6xC diff --git a/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001169221404.png b/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001169221404.png deleted file mode 100644 index c44bd561803aa0dc4cafcf0db68bf38f5ba43013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27630 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 diff --git a/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001213130527.png b/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001213130527.png deleted file mode 100644 index afdab82267fcd7d5eacae76eba500baa3bbecd40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9067 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 XDD$!t>ekAm9WS$+i>Gs~Q$XrJ8PNu? diff --git a/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001238853759.png b/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001238853759.png deleted file mode 100644 index 6bf1ed8cb6d6b6d88b57e533f9efe840afee95b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34048 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ξ1|qVrr^Pnz#1I#ai1}r+n>r=Z<#~yW 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 diff --git a/zh-cn/application-dev/quick-start/start-overview.md b/zh-cn/application-dev/quick-start/start-overview.md deleted file mode 100644 index d60bf43b85c..00000000000 --- a/zh-cn/application-dev/quick-start/start-overview.md +++ /dev/null @@ -1,35 +0,0 @@ -# 开发准备 - -## 任务说明 - -本文档适用于应用开发的初学者。通过构建一个简单的具有页面跳转功能的应用(如下图[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行效果所示),熟悉应用开发流程。 - -为确保运行效果,本文以使用**DevEco Studio 3.0 Beta2**版本为例,点击[此处](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta)获取下载链接。 - -![zh-cn_image_0000001089359413](figures/zh-cn_image_0000001089359413.png) - -**表1** 方舟开发框架的对比 - -| 比较项 | 基于JS扩展的类Web开发范式 | 基于TS扩展的声明式开发范式 | -| -------- | -------- | -------- | -| 语言生态 | JS | eTS | -| 接口方式 | 类Web范式 | 声明式 | -| 执行方式 | 框架层处理,基于数据驱动的UI自动变更 | 框架层处理,基于数据驱动的UI自动变更 | -| 相对优势 | 轻量化,开发更简便 | 极简开发,内存占用更少、运行性能更高 | - -接下来,分别使用JS语言、eTS语言实现上述两个页面跳转的功能。 - - -## 开发准备 - -1. 开始前请参考[配置OpenHarmony SDK](../quick-start/configuring-openharmony-sdk.md),完成**DevEco Studio**的安装和开发环境配置。 - -2. 开发环境配置完成后,请参考[创建OpenHarmony工程](../quick-start/use-wizard-to-create-project.md)创建工程。 - - 使用JS语言开发,模板选择Empty Ability,Language选择JS。 - - - 使用eTS语言开发,模板选择Empty Ability,Language选择eTS。 - -3. 工程创建完成后,使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行该工程。 - -完成上述操作后,请参考[使用JS语言开发](../quick-start/start-with-js.md)、[使用eTS语言开发](../quick-start/start-with-ets.md)继续下一步的学习。 - diff --git a/zh-cn/application-dev/quick-start/start-with-ets.md b/zh-cn/application-dev/quick-start/start-with-ets.md deleted file mode 100644 index d2f32af4929..00000000000 --- a/zh-cn/application-dev/quick-start/start-with-ets.md +++ /dev/null @@ -1,118 +0,0 @@ -# 使用eTS语言开发 - -> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 请使用DevEco Studio V3.0.0.601 Beta1及更高版本。本文以使用**DevEco Studio 3.0 Beta2**版本为例,点击[此处](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta)获取下载链接。 - - -## 创建eTS工程 - -1. 打开DevEco Studio,创建一个新工程,选择模板,如Empty Ability: - - ![zh-cn_image_0000001238733799](figures/zh-cn_image_0000001238733799.png) - -2. 进入配置工程界面,Project Type选择Application,Language选择eTS,其他参数根据实际需要设置即可。 - - ![zh-cn_image_0000001238853759](figures/zh-cn_image_0000001238853759.png) - - -## 编写第一个页面 - -1. 工程创建完成后,在"Project"窗口,点击entry > src > main > ets > default > pages,打开index.ets文件。 - - ![zh-cn_image_0000001213883165](figures/zh-cn_image_0000001213883165.png) - -2. 第一个页面由Flex容器组件、Text组件和Button组件构成。在index.ets中编写并设置页面组件的属性和样式,示例代码如下所示: - ``` - @Entry - @Component - struct Index { - build() { - //Flex容器组件 - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - //Text组件 - Text('Hello World') - .fontSize(60) - .fontWeight(500) - //Button组件 - Button('Next') - .fontSize(40) - .fontWeight(500) - .width(280) - .height(60) - } - //容器整体宽高 - .width('100%') - .height('100%') - } - } - ``` - -3. 使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: - - ![zh-cn_image_0000001168898456](figures/zh-cn_image_0000001168898456.png) - - -## 创建第二个页面 - -1. 在"Project"窗口,打开entry > src > main > ets > default,右键点击pages文件夹,选择NeweTS Page,命名为details,单击回车键。创建完成后,可以看到pages文件夹下的文件目录结构如下: - - ![zh-cn_image_0000001214043107](figures/zh-cn_image_0000001214043107.png) - -2. 第二个页面由Flex容器组件、Text组件构成。在details.ets中编写并设置页面组件的属性和样式,示例代码如下所示: - ``` - @Entry - @Component - struct Details { - build() { - //Flex容器组件 - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - //Text组件 - Text('Hi there') - .fontSize(60) - .fontWeight(500) - } - //容器整体宽高 - .width('100%') - .height('100%') - } - } - ``` - - -## 实现页面跳转 - -1. 打开第一个页面的index.ets文件,导入router模块,页面路由router根据页面的uri来找到目标页面,从而实现跳转。示例代码如下: - ``` - //导入router模块 - import router from '@system.router'; - @Entry - @Component - struct Index { - build() { - //Flex容器组件 - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - //Text组件 - Text('Hello World') - .fontSize(60) - .fontWeight(500) - //Button组件 - Button('Next') - .fontSize(40) - .fontWeight(500) - .width(280) - .height(60) - //点击Button实现页面跳转 - .onClick(() => { router.push({ uri: 'pages/details' }) }) - } - //容器整体宽高 - .width('100%') - .height('100%') - } - } - ``` - -2. 再次使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: - - ![zh-cn_image_0000001169221404](figures/zh-cn_image_0000001169221404.png) - -恭喜你,至此已成功完成快速入门-使用eTS语言开发。 diff --git a/zh-cn/application-dev/quick-start/start-with-js.md b/zh-cn/application-dev/quick-start/start-with-js.md deleted file mode 100644 index e7661253f74..00000000000 --- a/zh-cn/application-dev/quick-start/start-with-js.md +++ /dev/null @@ -1,105 +0,0 @@ -# 使用JS语言开发(传统代码方式) - -为确保运行效果,本文以使用**DevEco Studio 3.0 Beta2**版本为例,点击[此处](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta)获取下载链接。 - -## 编写第一个页面 - -1. 第一个页面内有一个文本和一个按钮,通过text和button组件来实现。 - 在"Project"窗口,选择entry > src > main > js > default > pages > index,打开index.hml文件,添加一个文本和一个按钮,示例代码如下: - ``` - -

- ``` - -2. 打开index.css文件,设置文本和按钮的样式,示例代码如下: - ``` - /* index.css */ - .container { - flex-direction: column; /* 设置容器内的项目纵向排列 */ - justify-content: center; /* 设置项目位于容器主轴的中心 */ - align-items: center; /* 项目在交叉轴居中 */ - width:100%; - height:100%; - } - /* 对class="text"的组件设置样式 */ - .text{ - font-size: 42px; - } - /* 对class="button"的组件设置样式 */ - .button { - width: 240px; - height: 60px; - background-color: #007dff; - font-size: 30px; - text-color: white; - margin-top: 20px; - } - ``` - -3. 使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: - - ![zh-cn_image_0000001167690688](figures/zh-cn_image_0000001167690688.png) - - -## 创建另一个页面 - -1. 在"Project"窗口,打开entry > src > main > js > default,右键点击pages文件夹,选择NewJS Page,命名为details,单击回车键。 - 创建完成后,可以看到pages文件夹下的文件目录结构如下: - - ![zh-cn_image_0000001167850660](figures/zh-cn_image_0000001167850660.png) - -2. 打开details.hml文件,添加一个文本,示例代码如下: - ``` - -
- - Hi there - -
- ``` - -3. 打开details.css文件,设置文本的样式,示例代码如下: - ``` - /* details.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width:100%; - height:100%; - } - .text { - font-size: 42px; - text-align: center; - } - ``` - - -## 实现页面跳转 - -1. 打开第一个页面的index.js文件,导入router模块,页面路由router根据页面的uri来找到目标页面,从而实现跳转。示例代码如下: - ``` - // index.js - import router from '@system.router'; - - export default { - launch() { - router.push ({ - uri:'pages/details/details', // 指定要跳转的页面 - }) - } - } - ``` - -2. 再次使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: - - ![zh-cn_image_0000001213130527](figures/zh-cn_image_0000001213130527.png) - -恭喜你,至此已成功完成快速入门-使用JS语言开发。 diff --git a/zh-cn/application-dev/quick-start/start.md b/zh-cn/application-dev/quick-start/start.md deleted file mode 100644 index 6123c361289..00000000000 --- a/zh-cn/application-dev/quick-start/start.md +++ /dev/null @@ -1,8 +0,0 @@ -# 快速入门 - - -- **[开发准备](start-overview.md)** - -- **[使用JS语言开发](start-with-js.md)** - -- **[使用eTS语言开发](start-with-ets.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/security/hapsigntool-guidelines.md b/zh-cn/application-dev/security/hapsigntool-guidelines.md index 4fe2c34d3df..6063e42503a 100644 --- a/zh-cn/application-dev/security/hapsigntool-guidelines.md +++ b/zh-cn/application-dev/security/hapsigntool-guidelines.md @@ -20,7 +20,7 @@ Hap包签名工具支持本地签名需求的开发,为OpenHarmony应用提供 - 证书 OpenHarmony采用RFC5280标准构建X509证书信任体系。用于应用签名的OpenHarmony证书按层级可分为:根CA证书、子CA证书、三级实体证书,其中三级实体证书分为应用签名证书和profile签名证书。应用签名证书表示应用开发者的身份,可保证系统上安装的应用来源可追溯,profile签名证书实现对profile文件的签名进行验签,保证profile文件的完整性。 - HAP包 -HAP(HarmonyOS Ability Package)是Ability的部署包,OpenHarmony应用代码围绕Ability组件展开,它是由一个或者多个Ability组成。 +HAP(OpenHarmony Ability Package)是Ability的部署包,OpenHarmony应用代码围绕Ability组件展开,它是由一个或者多个Ability组成。 - profile文件 hap包中的描述文件,该描述文件描述了已授权的证书权限和设备ID信息等信息。 ### 约束与限制 @@ -354,6 +354,7 @@ java -jar hap-sign-tool.jar sign-app -keyAlias "oh-app1-key-v1" -signAlg "SHA256 + ## 常见问题 **1.执行[生成应用签名证书](#生成应用签名证书)命令时,控制台打印结果,无文件输出** -- Gitee From 62d02119c5a6d82628dc40f9256554ba7e8a9b13 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Wed, 2 Mar 2022 14:57:37 +0800 Subject: [PATCH 058/282] update docs Signed-off-by: annie_wangli --- en/application-dev/reference/apis/js-apis-storage-statistics.md | 1 + en/application-dev/reference/apis/js-apis-volumemanager.md | 1 + 2 files changed, 2 insertions(+) diff --git a/en/application-dev/reference/apis/js-apis-storage-statistics.md b/en/application-dev/reference/apis/js-apis-storage-statistics.md index 75a68449a7e..91690344eef 100644 --- a/en/application-dev/reference/apis/js-apis-storage-statistics.md +++ b/en/application-dev/reference/apis/js-apis-storage-statistics.md @@ -1,6 +1,7 @@ # App Storage Statistics > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import diff --git a/en/application-dev/reference/apis/js-apis-volumemanager.md b/en/application-dev/reference/apis/js-apis-volumemanager.md index 71dd8f92014..736d206d573 100644 --- a/en/application-dev/reference/apis/js-apis-volumemanager.md +++ b/en/application-dev/reference/apis/js-apis-volumemanager.md @@ -1,6 +1,7 @@ # Volume Management > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import -- Gitee From a2fbeab3c5fcc64fdff33130caaa493d37c7b1c5 Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 2 Mar 2022 07:24:38 +0000 Subject: [PATCH 059/282] update zh-cn/device-dev/subsystems/subsys-utils-guide.md. Signed-off-by: Austin --- zh-cn/device-dev/subsystems/subsys-utils-guide.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zh-cn/device-dev/subsystems/subsys-utils-guide.md b/zh-cn/device-dev/subsystems/subsys-utils-guide.md index 98866eec08e..0986cbb6a11 100644 --- a/zh-cn/device-dev/subsystems/subsys-utils-guide.md +++ b/zh-cn/device-dev/subsystems/subsys-utils-guide.md @@ -177,8 +177,8 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); ``` { "app": { - "bundleName": "com.huawei.launcher", - "vendor": "huawei", + "bundleName": "com.example.launcher", + "vendor": "example", "version": { "code": 1, "name": "1.0" @@ -201,7 +201,7 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); } }, "module": { - "package": "com.huawei.launcher", + "package": "com.example.launcher", "name": ".MyHarmonyAbilityPackage", "deviceType": [ "phone", "tv","tablet", "pc","car","smartWatch","sportsWatch","smartCamera" @@ -254,7 +254,7 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); 3. 通过串口向单板发送运行KV存储native应用的命令。 ``` - ./nfs/dev_tools/bin/aa start -p com.huawei.launcher -n ServiceAbility + ./nfs/dev_tools/bin/aa start -p com.example.launcher -n ServiceAbility ``` -- Gitee From a23024bbd0ac8c2b61485fa11236a59365e95b2d Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 2 Mar 2022 07:25:35 +0000 Subject: [PATCH 060/282] update zh-cn/device-dev/subsystems/subsys-utils-faqs.md. Signed-off-by: Austin --- zh-cn/device-dev/subsystems/subsys-utils-faqs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/device-dev/subsystems/subsys-utils-faqs.md b/zh-cn/device-dev/subsystems/subsys-utils-faqs.md index c991e43c15f..c3f3e2da63e 100755 --- a/zh-cn/device-dev/subsystems/subsys-utils-faqs.md +++ b/zh-cn/device-dev/subsystems/subsys-utils-faqs.md @@ -17,6 +17,6 @@ LiteOS-A内核\(Hi3516、Hi3518平台\)直接调用KV存储提供的接口,各 显示调用KV存储的UtilsSetEnv接口,设置数据存储路径。 ``` -UtilsSetEnv("/storage/com.huawei.kv"); +UtilsSetEnv("/storage/com.example.kv"); ``` -- Gitee From ff34ef70d1b4e6d33bef092df933604c13695356 Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 2 Mar 2022 07:27:43 +0000 Subject: [PATCH 061/282] update zh-cn/device-dev/faqs/faqs-system-applications.md. Signed-off-by: Austin --- zh-cn/device-dev/faqs/faqs-system-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/device-dev/faqs/faqs-system-applications.md b/zh-cn/device-dev/faqs/faqs-system-applications.md index a78ff419666..b8f34e907fb 100644 --- a/zh-cn/device-dev/faqs/faqs-system-applications.md +++ b/zh-cn/device-dev/faqs/faqs-system-applications.md @@ -43,7 +43,7 @@ LiteOS-A内核\(Hi3516、Hi3518平台\)直接调用KV存储提供的接口,各 显示调用KV存储的UtilsSetEnv接口,设置数据存储路径。 ``` -UtilsSetEnv("/storage/com.huawei.kv"); +UtilsSetEnv("/storage/com.example.kv"); ``` ## 视觉应用常见问题
-- Gitee From 5315222ff1d315bc94b1102d466c5f3f501fb48d Mon Sep 17 00:00:00 2001 From: zengyawen Date: Wed, 2 Mar 2022 15:28:04 +0800 Subject: [PATCH 062/282] update docs Signed-off-by: zengyawen --- .../reference/apis/js-apis-webgl.md | 1161 ++++++++--------- .../reference/apis/js-apis-webgl2.md | 894 +++++++------ 2 files changed, 964 insertions(+), 1091 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-webgl.md b/en/application-dev/reference/apis/js-apis-webgl.md index 8247029ffb2..da8d99f69cf 100644 --- a/en/application-dev/reference/apis/js-apis-webgl.md +++ b/en/application-dev/reference/apis/js-apis-webgl.md @@ -1,696 +1,587 @@ -# WebGL +# webgl -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** > The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. -This module provides WebGL APIs that correspond to the OpenGL ES 2.0 feature set. For more information, see [WebGL™](https://www.khronos.org/registry/webgl/specs/latest/1.0/). - - +This module provides WebGL APIs that correspond to the OpenGL ES 2.0 feature set. For more information, see [WebGL™](https://www.khronos.org/registry/webgl/specs/latest/2.0/). ## Modules to Import + ``` -import webgl from 'ohos.webglnapi' +import webgl from '@ohos.webglnapi'; ``` -## System Capabilities +## Invoking Method -SystemCapability.Graphic.Graphic2D.WebGL +Create a **<canvas>** component in the HML file. The following is an example: + +``` +
+ + +
+``` -## Invoking Method +Obtain the **<canvas>** component instance in the JS file. The following is an example: + ``` -// Obtain the component instance. -const el = this.$refs.canvas -// Obtain the WebGL context from the component instance. +// Obtain the component instance. +const el = this.$refs.canvas1; +// Obtain the WebGL context from the component instance. const gl = el.getContext('webgl'); // Call the WebGL API. gl.clearColor(0.0, 0.0, 0.0, 1.0); -gl.flush(); ``` -## GLenum - -| Name| Type| -| -------- | -------- | -| GLenum | number | - - -## GLboolean - -| Name| Type| -| -------- | -------- | -| GLboolean | boolean | - - -## GLbitfield - -| Name| Type| -| -------- | -------- | -| GLbitfield | number | - - -## GLbyte - -| Name| Type| -| -------- | -------- | -| GLbyte | number | - - -## GLshort - -| Name| Type| -| -------- | -------- | -| GLshort | number | - - -## GLint - -| Name| Type| -| -------- | -------- | -| GLint | number | - - -## GLsizei - -| Name| Type| -| -------- | -------- | -| GLsizei | number | - - -## GLintptr - -| Name| Type| -| -------- | -------- | -| GLintptr | number | - - -## GLsizeiptr - -| Name| Type| -| -------- | -------- | -| GLsizeiptr | number | - - -## GLubyte - -| Name| Type| -| -------- | -------- | -| GLubyte | number | - - -## GLushort - -| Name| Type| -| -------- | -------- | -| GLushort | number | - +## Type -## GLuint + **Table1** Type -| Name| Type| -| -------- | -------- | -| GLuint | number | - - -## GLfloat - -| Name| Type| -| -------- | -------- | -| GLfloat | number | - - -## GLclampf - -| Name| Type| -| -------- | -------- | -| GLclampf | number | - - -## TexImageSource - -| Name| Type| -| -------- | -------- | -| TexImageSource | ImageData | - - -## Float32List - -| Name| Type| -| -------- | -------- | -| Float32List | array | - - -## Int32List - -| Name| Type| -| -------- | -------- | -| Int32List | array | - - -## WebGLPowerPreference - -| Name| Type| +| Name | Type | Description | +| -------- | -------- | -------- | +| GLenum | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLboolean | boolean | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLbitfield | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLbyte | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLshort | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLint | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLsizei | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLintptr | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLsizeiptr | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLubyte | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLushort | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLuint | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLfloat | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| GLclampf | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| TexImageSource | ImageData | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| Float32List | array | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| Int32List | array | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLPowerPreference | string | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | + + +## Interface + + **Table2** Interface + +| Name | Description | | -------- | -------- | -| WebGLPowerPreference | string | - - -## webgl.WebGLContextAttributes +| [WebGLContextAttributes](#webglcontextattributes) | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLBuffer | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLFrameBuffer | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLProgram | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLRenderbuffer | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLShader | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLTexture | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| WebGLUniformLocation | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLActiveInfo](#webglactiveinfo) | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLShaderPrecisionFormat](#webglshaderprecisionformat) | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLRenderingContextBase](#webglrenderingcontextbase) | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | +| [WebGLRenderingContextOverloads](#webglrenderingcontextoverloads) | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL | + + +## WebGLContextAttributes WebGLContextAttributes -| Name| Type| Mandatory| + | Name | Type | Mandatory | | -------- | -------- | -------- | -| alpha | boolean | No| -| depth | boolean | No| -| stencil | boolean | No| -| antialias | boolean | No| -| premultipliedAlpha | boolean | No| -| preserveDrawingBuffer | boolean | No| -| powerPreference | WebGLPowerPreference | No| -| failIfMajorPerformanceCaveat | boolean | No| -| desynchronized | boolean | No| - - -## webgl.WebGLBuffer - -WebGLBuffer - - -## webgl.WebGLFrameBuffer - -WebGLFrameBuffer - - -## webgl.WebGLProgram - -WebGLProgram - - -## webgl.WebGLRenderbuffer - -WebGLRenderbuffer - - -## webgl.WebGLShader - -WebGLShader - - -## webgl.WebGLTexture - -WebGLTexture - - -## webgl.WebGLUniformLocation - -WebGLUniformLocation +| alpha | boolean | No | +| depth | boolean | No | +| stencil | boolean | No | +| antialias | boolean | No | +| premultipliedAlpha | boolean | No | +| preserveDrawingBuffer | boolean | No | +| powerPreference | WebGLPowerPreference | No | +| failIfMajorPerformanceCaveat | boolean | No | +| desynchronized | boolean | No | -## webgl.WebGLActiveInfo +## WebGLActiveInfo WebGLActiveInfo -| Name| Type| Mandatory| + | Name | Type | Mandatory | | -------- | -------- | -------- | -| size | [GLint](#glint) | Yes| -| type | [GLenum](#glenum) | Yes| -| name | string | Yes| +| size | GLint | Yes | +| type | GLenum | Yes | +| name | string | Yes | -## webgl.WebGLShaderPrecisionFormat +## WebGLShaderPrecisionFormat WebGLShaderPrecisionFormat -| Name| Type| Mandatory| + | Name | Type | Mandatory | | -------- | -------- | -------- | -| rangeMin | [GLint](#glint) | Yes| -| rangeMax | [GLint](#glint) | Yes| -| precision | [GLint](#glint) | Yes| +| rangeMin | GLint | Yes | +| rangeMax | GLint | Yes | +| precision | GLint | Yes | -## webgl.WebGLRenderingContextBase +## WebGLRenderingContextBase WebGLRenderingContextBase ### Attributes -| Name| Type| Mandatory| + | Name | Type | Mandatory | | -------- | -------- | -------- | -| DEPTH_BUFFER_BIT | [GLenum](#glenum) | Yes| -| STENCIL_BUFFER_BIT | [GLenum](#glenum) | Yes| -| COLOR_BUFFER_BIT | [GLenum](#glenum) | Yes| -| POINTS | [GLenum](#glenum) | Yes| -| LINES | [GLenum](#glenum) | Yes| -| LINE_LOOP | [GLenum](#glenum) | Yes| -| LINE_STRIP | [GLenum](#glenum) | Yes| -| TRIANGLES | [GLenum](#glenum) | Yes| -| TRIANGLE_STRIP | [GLenum](#glenum) | Yes| -| TRIANGLE_FAN | [GLenum](#glenum) | Yes| -| ZERO | [GLenum](#glenum) | Yes| -| ONE | [GLenum](#glenum) | Yes| -| SRC_COLOR | [GLenum](#glenum) | Yes| -| ONE_MINUS_SRC_COLOR | [GLenum](#glenum) | Yes| -| SRC_ALPHA | [GLenum](#glenum) | Yes| -| ONE_MINUS_SRC_ALPHA | [GLenum](#glenum) | Yes| -| DST_ALPHA | [GLenum](#glenum) | Yes| -| ONE_MINUS_DST_ALPHA | [GLenum](#glenum) | Yes| -| DST_COLOR | [GLenum](#glenum) | Yes| -| ONE_MINUS_DST_COLOR | [GLenum](#glenum) | Yes| -| SRC_ALPHA_SATURATE | [GLenum](#glenum) | Yes| -| FUNC_ADD | [GLenum](#glenum) | Yes| -| BLEND_EQUATION | [GLenum](#glenum) | Yes| -| BLEND_EQUATION_RGB | [GLenum](#glenum) | Yes| -| BLEND_EQUATION_ALPHA | [GLenum](#glenum) | Yes| -| FUNC_SUBTRACT | [GLenum](#glenum) | Yes| -| FUNC_REVERSE_SUBTRACT | [GLenum](#glenum) | Yes| -| BLEND_DST_RGB | [GLenum](#glenum) | Yes| -| BLEND_SRC_RGB | [GLenum](#glenum) | Yes| -| BLEND_DST_ALPHA | [GLenum](#glenum) | Yes| -| BLEND_SRC_ALPHA | [GLenum](#glenum) | Yes| -| CONSTANT_COLOR | [GLenum](#glenum) | Yes| -| ONE_MINUS_CONSTANT_COLOR | [GLenum](#glenum) | Yes| -| CONSTANT_ALPHA | [GLenum](#glenum) | Yes| -| ONE_MINUS_CONSTANT_ALPHA | [GLenum](#glenum) | Yes| -| BLEND_COLOR | [GLenum](#glenum) | Yes| -| ARRAY_BUFFER | [GLenum](#glenum) | Yes| -| ELEMENT_ARRAY_BUFFER | [GLenum](#glenum) | Yes| -| ARRAY_BUFFER_BINDING | [GLenum](#glenum) | Yes| -| ELEMENT_ARRAY_BUFFER_BINDING | [GLenum](#glenum) | Yes| -| STREAM_DRAW | [GLenum](#glenum) | Yes| -| STATIC_DRAW | [GLenum](#glenum) | Yes| -| DYNAMIC_DRAW | [GLenum](#glenum) | Yes| -| BUFFER_SIZE | [GLenum](#glenum) | Yes| -| BUFFER_USAGE | [GLenum](#glenum) | Yes| -| CURRENT_VERTEX_ATTRIB | [GLenum](#glenum) | Yes| -| FRONT | [GLenum](#glenum) | Yes| -| BACK | [GLenum](#glenum) | Yes| -| FRONT_AND_BACK | [GLenum](#glenum) | Yes| -| CULL_FACE | [GLenum](#glenum) | Yes| -| BLEND | [GLenum](#glenum) | Yes| -| DITHER | [GLenum](#glenum) | Yes| -| STENCIL_TEST | [GLenum](#glenum) | Yes| -| DEPTH_TEST | [GLenum](#glenum) | Yes| -| SCISSOR_TEST | [GLenum](#glenum) | Yes| -| POLYGON_OFFSET_FILL | [GLenum](#glenum) | Yes| -| SAMPLE_ALPHA_TO_COVERAGE | [GLenum](#glenum) | Yes| -| SAMPLE_COVERAGE | [GLenum](#glenum) | Yes| -| NO_ERROR | [GLenum](#glenum) | Yes| -| INVALID_ENUM | [GLenum](#glenum) | Yes| -| INVALID_VALUE | [GLenum](#glenum) | Yes| -| INVALID_OPERATION | [GLenum](#glenum) | Yes| -| OUT_OF_MEMORY | [GLenum](#glenum) | Yes| -| CW | [GLenum](#glenum) | Yes| -| CCW | [GLenum](#glenum) | Yes| -| ALIASED_POINT_SIZE_RANGE | [GLenum](#glenum) | Yes| -| ALIASED_LINE_WIDTH_RANGE | [GLenum](#glenum) | Yes| -| CULL_FACE_MODE | [GLenum](#glenum) | Yes| -| FRONT_FACE | [GLenum](#glenum) | Yes| -| DEPTH_RANGE | [GLenum](#glenum) | Yes| -| DEPTH_WRITEMASK | [GLenum](#glenum) | Yes| -| DEPTH_CLEAR_VALUE | [GLenum](#glenum) | Yes| -| DEPTH_FUNC | [GLenum](#glenum) | Yes| -| STENCIL_CLEAR_VALUE | [GLenum](#glenum) | Yes| -| STENCIL_FUNC | [GLenum](#glenum) | Yes| -| STENCIL_FAIL | [GLenum](#glenum) | Yes| -| STENCIL_PASS_DEPTH_FAIL | [GLenum](#glenum) | Yes| -| STENCIL_PASS_DEPTH_PASS | [GLenum](#glenum) | Yes| -| STENCIL_REF | [GLenum](#glenum) | Yes| -| STENCIL_VALUE_MASK | [GLenum](#glenum) | Yes| -| STENCIL_WRITEMASK | [GLenum](#glenum) | Yes| -| STENCIL_BACK_FUNC | [GLenum](#glenum) | Yes| -| STENCIL_BACK_FAIL | [GLenum](#glenum) | Yes| -| STENCIL_BACK_PASS_DEPTH_FAIL | [GLenum](#glenum) | Yes| -| STENCIL_BACK_PASS_DEPTH_PASS | [GLenum](#glenum) | Yes| -| STENCIL_BACK_REF | [GLenum](#glenum) | Yes| -| STENCIL_BACK_VALUE_MASK | [GLenum](#glenum) | Yes| -| STENCIL_BACK_WRITEMASK | [GLenum](#glenum) | Yes| -| VIEWPORT | [GLenum](#glenum) | Yes| -| SCISSOR_BOX | [GLenum](#glenum) | Yes| -| COLOR_CLEAR_VALUE | [GLenum](#glenum) | Yes| -| COLOR_WRITEMASK | [GLenum](#glenum) | Yes| -| UNPACK_ALIGNMENT | [GLenum](#glenum) | Yes| -| PACK_ALIGNMENT | [GLenum](#glenum) | Yes| -| MAX_TEXTURE_SIZE | [GLenum](#glenum) | Yes| -| MAX_VIEWPORT_DIMS | [GLenum](#glenum) | Yes| -| SUBPIXEL_BITS | [GLenum](#glenum) | Yes| -| RED_BITS | [GLenum](#glenum) | Yes| -| GREEN_BITS | [GLenum](#glenum) | Yes| -| BLUE_BITS | [GLenum](#glenum) | Yes| -| ALPHA_BITS | [GLenum](#glenum) | Yes| -| DEPTH_BITS | [GLenum](#glenum) | Yes| -| STENCIL_BITS | [GLenum](#glenum) | Yes| -| POLYGON_OFFSET_UNITS | [GLenum](#glenum) | Yes| -| POLYGON_OFFSET_FACTOR | [GLenum](#glenum) | Yes| -| TEXTURE_BINDING_2D | [GLenum](#glenum) | Yes| -| SAMPLE_BUFFERS | [GLenum](#glenum) | Yes| -| SAMPLES | [GLenum](#glenum) | Yes| -| SAMPLE_COVERAGE_VALUE | [GLenum](#glenum) | Yes| -| SAMPLE_COVERAGE_INVERT | [GLenum](#glenum) | Yes| -| COMPRESSED_TEXTURE_FORMATS | [GLenum](#glenum) | Yes| -| DONT_CARE | [GLenum](#glenum) | Yes| -| FASTEST | [GLenum](#glenum) | Yes| -| NICEST | [GLenum](#glenum) | Yes| -| GENERATE_MIPMAP_HINT | [GLenum](#glenum) | Yes| -| BYTE | [GLenum](#glenum) | Yes| -| UNSIGNED_BYTE | [GLenum](#glenum) | Yes| -| SHORT | [GLenum](#glenum) | Yes| -| UNSIGNED_SHORT | [GLenum](#glenum) | Yes| -| INT | [GLenum](#glenum) | Yes| -| UNSIGNED_INT | [GLenum](#glenum) | Yes| -| FLOAT | [GLenum](#glenum) | Yes| -| DEPTH_COMPONENT | [GLenum](#glenum) | Yes| -| ALPHA | [GLenum](#glenum) | Yes| -| RGB | [GLenum](#glenum) | Yes| -| RGBA | [GLenum](#glenum) | Yes| -| LUMINANCE | [GLenum](#glenum) | Yes| -| LUMINANCE_ALPHA | [GLenum](#glenum) | Yes| -| UNSIGNED_SHORT_4_4_4_4 | [GLenum](#glenum) | Yes| -| UNSIGNED_SHORT_5_5_5_1 | [GLenum](#glenum) | Yes| -| UNSIGNED_SHORT_5_6_5 | [GLenum](#glenum) | Yes| -| FRAGMENT_SHADER | [GLenum](#glenum) | Yes| -| VERTEX_SHADER | [GLenum](#glenum) | Yes| -| MAX_VERTEX_ATTRIBS | [GLenum](#glenum) | Yes| -| MAX_VERTEX_UNIFORM_VECTORS | [GLenum](#glenum) | Yes| -| MAX_VARYING_VECTORS | [GLenum](#glenum) | Yes| -| MAX_COMBINED_TEXTURE_IMAGE_UNITS | [GLenum](#glenum) | Yes| -| MAX_VERTEX_TEXTURE_IMAGE_UNITS | [GLenum](#glenum) | Yes| -| MAX_TEXTURE_IMAGE_UNITS | [GLenum](#glenum) | Yes| -| MAX_FRAGMENT_UNIFORM_VECTORS | [GLenum](#glenum) | Yes| -| SHADER_TYPE | [GLenum](#glenum) | Yes| -| DELETE_STATUS | [GLenum](#glenum) | Yes| -| LINK_STATUS | [GLenum](#glenum) | Yes| -| VALIDATE_STATUS | [GLenum](#glenum) | Yes| -| ATTACHED_SHADERS | [GLenum](#glenum) | Yes| -| ACTIVE_UNIFORMS | [GLenum](#glenum) | Yes| -| ACTIVE_ATTRIBUTES | [GLenum](#glenum) | Yes| -| SHADING_LANGUAGE_VERSION | [GLenum](#glenum) | Yes| -| CURRENT_PROGRAM | [GLenum](#glenum) | Yes| -| NEVER | [GLenum](#glenum) | Yes| -| LESS | [GLenum](#glenum) | Yes| -| EQUAL | [GLenum](#glenum) | Yes| -| LEQUAL | [GLenum](#glenum) | Yes| -| GREATER | [GLenum](#glenum) | Yes| -| NOTEQUAL | [GLenum](#glenum) | Yes| -| GEQUAL | [GLenum](#glenum) | Yes| -| ALWAYS | [GLenum](#glenum) | Yes| -| KEEP | [GLenum](#glenum) | Yes| -| REPLACE | [GLenum](#glenum) | Yes| -| INCR | [GLenum](#glenum) | Yes| -| DECR | [GLenum](#glenum) | Yes| -| INVERT | [GLenum](#glenum) | Yes| -| INCR_WRAP | [GLenum](#glenum) | Yes| -| DECR_WRAP | [GLenum](#glenum) | Yes| -| VENDOR | [GLenum](#glenum) | Yes| -| RENDERER | [GLenum](#glenum) | Yes| -| VERSION | [GLenum](#glenum) | Yes| -| NEAREST | [GLenum](#glenum) | Yes| -| LINEAR | [GLenum](#glenum) | Yes| -| NEAREST_MIPMAP_NEAREST | [GLenum](#glenum) | Yes| -| LINEAR_MIPMAP_NEAREST | [GLenum](#glenum) | Yes| -| NEAREST_MIPMAP_LINEAR | [GLenum](#glenum) | Yes| -| LINEAR_MIPMAP_LINEAR | [GLenum](#glenum) | Yes| -| TEXTURE_MAG_FILTER | [GLenum](#glenum) | Yes| -| TEXTURE_MIN_FILTER | [GLenum](#glenum) | Yes| -| TEXTURE_WRAP_S | [GLenum](#glenum) | Yes| -| TEXTURE_WRAP_T | [GLenum](#glenum) | Yes| -| TEXTURE_2D | [GLenum](#glenum) | Yes| -| TEXTURE | [GLenum](#glenum) | Yes| -| TEXTURE_CUBE_MAP | [GLenum](#glenum) | Yes| -| TEXTURE_BINDING_CUBE_MAP | [GLenum](#glenum) | Yes| -| TEXTURE_CUBE_MAP_POSITIVE_X | [GLenum](#glenum) | Yes| -| TEXTURE_CUBE_MAP_NEGATIVE_X | [GLenum](#glenum) | Yes| -| TEXTURE_CUBE_MAP_POSITIVE_Y | [GLenum](#glenum) | Yes| -| TEXTURE_CUBE_MAP_NEGATIVE_Y | [GLenum](#glenum) | Yes| -| TEXTURE_CUBE_MAP_POSITIVE_Z | [GLenum](#glenum) | Yes| -| TEXTURE_CUBE_MAP_NEGATIVE_Z | [GLenum](#glenum) | Yes| -| TEXTURE0 | [GLenum](#glenum) | Yes| -| TEXTURE1 | [GLenum](#glenum) | Yes| -| TEXTURE2 | [GLenum](#glenum) | Yes| -| TEXTURE3 | [GLenum](#glenum) | Yes| -| TEXTURE4 | [GLenum](#glenum) | Yes| -| TEXTURE5 | [GLenum](#glenum) | Yes| -| TEXTURE6 | [GLenum](#glenum) | Yes| -| TEXTURE7 | [GLenum](#glenum) | Yes| -| TEXTURE8 | [GLenum](#glenum) | Yes| -| TEXTURE9 | [GLenum](#glenum) | Yes| -| TEXTURE10 | [GLenum](#glenum) | Yes| -| TEXTURE11 | [GLenum](#glenum) | Yes| -| TEXTURE12 | [GLenum](#glenum) | Yes| -| TEXTURE13 | [GLenum](#glenum) | Yes| -| TEXTURE14 | [GLenum](#glenum) | Yes| -| TEXTURE15 | [GLenum](#glenum) | Yes| -| TEXTURE16 | [GLenum](#glenum) | Yes| -| TEXTURE17 | [GLenum](#glenum) | Yes| -| TEXTURE18 | [GLenum](#glenum) | Yes| -| TEXTURE19 | [GLenum](#glenum) | Yes| -| TEXTURE20 | [GLenum](#glenum) | Yes| -| TEXTURE21 | [GLenum](#glenum) | Yes| -| TEXTURE22 | [GLenum](#glenum) | Yes| -| TEXTURE23 | [GLenum](#glenum) | Yes| -| TEXTURE24 | [GLenum](#glenum) | Yes| -| TEXTURE25 | [GLenum](#glenum) | Yes| -| TEXTURE26 | [GLenum](#glenum) | Yes| -| TEXTURE27 | [GLenum](#glenum) | Yes| -| TEXTURE28 | [GLenum](#glenum) | Yes| -| TEXTURE29 | [GLenum](#glenum) | Yes| -| TEXTURE30 | [GLenum](#glenum) | Yes| -| TEXTURE31 | [GLenum](#glenum) | Yes| -| ACTIVE_TEXTURE | [GLenum](#glenum) | Yes| -| REPEAT | [GLenum](#glenum) | Yes| -| CLAMP_TO_EDGE | [GLenum](#glenum) | Yes| -| MIRRORED_REPEAT | [GLenum](#glenum) | Yes| -| FLOAT_VEC2 | [GLenum](#glenum) | Yes| -| FLOAT_VEC3 | [GLenum](#glenum) | Yes| -| FLOAT_VEC4 | [GLenum](#glenum) | Yes| -| INT_VEC2 | [GLenum](#glenum) | Yes| -| INT_VEC3 | [GLenum](#glenum) | Yes| -| INT_VEC4 | [GLenum](#glenum) | Yes| -| BOOL | [GLenum](#glenum) | Yes| -| BOOL_VEC2 | [GLenum](#glenum) | Yes| -| BOOL_VEC3 | [GLenum](#glenum) | Yes| -| BOOL_VEC4 | [GLenum](#glenum) | Yes| -| FLOAT_MAT2 | [GLenum](#glenum) | Yes| -| FLOAT_MAT3 | [GLenum](#glenum) | Yes| -| FLOAT_MAT4 | [GLenum](#glenum) | Yes| -| SAMPLER_2D | [GLenum](#glenum) | Yes| -| SAMPLER_CUBE | [GLenum](#glenum) | Yes| -| VERTEX_ATTRIB_ARRAY_ENABLED | [GLenum](#glenum) | Yes| -| VERTEX_ATTRIB_ARRAY_SIZE | [GLenum](#glenum) | Yes| -| VERTEX_ATTRIB_ARRAY_STRIDE | [GLenum](#glenum) | Yes| -| VERTEX_ATTRIB_ARRAY_TYPE | [GLenum](#glenum) | Yes| -| VERTEX_ATTRIB_ARRAY_NORMALIZED | [GLenum](#glenum) | Yes| -| VERTEX_ATTRIB_ARRAY_POINTER | [GLenum](#glenum) | Yes| -| VERTEX_ATTRIB_ARRAY_BUFFER_BINDING | [GLenum](#glenum) | Yes| -| IMPLEMENTATION_COLOR_READ_TYPE | [GLenum](#glenum) | Yes| -| IMPLEMENTATION_COLOR_READ_FORMAT | [GLenum](#glenum) | Yes| -| COMPILE_STATUS | [GLenum](#glenum) | Yes| -| LOW_FLOAT | [GLenum](#glenum) | Yes| -| MEDIUM_FLOAT | [GLenum](#glenum) | Yes| -| HIGH_FLOAT | [GLenum](#glenum) | Yes| -| LOW_INT | [GLenum](#glenum) | Yes| -| MEDIUM_INT | [GLenum](#glenum) | Yes| -| HIGH_INT | [GLenum](#glenum) | Yes| -| FRAMEBUFFER | [GLenum](#glenum) | Yes| -| RENDERBUFFER | [GLenum](#glenum) | Yes| -| RGBA4 | [GLenum](#glenum) | Yes| -| RGB5_A1 | [GLenum](#glenum) | Yes| -| RGB565 | [GLenum](#glenum) | Yes| -| DEPTH_COMPONENT16 | [GLenum](#glenum) | Yes| -| STENCIL_INDEX8 | [GLenum](#glenum) | Yes| -| DEPTH_STENCIL | [GLenum](#glenum) | Yes| -| RENDERBUFFER_WIDTH | [GLenum](#glenum) | Yes| -| RENDERBUFFER_HEIGHT | [GLenum](#glenum) | Yes| -| RENDERBUFFER_INTERNAL_FORMAT | [GLenum](#glenum) | Yes| -| RENDERBUFFER_RED_SIZE | [GLenum](#glenum) | Yes| -| RENDERBUFFER_GREEN_SIZE | [GLenum](#glenum) | Yes| -| RENDERBUFFER_BLUE_SIZE | [GLenum](#glenum) | Yes| -| RENDERBUFFER_ALPHA_SIZE | [GLenum](#glenum) | Yes| -| RENDERBUFFER_DEPTH_SIZE | [GLenum](#glenum) | Yes| -| RENDERBUFFER_STENCIL_SIZE | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_OBJECT_NAME | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE | [GLenum](#glenum) | Yes| -| COLOR_ATTACHMENT0 | [GLenum](#glenum) | Yes| -| DEPTH_ATTACHMENT | [GLenum](#glenum) | Yes| -| STENCIL_ATTACHMENT | [GLenum](#glenum) | Yes| -| DEPTH_STENCIL_ATTACHMENT | [GLenum](#glenum) | Yes| -| NONE | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_COMPLETE | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_INCOMPLETE_ATTACHMENT | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_INCOMPLETE_DIMENSIONS | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_UNSUPPORTED | [GLenum](#glenum) | Yes| -| FRAMEBUFFER_BINDING | [GLenum](#glenum) | Yes| -| RENDERBUFFER_BINDING | [GLenum](#glenum) | Yes| -| MAX_RENDERBUFFER_SIZE | [GLenum](#glenum) | Yes| -| INVALID_FRAMEBUFFER_OPERATION | [GLenum](#glenum) | Yes| -| UNPACK_FLIP_Y_WEBGL | [GLenum](#glenum) | Yes| -| UNPACK_PREMULTIPLY_ALPHA_WEBGL | [GLenum](#glenum) | Yes| -| CONTEXT_LOST_WEBGL | [GLenum](#glenum) | Yes| -| UNPACK_COLORSPACE_CONVERSION_WEBGL | [GLenum](#glenum) | Yes| -| BROWSER_DEFAULT_WEBGL | [GLenum](#glenum) | Yes| -| canvas | HTMLCanvasElement \| OffscreenCanvas | Yes| -| drawingBufferWidth | [GLsizei](#glsizei) | Yes| -| drawingBufferHeight | [GLsizei](#glsizei) | Yes| +| DEPTH_BUFFER_BIT | GLenum | Yes | +| STENCIL_BUFFER_BIT | GLenum | Yes | +| COLOR_BUFFER_BIT | GLenum | Yes | +| POINTS | GLenum | Yes | +| LINES | GLenum | Yes | +| LINE_LOOP | GLenum | Yes | +| LINE_STRIP | GLenum | Yes | +| TRIANGLES | GLenum | Yes | +| TRIANGLE_STRIP | GLenum | Yes | +| TRIANGLE_FAN | GLenum | Yes | +| ZERO | GLenum | Yes | +| ONE | GLenum | Yes | +| SRC_COLOR | GLenum | Yes | +| ONE_MINUS_SRC_COLOR | GLenum | Yes | +| SRC_ALPHA | GLenum | Yes | +| ONE_MINUS_SRC_ALPHA | GLenum | Yes | +| DST_ALPHA | GLenum | Yes | +| ONE_MINUS_DST_ALPHA | GLenum | Yes | +| DST_COLOR | GLenum | Yes | +| ONE_MINUS_DST_COLOR | GLenum | Yes | +| SRC_ALPHA_SATURATE | GLenum | Yes | +| FUNC_ADD | GLenum | Yes | +| BLEND_EQUATION | GLenum | Yes | +| BLEND_EQUATION_RGB | GLenum | Yes | +| BLEND_EQUATION_ALPHA | GLenum | Yes | +| FUNC_SUBTRACT | GLenum | Yes | +| FUNC_REVERSE_SUBTRACT | GLenum | Yes | +| BLEND_DST_RGB | GLenum | Yes | +| BLEND_SRC_RGB | GLenum | Yes | +| BLEND_DST_ALPHA | GLenum | Yes | +| BLEND_SRC_ALPHA | GLenum | Yes | +| CONSTANT_COLOR | GLenum | Yes | +| ONE_MINUS_CONSTANT_COLOR | GLenum | Yes | +| CONSTANT_ALPHA | GLenum | Yes | +| ONE_MINUS_CONSTANT_ALPHA | GLenum | Yes | +| BLEND_COLOR | GLenum | Yes | +| ARRAY_BUFFER | GLenum | Yes | +| ELEMENT_ARRAY_BUFFER | GLenum | Yes | +| ARRAY_BUFFER_BINDING | GLenum | Yes | +| ELEMENT_ARRAY_BUFFER_BINDING | GLenum | Yes | +| STREAM_DRAW | GLenum | Yes | +| STATIC_DRAW | GLenum | Yes | +| DYNAMIC_DRAW | GLenum | Yes | +| BUFFER_SIZE | GLenum | Yes | +| BUFFER_USAGE | GLenum | Yes | +| CURRENT_VERTEX_ATTRIB | GLenum | Yes | +| FRONT | GLenum | Yes | +| BACK | GLenum | Yes | +| FRONT_AND_BACK | GLenum | Yes | +| CULL_FACE | GLenum | Yes | +| BLEND | GLenum | Yes | +| DITHER | GLenum | Yes | +| STENCIL_TEST | GLenum | Yes | +| DEPTH_TEST | GLenum | Yes | +| SCISSOR_TEST | GLenum | Yes | +| POLYGON_OFFSET_FILL | GLenum | Yes | +| SAMPLE_ALPHA_TO_COVERAGE | GLenum | Yes | +| SAMPLE_COVERAGE | GLenum | Yes | +| NO_ERROR | GLenum | Yes | +| INVALID_ENUM | GLenum | Yes | +| INVALID_VALUE | GLenum | Yes | +| INVALID_OPERATION | GLenum | Yes | +| OUT_OF_MEMORY | GLenum | Yes | +| CW | GLenum | Yes | +| CCW | GLenum | Yes | +| LINE_WIDTH | GLenum | Yes | +| ALIASED_POINT_SIZE_RANGE | GLenum | Yes | +| ALIASED_LINE_WIDTH_RANGE | GLenum | Yes | +| CULL_FACE_MODE | GLenum | Yes | +| FRONT_FACE | GLenum | Yes | +| DEPTH_RANGE | GLenum | Yes | +| DEPTH_WRITEMASK | GLenum | Yes | +| DEPTH_CLEAR_VALUE | GLenum | Yes | +| DEPTH_FUNC | GLenum | Yes | +| STENCIL_CLEAR_VALUE | GLenum | Yes | +| STENCIL_FUNC | GLenum | Yes | +| STENCIL_FAIL | GLenum | Yes | +| STENCIL_PASS_DEPTH_FAIL | GLenum | Yes | +| STENCIL_PASS_DEPTH_PASS | GLenum | Yes | +| STENCIL_REF | GLenum | Yes | +| STENCIL_VALUE_MASK | GLenum | Yes | +| STENCIL_WRITEMASK | GLenum | Yes | +| STENCIL_BACK_FUNC | GLenum | Yes | +| STENCIL_BACK_FAIL | GLenum | Yes | +| STENCIL_BACK_PASS_DEPTH_FAIL | GLenum | Yes | +| STENCIL_BACK_PASS_DEPTH_PASS | GLenum | Yes | +| STENCIL_BACK_REF | GLenum | Yes | +| STENCIL_BACK_VALUE_MASK | GLenum | Yes | +| STENCIL_BACK_WRITEMASK | GLenum | Yes | +| VIEWPORT | GLenum | Yes | +| SCISSOR_BOX | GLenum | Yes | +| COLOR_CLEAR_VALUE | GLenum | Yes | +| COLOR_WRITEMASK | GLenum | Yes | +| UNPACK_ALIGNMENT | GLenum | Yes | +| PACK_ALIGNMENT | GLenum | Yes | +| MAX_TEXTURE_SIZE | GLenum | Yes | +| MAX_VIEWPORT_DIMS | GLenum | Yes | +| SUBPIXEL_BITS | GLenum | Yes | +| RED_BITS | GLenum | Yes | +| GREEN_BITS | GLenum | Yes | +| BLUE_BITS | GLenum | Yes | +| ALPHA_BITS | GLenum | Yes | +| DEPTH_BITS | GLenum | Yes | +| STENCIL_BITS | GLenum | Yes | +| POLYGON_OFFSET_UNITS | GLenum | Yes | +| POLYGON_OFFSET_FACTOR | GLenum | Yes | +| TEXTURE_BINDING_2D | GLenum | Yes | +| SAMPLE_BUFFERS | GLenum | Yes | +| SAMPLES | GLenum | Yes | +| SAMPLE_COVERAGE_VALUE | GLenum | Yes | +| SAMPLE_COVERAGE_INVERT | GLenum | Yes | +| COMPRESSED_TEXTURE_FORMATS | GLenum | Yes | +| DONT_CARE | GLenum | Yes | +| FASTEST | GLenum | Yes | +| NICEST | GLenum | Yes | +| GENERATE_MIPMAP_HINT | GLenum | Yes | +| BYTE | GLenum | Yes | +| UNSIGNED_BYTE | GLenum | Yes | +| SHORT | GLenum | Yes | +| UNSIGNED_SHORT | GLenum | Yes | +| INT | GLenum | Yes | +| UNSIGNED_INT | GLenum | Yes | +| FLOAT | GLenum | Yes | +| DEPTH_COMPONENT | GLenum | Yes | +| ALPHA | GLenum | Yes | +| RGB | GLenum | Yes | +| RGBA | GLenum | Yes | +| LUMINANCE | GLenum | Yes | +| LUMINANCE_ALPHA | GLenum | Yes | +| UNSIGNED_SHORT_4_4_4_4 | GLenum | Yes | +| UNSIGNED_SHORT_5_5_5_1 | GLenum | Yes | +| UNSIGNED_SHORT_5_6_5 | GLenum | Yes | +| FRAGMENT_SHADER | GLenum | Yes | +| VERTEX_SHADER | GLenum | Yes | +| MAX_VERTEX_ATTRIBS | GLenum | Yes | +| MAX_VERTEX_UNIFORM_VECTORS | GLenum | Yes | +| MAX_VARYING_VECTORS | GLenum | Yes | +| MAX_COMBINED_TEXTURE_IMAGE_UNITS | GLenum | Yes | +| MAX_VERTEX_TEXTURE_IMAGE_UNITS | GLenum | Yes | +| MAX_TEXTURE_IMAGE_UNITS | GLenum | Yes | +| MAX_FRAGMENT_UNIFORM_VECTORS | GLenum | Yes | +| SHADER_TYPE | GLenum | Yes | +| DELETE_STATUS | GLenum | Yes | +| LINK_STATUS | GLenum | Yes | +| VALIDATE_STATUS | GLenum | Yes | +| ATTACHED_SHADERS | GLenum | Yes | +| ACTIVE_UNIFORMS | GLenum | Yes | +| ACTIVE_ATTRIBUTES | GLenum | Yes | +| SHADING_LANGUAGE_VERSION | GLenum | Yes | +| CURRENT_PROGRAM | GLenum | Yes | +| NEVER | GLenum | Yes | +| LESS | GLenum | Yes | +| EQUAL | GLenum | Yes | +| LEQUAL | GLenum | Yes | +| GREATER | GLenum | Yes | +| NOTEQUAL | GLenum | Yes | +| GEQUAL | GLenum | Yes | +| ALWAYS | GLenum | Yes | +| KEEP | GLenum | Yes | +| REPLACE | GLenum | Yes | +| INCR | GLenum | Yes | +| DECR | GLenum | Yes | +| INVERT | GLenum | Yes | +| INCR_WRAP | GLenum | Yes | +| DECR_WRAP | GLenum | Yes | +| VENDOR | GLenum | Yes | +| RENDERER | GLenum | Yes | +| VERSION | GLenum | Yes | +| NEAREST | GLenum | Yes | +| LINEAR | GLenum | Yes | +| NEAREST_MIPMAP_NEAREST | GLenum | Yes | +| LINEAR_MIPMAP_NEAREST | GLenum | Yes | +| NEAREST_MIPMAP_LINEAR | GLenum | Yes | +| LINEAR_MIPMAP_LINEAR | GLenum | Yes | +| TEXTURE_MIN_FILTER | GLenum | Yes | +| TEXTURE_WRAP_S | GLenum | Yes | +| TEXTURE_WRAP_T | GLenum | Yes | +| TEXTURE_2D | GLenum | Yes | +| TEXTURE | GLenum | Yes | +| TEXTURE_CUBE_MAP | GLenum | Yes | +| TEXTURE_BINDING_CUBE_MAP | GLenum | Yes | +| TEXTURE_CUBE_MAP_POSITIVE_X | GLenum | Yes | +| TEXTURE_CUBE_MAP_NEGATIVE_X | GLenum | Yes | +| TEXTURE_CUBE_MAP_POSITIVE_Y | GLenum | Yes | +| TEXTURE_CUBE_MAP_NEGATIVE_Y | GLenum | Yes | +| TEXTURE_CUBE_MAP_POSITIVE_Z | GLenum | Yes | +| TEXTURE_CUBE_MAP_NEGATIVE_Z | GLenum | Yes | +| MAX_CUBE_MAP_TEXTURE_SIZE | GLenum | Yes | +| TEXTURE0 | GLenum | Yes | +| TEXTURE1 | GLenum | Yes | +| TEXTURE2 | GLenum | Yes | +| TEXTURE3 | GLenum | Yes | +| TEXTURE4 | GLenum | Yes | +| TEXTURE5 | GLenum | Yes | +| TEXTURE6 | GLenum | Yes | +| TEXTURE7 | GLenum | Yes | +| TEXTURE8 | GLenum | Yes | +| TEXTURE9 | GLenum | Yes | +| TEXTURE10 | GLenum | Yes | +| TEXTURE11 | GLenum | Yes | +| TEXTURE12 | GLenum | Yes | +| TEXTURE13 | GLenum | Yes | +| TEXTURE14 | GLenum | Yes | +| TEXTURE15 | GLenum | Yes | +| TEXTURE16 | GLenum | Yes | +| TEXTURE17 | GLenum | Yes | +| TEXTURE18 | GLenum | Yes | +| TEXTURE19 | GLenum | Yes | +| TEXTURE20 | GLenum | Yes | +| TEXTURE21 | GLenum | Yes | +| TEXTURE22 | GLenum | Yes | +| TEXTURE23 | GLenum | Yes | +| TEXTURE24 | GLenum | Yes | +| TEXTURE25 | GLenum | Yes | +| TEXTURE26 | GLenum | Yes | +| TEXTURE27 | GLenum | Yes | +| TEXTURE28 | GLenum | Yes | +| TEXTURE29 | GLenum | Yes | +| TEXTURE30 | GLenum | Yes | +| TEXTURE31 | GLenum | Yes | +| ACTIVE_TEXTURE | GLenum | Yes | +| REPEAT | GLenum | Yes | +| CLAMP_TO_EDGE | GLenum | Yes | +| MIRRORED_REPEAT | GLenum | Yes | +| FLOAT_VEC2 | GLenum | Yes | +| FLOAT_VEC3 | GLenum | Yes | +| FLOAT_VEC4 | GLenum | Yes | +| INT_VEC2 | GLenum | Yes | +| INT_VEC3 | GLenum | Yes | +| INT_VEC4 | GLenum | Yes | +| BOOL | GLenum | Yes | +| BOOL_VEC2 | GLenum | Yes | +| BOOL_VEC3 | GLenum | Yes | +| BOOL_VEC4 | GLenum | Yes | +| FLOAT_MAT2 | GLenum | Yes | +| FLOAT_MAT3 | GLenum | Yes | +| FLOAT_MAT4 | GLenum | Yes | +| SAMPLER_2D | GLenum | Yes | +| SAMPLER_CUBE | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_ENABLED | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_SIZE | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_STRIDE | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_TYPE | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_NORMALIZED | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_POINTER | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_BUFFER_BINDING | GLenum | Yes | +| IMPLEMENTATION_COLOR_READ_TYPE | GLenum | Yes | +| IMPLEMENTATION_COLOR_READ_FORMAT | GLenum | Yes | +| COMPILE_STATUS | GLenum | Yes | +| LOW_FLOAT | GLenum | Yes | +| MEDIUM_FLOAT | GLenum | Yes | +| HIGH_FLOAT | GLenum | Yes | +| LOW_INT | GLenum | Yes | +| MEDIUM_INT | GLenum | Yes | +| HIGH_INT | GLenum | Yes | +| FRAMEBUFFER | GLenum | Yes | +| RENDERBUFFER | GLenum | Yes | +| RGBA4 | GLenum | Yes | +| RGB5_A1 | GLenum | Yes | +| RGB565 | GLenum | Yes | +| DEPTH_COMPONENT16 | GLenum | Yes | +| STENCIL_INDEX8 | GLenum | Yes | +| DEPTH_STENCIL | GLenum | Yes | +| RENDERBUFFER_WIDTH | GLenum | Yes | +| RENDERBUFFER_HEIGHT | GLenum | Yes | +| RENDERBUFFER_INTERNAL_FORMAT | GLenum | Yes | +| RENDERBUFFER_RED_SIZE | GLenum | Yes | +| RENDERBUFFER_GREEN_SIZE | GLenum | Yes | +| RENDERBUFFER_BLUE_SIZE | GLenum | Yes | +| RENDERBUFFER_ALPHA_SIZE | GLenum | Yes | +| RENDERBUFFER_DEPTH_SIZE | GLenum | Yes | +| RENDERBUFFER_STENCIL_SIZE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE | GLenum | Yes | +| COLOR_ATTACHMENT0 | GLenum | Yes | +| DEPTH_ATTACHMENT | GLenum | Yes | +| STENCIL_ATTACHMENT | GLenum | Yes | +| DEPTH_STENCIL_ATTACHMENT | GLenum | Yes | +| NONE | GLenum | Yes | +| FRAMEBUFFER_COMPLETE | GLenum | Yes | +| FRAMEBUFFER_INCOMPLETE_ATTACHMENT | GLenum | Yes | +| FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT | GLenum | Yes | +| FRAMEBUFFER_INCOMPLETE_DIMENSIONS | GLenum | Yes | +| FRAMEBUFFER_UNSUPPORTED | GLenum | Yes | +| FRAMEBUFFER_BINDING | GLenum | Yes | +| RENDERBUFFER_BINDING | GLenum | Yes | +| MAX_RENDERBUFFER_SIZE | GLenum | Yes | +| INVALID_FRAMEBUFFER_OPERATION | GLenum | Yes | +| UNPACK_FLIP_Y_WEBGL | GLenum | Yes | +| UNPACK_PREMULTIPLY_ALPHA_WEBGL | GLenum | Yes | +| CONTEXT_LOST_WEBGL | GLenum | Yes | +| UNPACK_COLORSPACE_CONVERSION_WEBGL | GLenum | Yes | +| BROWSER_DEFAULT_WEBGL | GLenum | Yes | +| canvas | HTMLCanvasElement \| OffscreenCanvas | Yes | +| drawingBufferWidth | GLsizei | Yes | +| drawingBufferHeight | GLsizei | Yes | ### Methods -| Method| Return Value Type| + | Method | Return Value Type | | -------- | -------- | -| getContextAttributes() | WebGLContextAttributes \| null | -| isContextLost() | boolean | -| getSupportedExtensions() | string[] \| null | -| getExtension(name: string) | any | -| activeTexture(texture: GLenum) | void | -| attachShader(program: WebGLProgram, shader: WebGLShader) | void | -| bindAttribLocation(program: WebGLProgram, index: GLuint, name: string) | void | -| bindBuffer(target: GLenum, buffer: WebGLBuffer \| null) | void | -| bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer \| null) | void | -| bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | -| bindTexture(target: GLenum, texture: WebGLTexture \| null) | void | -| blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | -| blendEquation(mode: GLenum) | void | -| blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum) | void | -| blendFunc(sfactor: GLenum, dfactor: GLenum) | void | -| blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) | void | -| checkFramebufferStatus(target: GLenum) | GLenum | -| clear(mask: GLbitfield) | void | -| clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | -| clearDepth(depth: GLclampf) | void | -| clearStencil(s: GLint) | void | -| colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) | void | -| compileShader(shader: WebGLShader) | void | -| copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) | void | -| copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | -| createBuffer() | WebGLBuffer \| null | -| createFramebuffer() | WebGLFramebuffer \| null | -| createProgram() | WebGLProgram \| null | -| createRenderbuffer() | WebGLRenderbuffer \| null | -| createShader(type: GLenum) | WebGLShader \| null | -| createTexture() | WebGLTexture \| nullvoid | -| cullFace(mode: GLenum) | void | -| deleteBuffer(buffer: WebGLBuffer \| null) | void | -| deleteFramebuffer(framebuffer: WebGLFramebuffer \| null) | void | -| deleteProgram(program: WebGLProgram \| null) | void | -| deleteRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | void | -| deleteShader(shader: WebGLShader \| null) | void | -| deleteTexture(texture: WebGLTexture \| null) | void | -| depthFunc(func: GLenum) | void | -| depthMask(flag: GLboolean) | void | -| depthRange(zNear: GLclampf, zFar: GLclampf) | void | -| detachShader(program: WebGLProgram, shader: WebGLShader) | void | -| disable(cap: GLenum) | void | -| disableVertexAttribArray(index: GLuint) | void | -| drawArrays(mode: GLenum, first: GLint, count: GLsizei) | void | -| drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr) | void | -| enable(cap: GLenum) | void | -| enableVertexAttribArray(index: GLuint) | void | -| finish() | void | -| flush() | void | -| framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | -| framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture \| null, level: GLint) | void | -| frontFace(mode: GLenum) | void | -| generateMipmap(target: GLenum) | void | -| getActiveAttrib(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | -| getActiveUniform(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | -| getAttachedShaders(program: WebGLProgram) | WebGLShader[] \| null | -| getAttribLocation(program: WebGLProgram, name: string) | GLint | -| getBufferParameter(target: GLenum, pname: GLenum) | any | -| getParameter(pname: GLenum) | any | -| getError() | GLenum | -| getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum) | any | -| getProgramParameter(program: WebGLProgram, pname: GLenum) | any | -| getProgramInfoLog(program: WebGLProgram) | string \| null | -| getRenderbufferParameter(target: GLenum, pname: GLenum) | any | -| getShaderParameter(shader: WebGLShader, pname: GLenum) | any | -| getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum) | WebGLShaderPrecisionFormat \| null | -| getShaderInfoLog(shader: WebGLShader) | string \| null | -| getShaderSource(shader: WebGLShader) | string \| null | -| getTexParameter(target: GLenum, pname: GLenum) | any | -| getUniform(program: WebGLProgram, location: WebGLUniformLocation) | any | -| getUniformLocation(program: WebGLProgram, name: string) | WebGLUniformLocation \| null | -| getVertexAttrib(index: GLuint, pname: GLenum) | any | -| getVertexAttribOffset(index: GLuint, pname: GLenum) | GLintptr | -| hint(target: GLenum, mode: GLenum) | void | -| isBuffer(buffer: WebGLBuffer \| null) | GLboolean | -| isEnabled(cap: GLenum) | GLboolean | -| isFramebuffer(framebuffer: WebGLFramebuffer \| null) | GLboolean | -| isProgram(program: WebGLProgram \| null) | GLboolean | -| isRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | GLboolean | -| isShader(shader: WebGLShader \| null) | GLboolean | -| isTexture(texture: WebGLTexture \| null) | GLboolean | -| lineWidth(width: GLfloat) | void | -| linkProgram(program: WebGLProgram) | void | -| pixelStorei(pname: GLenum, param: GLint \| GLboolean) | void | -| polygonOffset(factor: GLfloat, units: GLfloat) | void | -| renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | -| sampleCoverage(value: GLclampf, invert: GLboolean) | void | -| scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | -| shaderSource(shader: WebGLShader, source: string) | void | -| stencilFunc(func: GLenum, ref: GLint, mask: GLuint) | void | -| stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint) | void | -| stencilMask(mask: GLuint) | void | -| stencilMaskSeparate(face: GLenum, mask: GLuint) | void | -| stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum) | void | -| stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum) | void | -| texParameterf(target: GLenum, pname: GLenum, param: GLfloat) | void | -| texParameteri(target: GLenum, pname: GLenum, param: GLint) | void | -| uniform1f(location: WebGLUniformLocation \| null, x: GLfloat) | void | -| uniform2f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat) | void | -| uniform3f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat) | void | -| uniform4f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | -| uniform1i(location: WebGLUniformLocation \| null, x: GLint) | void | -| uniform2i(location: WebGLUniformLocation \| null, x: GLint, y: GLint) | void | -| uniform3i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint) | void | -| uniform4i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint, w: GLint) | void | -| useProgram(program: WebGLProgram \| null) | void | -| validateProgram(program: WebGLProgram) | void | -| vertexAttrib1f(index: GLuint, x: GLfloat) | void | -| vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat) | void | -| vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) | void | -| vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | -| vertexAttrib1fv(index: GLuint, values: Float32List) | void | -| vertexAttrib2fv(index: GLuint, values: Float32List) | void | -| vertexAttrib3fv(index: GLuint, values: Float32List) | void | -| vertexAttrib4fv(index: GLuint, values: Float32List) | void | -| vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr) | void | -| viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | - - -## webgl.WebGLRenderingContextOverloads +| getContextAttributes() | WebGLContextAttributes \| null | +| isContextLost() | boolean | +| getSupportedExtensions() | string[] \| null | +| getExtension(name: string) | any | +| activeTexture(texture: GLenum) | void | +| attachShader(program: WebGLProgram, shader: WebGLShader) | void | +| bindAttribLocation(program: WebGLProgram, index: GLuint, name: string) | void | +| bindBuffer(target: GLenum, buffer: WebGLBuffer \| null) | void | +| bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer \| null) | void | +| bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | +| bindTexture(target: GLenum, texture: WebGLTexture \| null) | void | +| blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | +| blendEquation(mode: GLenum) | void | +| blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum) | void | +| blendFunc(sfactor: GLenum, dfactor: GLenum) | void | +| blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) | void | +| checkFramebufferStatus(target: GLenum) | GLenum | +| clear(mask: GLbitfield) | void | +| clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) | void | +| clearDepth(depth: GLclampf) | void | +| clearStencil(s: GLint) | void | +| colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) | void | +| compileShader(shader: WebGLShader) | void | +| copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) | void | +| copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| createBuffer() | WebGLBuffer \| null | +| createFramebuffer() | WebGLFramebuffer \| null | +| createProgram() | WebGLProgram \| null | +| createRenderbuffer() | WebGLRenderbuffer \| null | +| createShader(type: GLenum) | WebGLShader \| null | +| createTexture() | WebGLTexture \| null | +| cullFace(mode: GLenum) | void | +| deleteBuffer(buffer: WebGLBuffer \| null) | void | +| deleteFramebuffer(framebuffer: WebGLFramebuffer \| null) | void | +| deleteProgram(program: WebGLProgram \| null) | void | +| deleteRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | void | +| deleteShader(shader: WebGLShader \| null) | void | +| deleteTexture(texture: WebGLTexture \| null) | void | +| depthFunc(func: GLenum) | void | +| depthMask(flag: GLboolean) | void | +| depthRange(zNear: GLclampf, zFar: GLclampf) | void | +| detachShader(program: WebGLProgram, shader: WebGLShader) | void | +| disable(cap: GLenum) | void | +| disableVertexAttribArray(index: GLuint) | void | +| drawArrays(mode: GLenum, first: GLint, count: GLsizei) | void | +| drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr) | void | +| enable(cap: GLenum) | void | +| enableVertexAttribArray(index: GLuint) | void | +| finish() | void | +| flush() | void | +| framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer \| null) | void | +| framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture \| null, level: GLint) | void | +| frontFace(mode: GLenum) | void | +| generateMipmap(target: GLenum) | void | +| getActiveAttrib(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | +| getActiveUniform(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | +| getAttachedShaders(program: WebGLProgram) | WebGLShader[] \| null | +| getAttribLocation(program: WebGLProgram, name: string) | GLint | +| getBufferParameter(target: GLenum, pname: GLenum) | any | +| getParameter(pname: GLenum) | any | +| getError() | GLenum | +| getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum) | any | +| getProgramParameter(program: WebGLProgram, pname: GLenum) | any | +| getProgramInfoLog(program: WebGLProgram) | string \| null | +| getRenderbufferParameter(target: GLenum, pname: GLenum) | any | +| getShaderParameter(shader: WebGLShader, pname: GLenum) | any | +| getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum) | WebGLShaderPrecisionFormat \| null | +| getShaderInfoLog(shader: WebGLShader) | string \| null | +| getShaderSource(shader: WebGLShader) | string \| null | +| getTexParameter(target: GLenum, pname: GLenum) | any | +| getUniform(program: WebGLProgram, location: WebGLUniformLocation) | any | +| getUniformLocation(program: WebGLProgram, name: string) | WebGLUniformLocation \| null | +| getVertexAttrib(index: GLuint, pname: GLenum) | any | +| getVertexAttribOffset(index: GLuint, pname: GLenum) | GLintptr | +| hint(target: GLenum, mode: GLenum) | void | +| isBuffer(buffer: WebGLBuffer \| null) | GLboolean | +| isEnabled(cap: GLenum) | GLboolean | +| isFramebuffer(framebuffer: WebGLFramebuffer \| null) | GLboolean | +| isProgram(program: WebGLProgram \| null) | GLboolean | +| isRenderbuffer(renderbuffer: WebGLRenderbuffer \| null) | GLboolean | +| isShader(shader: WebGLShader \| null) | GLboolean | +| isTexture(texture: WebGLTexture \| null) | GLboolean | +| lineWidth(width: GLfloat) | void | +| linkProgram(program: WebGLProgram) | void | +| pixelStorei(pname: GLenum, param: GLint \| GLboolean) | void | +| polygonOffset(factor: GLfloat, units: GLfloat) | void | +| renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | +| sampleCoverage(value: GLclampf, invert: GLboolean) | void | +| scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| shaderSource(shader: WebGLShader, source: string) | void | +| stencilFunc(func: GLenum, ref: GLint, mask: GLuint) | void | +| stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint) | void | +| stencilMask(mask: GLuint) | void | +| stencilMaskSeparate(face: GLenum, mask: GLuint) | void | +| stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum) | void | +| stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum) | void | +| texParameterf(target: GLenum, pname: GLenum, param: GLfloat) | void | +| texParameteri(target: GLenum, pname: GLenum, param: GLint) | void | +| uniform1f(location: WebGLUniformLocation \| null, x: GLfloat) | void | +| uniform2f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat) | void | +| uniform3f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat) | void | +| uniform4f(location: WebGLUniformLocation \| null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | +| uniform1i(location: WebGLUniformLocation \| null, x: GLint) | void | +| uniform2i(location: WebGLUniformLocation \| null, x: GLint, y: GLint) | void | +| uniform3i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint) | void | +| uniform4i(location: WebGLUniformLocation \| null, x: GLint, y: GLint, z: GLint, w: GLint) | void | +| useProgram(program: WebGLProgram \| null) | void | +| validateProgram(program: WebGLProgram) | void | +| vertexAttrib1f(index: GLuint, x: GLfloat) | void | +| vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat) | void | +| vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) | void | +| vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) | void | +| vertexAttrib1fv(index: GLuint, values: Float32List) | void | +| vertexAttrib2fv(index: GLuint, values: Float32List) | void | +| vertexAttrib3fv(index: GLuint, values: Float32List) | void | +| vertexAttrib4fv(index: GLuint, values: Float32List) | void | +| vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr) | void | +| viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | + + +## WebGLRenderingContextOverloads WebGLRenderingContextOverloads -| Method| Return Value Type| + | Method | Return Value Type | | -------- | -------- | -| bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum) | void | -| bufferData(target: GLenum, data: BufferSource \| null, usage: GLenum) | void | -| bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource) | void | -| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView) | void | -| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView) | void | -| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | -| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | -| texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | -| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | -| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | -| uniform1fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform2fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform3fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform4fv(location: WebGLUniformLocation \| null, v: Float32List) | void | -| uniform1iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniform2iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniform3iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniform4iv(location: WebGLUniformLocation \| null, v: Int32List) | void | -| uniformMatrix2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | -| uniformMatrix3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | -| uniformMatrix4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | +| bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum) | void | +| bufferData(target: GLenum, data: BufferSource \| null, usage: GLenum) | void | +| bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource) | void | +| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView) | void | +| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void; | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| uniform1fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform2fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform3fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform4fv(location: WebGLUniformLocation \| null, v: Float32List) | void | +| uniform1iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniform2iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniform3iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniform4iv(location: WebGLUniformLocation \| null, v: Int32List) | void | +| uniformMatrix2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | +| uniformMatrix3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | +| uniformMatrix4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, value: Float32List) | void | diff --git a/en/application-dev/reference/apis/js-apis-webgl2.md b/en/application-dev/reference/apis/js-apis-webgl2.md index fcfa00293db..9b94a14e3db 100644 --- a/en/application-dev/reference/apis/js-apis-webgl2.md +++ b/en/application-dev/reference/apis/js-apis-webgl2.md @@ -1,6 +1,6 @@ -# WebGL2 +# webgl2 -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** > The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -10,492 +10,474 @@ This module provides WebGL APIs that correspond to the OpenGL ES 3.0 feature set ## Modules to Import + ``` -import webgl from 'ohos.webglnapi' +import webgl from '@ohos.webglnapi'; ``` -## System Capabilities +## Invoking Method -SystemCapability.Graphic.Graphic2D.WebGL2 +Create a **<canvas>** component in the HML file. The following is an example: + +``` +
+ + +
+``` -## Invoking Method +Obtain the **<canvas>** component instance in the JS file. The following is an example: + ``` -// Obtain the component instance. -const el = this.$refs.canvas -// Obtain the WebGL context from the component instance. +// Obtain the component instance. +const el = this.$refs.canvas1; +// Obtain the WebGL context from the component instance. const gl = el.getContext('webgl'); -const gl2 = el.getContext('webgl2'); // Call the WebGL API. -gl2.readBuffer(gl.COLOR_ATTACHMENT0) +gl.clearColor(0.0, 0.0, 0.0, 1.0); ``` -## GLenum - -| Name| Type| -| -------- | -------- | -| GLenum | number | - - -## Glint64 - -| Name| Type| -| -------- | -------- | -| Glint64 | number | +## Type + **Table1** Type -## Gluint64 +| Name | Type | Description | +| -------- | -------- | -------- | +| GLenum | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| GLint64 | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| GLuint64 | number | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| Uint32List | array | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | -| Name| Type| -| -------- | -------- | -| Gluint64 | number | +## Interface -## Uint32List + **Table2** Interface -| Name| Type| +| Name | Description | | -------- | -------- | -| Uint32List | array | +| [WebGL2RenderingContextBase](#webgl2renderingcontextbase) | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| [WebGL2RenderingContextOverloads](#webgl2renderingcontextoverloads) | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLQuery | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLSampler | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLSync | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLTransformFeedback | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | +| WebGLVertexArrayObject | **System capabilities**: SystemCapability.Graphic.Graphic2D.WebGL2 | -## webgl.webGL2RenderingContexBase +## WebGL2RenderingContextBase -WebGL2RenderingContexBase +WebGL2RenderingContextBase ### Attributes -| Name| Type| Mandatory| -| -------- | ------- | --------- | -| READ_BUFFER | [GLenum](#GLenum) | Yes| -| UNPACK_ROW_LENGTH | [GLenum](#GLenum) | Yes| -| UNPACK_SKIP_ROWS | [GLenum](#GLenum) | Yes| -| UNPACK_SKIP_PIXELS | [GLenum](#GLenum) | Yes| -| PACK_ROW_LENGTH | [GLenum](#GLenum) | Yes| -| PACK_SKIP_ROWS | [GLenum](#GLenum) | Yes| -| PACK_SKIP_PIXELS | [GLenum](#GLenum) | Yes| -| COLOR | [GLenum](#GLenum) | Yes| -| DEPTH | [GLenum](#GLenum) | Yes| -| STENCIL | [GLenum](#GLenum) | Yes| -| RED | [GLenum](#GLenum) | Yes| -| RGB8 | [GLenum](#GLenum) | Yes| -| RGBA8 | [GLenum](#GLenum) | Yes| -| RGB10_A2 | [GLenum](#GLenum) | Yes| -| TEXTURE_BINDING_3D | [GLenum](#GLenum) | Yes| -| UNPACK_SKIP_IMAGES | [GLenum](#GLenum) | Yes| -| UNPACK_IMAGE_HEIGHT | [GLenum](#GLenum) | Yes| -| TEXTURE_3D | [GLenum](#GLenum) | Yes| -| TEXTURE_WRAP_R | [GLenum](#GLenum) | Yes| -| MAX_3D_TEXTURE_SIZE | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_2_10_10_10_REV | [GLenum](#GLenum) | Yes| -| MAX_ELEMENTS_VERTICES | [GLenum](#GLenum) | Yes| -| MAX_ELEMENTS_INDICES | [GLenum](#GLenum) | Yes| -| TEXTURE_MIN_LOD | [GLenum](#GLenum) | Yes| -| TEXTURE_MAX_LOD | [GLenum](#GLenum) | Yes| -| TEXTURE_BASE_LEVEL | [GLenum](#GLenum) | Yes| -| TEXTURE_MAX_LEVEL | [GLenum](#GLenum) | Yes| -| MIN | [GLenum](#GLenum) | Yes| -| MAX | [GLenum](#GLenum) | Yes| -| DEPTH_COMPONENT24 | [GLenum](#GLenum) | Yes| -| MAX_TEXTURE_LOD_BIAS | [GLenum](#GLenum) | Yes| -| TEXTURE_COMPARE_MODE | [GLenum](#GLenum) | Yes| -| TEXTURE_COMPARE_FUNC | [GLenum](#GLenum) | Yes| -| CURRENT_QUERY | [GLenum](#GLenum) | Yes| -| QUERY_RESULT | [GLenum](#GLenum) | Yes| -| QUERY_RESULT_AVAILABLE | [GLenum](#GLenum) | Yes| -| STREAM_READ | [GLenum](#GLenum) | Yes| -| STREAM_COPY | [GLenum](#GLenum) | Yes| -| STATIC_READ | [GLenum](#GLenum) | Yes| -| STATIC_COPY | [GLenum](#GLenum) | Yes| -| DYNAMIC_READ | [GLenum](#GLenum) | Yes| -| DYNAMIC_COPY | [GLenum](#GLenum) | Yes| -| MAX_DRAW_BUFFERS | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER0 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER1 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER2 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER3 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER4 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER5 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER6 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER7 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER8 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER9 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER10 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER11 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER12 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER13 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER14 | [GLenum](#GLenum) | Yes| -| DRAW_BUFFER15 | [GLenum](#GLenum) | Yes| -| MAX_FRAGMENT_UNIFORM_COMPONENTS | [GLenum](#GLenum) | Yes| -| MAX_VERTEX_UNIFORM_COMPONENTS | [GLenum](#GLenum) | Yes| -| SAMPLER_3D | [GLenum](#GLenum) | Yes| -| SAMPLER_2D_SHADOW | [GLenum](#GLenum) | Yes| -| FRAGMENT_SHADER_DERIVATIVE_HINT | [GLenum](#GLenum) | Yes| -| PIXEL_PACK_BUFFER | [GLenum](#GLenum) | Yes| -| PIXEL_UNPACK_BUFFER | [GLenum](#GLenum) | Yes| -| PIXEL_PACK_BUFFER_BINDING | [GLenum](#GLenum) | Yes| -| PIXEL_UNPACK_BUFFER_BINDING | [GLenum](#GLenum) | Yes| -| FLOAT_MAT2x3 | [GLenum](#GLenum) | Yes| -| FLOAT_MAT2x4 | [GLenum](#GLenum) | Yes| -| FLOAT_MAT3x2 | [GLenum](#GLenum) | Yes| -| FLOAT_MAT3x4 | [GLenum](#GLenum) | Yes| -| FLOAT_MAT4x2 | [GLenum](#GLenum) | Yes| -| FLOAT_MAT4x3 | [GLenum](#GLenum) | Yes| -| SRGB | [GLenum](#GLenum) | Yes| -| SRGB8 | [GLenum](#GLenum) | Yes| -| SRGB8_ALPHA8 | [GLenum](#GLenum) | Yes| -| COMPARE_REF_TO_TEXTURE | [GLenum](#GLenum) | Yes| -| RGBA32F | [GLenum](#GLenum) | Yes| -| RGB32F | [GLenum](#GLenum) | Yes| -| RGBA16F | [GLenum](#GLenum) | Yes| -| RGB16F | [GLenum](#GLenum) | Yes| -| VERTEX_ATTRIB_ARRAY_INTEGER | [GLenum](#GLenum) | Yes| -| MAX_ARRAY_TEXTURE_LAYERS | [GLenum](#GLenum) | Yes| -| MIN_PROGRAM_TEXEL_OFFSET | [GLenum](#GLenum) | Yes| -| MAX_PROGRAM_TEXEL_OFFSET | [GLenum](#GLenum) | Yes| -| MAX_VARYING_COMPONENTS | [GLenum](#GLenum) | Yes| -| TEXTURE_2D_ARRAY | [GLenum](#GLenum) | Yes| -| TEXTURE_BINDING_2D_ARRAY | [GLenum](#GLenum) | Yes| -| R11F_G11F_B10F | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_10F_11F_11F_REV | [GLenum](#GLenum) | Yes| -| RGB9_E5 | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_5_9_9_9_REV | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_BUFFER_MODE | [GLenum](#GLenum) | Yes| -| MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_VARYINGS | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_BUFFER_START | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_BUFFER_SIZE | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN | [GLenum](#GLenum) | Yes| -| RASTERIZER_DISCARD | [GLenum](#GLenum) | Yes| -| MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS | [GLenum](#GLenum) | Yes| -| MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS | [GLenum](#GLenum) | Yes| -| INTERLEAVED_ATTRIBS | [GLenum](#GLenum) | Yes| -| SEPARATE_ATTRIBS | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_BUFFER | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_BUFFER_BINDING | [GLenum](#GLenum) | Yes| -| RGBA32UI | [GLenum](#GLenum) | Yes| -| RGB32UI | [GLenum](#GLenum) | Yes| -| RGBA16UI | [GLenum](#GLenum) | Yes| -| RGB16UI | [GLenum](#GLenum) | Yes| -| RGBA8UI | [GLenum](#GLenum) | Yes| -| RGB8UI | [GLenum](#GLenum) | Yes| -| RGBA32I | [GLenum](#GLenum) | Yes| -| RGB32I | [GLenum](#GLenum) | Yes| -| RGBA16I | [GLenum](#GLenum) | Yes| -| RGB16I | [GLenum](#GLenum) | Yes| -| RGBA8I | [GLenum](#GLenum) | Yes| -| RGB8I | [GLenum](#GLenum) | Yes| -| RED_INTEGER | [GLenum](#GLenum) | Yes| -| RGB_INTEGER | [GLenum](#GLenum) | Yes| -| RGBA_INTEGER | [GLenum](#GLenum) | Yes| -| SAMPLER_2D_ARRAY | [GLenum](#GLenum) | Yes| -| SAMPLER_2D_ARRAY_SHADOW | [GLenum](#GLenum) | Yes| -| SAMPLER_CUBE_SHADOW | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_VEC2 | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_VEC3 | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_VEC4 | [GLenum](#GLenum) | Yes| -| INT_SAMPLER_2D | [GLenum](#GLenum) | Yes| -| INT_SAMPLER_3D | [GLenum](#GLenum) | Yes| -| INT_SAMPLER_CUBE | [GLenum](#GLenum) | Yes| -| INT_SAMPLER_2D_ARRAY | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_SAMPLER_2D | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_SAMPLER_3D | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_SAMPLER_CUBE | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_SAMPLER_2D_ARRAY | [GLenum](#GLenum) | Yes| -| DEPTH_COMPONENT32F | [GLenum](#GLenum) | Yes| -| DEPTH32F_STENCIL8 | [GLenum](#GLenum) | Yes| -| FLOAT_32_UNSIGNED_INT_24_8_REV | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_RED_SIZE | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_GREEN_SIZE | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_BLUE_SIZE | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_DEFAULT | [GLenum](#GLenum) | Yes| -| UNSIGNED_INT_24_8 | [GLenum](#GLenum) | Yes| -| DEPTH24_STENCIL8 | [GLenum](#GLenum) | Yes| -| UNSIGNED_NORMALIZED | [GLenum](#GLenum) | Yes| -| DRAW_FRAMEBUFFER_BINDING | [GLenum](#GLenum) | Yes| -| READ_FRAMEBUFFER | [GLenum](#GLenum) | Yes| -| DRAW_FRAMEBUFFER | [GLenum](#GLenum) | Yes| -| READ_FRAMEBUFFER_BINDING | [GLenum](#GLenum) | Yes| -| RENDERBUFFER_SAMPLES | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER | [GLenum](#GLenum) | Yes| -| MAX_COLOR_ATTACHMENTS | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT1 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT2 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT3 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT4 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT5 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT6 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT7 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT8 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT9 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT10 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT11 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT12 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT13 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT14 | [GLenum](#GLenum) | Yes| -| COLOR_ATTACHMENT15 | [GLenum](#GLenum) | Yes| -| FRAMEBUFFER_INCOMPLETE_MULTISAMPLE | [GLenum](#GLenum) | Yes| -| MAX_SAMPLES | [GLenum](#GLenum) | Yes| -| HALF_FLOAT | [GLenum](#GLenum) | Yes| -| RG | [GLenum](#GLenum) | Yes| -| RG_INTEGER | [GLenum](#GLenum) | Yes| -| R8 | [GLenum](#GLenum) | Yes| -| RG8 | [GLenum](#GLenum) | Yes| -| R16F | [GLenum](#GLenum) | Yes| -| R32F | [GLenum](#GLenum) | Yes| -| RG16F | [GLenum](#GLenum) | Yes| -| RG32F | [GLenum](#GLenum) | Yes| -| R8I | [GLenum](#GLenum) | Yes| -| R8UI | [GLenum](#GLenum) | Yes| -| R16I | [GLenum](#GLenum) | Yes| -| R16UI | [GLenum](#GLenum) | Yes| -| R32I | [GLenum](#GLenum) | Yes| -| R32UI | [GLenum](#GLenum) | Yes| -| RG8I | [GLenum](#GLenum) | Yes| -| RG8UI | [GLenum](#GLenum) | Yes| -| RG16I | [GLenum](#GLenum) | Yes| -| RG16UI | [GLenum](#GLenum) | Yes| -| RG32I | [GLenum](#GLenum) | Yes| -| RG32UI | [GLenum](#GLenum) | Yes| -| VERTEX_ARRAY_BINDING | [GLenum](#GLenum) | Yes| -| R8_SNORM | [GLenum](#GLenum) | Yes| -| RG8_SNORM | [GLenum](#GLenum) | Yes| -| RGB8_SNORM | [GLenum](#GLenum) | Yes| -| SIGNED_NORMALIZED | [GLenum](#GLenum) | Yes| -| COPY_READ_BUFFER | [GLenum](#GLenum) | Yes| -| COPY_WRITE_BUFFER | [GLenum](#GLenum) | Yes| -| COPY_READ_BUFFER_BINDING | [GLenum](#GLenum) | Yes| -| COPY_WRITE_BUFFER_BINDING | [GLenum](#GLenum) | Yes| -| UNIFORM_BUFFER | [GLenum](#GLenum) | Yes| -| UNIFORM_BUFFER_BINDING | [GLenum](#GLenum) | Yes| -| UNIFORM_BUFFER_START | [GLenum](#GLenum) | Yes| -| UNIFORM_BUFFER_SIZE | [GLenum](#GLenum) | Yes| -| MAX_VERTEX_UNIFORM_BLOCKS | [GLenum](#GLenum) | Yes| -| MAX_FRAGMENT_UNIFORM_BLOCKS | [GLenum](#GLenum) | Yes| -| MAX_COMBINED_UNIFORM_BLOCKS | [GLenum](#GLenum) | Yes| -| MAX_UNIFORM_BUFFER_BINDINGS | [GLenum](#GLenum) | Yes| -| MAX_UNIFORM_BLOCK_SIZE | [GLenum](#GLenum) | Yes| -| MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS | [GLenum](#GLenum) | Yes| -| MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS | [GLenum](#GLenum) | Yes| -| UNIFORM_BUFFER_OFFSET_ALIGNMENT | [GLenum](#GLenum) | Yes| -| ACTIVE_UNIFORM_BLOCKS | [GLenum](#GLenum) | Yes| -| UNIFORM_TYPE | [GLenum](#GLenum) | Yes| -| UNIFORM_SIZE | [GLenum](#GLenum) | Yes| -| UNIFORM_BLOCK_INDEX | [GLenum](#GLenum) | Yes| -| UNIFORM_OFFSET | [GLenum](#GLenum) | Yes| -| UNIFORM_ARRAY_STRIDE | [GLenum](#GLenum) | Yes| -| UNIFORM_MATRIX_STRIDE | [GLenum](#GLenum) | Yes| -| UNIFORM_IS_ROW_MAJOR | [GLenum](#GLenum) | Yes| -| UNIFORM_BLOCK_BINDING | [GLenum](#GLenum) | Yes| -| UNIFORM_BLOCK_DATA_SIZE | [GLenum](#GLenum) | Yes| -| UNIFORM_BLOCK_ACTIVE_UNIFORMS | [GLenum](#GLenum) | Yes| -| UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES | [GLenum](#GLenum) | Yes| -| UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER | [GLenum](#GLenum) | Yes| -| UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER | [GLenum](#GLenum) | Yes| -| INVALID_INDEX | [GLenum](#GLenum) | Yes| -| MAX_VERTEX_OUTPUT_COMPONENTS | [GLenum](#GLenum) | Yes| -| MAX_FRAGMENT_INPUT_COMPONENTS | [GLenum](#GLenum) | Yes| -| MAX_SERVER_WAIT_TIMEOUT | [GLenum](#GLenum) | Yes| -| OBJECT_TYPE | [GLenum](#GLenum) | Yes| -| SYNC_CONDITION | [GLenum](#GLenum) | Yes| -| SYNC_STATUS | [GLenum](#GLenum) | Yes| -| SYNC_FLAGS | [GLenum](#GLenum) | Yes| -| SYNC_FENCE | [GLenum](#GLenum) | Yes| -| SYNC_GPU_COMMANDS_COMPLETE | [GLenum](#GLenum) | Yes| -| UNSIGNALED | [GLenum](#GLenum) | Yes| -| SIGNALED | [GLenum](#GLenum) | Yes| -| ALREADY_SIGNALED | [GLenum](#GLenum) | Yes| -| TIMEOUT_EXPIRED | [GLenum](#GLenum) | Yes| -| CONDITION_SATISFIED | [GLenum](#GLenum) | Yes| -| WAIT_FAILED | [GLenum](#GLenum) | Yes| -| SYNC_FLUSH_COMMANDS_BIT | [GLenum](#GLenum) | Yes| -| VERTEX_ATTRIB_ARRAY_DIVISOR | [GLenum](#GLenum) | Yes| -| ANY_SAMPLES_PASSED | [GLenum](#GLenum) | Yes| -| ANY_SAMPLES_PASSED_CONSERVATIVE | [GLenum](#GLenum) | Yes| -| SAMPLER_BINDING | [GLenum](#GLenum) | Yes| -| RGB10_A2UI | [GLenum](#GLenum) | Yes| -| INT_2_10_10_10_REV | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_PAUSED | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_ACTIVE | [GLenum](#GLenum) | Yes| -| TRANSFORM_FEEDBACK_BINDING | [GLenum](#GLenum) | Yes| -| TEXTURE_IMMUTABLE_FORMAT | [GLenum](#GLenum) | Yes| -| MAX_ELEMENT_INDEX | [GLenum](#GLenum) | Yes| -| TEXTURE_IMMUTABLE_LEVELS | [GLenum](#GLenum) | Yes| -| TIMEOUT_IGNORED | [GLenum](#GLenum) | Yes| -| MAX_CLIENT_WAIT_TIMEOUT_WEBGL | [GLenum](#GLenum) | Yes| + | Name | Type | Mandatory | +| -------- | -------- | -------- | +| READ_BUFFER | GLenum | Yes | +| UNPACK_ROW_LENGTH | GLenum | Yes | +| UNPACK_SKIP_ROWS | GLenum | Yes | +| UNPACK_SKIP_PIXELS | GLenum | Yes | +| PACK_ROW_LENGTH | GLenum | Yes | +| PACK_SKIP_ROWS | GLenum | Yes | +| PACK_SKIP_PIXELS | GLenum | Yes | +| COLOR | GLenum | Yes | +| DEPTH | GLenum | Yes | +| STENCIL | GLenum | Yes | +| RED | GLenum | Yes | +| RGB8 | GLenum | Yes | +| RGBA8 | GLenum | Yes | +| RGB10_A2 | GLenum | Yes | +| TEXTURE_BINDING_3D | GLenum | Yes | +| UNPACK_SKIP_IMAGES | GLenum | Yes | +| UNPACK_IMAGE_HEIGHT | GLenum | Yes | +| TEXTURE_3D | GLenum | Yes | +| TEXTURE_WRAP_R | GLenum | Yes | +| MAX_3D_TEXTURE_SIZE | GLenum | Yes | +| UNSIGNED_INT_2_10_10_10_REV | GLenum | Yes | +| MAX_ELEMENTS_VERTICES | GLenum | Yes | +| MAX_ELEMENTS_INDICES | GLenum | Yes | +| TEXTURE_MIN_LOD | GLenum | Yes | +| TEXTURE_MAX_LOD | GLenum | Yes | +| TEXTURE_BASE_LEVEL | GLenum | Yes | +| TEXTURE_MAX_LEVEL | GLenum | Yes | +| MIN | GLenum | Yes | +| MAX | GLenum | Yes | +| DEPTH_COMPONENT24 | GLenum | Yes | +| MAX_TEXTURE_LOD_BIAS | GLenum | Yes | +| TEXTURE_COMPARE_MODE | GLenum | Yes | +| TEXTURE_COMPARE_FUNC | GLenum | Yes | +| CURRENT_QUERY | GLenum | Yes | +| QUERY_RESULT | GLenum | Yes | +| QUERY_RESULT_AVAILABLE | GLenum | Yes | +| STREAM_READ | GLenum | Yes | +| STREAM_COPY | GLenum | Yes | +| STATIC_READ | GLenum | Yes | +| STATIC_COPY | GLenum | Yes | +| DYNAMIC_READ | GLenum | Yes | +| DYNAMIC_COPY | GLenum | Yes | +| MAX_DRAW_BUFFERS | GLenum | Yes | +| DRAW_BUFFER0 | GLenum | Yes | +| DRAW_BUFFER1 | GLenum | Yes | +| DRAW_BUFFER2 | GLenum | Yes | +| DRAW_BUFFER3 | GLenum | Yes | +| DRAW_BUFFER4 | GLenum | Yes | +| DRAW_BUFFER5 | GLenum | Yes | +| DRAW_BUFFER6 | GLenum | Yes | +| DRAW_BUFFER7 | GLenum | Yes | +| DRAW_BUFFER8 | GLenum | Yes | +| DRAW_BUFFER9 | GLenum | Yes | +| DRAW_BUFFER10 | GLenum | Yes | +| DRAW_BUFFER11 | GLenum | Yes | +| DRAW_BUFFER12 | GLenum | Yes | +| DRAW_BUFFER13 | GLenum | Yes | +| DRAW_BUFFER14 | GLenum | Yes | +| DRAW_BUFFER15 | GLenum | Yes | +| MAX_FRAGMENT_UNIFORM_COMPONENTS | GLenum | Yes | +| MAX_VERTEX_UNIFORM_COMPONENTS | GLenum | Yes | +| SAMPLER_3D | GLenum | Yes | +| SAMPLER_2D_SHADOW | GLenum | Yes | +| FRAGMENT_SHADER_DERIVATIVE_HINT | GLenum | Yes | +| PIXEL_PACK_BUFFER | GLenum | Yes | +| PIXEL_UNPACK_BUFFER | GLenum | Yes | +| PIXEL_PACK_BUFFER_BINDING | GLenum | Yes | +| PIXEL_UNPACK_BUFFER_BINDING | GLenum | Yes | +| FLOAT_MAT2x3 | GLenum | Yes | +| FLOAT_MAT2x4 | GLenum | Yes | +| FLOAT_MAT3x2 | GLenum | Yes | +| FLOAT_MAT3x4 | GLenum | Yes | +| FLOAT_MAT4x2 | GLenum | Yes | +| FLOAT_MAT4x3 | GLenum | Yes | +| SRGB | GLenum | Yes | +| SRGB8 | GLenum | Yes | +| SRGB8_ALPHA8 | GLenum | Yes | +| COMPARE_REF_TO_TEXTURE | GLenum | Yes | +| RGBA32F | GLenum | Yes | +| RGB32F | GLenum | Yes | +| RGBA16F | GLenum | Yes | +| RGB16F | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_INTEGER | GLenum | Yes | +| MAX_ARRAY_TEXTURE_LAYERS | GLenum | Yes | +| MIN_PROGRAM_TEXEL_OFFSET | GLenum | Yes | +| MAX_PROGRAM_TEXEL_OFFSET | GLenum | Yes | +| MAX_VARYING_COMPONENTS | GLenum | Yes | +| TEXTURE_2D_ARRAY | GLenum | Yes | +| TEXTURE_BINDING_2D_ARRAY | GLenum | Yes | +| R11F_G11F_B10F | GLenum | Yes | +| UNSIGNED_INT_10F_11F_11F_REV | GLenum | Yes | +| RGB9_E5 | GLenum | Yes | +| UNSIGNED_INT_5_9_9_9_REV | GLenum | Yes | +| TRANSFORM_FEEDBACK_BUFFER_MODE | GLenum | Yes | +| MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS | GLenum | Yes | +| TRANSFORM_FEEDBACK_VARYINGS | GLenum | Yes | +| TRANSFORM_FEEDBACK_BUFFER_START | GLenum | Yes | +| TRANSFORM_FEEDBACK_BUFFER_SIZE | GLenum | Yes | +| TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN | GLenum | Yes | +| RASTERIZER_DISCARD | GLenum | Yes | +| MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS | GLenum | Yes | +| MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS | GLenum | Yes | +| INTERLEAVED_ATTRIBS | GLenum | Yes | +| SEPARATE_ATTRIBS | GLenum | Yes | +| TRANSFORM_FEEDBACK_BUFFER | GLenum | Yes | +| TRANSFORM_FEEDBACK_BUFFER_BINDING | GLenum | Yes | +| RGBA32UI | GLenum | Yes | +| RGB32UI | GLenum | Yes | +| RGBA16UI | GLenum | Yes | +| RGB16UI | GLenum | Yes | +| RGBA8UI | GLenum | Yes | +| RGB8UI | GLenum | Yes | +| RGBA32I | GLenum | Yes | +| RGB32I | GLenum | Yes | +| RGBA16I | GLenum | Yes | +| RGB16I | GLenum | Yes | +| RGBA8I | GLenum | Yes | +| RGB8I | GLenum | Yes | +| RED_INTEGER | GLenum | Yes | +| RGB_INTEGER | GLenum | Yes | +| RGBA_INTEGER | GLenum | Yes | +| SAMPLER_2D_ARRAY | GLenum | Yes | +| SAMPLER_2D_ARRAY_SHADOW | GLenum | Yes | +| SAMPLER_CUBE_SHADOW | GLenum | Yes | +| UNSIGNED_INT_VEC2 | GLenum | Yes | +| UNSIGNED_INT_VEC3 | GLenum | Yes | +| UNSIGNED_INT_VEC4 | GLenum | Yes | +| INT_SAMPLER_2D | GLenum | Yes | +| INT_SAMPLER_3D | GLenum | Yes | +| INT_SAMPLER_CUBE | GLenum | Yes | +| INT_SAMPLER_2D_ARRAY | GLenum | Yes | +| UNSIGNED_INT_SAMPLER_2D | GLenum | Yes | +| UNSIGNED_INT_SAMPLER_3D | GLenum | Yes | +| UNSIGNED_INT_SAMPLER_CUBE | GLenum | Yes | +| UNSIGNED_INT_SAMPLER_2D_ARRAY | GLenum | Yes | +| DEPTH_COMPONENT32F | GLenum | Yes | +| DEPTH32F_STENCIL8 | GLenum | Yes | +| FLOAT_32_UNSIGNED_INT_24_8_REV | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_RED_SIZE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_GREEN_SIZE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_BLUE_SIZE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE | GLenum | Yes | +| FRAMEBUFFER_DEFAULT | GLenum | Yes | +| UNSIGNED_INT_24_8 | GLenum | Yes | +| DEPTH24_STENCIL8 | GLenum | Yes | +| UNSIGNED_NORMALIZED | GLenum | Yes | +| DRAW_FRAMEBUFFER_BINDING | GLenum | Yes | +| READ_FRAMEBUFFER | GLenum | Yes | +| DRAW_FRAMEBUFFER | GLenum | Yes | +| READ_FRAMEBUFFER_BINDING | GLenum | Yes | +| RENDERBUFFER_SAMPLES | GLenum | Yes | +| FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER | GLenum | Yes | +| MAX_COLOR_ATTACHMENTS | GLenum | Yes | +| COLOR_ATTACHMENT1 | GLenum | Yes | +| COLOR_ATTACHMENT2 | GLenum | Yes | +| COLOR_ATTACHMENT3 | GLenum | Yes | +| COLOR_ATTACHMENT4 | GLenum | Yes | +| COLOR_ATTACHMENT5 | GLenum | Yes | +| COLOR_ATTACHMENT6 | GLenum | Yes | +| COLOR_ATTACHMENT7 | GLenum | Yes | +| COLOR_ATTACHMENT8 | GLenum | Yes | +| COLOR_ATTACHMENT9 | GLenum | Yes | +| COLOR_ATTACHMENT10 | GLenum | Yes | +| COLOR_ATTACHMENT11 | GLenum | Yes | +| COLOR_ATTACHMENT12 | GLenum | Yes | +| COLOR_ATTACHMENT13 | GLenum | Yes | +| COLOR_ATTACHMENT14 | GLenum | Yes | +| COLOR_ATTACHMENT15 | GLenum | Yes | +| FRAMEBUFFER_INCOMPLETE_MULTISAMPLE | GLenum | Yes | +| MAX_SAMPLES | GLenum | Yes | +| HALF_FLOAT | GLenum | Yes | +| RG | GLenum | Yes | +| RG_INTEGER | GLenum | Yes | +| R8 | GLenum | Yes | +| RG8 | GLenum | Yes | +| R16F | GLenum | Yes | +| R32F | GLenum | Yes | +| RG16F | GLenum | Yes | +| RG32F | GLenum | Yes | +| R8I | GLenum | Yes | +| R8UI | GLenum | Yes | +| R16I | GLenum | Yes | +| R16UI | GLenum | Yes | +| R32I | GLenum | Yes | +| R32UI | GLenum | Yes | +| RG8I | GLenum | Yes | +| RG8UI | GLenum | Yes | +| RG16I | GLenum | Yes | +| RG16UI | GLenum | Yes | +| RG32I | GLenum | Yes | +| RG32UI | GLenum | Yes | +| VERTEX_ARRAY_BINDING | GLenum | Yes | +| R8_SNORM | GLenum | Yes | +| RG8_SNORM | GLenum | Yes | +| RGB8_SNORM | GLenum | Yes | +| SIGNED_NORMALIZED | GLenum | Yes | +| COPY_READ_BUFFER | GLenum | Yes | +| COPY_WRITE_BUFFER | GLenum | Yes | +| COPY_READ_BUFFER_BINDING | GLenum | Yes | +| COPY_WRITE_BUFFER_BINDING | GLenum | Yes | +| UNIFORM_BUFFER | GLenum | Yes | +| UNIFORM_BUFFER_BINDING | GLenum | Yes | +| UNIFORM_BUFFER_START | GLenum | Yes | +| UNIFORM_BUFFER_SIZE | GLenum | Yes | +| MAX_VERTEX_UNIFORM_BLOCKS | GLenum | Yes | +| MAX_FRAGMENT_UNIFORM_BLOCKS | GLenum | Yes | +| MAX_COMBINED_UNIFORM_BLOCKS | GLenum | Yes | +| MAX_UNIFORM_BUFFER_BINDINGS | GLenum | Yes | +| MAX_UNIFORM_BLOCK_SIZE | GLenum | Yes | +| MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS | GLenum | Yes | +| MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS | GLenum | Yes | +| UNIFORM_BUFFER_OFFSET_ALIGNMENT | GLenum | Yes | +| ACTIVE_UNIFORM_BLOCKS | GLenum | Yes | +| UNIFORM_TYPE | GLenum | Yes | +| UNIFORM_SIZE | GLenum | Yes | +| UNIFORM_BLOCK_INDEX | GLenum | Yes | +| UNIFORM_OFFSET | GLenum | Yes | +| UNIFORM_ARRAY_STRIDE | GLenum | Yes | +| UNIFORM_MATRIX_STRIDE | GLenum | Yes | +| UNIFORM_IS_ROW_MAJOR | GLenum | Yes | +| UNIFORM_BLOCK_BINDING | GLenum | Yes | +| UNIFORM_BLOCK_DATA_SIZE | GLenum | Yes | +| UNIFORM_BLOCK_ACTIVE_UNIFORMS | GLenum | Yes | +| UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES | GLenum | Yes | +| UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER | GLenum | Yes | +| UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER | GLenum | Yes | +| INVALID_INDEX | GLenum | Yes | +| MAX_VERTEX_OUTPUT_COMPONENTS | GLenum | Yes | +| MAX_FRAGMENT_INPUT_COMPONENTS | GLenum | Yes | +| MAX_SERVER_WAIT_TIMEOUT | GLenum | Yes | +| OBJECT_TYPE | GLenum | Yes | +| SYNC_CONDITION | GLenum | Yes | +| SYNC_STATUS | GLenum | Yes | +| SYNC_FLAGS | GLenum | Yes | +| SYNC_FENCE | GLenum | Yes | +| SYNC_GPU_COMMANDS_COMPLETE | GLenum | Yes | +| UNSIGNALED | GLenum | Yes | +| SIGNALED | GLenum | Yes | +| ALREADY_SIGNALED | GLenum | Yes | +| TIMEOUT_EXPIRED | GLenum | Yes | +| CONDITION_SATISFIED | GLenum | Yes | +| WAIT_FAILED | GLenum | Yes | +| SYNC_FLUSH_COMMANDS_BIT | GLenum | Yes | +| VERTEX_ATTRIB_ARRAY_DIVISOR | GLenum | Yes | +| ANY_SAMPLES_PASSED | GLenum | Yes | +| ANY_SAMPLES_PASSED_CONSERVATIVE | GLenum | Yes | +| SAMPLER_BINDING | GLenum | Yes | +| RGB10_A2UI | GLenum | Yes | +| INT_2_10_10_10_REV | GLenum | Yes | +| TRANSFORM_FEEDBACK | GLenum | Yes | +| TRANSFORM_FEEDBACK_PAUSED | GLenum | Yes | +| TRANSFORM_FEEDBACK_ACTIVE | GLenum | Yes | +| TRANSFORM_FEEDBACK_BINDING | GLenum | Yes | +| TEXTURE_IMMUTABLE_FORMAT | GLenum | Yes | +| MAX_ELEMENT_INDEX | GLenum | Yes | +| TEXTURE_IMMUTABLE_LEVELS | GLenum | Yes | +| TIMEOUT_IGNORED | GLint64 | Yes | +| MAX_CLIENT_WAIT_TIMEOUT_WEBGL | GLenum | Yes | ### Methods -| Method| Return Value Type| -| -------- | ---------- | -| copyBufferSubData(readTarget:  GLenum,  writeTarget:  GLenum,  readOffset:  GLintptr,  writeOffset:  GLintptr,  size:  GLsizeiptr) | void | -| getBufferSubData(target:  GLenum,  srcByteOffset:  GLintptr,  dstBuffer:  ArrayBufferView,  dstOffset?:  GLuint,  length?:  GLuint) | void | -| blitFramebuffer(srcX0:  GLint,  srcY0:  GLint,  srcX1:  GLint,  srcY1:  GLint,  dstX0:  GLint,  dstY0:  GLint,  dstX1:  GLint,  dstY1:  GLint,  mask:  GLbitfield,  filter:  GLenum) | void | -| framebufferTextureLayer(target:  GLenum,  attachment:  GLenum,  texture:  WebGLTexture \| null,  level:  GLint,  layer:  GLint) | void | -| invalidateFramebuffer(target:  GLenum,  attachments:  GLenum[]) | void | -| invalidateSubFramebuffer(target:  GLenum,  attachments:  GLenum[],  x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei) | void | -| readBuffer(src:  GLenum) | void | -| getInternalformatParameter(target:  GLenum,  internalformat:  GLenum,  pname:  GLenum) | any | -| renderbufferStorageMultisample(target:  GLenum,  samples:  GLsizei,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei) | void | -| texStorage2D(target:  GLenum,  levels:  GLsizei,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei) | void | -| texStorage3D(target:  GLenum,  levels:  GLsizei,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView \| null) | void | -| texImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView,  srcOffset:  GLuint) | void | -| texSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView \| null,  srcOffset?:  GLuint) | void | -| copyTexSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei) | void | -| compressedTexImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexImage3D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  border:  GLint,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| compressedTexSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexSubImage3D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  zoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  depth:  GLsizei,  format:  GLenum,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| getFragDataLocation(program:  WebGLProgram,  name:  string) | GLint | -| uniform1ui(location:  WebGLUniformLocation \| null,  v0:  GLuint) | void | -| uniform2ui(location:  WebGLUniformLocation \| null,  v0:  GLuint,  v1:  GLuint) | void | -| uniform3ui(location:  WebGLUniformLocation \| null,  v0:  GLuint,  v1:  GLuint,  v2:  GLuint) | void | -| uniform4ui(location:  WebGLUniformLocation \| null,  v0:  GLuint,  v1:  GLuint,  v2:  GLuint,  v3:  GLuint) | void | -| uniform1uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform2uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform3uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform4uiv(location:  WebGLUniformLocation \| null,  data:  Uint32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix3x2fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix4x2fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix2x3fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix4x3fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix2x4fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix3x4fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| vertexAttribI4i(index:  GLuint,  x:  GLint,  y:  GLint,  z:  GLint,  w:  GLint) | void | -| vertexAttribI4iv(index:  GLuint,  values:  Int32List) | void | -| vertexAttribI4ui(index:  GLuint,  x:  GLuint,  y:  GLuint,  z:  GLuint,  w:  GLuint) | void | -| vertexAttribI4uiv(index:  GLuint,  values:  Uint32List) | void | -| vertexAttribIPointer(index:  GLuint,  size:  GLint,  type:  GLenum,  stride:  GLsizei,  offset:  GLintptr) | void | -| vertexAttribDivisor(index:  GLuint,  divisor:  GLuint) | void | -| drawArraysInstanced(mode:  GLenum,  first:  GLint,  count:  GLsizei,  instanceCount:  GLsizei) | void | -| drawElementsInstanced(mode:  GLenum,  count:  GLsizei,  type:  GLenum,  offset:  GLintptr,  instanceCount:  GLsizei) | void | -| drawRangeElements(mode:  GLenum,  start:  GLuint,  end:  GLuint,  count:  GLsizei,  type:  GLenum,  offset:  GLintptr) | void | -| drawBuffers(buffers:  GLenum[]) | void | -| clearBufferfv(buffer:  GLenum,  drawbuffer:  GLint,  values:  Float32List,  srcOffset?:  GLuint) | void | -| clearBufferiv(buffer:  GLenum,  drawbuffer:  GLint,  values:  Int32List,  srcOffset?:  GLuint) | void | -| clearBufferuiv(buffer:  GLenum,  drawbuffer:  GLint,  values:  Uint32List,  srcOffset?:  GLuint) | void | -| clearBufferfi(buffer:  GLenum,  drawbuffer:  GLint,  depth:  GLfloat,  stencil:  GLint) | void | -| createQuery() | WebGLQuery \| null | -| deleteQuery(query:  WebGLQuery \| null) | void | -| isQuery(query:  WebGLQuery \| null) | GLboolean | -| beginQuery(target:  GLenum,  query:  WebGLQuery) | void | -| endQuery(target:  GLenum) | void | -| getQuery(target:  GLenum,  pname:  GLenum) | WebGLQuery \| null | -| getQueryParameter(query:  WebGLQuery,  pname:  GLenum) | any | -| createSampler() | WebGLSampler \| null | -| deleteSampler(sampler:  WebGLSampler \| null) | void | -| isSampler(sampler:  WebGLSampler \| null) | GLboolean | -| bindSampler(unit:  GLuint,  sampler:  WebGLSampler \| null) | void | -| samplerParameteri(sampler:  WebGLSampler,  pname:  GLenum,  param:  GLint) | void | -| samplerParameterf(sampler:  WebGLSampler,  pname:  GLenum,  param:  GLfloat) | void | -| getSamplerParameter(sampler:  WebGLSampler,  pname:  GLenum) | any | -| fenceSync(condition:  GLenum,  flags:  GLbitfield) | WebGLSync \| null | -| isSync(sync:  WebGLSync \| null) | GLboolean | -| deleteSync(sync:  WebGLSync \| null) | void | -| clientWaitSync(sync:  WebGLSync,  flags:  GLbitfield,  timeout:  GLuint64) | GLenum | -| waitSync(sync:  WebGLSync,  flags:  GLbitfield,  timeout:  GLint64) | void | -| getSyncParameter(sync:  WebGLSync,  pname:  GLenum) | any | -| createTransformFeedback() | WebGLTransformFeedback \| null | -| deleteTransformFeedback(tf:  WebGLTransformFeedback \| null) | void | -| isTransformFeedback(tf:  WebGLTransformFeedback \| null) | GLboolean | -| bindTransformFeedback(target:  GLenum,  tf:  WebGLTransformFeedback \| null) | void | -| beginTransformFeedback(primitiveMode:  GLenum) | void | -| endTransformFeedback() | void | -| transformFeedbackVaryings(program:  WebGLProgram,  varyings:  string[],  bufferMode:  GLenum) | void | -| getTransformFeedbackVarying(program:  WebGLProgram,  index:  GLuint) | WebGLActiveInfo \| null | -| pauseTransformFeedback() | void | -| resumeTransformFeedback() | void | -| bindBufferBase(target:  GLenum,  index:  GLuint,  buffer:  WebGLBuffer \| null) | void | -| bindBufferRange(target:  GLenum,  index:  GLuint,  buffer:  WebGLBuffer \| null,  offset:  GLintptr,  size:  GLsizeiptr) | void | -| getIndexedParameter(target:  GLenum,  index:  GLuint) | any | -| getUniformIndices(program:  WebGLProgram,  uniformNames:  string[]) | GLuint[] \| null | -| getActiveUniforms(program:  WebGLProgram,  uniformIndices:  GLuint[],  pname:  GLenum) | any | -| getUniformBlockIndex(program:  WebGLProgram,  uniformBlockName:  string) | GLuint | -| getActiveUniformBlockParameter(program:  WebGLProgram,  uniformBlockIndex:  GLuint,  pname:  GLenum) | any | -| getActiveUniformBlockName(program:  WebGLProgram,  uniformBlockIndex:  GLuint) | string \| null | -| uniformBlockBinding(program:  WebGLProgram,  uniformBlockIndex:  GLuint,  uniformBlockBinding:  GLuint) | void | -| createVertexArray() | WebGLVertexArrayObject \| null | -| deleteVertexArray(vertexArray:  WebGLVertexArrayObject \| null) | void | -| isVertexArray(vertexArray:  WebGLVertexArrayObject \| null) | GLboolean | -| bindVertexArray(array:  WebGLVertexArrayObject \| null) | void | - - -## webgl.WebGL2RenderingContextOverloads + | Method | Return Value Type | +| -------- | -------- | +| copyBufferSubData(readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) | void | +| getBufferSubData(target: GLenum, srcByteOffset: GLintptr, dstBuffer: ArrayBufferView, dstOffset?: GLuint, length?: GLuint) | void | +| blitFramebuffer(srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum) | void | +| framebufferTextureLayer(target: GLenum, attachment: GLenum, texture: WebGLTexture \| null, level: GLint, layer: GLint) | void | +| invalidateFramebuffer(target: GLenum, attachments: GLenum[]) | void | +| invalidateSubFramebuffer(target: GLenum, attachments: GLenum[], x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| readBuffer(src: GLenum) | void | +| getInternalformatParameter(target: GLenum, internalformat: GLenum, pname: GLenum) | any | +| renderbufferStorageMultisample(target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | +| texStorage2D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) | void | +| texStorage3D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView \| null) | void | +| texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint) | void | +| texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView \| null, srcOffset?: GLuint) | void | +| copyTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) | void | +| compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| getFragDataLocation(program: WebGLProgram, name: string) | GLint | +| uniform1ui(location: WebGLUniformLocation \| null, v0: GLuint) | void | +| uniform2ui(location: WebGLUniformLocation \| null, v0: GLuint, v1: GLuint) | void | +| uniform3ui(location: WebGLUniformLocation \| null, v0: GLuint, v1: GLuint, v2: GLuint) | void | +| uniform4ui(location: WebGLUniformLocation \| null, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint) | void | +| uniform1uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform2uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform3uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform4uiv(location: WebGLUniformLocation \| null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix3x2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix4x2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix2x3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix4x3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix2x4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix3x4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| vertexAttribI4i(index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint) | void | +| vertexAttribI4iv(index: GLuint, values: Int32List) | void | +| vertexAttribI4ui(index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) | void | +| vertexAttribI4uiv(index: GLuint, values: Uint32List) | void | +| vertexAttribIPointer(index: GLuint, size: GLint, type: GLenum, stride: GLsizei, offset: GLintptr) | void | +| vertexAttribDivisor(index: GLuint, divisor: GLuint) | void | +| drawArraysInstanced(mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei) | void | +| drawElementsInstanced(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, instanceCount: GLsizei) | void | +| drawRangeElements(mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, offset: GLintptr) | void | +| drawBuffers(buffers: GLenum[]) | void | +| clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Float32List, srcOffset?: GLuint) | void | +| clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Int32List, srcOffset?: GLuint) | void | +| clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Uint32List, srcOffset?: GLuint) | void | +| clearBufferfi(buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint) | void | +| createQuery() | WebGLQuery \| null | +| deleteQuery(query: WebGLQuery \| null) | void | +| isQuery(query: WebGLQuery \| null) | GLboolean | +| beginQuery(target: GLenum, query: WebGLQuery) | void | +| endQuery(target: GLenum) | void | +| getQuery(target: GLenum, pname: GLenum) | WebGLQuery \| null | +| getQueryParameter(query: WebGLQuery, pname: GLenum) | any | +| createSampler() | WebGLSampler \| null | +| deleteSampler(sampler: WebGLSampler \| null) | void | +| isSampler(sampler: WebGLSampler \| null) | GLboolean | +| bindSampler(unit: GLuint, sampler: WebGLSampler \| null) | void | +| samplerParameteri(sampler: WebGLSampler, pname: GLenum, param: GLint) | void | +| samplerParameterf(sampler: WebGLSampler, pname: GLenum, param: GLfloat) | void; | +| getSamplerParameter(sampler: WebGLSampler, pname: GLenum) | any | +| fenceSync(condition: GLenum, flags: GLbitfield) | WebGLSync \| null | +| isSync(sync: WebGLSync \| null) | GLboolean | +| deleteSync(sync: WebGLSync \| null) | void | +| clientWaitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLuint64) | GLenum | +| waitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLint64) | void | +| getSyncParameter(sync: WebGLSync, pname: GLenum) | any | +| createTransformFeedback() | WebGLTransformFeedback \| null | +| deleteTransformFeedback(tf: WebGLTransformFeedback \| null) | void | +| isTransformFeedback(tf: WebGLTransformFeedback \| null) | GLboolean | +| bindTransformFeedback(target: GLenum, tf: WebGLTransformFeedback \| null) | void | +| beginTransformFeedback(primitiveMode: GLenum) | void | +| endTransformFeedback() | void | +| transformFeedbackVaryings(program: WebGLProgram, varyings: string[], bufferMode: GLenum) | void | +| getTransformFeedbackVarying(program: WebGLProgram, index: GLuint) | WebGLActiveInfo \| null | +| pauseTransformFeedback() | void | +| resumeTransformFeedback() | void | +| bindBufferBase(target: GLenum, index: GLuint, buffer: WebGLBuffer \| null) | void | +| bindBufferRange(target: GLenum, index: GLuint, buffer: WebGLBuffer \| null, offset: GLintptr, size: GLsizeiptr) | void | +| getIndexedParameter(target: GLenum, index: GLuint) | any | +| getUniformIndices(program: WebGLProgram, uniformNames: string[]) | GLuint[] \| null | +| getActiveUniforms(program: WebGLProgram, uniformIndices: GLuint[], pname: GLenum) | any | +| getUniformBlockIndex(program: WebGLProgram, uniformBlockName: string) | GLuint | +| getActiveUniformBlockParameter(program: WebGLProgram, uniformBlockIndex: GLuint, pname: GLenum) | any | +| getActiveUniformBlockName(program: WebGLProgram, uniformBlockIndex: GLuint) | string \| null | +| uniformBlockBinding(program: WebGLProgram, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint) | void | +| createVertexArray() | WebGLVertexArrayObject \| null | +| deleteVertexArray(vertexArray: WebGLVertexArrayObject \| null) | void | +| isVertexArray(vertexArray: WebGLVertexArrayObject \| null) | GLboolean | +| bindVertexArray(array: WebGLVertexArrayObject \| null) | void | + + +## WebGL2RenderingContextOverloads WebGL2RenderingContextOverloads -| Method| Return Value Type| -| -------- | ---------- | -| bufferData(target:  GLenum,  size:  GLsizeiptr,  usage:  GLenum) | void | -| bufferData(target:  GLenum,  srcData:  BufferSource \| null,  usage:  GLenum) | void | -| bufferSubData(target:  GLenum,  dstByteOffset:  GLintptr,  srcData:  BufferSource) | void | -| bufferData(target:  GLenum,  srcData:  ArrayBufferView,  usage:  GLenum,  srcOffset:  GLuint,  length?:  GLuint) | void | -| bufferSubData(target:  GLenum,  dstByteOffset:  GLintptr,  srcData:  ArrayBufferView,  srcOffset:  GLuint,  length?:  GLuint) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  pixels:  ArrayBufferView \| null) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  pixels:  ArrayBufferView \| null) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLint,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView,  srcOffset:  GLuint) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  pboOffset:  GLintptr) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  source:  TexImageSource) | void | -| texSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  srcData:  ArrayBufferView,  srcOffset:  GLuint) | void | -| compressedTexImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexImage2D(target:  GLenum,  level:  GLint,  internalformat:  GLenum,  width:  GLsizei,  height:  GLsizei,  border:  GLint,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| compressedTexSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  imageSize:  GLsizei,  offset:  GLintptr) | void | -| compressedTexSubImage2D(target:  GLenum,  level:  GLint,  xoffset:  GLint,  yoffset:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  srcData:  ArrayBufferView,  srcOffset?:  GLuint,  srcLengthOverride?:  GLuint) | void | -| uniform1fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform2fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform3fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform4fv(location:  WebGLUniformLocation \| null,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform1iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform2iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform3iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniform4iv(location:  WebGLUniformLocation \| null,  data:  Int32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix2fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix3fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| uniformMatrix4fv(location:  WebGLUniformLocation \| null,  transpose:  GLboolean,  data:  Float32List,  srcOffset?:  GLuint,  srcLength?:  GLuint) | void | -| readPixels(x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  dstData:  ArrayBufferView \| null) | void | -| readPixels(x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  offset:  GLintptr) | void | -| readPixels(x:  GLint,  y:  GLint,  width:  GLsizei,  height:  GLsizei,  format:  GLenum,  type:  GLenum,  dstData:  ArrayBufferView,  dstOffset:  GLuint) | void | - - -## webgl.WebGLQuery - -WebGLQuery - - -## webgl.WebGLSampler - -WebGLSampler - - -## webgl.WebGLSync - -WebGLSync - - -## webgl.WebGLTransformFeedback - -WebGLTransformFeedback - - -## webgl.WebGLVertexArrayObject - -WebGLVertexArrayObject + | Method | Return Value Type | +| -------- | -------- | +| bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum) | void | +| bufferData(target: GLenum, srcData: BufferSource \| null, usage: GLenum) | void | +| bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: BufferSource) | void | +| bufferData(target: GLenum, srcData: ArrayBufferView, usage: GLenum, srcOffset: GLuint, length?: GLuint) | void | +| bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: ArrayBufferView, srcOffset: GLuint, length?: GLuint) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView \| null) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, source: TexImageSource) | void | +| texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint) | void | +| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr) | void | +| compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint) | void | +| uniform1fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform2fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform3fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform4fv(location: WebGLUniformLocation \| null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform1iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform2iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform3iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniform4iv(location: WebGLUniformLocation \| null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix2fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix3fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| uniformMatrix4fv(location: WebGLUniformLocation \| null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView \| null) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, offset: GLintptr) | void | +| readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView, dstOffset: GLuint) | void | -- Gitee From 61b3a31e24a29cc7fb91d39ee423622ca005f86d Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Wed, 2 Mar 2022 15:29:30 +0800 Subject: [PATCH 063/282] update docs Signed-off-by: annie_wangli --- .../reference/apis/js-apis-appAccount.md | 953 ++++++++++++++++-- .../apis/js-apis-distributed-account.md | 10 +- 2 files changed, 872 insertions(+), 91 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-appAccount.md b/en/application-dev/reference/apis/js-apis-appAccount.md index f8f6d6d65bc..be6cd158135 100644 --- a/en/application-dev/reference/apis/js-apis-appAccount.md +++ b/en/application-dev/reference/apis/js-apis-appAccount.md @@ -1,6 +1,7 @@ -# Application Account Management +# App Account Management -> ![icon-note.gif](figures/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> > The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -11,6 +12,11 @@ import account_appAccount from '@ohos.account.appAccount'; ``` +## System Capabilities + +SystemCapability.Account.AppAccount + + ## account_appAccount.createAppAccountManager createAppAccountManager(): AppAccountManager; @@ -29,13 +35,13 @@ Creates an **AppAccountManager** instance. ## AppAccountManager -Provides methods to manage application accounts. +Provides methods to manage app accounts. ### addAccount addAccount(name: string, callback: AsyncCallback<void>): void; -Adds an application account to the account management service. This method uses an asynchronous callback to return the result. +Adds an app account to the account management service. This method uses an asynchronous callback to return the result. Required permission: none. @@ -43,8 +49,8 @@ Required permission: none. | Name| Type| Mandatory| Description| | -------- | ------------------- | ---- | ------------------------------------------ | - | name | string | Yes| Name of the application account to add.| - | callback | AsyncCallback<void> | Yes| Callback invoked when the application account is added.| + | name | string | Yes| Name of the app account to add.| + | callback | AsyncCallback<void> | Yes| Callback invoked when the app account is added.| - Example @@ -59,7 +65,7 @@ Required permission: none. addAccount(name: string, extraInfo: string, callback: AsyncCallback<void>): void; -Adds an application account and its additional information to the account management service. This method uses an asynchronous callback to return the result. +Adds an app account and its additional information to the account management service. This method uses an asynchronous callback to return the result. Required permission: none. @@ -67,9 +73,9 @@ Required permission: none. | Name| Type| Mandatory| Description| | --------- | ------------------- | ---- | ------------------------------------------------------------ | - | name | string | Yes| Name of the application account to add.| - | extraInfo | string | Yes| Additional information (for example, token) of the application account to add. The additional information cannot contain sensitive information about the application account.| - | callback | AsyncCallback<void> | Yes| Callback invoked when the application account and its additional information are added.| + | name | string | Yes| Name of the app account to add.| + | extraInfo | string | Yes| Additional information (for example, token) of the app account to add. The additional information cannot contain sensitive information about the app account.| + | callback | AsyncCallback<void> | Yes| Callback invoked when the app account and its additional information are added.| - Example @@ -86,7 +92,7 @@ Required permission: none. addAccount(name: string, extraInfo?: string): Promise<void>; -Adds an application account and its additional information to the account management service. This method uses a promise to return the result asynchronously. +Adds an app account and its additional information to the account management service. This method uses a promise to return the result. Required permission: none. @@ -94,8 +100,8 @@ Required permission: none. | Name| Type| Mandatory| Description| | --------- | ------ | ---- | ------------------------------------------------------------ | - | name | string | Yes| Name of the application account to add.| - | extraInfo | string | Yes| Additional information of the application account to add. The additional information cannot contain sensitive information about the application account.| + | name | string | Yes| Name of the app account to add.| + | extraInfo | string | Yes| Additional information of the app account to add. The additional information cannot contain sensitive information about the app account.| - Return value @@ -114,18 +120,59 @@ Required permission: none. }); ``` +### addAccountImplicitly8+ + +addAccountImplicitly(owner: string, authType: string, options: {[key: string]: any}, callback: AuthenticatorCallback): void; + +Implicitly adds an app account based on the specified account owner, authentication type, and options. This method uses an asynchronous callback to return the result. + +Required permission: none. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | --------------------- | --- | -------------------------- | + | owner | string | Yes| Bundle name of the app account to add.| + | authType | string | Yes| Authentication type of the app account to add.| + | options | {[key: string]: any} | Yes| Options for the authentication.| + | callback | AuthenticatorCallback | Yes| Authenticator callback invoked to return the authentication result.| + +- Example + + ``` + import featureAbility from '@ohos.ability.featureAbility'; + + function onResultCallback(code, result) { + console.log("resultCode: " + code); + console.log("result: " + JSON.stringify(result)); + } + + function onRequestRedirectedCallback(request) { + let abilityStartSetting = {want: request}; + featureAbility.startAbility(abilityStartSetting, (err)=>{ + console.log("startAbility err: " + JSON.stringify(err)); + }); + } + + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.addAccountImplicitly("LiSi", "readAge", {}, { + onResult: onResultCallback, + onRequestRedirected: onRequestRedirectedCallback + }); + ``` + ### deleteAccount deleteAccount(name: string, callback: AsyncCallback<void>): void; -Deletes an application account from the account management service. This method uses an asynchronous callback to return the result. +Deletes an app account from the account management service. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | -------- | ------------------- | ---- | ---------------------------------- | - | name | string | Yes| Name of the application account to delete.| - | callback | AsyncCallback<void> | Yes| Callback invoked when the application account is deleted.| + | name | string | Yes| Name of the app account to delete.| + | callback | AsyncCallback<void> | Yes| Callback invoked when the app account is deleted.| - Example @@ -140,13 +187,13 @@ Deletes an application account from the account management service. This method deleteAccount(name: string): Promise<void>; -Deletes an application account from the account management service. This method uses a promise to return the result asynchronously. +Deletes an app account from the account management service. This method uses a promise to return the result. - Parameters | Name| Type| Mandatory| Description| | ------ | ------ | ---- | ------------------------ | - | name | string | Yes| Name of the application account to delete.| + | name | string | Yes| Name of the app account to delete.| - Return value @@ -169,15 +216,15 @@ Deletes an application account from the account management service. This method disableAppAccess(name: string, bundleName: string, callback: AsyncCallback<void>): void; -Disables the specified third-party application account from accessing the third-party application with the given bundle name. This method uses an asynchronous callback to return the result. +Disables an app account from accessing an application with the given bundle name. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | ---------- | ------------------- | ---- | ------------------------------------------------------------ | - | name | string | Yes| Name of the third-party application account.| - | bundleName | string | Yes| Bundle name of the third-party application.| - | callback | AsyncCallback<void> | Yes| Callback invoked when the third-party application account is disabled from accessing the third-party application with the given bundle name.| + | name | string | Yes| App account name.| + | bundleName | string | Yes| Bundle name of an app.| + | callback | AsyncCallback<void> | Yes| Callback invoked when the app account is disabled from accessing the application with the given bundle name.| - Example @@ -192,14 +239,14 @@ Disables the specified third-party application account from accessing the third- disableAppAccess(name: string, bundleName: string): Promise<void>; -Disables the specified third-party application account from accessing the third-party application with the given bundle name. This method uses a promise to return the result asynchronously. +Disables an app account from accessing an application with the given bundle name. This method uses a promise to return the result. - Parameters | Name| Type| Mandatory| Description| | ---------- | ------ | ---- | ---------------------------------- | - | name | string | Yes| Name of the third-party application account.| - | bundleName | string | Yes| Bundle name of a third-party application.| + | name | string | Yes| App account name.| + | bundleName | string | Yes| Bundle name of an app.| - Return value @@ -222,15 +269,15 @@ Disables the specified third-party application account from accessing the third- enableAppAccess(name: string, bundleName: string, callback: AsyncCallback<void>): void; -Enables the specified third-party application account to access the third-party application with the given bundle name. This method uses an asynchronous callback to return the result. +Enables an app account to access an application with the given bundle name. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | ---------- | ------------------- | ---- | ------------------------------------------------------------ | - | name | string | Yes| Application account name.| - | bundleName | string | Yes| Bundle name of the third-party application.| - | callback | AsyncCallback<void> | Yes| Callback invoked when the third-party application account is enabled to access the third-party application with the given bundle name.| + | name | string | Yes| App account name.| + | bundleName | string | Yes| Bundle name of an app.| + | callback | AsyncCallback<void> | Yes| Callback invoked when the app account is enabled to access the application with the given bundle name.| - Example @@ -245,14 +292,14 @@ Enables the specified third-party application account to access the third-party enableAppAccess(name: string, bundleName: string): Promise<void>; -Enables the specified third-party application account to access the third-party application with the given bundle name. This method uses a promise to return the result. +Enables an app account to access an application with the given bundle name. This method uses a promise to return the result. - Parameters | Name| Type| Mandatory| Description| | ---------- | ------ | ---- | ------------------ | - | name | string | Yes| Application account name.| - | bundleName | string | Yes| Bundle name of the third-party application.| + | name | string | Yes| App account name.| + | bundleName | string | Yes| Bundle name of an app.| - Return value @@ -274,7 +321,7 @@ Enables the specified third-party application account to access the third-party checkAppAccountSyncEnable(name: string, callback: AsyncCallback<boolean>): void; -Checks whether the specified application account allows application data synchronization. This method uses an asynchronous callback to return the result. +Checks whether an app account allows application data synchronization. This method uses an asynchronous callback to return the result. The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permission is intended for system applications only. @@ -282,8 +329,8 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis | Name| Type| Mandatory| Description| | -------- | ---------------------- | ---- | -------------------------------------------- | - | name | string | Yes| Application account name.| - | callback | AsyncCallback<boolean> | Yes| Callback invoked to specify whether the application account allows application data synchronization.| + | name | string | Yes| App account name.| + | callback | AsyncCallback<boolean> | Yes| Callback used to return whether the app account allows application data synchronization.| - Example @@ -299,7 +346,7 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis checkAppAccountSyncEnable(name: string): Promise<boolean>; -Checks whether the specified application account allows application data synchronization. This method uses a promise to return the result asynchronously. +Checks whether an app account allows application data synchronization. This method uses a promise to return the result. The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permission is intended for system applications only. @@ -307,7 +354,7 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis | Name| Type| Mandatory| Description| | ------ | ------ | ---- | -------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| - Return value @@ -330,16 +377,16 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis setAccountCredential(name: string, credentialType: string, credential: string,callback: AsyncCallback<void>): void; -Sets a credential for an application account. This method uses an asynchronous callback to return the result. +Sets a credential for an app account. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | -------------- | ------------------- | ---- | ---------------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | credentialType | string | Yes| Type of the credential to set.| | credential | string | Yes| Credential to set.| - | callback | AsyncCallback<void> | Yes| Callback invoked when a credential is set for the specified application account.| + | callback | AsyncCallback<void> | Yes| Callback invoked when a credential is set for the specified app account.| - Example @@ -354,13 +401,13 @@ Sets a credential for an application account. This method uses an asynchronous c setAccountCredential(name: string, credentialType: string, credential: string): Promise<void>; -Sets a credential for an application account. This method uses a promise to return the result asynchronously. +Sets a credential for an app account. This method uses a promise to return the result asynchronously. - Parameters | Name| Type| Mandatory| Description| | -------------- | ------ | ---- | -------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | credentialType | string | Yes| Type of the credential to set.| | credential | string | Yes| Credential to set.| @@ -385,15 +432,15 @@ Sets a credential for an application account. This method uses a promise to retu setAccountExtraInfo(name: string, extraInfo: string, callback: AsyncCallback<void>): void; -Sets additional information for an application account. This method uses an asynchronous callback to return the result. +Sets additional information for an app account. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | --------- | ------------------- | ---- | -------------------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | extraInfo | string | Yes| Additional information to set.| - | callback | AsyncCallback<void> | Yes| Callback invoked when additional information is set for the specified application account.| + | callback | AsyncCallback<void> | Yes| Callback invoked when additional information is set for the specified app account.| - Example @@ -408,13 +455,13 @@ Sets additional information for an application account. This method uses an asyn setAccountExtraInfo(name: string, extraInfo: string): Promise<void>; -Sets additional information for an application account. This method uses a promise to return the result asynchronously. +Sets additional information for an app account. This method uses a promise to return the result asynchronously. - Parameters | Name| Type| Mandatory| Description| | --------- | ------ | ---- | ------------------ | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | extraInfo | string | Yes| Additional information to set.| - Return value @@ -438,7 +485,7 @@ Sets additional information for an application account. This method uses a promi setAppAccountSyncEnable(name: string, isEnable: boolean, callback: AsyncCallback<void>): void; -Sets whether to enable application data synchronization for an application account. This method uses an asynchronous callback to return the result. +Sets whether to enable application data synchronization for an app account. This method uses an asynchronous callback to return the result. The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permission is intended for system applications only. @@ -446,9 +493,9 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis | Name| Type| Mandatory| Description| | -------- | ------------------- | ---- | -------------------------------------------------- | - | name | string | Yes| Application account name.| - | isEnable | boolean | Yes| Specifies whether to enable application data synchronization.| - | callback | AsyncCallback<void> | Yes| Callback invoked when application data synchronization is enabled or disabled for the application account.| + | name | string | Yes| App account name.| + | isEnable | boolean | Yes| Whether to enable app data synchronization.| + | callback | AsyncCallback<void> | Yes| Callback invoked when application data synchronization is enabled or disabled for the app account.| - Example @@ -463,7 +510,7 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis setAppAccountSyncEnable(name: string, isEnable: boolean): Promise<void>; -Sets whether to enable application data synchronization for an application account. This method uses a promise to return the result asynchronously. +Sets whether to enable application data synchronization for an app account. This method uses a promise to return the result asynchronously. The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permission is intended for system applications only. @@ -471,8 +518,8 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis | Name| Type| Mandatory| Description| | -------- | ------- | ---- | ---------------------- | - | name | string | Yes| Application account name.| - | isEnable | boolean | Yes| Specifies whether to enable application data synchronization.| + | name | string | Yes| App account name.| + | isEnable | boolean | Yes| Whether to enable app data synchronization.| - Return value @@ -495,16 +542,16 @@ The **ohos.permission.DISTRIBUTED_DATASYNC** permission is required. This permis setAssociatedData(name: string, key: string, value: string, callback: AsyncCallback<void>): void; -Sets data to be associated with an application account. This method uses an asynchronous callback to return the result. +Sets data to be associated with an app account. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | -------- | ------------------- | ---- | ---------------------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | key | string | Yes| Key of the data to set. The private key can be customized.| | value | string | Yes| Value of the data to be set.| - | callback | AsyncCallback<void> | Yes| Callback invoked when the data associated with the specified application account is set.| + | callback | AsyncCallback<void> | Yes| Callback invoked when the data associated with the specified app account is set.| - Example @@ -518,13 +565,13 @@ Sets data to be associated with an application account. This method uses an asyn setAssociatedData(name: string, key: string, value: string): Promise<void>; -Sets data to be associated with an application account. This method uses a promise to return the result asynchronously. +Sets data to be associated with an app account. This method uses a promise to return the result asynchronously. - Parameters | Name| Type| Mandatory| Description| | ------ | ------ | ---- | ---------------------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | key | string | Yes| Key of the data to set. The private key can be customized.| | value | string | Yes| Value of the data to be set.| @@ -549,15 +596,15 @@ Sets data to be associated with an application account. This method uses a promi getAccountCredential(name: string, credentialType: string, callback: AsyncCallback<string>): void; -Obtains the credential of an application account. This method uses an asynchronous callback to return the result. +Obtains the credential of an app account. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | -------------- | --------------------- | ---- | ---------------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | credentialType | string | Yes| Type of the credential to obtain.| - | callback | AsyncCallback<string> | Yes| Callback invoked to return the credential of the specified application account.| + | callback | AsyncCallback<string> | Yes| Callback invoked to return the credential of the specified app account.| - Example @@ -573,13 +620,13 @@ Obtains the credential of an application account. This method uses an asynchrono getAccountCredential(name: string, credentialType: string): Promise<string>; -Obtains the credential of an application account. This method uses a promise to return the result asynchronously. +Obtains the credential of an app account. This method uses a promise to return the result asynchronously. - Parameters | Name| Type| Mandatory| Description| | -------------- | ------ | ---- | -------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | credentialType | string | Yes| Type of the credential to obtain.| - Return value @@ -603,14 +650,14 @@ Obtains the credential of an application account. This method uses a promise to getAccountExtraInfo(name: string, callback: AsyncCallback<string>): void; -Obtains additional information of an application account. This method uses an asynchronous callback to return the result. +Obtains additional information of an app account. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | -------- | --------------------- | ---- | -------------------------------- | - | name | string | Yes| Application account name.| - | callback | AsyncCallback<string> | Yes| Callback invoked to return the additional information of the specified application account.| + | name | string | Yes| App account name.| + | callback | AsyncCallback<string> | Yes| Callback invoked to return the additional information of the specified app account.| - Example @@ -626,13 +673,13 @@ Obtains additional information of an application account. This method uses an as getAccountExtraInfo(name: string): Promise<string>; -Obtains additional information of an application account. This method uses a promise to return the result asynchronously. +Obtains additional information of an app account. This method uses a promise to return the result asynchronously. - Parameters | Name| Type| Mandatory| Description| | ------ | ------ | ---- | -------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| - Return value @@ -655,15 +702,15 @@ Obtains additional information of an application account. This method uses a pro getAssociatedData(name: string, key: string, callback: AsyncCallback<string>): void; -Obtains data associated with an application account. This method uses an asynchronous callback to return the result. +Obtains data associated with an app account. This method uses an asynchronous callback to return the result. - Parameters | Name| Type| Mandatory| Description| | -------- | --------------------- | ---- | ---------------------------------- | - | name | string | Yes| Application account name.| - | key | string | Yes| Key of the data to be obtained.| - | callback | AsyncCallback<string> | Yes| Callback invoked to return the data associated with the specified application account.| + | name | string | Yes| App account name.| + | key | string | Yes| Key of the data to obtain.| + | callback | AsyncCallback<string> | Yes| Callback invoked to return the data associated with the specified app account.| - Example @@ -679,13 +726,13 @@ Obtains data associated with an application account. This method uses an asynchr getAssociatedData(name: string, key: string): Promise<string>; -Obtains data associated with an application account. This method uses a promise to return the result asynchronously. +Obtains data associated with an app account. This method uses a promise to return the result asynchronously. - Parameters | Name| Type| Mandatory| Description| | ------ | ------ | ---- | ------------------- | - | name | string | Yes| Application account name.| + | name | string | Yes| App account name.| | key | string | Yes| Key of the data to obtain.| - Return value @@ -709,7 +756,7 @@ Obtains data associated with an application account. This method uses a promise getAllAccessibleAccounts(callback: AsyncCallback<Array<AppAccountInfo>>): void; -Obtains information about all accessible accounts. This method uses an asynchronous callback to return the result. +Obtains information about all accessible app accounts. This method uses an asynchronous callback to return the result. The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This permission is intended for system applications only. @@ -717,7 +764,7 @@ The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This per | Name| Type| Mandatory| Description| | -------- | ------------------------------------ | ---- | ---------------- | - | callback | AsyncCallback<Array<AppAccountInfo>> | Yes| Callback invoked to return information about all accessible accounts.| + | callback | AsyncCallback<Array<AppAccountInfo>> | Yes| Callback invoked to return information about all accessible app accounts.| - Example @@ -733,7 +780,7 @@ The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This per getAllAccessibleAccounts(): Promise<Array<AppAccountInfo>>; -Obtains information about all accessible accounts. This method uses a promise to return the result. +Obtains information about all accessible app accounts. This method uses a promise to return the result. The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This permission is intended for system applications only. @@ -758,7 +805,7 @@ The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This per getAllAccounts(owner: string, callback: AsyncCallback<Array<AppAccountInfo>>): void; -Obtains information about all accounts of the specified account owner. This method uses an asynchronous callback to return the result. +Obtains information about all app accounts of the specified app. This method uses an asynchronous callback to return the result. The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This permission is intended for system applications only. @@ -766,8 +813,8 @@ The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This per | Name| Type| Mandatory| Description| | -------- | ------------------------------------ | ---- | ---------------- | - | owner | string | Yes| Owner of a system application account or third-party application account.| - | callback | AsyncCallback<Array<AppAccountInfo>> | Yes| Callback invoked to return information about all accounts of the specified account owner.| + | owner | string | Yes| Bundle name of the app.| + | callback | AsyncCallback<Array<AppAccountInfo>> | Yes| Callback invoked to return information about all app accounts.| - Example @@ -784,7 +831,7 @@ The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This per getAllAccounts(owner: string): Promise<Array<AppAccountInfo>>; -Obtains information about all accounts of the specified account owner. This method uses a promise to return the result. +Obtains information about all app accounts of the specified app. This method uses a promise to return the result. The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This permission is intended for system applications only. @@ -792,7 +839,7 @@ The **ohos.permission.GET_ACCOUNTS_PRIVILEGED** permission is required. This per | Name| Type| Mandatory| Description| | ------ | ------ | ---- | ---------- | - | owner | string | Yes| Owner of a system application account or third-party application account.| + | owner | string | Yes| Bundle name of the app.| - Parameters @@ -822,8 +869,8 @@ Subscribes to the account change event of the specified account owners. This met | Name| Type| Mandatory| Description| | -------- | ------------------------------- | ---- | ------------------------------------------------------------ | - | type | 'change' | Yes| Type of the event to subscribe to. The subscriber will receive a notification when the account owner updates the account.| - | owners | Array<string> | Yes| Owners of the account.| + | type | 'change' | Yes| Type of the event to subscribe to. The subscriber will receive a notification when the account owners update their accounts.| + | owners | Array<string> | Yes| Owners of the accounts.| | callback | Callback<Array<AppAccountInfo>> | Yes| Callback invoked to return the account change.| - Example @@ -851,7 +898,7 @@ Unsubscribes from the account change event. This method uses an asynchronous cal | Name| Type| Mandatory| Description| | -------- | -------------------- | ---- | ------------------------ | - | type | 'change' | Yes| Account change event.| + | type | 'change' | Yes| Account change event to unsubscribe from.| | callback | Callback<void> | No| Callback used to report the account change.| - Example @@ -872,11 +919,739 @@ Unsubscribes from the account change event. This method uses an asynchronous cal } ``` +### authenticate8+ + +authenticate(name: string, owner: string, authType: string, options: {[key: string]: any}, callback: AuthenticatorCallback): void; + +Authenticates an app account to obtain the Open Authorization (OAuth) access token. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | --------------------- | ---- | --------------------------- | + | name | string | Yes| Name of the app account to authenticate.| + | owner | string | Yes| Bundle name of the app.| + | authType | string | Yes| Authentication type.| + | options | {[key: string]: any} | Yes| Options for the authentication.| + | callback | AuthenticatorCallback | Yes| Authenticator callback invoked to return the authentication result.| + +- Example + + ``` + import featureAbility from '@ohos.ability.featureAbility'; + + function onResultCallback(code, result) { + console.log("resultCode: " + code); + console.log("result: " + JSON.stringify(result)); + } + + function onRequestRedirectedCallback(request) { + let abilityStartSetting = {want: request}; + featureAbility.startAbility(abilityStartSetting, (err)=>{ + console.log("startAbility err: " + JSON.stringify(err)); + }); + } + + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.authenticate("LiSi", "com.example.ohos.accountjsdemo", "readAge", {}, { + onResult: onResultCallback, + onRequestRedirected: onRequestRedirectedCallback + }); + ``` + +### getOAuthToken8+ + +getOAuthToken(name: string, owner: string, authType: string, callback: AsyncCallback<string>): void; + +Obtains the OAuth access token of an app account based on the specified authentication type. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | --------------------------- | ---- | -------------------- | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + | authType | string | Yes| Authentication type.| + | callback | AsyncCallback<string> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getOAuthToken("LiSi", "com.example.ohos.accountjsdemo", "readAge", (err, data) => { + console.log('getOAuthToken err: ' + JSON.stringify(err)); + console.log('getOAuthToken token: ' + data); + }); + ``` + +### getOAuthToken8+ + +getOAuthToken(name: string, owner: string, authType: string): Promise<string>; + +Obtains the OAuth access token of an app account based on the specified authentication type. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------ | ---- | -------------------- | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + | authType | string | Yes| Authentication type.| + +- Parameters + + | Type| Description| + | --------------------- | -------------------------------- | + | Promise<string> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getOAuthToken("LiSi", "com.example.ohos.accountjsdemo", "readAge").then((data) => { + console.log('getOAuthToken token: ' + data); + }).catch((err) => { + console.log("getOAuthToken err: " + JSON.stringify(err)); + }); + ``` + +### setOAuthToken8+ + +setOAuthToken(name: string, authType: string, token: string, callback: AsyncCallback<void>): void; + +Sets an OAuth access token for an app account. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------------------------- | ---- | ------------- | + | name | string | Yes| App account name.| + | authType | string | Yes| Authentication type.| + | token | string | Yes| OAuth access token to set.| + | callback | AsyncCallback<void> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.setOAuthToken("LiSi", "readAge", "xxxx", (err) => { + console.log('setOAuthToken err: ' + JSON.stringify(err)); + }); + ``` + +### setOAuthToken8+ + +setOAuthToken(name: string, authType: string, token: string): Promise<void>; + +Sets an OAuth access token for an app account. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------ | ---- | ------------- | + | name | string | Yes| App account name.| + | authType | string | Yes| Authentication type.| + | token | string | Yes| OAuth access token to set.| + +- Parameters + + | Type| Description| + | ------------------- | -------------------------------- | + | Promise<void> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.setOAuthToken("LiSi", "readAge", "xxxx").then(() => { + console.log('setOAuthToken successfully'); + }).catch((err) => { + console.log('setOAuthToken err: ' + JSON.stringify(err)); + }); + ``` + +### deleteOAuthToken8+ + +deleteOAuthToken(name: string, owner: string, authType: string, token: string, callback: AsyncCallback<void>): void; + +Deletes the specified OAuth access token for an app account. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------------------------- | ---- | ------------------ | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + | authType | string | Yes| Authentication type.| + | token | string | Yes| OAuth access token to delete.| + | callback | AsyncCallback<void> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.deleteOAuthToken("LiSi", "com.example.ohos.accountjsdemo", "readAge", "xxxxx", (err) => { + console.log('deleteOAuthToken err: ' + JSON.stringify(err)); + }); + ``` + +### deleteOAuthToken8+ + +deleteOAuthToken(name: string, owner: string, authType: string, token: string): Promise<void>; + +Deletes the specified OAuth access token for an app account. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------ | ---- | ------------------ | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + | authType | string | Yes| Authentication type.| + | token | string | Yes| OAuth access token to delete.| + +- Parameters + + | Type| Description| + | ------------------------------ | --------------------- | + | Promise<void> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.deleteOAuthToken("LiSi", "com.example.ohos.accountjsdemo", "readAge", "xxxxx").then(() => { + console.log('deleteOAuthToken successfully'); + }).catch((err) => { + console.log("deleteOAuthToken err: " + JSON.stringify(err)); + }); + ``` + +### setOAuthTokenVisibility8+ + +setOAuthTokenVisibility(name: string, authType: string, bundleName: string, isVisible: boolean, callback: AsyncCallback<void>): void; + +Sets the visibility of an OAuth access token to the specified app. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------------------------- | ---- | ------------------- | + | name | string | Yes| App account name.| + | authType | string | Yes| Authentication type.| + | bundleName | string | Yes| Bundle name of the app.| + | isVisible | boolean | Yes| Whether the OAuth access token is visible to the app.| + | callback | AsyncCallback<void> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.setOAuthTokenVisibility("LiSi", "readAge", "com.example.ohos.accountjsdemo", true, (err) => { + console.log('setOAuthTokenVisibility err: ' + JSON.stringify(err)); + }); + ``` + +### setOAuthTokenVisibility8+ + +setOAuthTokenVisibility(name: string, authType: string, bundleName: string, isVisible: boolean): Promise<void>; + +Sets the visibility of an OAuth access token to the specified app. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------------------------- | ---- | ------------------- | + | name | string | Yes| App account name.| + | authType | string | Yes| Authentication type.| + | bundleName | string | Yes| Bundle name of the app.| + | isVisible | boolean | Yes| Whether the OAuth access token is visible to the app.| + +- Parameters + + | Type| Description| + | ------------------------------ | --------------------- | + | Promise<void> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.setOAuthTokenVisibility("LiSi", "readAge", "com.example.ohos.accountjsdemo", true).then(() => { + console.log('setOAuthTokenVisibility successfully'); + }).catch((err) => { + console.log('setOAuthTokenVisibility err: ' + JSON.stringify(err)); + }); + ``` + +### checkOAuthTokenVisibility8+ + +checkOAuthTokenVisibility(name: string, authType: string, bundleName: string, callback: AsyncCallback<boolean>): void; + +Checks whether an OAuth token is visible to the specified app. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ---------------------------- | ---- | ---------------------- | + | name | string | Yes| App account name.| + | authType | string | Yes| Authentication type.| + | bundleName | string | Yes| Bundle name of the app.| + | callback | AsyncCallback<boolean> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.checkOAuthTokenVisibility("LiSi", "readAge", "com.example.ohos.accountjsdemo", true, (err, data) => { + console.log('checkOAuthTokenVisibility err: ' + JSON.stringify(err)); + console.log('checkOAuthTokenVisibility isVisible: ' + data); + }); + ``` + +### checkOAuthTokenVisibility8+ + +checkOAuthTokenVisibility(name: string, authType: string, bundleName: string): Promise<boolean>; + +Checks whether an OAuth token is visible to the specified app. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------------------------- | ---- | ---------------------- | + | name | string | Yes| App account name.| + | authType | string | Yes| Authentication type.| + | bundleName | string | Yes| Bundle name of the app.| + +- Parameters + + | Type| Description| + | ------------------------------ | ------------------------ | + | Promise<boolean> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.checkOAuthTokenVisibility("LiSi", "readAge", "com.example.ohos.accountjsdemo", true).then((data) => { + console.log('checkOAuthTokenVisibility isVisible: ' + data); + }).catch((err) => { + console.log('checkOAuthTokenVisibility err: ' + JSON.stringify(err)); + }); + ``` + +### getAllOAuthTokens8+ + +getAllOAuthTokens(name: string, owner: string, callback: AsyncCallback<Array<OAuthTokenInfo>>): void; + +Obtains information about all OAuth access tokens of an app account visible to the specified app. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------------------------------------------------ | ---- | ------------------- | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + | callback | AsyncCallback<Array<OAuthTokenInfo>> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getAllOAuthTokens("LiSi", "com.example.ohos.accountjsdemo", (err, data) => { + console.log("getAllOAuthTokens err: " + JSON.stringify(err)); + console.log('getAllOAuthTokens data: ' + JSON.stringify(data)); + }); + ``` + +### getAllOAuthTokens8+ + +getAllOAuthTokens(name: string, owner: string): Promise<Array<OAuthTokenInfo>>; + +Obtains information about all OAuth access tokens of an app account visible to the specified app. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------ | ---- | ------------------- | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + +- Parameters + + | Type| Description| + | ------------------------------ | ----------------------------------- | + | Promise<Array<OAuthTokenInfo>> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getAllOAuthTokens("LiSi", "com.example.ohos.accountjsdemo").then((data) => { + console.log('getAllOAuthTokens data: ' + JSON.stringify(data)); + }).catch((err) => { + console.log("getAllOAuthTokens err: " + JSON.stringify(err)); + }); + ``` + +### getOAuthList8+ + +getOAuthList(name: string, authType: string, callback: AsyncCallback<Array<string>>): void; + +Obtains the authorization list of OAuth access tokens of an app account. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ---------------------------------------- | ---- | ------------------ | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + | callback | AsyncCallback<Array<string>> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getOAuthList("com.example.ohos.accountjsdemo", "readAge", (err, data) => { + console.log('getOAuthList err: ' + JSON.stringify(err)); + console.log('getOAuthList data: ' + JSON.stringify(data)); + }); + ``` + +### getOAuthList8+ + +getOAuthList(name: string, authType: string): Promise<Array<string>>; + +Obtains the authorization list of OAuth access tokens of an app account. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | ------ | ---- | ------------------- | + | name | string | Yes| App account name.| + | owner | string | Yes| Bundle name of the app.| + +- Parameters + + | Type| Description| + | ------------------------------ | ------------------------------------ | + | Promise<Array<string>> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getOAuthList("com.example.ohos.accountjsdemo", "readAge").then((data) => { + console.log('getOAuthList data: ' + JSON.stringify(data)); + }).catch((err) => { + console.log("getOAuthList err: " + JSON.stringify(err)); + }); + ``` + +### getAuthenticatorCallback8+ + +getAuthenticatorCallback(sessionId: string, callback: AsyncCallback<AuthenticatorCallback>): void; + +Obtains the authenticator callback for a session. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | --------- | ------------------------------------------ | ---- | -------------- | + | sessionId | string | Yes| ID of the session to authenticate.| + | callback | AsyncCallback<AuthenticatorCallback> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + featureAbility.getWant((err, want) => { + var sessionId = want.parameters[Constants.KEY_SESSION_ID]; + appAccountManager.getAuthenticatorCallback(sessionId, (err, callback) => { + if (err.code != ResultCode.SUCCESS) { + console.log("getAuthenticatorCallback err: " + JSON.stringify(err)); + return; + } + var result = {Constants.KEY_NAME: "LiSi", Constants.KEY_OWNER: "com.example.ohos.accountjsdemo", + Constants.KEY_AUTH_TYPE: "readAge", Constants.KEY_TOKEN: "xxxxxx"}; + callback.OnResult(ResultCode.SUCCESS, result); + }); + }); + ``` + +### getAuthenticatorCallback8+ + +getAuthenticatorCallback(sessionId: string): Promise<AuthenticatorCallback>; + +Obtains the authenticator callback for a session. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------- | ------ | ---- | -------------- | + | sessionId | string | Yes| ID of the session to authenticate.| + +- Parameters + + | Type| Description| + | ------------------------------------ | -------------------------------- | + | Promise<AuthenticatorCallback> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + featureAbility.getWant().then((want) => { + var sessionId = want.parameters[Constants.KEY_SESSION_ID]; + appAccountManager.getAuthenticatorCallback(sessionId).then((callback) => { + var result = {Constants.KEY_NAME: "LiSi", Constants.KEY_OWNER: "com.example.ohos.accountjsdemo", + Constants.KEY_AUTH_TYPE: "readAge", Constants.KEY_TOKEN: "xxxxxx"}; + callback.OnResult(ResultCode.SUCCESS, result); + }).catch((err) => { + console.log("getAuthenticatorCallback err: " + JSON.stringify(err)); + }); + }).catch((err) => { + console.log("getWant err: " + JSON.stringify(err)); + }); + ``` + +### getAuthenticatorInfo8+ + +getAuthenticatorInfo(owner: string, callback: AsyncCallback<AuthenticatorInfo>): void; + +Obtains authenticator information of an app account. This method uses an asynchronous callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | -------------------------------------- | ---- | ------------------- | + | owner | string | Yes| Bundle name of the app.| + | callback | AsyncCallback<AuthenticatorInfo> | Yes| Callback invoked to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getAuthenticatorInfo("com.example.ohos.accountjsdemo", (err, data) => { + console.log("getAuthenticatorInfo err: " + JSON.stringify(err)); + console.log('getAuthenticatorInfo data: ' + JSON.stringify(data)); + }); + ``` + +### getAuthenticatorInfo8+ + +getAuthenticatorInfo(owner: string): Promise<AuthenticatorInfo>; + +Obtains authenticator information of an app account. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ----- | ------ | ---- | -------------------- | + | owner | string | Yes| Bundle name of the app.| + +- Parameters + + | Type| Description| + | ------------------------------ | ----------------------------------- | + | Promise<AuthenticatorInfo> | Promise used to return the result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + appAccountManager.getAuthenticatorInfo("com.example.ohos.accountjsdemo").then((data) => { + console.log('getAuthenticatorInfo: ' + JSON.stringify(data)); + }).catch((err) => { + console.log("getAuthenticatorInfo err: " + JSON.stringify(err)); + }); + ``` + ## AppAccountInfo +Defines app account information. + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ---------------- | +| owner | string | Yes| Bundle name of the app.| +| name | string | Yes| App account name.| + +## OAuthTokenInfo8+ +Defines OAuth access token information. | Name| Type| Mandatory| Description| -| ------ | ------ | ---- | ------------------ | -| owner | string | Yes| Owner of an application account.| -| name | string | Yes| Name of an application account.| +| -------- | ------ | ---- | -------------- | +| authType | string | Yes| Authentication type.| +| token | string | Yes| Value of the access token.| + +## AuthenticatorInfo8+ + +Defines OAuth authenticator information. + +| Name| Type| Mandatory| Description| +| ------- | ------ | ---- | ------------------ | +| owner | string | Yes| Bundle name of the authenticator owner.| +| iconId | string | Yes| ID of the authenticator icon.| +| labelId | string | Yes| ID of the authenticator label.| + +## Constants8+ + +Enumerates the constants. + +| Name| Default Value| Description| +| ----------------------------- | ---------------------- | ----------------------- | +| ACTION_ADD_ACCOUNT_IMPLICITLY | "addAccountImplicitly" | Operation for implicitly adding an account.| +| ACTION_AUTHENTICATE | "authenticate" | Authentication operation.| +| KEY_NAME | "name" | App account name.| +| KEY_OWNER | "owner" | App account owner.| +| KEY_TOKEN | "token" | OAuth access token.| +| KEY_ACTION | "action" | Action.| +| KEY_AUTH_TYPE | "authType" | Authentication type.| +| KEY_SESSION_ID | "sessionId" | Session ID.| +| KEY_CALLER_PID | "callerPid" | Caller process ID (PID).| +| KEY_CALLER_UID | "callerUid" | Caller user ID (UID).| +| KEY_CALLER_BUNDLE_NAME | "callerBundleName" | Caller bundle name.| + +## ResultCode8+ + +Enumerates the result codes. + +| Name| Default Value| Description| +| ----------------------------------- | ----- | ---------------------- | +| SUCCESS | 0 | The operation is successful.| +| ERROR_ACCOUNT_NOT_EXIST | 10001 | The app account does not exist.| +| ERROR_APP_ACCOUNT_SERVICE_EXCEPTION | 10002 | The app account service is abnormal.| +| ERROR_INVALID_PASSWORD | 10003 | The password is invalid.| +| ERROR_INVALID_REQUEST | 10004 | The request is invalid.| +| ERROR_INVALID_RESPONSE | 10005 | The response is invalid.| +| ERROR_NETWORK_EXCEPTION | 10006 | The network is abnormal.| +| ERROR_OAUTH_AUTHENTICATOR_NOT_EXIST | 10007 | The authenticator does not exist.| +| ERROR_OAUTH_CANCELED | 10008 | The authentication is canceled.| +| ERROR_OAUTH_LIST_TOO_LARGE | 10009 | The size of the OAuth list exceeds the limit.| +| ERROR_OAUTH_SERVICE_BUSY | 10010 | The OAuth service is busy.| +| ERROR_OAUTH_SERVICE_EXCEPTION | 10011 | The OAuth service is abnormal.| +| ERROR_OAUTH_SESSION_NOT_EXIST | 10012 | The session to be authenticated does not exist.| +| ERROR_OAUTH_TIMEOUT | 10013 | The authentication timed out.| +| ERROR_OAUTH_TOKEN_NOT_EXIST | 10014 | The OAuth access token does not exist.| +| ERROR_OAUTH_TOKEN_TOO_MANY | 10015 | The number of OAuth access tokens reaches the limit.| +| ERROR_OAUTH_UNSUPPORT_ACTION | 10016 | The authentication operation is not supported.| +| ERROR_OAUTH_UNSUPPORT_AUTH_TYPE | 10017 | The authentication type is not supported.| +| ERROR_PERMISSION_DENIED | 10018 | The required permission is missing.| + +## AuthenticatorCallback8+ + +Provides methods for managing the OAuth authenticator callback. + +### onResult8+ + +onResult: (code: number, result: {[key: string]: any}) => void; + +Called back to send the authentication result. + +- Parameters + | Name| Type| Mandatory| Description| + | ------ | -------------------- | ---- | ----------- | + | code | number | Yes| Authentication result code.| + | result | {[key: string]: any} | Yes| Authentication result.| + +- Example + + ``` + const appAccountManager = account_appAccount.createAppAccountManager(); + var sessionId = "1234"; + appAccountManager.getAuthenticatorCallback(sessionId).then((callback) => { + var result = {Constants.KEY_NAME: "LiSi", Constants.KEY_OWNER: "com.example.ohos.accountjsdemo", + Constants.KEY_AUTH_TYPE: "readAge", Constants.KEY_TOKEN: "xxxxxx"}; + callback.OnResult(ResultCode.SUCCESS, result); + }).catch((err) => { + console.log("getAuthenticatorCallback err: " + JSON.stringify(err)); + }); + ``` + +### onRequestRedirected8+ + +onRequestRedirected: (request: Want) => void; + +Called back to redirect an authentication request. + +- Parameters + | Name| Type| Mandatory| Description| + | ------- | ---- | ---- | ------------------ | + | request | Want | Yes| Request to be redirected.| + +- Example + + ``` + class MyAuthenticator extends account_appAccount.Authenticator { + addAccountImplicitly(authType, callerBundleName, options, callback) { + callback.onRequestRedirected({ + bundleName: "com.example.ohos.accountjsdemo", + abilityName: "com.example.ohos.accountjsdemo.LoginAbility", + }); + } + + authenticate(name, authType, callerBundleName, options, callback) { + var result = {Constants.KEY_NAME: name, Constants.KEY_AUTH_TYPE: authType, Constants.KEY_TOKEN: "xxxxxx"}; + callback.onResult(ResultCode.SUCCESS, result); + } + } + ``` + +## Authenticator8+ + +Defines the OAuth authenticator base class. + +### addAccountImplicitly8+ + +addAccountImplicitly(authType: string, callerBundleName: string, options: {[key: string]: any}, callback: AuthenticatorCallback): void; + +Implicitly adds an app account based on the specified authentication type and options. This method uses an asynchronous callback to return the result. + +- Parameters + | Name| Type| Mandatory| Description| + | ---------------- | --------------------- | --- | -------------------------- | + | authType | string | Yes| Authentication type.| + | callerBundleName | string | Yes| Bundle name of the authentication requester.| + | options | {[key: string]: any} | Yes| Options for the authentication.| + | callback | AuthenticatorCallback | Yes| Authenticator callback invoked to return the authentication result.| + +### authenticate8+ + +authenticate(name: string, authType: string, callerBundleName: string, options: {[key: string]: any}, callback: AuthenticatorCallback): void; + +Authenticates an app account to obtain the OAuth access token. This method uses an asynchronous callback to return the result. + +- Parameters + | Name| Type| Mandatory| Description| + | ---------------- | --------------------- | ---- | -------------------------- | + | name | string | Yes| App account name.| + | authType | string | Yes| Authentication type.| + | callerBundleName | string | Yes| Bundle name of the authentication requester.| + | options | {[key: string]: any} | Yes| Options for the authentication.| + | callback | AuthenticatorCallback | Yes| Authenticator callback invoked to return the authentication result.| + +- Example + + ``` + class MyAuthenticator extends account_appAccount.Authenticator { + addAccountImplicitly(authType, callerBundleName, options, callback) { + callback.onRequestRedirected({ + bundleName: "com.example.ohos.accountjsdemo", + abilityName: "com.example.ohos.accountjsdemo.LoginAbility", + }); + } + + authenticate(name, authType, callerBundleName, options, callback) { + var result = {Constants.KEY_NAME: name, Constants.KEY_AUTH_TYPE: authType, Constants.KEY_TOKEN: "xxxxxx"}; + callback.onResult(ResultCode.SUCCESS, result); + } + } + + export default { + onConnect(want) { + return new MyAuthenticator(); + } + } + ``` diff --git a/en/application-dev/reference/apis/js-apis-distributed-account.md b/en/application-dev/reference/apis/js-apis-distributed-account.md index f0eaf4979b0..de6af60335c 100644 --- a/en/application-dev/reference/apis/js-apis-distributed-account.md +++ b/en/application-dev/reference/apis/js-apis-distributed-account.md @@ -1,6 +1,7 @@ # Distributed Account Management ->![](../../public_sys-resources/icon-note.gif) **NOTE:** +>![](../../public_sys-resources/icon-note.gif) **NOTE** +> >The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import @@ -9,6 +10,12 @@ import account_distributedAccount from '@ohos.account.distributedAccount'; ``` + +## System Capabilities + +SystemCapability.Account.OsAccount + + ## account\_distributedAccount.getDistributedAccountAbility getDistributedAccountAbility\(\): DistributedAccountAbility @@ -297,4 +304,3 @@ Defines distributed OS account information. - -- Gitee From 4c9faf210ef2566b4338b46ab6bddab3fb588296 Mon Sep 17 00:00:00 2001 From: bird_j Date: Wed, 2 Mar 2022 16:12:47 +0800 Subject: [PATCH 064/282] add syscaps Signed-off-by: bird_j --- .../reference/apis/js-apis-media.md | 446 ++++++++++++------ 1 file changed, 292 insertions(+), 154 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 4ffe5de81d8..a404d3261f9 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -29,7 +29,7 @@ createAudioPlayer(): [AudioPlayer](#audioplayer) | 类型 | 说明 | | --------------------------- | ------------------------------------------------------------ | -| [AudioPlayer](#audioplayer) | 返回AudioPlayer类实例,失败时返回null。可用于音频播放、暂停、停止等操作。 | +| [AudioPlayer](#audioplayer) | 返回AudioPlayer类实例,失败时返回null。可用于音频播放、暂停、停止等操作。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | **示例:** @@ -45,9 +45,9 @@ createVideoPlayer(callback: AsyncCallback\<[VideoPlayer](#videoplayer8)>): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------------------- | ---- | ------------------------------ | -| callback | AsyncCallback<[VideoPlayer](#videoplayer8)> | 是 | 异步创建视频播放实例回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------- | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback<[VideoPlayer](#videoplayer8)> | 是 | 异步创建视频播放实例回调方法。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | **示例:** @@ -72,9 +72,9 @@ createVideoPlayer: Promise<[VideoPlayer](#videoplayer8)> **返回值:** -| 类型 | 说明 | -| ------------------------------------- | ----------------------------------- | -| Promise<[VideoPlayer](#videoplayer8)> | 异步创建视频播放实例Promise返回值。 | +| 类型 | 说明 | +| ------------------------------------- | ------------------------------------------------------------ | +| Promise<[VideoPlayer](#videoplayer8)> | 异步创建视频播放实例Promise返回值。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | **示例:** @@ -106,9 +106,9 @@ createAudioRecorder(): AudioRecorder **返回值:** -| 类型 | 说明 | -| ------------------------------- | ----------------------------------------- | -| [AudioRecorder](#audiorecorder) | 返回AudioRecorder类实例,失败时返回null。 | +| 类型 | 说明 | +| ------------------------------- | ------------------------------------------------------------ | +| [AudioRecorder](#audiorecorder) | 返回AudioRecorder类实例,失败时返回null。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | **示例:** @@ -124,9 +124,9 @@ createVideoRecorder(callback: AsyncCallback\<[VideoRecorder](#videorecorder8)>): **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------------------- | ---- | ------------------------------ | -| callback | AsyncCallback<[VideoRecorder](#videorecorder8)> | 是 | 异步创建视频录制实例回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------- | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback<[VideoRecorder](#videorecorder8)> | 是 | 异步创建视频录制实例回调方法。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | **示例:** @@ -151,9 +151,9 @@ createVideoRecorder: Promise<[VideoRecorder](#videorecorder8)> **返回值:** -| 类型 | 说明 | -| ----------------------------------------------------- | ----------------------------------- | -| Promise<[VideoRecorder](#videorecorder8)> | 异步创建视频录制实例Promise返回值。 | +| 类型 | 说明 | +| ----------------------------------------- | ------------------------------------------------------------ | +| Promise<[VideoRecorder](#videorecorder8)> | 异步创建视频录制实例Promise返回值。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | **示例:** @@ -183,40 +183,38 @@ await media.createVideoRecorder.then((video) => { 媒体服务错误类型枚举 -| 名称 | 值 | 说明 | -| -------------------------- | ---- | -------------------------------------- | -| MSERR_OK | 0 | 表示操作成功。 | -| MSERR_NO_MEMORY | 1 | 表示申请内存失败,系统可能无可用内存。 | -| MSERR_OPERATION_NOT_PERMIT | 2 | 表示无权限执行此操作。 | -| MSERR_INVALID_VAL | 3 | 表示传入入参无效。 | -| MSERR_IO | 4 | 表示发生IO错误。 | -| MSERR_TIMEOUT | 5 | 表示操作超时。 | -| MSERR_UNKNOWN | 6 | 表示未知错误。 | -| MSERR_SERVICE_DIED | 7 | 表示服务端失效。 | -| MSERR_INVALID_STATE | 8 | 表示在当前状态下,不允许执行此操作。 | -| MSERR_UNSUPPORTED | 9 | 表示在当前版本下,不支持此操作。 | +| 名称 | 值 | 说明 | +| -------------------------- | ---- | ------------------------------------------------------------ | +| MSERR_OK | 0 | 表示操作成功。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_NO_MEMORY | 1 | 表示申请内存失败,系统可能无可用内存。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_OPERATION_NOT_PERMIT | 2 | 表示无权限执行此操作。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_INVALID_VAL | 3 | 表示传入入参无效。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_IO | 4 | 表示发生IO错误。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_TIMEOUT | 5 | 表示操作超时。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_UNKNOWN | 6 | 表示未知错误。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_SERVICE_DIED | 7 | 表示服务端失效。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_INVALID_STATE | 8 | 表示在当前状态下,不允许执行此操作。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MSERR_UNSUPPORTED | 9 | 表示在当前版本下,不支持此操作。
**系统能力:** SystemCapability.Multimedia.Media.Core | ## MediaType8+ 媒体类型枚举 -| 名称 | 值 | 说明 | -| ------------------- | ---- | ------------------ | -| MEDIA_TYPE_AUD | 0 | 表示音频。 | -| MEDIA_TYPE_VID | 1 | 表示视频。 | -| MEDIA_TYPE_SUBTITLE | 2 | 表示字幕:开发中。 | +| 名称 | 值 | 说明 | +| -------------- | ---- | ------------------------------------------------------------ | +| MEDIA_TYPE_AUD | 0 | 表示音频。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MEDIA_TYPE_VID | 1 | 表示视频。
**系统能力:** SystemCapability.Multimedia.Media.Core | ## CodecMimeType8+ Codec MIME类型枚举 -| 名称 | 值 | 说明 | -| ------------ | ----------------- | ------------------------ | -| VIDEO_MPEG4 | ”video/mp4v-es“ | 表示视频/mpeg4类型。 | -| AUDIO_MPEG | "audio/mpeg" | 表示音频/mpeg类型。 | -| AUDIO_AAC | "audio/mp4a-latm" | 表示音频/mp4a-latm类型。 | -| AUDIO_VORBIS | "audio/vorbis" | 表示音频/vorbis类型。 | -| AUDIO_FLAC | "audio/flac" | 表示音频/flac类型。 | +| 名称 | 值 | 说明 | +| ------------ | ----------------- | ------------------------------------------------------------ | +| VIDEO_MPEG4 | ”video/mp4v-es“ | 表示视频/mpeg4类型。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| AUDIO_AAC | "audio/mp4a-latm" | 表示音频/mp4a-latm类型。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| AUDIO_VORBIS | "audio/vorbis" | 表示音频/vorbis类型。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| AUDIO_FLAC | "audio/flac" | 表示音频/flac类型。
**系统能力:** SystemCapability.Multimedia.Media.Core | ## MediaDescriptionKey8+ @@ -224,31 +222,31 @@ Codec MIME类型枚举 | 名称 | 值 | 说明 | | ------------------------ | --------------- | ------------------------------------------------------------ | -| MD_KEY_TRACK_INDEX | "track_index" | 表示轨道序号,其对应键值类型为number。 | -| MD_KEY_TRACK_TYPE | "track_type" | 表示轨道类型,其对应键值类型为number,参考[MediaType](#mediatype8)。 | -| MD_KEY_CODEC_MIME | "codec_mime" | 表示codec_mime类型,其对应键值类型为string。 | -| MD_KEY_DURATION | "duration" | 表示媒体时长,其对应键值类型为number,单位为ms。 | -| MD_KEY_BITRATE | "bitrate" | 表示比特率,其对应键值类型为number,单位为bps。 | -| MD_KEY_WIDTH | "width" | 表示视频宽度,其对应键值类型为number,单位为像素。 | -| MD_KEY_HEIGHT | "height" | 表示视频高度,其对应键值类型为number,单位为像素。 | -| MD_KEY_FRAME_RATE | "frame_rate" | 表示视频帧率,其对应键值类型为number,单位为100fps。 | -| MD_KEY_AUD_CHANNEL_COUNT | "channel_count" | 表示声道数,其对应键值类型为number。 | -| MD_KEY_AUD_SAMPLE_RATE | "sample_rate" | 表示采样率,其对应键值类型为number,单位为HZ。 | +| MD_KEY_TRACK_INDEX | "track_index" | 表示轨道序号,其对应键值类型为number。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_TRACK_TYPE | "track_type" | 表示轨道类型,其对应键值类型为number,参考[MediaType](#mediatype8)。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_CODEC_MIME | "codec_mime" | 表示codec_mime类型,其对应键值类型为string。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_DURATION | "duration" | 表示媒体时长,其对应键值类型为number,单位为ms。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_BITRATE | "bitrate" | 表示比特率,其对应键值类型为number,单位为bps。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_WIDTH | "width" | 表示视频宽度,其对应键值类型为number,单位为像素。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_HEIGHT | "height" | 表示视频高度,其对应键值类型为number,单位为像素。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_FRAME_RATE | "frame_rate" | 表示视频帧率,其对应键值类型为number,单位为100fps。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_AUD_CHANNEL_COUNT | "channel_count" | 表示声道数,其对应键值类型为number。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| MD_KEY_AUD_SAMPLE_RATE | "sample_rate" | 表示采样率,其对应键值类型为number,单位为HZ。
**系统能力:** SystemCapability.Multimedia.Media.Core | ## BufferingInfoType8+ 缓存事件类型枚举 -| 名称 | 值 | 说明 | -| ----------------- | ---- | -------------------------- | -| BUFFERING_START | 1 | 表示开始缓存。 | -| BUFFERING_END | 2 | 表示结束缓存。 | -| BUFFERING_PERCENT | 3 | 表示缓存百分比。 | -| CACHED_DURATION | 4 | 表示缓存时长,单位为毫秒。 | +| 名称 | 值 | 说明 | +| ----------------- | ---- | ------------------------------------------------------------ | +| BUFFERING_START | 1 | 表示开始缓存。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| BUFFERING_END | 2 | 表示结束缓存。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| BUFFERING_PERCENT | 3 | 表示缓存百分比。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| CACHED_DURATION | 4 | 表示缓存时长,单位为毫秒。
**系统能力:** SystemCapability.Multimedia.Media.Core | ## AudioPlayer -音频播放管理类,用于管理和播放音频媒体。在调用AudioPlayer的方法前,需要先通过[createAudioPlayer()](#media.createaudioplayer)或[createAudioPlayerAsync()](#media.createaudioplayerasync8)构建一个[AudioPlayer](#audioplayer)实例。 +音频播放管理类,用于管理和播放音频媒体。在调用AudioPlayer的方法前,需要先通过[createAudioPlayer()](#media.createaudioplayer)构建一个[AudioPlayer](#audioplayer)实例。 音频播放demo可参考:[音频播放开发指导](../../media/audio-playback.md) @@ -256,11 +254,11 @@ Codec MIME类型枚举 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----------- | ------------------------- | ---- | ---- | ------------------------------------------------------------ | -| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | -| loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。 | -| currentTime | number | 是 | 否 | 音频的当前播放位置。 | -| duration | number | 是 | 否 | 音频时长。 | -| state | [AudioState](#audiostate) | 是 | 否 | 音频播放的状态。 | +| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| currentTime | number | 是 | 否 | 音频的当前播放位置。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| duration | number | 是 | 否 | 音频时长。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| state | [AudioState](#audiostate) | 是 | 否 | 音频播放的状态。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | ### play @@ -268,6 +266,8 @@ play(): void 开始播放音频资源,需在[dataLoad](#on('play' | 'pause' | 'stop' | 'reset' | 'dataload' | 'finish' | 'volumechange'))事件成功触发后,才能调用play方法。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **示例:** ```js @@ -283,6 +283,8 @@ pause(): void 暂停播放音频资源。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **示例:** ```js @@ -298,6 +300,8 @@ stop(): void 停止播放音频资源。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **示例:** ```js @@ -313,6 +317,8 @@ reset(): void 切换播放音频资源。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **示例:** ```js @@ -328,6 +334,8 @@ seek(timeMs: number): void 跳转到指定播放位置。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -353,6 +361,8 @@ setVolume(vol: number): void 设置音量。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -374,6 +384,8 @@ release(): void 释放音频资源。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **示例:** ```js @@ -387,6 +399,8 @@ getTrackDescription(callback: AsyncCallback> 通过Promise方式获取音频轨道信息。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **返回值:** | 类型 | 说明 | @@ -462,6 +478,8 @@ on(type: 'bufferingUpdate', callback: (infoType: [BufferingInfoType](#bufferingi 开始订阅音频缓存更新事件。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -484,6 +502,8 @@ on(type: 'play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeCh 开始订阅音频播放事件。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -554,6 +574,8 @@ on(type: 'timeUpdate', callback: Callback\): void 开始订阅音频播放[seek()](#seek)时间更新事件。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -580,6 +602,8 @@ on(type: 'error', callback: ErrorCallback): void 开始订阅音频播放错误事件。 +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -602,13 +626,13 @@ audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 音频播放的状态机。可通过state属性获取当前状态。 -| 名称 | 类型 | 描述 | -| ------------------ | ------ | -------------- | -| idle | string | 音频播放空闲。 | -| playing | string | 音频正在播放。 | -| paused | string | 音频暂停播放。 | -| stopped | string | 音频播放停止。 | -| error8+ | string | 错误状态。 | +| 名称 | 类型 | 描述 | +| ------------------ | ------ | ------------------------------------------------------------ | +| idle | string | 音频播放空闲。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| playing | string | 音频正在播放。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| paused | string | 音频暂停播放。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| stopped | string | 音频播放停止。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| error8+ | string | 错误状态。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | ## VideoPlayer8+ @@ -620,13 +644,13 @@ audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----------- | ---------------------------------- | ---- | ---- | ------------------------------------------------------------ | -| url | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放 | -| loop | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。 | -| currentTime | number | 是 | 否 | 视频的当前播放位置。 | -| duration | number | 是 | 否 | 视频时长,返回-1表示直播模式 | -| state | [VideoPlayState](#videoplaystate8) | 是 | 否 | 视频播放的状态。 | -| width | number | 是 | 否 | 视频宽。 | -| height | number | 是 | 否 | 视频高。 | +| url | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| loop | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| currentTime | number | 是 | 否 | 视频的当前播放位置。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| duration | number | 是 | 否 | 视频时长,返回-1表示直播模式。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| state | [VideoPlayState](#videoplaystate8) | 是 | 否 | 视频播放的状态。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| width | number | 是 | 否 | 视频宽。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| height | number | 是 | 否 | 视频高。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | ### setDisplaySurface8+ @@ -634,6 +658,8 @@ setDisplaySurface(surfaceId: string, callback: AsyncCallback\): void 通过回调方式设置SurfaceId。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -659,6 +685,8 @@ setDisplaySurface(surfaceId: string): Promise\ 通过Promise方式设置SurfaceId。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -691,6 +719,8 @@ prepare(callback: AsyncCallback\): void 通过回调方式准备播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -715,6 +745,8 @@ prepare(): Promise\ 通过Promise方式准备播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** | 类型 | 说明 | @@ -741,6 +773,8 @@ play(callback: AsyncCallback\): void; 通过回调方式开始播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -765,6 +799,8 @@ play(): Promise\; 通过Promise方式开始播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** | 类型 | 说明 | @@ -791,6 +827,8 @@ pause(callback: AsyncCallback\): void 通过回调方式暂停播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -815,6 +853,8 @@ pause(): Promise\ 通过Promise方式暂停播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** | 类型 | 说明 | @@ -841,6 +881,8 @@ stop(callback: AsyncCallback\): void 通过回调方式停止播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -865,6 +907,8 @@ stop(): Promise\ 通过Promise方式停止播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** | 类型 | 说明 | @@ -891,6 +935,8 @@ reset(callback: AsyncCallback\): void 通过回调方式切换播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -915,6 +961,8 @@ reset(): Promise\ 通过Promise方式切换播放视频。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** | 类型 | 说明 | @@ -941,6 +989,8 @@ seek(timeMs: number, callback: AsyncCallback\): void 通过回调方式跳转到指定播放位置,默认跳转到指定时间点的下一个关键帧。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -966,6 +1016,8 @@ seek(timeMs: number, mode:SeekMode, callback: AsyncCallback\): void 通过回调方式跳转到指定播放位置。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -992,6 +1044,8 @@ seek(timeMs: number, mode?:SeekMode): Promise\ 通过Promise方式跳转到指定播放位置,如果没有设置mode则跳转到指定时间点的下一个关键帧。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1029,6 +1083,8 @@ setVolume(vol: number, callback: AsyncCallback\): void 通过回调方式设置音量。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1054,6 +1110,8 @@ setVolume(vol: number): Promise\ 通过Promise方式设置音量。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1086,6 +1144,8 @@ release(callback: AsyncCallback\): void 通过回调方式释放视频资源。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1110,6 +1170,8 @@ release(): Promise\ 通过Promise方式释放视频资源。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** | 类型 | 说明 | @@ -1136,6 +1198,8 @@ getTrackDescription(callback: AsyncCallback>)>> 通过Promise方式获取视频轨道信息。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** | 类型 | 说明 | @@ -1212,6 +1278,8 @@ setSpeed(speed:number, callback: AsyncCallback\): void 通过回调方式设置播放速度。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1237,6 +1305,8 @@ setSpeed(speed:number): Promise\ 通过Promise方式设置播放速度。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1263,6 +1333,8 @@ on(type: 'playbackCompleted', callback: Callback\): void 开始监听视频播放完成事件。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1284,6 +1356,8 @@ on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: numbe 开始监听视频缓存更新事件。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1306,6 +1380,8 @@ on(type: 'startRenderFrame', callback: Callback\): void 开始监听视频播放首帧送显上报事件。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1327,6 +1403,8 @@ on(type: 'videoSizeChanged', callback: (width: number, height: number) => void): 开始监听视频播放宽高变化事件。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1349,6 +1427,8 @@ on(type: 'error', callback: ErrorCallback): void 开始监听视频播放错误事件。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1371,14 +1451,14 @@ videoPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 视频播放的状态机,可通过state属性获取当前状态。 -| 名称 | 类型 | 描述 | -| -------- | ------ | -------------- | -| idle | string | 视频播放空闲。 | -| prepared | string | 视频播放准备。 | -| playing | string | 视频正在播放。 | -| paused | string | 视频暂停播放。 | -| stopped | string | 视频播放停止。 | -| error | string | 错误状态。 | +| 名称 | 类型 | 描述 | +| -------- | ------ | ------------------------------------------------------------ | +| idle | string | 视频播放空闲。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| prepared | string | 视频播放准备。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| playing | string | 视频正在播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| paused | string | 视频暂停播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| stopped | string | 视频播放停止。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| error | string | 错误状态。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | ## SeekMode8+ @@ -1386,22 +1466,22 @@ videoPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 | 名称 | 值 | 描述 | | ----------------- | ---- | ------------------------------------------------------------ | -| SEEK_NEXT_SYNC | 0 | 表示跳转到指定时间点的下一个关键帧,建议向后快进的时候用这个枚举值 | -| SEEK_PREV_SYNC | 1 | 表示跳转到指定时间点的上一个关键帧,建议向前快进的时候用这个枚举值 | -| SEEK_CLOSEST_SYNC | 2 | 表示跳转到指定时间点最近的关键帧。 | -| SEEK_CLOSEST | 3 | 表示精确跳转到指定时间点。 | +| SEEK_NEXT_SYNC | 0 | 表示跳转到指定时间点的下一个关键帧,建议向后快进的时候用这个枚举值。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| SEEK_PREV_SYNC | 1 | 表示跳转到指定时间点的上一个关键帧,建议向前快进的时候用这个枚举值。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| SEEK_CLOSEST_SYNC | 2 | 表示跳转到指定时间点最近的关键帧。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| SEEK_CLOSEST | 3 | 表示精确跳转到指定时间点。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | ## PlaybackSpeed8+ 视频播放的倍速枚举,可通过setSpeed方法作为参数传递下去。 -| 名称 | 值 | 描述 | -| -------------------- | ---- | ------------------------------ | -| SPEED_FORWARD_0_75_X | 0 | 表示视频播放正常播速的0.75倍。 | -| SPEED_FORWARD_1_00_X | 1 | 表示视频播放正常播速。 | -| SPEED_FORWARD_1_25_X | 2 | 表示视频播放正常播速的1.25倍。 | -| SPEED_FORWARD_1_75_X | 3 | 表示视频播放正常播速的1.75倍。 | -| SPEED_FORWARD_2_00_X | 4 | 表示视频播放正常播速的2.00倍。 | +| 名称 | 值 | 描述 | +| -------------------- | ---- | ------------------------------------------------------------ | +| SPEED_FORWARD_0_75_X | 0 | 表示视频播放正常播速的0.75倍。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| SPEED_FORWARD_1_00_X | 1 | 表示视频播放正常播速。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| SPEED_FORWARD_1_25_X | 2 | 表示视频播放正常播速的1.25倍。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| SPEED_FORWARD_1_75_X | 3 | 表示视频播放正常播速的1.75倍。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| SPEED_FORWARD_2_00_X | 4 | 表示视频播放正常播速的2.00倍。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | ## MediaDescription8+ @@ -1411,8 +1491,8 @@ videoPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 | 名称 | 类型 | 说明 | | ----- | ------ | ------------------------------------------------------------ | -| key | string | 通过key值获取对应的value。key值具体可见[MediaDescriptionKey](#mediadescriptionkey8)。 | -| value | any | 对应key值得value。其类型可为任意类型,具体key对应value的类型可参考[MediaDescriptionKey](#mediadescriptionkey8)的描述信息。 | +| key | string | 通过key值获取对应的value。key值具体可见[MediaDescriptionKey](#mediadescriptionkey8)。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| value | any | 对应key值得value。其类型可为任意类型,具体key对应value的类型可参考[MediaDescriptionKey](#mediadescriptionkey8)的描述信息。
**系统能力:** SystemCapability.Multimedia.Media.Core | **示例:** @@ -1446,6 +1526,10 @@ prepare(config: AudioRecorderConfig): void 录音准备。 +**需要权限:** ohos.permission.MICROPHONE + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1477,6 +1561,8 @@ start(): void 开始录制,需在[prepare](#audiorecorder_on)事件成功触发后,才能调用start方法。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **示例:** ```js @@ -1492,6 +1578,8 @@ pause():void 暂停录制,需要在[start](#audiorecorder_on)事件成功触发后,才能调用pause方法。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **示例:** ```js @@ -1507,6 +1595,8 @@ resume():void 暂停录制,需要在[pause](#audiorecorder_on)事件成功触发后,才能调用resume方法。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **示例:** ```js @@ -1522,6 +1612,8 @@ stop(): void 停止录音。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **示例:** ```js @@ -1537,6 +1629,8 @@ release(): void 释放录音资源。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **示例:** ```js @@ -1555,6 +1649,8 @@ reset(): void 进行重置录音之前,需要先调用[stop()](#audiorecorder_stop)停止录音。重置录音之后,需要调用[prepare()](#audiorecorder_prepare)设置录音参数项,才能再次进行录音。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **示例:** ```js @@ -1570,6 +1666,8 @@ on(type: 'prepare' | 'start' | 'pause' | 'resume' | 'stop' | 'release' | 'reset' 开始订阅音频录制事件。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1626,6 +1724,8 @@ on(type: 'error', callback: ErrorCallback): void 开始订阅音频录制错误事件。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1650,13 +1750,13 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | 名称 | 参数类型 | 必填 | 说明 | | --------------------- | --------------------------------------- | ---- | ------------------------------------------------------------ | -| audioEncoder | [AudioEncoder](#audioencoder) | 否 | 音频编码格式,默认设置为AAC_LC。 | -| audioEncodeBitRate | number | 否 | 音频编码比特率,默认值为48000。 | -| audioSampleRate | number | 否 | 音频采集采样率,默认值为48000。 | -| numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 | -| format | [AudioOutputFormat](#audiooutputformat) | 否 | 音量输出封装格式,默认设置为MPEG_4。 | -| location8+ | [Location](#location8) | 否 | 音频采集的地理位置。 | -| uri | string | 是 | 视频输出URI:fd://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | +| audioEncoder | [AudioEncoder](#audioencoder) | 否 | 音频编码格式,默认设置为AAC_LC。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| audioEncodeBitRate | number | 否 | 音频编码比特率,默认值为48000。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| audioSampleRate | number | 否 | 音频采集采样率,默认值为48000。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| numberOfChannels | number | 否 | 音频采集声道数,默认值为2。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| format | [AudioOutputFormat](#audiooutputformat) | 否 | 音量输出封装格式,默认设置为MPEG_4。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| location8+ | [Location](#location8) | 否 | 音频采集的地理位置。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| uri | string | 是 | 视频输出URI:fd://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | ## AudioEncoder @@ -1665,11 +1765,11 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | 名称 | 默认值 | 说明 | | ------- | ------ | ------------------------------------------------------------ | -| DEFAULT | 0 | Default audio encoding format is AMR_NB。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_NB | 1 | AMR-NB(Adaptive Multi Rate-Narrow Band Speech Codec) 编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_WB | 2 | AMR-WB(Adaptive Multi Rate-Wide Band Speech Codec) 编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| AAC_LC | 3 | AAC-LC(Advanced Audio Coding Low Complexity)编码格式。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| HE_AAC | 4 | HE_AAC(High-Efficiency Advanced Audio Coding)编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | +| DEFAULT | 0 | Default audio encoding format is AMR_NB。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_NB | 1 | AMR-NB(Adaptive Multi Rate-Narrow Band Speech Codec) 编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_WB | 2 | AMR-WB(Adaptive Multi Rate-Wide Band Speech Codec) 编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AAC_LC | 3 | AAC-LC(Advanced Audio Coding Low Complexity)编码格式。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| HE_AAC | 4 | HE_AAC(High-Efficiency Advanced Audio Coding)编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | ## AudioOutputFormat @@ -1678,11 +1778,11 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | 名称 | 默认值 | 说明 | | -------- | ------ | ------------------------------------------------------------ | -| DEFAULT | 0 | 默认封装格式为MPEG-4。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| MPEG_4 | 2 | 封装为MPEG-4格式。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_NB | 3 | 封装为AMR_NB格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_WB | 4 | 封装为AMR_WB格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | -| AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。
**系统能力:**SystemCapability.Multimedia.Media.AudioRecorder | +| DEFAULT | 0 | 默认封装格式为MPEG-4。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| MPEG_4 | 2 | 封装为MPEG-4格式。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_NB | 3 | 封装为AMR_NB格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_WB | 4 | 封装为AMR_WB格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | ## VideoRecorder8+ @@ -1702,6 +1802,10 @@ prepare(config: VideoRecorderConfig, callback: AsyncCallback\): void; 异步方式进行视频录制的参数设置。通过注册回调函数获取返回值。 +**需要权限:** ohos.permission.MICROPHONE ohos.permission.CAMERA + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1766,6 +1870,10 @@ prepare(config: VideoRecorderConfig): Promise\; 异步方式进行视频录制的参数设置。通过Promise获取返回值。 +**需要权限:** ohos.permission.MICROPHONE ohos.permission.CAMERA + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1837,6 +1945,8 @@ getInputSurface(callback: AsyncCallback\): void; 只能在[prepare()](#videorecorder_prepare1)接口调用后调用。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1868,6 +1978,8 @@ getInputSurface(): Promise\; 只能在[prepare()](#videorecorder_prepare1)接口调用后调用。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** | 类型 | 说明 | @@ -1897,6 +2009,8 @@ start(callback: AsyncCallback\): void; 在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)后调用,需要依赖数据源先给surface传递数据。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1924,6 +2038,8 @@ start(): Promise\; 在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)后调用,需要依赖数据源先给surface传递数据。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** | 类型 | 说明 | @@ -1951,6 +2067,8 @@ pause(callback: AsyncCallback\): void; 在[start()](#videorecorder_start1)后调用。可以通过调用[resume()](#videorecorder_resume1)接口来恢复录制。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -1978,6 +2096,8 @@ pause(): Promise\; 在[start()](#videorecorder_start1)后调用。可以通过调用[resume()](#videorecorder_resume1)接口来恢复录制。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** | 类型 | 说明 | @@ -2003,6 +2123,8 @@ resume(callback: AsyncCallback\): void; 异步方式恢复视频录制。通过注册回调函数获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -2028,6 +2150,8 @@ resume(): Promise\; 异步方式恢复视频录制。通过Promise获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** | 类型 | 说明 | @@ -2055,6 +2179,8 @@ stop(callback: AsyncCallback\): void; 需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -2082,6 +2208,8 @@ stop(): Promise\; 需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** | 类型 | 说明 | @@ -2107,6 +2235,8 @@ release(callback: AsyncCallback\): void; 异步方式释放视频录制资源。通过注册回调函数获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -2132,6 +2262,8 @@ release(): Promise\; 异步方式释放视频录制资源。通过Promise获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** | 类型 | 说明 | @@ -2159,6 +2291,8 @@ reset(callback: AsyncCallback\): void; 需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -2186,6 +2320,8 @@ reset(): Promise\; 需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** | 类型 | 说明 | @@ -2211,6 +2347,8 @@ on(type: 'error', callback: ErrorCallback): void 开始订阅视频录制错误事件。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -2233,14 +2371,14 @@ videoRecorder.on('error', (error) => { // 设置'error'事件回调 视频录制的状态机。可通过state属性获取当前状态。 -| 名称 | 类型 | 描述 | -| -------- | ------ | ---------------------- | -| idle | string | 视频录制空闲。 | -| prepared | string | 视频录制参数设置完成。 | -| playing | string | 视频正在录制。 | -| paused | string | 视频暂停录制。 | -| stopped | string | 视频录制停止。 | -| error | string | 错误状态。 | +| 名称 | 类型 | 描述 | +| -------- | ------ | ------------------------------------------------------------ | +| idle | string | 视频录制空闲。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| prepared | string | 视频录制参数设置完成。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| playing | string | 视频正在录制。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| paused | string | 视频暂停录制。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| stopped | string | 视频录制停止。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| error | string | 错误状态。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | ## VideoRecorderConfig8+ @@ -2248,60 +2386,60 @@ videoRecorder.on('error', (error) => { // 设置'error'事件回调 | 名称 | 参数类型 | 必填 | 说明 | | --------------- | ---------------------------------------------------------- | ---- | ------------------------------------------------------------ | -| audioSourceType | [AudioSourceType](#audiosourcetype8+) | 是 | 视频录制的音频源类型。 | -| videoSourceType | [VideoSourceType](#videosourcetype8+) | 是 | 视频录制的视频源类型。 | -| profile | [VideoRecorderProfile](#videorecorderprofile8+) | 是 | 视频录制的profile。 | -| orientationHint | number | 否 | 录制视频的旋转角度。 | -| location | [Location](#location8) | 否 | 录制视频的地理位置。 | -| url | string | 是 | 视频输出URL:fd://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | +| audioSourceType | [AudioSourceType](#audiosourcetype8+) | 是 | 视频录制的音频源类型。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| videoSourceType | [VideoSourceType](#videosourcetype8+) | 是 | 视频录制的视频源类型。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| profile | [VideoRecorderProfile](#videorecorderprofile8+) | 是 | 视频录制的profile。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| orientationHint | number | 否 | 录制视频的旋转角度。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| location | [Location](#location8) | 否 | 录制视频的地理位置。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| url | string | 是 | 视频输出URL:fd://xx (fd number)
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | ## AudioSourceType8+ 表示视频录制中音频源类型的枚举。 -| 名称 | 值 | 说明 | -| -------------------------- | ---- | ---------------------- | -| AUDIO_SOURCE_TYPE_DEFAULT0 | 0 | 默认的音频输入源类型。 | -| AUDIO_SOURCE_TYPE_MIC | 1 | 表示MIC的音频输入源。 | +| 名称 | 值 | 说明 | +| ------------------------- | ---- | ------------------------------------------------------------ | +| AUDIO_SOURCE_TYPE_DEFAULT | 0 | 默认的音频输入源类型。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| AUDIO_SOURCE_TYPE_MIC | 1 | 表示MIC的音频输入源。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | ## VideoSourceType8+ 表示视频录制中视频源类型的枚举。 -| 名称 | 值 | 说明 | -| ----------------------------- | ---- | ------------------------------- | -| VIDEO_SOURCE_TYPE_SURFACE_YUV | 0 | 输入surface中携带的是raw data。 | -| VIDEO_SOURCE_TYPE_SURFACE_ES | 1 | 输入surface中携带的是ES data。 | +| 名称 | 值 | 说明 | +| ----------------------------- | ---- | ------------------------------------------------------------ | +| VIDEO_SOURCE_TYPE_SURFACE_YUV | 0 | 输入surface中携带的是raw data。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| VIDEO_SOURCE_TYPE_SURFACE_ES | 1 | 输入surface中携带的是ES data。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | ## VideoRecorderProfile8+ 视频录制的配置文件。 -| 名称 | 参数类型 | 必填 | 说明 | -| ---------------- | -------------------------------------------- | ---- | ---------------- | -| audioBitrate | number | 是 | 音频编码比特率。 | -| audioChannels | number | 是 | 音频采集声道数。 | -| audioCodec | [CodecMimeType](#CodecMimeType8) | 是 | 音频编码格式。 | -| audioSampleRate | number | 是 | 音频采样率。 | -| fileFormat | [ContainerFormatType](#containerformattype8) | 是 | 文件的容器格式。 | -| videoCodec | [CodecMimeType](#CodecMimeType8) | 是 | 视频编码格式。 | -| videoFrameWidth | number | 是 | 录制视频帧的宽。 | -| videoFrameHeight | number | 是 | 录制视频帧的高。 | +| 名称 | 参数类型 | 必填 | 说明 | +| ---------------- | -------------------------------------------- | ---- | ------------------------------------------------------------ | +| audioBitrate | number | 是 | 音频编码比特率。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| audioChannels | number | 是 | 音频采集声道数。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| audioCodec | [CodecMimeType](#CodecMimeType8) | 是 | 音频编码格式。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| audioSampleRate | number | 是 | 音频采样率。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| fileFormat | [ContainerFormatType](#containerformattype8) | 是 | 文件的容器格式。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| videoCodec | [CodecMimeType](#CodecMimeType8) | 是 | 视频编码格式。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| videoFrameWidth | number | 是 | 录制视频帧的宽。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| videoFrameHeight | number | 是 | 录制视频帧的高。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | ## ContainerFormatType8+ 表示容器格式类型的枚举,缩写为CFT。 -| 名称 | 值 | 说明 | -| ----------- | ----- | --------------------- | -| CFT_MPEG_4 | "mp4" | 视频的容器格式,MP4。 | -| CFT_MPEG_4A | "m4a" | 音频的容器格式,M4A。 | +| 名称 | 值 | 说明 | +| ----------- | ----- | ------------------------------------------------------------ | +| CFT_MPEG_4 | "mp4" | 视频的容器格式,MP4。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| CFT_MPEG_4A | "m4a" | 音频的容器格式,M4A。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | ## Location8+ 视频录制的地理位置。 -| 名称 | 参数类型 | 必填 | 说明 | -| --------- | -------- | ---- | ---------------- | -| latitude | number | 是 | 地理位置的纬度。 | -| longitude | number | 是 | 地理位置的经度。 | \ No newline at end of file +| 名称 | 参数类型 | 必填 | 说明 | +| --------- | -------- | ---- | ------------------------------------------------------------ | +| latitude | number | 是 | 地理位置的纬度。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| longitude | number | 是 | 地理位置的经度。
**系统能力:** SystemCapability.Multimedia.Media.Core | \ No newline at end of file -- Gitee From f1c07219635e8099fd307afc46c0e0b6611c0b40 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Wed, 2 Mar 2022 16:46:17 +0800 Subject: [PATCH 065/282] add more example Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 585 ++++++++++++------ 1 file changed, 393 insertions(+), 192 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index bc2cd94d4d1..e0b9562cf39 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -15,7 +15,7 @@ function getMediaLibrary(context: Context): MediaLibrary; 获取媒体库。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.GET_BUNDLE_INFO_PRIVILEGED **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -23,7 +23,7 @@ function getMediaLibrary(context: Context): MediaLibrary; | 参数名 | 类型 | 必填 | 说明 | | ------- | ------- | ---- | -------------------- | -| context | Context | 是 | API 8接口此参数是必填参数,传入context,获取媒体库 | +| context | Context | 是 | API 8接口此参数是必填参数,传入Ability实例的context,获取媒体库 | **返回值:** @@ -46,7 +46,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 获取文件资源,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -54,14 +54,27 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe | 参数名 | 类型 | 必填 | 说明 | | -------- | ----------------------------------------------------------- | ---- | --------------------------------- | -| options | MediaFetchOptions | 是 | 媒体获取选项 | +| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体获取选项 | | callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步获取FetchFileResult之后的回调 | **示例:** ``` -medialibrary.getFileAssets(fetchOp, (error, data) => { - // do something +let fileKeyObj = mediaLibrary.FileKey +let imageType = mediaLibrary.MediaType.IMAGE +let imagesfetchOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], +}; +medialibrary.getFileAssets(imagesfetchOp, (error, fetchFileResult) => { + if (fetchFileResult != undefined) { + console.info('MediaLibraryTest : ASSET_CALLBACK fetchFileResult success'); + fetchFileResult.getAllObject((err, fileAssetList) => { + if (fileAssetList != undefined) { + fileAssetList.forEach(getAllObjectInfo); + console.info('MediaLibraryTest : getAllObject :PASS'); + } + }); }); ``` ## medialibrary.getFileAssets @@ -70,7 +83,7 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; 获取文件资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -89,7 +102,13 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; **示例:** ``` -medialibrary.getFileAssets(fileNoArgsfetchOp).then(function(fetchFileResult){ +let fileKeyObj = mediaLibrary.FileKey +let imageType = mediaLibrary.MediaType.IMAGE +let imagesfetchOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], +}; +medialibrary.getFileAssets(imagesfetchOp).then(function(fetchFileResult){ console.info("getFileAssets successfully:"+ JSON.stringify(dir)); }).catch(function(err){ console.info("getFileAssets failed with error:"+ err); @@ -100,9 +119,9 @@ medialibrary.getFileAssets(fileNoArgsfetchOp).then(function(fetchFileResult){ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; -打开媒体文件变更和上线通知,使用callback方式返回异步结果。 +打开媒体媒体库变更通知,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -110,7 +129,7 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型 | +| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
’audioChange‘:  音频文件变更
‘videoChange’:  视频文件变更
‘'fileChange':  文件变更
‘remoteFileChange’: 注册设备上文件变更 | | callback | callback<void> | 是 | 回调返回空 | **示例:** @@ -124,9 +143,11 @@ medialibrary.on('imageChange', () => { off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback?: Callback<void>): void; -关闭媒体文件变更和设备上线通知,使用callback方式返回异步结果。 +关闭媒体媒体库变更通知,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +变更通知类型包括:注册设备变更,相册变更,图片文件变更,音频文件变更,视频文件变更,文件变更,远端文件变更。 + +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -134,7 +155,7 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型 | +| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
’audioChange‘:  音频文件变更
‘videoChange’:  视频文件变更
‘'fileChange':  文件变更
‘remoteFileChange’: 注册设备上文件变更 | | callback | callback<void> | 否 | 回调返回空 | **示例:** @@ -151,25 +172,43 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal 创建媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------------ | -------------------------------------- | ---- | ----------------------------------- | -| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | -| displayName | string | 是 | 展示文件名 | -| relativePath | string | 是 | 相对路径 | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取媒体数据FileAsset之后的回调 | +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | -------------------------------------- | ---- | ------------------------------------------------------------ | +| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | +| displayName | string | 是 | 展示文件名 | +| relativePath | string | 是 | 相对路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | +| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取媒体数据FileAsset之后的回调 | **示例:** ``` -medialibrary.createAsset(mediaType, displayName, rp, (createAssetErr, fileObj) => { - // do something -}); +// 使用Callback方式创建Image类型文件 +let mediaType = mediaLibrary.MediaType.IMAGE; +let path = "Pictures/"; +medialibrary.createAsset(mediaType, “imageCallBack.jpg”, path, (err, albumFetchFileResult) => { + if (albumFetchFileResult != undefined) { + console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets success'); + albumFetchFileResult.getAllObject((err, fileAssetList) => { + if (fileAssetList != undefined) { + fileAssetList.forEach(getAllObjectInfo); + console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 success'); + } else { + console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 fail, message = ' + err); + console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 getFileAssets :No data'); + + } + }); + } else { + console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 fail, message = ' + err); + + } + }); ``` ## medialibrary.createAsset @@ -178,17 +217,17 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr 创建媒体资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------------ | ----------------------- | ---- | ---------- | -| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | -| displayName | string | 是 | 展示文件名 | -| relativePath | string | 是 | 相对路径 | +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | ----------------------- | ---- | ------------------------------------------------------------ | +| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | +| displayName | string | 是 | 展示文件名 | +| relativePath | string | 是 | 相对路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | **返回值** @@ -199,6 +238,9 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr **示例:** ``` +// 使用Promise方式创建Image类型文件 +let mediaType = mediaLibrary.MediaType.IMAGE; +let path = "Pictures/"; medialibrary.createAsset(mediaType, "image01.jpg", path).then(function(asset){ console.info("createAsset successfully:"+ JSON.stringify(asset)); }).catch(function(err){ @@ -212,7 +254,7 @@ deleteAsset(uri: string, callback: AsyncCallback<void>): void; 删除媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -237,7 +279,7 @@ deleteAsset(uri: string): Promise<void>; 删除媒体资源,使用promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -263,13 +305,79 @@ medialibrary.deleteAsset(asset.uri).then(()=>{ }); ``` +## medialibrary.getPublicDirectory + +getPublicDirectory(type: DirectoryType, callback: AsyncCallback): void; + +获取公共目录路径 + +**需要权限**:无 + +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------- | ---- | ------------ | +| type | [DirectoryType](#DirectoryType) | 是 | 公共目录类型 | +| callback |AsyncCallback<string> | 是 | callback 返回公共目录路径 | + + +**示例:** + +``` +let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; +media.getPublicDirectory(DIR_CAMERA,(err, dicResult) => { + if (dicResult == 'camera/') { + console.info('MediaLibraryTest : getPublicDirectory 001 passed'); + } else { + console.info('MediaLibraryTest : getPublicDirectory 001 failed'); + + } +}); +``` + +## medialibrary.getPublicDirectory + +getPublicDirectory(type: DirectoryType): Promise; + +获取公共目录路径 + +**需要权限**:无 + +**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------- | ---- | ------------ | +| type | [DirectoryType](#DirectoryType) | 是 | 公共目录类型 | + +**返回值:** + +| 类型 | 说明 | +| --------------- | ---------------- | +| Promise | 返回公共目录路径 | + +**示例:** + +``` +let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; +const dicResult = await media.getPublicDirectory(DIR_CAMERA); +if (dicResult == 'camera/') { + console.info('MediaLibraryTest : getPublicDirectory 001 passed'); +} else { + console.info('MediaLibraryTest : getPublicDirectory 001 failed'); +} +``` + ## medialibrary.getAlbums getAlbums(options: MediaFetchOptions, callback: AsyncCallback): void; 获取实体相册,使用callback 方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -292,7 +400,7 @@ getAlbums(options: MediaFetchOptions): Promise; 获取实体相册,使用 promise 方式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -322,9 +430,9 @@ medialibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ getActivePeers(callback: AsyncCallback): void; -获取活动对端设备 +获取活动注册设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -346,9 +454,9 @@ medialibrary.getActivePeers((err, data) => { getActivePeers(): Promise; -获取活动对端设备 +获取活动注册设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -370,9 +478,9 @@ peerInfoList = medialibrary.getActivePeers(); getAllPeers(callback: AsyncCallback): void; -获取所有对端设备 +获取所有注册设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -394,9 +502,9 @@ medialibrary.getAllPeers((err, data) => { getAllPeers(): Promise; -获取所有对端设备 +获取所有注册设备 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -416,7 +524,7 @@ release(callback: AsyncCallback<void>): void; 释放MediaLibrary实例 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -438,9 +546,9 @@ medialibrary.release((err, data) => { release(): Promise<void>; -释放MediaLibrary实例 +释放MediaLibrary实例 (补充说明) -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -462,7 +570,7 @@ isDirectory(callback: AsyncCallback<boolean>): void; 判断fileAsset是否为目录,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -486,7 +594,7 @@ isDirectory():Promise<boolean>; 判断fileAsset是否为目录,使用Promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -512,7 +620,7 @@ commitModify(callback: AsyncCallback<void>): void; 修改文件的元数据,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -525,9 +633,18 @@ commitModify(callback: AsyncCallback<void>): void; **示例:** ``` -asset.commitModify(function(err){ - // do something -}); +asset.title = ‘newtitle'; +asset.commitModify(commitModifyCallBack); +function commitModifyCallBack(err, commitModify) { + if (commitModify != undefined) { + console.info('MediaLibraryTest : ASSET_CALLBACK commitModify success'); + + } else { + console.info('MediaLibraryTest : ASSET_CALLBACK commitModify Unsuccessfull = ' + err); + + } + +} ``` ## FileAsset.commitModify @@ -536,7 +653,7 @@ commitModify(): Promise<void>; 修改文件的元数据,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -549,10 +666,8 @@ commitModify(): Promise<void>; **示例:** ``` -asset.commitModify(commitModifyCallBack); -function commitModifyCallBack(err, commitModify) { - // do something -} +asset.title = ‘newtitle'; +asset.commitModify(); ``` ## FileAsset.open @@ -561,7 +676,7 @@ open(mode: string, callback: AsyncCallback<number>): void; 打开当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -569,14 +684,21 @@ open(mode: string, callback: AsyncCallback<number>): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| mode | string | 是 | 打开文件方式 | +| mode | string | 是 | 打开文件方式,如:'r', 'w', 'rw' | | callback | AsyncCallback<number> | 是 | 回调返回文件句柄 | **示例:** ``` -asset.open('Rw').then((openError, fd) => { - // do something +let mediaType = mediaLibrary.MediaType.IMAGE; +let path = "Pictures/"; +asset = await media.createAsset(mediaType, "image00003.jpg", path); +asset.open('rw', (openError, fd) => { + if(fd > 0){ + asset.close(fd); + }else{ + console.info('File Open Failed!' + openError); + } }); ``` @@ -586,15 +708,15 @@ open(mode: string): Promise<number>; 打开当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | ------------ | -| mode | string | 是 | 打开文件方式 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | -------------------------------- | +| mode | string | 是 | 打开文件方式,如:'r', 'w', 'rw' | **返回值:** @@ -605,8 +727,15 @@ open(mode: string): Promise<number>; **示例:** ``` -asset.open('Rw').then((openError, fd) => { - // do something +let mediaType = mediaLibrary.MediaType.IMAGE; +let path = "Pictures/"; +asset = await media.createAsset(mediaType, "image00003.jpg", path); +asset.open('rw').then((openError, fd) => { + if(fd > 0){ + asset.close(fd); + }else{ + console.info('File Open Failed!' + openError); + } }); ``` @@ -616,7 +745,7 @@ close(fd: number, callback: AsyncCallback<void>): void; 关闭当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -630,8 +759,14 @@ close(fd: number, callback: AsyncCallback<void>): void; **示例:** ``` -fileAsset.close(fd).then((closeErr) => { - // do something +fileAsset.close(fd, (closeErr) => { + if (closeErr != undefined) { + console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + } else { + console.info("=======asset.close success====>"); + + } }); ``` @@ -641,7 +776,7 @@ close(fd: number): Promise<void>; 关闭当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -661,7 +796,13 @@ close(fd: number): Promise<void>; ``` fileAsset.close(fd).then((closeErr) => { - // do something + if (closeErr != undefined) { + console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + + } else { + console.info("=======asset.close success====>"); + } }); ``` @@ -671,7 +812,7 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -684,7 +825,7 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -data1.getThumbnail(size, (err, pixelmap) => { +fileAsset.getThumbnail((err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); ``` @@ -695,7 +836,7 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,传入缩略图尺寸,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -709,7 +850,7 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -data1.getThumbnail(size, (err, pixelmap) => { +fileAsset.getThumbnail(size, (err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); ``` @@ -720,7 +861,7 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; 获取文件的缩略图,传入缩略图尺寸,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -739,7 +880,7 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; **示例:** ``` -data1.getThumbnail(size, (err, pixelmap) => { +fileAsset.getThumbnail(size, (err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); ``` @@ -750,7 +891,7 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; 将文件设置为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -758,7 +899,7 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; | 参数名 | 类型 | 必填 | 说明 | | ---------- | ------------------- | ---- | -------------- | -| isFavorite | boolean | 是 | 是否为收藏文件 | +| isFavorite | boolean | 是 | 是否设置为收藏文件, true:设置为收藏文件,false:取消收藏 | | callback | AsyncCallback<void> | 是 | 回调返回空 | **示例:** @@ -775,15 +916,15 @@ favorite(isFavorite: boolean): Promise<void>; 将文件设置为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ---------- | ------- | ---- | -------------- | -| isFavorite | boolean | 是 | 是否为收藏文件 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------- | ---- | --------------------------------------------------------- | +| isFavorite | boolean | 是 | 是否设置为收藏文件, true:设置为收藏文件,false:取消收藏 | **返回值:** @@ -807,7 +948,7 @@ isFavorite(callback: AsyncCallback<boolean>): void; 判断该文件是否为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -820,8 +961,12 @@ isFavorite(callback: AsyncCallback<boolean>): void; **示例:** ``` -asset.favorite(true, (err) => { - // do something +asset.isFavorite((err, isFavorite) => { + if (isFavorite) { + console.info('FileAsset is favorite'); + }else{ + console.info('FileAsset is not favorite'); + } }); ``` @@ -831,7 +976,7 @@ isFavorite():Promise<boolean>; 判断该文件是否为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -857,7 +1002,9 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; 当文件被定位时,将文件放到垃圾文件夹,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 + +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -865,15 +1012,17 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| isTrash | boolean | 是 | 是否为收藏文件 | +| isTrash | boolean | 是 | 是否设置为垃圾文件 | | callback | AsyncCallback<void> | 是 | 回调返回空 | **示例:** ``` -asset.trash(true, (err) => { - // do something -}); +asset.trash(true, trashCallBack); +function trashCallBack(err, trash) { + console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); + +} ``` ## FileAsset.trash @@ -882,15 +1031,17 @@ trash(isTrash: boolean,): Promise<void>; 当文件被定位时,将文件放到垃圾文件夹,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 + +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------- | ------- | ---- | -------------- | -| isTrash | boolean | 是 | 是否放入回收站 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------- | ---- | ------------------ | +| isTrash | boolean | 是 | 是否设置为垃圾文件 | **返回值:** @@ -914,7 +1065,7 @@ isTrash(callback: AsyncCallback<boolean>): void; 当文件被定位,判断文件是否为垃圾文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -927,9 +1078,18 @@ isTrash(callback: AsyncCallback<boolean>): void; **示例:** ``` -asset.isTrash((err, isTrash) => { - // do something -}); +asset.isTrash(isTrashCallBack); +function isTrashCallBack(err, isTrash) { + if (isTrash == true) { + console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash); + asset.trash(true, trashCallBack); + + } else { + console.info('MediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err); + console.info('MediaLibraryTest : ASSET_CALLBACK isTrash : FAIL'); + + } +} ``` ## FileAsset.isTrash @@ -938,7 +1098,7 @@ isTrash():Promise<boolean>; 当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -968,7 +1128,7 @@ getCount(): number; 获取文件检索结果中的文件总数。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -981,7 +1141,14 @@ getCount(): number; **示例**: ``` -var resultnum = FetchFileResult.getCount(); +let getFileCountOneOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [fileType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,1", +}; +let fetchFileResult = await media.getFileAssets(getFileCountOneOp); +const fetchCount = fetchFileResult.getCount(); ``` ## FetchFileResult.isAfterLast @@ -990,7 +1157,7 @@ isAfterLast(): boolean; 检查结果集是否指向最后一行。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1003,7 +1170,21 @@ isAfterLast(): boolean; **示例**: ``` -var result = FetchFileResult.isAfterLast(); +let fetchFileResult = await media.getFileAssets(getFileCountTenOp); +const fetchCount = fetchFileResult.getCount(); +console.info('MediaLibraryTest : count:' + fetchCount); +let fileAsset = await fetchFileResult.getFirstObject(); +for (var i = 1; i < fetchCount; i++) { + fileAsset = await fetchFileResult.getNextObject(); + if(i == fetchCount - 1) { + console.info('MediaLibraryTest : isLast'); + var result = fetchFileResult.isAfterLast(); + console.info('MediaLibraryTest : isAfterLast:' + result); + console.info('MediaLibraryTest : isAfterLast end'); + fetchFileResult.close(); + + } +} ``` ## FetchFileResult.close @@ -1012,14 +1193,15 @@ close(): void; 释放 FetchFileResult 实例并使其失效。无法调用其他方法。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **示例**: ``` -var result = FetchFileResult.close(); +let fetchFileResult = await media.getFileAssets(getFileCountTenOp); +fetchFileResult.close(); ``` ## FetchFileResult.getFirstObject @@ -1028,7 +1210,7 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的第一个文件资产。此方法使用回调返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1056,7 +1238,7 @@ getFirstObject(): Promise<FileAsset>; 获取文件检索结果中的第一个文件资产。此方法使用返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1083,7 +1265,7 @@ queryResultSet_.getFirstObject().then(function(fileAsset){ 获取文件检索结果中的下一个文件资产。此方法使用callback形式返回结果。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1111,7 +1293,7 @@ data.getNextObject((err, value) => { 获取文件检索结果中的下一个文件资产。此方法使用promise方式来异步返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1124,7 +1306,10 @@ data.getNextObject((err, value) => { **示例**: ``` -var result = FetchFileResult.getNextObject +let fetchFileResult = await media.getFileAssets(getFileCountTenOp); +const fetchCount = fetchFileResult.getCount(); +console.info('MediaLibraryTest : count:' + fetchCount); +fileAsset = await fetchFileResult.getNextObject(); ``` ## FetchFileResult.getLastObject @@ -1133,7 +1318,7 @@ getLastObject(callback: AsyncCallback<FileAsset>): void; 获取文件检索结果中的最后一个文件资产。此方法使用callback回调来返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1161,7 +1346,7 @@ getLastObject(): Promise<FileAsset>; 获取文件检索结果中的最后一个文件资产。此方法使用Promise方式来返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1174,7 +1359,15 @@ getLastObject(): Promise<FileAsset>; **示例**: ``` -var result = FetchFileResult.getLastObject() +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +let lastObject = await fetchFileResult.getLastObject(); ``` ## FetchFileResult.getPositionObject @@ -1183,7 +1376,7 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void 获取文件检索结果中具有指定索引的文件资产。此方法使用回调来返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1191,7 +1384,7 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void | 参数 | 类型 | 必填 | 说明 | | -------- | -------------------------------------------- | ---- | --------------------------- | -| index | number | 是 | 要获取的文件的索引 | +| index | number | 是 | 要获取的文件的索引,从0开始 | | callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调 | **示例**: @@ -1212,7 +1405,7 @@ getPositionObject(index: number): Promise<FileAsset>; 获取文件检索结果中具有指定索引的文件资产。此方法使用Promise形式返回文件Asset。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1220,7 +1413,7 @@ getPositionObject(index: number): Promise<FileAsset>; | 参数 | 类型 | 必填 | 说明 | | ----- | ------ | ---- | -------------------- | -| index | number | 是 | 要获取的文件在结果集中的位置 | +| index | number | 是 | 要获取的文件的索引,从0开始 | **返回值**: @@ -1246,7 +1439,7 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; 获取文件检索结果中的所有文件资产。此方法使用Callback回调来返回FileAsset结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1274,7 +1467,7 @@ getAllObject(): Promise<Array<FileAsset>>; 获取文件检索结果中的所有文件资产。此方法使用Promise来返回FileAsset结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1287,7 +1480,15 @@ getAllObject(): Promise<Array<FileAsset>>; **示例**: ``` -var data = FetchFileResult.getAllObject(); +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +var data = fetchFileResult.getAllObject(); ``` ## Album.commitModify @@ -1296,7 +1497,7 @@ commitModify(callback: AsyncCallback<void>): void; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1325,7 +1526,7 @@ commitModify(): Promise<void>; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1352,7 +1553,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 按照检索条件获取相册中的文件。此方法使用Callback回调来返回文件结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1379,7 +1580,7 @@ function getFileAssetsCallBack(err, fetchFileResult) { 按照检索条件获取相册中的文件。此方法使用异步回调来返回文件结果集。 -**需要权限**:ohos.permission.MEDIA_LOCATION,ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE,ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:ohos.permission.MEDIA_READ **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1407,12 +1608,12 @@ album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ ## PeerInfo -对端设备信息。 +注册设备信息。 | 名称 | 类型 | 可读 | 可写 | 说明 | | ---------- | ---------- | ---- | ---- | -------------- | -| deviceName | string | 是 | 否 | 设备名称 | -| networkId | string | 是 | 否 | 对端设备网络ID | +| deviceName | string | 是 | 否 | 注册设备名称 | +| networkId | string | 是 | 否 | 注册设备网络ID | | deviceType | DeviceType | 是 | 否 | 设备类型 | | isOnline | boolean | 是 | 否 | 是否在线 | @@ -1421,29 +1622,29 @@ FileAsset **属性:** -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------------ | --------- | ---- | ---- | ------------ | -| id | number | 是 | 否 | 文件资源编号 | -| uri | string | 是 | 否 | 文件资源uri | -| mimeType | string | 是 | 否 | 文件扩展 | -| mediaType | MediaType | 是 | 否 | 媒体类型 | -| displayName | string | 是 | 是 | 显示文件名 | -| title | string | 是 | 是 | 文件标题 | -| relativePath | string | 是 | 是 | 相对路径 | -| parent | number | 是 | 否 | 父目录id | -| size | number | 是 | 否 | 文件大小 | -| dateAdded | number | 是 | 否 | 添加日期 | -| dateModified | number | 是 | 否 | 修改日期 | -| dateTaken | number | 是 | 否 | 拍摄日期 | -| artist | string | 是 | 否 | 创建者 | -| audioAlbum | string | 是 | 否 | 音频相册 | -| width | number | 是 | 否 | 图片宽度 | -| height | number | 是 | 否 | 图片高度 | -| orientation | number | 是 | 是 | 图片方向 | -| duration | number | 是 | 否 | 持续时间 | -| albumId | number | 是 | 否 | 相册编号 | -| albumUri | string | 是 | 否 | 相册uri | -| albumName | string | 是 | 否 | 相册名称 | +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------ | --------- | ---- | ---- | ------------------------------------------------------ | +| id | number | 是 | 否 | 文件资源编号 | +| uri | string | 是 | 否 | 文件资源uri(如:dataability:///media/image/2) | +| mimeType | string | 是 | 否 | 文件扩展属性 | +| mediaType | MediaType | 是 | 否 | 媒体类型 | +| displayName | string | 是 | 是 | 显示文件名 | +| title | string | 是 | 是 | 文件标题 | +| relativePath | string | 是 | 是 | 相对路径 | +| parent | number | 是 | 否 | 父目录id | +| size | number | 是 | 否 | 文件大小(单位:字节) | +| dateAdded | number | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | +| dateModified | number | 是 | 否 | 修改日期(修改文件时间到1970年1月1日的秒数值) | +| dateTaken | number | 是 | 否 | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | +| artist | string | 是 | 否 | 作者 | +| audioAlbum | string | 是 | 否 | 专辑 | +| width | number | 是 | 否 | 图片宽度(单位:像素) | +| height | number | 是 | 否 | 图片高度(单位:像素) | +| orientation | number | 是 | 是 | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | +| duration | number | 是 | 否 | 持续时间(单位:秒) | +| albumId | number | 是 | 否 | 文件所归属的相册编号 | +| albumUri | string | 是 | 否 | 文件所归属相册uri | +| albumName | string | 是 | 否 | 文件所归属相册名称 | Album --------- @@ -1454,8 +1655,8 @@ Album | 名称 | 参数型 | 可读 | 可写 | 说明 | | ------------ | ------ | ---- | ---- | -------------- | -| albumId | number | 是 | 否 | 相册ID | -| albumName | string | 是 | 是 | 相册名 | +| albumId | number | 是 | 否 | 相册编号 | +| albumName | string | 是 | 是 | 相册名称 | | albumUri | string | 是 | 否 | 相册Uri | | dateModified | number | 是 | 否 | 修改日期 | | count | number | 是 | 否 | 相册中文件数量 | @@ -1479,45 +1680,45 @@ FileKey 枚举,文件关键信息。 -| 名称 | 默认值 | 可读 | 可写 | 描述 | -| ------------- | ------------------- | ---- | ---- | ------------------ | -| ID | file_id | 是 | 否 | 文件编号 | -| RELATIVE_PATH | relative_path | 是 | 是 | 相对路径 | -| DISPLAY_NAME | display_name | 是 | 是 | 显示名字 | -| PARENT | parent | 是 | 否 | 父目录 | -| MIME_TYPE | mime_type | 是 | 否 | 该资源的媒体类型 | -| MEDIA_TYPE | media_type | 是 | 否 | 媒体类型 | -| SIZE | size | 是 | 否 | 文件大小 | -| DATE_ADDED | date_added | 是 | 否 | 添加日期 | -| DATE_MODIFIED | date_modified | 是 | 否 | 修改日期 | -| DATE_TAKEN | date_taken | 是 | 否 | 表示拍摄日期 | -| TITLE | title | 是 | 是 | 表示标题 | -| ARTIST | artist | 是 | 否 | 创建者 | -| AUDIOALBUM | audio_album | 是 | 否 | 表示音频相册 | -| DURATION | duration | 是 | 否 | 表示媒体文件时长 | -| WIDTH | width | 是 | 否 | 表示图片宽 | -| HEIGHT | height | 是 | 否 | 表示图片高 | -| ORIENTATION | orientation | 是 | 否 | 图片显示方向 | -| ALBUM_ID | bucket_id | 是 | 否 | 媒体文件所在相册ID | -| ALBUM_NAME | bucket_display_name | 是 | 否 | 媒体文件所在相册名 | +| 名称 | 默认值 | 可读 | 可写 | 描述 | +| ------------- | ------------------- | ---- | ---- | ------------------------------------------------------ | +| ID | file_id | 是 | 否 | 文件编号 | +| RELATIVE_PATH | relative_path | 是 | 是 | 相对路径 | +| DISPLAY_NAME | display_name | 是 | 是 | 显示名字 | +| PARENT | parent | 是 | 否 | 父目录id | +| MIME_TYPE | mime_type | 是 | 否 | 文件扩展属性 | +| MEDIA_TYPE | media_type | 是 | 否 | 媒体类型 | +| SIZE | size | 是 | 否 | 文件大小 | +| DATE_ADDED | date_added | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | +| DATE_MODIFIED | date_modified | 是 | 否 | 修改日期(修改文件时间到1970年1月1日的秒数值) | +| DATE_TAKEN | date_taken | 是 | 否 | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | +| TITLE | title | 是 | 是 | 文件标题 | +| ARTIST | artist | 是 | 否 | 作者 | +| AUDIOALBUM | audio_album | 是 | 否 | 专辑 | +| DURATION | duration | 是 | 否 | 持续时间(单位:秒) | +| WIDTH | width | 是 | 否 | 图片宽度(单位:像素) | +| HEIGHT | height | 是 | 否 | 图片高度(单位:像素) | +| ORIENTATION | orientation | 是 | 否 | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | +| ALBUM_ID | bucket_id | 是 | 否 | 文件所归属的相册编号 | +| ALBUM_NAME | bucket_display_name | 是 | 否 | 文件所归属相册名称 | DirectoryType ------------- 枚举,目录类型。 -| 名称 | 默认值 | 描述 | -| ---------------------- | ------ | ---------------- | -| DIR_CDSA | 0 | 表示CDSA规范路径 | -| DIR_VIDEO | 1 | 表示视频路径 | -| DIR_IMAGE | 2 | 表示图片路径 | -| DIR_AUDIO | 3 | 表示音频路径 | -| DIR_AUDIO_RINGS | 4 | 表示铃声音频路径 | -| DIR_AUDIO_NOTICE | 5 | 表示提示音频路径 | -| DIR_AUDIO_CLOCK | 6 | 表示时钟音频路径 | -| DIR_DOCUMENTS | 7 | 表示文档路径 | -| DIR_DOWNLOAD | 8 | 表示下载路径 | -| DIR_DOWNLOAD_BLUETOOTH | 9 | 表示蓝牙下载路径 | +| 名称 | 默认值 | 描述 | +| ---------------------- | ------ | ------------------ | +| DIR_CAMERA | 0 | 表示Camera文件路径 | +| DIR_VIDEO | 1 | 表示视频路径 | +| DIR_IMAGE | 2 | 表示图片路径 | +| DIR_AUDIO | 3 | 表示音频路径 | +| DIR_AUDIO_RINGS | 4 | 表示铃声音频路径 | +| DIR_AUDIO_NOTICE | 5 | 表示提示音频路径 | +| DIR_AUDIO_CLOCK | 6 | 表示时钟音频路径 | +| DIR_DOCUMENTS | 7 | 表示文档路径 | +| DIR_DOWNLOAD | 8 | 表示下载路径 | +| DIR_DOWNLOAD_BLUETOOTH | 9 | 表示蓝牙下载路径 | DeviceType ----------- @@ -1544,15 +1745,15 @@ DeviceType | selectionArgs | Array | 是 | 是 | 检索条件的值 | | order | string | 是 | 是 | 检索结果排序方式 | | uri | string | 是 | 是 | 文件URI | -| networkId | string | 是 | 是 | 对端设备网络ID | +| networkId | string | 是 | 是 | 注册设备网络ID | | extendArgs | string | 是 | 是 | 扩展的检索参数 | ## Size 图片尺寸。 -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------ | ------ | ---- | ---- | ---- | -| width | number | 是 | 是 | 宽 | -| height | number | 是 | 是 | 高 | +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------ | ------ | ---- | ---- | ---------------- | +| width | number | 是 | 是 | 宽(单位:像素) | +| height | number | 是 | 是 | 高(单位:像素) | -- Gitee From b44aeb9605212d1d35cada01fa8c36002361c6d0 Mon Sep 17 00:00:00 2001 From: chyyy0213 Date: Wed, 2 Mar 2022 17:12:17 +0800 Subject: [PATCH 066/282] modify interface use Signed-off-by: chyyy0213 Change-Id: I054d7d9faea79bec3d2a6237d625104f521fc994 --- .../reference/apis/js-apis-window.md | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-window.md b/zh-cn/application-dev/reference/apis/js-apis-window.md index 0e14e726a69..5f991416a93 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-window.md +++ b/zh-cn/application-dev/reference/apis/js-apis-window.md @@ -147,7 +147,7 @@ create(id: string, type: WindowType, callback: AsyncCallback<Window>): voi ``` window.create("first", window.WindowType.TYPE_APP, (err, data) => { windowClass = data; - if (err) { + if (err.code) { console.error('Failed to create the subWindow. Cause: ' + JSON.stringify(err)); return; } @@ -210,7 +210,7 @@ create(ctx: Context, id: string, type: WindowType, callback: AsyncCallback<Wi ``` window.create(this.context, "alertWindow", window.WindowType.TYPE_SYSTEM_ALERT, (err, data) => { windowClass = data; - if (err) { + if (err.code) { console.error('Failed to create the Window. Cause: ' + JSON.stringify(err)); return; } @@ -271,7 +271,7 @@ find(id: string, callback: AsyncCallback<Window>): void ``` window.find("first", (err, data) => { - if (err) { + if (err.code) { console.error('Failed to find the Window. Cause: ' + JSON.stringify(err)); return; } @@ -329,7 +329,7 @@ getTopWindow(callback: AsyncCallback<Window>): void ``` window.getTopWindow((err, data) => { - if (err) { + if (err.code) { console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err)); return; } @@ -382,7 +382,7 @@ getTopWindow(ctx: Context, callback: AsyncCallback<Window>): void ``` window.getTopWindow(this.context, (err, data) => { - if (err) { + if (err.code) { console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err)); return; } @@ -490,7 +490,7 @@ hide (callback: AsyncCallback<void>): void ``` windowClass.hide((err) => { - if (err) { + if (err.code) { console.error('Failed to hide the window. Cause: ' + JSON.stringify(err)); return; } @@ -541,7 +541,7 @@ show(callback: AsyncCallback<void>): void ``` windowClass.show((err) => { - if (err) { + if (err.code) { console.error('Failed to show the window. Cause: ' + JSON.stringify(err)); return; } @@ -592,7 +592,7 @@ destroy(callback: AsyncCallback<void>): void ``` windowClass.destroy((err) => { - if (err) { + if (err.code) { console.error('Failed to destroy the window. Cause:' + JSON.stringify(err)); return; } @@ -645,7 +645,7 @@ moveTo(x: number, y: number, callback: AsyncCallback<void>): void ``` windowClass.moveTo(300, 300, (err)=>{ - if (err) { + if (err.code) { console.error('Failed to move the window. Cause:' + JSON.stringify(err)); return; } @@ -706,7 +706,7 @@ resetSize(width: number, height: number, callback: AsyncCallback<void>): v ``` windowClass.resetSize(500, 1000, (err) => { - if (err) { + if (err.code) { console.error('Failed to change the window size. Cause:' + JSON.stringify(err)); return; } @@ -766,7 +766,7 @@ setWindowType(type: WindowType, callback: AsyncCallback<void>): void ``` var type = window.TYPE_APP; windowClass.setWindowType(type, (err) => { - if (err) { + if (err.code) { console.error('Failed to set the window type. Cause: ' + JSON.stringify(err)); return; } @@ -824,7 +824,7 @@ getProperties(callback: AsyncCallback<WindowProperties>): void ``` windowClass.getProperties((err, data) => { - if (err) { + if (err.code) { console.error('Failed to obtain the window properties. Cause: ' + JSON.stringify(err)); return; } @@ -877,7 +877,7 @@ getAvoidArea(type: AvoidAreaType, callback: AsyncCallback<AvoidArea>): voi ``` var type = window.AvoidAreaType.TYPE_SYSTEM; windowClass.getAvoidArea(type, (err, data) => { - if (err) { + if (err.code) { console.error('Failed to obtain the area. Cause:' + JSON.stringify(err)); return; } @@ -936,7 +936,7 @@ setFullScreen(isFullScreen: boolean, callback: AsyncCallback<void>): void ``` var isFullScreen = true; windowClass.setFullScreen(isFullScreen, (err) => { - if (err) { + if (err.code) { console.error('Failed to enable the full-screen mode. Cause: ' + JSON.stringify(err)); return; } @@ -996,7 +996,7 @@ setLayoutFullScreen(isLayoutFullScreen: boolean, callback: AsyncCallback<void ``` var isLayoutFullScreen= true; windowClass.setLayoutFullScreen(isLayoutFullScreen, (err) => { - if (err) { + if (err.code) { console.error('Failed to set the window layout to full-screen mode. Cause:' + JSON.stringify(err)); return; } @@ -1056,7 +1056,7 @@ setSystemBarEnable(names: Array<'status' | 'navigation'>, callback: AsyncCallbac ``` var names = ["status", "navigation"]; windowClass.setSystemBarEnable(names, (err) => { - if (err) { + if (err.code) { console.error('Failed to set the system bar to be visible. Cause:' + JSON.stringify(err)); return; } @@ -1125,7 +1125,7 @@ setSystemBarProperties(systemBarProperties: SystemBarProperties, callback: Async navigationBarContentColor:'#00ffff' }; windowClass.setSystemBarProperties(SystemBarProperties, (err) => { - if (err) { + if (err.code) { console.error('Failed to set the system bar properties. Cause: ' + JSON.stringify(err)); return; } @@ -1194,7 +1194,7 @@ loadContent(path: string, storage: ContentStorage, callback: AsyncCallback<vo ``` windowClass.loadContent("pages/page2/page2", (err) => { - if (err) { + if (err.code) { console.error('Failed to load the content. Cause:' + JSON.stringify(err)); return; } @@ -1252,7 +1252,7 @@ isShowing(callback: AsyncCallback<boolean>): void ``` windowClass.isShowing((err) => { - if (err) { + if (err.code) { console.error('Failed to check whether the window is showing. Cause:' + JSON.stringify(err)); return; } @@ -1349,7 +1349,7 @@ isSupportWideGamut(callback: AsyncCallback<boolean>): void ``` windowClass.isSupportWideGamut((err) => { - if (err) { + if (err.code) { console.error('Failed to check whether the window support WideGamut. Cause:' + JSON.stringify(err)); return; } @@ -1401,7 +1401,7 @@ setColorSpace(colorSpace:ColorSpace, callback: AsyncCallback<void>): void ``` windowClass.setColorSpace(window.ColorSpace.WIDE_GAMUT, (err) => { - if (err) { + if (err.code) { console.error('Failed to set window colorspace. Cause:' + JSON.stringify(err)); return; } @@ -1458,7 +1458,7 @@ getColorSpace(callback: AsyncCallback<ColorSpace>): void ``` windowClass.getColorSpace((err, data) => { - if (err) { + if (err.code) { console.error('Failed to get window color space. Cause:' + JSON.stringify(err)); return; } -- Gitee From 20d5f62c2baa76ee47429fc7e8c2ec8702ca8bd1 Mon Sep 17 00:00:00 2001 From: j30012456 Date: Wed, 2 Mar 2022 17:33:43 +0800 Subject: [PATCH 067/282] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: j30012456 --- zh-cn/application-dev/reference/apis/js-apis-hidebug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-hidebug.md b/zh-cn/application-dev/reference/apis/js-apis-hidebug.md index 26465fc2235..a1afa0de305 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-hidebug.md +++ b/zh-cn/application-dev/reference/apis/js-apis-hidebug.md @@ -107,7 +107,7 @@ getSharedDirty(): bigint - 示例: ``` - let sharedDirty = hidebug.getSharedDirty()); + let sharedDirty = hidebug.getSharedDirty(); ``` -- Gitee From a26bcd5190f5b4200570eb38cda5a866f5d4e559 Mon Sep 17 00:00:00 2001 From: wuliubao Date: Wed, 2 Mar 2022 19:16:49 +0800 Subject: [PATCH 068/282] =?UTF-8?q?IssueNo:#I4VUID=20Description:=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E7=AE=A1=E7=90=86=E8=B5=84=E6=96=99syscap=E6=94=B9?= =?UTF-8?q?=E9=80=A0=20Sig:=20SIG=5FApplicationFramework=20Feature=20or=20?= =?UTF-8?q?Bugfix:=20Feature=20Binary=20Source:=20No?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wuliubao --- .../reference/apis/js-apis-Context.md | 78 ++++++++- .../reference/apis/js-apis-ability-context.md | 60 +++++++ .../apis/js-apis-dataAbilityHelper.md | 96 +++++++++++ .../reference/apis/js-apis-eventhub.md | 12 ++ .../apis/js-apis-extension-context.md | 2 +- .../apis/js-apis-extensionrunninginfo.md | 34 ++-- .../reference/apis/js-apis-featureAbility.md | 154 +++++++++++++----- .../reference/apis/js-apis-particleAbility.md | 110 +++++++++---- .../apis/js-apis-permissionrequestresult.md | 4 +- .../apis/js-apis-processrunninginfo.md | 8 +- .../apis/js-apis-service-extension-context.md | 36 +++- .../apis/js-apis-service-extension.md | 20 +++ .../apis/js-apis-uripermissionmanager.md | 8 + 13 files changed, 515 insertions(+), 107 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-Context.md b/zh-cn/application-dev/reference/apis/js-apis-Context.md index 1d16cea627d..a2126d2e059 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-Context.md +++ b/zh-cn/application-dev/reference/apis/js-apis-Context.md @@ -25,6 +25,10 @@ getOrCreateLocalDir(callback: AsyncCallback\): void 如果是第一次调用,将创建目录。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** @@ -52,6 +56,10 @@ getOrCreateLocalDir(): Promise\ 如果是第一次调用,将创建目录。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **返回值:** | 类型 | 说明 | @@ -76,6 +84,10 @@ verifyPermission(permission: string, options: PermissionOptions, callback: Async 验证系统中运行的特定pid和uid是否允许指定的权限(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** @@ -126,6 +138,10 @@ verifyPermission(permission: string, options?: PermissionOptions): Promise\, requestCode: number, res 从系统请求某些权限(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** @@ -194,6 +214,10 @@ getApplicationInfo(callback: AsyncCallback\) 获取有关当前应用程序的信息(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -216,6 +240,10 @@ getApplicationInfo(): Promise\ 获取有关当前应用程序的信息(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **返回值:** | 类型 | 说明 | @@ -241,6 +269,10 @@ getBundleName(callback: AsyncCallback\): void 获取当前ability的捆绑包名称(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -263,6 +295,10 @@ getBundleName(): Promise\ 获取当前ability的捆绑包名称(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **返回值:** | 类型 | 说明 | @@ -288,6 +324,10 @@ getProcessInfo(callback: AsyncCallback\) 获取有关当前进程的信息,包括进程ID和名称(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -310,6 +350,10 @@ getProcessInfo(): Promise\ 获取有关当前进程的信息,包括进程id和名称(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **返回值:** | 类型 | 说明 | @@ -337,6 +381,10 @@ getElementName(callback: AsyncCallback\): void 此方法仅适用于页面功能。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -361,6 +409,10 @@ getElementName(): Promise\ 此方法仅适用于页面功能。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **返回值:** | 类型 | 说明 | @@ -384,6 +436,10 @@ getProcessName(callback: AsyncCallback\): void 获取当前进程的名称(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + | 名称 | 类型 | 必填 | 描述 | | -------- | ---------------------- | ---- | -------------------- | | callback | AsyncCallback\ | 是 | 返回当前进程的名称。 | @@ -404,6 +460,10 @@ getProcessName(): Promise\ 获取当前进程的名称(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **返回值:** | 类型 | 说明 | @@ -429,6 +489,10 @@ getCallingBundle(callback: AsyncCallback\): void 获取调用ability的包名称(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -451,6 +515,10 @@ getCallingBundle(): Promise\ 获取调用ability的包名称(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + **返回值:** | 类型 | 说明 | @@ -472,13 +540,13 @@ context.getCallingBundle().then((data) => { | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ---- | -------- | ------ | ---- | ------ | -| pid | 只读 | number | 否 | 进程id | -| uid | 只读 | number | 否 | 用户id | +| pid | 只读 | number | 否 | 进程id
系统能力:SystemCapability.Ability.AbilityRuntime.Core| +| uid | 只读 | number | 否 | 用户id
系统能力:SystemCapability.Ability.AbilityRuntime.Core | ## PermissionRequestResult | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ----------- | -------- | -------------- | ---- | ------------------ | -| requestCode | 只读 | number | 是 | 用户传入的请求代码 | -| permissions | 只读 | Array\ | 是 | 用户传入的权限 | -| authResults | 只读 | Array\ | 是 | 求权限的结果 | +| requestCode | 只读 | number | 是 | 用户传入的请求代码
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| permissions | 只读 | Array\ | 是 | 用户传入的权限
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| authResults | 只读 | Array\ | 是 | 求权限的结果
系统能力:SystemCapability.Ability.AbilityRuntime.Core | diff --git a/zh-cn/application-dev/reference/apis/js-apis-ability-context.md b/zh-cn/application-dev/reference/apis/js-apis-ability-context.md index e55c684dc86..fe0cc01c023 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-ability-context.md +++ b/zh-cn/application-dev/reference/apis/js-apis-ability-context.md @@ -57,6 +57,10 @@ startAbility(want: Want, callback: AsyncCallback<void>): void 启动Ability。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -82,6 +86,10 @@ startAbility(want: Want, options: StartOptions, callback: AsyncCallback<void& 启动Ability。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -112,6 +120,10 @@ startAbility(want: Want, options: StartOptions): Promise<void>; 启动Ability。通过Promise返回结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -148,6 +160,10 @@ startAbilityForResult(want: Want, callback: AsyncCallback<AbilityResult>): 启动Ability并在结束的时候返回执行结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -172,6 +188,10 @@ startAbilityForResult(want: Want, options: StartOptions, callback: AsyncCallback 启动Ability并在结束的时候返回执行结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -201,6 +221,10 @@ startAbilityForResult(want: Want, options: StartOptions): Promise<AbilityResu 启动Ability并在结束的时候返回执行结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -232,6 +256,10 @@ terminateSelf(callback: AsyncCallback<void>): void; 停止Ability自身。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -251,6 +279,10 @@ terminateSelf(): Promise<void>; 停止Ability自身。通过Promise返回结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -272,6 +304,10 @@ terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback<voi 停止Ability,并返回给调用startAbilityForResult 接口调用方的相关信息。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数 | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -297,6 +333,10 @@ terminateSelfWithResult(parameter: AbilityResult): Promise<void>; 停止Ability,并返回给调用startAbilityForResult 接口相关信息。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -326,6 +366,10 @@ startAbilityByCall(want: Want): Promise<Caller>; 获取指定通用组件服务端的caller通信接口, 并且将指定通用组件服务端拉起并切换到后台。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -364,6 +408,10 @@ requestPermissionsFromUser(permissions: Array<string>, requestCallback: As 拉起弹窗请求用户授权。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -385,6 +433,10 @@ requestPermissionsFromUser(permissions: Array<string>) : Promise<Permis 拉起弹窗请求用户授权。通过Promise返回结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -412,6 +464,10 @@ setMissionLabel(label: string, callback:AsyncCallback<void>): void; 设置ability在任务中显示的名称。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -433,6 +489,10 @@ setMissionLabel(label: string, callback:AsyncCallback<void>): void; 设置ability在任务中显示的名称。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | diff --git a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md index 3c0e4627e4c..c26248bb238 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md +++ b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md @@ -16,6 +16,10 @@ openFile(uri: string, mode: string, callback: AsyncCallback\): void 在指定的远程路径中打开文件(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -44,6 +48,10 @@ DAHelper.openFile( openFile(uri: string, mode: string): Promise\ +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -77,6 +85,10 @@ on(type: 'dataChange', uri: string, callback: AsyncCallback\): void 注册观察者以观察给定uri指定的数据callback通知。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -108,6 +120,10 @@ off(type: 'dataChange', uri: string, callback?: AsyncCallback\): void 注消观察者以停止观察给定uri指定的数据callback通知。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -143,6 +159,10 @@ getType(uri: string, callback: AsyncCallback\): void 获取给定URI指定数据的MIME类型(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -170,6 +190,10 @@ getType(uri: string): Promise\ 获取给定URI指定数据的MIME类型(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -201,6 +225,10 @@ getFileTypes(uri: string, mimeTypeFilter: string, callback: AsyncCallback> 获取支持的文件的MIME类型(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -265,6 +297,10 @@ normalizeUri(uri: string, callback: AsyncCallback\): void 将引用数据功能的给定uri转换为规范化uri(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -292,6 +328,10 @@ normalizeUri(uri: string): Promise\ 将引用数据功能的给定uri转换为规范化uri(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -323,6 +363,10 @@ denormalizeUri(uri: string, callback: AsyncCallback\): void 将由normalizeUri(uri)生成的给定规范化uri转换为非规范化uri(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -352,6 +396,10 @@ denormalizeUri(uri: string): Promise\ 将由normalizeUri(uri)生成的给定规范化uri转换为非规范化uri(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -383,6 +431,10 @@ notifyChange(uri: string, callback: AsyncCallback\): void 通知已注册的观察者uri指定的数据资源的更改(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -410,6 +462,10 @@ notifyChange(uri: string): Promise\ 通知已注册的观察者uri指定的数据资源的更改(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -441,6 +497,10 @@ insert(uri: string, valuesBucket: rdb.ValuesBucket, callback: AsyncCallback\ 将单个数据记录插入数据库(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -515,6 +579,10 @@ batchInsert(uri: string, valuesBuckets: Array, callback: Async 插入数据库(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -547,6 +615,10 @@ batchInsert(uri: string, valuesBuckets: Array): Promise\, predicates: dataAbility.DataAbilityP 查询数据库中的数据(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -766,6 +858,10 @@ query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityP 查询数据库中的数据(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | diff --git a/zh-cn/application-dev/reference/apis/js-apis-eventhub.md b/zh-cn/application-dev/reference/apis/js-apis-eventhub.md index 265e5f01827..0fd0ecc9b5b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-eventhub.md +++ b/zh-cn/application-dev/reference/apis/js-apis-eventhub.md @@ -36,6 +36,10 @@ on(event: string, callback: Function): void; 订阅指定事件。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -71,6 +75,10 @@ off(event: string, callback?: Function): void; 取消订阅指定事件。当callback传值时,取消订阅指定的callback;未传值时,取消订阅该事件下所有callback。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -106,6 +114,10 @@ emit(event: string, ...args: Object[]): void; 触发指定事件。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | diff --git a/zh-cn/application-dev/reference/apis/js-apis-extension-context.md b/zh-cn/application-dev/reference/apis/js-apis-extension-context.md index 356b5605583..19ef7b6ee3d 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-extension-context.md +++ b/zh-cn/application-dev/reference/apis/js-apis-extension-context.md @@ -11,4 +11,4 @@ Extension的上下文环境,继承自Context。 | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| currentHapModuleInfo | HapModuleInfo | 是 | 否 | 当前Hap包的信息。 | +| currentHapModuleInfo | HapModuleInfo | 是 | 否 | 当前Hap包的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | diff --git a/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md b/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md index aede4031e5f..36b807c84b1 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md +++ b/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md @@ -31,13 +31,13 @@ abilitymanager.getExtensionRunningInfos(upperLimit, (err,data) => { | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| extension | ElementName | 是 | 否 | Extension匹配信息。 | -| pid | number | 是 | 否 | 进程ID。 | -| uid | number | 是 | 否 | 用户ID。 | -| processName | string | 是 | 否 | 进程名称。 | -| startTime | number | 是 | 否 | Extension启动时间。 | -| clientPackage | Array<String> | 是 | 否 | 连接客户端包名。 | -| type | [bundle.ExtensionAbilityType](#bundle-extensionabilitytype) | 是 | 否 | Extension类型。 | +| extension | ElementName | 是 | 否 | Extension匹配信息。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| pid | number | 是 | 否 | 进程ID。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| uid | number | 是 | 否 | 用户ID。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| processName | string | 是 | 否 | 进程名称。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| startTime | number | 是 | 否 | Extension启动时间。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| clientPackage | Array<String> | 是 | 否 | 连接客户端包名。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| type | [bundle.ExtensionAbilityType](#bundle-extensionabilitytype) | 是 | 否 | Extension类型。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | ## bundle.ExtensionAbilityType @@ -46,13 +46,13 @@ Extension类型。 | 名称 | 值 | 说明 | | -------- | -------- | -------- | -| FORM | 0 | 表示带有form类型的扩展信息。 | -| WORK_SCHEDULER | 1 | 表示带有work schedule类型的扩展信息。 | -| INPUT_METHOD | 2 | 表示用输入法类型的扩展信息。 | -| SERVICE | 3 | 表示带有service类型的扩展信息。 | -| ACCESSIBILITY | 4 | 表示具有可访问性类型的扩展信息。 | -| DATA_SHARE | 5 | 表示带有datashare类型的扩展信息。 | -| FILE_SHARE | 6 | 表示带有fileshare类型的扩展信息。 | -| STATIC_SUBSCRIBER | 7 | 表示带有静态订阅者类型的扩展信息。 | -| WALLPAPER | 8 | 表示带有wallpaper类型的扩展信息。 | -| UNSPECIFIED | 9 | 表示未指定类型信息。 | +| FORM | 0 | 表示带有form类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| WORK_SCHEDULER | 1 | 表示带有work schedule类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| INPUT_METHOD | 2 | 表示用输入法类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| SERVICE | 3 | 表示带有service类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| ACCESSIBILITY | 4 | 表示具有可访问性类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| DATA_SHARE | 5 | 表示带有datashare类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| FILE_SHARE | 6 | 表示带有fileshare类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| STATIC_SUBSCRIBER | 7 | 表示带有静态订阅者类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| WALLPAPER | 8 | 表示带有wallpaper类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| UNSPECIFIED | 9 | 表示未指定类型信息。
系统能力:SystemCapability.BundleManager.BundleFramework | diff --git a/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md b/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md index a2fb9c0522e..54ac9cd1bc3 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md @@ -16,6 +16,10 @@ startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\) 启动新的ability(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -53,6 +57,10 @@ startAbility(parameter: StartAbilityParameter): Promise\ 启动新的ability(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -89,6 +97,10 @@ acquireDataAbilityHelper(uri: string): DataAbilityHelper 获取dataAbilityHelper。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -116,6 +128,10 @@ startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback\ 启动一个ability,并在该ability被销毁时返回执行结果(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -151,6 +167,10 @@ startAbilityForResult(parameter: StartAbilityParameter): Promise\ 启动一个ability,并在该ability被销毁时返回执行结果(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -204,6 +224,10 @@ terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback\ 设置此Page Ability将返回给调用者的结果代码和数据并破坏此Page Ability(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -250,6 +274,10 @@ terminateSelfWithResult(parameter: AbilityResult): Promise\ 设置此Page Ability将返回给调用者的结果代码和数据并破坏此Page Ability(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -304,6 +332,10 @@ hasWindowFocus(callback: AsyncCallback\): void 检查Ability的主窗口是否具有窗口焦点(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -325,6 +357,10 @@ hasWindowFocus(): Promise\ 检查Ability的主窗口是否具有窗口焦点(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **返回值:** | 类型 | 说明 | @@ -348,6 +384,10 @@ getWant(callback: AsyncCallback\): void 获取从Ability发送的Want(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -369,6 +409,10 @@ getWant(): Promise\ 获取从Ability发送的Want(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **返回值:** | 类型 | 说明 | | ----------------------- | ------------------------- | @@ -389,6 +433,10 @@ getContext(): Context 获取应用上下文。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **返回值:** | 类型 | 说明 | | ------- | -------------------- | @@ -410,6 +458,10 @@ terminateSelf(callback: AsyncCallback\): void 设置Page Ability返回给被调用方的结果代码和数据,并销毁此Page Ability(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -431,6 +483,10 @@ terminateSelf(): Promise\ 设置Page Ability返回给被调用方的结果代码和数据,并销毁此Page Ability(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **返回值:** | 类型 | 说明 | | -------------- | ------------------------- | @@ -450,6 +506,10 @@ connectAbility(request: Want, options:ConnectOptions): number 将当前ability连接到指定ServiceAbility(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -461,17 +521,17 @@ connectAbility(request: Want, options:ConnectOptions): number | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------ | -------- | -------- | ---- | ---------------------------------- | -| deviceId | 只读 | string | 否 | 表示被连接的ServiceAbility的设备id,缺省表示连接本地的ServiceAbility | -| bundleName | 只读 | string | 是 | 表示被连接的ServiceAbility的包名 | -| abilityName | 只读 | string | 是 | 表示被连接的ServiceAbility的类名 | +| deviceId | 只读 | string | 否 | 表示被连接的ServiceAbility的设备id,缺省表示连接本地的ServiceAbility
系统能力:SystemCapability.Ability.AbilityBase | +| bundleName | 只读 | string | 是 | 表示被连接的ServiceAbility的包名
系统能力:SystemCapability.Ability.AbilityBase | +| abilityName | 只读 | string | 是 | 表示被连接的ServiceAbility的类名
系统能力:SystemCapability.Ability.AbilityBase | **ConnectOptions类型说明:** | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------ | -------- | -------- | ---- | ---------------------------------- | -| onConnect | 只读 | function | 是 | 连接成功时的回调函数 | -| onDisconnect | 只读 | function | 是 | 连接失败时的回调函数 | -| onFailed | 只读 | function | 是 | ConnectAbility调用失败时的回调函数 | +| onConnect | 只读 | function | 是 | 连接成功时的回调函数
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| onDisconnect | 只读 | function | 是 | 连接失败时的回调函数
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| onFailed | 只读 | function | 是 | ConnectAbility调用失败时的回调函数
系统能力:SystemCapability.Ability.AbilityRuntime.Core | **返回值:** | 类型 | 说明 | @@ -512,6 +572,10 @@ disconnectAbility(connection: number, callback:AsyncCallback\): void 断开与指定ServiceAbility的连接(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -557,6 +621,10 @@ disconnectAbility(connection: number): Promise\ 断开与指定ServiceAbility的连接(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -602,6 +670,10 @@ continueAbility(options: ContinueAbilityOptions, callback: AsyncCallback\) 迁移一个ability到目标设备,并返回执行结果(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -613,8 +685,8 @@ continueAbility(options: ContinueAbilityOptions, callback: AsyncCallback\) | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ---------- | -------- | ------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 是 | 表示需要包含有关目标启动能力的信息。 | -| reversible | 只读 | boolean | 是 | 是否支持回迁的标志,目前不支持该功能,为保留字段,可填false。 | +| deviceId | 只读 | string | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| reversible | 只读 | boolean | 是 | 是否支持回迁的标志,目前不支持该功能,为保留字段,可填false。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | **示例:** @@ -689,6 +761,10 @@ continueAbility(options: ContinueAbilityOptions): Promise\; 迁移一个ability到目标设备,并返回执行结果(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -699,8 +775,8 @@ continueAbility(options: ContinueAbilityOptions): Promise\; | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ---------- | -------- | ------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 是 | 表示需要包含有关目标启动能力的信息。 | -| reversible | 只读 | boolean | 是 | 是否支持回迁的标志,目前不支持该功能,为保留字段,可填false。 | +| deviceId | 只读 | string | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| reversible | 只读 | boolean | 是 | 是否支持回迁的标志,目前不支持该功能,为保留字段,可填false。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | **示例:** @@ -775,48 +851,48 @@ export default { | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ---------- | -------- | --------------------- | ---- | ------------------------------------------------------------ | -| resultCode | 只读 | number | 是 | 指示销毁该能力后返回的结果代码。您可以定义结果代码来识别错误(暂不支持) | -| want | 只读 | [Want](#want) | 否 | 指示销毁该能力后返回的数据。您可以定义返回的数据。此参数可以为null。 | +| resultCode | 只读 | number | 是 | 指示销毁该能力后返回的结果代码。您可以定义结果代码来识别错误(暂不支持)
系统能力:SystemCapability.Ability.AbilityBase | +| want | 只读 | [Want](#want) | 否 | 指示销毁该能力后返回的数据。您可以定义返回的数据。此参数可以为null。
系统能力:SystemCapability.Ability.AbilityBase | ## StartAbilityParameter | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。 | -| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。 | +| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | ## Want | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。 | -| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | -| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | -| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。 | -| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。 | -| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。 | -| action | 只读 | string | 否 | 表示action选项描述。 | -| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。 | -| entities | 只读 | Array\ | 否 | 表示entities相关描述。 | +| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。
系统能力:SystemCapability.Ability.AbilityBase | +| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | +| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | +| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。
系统能力:SystemCapability.Ability.AbilityBase | +| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。
系统能力:SystemCapability.Ability.AbilityBase | +| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。
系统能力:SystemCapability.Ability.AbilityBase | +| action | 只读 | string | 否 | 表示action选项描述。
系统能力:SystemCapability.Ability.AbilityBase | +| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。
系统能力:SystemCapability.Ability.AbilityBase | +| entities | 只读 | Array\ | 否 | 表示entities相关描述。
系统能力:SystemCapability.Ability.AbilityBase | ## flags说明 | 名称 | 参数 | 描述 | | ------------------------------------ | ---------- | ------------------------------------------------------------ | -| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | -| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | -| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力 | -| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | -| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS | -| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | -| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | -| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限 | -| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | -| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | -| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。 | -| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | -| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。 | -| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给**ohos.app.Context#startAbility**的**Want**设置此标志,并且必须与**flag_ABILITY_NEW_MISSION**一起使用 | -| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | -| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | +| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给**ohos.app.Context#startAbility**的**Want**设置此标志,并且必须与**flag_ABILITY_NEW_MISSION**一起使用
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。
系统能力:SystemCapability.Ability.AbilityBase | diff --git a/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md b/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md index e1379476c53..9f12115ff00 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md @@ -16,6 +16,10 @@ startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\: v 使用此方法启动指定的particleAbility(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** @@ -53,9 +57,17 @@ particleAbility.startAbility( ## particleAbility.startAbility +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + startAbility(parameter: StartAbilityParameter): Promise\ 使用此方法启动指定的particleAbility(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** @@ -99,6 +111,10 @@ terminateSelf(callback: AsyncCallback\): void 终止particleAbility(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -124,6 +140,10 @@ terminateSelf(): Promise\ 终止particleAbility(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **返回值:** | 类型 | 说明 | | -------------- | ------------------------- | @@ -146,6 +166,10 @@ acquireDataAbilityHelper(uri: string): DataAbilityHelper 获取dataAbilityHelper。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -170,43 +194,43 @@ particleAbility.acquireDataAbilityHelper(uri) | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------------- | -------- | --------------------- | ---- | ------------------------------------------------------------ | -| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。 | -| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。 | +| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | ## Want | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。 | -| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | -| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | -| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。 | -| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。 | -| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。 | -| action | 只读 | string | 否 | 表示action选项描述。 | -| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。 | -| entities | 只读 | Array\ | 否 | 表示entities相关描述。 | +| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。
系统能力:SystemCapability.Ability.AbilityBase | +| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | +| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | +| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。
系统能力:SystemCapability.Ability.AbilityBase | +| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。
系统能力:SystemCapability.Ability.AbilityBase | +| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。
系统能力:SystemCapability.Ability.AbilityBase | +| action | 只读 | string | 否 | 表示action选项描述。
系统能力:SystemCapability.Ability.AbilityBase | +| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。
系统能力:SystemCapability.Ability.AbilityBase | +| entities | 只读 | Array\ | 否 | 表示entities相关描述。
系统能力:SystemCapability.Ability.AbilityBase | ## flags说明 | 名称 | 参数 | 描述 | | ------------------------------------ | ---------- | ------------------------------------------------------------ | -| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | -| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | -| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力 | -| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | -| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS | -| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | -| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | -| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限 | -| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | -| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | -| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。 | -| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | -| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。 | -| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Want}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | -| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | -| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | +| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Want}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。
系统能力:SystemCapability.Ability.AbilityBase | ## AbilityStartSetting @@ -216,9 +240,9 @@ abilityStartSetting属性是一个定义为[key: string]: any的对象,key对 | 名称 | 参数 | 描述 | | --------------- | --------------- | -------------------------- | -| BOUNDS_KEY | "abilityBounds" | 窗口显示大小属性的名称。 | -| WINDOW_MODE_KEY | "windowMode" | 窗口显示模式属性的名称。 | -| DISPLAY_ID_KEY | "displayId" | 窗口显示设备ID属性的名称。 | +| BOUNDS_KEY | "abilityBounds" | 窗口显示大小属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_KEY | "windowMode" | 窗口显示模式属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| DISPLAY_ID_KEY | "displayId" | 窗口显示设备ID属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | ## AbilityWindowConfiguration @@ -226,11 +250,11 @@ abilityStartSetting属性是一个定义为[key: string]: any的对象,key对 | 名称 | 参数 | 描述 | | --------------------------- | ---- | ---------- | -| WINDOW_MODE_UNDEFINED | 0 | 未定义。 | -| WINDOW_MODE_FULLSCREEN | 1 | 全屏。 | -| WINDOW_MODE_SPLIT_PRIMARY | 100 | 分屏主屏。 | -| WINDOW_MODE_SPLIT_SECONDARY | 101 | 分屏次屏。 | -| WINDOW_MODE_FLOATING | 102 | 悬浮窗。 | +| WINDOW_MODE_UNDEFINED | 0 | 未定义。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_FULLSCREEN | 1 | 全屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_SPLIT_PRIMARY | 100 | 分屏主屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_SPLIT_SECONDARY | 101 | 分屏次屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_FLOATING | 102 | 悬浮窗。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | ## particleAbility.startBackgroundRunning @@ -239,6 +263,10 @@ startBackgroundRunning(id: number, request: NotificationRequest, callback: Async 向系统申请长时任务,使用callback形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -295,6 +323,10 @@ wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { startBackgroundRunning(id: number, request: NotificationRequest): Promise<void> +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + 向系统申请长时任务,使用promise形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) **参数**: @@ -355,6 +387,10 @@ cancelBackgroundRunning(callback: AsyncCallback<void>): void; 向系统申请取消长时任务,使用callback形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -382,6 +418,10 @@ cancelBackgroundRunning(): Promise<void>; 向系统申请取消长时任务,使用promise形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + **返回值** | 类型 | 说明 | | -------------- | ------------------------- | diff --git a/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md b/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md index 65317e07f3e..7047a1584e6 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md +++ b/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md @@ -14,5 +14,5 @@ | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| permissions | Array<string> | 是 | 否 | 用户传入的权限。 | -| authResults | Array<number> | 是 | 否 | 相应请求权限的结果。0表示授权成功,-1表示失败。 | +| permissions | Array<string> | 是 | 否 | 用户传入的权限。
系统能力:SystemCapability.Ability.AbilityRuntime.Core| +| authResults | Array<number> | 是 | 否 | 相应请求权限的结果。0表示授权成功,-1表示失败。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | diff --git a/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md b/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md index d22b2afe122..dbcf41ed4c7 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md +++ b/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md @@ -30,7 +30,7 @@ appManager.getProcessRunningInfos((error,data) => { | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| pid | number | 是 | 否 | 进程ID。 | -| uid | number | 是 | 否 | 用户ID。 | -| processName | string | 是 | 否 | 进程名称。 | -| bundleNames | Array<string> | 是 | 否 | 进程中所有运行的包名称。 | +| pid | number | 是 | 否 | 进程ID。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| uid | number | 是 | 否 | 用户ID。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| processName | string | 是 | 否 | 进程名称。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| bundleNames | Array<string> | 是 | 否 | 进程中所有运行的包名称。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | diff --git a/zh-cn/application-dev/reference/apis/js-apis-service-extension-context.md b/zh-cn/application-dev/reference/apis/js-apis-service-extension-context.md index 9df9866c2cd..1438b120f58 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-service-extension-context.md +++ b/zh-cn/application-dev/reference/apis/js-apis-service-extension-context.md @@ -16,6 +16,10 @@ startAbility(want: Want, callback: AsyncCallback<void>): void; 启动Ability。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -40,6 +44,10 @@ startAbility(want: Want): Promise<void>; 启动Ability。通过Promise返回结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -70,6 +78,10 @@ terminateSelf(callback: AsyncCallback<void>): void; 停止Ability自身。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -89,6 +101,10 @@ terminateSelf(): Promise<void>; 停止自身。通过Promise返回结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -110,6 +126,10 @@ connectAbility(want: Want, options: ConnectOptions): number; 将一个Ability与服务类型的Ability绑定。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -142,6 +162,10 @@ disconnectAbility(connection: number, callback:AsyncCallback<void>): void; 将一个Ability与绑定的服务类型的Ability解绑。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -162,6 +186,10 @@ disconnectAbility(connection: number): Promise<void>; 将一个Ability与绑定的服务类型的Ability解绑。通过Promise返回结果。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -171,7 +199,7 @@ disconnectAbility(connection: number): Promise<void>; | 类型 | 说明 | | -------- | -------- | | Promise<void> | 返回一个Promise,包含接口的结果。 | - + - 示例: ``` this.context.disconnectAbility(connection).then((data) => { // connection为connectAbility中的返回值 @@ -188,6 +216,6 @@ ConnectOptions数据结构。 | 名称 | 说明 | | -------- | -------- | -| onConnect(elementName:ElementName, remote:IRemoteObject) | Ability成功连接一个服务类型Ability的回调接口。 | -| onDisconnect(elementName:ElementName) | 对端服务发生异常或者被杀死回调该接口。 | -| onFailed(code: number) | 连接失败时回调该接口。 | +| onConnect(elementName:ElementName, remote:IRemoteObject) | Ability成功连接一个服务类型Ability的回调接口。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| onDisconnect(elementName:ElementName) | 对端服务发生异常或者被杀死回调该接口。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| onFailed(code: number) | 连接失败时回调该接口。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | diff --git a/zh-cn/application-dev/reference/apis/js-apis-service-extension.md b/zh-cn/application-dev/reference/apis/js-apis-service-extension.md index 4084b560e9e..52366fd4dcc 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-service-extension.md +++ b/zh-cn/application-dev/reference/apis/js-apis-service-extension.md @@ -32,6 +32,10 @@ onCreate(want: Want): void; Extension生命周期回调,在创建时回调,执行初始化业务逻辑操作。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -53,6 +57,10 @@ onDestroy(): void; Extension生命周期回调,在销毁时回调,执行资源清理等操作。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 示例: ``` class ServiceExt extends ServiceExtension { @@ -69,6 +77,10 @@ onRequest(want: Want, startId: number): void; Extension生命周期回调,如果是startAbility拉起的服务,会在onCreate之后回调。每次拉起服务都会回调,startId会递增。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -91,6 +103,10 @@ onConnect(want: Want): rpc.RemoteObject; Extension生命周期回调,如果是connectAbility拉起的服务,会在onCreate之后回调。返回一个RemoteObject对象,用于和客户端进行通信。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -126,6 +142,10 @@ onDisconnect(want: Want): void; Extension的生命周期,断开服务连接时回调。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | diff --git a/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md b/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md index 34cc33c6943..14a3814de07 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md +++ b/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md @@ -26,6 +26,10 @@ verifyUriPermission(uri: string, flag: wantConstant.Flags, accessTokenId: number 检验某个应用是否对指定的uri有flag指定的权限。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -50,6 +54,10 @@ verifyUriPermission(uri: string, flag: wantConstant.Flags, accessTokenId: number 检验某个应用是否对指定的uri有flag指定的权限。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.Core + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -- Gitee From 5d4fc3ee7617498b2a44e4f3879ce9306f99fec6 Mon Sep 17 00:00:00 2001 From: longwei Date: Wed, 2 Mar 2022 21:17:58 +0800 Subject: [PATCH 069/282] fix intents for skill Signed-off-by: longwei Change-Id: Ibd0de98cff69b5a5522eb103f6ba9e6b159cfaec --- zh-cn/application-dev/quick-start/package-structure.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zh-cn/application-dev/quick-start/package-structure.md b/zh-cn/application-dev/quick-start/package-structure.md index ec612e6e390..43a78f2056e 100644 --- a/zh-cn/application-dev/quick-start/package-structure.md +++ b/zh-cn/application-dev/quick-start/package-structure.md @@ -355,7 +355,7 @@ metaData示例: | launchType | 表示Ability的启动模式,支持“standard”、“singleMission”和“singleton”三种模式:
standard:表示该Ability可以有多实例。
“standard”模式适用于大多数应用场景。
singleMission:表示此Ability在每个任务栈中只能有一个实例。
singleton:表示该Ability在所有任务栈中仅可以有一个实例。例如,具有全局唯一性的呼叫来电界面即采用“singleton”模式。该标签仅适用于手机、平板、智慧屏、车机、智能穿戴。 | 字符串 | 可缺省,缺省值为“standard”。 | | visible | 表示Ability是否可以被其他应用调用。
true:可以被其他应用调用。
false:不能被其他应用调用。 | 布尔类型 | 可缺省,缺省值为“false”。 | | permissions | 表示其他应用的Ability调用此Ability时需要申请的权限。通常采用反向域名格式,取值可以是系统预定义的权限,也可以是开发者自定义的权限。 | 字符串数组 | 可缺省,缺省值为空。 | -| skills | 表示Ability能够接收的Intent的特征。 | 对象数组 | 可缺省,缺省值为空。 | +| skills | 表示Ability能够接收的want的特征。 | 对象数组 | 可缺省,缺省值为空。 | | deviceCapability | 表示Ability运行时要求设备具有的能力,采用字符串数组的格式表示。 | 字符串数组 | 可缺省,缺省值为空。 | | metaData | 元数据,参考表13。 | 对象 | 可缺省,缺省值为空。 | | type | 表示Ability的类型。取值范围如下:
page:表示基于Page模板开发的FA,用于提供与用户交互的能力。
service:表示基于Service模板开发的PA,用于提供后台运行任务的能力。
data:表示基于Data模板开发的PA,用于对外部提供统一的数据访问抽象。
CA:表示支持其他应用以窗口方式调起该Ability。 | 字符串 | 否 | @@ -451,9 +451,9 @@ abilities示例: | 属性名称 | 含义 | 数据类型 | 是否可缺省 | | -------- | ------------------------------------------------------------ | ---------- | -------------------- | -| actions | 表示能够接收的Intent的action值,可以包含一个或多个action。取值通常为系统预定义的action值。 | 字符串数组 | 可缺省,缺省值为空。 | -| entities | 表示能够接收的Intent的Ability的类别(如视频、桌面应用等),可以包含一个或多个entity。 | 字符串数组 | 可缺省,缺省值为空。 | -| uris | 表示能够接收的Intent的uri,可以包含一个或者多个uri。参考表20。 | 对象数组 | 可缺省,缺省值为空。 | +| actions | 表示能够接收的want的action值,可以包含一个或多个action。取值通常为系统预定义的action值。 | 字符串数组 | 可缺省,缺省值为空。 | +| entities | 表示能够接收的want的Ability的类别(如视频、桌面应用等),可以包含一个或多个entity。 | 字符串数组 | 可缺省,缺省值为空。 | +| uris | 表示能够接收的want的uri,可以包含一个或者多个uri。参考表20。 | 对象数组 | 可缺省,缺省值为空。 | 表20 uris对象的内部结构说明 -- Gitee From 8b54c1a049777b1f41a22d9b02951b352f13cefd Mon Sep 17 00:00:00 2001 From: zengyawen Date: Wed, 2 Mar 2022 22:35:22 +0800 Subject: [PATCH 070/282] update docs Signed-off-by: zengyawen --- .../reference/apis/Readme-CN.md | 6 +- .../reference/apis/js-apis-camera.md | 1885 +++----- .../reference/apis/js-apis-net-connection.md | 322 +- .../reference/arkui-js/Readme-CN.md | 211 +- ...9.gif => zh-cn_image_0000001127125114.gif} | Bin ...b.gif => zh-cn_image_0000001127125116.gif} | Bin ...1.gif => zh-cn_image_0000001127125118.gif} | Bin ...3.gif => zh-cn_image_0000001127125122.gif} | Bin ...4.gif => zh-cn_image_0000001127125126.gif} | Bin .../figures/zh-cn_image_0000001127125174.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127125178.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127125180.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125184.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125188.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125190.png | Bin 0 -> 120 bytes ...2.gif => zh-cn_image_0000001127125192.gif} | Bin .../figures/zh-cn_image_0000001127125194.png | Bin 0 -> 117 bytes ...1.png => zh-cn_image_0000001127125196.png} | Bin ...2.gif => zh-cn_image_0000001127125198.gif} | Bin ...4.gif => zh-cn_image_0000001127125200.gif} | Bin .../figures/zh-cn_image_0000001127125210.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127125214.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127125216.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125218.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125222.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125224.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001127125226.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125228.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001127125230.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125232.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125234.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125236.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125238.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127125240.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125242.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125244.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127125246.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127125248.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125250.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125254.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127125256.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127125258.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001127125260.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127125262.png | Bin 0 -> 122 bytes ...e.png => zh-cn_image_0000001127125264.png} | Bin ...4.gif => zh-cn_image_0000001127284924.gif} | Bin ...4.png => zh-cn_image_0000001127284930.png} | Bin ...1.gif => zh-cn_image_0000001127284934.gif} | Bin ...F.gif => zh-cn_image_0000001127284936.gif} | Bin ...3.gif => zh-cn_image_0000001127284938.gif} | Bin ...r.gif => zh-cn_image_0000001127284946.gif} | Bin .../figures/zh-cn_image_0000001127284968.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127284970.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127284972.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127284974.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127284976.png | Bin 0 -> 122 bytes ...6.gif => zh-cn_image_0000001127284978.gif} | Bin .../figures/zh-cn_image_0000001127284980.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127284982.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127284990.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127284992.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127284996.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127284998.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127285000.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001127285002.png | Bin 0 -> 117 bytes ...m.gif => zh-cn_image_0000001127285004.gif} | Bin .../figures/zh-cn_image_0000001127285006.png | Bin 0 -> 120 bytes ...1.gif => zh-cn_image_0000001127285008.gif} | Bin .../figures/zh-cn_image_0000001127285010.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127285012.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127285014.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127285016.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001127285018.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285020.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285022.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127285026.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127285028.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127285030.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001127285032.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285038.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127285040.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001127285042.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127285044.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285046.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127285048.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001127285050.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285052.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285054.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285056.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127285058.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127285060.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001127285062.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001127285064.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001127285066.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127285068.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001127285070.png | Bin 0 -> 121 bytes ...0.jpg => zh-cn_image_0000001127285072.jpg} | Bin ...3.gif => zh-cn_image_0000001131795738.gif} | Bin ...3.png => zh-cn_image_0000001152773860.png} | Bin ...3.gif => zh-cn_image_0000001167662852.gif} | Bin ...3.png => zh-cn_image_0000001167823076.png} | Bin ...0.gif => zh-cn_image_0000001167823326.gif} | Bin ...4.gif => zh-cn_image_0000001167846062.gif} | Bin ...f.png => zh-cn_image_0000001167952236.png} | Bin ...6.gif => zh-cn_image_0000001168005276.gif} | Bin ...5.gif => zh-cn_image_0000001168440692.gif} | Bin ...1.png => zh-cn_image_0000001173164775.png} | Bin ...3.gif => zh-cn_image_0000001173164779.gif} | Bin ...2.gif => zh-cn_image_0000001173164783.gif} | Bin ...6.gif => zh-cn_image_0000001173164785.gif} | Bin ...1.jpg => zh-cn_image_0000001173164799.jpg} | Bin .../figures/zh-cn_image_0000001173164835.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164837.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164841.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173164843.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164849.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173164851.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173164855.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173164859.gif | Bin 0 -> 119302 bytes ...3.gif => zh-cn_image_0000001173164863.gif} | Bin .../figures/zh-cn_image_0000001173164865.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173164875.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173164877.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173164879.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173164881.gif | Bin 0 -> 333908 bytes .../figures/zh-cn_image_0000001173164883.gif | Bin 0 -> 121034 bytes .../figures/zh-cn_image_0000001173164885.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173164887.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173164889.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173164893.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164895.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173164897.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173164899.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164901.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173164905.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164907.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164909.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173164911.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173164913.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173164915.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164917.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164921.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164923.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173164925.png | Bin 0 -> 120 bytes ...t.png => zh-cn_image_0000001173164927.png} | Bin ...t.png => zh-cn_image_0000001173164929.png} | Bin ...3.png => zh-cn_image_0000001173324689.png} | Bin ...2.png => zh-cn_image_0000001173324691.png} | Bin ...2.gif => zh-cn_image_0000001173324693.gif} | Bin ...1.png => zh-cn_image_0000001173324697.png} | Bin ...1.gif => zh-cn_image_0000001173324699.gif} | Bin ...1.gif => zh-cn_image_0000001173324703.gif} | Bin ...r.png => zh-cn_image_0000001173324709.png} | Bin .../figures/zh-cn_image_0000001173324729.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324731.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173324733.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324735.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173324737.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001173324739.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324741.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173324743.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173324745.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173324747.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324755.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324757.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324759.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324761.png | Bin 0 -> 118 bytes ...3.gif => zh-cn_image_0000001173324765.gif} | Bin .../figures/zh-cn_image_0000001173324767.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324769.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324771.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324773.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324775.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324777.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001173324779.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324781.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324785.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324789.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173324793.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001173324795.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324799.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173324801.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001173324803.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324805.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324807.png | Bin 0 -> 118 bytes .../figures/zh-cn_image_0000001173324809.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324811.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173324813.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324815.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324817.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324821.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324823.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173324825.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324829.png | Bin 0 -> 122 bytes .../figures/zh-cn_image_0000001173324831.png | Bin 0 -> 120 bytes .../figures/zh-cn_image_0000001173324833.png | Bin 0 -> 119 bytes .../figures/zh-cn_image_0000001173324835.png | Bin 0 -> 121 bytes .../figures/zh-cn_image_0000001173324837.png | Bin 0 -> 117 bytes .../figures/zh-cn_image_0000001173324839.png | Bin 0 -> 122 bytes ...s.png => zh-cn_image_0000001173324845.png} | Bin .../figures/zh-cn_image_0000001177265268.png | Bin ...1.gif => zh-cn_image_0000001177428498.gif} | Bin .../figures/zh-cn_image_0000001179981036.gif | Bin 0 -> 39714 bytes .../figures/zh-cn_image_0000001180134670.gif | Bin 0 -> 6499 bytes ...s.png => zh-cn_image_0000001180339632.png} | Bin ...1.gif => zh-cn_image_0000001180658376.gif} | Bin ...t.png => zh-cn_image_0000001185033226.png} | Bin .../figures/zh-cn_image_0000001188551432.png | Bin 0 -> 11318 bytes .../figures/zh-cn_image_0000001188711340.png | Bin 0 -> 25553 bytes ...2.png => zh-cn_image_0000001189854534.png} | Bin ...1.png => zh-cn_image_0000001190934502.png} | Bin ...m.gif => zh-cn_image_0000001191939702.gif} | Bin ...d.gif => zh-cn_image_0000001192960596.gif} | Bin .../figures/zh-cn_image_0000001193544358.gif | Bin ...2.png => zh-cn_image_0000001198530395.png} | Bin ...3.png => zh-cn_image_0000001207995958.png} | Bin ...9.png => zh-cn_image_0000001208155956.png} | Bin ...1.png => zh-cn_image_0000001208315918.png} | Bin ...0.png => zh-cn_image_0000001212053183.png} | Bin ...2.png => zh-cn_image_0000001213103299.png} | Bin ...1.png => zh-cn_image_0000001213276619.png} | Bin ...9.gif => zh-cn_image_0000001213284927.gif} | Bin ...4.gif => zh-cn_image_0000001213381209.gif} | Bin ...2.png => zh-cn_image_0000001213396721.png} | Bin ...e.png => zh-cn_image_0000001214823665.png} | Bin ...2.gif => zh-cn_image_0000001222948301.gif} | Bin .../figures/zh-cn_image_0000001224225943.gif | Bin 0 -> 1242450 bytes .../figures/zh-cn_image_0000001225204601.gif | Bin 0 -> 6771 bytes .../figures/zh-cn_image_0000001225418523.gif | Bin 0 -> 260708 bytes .../figures/zh-cn_image_0000001229677045.gif | Bin ...3.png => zh-cn_image_0000001236694521.png} | Bin ...4.png => zh-cn_image_0000001237134475.png} | Bin .../figures/zh-cn_image_0000001238424309.png | Bin ...4.png => zh-cn_image_0000001252835901.png} | Bin .../reference/arkui-js/js-appendix-types.md | 1244 +----- .../reference/arkui-js/js-appendix.md | 3 +- .../arkui-js/js-components-basic-button.md | 399 +- .../arkui-js/js-components-basic-chart.md | 1478 ++----- .../arkui-js/js-components-basic-divider.md | 233 +- .../js-components-basic-image-animator.md | 326 +- .../arkui-js/js-components-basic-image.md | 270 +- .../arkui-js/js-components-basic-input.md | 824 +--- .../arkui-js/js-components-basic-label.md | 280 +- .../arkui-js/js-components-basic-marquee.md | 229 +- .../arkui-js/js-components-basic-menu.md | 238 +- .../arkui-js/js-components-basic-option.md | 186 +- .../js-components-basic-picker-view.md | 603 +-- .../arkui-js/js-components-basic-picker.md | 823 +--- .../arkui-js/js-components-basic-piece.md | 131 +- .../arkui-js/js-components-basic-progress.md | 531 +-- .../arkui-js/js-components-basic-qrcode.md | 147 +- .../arkui-js/js-components-basic-rating.md | 241 +- .../arkui-js/js-components-basic-richtext.md | 104 +- .../arkui-js/js-components-basic-search.md | 305 +- .../arkui-js/js-components-basic-select.md | 117 +- .../arkui-js/js-components-basic-slider.md | 258 +- .../arkui-js/js-components-basic-span.md | 148 +- .../arkui-js/js-components-basic-switch.md | 234 +- .../arkui-js/js-components-basic-text.md | 364 +- .../arkui-js/js-components-basic-textarea.md | 380 +- .../arkui-js/js-components-basic-toggle.md | 209 +- .../js-components-basic-toolbar-item.md | 293 +- .../arkui-js/js-components-basic-toolbar.md | 41 +- .../reference/arkui-js/js-components-basic.md | 56 +- .../arkui-js/js-components-canvas-canvas.md | 193 +- .../js-components-canvas-canvasgradient.md | 88 +- ...ponents-canvas-canvasrenderingcontext2d.md | 3857 ++++++----------- .../arkui-js/js-components-canvas-image.md | 91 +- .../js-components-canvas-imagebitmap.md | 39 +- .../js-components-canvas-imagedata.md | 48 +- .../js-components-canvas-offscreencanvas.md | 212 +- .../arkui-js/js-components-canvas-path2d.md | 1052 ++--- .../arkui-js/js-components-canvas.md | 20 +- .../js-components-common-animation.md | 458 +- .../js-components-common-atomic-layout.md | 89 +- .../js-components-common-attributes.md | 189 +- .../js-components-common-customizing-font.md | 18 +- .../arkui-js/js-components-common-events.md | 535 +-- .../arkui-js/js-components-common-gradient.md | 163 +- .../js-components-common-mediaquery.md | 311 +- .../arkui-js/js-components-common-methods.md | 902 +--- .../arkui-js/js-components-common-styles.md | 676 +-- .../js-components-common-transition.md | 261 +- .../arkui-js/js-components-common.md | 22 +- .../arkui-js/js-components-container-badge.md | 233 +- .../js-components-container-dialog.md | 163 +- .../arkui-js/js-components-container-div.md | 1092 ++--- .../arkui-js/js-components-container-form.md | 110 +- ...js-components-container-list-item-group.md | 190 +- .../js-components-container-list-item.md | 192 +- .../arkui-js/js-components-container-list.md | 735 +--- .../arkui-js/js-components-container-panel.md | 498 +-- .../arkui-js/js-components-container-popup.md | 236 +- .../js-components-container-refresh.md | 213 +- .../arkui-js/js-components-container-stack.md | 35 +- .../js-components-container-stepper-item.md | 280 +- .../js-components-container-stepper.md | 174 +- .../js-components-container-swiper.md | 350 +- .../js-components-container-tab-bar.md | 65 +- .../js-components-container-tab-content.md | 59 +- .../arkui-js/js-components-container-tabs.md | 116 +- .../arkui-js/js-components-container.md | 36 +- .../js-components-custom-basic-usage.md | 53 +- .../js-components-custom-event-parameter.md | 8 +- .../arkui-js/js-components-custom-events.md | 10 +- .../js-components-custom-lifecycle.md | 96 +- .../arkui-js/js-components-custom-props.md | 25 +- .../arkui-js/js-components-custom-slot.md | 19 +- .../arkui-js/js-components-custom.md | 14 +- .../js-components-grid-basic-concepts.md | 42 +- .../arkui-js/js-components-grid-col.md | 276 +- .../arkui-js/js-components-grid-container.md | 303 +- .../arkui-js/js-components-grid-row.md | 134 +- .../reference/arkui-js/js-components-grid.md | 10 +- .../arkui-js/js-components-media-video.md | 295 +- .../reference/arkui-js/js-components-media.md | 4 +- .../arkui-js/js-components-svg-animate.md | 226 +- .../js-components-svg-animatemotion.md | 82 +- .../js-components-svg-animatetransform.md | 66 +- .../arkui-js/js-components-svg-circle.md | 94 +- .../js-components-svg-common-attributes.md | 190 +- .../arkui-js/js-components-svg-ellipse.md | 106 +- .../arkui-js/js-components-svg-line.md | 100 +- .../arkui-js/js-components-svg-path.md | 72 +- .../arkui-js/js-components-svg-polygon.md | 72 +- .../arkui-js/js-components-svg-polyline.md | 66 +- .../arkui-js/js-components-svg-rect.md | 130 +- .../arkui-js/js-components-svg-text.md | 210 +- .../arkui-js/js-components-svg-textpath.md | 217 +- .../arkui-js/js-components-svg-tspan.md | 208 +- .../reference/arkui-js/js-components-svg.md | 118 +- .../reference/arkui-js/js-components.md | 16 +- .../js-offscreencanvasrenderingcontext2d.md | 502 +-- .../reference/arkui-js/js-svg.md | 32 +- .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes .../reference/arkui-ts/Readme-CN.md | 2 +- 341 files changed, 7798 insertions(+), 23120 deletions(-) rename zh-cn/application-dev/reference/arkui-js/figures/{Video_2021-03-26_154549.gif => zh-cn_image_0000001127125114.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{tab.gif => zh-cn_image_0000001127125116.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textpath-animate1.gif => zh-cn_image_0000001127125118.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{text-animate-part3.gif => zh-cn_image_0000001127125122.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{animate-4.gif => zh-cn_image_0000001127125126.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125174.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125178.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125180.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125184.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125188.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125190.png rename zh-cn/application-dev/reference/arkui-js/figures/{animate-transform2.gif => zh-cn_image_0000001127125192.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125194.png rename zh-cn/application-dev/reference/arkui-js/figures/{tspan-part1.png => zh-cn_image_0000001127125196.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{tspan-animate-part2.gif => zh-cn_image_0000001127125198.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{tspan-animate-part4.gif => zh-cn_image_0000001127125200.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125210.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125214.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125216.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125218.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125222.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125224.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125226.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125228.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125230.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125232.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125234.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125236.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125238.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125240.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125242.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125244.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125246.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125248.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125250.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125254.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125256.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125258.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125260.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125262.png rename zh-cn/application-dev/reference/arkui-js/figures/{gauge.png => zh-cn_image_0000001127125264.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textpath-animate4.gif => zh-cn_image_0000001127284924.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textPath-part4.png => zh-cn_image_0000001127284930.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{sample1.gif => zh-cn_image_0000001127284934.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{GIF.gif => zh-cn_image_0000001127284936.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{animate-3.gif => zh-cn_image_0000001127284938.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{image-animator.gif => zh-cn_image_0000001127284946.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284968.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284970.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284972.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284974.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284976.png rename zh-cn/application-dev/reference/arkui-js/figures/{list6.gif => zh-cn_image_0000001127284978.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284980.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284982.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284990.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284992.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284996.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284998.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285000.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285002.png rename zh-cn/application-dev/reference/arkui-js/figures/{animate-transform.gif => zh-cn_image_0000001127285004.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285006.png rename zh-cn/application-dev/reference/arkui-js/figures/{tspan-animate-part1.gif => zh-cn_image_0000001127285008.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285010.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285012.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285014.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285016.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285018.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285020.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285022.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285026.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285028.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285030.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285032.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285038.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285040.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285042.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285044.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285046.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285048.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285050.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285052.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285054.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285056.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285058.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285060.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285062.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285064.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285066.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285068.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285070.png rename zh-cn/application-dev/reference/arkui-js/figures/{000000.jpg => zh-cn_image_0000001127285072.jpg} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{menu13.gif => zh-cn_image_0000001131795738.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{c3.png => zh-cn_image_0000001152773860.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{1-3.gif => zh-cn_image_0000001167662852.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{3.png => zh-cn_image_0000001167823076.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{4-0.gif => zh-cn_image_0000001167823326.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{4.gif => zh-cn_image_0000001167846062.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{smoothOff.png => zh-cn_image_0000001167952236.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{6.gif => zh-cn_image_0000001168005276.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{5.gif => zh-cn_image_0000001168440692.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textPath-part1.png => zh-cn_image_0000001173164775.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textpath-animate3.gif => zh-cn_image_0000001173164779.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{text-animate-part2.gif => zh-cn_image_0000001173164783.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{panel6.gif => zh-cn_image_0000001173164785.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{1.jpg => zh-cn_image_0000001173164799.jpg} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164835.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164837.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164841.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164843.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164849.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164851.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164855.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164859.gif rename zh-cn/application-dev/reference/arkui-js/figures/{tspan-animate-part3.gif => zh-cn_image_0000001173164863.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164865.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164875.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164877.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164879.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164881.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164883.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164885.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164887.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164889.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164893.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164895.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164897.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164899.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164901.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164905.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164907.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164909.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164911.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164913.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164915.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164917.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164921.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164923.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164925.png rename zh-cn/application-dev/reference/arkui-js/figures/{screenshot.png => zh-cn_image_0000001173164927.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{barchart.png => zh-cn_image_0000001173164929.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textPath-part3.png => zh-cn_image_0000001173324689.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textPath-part2.png => zh-cn_image_0000001173324691.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{textpath-animate2.gif => zh-cn_image_0000001173324693.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{text-part1.png => zh-cn_image_0000001173324697.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{text-animate-part1.gif => zh-cn_image_0000001173324699.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{animate-1.gif => zh-cn_image_0000001173324703.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{slider.png => zh-cn_image_0000001173324709.png} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324729.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324731.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324733.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324735.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324737.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324739.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324741.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324743.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324745.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324747.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324755.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324757.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324759.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324761.png rename zh-cn/application-dev/reference/arkui-js/figures/{animate-transform3.gif => zh-cn_image_0000001173324765.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324767.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324769.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324771.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324773.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324775.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324777.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324779.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324781.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324785.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324789.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324793.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324795.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324799.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324801.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324803.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324805.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324807.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324809.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324811.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324813.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324815.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324817.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324821.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324823.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324825.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324829.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324831.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324833.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324835.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324837.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324839.png rename zh-cn/application-dev/reference/arkui-js/figures/{sssssss.png => zh-cn_image_0000001173324845.png} (100%) rename "zh-cn/application-dev/reference/arkui-js/figures/\346\215\225\350\216\267.png" => zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001177265268.png (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{11-1.gif => zh-cn_image_0000001177428498.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001179981036.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001180134670.gif rename zh-cn/application-dev/reference/arkui-js/figures/{progress.png => zh-cn_image_0000001180339632.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{001.gif => zh-cn_image_0000001180658376.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{list.png => zh-cn_image_0000001185033226.png} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001188551432.png create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001188711340.png rename zh-cn/application-dev/reference/arkui-js/figures/{222.png => zh-cn_image_0000001189854534.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{111.png => zh-cn_image_0000001190934502.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{mmmm.gif => zh-cn_image_0000001191939702.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{grid.gif => zh-cn_image_0000001192960596.gif} (100%) rename "zh-cn/application-dev/reference/arkui-js/figures/\345\215\241\347\211\207\350\275\254\345\234\272.gif" => zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001193544358.gif (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{1-2.png => zh-cn_image_0000001198530395.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{zh-cn_image_0000001198898293.png => zh-cn_image_0000001207995958.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{zh-cn_image_0000001173324749.png => zh-cn_image_0000001208155956.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{zh-cn_image_0000001173324751.png => zh-cn_image_0000001208315918.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{0.png => zh-cn_image_0000001212053183.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{2.png => zh-cn_image_0000001213103299.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{11.png => zh-cn_image_0000001213276619.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{9.gif => zh-cn_image_0000001213284927.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{2-4.gif => zh-cn_image_0000001213381209.gif} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{22.png => zh-cn_image_0000001213396721.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{ellipse.png => zh-cn_image_0000001214823665.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{12.gif => zh-cn_image_0000001222948301.gif} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001224225943.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001225204601.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001225418523.gif rename "zh-cn/application-dev/reference/arkui-js/figures/AnimationAPI\350\243\201\345\211\252.gif" => zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001229677045.gif (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{333.png => zh-cn_image_0000001236694521.png} (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{444.png => zh-cn_image_0000001237134475.png} (100%) rename "zh-cn/application-dev/reference/arkui-js/figures/\345\205\261\344\272\253\345\205\203\347\264\240\350\275\254\345\234\272\351\273\230\350\256\244\346\225\210\346\236\234.png" => zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001238424309.png (100%) rename zh-cn/application-dev/reference/arkui-js/figures/{zh-cn_image_0000001127284984.png => zh-cn_image_0000001252835901.png} (100%) create mode 100644 zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-caution.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-danger.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-note.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-notice.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-tip.gif create mode 100644 zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-warning.gif diff --git a/zh-cn/application-dev/reference/apis/Readme-CN.md b/zh-cn/application-dev/reference/apis/Readme-CN.md index 837523f1a20..184a5d5467b 100644 --- a/zh-cn/application-dev/reference/apis/Readme-CN.md +++ b/zh-cn/application-dev/reference/apis/Readme-CN.md @@ -19,13 +19,13 @@ - [音频管理](js-apis-audio.md) - [媒体服务](js-apis-media.md) - [图片处理](js-apis-image.md) + - [相机管理](js-apis-camera.md) - 安全 - [用户认证](js-apis-useriam-userauth.md) - [访问控制](js-apis-abilityAccessCtrl.md) - [通用密钥库系统](js-apis-huks.md) - 数据管理 - [轻量级存储](js-apis-data-preferences.md) - - [轻量级存储(废弃 since 8)](js-apis-data-storage.md) - [分布式数据管理](js-apis-distributed-data.md) - [关系型数据库](js-apis-data-rdb.md) - [结果集](js-apis-data-resultset.md) @@ -49,7 +49,9 @@ - [网络搜索](js-apis-radio.md) - [observer](js-apis-observer.md) - [蜂窝数据](js-apis-telephony-data.md) -- 网络与连接 +- 网络管理 + - [网络连接管理](js-apis-net-connection.md) +- 通信与连接 - [WLAN](js-apis-wifi.md) - [Bluetooth](js-apis-bluetooth.md) - 设备管理 diff --git a/zh-cn/application-dev/reference/apis/js-apis-camera.md b/zh-cn/application-dev/reference/apis/js-apis-camera.md index cb34f90715f..5393f3f49ca 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-camera.md +++ b/zh-cn/application-dev/reference/apis/js-apis-camera.md @@ -1,4 +1,4 @@ -# 相机管理 +# 相机管理 ## 导入模块 @@ -8,30 +8,22 @@ import camera from '@ohos.multimedia.camera'; ## 权限 -``` ohos.permission.CAMERA -``` -## getCameraManager(context: Context, callback: AsyncCallback): void; -**系统能力:** +## camera.getCameraManager -SystemCapability.Multimedia.Camera.Core +getCameraManager(context: Context, callback: AsyncCallback): void -**说明:** +获取相机管理器实例,通过注册回调函数获取结果。 -获取**相机管理器**,使用callback方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|-------------------------------|-----------|-----------------------------------------------------| -| context | Context | Yes | 应用环境 | -| callback | AsyncCallback | Yes | 使用callback方式获取**相机管理器**实例
| - - -**返回值:** - -none +| context | Context | 是 | 应用上下文。 | +| callback | AsyncCallback<[CameraManager](#cameramanager)\> | 是 | 回调函数,用于获取相机管理器实例。 | **示例:** @@ -45,27 +37,25 @@ camera.getCameraManager(context, (err, cameraManager) => { }); ``` -## getCameraManager(context: Context): Promise; +## camera.getCameraManager -**系统能力:** +getCameraManager(context: Context): Promise -SystemCapability.Multimedia.Camera.Core +获取相机管理器实例,通过Promise获取结果。 -**说明:** - -获取**相机管理器**,使用promise的方式获取一个实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------| -| context | Context | Yes | 应用环境 | +| context | Context | 是 | 应用上下文。 | **返回值:** | 类型 | 说明 | |-------------------------|--------------------------------------------------------| -| Promise | 使用Promise的方式获取一个**相机管理器** 实例 | +| Promise<[CameraManager](#cameramanager)\> | 使用Promise的方式获取一个相机管理器实例。 | **示例:** @@ -75,87 +65,81 @@ camera.getCameraManager(context).then((cameraManger) => { }) ``` -## CameraStatus +## CameraStatus -枚举相机状态类型。 +枚举,相机状态。 | 名称 | 默认值 | 说明 | |---------------------------|---------------|--------------------| -| CAMERA_STATUS_APPEAR | 0 | Camera appear
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_DISAPPEAR | 1 | Camera disappear
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_AVAILABLE | 2 | 相机就绪
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_UNAVAILABLE | 3 | 相机未就绪
系统能力 : SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_APPEAR | 0 | 相机存在。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_DISAPPEAR | 1 | 相机不存在。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_AVAILABLE | 2 | 相机就绪。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_UNAVAILABLE | 3 | 相机未就绪。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraPosition +## CameraPosition -枚举相机位置。 +枚举,相机方向。 | 名称 | 默认值 | 说明 | |-----------------------------|---------------|-----------------------| -| CAMERA_POSITION_UNSPECIFIED | 0 | 未指定方向相机
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_POSITION_BACK | 1 | 后置相机
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_POSITION_FRONT | 2 | 前置相机
系统能力 : SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_UNSPECIFIED | 0 | 未指定方向相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_BACK | 1 | 后置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_FRONT | 2 | 前置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraType +## CameraType -枚举相机类型。 +枚举,相机类型。 | 名称 | 默认值 | 说明 | |-------------------------|---------------|-------------------------| -| CAMERA_TYPE_UNSPECIFIED | 0 | 未指定相机类型
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_WIDE_ANGLE | 1 | 广角相机
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_ULTRA_WIDE | 2 | 超级广角相机
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_TELEPHOTO | 3 | 电话相机
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_TRUE_DEPTH | 4 | 深度相机
系统能力 : SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_UNSPECIFIED | 0 | 未指定相机类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_WIDE_ANGLE | 1 | 广角相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_ULTRA_WIDE | 2 | 超级广角相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_TELEPHOTO | 3 | 长焦相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_TRUE_DEPTH | 4 | 深度相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## ConnectionType +## ConnectionType -枚举相机连接类型。 +枚举,相机连接类型。 | 名称 | 默认值 | 说明 | |------------------------------|---------------|----------------------------| -| CAMERA_CONNECTION_BUILT_IN | 0 | 内置相机
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_CONNECTION_USB_PLUGIN | 1 | USB外连相机
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_CONNECTION_REMOTE | 2 | 分布式相机
系统能力 : SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_BUILT_IN | 0 | 内置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_USB_PLUGIN | 1 | 外置USB相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_REMOTE | 2 | 分布式相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraFormat +## CameraFormat -枚举相机格式。 +枚举,照片格式。 | 名称 | 默认值 | 说明 | |----------------------------|---------------|---------------------| -| CAMERA_FORMAT_YCRCb_420_SP | 1003 | YCRCb格式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_JPEG | 2000 | JPEG格式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_AVC | 3000 | AVC 格式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_HEVC | 3001 | HEVC 格式
系统能力 : SystemCapability.Multimedia.Camera.Core | - +| CAMERA_FORMAT_YCRCb_420_SP | 1003 | YCRCb格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_JPEG | 2000 | JPEG格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_AVC | 3000 | AVC格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_HEVC | 3001 | HEVC格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraManager -相机管理器类, 包含获取相机并创建“相机输入”实例。 +## CameraManager -### getCameras(callback: AsyncCallback\>): void; +相机管理器类,使用前需要通过getCameraManager获取相机管理实例。 -**系统能力:** +### getCameras -SystemCapability.Multimedia.Camera.Core +getCameras(callback: AsyncCallback\>): void -**说明:** +异步获取设备支持的相机列表,通过注册回调函数获取结果。 -获取设备支持的所有相机,使用callback方式获取异步的支持相机列表。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------|-----------|---------------------------------------------------------| -| callback | AsyncCallback\> | Yes | 使用callback方式获取支持的相机列表 | - -**返回值:** - -none +| callback | AsyncCallback\> | 是 | 使用callback方式获取支持的相机列表。 | **示例:** @@ -169,25 +153,19 @@ cameraManager.getCameras((err, cameras) => { }) ``` -### getCameras(): Promise\>; - -**系统能力:** +### getCameras -SystemCapability.Multimedia.Camera.Core +getCameras(): Promise\> -**说明:** +异步获取设备支持的相机列表,通过Promise获取结果。 -获取设备支持的所有相机,使用promise方式获取支持相机列表。 - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |------------------------|--------------------------------------------------------| -| Promise\> | 使用promise方获取支持相机列表 | +| Promise\> | 使用promise获取支持相机列表。 | **示例:** @@ -198,26 +176,20 @@ cameraManager.getCameras().then((cameraArray) => { }) ``` -### createCameraInput(cameraId: string, callback: AsyncCallback): void; +### createCameraInput -**系统能力:** +createCameraInput(cameraId: string, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +使用相机ID异步创建CameraInput实例,通过注册回调函数获取结果。 -**说明:** - -使用相机ID创建 **相机输入** 实例,使用callback方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 默认值 | 必填 | 说明 | |----------|------------------------------|-----------|--------------------------------------------------| -| cameraId | string | Yes | 使用 相机ID 来创建一个实例 | -| callback | AsyncCallback | Yes | 使用Callback方式来获取一个 CameraInput 实例 | - -**返回值:** - -none +| cameraId | string | 是 | 指定相机ID。 | +| callback | AsyncCallback<[CameraInput](#camerainput)\> | 是 | 回调函数,用于获取CameraInput实例。 | **示例:** @@ -231,27 +203,25 @@ cameraManager.createCameraInput(cameraId, (err, cameraInput) => { }) ``` -### createCameraInput(cameraId: string): Promise; - -**系统能力:** +### createCameraInput -SystemCapability.Multimedia.Camera.Core +createCameraInput(cameraId: string): Promise -**说明:** +使用相机ID异步创建CameraInput实例,通过Promise获取结果。 -使用相机ID创建 **相机输入** 实例,使用promise方式获取一个实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 默认值 | 必填 | 说明 | |----------|-----------------------------|-----------|------------------------------------------| -| cameraId | string | Yes | 使用 相机ID 来创建一个实例 | +| cameraId | string | 是 | 指定相机ID。 | **返回值:** | 类型 | 说明 | |-------------------------|-------------------------------------------------| -| Promise | 使用Promise的方式获取一个 CameraInput 的实例 | +| Promise<[CameraInput](#camerainput)\> | 使用Promise的方式获取CameraInput的实例。 | **示例:** @@ -261,29 +231,23 @@ cameraManager.createCameraInput(cameraId).then((cameraInput) => { }) ``` -### createCameraInput(position: CameraPosition, type: CameraType, callback: AsyncCallback): void; - -**系统能力:** +### createCameraInput -SystemCapability.Multimedia.Camera.Core +createCameraInput(position: CameraPosition, type: CameraType, callback: AsyncCallback): void -**说明:** +使用相机位置和相机类型异步创建CameraInput实例,通过注册回调函数获取结果。 -使用相机位置和相机类型创建 **相机输入** 实例, 使用callback方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------------|----------------------------|-----------|---------------------------------------------------| -| cameraPosition | CameraPosition | Yes | 相机位置 | -| cameraType | CameraType | Yes | 相机类型 | -| callback | AsyncCallback | Yes | 使用callback方式获取一个异步的实例 | - -**返回值:** +| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。 | +| cameraType | [CameraType](#cameratype) | 是 | 相机类型。 | +| callback | AsyncCallback<[CameraInput](#camerainput)\> | 是 | 回调函数,用于获取CameraInput实例。 | -none - -**实例:** +**示例:** ``` cameraManager.createCameraInput(cameraPosition, cameraType, (err, cameraInput) => { @@ -295,28 +259,26 @@ cameraManager.createCameraInput(cameraPosition, cameraType, (err, cameraInput) = }) ``` -### createCameraInput(position: CameraPosition, type: CameraType): Promise; - -**系统能力:** +### createCameraInput -SystemCapability.Multimedia.Camera.Core +createCameraInput(position: CameraPosition, type: CameraType): Promise -**说明:** +使用相机位置和相机类型异步创建CameraInput实例,通过Promise获取结果。 -使用相机位置和相机类型创建 **相机输入** 实例, 使用promise的方式获取一个实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------------|----------------------------|-----------|----------------------------------------| -| cameraPosition | CameraPosition | Yes | 相机位置 | -| cameraType | CameraType | Yes | 相机类型 | +| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。 | +| cameraType | [CameraType](#cameratype) | 是 | 相机类型。 | **返回值:** | 类型 | 说明 | |-------------------------|-------------------------------------------------| -| Promise | 使用promise的方式获取一个**相机输入**实例 | +| Promise<[CameraInput](#camerainput)\> | 使用Promise的方式获取CameraInput的实例。 | **示例:** @@ -326,26 +288,20 @@ cameraManager.createCameraInput(cameraPosition, cameraType).then((cameraInput) = }) ``` -### on(type: 'cameraStatus', callback: Callback): void; +### on('cameraStatus') -**系统能力:** +on(type: 'cameraStatus', callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +监听相机的状态变化,通过注册回调函数获取相机的状态变化。 -**说明:** - -监听相机的状态变化,使用callback的方式获取相机的状态变化 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :--------------------------------------------------- | -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取相机状态变化 | - -**返回值:** - -None +| type | string | 是 | 监听事件。 | +| callback | AsyncCallback<[CameraStatusInfo](#camerastatusinfo)\> | 是 | 回调函数,用于获取相机状态变化信息。 | **示例:** @@ -356,18 +312,18 @@ cameraManager.on('cameraStatus', (cameraStatusInfo) => { }) ``` -## Camera - -**相机**类。 +## Camera -**字段:** +相机实例。 -| 名称 | 类型 | 访问权限 | 说明 | +| 名称 | 类型 | 只读 | 说明 | |----------------|----------------|----------|------------------------| -| cameraId | string | readonly | 相机ID
系统能力 : SystemCapability.Multimedia.Camera.Core | -| cameraPosition | cameraPosition | readonly | 相机位置
系统能力 : SystemCapability.Multimedia.Camera.Core | -| cameraType | cameraType | readonly | 相机类型
系统能力 : SystemCapability.Multimedia.Camera.Core | -| connectionType | connectionType | readonly | 相机连接类型
系统能力 : SystemCapability.Multimedia.Camera.Core | +| cameraId | string | 是 | 相机ID。
**系统能力:** SystemCapability.Multimedia.Camera.Core| +| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| cameraType | [CameraType](#cameratype) | 是 | 相机类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| connectionType | [ConnectionType](#connectiontype) | 是 | 相机连接类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | + +**示例:** ``` var cameraManager = await camera.getCameraManager(); @@ -380,41 +336,35 @@ var cameraId = cameraObj.connectionType; ``` -## CameraStatusInfo - -**相机状态信息**类。 +## CameraStatusInfo -**字段:** +相机状态信息。 | 名称 | 类型 | 说明 | |----------------|----------------|------------------| -| camera | Camera | 相机类
系统能力 : SystemCapability.Multimedia.Camera.Core | -| status | CameraStatus | 相机状态
系统能力 : SystemCapability.Multimedia.Camera.Core | - +| camera | [Camera](#camera) | 相机信息。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| status | [CameraStatus](#camerastatus) | 相机状态。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraInput -**相机输入** 类。 +## CameraInput -### getCameraId(callback: AsyncCallback\): void; +相机输入类。在使用该类的方法前,需要先构建一个CameraInput实例。 -**系统能力:** +### getCameraId -SystemCapability.Multimedia.Camera.Core +getCameraId(callback: AsyncCallback\): void -**说明:** +异步获取该CameraInput实例的相机ID,通过注册回调函数获取结果。 -获取该**相机输入** 实例的相机ID, 使用callback的方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|------------------------|-----------|---------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取 相机ID | +| callback | AsyncCallback | 是 | 回调函数,用于获取相机ID。 | -**返回值:** - -none +**示例:** ``` cameraInput.getCameraId((err, cameraId) => { @@ -426,25 +376,19 @@ cameraInput.getCameraId((err, cameraId) => { }) ``` -### getCameraId(): Promise; +### getCameraId -**系统能力:** +getCameraId(): Promise -SystemCapability.Multimedia.Camera.Core +异步获取该CameraInput实例的相机ID,通过Promise获取结果。 -**说明:** - -获取该**相机输入** 实例的相机ID, 使用promise的方式获取相机ID。 - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |------------------------|--------------------------------------| -| Promise | 使用promise的方式获取相机ID | +| Promise | 使用Promise的方式获取相机ID。 | **示例:** @@ -454,27 +398,20 @@ cameraInput.getCameraId().then((cameraId) => { }) ``` -### getSupportedSizes\(format: CameraFormat, callback: AsyncCallback\>\): void; - -**系统能力:** +### getSupportedSizes -SystemCapability.Multimedia.Camera.Core +getSupportedSizes\(format: CameraFormat, callback: AsyncCallback\>\): void -**说明:** +根据指定格式,获取相机支持的分辨率,通过注册回调函数获取结果。 -根据格式查询相机支持的分辨率,使用callback的方式获取一个异步的支持分辨率。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|------------------------------|-----------|---------------------------------------------| -| format | CameraFormat | Yes | 使用CameraFormat来获取支持分辨率 | -| callback | AsyncCallback\> | Yes | 使用callback的方式来获取支持分辨率 | - - -**返回值:** - -none +| format | [CameraFormat](#cameraformat) | 是 | 指定照片格式。 | +| callback | AsyncCallback\> | 是 | 回调函数,用于获取相机支持分辨率。 | **示例:** @@ -488,27 +425,25 @@ cameraInput.getSupportedSizes(format, (err, sizes) => { }) ``` -### getSupportedSizes\(format: CameraFormat\): Promise\>; - -**系统能力:** +### getSupportedSizes -SystemCapability.Multimedia.Camera.Core +getSupportedSizes\(format: CameraFormat\): Promise\> -**说明:** +根据指定格式,获取相机支持的分辨率,通过Promise获取结果。 -获取CameraFormat的支持分辨率,使用promise的方式获取支持分辨率。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** -| 名称 | 类型 | 必填 | 说明 | -|----------|----------------------------|-----------|-----------------------------------------------| -| format | CameraFormat | Yes | 使用Camera format 获取支持分辨率 | +| 名称 | 类型 | 必填 | 说明 | +| ------ | ----------------------------- | ---- | -------------- | +| format | [CameraFormat](#cameraformat) | 是 | 指定照片格式。 | **返回值:** | 类型 | 说明 | |------------------------|---------------------------------------------| -| Promise\> | 使用promise的方式获取支持分辨率. | +| Promise\> | 使用Promise的方式获取相机支持的分辨率。 | **示例:** @@ -518,26 +453,19 @@ cameraInput.getSupportedSizes(format).then((sizes) => { }) ``` -### getSupportedPreviewFormats\(callback: AsyncCallback\>\): void; - -**系统能力:** +### getSupportedPreviewFormats -SystemCapability.Multimedia.Camera.Core +getSupportedPreviewFormats\(callback: AsyncCallback\>\): void -**说明:** +获取相机预览图片的支持格式,通过注册回调函数获取结果。 -获取预览的支持格式,使用callback的方式获取一个异步的支持格式. +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** -| 名称 | 类型 | 必填 | 说明 | -|----------|--------------------------------------|-----------|---------------------------------------------------| -| callback | AsyncCallback\> | Yes | 使用callback的方式获取支持的预览格式. | - - -**返回值:** - -none +| 名称 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------- | ---- | -------------------------------------- | +| callback | AsyncCallback\> | 是 | 回调函数,用于获取预览图片的支持格式。 | **示例:** @@ -551,26 +479,19 @@ cameraInput.getSupportedPreviewFormats((err, previewFormats) => { }) ``` +### getSupportedPreviewFormats -### getSupportedPreviewFormats\(\): Promise\>; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +getSupportedPreviewFormats\(\): Promise\> -**说明:** - -获取预览的 supported formats,使用promise的方式获取supported formats. - -**参数:** +获取相机预览图片的支持格式,通过注册回调函数获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |--------------------------------|-------------------------------------------------------| -| Promise\> | 使用promise的方式获取supported preview formats | +| Promise\> | 使用Promise的方式获取预览图片的支持格式。 | **示例:** @@ -580,25 +501,19 @@ cameraInput.getSupportedPreviewFormats().then((previewFormats) => { }) ``` -### getSupportedPhotoFormats\(callback: AsyncCallback\>\): void; +### getSupportedPhotoFormats -**系统能力:** +getSupportedPhotoFormats\(callback: AsyncCallback\>\): void -SystemCapability.Multimedia.Camera.Core +获取照片的支持格式,通过注册回调函数获取结果。 -**说明:** - -获取 photographing的supported formats,使用callback的方式获取一个异步的supported formats. +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | Yes | 使用callback的方式获取支持的照片格式 | - -**返回值:** - -none +| callback | AsyncCallback\> | 是 | 回调函数,用于获取支持的照片格式。 | **示例:** @@ -612,25 +527,19 @@ cameraInput.getSupportedPhotoFormats((err, photoFormats) => { }) ``` -### getSupportedPhotoFormats\(\): Promise\>; - -**系统能力:** +### getSupportedPhotoFormats -SystemCapability.Multimedia.Camera.Core +getSupportedPhotoFormats\(\): Promise\> -**说明:** +获取照片的支持格式,通过Promise获取结果。 -获取 photographing的supported formats,使用promise的方式获取supported formats. - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |--------------------------------|---------------------------------------------------| -| Promise\> | 使用promise的方式获取支持的照片格式 | +| Promise\> | 使用Promise的方式获取支持的照片格式。 | **示例:** @@ -640,25 +549,19 @@ cameraInput.getSupportedPhotoFormats().then((photoFormats) => { }) ``` -### getSupportedVideoFormats\(callback: AsyncCallback\>\): void; - -**系统能力:** +### getSupportedVideoFormats -SystemCapability.Multimedia.Camera.Core +getSupportedVideoFormats\(callback: AsyncCallback\>\): void -**说明:** +获取录制视频的支持格式,通过注册回调函数获取结果。 -获取录制视频的supported formats,使用callback的方式获取一个异步的支持的录像格式。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | Yes | 使用callback的方式获取支持的录像格式 | - -**返回值:** - -none +| callback | AsyncCallback\> | 是 | 回调函数,用于获取支持的视频格式。 | **示例:** @@ -672,25 +575,19 @@ cameraInput.getSupportedVideoFormats((err, videoFormats) => { }) ``` -### getSupportedVideoFormats\(\): Promise\>; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +### getSupportedVideoFormats -**说明:** +getSupportedVideoFormats\(\): Promise\> -获取录制视频的supported formats,使用promise的方式获取支持的录像格式。 +获取录制视频的支持格式,通过Promise获取结果。 -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |--------------------------------|---------------------------------------------------| -| Promise\> | 使用promise的方式获取支持的录像格式 | +| Promise\> | 使用Promise的方式获取支持的视频格式。 | **示例:** @@ -700,25 +597,19 @@ cameraInput.getSupportedVideoFormats().then((videoFormats) => { }) ``` -### hasFlash(callback: AsyncCallback): void; - -**系统能力:** +### hasFlash -SystemCapability.Multimedia.Camera.Core +hasFlash(callback: AsyncCallback): void -**说明:** +判断设备是否支持闪光灯,通过注册回调函数获取结果。 -检查设备是否支持闪光灯,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|-------------------------|-----------|----------------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取支持闪光灯的状态 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,返回true表示设备支持闪光灯。 | **示例:** @@ -732,25 +623,19 @@ cameraInput.hasFlash((err, status) => { }) ``` -### hasFlash(): Promise; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +### hasFlash -**说明:** +hasFlash(): Promise -检查设备是否支持闪光灯,使用promise的方式获取结果。 +判断设备是否支持闪光灯,通过Promise获取结果。 -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |-----------------------|--------------------------------------------------------| -| Promise | 使用promise的方式获取支持闪光灯的状态。 | +| Promise | 使用Promise的方式获取结果,返回true表示设备支持闪光灯。 | **示例:** @@ -760,26 +645,20 @@ cameraInput.hasFlash().then((status) => { }) ``` -### isFlashModeSupported(flashMode: FlashMode, callback: AsyncCallback): void; - -**系统能力:** +### isFlashModeSupported -SystemCapability.Multimedia.Camera.Core +isFlashModeSupported(flashMode: FlashMode, callback: AsyncCallback): void -**说明:** +判断设备是否支持指定闪光灯模式,通过注册回调函数获取结果。 -检查设备是否支持闪光灯模式,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | 闪光灯模式 | -| callback | AsyncCallback | Yes | 使用callback的方式获取设备支持闪光灯模式 | - -**返回值:** - -none +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | +| callback | AsyncCallback | 是 | 回调函数,返回true表示支持该闪光灯模式。 | **示例:** @@ -793,27 +672,25 @@ cameraInput.isFlashModeSupported(flashMode, (err, status) => { }) ``` -### isFlashModeSupported(flashMode: FlashMode): Promise; +### isFlashModeSupported -**系统能力:** +isFlashModeSupported(flashMode: FlashMode): Promise -SystemCapability.Multimedia.Camera.Core +判断设备是否支持指定闪光灯模式,通过Promise获取结果。 -**说明:** - -检查设备是否支持闪光灯模式,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | 闪光灯模式 | +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | **返回值:** | 类型 | 说明 | |-----------------------|---------------------------------------------------| -| Promise | 使用promise的方式获取支持的闪光灯模式 | +| Promise | 使用Promise的方式获取结果,返回true表示设备支持该闪光灯模式。 | **示例:** @@ -823,28 +700,25 @@ cameraInput.isFlashModeSupported(flashMode).then((status) => { }) ``` -### setFlashMode(flashMode: FlashMode, callback: AsyncCallback): void; +### setFlashMode -**系统能力:** +setFlashMode(flashMode: FlashMode, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +设置闪光灯模式,通过注册回调函数获取结果。 -**说明:** +进行设置之前,需要先检查: -设置闪光灯模式,使用callback的方式获取一个异步的结果。 +1. 设备是否支持闪光灯,可使用方法[hasFlash](#hasflash)。 +2. 设备是否支持指定的闪光灯模式,可使用方法[isFlashModeSupported](#isflashmodesupported)。 -说明: 设置闪光灯模式之前, 检查支持的闪光灯 (hasFlash method) 以及支持的闪光灯模式 (isFlashModeSupported method); +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | 闪光灯模式 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -858,29 +732,30 @@ cameraInput.setFlashMode(flashMode, (err) => { }) ``` -### setFlashMode(flashMode: FlashMode): Promise; +### setFlashMode -**系统能力:** +setFlashMode(flashMode: FlashMode): Promise -SystemCapability.Multimedia.Camera.Core +设置闪光灯模式,通过Promise获取结果。 -**说明:** +进行设置之前,需要先检查: -设置闪光灯模式,使用promise的方式获取结果。 +1. 设备是否支持闪光灯,可使用方法[hasFlash](#hasflash)。 +2. 设备是否支持指定的闪光灯模式,可使用方法[isFlashModeSupported](#isflashmodesupported)。 -说明: 设置闪光灯模式之前, 检查支持的闪光灯 (hasFlash method) 以及支持的闪光灯模式 (isFlashModeSupported method); +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | 闪光灯模式 | +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | **返回值:** | 类型 | 说明 | |-----------------------|-----------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -890,25 +765,19 @@ cameraInput.setFlashMode(flashMode).then() => { }) ``` -### getFlashMode(callback: AsyncCallback): void; - -**系统能力:** +### getFlashMode -SystemCapability.Multimedia.Camera.Core +getFlashMode(callback: AsyncCallback): void -**说明:** +获取当前设备的闪光灯模式,通过注册回调函数获取结果。 -获取当前闪光灯模式,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|---------------------------|-----------|------------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取当前闪光灯模式 | - -**返回值:** - -none +| callback | AsyncCallback<[FlashMode](#flashmode)\> | 是 | 回调函数,用于获取当前设备的闪光灯模式。 | **示例:** @@ -922,25 +791,19 @@ cameraInput.getFlashMode((err, flashMode) => { }) ``` -### getFlashMode(): Promise; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core - -**说明:** +### getFlashMode -获取当前闪光灯模式,使用promise的方式获取结果。 +getFlashMode(): Promise -**参数:** +获取当前设备的闪光灯模式,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |-----------------------|---------------------------------------------------| -| Promise | 使用promise的方式获取当前闪光灯模式 | +| Promise<[FlashMode](#flashmode)\> | 使用Promise的方式获取当前的闪光灯模式。 | **示例:** @@ -950,26 +813,20 @@ cameraInput.getFlashMode().then(flashMode) => { }) ``` -### isFocusModeSupported(afMode: FocusMode, callback: AsyncCallback): void; - -**系统能力:** +### isFocusModeSupported -SystemCapability.Multimedia.Camera.Core +isFocusModeSupported(afMode: FocusMode, callback: AsyncCallback): void -**说明:** +判断设备是否支持指定的焦距模式,通过注册回调函数获取结果。 -检查支持的焦距模式,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| afMode | FocusMode | Yes | 焦距模式 | -| callback | AsyncCallback | Yes | 使用callback的方式获取设备支持的焦距模式 | - -**返回值:** - -none +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | +| callback | AsyncCallback | 是 | 回调函数,返回true表示支持该焦距模式。 | **示例:** @@ -983,27 +840,25 @@ cameraInput.isFocusModeSupported(afMode, (err, status) => { }) ``` -### isFocusModeSupported(afMode: FocusMode): Promise; - -**系统能力:** +### isFocusModeSupported -SystemCapability.Multimedia.Camera.Core +isFocusModeSupported(afMode: FocusMode): Promise -**说明:** +判断设备是否支持指定的焦距模式,通过Promise获取结果。 -检查支持的焦距模式,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|----------------------------------------|-----------|-------------| -| afMode | FocusMode | Yes | 焦距模式 | +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | **返回值:** | 类型 | 说明 | |-----------------------|---------------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果,返回true表示设备支持该焦距模式。 | **示例:** @@ -1013,28 +868,22 @@ cameraInput.isFocusModeSupported(afMode).then((status) => { }) ``` -### setFocusMode(afMode: FocusMode, callback: AsyncCallback): void; +### setFocusMode -**系统能力:** +setFocusMode(afMode: FocusMode, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +设置焦距模式,通过注册回调函数获取结果。 -**说明:** +进行设置之前,需要先检查设备是否支持指定的焦距模式,可使用方法[isFocusModeSupported](#isfocusmodesupported)。 -设置焦距模式,使用callback的方式获取一个异步的结果。 - -说明:使用设置焦距模式之前,检查设备支持的焦距模式 (isFocusModeSupported method); +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|------------------------------------| -| afMode | FocusMode | Yes | 焦距模式 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1048,29 +897,27 @@ cameraInput.setFocusMode(afMode, (err) => { }) ``` -### setFocusMode(afMode: FocusMode): Promise; - -**系统能力:** +### setFocusMode -SystemCapability.Multimedia.Camera.Core +setFocusMode(afMode: FocusMode): Promise -**说明:** +设置焦距模式,通过Promise获取结果。 -设置焦距模式,使用promise的方式获取结果。 +进行设置之前,需要先检查设备是否支持指定的焦距模式,可使用方法[isFocusModeSupported](#isfocusmodesupported)。 -说明:使用设置焦距模式之前,检查设备支持的焦距模式 (isFocusModeSupported method); +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|-----------------------------------------|-----------|-------------| -| afMode | FocusMode | Yes | 焦距模式 | +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | **返回值:** | 类型 | 说明 | |-----------------------|-----------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1080,25 +927,19 @@ cameraInput.setFocusMode(afMode).then() => { }) ``` -### getFocusMode(callback: AsyncCallback): void; - -**系统能力:** +### getFocusMode -SystemCapability.Multimedia.Camera.Core +getFocusMode(callback: AsyncCallback): void -**说明:** +获取当前设备的焦距模式,通过注册回调函数获取结果。 -获取当前的焦距模式,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|---------------------------|-----------|------------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback<[FocusMode](#focusmode)\> | 是 | 回调函数,用于获取当前设备的焦距模式。 | **示例:** @@ -1112,25 +953,19 @@ cameraInput.getFocusMode((err, afMode) => { }) ``` -### getFocusMode(): Promise; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +### getFocusMode -**说明:** +getFocusMode(): Promise -获取当前的焦距模式,使用promise的方式获取结果。 +获取当前设备的焦距模式,通过Promise获取结果。 -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** -| 类型 | 说明 | -|-----------------------|---------------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| 类型 | 说明 | +| ------------------- | ------------------------------------- | +| Promise | 使用Promise的方式获取当前的焦距模式。 | **示例:** @@ -1140,26 +975,19 @@ cameraInput.getFocusMode().then(afMode) => { }) ``` -### getZoomRatioRange\(callback: AsyncCallback\>\): void; +### getZoomRatioRange -**系统能力:** +getZoomRatioRange\(callback: AsyncCallback\>\): void -SystemCapability.Multimedia.Camera.Core +获取可变焦距比范围,通过注册回调函数获取结果。 -**说明:** - -获取变焦比率的范围,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | Yes | 使用callback的方式获取变焦比率的范围 | - - -**返回值:** - -none +| callback | AsyncCallback\> | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1173,25 +1001,19 @@ cameraInput.getZoomRatioRange(err, zoomRatioRange) => { }) ``` -### getZoomRatioRange\(\): Promise\>; - -**系统能力:** +### getZoomRatioRange -SystemCapability.Multimedia.Camera.Core +getZoomRatioRange\(\): Promise\> -**说明:** - -获取变焦比率的范围,使用promise的方式获取结果。 - -**参数:** +获取可变焦距比范围,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |------------------------|---------------------------------------------| -| Promise\> | 使用promise的方式获取变焦比率的范围 | +| Promise\> | 使用Promise的方式获取当前的可变焦距比范围。 | **示例:** @@ -1201,26 +1023,20 @@ cameraInput.getZoomRatioRange().then((zoomRatioRange) => { }) ``` -### setZoomRatio(zoomRatio: number, callback: AsyncCallback): void; +### setZoomRatio -**系统能力:** +setZoomRatio(zoomRatio: number, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +设置可变焦距比,通过注册回调函数获取结果。 -**说明:** - -设置变焦比率,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|------------------------------------| -| zoomRatio | number | Yes | 变焦比率 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| zoomRatio | number | 是 | 可变焦距比。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1234,27 +1050,25 @@ cameraInput.setZoomRatio(zoomRatio, (err) => { }) ``` -### setZoomRatio(zoomRatio: number): Promise; - -**系统能力:** +### setZoomRatio -SystemCapability.Multimedia.Camera.Core +setZoomRatio(zoomRatio: number): Promise -**说明:** +设置可变焦距比,通过Promise获取结果。 -设置变焦比率,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|----------|-----------|-------------| -| zoomRatio | number | Yes | 变焦比率 | +| zoomRatio | number | 是 | 可变焦距比。 | **返回值:** | 类型 | 说明 | |-----------------------|-----------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1264,25 +1078,19 @@ cameraInput.setZoomRatio(zoomRatio).then() => { }) ``` -### getZoomRatio(callback: AsyncCallback): void; - -**系统能力:** +### getZoomRatio -SystemCapability.Multimedia.Camera.Core +getZoomRatio(callback: AsyncCallback): void -**说明:** +获取当前的可变焦距比,通过注册回调函数获取结果。 -获取当前的变焦比率,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-----------|---------------------------|-----------|------------------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1296,25 +1104,19 @@ cameraInput.getZoomRatio((err, zoomRatio) => { }) ``` -### getZoomRatio(): Promise; +### getZoomRatio -**系统能力:** +getZoomRatio(): Promise -SystemCapability.Multimedia.Camera.Core +获取当前的可变焦距比,通过Promise获取结果。 -**说明:** - -Gets current zoom ratio value. This method uses a promise to return the result. - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** -| 类型 | 说明 | -|-----------------------|---------------------------------------------------| -| Promise | Promise used to return the zoom ratio vaule | +| 类型 | 说明 | +| ---------------- | --------------------------- | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1324,25 +1126,19 @@ cameraInput.getZoomRatio().then(zoomRatio) => { }) ``` -### release\(callback: AsyncCallback\): void; +### release -**系统能力:** +release\(callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +释放相机实例,通过注册回调函数获取结果。 -**说明:** - -释放这个 **相机输入** 实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | Yes | 使用异步的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1356,25 +1152,19 @@ camera.release((err) => { }); ``` -### release(): Promise; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +### release -**说明:** +release(): Promise -释放这个 **相机输入** 实例,使用promise的方式获取结果。 +释放相机实例,通过Promise获取结果。 -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1384,26 +1174,20 @@ cameraInput.release().then(() => { }) ``` -### on(type: 'focusStateChange', callback: Callback): void; - -**系统能力:** +### on('focusStateChange') -SystemCapability.Multimedia.Camera.Core +on(type: 'focusStateChange', callback: AsyncCallback): void -**说明:** +监听焦距的状态变化,通过注册回调函数获取结果。 -监听焦距的状态变化,使用callback的方式获取焦距的状态变化。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'focusStateChange',即焦距状态变化事件。 | +| callback | AsyncCallback<[FocusState](#focusstate)\> | 是 | 回调函数,用于获取焦距状态。 | **示例:** @@ -1413,26 +1197,20 @@ cameraInput.on('focusStateChange', (focusState) => { }) ``` -### on(type: 'error', callback: Callback): void; +### on('error') -**系统能力:** +on('error', callback: ErrorCallback): void -SystemCapability.Multimedia.Camera.Core +监听CameraInput的错误事件,通过注册回调函数获取结果。 -**说明:** - -监听**相机输入**的报错,使用callback的方式获取错误信息。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取**相机输入**的错误信息 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1443,49 +1221,52 @@ cameraInput.on('error', (cameraInputError) => { ``` -## FlashMode +## FlashMode -枚举闪光灯模式。 +枚举,闪光灯模式。 | 名称 | 默认值 | 说明 | |------------------------|---------------|------------------------| -| FLASH_MODE_CLOSE | 0 | 闪光灯关闭模式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_OPEN | 1 | 闪光灯开启模式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_AUTO | 2 | 闪光灯自动模式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_ALWAYS_OPEN | 3 | 闪光灯常亮模式
系统能力 : SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_CLOSE | 0 | 闪光灯关闭。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_OPEN | 1 | 闪光灯开启。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_AUTO | 2 | 自动闪光灯。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_ALWAYS_OPEN | 3 | 闪光灯常亮。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## FocusMode +## FocusMode -枚举焦距模式。 +枚举,焦距模式。 | 名称 | 默认值 | 说明 | |----------------------------|---------------|----------------------------| -| FOCUS_MODE_MANUAL | 0 | 手动变焦模式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_CONTINUOUS_AUTO | 1 | 连续自动变焦模式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_AUTO | 2 | 自动变焦模式
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_LOCKED | 3 | 焦距锁定模式
系统能力 : SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_MANUAL | 0 | 手动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_CONTINUOUS_AUTO | 1 | 连续自动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_AUTO | 2 | 自动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_LOCKED | 3 | 定焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | + +## FocusState +枚举,焦距状态。 -## createCaptureSession\(context: Context, callback: AsyncCallback\): void; +| 名称 | 默认值 | 说明 | +| --------------------- | ------ | ------------------------------------------------------------ | +| FOCUS_STATE_SCAN | 0 | 扫描状态。
系统能力 : SystemCapability.Multimedia.Camera.Core | +| FOCUS_STATE_FOCUSED | 1 | 相机已对焦。
系统能力 : SystemCapability.Multimedia.Camera.Core | +| FOCUS_STATE_UNFOCUSED | 2 | 相机未对焦。
系统能力 : SystemCapability.Multimedia.Camera.Core | -**系统能力:** +## camera.createCaptureSession -SystemCapability.Multimedia.Camera.Core +createCaptureSession\(context: Context, callback: AsyncCallback\): void -**说明:** +获取CaptureSession实例,通过注册回调函数获取结果。 -创建 **拍照会话** 实例,使用callback的方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------|-----------|-----------------------------------------------------| -| context | Context | Yes | 应用环境 | -| callback | AsyncCallback | Yes | 使用callback的方式获取 **拍照会话** 实例 | - -**返回值:** - -none +| context | Context | 是 | 应用上下文。 | +| callback | AsyncCallback<[CaptureSession](#capturesession)\> | 是 | 回调函数,用于获取CaptureSession实例。 | **示例:** @@ -1499,27 +1280,25 @@ camera.createCaptureSession(context), (err, captureSession) => { }); ``` -## createCaptureSession(context: Context\): Promise; +## camera.createCaptureSession -**系统能力:** +createCaptureSession(context: Context\): Promise; -SystemCapability.Multimedia.Camera.Core +获取CaptureSession实例,通过Promise获取结果。 -**说明:** - -创建 **拍照会话** 实例,使用promise方式获取一个实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|-------------------------------|-----------|-----------------------------------------------------| -| context | Context | Yes | 应用环境 | +| context | Context | 是 | 应用上下文。 | **返回值:** | 类型 | 说明 | |---------------------------|---------------------------------------------------| -| Promise | 使用promise的方式获取**拍照会话**的实例 | +| Promise<[CaptureSession](#capturesession)\> | 使用Promise的方式获取CaptureSession实例。 | **示例:** @@ -1529,30 +1308,23 @@ camera.createCaptureSession(context).then((captureSession) => { }) ``` -## CaptureSession - -**拍照会话**类。 +## CaptureSession -### beginConfig\(callback: AsyncCallback\): void; +拍照会话类。 -**系统能力:** +### beginConfig -SystemCapability.Multimedia.Camera.Core +beginConfig\(callback: AsyncCallback\): void -**说明:** +开始配置会话,通过注册回调函数获取结果。 -设置此**拍照会话**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1566,25 +1338,19 @@ captureSession.beginConfig((err) => { }); ``` -### beginConfig\(\): Promise; +### beginConfig -**系统能力:** +beginConfig\(\): Promise -SystemCapability.Multimedia.Camera.Core +开始配置会话,通过Promise获取结果。 -**说明:** - -设置此**拍照会话**实例,使用promise的方式获取结果。 - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |---------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1595,25 +1361,19 @@ captureSession.beginConfig().then(() => { }) ``` -### commitConfig\(callback: AsyncCallback\): void; - -**系统能力:** +### commitConfig -SystemCapability.Multimedia.Camera.Core +commitConfig\(callback: AsyncCallback\): void -**说明:** +提交会话配置,通过注册回调函数获取结果。 -提交此**拍照会话**实例的设置,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|---------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取一个异步的结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1627,26 +1387,19 @@ captureSession.commitConfig((err) => { }); ``` +### commitConfig -### commitConfig\(\): Promise; +commitConfig\(\): Promise -**系统能力:** +提交会话配置,通过Promise获取结果。 -SystemCapability.Multimedia.Camera.Core - -**说明:** - -提交此**拍照会话**实例的设置,使用promise的方式获取结果。 - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |---------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1656,27 +1409,20 @@ captureSession.commitConfig().then(() => { }) ``` -### addInput\(cameraInput: CameraInput, callback: AsyncCallback\): void; - -**系统能力:** +### addInput -SystemCapability.Multimedia.Camera.Core +addInput\(cameraInput: CameraInput, callback: AsyncCallback\): void -**说明:** +在当前会话中,添加一个CameraInput实例,通过注册回调函数获取结果。 -为此**拍照会话**实例添加一个**相机输入**,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-------------|----------------------|-----------|---------------------------------------------| -| cameraInput | CameraInput | Yes | 需要添加的**相机输入**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - - -**返回值:** - -none +| cameraInput | [CameraInput](#camerainput) | 是 | 需要添加的CameraInput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1690,27 +1436,25 @@ captureSession.addInput(cameraInput, (err) => { }); ``` -### addInput\(cameraInput: CameraInput\): Promise; - -**系统能力:** +### addInput -SystemCapability.Multimedia.Camera.Core +addInput\(cameraInput: CameraInput\): Promise -**说明:** +在当前会话中,添加一个CameraInput实例,通过Promise获取结果。 -为此**拍照会话**实例添加一个**相机输入**,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-------------|---------------------|-----------|-------------------------------| -| cameraInput | CameraInput | Yes | 需要添加的**相机输入**实例 | +| cameraInput | [CameraInput](#camerainput) | 是 | 需要添加的CameraInput实例。 | **返回值:** | 类型 | 说明 | |----------------|------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1720,27 +1464,20 @@ captureSession.addInput(cameraInput).then(() => { }) ``` -### addOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void; +### addOutput -**系统能力:** +addOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,添加一个PreviewOutput实例,通过注册回调函数获取结果。 -**说明:** - -为此**拍照会话**实例添加一个**预览输出**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|-------------------------------------| -| previewOutput | PreviewOutput | Yes | 需要添加的**预览输出**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - - -**返回值:** - -none +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要添加的PreviewOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1754,27 +1491,25 @@ captureSession.addOutput(previewOutput, (err) => { }); ``` -### addOutput\(previewOutput: PreviewOutput\): Promise; - -**系统能力:** +### addOutput -SystemCapability.Multimedia.Camera.Core +addOutput\(previewOutput: PreviewOutput\): Promise -**说明:** +在当前会话中,添加一个PreviewOutput实例,通过Promise获取结果。 -为此**拍照会话**实例添加一个**预览输出**实例,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|--------------------------------| -| previewOutput | PreviewOutput | Yes | 需要添加的**预览输出**实例 | +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要添加的PreviewOutput实例。 | **返回值:** | 类型 | 说明 | |----------------|-----------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -1784,26 +1519,20 @@ captureSession.addOutput(previewOutput).then(() => { }) ``` -### addOutput\(photoOutput: PhotoOutput, callback: AsyncCallback\): void; +### addOutput -**系统能力:** +addOutput\(photoOutput: PhotoOutput, callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,添加一个PhotoOutput实例,通过注册回调函数获取结果。 -**说明:** - -为此**拍照会话**实例添加一个**照片输出**实例, 使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|-------------------------------------| -| photoOutput | PhotoOutput | Yes | 需要添加的**照片输出**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1817,27 +1546,25 @@ captureSession.addOutput(photoOutput, (err) => { }); ``` -### addOutput\(photoOutput: PhotoOutput\): Promise; - -**系统能力:** +### addOutput -SystemCapability.Multimedia.Camera.Core +addOutput\(photoOutput: PhotoOutput\): Promise -**说明:** +在当前会话中,添加一个PreviewOutput实例,通过Promise获取结果。 -为此**拍照会话**实例添加一个**照片输出**实例,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|--------------------------------| -| photoOutput | PhotoOutput | Yes | 需要添加的**照片输出**实例 | +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | **返回值:** | 类型 | 说明 | |---------------|-----------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise\ | 使用Promise的方式获取结果。 | **示例:** @@ -1847,26 +1574,20 @@ captureSession.addOutput(photoOutput).then(() => { }) ``` -### addOutput\(videoOutput: VideoOutput, callback: AsyncCallback\): void; - -**系统能力:** +### addOutput -SystemCapability.Multimedia.Camera.Core +addOutput\(videoOutput: VideoOutput, callback: AsyncCallback\): void -**说明:** +在当前会话中,添加一个VideoOutput实例,通过注册回调函数获取结果。 -为此**拍照会话**实例添加一个**视频输出**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|-------------------------------------| -| videoOutput | VideoOutput | Yes | 需要添加的**视频输出**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1880,27 +1601,25 @@ captureSession.addOutput(videoOutput, (err) => { }); ``` -### addOutput\(videoOutput: VideoOutput\): Promise; +### addOutput -**系统能力:** +addOutput\(videoOutput: VideoOutput\): Promise -SystemCapability.Multimedia.Camera.Core +在当前会话中,添加一个VideoOutput实例,通过Promise获取结果。 -**说明:** - -为此**拍照会话**实例添加一个**视频输出**实例, 使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** -| 名称 | 类型 | 必填 | 说明 | -|---------------|---------------------|-----------|--------------------------------| -| videoOutput | VideoOutput | Yes | 需要添加的**视频输出**实例 | +| 名称 | 类型 | 必填 | 说明 | +| ----------- | --------------------------- | ---- | --------------------------- | +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | **返回值:** -| 类型 | 说明 | -|----------------|-----------------------------------| -| Promise | 使用promise的方式获取结果 | +| 类型 | 说明 | +| -------------- | --------------------------- | +| Promise\ | 使用Promise的方式获取结果。 | **示例:** @@ -1910,27 +1629,20 @@ captureSession.addOutput(videoOutput).then(() => { }) ``` -### removeInput\(cameraInput: CameraInput, callback: AsyncCallback\): void; - -**系统能力:** +### removeInput -SystemCapability.Multimedia.Camera.Core +removeInput\(cameraInput: CameraInput, callback: AsyncCallback\): void -**说明:** +在当前会话中,移除一个CameraInput实例,通过注册回调函数获取结果。 -为此**拍照会话**实例移除一个**相机输入**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-------------|----------------------|-----------|------------------------------------| -| cameraInput | CameraInput | Yes | 需要移除的**相机输入**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - - -**返回值:** - -none +| cameraInput | [CameraInput](#camerainput) | 是 | 需要移除的CameraInput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -1944,27 +1656,25 @@ captureSession.removeInput(cameraInput, (err) => { }); ``` -### removeInput\(cameraInput: CameraInput\): Promise; - -**系统能力:** +### removeInput -SystemCapability.Multimedia.Camera.Core +removeInput\(cameraInput: CameraInput\): Promise -**说明:** +在当前会话中,移除一个CameraInput实例,通过Promise获取结果。 -为此**拍照会话**实例移除一个**相机输入**实例,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |-------------|---------------------|-----------|---------------------------------| -| cameraInput | CameraInput | Yes | 需要移除的**相机输入**实例 | +| cameraInput | [CameraInput](#camerainput) | 是 | 需要移除的CameraInput实例。 | **返回值:** | 类型 | 说明 | |----------------|-----------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise\ | 使用Promise的方式获取结果。 | **示例:** @@ -1974,26 +1684,20 @@ captureSession.removeInput(cameraInput).then(() => { }) ``` -### removeOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void; - -**系统能力:** +### removeOutput -SystemCapability.Multimedia.Camera.Core +removeOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void -**说明:** +在当前会话中,移除一个PreviewOutput实例,通过注册回调函数获取结果。 -为此**拍照会话**实例移除一个**预览输出**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|------------------------------------| -| previewOutput | PreviewOutput | Yes | 需要移除的**预览输出**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要移除的PreviewOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2007,28 +1711,26 @@ captureSession.removeOutput(previewOutput, (err) => { }); ``` -### removeOutput(previewOutput: PreviewOutput): Promise; +### removeOutput -**系统能力:** +removeOutput(previewOutput: PreviewOutput): Promise -SystemCapability.Multimedia.Camera.Core +在当前会话中,移除一个PreviewOutput实例,通过Promise获取结果。 -**说明:** - -为此**拍照会话**实例移除一个**预览输出**实例,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|-----------------------------------| -| previewOutput | PreviewOutput | Yes | 需要移除的**预览输出**实例 | +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要移除的PreviewOutput实例。 | **返回值:** | 类型 | 说明 | |---------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2039,26 +1741,20 @@ captureSession.removeOutput(previewOutput).then(() => { }) ``` -### removeOutput(photoOutput: PhotoOutput, callback: AsyncCallback): void; - -**系统能力:** +### removeOutput -SystemCapability.Multimedia.Camera.Core +removeOutput(photoOutput: PhotoOutput, callback: AsyncCallback): void -**说明:** +在当前会话中,移除一个PhotoOutput实例,通过注册回调函数获取结果。 -为此**拍照会话**实例移除一个**照片输出**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|------------------------------------| -| photoOutput | PhotoOutput | Yes | 需要移除的**照片输出**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2072,28 +1768,26 @@ captureSession.removeOutput(photoOutput, (err) => { }); ``` -### removeOutput(photoOutput: PhotoOutput): Promise; - -**系统能力:** +### removeOutput -SystemCapability.Multimedia.Camera.Core +removeOutput(photoOutput: PhotoOutput): Promise -**说明:** +在当前会话中,移除一个PhotoOutput实例,通过Promise获取结果。 -为此**拍照会话**实例移除一个**照片输出**实例,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|---------------------------------| -| photoOutput | PhotoOutput | Yes | 需要移除的**照片输出**实例 | +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | **返回值:** | 类型 | 说明 | |---------------|------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2104,26 +1798,20 @@ captureSession.removeOutput(photoOutput).then(() => { }) ``` -### removeOutput(videoOutput: VideoOutput, callback: AsyncCallback): void; +### removeOutput -**系统能力:** +removeOutput(videoOutput: VideoOutput, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,移除一个VideoOutput实例,通过注册回调函数获取结果。 -**说明:** - -为此**拍照会话**实例移除一个**视频输出**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|------------------------------------| -| videoOutput | VideoOutput | Yes | 需要移除的**视频输出**实例 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2137,28 +1825,26 @@ captureSession.removeOutput(videoOutput, (err) => { }); ``` -### removeOutput(videoOutput: VideoOutput): Promise; - -**系统能力:** +### removeOutput -SystemCapability.Multimedia.Camera.Core +removeOutput(videoOutput: VideoOutput): Promise -**说明:** +在当前会话中,移除一个VideoOutput实例,通过Promise获取结果。 -为此**拍照会话**实例移除一个**视频输出**实例,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|---------------------------------| -| videoOutput | VideoOutput | Yes | 需要移除的**照片输出**实例 | +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2169,25 +1855,19 @@ captureSession.removeOutput(videoOutput).then(() => { }) ``` -### start\(callback: AsyncCallback\): void; - -**系统能力:** +### start -SystemCapability.Multimedia.Camera.Core +start\(callback: AsyncCallback\): void -**说明:** +启动拍照会话,通过注册回调函数获取结果。 -开启**拍照会话** 实例, 使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2201,25 +1881,19 @@ captureSession.start((err) => { }); ``` -### start\(\): Promise; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +### start -**说明:** +start\(\): Promise -开启**拍照会话** 实例,使用promise的方式获取结果。 +启动拍照会话,通过Promise获取结果。 -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|-----------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2229,26 +1903,20 @@ captureSession.start().then(() => { }) ``` -### stop\(callback: AsyncCallback\): void; - -**系统能力:** +### stop -SystemCapability.Multimedia.Camera.Core +stop\(callback: AsyncCallback\): void -**说明:** +停止拍照会话,通过注册回调函数获取结果。 -关闭**拍照会话** 实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2262,26 +1930,19 @@ captureSession.stop((err) => { }); ``` +### stop -### stop(): Promise; +stop(): Promise -**系统能力:** +停止拍照会话,通过Promise获取结果。 -SystemCapability.Multimedia.Camera.Core - -**说明:** - -关闭**拍照会话** 实例,使用promise的方式获取结果。 - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|-----------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2291,25 +1952,19 @@ captureSession.stop().then(() => { }) ``` -### release\(callback: AsyncCallback\): void; - -**系统能力:** +### release -SystemCapability.Multimedia.Camera.Core +release\(callback: AsyncCallback\): void -**说明:** +释放CaptureSession实例,通过注册回调函数获取结果。 -释放**拍照会话**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** -示例里 + | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2323,25 +1978,19 @@ captureSession.release((err) => { }); ``` -### release(): Promise; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +### release -**说明:** +release(): Promise -释放**拍照会话**实例,使用promise的方式获取结果。 - -**参数:** +释放CaptureSession实例,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2351,26 +2000,20 @@ captureSession.release().then(() => { }) ``` -### on(type: 'error', callback: Callback): void; +### on('error') -**系统能力:** +on(type: 'error', callback: ErrorCallback): void -SystemCapability.Multimedia.Camera.Core +监听拍照会话的错误事件,通过注册回调函数获取结果。 -**说明:** - -监听**拍照会话** 的报错,使用callback的方式获取错误信息。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取**拍照会话**的错误信息 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | **示例:** @@ -2380,26 +2023,20 @@ captureSession.on('error', (captureSessionError) => { }) ``` -## createPreviewOutput(surfaceId: string, callback: AsyncCallback): void; - -**系统能力:** +## camera.createPreviewOutput -SystemCapability.Multimedia.Camera.Core +createPreviewOutput(surfaceId: string, callback: AsyncCallback): void -**说明:** +获取PreviewOutput实例,通过注册回调函数获取结果。 -创建**预览输出**实例,使用callback的方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | 从XComponent组件获取的Surface ID | -| callback | AsyncCallback | Yes | 使用callback的方式获取的实例 | - -**返回值:** - -none +| surfaceId | string | 是 | 从XComponent组件获取的Surface ID。 | +| callback | AsyncCallback<[PreviewOutput](#previewoutput)\> | 是 | 回调函数,用于获取PreviewOutput实例。 | **示例:** @@ -2411,29 +2048,27 @@ camera.createPreviewOutput(surfaceId), (err, previewOutput) => { } console.log('Callback returned with previewOutput instance'); }); -``` - -## createPreviewOutput(surfaceId: string): Promise; +``` -**系统能力:** +## camera.createPreviewOutput -SystemCapability.Multimedia.Camera.Core +createPreviewOutput(surfaceId: string): Promise\ -**说明:** +获取PreviewOutput实例,通过Promise获取结果。 -创建**预览输出**实例, 使用promise方式获取一个实例。. +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | 从XComponent组件获取的Surface ID | +| surfaceId | string | 是 | 从XComponent组件获取的Surface ID。 | **返回值:** | 类型 | 说明 | |-------------------------|---------------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise<[PreviewOutput](#previewoutput)\> | 使用Promise的方式获取结果。 | **示例:** @@ -2445,27 +2080,21 @@ camera.createPreviewOutput(surfaceId).then((previewOutput) => { ## PreviewOutput -**预览输出**类。 - -### release(callback: AsyncCallback): void; +预览输出类。 -**系统能力:** +### release -SystemCapability.Multimedia.Camera.Core +release(callback: AsyncCallback): void -**说明:** +释放PreviewOutput实例,通过注册回调函数获取结果。 -释放**预览输出**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2479,24 +2108,19 @@ previewOutput.release((err) => { }); ``` -### release(): Promise; +### release -**系统能力:** +release(): Promise -SystemCapability.Multimedia.Camera.Core +释放PreviewOutput实例,通过Promise获取结果。 -**说明:** - -释放**预览输出**实例,使用promise的方式获取结果。 - -**参数:** -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|-----------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2507,26 +2131,20 @@ previewOutput.release().then(() => { }) ``` -### on(type: 'frameStart', callback: Callback): void; +### on('frameStart') -**系统能力:** +on(type: 'frameStart', callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +监听预览帧启动,通过注册回调函数获取结果。 -**说明:** - -监听一项预览帧的开启,使用callback的方式获取预览帧开启项。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'frameStart',即帧启动事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2536,26 +2154,20 @@ previewOutput.on('frameStart', () => { }) ``` -### on(type: 'frameEnd', callback: Callback): void; - -**系统能力:** +### on('frameEnd') -SystemCapability.Multimedia.Camera.Core +on(type: 'frameEnd', callback: AsyncCallback): void -**说明:** +监听预览帧结束,通过注册回调函数获取结果。 -监听一项预览帧的关闭,使用callback的方式获取预览帧关闭项。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'frameEnd',即帧结束事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2565,26 +2177,20 @@ previewOutput.on('frameEnd', () => { }) ``` -### on(type: 'error', callback: Callback): void; +### on('error') -**系统能力:** +on(type: 'error', callback: ErrorCallback): void -SystemCapability.Multimedia.Camera.Core +监听预览输出的错误事件,通过注册回调函数获取结果。 -**说明:** - -监听**预览输出**的报错,使用callback的方式获取错误信息。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of event to listen for. | -| callback | Callback | Yes | 使用callback的方式获取**预览输出**的错误信息 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | **示例:** @@ -2594,26 +2200,20 @@ previewOutput.on('error', (previewOutputError) => { }) ``` -## createPhotoOutput(surfaceId: string, callback: AsyncCallback): void; - -**系统能力:** +## camera.createPhotoOutput -SystemCapability.Multimedia.Camera.Core +createPhotoOutput(surfaceId: string, callback: AsyncCallback): void -**说明:** +获取PhotoOutput实例,通过注册回调函数获取结果。 -创建**照片输出**实例,使用callback的方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | 从ImageReceiver获取的Surfack ID | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| surfaceId | string | 是 | 从ImageReceiver获取的Surface ID。 | +| callback | AsyncCallback<[PhotoOutput](#photooutput)\> | 是 | 回调函数,用于获取PhotoOutput实例。 | **示例:** @@ -2625,29 +2225,27 @@ camera.createPhotoOutput(surfaceId), (err, photoOutput) => { } console.log('Callback returned with the PhotoOutput instance.'); }); -``` - -## createPhotoOutput(surfaceId: string): Promise; +``` -**系统能力:** +## camera.createPhotoOutput -SystemCapability.Multimedia.Camera.Core +createPhotoOutput(surfaceId: string): Promise -**说明:** +获取PhotoOutput实例,通过Promise获取结果。 -创建**照片输出**实例,使用promise的方式获取实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | 从ImageReceiver获取的Surfack ID | +| surfaceId | string | 是 | 从ImageReceiver获取的Surface ID。 | **返回值:** | 类型 | 说明 | |-------------------------|--------------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise<[PhotoOutput](#photooutput)\> | 使用Promise的方式获取PhotoOutput实例。 | **示例:** @@ -2656,71 +2254,55 @@ camera.createPhotoOutput(surfaceId).then((photoOutput) => { console.log('Promise returned with PhotoOutput instance'); }) ``` -## 图片旋转 +## ImageRotation -枚举图片旋转角度。 +枚举,图片旋转角度。 | 名称 | 默认值 | 说明 | |--------------|---------------|----------------------------------------| -| ROTATION_0 | 0 | 图片旋转0度
系统能力 : SystemCapability.Multimedia.Camera.Core | -| ROTATION_90 | 90 | 图片旋转90度
系统能力 : SystemCapability.Multimedia.Camera.Core | -| ROTATION_180 | 180 | 图片旋转180度
系统能力 : SystemCapability.Multimedia.Camera.Core | -| ROTATION_270 | 270 | 图片旋转270度
系统能力 : SystemCapability.Multimedia.Camera.Core | - - -## 拍摄地点 +| ROTATION_0 | 0 | 图片旋转0度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| ROTATION_90 | 90 | 图片旋转90度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| ROTATION_180 | 180 | 图片旋转180度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| ROTATION_270 | 270 | 图片旋转270度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -拍摄的照片的地点。 +## QualityLevel -| 名称 | 类型 | 权限 | 说明 | -|-----------|--------|--------------|-------------| -| latitude | number | read / write | 纬度
系统能力 : SystemCapability.Multimedia.Camera.Core | -| longitude | number | read / write | 经度
系统能力 : SystemCapability.Multimedia.Camera.Core | - -## 图片质量 - -枚举图片质量。 +枚举,图片质量。 | 名称 | 默认值 | 说明 | |----------------------|---------------|----------------------| -| QUALITY_LEVEL_HIGH | 0 | 高图片质量
系统能力 : SystemCapability.Multimedia.Camera.Core | -| QUALITY_LEVEL_MEDIUM | 1 | 中图片质量
系统能力 : SystemCapability.Multimedia.Camera.Core | -| QUALITY_LEVEL_LOW | 2 | 低图片质量
系统能力 : SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_HIGH | 0 | 图片质量高。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_MEDIUM | 1 | 图片质量中等。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_LOW | 2 | 图片质量差。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## 拍照设置 +## PhotoCaptureSetting -拍摄的照片的设置。 +拍摄照片的设置。 | 名称 | 类型 | 必填 | 说明 | |----------|---------------|-----------|---------------------| -| quality | QualityLevel | Optional | 图片质量
系统能力 : SystemCapability.Multimedia.Camera.Core | -| rotation | ImageRotation | Optional | 图片旋转角度
系统能力 : SystemCapability.Multimedia.Camera.Core | - +| quality | [QualityLevel](#qualitylevel) | 否 | 图片质量。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| rotation | [ImageRotation](#imagerotation) | 否 | 图片旋转角度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## 照片输出 -**照片输出**类。 +## PhotoOutput -### capture(callback: AsyncCallback): void; +照片输出类。 -**系统能力:** +### capture -SystemCapability.Multimedia.Camera.Core +capture(callback: AsyncCallback): void -**说明:** +拍照,通过注册回调函数获取结果。 -拍照,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|---------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2734,26 +2316,20 @@ photoOutput.capture((err) => { }); ``` -### capture(setting: PhotoCaptureSetting, callback: AsyncCallback): void; +### capture -**系统能力:** +capture(setting: PhotoCaptureSetting, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +根据拍照设置拍照,通过注册回调函数获取结果。 -**说明:** - -使用拍照设置拍照, 使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| setting | PhotoCaptureSetting | Yes | 拍照设置 | -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| setting | [PhotoCaptureSetting](#photocapturesetting) | 是 | 拍照设置。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2767,27 +2343,25 @@ photoOutput.capture(settings, (err) => { }); ``` -### capture(setting?: PhotoCaptureSetting): Promise; - -**系统能力:** +### capture -SystemCapability.Multimedia.Camera.Core +capture(setting?: PhotoCaptureSetting): Promise -**说明:** +根据拍照设置拍照,通过Promise获取结果。 -使用拍照设置拍照, 使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|---------------------|-----------|----------------------------------------------| -| setting | PhotoCaptureSetting | No | 拍照设置 | +| setting | [PhotoCaptureSetting](#photocapturesetting) | 否 | 拍照设置。 | **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2798,25 +2372,19 @@ photoOutput.capture().then(() => { }) ``` -### release(callback: AsyncCallback): void; +### release -**系统能力:** +release(callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +释放PhotoOutput实例,通过注册回调函数获取结果。 -**说明:** - -释放**拍照输出**实例,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -2830,24 +2398,19 @@ photoOutput.release((err) => { }); ``` -### release(): Promise; - -**系统能力:** - -SystemCapability.Multimedia.Camera.Core +### release -**说明:** +release(): Promise -释放**拍照输出**实例,使用promise的方式获取结果。 +释放PhotoOutput实例,通过Promise获取结果。 -**参数:** -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -2858,26 +2421,20 @@ photoOutput.release().then(() => { }) ``` -### on(type: 'captureStart', callback: Callback): void; - -**系统能力:** +### on('captureStart') -SystemCapability.Multimedia.Camera.Core +on(type: 'captureStart', callback: AsyncCallback): void -**说明:** +监听拍照启动,通过注册回调函数获取Capture ID。 -监听拍照项的启动,使用callback的方式获取一个拍照项的启动结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of event to listen for. | -| callback | Callback | Yes | 使用callback的方式获取captureID | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'captureStart',即拍照启动事件。 | +| callback | AsyncCallback | 是 | 使用callback的方式获取Capture ID。 | **示例:** @@ -2887,26 +2444,20 @@ photoOutput.on('captureStart', (captureId) => { }) ``` -### on(type: 'frameShutter', callback: Callback): void; - -**系统能力:** +### on('frameShutter') -SystemCapability.Multimedia.Camera.Core +on(type: 'frameShutter', callback: AsyncCallback): void -**说明:** +监听帧刷新,通过注册回调函数获取结果。 -监听一项帧刷新,使用callback的方式获取帧的刷新项。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'frameShutter',即帧刷新事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取相关信息。 | **示例:** @@ -2917,26 +2468,20 @@ photoOutput.on('frameShutter', (frameShutterInfo) => { }) ``` -### on(type: 'captureEnd', callback: Callback): void; +### on('captureEnd') -**系统能力:** +on(type: 'captureEnd', callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +监听拍照停止,通过注册回调函数获取结果。 -**说明:** - -监听拍照项的关闭,使用callback的方式获取一个拍照项的关闭结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取拍照结束的信息 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'captureEnd',即拍照停止事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取相关信息。 | **示例:** @@ -2947,26 +2492,20 @@ photoOutput.on('captureEnd', (captureEndInfo) => { }) ``` -### on(type: 'error', callback: Callback): void; - -**系统能力:** +### on('error') -SystemCapability.Multimedia.Camera.Core +on(type: 'error', callback: ErrorCallback): void -**说明:** +监听拍照的错误事件,通过注册回调函数获取结果。 -监听**照片输出**的报错,使用callback的方式获取错误信息。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of event to listen for. | -| callback | Callback | Yes | 使用callback的方式获取**照片输出**的错误信息 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | **示例:** @@ -2976,26 +2515,20 @@ photoOutput.on('error', (photoOutputError) => { }) ``` -## createVideoOutput(surfaceId: string, callback: AsyncCallback): void; +## camera.createVideoOutput -**系统能力:** +createVideoOutput(surfaceId: string, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +获取VideoOutput实例,通过注册回调函数获取结果。 -**说明:** - -创建**视频输出**实例,使用callback的方式获取一个异步的实例。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | 从VideoRecorder获取的Surfack ID | -| callback | AsyncCallback | Yes | 用callback的方式获取结果 | - -**返回值:** - -none +| surfaceId | string | 是 | 从VideoRecorder获取的Surface ID。 | +| callback | AsyncCallback<[VideoOutput](#videootput)\> | 是 | 回调函数,用于获取VideoOutput实例。 | **示例:** @@ -3007,29 +2540,27 @@ camera.createVideoOutput(surfaceId), (err, videoOutput) => { } console.log('Callback returned with the VideoOutput instance'); }); -``` - -## createVideoOutput(surfaceId: string): Promise; +``` -**系统能力:** +## camera.createVideoOutput -SystemCapability.Multimedia.Camera.Core +createVideoOutput(surfaceId: string): Promise -**说明:** +获取VideoOutput实例,通过Promise获取结果。 -创建**视频输出**实例,使用promise的方式获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | 从VideoRecorder获取的Surfack ID | +| surfaceId | string | 是 | 从VideoRecorder获取的Surface ID。 | **返回值:** -| 类型 | 说明 | -|-------------------------|-------------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| 类型 | 说明 | +| --------------------- | -------------------------------------- | +| Promise | 使用Promise的方式获取VideoOutput实例。 | **示例:** @@ -3041,27 +2572,21 @@ camera.createVideoOutput(surfaceId).then((videoOutput) => { ## VideoOutput -实现视频输出。 - -### start(callback: AsyncCallback): void; +视频输出类。 -**系统能力:** +### start -SystemCapability.Multimedia.Camera.Core +start(callback: AsyncCallback): void -**说明:** +开始拍摄视频,通过注册回调函数获取结果。 -开启**视频输出**实例, 使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -3075,24 +2600,19 @@ videoOutput.start((err) => { }); ``` -### start(): Promise; - -**系统能力:** +### start -SystemCapability.Multimedia.Camera.Core +start(): Promise -**说明:** +开始拍摄视频,通过Promise获取结果。 -开启**视频输出**实例, 使用promise的方式获取结果。 - -**参数:** -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -3103,25 +2623,19 @@ videoOutput.start().then(() => { }) ``` -### stop(callback: AsyncCallback): void; - -**系统能力:** +### stop -SystemCapability.Multimedia.Camera.Core +stop(callback: AsyncCallback): void -**说明:** +停止拍摄视频,通过注册回调函数获取结果。 -关闭视频输出,使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -3135,24 +2649,19 @@ videoOutput.stop((err) => { }); ``` -### stop(): Promise; +### stop -**系统能力:** +stop(): Promise -SystemCapability.Multimedia.Camera.Core +停止拍摄视频,通过Promise获取结果。 -**说明:** - -关闭视频输出,使用promise的方式获取结果。 - -**参数:** -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -3162,25 +2671,19 @@ videoOutput.start().then(() => { }) ``` -### release(callback: AsyncCallback): void; - -**系统能力:** +### release -SystemCapability.Multimedia.Camera.Core +release(callback: AsyncCallback): void -**说明:** +释放VideoOutput实例,通过注册回调函数获取结果。 -释放**视频输出**实例, 使用callback的方式获取一个异步的结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** -Camera appear + | 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -3194,25 +2697,19 @@ videoOutput.release((err) => { }); ``` -### release(): Promise; +### release -**系统能力:** +release(): Promise -SystemCapability.Multimedia.Camera.Core +释放VideoOutput实例,通过Promise获取结果。 -**说明:** - -释放**视频输出**实例,使用promise的方式获取结果。 - -**参数:** - -none +**系统能力:** SystemCapability.Multimedia.Camera.Core **返回值:** | 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | 使用promise的方式获取结果 | +| Promise | 使用Promise的方式获取结果。 | **示例:** @@ -3223,26 +2720,20 @@ videoOutput.release().then(() => { }) ``` -### on(type: 'frameStart', callback: Callback): void; - -**系统能力:** +### on('frameStart') -SystemCapability.Multimedia.Camera.Core +on(type: 'frameStart', callback: AsyncCallback): void -**说明:** +监听视频帧开启,通过注册回调函数获取结果。 -监听一项视频帧的开启,使用callback的方式获取视频帧的开启项。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'frameStart',即视频帧开启事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -3252,26 +2743,20 @@ videoOutput.on('frameStart', () => { }) ``` -### on(type: 'frameEnd', callback: Callback): void; +### on('frameEnd') -**系统能力:** +on(type: 'frameEnd', callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +监听视频帧结束,通过注册回调函数获取结果。 -**说明:** - -监听一项视频帧的关闭,使用callback的方式获取视频帧的开启项。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取结果 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'frameEnd',即视频帧结束事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | **示例:** @@ -3281,26 +2766,20 @@ videoOutput.on('frameEnd', () => { }) ``` -### on(type: 'error', callback: Callback): void; - -**系统能力:** +### on('error') -SystemCapability.Multimedia.Camera.Core +on(type: 'error', callback: ErrorCallback): void -**说明:** +监听视频输出的错误事件,通过注册回调函数获取结果。 -监听 **视频输出** 的报错,使用callback的方式获取错误信息。 +**系统能力:** SystemCapability.Multimedia.Camera.Core **参数:** | 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | 监听项的名称 | -| callback | Callback | Yes | 使用callback的方式获取**视频输出**的错误信息 | - -**返回值:** - -None +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | Callback | 是 | 回调函数,用于获取错误信息。 | **示例:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md index 0320816196a..3b72f6733c4 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -1,8 +1,8 @@ -# 网络 +# 网络连接管理 > **说明:** > ->本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 ## 导入模块 @@ -14,7 +14,7 @@ import connection from '@ohos.net.connection' getDefaultNet(callback: AsyncCallback\): void -获取默认网络,使用callback方式作为异步方法。 +获取默认激活的数据网络,使用callback方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -22,9 +22,9 @@ getDefaultNet(callback: AsyncCallback\): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| callback | AsyncCallback\<[NetHandle](#nethandle)> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------- | +| callback | AsyncCallback\<[NetHandle](#nethandle)> | 是 | 回调函数。 | **示例:** @@ -39,7 +39,7 @@ connection.getDefaultNet(function (error, netHandle) { getDefaultNet(): Promise\ -获取默认网络,使用Promise方式作为异步方法。 +获取默认激活的数据网络,使用Promise方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -47,9 +47,9 @@ getDefaultNet(): Promise\ **返回值:** -| 类型 | 说明 | -| ----- | ----- | -| Promise\<[NetHandle](#nethandle)> | 以Promise形式返回 | +| 类型 | 说明 | +| --------------------------------- | ------------------------------------- | +| Promise\<[NetHandle](#nethandle)> | 以Promise形式返回默认激活的数据网络。 | **示例:** @@ -63,15 +63,15 @@ connection.getDefaultNet().then(function (netHandle) { hasDefaultNet(callback: AsyncCallback\): void -判断是否有默认网络,使用callback方式作为异步方法。 +检查默认数据网络是否被激活,使用callback方式作为异步方法。 **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| callback | AsyncCallback\ | 是 | 回调函数,有默认网络返回true。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | -------------------------------------- | +| callback | AsyncCallback\ | 是 | 回调函数,默认数据网络被激活返回true。 | **示例:** @@ -86,15 +86,15 @@ connection.hasDefaultNet(function (error, has) { hasDefaultNet(): Promise\ -判断是否有默认网络,使用Promise方式作为异步方法。 +检查默认数据网络是否被激活,使用Promise方式作为异步方法。 **系统能力**:SystemCapability.Communication.NetManager.Core **返回值:** -| 类型 | 说明 | -| ----- | ----- | -| Promise\ | 以Promise形式返回,有默认网络返回true。 | +| 类型 | 说明 | +| ----------------- | ----------------------------------------------- | +| Promise\ | 以Promise形式返回,默认数据网络被激活返回true。 | **示例:** @@ -108,7 +108,7 @@ connection.hasDefaultNet().then(function (has) { getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback\): void -查询netHandle对应的网络的连接信息,使用callback方式作为异步方法。 +获取netHandle对应的网络的连接信息,使用callback方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -116,10 +116,10 @@ getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback\ | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------------------------------------------------------------ | ---- | ---------------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄。 | +| callback | AsyncCallback\<[ConnectionProperties](#connectionproperties)> | 是 | 回调函数。 | **示例:** @@ -136,7 +136,7 @@ connection.getDefaultNet().then(function (netHandle) { getConnectionProperties(netHandle: NetHandle): Promise\ -查询netHandle对应的网络的连接信息,使用Promise方式作为异步方法。 +获取netHandle对应的网络的连接信息,使用Promise方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -144,15 +144,15 @@ getConnectionProperties(netHandle: NetHandle): Promise\ **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| netHandle | [NetHandle](#nethandle) | 是 | 对应网络 | +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ----------------------- | ---- | ---------------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄。 | **返回值:** -| 类型 | 说明 | -| ----- | ----- | -| Promise\<[ConnectionProperties](#connectionproperties)> | 以Promise形式返回 | +| 类型 | 说明 | +| ------------------------------------------------------- | --------------------------------- | +| Promise\<[ConnectionProperties](#connectionproperties)> | 以Promise形式返回网络的连接信息。 | **示例:** @@ -168,7 +168,7 @@ connection.getDefaultNet().then(function (netHandle) { getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback\): void -查询netHandle对应的网络的能力信息,使用callback方式作为异步方法。 +获取netHandle对应的网络的能力信息,使用callback方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -176,10 +176,10 @@ getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback\ | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| --------- | --------------------------------------------------- | ---- | ---------------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄。 | +| callback | AsyncCallback\<[NetCapabilities](#netcapabilities)> | 是 | 回调函数。 | **示例:** @@ -196,7 +196,7 @@ connection.getDefaultNet().then(function (netHandle) { getNetCapabilities(netHandle: NetHandle): Promise\ -查询netHandle对应的网络的能力信息,使用Promise方式作为异步方法。 +获取netHandle对应的网络的能力信息,使用Promise方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -204,15 +204,15 @@ getNetCapabilities(netHandle: NetHandle): Promise\ **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| netHandle | [NetHandle](#nethandle) | 是 | 对应网络 | +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ----------------------- | ---- | ---------------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄。 | **返回值:** -| 类型 | 说明 | -| ----- | ----- | -| Promise\<[NetCapabilities](#netcapabilities)> | 以Promise形式返回 | +| 类型 | 说明 | +| --------------------------------------------- | --------------------------------- | +| Promise\<[NetCapabilities](#netcapabilities)> | 以Promise形式返回网络的能力信息。 | **示例:** @@ -228,7 +228,7 @@ connection.getDefaultNet().then(function (netHandle) { getAddressesByName(host: string, callback: AsyncCallback\>): void -使用默认网络将host解析成IP,返回所有IP,使用callback方式作为异步方法。 +使用默认网络解析主机名以获取所有IP地址,使用callback方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -236,10 +236,10 @@ getAddressesByName(host: string, callback: AsyncCallback\>): **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| host | string | 是 | 需要解析的域名 | -| callback | AsyncCallback\> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------- | ---- | ------------------ | +| host | string | 是 | 需要解析的主机名。 | +| callback | AsyncCallback\> | 是 | 回调函数。 | **示例:** @@ -256,7 +256,7 @@ connection.getDefaultNet().then(function (netHandle) { getAddressesByName(netHandle: NetHandle): Promise\> -使用默认网络将host解析成IP,返回所有IP,使用Promise方式作为异步方法。 +使用默认网络解析主机名以获取所有IP地址,使用Promise方式作为异步方法。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -264,15 +264,15 @@ getAddressesByName(netHandle: NetHandle): Promise\> **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| host | string | 是 | 需要解析的域名 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------ | +| host | string | 是 | 需要解析的主机名。 | **返回值:** -| 类型 | 说明 | -| ----- | ----- | -| Promise\> | 以Promise形式返回 | +| 类型 | 说明 | +| ------------------------------------------- | ----------------------------- | +| Promise\> | 以Promise形式返回所有IP地址。 | **示例:** @@ -294,16 +294,16 @@ createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnectio **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| netSpecifier | [NetSpecifier](#netspecifier) | 否 | 指定网络的各项特征,不指定则关注默认网络。 | -| timeout | number | 否 | 获取netSpecifier指定的网络时的超时时间,仅netSpecifier存在时生效。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | ----------------------------- | ---- | ------------------------------------------------------------ | +| netSpecifier | [NetSpecifier](#netspecifier) | 否 | 指定网络的各项特征,不指定则关注默认网络。 | +| timeout | number | 否 | 获取netSpecifier指定的网络时的超时时间,仅netSpecifier存在时生效。 | **返回值:** -| 类型 | 说明 | -| ----- | ----- | -|[NetConnection](#netconnection) | 所关注的网络的句柄 | +| 类型 | 说明 | +| ------------------------------- | -------------------- | +| [NetConnection](#netconnection) | 所关注的网络的句柄。 | **示例:** @@ -321,7 +321,7 @@ let netConnection2 = connection.createNetConnection({ ## NetConnection -网络连接的句柄 +网络连接的句柄。 ### on('netAvailable') @@ -333,10 +333,10 @@ on(type: 'netAvailable', callback: Callback\): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| type | string | 是 | 监听的事件,固定'netAvailable' | -| callback | Callback\<[NetHandle](#nethandle)>> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 监听事件,固定为'netAvailable'。
netAvailable:数据网络可用事件。 | +| callback | Callback\<[NetHandle](#nethandle)> | 是 | 回调函数。 | **示例:** @@ -356,10 +356,10 @@ on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, net **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| type | string | 是 | 监听的事件,固定'netCapabilitiesChange' | -| callback | Callback<{ netHandle: [NetHandle](#nethandle), netCap: [NetCapabilities](#netcapabilities) }> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 监听事件,固定为'netCapabilitiesChange'。
netCapabilitiesChange:网络能力变化事件。 | +| callback | Callback<{ netHandle: [NetHandle](#nethandle), netCap: [NetCapabilities](#netcapabilities) }> | 是 | 回调函数。 | **示例:** @@ -379,10 +379,10 @@ on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHan **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| type | string | 是 | 监听的事件,固定'netConnectionPropertiesChange' | -| callback | Callback<{ netHandle: [NetHandle](#nethandle), connectionProperties: [ConnectionProperties](#connectionproperties) }> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 监听事件,固定为'netConnectionPropertiesChange'。
netConnectionPropertiesChange:网络连接信息变化事件。 | +| callback | Callback<{ netHandle: [NetHandle](#nethandle), connectionProperties: [ConnectionProperties](#connectionproperties) }> | 是 | 回调函数。 | **示例:** @@ -402,10 +402,10 @@ on(type: 'netLost', callback: Callback\): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| type | string | 是 | 监听的事件,固定'netLost' | -| callback | Callback\<[NetHandle](#nethandle)>> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 监听事件,固定为'netLost'。
netLost:网络严重中断或正常断开事件。 | +| callback | Callback\<[NetHandle](#nethandle)> | 是 | 回调函数。 | **示例:** @@ -425,10 +425,10 @@ on(type: 'netUnavailable', callback: Callback\): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| type | string | 是 | 监听的事件,固定'netUnavailable' | -| callback | Callback\> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 监听事件,固定为'netUnavailable'。
netUnavailable:网络不可用事件。 | +| callback | Callback\ | 是 | 回调函数。 | **示例:** @@ -450,9 +450,9 @@ register(callback: AsyncCallback\): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| callback | Callback\> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------- | +| callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -472,9 +472,9 @@ unregister(callback: AsyncCallback\): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| callback | Callback\> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------- | +| callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -486,26 +486,30 @@ connection.createNetConnection().unregister(function (error) { ## NetHandle -网络的句柄 +数据网络的句柄。 -| 变量 | 类型 | 说明 | -| ----- | ----- | ----- | -| netId | number | 对应网络的编号 | +在调用NetHandle的方法之前,需要先获取NetHandle对象。 + +### 属性 + +| 变量 | 类型 | 说明 | +| ----- | ------ | ------------------------- | +| netId | number | 网络ID,必须大于等于100。 | ### getAddressesByName getAddressesByName(host: string, callback: AsyncCallback\>): void -使用对应网络将host解析成IP,返回所有IP,使用callback方式作为异步方法。 +使用对应网络解析主机名以获取所有IP地址,使用callback方式作为异步方法。 **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| host | string | 是 | 需要解析的域名 | -| callback | AsyncCallback\> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------- | ---- | ------------------ | +| host | string | 是 | 需要解析的主机名。 | +| callback | AsyncCallback\> | 是 | 回调函数 | **示例:** @@ -522,21 +526,21 @@ connection.getDefaultNet().then(function (netHandle) { getAddressesByName(netHandle: NetHandle): Promise\> -使用对应网络将host解析成IP,返回所有IP,使用Promise方式作为异步方法。 +使用对应网络解析主机名以获取所有IP地址,使用Promise方式作为异步方法。 **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| host | string | 是 | 需要解析的域名 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------ | +| host | string | 是 | 需要解析的主机名。 | **返回值:** -| 类型 | 说明 | -| ----- | ----- | -| Promise\> | 以Promise形式返回 | +| 类型 | 说明 | +| ------------------------------------------- | ----------------------------- | +| Promise\> | 以Promise形式返回所有IP地址。 | **示例:** @@ -552,16 +556,16 @@ connection.getDefaultNet().then(function (netHandle) { getAddressByName(host: string, callback: AsyncCallback\): void -使用对应网络将host解析成IP,返回一个IP,使用callback方式作为异步方法。 +使用对应网络解析主机名以获取第一个IP地址,使用callback方式作为异步方法。 **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| host | string | 是 | 需要解析的域名 | -| callback | AsyncCallback\<[NetAddress](#netaddress)> | 是 | 回调函数 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------- | ---- | ------------------ | +| host | string | 是 | 需要解析的主机名。 | +| callback | AsyncCallback\<[NetAddress](#netaddress)> | 是 | 回调函数。 | **示例:** @@ -578,21 +582,21 @@ connection.getDefaultNet().then(function (netHandle) { getAddressByName(netHandle: NetHandle): Promise\ -使用对应网络将host解析成IP,返回一个IP,使用Promise方式作为异步方法。 +使用对应网络解析主机名以获取第一个IP地址,使用Promise方式作为异步方法。 **系统能力**:SystemCapability.Communication.NetManager.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ----- | ----- | ---- | ----- | -| host | string | 是 | 需要解析的域名 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------ | +| host | string | 是 | 需要解析的主机名。 | **返回值:** -| 类型 | 说明 | -| ----- | ----- | -| Promise\<[NetAddress](#netaddress)> | 以Promise形式返回 | +| 类型 | 说明 | +| ----------------------------------- | ------------------------------- | +| Promise\<[NetAddress](#netaddress)> | 以Promise形式返回第一个IP地址。 | **示例:** @@ -606,81 +610,81 @@ connection.getDefaultNet().then(function (netHandle) { ## NetSpecifier -网络的特征。 +提供承载数据网络能力的实例。 -| 变量 | 类型 | 说明 | -| ----- | ----- | ----- | -| netCapabilities | [NetCapabilities](#netcapabilities) | 网络的能力集 | -| bearerPrivateIdentifier | string | 网络标识符,WIFI网络的标识符是"wifi",蜂窝网络的标识符是"slot0"(对应SIM卡1) | +| 变量 | 类型 | 说明 | +| ----------------------- | ----------------------------------- | ------------------------------------------------------------ | +| netCapabilities | [NetCapabilities](#netcapabilities) | 存储数据网络的传输能力和承载类型。 | +| bearerPrivateIdentifier | string | 网络标识符,WIFI网络的标识符是"wifi",蜂窝网络的标识符是"slot0"(对应SIM卡1)。 | ## NetCapabilities 网络的能力集。 -| 变量 | 类型 | 说明 | -| ----- | ----- | ----- | -| linkUpBandwidthKbps | number | 带宽上限 | -| linkDownBandwidthKbps | number | 带宽下限 | -| networkCap | Array<[NetCap](#netcap)> | 网络具体能力 | -| bearerTypes | Array<[NetBearType](#netbearType)> | 网络类型 | +| 变量 | 类型 | 说明 | +| --------------------- | ---------------------------------- | ------------------------ | +| linkUpBandwidthKbps | number | 上行(设备到网络)带宽。 | +| linkDownBandwidthKbps | number | 下行(网络到设备)带宽。 | +| networkCap | Array<[NetCap](#netcap)> | 网络具体能力。 | +| bearerTypes | Array<[NetBearType](#netbearType)> | 网络类型。 | ## NetCap 网络具体能力。 -| 变量 | 值 | 说明 | -| ------ | ----- | ----- | -| NET_CAPABILITY_INTERNET | 12 | 联网能力 | -| NET_CAPABILITY_VALIDATED | 16 | 网络可用 | +| 变量 | 值 | 说明 | +| ------------------------ | ---- | ---------------------- | +| NET_CAPABILITY_INTERNET | 12 | 网络可以访问Internet。 | +| NET_CAPABILITY_VALIDATED | 16 | 网络可用。 | ## NetBearType 网络类型。 -| 变量 | 值 | 说明 | -| ------ | ----- | ----- | -| BEARER_CELLULAR | 0 | 蜂窝网络 | -| BEARER_WIFI | 1 | WIFI网络 | +| 变量 | 值 | 说明 | +| --------------- | ---- | ----------- | +| BEARER_CELLULAR | 0 | 蜂窝网络。 | +| BEARER_WIFI | 1 | Wi-Fi网络。 | ## ConnectionProperties 网络连接信息。 -| 变量 | 类型 | 说明 | -| ----- | ----- | ----- | -| interfaceName | string | 网卡名称 | -| domains | string | 所属域,默认"" | -| linkAddresses | Array<[LinkAddress](#linkaddress)> | 链路信息 | -| routes | Array<[RouteInfo](#routeinfo)> | 路由信息 | -| mtu | number | 最大传输单元 | +| 变量 | 类型 | 说明 | +| ------------- | ---------------------------------- | ---------------- | +| interfaceName | string | 网卡名称。 | +| domains | string | 所属域,默认""。 | +| linkAddresses | Array<[LinkAddress](#linkaddress)> | 链路信息。 | +| routes | Array<[RouteInfo](#routeinfo)> | 路由信息。 | +| mtu | number | 最大传输单元。 | ## LinkAddress 网络链路信息。 -| 变量 | 类型 | 说明 | -| ----- | ----- | ----- | -| address | [NetAddress](#netaddress) | 链路地址 | -| prefixLength | number | 地址前缀长度 | +| 变量 | 类型 | 说明 | +| ------------ | ------------------------- | -------------------- | +| address | [NetAddress](#netaddress) | 链路地址。 | +| prefixLength | number | 链路地址前缀的长度。 | ## RouteInfo 网络路由信息。 -| 变量 | 类型 | 说明 | -| ----- | ----- | ----- | -| interface | string | 网卡名称 | -| destination | [LinkAddress](#linkaddress) | 目的地址 | -| gateway | [NetAddress](#netaddress) | 网关地址 | -| hasGateway | boolean | 是否有网关 | -| isDefaultRoute | boolean | 是否为默认路由 | +| 变量 | 类型 | 说明 | +| -------------- | --------------------------- | ---------------- | +| interface | string | 网卡名称。 | +| destination | [LinkAddress](#linkaddress) | 目的地址。 | +| gateway | [NetAddress](#netaddress) | 网关地址。 | +| hasGateway | boolean | 是否有网关。 | +| isDefaultRoute | boolean | 是否为默认路由。 | ## NetAddress -地址。 +网络地址。 -| 变量 | 类型 | 说明 | -| ----- | ----- | ----- | -| address | string | 一个IPv4地址或者IPv6地址 | -| family | number | IPv4 = 1, IPv6 = 2, 默认IPv4 | -| port | number | 端口,取值范围\[0, 65535] | +| 变量 | 类型 | 说明 | +| ------- | ------ | ------------------------------ | +| address | string | 地址。 | +| family | number | IPv4 = 1,IPv6 = 2,默认IPv4。 | +| port | number | 端口,取值范围\[0, 65535]。 | \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/Readme-CN.md b/zh-cn/application-dev/reference/arkui-js/Readme-CN.md index b0adfa00699..8380ca334b2 100644 --- a/zh-cn/application-dev/reference/arkui-js/Readme-CN.md +++ b/zh-cn/application-dev/reference/arkui-js/Readme-CN.md @@ -1,111 +1,102 @@ -# 基于JS扩展的类Web开发范式 - -- [组件](js-components.md) - - [通用](js-components-common.md) - - [通用属性](js-components-common-attributes.md) - - [通用样式](js-components-common-styles.md) - - [通用事件](js-components-common-events.md) - - [通用方法](js-components-common-methods.md) - - [动画样式](js-components-common-animation.md) - - [渐变样式](js-components-common-gradient.md) - - [转场样式](js-components-common-transition.md) - - [媒体查询](js-components-common-mediaquery.md) - - [自定义字体样式](js-components-common-customizing-font.md) - - [原子布局](js-components-common-atomic-layout.md) - - - [容器组件](js-components-container.md) - - [badge](js-components-container-badge.md) - - [dialog](js-components-container-dialog.md) - - [div](js-components-container-div.md) - - [form](js-components-container-form.md) - - [list](js-components-container-list.md) - - [list-item](js-components-container-list-item.md) - - [list-item-group](js-components-container-list-item-group.md) - - [panel](js-components-container-panel.md) - - [popup](js-components-container-popup.md) - - [refresh](js-components-container-refresh.md) - - [stack](js-components-container-stack.md) - - [stepper](js-components-container-stepper.md) - - [stepper-item](js-components-container-stepper-item.md) - - [swiper](js-components-container-swiper.md) - - [tabs](js-components-container-tabs.md) - - [tab-bar](js-components-container-tab-bar.md) - - [tab-content](js-components-container-tab-content.md) - - - [基础组件](js-components-basic.md) - - [button](js-components-basic-button.md) - - [chart](js-components-basic-chart.md) - - [divider](js-components-basic-divider.md) - - [image](js-components-basic-image.md) - - [image-animator](js-components-basic-image-animator.md) - - [input](js-components-basic-input.md) - - [label](js-components-basic-label.md) - - [marquee](js-components-basic-marquee.md) - - [menu](js-components-basic-menu.md) - - [option](js-components-basic-option.md) - - [picker](js-components-basic-picker.md) - - [picker-view](js-components-basic-picker-view.md) - - [piece](js-components-basic-piece.md) - - [progress](js-components-basic-progress.md) - - [qrcode](js-components-basic-qrcode.md) - - [rating](js-components-basic-rating.md) - - [richtext](js-components-basic-richtext.md) - - [search](js-components-basic-search.md) - - [select](js-components-basic-select.md) - - [slider](js-components-basic-slider.md) - - [span](js-components-basic-span.md) - - [switch](js-components-basic-switch.md) - - [text](js-components-basic-text.md) - - [textarea](js-components-basic-textarea.md) - - [toolbar](js-components-basic-toolbar.md) - - [toolbar-item](js-components-basic-toolbar-item.md) - - [toggle](js-components-basic-toggle.md) - - - [媒体组件](js-components-media.md) - - [video](js-components-media-video.md) - - - [画布组件](js-components-canvas.md) - - [canvas组件](js-components-canvas-canvas.md) - - [CanvasRenderingContext2D对象](js-components-canvas-canvasrenderingcontext2d.md) - - [Image对象](js-components-canvas-image.md) - - [CanvasGradient对象](js-components-canvas-canvasgradient.md) - - [ImageData对象](js-components-canvas-imagedata.md) - - [Path2D对象](js-components-canvas-path2d.md) - - [ImageBitmap对象](js-components-canvas-imagebitmap.md) - - [OffscreenCanvas对象](js-components-canvas-offscreencanvas.md) - - [OffscreenCanvasRenderingContext2D对象](js-offscreencanvasrenderingcontext2d.md) - - - [栅格组件](js-components-grid.md) - - [基本概念](js-components-grid-basic-concepts.md) - - [grid-container](js-components-grid-container.md) - - [grid-row](js-components-grid-row.md) - - [grid-col](js-components-grid-col.md) - - - [svg组件](js-svg.md) - - [通用属性](js-components-svg-common-attributes.md) - - [svg](js-components-svg.md) - - [rect](js-components-svg-rect.md) - - [circle](js-components-svg-circle.md) - - [ellipse](js-components-svg-ellipse.md) - - [path](js-components-svg-path.md) - - [line](js-components-svg-line.md) - - [polyline](js-components-svg-polyline.md) - - [polygon](js-components-svg-polygon.md) - - [text](js-components-svg-text.md) - - [tspan](js-components-svg-tspan.md) - - [textPath](js-components-svg-textpath.md) - - [animate](js-components-svg-animate.md) - - [animateMotion](js-components-svg-animatemotion.md) - - [animateTransform](js-components-svg-animatetransform.md) - -- [自定义组件](js-components-custom.md) - - [基本用法](js-components-custom-basic-usage.md) - - [自定义事件](js-components-custom-events.md) - - [Props](js-components-custom-props.md) - - [事件参数](js-components-custom-event-parameter.md) - - [slot插槽](js-components-custom-slot.md) - - [生命周期定义](js-components-custom-lifecycle.md) - -- [附录](js-appendix.md) - - [类型说明](js-appendix-types.md) +# 基于JS扩展的类Web开发范式 +- 组件 + - 通用 + - [通用属性](js-components-common-attributes.md) + - [通用样式](js-components-common-styles.md) + - [通用事件](js-components-common-events.md) + - [通用方法](js-components-common-methods.md) + - [动画样式](js-components-common-animation.md) + - [渐变样式](js-components-common-gradient.md) + - [转场样式](js-components-common-transition.md) + - [媒体查询](js-components-common-mediaquery.md) + - [自定义字体样式](js-components-common-customizing-font.md) + - [原子布局](js-components-common-atomic-layout.md) + - 容器组件 + - [badge](js-components-container-badge.md) + - [dialog](js-components-container-dialog.md) + - [div](js-components-container-div.md) + - [form](js-components-container-form.md) + - [list](js-components-container-list.md) + - [list-item](js-components-container-list-item.md) + - [list-item-group](js-components-container-list-item-group.md) + - [panel](js-components-container-panel.md) + - [popup](js-components-container-popup.md) + - [refresh](js-components-container-refresh.md) + - [stack](js-components-container-stack.md) + - [stepper](js-components-container-stepper.md) + - [stepper-item](js-components-container-stepper-item.md) + - [swiper](js-components-container-swiper.md) + - [tabs](js-components-container-tabs.md) + - [tab-bar](js-components-container-tab-bar.md) + - [tab-content](js-components-container-tab-content.md) + - 基础组件 + - [button](js-components-basic-button.md) + - [chart](js-components-basic-chart.md) + - [divider](js-components-basic-divider.md) + - [image](js-components-basic-image.md) + - [image-animator](js-components-basic-image-animator.md) + - [input](js-components-basic-input.md) + - [label](js-components-basic-label.md) + - [marquee](js-components-basic-marquee.md) + - [menu](js-components-basic-menu.md) + - [option](js-components-basic-option.md) + - [picker](js-components-basic-picker.md) + - [picker-view](js-components-basic-picker-view.md) + - [piece](js-components-basic-piece.md) + - [progress](js-components-basic-progress.md) + - [qrcode](js-components-basic-qrcode.md) + - [rating](js-components-basic-rating.md) + - [richtext](js-components-basic-richtext.md) + - [search](js-components-basic-search.md) + - [select](js-components-basic-select.md) + - [slider](js-components-basic-slider.md) + - [span](js-components-basic-span.md) + - [switch](js-components-basic-switch.md) + - [text](js-components-basic-text.md) + - [textarea](js-components-basic-textarea.md) + - [toolbar](js-components-basic-toolbar.md) + - [toolbar-item](js-components-basic-toolbar-item.md) + - [toggle](js-components-basic-toggle.md) + - 媒体组件 + - [video](js-components-media-video.md) + - 画布组件 + - [canvas组件](js-components-canvas-canvas.md) + - [CanvasRenderingContext2D对象](js-components-canvas-canvasrenderingcontext2d.md) + - [Image对象](js-components-canvas-image.md) + - [CanvasGradient对象](js-components-canvas-canvasgradient.md) + - [ImageData对象](js-components-canvas-imagedata.md) + - [Path2D对象](js-components-canvas-path2d.md) + - [ImageBitmap对象](js-components-canvas-imagebitmap.md) + - [OffscreenCanvas对象](js-components-canvas-offscreencanvas.md) + - [OffscreenCanvasRenderingContext2D对象](js-offscreencanvasrenderingcontext2d.md) + - 栅格组件 + - [基本概念](js-components-grid-basic-concepts.md) + - [grid-container](js-components-grid-container.md) + - [grid-row](js-components-grid-row.md) + - [grid-col](js-components-grid-col.md) + - svg组件 + - [通用属性](js-components-svg-common-attributes.md) + - [svg](js-components-svg.md) + - [rect](js-components-svg-rect.md) + - [circle](js-components-svg-circle.md) + - [ellipse](js-components-svg-ellipse.md) + - [path](js-components-svg-path.md) + - [line](js-components-svg-line.md) + - [polyline](js-components-svg-polyline.md) + - [polygon](js-components-svg-polygon.md) + - [text](js-components-svg-text.md) + - [tspan](js-components-svg-tspan.md) + - [textPath](js-components-svg-textpath.md) + - [animate](js-components-svg-animate.md) + - [animateMotion](js-components-svg-animatemotion.md) + - [animateTransform](js-components-svg-animatetransform.md) +- 自定义组件 + - [基本用法](js-components-custom-basic-usage.md) + - [自定义事件](js-components-custom-events.md) + - [Props](js-components-custom-props.md) + - [事件参数](js-components-custom-event-parameter.md) + - [slot插槽](js-components-custom-slot.md) + - [生命周期定义](js-components-custom-lifecycle.md) +- 附录 + - [类型说明](js-appendix-types.md) diff --git a/zh-cn/application-dev/reference/arkui-js/figures/Video_2021-03-26_154549.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125114.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/Video_2021-03-26_154549.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125114.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/tab.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125116.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/tab.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125116.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/textpath-animate1.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125118.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/textpath-animate1.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125118.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/text-animate-part3.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125122.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/text-animate-part3.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125122.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/animate-4.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125126.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/animate-4.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125126.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125174.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125174.png new file mode 100644 index 0000000000000000000000000000000000000000..f1abe2afcb7902557ac3c4f58abfdf333af03121 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<HTpZ$BCY4@I_ZE+X7F_Nb6Mw< G&;$USO(kvs literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125178.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125178.png new file mode 100644 index 0000000000000000000000000000000000000000..6064f64867e3aca621244e1e6fdb16d3ab2ed748 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<hn4>>npj9RO=)9T`pfyh}Tr%j=i@q~d?(_%%BOpbt6^(MT1Z3;^j9ajFkXksDNG^LGU=`Z)o4>s^SGVovZ VdHB#I`7_Wk22WQ%mvv4FO#o7yD24z4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125188.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125188.png new file mode 100644 index 0000000000000000000000000000000000000000..44e4d991524bd0ef88a0dd10f204e022dd9d0621 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<?7%k+xbtZM&1=}*RK`Wwpf9MhgEb5lgWEFWb!_@Ud>7sR_C<+Z-7QIc)I$z JtaD0e0stp2B3l3e literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/animate-transform2.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125192.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/animate-transform2.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125192.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125194.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125194.png new file mode 100644 index 0000000000000000000000000000000000000000..e370a44cf043fc34bd8891f57faad2cd2ca05707 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<WH8`x4m4gl zdum=(`wwx=`_&F{lkC1k;w<&o0!*CnYjAo8i5RE@O1Ta JS?83{1OUE7E4Bat literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125214.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125214.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c353b6a872d3597b767f4c216b2d16bfc2139b GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<aVCz}T zx5S{#&3VEhh7<|jgBJysn6PMEwV%c2?mXd=z=Dwf8B#L5j$Y0UL4Ox#7Tjo8U~oKP Vx$=RPc^J?z22WQ%mvv4FO#smAC5He2 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125218.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125218.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0ed50716d897398c1e9a741e08ff5f1b9fd9de GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<ECY1mH literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125222.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125222.png new file mode 100644 index 0000000000000000000000000000000000000000..2dadb92ce56793e2dd693bfa7d99b0c1168130dc GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<u9`v3p{ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125224.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125224.png new file mode 100644 index 0000000000000000000000000000000000000000..41be1a646e14511b5d177d11a7bce10deaee5bc9 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<u9`v3p{ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125228.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125228.png new file mode 100644 index 0000000000000000000000000000000000000000..515185ab1b3cf9aaba1204760dae19ab3c112b42 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<Sh=Jfykd5YQwBPgg&e IbxsLQ00wy|fdBvi literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125230.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125230.png new file mode 100644 index 0000000000000000000000000000000000000000..984e7a561e661ecefca8b60d5ac239b67f96c98c GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<f|pLyMRV9c)I$z JtaD0e0ssw+B0T^A literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125238.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125238.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcb0c5e259b3f8d7375c21712249c1e847edd67 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<gvsPR8!~yHTkoK@5o7VyVoRVo44$rjF6*2U FngHorA+!Jh literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125240.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125240.png new file mode 100644 index 0000000000000000000000000000000000000000..a9aba5f67b94427168fade014542532431e28a2e GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<z>% literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125242.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125242.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5e360f249a2002ba68ad9b94bd7f66f5d6aab1 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<1j~ai3u2?}nI3!M24zF0m(Cb2%Ld2yoPL_?(AKe%Skf>0X-K$$wf|vOuF4JYD@< J);T3K0RYF*ChPzJ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125244.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125244.png new file mode 100644 index 0000000000000000000000000000000000000000..0d386fef5c4fa9faf1b29c7667c7392db250f2eb GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^vZd%sH>+buZkmK&i5y7S9!J2W87n!Wnw_vi+biBRs%~qgU44$rj JF6*2UngF_5B*Fjy literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125248.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125248.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1948de8581602c6c5879c03d68c14f06eccd00 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<2b_L20&?ffTHEn|h-^=k#TEmmORVHI7%Wb&R3nY_=fXIJHI`*?ot6`)ZJp00i_ I>zopr0RBTE<^TWy literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125250.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125250.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0ae86ad14ff863511a10ecc1a85b273e826dfc GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<hn4>>npj9RO=)9T`pfgTe~ HDWM4fnN1{) literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284970.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284970.png new file mode 100644 index 0000000000000000000000000000000000000000..1c4f9ae52153198f8690a1066fe66ba8c7bd1ee1 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<HTpZmLtIN+Qw2`}4Px+g^>bP0 Hl+XkKo`WU% literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284976.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284976.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0521001d2513fd69e48ce61e1d1128b9d3a6dd GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<L zmuaSkh=^ECx?k KKbLh*2~7Y=)hIRq literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284982.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284982.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4476c4791e37d4681f8e12313ae1cad0887c1b GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<E~|)z4*} HQ$iB}u2&@X literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284992.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284992.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc88e656c293c2e65939e4a793684488dfc81be GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<xL zcmERS8s$&l7bP0 Hl+XkKn#d)- literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284998.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284998.png new file mode 100644 index 0000000000000000000000000000000000000000..57594c6855d4cdf1b37cc3e5354374c9dae0823b GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<gQu&X%Q~loCIG!dB=Z0O literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285000.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285000.png new file mode 100644 index 0000000000000000000000000000000000000000..c89f746719790333bce2bde8c5b8d86102fdfc33 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<~Aw|vW64GumdK II;Vst00iSF{Qv*} literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285002.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285002.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc3583f82d21c8bec0c70b2da36ed05723fd9a7 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<yh}Tr%j=i@q~d?(_%%BOpbt6^(MT1Z3;^j9ajFkXksDNG^LGU=`Z)o4>s^SGPFCm VT891pUJEpg!PC{xWt~$(696|4C)5A{ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285012.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285012.png new file mode 100644 index 0000000000000000000000000000000000000000..45467f3e6fc0866b6da0521911bdb5e7d740df29 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<cN$Rpt{ z>yh}Tr%j=i@q~d?(_%%BOpbt6^(MT1Z3;^j9ajFkXksDNG^LGU=`Z)o4>s^SGA#1( V+9;tHQwlVU!PC{xWt~$(697g)Cn^8{ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285016.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285016.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc1d312680f479e8c443476ea39eaf1e8a16e55 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<FVdQ I&MBb@0OLd_umAu6 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285018.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285018.png new file mode 100644 index 0000000000000000000000000000000000000000..1324b43b3f5b8dd0548cf2069c4c532c5284c445 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<(hYdFnGH9xvX$ z&A-68M)}h>#+^$h`^fJ5=6Iv8NnnFW$ONtnd!&)c8vPxHJUVmRrRVnp4Px+g^>bP0 Hl+XkKXk{fE literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285026.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285026.png new file mode 100644 index 0000000000000000000000000000000000000000..0d53a47b7eace81d5c7da88c59fee61e30c89681 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<HTpZ$BCY4@I_ZE+X7F_Nb6Mw< G&;$USO(kvs literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285030.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285030.png new file mode 100644 index 0000000000000000000000000000000000000000..64fdda07447707816e8a6238939169f58a4ce58f GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<_6YMg>4~7(8A5T-G@y GGywoUog&@< literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285038.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285038.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb2d41877c85cccfb918b042bc13c81c58ec191 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<zopr0G`n$-v9sr literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285040.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285040.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7cec00f9d186d76ff5cb12d47811084217cc1c GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^vZoVvz*WLF+A;;a3BZ5oIgEiwGFEUxDZ;`ReNw>ME!y9N8gQu&X J%Q~loCIH4-B#Qt5 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285044.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285044.png new file mode 100644 index 0000000000000000000000000000000000000000..6823cbc9203b07abae455b4ee5c7692878c4be72 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<zm7`tiAv=hr!d;&t;uc GLK6Uut|w#w literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285046.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285046.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1edf2219980ab9c8533b9fda3219521c50533d GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<zgc6(aJz`7(8A5T-G@y GGywo`jwMk5 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285052.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285052.png new file mode 100644 index 0000000000000000000000000000000000000000..6823cbc9203b07abae455b4ee5c7692878c4be72 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<zm7`tiAv=hr!d;&t;uc GLK6Uut|w#w literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285054.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285054.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcb0c5e259b3f8d7375c21712249c1e847edd67 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<gvsPR8!~yHTkoK@5o7VyVoRVo44$rjF6*2U FngHorA+!Jh literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285056.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285056.png new file mode 100644 index 0000000000000000000000000000000000000000..9114031e04fc28be59e8c9567c0fcfe81a9cc5cb GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<5 zHam4eN=JTA<#(pyApdu#AFSp-R3_5W5E$U7b%kYE*E!esKE4Vk>pt+zhL@MiUEm;XR>7(8A5T-G@y GGywqZaU#(G literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285062.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285062.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b21ed6b44c2f756458137f931873f540c16e5f GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^vZth$juehn4>>npj9RO=)9T`pf^vZth$jueFVdQ&MBb@0Lf+}ssI20 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164837.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164837.png new file mode 100644 index 0000000000000000000000000000000000000000..a33c4fce8448e2127b21e277437195ce0002766b GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<tu=OnF zTVhb=<~-pLLy83N!HWV*OjtCo+RtKhcb;%bU_r?L3@I62M=$4wpudYV3vRS4FywEv VI%pPuxD;p@gQu&X%Q~loCIHD*CAI(n literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164841.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164841.png new file mode 100644 index 0000000000000000000000000000000000000000..b234a769d1a9f1f30c4d2127160cf067e9f71ad6 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<RiwEA8t?HG8cK4T|M&9TfXJ31_z_FBkM|rv%8VWgWsFDWA_=Q=A|zC2Q-Pn)78&q Iol`;+0Pkui;s5{u literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164851.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164851.png new file mode 100644 index 0000000000000000000000000000000000000000..c33d763d18f5108bf0eedba19c662d05af397ee9 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<~D&D$T?rzSJqs2gT7(8A5T-G@y GGywn_$RqUt literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164855.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164855.png new file mode 100644 index 0000000000000000000000000000000000000000..fe422eecde9ec9f1fcac762bd81a23b3fa3abde7 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<FVdQ I&MBb@0MG;`-B!W-pgl=nTg)g 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 DxUA<6 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/tspan-animate-part3.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164863.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/tspan-animate-part3.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164863.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164865.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164865.png new file mode 100644 index 0000000000000000000000000000000000000000..bc28f5056c679e189543c8ad6fba67fb56db7655 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<`Qm>nNU(}7VKRBohD_e)){~dj+&TNsyUjpz7(8A5T-G@y GGywq1ts(IM literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164877.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164877.png new file mode 100644 index 0000000000000000000000000000000000000000..8442c9b2258c79ee6b6a3d5963df5b792bbb1a16 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<~3W8;P)nOrY;M~12Ur3K$93eUHx3v IIVCg!0ITjLWB>pF literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164879.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164879.png new file mode 100644 index 0000000000000000000000000000000000000000..d77ed21418dc3035feb9f9c8e15815e577d71a90 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<{(5C$j(m literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164881.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164881.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc1eadbb05520daa6d79779683db96d0afe7cbdd GIT binary patch literal 333908 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

    Um0oTCJMqeK8Qa*dMzMvX_DqrZ@GBXKhVz(ko| z9*J(oMnsWrtvtYsd?OShQ+HYr<@!}hfNXsas21yDvurj3E{Xy}c+8V{051ZVDAB{b zbUQ9MM94izk+KycFi5_7^G&WtK(32#5%CSULndy-8CJ_1R;f$%a^45#!P}k!jF`3- zqtMM_Q*Nl#!2_HSlU73jnyebl2dEK%MT=Vf=XK^5RYm|8ijC9vBO1FARq}lzO8r8q zTM4l{5dbnqZHA_8C#LVl{6{|fU-%sW8I}HxjQ=b$W`oT4vdOhJ7?GiYxN06%TO)r@ z#Oh&T2EPKK3|B?Y(GWMD?JTzVAk(HKlz6T5h%?FzHq{?*{7Nr~xyW_L(hl8>!!Zak z2rYWTK=S85*G_-mJ6LI?)kuBgjZ4nHS&DxOAz;9yONSxd{lxqG+Uf6m2b*-*yjkXt zF;Qvw?t2N2EsejF?$PwdAgeO>#=zzs_V#DZ*<23f{k3=SQ^IZoFp?<>ij2e8p(%^c zX`<ogfc0!Jtmou2U!YyhEKf??_ynYTvk(WGsHk#wi?qC5E0Th_KRb%>g#nmV#Y_N3WHgBZL+2JmG zLQ}9AQ^Ah;!hom}6e1wyHt0cZByDdGwQj@Oe4mMgBCrPJI%o5|+gra-7Hd z>1qcs6o2K};}HpITRW7{7Z@?fcpaBKqlQ>-sx#Hmcu&5X7)`rQSkyLFPgSsAlZ@+! znx4*%r3@6!m}v$7h_Pxfb}My?RdF-0H`qR1@ZFekn=vcJ5n2Fx#6%|R29w?A^{{Tw z*J^1>4kz6*gD*A`5CeKkVedm;Z$=`w)NSNQhg?oRuYGs16X2FoyX!Ej{(85LtfX#g=3(`)@#AK!W&sq%zITV~1aH_k>l)6|@Js-)_j%yEP^BNp>17hj({ zdWMpmZ^jni>J5y}N=@$@civtbPCnARJ|C5qS}r3pL#XFS7aTaizFsY^6Q4<-XcxhB zMAMKHbD&@O_T7ng$x*WJwqg^Od9O8^BTJr_;3#DKFeb%eq&s~kw#D(CiA=?MbVu|E z)zOc{_?wRACpovRVK%Pa^l5X$#_t&AzW3*nL7^hWv_c;~susl%#S?b0c5(T``7=n0 z1v|5KUj}~O&d^RnS9s*l$M%Smp>*&Q@x6kV2KExl6pPj(oCz9%E~|;u@^u{&GwdM> zFEeQobq|XBUxxJ*>YWC#%H5wR_XAm&(-L6xWT20PM>F=(vpwwDFCIjMJMOMt@}eu7 zK67G?U1ek>%j?kgbBZPvSYjwj zLq)F)H$Q8>izV-waQ`DIBG#`zRs`RVs6JO8g;naV3o{rFn7kNeneJZ^^&C-i4T<#m zR<$m!VW@6Y63McawIb;@qW*R;^24FPhP0cZhQXc=%f*`&8Rrp=54gmiz||XasfNSa z+{7#xdMok{BbveLQ2_*kn-7`|wKQLhF_UwxDA|o@MTfWq(N}M(d^OZo9jprG6Wmf; zGt|+WIEs5{p9OUzhj#h%JNZ|Pw6VgNVwecSr|&YB->)9av9$MnhOl3a{`9OUluu8W z^EigXzf-V8A+5l?d7H5|PY)bNQcQr(kvU;2UlH)V*sOYcU|np&Xj#zYQE;JAH+y^W zNMRvtywFf(dgAkPAd=o)(Aa5!9`DR}nO@(hHiP(dr*}p9$2GWR{n*2ndo^V*aK2kJ zi5qrZ>Q$Sq+1p768kGbH)np|XGsq-P&m!s9L}l9%^CZqJ1gs(TJcFZBz)e;?;K=C*&oM}P?<+3P6xr?RbrYgouS!W^ zh-e3~!#_lB(QLGa_{Khk382&-;>W!aO35yEiC%WeZstYARLVwV>^3kLwJ+VvzmC{S z-VE8fod+Q57_p|%#iP*4w{klM0Mf%M`J~Nw0EAi*MfZDz=5EKWn@s^(Hf=iu;4AKa zasa5T+aHY~`W@OW?dr^J%M1aI8bCBwkK{*hgsOZI>OeG@mg)#k-|0nE0j%}Eke&Ya zF98sx`frH(XCW#H1>GDeUDHYyG~${A`o?bnMqzco#g+lV20R28?RW;%EB{?LM?TEfN>U%NX&@ z!!z~HCB#BR2T&;Nn|K6WdpO@90~%P zILbiC?%;!o-YYDzq``10^3p#*5&%~s`wVO5Cn=A-%p*@37W>3}c%>~`yxV^sF)yCGrrxrEsG;FMuf-tYS5U(H)l%49hd zi;`Qm_dkQsI1k_`WWe1G1v$Vf7t_tdtI4EUzqR?ok`5iwSaP@Mu#3vAh>r-2K4Mz~ zdxCwapREV)03nA_!3#XtcMgGC)}S)FSGbNcHSXNAFTfa%(MNq;v~=iI9y32{MOIW@ zKxlAJFcAbq&4_E|&>ShnoVFyP<$G3!)qbPq`C1 z<<1yYcfA5pAE*M#?B|)*sWeZPd@-*lX-=6bBUO4ri)2>+NKvO|9J@ zQ?8GO(dL@;njbhw7P)(?-yBaGOTX0{cf-3uoauhxX*pWeU=my2$V|Q2YWh6rbhYw% zzk%*}bpLkk04o$xbID+KnRQfmje6jQ9Ha~eyTj+0@Y%8K>5#q~G$NFS-SFNhqwsuc z#1?zzLlu;amWb4bU+}_Ll`S3P!N<1jJjV|yndaA==yD^~nru8p>8mf|qNujR93}1t z;Jxn=Bfs3Yxu0c%A9}BYad7ZcPi8t1R_*;vftLZQg-^6fKFMd>gtMCLX6&VHO0WfJ zy?8{Wd}jz<;@*p)AbV_MiVqcCA}{PiWb!kq3H%9>jU`iD%QAJswxqBm3Z3z*c*NwD<($ig<`i@aq0%i>3XFa;Ff+EEa zS6LqC6Fszzh!HJ+#`Myk$W%5WR`_u3u9pqbV~U74K|W@>a3!K=d*Si?FLS8V*@$eq z!V~z)nJLRLh@Pi}C-NNT+-cn+eEBLoiHnbg^lLAnt9p1c$ID!zZ~26;nZr}q%2@~w z{R!XRhNZF`=Hh~F3B4x5(wO*Iu?dt3Ka_-}GrY{hpl2ua_Y2FQFK0#L!z2tg3(KTE z%tMjcCI}Y_%cADn0&DdVL_@-|DPQK_nimknkA&usm)l%91`s5tgyxbR=AXlC3DRGM z=8^DipM)tBWP3P7qu6J2?4#?UD!UfEK@=4rAsz@8S&m1&ZBIZQtImJ-l|9=1*kBHu z7xZ0^>Df~~GNPHzN?F;8!dvgz!rfK<0(f+hGnY|`V*G?bakcGDd*7oq<;lEh*Kqf@ zlndtxQ-#;#>R!bhM#!(GTGXGFKO@SRsvxu6D?h$3hls*o)GMK|rK5+JZE0@z7`4&BA0gM z`8C^^vij#FyFEs*@0QQX7n->qi`vZ{F_UR*JuhZf0eXpP&YH)Y_dF_R&5oaZkbD3| zLWlID5PX7yF?o5t$@-Td;^(dSA!P_(7NCA#P6Xu+F4!9<=`jKJ6ohgU6JifXxdZx! zrdrpEBLH6}5k``Q@QcF48pnJTj? zgXzKS1=Kv9c`U_JG0GADYB~!wQpL*4f1Hf}sJ8or@@lF_y{018=Kt&Zeah?q%m?Vk z^hXNhAI6th$M9Lk2`>?+z|#84^&H12IqwJ&^EfWsIPNZD;}Eee-OKZ&MGrWqiS#gN zRm;^Q3fTt9fbho;#5EwfGLKR4j$k(<$^q`vt5UXTF%s)yW}L!coFWqMWal0t2hMB& z@d*r&0RSlRg+FB@DrP$>aVx$CQLSFBmb4ur)W?{x79!ijvvfNu*Cznr-jgaLr4GLE z%@EmMmiu2s9yRJ7AlB4t9stk>pdY|}&pUo{pH-<6J*I1jxyrIY)x8~@B;)&eA=#XS6t}(bhXW5%}s*v z-h6{68iGrr_T^G{cpmeQ*GPn8rW&I{H*cIbhMIirh6dj@p6xAt4#d-F!FL(RKo#8= zO9X)j_Wo1=vN-gJ{|)BdrUxLqoZ?&(&@g>E6cv*-Oy(~skUV-n5|=4@Uur+PCy+i@ zc^P#1VW=Dyv&a%0gQd<|Hjw*IDG-4EgapZ@#?W$Cog2u(+erEHMPfKt4FwZw{C-=pC!m@bOW=vLLiO<}frGDn~dv z!@13$Qy^i?9#9aeu5BwSnW8xig%k#A!{TwQeu#o^p8!PyqX4_3xlj763L;zB?TV_} zY*gHF(Ag~ zE3LwqvI8SpP=QkZE-Je>WuSa^?0bb6#A%=o;;b~;9t`X44KSJJ>`(eLDNFZc4g&Su zL(_z!vKICq74U4>9e-71c*~kv*v9S!BD}WG=z~28ECy{dmlaf-xB;r`Z@xT>*ypE{ zF{Fj;NIkZ;GGMH-2Pf6~qlG7fRvX1<3vV`XSktav*tU*B-~%M~S$iB6E!ZsI&sR{~ zlDE4ja%|7_KgsdhtbrYIFE-K;JFhqBcI;oz4MsGG4rPAa6Wh#mE;-ryC|xMJ6&VZ6 znS^zlUG7R{mPA_?th|HnG_gFY+^6S%bKzA}n$mbQHrwB{)f!0AeAr{K|8})uCFBNi z{O}of^Z8;f-fc^TIL{mXjzzPJ!*7KSpFd9`Ye?y@2QJ>+fcjIfstlSgZt!5IM0DSI zYb6J%@x8Wm%ulshq$kGlyw4(+Zc9d_(ai9Dwnvw)$_S;mzT)}f6F>frY1n|4q4}CU z%e=_ttd&fk$8Q)|#>ug2NAW9ti$#_4{l|D4#VPM=5#PnrSD#uKJb3)CDVJB>H#=Bv z0oIKAMx1CUf5)u+wT$kQ<(kbl?svEWR3=Xd2He|uLL7Vz{AmgDdlVMZzp^tiW)kd7 zi3@Mzh3NOrQPuZ!56_pgzqWWnj`g}qPFp_2!(w%hN;LYG%_%g(K8v=JwS&*>9wM?N zGfS7SUO}_%Mdah43>FoeKB)@4!2F<0imj=>EdP7#Vb>O1v~DVSh7r+?_lG zqaJxl<}41mU!K|?MVsqdUSv(FT5S!rNsq;@*vcG)n3Cogt>M^x#4gOb=||Tr zES+^j9t5y%N60`zd5T}scj&whEG1_V|QK&pGaY|DjVB>U4P{@+i%ZDNa1Jp7p zwC<`4CVtx8QhSgv4h#U~n?&0Rv|cKf=Zu>xM6cB&pXnN+Hn zk}N%Y!{Pv=ih`I*lINWIkL(^!cub^ZpD0-{CC;XNs;TzKF4k4|oOM5qVfoBeA{N>h zIe!^lFV@Oo$=^6Jpx#;U@Zp7eMB-!=rZ9WQ_Y#%QSR{Mu2E`XyOX8j4I!99S4Wr}S z>Sc-g7YiLthpweMZJt0j2<3C!iG$jvis6lSC5-S+u^ocMkp2l2IbYTgF}j>sbU?4F z6HUzxqM`bRQd<0(WP$YkQskKA(WqLsxs$cw#HX8 zQ-AX1b)8m~2m9j8EkP&``jFUpL6GEK3r2R>KdP=f;>f6=I{2E}CnWby(L{`4BvN?l zuTp;Z_sc6;Lyn!$QU3uuu}oa#Y!(b)3$q>1uh@0l#)_-tc@SBO*Q2|x=z zVjCr2zM4BgZ0{g877=p^TM<%yJlfTA4TwU)J_a+m9@9Aa>FpK!C=L)a0fb=f8s+-m za8{&;86a1NDa@xWMgZdi)C=J3lNJM(8Aq0R-%&~fLefJ0ip#U6+qbJjhOk{ z34mw;mKE&%=^7O3W;JWj1umQb`2K=g0CoYu1<=;E-rTO!(yZ>`uY0CNrIC0mGk~)I z+Ln#w19Ury7=2ypYEq^HU~c>W;&$Xe-!ql}O|<_FqSd^cKD_QmEc<@E|26&xaB?&@ z2r4581G>_`gs6Ge0J&y|oxuUm+Wi@CNR|GG*vY|=36qNgR|7w2y!El&J4w^ZA3I~^ z#=jBm_EPo7eW_b<`%zy_EHZ(nopmHsf%cE3GVLIo&HwmC~(h=lf@+Xm23XxBYf;f;>&v1m!5PaMW4`|w}Xy@b15T`x8wXTx#oqsHq4-~ znrJVdDA0WjY{p(V0-GN_V>MD!fo(17SJFg1A03$qJww(2LpSX{vbSoQFBpOXyhb7D zu$;u_Eo@dvE^Rg&Np2JV8z~;A@f)dc7T93u1ozFMC_Zn}P%<*vzCn>8tbDB~zyLE8 z6p5+5m6P;pdn-51@3*AMc7B4jHoIaLk~=8IGPFhs1db@EZ-pcz{3Z$)>=flEyk5`o zrdo-<+&iC!l_m@8mk9x) z@WTfsb)FVa_e2L0u=ZYUqyn<_W~7dK!&Z@1;N|i|y+OB~D(ArS`3!z3&+koz7ne(g zXA4*R+Gsp)zIW`Xoga3yl-3^hSMEuyc@8bO{)p2k6`Pyb4{2VUF=p~aoGn_t_gu<1 zJ~66TjYYVh>jg`HKiMP0mDbyFmi~NpBKNLkwJek7>U2`NeLj?ZoWUI2diHrBSpEG- z#v;<%D`@_zhPQd*(ziDs8-H~2coD3oLc;Z1^GwR#GW?)L`$`5c?BVfc%Q8oHK9fLK z!1Cc^{Dv+035vg<=_{J_5KxU}Q6XA(a&P*u-n(}cGks-~_kB#nU)xR^F!XV_?Hln| zefhy@-azPFMq|oU6qC1B&;teros6FQ0u!piDtruR^XFaM%GiO?If&G(IYV-|>Y;QaxoVB~((i)J7P4s|HY!0lDTE zBOiRDEZ9ul`tWi_A`6R*ISz9bxw_pw0d^q@lOB(>^#^An9MQzn&)=IuD{x#-{5o- zYG#_RkA9_JbMHezuwc<1do;5i^DF)3yF0pCueiai0~P%i6gM-gjVU&-*w+hmE0N5r zgB8rHDC8n_x#En53WBN)`SYw-6pTvaPpy(opWC@!87*|3)`k@oJ31E{Pi0`%n`rGl z|M+ESUZJqILb4bm+mmg3X0&0rjoYQR&2%oJs%}zp&%Ty&4qsrPy2FL2;I1R=lYDLS zel_dhGV`O-uahl-dL^C%J4Tl$XPPIdCAMh0^ETeKRmVWC+38Tle7>u;0v%GOkCOE0 zhT={;LX!L=hsiwF1H*Q1Dkx!yrZ-^|6ob46j!c8Ua%bqgOJuM-#I1kjcTqUx>47%| zWqlXVCooonHVl)v62XQ`^7B?Frm7aVz7xRV}$6k)v2ER1!kz zkjY_C49q1=fE8hwP(=(3P1s+PCY!QkMi_UXRT+F~FeWTnFoR>2zR@xHH62JAxvwfm zcwkF?s2hqd8}?@DDc!35Gm)qq92e#G?Xfx|{L&YKMOIupM%|YaRbAD^&I5M(EE$r- ziUau?7PfAROQJ37m_GXLrsx)hD^sO+eamD<<84&9M0#m_tH01^J<-uXTIdSmwq)3Q zWSBd*9)i>G`sJSM@v`6^cb9(|^}dlvg8AQE`8TZlAO8Zll>VD5RsLD71lFW}tC|~1lMAF#YpB{9&C@9~8)&HBnJjzy zB}J{V=KE}&^UlIRW9|N*s^)+-sXv(wf8|sDJipQOm-*7aS0(?AE0=&<<6q`W|3N4J zeWw1m`3>u3z-RcE1oNN!a{kcC|2ALB8KEk)^%t(R%>O;X{P&r9>zw@cgcek!-veg< zAayWJ;4)3%vyKt6j^i>;VecWfu5M3`5y$n2;&0b8nlh%>}G;v3^Q#lrQ3NDmY63YAQ|m6ZuCwR z?^n`hM3wLWAK-G4?cwGhAk(W*73yP6*a_N3%zwKXi(3meYtWPZB5=Q(Pqc%10kIsi z6#~5V#5y>Vw&NBNLo#2O?7A$hJ4}IR;0U50cqam{LWwW;fF~jFHUyr8z*7-;4+0Ov z|M5@eKlu;*Tk804RS@8UpiV%+^S~zVodQjns!8MwnMegLbl5s(;!}q3zdQ^V;Ligs zB@^pxMok_&L(-_K)+frr_fw^eJzTd(fQR9`pGKG2c01brw~c8VN#S%*^Xo!u6gmA0sE*m6d#3cHSBL6U_^u}g=kwOLm3tLnjW@1X2R%41xQs2e zpzF8&;XmBMl@NS*b}1oLwun&?nj3=_XKMpS%@dO;?9b`j`S~#9D(x?z;4Dg_P?0g{ zbt>D=Vasx~sha({KMc5qe?ANw*$QVM93U{*KA^Q$kUfwcyoR(>(Da+pWq;(Vw6JKo zkms{ey}mal!f7TSk&A-v2viWb^%tgiWF$OqDP;$}>>x5Ivh69X*#2Wb=ePagFW42i z(`^L>NDvo2nLcFR9oy8z06Oo|-@4BKwm&=?kE8;vdFxRCLN`;pF8VrvyHq%0kXw8@ zV_(PxLw9i4w#y*9rmBiz;xvB+Qs|yLU4)^%JLw;Ur11?evD?*wS}wWHSHiFcZCAKU z1Gtxs>vPUm13yy%Qb+E<#g`bopbP!p?Pig+l#hFtJL;ikqE(40Dbec%Ulzo6n?9B_ zc2yCXd+O&W-iU8Bv*2CqXHUL!>*y?9sQ=Puz$3acD$H|zY$X3);&kHUXCcIKE8csO zy{@PGb?3XrYPV~1M4#&~d21b{$M+Ly5El!hpRaB}_C~i!v2}A7p&npWx-~;IiSzNi z_t^JSkia7F?|;S&*_;LZX+piufk)sW=Jp`)KP$`h;)n^3OSvd4u>o4r*wX{4xS z=?N}!%*>cw8YC^K=Gt?KC7+*tA)GK!yz5pvZ5k{U%d(cd`Px<6bS$Jc@!R(zr|!PF z;RM0@Eazgi_Z&t$gOkN4Yx{4rJx!b2PRmgA_r57pl6*biLAtm54T0&yAsi803_^;7 z^>T~AtipFc&CC-wa3_7k$;8FLvz#kTyR%%36VyQ=74INkv`nLK*mUlk zLrekRr(}+Hf_;%Ls?&pjXH!oY_yfC*F3St(t{;;UiFPLfl^7?=EA0FiecXdb;kBv~ z#DRtFG-Z>qFR9jp)L;*XW(<}GCAZ=>GOAZ>uM(F|haExVD-tpYJwj0Gm z?;bd|zPUH{)a68tB@B={cFe9WC*im?Wj~EB2(if~Gp`Z@L>Urgk2MGS(gLpeu$QfI z)?<|3+GN3`j1evdDjlp-Ug$X&KdqjbjGISuY_YX;0 zycDH3X6TS>JL@7 z@>R$@?m-ryw7Q_9LcxnmUFSbC6dmB-a7x5$+gM9;_n=Xv>Oap|RzRTInneD{%(dK9 z8$#`Lqd76wY~F5$seKU)IWe+t{y&jAbpDT}j@y&6(B@q$jjNg2+ta$C<~_HetA(qD zzY8Ghe-%LPPT&Eq9>#Hk#p~JK-yoNEf&}1P#wmh(y?2HBIHT9Y_YlV#)%O9ytw)s9 zB1#xX$eE@wnJ3V85bNwCI9gTrZ%!{(Z|8-&nCPd_HV~WZh-K3TeE@qohKP<4dz?de zq`Ej`Hi7{P-a*WZ^>AvJtMCnwF5HeS-;Oc&%_EjMMktcD zV-nT^fvSWyL?g`_i(o|WkvmTI||xpp8bLUzM~wnP3&@cbA57{Iye{}w?0*@tQ>FDUP0I=>;dF9=3s zVSa4+G7~kKCK(9jBYP{8c@z(VcFPkf1@NnkHPKPjVLpw)AQ^vr^)S4n{*x+fauQ6( zrQ!7UA6uvuf8L3tx&DFs6)Vm#wYAr#ggk)PM%EjG3=y&qo6=Zr`O8iuq^=zoF|LV> zBhY~_hr>5Fp@*;7#On)TajAnNG5CtKePoRJ^F!62zU83pqr`!^FD~`AV+SU)Bgs4= zSwC=f@Dm>c34x9#@Yjc`tc@2cAr&tiM5+n(MMp-b^G4?=8jc3zo6vcoU@)?Q zB8WBd*TWUp^EXo7{H<#14MqK03=#~w8qfY?N-q%&So?t>8NyZ}l$yNY^xp)KR9w2& zbW;3$MsyBcKxDudp|eS1%Nl0NLDB?m1F5)~{CrpKFgS=v6`F-v@QTC>`4J)cPGYN3 z!A|9{lxJ3c^(6(gtd&r+$c{J7yZ}|DrT!V{nfA|3pFcRa!9kf9Ih@G;fFlFRx^W$6 zfl#S6<5=u!?U$h&ou%lY4O`g0EZkv)5?(sCJ!^ufeWX5Y7p~Z_BwI!Iu^%wT^j+lS zp%5>TbitoA$i!2>=RE2c*!M@qReR^Z8fKbNXiO*4_+Z>(C*fqmDQA~t%3U8w#ihpt3WeKBdw2~$55+lK z@J%u0o^-W4IhohqFcnz*guGolVk6y5GON3je7@?*EoHT0M?_OI8|B6=6z=TSJig@q z;9cEDlre7IijfTW=~f;~iP-upz|8|M&*eT_til>BSod2=Y20n(R~O!SSU-4i;5qc} z&3X;b(Dm$K;9lcVgoei3!&vD@p5Jn?fU2$2wBtR=FpneFWDpp>X+H_B2MLgo+x^>#f04wulT}hDOPp6Si9x! z-g{xSYerF9*Y!a5-g|3o1|~`jMU~S5L_smBy^CxFTp4ZM1o7h&8^zK8> z+DwT*iZ%q3?+rW;aZXcX%M+>h*USbH$0J3vh*Z}P+X}g`Va{)ek(_tEm(oh5U}AY7 z9;fbZrprc-v!xVzq-nP2oUN#oukhG|IKD+UHMhx}h|q*|LadEd1jl#GdoTRx*J~M2-)PG~-TKbTh&2YbOxT%J)>;(zu!$u0jR6@N{-|D=_ zuKtD%CFA~1*_KbJImUAXs!OFma6T1I?Cn;N&rhi4v{qA@?vXk!l27=3$=c*6n8(EAbJl?iiBw===J zTiYSmSF(*U=)>G{3ar4eReO@pU-!xOpE&+K!|D{gvN1VEu>rUE&eSxY=2foAi~ZHxr|qzrpav0={$y} z__;hF@ZQp`lSgP$9&HmlcJvl?rx7BB@j-2>Jyj6Bn5eE`hpG@+Vcv+~w zOO-2$>v@uO&P;0?v%(6K)zf5|lVMdMecL@^OMysVC{iyMIlQ!r*br z)%6DSKi%{}{H>Nt^RF~XKY??1f`E1smu3og@n+@(@q=y}`vh@8J3)ALbMhUrv4L1q ztGUnDcb9&e5OBNzG#RrIVbTiRPKnt^Fd0Y5S8nHNr_q3x*IGomU>9@rW&~ifxjTjS zxW#~Th-ChD{0OmU(x?y6C)E_8cqa$V1Uc*Y9g{}G$IXTSIEwYLH6W_LAttmcW!0-x z61RgAcA{gp0)dpDB;c{>spe25{u7a#yS0IC2azYTa!CV5NSURvV%M z7%h)o50&WVlkMYG92R02AO_&_X_>xOg(^UkachA9R{o1&@xT0Y08MKCn_@B&1l!_(1c?k=+ZUV4MMUl+q3>U1kAyrQTxt&y zAMAS__&!8@_hVDR0-RbtIFx1P$SC&{%(F1=Gv}`YSJS`A9;y`it2n}Uw2-klsl0r# zNMCd=;`87?2G}zx9*RVa4njh;>tfqTa+$E%NOu28lP)#!a11ayupgk5w8e~0Uk6P9 zi!_|#wq1Lei6r3&1rh6(0R>&| z=Ir@!2*++&mb%Aw8c7*DsDzlf3~o;#04yJT@dg2%V+RylHNZ^3_u3^tj=j3o7_5@= zFAzHP>TqsKBxIA9IWoxc5Oc1Y_4UG^260O3G*T2Jn}*pIN**LGxMpc#=)|loD&B*n z!VY{5`tB&Uj~}bp zfgu*|q}d;Um(JTsKhYmxz-dCNm3N;(EI zreLW57rPYxgm&U*eD#KE>MfD(ht~|`?`;M>Jvfpz9&QMK-x{*_J_BMn7V-@_x!Ir*p$K(h~v0{ODO_p zTR&<>v*=c*@SbYE!4R50F|J?c#bvjR_aFr>f>j^8{~r@Qk#O7LDJ&ceO^Z{ zF*3oDT9GqjYBJRz-J5mv*un99KS3P}wH=jNk5_dm)g`fQb~3Ss)x|WfB}|ALEA^q7 zsbJjdiVp+3I^vC!KJV_8<(h8W3V#q6z;A;Hfxu`%v*3TM<)Yqqb}*k`6FP&KN2lUm z!_d4zvX~GlZ|_j^B_hRtm71sU8Q1|z$egAo@)sF-l4 z@Y?G&-q8AfEA``q+3R(Y+zZrKgU%`Kwz6bBunY@y)B)%Nl#||&k=Vf>IpR0J4C36b z=VK4RcjH3z&5$XF=GJ%eWV)>nDqUq2b2sC9JEwLCPK_2;_)X9PCl>kIr`)qeZO%|% z9F@2=9w(F4Ux+VlaJz?BlbMk}mzLlrEIscMzdZ~KZCYi~xac#!J&GG@TL0TZt#yBd5=cRQS8w5x;WxuIJD(QuEx!_G2(J+sO7YF=w{CoakYf^ z`Mg`>_9zi?y{Yl}a`L@D^p7U8f4I5QjpNdf6VOcJ&`c1V0%F$nEC9;D$iXgRQ?**I z22l)9GH)+Ez{kJfn06YU{VO5;G$#934EiZTh7s~r!~(+vgk}oz3y}d_<`^Uf$awB{ z3;<<-kAIT!7?7u21F#r?V}Oh)rm>a~;|beQ0QhQF$f#8+i}tbtWL%G^szFo&Nll49 zegKXEPzK;QVLJdoUVw>z!ST;)Yqtf!$^bC~d>p$L6u%w>&@jNnzs{=wSpR}%&2km- zE?%GqL}5_izXaC*kstW?&Go7*}r1=Gn6Lx9Iit zMM9yo03lnzTEjVhQ8GK*>PKR8{7h6*MSSQ-QKz+sp|t9}UMR#CaWW7hbKccI@2HoE z!a=mkqH7<)igaFJM#qyGBuop|tYC&9-kjK%%mtenLF{5IDPSs$)p*(;^&}uv5GGqX zgX-`mU^<^+%~H&WU(+vb9Y*?eM^}+4NJE>`_=;z1~+?(!9651C(e` z?v}%uzwCT0Rp!kJtAaQd=;yP4&CUgD+N>qKO4yt+W(UWVyR|SQl5(UM#endurAz@}P13T*En98f55^rnh8)mfP;j3>+f5)g%%>k@D1dc1PwG2D0nJFT9y-upT+fb9yi;mgBtwHXqi?AwIO5 zds)InX@`O0IvKyvYX*t2yJGOr|P7cODmINj@1_c{Ly~ zWzWGbG_Ic*96e#?*7$1Hz47Aot3hVb*1Y-#mwTdTWU#=5bLP$QypQm$MZL~3*O{IR zvRUm)Fd2>Taumlq%cZ!dC9kKGjP+j6g!0pPEM(H|olV3Pws_1IpA8%@=FKKw?Yd7& z)o-N~HjD4uUzvI6x{HMJMwG}LV2 zW^~aGHRXJD)aLd=CO6gfyew2h>g)iEOIm+ta#8B`B5?Ya^}%PnX$Q}Jtfg*0AIZKe`O=E6vB)_h}%4n^Ht6n!0RRedrI- z;ba+M-Vx$7dQaM0uH=XP(gMEeS{k;kf%$Z0qcHJqHsr`?!nKrwFbNW^J6J+6Kl)Wt zSL++z=kO>qrgKR~k5y==_2ARe^6ev}RqW(nIPf7M&b;iIk{52n51c@Lgh#M>Uwj)U zls*ZVYBrRYZea`7c*uY;Yu!@@)(&|Xf0q_(T2Y98ge`#cDJ@5Qj*5^xBEol-k(f5W z^8%;hLlp7a&{ACcPI84`fk`Awd_=EU7omEk2_~!7>n|c}+HBPp7CeZaKF-?`_D0_| z-bVd?i5G{_mQ?FJkrDmYr%nlq80(C&N~*kFeqFT}4P-j_#!-C*^X)qiei*r=IGuY9)5ltLjkW6f``y$~9m^?8zRPh|Q%eNJ8=D z6Jcligb6DYm2KFQ@W;ym>?}6%%i(86F04dqYl6aJ+CrztnJgsA%F;%|8Pq@G83(N8 zA5skZ7U*Wue^{NX6H)i>5@6-ewyE{TR7bkh%~ui3;1q6sx*VyxSDh^PW&_%Ksb8QVUno6qV|unVQs1CgFlfJZcXnH& z@)V``gI*zKYJqP15lZ>F%dYwXre5zhO2uK7y*lfxVP`{RxxtCO+(P>^6M`oqxBP-ZZjcm`bGsrV9XaLvkH5=+1yJ6Tgs#W*7>5-Zxgx5CZ$(6cf-lI4O zs8yYMX8FdZ%e16uvSIISspHvI-GztnGZ1M64DAi`#j7*6v1j{;w*yg&*@Sh*5IUsNM+w!qX>cSR5ME|I*nZU+)^SZo^3$?v5cH>mrI(B(@q#D))uQ+-3yHhR;U`PEQ zVwC^-^4gaFS5Bmvz@{I^p&Q2s0Pynmbm98vL6v$Mi)MldAVigFxoSi)puuzZ(ewX? zibidECy2{c#5@3o45Q@V5nG6}Th0yqe)eraBQb~!m+qs}UvHp1H&IGUr4w5kZuQ}lV8unj zmzZkB2_|C&bo~yDsx9XI8n~_nGq6|Jy1VH9>&&_?EI&2qOEP7YeYUP zgbI7uHV(2>t7nJJ3HSsk(E*V2wKum({_UFDL29>K-osqTS#HtynkBxz?*jZDV*<0d zq)AL`BmcK+>S9g;tdb5NA6f;ji#NA*TEAS4Kr-hA)d8ccJhjM-Wm!4uJ>)r6roGIH zjbFL_w`$Iqiw>G~0Ecc8y0lUbc+5i{jsOv3N0cU^yEN@~(|zPT>ehomtw6vk5WJ(p zNEO=U9rnaSK#VV|_{_Fm&wXStt1(orEe95~=S z-7H*9;@S$no}|5+`;o4Cr{z-j*?O2#ef4~+2=CT@=~KG*t4$Ky-;Quyt6jJ1&9Q5@ zqXa{rp+66}zR=!|eChBVXaTC9?Up59f3{Z{*k8Z1-2PzXczyBti=D5LNeAM~AJ7#% zD91OSh7hC7XVi`^xXMXG<*f}E*Y+M>_?C#l?j}HB40obVpMl}Mu9$zO?!r*pbu6ma zbd(5xxnr2Hp5|M9L1(~|x5W_u*s7U$fzQ`JFm=V6tz*< z((ZT7xx+jG*Ap05VmqY1Yv1!>zL7>y;r5P0b2-2?ijmscvMmR-|4PAVk+OodnFrs| z%cdud_QB}QoZ3NOr)j23?{Pm!(C~+Pk~3e%^Oq!&xe#uy#k@|XaHHX<*e4?4?c|1D z2i7%GbVzv5QpYJ3g^-tKlm^okt#dyGE!Bt+S(h{lUiO>1^$#OU4jHxe^py-Jm7~@8 zuOMXCmF_`5ve#;v^9SEj&`%1F=`vy|37Lqp*wBdoXrIZG#n_``=Bz(#5pb34Yp;D% zssB`zqR3PIz8RZH=Yd*Fi85a$7n%r&9`mZ?byrmhchbD7{^_fd~-IwxUicZvG5 ztGf&Ey*}>%*K~5@ zjyf%+r}W#CMhb=R*^4WEohZzuOv?IhXWLmln8ZSvw@i3njps~b=D?!7Frz>-+0C$g zx_J;LRJ$L-jc!JG^l@=t@-Q`rC3T#L9p-}v1It{hCQv|2Topulb(ro z53r?Y-v?LSxlO!`?$8r!Hs-w+SETpQYi9``$r0qa|c&$ z2+!VKZ(@Yv*f`qAi{b`~DxyL@4{K+C=*HL!N$HM3B7ixTSg!@#fnS zo7(#>-QQ!dex9cGzwdMXN4xp|L%WSPe_QGQ#qpPJjPTMpfY2YqO1g;)U`z=h6pSwc zfhxX}1t(DD=z_Vg6WrYl+vt^_ITSGl1BXz+6pryDHTw`L@W5aj!sqW~2JFc&LCiEx z1{~plv!`S$C+#FGYAph=C*V+yehR>tJl$+H=yIbvJ=1zU^%BMSHUBa6NENy$b|pl- zl{t1L?9F-u-VhIyW zly@1!PZkq|&bfP84nnk?r}Cd*+#gdW%!c)8yE+cy5YsvK8mWJt>w7Dkd|q4avN>D? zJl|&At>-$q^{85CwqBBWk)|t!nMlJ9sTZumW*#*XOY>OdUwMNYr3=bSVa@QHYkZ${Rx?r{WEV|PPz+`` z5*5hP^&>W6CHv2$trb5Aj2U5)4x<@%Y(ztFV@4m z{TkDo(>i9hjq^b*u6G`HEoPNp1B5oE+bgK|{JlLStlsuV(w4_w@GcCoioL>vGS(dd z5?FM@9Y)AHIE32T{|!Px(iT@~D~6;}Za6)>_yH!_gL}xLXO#B2z4)v7pZf~Bs`k5Z z8v-FcMuRN(aInY`$Q%KKp3fiEZ}mFGV8OXiDMXSD+SUmybwW8Rd9+947MCO+L9}H9 zDn{cMa*!YI-cBqZzc+UOxcB$QzT9U! zg_#aD%MS!qs~2l8hUV_3JP3Ze(k2pG*;~O%^6gWz-Hyk8M^Rz)U}Gqc$o|-+fNmI4CgSLMqHZGdnclLFHoDAiEh*F z<~NlR|0iHrnK63nf(~}5Ir$PI+45FS%b*{f5i&2F3b>zJw)y_STjPf6{4SE129qwW>X8ql${zNL2J^y+#y&#hb+^rP;z- z7Tdko;^ytN^oMMkh*Py7gWlLtLMGwpb&Y3U!(m$U)(XkDRG^PblP8SUrPX7uQBvS0%DS_dO5W2N(}UN>6BO$Fq@lmj)t!2#8gzUY0I8XnV*-Gh&;OQB+H>a z&+@LUynyYYZ=O-^`zW8%@3rEPMWtGKvq@bs+eE1F zfv30FOI|}noq69B-^ewS2_eXs`B|r6~)li$L1^qadm1*527jsmM?$MbKrmc zFuZQ)-jx?$ADO-zj}1*&;wUQbw0$KI7p}Z~<-^x5vlwS5hhlFcdk8k0BPs>wR|plM z!G1oAO1VO`CjVfL^YR>$6b8kh$cA90?3Cj-0CuI4!Isp6W~&rn7W%bAD6^+A{vr?s zhfq7Ik6@O;Ii@vPcMaDG9b48T6I_{Bu^Pps%ia%BAKDaGwRolH-i%V}PGv|*#Jh(tJ*<(3Z zQ>9`LPa+t?O_*=e6K!Et-4FP`=8*AEdcNH!#r@+9U*%Up=|7;)-_a8==zm6^e?w2e zoq#@nMo$2p05<`50^9`X3Ahu$C?HP2oq#?8bn4dY0O$mW3Apo4-46!6Q>O#y6AXQ&;rtMeMiD)S`{%`Ji91%tv>qpF zv)#$7Lf2|iwl~Exk{zy{XMFjz?HXTHSN~k`B-AvOD*0Y!Fh^)F}mwO=+ii+&k_Zk6^3Z*GuA`B8x` zr<{b3qDT4KnWxW2#9P_H0)~7FOR-FWx}OwO9N{)DAa>_yXTI9O#M8~Oh+YHzG1#)i zt@}rB2Y}*Y)?@^{KRz8##4m>;x=DcZNEJFyy-b>8lvKQ1@b}UK>JIB56>tdw)rWhG zo?;Xx+Qbqy?`u|~6SL?K$_*$zx`pb<9{xsj=|BGd|LcDWD$c(p?EgZ)ONAn(Qhv@8#v+QqAgte$!KPT!ZStm&*G(l7o|{8q(z&de;#~S!oU;(XY+GgO zE7((MT1`06|IBu6uo4ZoWmdU z6+fXxwccw~2J|hE#!Webc)AV4ff4 zt~En(Gq2dl>{{gR)*fMd@ka0 ziGdcZ&C?U)ZmOC|-(^_{?yq;-FE}TiN?t*{*6(|PaTs^Db&omFX25+glKqQ)_7+B0 zvuRUADrxkX>}%4&pcS%I47nw_@9P?F_qEvRxY;q-4O*W+znwvbWg}N4HuSnF>JF=l zqT&M%$(RG@ROaQJS&!TSns@dcNPSAQWm=**ev2liBud5JbU9$+O=&cn!~HFC1_Hf2eBrW? ztINtY`X4{KgKU-BEh)Kfxgidn(nOziD_>HB;Sk~UnB^_|XNHDzZ8}wMy>_;D^bLwt zzf{B%?U?xz%q$-Wlx99FbTGBkm|$_eQ$wNnAn$ByB&4ijQrpJurNHd=&Eu+%-*>bM z2zsY1MJhLzc~t5+KOJFY)O~&Sz%_j8?)TD|51)>9)gVTi*k|62^p70TY7Z;RFhnnY zAQE;I!4}EJxKVfqsZ_X#g(`=*IHK1-jxD-R+tLh6IZVR1Don>oKY0~FQ9))xcRCFdD`Wu7emgz_0K0@>0+mzfB|mZM{ko)VgvT%X=M~{;{@7s&^uoofnDw) z0n7_Xb_6{t*2)feR;g40bkOh6gF2J{M8HGk}fk=>6&%gun;SY;SeDeO5iu)5Z)t7@@hL98R~17AV{98Hkf2LW%O4(hiG*hmy27-m_-{gu;4BOP(0BHuSa_~x;34IC%)YPCDBihg=6N&XE2_X+< zcbm(_fzGjmoSr^gyMn6OT)V>BoejI9h8>!`6n}h~2872$>`M&L1UMUc;X{LvyjS_f zP~8%Wg?wV#Y5i5vJNTqBxFg0j+V*@^2>CLz#}e|HpIj!k(-uh|=2wiXhV4Kwh2E@} z#lZ+y8Za&@?=`|$gZ7&6MS1|kc0XM$CXqz2prJS&l@yTEY9tD>$Vg-Tq1pX53j+u3 z0QU#=*a7W!EONfWJRB^OGErxGrBeJ`E_l4SnbH@a41Tkce!cRn1t6tSWcv{8Y`Bkx zdKje|pnK1wFIm>x_g>{Seo>$_Znh}%c;a0`urRl65x3HmLo7S$Y9-d3wQDltb_e<^S-sy@zosaB0XNsZin|Mkt=(D$d&WxVgtLYw=mzWINA zQ1$)gB1zTxv(H79Xje?c3>K9LMs+XBP8Kmqt|tr&==Hq&5;4Z?M~!dX<`vUua!*K} znpm~%WdzjJ;s!1?>9scR5NT6$tqv+mo;IHVPg64sKPnpfwpXtjO^H(-q0-)V^m+tJ zBv+&P%^DYdc^6Yj0@=7-5rdqv-%QD-_FJ6U!~MKs86|Q%qS*xY4OO|!Nb6$d_%t^^H1zvadSc-p+8<5O|`c2SYDDLAJ zrdAbad<~tjzb9FS*K66(*?lu;HGcVUMruG`{y{a<)qK;{+cA-jA_JMc>2FqI$}_;273`Wuv|QDv|h7RIT0xtFJ0Cd!e& zr8pE3f0)julB1~GH55~Qn86pEqim)4F@EweQ?xfn)wSzm(&=Fq60Bi-6^GMkjT&kw>Qr`(6uKYfnGogawJVO6#vkQdtK=Dsb&bBO zJ}Phw&NEt79IJM?`e)AGU)-aq!02g|h;p3pEBebidYN+c0`({%WZfcG1` z;^5`x?cxAWIC#jx0P4~>DfKuGVwjL=kPLVz(2c^t<9%s_Y7e~%W>a8z{TY2qF@-JA z`QyP}La!a5w|3AQ@#~Q^eI)bf5uJJ+l~M)p*z45)I2Hr1J8jZB* zU0#7MBOQZ*hZ#KEd~Gb?6%SkT73yS?>=6)aLVQ?&SxVIzoR{JLcUaV{^xY&|=_xra4F}i~W%vWR^DYAqT@+XbNEG`+IFafr(8!&QOrv@mD z3Mq|Ey2bVv^VzTFVN#lo(gYMj14z6pvG7HkH|)TGi(ClN5Q|~t*oZ|I2Hd0V->t8_ zar|MU;0W{2jN&c_muVDQVMyK7C+}CWZR7n}5`WWN_``l&reX1U#z`pdWkbNAC)&Z7 z27$zUX6cBE(-i+%bCFjJETtfrZgbFra`AYihaq%8KMRU7kcLsi6`|NcEO}d{{yXw{ z1zt-uNQ_I4N7ICCLDX9zE%Z;h%I01XIAl{F;uerT4N)klpz8=LfM5 zBJV!L%R|8vtLE_t5B^hkBxbxc<5T`4T1_P;*o zLJklTOIZ%yXSshglE<@M{!!hkm3{E0Ik)hrfygtPF+FVj$0O#I!7dYLx!rj>ch%_L zO}V`xtb`c#Cq_>`E=xR~gYV89XKE54D|)>}W{c;o&JrIl1QxBIEEmi0h%6{}(26d` z`WEJ{s3|?Cm<#yCeYz165%NX*Q5KKrW?qd$wRW~{AH)qYaLVVH}>;^DMkJKr?{=WwI+i!X88kjA9wNRRwQ=3TZHHAs{)K5l>6KnYb?>E8f%@imai%!z(h;Aqk7r_O=LM2>qIC!E-OJ$39vx z8l%_R@_y{|r6sNce`WiSgV5@wm8=OEGHm5mmgh{OIddW z&Cf|P*hN|~8CJmQv`H|ZOZq-7tdPAV4`)Asw9YuJh;^S63u;H&$P!k3h2I`>L5Z|= zHnfDv$^Hz%8Bwi(vQ?F}k|sH6R(V9MFa6Lu@5^$zixj>|ak}DbUu4N z=+=Bm1DqXR^kekY)Pe9xqm4u{gfw9WABU>y;!2mj z1&iq^Mr@-;cah)K9#j10(I$45V!vmLC~U%}HpK>hQ5Q)+8iEBFadxBYTLG`@M{_vW z)IIT|9KBeQk)4ZksHiM1Tn<+`EG7gBxAv{KErl8Od~9fJYrZ#*o(bmRL_`=hb<8 z>84UOWhz5?2JZ}hulgkX&B`H%K%yTp;eufHY;dkv*@jlx=}2M7qdY4jJA>}((JJDK zv`eXW8n3+u>NDkRynaeqe)`i4O69-uKur6>pDKvI@F2w~9`y(T%>*&XAfOl_1p?fe zZxa_M@TkVgK<+YtL69TB)ybw+r@oF}W9g&^kVr8GqZuJZ3|+WcDFe_CEFP&QaL6XG z0Sr=)!Vb>24Qg&LoKH`l53_VKu(w}k>?Z}>2iR~Ky$+Z$Xe)%Ti&e0V15hDrH``SZ zP_+@s-O9+($p}a=W+PCbjcF7;#L-D>)?^U75)r-TYh0%X2$5tGV-VeAS$)@}T;HO@ zJbxscuY;X&{L<}0wI=j?<5KN|bQ&u8|gt!cWR5@x31QKHVrE@j;IShX-#fwt$k1ztS_|8l$ z(&^5XB#iP2?F2GJv1gpeY@Ai%A1QUe@t|#PT-dBW5{ipuvV!x~pREH@1p{udMYB(` za(`1nG{$$@K$2l_&cw^s5XwU5ozq;%8=Bu!>i$qc%#Sfl76qD4AUY7GyQx=VXK8)H-Q5kUF3CY zi-Dc+1X*w@{H+)(ipFlglP$St1v}MYx&(sb)*g*bz!vTR3Cjc;T=L5VxpBCNIsOj) z3LR)6SLHX>er1tFjsY2xy%N7-Iw|DPqulkwQKL}&ipbl|6LBMYR&_38)*|04hHse5 zAxGpxb01B*?0&n7ZEAPVWtt}W&haP8qD0q0$GhAc(^ zJuJ_eqvl6tvMb3StNU6zrxJ<8$|7=uU#&K$Vh7{OFnf`_;;=9ymT37F{gLCbSXcD`&olKO@h@pt>ALJ3L9dj>{!6s}a(* zxLEv+ibC?5dKl}=w^PMytT$k)!9?C>RCMn}<#{wCtkNy$xcz06H#E?Z(di3Vp*ZsD zuSy@?;bOiJXx-K2#P4rnZ^0SZ+PPTp(7#M8nvqVo%jio?&((%rZ>omiq&PwnxqOC1l0 zLk|OzXxW6Ax}yA5OVen#*#tOk2i$vgWo2afi!xz!w}m20b= zF1ek{{@Ok2Z6T8BatAlQ+!++c+XaEH-4gYR;$olh4ZR@oO&0&Tu}-U zw-)b{fnhUYYs}cpf)Ex+NCkz~MNvu^ABr=@-AS;#g1e6yr5&?QiD`dOpf#ssSg=f( z$NTo9Lu8&#HlJ=)|CJo4E5b8)Y{#*Uk9eF?pBimEUanr?-Vw+MG}_fUX3wqESch#OfJ{`goImWARIZ9#bsmjTXd?>8s0}O0#izdZx%HL(mQwebx(@{tBDPh>6kRmI!I{IyQAR?@ zBX=DR&td20XiS-|DWR zbLaCfy!iz?#^o#1+nKF3i$vQl9}O?=)gN<36+AFps`>9qsr$PI_l4x214o5lWw!qZ zfC=alFy?;jyYS^}s9bP2c;0Or{FM}U@q zD*;^s0tFz+(M1c;5^$win<)TH0FnSO0hZo-Zwwd{04AVIfS&*-0a^mC1egf`6F?=P zOTe1|F#j>x{SWym08E8{%WVHyne88ObymKj*8=IeogwQ+xT?+essF8Ub($1NQY!CC zQ{TB~YYe_jUMGou3=wWKI9$&W@_`CHe6pmMi$_Ob!aF9iq{J?JeIcgQ#nPm*EKU%{ zTb6p=&tS0FTc`+bC=vphlA=zE_EvwN7^UeYvK*!Uihbp;GTYwK^` zpGRIlEezK)Vt@5*{prYynCj1#^Dn}CvM~aRaRRE}T29b!QjHMJe4C`408!@apxG=1 zDuS*b{U%8JxY9)r^aG$4P*0GNjgnGK{AfHu2TC&nJ4Bz|tdeEvVgO|VG@hU$%%4vK zB`o^*%LaO>2%SImeVDzAiFgu|WE>Zi2JqSc_K}wZNvuFSGh!4!ZZi^;2B2mIVgP|Q z4&a9e%E9RQM~)tPVDb#M6Xw;%#ufVDg9jDCqV3MzMm>{uQ&0jxA&A`c0~H}+!?$oa zJ8~rm)Ci3tHSQLUT6A?Sx|F+_>3_)g|G)n;Kt=es@cy4(K@jm%4JA-wpJ2C>1SfisKv-zR%L~Q_Gn=D|y2YYdnwu zpTDD77tR;Z;>X|YgTQ`C-U3-|`u2oY)UpRIlkOirY!b<5(}aTJkqUHx-tjxdF9DXg zr41OK-xb&}Ul8I7H0df4njr~r= zx){)OG_WXaRgAZZWh2^e@^NF3A)X*HlCE`cLasz1rSURl6xM$T?|Ey%VuUqPaRsjs zszQsB(Op@I-Kj3Gme>VnpOQHU>{W@zdKm4Vv@TY*$r3u7g)bpH0v~wPwbSCjGoWNa zwhfTQhes0_l#og5j?3*_f=#biVg+=uinj#b^7U_h?hhXg5_oS|F#RxuHxLg<2sk+o zdkvR8%1b3VXAVcMUsoyDxw&hUGot7Fy=0VpGstDcENh#8LQcd~c;s##w@B~kWNn3x z=F$psYgQ~7~OS7_O+DgQ=I$4@%NCXAhSE2aNhRTMlx-I7@=08dTy9k#pTsmGR8I>&GjDr*l29R4JL)ZC zK4ShPr4XUEyY0;Uy>|Ax9I5&mkq|Ss+^n>8#K0W)ArsNajI0!?#)L{a6UDt5IkAYr zq5CdObVsxdSyml4UulHnSfnew7S-I2cFFLSWyidW|M8Z7t^;Y9xz3F+D8FZ(3G%8< z6bbezT#IRJ*GrY=b90) z{a0A?i3p!oVHLK9`_rillO`({Pi!zAbjd&SY=Ks66TJjT3-A^oE#5W`a22_V-kAM19JdjP z{&EELn&3u>x9v*Yazxa+@6}cghGEjhFH^rG7a%jxp9%Ny&3_vKQqB3b_2Kus0-lN|IRx9L;mF7$n~#G`7`iipF&bl zE7B0$XFK8s13oS!l1vy#6FKYR44l^UF9u;N7>U>gd+w%(s}plTA|h4W;7jsWcWc&t z-i3^W{+f_93hC{)!6uoK^7G}<*Ih>S>|0I?HzG;5rR=R2jO;!W$v@t5OO*)=K!0b4 zgkWG0r@bWRt%YC`sx%a1IBMHG#=0OHJBI;hi5)=V^0$OBi1JkJnUXP7!DUH>alK^m zcOE@@iJ%qYM_~&HGrS~R=#lq>VLGDB$w(c;WQdJ&M!m5~g;G7y5EU#q3P$6%n2tqy z0}hR%WfsE?lzVO|je&6k;TNf+iNp|9#W%YWMM{N~C%)ox1i__Z9`J@h9pUC;HpDVe zYzF~$d3;94BP5y2v(g$@#1Az~? zk9WEQ>d(7|9yH`Yl=nC>FWU!%<99!_ZZ1iOm2hDx6DpyhB!*jxO*AjOoZ2tF?CEM} zENXJ0D^x0q3mH;(duip(R_T5TRvjLt~+pdv-iR ztL9J71=mah`vljG-y{icJo;RRyZNG~5O?ck_chn)cgKlm4CR;WYZ&Ty&ud1irV6Wj z8?Rrh9XW+hY2QB<4ZVMD=mB<})QH_9kE;__kDf`*m{&-lug>2+l9F1!RTY}ojTv{Y zwHS$hKD+gR0xfhzlKevFSgGv8NfDkj?i>SBhI{~1u3G0T9+f}>j(Bl}TA&Rjp1@wi z3kMbAA<5UcO0*zKm_II&&XiCzob@0_A=vg5C+L)X&ihN_8%uFa2vu(LD}B$@D#uu2 zdSf5c!#xJb3uoL_x0^oll4+#;?^>7z_Wf0Z%*e8EyaOie+ z=~N#?7YAipL!qkWZ{ciU4{&YQEnHI=)c8h(*4*1rF|`qTNr&zYk2 zwLj#Ge_vN8t9_{des=PC^Hcwa55HuJvi!2HCfE7p{NNXV`+xdqpX(nS?f*JWtjGTI zen{-^>i{1#8ohe^?y9Egx~4Ju@bLWXXkEj6)ZiX^YUyP6pvLmSxS_>lW13+vrc6?PB5?0xBa^nBdFdf41@P5qay z+`aAoVXoLsndeRaTDg0#L(QkXDi777soj&>=l#29Xq4yw6JvOEGV&!ponm?R;9L1f zjyqlDIUlps-zp|5R^*Q4-N9e-L#Crf3*Zkuj<66osM4EN54YDIZNeeuzAf7>lm%gB z54Ig>^NtI$-#sL_F=vos|0xJUAKOZB-1xFAbW<@&`F-hf_m2<9{=MT2P7=Y>5XbR_ zIa(52a>QI!g&oE(AC8oSENry++0)=>joWRFe6~?x{7p@-h$y+j5c>(9N1NkifBSGA zgwoHP`VoyP1)Bk=h1}_x~=iW*Vhh2kr1`t+%94!n4+Z=AuMtFkFiiNIt$!% zEE;?#?y*kEjHiWe|gaZS+NNlh!AE0sU&E^=Pcs23(s=!mnt zv9O$)2SN|7y+6`;$!OP_ydS!o*O$U1?=_L@+V8hg;?Qu0(TGcOx7cAw^0zU+wtv_} zb9`3RP6LG;)T2W@Kp1awLTL{d)0fhg^HDH#BmXq*3=uP5D#bWGAOu4<60XCp6-5`9 zAx07~bVFXBF&#AAF}gZxVx_XyW_XKkaQMOtx-XN0b~7at@Km~oJvwFgU0WTm3+ zHczMaxZ;F3&KemGR}OixKIfZ%D&bN!8E}h-Z}EgNQFtc8ikNSi#PHhjr$=^$qN|sm z?ubmJS*ePfg_PKEl|ohH^b%rpuU+JHTg_9*+(b54R{|V5CP$Yi6SL{5GTYS)nR_p>y=frV#~Lrj5PB1&nn3KVWrODVeA%{4 zr_4laY~HK;i2&WNrCaqO!yvdbG0gHhxe@VQo#9r#SzB61(-#emK*PgiXx6PdUN3%Y zBW5PbGPkzIjBx)kJEpE#>l=by=s^=*W!y`<*?i*f>_a^g5-uBBwj=R1g9P&59wDqc zt}&MSWh|zUU7{|Qq`%=Sl)!uieXmoA@?oUC`w}Syd*`Vqsr<{~2}U2+uKO7el~7ps zScyoxRr(?jvG!@~_r7)&77Te65Z;5ei?-f92z#9twE%O??z}zw5b-|9oKGXJho`SU zw)e&gAKBM-HQO?8+m=5S-xzr8OG~2=KFGvoViHVQ*EFb0_ZrL)&;psdNc*LYrz^GFe zKgwD-LVsUw!El{HJ4|zg!HHtQXjNnE^=t*hlkIuqMU9w-Nyp*?zAb_aXCY1WLK#MP z*4f0;#>oXn=|aAVnv-e?rv!HP8kZj_+3Sz6vW<2X=-xv z%e$)H0teUbsi}G$BtaFbTu2i|I5!8QokJ1b2=fBjHt)&#Jn?9dGaClS)#JT|k1M-p zcHEC^#wesQMUi(7gi#p$ZsHWX@M3ur4*z1ZFaUZV{#q1w)(=f~YZqqKri=2Ud+ z+G1=AiiO`%q1c+dXAWDUsuBLY*qcdt9?!6ZNhy{!LC8(^qW=f$n%o0XUa>6ixX{T3I|5z-m&vT zX{~x5J$Hf@U$-)!bftC(BjXwucYsa+qX0Jn zVglS$W#&V^-J{r?c4?lK}g;f)ZKwn2p#d7$N zpM+j2>3knrtT6a^cV*G14=79mdgZF(`42Lur1PAw&1dj=Un#E*m^NWC#K`IQaaqVI zz`3va#UN6V(4lmdJmcQK>lm)$5NB(EtTyJ|c5)6HAu3W7uGjB}Q-5?GRy-yh`?Mn$ zpZ0_yZoPzJVhF)`C6W7Tm;tEk#OL4I2`|;Ye4u9R@kMpcr>CF)x|BT59$r@Ri>77Y zq!*hE2yaJ{=`jsd^Ri>2>xFo$zaKuMfnS)V{0%Px;ys8w3@OUs)OxhK5Xjf|yHb`Z zn2DG#6~*AhI*WNR9YyDaF>U<=pyHUHvLwmR%d?QD$~av($Xfa#ludt5E{>-ebt_0D zCFaNBb6`^eRfMNltZslO%s`LyP1b-yg2Lna^~*|6B8FBKUIdV?B|II~&sKct6|p8C z=svU-@4K-+^fp2LG(02TWHLN6*0DM~D+U!Go*fnD9-b4CVi2AiRxBQ#7t%lzo*y)D z8deZ6HyKvww^toj^a}DOtk@g=G_1r6VHj45;*$s~dyc#mR_>vG7FywMG8OvH&9Nr5 z@-ga7Xq8LY)6n-1Qw-6e)sDpyp*0Q-mqKgp2hKw3Z0Dvz>aF)`LOxhR5<(g*;2t53 zW(cE@CKEo%kY-~fZAgoe`nTX#1C#0CHa*AM;C3BULU4yxm`8A@W{Od8mwK^eaJOm$ zZE%nBz_*}Y#kuLAKKZ@cp#GbX#GnB&RhpdSTbS|XDN1Cy_=D|8sgyxA5tWEx9nD1i z(H4{5BR*rp-t6&^2qK#igSQ72e5P6Vv!^oi>6E9q2Ya(7q8Fa!%*Gwm<$OxSIM10& zCB2qApTYP%cOgfhK6kO;f30T-+G576eNePn=Pih%usH8KKfuwYn2xH0S=AwDB`K5T3Y+)^llr2&+ zS;&&TfQKw^SE!Jc9TmVRAUuV2HZR#@xHi zH@Nq`WAyddA-p){loQ`M#)5gfx4518T%l!Y8x8~zw?fnTuBB|X-vuHy0_VF`Xw^p( zh_py20bRpxWaJR(vF8Nt9ooj@)x_;@725f~?a(%=(1Lxw5;ky0*h%S0Wr zNG#Peq+Hyoh;0*IG?YuaE3W+~?Ud^;e@b%gDPMk61fhe_LFnN6ALr!eDpjxQ>ahlOqeiRK8}O#rZ<v-SU z)!ozk;iIvye_+rwG(0joHa;;qHEkv=GqZE^3yVw3E30c((vIfn!A1(|k{w+9I9j9- zOL6uM&SRr|bsF72u1AXsG!-X83{EuBfoapOOkwf87e%uEj-ex{{ z_$VtIgzj?q5?+Z8XzuxjeBTG~D#d0T*1)>J5Y{e&6CF-;n^=57=pb|ux<3E6-xF`u(2%`WMK)txhaAvSBU|qnvfOWAE&K_D9XkDOnfz}1U iUqAq08C`!O2!uPZF5y2B?*Hy>Erd}Bqc$8yPksW!44OXx literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164883.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164883.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba4751108ff3dbaf329d80859bd0a7d371edfb86 GIT binary patch literal 121034 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 Gp$Pz^FePjN literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164887.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164887.png new file mode 100644 index 0000000000000000000000000000000000000000..ff0aa71de78cb461a6602398ee915c677efdf3d4 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<gTe~ HDWM4fpou2( literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164889.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164889.png new file mode 100644 index 0000000000000000000000000000000000000000..04bcf099edface801be6074a33ff33a980c9b606 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<InXEuPgg&e IbxsLQ0L(QZ9RL6T literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164893.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164893.png new file mode 100644 index 0000000000000000000000000000000000000000..00767e63c899eec52c2c732e834bca8d26d348ce GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<t4t&`$&4?cK#Epma)R^`n3Yv7Avsuu!=5WGI`I2Oy1|#yBO-pyJxGs7tkmMPgg&e IbxsLQ0L?QXlmGw# literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164897.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164897.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac129028e67b43fcae8e3d5c1a539cc45ba6d21 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<E~|)z4*} HQ$iB}#(*bC literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164899.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164899.png new file mode 100644 index 0000000000000000000000000000000000000000..800bf296338fd01962f16a8863c37bfe515ce3be GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<?6DHo8yhXCV>qiArrVR?2$$$YxH+8UU8o|>tF5?pg|0tu6{1- HoD!MaVCz}T zx5S{#&3VEhh7<|jgBJysn6PMEwV%c2?mXd=z=Dwf8B#L5j$Y0UL4Ox#7Tjo8V6dEK V8QHt&feX+u22WQ%mvv4FO#sGmC5He2 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164907.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164907.png new file mode 100644 index 0000000000000000000000000000000000000000..6a64534a0a867d44cf81c8a34c9981b5fbaf5faf GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<?7%k+xbtZTE+^u>(>fwTdcss!z#Lj$>cp7GI^g{@1ujMXzopr00Q+P!2kdN literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164911.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164911.png new file mode 100644 index 0000000000000000000000000000000000000000..1072a50f468dda3c90c889c31424b7c290eb1a13 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<$ z&A-68M)}h>#+^$h`^fJ5=6Iv8NnnFW$ONtnd!&)c8vPxHJUVmRrRVnp4Px+g^>bP0 Hl+XkKXk{fE literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164913.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164913.png new file mode 100644 index 0000000000000000000000000000000000000000..d62fc7767f7b2e0e8d0d7fed57e30bdf6a6a332f GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<FVdQ&MBb@0J`-hw*UYD literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164923.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164923.png new file mode 100644 index 0000000000000000000000000000000000000000..f89e20a55ba1e81f2cbda2bd0241edefadbe7149 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<bTfXJ31_z_FBkM|rv%8VWgWsFDznyo=31||7r>mdK II;Vst0Q7|@B>(^b literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324731.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324731.png new file mode 100644 index 0000000000000000000000000000000000000000..283cf90b3828b36af6fb3a746e806f6715053310 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<FVdQ&MBb@0NOhwTL1t6 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324735.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324735.png new file mode 100644 index 0000000000000000000000000000000000000000..58293d5e874f2aa36ecaf7282ca9e4736318092f GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<WH8`4?2!6@ z;cUe(oUT8m58Y(8;k*B3L5{j3r$-ZK6yxmtW@Pd{x8AjhB8(27w%7yBVeoYIb6Mw< G&;$TYL?ibA literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324737.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324737.png new file mode 100644 index 0000000000000000000000000000000000000000..e863d7a1c3b9c1ca08bd182dce43c55a4866d59b GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<9#E$%cFJGozxcRa=PIuoAg&cQBjtDL-57vx(yvSsozQwY+h8q_=yYmQW7K5j& KpUXO@geCwo*C)~d literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324739.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324739.png new file mode 100644 index 0000000000000000000000000000000000000000..486baf6be50982404fd1c68a5bc51db45c62046a GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<yh}Tr%j=i@q~d?(_%%BOpbt6^(MT1Z3;^j9ajFkXksDNG^LGU=`Z)o4>s^SGQ9ui V<9H{ASq^9zgQu&X%Q~loCICjjC&K^$ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324741.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324741.png new file mode 100644 index 0000000000000000000000000000000000000000..93299fc38d761e5251673210c364f6825e319153 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<HTpZYRX8%fRsFvcXb^*^tDnm{ Hr-UW|$KofL literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324745.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324745.png new file mode 100644 index 0000000000000000000000000000000000000000..b780eb08852e8916ec6ff1a401ea6946c8d727cf GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<nNU(}7VKRBohD_e)))R5m+}X)-ZvoI822WQ%mvv4F FO#sFCAtwL; literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324747.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324747.png new file mode 100644 index 0000000000000000000000000000000000000000..b162dbf0a6c890a03ea1aa0b28bdb454651b697c GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<zopr0O*?`YXATM literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324759.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324759.png new file mode 100644 index 0000000000000000000000000000000000000000..5e23c304c4911dc0ef487dfeb8d7820aea5fb44b GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<?7%k+xbtZM&1=}*RK`Wwpf9MhgEb5lgWEFWb!_@Ud>7sR_C<+Z-7QIc)I$z JtaD0e0stp2B3l3e literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324761.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324761.png new file mode 100644 index 0000000000000000000000000000000000000000..91a276a7dffb4d98c507e9af6afa1912cca1fed2 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<a4Px+g^>bP0 Hl+XkKsU0P2 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/animate-transform3.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324765.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/animate-transform3.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324765.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324767.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324767.png new file mode 100644 index 0000000000000000000000000000000000000000..6348bb2b6ee281976f7d58159e4c33db29f542ad GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<FVdQ I&MBb@0Np?*mH+?% literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324769.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324769.png new file mode 100644 index 0000000000000000000000000000000000000000..1821f9c40ad9d24dc10dc662ecbe7936c9e10633 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<zopr0O*7wE&u=k literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324771.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324771.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee9f7e893611dce988b8aa7ccfe3fab4b9d912f GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<=xkD4+lU literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324775.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324775.png new file mode 100644 index 0000000000000000000000000000000000000000..adca00e684afb79ff4f21313d0586025576a8be1 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<V2O9&>b!ssph*m#u6{1- HoD!Mzgc6(aJz`7(8A5T-G@y GGywo`jwMk5 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324793.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324793.png new file mode 100644 index 0000000000000000000000000000000000000000..56db1024a714f821528656c64e12520311bae8f5 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<EwOcv~Yz|JCIJTbskvlM6+gQu&X J%Q~loCIIPECCdN+ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324795.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324795.png new file mode 100644 index 0000000000000000000000000000000000000000..d87462d1cdc9410e91ee050a53d58e71d1c5f312 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<~3W8;P)o(FVdQ I&MBb@0LOkN$p8QV literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324799.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324799.png new file mode 100644 index 0000000000000000000000000000000000000000..6f929d8ab35b708978d8053047cb56bec4fa83bc GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<1{3hNP6OS{u8Q^w!-cDwF27~E3ojeiY{R?dC!JS-sjdk{>P7ZY1hgJK$93eUHx3v IIVCg!0Mfi6{r~^~ literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324805.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324805.png new file mode 100644 index 0000000000000000000000000000000000000000..f89943fc98661a6d2b78b5659c41483308a0c54b GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<_6lpXXwBtxATYpD%i(h#GWlWe119+&{zqB2i1h-^VeoYIb6Mw< G&;$Tv?qj1X%eTDM;9zuiWL?Q{b~iG4@Ou+?JCBNP#S~U{ph*m#u6{1- HoD!M(>fwTdcss!z#Lj$>cp7GI^g{PnOS_bI0;iUw}q2c)I$z JtaD0e0s!%GA)f#M literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324833.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324833.png new file mode 100644 index 0000000000000000000000000000000000000000..0d22570503febc7a7dcba0d1e870f49f32fe489a GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<lE#LB1gM-o8k#!}*+1<$G!S7AnW?|~3+v>cI0Zn4?boFyt I=akR{0Lu*~%K!iX literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324835.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324835.png new file mode 100644 index 0000000000000000000000000000000000000000..26f2f228b47b8acb8adcddc3abf9156d6c29364e GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^vZth$jueznU;IpzS(VeoYIb6Mw< G&;$T_vnG}R literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324839.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324839.png new file mode 100644 index 0000000000000000000000000000000000000000..639f16f8aaf261176b3bc760c2eb616ad2f4aa28 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<mdKI;Vst0QxN@L;wH) literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/sssssss.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324845.png similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/sssssss.png rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324845.png diff --git "a/zh-cn/application-dev/reference/arkui-js/figures/\346\215\225\350\216\267.png" b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001177265268.png similarity index 100% rename from "zh-cn/application-dev/reference/arkui-js/figures/\346\215\225\350\216\267.png" rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001177265268.png diff --git a/zh-cn/application-dev/reference/arkui-js/figures/11-1.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001177428498.gif similarity index 100% rename from zh-cn/application-dev/reference/arkui-js/figures/11-1.gif rename to zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001177428498.gif diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001179981036.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001179981036.gif new file mode 100644 index 0000000000000000000000000000000000000000..53e718c2879554c82d4a3d9800507a00e37613dc GIT binary patch literal 39714 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
      0Y^`sMWF@%rN( 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 XW}?vd8Z1JxBzCvV0pj%(VC(+@uzi7c literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001180134670.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001180134670.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd5fea51c64deb1268793f3a3f70a2c379aebfda GIT binary patch literal 6499 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 Rg0sF1SB$S46&Tn>{2yZ8SJMCh literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001188711340.png b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001188711340.png new file mode 100644 index 0000000000000000000000000000000000000000..994f8510b56d1f66d8a40dbd0349ca61baf242cb GIT binary patch literal 25553 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
        9tucg;3}7e-VnSf3S~=3jf0PsJQEwyp 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

        fp$s>EgIMO1Wz8@_ZB z3CrGj0UP{kBo%S_S{If=a=1O6{sz~bu3=uRkd5cs5Um_K>ICeZ?kos0TFJ9usZ*z$ za)p)YT#i^xadf7lT~2Kyg1_pj@jKS?)N?MRYJfjK!|Bb=jYC zH3=)Gnou+_bPW2KDHY<0Cyr8Cn9u8bMe{7aap&-Z3e|g@I?{y|SC}jLwu!~HXww+= z`r_#B=bQ@Ja55`M?@rmLk@Jh1x@sn~lofUCT=J57)AEx^dDyQn@!hZieL?LV2vqU8 zhRC)S{U1`^6x}C+-w4gmQ5P%ldI+qwvq>`f%X*GB7A4P3_JLuNZYxn45-xZ(pP5sgsB(KUi4YRp`hC9u}FSirb10-~T{5 zBVa`aUDgKDV36XYe8vL~kZ}Bd<5d3jrXO>KG0k06ASL6}udnf%HwUM8!A=Q^QZ+MX ztfsCZb^Wgh+fyuoXE~~)#kBn0Z$&%b%8FRoOz)%C-!|z1VCRgt*D^$cM*^yDJqJvM zA}eJ|nc01$&%!{Z$-JvWdX8Er=iPBReCFGNf3R|=R{!64O`T5}c{`e_gW`Bo?rZTw zNA6h8?aF?X*5}gs#GBq^GWp~Bd(+jC_zdLFmjo?9E+wD$0NEtHh7q->)WC?AH)pxF z2W%t4r_zBN#hG048lrmoIjFyQ)$Quy0d0B-!cN?L4;3!?2C@|odfE9xx!%MS;Bx|B zV*7{?wO=2IPgrZIIh=)3TbfuYK=#z0<-kLT*>(jq1pO^Yx(M_uWD(N^98^;`n{2gx zU{Hc9Cx~}q@D<+{ubAep_BnTw#mgvf3ZjSpnx?~lytKS-v2Y4MA(@Q zai6(#K51N;%s0UU^2tbjQ6h~U@HU%?RB&@d9WBxWb}$%u@aR;iWY!>9y*DA-@un55 z=}EncwVKs?1QUJEDzpeYSN!%n27T|1kZ_m-LfX6@5w6y+oMOtBC$osmC4^ccb08Ke zpUU9WICbvTF<=eJ+gJ8hMgol-HTrHNQ;%Pj-;8Na5d{KHrl`o;~~Be zyU{%=Dd~yN>DoMP3J<*pLzQ$(faU(;!2M`0i~14@HY%lh+EH*7Ee6I>>IiIq6ijR% zqx!iFRfyCrgSR-*;=!9`_e<>+^scn>Y5wN-;OK|I#G@T{)IQPwOl!0Y+jDfoLGk0{ z-i=hi#T3D)4AggΠ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�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

        ee36%ZL69dtcxCk z^+W>SX`+O1?0f>ZNAJLTUP_T_&?J3Vz+YW9tJ@%R_=G z?1;X{>)$|(REb=ru!#cT`+1)v^z@wTaV`^^QfY*tyl;6L0)K0Mi zQb)^rb1TyOo`zpui8r#rDHyJ^^(eHX>J~DOBlY6G#LhsjgjDr-#zUcJOD})chMn0o zyaBS|j$g9GeAsXq(nT{97F-8+Pd;Hoi0jD~Lf}e3G=;lcyneT{MpN5V)=trO!|JTb zi?_@a_LvGW2x(^IpDkg%!XT1}dN5F&$&dA{ zl>NO9n!XMC5&T$#Yd3BVHDQZ&%})E?3ighymKV;mMydLo!)xGSoproCN>?^TnDtb7 zItU9PYQR4@J}6S|s@c9PcrutkuvhGocv6%NU7^C!s6Jsm7FAUE*Ci>tugd98DxmSK zAWX@trm0uKgWjf`pK=LOFyzP0BXys0yPalAZKA@~z=i8@S8(9rEY+uR} z$#^5F5jUdP!+tPnxk=dzzh~A$(-cn?04T&sSPNSL;wV=aZzUUW*ZN5*igxL8NIkm8 z?TkU_q={C(GqmY46HqNL)d-SOl&x*fnujVHanKTaQ|DZAd$3tsBg8~hj9mW(!A^?%-uR`i9a3mZxMjWRR`~sH5 zqUm?Z-sW{;+3uJJY%61v_yW_%Dtc~mj5I3;=W)wL3z&Z}H|EKuFlwwQl1b%OMgD0?WJ6GBy zzNmDKrL;HCLYM?FN-Y6khEC_l@G`Q5smK_7k|cmMe7#pm5^RluJ%@%cSh`j~Oy zj4qDyXV+W+oenvQ1hLk=T)2x5G}ELcSO~>kvc=PpwCFeD$og^Az!&9$q5Egj4r|KJ0!PwNLQ(iSRyjOE@t_fg<87tSQY6o~N! zSk%q^vd7H};I7~EOKE^z%a?IHS%?S$;EP7;(INh<`1JG74m^jJ4Q`e-roDjdt~sAL z98G?w?%^x&HPg7NkQA+ZS_Cu_&Y+L~j-!v#u+emL<+nJx6q~tPQE3KiuFsybkpj9p zdPn89wzM+pRwTvPXch18mggyB3diiE06O}K4M~(7KQ4}u+YadsdT(m;z3D{9y3g?M zN2ULURaS%e0{^U>la(3amjF@LWDtMce-zx({|=_Gzg>3u2F5J|;!k{%d}-#;wnINI z%d?&hS4hO1dH$nvSQ>nvsrTYz?9ZE@4`F{*{p7DBF%1WBTZo5936kIlhuF{C!Orf~^H;1}hyUsdsst*K~WKJ_d;|VxC;&+?hcA**Si9Gxw}57mfK zH0WN@)84-BLoC}3f4mW=nzJ)P*nVFfj3 zU9Yf%6*E;m!f~2IeEcz7d^8vPwEI)TG-CAu|7Xf>r7|v;i~h4EAka9DDjgS+lb}%u z`&S4k#~JlAd~b2Ee-1V>Wq0VV=s4YNsTruQ?siHEtm=XIKK942fS9}xz~+kCZX!;B zxL`b#ghzzVy=w%Kx=zY5^6&kq1e;)XLISs%f{1kz%5_6avM!g*2{x37@1a9X0G^A4 zZRZEf=#vsG)J}-{ugf6IsV}WfDG>!&0)NNbpUvz3ooatR5c6b&F8yi_F~XG=;Ankx z!FI7;ypDOv+}!xBi^rDYcfV^18j%PFoL8!3Azd!49Lj6%fIMinZZ0$g zln<5s%Im>a>Q0pREOqEee2!c$M}tGNNnP>kw>t4h9FiM0H5R_?(YM-r|AEFuO|AEz zvCnl)pSfv&B!B+;5RuH?zcY6P=z@Oh!Jp(p8sv}$3_jNxAzcaqHBYb<0%X3zdGV<7 z+HZ()SmGxf8NcApfg*s=I$d>7-fTs|qWvdGyuc%GA;8x8rz_#Tw�gmze}1C}KwJ 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

        LmH^A5>SQJ>tj#>! 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�_%=f%1l4w9Qi_6r*61L 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�mSNmXqGSfJD!( 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 O@HrljV}mW0KoaL^W9njsfywW^dw*ZkhgawQiT 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 beY6KZ+Ji?7&yV)ti5i|C?ZMNv2X74kveA;L literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001225204601.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001225204601.gif new file mode 100644 index 0000000000000000000000000000000000000000..2215e5cfa56f533c6b4d1318b2fa1fb07093dfaa GIT binary patch literal 6771 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 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001225418523.gif b/zh-cn/application-dev/reference/arkui-js/figures/zh-cn_image_0000001225418523.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b6df4b26274fdf5c3e6e1fab2423400455b7050 GIT binary patch literal 260708 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

        名称

        - -

        类型定义

        - -

        描述

        - - - -

        length

        - -

        string | number

        - -

        用于描述尺寸单位,输入为number类型时,使用px单位;输入为string类型时,需要显式指定像素单位,当前支持的像素单位有:

        -
        • px:逻辑尺寸单位。
        • fp6+:字体尺寸单位,会随系统字体大小设置发生变化,仅支持文本类组件设置相应的字体大小。
        - - -

        percentage

        - -

        string

        - -

        百分比尺寸单位,如“50%”。

        - - - - +| 名称 | 类型定义 | 描述 | +| -------- | -------- | -------- | +| length | string \| number | 用于描述尺寸单位,输入为number类型时,使用px单位;输入为string类型时,需要显式指定像素单位,当前支持的像素单位有:
        - px:逻辑尺寸单位。
        - fp6+:字体尺寸单位,会随系统字体大小设置发生变化,仅支持文本类组件设置相应的字体大小。 | +| percentage | string | 百分比尺寸单位,如“50%”。 | + ## 颜色类型 - - - - - - - - - - -

        名称

        -

        类型定义

        -

        描述

        -

        color

        -

        string | 颜色枚举字符串

        -

        用于描述颜色信息。

        -
        字符串格式如下:
        • 'rgb(255, 255, 255)'
        • 'rgba(255, 255, 255, 1.0)'
        • HEX格式:'#rrggbb','#aarrggbb'
        • 枚举格式:'black','white'。
          说明:

          JS脚本中不支持颜色枚举格式。

          -
          -
        -
        -
        +| 名称 | 类型定义 | 描述 | +| -------- | -------- | -------- | +| color | string \|颜色枚举字符串 | 用于描述颜色信息。
        字符串格式如下:
        - 'rgb(255, 255, 255)'
        - 'rgba(255, 255, 255, 1.0)'
        - HEX格式:'\#rrggbb','\#aarrggbb'
        - 枚举格式:'black','white'。
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > JS脚本中不支持颜色枚举格式。 | -**表 1** 当前支持的颜色枚举 +**表1** 当前支持的颜色枚举 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        枚举名称

        -

        对应颜色

        -

        颜色

        -

        aliceblue

        -

        #f0f8ff

        -

        -

        antiquewhite

        -

        #faebd7

        -

        -

        aqua

        -

        #00ffff

        -

        -

        aquamarine

        -

        #7fffd4

        -

        -

        azure

        -

        #f0ffff

        -

        -

        beige

        -

        #f5f5dc

        -

        -

        bisque

        -

        #ffe4c4

        -

        -

        black

        -

        #000000

        -

        -

        blanchedalmond

        -

        #ffebcd

        -

        -

        blue

        -

        #0000ff

        -

        -

        blueviolet

        -

        #8a2be2

        -

        -

        brown

        -

        #a52a2a

        -

        -

        burlywood

        -

        #deB887

        -

        -

        cadetblue

        -

        #5f9ea0

        -

        -

        chartreuse

        -

        #7fff00

        -

        -

        chocolate

        -

        #d2691e

        -

        -

        coral

        -

        #ff7f50

        -

        -

        cornflowerblue

        -

        #6495ed

        -

        -

        cornsilk

        -

        #fff8dc

        -

        -

        crimson

        -

        #dc143c

        -

        -

        cyan

        -

        #00ffff

        -

        -

        darkblue

        -

        #00008b

        -

        -

        darkcyan

        -

        #008b8b

        -

        -

        darkgoldenrod

        -

        #b8860b

        -

        -

        darkgray

        -

        #a9a9a9

        -

        -

        darkgreen

        -

        #006400

        -

        -

        darkgrey

        -

        #a9a9a9

        -

        -

        darkkhaki

        -

        #bdb76b

        -

        -

        darkmagenta

        -

        #8b008b

        -

        -

        darkolivegreen

        -

        #556b2f

        -

        -

        darkorange

        -

        #ff8c00

        -

        -

        darkorchid

        -

        #9932cc

        -

        -

        darkred

        -

        #8b0000

        -

        -

        darksalmon

        -

        #e9967a

        -

        -

        darkseagreen

        -

        #8fbc8f

        -

        -

        darkslateblue

        -

        #483d8b

        -

        -

        darkslategray

        -

        #2f4f4f

        -

        -

        darkslategrey

        -

        #2f4f4f

        -

        -

        darkturquoise

        -

        #00ced1

        -

        -

        darkviolet

        -

        #9400d3

        -

        -

        deeppink

        -

        #ff1493

        -

        -

        deepskyblue

        -

        #00bfff

        -

        -

        dimgray

        -

        #696969

        -

        -

        dimgrey

        -

        #696969

        -

        -

        dodgerblue

        -

        #1e90ff

        -

        -

        firebrick

        -

        #b22222

        -

        -

        floralwhite

        -

        #fffaf0

        -

        -

        forestgreen

        -

        #228b22

        -

        -

        fuchsia

        -

        #ff00ff

        -

        -

        gainsboro

        -

        #dcdcdc

        -

        -

        ghostwhite

        -

        #f8f8ff

        -

        -

        gold

        -

        #ffd700

        -

        -

        goldenrod

        -

        #daa520

        -

        -

        gray

        -

        #808080

        -

        -

        green

        -

        #008000

        -

        -

        greenyellow

        -

        #adff2f

        -

        -

        grey

        -

        #808080

        -

        -

        honeydew

        -

        #f0fff0

        -

        -

        hotpink

        -

        #ff69b4

        -

        -

        indianred

        -

        #cd5c5c

        -

        -

        indigo

        -

        #4b0082

        -

        -

        ivory

        -

        #fffff0

        -

        -

        khaki

        -

        #f0e68c

        -

        -

        lavender

        -

        #e6e6fa

        -

        -

        lavenderblush

        -

        #fff0f5

        -

        -

        lawngreen

        -

        #7cfc00

        -

        -

        lemonchiffon

        -

        #fffacd

        -

        -

        lightblue

        -

        #add8e6

        -

        -

        lightcoral

        -

        #f08080

        -

        -

        lightcyan

        -

        #e0ffff

        -

        -

        lightgoldenrodyellow

        -

        #fafad2

        -

        -

        lightgray

        -

        #d3d3d3

        -

        -

        lightgreen

        -

        #90ee90

        -

        -

        lightpink

        -

        #ffb6c1

        -

        -

        lightsalmon

        -

        #ffa07a

        -

        -

        lightseagreen

        -

        #20b2aa

        -

        -

        lightskyblue

        -

        #87cefa

        -

        -

        lightslategray

        -

        #778899

        -

        -

        lightslategrey

        -

        #778899

        -

        -

        lightsteelblue

        -

        #b0c4de

        -

        -

        lightyellow

        -

        #ffffe0

        -

        -

        lime

        -

        #00ff00

        -

        -

        limegreen

        -

        #32cd32

        -

        -

        linen

        -

        #faf0e6

        -

        -

        magenta

        -

        #ff00ff

        -

        -

        maroon

        -

        #800000

        -

        -

        mediumaquamarine

        -

        #66cdaa

        -

        -

        mediumblue

        -

        #0000cd

        -

        -

        mediumorchid

        -

        #ba55d3

        -

        -

        mediumpurple

        -

        #9370db

        -

        -

        mediumseagreen

        -

        #3cb371

        -

        -

        mediumslateblue

        -

        #7b68ee

        -

        -

        mediumspringgreen

        -

        #00fa9a

        -

        -

        mediumturquoise

        -

        #48d1cc

        -

        -

        mediumvioletred

        -

        #c71585

        -

        -

        midnightblue

        -

        #191970

        -

        -

        mintcream

        -

        #f5fffa

        -

        -

        mistyrose

        -

        #ffe4e1

        -

        -

        moccasin

        -

        #ffe4b5

        -

        -

        navajowhite

        -

        #ffdead

        -

        -

        navy

        -

        #000080

        -

        -

        oldlace

        -

        #fdf5e6

        -

        -

        olive

        -

        #808000

        -

        -

        olivedrab

        -

        #6b8e23

        -

        -

        orange

        -

        #ffa500

        -

        -

        orangered

        -

        #ff4500

        -

        -

        orchid

        -

        #da70d6

        -

        -

        palegoldenrod

        -

        #eee8aa

        -

        -

        palegreen

        -

        #98fb98

        -

        -

        paleturquoise

        -

        #afeeee

        -

        -

        palevioletred

        -

        #db7093

        -

        -

        papayawhip

        -

        #ffefd5

        -

        -

        peachpuff

        -

        #ffdab9

        -

        -

        peru

        -

        #cd853f

        -

        -

        pink

        -

        #ffc0cb

        -

        -

        plum

        -

        #dda0dd

        -

        -

        powderblue

        -

        #b0e0e6

        -

        -

        purple

        -

        #800080

        -

        -

        rebeccapurple

        -

        #663399

        -

        -

        red

        -

        #ff0000

        -

        -

        rosybrown

        -

        #bc8f8f

        -

        -

        royalblue

        -

        #4169e1

        -

        -

        saddlebrown

        -

        #8b4513

        -

        -

        salmon

        -

        #fa8072

        -

        -

        sandybrown

        -

        #f4a460

        -

        -

        seagreen

        -

        #2e8b57

        -

        -

        seashell

        -

        #fff5ee

        -

        -

        sienna

        -

        #a0522d

        -

        -

        silver

        -

        #c0c0c0

        -

        -

        skyblue

        -

        #87ceeb

        -

        -

        slateblue

        -

        #6a5acd

        -

        -

        slategray

        -

        #708090

        -

        -

        slategrey

        -

        #708090

        -

        -

        snow

        -

        #fffafa

        -

        -

        springgreen

        -

        #00ff7f

        -

        -

        steelblue

        -

        #4682b4

        -

        -

        tan

        -

        #d2b48c

        -

        -

        teal

        -

        #008080

        -

        -

        thistle

        -

        #d8Bfd8

        -

        -

        tomato

        -

        #ff6347

        -

        -

        turquoise

        -

        #40e0d0

        -

        -

        violet

        -

        #ee82ee

        -

        -

        wheat

        -

        #f5deb3

        -

        -

        white

        -

        #ffffff

        -

        -

        whitesmoke

        -

        #f5f5f5

        -

        -

        yellow

        -

        #ffff00

        -

        -

        yellowgreen

        -

        #9acd32

        -

        -
        +| 枚举名称 | 对应颜色 | 颜色 | +| -------- | -------- | -------- | +| aliceblue | \#f0f8ff | ![zh-cn_image_0000001173324803](figures/zh-cn_image_0000001173324803.png) | +| antiquewhite | \#faebd7 | ![zh-cn_image_0000001127285014](figures/zh-cn_image_0000001127285014.png) | +| aqua | \#00ffff | ![zh-cn_image_0000001127285050](figures/zh-cn_image_0000001127285050.png) | +| aquamarine | \#7fffd4 | ![zh-cn_image_0000001173324729](figures/zh-cn_image_0000001173324729.png) | +| azure | \#f0ffff | ![zh-cn_image_0000001127285040](figures/zh-cn_image_0000001127285040.png) | +| beige | \#f5f5dc | ![zh-cn_image_0000001173324773](figures/zh-cn_image_0000001173324773.png) | +| bisque | \#ffe4c4 | ![zh-cn_image_0000001173164895](figures/zh-cn_image_0000001173164895.png) | +| black | \#000000 | ![zh-cn_image_0000001173324735](figures/zh-cn_image_0000001173324735.png) | +| blanchedalmond | \#ffebcd | ![zh-cn_image_0000001173164889](figures/zh-cn_image_0000001173164889.png) | +| blue | \#0000ff | ![zh-cn_image_0000001127125194](figures/zh-cn_image_0000001127125194.png) | +| blueviolet | \#8a2be2 | ![zh-cn_image_0000001127285046](figures/zh-cn_image_0000001127285046.png) | +| brown | \#a52a2a | ![zh-cn_image_0000001173324833](figures/zh-cn_image_0000001173324833.png) | +| burlywood | \#deB887 | ![zh-cn_image_0000001127285026](figures/zh-cn_image_0000001127285026.png) | +| cadetblue | \#5f9ea0 | ![zh-cn_image_0000001127125210](figures/zh-cn_image_0000001127125210.png) | +| chartreuse | \#7fff00 | ![zh-cn_image_0000001173324811](figures/zh-cn_image_0000001173324811.png) | +| chocolate | \#d2691e | ![zh-cn_image_0000001127125256](figures/zh-cn_image_0000001127125256.png) | +| coral | \#ff7f50 | ![zh-cn_image_0000001173164877](figures/zh-cn_image_0000001173164877.png) | +| cornflowerblue | \#6495ed | ![zh-cn_image_0000001173324781](figures/zh-cn_image_0000001173324781.png) | +| cornsilk | \#fff8dc | ![zh-cn_image_0000001127285048](figures/zh-cn_image_0000001127285048.png) | +| crimson | \#dc143c | ![zh-cn_image_0000001127285066](figures/zh-cn_image_0000001127285066.png) | +| cyan | \#00ffff | ![zh-cn_image_0000001173324789](figures/zh-cn_image_0000001173324789.png) | +| darkblue | \#00008b | ![zh-cn_image_0000001173164841](figures/zh-cn_image_0000001173164841.png) | +| darkcyan | \#008b8b | ![zh-cn_image_0000001173324745](figures/zh-cn_image_0000001173324745.png) | +| darkgoldenrod | \#b8860b | ![zh-cn_image_0000001173324835](figures/zh-cn_image_0000001173324835.png) | +| darkgray | \#a9a9a9 | ![zh-cn_image_0000001127285028](figures/zh-cn_image_0000001127285028.png) | +| darkgreen | \#006400 | ![zh-cn_image_0000001127284990](figures/zh-cn_image_0000001127284990.png) | +| darkgrey | \#a9a9a9 | ![zh-cn_image_0000001127125174](figures/zh-cn_image_0000001127125174.png) | +| darkkhaki | \#bdb76b | ![zh-cn_image_0000001127285070](figures/zh-cn_image_0000001127285070.png) | +| darkmagenta | \#8b008b | ![zh-cn_image_0000001173164875](figures/zh-cn_image_0000001173164875.png) | +| darkolivegreen | \#556b2f | ![zh-cn_image_0000001173164835](figures/zh-cn_image_0000001173164835.png) | +| darkorange | \#ff8c00 | ![zh-cn_image_0000001127125178](figures/zh-cn_image_0000001127125178.png) | +| darkorchid | \#9932cc | ![zh-cn_image_0000001173324829](figures/zh-cn_image_0000001173324829.png) | +| darkred | \#8b0000 | ![zh-cn_image_0000001173164851](figures/zh-cn_image_0000001173164851.png) | +| darksalmon | \#e9967a | ![zh-cn_image_0000001127284998](figures/zh-cn_image_0000001127284998.png) | +| darkseagreen | \#8fbc8f | ![zh-cn_image_0000001173324755](figures/zh-cn_image_0000001173324755.png) | +| darkslateblue | \#483d8b | ![zh-cn_image_0000001127125246](figures/zh-cn_image_0000001127125246.png) | +| darkslategray | \#2f4f4f | ![zh-cn_image_0000001127125190](figures/zh-cn_image_0000001127125190.png) | +| darkslategrey | \#2f4f4f | ![zh-cn_image_0000001173324759](figures/zh-cn_image_0000001173324759.png) | +| darkturquoise | \#00ced1 | ![zh-cn_image_0000001127284980](figures/zh-cn_image_0000001127284980.png) | +| darkviolet | \#9400d3 | ![zh-cn_image_0000001127285058](figures/zh-cn_image_0000001127285058.png) | +| deeppink | \#ff1493 | ![zh-cn_image_0000001173324767](figures/zh-cn_image_0000001173324767.png) | +| deepskyblue | \#00bfff | ![zh-cn_image_0000001173164897](figures/zh-cn_image_0000001173164897.png) | +| dimgray | \#696969 | ![zh-cn_image_0000001127285022](figures/zh-cn_image_0000001127285022.png) | +| dimgrey | \#696969 | ![zh-cn_image_0000001173164911](figures/zh-cn_image_0000001173164911.png) | +| dodgerblue | \#1e90ff | ![zh-cn_image_0000001173164855](figures/zh-cn_image_0000001173164855.png) | +| firebrick | \#b22222 | ![zh-cn_image_0000001127125234](figures/zh-cn_image_0000001127125234.png) | +| floralwhite | \#fffaf0 | ![zh-cn_image_0000001173324771](figures/zh-cn_image_0000001173324771.png) | +| forestgreen | \#228b22 | ![zh-cn_image_0000001173324825](figures/zh-cn_image_0000001173324825.png) | +| fuchsia | \#ff00ff | ![zh-cn_image_0000001127285052](figures/zh-cn_image_0000001127285052.png) | +| gainsboro | \#dcdcdc | ![zh-cn_image_0000001173164901](figures/zh-cn_image_0000001173164901.png) | +| ghostwhite | \#f8f8ff | ![zh-cn_image_0000001127285012](figures/zh-cn_image_0000001127285012.png) | +| gold | \#ffd700 | ![zh-cn_image_0000001173324761](figures/zh-cn_image_0000001173324761.png) | +| goldenrod | \#daa520 | ![zh-cn_image_0000001173324817](figures/zh-cn_image_0000001173324817.png) | +| gray | \#808080 | ![zh-cn_image_0000001127125238](figures/zh-cn_image_0000001127125238.png) | +| green | \#008000 | ![zh-cn_image_0000001173164865](figures/zh-cn_image_0000001173164865.png) | +| greenyellow | \#adff2f | ![zh-cn_image_0000001127285000](figures/zh-cn_image_0000001127285000.png) | +| grey | \#808080 | ![zh-cn_image_0000001127285054](figures/zh-cn_image_0000001127285054.png) | +| honeydew | \#f0fff0 | ![zh-cn_image_0000001173324813](figures/zh-cn_image_0000001173324813.png) | +| hotpink | \#ff69b4 | ![zh-cn_image_0000001127285016](figures/zh-cn_image_0000001127285016.png) | +| indianred | \#cd5c5c | ![zh-cn_image_0000001173164849](figures/zh-cn_image_0000001173164849.png) | +| indigo | \#4b0082 | ![zh-cn_image_0000001173324821](figures/zh-cn_image_0000001173324821.png) | +| ivory | \#fffff0 | ![zh-cn_image_0000001173164887](figures/zh-cn_image_0000001173164887.png) | +| khaki | \#f0e68c | ![zh-cn_image_0000001173324801](figures/zh-cn_image_0000001173324801.png) | +| lavender | \#e6e6fa | ![zh-cn_image_0000001127125188](figures/zh-cn_image_0000001127125188.png) | +| lavenderblush | \#fff0f5 | ![zh-cn_image_0000001173324809](figures/zh-cn_image_0000001173324809.png) | +| lawngreen | \#7cfc00 | ![zh-cn_image_0000001127125224](figures/zh-cn_image_0000001127125224.png) | +| lemonchiffon | \#fffacd | ![zh-cn_image_0000001173164879](figures/zh-cn_image_0000001173164879.png) | +| lightblue | \#add8e6 | ![zh-cn_image_0000001127125180](figures/zh-cn_image_0000001127125180.png) | +| lightcoral | \#f08080 | ![zh-cn_image_0000001127125228](figures/zh-cn_image_0000001127125228.png) | +| lightcyan | \#e0ffff | ![zh-cn_image_0000001173324799](figures/zh-cn_image_0000001173324799.png) | +| lightgoldenrodyellow | \#fafad2 | ![zh-cn_image_0000001127125218](figures/zh-cn_image_0000001127125218.png) | +| lightgray | \#d3d3d3 | ![zh-cn_image_0000001127284974](figures/zh-cn_image_0000001127284974.png) | +| lightgreen | \#90ee90 | ![zh-cn_image_0000001173324805](figures/zh-cn_image_0000001173324805.png) | +| lightpink | \#ffb6c1 | ![zh-cn_image_0000001127285038](figures/zh-cn_image_0000001127285038.png) | +| lightsalmon | \#ffa07a | ![zh-cn_image_0000001173324795](figures/zh-cn_image_0000001173324795.png) | +| lightseagreen | \#20b2aa | ![zh-cn_image_0000001173324737](figures/zh-cn_image_0000001173324737.png) | +| lightskyblue | \#87cefa | ![zh-cn_image_0000001127285042](figures/zh-cn_image_0000001127285042.png) | +| lightslategray | \#778899 | ![zh-cn_image_0000001127125226](figures/zh-cn_image_0000001127125226.png) | +| lightslategrey | \#778899 | ![zh-cn_image_0000001127125222](figures/zh-cn_image_0000001127125222.png) | +| lightsteelblue | \#b0c4de | ![zh-cn_image_0000001127284976](figures/zh-cn_image_0000001127284976.png) | +| lightyellow | \#ffffe0 | ![zh-cn_image_0000001173324807](figures/zh-cn_image_0000001173324807.png) | +| lime | \#00ff00 | ![zh-cn_image_0000001127285020](figures/zh-cn_image_0000001127285020.png) | +| limegreen | \#32cd32 | ![zh-cn_image_0000001127125236](figures/zh-cn_image_0000001127125236.png) | +| linen | \#faf0e6 | ![zh-cn_image_0000001173324739](figures/zh-cn_image_0000001173324739.png) | +| magenta | \#ff00ff | ![zh-cn_image_0000001127285044](figures/zh-cn_image_0000001127285044.png) | +| maroon | \#800000 | ![zh-cn_image_0000001127285018](figures/zh-cn_image_0000001127285018.png) | +| mediumaquamarine | \#66cdaa | ![zh-cn_image_0000001173164899](figures/zh-cn_image_0000001173164899.png) | +| mediumblue | \#0000cd | ![zh-cn_image_0000001127284968](figures/zh-cn_image_0000001127284968.png) | +| mediumorchid | \#ba55d3 | ![zh-cn_image_0000001127125216](figures/zh-cn_image_0000001127125216.png) | +| mediumpurple | \#9370db | ![zh-cn_image_0000001173324779](figures/zh-cn_image_0000001173324779.png) | +| mediumseagreen | \#3cb371 | ![zh-cn_image_0000001127125230](figures/zh-cn_image_0000001127125230.png) | +| mediumslateblue | \#7b68ee | ![zh-cn_image_0000001173164921](figures/zh-cn_image_0000001173164921.png) | +| mediumspringgreen | \#00fa9a | ![zh-cn_image_0000001173324793](figures/zh-cn_image_0000001173324793.png) | +| mediumturquoise | \#48d1cc | ![zh-cn_image_0000001127125214](figures/zh-cn_image_0000001127125214.png) | +| mediumvioletred | \#c71585 | ![zh-cn_image_0000001173164893](figures/zh-cn_image_0000001173164893.png) | +| midnightblue | \#191970 | ![zh-cn_image_0000001127125260](figures/zh-cn_image_0000001127125260.png) | +| mintcream | \#f5fffa | ![zh-cn_image_0000001127285030](figures/zh-cn_image_0000001127285030.png) | +| mistyrose | \#ffe4e1 | ![zh-cn_image_0000001173324785](figures/zh-cn_image_0000001173324785.png) | +| moccasin | \#ffe4b5 | ![zh-cn_image_0000001127125232](figures/zh-cn_image_0000001127125232.png) | +| navajowhite | \#ffdead | ![zh-cn_image_0000001173164925](figures/zh-cn_image_0000001173164925.png) | +| navy | \#000080 | ![zh-cn_image_0000001127285032](figures/zh-cn_image_0000001127285032.png) | +| oldlace | \#fdf5e6 | ![zh-cn_image_0000001127125184](figures/zh-cn_image_0000001127125184.png) | +| olive | \#808000 | ![zh-cn_image_0000001127125244](figures/zh-cn_image_0000001127125244.png) | +| olivedrab | \#6b8e23 | ![zh-cn_image_0000001173324839](figures/zh-cn_image_0000001173324839.png) | +| orange | \#ffa500 | ![zh-cn_image_0000001173164885](figures/zh-cn_image_0000001173164885.png) | +| orangered | \#ff4500 | ![zh-cn_image_0000001127284996](figures/zh-cn_image_0000001127284996.png) | +| orchid | \#da70d6 | ![zh-cn_image_0000001127285056](figures/zh-cn_image_0000001127285056.png) | +| palegoldenrod | \#eee8aa | ![zh-cn_image_0000001127125262](figures/zh-cn_image_0000001127125262.png) | +| palegreen | \#98fb98 | ![zh-cn_image_0000001127285006](figures/zh-cn_image_0000001127285006.png) | +| paleturquoise | \#afeeee | ![zh-cn_image_0000001173324757](figures/zh-cn_image_0000001173324757.png) | +| palevioletred | \#db7093 | ![zh-cn_image_0000001173164905](figures/zh-cn_image_0000001173164905.png) | +| papayawhip | \#ffefd5 | ![zh-cn_image_0000001127125248](figures/zh-cn_image_0000001127125248.png) | +| peachpuff | \#ffdab9 | ![zh-cn_image_0000001173324769](figures/zh-cn_image_0000001173324769.png) | +| peru | \#cd853f | ![zh-cn_image_0000001173164843](figures/zh-cn_image_0000001173164843.png) | +| pink | \#ffc0cb | ![zh-cn_image_0000001127125242](figures/zh-cn_image_0000001127125242.png) | +| plum | \#dda0dd | ![zh-cn_image_0000001173324831](figures/zh-cn_image_0000001173324831.png) | +| powderblue | \#b0e0e6 | ![zh-cn_image_0000001127285010](figures/zh-cn_image_0000001127285010.png) | +| purple | \#800080 | ![zh-cn_image_0000001127285002](figures/zh-cn_image_0000001127285002.png) | +| rebeccapurple | \#663399 | ![zh-cn_image_0000001173164907](figures/zh-cn_image_0000001173164907.png) | +| red | \#ff0000 | ![zh-cn_image_0000001127125254](figures/zh-cn_image_0000001127125254.png) | +| rosybrown | \#bc8f8f | ![zh-cn_image_0000001173324775](figures/zh-cn_image_0000001173324775.png) | +| royalblue | \#4169e1 | ![zh-cn_image_0000001127284972](figures/zh-cn_image_0000001127284972.png) | +| saddlebrown | \#8b4513 | ![zh-cn_image_0000001127125250](figures/zh-cn_image_0000001127125250.png) | +| salmon | \#fa8072 | ![zh-cn_image_0000001127285064](figures/zh-cn_image_0000001127285064.png) | +| sandybrown | \#f4a460 | ![zh-cn_image_0000001173324777](figures/zh-cn_image_0000001173324777.png) | +| seagreen | \#2e8b57 | ![zh-cn_image_0000001173324733](figures/zh-cn_image_0000001173324733.png) | +| seashell | \#fff5ee | ![zh-cn_image_0000001127285062](figures/zh-cn_image_0000001127285062.png) | +| sienna | \#a0522d | ![zh-cn_image_0000001173164917](figures/zh-cn_image_0000001173164917.png) | +| silver | \#c0c0c0 | ![zh-cn_image_0000001173324743](figures/zh-cn_image_0000001173324743.png) | +| skyblue | \#87ceeb | ![zh-cn_image_0000001127284970](figures/zh-cn_image_0000001127284970.png) | +| slateblue | \#6a5acd | ![zh-cn_image_0000001173164915](figures/zh-cn_image_0000001173164915.png) | +| slategray | \#708090 | ![zh-cn_image_0000001173324815](figures/zh-cn_image_0000001173324815.png) | +| slategrey | \#708090 | ![zh-cn_image_0000001127284982](figures/zh-cn_image_0000001127284982.png) | +| snow | \#fffafa | ![zh-cn_image_0000001173324731](figures/zh-cn_image_0000001173324731.png) | +| springgreen | \#00ff7f | ![zh-cn_image_0000001127285060](figures/zh-cn_image_0000001127285060.png) | +| steelblue | \#4682b4 | ![zh-cn_image_0000001127125240](figures/zh-cn_image_0000001127125240.png) | +| tan | \#d2b48c | ![zh-cn_image_0000001173324747](figures/zh-cn_image_0000001173324747.png) | +| teal | \#008080 | ![zh-cn_image_0000001173324741](figures/zh-cn_image_0000001173324741.png) | +| thistle | \#d8Bfd8 | ![zh-cn_image_0000001173164913](figures/zh-cn_image_0000001173164913.png) | +| tomato | \#ff6347 | ![zh-cn_image_0000001173164909](figures/zh-cn_image_0000001173164909.png) | +| turquoise | \#40e0d0 | ![zh-cn_image_0000001173164837](figures/zh-cn_image_0000001173164837.png) | +| violet | \#ee82ee | ![zh-cn_image_0000001127125258](figures/zh-cn_image_0000001127125258.png) | +| wheat | \#f5deb3 | ![zh-cn_image_0000001127285068](figures/zh-cn_image_0000001127285068.png) | +| white | \#ffffff | ![zh-cn_image_0000001173324823](figures/zh-cn_image_0000001173324823.png) | +| whitesmoke | \#f5f5f5 | ![zh-cn_image_0000001127284992](figures/zh-cn_image_0000001127284992.png) | +| yellow | \#ffff00 | ![zh-cn_image_0000001173324837](figures/zh-cn_image_0000001173324837.png) | +| yellowgreen | \#9acd32 | ![zh-cn_image_0000001173164923](figures/zh-cn_image_0000001173164923.png) | diff --git a/zh-cn/application-dev/reference/arkui-js/js-appendix.md b/zh-cn/application-dev/reference/arkui-js/js-appendix.md index 3c0b115e1f6..064f8f5fd18 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-appendix.md +++ b/zh-cn/application-dev/reference/arkui-js/js-appendix.md @@ -1,4 +1,5 @@ # 附录 -- **[类型说明](js-appendix-types.md)** + +- **[类型说明](js-appendix-types.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-button.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-button.md index d763b53429b..2470492c22e 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-button.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-button.md @@ -1,334 +1,86 @@ -# button +# button + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 提供按钮组件,包括胶囊按钮、圆形按钮、文本按钮、弧形按钮、下载按钮。 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        -

        -

        -

        不支持动态修改。如果该属性缺省,展示类胶囊型按钮,不同于胶囊类型,四边圆角可以通过border-radius分别指定,如果需要设置该属性,则可选值包括如下:

        -
        • capsule:胶囊型按钮,带圆角按钮,有背景色和文本;
        • circle:圆形按钮,支持放置图标;
        • text:文本按钮,仅包含文本显示;
        • arc:弧形按钮,仅支持智能穿戴;
        • download:下载按钮,额外增加下载进度条功能,仅支持手机和智慧屏。
        -

        value

        -

        string

        -

        -

        -

        -

        button的文本值。

        -

        icon

        -

        string

        -

        -

        -

        -

        button的图标路径,图标格式为jpg,png和svg。

        -

        placement5+

        -

        string

        -

        end

        -

        -

        仅在type属性为缺省时生效,设置图标位于文本的位置,可选值为:

        -
        • start:图标位于文本起始处;
        • end:图标位于文本结束处;
        • top:图标位于文本上方;
        • bottom:图标位于文本下方。
        -

        waiting

        -

        boolean

        -

        false

        -

        -

        waiting状态,waiting为true时展现等待中转圈效果,位于文本左侧。类型为download时不生效,不支持智能穿戴。

        -
        - -## 样式 - -### type设置为非arc - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        text-color

        -

        <color>

        -

        #ff007dff

        -

        -

        按钮的文本颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        按钮的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        font-style

        -

        string

        -

        normal

        -

        -

        按钮的字体样式。

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        按钮的字体粗细。见text组件font-weight的样式属性

        -

        font-family

        -

        <string>

        -

        sans-serif

        -

        -

        按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -

        icon-width

        -

        <length>

        -

        -

        -

        -

        设置圆形按钮内部图标的宽,默认填满整个圆形按钮。

        -
        说明:

        icon使用svg图源时必须设置该样式。

        -
        -

        icon-height

        -

        <length>

        -

        -

        -

        -

        设置圆形按钮内部图标的高,默认填满整个圆形按钮。

        -
        说明:

        icon使用svg图源时必须设置该样式。

        -
        -

        radius

        -

        <length>

        -

        -

        -

        -

        按钮圆角半径。在圆形按钮类型下该样式优先于通用样式的width和height样式。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 胶囊按钮(type=capsule)时,不支持border相关样式; ->- 圆形按钮(type=circle)时,不支持文本相关样式; ->- 文本按钮(type=text)时,自适应文本大小,不支持尺寸设置(radius,width,height),背景透明不支持background-color样式。 - -### type设置为arc - -除支持[通用样式](js-components-common-styles.md)中background-color、opacity、display、visibility、position、\[left|top|right|bottom外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        text-color

        -

        <color>

        -

        #de0000

        -

        -

        弧形按钮的文本颜色。

        -

        font-size

        -

        <length>

        -

        37.5px

        -

        -

        弧形按钮的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        弧形按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -

        font-style

        -

        string

        -

        normal

        -

        -

        弧形按钮的字体样式。

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        弧形按钮的字体粗细。见text组件font-weight的样式属性

        -

        font-family

        -

        <string>

        -

        sans-serif

        -

        -

        按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        - -## 事件 - -支持[通用事件](js-components-common-events.md)。 - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | - | 否 | 不支持动态修改。如果该属性缺省,展示类胶囊型按钮,不同于胶囊类型,四边圆角可以通过border-radius分别指定,如果需要设置该属性,则可选值包括如下:
        - capsule:胶囊型按钮,带圆角按钮,有背景色和文本;
        - circle:圆形按钮,支持放置图标;
        - text:文本按钮,仅包含文本显示;
        - arc:弧形按钮,仅支持智能穿戴;
        - download:下载按钮,额外增加下载进度条功能。 | +| value | string | - | 否 | button的文本值。 | +| icon | string | - | 否 | button的图标路径,图标格式为jpg,png和svg。 | +| placement5+ | string | end | 否 | 仅在type属性为缺省时生效,设置图标位于文本的位置,可选值为:
        - start:图标位于文本起始处;
        - end:图标位于文本结束处;
        - top:图标位于文本上方;
        - bottom:图标位于文本下方。 | +| waiting | boolean | false | 否 | waiting状态,waiting为true时展现等待中转圈效果,位于文本左侧。类型为download时不生效。 | + + +## 样式 + + +### type设置为非arc + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| text-color | <color> | \#ff007dff
        | 否 | 按钮的文本颜色。 | +| font-size | <length> | 16px
        | 否 | 按钮的文本尺寸。 | +| allow-scale | boolean | true | 否 | 按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| font-style | string | normal | 否 | 按钮的字体样式。 | +| font-weight | number \| string | normal | 否 | 按钮的字体粗细。见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | <string> | sans-serif | 否 | 按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | +| icon-width | <length> | - | 否 | 设置圆形按钮内部图标的宽,默认填满整个圆形按钮。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > icon使用svg图源时必须设置该样式。 | +| icon-height | <length> | - | 否 | 设置圆形按钮内部图标的高,默认填满整个圆形按钮。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > icon使用svg图源时必须设置该样式。 | +| radius | <length> | - | 否 | 按钮圆角半径。在圆形按钮类型下该样式优先于通用样式的width和height样式。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 胶囊按钮(type=capsule)时,不支持border相关样式; +> +> - 圆形按钮(type=circle)时,不支持文本相关样式; +> +> - 文本按钮(type=text)时,自适应文本大小,不支持尺寸设置(radius,width,height),背景透明不支持background-color样式。 + + +### type设置为arc + +除支持[通用样式](../arkui-js/js-components-common-styles.md)中background-color、opacity、display、visibility、position、[left|top|right|bottom外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| text-color | <color> | \#de0000 | 否 | 弧形按钮的文本颜色。 | +| font-size | <length> | 37.5px | 否 | 弧形按钮的文本尺寸。 | +| allow-scale | boolean | true | 否 | 弧形按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。 | +| font-style | string | normal | 否 | 弧形按钮的字体样式。 | +| font-weight | number \| string | normal | 否 | 弧形按钮的字体粗细。见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | <string> | sans-serif | 否 | 按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | + + +## 事件 + +支持[通用事件](../arkui-js/js-components-common-events.md)。 + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 类型为download时,支持如下方法: - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        setProgress

        -

        { progress:percent }

        -

        设定下载按钮进度条进度,取值位于0-100区间内,当设置的值大于0时,下载按钮展现进度条。当设置的值大于等于100时,取消进度条显示。

        -
        说明:

        浮在进度条上的文字通过value值进行变更。

        -
        -
        - -## 示例 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| setProgress | { progress:percent } | 设定下载按钮进度条进度,取值位于0-100区间内,当设置的值大于0时,下载按钮展现进度条。当设置的值大于等于100时,取消进度条显示。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 浮在进度条上的文字通过value值进行变更。 | + +## 示例 ``` @@ -403,5 +155,4 @@ export default { } ``` -![](figures/zh-cn_image_0000001127125132.png) - +![zh-cn_image_0000001127125132](figures/zh-cn_image_0000001127125132.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-chart.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-chart.md index f9befe5cf71..dcde8ec5c94 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-chart.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-chart.md @@ -1,1150 +1,354 @@ -# chart +# chart + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 图表组件,用于呈现线形图、柱状图、量规图界面。 -## 权限列表 +## 权限列表 无 -## 子组件 - -不支持。 - -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        line

        -

        -

        设置图表类型(不支持动态修改),可选项有:

        -
        • bar:柱状图。
        • line:线形图。
        • gauge:量规图。
        • progress5+:进度类圆形图表。
        • loading5+:加载类圆形图表。
        • rainbow5+:占比类圆形图表。
        -

        options

        -

        ChartOptions

        -

        -

        -

        -

        图表参数设置,柱状图和线形图必须设置参数设置,量规图不生效。可以设置x轴、y轴的最小值、最大值、刻度数、是否显示,线条宽度、是否平滑等。(不支持动态修改)

        -

        datasets

        -

        Array<ChartDataset>

        -

        -

        -

        -

        数据集合,柱状图和线形图必须设置数据集合,量规图不生效。可以设置多条数据集及其背景色。

        -

        segments5+

        -

        DataSegment | Array<DataSegment>

        -

        -

        -

        -

        进度类、加载类和占比类圆形图表使用的数据结构。

        -

        DataSegment针对进度类和加载类圆形图表使用,

        -

        Array<DataSegment>针对占比类图标使用,DataSegment最多9个。

        -
        说明:

        仅手机和平板设备支持。

        -
        -

        effects5+

        -

        boolean

        -

        true

        -

        -

        是否开启占比类、进度类圆形图表特效。

        -
        说明:

        仅手机和平板设备支持。

        -
        -

        animationduration6+

        -

        number

        -

        3000

        -

        -

        设置占比类圆形图表展开动画时长,单位为ms。

        -
        说明:

        仅手机和平板设备支持。

        -
        -
        - -**表 1** ChartOptions - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        xAxis

        -

        ChartAxis

        -

        -

        -

        -

        x轴参数设置。可以设置x轴最小值、最大值、刻度数以及是否显示。

        -

        yAxis

        -

        ChartAxis

        -

        -

        -

        -

        y轴参数设置。可以设置y轴最小值、最大值、刻度数以及是否显示。

        -

        series

        -

        ChartSeries

        -

        -

        -

        -

        数据序列参数设置。可以设置1)线的样式,如线宽、是否平滑;2)设置线最前端位置白点的样式和大小。

        -
        说明:

        仅线形图支持。

        -
        -
        - -**表 2** ChartDataset - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        strokeColor

        -

        <color>

        -

        #ff6384

        -

        -

        线条颜色。

        -
        说明:

        仅线形图支持。

        -
        -

        fillColor

        -

        <color>

        -

        #ff6384

        -

        -

        填充颜色。线形图表示填充的渐变颜色。

        -

        data

        -

        Array<number> | Array<Point>5+

        -

        -

        -

        -

        设置绘制线或柱中的点集。

        -

        gradient

        -

        boolean

        -

        false

        -

        -

        设置是否显示填充渐变颜色。

        -
        说明:

        仅线形图支持。

        -
        -
        - -**表 3** ChartAxis - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        min

        -

        number

        -

        0

        -

        -

        轴的最小值。

        -
        说明:

        仅线形图支持负数。

        -
        -

        max

        -

        number

        -

        100

        -

        -

        轴的最大值。

        -
        说明:

        仅线形图支持负数。

        -
        -

        axisTick

        -

        number

        -

        10

        -

        -

        轴显示的刻度数量。

        -
        说明:

        仅支持1~20,且具体显示的效果与如下计算值有关(图的宽度所占的像素/(max-min))。

        -

        在柱状图中,每组数据显示的柱子数量与刻度数量一致,且柱子显示在刻度处。

        -
        -

        display

        -

        boolean

        -

        false

        -

        -

        是否显示轴。

        -

        color

        -

        <color>

        -

        #c0c0c0

        -

        -

        轴颜色。

        -
        -**表 4** ChartSeries +## 子组件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        lineStyle

        -

        ChartLineStyle

        -

        -

        -

        -

        线样式设置,如线宽、是否平滑。

        -

        headPoint

        -

        PointStyle

        -

        -

        -

        -

        线最前端位置白点的样式和大小。

        -

        topPoint

        -

        PointStyle

        -

        -

        -

        -

        最高点的样式和大小。

        -

        bottomPoint

        -

        PointStyle

        -

        -

        -

        -

        最低点的样式和大小。

        -

        loop

        -

        ChartLoop

        -

        -

        -

        -

        设置屏幕显示满时,是否需要重头开始绘制。

        -
        - -**表 5** ChartLineStyle - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        width

        -

        <length>

        -

        1px

        -

        -

        线宽设置。

        -

        smooth

        -

        boolean

        -

        false

        -

        -

        是否平滑。

        -
        - -**表 6** PointStyle - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        shape

        -

        string

        -

        circle

        -

        -

        高亮点的形状。可选值为:

        -
        • circle:圆形。
        • square:方形。
        • triangle:三角形。
        -

        size

        -

        <length>

        -

        5px

        -

        -

        高亮点的大小。

        -

        strokeWidth

        -

        <length>

        -

        1px

        -

        -

        边框宽度

        -

        strokeColor

        -

        <color>

        -

        #ff0000

        -

        -

        边框颜色。

        -

        fillColor

        -

        <color>

        -

        #ff0000

        -

        -

        填充颜色。

        -
        - -**表 7** ChartLoop - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        margin

        -

        <length>

        -

        1

        -

        -

        擦除点的个数(最新绘制的点与最老的点之间的横向距离)。注意:轻量设备margin和topPoint/bottomPoint/headPoint同时使用时,有概率出现point正好位于擦除区域的情况,导致point不可见,因此不建议同时使用。

        -

        gradient

        -

        boolean

        -

        false

        -

        -

        是否需要渐变擦除。

        -
        - -**表 8** Point5+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        value

        -

        number

        -

        0

        -

        -

        表示绘制点的Y轴坐标。

        -

        pointStyle

        -

        PointStyle

        -

        -

        -

        -

        表示当前数据点的绘制样式。

        -

        description

        -

        string

        -

        -

        -

        -

        表示当前点的注释内容。

        -

        textLocation

        -

        string

        -

        -

        -

        -

        可选值为top,bottom,none。分别表示注释的绘制位置位于点的上方,下方,以及不绘制。

        -

        textColor

        -

        <color>

        -

        #000000

        -

        -

        表示注释文字的颜色。

        -

        lineDash

        -

        string

        -

        solid

        -

        -

        表示绘制当前线段虚线的样式。“dashed, 5, 5”表示纯虚线,绘制5px的实线后留5px的空白。“solid”表示绘制实线。

        -

        lineColor

        -

        <color>

        -

        #000000

        -

        -

        表示绘制当前线段的颜色。此颜色不设置会默认使用整体的strokeColor。

        -
        - -**表 9** DataSegment5+ +不支持。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        startColor

        -

        Color

        -

        -

        -

        -

        起始位置的颜色,设置startColor必须设置endColor。不设置startColor时,会使用系统默认预置的颜色数组,具体颜色值见下表。

        -

        endColor

        -

        Color

        -

        -

        -

        -

        终止位置的颜色,设置endColor必须设置startColor。

        -

        不设置startColor时,会使用系统默认预置的颜色数组。

        -

        value

        -

        number

        -

        0

        -

        -

        占比数据的所占份额,最大100。

        -

        name

        -

        string

        -

        -

        -

        -

        此类数据的名称。

        -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        数据组

        -

        浅色主题

        -

        深色主题

        -

        0

        -

        起始颜色:#f7ce00,结束颜色:#f99b11

        -

        起始颜色:#d1a738,结束颜色:#eb933d

        -

        1

        -

        起始颜色:#f76223,结束颜色:#f2400a

        -

        起始颜色:#e67d50,结束颜色:#d9542b

        -

        2

        -

        起始颜色:#f772ac,结束颜色:#e65392

        -

        起始颜色:#d5749e,结束颜色:#d6568d

        -

        3

        -

        起始颜色:#a575eb,结束颜色:#a12df7

        -

        起始颜色:#9973d1,结束颜色:#5552d9

        -

        4

        -

        起始颜色:#7b79f7,结束颜色:#4b48f7

        -

        起始颜色:#7977d9,结束颜色:#f99b11

        -

        5

        -

        起始颜色:#4b8af3,结束颜色:#007dff

        -

        起始颜色:#4c81d9,结束颜色:#217bd9

        -

        6

        -

        起始颜色:#73c1e6,结束颜色:#4fb4e3

        -

        起始颜色:#5ea6d1,结束颜色:#4895c2

        -

        7

        -

        起始颜色:#a5d61d,结束颜色:#69d14f

        -

        起始颜色:#91c23a,结束颜色:#70ba5d

        -

        8

        -

        起始颜色:#a2a2b0,结束颜色:#8e8e93

        -

        起始颜色:#8c8c99,结束颜色:#6b6b76

        -
        +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | line | 否 | 设置图表类型(不支持动态修改),可选项有:
        - bar:柱状图。
        - line:线形图。
        - gauge:量规图。
        - progress5+:进度类圆形图表。
        - loading5+:加载类圆形图表。
        - rainbow5+:占比类圆形图表。 | +| options | ChartOptions | - | 否 | 图表参数设置,柱状图和线形图必须设置参数设置,量规图不生效。可以设置x轴、y轴的最小值、最大值、刻度数、是否显示,线条宽度、是否平滑等。(不支持动态修改) | +| datasets | Array<ChartDataset> | - | 否 | 数据集合,柱状图和线形图必须设置数据集合,量规图不生效。可以设置多条数据集及其背景色。 | +| segments5+ | DataSegment \| Array<DataSegment> | - | 否 | 进度类、加载类和占比类圆形图表使用的数据结构。
        DataSegment针对进度类和加载类圆形图表使用,
        Array<DataSegment>针对占比类图标使用,DataSegment最多9个。 | +| effects5+ | boolean | true | 否 | 是否开启占比类、进度类圆形图表特效。 | +| animationduration6+ | number | 3000 | 否 | 设置占比类圆形图表展开动画时长,单位为ms。 | + +**表1** ChartOptions + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| xAxis | ChartAxis | - | 是 | x轴参数设置。可以设置x轴最小值、最大值、刻度数以及是否显示。 | +| yAxis | ChartAxis | - | 是 | y轴参数设置。可以设置y轴最小值、最大值、刻度数以及是否显示。 | +| series | ChartSeries | - | 否 | 数据序列参数设置。可以设置1)线的样式,如线宽、是否平滑;2)设置线最前端位置白点的样式和大小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅线形图支持。 | + +**表2** ChartDataset + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| strokeColor | <color> | \#ff6384 | 否 | 线条颜色。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅线形图支持。 | +| fillColor | <color> | \#ff6384 | 否 | 填充颜色。线形图表示填充的渐变颜色。 | +| data | Array<number> \| Array<Point>5+ | - | 是 | 设置绘制线或柱中的点集。 | +| gradient | boolean | false | 否 | 设置是否显示填充渐变颜色。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅线形图支持。 | + +**表3** ChartAxis + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| min | number | 0 | 否 | 轴的最小值。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅线形图支持负数。 | +| max | number | 100 | 否 | 轴的最大值。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅线形图支持负数。 | +| axisTick | number | 10 | 否 | 轴显示的刻度数量。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅支持1~20,且具体显示的效果与如下计算值有关(图的宽度所占的像素/(max-min))。
        > 在柱状图中,每组数据显示的柱子数量与刻度数量一致,且柱子显示在刻度处。 | +| display | boolean | false | 否 | 是否显示轴。 | +| color | <color> | \#c0c0c0 | 否 | 轴颜色。 | + +**表4** ChartSeries + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| lineStyle | ChartLineStyle | - | 否 | 线样式设置,如线宽、是否平滑。 | +| headPoint | PointStyle | - | 否 | 线最前端位置白点的样式和大小。 | +| topPoint | PointStyle | - | 否 | 最高点的样式和大小。 | +| bottomPoint | PointStyle | - | 否 | 最低点的样式和大小。 | +| loop | ChartLoop | - | 否 | 设置屏幕显示满时,是否需要重头开始绘制。 | + +**表5** ChartLineStyle + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| width | <length> | 1px | 否 | 线宽设置。 | +| smooth | boolean | false | 否 | 是否平滑。 | + +**表6** PointStyle + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| shape | string | circle | 否 | 高亮点的形状。可选值为:
        - circle:圆形。
        - square:方形。
        - triangle:三角形。 | +| size | <length> | 5px | 否 | 高亮点的大小。 | +| strokeWidth | <length> | 1px | 否 | 边框宽度 | +| strokeColor | <color> | \#ff0000 | 否 | 边框颜色。 | +| fillColor | <color> | \#ff0000 | 否 | 填充颜色。 | + +**表7** ChartLoop + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| margin | <length> | 1 | 否 | 擦除点的个数(最新绘制的点与最老的点之间的横向距离)。注意:轻量设备margin和topPoint/bottomPoint/headPoint同时使用时,有概率出现point正好位于擦除区域的情况,导致point不可见,因此不建议同时使用。 | +| gradient | boolean | false | 否 | 是否需要渐变擦除。 | + +**表8** Point5+ + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| value | number | 0 | 是 | 表示绘制点的Y轴坐标。 | +| pointStyle | PointStyle | - | 否 | 表示当前数据点的绘制样式。 | +| description | string | - | 否 | 表示当前点的注释内容。 | +| textLocation | string | - | 否 | 可选值为top,bottom,none。分别表示注释的绘制位置位于点的上方,下方,以及不绘制。 | +| textColor | <color> | \#000000 | 否 | 表示注释文字的颜色。 | +| lineDash | string | solid | 否 | 表示绘制当前线段虚线的样式。“dashed, 5, 5”表示纯虚线,绘制5px的实线后留5px的空白。“solid”表示绘制实线。 | +| lineColor | <color> | \#000000 | 否 | 表示绘制当前线段的颜色。此颜色不设置会默认使用整体的strokeColor。 | + +**表9** DataSegment5+ + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| startColor | Color | - | 否 | 起始位置的颜色,设置startColor必须设置endColor。不设置startColor时,会使用系统默认预置的颜色数组,具体颜色值见下表。 | +| endColor | Color | - | 否 | 终止位置的颜色,设置endColor必须设置startColor。
        不设置startColor时,会使用系统默认预置的颜色数组。 | +| value | number | 0 | 是 | 占比数据的所占份额,最大100。 | +| name | string | - | 否 | 此类数据的名称。 | + +| 数据组 | 浅色主题 | 深色主题 | +| -------- | -------- | -------- | +| 0 | 起始颜色:\#f7ce00,结束颜色:\#f99b11 | 起始颜色:\#d1a738,结束颜色:\#eb933d | +| 1 | 起始颜色:\#f76223,结束颜色:\#f2400a | 起始颜色:\#e67d50,结束颜色:\#d9542b | +| 2 | 起始颜色:\#f772ac,结束颜色:\#e65392 | 起始颜色:\#d5749e,结束颜色:\#d6568d | +| 3 | 起始颜色:\#a575eb,结束颜色:\#a12df7 | 起始颜色:\#9973d1,结束颜色:\#5552d9 | +| 4 | 起始颜色:\#7b79f7,结束颜色:\#4b48f7 | 起始颜色:\#7977d9,结束颜色:\#f99b11 | +| 5 | 起始颜色:\#4b8af3,结束颜色:\#007dff | 起始颜色:\#4c81d9,结束颜色:\#217bd9 | +| 6 | 起始颜色:\#73c1e6,结束颜色:\#4fb4e3 | 起始颜色:\#5ea6d1,结束颜色:\#4895c2 | +| 7 | 起始颜色:\#a5d61d,结束颜色:\#69d14f | 起始颜色:\#91c23a,结束颜色:\#70ba5d | +| 8 | 起始颜色:\#a2a2b0,结束颜色:\#8e8e93 | 起始颜色:\#8c8c99,结束颜色:\#6b6b76 | 当类型为量规图时,还支持如下属性: - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        percent

        -

        number

        -

        0

        -

        -

        当前值占整体的百分比,取值范围为0-100。

        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        stroke-width

        -

        <length>

        -

        32px(量规)

        -

        24px(占比类圆形图表)

        -

        -

        量规、占比类圆形图表组件刻度条的宽度。

        -

        start-angle

        -

        <deg>

        -

        240(量规)

        -

        0(占比类圆形图表)

        -

        -

        量规、占比类圆形图表组件刻度条起始角度,以时钟0点为基线。范围为0到360。

        -

        total-angle

        -

        <deg>

        -

        240(量规)

        -

        360(占比类圆形图表)

        -

        -

        量规、占比类圆形图表组件刻度条总长度,范围为-360到360,负数标识起点到终点为逆时针。

        -

        center-x

        -

        <length>

        -

        -

        -

        -

        量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-y和radius一起配置才能生效。(仅量规图支持)

        -

        center-y

        -

        <length>

        -

        -

        -

        -

        量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-x和radius一起配置才能生效。(仅量规图支持)

        -

        radius

        -

        <length>

        -

        -

        -

        -

        量规组件刻度条半径,该样式优先于通用样式的width和height样式。该样式需要和center-x和center-y一起配置才能生效。(仅量规图支持)

        -

        colors

        -

        Array

        -

        -

        -

        -

        量规组件刻度条每一个区段的颜色。

        -

        如:colors: #ff0000, #00ff00。(仅量规图支持)

        -

        weights

        -

        Array

        -

        -

        -

        -

        量规组件刻度条每一个区段的权重。

        -

        如:weights: 2, 2。(仅量规图支持)

        -

        font-family5+

        -

        Array

        -

        -

        -

        -

        表示绘制注释的字体样式,支持自定义字体

        -

        font-size5+

        -

        <length>

        -

        -

        -

        -

        表示绘制注释的字体的大小。

        -
        - -## 事件 - -支持[通用事件](js-components-common-events.md)。 - -## 方法 - -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: - - - - - - - - - - - -

        方法

        -

        参数

        -

        描述

        -

        append

        -

        {

        -

        serial: number, // 设置要更新的线形图数据下标

        -

        data: Array<number>, // 设置新增的数据

        -

        }

        -

        往已有的数据序列中动态添加数据,根据serial指定目标序列,serial为datasets数组的下标,从0开始。注意:不会更新datasets[index].data。仅线形图支持,按横坐标加1递增(与xAxis min/max设置相关)。

        -
        - -## 示例 - -1. 线形图 - - ``` - -
        - - - - - -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - } - .chart-region { - height: 400px; - width: 700px; - } - .chart-background { - object-fit: fill; - } - .chart-data { - width: 700px; - height: 600px; - } - button { - width: 100%; - height: 50px; - background-color: #F4F2F1; - text-color: #0C81F3; - } - ``` - - ``` - // xxx.js - export default { - data: { - lineData: [ - { - strokeColor: '#0081ff', - fillColor: '#cce5ff', - data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716], - gradient: true, - } - ], - lineOps: { - xAxis: { - min: 0, - max: 20, - display: false, - }, - yAxis: { - min: 0, - max: 1000, - display: false, - }, - series: { - lineStyle: { - width: "5px", - smooth: true, - }, - headPoint: { - shape: "circle", - size: 20, - strokeWidth: 5, - fillColor: '#ffffff', - strokeColor: '#007aff', - display: true, - }, - loop: { - margin: 2, - gradient: true, - } - } - }, - }, - addData() { - this.$refs.linechart.append({ - serial: 0, - data: [Math.floor(Math.random() * 400) + 400] - }) - } - } - ``` - - ![](figures/zh-cn_image_0000001173324843.png) - -2. 柱状图 - - ``` - -
        - - - - -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - } - .data-region { - height: 400px; - width: 700px; - } - .data-background { - object-fit: fill; - } - .data-bar { - width: 700px; - height: 400px; - } - ``` - - ``` - // xxx.js - export default { - data: { - barData: [ - { - fillColor: '#f07826', - data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628], - }, - { - fillColor: '#cce5ff', - data: [535, 776, 615, 444, 694, 785, 677, 609, 562, 410], - }, - { - fillColor: '#ff88bb', - data: [673, 500, 574, 483, 702, 583, 437, 506, 693, 657], - }, - ], - barOps: { - xAxis: { - min: 0, - max: 20, - display: false, - axisTick: 10, - }, - yAxis: { - min: 0, - max: 1000, - display: false, - }, - }, - } - } - ``` - - ![](figures/barchart.png) - -3. 量规图 - - ``` - -
        -
        - -
        -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - } - .gauge-region { - height: 400px; - width: 400px; - } - .data-gauge { - colors: #83f115, #fd3636, #3bf8ff; - weights: 4, 2, 1; - } - ``` - - ![](figures/gauge.png) - - +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| percent | number | 0 | 否 | 当前值占整体的百分比,取值范围为0-100。 | + + +## 样式 + + + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| stroke-width | <length> | 32px(量规)
        24px(占比类圆形图表) | 否 | 量规、占比类圆形图表组件刻度条的宽度。 | +| start-angle | <deg> | 240(量规)
        0(占比类圆形图表) | 否 | 量规、占比类圆形图表组件刻度条起始角度,以时钟0点为基线。范围为0到360。 | +| total-angle | <deg> | 240(量规)
        360(占比类圆形图表) | 否 | 量规、占比类圆形图表组件刻度条总长度,范围为-360到360,负数标识起点到终点为逆时针。 | +| center-x | <length> | - | 否 | 量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-y和radius一起配置才能生效。(仅量规图支持) | +| center-y | <length> | - | 否 | 量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-x和radius一起配置才能生效。(仅量规图支持) | +| radius | <length> | - | 否 | 量规组件刻度条半径,该样式优先于通用样式的width和height样式。该样式需要和center-x和center-y一起配置才能生效。(仅量规图支持) | +| colors | Array | - | 否 | 量规组件刻度条每一个区段的颜色。
        如:colors: \#ff0000, \#00ff00。(仅量规图支持) | +| weights | Array | - | 否 | 量规组件刻度条每一个区段的权重。
        如:weights: 2, 2。(仅量规图支持) | +| font-family5+ | Array | - | 否 | 表示绘制注释的字体样式,支持[自定义字体](../arkui-js/js-components-common-customizing-font.md)。 | +| font-size5+ | <length> | - | 否 | 表示绘制注释的字体的大小。 | + + +## 事件 + +支持[通用事件](../arkui-js/js-components-common-events.md)。 + + +## 方法 + +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: + +| 方法 | 参数 | 描述 | +| -------- | -------- | -------- | +| append | {
        serial: number, // 设置要更新的线形图数据下标
        data: Array<number>, // 设置新增的数据
        } | 往已有的数据序列中动态添加数据,根据serial指定目标序列,serial为datasets数组的下标,从0开始。注意:不会更新datasets[index].data。仅线形图支持,按横坐标加1递增(与xAxis min/max设置相关)。 | + +## 示例 + +1. 线形图 + ``` + +
        + + + + + +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + } + .chart-region { + height: 400px; + width: 700px; + } + .chart-background { + object-fit: fill; + } + .chart-data { + width: 700px; + height: 600px; + } + button { + width: 100%; + height: 50px; + background-color: #F4F2F1; + text-color: #0C81F3; + } + ``` + + ``` + // xxx.js + export default { + data: { + lineData: [ + { + strokeColor: '#0081ff', + fillColor: '#cce5ff', + data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716], + gradient: true, + } + ], + lineOps: { + xAxis: { + min: 0, + max: 20, + display: false, + }, + yAxis: { + min: 0, + max: 1000, + display: false, + }, + series: { + lineStyle: { + width: "5px", + smooth: true, + }, + headPoint: { + shape: "circle", + size: 20, + strokeWidth: 5, + fillColor: '#ffffff', + strokeColor: '#007aff', + display: true, + }, + loop: { + margin: 2, + gradient: true, + } + } + }, + }, + addData() { + this.$refs.linechart.append({ + serial: 0, + data: [Math.floor(Math.random() * 400) + 400] + }) + } + } + ``` + + ![zh-cn_image_0000001173324843](figures/zh-cn_image_0000001173324843.png) + +2. 柱状图 + ``` + +
        + + + + +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + } + .data-region { + height: 400px; + width: 700px; + } + .data-background { + object-fit: fill; + } + .data-bar { + width: 700px; + height: 400px; + } + ``` + + ``` + // xxx.js + export default { + data: { + barData: [ + { + fillColor: '#f07826', + data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628], + }, + { + fillColor: '#cce5ff', + data: [535, 776, 615, 444, 694, 785, 677, 609, 562, 410], + }, + { + fillColor: '#ff88bb', + data: [673, 500, 574, 483, 702, 583, 437, 506, 693, 657], + }, + ], + barOps: { + xAxis: { + min: 0, + max: 20, + display: false, + axisTick: 10, + }, + yAxis: { + min: 0, + max: 1000, + display: false, + }, + }, + } + } + ``` + + ![zh-cn_image_0000001173164929](figures/zh-cn_image_0000001173164929.png) + +3. 量规图 + ``` + +
        +
        + +
        +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + } + .gauge-region { + height: 400px; + width: 400px; + } + .data-gauge { + colors: #83f115, #fd3636, #3bf8ff; + weights: 4, 2, 1; + } + ``` + + ![zh-cn_image_0000001127125264](figures/zh-cn_image_0000001127125264.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-divider.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-divider.md index 0fa9d6c5941..84fa5f4274f 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-divider.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-divider.md @@ -1,210 +1,62 @@ -# divider +# divider + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 提供分隔器组件,分隔不同内容块/内容元素。可用于列表或界面布局。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        vertical

        -

        boolean

        -

        false

        -

        -

        使用水平分割线还是垂直分割线,默认水平。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->不支持focusable、disabled属性。 - -## 样式 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| vertical | boolean | false | 否 | 使用水平分割线还是垂直分割线,默认水平。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 不支持focusable、disabled属性。 + + +## 样式 仅支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        margin

        -

        <length>

        -

        0

        -

        -

        使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

        -

        margin-[left|top|right|bottom]

        -

        <length>

        -

        0

        -

        -

        使用简写属性设置左、上、右、下外边距属性,类型length,单位px,默认值0。

        -

        color

        -

        <color>

        -

        #08000000

        -

        -

        设置分割线颜色。

        -

        stroke-width

        -

        <length>

        -

        1

        -

        -

        设置分割线宽度。

        -

        display

        -

        string

        -

        flex

        -

        -

        确定分割线所产生的框的类型。值flex/none,默认值flex。

        -

        visibility

        -

        string

        -

        visible

        -

        -

        是否显示分割线。不可见的框会占用布局。visible代表显示元素,hidden代表不显示元素。

        -

        line-cap

        -

        string

        -

        butt

        -

        -

        设置分割线条的端点样式,默认为butt,可选值为:

        -
        • butt:分割线两端为平行线;
        • round:分割线两端额外添加半圆;
        • square:分割线两端额外添加半方形;
        -
        说明:

        round和square会额外增加一个线宽的分割线长度。

        -
        -

        flex

        -

        number

        -

        -

        -

        -

        规定了分割线如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>时生效。

        -
        -

        flex-grow

        -

        number

        -

        0

        -

        -

        设置分割线的伸展因子,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex项加起来的大小)的分配系数。0为不伸展。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>时生效。

        -
        -

        -

        flex-shrink

        -

        number

        -

        1

        -

        -

        设置分割线的收缩因子,flex元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>时生效。

        -
        -

        flex-basis

        -

        <length>

        -

        -

        -

        -

        -

        设置分割线在主轴方向上的初始大小。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>时生效。

        -
        -
        - -## 事件 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| margin | <length> | 0 | 否 | 使用简写属性设置所有的外边距属性,该属性可以有1到4个值。 | +| margin-[left\|top\|right\|bottom] | <length> | 0 | 否 | 使用简写属性设置左、上、右、下外边距属性,类型length,单位px,默认值0。 | +| color | <color> | \#08000000 | 否 | 设置分割线颜色。 | +| stroke-width | <length> | 1 | 否 | 设置分割线宽度。 | +| display | string | flex | 否 | 确定分割线所产生的框的类型。值flex/none,默认值flex。 | +| visibility | string | visible | 否 | 是否显示分割线。不可见的框会占用布局。visible代表显示元素,hidden代表不显示元素。 | +| line-cap | string | butt | 否 | 设置分割线条的端点样式,默认为butt,可选值为:
        - butt:分割线两端为平行线;
        - round:分割线两端额外添加半圆;
        - square:分割线两端额外添加半方形;
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > round和square会额外增加一个线宽的分割线长度。 | +| flex | number | - | 否 | 规定了分割线如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>时生效。 | +| flex-grow | number | 0 | 否 | 设置分割线的伸展因子,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex项加起来的大小)的分配系数。0为不伸展。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>时生效。 | +| flex-shrink | number | 1 | 否 | 设置分割线的收缩因子,flex元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>时生效。 | +| flex-basis | <length> | - | 否 | 设置分割线在主轴方向上的初始大小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>时生效。 | + + +## 事件 不支持。 -## 方法 + +## 方法 不支持。 -## 示例 + +## 示例 ``` @@ -240,5 +92,4 @@ } ``` -![](figures/1.jpg) - +![zh-cn_image_0000001173164799](figures/zh-cn_image_0000001173164799.jpg) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-image-animator.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-image-animator.md index dff6cc80512..114a6713ed8 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-image-animator.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-image-animator.md @@ -1,294 +1,73 @@ -# image-animator +# image-animator + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 图片帧动画播放器。 -## 子组件 + +## 子组件 不支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| images | Array<ImageFrame> | - | 是 | 设置图片帧信息集合。每一帧的帧信息包含图片路径、图片大小和图片位置信息。目前支持以下图片格式:png、jpg。ImageFrame的详细说明请见表 ImageFrame说明。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用时需要使用数据绑定的方式,如images = {{images}},js中声明相应变量:images: [{src: "/common/heart-rate01.png"}, {src: "/common/heart-rate02.png"}]。

        > js中声明相应变量:images: [{src: "/common/heart-rate01.png", duration: "100"}, {src: "/common/heart-rate02.png", duration: "200"}]。支持配置每一帧图片的时长,单位毫秒。6+ | +| predecode6+ | number | 0 | 否 | 是否启用预解码,默认值为0,即不启用预解码,如该值设为2,则播放当前页时会提前加载后面两张图片至缓存以提升性能。 | +| iteration | number \| string | infinite | 否 | 设置帧动画播放次数。number表示固定次数,infinite枚举表示无限次数播放。 | +| reverse | boolean | false | 否 | 设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。 | +| fixedsize | boolean | true | 否 | 设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的 width 、height 、top和left属性都要单独设置。 | +| duration | string | - | 是 | 设置单次播放时长。单位支持[s(秒)\|ms(毫秒)],默认单位为ms。 duration为0时,不播放图片。 值改变只会在下一次循环开始时生效,当images中设置了单独的duration后,该属性设置无效。 | +| fillmode5+ | string | forwards | 否 | 指定帧动画执行结束后的状态。可选项有:
        - none:恢复初始状态。
        - forwards:保持帧动画结束时的状态(在最后一个关键帧中定义)。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        images

        -

        Array<ImageFrame>

        -

        -

        -

        -

        设置图片帧信息集合。每一帧的帧信息包含图片路径、图片大小和图片位置信息。目前支持以下图片格式:png、jpg。ImageFrame的详细说明请见表1

        -
        说明:

        使用时需要使用数据绑定的方式,如images = {{images}},js中声明相应变量:images: [{src: "/common/heart-rate01.png"}, {src: "/common/heart-rate02.png"}]。

        -

        js中声明相应变量:images: [{src: "/common/heart-rate01.png", duration: "100"}, {src: "/common/heart-rate02.png", duration: "200"}]。支持配置每一帧图片的时长,单位毫秒。6+

        -
        -

        predecode6+

        -

        number

        -

        0

        -

        -

        是否启用预解码,默认值为0,即不启用预解码,如该值设为2,则播放当前页时会提前加载后面两张图片至缓存以提升性能。

        -

        iteration

        -

        number | string

        -

        infinite

        -

        -

        设置帧动画播放次数。number表示固定次数,infinite枚举表示无限次数播放。

        -

        reverse

        -

        boolean

        -

        false

        -

        -

        设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。

        -

        fixedsize

        -

        boolean

        -

        true

        -

        -

        设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的 width 、height 、top和left属性都要单独设置。

        -

        duration

        -

        string

        -

        -

        -

        -

        设置单次播放时长。单位支持[s(秒)|ms(毫秒)],默认单位为ms。 duration为0时,不播放图片。 值改变只会在下一次循环开始时生效,当images中设置了单独的duration后,该属性设置无效。

        -

        fillmode5+

        -

        string

        -

        forwards

        -

        -

        指定帧动画执行结束后的状态。可选项有:

        -
        • none:恢复初始状态。
        • forwards:保持帧动画结束时的状态(在最后一个关键帧中定义)。
        -
        +**表1** ImageFrame说明 -**表 1** ImageFrame说明 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| src | <uri> | - | 是 | 图片路径,图片格式为svg,png和jpg。 | +| width | <length> | 0 | 否 | 图片宽度。 | +| height | <length> | 0 | 否 | 图片高度。 | +| top | <length> | 0 | 否 | 图片相对于组件左上角的纵向坐标。 | +| left | <length> | 0 | 否 | 图片相对于组件左上角的横向坐标。 | +| duration6+ | number | - | 否 | 每一帧图片的播放时长,单位毫秒。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        src

        -

        <uri>

        -

        -

        -

        -

        图片路径,图片格式为svg,png和jpg

        -

        width

        -

        <length>

        -

        0

        -

        -

        图片宽度。

        -

        height

        -

        <length>

        -

        0

        -

        -

        图片高度。

        -

        top

        -

        <length>

        -

        0

        -

        -

        图片相对于组件左上角的纵向坐标。

        -

        left

        -

        <length>

        -

        0

        -

        -

        图片相对于组件左上角的横向坐标。

        -

        duration6+

        -

        number

        -

        -

        -

        -

        每一帧图片的播放时长,单位毫秒。

        -
        -## 样式 +## 样式 -支持[通用样式](js-components-common-styles.md)。 +支持[通用样式](../arkui-js/js-components-common-styles.md)。 -## 事件 -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +## 事件 - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        start

        -

        -

        -

        帧动画启动时触发。

        -

        pause

        -

        -

        -

        帧动画暂停时触发。

        -

        stop

        -

        -

        -

        帧动画结束时触发。

        -

        resume

        -

        -

        -

        帧动画恢复时触发。

        -
        +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -## 方法 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| start | - | 帧动画启动时触发。 | +| pause | - | 帧动画暂停时触发。 | +| stop | - | 帧动画结束时触发。 | +| resume | - | 帧动画恢复时触发。 | -支持[通用方法](js-components-common-methods.md)外,还支持如下方法: - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        start

        -

        -

        -

        开始播放图片帧动画。再次调用,重新从第1帧开始播放。

        -

        pause

        -

        -

        -

        暂停播放图片帧动画。

        -

        stop

        -

        -

        -

        停止播放图片帧动画。

        -

        resume

        -

        -

        -

        继续播放图片帧。

        -

        getState

        -

        -

        -

        获取播放状态。可能值有:

        -
        • playing:播放中
        • paused:已暂停
        • stopped:已停止。
        -
        +## 方法 -## 示例 +支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| start | - | 开始播放图片帧动画。再次调用,重新从第1帧开始播放。 | +| pause | - | 暂停播放图片帧动画。 | +| stop | - | 停止播放图片帧动画。 | +| resume | - | 继续播放图片帧。 | +| getState | - | 获取播放状态。可能值有:
        - playing:播放中
        - paused:已暂停
        - stopped:已停止。 | + + +## 示例 ``` @@ -411,5 +190,4 @@ export default { }; ``` -![](figures/image-animator.gif) - +![zh-cn_image_0000001127284946](figures/zh-cn_image_0000001127284946.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-image.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-image.md index 0983d9d7615..c6551400e9c 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-image.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-image.md @@ -1,209 +1,83 @@ -# image +# image + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 图片组件,用来渲染展示图片。 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        src

        -

        string

        -

        -

        -

        -

        图片的路径,支持本地路径,图片格式包括png、jpg、bmp、svg和gif。

        -

        支持Base64字符串6+。格式为data:image/[png | jpeg | bmp | webp];base64, [base64 data], 其中[base64 data]为Base64字符串数据。

        -

        支持dataability://的路径前缀,用于访问通过data ability提供的图片路径6+

        -

        alt

        -

        string

        -

        -

        -

        -

        占位图,当指定图片在加载中时显示。

        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        object-fit

        -

        string

        -

        cover

        -

        -

        设置图片的缩放类型。可选值类型说明请见object-fit 类型说明。(不支持svg格式)

        -

        match-text-direction

        -

        boolean

        -

        false

        -

        -

        图片是否跟随文字方向。(不支持svg格式)

        -

        fit-original-size

        -

        boolean

        -

        false

        -

        -

        image组件在未设置宽高的情况下是否适应图源尺寸(该属性为true时object-fit属性不生效),svg类型图源不支持该属性。

        -

        object-position7+

        -

        string

        -

        0px 0px

        -

        -

        设置图片在组件内展示的位置。

        -

        设置类型有两种:

        -

        1. 像素,单位px,示例 15px 15px 代表X轴或者Y轴移动的位置

        -

        2. 字符,可选值:

        -
        • left 图片显示在组件左侧;
        • top 图片显示在组件顶部位置;
        • right 图片显示在组件右侧位置;
        • bottom图片显示在组件底部位置。
        -
        - -**表 1** object-fit 类型说明 - - - - - - - - - - - - - - - - - - - - - - -

        类型

        -

        描述

        -

        cover

        -

        保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界,居中显示。

        -

        contain

        -

        保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内,居中显示。

        -

        fill

        -

        不保持宽高比进行放大缩小,使得图片填充满显示边界。

        -

        none

        -

        保持原有尺寸进行居中显示。

        -

        scale-down

        -

        保持宽高比居中显示,图片缩小或者保持不变。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->使用svg图片资源时: ->- 建议设置image组件的长宽,否则在父组件的长或宽为无穷大的场景下,svg资源将不会绘制; ->- 如果svg描述中未指定相应的长宽,则svg将会填满image组件区域; ->- 如果svg描述中指定了相应的长宽,和image组件本身的长宽效果如下: ->1. 如果image组件本身的长宽小于svg中的长宽,svg会被裁切,仅显示左上角部分; ->2. 如果image组件本身的长宽大于svg中的长宽,svg会被放置在image组件的左上角,image组件其他部分显示空白。 - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        complete(Rich)

        -

        { width:width, height:height }

        -

        图片成功加载时触发该回调,返回成功加载的图源尺寸。

        -

        error(Rich)

        -

        { width:width, height:height }

        -

        图片加载出现异常时触发该回调,异常时长宽为零。

        -
        - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| src | string | - | 否 | 图片的路径,支持本地路径,图片格式包括png、jpg、bmp、svg和gif。
        支持Base64字符串6+。格式为data:image/[png \| jpeg \| bmp \| webp];base64, [base64 data], 其中[base64 data]为Base64字符串数据。
        支持dataability://的路径前缀,用于访问通过data ability提供的图片路径6+。 | +| alt | string | - | 否 | 占位图,当指定图片在加载中时显示。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| object-fit | string | cover | 否 | 设置图片的缩放类型。可选值类型说明请见object-fit 类型说明。(不支持svg格式) | +| match-text-direction | boolean | false | 否 | 图片是否跟随文字方向。(不支持svg格式) | +| fit-original-size | boolean | false | 否 | image组件在未设置宽高的情况下是否适应图源尺寸(该属性为true时object-fit属性不生效),svg类型图源不支持该属性。 | +| object-position7+ | string | 0px 0px | 否 | 设置图片在组件内展示的位置。
        设置类型有两种:
        1. 像素,单位px,示例 15px 15px 代表X轴或者Y轴移动的位置
        2. 字符,可选值:
        - left 图片显示在组件左侧;
        - top 图片显示在组件顶部位置;
        - right 图片显示在组件右侧位置;
        - bottom 图片显示在组件底部位置。 | + +**表1** object-fit 类型说明 + +| 类型 | 描述 | +| -------- | -------- | +| cover | 保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界,居中显示。 | +| contain | 保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内,居中显示。 | +| fill | 不保持宽高比进行放大缩小,使得图片填充满显示边界。 | +| none | 保持原有尺寸进行居中显示。 | +| scale-down | 保持宽高比居中显示,图片缩小或者保持不变。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 使用svg图片资源时: +> +> - 建议设置image组件的长宽,否则在父组件的长或宽为无穷大的场景下,svg资源将不会绘制; +> +> - 如果svg描述中未指定相应的长宽,则svg将会填满image组件区域; +> +> - 如果svg描述中指定了相应的长宽,和image组件本身的长宽效果如下: +> +> 1. 如果image组件本身的长宽小于svg中的长宽,svg会被裁切,仅显示左上角部分; +> +> 2. 如果image组件本身的长宽大于svg中的长宽,svg会被放置在image组件的左上角,image组件其他部分显示空白。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| complete(Rich) | { width:width, height:height } | 图片成功加载时触发该回调,返回成功加载的图源尺寸。 | +| error(Rich) | { width:width, height:height } | 图片加载出现异常时触发该回调,异常时长宽为零。 | + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ```
        - + - + <select class="selects" onchange="change_fit"><option for="{{fits}}" value="{{$item}}">{{$item}}</option></select>
        ``` @@ -214,12 +88,11 @@ align-items: center; flex-direction: column; - } .selects{ margin-top: 20px; width:300px; - border:1px solid #808080; + border:1px solid \#808080; border-radius: 10px; } ``` @@ -237,5 +110,6 @@ export default { } ``` -![](figures/GIF.gif) +![zh-cn_image_0000001127284936](figures/zh-cn_image_0000001127284936.gif) + diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-input.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-input.md index 7cb69055611..215d9960e36 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-input.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-input.md @@ -1,606 +1,238 @@ -# input +# input + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 交互式组件,包括单选框,多选框,按钮和单行文本输入框。 -## 权限列表 +## 权限列表 无 -## 子组件 -不支持。 +## 子组件 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        text

        -

        -

        input组件类型,可选值为text,email,date,time,number,password,button,checkbox,radio。

        -

        其中text,email,date,time,number,password这六种类型之间支持动态切换修改。

        -

        button,checkbox,radio不支持动态修改。可选值定义如下:

        -
        • button:定义可点击的按钮;
        • checkbox:定义多选框;
        • radio:定义单选按钮,允许在多个拥有相同name值的选项中选中其中一个;
        • text:定义一个单行的文本字段
        • email:定义用于e-mail地址的字段;
        • date:定义 date 控件(包括年、月、日,不包括时间);
        • time:定义用于输入时间的控件(不带时区);
        • number:定义用于输入数字的字段;
        • password:定义密码字段(字段中的字符会被遮蔽)。
          说明:

          智能穿戴仅支持button、radio、checkbox类型。

          -
          -
        -

        checked

        -

        boolean

        -

        false

        -

        -

        当前组件是否选中,仅type为checkbox和radio生效。

        -

        name

        -

        string

        -

        -

        -

        -

        input组件的名称。

        -

        value

        -

        string

        -

        -

        -

        -

        input组件的value值,当类型为radio时必填且相同name值的选项该值唯一。

        -

        placeholder

        -

        string

        -

        -

        -

        -

        设置提示文本的内容,仅在type为text|email|date|time|number|password时生效。

        -

        maxlength

        -

        number

        -

        -

        -

        -

        输入框可输入的最多字符数量,不填表示不限制输入框中字符数量。

        -

        enterkeytype

        -

        string

        -

        default

        -

        -

        不支持动态修改。

        -

        设置软键盘Enter按钮的类型,可选值为:

        -
        • default:默认
        • next:下一项
        • go:前往
        • done:完成
        • send:发送
        • search:搜索
        -
        说明:

        除“next”外,点击后会自动收起软键盘。

        -
        -

        headericon

        -

        string

        -

        -

        -

        -

        在文本输入前的图标资源路径,该图标不支持点击事件(button,checkbox和radio不生效),图标格式为jpg,png和svg。

        -

        showcounter5+

        -

        boolean

        -

        false

        -

        -

        文本输入框是否显示计数下标,需要配合maxlength一起使用。

        -

        menuoptions5+

        -

        Array<MenuOption>

        -

        -

        -

        -

        设置文本选择弹框点击更多按钮之后显示的菜单项。

        -

        autofocus6+

        -

        boolean

        -

        false

        -

        -

        是否自动获焦。

        -
        说明:

        应用首页中设置不生效,可在onActive中延迟(100-500ms左右)调用focus方法实现输入框在首页中自动获焦。

        -
        -

        selectedstart6+

        -

        number

        -

        -1

        -

        -

        开始选择文本时初始选择位置。

        -

        selectedend6+

        -

        number

        -

        -1

        -

        -

        开始选择文本时结尾选择位置。

        -

        softkeyboardenabled6+

        -

        boolean

        -

        true

        -

        -

        编辑时是否弹出系统软键盘。

        -

        showpasswordicon6+

        -

        boolean

        -

        true

        -

        -

        是否显示密码框末尾的图标(仅type为password时生效)。

        -
        - -**表 1** MenuOption5+ - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        描述

        -

        icon

        -

        string

        -

        菜单选项中的图标路径。

        -

        content

        -

        string

        -

        菜单选项中的文本内容。

        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e6000000

        -

        -

        单行输入框或者按钮的文本颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        单行输入框或者按钮的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        单行输入框或者按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        placeholder-color

        -

        <color>

        -

        #99000000

        -

        -

        单行输入框的提示文本的颜色,type为text|email|date|time|number|password时生效。

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        单行输入框或者按钮的字体粗细,见text组件font-weight的样式属性

        -

        caret-color6+

        -

        <color>

        -

        -

        -

        -

        设置输入光标的颜色。

        -
        - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - -- 当input类型为text、email、date、time、number、password时,支持如下事件: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { value:inputValue }

        -

        输入框输入内容发生变化时触发该事件,返回用户当前输入值。

        -
        说明:

        改变value属性值不会触发该回调。

        -
        -

        enterkeyclick

        -

        { value:enterKey }

        -

        软键盘enter键点击后触发该事件,返回enter按钮的类型,enterKey类型为number,可选值为:

        -
        • 2:设置enterkeytype属性为go时生效。
        • 3:设置enterkeytype属性为search时生效。
        • 4:设置enterkeytype属性为send时生效。
        • 5:设置enterkeytype属性为next时生效。
        • 6:不设置enterkeytype或者设置enterkeytype属性为default、done时生效。
        -

        translate5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。

        -

        share5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。

        -

        search5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。

        -

        optionselect5+

        -

        { index:optionIndex, value: selectedText }

        -

        文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。

        -

        selectchange6+

        -

        { start: number,end: number }

        -

        文本选择变化时触发事件。

        -
        - -- 当input类型为checkbox、radio时,支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { checked:true | false }

        -

        checkbox多选框或radio单选框的checked状态发生变化时触发该事件。

        -
        - - -## 方法 - -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        focus

        -

        { focus: true|false },focus不传默认为true。

        -

        使组件获得或者失去焦点,type为text|email|date|time|number|password时,可弹出或收起输入法。

        -

        showError

        -

        { error: string }

        -

        展示输入错误提示,type为text|email|date|time|number|password时生效。

        -

        delete6+

        -

        -

        -

        type为text|email|date|time|number|password时,根据当前光标位置删除文本内容,如果当前输入组件没有光标,默认删除最后一个字符并展示光标。

        -
        - -## 示例 - -1. type为text - - ``` - -
        - - - -
        - ``` - - ``` - /* xxx.css */ - .content { - width: 60%; - flex-direction: column; - align-items: center; - } - .input { - placeholder-color: gray; - } - .button { - background-color: gray; - margin-top: 20px; - } - ``` - - ``` - // xxx.js - import prompt from '@system.prompt' - export default { - change(e){ - prompt.showToast({ - message: "value: " + e.value, - duration: 3000, - }); - }, - enterkeyClick(e){ - prompt.showToast({ - message: "enterkey clicked", - duration: 3000, - }); - }, - buttonClick(e){ - this.$element("input").showError({ - error: 'error text' - }); - }, - } - ``` - - ![](figures/zh-cn_image_0000001127284984.png) - -2. type为button - - ``` - -
        - -
        - ``` - - ``` - /* xxx.css */ - .div-button { - flex-direction: column; - align-items: center; - - - } - .button { - margin-top: 30px; - width: 280px; - } - ``` - - ![](figures/zh-cn_image_0000001198898293.png) - -3. type为checkbox - - ``` - -
        - - -
        - ``` - - ``` - /* xxx.css */ - .content{ - width: 100%; - height: 200px; - - - align-items: center; - justify-content: center; - } - ``` - - ``` - // xxx.js - import prompt from '@system.prompt' - export default { - checkboxOnChange(e) { - prompt.showToast({ - message:'checked: ' + e.checked, - duration: 3000, - }); - } - } - ``` - - ![](figures/zh-cn_image_0000001173324749.png) - -4. type为radio - - ``` - -
        - - - -
        - ``` - - ``` - /* xxx.css */ - .content{ - width: 100%; - height: 200px; - justify-content: center; - align-items: center; - } - ``` - - ``` - // xxx.js - import prompt from '@system.prompt' - export default { - onRadioChange(inputValue, e) { - if (inputValue === e.value) { - prompt.showToast({ - message: 'The chosen radio is ' + e.value, - duration: 3000, - }); - } - } - } - ``` - - ![](figures/zh-cn_image_0000001173324751.png) +不支持。 +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | text
        | 否 | input组件类型,可选值为text,email,date,time,number,password,button,checkbox,radio。
        其中text,email,date,time,number,password这六种类型之间支持动态切换修改。
        button,checkbox,radio不支持动态修改。可选值定义如下:
        - button:定义可点击的按钮;
        - checkbox:定义多选框;
        - radio:定义单选按钮,允许在多个拥有相同name值的选项中选中其中一个;
        - text:定义一个单行的文本字段;
        - email:定义用于e-mail地址的字段;
        - date:定义 date 控件(包括年、月、日,不包括时间);
        - time:定义用于输入时间的控件(不带时区);
        - number:定义用于输入数字的字段;
        - password:定义密码字段(字段中的字符会被遮蔽)。 | +| checked | boolean | false | 否 | 当前组件是否选中,仅type为checkbox和radio生效。 | +| name | string | - | 否 | input组件的名称。 | +| value | string | - | 否 | input组件的value值,当类型为radio时必填且相同name值的选项该值唯一。 | +| placeholder | string | - | 否 | 设置提示文本的内容,仅在type为text\|email\|date\|time\|number\|password时生效。 | +| maxlength | number | - | 否 | 输入框可输入的最多字符数量,不填表示不限制输入框中字符数量。 | +| enterkeytype | string | default | 否 | 不支持动态修改。
        设置软键盘Enter按钮的类型,可选值为:
        - default:默认
        - next:下一项
        - go:前往
        - done:完成
        - send:发送
        - search:搜索
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 除“next”外,点击后会自动收起软键盘。 | +| headericon | string | - | 否 | 在文本输入前的图标资源路径,该图标不支持点击事件(button,checkbox和radio不生效),图标格式为jpg,png和svg。 | +| showcounter5+ | boolean | false | 否 | 文本输入框是否显示计数下标,需要配合maxlength一起使用。 | +| menuoptions5+ | Array<MeunOption> | - | 否 | 设置文本选择弹框点击更多按钮之后显示的菜单项。 | +| autofocus6+ | boolean | false | 否 | 是否自动获焦。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 应用首页中设置不生效,可在onActive中延迟(100-500ms左右)调用focus方法实现输入框在首页中自动获焦。 | +| selectedstart6+ | number | -1 | 否 | 开始选择文本时初始选择位置。 | +| selectedend6+ | number | -1 | 否 | 开始选择文本时结尾选择位置。 | +| softkeyboardenabled6+ | boolean | true | 否 | 编辑时是否弹出系统软键盘。 | +| showpasswordicon6+ | boolean | true | 否 | 是否显示密码框末尾的图标(仅type为password时生效)。 | + +**表1** MenuOption5+ + +| 名称 | 类型 | 描述 | +| -------- | -------- | -------- | +| icon | string | 菜单选项中的图标路径。 | +| content | string | 菜单选项中的文本内容。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#e6000000 | 否 | 单行输入框或者按钮的文本颜色。 | +| font-size | <length> | 16px | 否 | 单行输入框或者按钮的文本尺寸。 | +| allow-scale | boolean | true | 否 | 单行输入框或者按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| placeholder-color | <color> | \#99000000 | 否 | 单行输入框的提示文本的颜色,type为text\|email\|date\|time\|number\|password时生效。 | +| font-weight | number \| string | normal | 否 | 单行输入框或者按钮的字体粗细,见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| caret-color6+ | <color> | - | 否 | 设置输入光标的颜色。 | + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +- 当input类型为text、email、date、time、number、password时,支持如下事件: + | 名称 | 参数 | 描述 | + | -------- | -------- | -------- | + | change | { value:inputValue } | 输入框输入内容发生变化时触发该事件,返回用户当前输入值。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 改变value属性值不会触发该回调。 | + | enterkeyclick | { value:enterKey } | 软键盘enter键点击后触发该事件,返回enter按钮的类型,enterKey类型为number,可选值为:
        - 2:设置enterkeytype属性为go时生效。
        - 3:设置enterkeytype属性为search时生效。
        - 4:设置enterkeytype属性为send时生效。
        - 5:设置enterkeytype属性为next时生效。
        - 6:不设置enterkeytype或者设置enterkeytype属性为default、done时生效。 | + | translate5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。 | + | share5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。 | + | search5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。 | + | optionselect5+ | { index:optionIndex, value: selectedText } | 文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。 | + | selectchange6+ | { start: number,end: number } | 文本选择变化时触发事件。 | + +- 当input类型为checkbox、radio时,支持如下事件: + | 名称 | 参数 | 描述 | + | -------- | -------- | -------- | + | change | { checked:true \| false } | checkbox多选框或radio单选框的checked状态发生变化时触发该事件。 | + +## 方法 + +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| focus | { focus: true\|false },focus不传默认为true。 | 使组件获得或者失去焦点,type为text\|email\|date\|time\|number\|password时,可弹出或收起输入法。 | +| showError | { error: string } | 展示输入错误提示,type为text\|email\|date\|time\|number\|password时生效。 | +| delete6+ | - | type为text\|email\|date\|time\|number\|password时,根据当前光标位置删除文本内容,如果当前输入组件没有光标,默认删除最后一个字符并展示光标。 | + +## 示例 + +1. type为text + ``` + +
        + + + +
        + ``` + + ``` + /* xxx.css */ + .content { + width: 60%; + flex-direction: column; + align-items: center; + } + .input { + placeholder-color: gray; + } + .button { + background-color: gray; + margin-top: 20px; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt' + export default { + change(e){ + prompt.showToast({ + message: "value: " + e.value, + duration: 3000, + }); + }, + enterkeyClick(e){ + prompt.showToast({ + message: "enterkey clicked", + duration: 3000, + }); + }, + buttonClick(e){ + this.$element("input").showError({ + error: 'error text' + }); + }, + } + ``` + + ![zh-cn_image_0000001252835901](figures/zh-cn_image_0000001252835901.png) + +2. type为button + ``` + +
        + +
        + ``` + + ``` + /* xxx.css */ + .div-button { + flex-direction: column; + align-items: center; + } + .button { + margin-top: 30px; + width: 280px; + } + ``` + + ![zh-cn_image_0000001207995958](figures/zh-cn_image_0000001207995958.png) + +3. type为checkbox + ``` + +
        + +
        + ``` + + ``` + /* xxx.css */ + .content{ + width: 100%; + height: 200px; + align-items: center; + justify-content: center; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt' + export default { + checkboxOnChange(e) { + prompt.showToast({ + message:'checked: ' + e.checked, + duration: 3000, + }); + } + } + ``` + + ![zh-cn_image_0000001208155956](figures/zh-cn_image_0000001208155956.png) + +4. type为radio + ``` + +
        + + + +
        + ``` + + ``` + /* xxx.css */ + .content{ + width: 100%; + height: 200px; + justify-content: center; + align-items: center; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt' + export default { + onRadioChange(inputValue, e) { + if (inputValue === e.value) { + prompt.showToast({ + message: 'The chosen radio is ' + e.value, + duration: 3000, + }); + } + } + } + ``` + + ![zh-cn_image_0000001208315918](figures/zh-cn_image_0000001208315918.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-label.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-label.md index b411b26956e..cfa7a4a4389 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-label.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-label.md @@ -1,261 +1,64 @@ -# label +# label + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 为input、button、textarea组件定义相应的标注,点击该标注时会触发绑定组件的点击效果。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| target | string | - | 否 | 目标组件的属性id值。 | - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        target

        -

        string

        -

        -

        -

        -

        目标组件的属性id值。

        -
        -## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e5000000

        -

        -

        设置文本的颜色。

        -

        font-size

        -

        <length>

        -

        30px

        -

        -

        设置文本的尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果需要支持动态生效,请参看config描述文件中config-changes标签。

        -
        -

        letter-spacing

        -

        <length>

        -

        0px

        -

        -

        设置文本的字符间距。

        -

        font-style

        -

        string

        -

        normal

        -

        -

        设置文本的字体样式,可选值为:

        -
        • normal:标准的字体样式;
        • italic:斜体的字体样式。
        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。

        -
        说明:

        number取值必须为100的整数倍。

        -
        -

        string类型取值支持如下四个值:lighter、normal、bold、bolder。

        -

        text-decoration

        -

        string

        -

        none

        -

        -

        设置文本的文本修饰,可选值为:

        -
        • underline:文字下划线修饰;
        • line-through:穿过文本的修饰线n
        • none:标准文本。
        -

        text-align

        -

        string

        -

        start

        -

        -

        设置文本的文本对齐方式,可选值为:

        -
        • left:文本左对齐;
        • center:文本居中对齐;
        • right:文本右对齐;
        • start:根据文字书写相同的方向对齐;
        • end:根据文字书写相反的方向对齐。
        -
        说明:

        如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。

        -
        -

        line-height

        -

        <length>

        -

        0px

        -

        -

        设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。

        -

        text-overflow

        -

        string

        -

        clip

        -

        -

        在设置了最大行数的情况下生效,可选值为:

        -
        • clip:将文本根据父容器大小进行裁剪显示;
        • ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。
        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -

        max-lines

        -

        number

        -

        -

        -

        -

        设置文本的最大行数。

        -

        min-font-size

        -

        <length>

        -

        -

        -

        -

        文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

        -

        max-font-size

        -

        <length>

        -

        -

        -

        -

        文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

        -

        font-size-step

        -

        <length>

        -

        1px

        -

        -

        文本动态调整字号时的步长,需要设置最小,最大字号样式生效。

        -

        prefer-font-sizes

        -

        <array>

        -

        -

        -

        -

        预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。

        -

        如:prefer-font-sizes: 12px,14px,16px

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | #e5000000 | 否 | 设置文本的颜色。 | +| font-size | <length> | 30px | 否 | 设置文本的尺寸。 | +| allow-scale | boolean | true | 否 | 文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果需要支持动态生效,请参看config描述文件中config-changes标签。 | +| letter-spacing | <length> | 0px | 否 | 设置文本的字符间距。 | +| font-style | string | normal | 否 | 设置文本的字体样式,可选值为:
        - normal:标准的字体样式;
        - italic:斜体的字体样式。 | +| font-weight | number \| string | normal | 否 | 设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > number取值必须为100的整数倍。
        string类型取值支持如下四个值:lighter、normal、bold、bolder。 | +| text-decoration | string | none | 否 | 设置文本的文本修饰,可选值为:
        - underline:文字下划线修饰;
        - line-through:穿过文本的修饰线n
        - none:标准文本。 | +| text-align | string | start
        | 否 | 设置文本的文本对齐方式,可选值为:
        - left:文本左对齐;
        - center:文本居中对齐;
        - right:文本右对齐;
        - start:根据文字书写相同的方向对齐;
        - end:根据文字书写相反的方向对齐。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。 | +| line-height | <length> | 0px | 否 | 设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。 | +| text-overflow | string | clip | 否 | 在设置了最大行数的情况下生效,可选值为:
        - clip:将文本根据父容器大小进行裁剪显示;
        - ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。 | +| font-family | string | sans-serif | 否 | 设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | +| max-lines | number | - | 否 | 设置文本的最大行数。 | +| min-font-size | <length> | - | 否 | 文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。 | +| max-font-size | <length> | - | 否 | 文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。 | +| font-size-step | <length> | 1px | 否 | 文本动态调整字号时的步长,需要设置最小,最大字号样式生效。 | +| prefer-font-sizes | <array> | - | 否 | 预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。
        如:prefer-font-sizes: 12px,14px,16px | -## 事件 + +## 事件 不支持。 -## 方法 + +## 方法 不支持。 -## 示例 + +## 示例 ``` @@ -294,5 +97,4 @@ } ``` -![](figures/zh-cn_image_0000001152834002.png) - +![zh-cn_image_0000001152834002](figures/zh-cn_image_0000001152834002.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-marquee.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-marquee.md index efc07b40de3..94d3f55c402 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-marquee.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-marquee.md @@ -1,209 +1,65 @@ -# marquee +# marquee + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 跑马灯组件,用于展示一段单行滚动的文字。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| scrollamount | number | 6 | 否 | 跑马灯每次滚动时移动的最大长度。 | +| loop | number | -1 | 否 | 跑马灯滚动的次数。如果未指定,则默认值为-1,当该值小于等于零时表示marquee将连续滚动。 | +| direction | string | left | 否 | 设置跑马灯的文字滚动方向,可选值为left和right。 | - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        scrollamount

        -

        number

        -

        6

        -

        -

        跑马灯每次滚动时移动的最大长度。

        -

        loop

        -

        number

        -

        -1

        -

        -

        跑马灯滚动的次数。如果未指定,则默认值为-1,当该值小于等于零时表示marquee将连续滚动。

        -

        direction

        -

        string

        -

        left

        -

        -

        设置跑马灯的文字滚动方向,可选值为left和right。

        -
        -## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e5000000

        -

        -

        设置跑马灯中文字的文本颜色。

        -

        font-size

        -

        <length>

        -

        37.5

        -

        -

        设置跑马灯中文字的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        设置跑马灯中文字的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        设置跑马灯中文字的字体的粗细,见text组件font-weight的样式属性

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        设置跑马灯中文字的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#e5000000 | 否 | 设置跑马灯中文字的文本颜色。 | +| font-size | <length> | 37.5 | 否 | 设置跑马灯中文字的文本尺寸。 | +| allow-scale | boolean | true | 否 | 设置跑马灯中文字的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| font-weight | number \| string | normal | 否 | 设置跑马灯中文字的字体的粗细,见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | string | sans-serif | 否 | 设置跑马灯中文字的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | -## 事件 -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +## 事件 - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        bounce(Rich)

        -

        -

        -

        当文本滚动到末尾时触发该事件。

        -

        finish(Rich)

        -

        -

        -

        当完成滚动次数时触发该事件。需要在 loop 属性值大于 0 时触发。

        -

        start(Rich)

        -

        -

        -

        当文本滚动开始时触发该事件。

        -
        +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -## 方法 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| bounce(Rich) | - | 当文本滚动到末尾时触发该事件。 | +| finish(Rich) | - | 当完成滚动次数时触发该事件。需要在 loop 属性值大于 0 时触发。 | +| start(Rich) | - | 当文本滚动开始时触发该事件。 | -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: +## 方法 - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        start

        -

        -

        -

        开始滚动。

        -

        stop

        -

        -

        -

        停止滚动。

        -
        +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: -## 示例 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| start | - | 开始滚动。 | +| stop | - | 停止滚动。 | + + +## 示例 ``` @@ -275,5 +131,6 @@ export default { } ``` -![](figures/sample1.gif) +![zh-cn_image_0000001127284934](figures/zh-cn_image_0000001127284934.gif) + diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-menu.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-menu.md index 4e65ea084a6..bdb2d032b1f 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-menu.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-menu.md @@ -1,221 +1,68 @@ -# menu +# menu + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 提供菜单组件,作为临时性弹出窗口,用于展示用户可执行的操作。 -## 权限列表 +## 权限列表 无 -## 子组件 -<[option](js-components-basic-option.md)\>子组件。 +## 子组件 + +<[option](../arkui-js/js-components-basic-option.md)>子组件。 + + +## 属性 -## 属性 +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性:↵ -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性:↵ +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| target | string | - | 否 | 目标元素选择器。当使用目标元素选择器后,点击目标元素会自动弹出menu菜单。弹出菜单位置优先为目标元素右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。 | +| type | string | click | 否 | 目标元素触发弹窗的方式,可选值有:
        - click:点击弹窗。
        - longpress:长按弹窗。 | +| title | string | - | 否 | 菜单标题内容。 | - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        target

        -

        string

        -

        -

        -

        -

        目标元素选择器。当使用目标元素选择器后,点击目标元素会自动弹出menu菜单。弹出菜单位置优先为目标元素右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。

        -

        type

        -

        string

        -

        click

        -

        -

        目标元素触发弹窗的方式,可选值有:

        -
        • click:点击弹窗。
        • longpress:长按弹窗。
        -

        title

        -

        string

        -

        -

        -

        -

        菜单标题内容。

        -
        +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 不支持focusable、disabled属性。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->不支持focusable、disabled属性。 -## 样式 +## 样式 仅支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        text-color

        -

        <color>

        -

        -

        -

        -

        设置菜单的文本颜色。

        -

        font-size

        -

        <length>

        -

        30px

        -

        -

        设置菜单的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        设置菜单的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        letter-spacing

        -

        <length>

        -

        0

        -

        -

        设置菜单的字符间距。

        -

        font-style

        -

        string

        -

        normal

        -

        -

        设置菜单的字体样式。见text组件font-style的样式属性

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        设置菜单的字体粗细。见text组件font-weight的样式属性

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        设置菜单的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| text-color | <color> | - | 否 | 设置菜单的文本颜色。 | +| font-size | <length> | 30px | 否 | 设置菜单的文本尺寸。 | +| allow-scale | boolean | true | 否 | 设置菜单的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| letter-spacing | <length> | 0 | 否 | 设置菜单的字符间距。 | +| font-style | string | normal | 否 | 设置菜单的字体样式。见[text组件font-style的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-weight | number \| string | normal | 否 | 设置菜单的字体粗细。见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | string | sans-serif | 否 | 设置菜单的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | -## 事件 + +## 事件 仅支持如下事件: - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        selected

        -

        { value:value }

        -

        菜单中某个值被点击选中时触发,返回的value值为option组件的value属性。

        -

        cancel

        -

        -

        -

        用户取消。

        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| selected | { value:value } | 菜单中某个值被点击选中时触发,返回的value值为option组件的value属性。 | +| cancel | - | 用户取消。 | + -## 方法 +## 方法 仅支持如下方法。 - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        show

        -

        { x:x, y:y }

        -

        显示menu菜单。(x, y)指定菜单弹窗位置。其中x表示距离可见区域左边沿的 X 轴坐标,不包含任何滚动偏移,y表示距离可见区域上边沿的 Y 轴坐标,不包含任何滚动偏移以及状态栏。菜单优先显示在弹窗位置右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。

        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| show | { x:x,  y:y } | 显示menu菜单。(x, y)指定菜单弹窗位置。其中x表示距离可见区域左边沿的 X 轴坐标,不包含任何滚动偏移,y表示距离可见区域上边沿的 Y 轴坐标,不包含任何滚动偏移以及状态栏。菜单优先显示在弹窗位置右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。 | -## 示例 +## 示例 ``` @@ -256,5 +103,4 @@ export default { } ``` -![](figures/menu13.gif) - +![zh-cn_image_0000001131795738](figures/zh-cn_image_0000001131795738.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-option.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-option.md index 9106a3e8cad..3e64a270020 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-option.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-option.md @@ -1,167 +1,59 @@ -# option +# option -当作为<[select](js-components-basic-select.md)\>的子组件时用来展示下拉选择的具体项目。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -当作为<[menu](js-components-basic-menu.md)\>的子组件时用来展示弹出菜单的具体项目。 +当作为<[select](../arkui-js/js-components-basic-select.md)>的子组件时用来展示下拉选择的具体项目。 -## 权限列表 + +当作为<[menu](../arkui-js/js-components-basic-menu.md)>的子组件时用来展示弹出菜单的具体项目。 + + +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性:↵ - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        selected

        -

        boolean

        -

        -

        -

        -

        选择项是否为下拉列表的默认项,仅在父组件是select时生效。

        -

        value

        -

        string

        -

        -

        -

        -

        选择项的值,作为select、menu父组件的selected事件中的返回值。

        -
        说明:

        option选项的UI展示值需要放在标签内,如<option value="10">十月</option>

        -
        -

        icon

        -

        string

        -

        -

        -

        -

        图标资源路径,该图标展示在选项文本前,图标格式为jpg,png和svg。

        -
        - -## 样式 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性:↵ + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| selected | boolean | - | 否 | 选择项是否为下拉列表的默认项,仅在父组件是select时生效。 | +| value | string | - | 是 | 选择项的值,作为select、menu父组件的selected事件中的返回值。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > option选项的UI展示值需要放在标签内,如<option value="10">十月</option> | +| icon | string | - | 否 | 图标资源路径,该图标展示在选项文本前,图标格式为jpg,png和svg。 | + + +## 样式 支持如下样式。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e6000000

        -

        -

        选择项的文本颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        选择项的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        选择项的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        选择项的字体粗细,见text组件font-weight的样式属性

        -

        text-decoration

        -

        string

        -

        none

        -

        -

        选择项的文本修饰,见text组件text-decoration的样式属性

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        选择项的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        - -## 事件 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#e6000000 | 否 | 选择项的文本颜色。 | +| font-size | <length> | 16px | 否 | 选择项的文本尺寸。 | +| allow-scale | boolean | true | 否 | 选择项的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| font-weight | number \| string | normal | 否 | 选择项的字体粗细,见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| text-decoration | string | none | 否 | 选择项的文本修饰,见[text组件text-decoration的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | string | sans-serif | 否 | 选择项的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | + + +## 事件 不支持。 -## 方法 + +## 方法 不支持。 -## 示例 -详见[menu示例](js-components-basic-menu.md#section54636714136)。 +## 示例 +详见[menu示例](../arkui-js/js-components-basic-menu.md#示例)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker-view.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker-view.md index 665604b18b7..0d9575bb3f7 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker-view.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker-view.md @@ -1,563 +1,125 @@ -# picker-view +# picker-view + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 嵌入页面的滑动选择器。 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        text

        -

        -

        设置滑动选择器的类型,该属性不支持动态修改,可选项有:

        -
        • text:文本选择器。
        • time:时间选择器。
        • date:日期选择器。
        • datetime:日期时间选择器。
        • multi-text:多列文本选择器。
        -
        + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | text | 否 | 设置滑动选择器的类型,该属性不支持动态修改,可选项有:
        - text:文本选择器。
        - time:时间选择器。
        - date:日期选择器。
        - datetime:日期时间选择器。
        - multi-text:多列文本选择器。 | 文本选择器:type=text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        range

        -

        Array

        -

        -

        -

        -

        设置文本选择器的取值范围。

        -
        说明:

        使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。

        -
        -

        selected

        -

        string

        -

        0

        -

        -

        设置文本选择器的默认选择值,该值需要为range的索引。

        -

        indicatorprefix

        -

        string

        -

        -

        -

        -

        文本选择器选定值增加的前缀字段。

        -

        indicatorsuffix

        -

        string

        -

        -

        -

        -

        文本选择器选定值增加的后缀字段。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| range | Array | - | 否 | 设置文本选择器的取值范围。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。 | +| selected | string | 0 | 否 | 设置文本选择器的默认选择值,该值需要为range的索引。 | +| indicatorprefix | string | - | 否 | 文本选择器选定值增加的前缀字段。 | +| indicatorsuffix | string | - | 否 | 文本选择器选定值增加的后缀字段。 | 时间选择器:type=time - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        containsecond

        -

        boolean

        -

        false

        -

        -

        时间选择器是否包含秒。

        -

        selected

        -

        string

        -

        当前时间

        -

        -

        设置时间选择器的默认取值,格式为 HH:mm;

        -

        当包含秒时,格式为HH:mm:ss。

        -

        hours

        -

        number

        -

        241-4

        -

        -5+

        -

        -

        设置时间选择器采用的时间格式,可选值:

        -
        • 12:按照12小时制显示,用上午和下午进行区分;
        • 24:按照24小时制显示。
          说明:

          默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

          -
          -
        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| containsecond | boolean | false | 否 | 时间选择器是否包含秒。 | +| selected | string | 当前时间 | 否 | 设置时间选择器的默认取值,格式为 HH:mm;
        当包含秒时,格式为HH:mm:ss。 | +| hours | number | 241-4
        -5+ | 否 | 设置时间选择器采用的时间格式,可选值:
        - 12:按照12小时制显示,用上午和下午进行区分;
        - 24:按照24小时制显示。
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > 默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+ | 日期选择器:type=date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        start

        -

        <time>

        -

        1970-1-1

        -

        -

        设置日期选择器的起始时间,格式为 YYYY-MM-DD。

        -

        end

        -

        <time>

        -

        2100-12-31

        -

        -

        设置日期选择器的结束时间,格式为 YYYY-MM-DD。

        -

        selected

        -

        string

        -

        当前日期

        -

        -

        设置日期选择器的默认选择值,格式为 YYYY-MM-DD。

        -

        lunar5+

        -

        boolean

        -

        false

        -

        -

        设置日期选择器弹窗界面是否为农历展示。

        -

        lunarswitch

        -

        boolean

        -

        false

        -

        -

        设置日期选择器是否显示农历开关,显示农历开关时,可以在弹窗界面展现农历的开关由于公历和农历切换。在设置显示农历时,开关状态为开,当设置不显示农历时,开关状态为关。手机生效。

        -
        说明:

        仅手机和平板设备支持。

        -
        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| start | <time> | 1970-1-1 | 否 | 设置日期选择器的起始时间,格式为 YYYY-MM-DD。 | +| end | <time> | 2100-12-31 | 否 | 设置日期选择器的结束时间,格式为 YYYY-MM-DD。 | +| selected | string | 当前日期 | 否 | 设置日期选择器的默认选择值,格式为 YYYY-MM-DD。 | +| lunar5+ | boolean | false | 否 | 设置日期选择器弹窗界面是否为农历展示。 | +| lunarswitch | boolean | false | 否 | 设置日期选择器是否显示农历开关,显示农历开关时,可以在弹窗界面展现农历的开关由于公历和农历切换。在设置显示农历时,开关状态为开,当设置不显示农历时,开关状态为关。手机生效。 | 日期时间选择器:type=datetime,日期的选择范围为本年的日月。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        selected

        -

        string

        -

        当前日期时间

        -

        -

        设置日期时间选择器的默认取值,格式有两种,为月日时分MM-DD-HH-mm或者年月日时分YYYY-MM-DD-HH-mm,不设置年时,默认使用当前年,该取值表示选择器弹窗时弹窗界面的默认选择值。

        -

        hours

        -

        number

        -

        241-4

        -

        -5+

        -

        -

        设置日期时间选择器采用的时间格式,可选值:

        -
        • 12:按照12小时制显示,用上午和下午进行区分;
        • 24:按照24小时制显示。
          说明:

          默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

          -
          -
        -

        lunar5+

        -

        boolean

        -

        false

        -

        -

        设置日期时间选择器弹窗界面是否为农历展示。

        -

        lunarswitch

        -

        boolean

        -

        false

        -

        -

        设置日期时间选择器是否显示农历开关,显示农历开关时,可以在弹窗界面展现农历的开关由于公历和农历切换。在设置显示农历时,开关状态为开,当设置不显示农历时,开关状态为关。手机生效。

        -
        说明:

        仅手机和平板设备支持。

        -
        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| selected | string | 当前日期时间 | 否 | 设置日期时间选择器的默认取值,格式有两种,为月日时分MM-DD-HH-mm或者年月日时分YYYY-MM-DD-HH-mm,不设置年时,默认使用当前年,该取值表示选择器弹窗时弹窗界面的默认选择值。 | +| hours | number | 241-4
        -5+ | 否 | 设置日期时间选择器采用的时间格式,可选值:
        - 12:按照12小时制显示,用上午和下午进行区分;
        - 24:按照24小时制显示。
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > 默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+ | +| lunar5+ | boolean | false | 否 | 设置日期时间选择器弹窗界面是否为农历展示。 | +| lunarswitch | boolean | false | 否 | 设置日期时间选择器是否显示农历开关,显示农历开关时,可以在弹窗界面展现农历的开关由于公历和农历切换。在设置显示农历时,开关状态为开,当设置不显示农历时,开关状态为关。手机生效。 | 多列文本选择器:type=multi-text - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        columns

        -

        number

        -

        -

        -

        -

        设置多列文本选择器的列数。

        -

        range

        -

        二维Array

        -

        -

        -

        -

        设置多列文本选择器的选择值,该值为二维数组。长度表示多少列,数组的每项表示每列的数据,如 [["a","b"], ["c","d"]]。

        -
        说明:

        使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。

        -
        -

        selected

        -

        Array

        -

        [0,0,0,…]

        -

        -

        设置多列文本选择器的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗时弹窗界面的默认选择值。

        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #ffffff

        -

        -

        候选项字体颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        候选项字体尺寸,类型length,单位px。

        -

        selected-color

        -

        <color>

        -

        #ff0a69f7

        -

        -

        选中项字体颜色。

        -

        selected-font-size

        -

        <length>

        -

        20px

        -

        -

        选中项字体尺寸,类型length,单位px。

        -

        disappear-color5+

        -

        <color>

        -

        #ffffff

        -

        -

        渐变消失项的字体颜色。消失项是在一列中有五个选项场景下最上和最下的两个选项。

        -
        说明:

        仅手机和平板设备支持。

        -
        -

        disappear-font-size5+

        -

        <length>

        -

        14px

        -

        -

        渐变消失项的字体尺寸。消失项是在一列中有五个选项场景下最上和最下的两个选项。

        -
        说明:

        仅手机和平板设备支持。

        -
        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        选项字体类型。字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        - -## 事件 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| columns | number | - | 是 | 设置多列文本选择器的列数。 | +| range | 二维Array | - | 否 | 设置多列文本选择器的选择值,该值为二维数组。长度表示多少列,数组的每项表示每列的数据,如  [["a","b"], ["c","d"]]。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。 | +| selected | Array | [0,0,0,…] | 否 | 设置多列文本选择器的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗时弹窗界面的默认选择值。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#ffffff | 否 | 候选项字体颜色。 | +| font-size | <length> | 16px | 否 | 候选项字体尺寸,类型length,单位px。 | +| selected-color | <color> | #ff0a69f7 | 否 | 选中项字体颜色。 | +| selected-font-size | <length> | 20px | 否 | 选中项字体尺寸,类型length,单位px。 | +| disappear-color5+ | <color> | \#ffffff | 否 | 渐变消失项的字体颜色。消失项是在一列中有五个选项场景下最上和最下的两个选项。 | +| disappear-font-size5+ | <length> | 14px | 否 | 渐变消失项的字体尺寸。消失项是在一列中有五个选项场景下最上和最下的两个选项。 | +| font-family | string | sans-serif | 否 | 选项字体类型。字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | + + +## 事件 仅支持如下事件: type=text: - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { newValue: newValue, newSelected: newSelected }

        -

        文本选择器选定值后触发该事件。

        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { newValue: newValue, newSelected: newSelected } | 文本选择器选定值后触发该事件。 | type=time: - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { hour: hour, minute: minute, [second:second] }

        -

        时间选择器选定值后触发该事件。

        -

        包含秒时,返回时分秒。

        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { hour: hour, minute: minute, [second:second]} | 时间选择器选定值后触发该事件。
        包含秒时,返回时分秒。 | type=date: - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { year:year, month:month, day:day }

        -

        日期选择器选择值后触发该事件。

        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { year:year, month:month, day:day } | 日期选择器选择值后触发该事件。 | type=datetime: - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { year:year, month:month, day:day, hour:hour, minute:minute }

        -

        日期时间选择器选择值后触发该事件。

        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { year:year, month:month, day:day,  hour:hour, minute:minute } | 日期时间选择器选择值后触发该事件。 | type=multi-text: - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        columnchange

        -

        { column:column, newValue:newValue, newSelected:newSelected }

        -

        多列文本选择器某一列的值改变时触发该事件,column:第几列修改,newValue:选中的值,newSelected:选中值对应的索引。

        -
        - -## 方法 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| columnchange | { column:column, newValue:newValue, newSelected:newSelected } | 多列文本选择器某一列的值改变时触发该事件,column:第几列修改,newValue:选中的值,newSelected:选中值对应的索引。 | + + +## 方法 不支持。 -## 示例 + +## 示例 ``` @@ -621,5 +183,4 @@ export default { } ``` -![](figures/sssssss.png) - +![zh-cn_image_0000001173324845](figures/zh-cn_image_0000001173324845.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker.md index c49072a3cf3..aae0f7e0c51 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-picker.md @@ -1,708 +1,166 @@ -# picker +# picker + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 滑动选择器组件,类型支持普通选择器、日期选择器、时间选择器、时间日期选择器和多列文本选择器。 -## 权限列表 + +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性:↵ - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        -

        -

        -

        该属性值不支持动态修改。可选择项有:

        -
        • text:文本选择器。
        • date:日期选择器。
        • time:时间选择器。
        • datetime:日期时间选择器。
        • multi-text:多列文本选择器。
        -
        - -### 普通选择器 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性:↵ + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | - | 否 | 该属性值不支持动态修改。可选择项有:
        - text:文本选择器。
        - date:日期选择器。
        - time:时间选择器。
        - datetime:日期时间选择器。
        - multi-text:多列文本选择器。 | + + +### 普通选择器 滑动选择器类型设置为text时表示普通选择器。 - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        range

        -

        Array

        -

        -

        -

        -

        设置普通选择器的取值范围,如["15", "20", "25"]。

        -
        说明:

        使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。

        -
        -

        selected

        -

        string

        -

        0

        -

        -

        设置普通选择器弹窗的默认取值,取值需要是 range 的索引值,该取值表示选择器弹窗界面的默认选择值。

        -

        value

        -

        string

        -

        -

        -

        -

        设置普通选择器的值。

        -
        - -### 日期选择器 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| range | Array | - | 否 | 设置普通选择器的取值范围,如["15", "20", "25"]。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。 | +| selected | string | 0 | 否 | 设置普通选择器弹窗的默认取值,取值需要是 range 的索引值,该取值表示选择器弹窗界面的默认选择值。 | +| value | string | - | 否 | 设置普通选择器的值。 | + + +### 日期选择器 滑动选择器类型设置为date时表示日期选择器。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        start

        -

        <time>

        -

        1970-1-1

        -

        -

        设置日期选择器的起始时间,格式为 YYYY-MM-DD。

        -

        end

        -

        <time>

        -

        2100-12-31

        -

        -

        设置日期选择器的结束时间,格式为 YYYY-MM-DD。

        -

        selected

        -

        string

        -

        当前日期

        -

        -

        设置日期选择器弹窗的默认取值,格式为 YYYY-MM-DD,该取值表示选择器弹窗界面的默认选择值。

        -

        value

        -

        string

        -

        -

        -

        -

        设置日期选择器的值。

        -

        lunar5+

        -

        boolean

        -

        false

        -

        -

        设置日期选择器弹窗界面是否为农历展示。

        -

        lunarswitch

        -

        boolean

        -

        false

        -

        -

        设置日期选择器是否显示农历开关。当值为true时,显示农历开关,点击农历开关可切换公历和农历。当值为false时,不显示农历开关。

        -
        说明:

        仅手机和平板设备支持。 当lunarswitch=true且lunar=true时,开关按钮处于被选中状态。

        -
        -
        - -### 时间选择器 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| start | <time> | 1970-1-1 | 否 | 设置日期选择器的起始时间,格式为 YYYY-MM-DD。 | +| end | <time> | 2100-12-31 | 否 | 设置日期选择器的结束时间,格式为 YYYY-MM-DD。 | +| selected | string | 当前日期 | 否 | 设置日期选择器弹窗的默认取值,格式为 YYYY-MM-DD,该取值表示选择器弹窗界面的默认选择值。 | +| value | string | - | 是 | 设置日期选择器的值。 | +| lunar5+ | boolean | false | 否 | 设置日期选择器弹窗界面是否为农历展示。 | +| lunarswitch | boolean | false | 否 | 设置日期选择器是否显示农历开关。当值为true时,显示农历开关,点击农历开关可切换公历和农历。当值为false时,不显示农历开关。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅手机和平板设备支持。 当lunarswitch=true且lunar=true时,开关按钮处于被选中状态。 | + + +### 时间选择器 滑动选择器类型设置为time时表示时间选择器。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        containsecond

        -

        boolean

        -

        false

        -

        -

        设置时间选择器是否包含秒。

        -

        selected

        -

        string

        -

        当前时间

        -

        -

        设置时间选择器弹窗的默认取值,格式为 HH:mm;当包含秒时,格式为HH:mm:ss,

        -

        该取值表示选择器弹窗界面的默认选择值。

        -

        value

        -

        string

        -

        -

        -

        -

        设置时间选择器的值。

        -

        hours

        -

        number

        -

        241-4

        -

        -5+

        -

        -

        设置时间选择器采用的时间格式,可选值:

        -
        • 12:按照12小时制显示,用上午和下午进行区分;
        • 24:按照24小时制显示。
          说明:

          默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

          -
          -
        -
        - -### 日期时间选择器 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| containsecond | boolean | false | 否 | 设置时间选择器是否包含秒。 | +| selected | string | 当前时间 | 否 | 设置时间选择器弹窗的默认取值,格式为 HH:mm;当包含秒时,格式为HH:mm:ss,
        该取值表示选择器弹窗界面的默认选择值。 | +| value | string | - | 否 | 设置时间选择器的值。 | +| hours | number | 241-4
        -5+ | 否 | 设置时间选择器采用的时间格式,可选值:
        - 12:按照12小时制显示,用上午和下午进行区分;
        - 24:按照24小时制显示。
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > 默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+ | + + +### 日期时间选择器 滑动选择器类型设置为datetime时表示日期时间选择器,日期的选择范围为本年的日月。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        selected

        -

        string

        -

        当前日期时间

        -

        -

        设置日期时间选择器弹窗的默认取值,有两种可选格式。

        -
        • 月日时分:MM-DD-HH-mm
        • 年月日时分:YYYY-MM-DD-HH-mm
        -

        不设置年时,默认使用当前年,该取值表示选择器弹窗界面的默认选择值。

        -

        value

        -

        string

        -

        -

        -

        -

        设置日期时间选择器的值。

        -

        hours

        -

        number

        -

        241-4

        -

        -5+

        -

        -

        设置日期时间选择器采用的时间格式,可选值:

        -
        • 12:按照12小时制显示,用上午和下午进行区分;
        • 24:按照24小时制显示。
          说明:

          默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

          -
          -
        -

        lunar5+

        -

        boolean

        -

        false

        -

        -

        设置日期时间选择器弹窗界面是否为农历展示。

        -

        lunarswitch

        -

        boolean

        -

        false

        -

        -

        设置日期选择器是否显示农历开关。当值为true时,显示农历开关,点击农历开关可切换公历和农历。当值为false时,不显示农历开关。

        -
        说明:

        仅手机和平板设备支持。 当lunarswitch=true且lunar=true时,开关按钮处于被选中状态。

        -
        -
        - -### 多列文本选择器 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| selected | string | 当前日期时间 | 否 | 设置日期时间选择器弹窗的默认取值,有两种可选格式。
        - 月日时分:MM-DD-HH-mm
        - 年月日时分:YYYY-MM-DD-HH-mm
        不设置年时,默认使用当前年,该取值表示选择器弹窗界面的默认选择值。 | +| value | string | - | 是 | 设置日期时间选择器的值。 | +| hours | number | 241-4
        -5+ | 否 | 设置日期时间选择器采用的时间格式,可选值:
        - 12:按照12小时制显示,用上午和下午进行区分;
        - 24:按照24小时制显示。
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > 默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+ | +| lunar5+ | boolean | false | 否 | 设置日期时间选择器弹窗界面是否为农历展示。 | +| lunarswitch | boolean | false | 否 | 设置日期选择器是否显示农历开关。当值为true时,显示农历开关,点击农历开关可切换公历和农历。当值为false时,不显示农历开关。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅手机和平板设备支持。 当lunarswitch=true且lunar=true时,开关按钮处于被选中状态。 | + + +### 多列文本选择器 滑动选择器类型设置为multi-text时表示多列文本选择器。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        columns

        -

        number

        -

        -

        -

        -

        设置多列文本选择器的列数。

        -

        range

        -

        二维Array

        -

        -

        -

        -

        设置多列文本选择器的选择项,其中range 为二维数组。长度表示多少列,数组的每项表示每列的数据,如 [["a","b"], ["c","d"]]。

        -
        说明:

        使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。

        -
        -

        selected

        -

        Array

        -

        [0,0,0,…]

        -

        -

        设置多列文本选择器弹窗的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗界面的默认选择值。

        -

        value

        -

        Array

        -

        -

        -

        -

        设置多列文本选择器的值,每一列被选中项对应的值构成的数组。

        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        text-color

        -

        <color>

        -

        -

        -

        -

        选择器的文本颜色。

        -

        font-size

        -

        <length>

        -

        -

        -

        -

        选择器的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        选择器的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        letter-spacing

        -

        <length>

        -

        0

        -

        -

        选择器的字符间距。见text组件的letter-spacing样式属性

        -

        text-decoration

        -

        string

        -

        -

        -

        -

        选择器的文本修饰。见text组件的text-decoration样式属性

        -

        font-style

        -

        string

        -

        normal

        -

        -

        选择器的字体样式。见text组件的font-style样式属性

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        选择器的字体粗细。见text组件的font-weight样式属性

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        选择器的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -

        line-height

        -

        <length>

        -

        0px

        -

        -

        选择器的文本行高。

        -

        column-height5+

        -

        <length>

        -

        -

        -

        -

        选择器的选择项列表高度。

        -
        说明:

        仅手机和平板设备支持。

        -
        -
        - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - -### 普通选择器 - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { newValue: newValue, newSelected: newSelected }

        -

        普通选择器选择值后点击弹窗中的确定按钮时触发该事件(newSelected为索引)。

        -

        cancel

        -

        -

        -

        用户点击弹窗中的取消按钮时触发该事件。

        -
        - -### 日期选择器 - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { year: year, month: month, day: day }

        -

        日期选择器选择值后点击弹窗中的确认按钮时触发该事件。

        -
        说明:

        month值范围为: 0(1月)~11(12月)。5+

        -
        -

        cancel

        -

        -

        -

        用户点击弹窗中的取消按钮时触发该事件。

        -
        - -### 日期时间选择器 - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { year: year, month: month, day: day, hour: hour, minute: minute}

        -

        日期时间选择器选择值后点击弹窗中的确认按钮时触发该事件。

        -

        cancel

        -

        -

        -

        用户点击弹窗中的取消按钮时触发该事件。

        -
        - -### 时间选择器 - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { hour: hour, minute: minute, [second: second] }

        -

        时间选择器选择值后点击弹窗中的确认按钮时触发该事件,当使用时分秒时,还包含秒数据。

        -

        cancel

        -

        -

        -

        用户点击弹窗中的取消按钮时触发该事件。

        -
        - -### 多列文本选择器 - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { newValue: [newValue1, newValue2, newValue3, …], newSelected:[newSelected1, newSelected2, newSelected3, …] }

        -

        多列文本选择器选择值后点击弹窗中的确认按钮时触发该事件,其中:

        -
        • newValue:被选中项对应的值构成的数组。
        • newSelected:被选中项对应的索引构成的数组,两者的长度和range的长度一致。
        -

        columnchange

        -

        { column: column, newValue: newValue, newSelected: newSelected }

        -

        多列文本选择器中某一列的值改变时触发该事件,其中:

        -
        • column:第几列修改。
        • newValue:选中的值。
        • newSelected:选中值对应的索引。
        -

        cancel

        -

        -

        -

        用户点击弹窗中的取消按钮时触发该事件。

        -
        - -## 方法 - -除支持[通用方法](js-components-common-methods.md)外,支持如下方法: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        show

        -

        -

        -

        显示 picker。

        -
        - -## 示例 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| columns | number | - | 是 | 设置多列文本选择器的列数。 | +| range | 二维Array | - | 否 | 设置多列文本选择器的选择项,其中range 为二维数组。长度表示多少列,数组的每项表示每列的数据,如  [["a","b"], ["c","d"]]。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。 | +| selected | Array | [0,0,0,…] | 否 | 设置多列文本选择器弹窗的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗界面的默认选择值。 | +| value | Array | - | 否 | 设置多列文本选择器的值,每一列被选中项对应的值构成的数组。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| text-color | <color> | - | 否 | 选择器的文本颜色。 | +| font-size | <length> | - | 否 | 选择器的文本尺寸。 | +| allow-scale | boolean | true | 否 | 选择器的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| letter-spacing | <length> | 0 | 否 | 选择器的字符间距。见[text组件的letter-spacing样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| text-decoration | string | - | 否 | 选择器的文本修饰。见[text组件的text-decoration样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-style | string | normal | 否 | 选择器的字体样式。见[text组件的font-style样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-weight | number \| string | normal | 否 | 选择器的字体粗细。见[text组件的font-weight样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | string | sans-serif | 否 | 选择器的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | +| line-height | <length> | 0px | 否 | 选择器的文本行高。 | +| column-height5+ | <length> | - | 否 | 选择器的选择项列表高度。 | + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + + +### 普通选择器 + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { newValue: newValue, newSelected: newSelected } | 普通选择器选择值后点击弹窗中的确定按钮时触发该事件(newSelected为索引)。 | +| cancel | - | 用户点击弹窗中的取消按钮时触发该事件。 | + + +### 日期选择器 + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { year: year, month: month, day: day } | 日期选择器选择值后点击弹窗中的确认按钮时触发该事件。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > month值范围为: 0(1月)~11(12月)。5+ | +| cancel | - | 用户点击弹窗中的取消按钮时触发该事件。 | + + +### 日期时间选择器 + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { year: year, month: month, day: day,  hour: hour, minute: minute} | 日期时间选择器选择值后点击弹窗中的确认按钮时触发该事件。 | +| cancel | - | 用户点击弹窗中的取消按钮时触发该事件。 | + + +### 时间选择器 + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { hour: hour, minute: minute, [second: second] } | 时间选择器选择值后点击弹窗中的确认按钮时触发该事件,当使用时分秒时,还包含秒数据。 | +| cancel | - | 用户点击弹窗中的取消按钮时触发该事件。 | + + +### 多列文本选择器 + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { newValue: [newValue1, newValue2, newValue3, …], newSelected:[newSelected1, newSelected2, newSelected3, …] } | 多列文本选择器选择值后点击弹窗中的确认按钮时触发该事件,其中:
        - newValue:被选中项对应的值构成的数组。
        - newSelected:被选中项对应的索引构成的数组,两者的长度和range的长度一致。 | +| columnchange | { column: column, newValue: newValue, newSelected: newSelected } | 多列文本选择器中某一列的值改变时触发该事件,其中:
        - column:第几列修改。
        - newValue:选中的值。
        - newSelected:选中值对应的索引。 | +| cancel | - | 用户点击弹窗中的取消按钮时触发该事件。 | + + +## 方法 + +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,支持如下方法: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| show | - | 显示 picker。 | + + +## 示例 ``` @@ -829,5 +287,4 @@ export default { } ``` -![](figures/mmmm.gif) - +![zh-cn_image_0000001191939702](figures/zh-cn_image_0000001191939702.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-piece.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-piece.md index 7cab19b45c3..6052a8fea06 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-piece.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-piece.md @@ -1,97 +1,49 @@ -# piece +# piece + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 一种块状的入口,可包含图片和文本。常用于展示收件人,例如:邮件收件人或信息收件人。 -## 子组件 + +## 子组件 无 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        content

        -

        string

        -

        -

        -

        -

        操作块文本内容。

        -

        closable

        -

        boolean

        -

        false

        -

        -

        设置当前操作块是否显示删除图标,当显示删除图标时,点击删除图标会触发close事件。

        -

        icon

        -

        string

        -

        -

        -

        -

        操作块删除图标的url,支持本地。

        -
        - -## 样式 - -支持[通用样式](js-components-common-styles.md)。 - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->文本和图片默认在整个piece组件中居中。 - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        close

        -

        -

        -

        当piece组件点击删除图标触发,此时可以通过渲染属性if删除该组件。

        -
        - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| content | string | - | 是 | 操作块文本内容。 | +| closable | boolean | false | 否 | 设置当前操作块是否显示删除图标,当显示删除图标时,点击删除图标会触发close事件。 | +| icon | string | - | 否 | 操作块删除图标的url,支持本地路径。 | + + +## 样式 + +支持[通用样式](../arkui-js/js-components-common-styles.md)。 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 文本和图片默认在整个piece组件中居中。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| close | - | 当piece组件点击删除图标触发,此时可以通过渲染属性if删除该组件。 | + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -124,5 +76,4 @@ export default { } ``` -![](figures/11-1.gif) - +![zh-cn_image_0000001177428498](figures/zh-cn_image_0000001177428498.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-progress.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-progress.md index 9be9c672289..9eaac1397d5 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-progress.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-progress.md @@ -1,480 +1,108 @@ -# progress +# progress + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 进度条,用于显示内容加载或操作处理进度。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        horizontal

        -

        -

        设置进度条的类型,该属性不支持动态修改,可选值为:

        -
        • horizontal:线性进度条;
        • circular:loading样式进度条;
        • ring:圆环形进度条;
        • scale-ring:带刻度圆环形进度条
        • arc:弧形进度条。
        • eclipse5+:圆形进度条,展现类似月圆月缺的进度展示效果。
        -
        + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | horizontal | 否 | 设置进度条的类型,该属性不支持动态修改,可选值为:
        - horizontal:线性进度条;
        - circular:loading样式进度条;
        - ring:圆环形进度条;
        - scale-ring:带刻度圆环形进度条
        - arc:弧形进度条。
        - eclipse5+:圆形进度条,展现类似月圆月缺的进度展示效果。 | 不同类型的进度条还支持不同的属性: -- 类型为horizontal、ring、scale-ring时,支持如下属性: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        percent

        -

        number

        -

        0

        -

        -

        当前进度。取值范围为0-100。

        -

        secondarypercent

        -

        number

        -

        0

        -

        -

        次级进度。取值范围为0-100。

        -
        - -- 类型为ring、scale-ring时,支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        clockwise

        -

        boolean

        -

        true

        -

        -

        圆环形进度条是否采用顺时针。

        -
        - -- 类型为arc、eclipse5+时,支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        percent

        -

        number

        -

        0

        -

        -

        当前进度。取值范围为0-100。

        -
        - - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +- 类型为horizontal、ring、scale-ring时,支持如下属性: + | 名称 | 类型 | 默认值 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | -------- | + | percent | number | 0 | 否 | 当前进度。取值范围为0-100。 | + | secondarypercent | number | 0 | 否 | 次级进度。取值范围为0-100。 | + +- 类型为ring、scale-ring时,支持如下属性: + | 名称 | 类型 | 默认值 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | -------- | + | clockwise | boolean | true | 否 | 圆环形进度条是否采用顺时针。 | + +- 类型为arc、eclipse5+时,支持如下属性: + | 名称 | 类型 | 默认值 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | -------- | + | percent | number | 0 | 否 | 当前进度。取值范围为0-100。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: type=horizontal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #ff007dff

        -

        -

        设置进度条的颜色。

        -

        stroke-width

        -

        <length>

        -

        4px

        -

        -

        -

        设置进度条的宽度。

        -

        background-color

        -

        <color>

        -

        -

        -

        -

        设置进度条的背景色。

        -

        secondary-color

        -

        <color>

        -

        -

        -

        -

        设置次级进度条的颜色。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#ff007dff | 否 | 设置进度条的颜色。 | +| stroke-width | <length> | 4px | 否 | 设置进度条的宽度。 | +| background-color | <color> | - | 否 | 设置进度条的背景色。 | +| secondary-color | <color> | - | 否 | 设置次级进度条的颜色。 | type=circular - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        -

        -

        -

        loading进度条上的圆点颜色。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | - | 否 | loading进度条上的圆点颜色。 | type=ring, scale-ring - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color> | <linear-gradient>

        -

        -

        -

        -

        环形进度条的颜色,ring类型支持线性渐变色设置。

        -
        说明:

        线性渐变色仅支持两个颜色参数设置格式,如color = linear-gradient(#ff0000, #00ff00)。

        -
        -

        background-color

        -

        <color>

        -

        -

        -

        -

        环形进度条的背景色。

        -

        secondary-color

        -

        <color>

        -

        -

        -

        -

        环形次级进度条的颜色。

        -

        stroke-width

        -

        <length>

        -

        10px

        -

        -

        环形进度条的宽度。

        -

        scale-width

        -

        <length>

        -

        -

        -

        -

        带刻度的环形进度条的刻度粗细,类型为scale-ring生效。

        -

        scale-number

        -

        number

        -

        120

        -

        -

        带刻度的环形进度条的刻度数量,类型为scale-ring生效。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> \| <linear-gradient> | - | 否 | 环形进度条的颜色,ring类型支持线性渐变色设置。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 线性渐变色仅支持两个颜色参数设置格式,如color = linear-gradient(\#ff0000, \#00ff00)。 | +| background-color | <color> | - | 否 | 环形进度条的背景色。 | +| secondary-color | <color> | - | 否 | 环形次级进度条的颜色。 | +| stroke-width | <length> | 10px | 否 | 环形进度条的宽度。 | +| scale-width | <length> | - | 否 | 带刻度的环形进度条的刻度粗细,类型为scale-ring生效。 | +| scale-number | number | 120 | 否 | 带刻度的环形进度条的刻度数量,类型为scale-ring生效。 | type=arc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        -

        -

        -

        -

        弧形进度条的颜色。

        -

        background-color

        -

        <color>

        -

        -

        -

        -

        -

        弧形进度条的背景色。

        -

        stroke-width

        -

        <length>

        -

        4px

        -

        -

        弧形进度条的宽度。

        -
        说明:

        进度条宽度越大,进度条越靠近圆心,进度条始终在半径区域内。

        -
        -

        start-angle

        -

        <deg>

        -

        240

        -

        -

        弧形进度条起始角度,以时钟0点为基线,取值范围为0到360(顺时针)。

        -

        total-angle

        -

        <deg>

        -

        240

        -

        -

        弧形进度条总长度,范围为-360到360,负数标识起点到终点为逆时针。

        -

        center-x

        -

        <length>

        -

        弧形进度条宽度的一半

        -

        -

        弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-y和radius一起使用。

        -

        center-y

        -

        <length>

        -

        弧形进度条高度的一半

        -

        -

        弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-x和radius一起使用。

        -

        radius

        -

        <length>

        -

        弧形进度条宽高最小值的一半

        -

        -

        弧形进度条半径,该样式需要和center-x和center-y一起使用。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | - | 否 | 弧形进度条的颜色。 | +| background-color | <color> | - | 否 | 弧形进度条的背景色。 | +| stroke-width | <length> | 4px | 否 | 弧形进度条的宽度。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 进度条宽度越大,进度条越靠近圆心,进度条始终在半径区域内。 | +| start-angle | <deg> | 240 | 否 | 弧形进度条起始角度,以时钟0点为基线,取值范围为0到360(顺时针)。 | +| total-angle | <deg> | 240 | 否 | 弧形进度条总长度,范围为-360到360,负数标识起点到终点为逆时针。 | +| center-x | <length> | 弧形进度条宽度的一半 | 否 | 弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-y和radius一起使用。 | +| center-y | <length> | 弧形进度条高度的一半 | 否 | 弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-x和radius一起使用。 | +| radius | <length> | 弧形进度条宽高最小值的一半 | 否 | 弧形进度条半径,该样式需要和center-x和center-y一起使用。 | type=eclipse5+ - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        -

        -

        -

        圆形进度条的颜色。

        -

        background-color

        -

        <color>

        -

        -

        -

        -

        弧形进度条的背景色。

        -
        - -## 事件 - -支持[通用事件](js-components-common-events.md)。 - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | - | 否 | 圆形进度条的颜色。 | +| background-color | <color> | - | 否 | 弧形进度条的背景色。 | + + +## 事件 + +支持[通用事件](../arkui-js/js-components-common-events.md)。 + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -500,5 +128,6 @@ type=eclipse5+ } ``` -![](figures/progress.png) +![zh-cn_image_0000001180339632](figures/zh-cn_image_0000001180339632.png) + diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-qrcode.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-qrcode.md index d1149797eb3..b0c73ee2aed 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-qrcode.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-qrcode.md @@ -1,111 +1,57 @@ -# qrcode +# qrcode + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 生成并显示二维码。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        value

        -

        string

        -

        -

        -

        -

        用来生成二维码的内容。

        -

        type

        -

        string

        -

        rect

        -

        -

        二维码类型。可能选项有:

        -
        • rect:矩形二维码。
        • circle:圆形二维码。
        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #000000

        -

        -

        二维码颜色。

        -

        background-color

        -

        <color>

        -

        #ffffff

        -

        -

        二维码背景颜色。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- width和height不一致时,取二者较小值作为二维码的边长。且最终生成的二维码居中显示。 ->- width和height只设置一个时,取设置的值作为二维码的边长。都不设置时,使用200px作为默认边长。 - -## 事件 - -支持[通用事件](js-components-common-events.md)。 - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| value | string | - | 是 | 用来生成二维码的内容。 | +| type | string | rect | 否 | 二维码类型。可能选项有:
        - rect:矩形二维码。
        - circle:圆形二维码。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#000000 | 否 | 二维码颜色。 | +| background-color | <color> | \#ffffff | 否 | 二维码背景颜色。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - width和height不一致时,取二者较小值作为二维码的边长。且最终生成的二维码居中显示。 +> +> +> - width和height只设置一个时,取设置的值作为二维码的边长。都不设置时,使用200px作为默认边长。 +> + + +## 事件 + +支持[通用事件](../arkui-js/js-components-common-events.md)。 + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -174,5 +120,6 @@ export default { } ``` -![](figures/12.gif) +![zh-cn_image_0000001222948301](figures/zh-cn_image_0000001222948301.gif) + diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-rating.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-rating.md index 40811a1e11b..dbd604a380d 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-rating.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-rating.md @@ -1,197 +1,65 @@ -# rating +# rating + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 评分条,表示用户使用感受的衡量标准条。 -## 权限列表 + +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        numstars

        -

        number

        -

        5

        -

        -

        设置评分条的星级总数。

        -

        rating

        -

        number

        -

        0

        -

        -

        设置评分条当前评星数。

        -

        stepsize

        -

        number

        -

        0.5

        -

        -

        设置评分条的评星步长。

        -
        说明:

        仅手机和平板设备支持

        -
        -

        indicator

        -

        boolean

        -

        false

        -

        -

        设置评分条是否作为一个指示器,此时用户不可操作。

        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        star-background

        -

        string

        -

        -

        -

        -

        设置单个星级未选中的背景图片,只支持本地路径图片,图片格式为png和jpg。

        -

        star-foreground

        -

        string

        -

        -

        -

        -

        设置单个星级选中的前景图片,只支持本地路径图片,图片格式为png和jpg。

        -

        star-secondary

        -

        string

        -

        -

        -

        -

        设置单个星级部分选中的次级背景图片,该图片会覆盖背景图片,只支持本地路径图片,图片格式为png和jpg。

        -

        width

        -

        <length>|<percentage>

        -

        120px

        -

        60px(不可操作)

        -

        -

        默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的宽度值。

        -

        height

        -

        <length>|<percentage>

        -

        24px

        -

        12px(不可操作)

        -

        -

        默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的高度值。

        -

        rtl-flip

        -

        boolean

        -

        true

        -

        -

        在RTL文字方向下是否自动翻转图源。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->star-background,star-secondary,star-foreground三个星级图源必须全部设置,否则默认的星级颜色为灰色,以此提示图源设置错误。 - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { rating: number }

        -

        评分条的评星发生改变时触发该回调。

        -
        - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| numstars | number | 5 | 否 | 设置评分条的星级总数。 | +| rating | number | 0 | 否 | 设置评分条当前评星数。 | +| stepsize | number | 0.5 | 否 | 设置评分条的评星步长。 | +| indicator | boolean | false | 否 | 设置评分条是否作为一个指示器,此时用户不可操作。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| star-background | string | - | 否 | 设置单个星级未选中的背景图片,只支持本地路径图片,图片格式为png和jpg。 | +| star-foreground | string | - | 否 | 设置单个星级选中的前景图片,只支持本地路径图片,图片格式为png和jpg。 | +| star-secondary | string | - | 否 | 设置单个星级部分选中的次级背景图片,该图片会覆盖背景图片,只支持本地路径图片,图片格式为png和jpg。 | +| width | <length>\|<percentage> | 120px
        60px(不可操作) | 否 | 默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的宽度值。 | +| height | <length>\|<percentage> | 24px
        12px(不可操作) | 否 | 默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的高度值。 | +| rtl-flip | boolean | true | 否 | 在RTL文字方向下是否自动翻转图源。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> star-background,star-secondary,star-foreground三个星级图源必须全部设置,否则默认的星级颜色为灰色,以此提示图源设置错误。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { rating:  number } | 评分条的评星发生改变时触发该回调。 | + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -225,5 +93,4 @@ export default { } ``` -![](figures/zh-cn_image_0000001198670487.png) - +![zh-cn_image_0000001198670487](figures/zh-cn_image_0000001198670487.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-richtext.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-richtext.md index 3886b92819d..0cf27719093 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-richtext.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-richtext.md @@ -1,60 +1,56 @@ -# richtext +# richtext -富文本组件,用于展示富文本信息,内容需要写在元素标签内。 -## 权限列表 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 该组件从API version 6开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - 富文本内容需要写在元素标签内。 + +富文本组件,用于展示富文本信息。 + +## 权限列表 无 -## 子组件 -不包含子组件。 +## 属性 + +仅支持[通用属性](../arkui-js/js-components-common-attributes.md)中的id、style和class属性。 + -## 属性 +## 样式 -仅支持[通用属性](js-components-common-attributes.md)中的id、style和class属性。 +仅支持[通用样式](../arkui-js/js-components-common-styles.md)中的display和visibility样式。 -## 样式 -仅支持[通用样式](js-components-common-styles.md)中的display和visibility样式。 +## 事件 -## 事件 +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| start | - | 开始加载时触发。 | +| complete | - | 加载完成时触发。 | - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        start

        -

        -

        -

        开始加载时触发。

        -

        complete

        -

        -

        -

        加载完成时触发。

        -
        +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 不支持focus、blur、key事件。 +> +> - 不支持无障碍事件。 +> +> - 包含richtext的页面返回时richtext显示区域不会跟随页面的转场动效。 +> +> - richtext内容不建议超过一个屏幕高度,超出部分不会显示。 +> +> - 不支持设置宽度,默认撑开全屏。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 不支持focus、blur、key事件。 ->- 不支持无障碍事件。 ->- 包含richtext的页面返回时richtext显示区域不会跟随页面的转场动效。 ->- richtext内容不建议超过一个屏幕高度,超出部分不会显示。 ->- 不支持设置宽度,默认撑开全屏。 -## 示例 +## 方法 + +不支持。 + + +## 示例 ``` @@ -68,26 +64,20 @@ export default { data: { content: ` -

        h1标题

        -

        h1斜体

        -

        h1下划线

        -

        h2标题

        -

        h3标题

        -

        p常规


        -
        -

        字体大小35px,行高45px

        -

        - 这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字 - 这是一段文字

        -
        +
        + +

        h1

        +

        文本测试(h1测试)

        +

        h2

        +

        文本测试(h2测试)

        +
        `, }, onLoadStart() { - console.error("start load rich text.") + console.error("start load rich text:" + JSON.stringify()) }, onLoadEnd() { - console.error("end load rich text.") + console.error("end load rich text:" + JSON.stringify()) } } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-search.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-search.md index 4f36d73e571..7e8e09b155d 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-search.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-search.md @@ -1,275 +1,71 @@ -# search +# search + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 提供搜索框组件,用于提供用户搜索内容的输入区域。 -## 子组件 + +## 子组件 不支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| icon | string | - | 否 | 搜索图标,默认使用系统搜索图标,图标格式为svg,jpg和png。 | +| hint | string | - | 否 | 搜索提示文字。 | +| value | string | - | 否 | 搜索框搜索文本值。 | +| searchbutton5+ | string | - | 否 | 搜索框末尾搜索按钮文本值。 | +| menuoptions5+ | Array<MenuOption> | - | 否 | 设置文本选择弹框点击更多按钮之后显示的菜单项。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        icon

        -

        string

        -

        -

        -

        -

        搜索图标,默认使用系统搜索图标,图标格式为svg,jpg和png。

        -

        hint

        -

        string

        -

        -

        -

        -

        搜索提示文字。

        -

        value

        -

        string

        -

        -

        -

        -

        搜索框搜索文本值。

        -

        searchbutton5+

        -

        string

        -

        -

        -

        -

        搜索框末尾搜索按钮文本值。

        -

        menuoptions5+

        -

        Array<MenuOption>

        -

        -

        -

        -

        设置文本选择弹框点击更多按钮之后显示的菜单项。

        -
        +**表1** MenuOption5+ -**表 1** MenuOption5+ +| 名称 | 类型 | 描述 | +| -------- | -------- | -------- | +| icon | string | 菜单选项中的图标路径。 | +| content | string | 菜单选项中的文本内容。 | - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        描述

        -

        icon

        -

        string

        -

        菜单选项中的图标路径。

        -

        content

        -

        string

        -

        菜单选项中的文本内容。

        -
        -## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e6000000

        -

        -

        搜索框的文本颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        搜索框的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        搜索框的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        placeholder-color

        -

        <color>

        -

        #99000000

        -

        -

        搜索框的提示文本颜色。

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        搜索框的字体粗细,见text组件font-weight的样式属性

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        搜索框的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -

        caret-color6+

        -

        <color>

        -

        -

        -

        -

        设置输入光标的颜色。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#e6000000 | 否 | 搜索框的文本颜色。 | +| font-size | <length> | 16px | 否 | 搜索框的文本尺寸。 | +| allow-scale | boolean | true | 否 | 搜索框的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| placeholder-color | <color> | \#99000000
        | 否 | 搜索框的提示文本颜色。 | +| font-weight | number \| string | normal | 否 | 搜索框的字体粗细,见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | string | sans-serif | 否 | 搜索框的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | +| caret-color6+ | <color> | - | 否 | 设置输入光标的颜色。 | -## 事件 -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { text:newText }

        -

        输入内容发生变化时触发。

        -
        说明:

        改变value属性值不会触发该回调。

        -
        -

        submit

        -

        { text:submitText }

        -

        点击搜索图标、搜索按钮5+或者按下软键盘搜索按钮时触发。

        -

        translate5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。

        -

        share5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。

        -

        search5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。

        -

        optionselect5+

        -

        { index:optionIndex, value: selectedText }

        -

        文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。

        -
        +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -## 方法 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { text:newText } | 输入内容发生变化时触发。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 改变value属性值不会触发该回调。 | +| submit | { text:submitText } | 点击搜索图标、搜索按钮5+或者按下软键盘搜索按钮时触发。 | +| translate5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。 | +| share5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。 | +| search5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。 | +| optionselect5+ | { index:optionIndex, value: selectedText } | 文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。 | -支持[通用方法](js-components-common-methods.md)。 -## 示例 +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -288,5 +84,4 @@ } ``` -![](figures/zh-cn_image_0000001153427082.png) - +![zh-cn_image_0000001153427082](figures/zh-cn_image_0000001153427082.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-select.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-select.md index 54127fa0ecf..8ddc87c5f32 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-select.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-select.md @@ -1,79 +1,53 @@ -# select +# select + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 下拉选择按钮,可让用户在多个选项之间选择。 -## 权限列表 +## 权限列表 无 -## 子组件 - -支持<[option](js-components-basic-option.md)\>。 - -## 属性 - -支持[通用属性](js-components-common-attributes.md)。 - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        {newValue: newValue}

        -

        下拉选择新值后触发该事件,newValue的值为子组件option的value属性值。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- select组件不支持click事件。 - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 子组件 + +支持<[option](../arkui-js/js-components-basic-option.md)>。 + + +## 属性 + +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| font-family | string | sans-serif | 否 | 字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | {newValue: newValue} | 下拉选择新值后触发该事件,newValue的值为子组件option的value属性值。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - select组件不支持click事件。 + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -101,5 +75,4 @@ } ``` -![](figures/zh-cn_image_0000001152588538.png) - +![zh-cn_image_0000001152588538](figures/zh-cn_image_0000001152588538.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-slider.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-slider.md index 19644290837..fec69835120 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-slider.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-slider.md @@ -1,235 +1,59 @@ -# slider +# slider + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 滑动条组件,用来快速调节设置值,如音量、亮度等。 -## 子组件 + +## 子组件 不支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| min | number | 0 | 否 | 滑动选择器的最小值。 | +| max | number | 100 | 否 | 滑动选择器的最大值。 | +| step | number | 1 | 否 | 每次滑动的步长。 | +| value | number | 0 | 否 | 滑动选择器的初始值。 | +| mode5+ | string | outset | 否 | 滑动条样式:
        - outset:滑块在滑杆上;
        - inset:滑块在滑杆内。 | +| showsteps5+ | boolean | false | 否 | 是否显示步长标识。 | +| showtips5+ | boolean | false | 否 | 滑动时是否有气泡提示百分比。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        min

        -

        number

        -

        0

        -

        -

        滑动选择器的最小值。

        -

        max

        -

        number

        -

        100

        -

        -

        滑动选择器的最大值。

        -

        step

        -

        number

        -

        1

        -

        -

        每次滑动的步长。

        -

        value

        -

        number

        -

        0

        -

        -

        滑动选择器的初始值。

        -

        mode5+

        -

        string

        -

        outset

        -

        -

        滑动条样式:

        -
        • outset:滑块在滑杆上;
        • inset:滑块在滑杆内。
          说明:

          仅手机和平板设备支持。

          -
          -
        -

        showsteps5+

        -

        boolean

        -

        false

        -

        -

        是否显示步长标识;

        -
        说明:

        仅手机和平板设备支持。

        -
        -

        showtips5+

        -

        boolean

        -

        false

        -

        -

        滑动时是否有气泡提示百分比;

        -
        说明:

        仅手机和平板设备支持。

        -
        -
        -## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #19000000

        -

        -

        滑动条的背景颜色。

        -

        selected-color

        -

        <color>

        -

        #ff007dff

        -

        -

        滑动条的已选择颜色。

        -

        block-color

        -

        <color>

        -

        #ffffff

        -

        -

        滑动条的滑块颜色。

        -
        说明:

        仅手机、平板和智慧屏设备支持。

        -
        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | #19000000 | 否 | 滑动条的背景颜色。 | +| selected-color | <color> | #ff007dff | 否 | 滑动条的已选择颜色。 | +| block-color | <color> | \#ffffff | 否 | 滑动条的滑块颜色。 | -## 事件 -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +## 事件 - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        ChangeEvent

        -

        选择值发生变化时触发该事件。

        -
        +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -**表 1** ChangeEvent +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | ChangeEvent | 选择值发生变化时触发该事件。 | - - - - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        progress(deprecated5+)

        -

        string

        -

        当前slider的进度值。

        -

        isEnd(deprecated5+)

        -

        string

        -

        当前slider是否拖拽结束,可选值为:

        -
        • true:slider拖拽结束。
        • false:slider拖拽中。
        -

        value5+

        -

        number

        -

        当前slider的进度值。

        -

        mode5+

        -

        string

        -

        当前change事件的类型,可选值为:

        -
        • start:slider的值开始改变。
        • move:slider的值跟随手指拖动中。
        • end:slider的值结束改变。
        -
        +**表1** ChangeEvent -## 示例 +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| value5+ | number | 当前slider的进度值。 | +| mode5+ | string | 当前change事件的类型,可选值为:
        - start:slider的值开始改变。
        - move:slider的值跟随手指拖动中。
        - end:slider的值结束改变。 | + + +## 示例 ``` @@ -248,7 +72,6 @@ justify-content: center; align-items: center; - } ``` @@ -276,5 +99,6 @@ export default { } ``` -![](figures/slider.png) +![zh-cn_image_0000001173324709](figures/zh-cn_image_0000001173324709.png) + diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-span.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-span.md index 657a0bbd8a9..1c8e3af694f 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-span.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-span.md @@ -1,129 +1,54 @@ -# span +# span -作为<[text](js-components-basic-text.md)\>子组件提供文本修饰能力。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -## 权限列表 +作为<[text](../arkui-js/js-components-basic-text.md)>子组件提供文本修饰能力。 + +## 权限列表 无 -## 子组件 -支持子组件。 +## 子组件 + +支持子组件<span>。 + -## 属性 +## 属性 -支持[通用属性](js-components-common-attributes.md)。 +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->不支持focusable和disabled属性。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 不支持focusable和disabled属性。 -## 样式 + +## 样式 仅支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        -

        -

        -

        设置文本段落的文本颜色。

        -

        font-size

        -

        <length>

        -

        30px

        -

        -

        设置文本段落的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        设置文本段落的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        font-style

        -

        string

        -

        normal

        -

        -

        设置文本段落的字体样式,见text组件font-style的样式属性

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        设置文本段落的字体粗细,见text组件font-weight的样式属性

        -

        text-decoration

        -

        string

        -

        none

        -

        -

        设置文本段落的文本修饰,见text组件text-decoration样式属性

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        设置文本段落的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        - -## 事件 - -仅支持[通用事件](js-components-common-events.md)中的click事件。 - -## 方法 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | - | 否 | 设置文本段落的文本颜色。 | +| font-size | <length> | 30px | 否 | 设置文本段落的文本尺寸。 | +| allow-scale | boolean | true | 否 | 设置文本段落的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| font-style | string | normal | 否 | 设置文本段落的字体样式,见[text组件font-style的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-weight | number \| string | normal | 否 | 设置文本段落的字体粗细,见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| text-decoration | string | none | 否 | 设置文本段落的文本修饰,见[text组件text-decoration样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | string | sans-serif | 否 | 设置文本段落的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | + + +## 事件 + +仅支持[通用事件](../arkui-js/js-components-common-events.md)中的click事件。 + + +## 方法 不支持。 -## 示例 + +## 示例 ``` @@ -153,5 +78,4 @@ } ``` -![](figures/zh-cn_image_0000001152588626.png) - +![zh-cn_image_0000001152588626](figures/zh-cn_image_0000001152588626.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-switch.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-switch.md index 95d5c8319bc..9d8e6bfc807 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-switch.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-switch.md @@ -1,214 +1,63 @@ -# switch +# switch + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 开关选择器,通过开关,开启或关闭某个功能。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| checked | boolean | false | 否 | 是否选中。 | +| showtext | boolean | false | 否 | 是否显示文本。 | +| texton | string | "On" | 否 | 选中时显示的文本。 | +| textoff | string | "Off" | 否 | 未选中时显示的文本。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        checked

        -

        boolean

        -

        false

        -

        -

        是否选中。

        -

        showtext

        -

        boolean

        -

        false

        -

        -

        是否显示文本。

        -

        texton

        -

        string

        -

        "On"

        -

        -

        选中时显示的文本。

        -

        textoff

        -

        string

        -

        "Off"

        -

        -

        未选中时显示的文本。

        -
        -## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        texton-color(Rich)

        -

        <color>

        -

        #000000

        -

        -

        选中时显示的文本颜色。

        -

        textoff-color(Rich)

        -

        <color>

        -

        #000000

        -

        -

        未选中时显示的文本颜色。

        -

        text-padding(Rich)

        -

        number

        -

        0px

        -

        -

        texton/textoff中最长文本两侧距离滑块边界的距离。

        -

        font-size(Rich)

        -

        <length>

        -

        -

        -

        -

        文本尺寸,仅设置texton和textoff生效。

        -

        allow-scale(Rich)

        -

        boolean

        -

        true

        -

        -

        文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        font-style(Rich)

        -

        string

        -

        normal

        -

        -

        字体样式,仅设置texton和textoff生效。见text组件font-style的样式属性

        -

        font-weight(Rich)

        -

        number | string

        -

        normal

        -

        -

        字体粗细,仅设置texton和textoff生效。见text组件的font-weight的样式属性

        -

        font-family(Rich)

        -

        string

        -

        sans-serif

        -

        -

        字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。仅设置texton和textoff生效。

        -
        -## 事件 +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| texton-color(Rich) | <color> | \#000000 | 否 | 选中时显示的文本颜色。 | +| textoff-color(Rich) | <color> | \#000000 | 否 | 未选中时显示的文本颜色。 | +| text-padding(Rich) | number | 0px | 否 | texton/textoff中最长文本两侧距离滑块边界的距离。 | +| font-size(Rich) | <length> | - | 否 | 文本尺寸,仅设置texton和textoff生效。 | +| allow-scale(Rich) | boolean | true | 否 | 文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| font-style(Rich) | string | normal | 否 | 字体样式,仅设置texton和textoff生效。见[text组件font-style的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-weight(Rich) | number \| string | normal | 否 | 字体粗细,仅设置texton和textoff生效。见[text组件的font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family(Rich) | string | sans-serif | 否 | 字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。仅设置texton和textoff生效。 | - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { checked: checkedValue }

        -

        选中状态改变时触发该事件。

        -
        -## 方法 +## 事件 -支持[通用方法](js-components-common-methods.md)。 +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -## 示例 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { checked: checkedValue } | 选中状态改变时触发该事件。 | + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + +## 示例 ``` @@ -254,5 +103,4 @@ export default { } ``` -![](figures/zh-cn_image_0000001152862510.gif) - +![zh-cn_image_0000001152862510](figures/zh-cn_image_0000001152862510.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-text.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-text.md index ffb96e5c30d..d2975d0745d 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-text.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-text.md @@ -1,320 +1,81 @@ -# text +# text -文本,用于呈现一段信息。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 该组件从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - 文本的展示内容需要写在元素标签内。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 文本的展示内容需要写在元素标签内。 +文本,用于呈现一段信息。 -## 权限列表 +## 权限列表 无 -## 子组件 -支持<[span](js-components-basic-span.md)\>。 +## 子组件 + +支持<[span](../arkui-js/js-components-basic-span.md)>。 + -## 属性 +## 属性 -支持[通用属性](js-components-common-attributes.md)。 +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 -## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e5000000

        -

        -

        设置文本的颜色。

        -

        font-size

        -

        <length>

        -

        30px

        -

        -

        设置文本的尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果需要支持动态生效,请参看config描述文件中config-changes标签。

        -
        -

        letter-spacing

        -

        <length>

        -

        0px

        -

        -

        设置文本的字符间距。

        -

        word-spacing7+

        -

        <length> | <percentage> | string

        -

        normal

        -

        -

        设置文本之间的间距,string可选值为:

        -

        normal:默认的字间距。

        -

        font-style

        -

        string

        -

        normal

        -

        -

        设置文本的字体样式,可选值为:

        -
        • normal:标准的字体样式;
        • italic:斜体的字体样式。
        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。

        -
        说明:

        number取值必须为100的整数倍。

        -
        -

        string类型取值支持如下四个值:lighter、normal、bold、bolder。

        -

        text-decoration

        -

        string

        -

        none

        -

        -

        设置文本的文本修饰,可选值为:

        -
        • underline:文字下划线修饰;
        • line-through:穿过文本的修饰线n
        • none:标准文本。
        -

        text-decoration-color7+

        -

        <color>

        -

        -

        -

        -

        设置文本修饰线的颜色。

        -

        text-align

        -

        string

        -

        start

        -

        -

        设置文本的文本对齐方式,可选值为:

        -
        • left:文本左对齐;
        • center:文本居中对齐;
        • right:文本右对齐;
        • start:根据文字书写相同的方向对齐;
        • end:根据文字书写相反的方向对齐。
        -
        说明:

        如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。

        -
        -

        line-height

        -

        <length> | <percentage>7+ | string7+

        -

        0px1-6

        -

        normal7+

        -

        -

        设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。string可选值为:

        -

        normal7+:默认的行高。

        -

        text-overflow

        -

        string

        -

        clip

        -

        -

        在设置了最大行数的情况下生效,可选值为:

        -
        • clip:将文本根据父容器大小进行裁剪显示;
        • ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。
        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -

        max-lines

        -

        number | string7+

        -

        -

        -

        -

        设置文本的最大行数,string类型可选值为:

        -
        • auto7+:文本行数自适应容器高度。
        -

        min-font-size

        -

        <length>

        -

        -

        -

        -

        文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

        -

        max-font-size

        -

        <length>

        -

        -

        -

        -

        文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

        -

        font-size-step

        -

        <length>

        -

        1px

        -

        -

        文本动态调整字号时的步长,需要设置最小,最大字号样式生效。

        -

        prefer-font-sizes

        -

        <array>

        -

        -

        -

        -

        预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。

        -

        如:prefer-font-sizes: 12px,14px,16px

        -

        word-break6+

        -

        string

        -

        normal

        -

        -

        设置文本折行模式,可选值为:

        -
        • normal:默认换行规则,依据各自语言的规则,允许在字间发生换行。
        • break-all:对于非中文/日文/韩文的文本,可在任意字符间断行。
        • break-word:与break-all相同,不同的地方在于它要求一个没有断行破发点的词必须保持为一个整体单位。
        -

        text-indent7+

        -

        <length>

        -

        -

        -

        -

        设置首行缩进量。

        -

        white-space7+

        -

        string

        -

        pre

        -

        -

        设置处理元素中空白的模式,可选值为:

        -
        • normal:所有空格、回车、制表符都合并成一个空格,文本自动换行;
        • nowrap:所有空格、回车、制表符都合并成一个空格,文本不换行;
        • pre:所有东西原样输出;
        • pre-wrap:所有东西原样输出,文本换行;
        • pre-line:所有空格、制表符合并成一个空格,回车不变,文本换行。
        -

        adapt-height7+

        -

        boolean

        -

        false

        -

        -

        文本大小是否自适应容器高度。

        -
        说明:

        设置字体大小自适应相关样式后生效。

        -
        -
        +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 字体动态缩放:预设尺寸集合和最小最大字号调节基于是否满足最大行数要求,预设尺寸集合会按照从左到右顺序查看是否满足最大行数要求,最小最大字号调节则基于从大到小顺序查看是否满足最大行数要求。 ->- 文本换行:文本可以通过转义字符\\r\\n进行换行。 ->- 文本标签内支持以下转义字符:\\a,\\b,\\f,\\n,\\r,\\t,\\v,\\',\\",\\0。 ->- 当使用子组件span组成文本段落时,如果span属性样式异常,将导致text段落无法显示。 ->- letter-spacing、text-align、line-height、text-overflow和max-lines样式作用于text及其子组件(span)组成的文本内容。 ->- text组件说明:不支持text内同时存在文本内容和span子组件。(如果同时存在,只显示span内的内容\) +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | #e5000000 | 否 | 设置文本的颜色。 | +| font-size | <length> | 30px | 否 | 设置文本的尺寸。 | +| allow-scale | boolean | true | 否 | 文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果需要支持动态生效,请参看config描述文件中config-changes标签。 | +| letter-spacing | <length> | 0px | 否 | 设置文本的字符间距。 | +| word-spacing7+ | <length> \| <percentage> \| string | normal | 否 | 设置文本之间的间距,string可选值为:
        normal:默认的字间距。 | +| font-style | string | normal | 否 | 设置文本的字体样式,可选值为:
        - normal:标准的字体样式;
        - italic:斜体的字体样式。 | +| font-weight | number \| string | normal | 否 | 设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > number取值必须为100的整数倍。
        string类型取值支持如下四个值:lighter、normal、bold、bolder。 | +| text-decoration | string | none | 否 | 设置文本的文本修饰,可选值为:
        - underline:文字下划线修饰;
        - line-through:穿过文本的修饰线n
        - none:标准文本。 | +| text-decoration-color7+ | <color> | - | 否 | 设置文本修饰线的颜色。 | +| text-align | string | start
        | 否 | 设置文本的文本对齐方式,可选值为:
        - left:文本左对齐;
        - center:文本居中对齐;
        - right:文本右对齐;
        - start:根据文字书写相同的方向对齐;
        - end:根据文字书写相反的方向对齐。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。 | +| line-height | <length> \| <percentage>7+ \| string7+ | 0px1-6
        normal7+ | 否 | 设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。string可选值为:
        normal7+:默认的行高。 | +| text-overflow | string | clip | 否 | 在设置了最大行数的情况下生效,可选值为:
        - clip:将文本根据父容器大小进行裁剪显示;
        - ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。 | +| font-family | string | sans-serif | 否 | 设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | +| max-lines | number \| string7+ | - | 否 | 设置文本的最大行数,string类型可选值为:
        - auto7+:文本行数自适应容器高度。 | +| min-font-size | <length> | - | 否 | 文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。 | +| max-font-size | <length> | - | 否 | 文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。 | +| font-size-step | <length> | 1px | 否 | 文本动态调整字号时的步长,需要设置最小,最大字号样式生效。 | +| prefer-font-sizes | <array> | - | 否 | 预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。
        如:prefer-font-sizes: 12px,14px,16px | +| word-break6+ | string | normal | 否 | 设置文本折行模式,可选值为:
        - normal:默认换行规则,依据各自语言的规则,允许在字间发生换行。
        - break-all:对于非中文/日文/韩文的文本,可在任意字符间断行。
        - break-word:与break-all相同,不同的地方在于它要求一个没有断行破发点的词必须保持为一个整体单位。 | +| text-indent7+ | <length> | - | 否 | 设置首行缩进量。 | +| white-space7+ | string | pre | 否 | 设置处理元素中空白的模式,可选值为:
        - normal:所有空格、回车、制表符都合并成一个空格,文本自动换行;
        - nowrap:所有空格、回车、制表符都合并成一个空格,文本不换行;
        - pre:所有东西原样输出;
        - pre-wrap:所有东西原样输出,文本换行;
        - pre-line:所有空格、制表符合并成一个空格,回车不变,文本换行。 | +| adapt-height7+ | boolean | false | 否 | 文本大小是否自适应容器高度。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 设置字体大小自适应相关样式后生效。 | -## 事件 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 字体动态缩放:预设尺寸集合和最小最大字号调节基于是否满足最大行数要求,预设尺寸集合会按照从左到右顺序查看是否满足最大行数要求,最小最大字号调节则基于从大到小顺序查看是否满足最大行数要求。 +> +> - 文本换行:文本可以通过转义字符\r\n进行换行。 +> +> - 文本标签内支持以下转义字符:\a,\b,\f,\n,\r,\t,\v,\',\",\0。 +> +> - 当使用子组件span组成文本段落时,如果span属性样式异常,将导致text段落无法显示。 +> +> - letter-spacing、text-align、line-height、text-overflow和max-lines样式作用于text及其子组件(span)组成的文本内容。 +> +> - text组件说明:不支持text内同时存在文本内容和span子组件。(如果同时存在,只显示span内的内容) -支持[通用事件](js-components-common-events.md)。 -## 方法 +## 事件 -支持[通用方法](js-components-common-methods.md)。 +支持[通用事件](../arkui-js/js-components-common-events.md)。 -## 示例 +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -361,7 +122,7 @@ export default { } ``` -![](figures/3.png) +![zh-cn_image_0000001167823076](figures/zh-cn_image_0000001167823076.png) ``` @@ -400,5 +161,4 @@ export default { } ``` -![](figures/2.png) - +![zh-cn_image_0000001213103299](figures/zh-cn_image_0000001213103299.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-textarea.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-textarea.md index 0d9ee4508e1..37c5ca2da80 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-textarea.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-textarea.md @@ -1,345 +1,82 @@ -# textarea +# textarea + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 多行文本输入的文本框。 -## 权限列表 + +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| placeholder | string | - | 否 | 多行文本框的提示文本内容。 | +| maxlength | number | - | 否 | 多行文本框可输入的最多字符数量。 | +| headericon | string | - | 否 | 在文本输入前的图标展示,该图标不支持点击事件,图标格式为jpg,png和svg。 | +| extend | boolean | false | 否 | 文本框是否支持可扩展,设置可扩展属性后文本框高度可以跟随文字自适应。 | +| value5+ | string | - | 否 | 多行文本框的内容。 | +| showcounter5+ | boolean | false | 否 | 文本框是否需要开启计数下标功能,需要配合maxlength一起使用。 | +| menuoptions5+ | Array<MenuOption> | - | 否 | 设置文本选择弹框点击更多按钮之后显示的菜单项。 | +| autofocus6+ | boolean | false | 否 | 是否自动获焦。 | +| selectedstart6+ | number | -1 | 否 | 开始选择文本时初始选择位置。 | +| selectedend6+ | number | -1 | 否 | 开始选择文本时结尾选择位置。 | +| softkeyboardenabled6+ | boolean | true | 否 | 编辑时是否弹出系统软键盘。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        placeholder

        -

        string

        -

        -

        -

        -

        多行文本框的提示文本内容。

        -

        maxlength

        -

        number

        -

        -

        -

        -

        多行文本框可输入的最多字符数量。

        -

        headericon

        -

        string

        -

        -

        -

        -

        在文本输入前的图标展示,该图标不支持点击事件,图标格式为jpg,png和svg。

        -

        extend

        -

        boolean

        -

        false

        -

        -

        文本框是否支持可扩展,设置可扩展属性后文本框高度可以跟随文字自适应。

        -

        value5+

        -

        string

        -

        -

        -

        -

        多行文本框的内容。

        -

        showcounter5+

        -

        boolean

        -

        false

        -

        -

        文本框是否需要开启计数下标功能,需要配合maxlength一起使用。

        -

        menuoptions5+

        -

        Array<MenuOption>

        -

        -

        -

        -

        设置文本选择弹框点击更多按钮之后显示的菜单项。

        -

        autofocus6+

        -

        boolean

        -

        false

        -

        -

        是否自动获焦。

        -

        selectedstart6+

        -

        number

        -

        -1

        -

        -

        开始选择文本时初始选择位置。

        -

        selectedend6+

        -

        number

        -

        -1

        -

        -

        开始选择文本时结尾选择位置。

        -

        softkeyboardenabled6+

        -

        boolean

        -

        true

        -

        -

        编辑时是否弹出系统软键盘。

        -
        +**表1** MenuOption5+ -**表 1** MenuOption5+ +| 名称 | 类型 | 描述 | +| -------- | -------- | -------- | +| icon | string | 菜单选项中的图标路径。 | +| content | string | 菜单选项中的文本内容。 | - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        描述

        -

        icon

        -

        string

        -

        菜单选项中的图标路径。

        -

        content

        -

        string

        -

        菜单选项中的文本内容。

        -
        -## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e6000000

        -

        -

        多行文本框的文本颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        多行文本框的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        多行文本框的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        placeholder-color

        -

        <color>

        -

        #99000000

        -

        -

        多行文本框的提示文本颜色,type为text|email|date|time|number|password时生效。

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        多行文本框的字体粗细,见text组件font-weight的样式属性

        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        多行文本框的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -

        caret-color6+

        -

        <color>

        -

        -

        -

        -

        设置输入光标的颜色。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#e6000000 | 否 | 多行文本框的文本颜色。 | +| font-size | <length> | 16px | 否 | 多行文本框的文本尺寸。 | +| allow-scale | boolean | true | 否 | 多行文本框的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| placeholder-color | <color> | \#99000000 | 否 | 多行文本框的提示文本颜色,type为text\|email\|date\|time\|number\|password时生效。 | +| font-weight | number \| string | normal | 否 | 多行文本框的字体粗细,见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | string | sans-serif | 否 | 多行文本框的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | +| caret-color6+ | <color> | - | 否 | 设置输入光标的颜色。 | -## 事件 -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { text: newText, lines: textLines, height: textHeight }

        -

        输入内容发生变化时触发该事件,通过参数获取输入内容、行数和行高。

        -
        说明:

        改变value属性值不会触发该回调。5+

        -
        -

        translate5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。

        -

        share5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。

        -

        search5+

        -

        { value: selectedText }

        -

        设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。

        -

        optionselect5+

        -

        { index:optionIndex, value: selectedText }

        -

        文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。

        -

        selectchange6+

        -

        { start: number,end: number }

        -

        文本选择变化时触发事件。

        -
        +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -## 方法 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { text: newText, lines: textLines, height: textHeight } | 输入内容发生变化时触发该事件,通过参数获取输入内容、行数和行高。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 改变value属性值不会触发该回调。5+ | +| translate5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。 | +| share5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。 | +| search5+ | { value: selectedText } | 设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。 | +| optionselect5+ | { index:optionIndex, value: selectedText } | 文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。 | +| selectchange6+ | { start: number,end: number } | 文本选择变化时触发事件。 | -支持[通用方法](js-components-common-methods.md)。 -## 示例 +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -369,5 +106,4 @@ change(e){ } ``` -![](figures/zh-cn_image_0000001127125124.png) - +![zh-cn_image_0000001127125124](figures/zh-cn_image_0000001127125124.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-toggle.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-toggle.md index 300959e89d4..a4693c14a7e 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-toggle.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-toggle.md @@ -1,170 +1,60 @@ -# toggle +# toggle + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 状态按钮用于从一组选项中进行选择,并可能在界面上实时显示选择后的结果。通常这一组选项都是由状态按钮构成。 -## 权限列表 + +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        value

        -

        string

        -

        -

        -

        -

        状态按钮的文本值。

        -

        checked

        -

        boolean

        -

        false

        -

        -

        状态按钮是否被选中。

        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        text-color

        -

        <color>

        -

        #E5000000

        -

        -

        状态按钮的文本颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        状态按钮的文本尺寸。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        状态按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -
        说明:

        如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

        -
        -

        font-style

        -

        string

        -

        normal

        -

        -

        状态按钮的字体样式。

        -

        font-weight

        -

        number | string

        -

        normal

        -

        -

        状态按钮的字体粗细。见text组件font-weight的样式属性

        -

        font-family

        -

        <string>

        -

        sans-serif

        -

        -

        状态按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { checked:isChecked }

        -

        组件选中状态发生变化时触发。

        -
        - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| value | string | - | 是 | 状态按钮的文本值。 | +| checked | boolean | false | 否 | 状态按钮是否被选中。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| text-color | <color> | \#E5000000 | 否 | 状态按钮的文本颜色。 | +| font-size | <length> | 16px | 否 | 状态按钮的文本尺寸。 | +| allow-scale | boolean | true | 否 | 状态按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。 | +| font-style | string | normal | 否 | 状态按钮的字体样式。 | +| font-weight | number \| string | normal | 否 | 状态按钮的字体粗细。见[text组件font-weight的样式属性](../arkui-js/js-components-basic-text.md#样式)。 | +| font-family | <string> | sans-serif | 否 | 状态按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { checked:isChecked } | 组件选中状态发生变化时触发。 | + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -222,5 +112,4 @@ export default { } ``` -![](figures/screenshot.png) - +![zh-cn_image_0000001173164927](figures/zh-cn_image_0000001173164927.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar-item.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar-item.md index a67f201a727..21e0b16883e 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar-item.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar-item.md @@ -1,271 +1,61 @@ -# toolbar-item +# toolbar-item + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 工具栏子组件。作为工具栏组件的子组件,用于展示工具栏上的一个操作选项。 -## 子组件 + +## 子组件 无 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| value | string | - | 是 | 该操作项文本内容。 | +| icon | string | - | 是 | 该操作项图标资源路径,该图标展示在选项文本上,支持本地路径,格式为png,jpg和svg。 | - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        value

        -

        string

        -

        -

        -

        -

        该操作项文本内容。

        -

        icon

        -

        string

        -

        -

        -

        -

        该操作项图标资源路径,该图标展示在选项文本上,支持本地路径,格式为png,jpg和svg。

        -
        -## 样式 +## 样式 仅支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        #e6000000

        -

        -

        文本颜色。

        -

        font-size

        -

        <length>

        -

        16px

        -

        -

        文本大小。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -

        font-style

        -

        string

        -

        normal

        -

        -

        文本字体样式,可选值为:

        -
        1. normal: 标准的字体样式;
        2. italic: 斜体的字体样式。
        -

        font-weight

        -

        number|string

        -

        normal

        -

        -

        文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。

        -

        text-decoration

        -

        string

        -

        none

        -

        -

        文本修饰,可选值为:

        -
        1. underline: 文本下划线修饰;
        2. line-through: 穿过文本的修饰线;
        3. none: 标准文本。
        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -

        background

        -

        <linear-gradient>

        -

        -

        -

        -

        仅支持设置渐变样式,与background-color、background-image不兼容。

        -

        background-color

        -

        <color>

        -

        -

        -

        -

        设置背景颜色。

        -

        background-image

        -

        string

        -

        -

        -

        -

        设置背景图片。与background-color、background不兼容;支持网络图片资源和本地图片资源地址。

        -

        background-size

        -
        • string
        • <length> <length>
        • <percentage> <percentage>
        -

        auto

        -

        -

        设置背景图片的大小。

        -
        • string可选值:
          • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
          • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
          • auto:保持原图的比例不变。
          -
        • length值参数方式:

          设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

          -
        • 百分比参数方式:

          以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

          -
        -

        background-repeat

        -

        string

        -

        repeat

        -

        -

        针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

        -
        • repeat:在水平轴和竖直轴上同时重复绘制图片。
        • repeat-x:只在水平轴上重复绘制图片。
        • repeat-y:只在竖直轴上重复绘制图片。
        • no-repeat:不会重复绘制图片。
        -

        background-position

        -
        • string string
        • <length> <length>
        • <percentage> <percentage>
        -

        0px 0px

        -

        -
        • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
          • left:水平方向上最左侧。
          • right:水平方向上最右侧。
          • top:竖直方向上最顶部。
          • bottom:竖直方向上最底部。
          • center:水平方向或竖直方向上中间位置。
          -
        -
        • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
        • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
        • 可以混合使用<percentage>和<length>。
        -

        opacity

        -

        number

        -

        1

        -

        -

        元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

        -

        display

        -

        string

        -

        -

        flex

        -

        -

        确定一个元素所产生的框的类型,可选值为:

        -
        • flex:弹性布局。
        • none:不渲染此元素。
        -

        visibility

        -

        string

        -

        -

        visible

        -

        -

        是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

        -
        • visible:元素正常显示。
        • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
        -
        说明:

        visibility和display样式都设置时,仅display生效。

        -
        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | \#e6000000 | 否 | 文本颜色。 | +| font-size | <length> | 16px | 否 | 文本大小。 | +| allow-scale | boolean | true | 否 | 文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。 | +| font-style | string | normal | 否 | 文本字体样式,可选值为:
        1. normal: 标准的字体样式;
        2. italic: 斜体的字体样式。 | +| font-weight | number\|string | normal | 否 | 文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。 | +| text-decoration | string | none | 否 | 文本修饰,可选值为:
        1. underline: 文本下划线修饰;
        2. line-through: 穿过文本的修饰线;
        3. none: 标准文本。 | +| font-family | string | sans-serif | 否 | 字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | +| background | <linear-gradient> | - | 否 | 仅支持设置[渐变样式](../arkui-js/js-components-common-gradient.md),与background-color、background-image不兼容。 | +| background-color | <color> | - | 否 | 设置背景颜色。 | +| background-image | string | - | 否 | 设置背景图片。与background-color、background不兼容;支持网络图片资源和本地图片资源地址。 | +| background-size | - string
        - <length> <length>
        - <percentage> <percentage> | auto | 否 | 设置背景图片的大小。
        - string可选值:
          - contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
          - cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
          - auto:保持原图的比例不变。
        - length值参数方式:
          设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。
        - 百分比参数方式:
          以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。 | +| background-repeat | string | repeat | 否 | 针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。
        - repeat:在水平轴和竖直轴上同时重复绘制图片。
        - repeat-x:只在水平轴上重复绘制图片。
        - repeat-y:只在竖直轴上重复绘制图片。
        - no-repeat:不会重复绘制图片。 | +| background-position | - string string
        - <length> <length>
        - <percentage> <percentage> | 0px 0px | 否 | - 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
          - left:水平方向上最左侧。
          - right:水平方向上最右侧。
          - top:竖直方向上最顶部。
          - bottom:竖直方向上最底部。
          - center:水平方向或竖直方向上中间位置。
        - length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px)  。如果仅规定了一个值,另外一个值将是50%。
        - 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
        - 可以混合使用<percentage>和<length>。 | +| opacity | number | 1 | 否 | 元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。 | +| display | string | flex | 否 | 确定一个元素所产生的框的类型,可选值为:
        - flex:弹性布局。
        - none:不渲染此元素。 | +| visibility | string | visible | 否 | 是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:
        - visible:元素正常显示。
        - hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > visibility和display样式都设置时,仅display生效。 | -## 事件 -支持[通用事件](js-components-common-events.md)。 +## 事件 -## 方法 +支持[通用事件](../arkui-js/js-components-common-events.md)。 + + +## 方法 不支持。 -## 示例 + +## 示例 ``` @@ -279,5 +69,4 @@ ``` -![](figures/000000.jpg) - +![zh-cn_image_0000001127285072](figures/zh-cn_image_0000001127285072.jpg) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar.md index f2c03a3ac53..c0338b3f7c3 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-toolbar.md @@ -1,38 +1,47 @@ -# toolbar +# toolbar + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 工具栏。放在界面底部,用于展示针对当前界面的操作选项。 -## 权限列表 + +## 权限列表 无 -## 子组件 -支持子组件。 +## 子组件 + +支持<toolbar-item>子组件。 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 工具栏最多可以展示5个toolbar-item子组件,如果存在6个及以上toolbar-item子组件,则保留前面4个子组件,后续的子组件收纳到工具栏上的更多项中,通过点击更多项弹窗展示剩下的子组件,更多项展示的组件样式采用系统默认样式,toolbar-item上设置的自定义样式不生效。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->工具栏最多可以展示5个toolbar-item子组件,如果存在6个及以上toolbar-item子组件,则保留前面4个子组件,后续的子组件收纳到工具栏上的更多项中,通过点击更多项弹窗展示剩下的子组件,更多项展示的组件样式采用系统默认样式,toolbar-item上设置的自定义样式不生效。 -## 属性 +## 属性 -支持[通用属性](js-components-common-attributes.md)。 +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 -## 样式 -支持[通用样式](js-components-common-styles.md)。 +## 样式 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->不支持height样式,高度固定为56px。 +支持[通用样式](../arkui-js/js-components-common-styles.md)。 -## 事件 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 不支持height样式,高度固定为56px。 + + +## 事件 不支持。 -## 方法 + +## 方法 不支持。 -## 示例 -详见[toolbar-item示例](js-components-basic-toolbar-item.md)。 +## 示例 +详见[toolbar-item示例](../arkui-js/js-components-basic-toolbar-item.md)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic.md index e03bcd63f03..6c21e41f39d 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic.md @@ -1,57 +1,57 @@ -# 基础组件 +# 基础组件 -- **[button](js-components-basic-button.md)** -- **[chart](js-components-basic-chart.md)** -- **[divider](js-components-basic-divider.md)** +- **[button](js-components-basic-button.md)** -- **[image](js-components-basic-image.md)** +- **[chart](js-components-basic-chart.md)** -- **[image-animator](js-components-basic-image-animator.md)** +- **[divider](js-components-basic-divider.md)** -- **[input](js-components-basic-input.md)** +- **[image](js-components-basic-image.md)** -- **[label](js-components-basic-label.md)** +- **[image-animator](js-components-basic-image-animator.md)** -- **[marquee](js-components-basic-marquee.md)** +- **[input](js-components-basic-input.md)** -- **[menu](js-components-basic-menu.md)** +- **[label](js-components-basic-label.md)** -- **[option](js-components-basic-option.md)** +- **[marquee](js-components-basic-marquee.md)** -- **[picker](js-components-basic-picker.md)** +- **[menu](js-components-basic-menu.md)** -- **[picker-view](js-components-basic-picker-view.md)** +- **[option](js-components-basic-option.md)** -- **[piece](js-components-basic-piece.md)** +- **[picker](js-components-basic-picker.md)** -- **[progress](js-components-basic-progress.md)** +- **[picker-view](js-components-basic-picker-view.md)** -- **[qrcode](js-components-basic-qrcode.md)** +- **[piece](js-components-basic-piece.md)** -- **[rating](js-components-basic-rating.md)** +- **[progress](js-components-basic-progress.md)** -- **[richtext](js-components-basic-richtext.md)** +- **[qrcode](js-components-basic-qrcode.md)** -- **[search](js-components-basic-search.md)** +- **[rating](js-components-basic-rating.md)** -- **[select](js-components-basic-select.md)** +- **[richtext](js-components-basic-richtext.md)** -- **[slider](js-components-basic-slider.md)** +- **[search](js-components-basic-search.md)** -- **[span](js-components-basic-span.md)** +- **[select](js-components-basic-select.md)** -- **[switch](js-components-basic-switch.md)** +- **[slider](js-components-basic-slider.md)** -- **[text](js-components-basic-text.md)** +- **[span](js-components-basic-span.md)** -- **[textarea](js-components-basic-textarea.md)** +- **[switch](js-components-basic-switch.md)** -- **[toolbar](js-components-basic-toolbar.md)** +- **[text](js-components-basic-text.md)** -- **[toolbar-item](js-components-basic-toolbar-item.md)** +- **[textarea](js-components-basic-textarea.md)** -- **[toggle](js-components-basic-toggle.md)** +- **[toolbar](js-components-basic-toolbar.md)** +- **[toolbar-item](js-components-basic-toolbar-item.md)** +- **[toggle](js-components-basic-toggle.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvas.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvas.md index 2282db3ba56..ffd3d1426f8 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvas.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvas.md @@ -1,165 +1,81 @@ -# canvas组件 +# canvas组件 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 提供画布组件。用于自定义绘制图形。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 -支持[通用属性](js-components-common-attributes.md)。 +## 属性 + +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 + + +## 样式 + +支持[通用样式](../arkui-js/js-components-common-styles.md)。 + -## 样式 +## 事件 -支持[通用样式](js-components-common-styles.md)。 +支持[通用事件](../arkui-js/js-components-common-events.md)。 -## 事件 -支持[通用事件](js-components-common-events.md)。 +## 方法 -## 方法 +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: -### getContext +### getContext -getContext\(type: '2d', options?: ContextAttrOptions\): CanvasRendering2dContext +getContext(type: '2d', options?: ContextAttrOptions): CanvasRendering2dContext 获取canvas绘图上下文。不支持在onInit和onReady中进行调用。 -- 参数 - - - - - - - - - - - - - - - - - - -

        参数名

        -

        参数类型

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        -

        设置为'2d',返回值为2D绘制对象,该对象可用于在画布组件上绘制矩形、文本、图片等。

        -

        options6+

        -

        ContextAttrOptions

        -

        -

        当前仅支持配置是否开启抗锯齿功能,默认为关闭。

        -
        - - **表 1** ContextAttrOptions - - - - - - - - - - - - -

        参数名

        -

        类型

        -

        说明

        -

        antialias

        -

        boolean

        -

        是否开启抗锯齿功能,默认为false。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        CanvasRenderingContext2D

        -

        用于在画布组件上绘制矩形、文本、图片等

        -
        - - -### toDataURL6+ - -toDataURL\(type?: string, quality?: number\): string +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 设置为'2d',返回值为2D绘制对象,该对象可用于在画布组件上绘制矩形、文本、图片等。 | + | options6+ | ContextAttrOptions | 否 | 当前仅支持配置是否开启抗锯齿功能,默认为关闭。 | + + **表1** ContextAttrOptions + + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | antialias | boolean | 是否开启抗锯齿功能,默认为false。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | [CanvasRenderingContext2D](../arkui-js/js-components-canvas-canvasrenderingcontext2d.md) | 用于在画布组件上绘制矩形、文本、图片等。 | + +### toDataURL6+ + +toDataURL(type?: string, quality?: number): string 生成一个包含图片展示的URL。 -- 参数 - - - - - - - - - - - - - - - - - - -

        参数名

        -

        参数类型

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        -

        可选参数,用于指定图像格式,默认格式为image/png。

        -

        quality

        -

        number

        -

        -

        在指定图片格式为image/jpeg或image/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        string

        -

        图像的URL地址。

        -
        - - -## 示例 +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | type | string | 否 | 可选参数,用于指定图像格式,默认格式为image/png。 | + | quality | number | 否 | 在指定图片格式为image/jpeg或image/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | string | 图像的URL地址。 | + +## 示例 ``` @@ -180,4 +96,3 @@ export default { } } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasgradient.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasgradient.md index 11b339ea2de..376fcb47b32 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasgradient.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasgradient.md @@ -1,63 +1,43 @@ -# CanvasGradient对象 +# CanvasGradient对象 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 渐变对象。 -## addColorStop -addColorStop\(offset: number, color: string\): void +## addColorStop + +addColorStop(offset: number, color: string): void 设置渐变断点值,包括偏移和颜色。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        offset

        -

        number

        -

        设置渐变点距离起点的位置占总体长度的比例,范围为0到1。

        -

        color

        -

        string

        -

        设置渐变的颜色。

        -
        - -- 示例 - - ``` - -
        - - -
        - ``` - - ``` - // xxx.js - export default { - handleClick() { - const el =this.$refs.canvas; - const ctx =el.getContext('2d'); - const gradient = ctx.createLinearGradient(0,0,100,0); - gradient.addColorStop(0,'#00ffff'); - gradient.addColorStop(1,'#ffff00'); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | offset | number | 设置渐变点距离起点的位置占总体长度的比例,范围为0到1。 | + | color | string | 设置渐变的颜色。 | + +- 示例 + ``` + +
        + + +
        + ``` + + ``` + // xxx.js + export default { + handleClick() { + const el =this.$refs.canvas; + const ctx =el.getContext('2d'); + const gradient = ctx.createLinearGradient(0,0,100,0); + gradient.addColorStop(0,'#00ffff'); + gradient.addColorStop(1,'#ffff00'); } - ``` - - ![](figures/zh-cn_image_0000001152610806.png) - + } + ``` + ![zh-cn_image_0000001152610806](figures/zh-cn_image_0000001152610806.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md index 0a80d1c92e4..91ae2975bd8 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md @@ -1,227 +1,66 @@ -# CanvasRenderingContext2D对象 +# CanvasRenderingContext2D对象 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 使用CanvasRenderingContext2D在canvas画布组件上进行绘制,绘制对象可以是矩形、文本、图片等。 -- 示例 - - ``` - -
        - - - -
        - ``` - - ``` - // xxx.js - export default { - handleClick() { - const el = this.$refs.canvas1; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.arc(100, 75, 50, 0, 6.28); - ctx.stroke(); - }, - antialias() { - const el = this.$refs.canvas1; - const ctx = el.getContext('2d', { antialias: true }); - ctx.beginPath(); - ctx.arc(100, 75, 50, 0, 6.28); - ctx.stroke(); - } - } - ``` - - -- 示意图(关闭抗锯齿) - - ![](figures/zh-cn_image_0000001214837333.png) - -- 示意图(开启抗锯齿) - - ![](figures/zh-cn_image_0000001127125162.png) - - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        fillStyle

        -

        <color> | CanvasGradient | CanvasPattern

        -

        -

        -

        指定绘制的填充色。

        -
        • 类型为<color>时,表示设置填充区域的颜色。
        • 类型为CanvasGradient时,表示渐变对象,使用 createLinearGradient()方法创建。
        • 类型为CanvasPattern时,使用 createPattern()方法创建。
        -

        lineWidth

        -

        number

        -

        -

        -

        设置绘制线条的宽度。

        -

        strokeStyle

        -

        <color> | CanvasGradient | CanvasPattern

        -

        -

        -

        设置描边的颜色。

        -
        • 类型为<color>时,表示设置描边使用的颜色。
        • 类型为CanvasGradient时,表示渐变对象,使用 createLinearGradient()方法创建。
        • 类型为CanvasPattern时,使用 createPattern()方法创建。
        -

        lineCap

        -

        string

        -

        butt

        -

        指定线端点的样式,可选值为:

        -
        • butt:线端点以方形结束。
        • round:线端点以圆形结束。
        • square:线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。
        -

        lineJoin

        -

        string

        -

        miter

        -

        指定线段间相交的交点样式,可选值为:

        -
        • round:在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。
        • bevel:在线段相连处使用三角形为底填充, 每个部分矩形拐角独立。
        • miter:在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。
        -

        miterLimit

        -

        number

        -

        10

        -

        设置斜接面限制值,该值指定了线条相交处内角和外角的距离。

        -

        font

        -

        string

        -

        "normal normal 14px sans-serif"

        -

        设置文本绘制中的字体样式。

        -

        语法:ctx.font="font-style font-weight font-size font-family"5+

        -
        • font-style(可选),用于指定字体样式,支持如下几种样式:normal, italic。
        • font-weight(可选),用于指定字体的粗细,支持如下几种类型:normal, bold, bolder, lighter, 100, 200, 300, 400, 500, 600, 700, 800, 900。
        • font-size(可选),指定字号和行高,单位只支持px。
        • font-family(可选),指定字体系列,支持如下几种类型:sans-serif, serif, monospace。
        -

        textAlign

        -

        string

        -

        left

        -

        设置文本绘制中的文本对齐方式,可选值为:

        -
        • left:文本左对齐。
        • right:文本右对齐。
        • center:文本居中对齐。
        • start:文本对齐界线开始的地方。
        • end:文本对齐界线结束的地方。
        -
        说明:

        ltr布局模式下start和left一致,rtl布局模式下start和right一致·。

        -
        -

        textBaseline

        -

        string

        -

        alphabetic

        -

        设置文本绘制中的水平对齐方式,可选值为:

        -
        • alphabetic:文本基线是标准的字母基线。
        • top:文本基线在文本块的顶部。
        • hanging:文本基线是悬挂基线。
        • middle:文本基线在文本块的中间。
        • ideographic:文字基线是表意字基线;如果字符本身超出了alphabetic 基线,那么ideographic基线位置在字符本身的底部。
        • bottom:文本基线在文本块的底部。 与 ideographic 基线的区别在于 ideographic 基线不需要考虑下行字母。
        -

        globalAlpha

        -

        number

        -

        -

        -

        设置透明度,0.0为完全透明,1.0为完全不透明。

        -

        lineDashOffset

        -

        number

        -

        0.0

        -

        设置画布的虚线偏移量,精度为float。

        -

        globalCompositeOperation

        -

        string

        -

        source-over

        -

        设置合成操作的方式。类型字段可选值有source-over,source-atop,source-in,source-out,destination-over,destination-atop,destination-in,destination-out,lighter,copy,xor。具体请参考类型字段说明

        -

        shadowBlur

        -

        number

        -

        0.0

        -

        设置绘制阴影时的模糊级别,值越大越模糊,精度为float。

        -

        shadowColor

        -

        <color>

        -

        -

        -

        设置绘制阴影时的阴影颜色。

        -

        shadowOffsetX

        -

        number

        -

        -

        -

        设置绘制阴影时和原有对象的水平偏移值。

        -

        shadowOffsetY

        -

        number

        -

        -

        -

        设置绘制阴影时和原有对象的垂直偏移值。

        -

        imageSmoothingEnabled6+

        -

        boolean

        -

        true

        -

        用于设置绘制图片时是否进行图像平滑度调整,true为启用,false为不启用。

        -
        - -### fillStyle + +- 示例 + ``` + +
        + + + <input type="button" style="width: 180px; height: 60px;" value="fillStyle" onclick="antialias" />
        + ``` + + ``` + // xxx.js + export default { + handleClick() { + const el = this.$refs.canvas1; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.arc(100, 75, 50, 0, 6.28); + ctx.stroke(); + }, + antialias() { + const el = this.$refs.canvas1; + const ctx = el.getContext('2d', { antialias: true }); ctx.beginPath(); ctx.arc(100, 75, 50, 0, 6.28); ctx.stroke(); }} + ``` + +- 示意图(关闭抗锯齿) + ![zh-cn_image_0000001214837333](figures/zh-cn_image_0000001214837333.png) + +- 示意图(开启抗锯齿) + ![zh-cn_image_0000001127125162](figures/zh-cn_image_0000001127125162.png) + + +## 属性 + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| [fillStyle](#fillstyle) | <color> \| [CanvasGradient](../arkui-js/js-components-canvas-canvasgradient.md) \| CanvasPattern | - | 指定绘制的填充色。
        - 类型为<color>时,表示设置填充区域的颜色。
        - 类型为CanvasGradient时,表示渐变对象,使用 createLinearGradient()方法创建。
        - 类型为CanvasPattern时,使用 createPattern()方法创建。 | +| [lineWidth](#linewidth) | number | - | 设置绘制线条的宽度。 | +| [strokeStyle](#strokestyle) | <color> \| [CanvasGradient](../arkui-js/js-components-canvas-canvasgradient.md) \| CanvasPattern | - | 设置描边的颜色。
        - 类型为<color>时,表示设置描边使用的颜色。
        - 类型为CanvasGradient时,表示渐变对象,使用 createLinearGradient()方法创建。
        - 类型为CanvasPattern时,使用 createPattern()方法创建。 | +| [lineCap](#linecap) | string | butt | 指定线端点的样式,可选值为:
        - butt:线端点以方形结束。
        - round:线端点以圆形结束。
        - square:线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。 | +| [lineJoin](#linejoin) | string | miter | 指定线段间相交的交点样式,可选值为:
        - round:在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。
        - bevel:在线段相连处使用三角形为底填充, 每个部分矩形拐角独立。
        - miter:在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。 | +| [miterLimit](#miterlimit) | number | 10 | 设置斜接面限制值,该值指定了线条相交处内角和外角的距离。 | +| [font](#font) | string | "normal normal 14px sans-serif" | 设置文本绘制中的字体样式。
        语法:ctx.font="font-style font-weight font-size font-family"5+
        - font-style(可选),用于指定字体样式,支持如下几种样式:normal, italic。
        - font-weight(可选),用于指定字体的粗细,支持如下几种类型:normal, bold, bolder, lighter, 100, 200, 300, 400, 500, 600, 700, 800, 900。
        - font-size(可选),指定字号和行高,单位只支持px。
        - font-family(可选),指定字体系列,支持如下几种类型:sans-serif, serif, monospace。 | +| [textAlign](#textalign) | string | left | 设置文本绘制中的文本对齐方式,可选值为:
        - left:文本左对齐。
        - right:文本右对齐。
        - center:文本居中对齐。
        - start:文本对齐界线开始的地方。
        - end:文本对齐界线结束的地方。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > ltr布局模式下start和left一致,rtl布局模式下start和right一致·。 | +| [textBaseline](#textbaseline) | string | alphabetic | 设置文本绘制中的水平对齐方式,可选值为:
        - alphabetic:文本基线是标准的字母基线。
        - top:文本基线在文本块的顶部。
        - hanging:文本基线是悬挂基线。
        - middle:文本基线在文本块的中间。
        - ideographic:文字基线是表意字基线;如果字符本身超出了alphabetic 基线,那么ideographic基线位置在字符本身的底部。
        - bottom:文本基线在文本块的底部。 与 ideographic 基线的区别在于 ideographic 基线不需要考虑下行字母。 | +| [globalAlpha](#globalalpha) | number | - | 设置透明度,0.0为完全透明,1.0为完全不透明。 | +| [lineDashOffset](#linedashoffset) | number | 0.0 | 设置画布的虚线偏移量,精度为float。 | +| [globalCompositeOperation](#globalcompositeoperation) | string | source-over | 设置合成操作的方式。类型字段可选值有source-over,source-atop,source-in,source-out,destination-over,destination-atop,destination-in,destination-out,lighter,copy,xor。具体请参考[表 类型字段说明](#globalcompositeoperation)。 | +| [shadowBlur](#shadowblur) | number | 0.0 | 设置绘制阴影时的模糊级别,值越大越模糊,精度为float。 | +| [shadowColor](#shadowcolor) | <color> | - | 设置绘制阴影时的阴影颜色。 | +| [shadowOffsetX](#shadowoffsetx) | number | - | 设置绘制阴影时和原有对象的水平偏移值。 | +| [shadowOffsetY](#shadowoffsety) | number | - | 设置绘制阴影时和原有对象的垂直偏移值。 | +| [imageSmoothingEnabled](#imagesmoothingenabled6-)6+ | boolean | true | 用于设置绘制图片时是否进行图像平滑度调整,true为启用,false为不启用。 | + + +### fillStyle ``` @@ -242,9 +81,10 @@ export default { } ``` -![](figures/zh-cn_image_0000001166962736.png) +![zh-cn_image_0000001166962736](figures/zh-cn_image_0000001166962736.png) -### lineWidth + +### lineWidth ``` @@ -265,9 +105,10 @@ export default { } ``` -![](figures/zh-cn_image_0000001166484430.png) +![zh-cn_image_0000001166484430](figures/zh-cn_image_0000001166484430.png) + -### strokeStyle +### strokeStyle ``` @@ -289,9 +130,10 @@ export default { } ``` -![](figures/zh-cn_image_0000001212124299.png) -### lineCap +![zh-cn_image_0000001212124299](figures/zh-cn_image_0000001212124299.png) + +### lineCap ``` @@ -316,9 +158,9 @@ export default { } ``` -![](figures/zh-cn_image_0000001214837127.png) +![zh-cn_image_0000001214837127](figures/zh-cn_image_0000001214837127.png) -### lineJoin +### lineJoin ``` @@ -344,9 +186,9 @@ export default { } ``` -![](figures/zh-cn_image_0000001214717247.png) +![zh-cn_image_0000001214717247](figures/zh-cn_image_0000001214717247.png) -### miterLimit +### miterLimit ``` @@ -372,9 +214,10 @@ export default { } ``` -![](figures/zh-cn_image_0000001167001464.png) +![zh-cn_image_0000001167001464](figures/zh-cn_image_0000001167001464.png) -### font + +### font ``` @@ -395,9 +238,10 @@ export default { } ``` -![](figures/zh-cn_image_0000001167046832.png) +![zh-cn_image_0000001167046832](figures/zh-cn_image_0000001167046832.png) + -### textAlign +### textAlign ``` @@ -434,9 +278,10 @@ export default { } ``` -![](figures/zh-cn_image_0000001167472798.png) -### textBaseline +![zh-cn_image_0000001167472798](figures/zh-cn_image_0000001167472798.png) + +### textBaseline ``` @@ -472,9 +317,9 @@ export default { } ``` -![](figures/zh-cn_image_0000001169315920.png) +![zh-cn_image_0000001169315920](figures/zh-cn_image_0000001169315920.png) -### globalAlpha +### globalAlpha ``` @@ -499,9 +344,9 @@ export default { } ``` -![](figures/zh-cn_image_0000001167953648.png) +![zh-cn_image_0000001167953648](figures/zh-cn_image_0000001167953648.png) -### lineDashOffset +### lineDashOffset ``` @@ -524,113 +369,59 @@ export default { } ``` -![](figures/zh-cn_image_0000001167950468.png) - -### globalCompositeOperation - -- 类型字段说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        -

        描述

        -

        source-over

        -

        在现有绘制内容上显示新绘制内容,属于默认值。

        -

        source-atop

        -

        在现有绘制内容顶部显示新绘制内容。

        -

        source-in

        -

        在现有绘制内容中显示新绘制内容。

        -

        source-out

        -

        在现有绘制内容之外显示新绘制内容。

        -

        destination-over

        -

        在新绘制内容上方显示现有绘制内容。

        -

        destination-atop

        -

        在新绘制内容顶部显示现有绘制内容。

        -

        destination-in

        -

        在新绘制内容中显示现有绘制内容。

        -

        destination-out

        -

        在新绘制内容外显示现有绘制内容。

        -

        lighter

        -

        显示新绘制内容和现有绘制内容。

        -

        copy

        -

        显示新绘制内容而忽略现有绘制内容。

        -

        xor

        -

        使用异或操作对新绘制内容与现有绘制内容进行融合。

        -
        - - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(20, 20, 50, 50); - ctx.globalCompositeOperation = 'source-over'; - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(50, 50, 50, 50); - // Start drawing second example - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(120, 20, 50, 50); - ctx.globalCompositeOperation = 'destination-over'; - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(150, 50, 50, 50); - } +![zh-cn_image_0000001167950468](figures/zh-cn_image_0000001167950468.png) + +### globalCompositeOperation + +- 类型字段说明 + | 值 | 描述 | + | -------- | -------- | + | source-over | 在现有绘制内容上显示新绘制内容,属于默认值。 | + | source-atop | 在现有绘制内容顶部显示新绘制内容。 | + | source-in | 在现有绘制内容中显示新绘制内容。 | + | source-out | 在现有绘制内容之外显示新绘制内容。 | + | destination-over | 在新绘制内容上方显示现有绘制内容。 | + | destination-atop | 在新绘制内容顶部显示现有绘制内容。 | + | destination-in | 在新绘制内容中显示现有绘制内容。 | + | destination-out | 在新绘制内容外显示现有绘制内容。 | + | lighter | 显示新绘制内容和现有绘制内容。 | + | copy | 显示新绘制内容而忽略现有绘制内容。 | + | xor | 使用异或操作对新绘制内容与现有绘制内容进行融合。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(20, 20, 50, 50); + ctx.globalCompositeOperation = 'source-over'; + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(50, 50, 50, 50); + // Start drawing second example + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(120, 20, 50, 50); + ctx.globalCompositeOperation = 'destination-over'; + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(150, 50, 50, 50); } - ``` - - ![](figures/zh-cn_image_0000001213192781.png) + } + ``` - 示例中,新绘制内容是蓝色矩形,现有绘制内容是红色矩形。 + ![zh-cn_image_0000001213192781](figures/zh-cn_image_0000001213192781.png) + 示例中,新绘制内容是蓝色矩形,现有绘制内容是红色矩形。 -### shadowBlur +### shadowBlur ``` @@ -653,9 +444,9 @@ export default { } ``` -![](figures/zh-cn_image_0000001168111514.png) +![zh-cn_image_0000001168111514](figures/zh-cn_image_0000001168111514.png) -### shadowColor +### shadowColor ``` @@ -678,9 +469,9 @@ export default { } ``` -![](figures/zh-cn_image_0000001168111610.png) +![zh-cn_image_0000001168111610](figures/zh-cn_image_0000001168111610.png) -### shadowOffsetX +### shadowOffsetX ``` @@ -704,9 +495,10 @@ export default { } ``` -![](figures/zh-cn_image_0000001167631876.png) -### shadowOffsetY +![zh-cn_image_0000001167631876](figures/zh-cn_image_0000001167631876.png) + +### shadowOffsetY ``` @@ -730,9 +522,9 @@ export default { } ``` -![](figures/zh-cn_image_0000001213193285.png) +![zh-cn_image_0000001213193285](figures/zh-cn_image_0000001213193285.png) -### imageSmoothingEnabled6+ +### imageSmoothingEnabled6+ ``` @@ -757,2463 +549,1384 @@ export default { } ``` -![](figures/smoothOff.png) +![zh-cn_image_0000001167952236](figures/zh-cn_image_0000001167952236.png) + + -## 方法 +## 方法 -### fillRect -fillRect\(x: number, y: number, width:number, height: number\): void +### fillRect + +fillRect(x: number, y: number, width:number, height: number): void 填充一个矩形。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        指定矩形左上角点的x坐标。

        -

        y

        -

        number

        -

        指定矩形左上角点的y坐标。

        -

        width

        -

        number

        -

        指定矩形的宽度。

        -

        height

        -

        number

        -

        指定矩形的高度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.fillRect(20, 20, 200, 150); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 指定矩形左上角点的x坐标。 | + | y | number | 指定矩形左上角点的y坐标。 | + | width | number | 指定矩形的宽度。 | + | height | number | 指定矩形的高度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.fillRect(20, 20, 200, 150); } - ``` - - ![](figures/zh-cn_image_0000001214811029.png) + } + ``` + ![zh-cn_image_0000001214811029](figures/zh-cn_image_0000001214811029.png) -### clearRect +### clearRect -clearRect\(x: number, y: number, width:number, height: number\): void +clearRect(x: number, y: number, width:number, height: number): void 删除指定区域内的绘制内容。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        指定矩形上的左上角x坐标。

        -

        y

        -

        number

        -

        指定矩形上的左上角y坐标。

        -

        width

        -

        number

        -

        指定矩形的宽度。

        -

        height

        -

        number

        -

        指定矩形的高度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(0, 0, 400, 200); - ctx.clearRect(20, 20, 150, 100); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 指定矩形上的左上角x坐标。 | + | y | number | 指定矩形上的左上角y坐标。 | + | width | number | 指定矩形的宽度。 | + | height | number | 指定矩形的高度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(0, 0, 400, 200); + ctx.clearRect(20, 20, 150, 100); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001214619417.png) + ![zh-cn_image_0000001214619417](figures/zh-cn_image_0000001214619417.png) -### strokeRect +### strokeRect -strokeRect\(x: number, y: number, width:number, height: number\): void +strokeRect(x: number, y: number, width:number, height: number): void 绘制具有边框的矩形,矩形内部不填充。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        指定矩形的左上角x坐标。

        -

        y

        -

        number

        -

        指定矩形的左上角y坐标。

        -

        width

        -

        number

        -

        指定矩形的宽度。

        -

        height

        -

        number

        -

        指定矩形的高度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.strokeRect(30, 30, 200, 150); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 指定矩形的左上角x坐标。 | + | y | number | 指定矩形的左上角y坐标。 | + | width | number | 指定矩形的宽度。 | + | height | number | 指定矩形的高度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.strokeRect(30, 30, 200, 150); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001214822091.png) + ![zh-cn_image_0000001214822091](figures/zh-cn_image_0000001214822091.png) -### fillText +### fillText -fillText\(text: string, x: number, y: number\): void +fillText(text: string, x: number, y: number): void 绘制填充类文本。 -- 参数 - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        text

        -

        string

        -

        需要绘制的文本内容。

        -

        x

        -

        number

        -

        需要绘制的文本的左下角x坐标。

        -

        y

        -

        number

        -

        需要绘制的文本的左下角y坐标。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.font = '35px sans-serif'; - ctx.fillText("Hello World!", 10, 60); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | text | string | 需要绘制的文本内容。 | + | x | number | 需要绘制的文本的左下角x坐标。 | + | y | number | 需要绘制的文本的左下角y坐标。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.font = '35px sans-serif'; + ctx.fillText("Hello World!", 10, 60); } - ``` - - ![](figures/zh-cn_image_0000001214469787.png) + } + ``` + ![zh-cn_image_0000001214469787](figures/zh-cn_image_0000001214469787.png) -### strokeText +### strokeText -strokeText\(text: string, x: number, y: number\): void +strokeText(text: string, x: number, y: number): void 绘制描边类文本。 -- 参数 - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        text

        -

        string

        -

        需要绘制的文本内容。

        -

        x

        -

        number

        -

        需要绘制的文本的左下角x坐标。

        -

        y

        -

        number

        -

        需要绘制的文本的左下角y坐标。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.font = '25px sans-serif'; - ctx.strokeText("Hello World!", 10, 60); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | text | string | 需要绘制的文本内容。 | + | x | number | 需要绘制的文本的左下角x坐标。 | + | y | number | 需要绘制的文本的左下角y坐标。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.font = '25px sans-serif'; + ctx.strokeText("Hello World!", 10, 60); } - ``` - - ![](figures/zh-cn_image_0000001214460669.png) + } + ``` + ![zh-cn_image_0000001214460669](figures/zh-cn_image_0000001214460669.png) -### measureText +### measureText -measureText\(text: string\): TextMetrics +measureText(text: string): TextMetrics 该方法返回一个文本测算的对象,通过该对象可以获取指定文本的宽度值。 -- 参数 - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        text

        -

        string

        -

        需要进行测量的文本。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        TextMetrics

        -

        包含指定字体的宽度,该宽度可以通过TextMetrics.width来获取。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.font = '20px sans-serif'; - var txt = 'Hello World'; - ctx.fillText("width:" + ctx.measureText(txt).width, 20, 60); - ctx.fillText(txt, 20, 110); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | text | string | 需要进行测量的文本。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | TextMetrics | 包含指定字体的宽度,该宽度可以通过TextMetrics.width来获取。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.font = '20px sans-serif'; + var txt = 'Hello World'; + ctx.fillText("width:" + ctx.measureText(txt).width, 20, 60); + ctx.fillText(txt, 20, 110); } - ``` - - ![](figures/zh-cn_image_0000001169142476.png) + } + ``` + ![zh-cn_image_0000001169142476](figures/zh-cn_image_0000001169142476.png) -### stroke -stroke\(\): void +### stroke +stroke(): void 进行边框绘制操作。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.moveTo(25, 25); - ctx.lineTo(25, 250); - ctx.lineWidth = '6'; - ctx.strokeStyle = 'rgb(0,0,255)'; - ctx.stroke(); - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.moveTo(25, 25); + ctx.lineTo(25, 250); + ctx.lineWidth = '6'; + ctx.strokeStyle = 'rgb(0,0,255)'; + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001236697937.png) + } + ``` + ![zh-cn_image_0000001236697937](figures/zh-cn_image_0000001236697937.png) -### beginPath -beginPath\(\): void +### beginPath +beginPath(): void 创建一个新的绘制路径。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.lineWidth = '6'; - ctx.strokeStyle = '#0000ff'; - ctx.moveTo(15, 80); - ctx.lineTo(280, 80); - ctx.stroke(); - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.lineWidth = '6'; + ctx.strokeStyle = '#0000ff'; + ctx.moveTo(15, 80); + ctx.lineTo(280, 80); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001214629745.png) + } + ``` + ![zh-cn_image_0000001214629745](figures/zh-cn_image_0000001214629745.png) -### moveTo -moveTo\(x: number, y: number\): void +### moveTo +moveTo(x: number, y: number): void 路径从当前点移动到指定点。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        指定位置的x坐标。

        -

        y

        -

        number

        -

        指定位置的y坐标。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.moveTo(10, 10); - ctx.lineTo(280, 160); - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 指定位置的x坐标。 | + | y | number | 指定位置的y坐标。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.moveTo(10, 10); + ctx.lineTo(280, 160); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001169309948.png) + } + ``` + ![zh-cn_image_0000001169309948](figures/zh-cn_image_0000001169309948.png) -### lineTo -lineTo\(x: number, y: number\): void +### lineTo +lineTo(x: number, y: number): void 从当前点到指定点进行路径连接。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        指定位置的x坐标。

        -

        y

        -

        number

        -

        指定位置的y坐标。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.moveTo(10, 10); - ctx.lineTo(280, 160); - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 指定位置的x坐标。 | + | y | number | 指定位置的y坐标。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.moveTo(10, 10); + ctx.lineTo(280, 160); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001169469914.png) + } + ``` + ![zh-cn_image_0000001169469914](figures/zh-cn_image_0000001169469914.png) -### closePath -closePath\(\): void +### closePath +closePath(): void 结束当前路径形成一个封闭路径。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.moveTo(30, 30); - ctx.lineTo(110, 30); - ctx.lineTo(70, 90); - ctx.closePath(); - ctx.stroke(); - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.moveTo(30, 30); + ctx.lineTo(110, 30); + ctx.lineTo(70, 90); + ctx.closePath(); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001169151508.png) + } + ``` + ![zh-cn_image_0000001169151508](figures/zh-cn_image_0000001169151508.png) -### createPattern +### createPattern -createPattern\(image: Image, repetition: string\): Object +createPattern(image: Image, repetition: string): Object 通过指定图像和重复方式创建图片填充的模板。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        image

        -

        Image

        -

        图源对象,具体参考Image对象

        -

        repetition

        -

        string

        -

        设置图像重复的方式,取值为:'repeat'、'repeat-x'、 'repeat-y'、'no-repeat'。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        Object

        -

        指定图像填充的Pattern对象。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var img = new Image(); - img.src = 'common/images/example.jpg'; - var pat = ctx.createPattern(img, 'repeat'); - ctx.fillStyle = pat; - ctx.fillRect(0, 0, 20, 20); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | image | Image | 图源对象,具体参考[Image对象](../arkui-js/js-components-canvas-image.md)。 | + | repetition | string | 设置图像重复的方式,取值为:'repeat'、'repeat-x'、 'repeat-y'、'no-repeat'。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Object | 指定图像填充的Pattern对象。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var img = new Image(); + img.src = 'common/images/example.jpg'; + var pat = ctx.createPattern(img, 'repeat'); + ctx.fillStyle = pat; + ctx.fillRect(0, 0, 20, 20); } - ``` - - ![](figures/zh-cn_image_0000001169301188.png) + } + ``` + ![zh-cn_image_0000001169301188](figures/zh-cn_image_0000001169301188.png) -### bezierCurveTo +### bezierCurveTo -bezierCurveTo\(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number\): void +bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void 创建三次贝赛尔曲线的路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        cp1x

        -

        number

        -

        第一个贝塞尔参数的x坐标值。

        -

        cp1y

        -

        number

        -

        第一个贝塞尔参数的y坐标值。

        -

        cp2x

        -

        number

        -

        第二个贝塞尔参数的x坐标值。

        -

        cp2y

        -

        number

        -

        第二个贝塞尔参数的y坐标值。

        -

        x

        -

        number

        -

        路径结束时的x坐标值。

        -

        y

        -

        number

        -

        路径结束时的y坐标值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.moveTo(10, 10); - ctx.bezierCurveTo(20, 100, 200, 100, 200, 20); - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | cp1x | number | 第一个贝塞尔参数的x坐标值。 | + | cp1y | number | 第一个贝塞尔参数的y坐标值。 | + | cp2x | number | 第二个贝塞尔参数的x坐标值。 | + | cp2y | number | 第二个贝塞尔参数的y坐标值。 | + | x | number | 路径结束时的x坐标值。 | + | y | number | 路径结束时的y坐标值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.moveTo(10, 10); + ctx.bezierCurveTo(20, 100, 200, 100, 200, 20); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001214621177.png) + } + ``` + ![zh-cn_image_0000001214621177](figures/zh-cn_image_0000001214621177.png) -### quadraticCurveTo +### quadraticCurveTo -quadraticCurveTo\(cpx: number, cpy: number, x: number, y: number\): void +quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void 创建二次贝赛尔曲线的路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        cpx

        -

        number

        -

        贝塞尔参数的x坐标值。

        -

        cpy

        -

        number

        -

        贝塞尔参数的y坐标值。

        -

        x

        -

        number

        -

        路径结束时的x坐标值。

        -

        y

        -

        number

        -

        路径结束时的y坐标值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.moveTo(20, 20); - ctx.quadraticCurveTo(100, 100, 200, 20); - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | cpx | number | 贝塞尔参数的x坐标值。 | + | cpy | number | 贝塞尔参数的y坐标值。 | + | x | number | 路径结束时的x坐标值。 | + | y | number | 路径结束时的y坐标值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.moveTo(20, 20); + ctx.quadraticCurveTo(100, 100, 200, 20); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001169461910.png) + } + ``` + ![zh-cn_image_0000001169461910](figures/zh-cn_image_0000001169461910.png) -### arc -arc\(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise: boolean\): void +### arc +arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise: boolean): void 绘制弧线路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        弧线圆心的x坐标值。

        -

        y

        -

        number

        -

        弧线圆心的y坐标值。

        -

        radius

        -

        number

        -

        弧线的圆半径。

        -

        startAngle

        -

        number

        -

        弧线的起始弧度。

        -

        endAngle

        -

        number

        -

        弧线的终止弧度。

        -

        anticlockwise

        -

        boolean

        -

        是否逆时针绘制圆弧。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.arc(100, 75, 50, 0, 6.28); - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 弧线圆心的x坐标值。 | + | y | number | 弧线圆心的y坐标值。 | + | radius | number | 弧线的圆半径。 | + | startAngle | number | 弧线的起始弧度。 | + | endAngle | number | 弧线的终止弧度。 | + | anticlockwise | boolean | 是否逆时针绘制圆弧。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.arc(100, 75, 50, 0, 6.28); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001169470288.png) + } + ``` + ![zh-cn_image_0000001169470288](figures/zh-cn_image_0000001169470288.png) -### arcTo +### arcTo -arcTo\(x1: number, y1: number, x2: number, y2: number, radius: number\): void +arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void 依据圆弧经过的点和圆弧半径创建圆弧路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x1

        -

        number

        -

        圆弧经过的第一个点的x坐标值。

        -

        y1

        -

        number

        -

        圆弧经过的第一个点的y坐标值。

        -

        x2

        -

        number

        -

        圆弧经过的第二个点的x坐标值。

        -

        y2

        -

        number

        -

        圆弧经过的第二个点的y坐标值。

        -

        radius

        -

        number

        -

        圆弧的圆半径值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.moveTo(100, 20); - ctx.arcTo(150, 20, 150, 70, 50); // Create an arc - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x1 | number | 圆弧经过的第一个点的x坐标值。 | + | y1 | number | 圆弧经过的第一个点的y坐标值。 | + | x2 | number | 圆弧经过的第二个点的x坐标值。 | + | y2 | number | 圆弧经过的第二个点的y坐标值。 | + | radius | number | 圆弧的圆半径值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.moveTo(100, 20); + ctx.arcTo(150, 20, 150, 70, 50); // Create an arc + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001169143586.png) + } + ``` + ![zh-cn_image_0000001169143586](figures/zh-cn_image_0000001169143586.png) -### ellipse6+ +### ellipse6+ -ellipse\(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: number\): void +ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: number): void 在规定的矩形区域绘制一个椭圆。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        椭圆圆心的x轴坐标。

        -

        y

        -

        number

        -

        椭圆圆心的y轴坐标。

        -

        radiusX

        -

        number

        -

        椭圆x轴的半径长度。

        -

        radiusY

        -

        number

        -

        椭圆y轴的半径长度。

        -

        rotation

        -

        number

        -

        椭圆的旋转角度,单位为弧度。

        -

        startAngle

        -

        number

        -

        椭圆绘制的起始点角度,以弧度表示。

        -

        endAngle

        -

        number

        -

        椭圆绘制的结束点角度,以弧度表示。

        -

        anticlockwise

        -

        number

        -

        是否以逆时针方向绘制椭圆,0为顺时针,1为逆时针。(可选参数,默认为0)

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI, 1); - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 椭圆圆心的x轴坐标。 | + | y | number | 椭圆圆心的y轴坐标。 | + | radiusX | number | 椭圆x轴的半径长度。 | + | radiusY | number | 椭圆y轴的半径长度。 | + | rotation | number | 椭圆的旋转角度,单位为弧度。 | + | startAngle | number | 椭圆绘制的起始点角度,以弧度表示。 | + | endAngle | number | 椭圆绘制的结束点角度,以弧度表示。 | + | anticlockwise | number | 是否以逆时针方向绘制椭圆,0为顺时针,1为逆时针。(可选参数,默认为0) | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI, 1); + ctx.stroke(); } - ``` - - ![](figures/ellipse.png) + } + ``` + ![zh-cn_image_0000001214823665](figures/zh-cn_image_0000001214823665.png) -### rect -rect\(x: number, y: number, width: number, height: number\): void +### rect +rect(x: number, y: number, width: number, height: number): void 创建矩形路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        指定矩形的左上角x坐标值。

        -

        y

        -

        number

        -

        指定矩形的左上角y坐标值。

        -

        width

        -

        number

        -

        指定矩形的宽度。

        -

        height

        -

        number

        -

        指定矩形的高度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) - ctx.stroke(); // Draw it - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 指定矩形的左上角x坐标值。 | + | y | number | 指定矩形的左上角y坐标值。 | + | width | number | 指定矩形的宽度。 | + | height | number | 指定矩形的高度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) + ctx.stroke(); // Draw it } - ``` - - ![](figures/zh-cn_image_0000001214630783.png) + } + ``` + ![zh-cn_image_0000001214630783](figures/zh-cn_image_0000001214630783.png) -### fill +### fill -fill\(\): void +fill(): void 对封闭路径进行填充。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) - ctx.fill(); // Draw it in default setting - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) + ctx.fill(); // Draw it in default setting } - ``` - - ![](figures/zh-cn_image_0000001214703717.png) + } + ``` + ![zh-cn_image_0000001214703717](figures/zh-cn_image_0000001214703717.png) -### clip +### clip -clip\(\): void +clip(): void 设置当前路径为剪切路径。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.rect(0, 0, 200, 200); - ctx.stroke(); - ctx.clip(); - // Draw red rectangle after clip - ctx.fillStyle = "rgb(255,0,0)"; - ctx.fillRect(0, 0, 150, 150); - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.rect(0, 0, 200, 200); + ctx.stroke(); + ctx.clip(); + // Draw red rectangle after clip + ctx.fillStyle = "rgb(255,0,0)"; + ctx.fillRect(0, 0, 150, 150); } - ``` - - ![](figures/zh-cn_image_0000001169303414.png) + } + ``` + ![zh-cn_image_0000001169303414](figures/zh-cn_image_0000001169303414.png) -### rotate +### rotate -rotate\(rotate: number\): void +rotate(rotate: number): void 针对当前坐标轴进行顺时针旋转。 -- 参数 - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        rotate

        -

        number

        -

        设置顺时针旋转的弧度值,可以通过Math.PI / 180将角度转换为弧度值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.rotate(45 * Math.PI / 180); // Rotate the rectangle 45 degrees - ctx.fillRect(70, 20, 50, 50); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | rotate | number | 设置顺时针旋转的弧度值,可以通过Math.PI / 180将角度转换为弧度值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.rotate(45 * Math.PI / 180); // Rotate the rectangle 45 degrees + ctx.fillRect(70, 20, 50, 50); } - ``` - - ![](figures/zh-cn_image_0000001169463368.png) + } + ``` + ![zh-cn_image_0000001169463368](figures/zh-cn_image_0000001169463368.png) -### scale +### scale -scale\(x: number, y: number\): void +scale(x: number, y: number): void 设置canvas画布的缩放变换属性,后续的绘制操作将按照缩放比例进行缩放。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        设置水平方向的缩放值。

        -

        y

        -

        number

        -

        设置垂直方向的缩放值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.strokeRect(10, 10, 25, 25); - ctx.scale(2, 2);// Scale to 200% - ctx.strokeRect(10, 10, 25, 25); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 设置水平方向的缩放值。 | + | y | number | 设置垂直方向的缩放值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.strokeRect(10, 10, 25, 25); + ctx.scale(2, 2);// Scale to 200% + ctx.strokeRect(10, 10, 25, 25); } - ``` - - ![](figures/zh-cn_image_0000001214463281.png) + } + ``` + ![zh-cn_image_0000001214463281](figures/zh-cn_image_0000001214463281.png) -### transform +### transform -transform\(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number\): void +transform(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number): void transform方法对应一个变换矩阵,想对一个图形进行变化的时候,只要设置此变换矩阵相应的参数,对图形的各个定点的坐标分别乘以这个矩阵,就能得到新的定点的坐标。矩阵变换效果可叠加。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->变换后的坐标计算方式(x和y为变换前坐标,x'和y'为变换后坐标): ->- x' = scaleX \* x + skewY \* y + translateX ->- y' = skewX \* x + scaleY \* y + translateY - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        scaleX

        -

        number

        -

        指定水平缩放值。

        -

        skewX

        -

        number

        -

        指定水平倾斜值。

        -

        skewY

        -

        number

        -

        指定垂直倾斜值。

        -

        scaleY

        -

        number

        -

        指定垂直缩放值。

        -

        translateX

        -

        number

        -

        指定水平移动值。

        -

        translateY

        -

        number

        -

        指定垂直移动值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.fillStyle = 'rgb(0,0,0)'; - ctx.fillRect(0, 0, 100, 100) - ctx.transform(1, 0.5, -0.5, 1, 10, 10); - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(0, 0, 100, 100); - ctx.transform(1, 0.5, -0.5, 1, 10, 10); - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(0, 0, 100, 100); - } +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 变换后的坐标计算方式(x和y为变换前坐标,x'和y'为变换后坐标): +> +> - x' = scaleX \* x + skewY \* y + translateX +> +> - y' = skewX \* x + scaleY \* y + translateY + +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | scaleX | number | 指定水平缩放值。 | + | skewX | number | 指定水平倾斜值。 | + | skewY | number | 指定垂直倾斜值。 | + | scaleY | number | 指定垂直缩放值。 | + | translateX | number | 指定水平移动值。 | + | translateY | number | 指定垂直移动值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.fillStyle = 'rgb(0,0,0)'; + ctx.fillRect(0, 0, 100, 100) + ctx.transform(1, 0.5, -0.5, 1, 10, 10); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(0, 0, 100, 100); + ctx.transform(1, 0.5, -0.5, 1, 10, 10); + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(0, 0, 100, 100); } - ``` - - ![](figures/zh-cn_image_0000001214623227.png) - - -### setTransform - -setTransform\(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number\): void - -setTransfrom方法使用的参数和transform\(\)方法相同,但setTransform\(\)方法会重置现有的变换矩阵并创建新的变换矩阵。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        scaleX

        -

        number

        -

        指定水平缩放值。

        -

        skewX

        -

        number

        -

        指定水平倾斜值。

        -

        skewY

        -

        number

        -

        指定垂直倾斜值。

        -

        scaleY

        -

        number

        -

        指定垂直缩放值。

        -

        translateX

        -

        number

        -

        指定水平移动值。

        -

        translateY

        -

        number

        -

        指定垂直移动值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(0, 0, 100, 100) - ctx.setTransform(1,0.5, -0.5, 1, 10, 10); - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(0, 0, 100, 100); - } + } + ``` + + ![zh-cn_image_0000001214623227](figures/zh-cn_image_0000001214623227.png) + +### setTransform + +setTransform(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number): void + +setTransfrom方法使用的参数和transform()方法相同,但setTransform()方法会重置现有的变换矩阵并创建新的变换矩阵。 + +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | scaleX | number | 指定水平缩放值。 | + | skewX | number | 指定水平倾斜值。 | + | skewY | number | 指定垂直倾斜值。 | + | scaleY | number | 指定垂直缩放值。 | + | translateX | number | 指定水平移动值。 | + | translateY | number | 指定垂直移动值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(0, 0, 100, 100) + ctx.setTransform(1,0.5, -0.5, 1, 10, 10); + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(0, 0, 100, 100); } - ``` - - ![](figures/zh-cn_image_0000001168984880.png) + } + ``` + ![zh-cn_image_0000001168984880](figures/zh-cn_image_0000001168984880.png) -### translate +### translate -translate\(x: number, y: number\): void +translate(x: number, y: number): void 移动当前坐标系的原点。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        设置水平平移量。

        -

        y

        -

        number

        -

        设置竖直平移量。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.fillRect(10, 10, 50, 50); - ctx.translate(70, 70); - ctx.fillRect(10, 10, 50, 50); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 设置水平平移量。 | + | y | number | 设置竖直平移量。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.fillRect(10, 10, 50, 50); + ctx.translate(70, 70); + ctx.fillRect(10, 10, 50, 50); } - ``` - - ![](figures/zh-cn_image_0000001169144864.png) + } + ``` + ![zh-cn_image_0000001169144864](figures/zh-cn_image_0000001169144864.png) -### createPath2D6+ +### createPath2D6+ -createPath2D\(path: Path2D, cmds: string\): Path2D +createPath2D(path: Path2D, cmds: string): Path2D 创建一个Path2D对象。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        path

        -

        Path2D

        -

        Path2D对象。

        -

        cmds

        -

        string

        -

        SVG的Path描述字符串。

        -
        - -- 返回值 - - [Path2D对象](js-components-canvas-path2d.md) - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path1 = ctx.createPath2D(); - path1.moveTo(100, 100); - path1.lineTo(200, 100); - path1.lineTo(100, 200); - path1.closePath(); - ctx.stroke(path1); - var path2 = ctx.createPath2D("M150 150 L50 250 L250 250 Z"); - ctx.stroke(path2); - var path3 = ctx.createPath2D(path2); - ctx.stroke(path3); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | path | Path2D | Path2D对象。 | + | cmds | string | SVG的Path描述字符串。 | + +- 返回值 + [Path2D对象](../arkui-js/js-components-canvas-path2d.md) + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path1 = ctx.createPath2D(); + path1.moveTo(100, 100); + path1.lineTo(200, 100); + path1.lineTo(100, 200); + path1.closePath(); + ctx.stroke(path1); + var path2 = ctx.createPath2D("M150 150 L50 250 L250 250 Z"); + ctx.stroke(path2); + var path3 = ctx.createPath2D(path2); + ctx.stroke(path3); } - ``` - - ![](figures/zh-cn_image_0000001214824709.png) + } + ``` + ![zh-cn_image_0000001214824709](figures/zh-cn_image_0000001214824709.png) -### drawImage +### drawImage -drawImage\(image: Image, sx: number, sy: number, sWidth: number, sHeight: number, dx: number, dy: number, dWidth: number, dHeight: number\):void +drawImage(image: Image, sx: number, sy: number, sWidth: number, sHeight: number, dx: number, dy: number, dWidth: number, dHeight: number):void 进行图像绘制。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        image

        -

        Image

        -

        图片资源,请参考Image对象

        -

        sx

        -

        number

        -

        裁切源图像时距离源图像左上角的x坐标值。

        -

        sy

        -

        number

        -

        裁切源图像时距离源图像左上角的y坐标值。

        -

        sWidth

        -

        number

        -

        裁切源图像时需要裁切的宽度。

        -

        sHeight

        -

        number

        -

        裁切源图像时需要裁切的高度。

        -

        dx

        -

        number

        -

        绘制区域左上角在x轴的位置。

        -

        dy

        -

        number

        -

        绘制区域左上角在y 轴的位置。

        -

        dWidth

        -

        number

        -

        绘制区域的宽度。

        -

        dHeight

        -

        number

        -

        绘制区域的高度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - var test = this.$element('drawImage'); - var ctx = test.getContext('2d'); - var img = new Image(); - img.src = 'common/image/test.jpg'; - ctx.drawImage(img, 50, 80, 80, 80); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | image | Image | 图片资源,请参考[Image对象](../arkui-js/js-components-canvas-image.md)。 | + | sx | number | 裁切源图像时距离源图像左上角的x坐标值。 | + | sy | number | 裁切源图像时距离源图像左上角的y坐标值。 | + | sWidth | number | 裁切源图像时需要裁切的宽度。 | + | sHeight | number | 裁切源图像时需要裁切的高度。 | + | dx | number | 绘制区域左上角在x轴的位置。 | + | dy | number | 绘制区域左上角在y 轴的位置。 | + | dWidth | number | 绘制区域的宽度。 | + | dHeight | number | 绘制区域的高度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + var test = this.$element('drawImage'); + var ctx = test.getContext('2d'); + var img = new Image(); + img.src = 'common/image/test.jpg'; + ctx.drawImage(img, 50, 80, 80, 80); } - ``` - - ![](figures/zh-cn_image_0000001214704759.png) + } + ``` + ![zh-cn_image_0000001214704759](figures/zh-cn_image_0000001214704759.png) -### restore +### restore -restore\(\): void +restore(): void 对保存的绘图上下文进行恢复。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.restore(); - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.restore(); } - ``` - + } + ``` -### save +### save -save\(\): void +save(): void 对当前的绘图上下文进行保存。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.save(); - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.save(); } - ``` - - -### createLinearGradient6+ - -createLinearGradient\(x0: number, y0: number, x1: number, y1: number\): Object - -创建一个线性渐变色,返回CanvasGradient对象,请参考[CanvasGradient对象](js-components-canvas-canvasgradient.md)。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x0

        -

        number

        -

        起点的x轴坐标。

        -

        y0

        -

        number

        -

        起点的y轴坐标。

        -

        x1

        -

        number

        -

        终点的x轴坐标。

        -

        y1

        -

        number

        -

        终点的y轴坐标。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        Object

        -

        返回创建的CanvasGradient对象。

        -
        - -- 示例 - - ``` - -
        - - -
        - ``` - - ``` - // xxx.js - export default { - handleClick() { - const el = this.$refs.canvas; - const ctx = el.getContext('2d'); - // Linear gradient: start(50,0) end(300,100) - var gradient = ctx.createLinearGradient(50,0, 300,100); - // Add three color stops - gradient.addColorStop(0.0, 'red'); - gradient.addColorStop(0.5, 'white'); - gradient.addColorStop(1.0, 'green'); - // Set the fill style and draw a rectangle - ctx.fillStyle = gradient; - ctx.fillRect(0, 0, 500, 500); - } + } + ``` + +### createLinearGradient6+ + +createLinearGradient(x0: number, y0: number, x1: number, y1: number): Object + +创建一个线性渐变色,返回CanvasGradient对象,请参考[CanvasGradient对象](../arkui-js/js-components-canvas-canvasgradient.md)。 + +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x0 | number | 起点的x轴坐标。 | + | y0 | number | 起点的y轴坐标。 | + | x1 | number | 终点的x轴坐标。 | + | y1 | number | 终点的y轴坐标。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Object | 返回创建的CanvasGradient对象。 | + +- 示例 + ``` + +
        + + +
        + ``` + + ``` + // xxx.js + export default { + handleClick() { + const el = this.$refs.canvas; + const ctx = el.getContext('2d'); + // Linear gradient: start(50,0) end(300,100) + var gradient = ctx.createLinearGradient(50,0, 300,100); + // Add three color stops + gradient.addColorStop(0.0, 'red'); + gradient.addColorStop(0.5, 'white'); + gradient.addColorStop(1.0, 'green'); + // Set the fill style and draw a rectangle + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 500, 500); } - ``` - - ![](figures/zh-cn_image_0000001169303416.png) + } + ``` + ![zh-cn_image_0000001169303416](figures/zh-cn_image_0000001169303416.png) -### createRadialGradient6+ +### createRadialGradient6+ -createRadialGradient\(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number\): Object +createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): Object 创建一个径向渐变色,返回CanvasGradient对象,请参考CanvasGradient -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x0

        -

        number

        -

        起始圆的x轴坐标。

        -

        y0

        -

        number

        -

        起始圆的y轴坐标。

        -

        r0

        -

        number

        -

        起始圆的半径。必须是非负且有限的。

        -

        x1

        -

        number

        -

        终点圆的x轴坐标。

        -

        y1

        -

        number

        -

        终点圆的y轴坐标。

        -

        r1

        -

        number

        -

        终点圆的半径。必须为非负且有限的。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        Object

        -

        返回创建的CanvasGradient对象。

        -
        - -- 示例 - - ``` - -
        - - -
        - ``` - - ``` - // xxx.js - export default { - handleClick() { - const el = this.$refs.canvas; - const ctx = el.getContext('2d'); - // Radial gradient: inner circle(200,200,r:50) outer circle(200,200,r:200) - var gradient = ctx.createRadialGradient(200,200,50, 200,200,200); - // Add three color stops - gradient.addColorStop(0.0, 'red'); - gradient.addColorStop(0.5, 'white'); - gradient.addColorStop(1.0, 'green'); - // Set the fill style and draw a rectangle - ctx.fillStyle = gradient; - ctx.fillRect(0, 0, 500, 500); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x0 | number | 起始圆的x轴坐标。 | + | y0 | number | 起始圆的y轴坐标。 | + | r0 | number | 起始圆的半径。必须是非负且有限的。 | + | x1 | number | 终点圆的x轴坐标。 | + | y1 | number | 终点圆的y轴坐标。 | + | r1 | number | 终点圆的半径。必须为非负且有限的。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Object | 返回创建的CanvasGradient对象。 | + +- 示例 + ``` + +
        + + +
        + ``` + + ``` + // xxx.js + export default { + handleClick() { + const el = this.$refs.canvas; + const ctx = el.getContext('2d'); + // Radial gradient: inner circle(200,200,r:50) outer circle(200,200,r:200) + var gradient = ctx.createRadialGradient(200,200,50, 200,200,200); + // Add three color stops + gradient.addColorStop(0.0, 'red'); + gradient.addColorStop(0.5, 'white'); + gradient.addColorStop(1.0, 'green'); + // Set the fill style and draw a rectangle + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 500, 500); } - ``` - - ![](figures/zh-cn_image_0000001169463370.png) - - -### createImageData - -createImageData\(width: number, height: number, imageData: Object\): Object - -创建新的ImageData 对象,请参考[ImageData对象](js-components-canvas-imagedata.md)。 - -- 参数 - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        width

        -

        number

        -

        ImageData的宽度。

        -

        height

        -

        number

        -

        ImageData的高度。

        -

        imagedata

        -

        Object

        -

        复制现有的ImageData对象。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        Object

        -

        返回创建的ImageData对象。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - imageData = ctx.createImageData(50, 100); // Create ImageData with 50px width and 100px height - newImageData = ctx.createImageData(imageData); // Create ImageData using the input imageData - } + } + ``` + + ![zh-cn_image_0000001169463370](figures/zh-cn_image_0000001169463370.png) + +### createImageData + +createImageData(width: number, height: number, imageData: Object): Object + +创建新的ImageData 对象,请参考[ImageData对象](../arkui-js/js-components-canvas-imagedata.md)。 + +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | width | number | ImageData的宽度。 | + | height | number | ImageData的高度。 | + | imagedata | Object | 复制现有的ImageData对象。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Object | 返回创建的ImageData对象。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + imageData = ctx.createImageData(50, 100); // Create ImageData with 50px width and 100px height + newImageData = ctx.createImageData(imageData); // Create ImageData using the input imageData } - ``` - + } + ``` -### getImageData +### getImageData -getImageData\(sx: number, sy: number, sw: number, sh: number\): Object +getImageData(sx: number, sy: number, sw: number, sh: number): Object 以当前canvas指定区域内的像素创建ImageData对象。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        sx

        -

        number

        -

        需要输出的区域的左上角x坐标。

        -

        sy

        -

        number

        -

        需要输出的区域的左上角y坐标。

        -

        sw

        -

        number

        -

        需要输出的区域的宽度。

        -

        sh

        -

        number

        -

        需要输出的区域的高度。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        Object

        -

        返回包含指定区域像素的ImageData对象。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - var test = this.$element('getImageData') - var ctx = test.getContext('2d'); - var imageData = ctx.getImageData(0, 0, 280, 300); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | sx | number | 需要输出的区域的左上角x坐标。 | + | sy | number | 需要输出的区域的左上角y坐标。 | + | sw | number | 需要输出的区域的宽度。 | + | sh | number | 需要输出的区域的高度。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Object | 返回包含指定区域像素的ImageData对象。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + var test = this.$element('getImageData') + var ctx = test.getContext('2d'); + var imageData = ctx.getImageData(0, 0, 280, 300); } - ``` - + } + ``` -### putImageData +### putImageData -putImageData\(imageData: Object, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number\): void +putImageData(imageData: Object, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void 使用ImageData数据填充新的矩形区域。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        imagedata

        -

        Object

        -

        包含像素值的ImageData对象。

        -

        dx

        -

        number

        -

        填充区域在x轴方向的偏移量。

        -

        dy

        -

        number

        -

        填充区域在y轴方向的偏移量。

        -

        dirtyX

        -

        number

        -

        源图像数据矩形裁切范围左上角距离源图像左上角的x轴偏移量。

        -

        dirtyY

        -

        number

        -

        源图像数据矩形裁切范围左上角距离源图像左上角的y轴偏移量。

        -

        dirtyWidth

        -

        number

        -

        源图像数据矩形裁切范围的宽度。

        -

        dirtyHeight

        -

        number

        -

        源图像数据矩形裁切范围的高度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - var test = this.$element('getImageData') - var ctx = test.getContext('2d'); - var imgData = ctx.createImageData(100, 100); - for (var i = 0; i < imgData.data.length; i += 4) { - imgData.data[i + 0] = 255; - imgData.data[i + 1] = 0; - imgData.data[i + 2] = 0; - imgData.data[i + 3] = 255; - } - ctx.putImageData(imgData, 10, 10); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | imagedata | Object | 包含像素值的ImageData对象。 | + | dx | number | 填充区域在x轴方向的偏移量。 | + | dy | number | 填充区域在y轴方向的偏移量。 | + | dirtyX | number | 源图像数据矩形裁切范围左上角距离源图像左上角的x轴偏移量。 | + | dirtyY | number | 源图像数据矩形裁切范围左上角距离源图像左上角的y轴偏移量。 | + | dirtyWidth | number | 源图像数据矩形裁切范围的宽度。 | + | dirtyHeight | number | 源图像数据矩形裁切范围的高度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + var test = this.$element('getImageData') + var ctx = test.getContext('2d'); + var imgData = ctx.createImageData(100, 100); + for (var i = 0; i < imgData.data.length; i += 4) { + imgData.data[i + 0] = 255; + imgData.data[i + 1] = 0; + imgData.data[i + 2] = 0; + imgData.data[i + 3] = 255; } - ``` - - ![](figures/zh-cn_image_0000001214463283.png) + ctx.putImageData(imgData, 10, 10); + } + } + ``` + ![zh-cn_image_0000001214463283](figures/zh-cn_image_0000001214463283.png) -### setLineDash +### setLineDash -setLineDash\(segments: Array\): void +setLineDash(segments: Array): void 设置画布的虚线样式。 -- 参数 - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        segments

        -

        Array

        -

        作为数组用来描述线段如何交替和间距长度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - ctx.arc(100, 75, 50, 0, 6.28); - ctx.setLineDash([10,20]); - ctx.stroke(); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | segments | Array | 作为数组用来描述线段如何交替和间距长度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + ctx.arc(100, 75, 50, 0, 6.28); + ctx.setLineDash([10,20]); + ctx.stroke(); } - ``` - - ![](figures/zh-cn_image_0000001214623229.png) + } + ``` + ![zh-cn_image_0000001214623229](figures/zh-cn_image_0000001214623229.png) -### getLineDash +### getLineDash -getLineDash\(\): Array +getLineDash(): Array 获得当前画布的虚线样式。 -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        Array

        -

        返回数组,该数组用来描述线段如何交替和间距长度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var info = ctx.getLineDash(); - } +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Array | 返回数组,该数组用来描述线段如何交替和间距长度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var info = ctx.getLineDash(); } - ``` - + } + ``` -### transferFromImageBitmap7+ +### transferFromImageBitmap7+ -transferFromImageBitmap\(bitmap: ImageBitmap\): void +transferFromImageBitmap(bitmap: ImageBitmap): void 显示给定的ImageBitmap对象。 -- 参数 - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        bitmap

        -

        ImageBitmap

        -

        待显示的ImageBitmap对象。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var canvas = this.$refs.canvas.getContext('2d'); - var offscreen = new OffscreenCanvas(500,500); - var offscreenCanvasCtx = offscreen.getContext("2d"); - offscreenCanvasCtx.fillRect(0, 0, 200, 200); - - var bitmap = offscreen.transferToImageBitmap(); - canvas.transferFromImageBitmap(bitmap); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | bitmap | ImageBitmap | 待显示的ImageBitmap对象。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var canvas = this.$refs.canvas.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + offscreenCanvasCtx.fillRect(0, 0, 200, 200); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); } - ``` - - ![](figures/zh-cn_image_0000001168984882.png) - + } + ``` + ![zh-cn_image_0000001168984882](figures/zh-cn_image_0000001168984882.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-image.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-image.md index d8aba1786f5..622dd036025 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-image.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-image.md @@ -1,80 +1,23 @@ -# Image对象 +# Image对象 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 图片对象。 -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        src

        -

        string

        -

        -

        -

        -

        图片资源的路径。

        -

        width

        -

        <length>

        -

        0px

        -

        -

        图片的宽度。

        -

        height

        -

        <length>

        -

        0px

        -

        -

        图片的高度。

        -

        onload

        -

        Function

        -

        -

        -

        -

        图片加载成功后触发该事件,无参数。

        -

        onerror

        -

        Function

        -

        -

        -

        -

        图片加载失败后触发该事件,无参数。

        -
        +## 属性 + +| 属性 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| src | string | - | 是 | 图片资源的路径。 | +| width | <length> | 0px | 否 | 图片的宽度。 | +| height | <length> | 0px | 否 | 图片的高度。 | +| onload | Function | - | 否 | 图片加载成功后触发该事件,无参数。 | +| onerror | Function | - | 否 | 图片加载失败后触发该事件,无参数。 | + -## 示例 +## 示例 ``` @@ -87,7 +30,7 @@ //xxx.js export default { onShow(){ - const el =this.$refs.canvas + const el =this.$refs.canvas; var ctx =el.getContext('2d'); var img = new Image(); img.src = 'common/images/example.jpg'; @@ -102,5 +45,5 @@ export default { } ``` -![](figures/1-2.png) +![zh-cn_image_0000001198530395](figures/zh-cn_image_0000001198530395.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagebitmap.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagebitmap.md index 66e8c36f5ed..cce0847efbc 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagebitmap.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagebitmap.md @@ -1,34 +1,15 @@ -# ImageBitmap对象 +# ImageBitmap对象 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -ImageBitmap对象由OffscreenCanvas对象的transferToImageBitmap\(\)方法生成,存储了offscreen canvas渲染的像素数据。 -## 属性 +ImageBitmap对象由OffscreenCanvas对象的transferToImageBitmap()方法生成,存储了offscreen canvas渲染的像素数据。 - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        描述

        -

        width

        -

        number

        -

        ImageBitmap的像素宽度。

        -

        height

        -

        number

        -

        ImageBitmap的像素高度。

        -
        +## 属性 + +| 属性 | 类型 | 描述 | +| -------- | -------- | -------- | +| width | number | ImageBitmap的像素宽度。 | +| height | number | ImageBitmap的像素高度。 | diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagedata.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagedata.md index 382c4ca9c49..05ba230a16a 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagedata.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-imagedata.md @@ -1,42 +1,21 @@ -# ImageData对象 +# ImageData对象 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ImageData对象可以存储canvas渲染的像素数据。 -## 属性 - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        描述

        -

        width

        -

        number

        -

        矩形区域实际像素宽度。

        -

        height

        -

        number

        -

        矩形区域实际像素高度。

        -

        data

        -

        <Uint8ClampedArray>

        -

        一维数组,保存了相应的颜色数据,数据值范围为0到255。

        -
        +## 属性 + +| 属性 | 类型 | 描述 | +| -------- | -------- | -------- | +| width | number | 矩形区域实际像素宽度。 | +| height | number | 矩形区域实际像素高度。 | +| data | <Uint8ClampedArray> | 一维数组,保存了相应的颜色数据,数据值范围为0到255。 | -## 示例 + +## 示例 ``` @@ -61,4 +40,3 @@ export default { } } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-offscreencanvas.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-offscreencanvas.md index 0b3f7f22133..89277e85f4b 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-offscreencanvas.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-offscreencanvas.md @@ -1,175 +1,72 @@ -# OffscreenCanvas对象 +# OffscreenCanvas对象 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 可以离屏渲染的canvas对象。 -## 属性 - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        描述

        -

        width

        -

        number

        -

        offscreen canvas对象的宽度。

        -

        height

        -

        number

        -

        offscreen canvas对象的高度。

        -
        - -## 方法 - -### getContext - -getContext\(type: string, options?: CanvasRenderingContext2DSettings\): OffscreenCanvasRenderingContext2D + +## 属性 + +| 属性 | 类型 | 描述 | +| -------- | -------- | -------- | +| width | number | offscreen canvas对象的宽度。 | +| height | number | offscreen canvas对象的高度。 | + + +## 方法 + + +### getContext + +getContext(type: string, options?: CanvasRenderingContext2DSettings): OffscreenCanvasRenderingContext2D 获取offscreen canvas绘图上下文,返回值为2D绘制对象。 -- 参数 - - - - - - - - - - - - - - - - - - -

        参数名

        -

        参数类型

        -

        必填

        -

        描述

        -

        contextId

        -

        string

        -

        -

        仅支持 '2d'。

        -

        options

        -

        CanvasRenderingContext2DSettings

        -

        -

        用于在离屏画布上进行绘制矩形、文本、图片等

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        OffscreenCanvasRenderingContext2D

        -

        2D绘制对象,用于在画布组件上绘制矩形、文本、图片等

        -
        - - -### toDataURL - -toDataURL\(type?: string, quality?:number\): +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | contextId | string | 是 | 仅支持 '2d'。 | + | options | [CanvasRenderingContext2DSettings](../arkui-js/js-offscreencanvasrenderingcontext2d.md) | 否 | 用于在离屏画布上进行绘制矩形、文本、图片等。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | [OffscreenCanvasRenderingContext2D](../arkui-js/js-offscreencanvasrenderingcontext2d.md) | 2D绘制对象,用于在画布组件上绘制矩形、文本、图片等。 | + + +### toDataURL + +toDataURL(type?: string, quality?:number): 生成一个包含图片展示的URL。 -- 参数 - - - - - - - - - - - - - - - - - - -

        参数名

        -

        参数类型

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        -

        可选参数,用于指定图像格式,默认格式为image/png。

        -

        quality

        -

        number

        -

        -

        在指定图片格式为image/jpeg或image/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。

        -
        - -- 返回值 - - - - - - - - - -

        类型

        -

        说明

        -

        string

        -

        图像的URL地址。

        -
        - - -### transferToImageBitmap - -transferToImageBitmap\(\): ImageBitmap +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | type | string | 否 | 可选参数,用于指定图像格式,默认格式为image/png。 | + | quality | number | 否 | 在指定图片格式为image/jpeg或image/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。 | -在离屏画布最近渲染的图像上创建一个ImageBitmap对象。 +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | string | 图像的URL地址。 | -- 返回值 - - - - - - - - -

        类型

        -

        说明

        -

        ImageBitmap

        -

        存储离屏画布上渲染的像素数据。

        -
        +### transferToImageBitmap +transferToImageBitmap(): ImageBitmap -## 示例 +在离屏画布最近渲染的图像上创建一个ImageBitmap对象。 + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | [ImageBitmap](../arkui-js/js-components-canvas-imagebitmap.md) | 存储离屏画布上渲染的像素数据。 | + + +## 示例 ``` @@ -196,4 +93,3 @@ export default { } } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-path2d.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-path2d.md index c2a05294bdc..d9b09a183da 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas-path2d.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas-path2d.md @@ -1,796 +1,432 @@ -# Path2D对象 +# Path2D对象 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 6开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 路径对象,支持通过对象的接口进行路径的描述,并通过Canvas的stroke接口进行绘制。 -## addPath -addPath\(path: Object\): void +## addPath + +addPath(path: Object): void 将另一个路径添加到当前的路径对象中。 -- 参数 - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        path

        -

        Object

        -

        需要添加到当前路径的路径对象

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path1 = ctx.createPath2D("M250 150 L150 350 L350 350 Z"); - var path2 = ctx.createPath2D(); - path2.addPath(path1); - ctx.stroke(path2); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | path | Object | 需要添加到当前路径的路径对象 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path1 = ctx.createPath2D("M250 150 L150 350 L350 350 Z"); + var path2 = ctx.createPath2D(); + path2.addPath(path1); + ctx.stroke(path2); } - ``` - - ![](figures/zh-cn_image_0000001173164873.png) + } + ``` + ![zh-cn_image_0000001173164873](figures/zh-cn_image_0000001173164873.png) -## setTransform +## setTransform -setTransform\(scaleX: number, skewX: number, skewY: number, scaleY: number, translateX: number, translateY: number\): void +setTransform(scaleX: number, skewX: number, skewY: number, scaleY: number, translateX: number, translateY: number): void 设置路径变换矩阵。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        scaleX

        -

        number

        -

        x轴的缩放比例

        -

        skewX

        -

        number

        -

        x轴的倾斜角度

        -

        skewY

        -

        number

        -

        y轴的倾斜角度

        -

        scaleY

        -

        number

        -

        y轴的缩放比例

        -

        translateX

        -

        number

        -

        x轴的平移距离

        -

        translateY

        -

        number

        -

        y轴的平移距离

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D("M250 150 L150 350 L350 350 Z"); - path.setTransform(0.8, 0, 0, 0.4, 0, 0); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | scaleX | number | x轴的缩放比例 | + | skewX | number | x轴的倾斜角度 | + | skewY | number | y轴的倾斜角度 | + | scaleY | number | y轴的缩放比例 | + | translateX | number | x轴的平移距离 | + | translateY | number | y轴的平移距离 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D("M250 150 L150 350 L350 350 Z"); + path.setTransform(0.8, 0, 0, 0.4, 0, 0); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001127125208.png) + ![zh-cn_image_0000001127125208](figures/zh-cn_image_0000001127125208.png) -## closePath +## closePath -closePath\(\): void +closePath(): void 将路径的当前点移回到路径的起点,当前点到起点间画一条直线。如果形状已经闭合或只有一个点,则此功能不执行任何操作。 -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.moveTo(200, 100); - path.lineTo(300, 100); - path.lineTo(200, 200); - path.closePath(); - ctx.stroke(path); - } +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(200, 100); + path.lineTo(300, 100); + path.lineTo(200, 200); + path.closePath(); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001127125202.png) + ![zh-cn_image_0000001127125202](figures/zh-cn_image_0000001127125202.png) -## moveTo +## moveTo -moveTo\(x: number, y: number\): void +moveTo(x: number, y: number): void 将路径的当前坐标点移动到目标点,移动过程中不绘制线条。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        目标点X轴坐标

        -

        y

        -

        number

        -

        目标点Y轴坐标

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.moveTo(50, 100); - path.lineTo(250, 100); - path.lineTo(150, 200); - path.closePath(); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 目标点X轴坐标 | + | y | number | 目标点Y轴坐标 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(50, 100); + path.lineTo(250, 100); + path.lineTo(150, 200); + path.closePath(); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001173164869.png) + ![zh-cn_image_0000001173164869](figures/zh-cn_image_0000001173164869.png) -## lineTo +## lineTo -lineTo\(x: number, y: number\): void +lineTo(x: number, y: number): void 从当前点绘制一条直线到目标点。 -- 参数 - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        目标点X轴坐标

        -

        y

        -

        number

        -

        目标点Y轴坐标

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.moveTo(100, 100); - path.lineTo(100, 200); - path.lineTo(200, 200); - path.lineTo(200, 100); - path.closePath(); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 目标点X轴坐标 | + | y | number | 目标点Y轴坐标 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(100, 100); + path.lineTo(100, 200); + path.lineTo(200, 200); + path.lineTo(200, 100); + path.closePath(); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001127285024.png) + ![zh-cn_image_0000001127285024](figures/zh-cn_image_0000001127285024.png) -## bezierCurveTo +## bezierCurveTo -bezierCurveTo\(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number\): void +bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void 创建三次贝赛尔曲线的路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        cp1x

        -

        number

        -

        第一个贝塞尔参数的x坐标值。

        -

        cp1y

        -

        number

        -

        第一个贝塞尔参数的y坐标值。

        -

        cp2x

        -

        number

        -

        第二个贝塞尔参数的x坐标值。

        -

        cp2y

        -

        number

        -

        第二个贝塞尔参数的y坐标值。

        -

        x

        -

        number

        -

        路径结束时的x坐标值。

        -

        y

        -

        number

        -

        路径结束时的y坐标值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.moveTo(10, 10); - path.bezierCurveTo(20, 100, 200, 100, 200, 20); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | cp1x | number | 第一个贝塞尔参数的x坐标值。 | + | cp1y | number | 第一个贝塞尔参数的y坐标值。 | + | cp2x | number | 第二个贝塞尔参数的x坐标值。 | + | cp2y | number | 第二个贝塞尔参数的y坐标值。 | + | x | number | 路径结束时的x坐标值。 | + | y | number | 路径结束时的y坐标值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(10, 10); + path.bezierCurveTo(20, 100, 200, 100, 200, 20); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001173324783.png) + ![zh-cn_image_0000001173324783](figures/zh-cn_image_0000001173324783.png) -## quadraticCurveTo +## quadraticCurveTo -quadraticCurveTo\(cpx: number, cpy: number, x: number, y: number\): void +quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void 创建二次贝赛尔曲线的路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        cpx

        -

        number

        -

        贝塞尔参数的x坐标值。

        -

        cpy

        -

        number

        -

        贝塞尔参数的y坐标值。

        -

        x

        -

        number

        -

        路径结束时的x坐标值。

        -

        y

        -

        number

        -

        路径结束时的y坐标值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.moveTo(10, 10); - path.quadraticCurveTo(100, 100, 200, 20); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | cpx | number | 贝塞尔参数的x坐标值。 | + | cpy | number | 贝塞尔参数的y坐标值。 | + | x | number | 路径结束时的x坐标值。 | + | y | number | 路径结束时的y坐标值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(10, 10); + path.quadraticCurveTo(100, 100, 200, 20); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001173164871.png) + ![zh-cn_image_0000001173164871](figures/zh-cn_image_0000001173164871.png) -## arc +## arc -arc\(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise: number\): void +arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise: number): void 绘制弧线路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        弧线圆心的x坐标值。

        -

        y

        -

        number

        -

        弧线圆心的y坐标值。

        -

        radius

        -

        number

        -

        弧线的圆半径。

        -

        startAngle

        -

        number

        -

        弧线的起始弧度。

        -

        endAngle

        -

        number

        -

        弧线的终止弧度。

        -

        anticlockwise

        -

        boolean

        -

        是否逆时针绘制圆弧。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.arc(100, 75, 50, 0, 6.28); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 弧线圆心的x坐标值。 | + | y | number | 弧线圆心的y坐标值。 | + | radius | number | 弧线的圆半径。 | + | startAngle | number | 弧线的起始弧度。 | + | endAngle | number | 弧线的终止弧度。 | + | anticlockwise | boolean | 是否逆时针绘制圆弧。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.arc(100, 75, 50, 0, 6.28); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001173164867.png) + ![zh-cn_image_0000001173164867](figures/zh-cn_image_0000001173164867.png) -## arcTo +## arcTo -arcTo\(x1: number, y1: number, x2: number, y2: number, radius: number\): void +arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void 依据圆弧经过的点和圆弧半径创建圆弧路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x1

        -

        number

        -

        圆弧经过的第一个点的x坐标值。

        -

        y1

        -

        number

        -

        圆弧经过的第一个点的y坐标值。

        -

        x2

        -

        number

        -

        圆弧经过的第二个点的x坐标值。

        -

        y2

        -

        number

        -

        圆弧经过的第二个点的y坐标值。

        -

        radius

        -

        number

        -

        圆弧的圆半径值。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.arcTo(150, 20, 150, 70, 50); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x1 | number | 圆弧经过的第一个点的x坐标值。 | + | y1 | number | 圆弧经过的第一个点的y坐标值。 | + | x2 | number | 圆弧经过的第二个点的x坐标值。 | + | y2 | number | 圆弧经过的第二个点的y坐标值。 | + | radius | number | 圆弧的圆半径值。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.arcTo(150, 20, 150, 70, 50); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001127125204.png) + ![zh-cn_image_0000001127125204](figures/zh-cn_image_0000001127125204.png) -## ellipse +## ellipse -ellipse\(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: number\): void +ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: number): void 在规定的矩形区域绘制一个椭圆。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        椭圆圆心的x轴坐标。

        -

        y

        -

        number

        -

        椭圆圆心的y轴坐标。

        -

        radiusX

        -

        number

        -

        椭圆x轴的半径长度。

        -

        radiusY

        -

        number

        -

        椭圆y轴的半径长度。

        -

        rotation

        -

        number

        -

        椭圆的旋转角度,单位为弧度。

        -

        startAngle

        -

        number

        -

        椭圆绘制的起始点角度,以弧度表示。

        -

        endAngle

        -

        number

        -

        椭圆绘制的结束点角度,以弧度表示。

        -

        anticlockwise

        -

        number

        -

        是否以逆时针方向绘制椭圆,0为顺时针,1为逆时针。(可选参数,默认为0)

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx =el.getContext('2d'); - var path = ctx.createPath2D(); - path.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI, 1); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 椭圆圆心的x轴坐标。 | + | y | number | 椭圆圆心的y轴坐标。 | + | radiusX | number | 椭圆x轴的半径长度。 | + | radiusY | number | 椭圆y轴的半径长度。 | + | rotation | number | 椭圆的旋转角度,单位为弧度。 | + | startAngle | number | 椭圆绘制的起始点角度,以弧度表示。 | + | endAngle | number | 椭圆绘制的结束点角度,以弧度表示。 | + | anticlockwise | number | 是否以逆时针方向绘制椭圆,0为顺时针,1为逆时针。(可选参数,默认为0) | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx =el.getContext('2d'); + var path = ctx.createPath2D(); + path.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI, 1); + ctx.stroke(path); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001173324787.png) + ![zh-cn_image_0000001173324787](figures/zh-cn_image_0000001173324787.png) -## rect +## rect -rect\(x: number, y: number, width: number, height: number\): void +rect(x: number, y: number, width: number, height: number): void 创建矩形路径。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        指定矩形的左上角x坐标值。

        -

        y

        -

        number

        -

        指定矩形的左上角y坐标值。

        -

        width

        -

        number

        -

        指定矩形的宽度。

        -

        height

        -

        number

        -

        指定矩形的高度。

        -
        - -- 示例 - - ``` - -
        - -
        - ``` - - ``` - //xxx.js - export default { - onShow() { - const el =this.$refs.canvas; - const ctx = el.getContext('2d'); - var path = ctx.createPath2D(); - path.rect(20, 20, 100, 100); - ctx.stroke(path); - } +- 参数 + | 参数 | 类型 | 描述 | + | -------- | -------- | -------- | + | x | number | 指定矩形的左上角x坐标值。 | + | y | number | 指定矩形的左上角y坐标值。 | + | width | number | 指定矩形的宽度。 | + | height | number | 指定矩形的高度。 | + +- 示例 + ``` + +
        + +
        + ``` + + ``` + //xxx.js + export default { + onShow() { + const el =this.$refs.canvas; + const ctx = el.getContext('2d'); + var path = ctx.createPath2D(); + path.rect(20, 20, 100, 100); + ctx.stroke(path); } - ``` - - ![](figures/zh-cn_image_0000001127125212.png) - + } + ``` + ![zh-cn_image_0000001127125212](figures/zh-cn_image_0000001127125212.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-canvas.md b/zh-cn/application-dev/reference/arkui-js/js-components-canvas.md index 283c3b0aba8..b80397bf3c7 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-canvas.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-canvas.md @@ -1,21 +1,21 @@ -# 画布组件 +# 画布组件 -- **[canvas组件](js-components-canvas-canvas.md)** -- **[CanvasRenderingContext2D对象](js-components-canvas-canvasrenderingcontext2d.md)** -- **[Image对象](js-components-canvas-image.md)** +- **[canvas组件](js-components-canvas-canvas.md)** -- **[CanvasGradient对象](js-components-canvas-canvasgradient.md)** +- **[CanvasRenderingContext2D对象](js-components-canvas-canvasrenderingcontext2d.md)** -- **[ImageData对象](js-components-canvas-imagedata.md)** +- **[Image对象](js-components-canvas-image.md)** -- **[Path2D对象](js-components-canvas-path2d.md)** +- **[CanvasGradient对象](js-components-canvas-canvasgradient.md)** -- **[ImageBitmap对象](js-components-canvas-imagebitmap.md)** +- **[ImageData对象](js-components-canvas-imagedata.md)** -- **[OffscreenCanvas对象](js-components-canvas-offscreencanvas.md)** +- **[Path2D对象](js-components-canvas-path2d.md)** -- **[OffscreenCanvasRenderingContext2D对象](js-offscreencanvasrenderingcontext2d.md)** +- **[ImageBitmap对象](js-components-canvas-imagebitmap.md)** +- **[OffscreenCanvas对象](js-components-canvas-offscreencanvas.md)** +- **[OffscreenCanvasRenderingContext2D对象](js-offscreencanvasrenderingcontext2d.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-animation.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-animation.md index b9cc5bcd41a..b2e6324e549 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-animation.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-animation.md @@ -1,380 +1,65 @@ -# 动画样式 +# 动画样式 -组件支持动态的旋转、平移、缩放效果,可在style或css中设置。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        transform-origin

        -

        string6+ | <percentage> | <length> string6+ | <percentage> | <length>

        -

        center center

        -

        变换对象的原点位置,支持px和百分比(相对于动画目标组件),如果仅设置一个值,另一个值为50%,第一个string的可选值为:left | center | right ,第二个string的可选值为:top | center | bottom。

        -

        示例:

        -

        transform-origin: 200px 30%。

        -

        transform-origin: 100px top。

        -

        transform-origin: center center。

        -

        transform

        -

        string

        -

        -

        -

        支持同时设置平移/旋转/缩放的属性。

        -

        详见表1

        -

        animation6+

        -

        string

        -

        0s ease 0s 1 normal none running none

        -

        格式:duration | timing-function | delay | iteration-count | direction | fill-mode | play-state | name,每个字段不区分先后,但是 duration / delay 按照出现的先后顺序解析。

        -

        animation-name

        -

        string

        -

        -

        -

        指定@keyframes,详见表2

        -

        animation-delay

        -

        <time>

        -

        0

        -

        定义动画播放的延迟时间。支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。

        -

        animation-duration

        -

        <time>

        -

        0

        -

        定义一个动画周期。支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。

        -
        说明:

        animation-duration 样式必须设置,否则时长为 0,则不会播放动画。

        -
        -

        animation-iteration-count

        -

        number | infinite

        -

        1

        -

        定义动画播放的次数,默认播放一次,可通过设置为infinite无限次播放。

        -

        animation-timing-function

        -

        string

        -

        ease

        -

        描述动画执行的速度曲线,用于使动画更为平滑。

        -

        可选项有:

        -
        • linear:表示动画从头到尾的速度都是相同的。
        • ease:表示动画以低速开始,然后加快,在结束前变慢,cubic-bezier(0.25, 0.1, 0.25, 1.0)。
        • ease-in:表示动画以低速开始,cubic-bezier(0.42, 0.0, 1.0, 1.0)。
        • ease-out:表示动画以低速结束,cubic-bezier(0.0, 0.0, 0.58, 1.0)。
        • ease-in-out:表示动画以低速开始和结束,cubic-bezier(0.42, 0.0, 0.58, 1.0)。
        • friction:阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。
        • extreme-deceleration:急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。
        • sharp:锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。
        • rhythm:节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。
        • smooth:平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。
        • cubic-bezier:在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。
        • steps: 阶梯曲线6+。语法:steps(number[, end|start]);number必须设置,支持的类型为正整数。第二个参数可选,表示在每个间隔的起点或是终点发生阶跃变化,支持设置end或start,默认值为end。
        -

        animation-direction6+

        -

        string

        -

        normal

        -

        指定动画的播放模式:

        -
        • normal: 动画正向循环播放。
        • reverse: 动画反向循环播放。
        • alternate:动画交替循环播放,奇数次正向播放,偶数次反向播放。
        • alternate-reverse:动画反向交替循环播放,奇数次反向播放,偶数次正向播放。
        -

        animation-fill-mode

        -

        string

        -

        none

        -

        指定动画开始和结束的状态:

        -
        • none:在动画执行之前和之后都不会应用任何样式到目标上。
        • forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。
        • backwards6+:动画将在animation-delay期间应用第一个关键帧中定义的值。当animation-direction为"normal"或"alternate"时应用from关键帧中的值,当animation-direction为"reverse"或"alternate-reverse"时应用to关键帧中的值。
        • both6+:动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。
        -

        animation-play-state6+

        -

        string

        -

        running

        -

        指定动画的当前状态:

        -
        • paused:动画状态为暂停。
        • running:动画状态为播放。
        -

        transition6+

        -

        string

        -

        all 0 ease 0

        -

        指定组件状态切换时的过渡效果,可以通过transition属性设置如下四个属性:

        -
        • transition-property:规定设置过渡效果的 CSS 属性的名称,目前支持宽、高、背景色。
        • transition-duration:规定完成过渡效果需要的时间,单位秒。
        • transition-timing-function:规定过渡效果的时间曲线,支持样式动画提供的曲线。
        • transition-delay:规定过渡效果延时启动时间,单位秒。
        -
        +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -**表 1** transform操作说明 +组件支持动态的旋转、平移、缩放效果,可在style或css中设置。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        描述

        -

        none6+

        -

        -

        -

        不进行任何转换。

        -

        matrix6+

        -

        <number>

        -

        入参为六个值的矩阵,6个值分别代表:scaleX, skewY, skewX, scaleY, translateX, translateY。

        -

        matrix3d6+

        -

        <number>

        -

        入参为十六个值的4X4矩阵。

        -

        translate

        -

        <length>| <percent>

        -

        平移动画属性,支持设置x轴和y轴两个维度的平移参数。

        -

        translate3d6+

        -

        <length>| <percent>

        -

        三个入参,分别代表X轴、Y轴、Z轴的平移距离。

        -

        translateX

        -

        <length>| <percent>

        -

        X轴方向平移动画属性。

        -

        translateY

        -

        <length>| <percent>

        -

        Y轴方向平移动画属性。

        -

        translateZ6+

        -

        <length>| <percent>

        -

        Z轴的平移距离。

        -

        scale

        -

        <number>

        -

        缩放动画属性,支持设置x轴和y轴两个维度的缩放参数。

        -

        scale3d6+

        -

        <number>

        -

        三个入参,分别代表X轴、Y轴、Z轴的缩放参数。

        -

        scaleX

        -

        <number>

        -

        X轴方向缩放动画属性。

        -

        scaleY

        -

        <number>

        -

        Y轴方向缩放动画属性。

        -

        scaleZ6+

        -

        <number>

        -

        Z轴的缩放参数。

        -

        rotate

        -

        <deg> | <rad> | <grad>6+ | <turn>6+

        -

        旋转动画属性,支持设置x轴和y轴两个维度的选中参数。

        -

        rotate3d6+

        -

        <deg> | <rad> | <grad> | <turn>

        -

        四个入参,前三个分别为X轴、Y轴、Z轴的旋转向量,第四个是旋转角度。

        -

        rotateX

        -

        <deg> | <rad> | <grad>6+ | <turn>6+

        -

        X轴方向旋转动画属性。

        -

        rotateY

        -

        <deg> | <rad> | <grad>6+ | <turn>6+

        -

        Y轴方向旋转动画属性。

        -

        rotateZ6+

        -

        <deg> | <rad> | <grad> | <turn>

        -

        Z轴方向的旋转角度。

        -

        skew6+

        -

        <deg> | <rad> | <grad> | <turn>

        -

        两个入参,分别为X轴和Y轴的2D倾斜角度。

        -

        skewX6+

        -

        <deg> | <rad> | <grad> | <turn>

        -

        X轴的2D倾斜角度。

        -

        skewY6+

        -

        <deg> | <rad> | <grad> | <turn>

        -

        Y轴的2D倾斜角度。

        -

        perspective6+

        -

        <number>

        -

        3D透视场景下镜头距离元素表面的距离。

        -
        -**表 2** @keyframes属性说明 +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| transform-origin | string6+ \| <percentage> \| <length> string6+ \| <percentage> \| <length> | center center | 变换对象的原点位置,支持px和百分比(相对于动画目标组件),如果仅设置一个值,另一个值为50%,第一个string的可选值为:left \| center \| right ,第二个string的可选值为:top \| center \| bottom。
        示例:
        transform-origin: 200px 30%。
        transform-origin: 100px top。
        transform-origin: center center。 | +| transform | string | - | 支持同时设置平移/旋转/缩放的属性。
        详见表 transform操作说明。 | +| animation6+ | string | 0s ease 0s 1 normal none running none | 格式:duration \| timing-function \| delay \| iteration-count \| direction \| fill-mode \| play-state \| name,每个字段不区分先后,但是 duration / delay 按照出现的先后顺序解析。 | +| animation-name | string | - | 指定\@keyframes,详见表 @keyframes属性说明。 | +| animation-delay | <time> | 0 | 定义动画播放的延迟时间。支持的单位为[s(秒)\|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。 | +| animation-duration | <time> | 0 | 定义一个动画周期。支持的单位为[s(秒)\|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > animation-duration 样式必须设置,否则时长为 0,则不会播放动画。 | +| animation-iteration-count | number  \| infinite | 1 | 定义动画播放的次数,默认播放一次,可通过设置为infinite无限次播放。 | +| animation-timing-function | string | ease
        | 描述动画执行的速度曲线,用于使动画更为平滑。
        可选项有:
        - linear:表示动画从头到尾的速度都是相同的。
        - ease:表示动画以低速开始,然后加快,在结束前变慢,cubic-bezier(0.25, 0.1, 0.25, 1.0)。
        - ease-in:表示动画以低速开始,cubic-bezier(0.42, 0.0, 1.0, 1.0)。
        - ease-out:表示动画以低速结束,cubic-bezier(0.0, 0.0, 0.58, 1.0)。
        - ease-in-out:表示动画以低速开始和结束,cubic-bezier(0.42, 0.0, 0.58, 1.0)。
        - friction:阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。
        - extreme-deceleration:急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。
        - sharp:锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。
        - rhythm:节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。
        - smooth:平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。
        - cubic-bezier:在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。
        - steps: 阶梯曲线6+。语法:steps(number[, end\|start]);number必须设置,支持的类型为正整数。第二个参数可选,表示在每个间隔的起点或是终点发生阶跃变化,支持设置end或start,默认值为end。 | +| animation-direction6+ | string | normal | 指定动画的播放模式:
        - normal: 动画正向循环播放。
        - reverse: 动画反向循环播放。
        - alternate:动画交替循环播放,奇数次正向播放,偶数次反向播放。
        - alternate-reverse:动画反向交替循环播放,奇数次反向播放,偶数次正向播放。 | +| animation-fill-mode | string | none | 指定动画开始和结束的状态:
        - none:在动画执行之前和之后都不会应用任何样式到目标上。
        - forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。
        - backwards6+:动画将在animation-delay期间应用第一个关键帧中定义的值。当animation-direction为"normal"或"alternate"时应用from关键帧中的值,当animation-direction为"reverse"或"alternate-reverse"时应用to关键帧中的值。
        - both6+:动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。 | +| animation-play-state6+ | string | running | 指定动画的当前状态:
        - paused:动画状态为暂停。
        - running:动画状态为播放。 | +| transition6+ | string | all 0 ease 0 | 指定组件状态切换时的过渡效果,可以通过transition属性设置如下四个属性:
        - transition-property:规定设置过渡效果的 CSS 属性的名称,目前支持宽、高、背景色。
        - transition-duration:规定完成过渡效果需要的时间,单位秒。
        - transition-timing-function:规定过渡效果的时间曲线,支持样式动画提供的曲线。
        - transition-delay:规定过渡效果延时启动时间,单位秒。 | + + +**表1** transform操作说明 + +| 名称 | 类型 | 描述 | +| -------- | -------- | -------- | +| none6+ | - | 不进行任何转换。 | +| matrix6+ | <number> | 入参为六个值的矩阵,6个值分别代表:scaleX, skewY, skewX, scaleY, translateX, translateY。 | +| matrix3d6+ | <number> | 入参为十六个值的4X4矩阵。 | +| translate | <length>\| <percent> | 平移动画属性,支持设置x轴和y轴两个维度的平移参数。 | +| translate3d6+ | <length>\| <percent> | 三个入参,分别代表X轴、Y轴、Z轴的平移距离。 | +| translateX | <length>\| <percent> | X轴方向平移动画属性。 | +| translateY | <length>\| <percent> | Y轴方向平移动画属性。 | +| translateZ6+ | <length>\| <percent> | Z轴的平移距离。 | +| scale | <number> | 缩放动画属性,支持设置x轴和y轴两个维度的缩放参数。 | +| scale3d6+ | <number> | 三个入参,分别代表X轴、Y轴、Z轴的缩放参数。 | +| scaleX | <number> | X轴方向缩放动画属性。 | +| scaleY | <number> | Y轴方向缩放动画属性。 | +| scaleZ6+ | <number> | Z轴的缩放参数。 | +| rotate | <deg> \| <rad> \| <grad>6+ \| <turn>6+ | 旋转动画属性,支持设置x轴和y轴两个维度的选中参数。 | +| rotate3d6+ | <deg> \| <rad> \| <grad> \| <turn> | 四个入参,前三个分别为X轴、Y轴、Z轴的旋转向量,第四个是旋转角度。 | +| rotateX | <deg> \| <rad> \| <grad>6+ \| <turn>6+ | X轴方向旋转动画属性。 | +| rotateY | <deg> \| <rad> \| <grad>6+ \| <turn>6+ | Y轴方向旋转动画属性。 | +| rotateZ6+ | <deg> \| <rad> \| <grad> \| <turn> | Z轴方向的旋转角度。 | +| skew6+ | <deg> \| <rad> \| <grad> \| <turn> | 两个入参,分别为X轴和Y轴的2D倾斜角度。 | +| skewX6+ | <deg> \| <rad> \| <grad> \| <turn> | X轴的2D倾斜角度。 | +| skewY6+ | <deg> \| <rad> \| <grad> \| <turn> | Y轴的2D倾斜角度。 | +| perspective6+ | <number> | 3D透视场景下镜头距离元素表面的距离。 | + +**表2** @keyframes属性说明 + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| background-color | <color> | - | 动画执行后应用到组件上的背景颜色。 | +| opacity | number | 1 | 动画执行后应用到组件上的不透明度值,为介于0到1间的数值,默认为1。 | +| width | <length> | - | 动画执行后应用到组件上的宽度值。 | +| height | <length> | - | 动画执行后应用到组件上的高度值。 | +| transform | string | - | 定义应用在组件上的变换类型,见表 transform操作说明。 | +| background-position6+ | string \| <percentage> \| <length> string \| <percentage> \| <length> | 50% 50% | 背景图位置。单位支持百分比和px,第一个值是水平位置,第二个值是垂直位置。如果仅设置一个值,另一个值为50%。第一个string的可选值为:left \| center \| right ,第二个string的可选值为:top \| center \| bottom。
        示例:
        - background-position: 200px 30%
        - background-position: 100px top
        - background-position: center center | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        background-color

        -

        <color>

        -

        -

        -

        动画执行后应用到组件上的背景颜色。

        -

        opacity

        -

        number

        -

        1

        -

        动画执行后应用到组件上的不透明度值,为介于0到1间的数值,默认为1。

        -

        width

        -

        <length>

        -

        -

        -

        动画执行后应用到组件上的宽度值。

        -

        height

        -

        <length>

        -

        -

        -

        动画执行后应用到组件上的高度值。

        -

        transform

        -

        string

        -

        -

        -

        定义应用在组件上的变换类型,见表1

        -

        background-position6+

        -

        string | <percentage> | <length> string | <percentage> | <length>

        -

        50% 50%

        -

        背景图位置。单位支持百分比和px,第一个值是水平位置,第二个值是垂直位置。如果仅设置一个值,另一个值为50%。第一个string的可选值为:left | center | right ,第二个string的可选值为:top | center | bottom。

        -

        示例:

        -
        • background-position: 200px 30%
        • background-position: 100px top
        • background-position: center center
        -
        对于不支持起始值或终止值缺省的情况,可以通过from和to显示指定起始和结束。可以通过百分比指定动画运行的中间状态6+。示例: @@ -403,11 +88,11 @@ background-color: #f76160; transform:translate(100px) rotate(0deg) scale(1.0); } - /* 可以通过百分比指定动画运行的中间状态6+ */ - 50% { - background-color: #f76160; - transform:translate(100px) rotate(60deg) scale(1.3); - } + /* 可以通过百分比指定动画运行的中间状态 */ + 50% { + background-color: \#f76160; + transform:translate(100px) rotate(60deg) scale(1.3); + } to { background-color: #09ba07; transform:translate(100px) rotate(180deg) scale(2.0); @@ -415,7 +100,8 @@ } ``` -![](figures/zh-cn_image_0000001173324797.gif) + +![zh-cn_image_0000001173324797](figures/zh-cn_image_0000001173324797.gif) ``` @@ -463,7 +149,8 @@ export default { } ``` -![](figures/zh-cn_image_0000001127285034.gif) + +![zh-cn_image_0000001127285034](figures/zh-cn_image_0000001127285034.gif) ``` @@ -521,10 +208,13 @@ export default { } ``` -![](figures/zh-cn_image_0000001152833768.gif) ->![](../../public_sys-resources/icon-note.gif) **说明:** ->@keyframes的from/to不支持动态绑定。 ->steps函数的end和start含义如下图所示。 ->![](figures/zh-cn_image_0000001127125220.png) +![zh-cn_image_0000001152833768](figures/zh-cn_image_0000001152833768.gif) + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> @keyframes的from/to不支持动态绑定。 +> +> steps函数的end和start含义如下图所示。 +> +> ![zh-cn_image_0000001127125220](figures/zh-cn_image_0000001127125220.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-atomic-layout.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-atomic-layout.md index 2e943c6b5d3..bd9563e724f 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-atomic-layout.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-atomic-layout.md @@ -1,84 +1,33 @@ -# 原子布局 +# 原子布局 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 在屏幕形态和规格不同等情况下,布局效果需要实现自适应,因此系统提供了面向不同屏幕尺寸界面自适应适配的布局能力,称为原子布局。设计师可以考虑使用原子能力,定义元素在不同形态的尺寸界面上体现的自适应规则。开发者可以使用原子布局能力,快速实现让应用在多形态屏幕上有与设计效果相匹配的自适应效果。 -## 隐藏能力 + +## 隐藏能力 在非折行flex布局基础上,增加了显示优先级标记,可以调整组件内元素水平/垂直方向的显示优先级,根据当前组件容器的可用空间来显示内容。 - - - - - - - - - - - - -

        样式

        -

        类型

        -

        默认值

        -

        说明

        -

        display-index

        -

        number

        -

        0

        -

        适用于div等支持flex布局的容器组件中的子组件上,当容器组件在flex主轴上尺寸不足以显示全部内容时,按照display-index值从小到大的顺序进行隐藏,具有相同display-index值的组件同时隐藏,默认值为0,表示隐藏。

        -
        +| 样式 | 类型 | 默认值 | 说明 | +| -------- | -------- | -------- | -------- | +| display-index | number | 0 | 适用于div等支持flex布局的容器组件中的子组件上,当容器组件在flex主轴上尺寸不足以显示全部内容时,按照display-index值从小到大的顺序进行隐藏,具有相同display-index值的组件同时隐藏,默认值为0,表示隐藏。 | + -## 占比能力 +## 占比能力 在非折行的flex布局中,定义了占比能力的组件,保证指定元素始终在容器的某一个比例空间中进行布局。 - - - - - - - - - - - - -

        样式

        -

        类型

        -

        默认值

        -

        说明

        -

        flex-weight

        -

        number

        -

        -

        -

        指明当前元素在flex主轴方向上尺寸权值,当且仅当容器组件中所有节点均设置此属性时生效,当前元素尺寸为: 容器主轴尺寸 * 当前权值 / 所有子元素权值和。

        -
        +| 样式 | 类型 | 默认值 | 说明 | +| -------- | -------- | -------- | -------- | +| flex-weight | number | - | 指明当前元素在flex主轴方向上尺寸权值。如果容器组件中所有节点均设置此属性,当前元素尺寸为: 容器主轴尺寸 \* 当前权值 / 所有子元素权值和。如果容器组件中某几个节点设置此属性,则容器会对其他未设置此属性的节点进行布局,再将剩余空间分配给设置了此属性的节点。设置了此属性的节点的尺寸为:容器剩余空间 \* 该元素权值 / 所有子元素权值和。 | -## 固定比例 -定义了组件固定比例调整尺寸的能力。 +## 固定比例 - - - - - - - - - - - - -

        样式

        -

        类型

        -

        默认值

        -

        说明

        -

        aspect-ratio

        -

        number

        -

        -

        -

        1. 接受任意大于0的浮点值,定义为该节点的宽度与高度比,设置该属性后,该元素尺寸宽高比按照此属性值进行调整。

        -

        2. 遵守最大值与最小值的限制。

        -

        3. 在flex布局中,主轴尺寸先进行调整,后根据该尺寸调整交叉轴。

        -
        +定义了组件固定比例调整尺寸的能力。 +| 样式 | 类型 | 默认值 | 说明 | +| -------- | -------- | -------- | -------- | +| aspect-ratio | number | - | 1. 接受任意大于0的浮点值,定义为该节点的宽度与高度比,设置该属性后,该元素尺寸宽高比按照此属性值进行调整。
        2. 遵守最大值与最小值的限制。
        3. 在flex布局中,主轴尺寸先进行调整,后根据该尺寸调整交叉轴。 | diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-attributes.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-attributes.md index b5f1d04e26d..bb3542a30dc 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-attributes.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-attributes.md @@ -1,173 +1,34 @@ -# 通用属性 +# 通用属性 -## 常规属性 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +## 常规属性 常规属性指的是组件普遍支持的用来设置组件基本标识和外观显示特征的属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        id

        -

        string

        -

        -

        -

        -

        组件的唯一标识。

        -

        style

        -

        string

        -

        -

        -

        -

        组件的样式声明。

        -

        class

        -

        string

        -

        -

        -

        -

        组件的样式类,用于引用样式表。

        -

        ref

        -

        string

        -

        -

        -

        -

        用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

        -

        disabled

        -

        boolean

        -

        false

        -

        -

        当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

        -

        data

        -

        string

        -

        -

        -

        -

        给当前组件设置data属性,进行相应的数据存储和读取。JS文件中:

        -
        • 在事件回调中使用 e.target.attr.data 读取数据,e为事件回调函数入参。
        • 使用$element或者$refs获取DOM元素后,通过attr.data 进行访问。
        -
        说明:

        从API Version 6 开始,建议使用data-*。

        -
        -

        data-*6+

        -

        string

        -

        -

        -

        -

        给当前组件设置data-*属性,进行相应的数据存储和读取。大小写不敏感,如data-A和data-a默认相同。JS文件中:

        -
        • 在事件回调中使用 e.target.dataSet.a读取数据,e为事件回调函数入参。
        • 使用$element或者$refs获取DOM元素后,通过dataSet.a进行访问。
        -

        click-effect5+

        -

        string

        -

        -

        -

        -

        通过这个属性可以设置组件的弹性点击效果,当前支持如下三种效果:

        -
        • spring-small:建议小面积组件设置,缩放(90%)。
        • spring-medium:建议中面积组件设置,缩放(95%)。
        • spring-large:建议大面积组件设置,缩放(95%)。
        -

        dir6+

        -

        string

        -

        auto

        -

        -

        设置元素布局模式,支持设置rtl、ltr和auto三种属性值:

        -
        • rtl:使用从右往左布局模式。
        • ltr:使用从左往右布局模式。
        • auto:跟随系统语言环境。
        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| style | string | - | 否 | 组件的样式声明。 | +| class | string | - | 否 | 组件的样式类,用于引用样式表。 | +| ref | string | - | 否 | 用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。 | +| disabled | boolean | false | 否 | 当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。 | +| data | string | - | 否 | 给当前组件设置data属性,进行相应的数据存储和读取。JS文件中:
        - 在事件回调中使用 e.target.attr.data 读取数据,e为事件回调函数入参。
        - 使用$element或者$refs获取DOM元素后,通过attr.data 进行访问。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 从API Version 6 开始,建议使用data-\*。 | +| data-\*6+ | string | - | 否 | 给当前组件设置data-\*属性,进行相应的数据存储和读取。大小写不敏感,如data-A和data-a默认相同。JS文件中:
        - 在事件回调中使用 e.target.dataSet.a读取数据,e为事件回调函数入参。
        - 使用$element或者$refs获取DOM元素后,通过dataSet.a进行访问。 | +| click-effect5+ | string | - | 否 | 通过这个属性可以设置组件的弹性点击效果,当前支持如下三种效果:
        - spring-small:建议小面积组件设置,缩放(90%)。
        - spring-medium:建议中面积组件设置,缩放(95%)。
        - spring-large:建议大面积组件设置,缩放(95%)。 | +| dir6+ | string | auto | 否 | 设置元素布局模式,支持设置rtl、ltr和auto三种属性值:
        - rtl:使用从右往左布局模式。
        - ltr:使用从左往右布局模式。
        - auto:跟随系统语言环境。 | -## 渲染属性 -组件普遍支持的用来设置组件是否渲染的属性。 +## 渲染属性 - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        for

        -

        Array

        -

        -

        -

        根据设置的数据列表,展开当前元素。

        -

        if

        -

        boolean

        -

        -

        -

        根据设置的boolean值,添加或移除当前元素。

        -

        show

        -

        boolean

        -

        -

        -

        根据设置的boolean值,显示或隐藏当前元素。

        -
        +组件普遍支持的用来设置组件是否渲染的属性。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->属性和样式不能混用,不能在属性字段中进行样式设置。 +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| for | Array | - | 根据设置的数据列表,展开当前元素。 | +| if | boolean | - | 根据设置的boolean值,添加或移除当前元素。 | +| show | boolean | - | 根据设置的boolean值,显示或隐藏当前元素。 | +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 属性和样式不能混用,不能在属性字段中进行样式设置。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-customizing-font.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-customizing-font.md index 1c8e89bc245..e20ad7ff244 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-customizing-font.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-customizing-font.md @@ -1,10 +1,15 @@ -# 自定义字体样式 +# 自定义字体样式 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 font-face用于定义字体样式。应用可以在style中定义font-face来指定相应的字体名和字体资源,然后在font-family样式中引用该字体。 + 自定义字体可以是从项目中的字体文件中加载的字体,字体格式支持ttf和otf。 -## 定义font-face + +## 定义font-face ``` @font-face { @@ -21,18 +26,18 @@ font-face用于定义字体样式。应用可以在style中定义font-face来指 自定义字体的来源,支持如下类别: -- 项目中的字体文件:通过url指定项目中的字体文件路径\(只支持绝对路径,详见[资源和文件访问规则](../../ui/js-framework-file.md)章节\)。 +- 项目中的字体文件:通过url指定项目中的字体文件路径(只支持绝对路径,详见[资源和文件访问规则](../../ui/js-framework-file.md)章节)。 -- 不支持设置多个src。 +- 不支持设置多个src。 -## 使用font-face + +## 使用font-face 可以在style中定义font-face,然后在font-family样式中指定该font-face的名称,从而应用font-face定义的字体。 **示例:** 页面布局: - ```
        测试自定义字体 @@ -50,4 +55,3 @@ font-face用于定义字体样式。应用可以在style中定义font-face来指 font-family: HWfont; } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-events.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-events.md index 140f2a5aae2..973948bf46b 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-events.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-events.md @@ -1,462 +1,104 @@ -# 通用事件 +# 通用事件 -## 事件说明 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -- 事件绑定在组件上,当组件达到事件触发条件时,会执行JS中对应的事件回调函数,实现页面UI视图和页面JS逻辑层的交互; -- 事件回调函数中通过参数可以携带额外的信息,如组件上的数据对象dataset,事件特有的回调参数。 +## 事件说明 -相对于私有事件,大部分组件都可以绑定如下事件。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        是否支持冒泡

        -

        touchstart

        -

        TouchEvent

        -

        手指刚触摸屏幕时触发该事件。

        -

        5+

        -

        touchmove

        -

        TouchEvent

        -

        手指触摸屏幕后移动时触发该事件。

        -

        5+

        -

        touchcancel

        -

        TouchEvent

        -

        手指触摸屏幕中动作被打断时触发该事件。

        -

        5+

        -

        touchend

        -

        TouchEvent

        -

        手指触摸结束离开屏幕时触发该事件。

        -

        5+

        -

        click

        -

        -

        -

        点击动作触发该事件。

        -

        6+

        -

        doubleclick7+

        -
          

        双击动作触发该事件

        -

        -

        longpress

        -

        -

        -

        长按动作触发该事件。

        -

        -

        swipe5+

        -

        SwipeEvent

        -

        组件上快速滑动后触发该事件。

        -

        -

        attached6+

        -

        -

        -

        当前组件节点挂载在渲染树后触发。

        -

        -

        detached6+

        -

        -

        -

        当前组件节点从渲染树中移除后触发。

        -

        -

        pinchstart7+

        -

        PinchEvent

        -

        手指开始执行捏合操作时触发该事件。

        -

        -

        pinchupdate7+

        -

        PinchEvent

        -

        手指执行捏合操作过程中触发该事件。

        -

        -

        pinchend7+

        -

        PinchEvent

        -

        手指捏合操作结束离开屏幕时触发该事件。

        -

        -

        pinchcancel7+

        -

        PinchEvent

        -

        手指捏合操作被打断时触发该事件。

        -

        -

        dragstart7+

        -

        DragEvent

        -

        用户开始拖拽时触发该事件。

        -

        -

        drag7+

        -

        DragEvent

        -

        拖拽过程中触发该事件。

        -

        -

        dragend7+

        -

        DragEvent

        -

        用户拖拽完成后触发。

        -

        -

        dragenter7+

        -

        DragEvent

        -

        进入释放目标时触发该事件。

        -

        -

        dragover7+

        -

        DragEvent

        -

        在释放目标内拖动时触发。

        -

        -

        dragleave7+

        -

        DragEvent

        -

        离开释放目标区域时触发。

        -

        -

        drop7+

        -

        DragEvent

        -

        在可释放目标区域内释放时触发。

        -

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->除上述事件外,其他事件均为非冒泡事件,如[input的change事件](js-components-basic-input.md#section1721512551218),详见各个组件。 - -**表 1** BaseEvent对象属性列表 - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        type

        -

        string

        -

        当前事件的类型,比如click、longpress等。

        -

        timestamp

        -

        number

        -

        该事件触发时的时间戳。

        -
        - -**表 2** TouchEvent对象属性列表\(继承BaseEvent\) - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        touches

        -

        Array<TouchInfo>

        -

        触摸事件时的属性集合,包含屏幕触摸点的信息数组。

        -

        changedTouches

        -

        Array<TouchInfo>

        -

        触摸事件时的属性集合,包括产生变化的屏幕触摸点的信息数组。数据格式和touches一样。该属性表示有变化的触摸点,如从无变有,位置变化,从有变无。例如用户手指刚接触屏幕时,touches数组中有数据,但changedTouches无数据。

        -
        +- 事件绑定在组件上,当组件达到事件触发条件时,会执行JS中对应的事件回调函数,实现页面UI视图和页面JS逻辑层的交互; -**表 3** TouchInfo +- 事件回调函数中通过参数可以携带额外的信息,如组件上的数据对象dataset,事件特有的回调参数。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        globalX

        -

        number

        -

        距离屏幕左上角(不包括状态栏)横向距离。屏幕的左上角为原点。

        -

        globalY

        -

        number

        -

        距离屏幕左上角(不包括状态栏)纵向距离。屏幕的左上角为原点。

        -

        localX

        -

        number

        -

        距离被触摸组件左上角横向距离。组件的左上角为原点。

        -

        localY

        -

        number

        -

        距离被触摸组件左上角纵向距离。组件的左上角为原点。

        -

        size

        -

        number

        -

        触摸接触面积。

        -

        force6+

        -

        number

        -

        接触力信息。

        -

        identifier8+

        -

        number

        -

        接触点标识信息,表示接触表面与触摸点的唯一标识值,手指在屏幕表面上移动触发的每个事件中该值不变。

        -
        -**表 4** SwipeEvent 基础事件对象属性列表(继承BaseEvent) - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        direction

        -

        string

        -

        滑动方向,可能值有:

        -
        1. left:向左滑动;
        2. right:向右滑动;
        3. up:向上滑动;
        4. down:向下滑动。
        -

        distance6+

        -

        number

        -

        在滑动方向上的滑动距离。

        -
        - -**表 5** PinchEvent 对象属性列表7+ - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        scale

        -

        number

        -

        缩放比例

        -

        pinchCenterX

        -

        number

        -

        捏合中心点X轴坐标,单位px

        -

        pinchCenterY

        -

        number

        -

        捏合中心点Y轴坐标,单位px

        -
        - -**表 6** DragEvent对象属性列表\(继承BaseEvent\)7+ +相对于私有事件,大部分组件都可以绑定如下事件。 - - - - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        type

        -

        string

        -

        事件名称。

        -

        globalX

        -

        number

        -

        距离屏幕左上角坐标原点横向距离。

        -

        globalY

        -

        number

        -

        距离屏幕左上角坐标原点纵向距离。

        -

        timestamp

        -

        number

        -

        时间戳。

        -
        -## 事件对象 +| 名称 | 参数 | 描述 | 是否支持冒泡 | +| -------- | -------- | -------- | -------- | +| touchstart | TouchEvent | 手指刚触摸屏幕时触发该事件。
        > **说明:**TouchEvent具体可参考表2 TouchEvent对象属性列表 | 是5+ | +| touchmove | TouchEvent | 手指触摸屏幕后移动时触发该事件。 | 是5+ | +| touchcancel | TouchEvent | 手指触摸屏幕中动作被打断时触发该事件。 | 是5+ | +| touchend | TouchEvent | 手指触摸结束离开屏幕时触发该事件。 | 是5+ | +| click | - | 点击动作触发该事件。 | 是6+ | +| doubleclick7+ | - | 双击动作触发该事件 | 否 | +| longpress | - | 长按动作触发该事件。 | 否 | +| swipe5+ | SwipeEvent | 组件上快速滑动后触发该事件。
        > **说明:**SwipeEvent具体可参考表6 SwipeEvent 基础事件对象属性列表 | 否 | +| attached6+ | - | 当前组件节点挂载在渲染树后触发。 | 否 | +| detached6+ | - | 当前组件节点从渲染树中移除后触发。 | 否 | +| pinchstart7+ | PinchEvent | 手指开始执行捏合操作时触发该事件。
        > **说明:**PinchEvent具体可参考表7 PinchEvent 对象属性列表 | 否 | +| pinchupdate7+ | PinchEvent | 手指执行捏合操作过程中触发该事件。 | 否 | +| pinchend7+ | PinchEvent | 手指捏合操作结束离开屏幕时触发该事件。 | 否 | +| pinchcancel7+ | PinchEvent | 手指捏合操作被打断时触发该事件。 | 否 | +| dragstart7+ | DragEvent | 用户开始拖拽时触发该事件。
        > **说明:**DragEvent具体可参考表8 DragEvent对象属性列表 | 否 | +| drag7+ | DragEvent | 拖拽过程中触发该事件。 | 否 | +| dragend7+ | DragEvent | 用户拖拽完成后触发。 | 否 | +| dragenter7+ | DragEvent | 进入释放目标时触发该事件。 | 否 | +| dragover7+ | DragEvent | 在释放目标内拖动时触发。 | 否 | +| dragleave7+ | DragEvent | 离开释放目标区域时触发。 | 否 | +| drop7+ | DragEvent | 在可释放目标区域内释放时触发。 | 否 | + + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 除上述事件外,其他事件均为非冒泡事件,如[input的change事件](../arkui-js/js-components-basic-input.md#事件),详见各个组件。 + +**表1** BaseEvent对象属性列表 + +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| type | string | 当前事件的类型,比如click、longpress等。 | +| timestamp | number | 该事件触发时的时间戳。 | + +**表2** TouchEvent对象属性列表(继承BaseEvent) + +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| touches | Array<TouchInfo> | 触摸事件时的属性集合,包含屏幕触摸点的信息数组。 | +| changedTouches | Array<TouchInfo> | 触摸事件时的属性集合,包括产生变化的屏幕触摸点的信息数组。数据格式和touches一样。该属性表示有变化的触摸点,如从无变有,位置变化,从有变无。例如用户手指刚接触屏幕时,touches数组中有数据,但changedTouches无数据。 | + +**表3** TouchInfo + +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| globalX | number | 距离屏幕左上角(不包括状态栏)横向距离。屏幕的左上角为原点。 | +| globalY | number | 距离屏幕左上角(不包括状态栏)纵向距离。屏幕的左上角为原点。 | +| localX | number | 距离被触摸组件左上角横向距离。组件的左上角为原点。 | +| localY | number | 距离被触摸组件左上角纵向距离。组件的左上角为原点。 | +| size | number | 触摸接触面积。 | +| force6+ | number | 接触力信息。 | + +**表6** SwipeEvent 基础事件对象属性列表(继承BaseEvent) + +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| direction | string | 滑动方向,可能值有:
        1. left:向左滑动;
        2. right:向右滑动;
        3. up:向上滑动;
        4. down:向下滑动。 | +| distance6+ | number | 在滑动方向上的滑动距离。 | + +**表7** PinchEvent 对象属性列表7+ + +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| scale | number | 缩放比例 | +| pinchCenterX | number | 捏合中心点X轴坐标,单位px | +| pinchCenterY | number | 捏合中心点Y轴坐标,单位px | + +**表8** DragEvent对象属性列表(继承BaseEvent)7+ + +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| type | string | 事件名称。 | +| globalX | number | 距离屏幕左上角坐标原点横向距离。 | +| globalY | number | 距离屏幕左上角坐标原点纵向距离。 | +| timestamp | number | 时间戳。 | + +## 事件对象 当组件触发事件后,事件回调函数默认会收到一个事件对象,通过该事件对象可以获取相应的信息。 **target对象:** - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        dataSet6+

        -

        Object

        -

        组件上通过通用属性设置的data-*的自定义属性组成的集合。

        -
        +| 属性 | 类型 | 说明 | +| -------- | -------- | -------- | +| dataSet6+ | Object | 组件上通过通用属性设置的[data-*](../arkui-js/js-components-common-attributes.md)的自定义属性组成的集合。 | **示例:** @@ -477,4 +119,3 @@ export default { } } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-gradient.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-gradient.md index 9be8919e811..d6de4eea95b 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-gradient.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-gradient.md @@ -1,120 +1,79 @@ -# 渐变样式 +# 渐变样式 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 组件普遍支持的在style或css中设置的 可以平稳过渡两个或多个指定的颜色。 -开发框架支持线性渐变 \(linear-gradient\)和重复线性渐变 \(repeating-linear-gradient\)两种渐变效果。 -## 线性渐变/重复线性渐变 +开发框架支持线性渐变 (linear-gradient)和重复线性渐变 (repeating-linear-gradient)两种渐变效果。 + + +## 线性渐变/重复线性渐变 使用渐变样式,需要定义过渡方向和过渡颜色。 -### 过渡方向 + +### 过渡方向 通过direction或者angle指定过渡方向。 +- direction:进行方向渐变。 -- direction:进行方向渐变。 -- angle:进行角度渐变。 +- angle:进行角度渐变。 ``` background: linear-gradient(direction/angle, color, color, ...); background: repeating-linear-gradient(direction/angle, color, color, ...); ``` -### 过渡颜色 - -支持以下四种方式:\#ff0000、\#ffff0000、rgb\(255, 0, 0\)、rgba\(255, 0, 0, 1\),需要指定至少两种颜色。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        direction

        -

        to <side-or-corner> <side-or-corner> = [left | right] || [top | bottom]

        -

        to bottom (由上到下渐变)

        -

        -

        指定过渡方向,如:to left (从右向左渐变) ;或者

        -

        to bottom right (从左上角到右下角)。

        -

        angle

        -

        <deg>

        -

        180deg

        -

        -

        指定过渡方向,以元素几何中心为坐标原点,水平方向为X轴,angle指定了渐变线与Y轴的夹角(顺时针方向)。

        -

        color

        -

        <color> [<length>|<percentage>]

        -

        -

        -

        -

        定义使用渐变样式区域内颜色的渐变效果。

        -
        - -- 示例 - - 1. 默认渐变方向为从上向下渐变 - - ``` - #gradient { - height: 300px; - width: 600px; - /* 从顶部开始向底部由红色向绿色渐变 */ - background: linear-gradient(red, #00ff00); - } - ``` - - ![](figures/111.png) - - 2. 45度夹角渐变 - - ``` - /* 45度夹角,从红色渐变到绿色 */ - background: linear-gradient(45deg, rgb(255,0,0),rgb(0, 255, 0)); - ``` - - ![](figures/222.png) - - 3. 设置方向从左向右渐变 - - ``` - /* 从左向右渐变,在距离左边90px和距离左边360px (600*0.6) 之间270px宽度形成渐变 */ - background: linear-gradient(to right, rgb(255,0,0) 90px, rgb(0, 255, 0) 60%); - ``` - - ![](figures/333.png) - - 4. 重复渐变 - - ``` - /* 从左向右重复渐变,重复渐变区域30px(60-30)透明度0.5 */ - background: repeating-linear-gradient(to right, rgba(255, 255, 0, 1) 30px,rgba(0, 0, 255, .5) 60px); - ``` - - ![](figures/444.png) +### 过渡颜色 + +支持以下四种方式:\#ff0000、\#ffff0000、rgb(255, 0, 0)、rgba(255, 0, 0, 1),需要指定至少两种颜色。 + +- 参数 + | 名称 | 类型 | 默认值 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | -------- | + | direction | to <side-or-corner>  <side-or-corner> = [left \| right] \|\| [top \| bottom] | to bottom (由上到下渐变) | 否 | 指定过渡方向,如:to left (从右向左渐变)  ;或者
        to bottom right (从左上角到右下角)。 | + | angle | <deg> | 180deg | 否 | 指定过渡方向,以元素几何中心为坐标原点,水平方向为X轴,angle指定了渐变线与Y轴的夹角(顺时针方向)。 | + | color | <color> [<length>\|<percentage>] | - | 是 | 定义使用渐变样式区域内颜色的渐变效果。 | + +- 示例 + 1. 默认渐变方向为从上向下渐变 + ``` + #gradient { + height: 300px; + width: 600px; + /* 从顶部开始向底部由红色向绿色渐变 */ + background: linear-gradient(red, #00ff00); + } + ``` + + ![zh-cn_image_0000001190934502](figures/zh-cn_image_0000001190934502.png) + + 2. 45度夹角渐变 + + ``` + /* 45度夹角,从红色渐变到绿色 */ + background: linear-gradient(45deg, rgb(255,0,0),rgb(0, 255, 0)); + ``` + + ![zh-cn_image_0000001189854534](figures/zh-cn_image_0000001189854534.png) + + 3. 设置方向从左向右渐变 + + ``` + /* 从左向右渐变,在距离左边90px和距离左边360px (600*0.6) 之间270px宽度形成渐变 */ + background: linear-gradient(to right, rgb(255,0,0) 90px, rgb(0, 255, 0) 60%); + ``` + + ![zh-cn_image_0000001236694521](figures/zh-cn_image_0000001236694521.png) + + 4. 重复渐变 + + ``` + /* 从左向右重复渐变,重复渐变区域30px(60-30)透明度0.5 */ + background: repeating-linear-gradient(to right, rgba(255, 255, 0, 1) 30px,rgba(0, 0, 255, .5) 60px); + ``` + ![zh-cn_image_0000001237134475](figures/zh-cn_image_0000001237134475.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-mediaquery.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-mediaquery.md index 03af94ebe40..3b8c6099d96 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-mediaquery.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-mediaquery.md @@ -1,16 +1,23 @@ -# 媒体查询 +# 媒体查询 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - media属性值默认为设备的真实尺寸大小、物理像素和真实的屏幕分辨率。请勿与以720px为基准的项目配置宽度px混淆。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- media属性值默认为设备的真实尺寸大小、物理像素和真实的屏幕分辨率。请勿与以720px为基准的项目配置宽度px混淆。 媒体查询(Media Query)在移动设备上应用十分广泛,开发者经常需要根据设备的大致类型或者特定的特征和设备参数(例如屏幕分辨率)来修改应用的样式。为此媒体查询提供了如下功能: -1. 针对设备和应用的属性信息,可以设计出相匹配的布局样式。 -2. 当屏幕发生动态改变时(比如分屏、横竖屏切换),应用页面布局同步更新。 -## CSS语法规则 +1. 针对设备和应用的属性信息,可以设计出相匹配的布局样式。 + +2. 当屏幕发生动态改变时(比如分屏、横竖屏切换),应用页面布局同步更新。 + + +## CSS语法规则 -使用@media来引入查询语句,具体规则如下: +使用\@media来引入查询语句,具体规则如下: ``` @media [media-type] [and|not|only] [(media-feature)] { @@ -20,17 +27,18 @@ 例子: -@media screen and \(round-screen: true\) \{ … \} // 当设备屏幕是圆形时条件成立 +\@media screen and (round-screen: true) { … } // 当设备屏幕是圆形时条件成立 -@media \(max-height: 800\) \{ … \} // 范围查询,CSS level 3 写法 +\@media (max-height: 800) { … } // 范围查询,CSS level 3 写法 -@media \(height <= 800\) \{ … \} // 范围查询,CSS level 4 写法,与CSS level3写法等价 +\@media (height <= 800) { … } // 范围查询,CSS level 4 写法,与CSS level3写法等价 -@media screen and \(device-type: tv\) or \(resolution < 2\) \{ … \} // 同时包含媒体类型和多个媒体特征的多条件复杂语句查询 +\@media screen and (device-type: tv) or (resolution < 2) { … } // 同时包含媒体类型和多个媒体特征的多条件复杂语句查询 -## 页面中引用资源 -通过@import方式引入媒体查询,具体使用方法如下: +## 页面中引用资源 + +通过\@import方式引入媒体查询,具体使用方法如下: ``` @import url [media-type] [and|not|only] [(media-feature)]; @@ -42,228 +50,70 @@ @import '../common/style.css' screen and (min-width: 600) and (max-width: 1200); ``` -## 媒体类型 - - - - - - - - -

        类型

        -

        说明

        -

        screen

        -

        按屏幕相关参数进行媒体查询。

        -
        +## 媒体类型 + +| 类型 | 说明 | +| -------- | -------- | +| screen | 按屏幕相关参数进行媒体查询。 | -## 媒体逻辑操作 + +## 媒体逻辑操作 媒体逻辑操作符:and、or、not、only用于构成复杂媒体查询,也可以通过comma(,)将其组合起来,详细解释说明如下表。 -**表 1** 媒体逻辑操作符 - - - - - - - - - - - - - - - - - - - - - -

        类型

        -

        说明

        -

        and

        -

        将多个媒体特征(Media Feature)以“与”的方式连接成一个媒体查询,只有当所有媒体特征都为true,查询条件成立。另外,它还可以将媒体类型和媒体功能结合起来。

        -

        例如:screen and (device-type: wearable) and (max-height: 600) 表示当设备类型是智能穿戴同时应用的最大高度小于等于600个像素单位时成立。

        -

        not

        -

        取反媒体查询结果,媒体查询结果不成立时返回true,否则返回false。在媒体查询列表中应用not,则not仅取反应用它的媒体查询。

        -

        例如:not screen and (min-height: 50) and (max-height: 600) 表示当应用高度小于50个像素单位或者大于600个像素单位时成立。

        -
        说明:

        使用not运算符时必须指定媒体类型。

        -
        -

        only

        -

        当整个表达式都匹配时,才会应用选择的样式,可以应用在防止某些较早的版本的浏览器上产生歧义的场景。一些较早版本的浏览器对于同时包含了媒体类型和媒体特征的语句会产生歧义,比如:

        -

        screen and (min-height: 50)

        -

        老版本浏览器会将这句话理解成screen,从而导致仅仅匹配到媒体类型(screen),就应用了指定样式,使用only可以很好地规避这种情况。

        -
        说明:

        使用only时必须指定媒体类型。

        -
        -

        ,(comma)

        -

        将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。其效果等同于or运算符。

        -

        例如:screen and (min-height: 1000), (round-screen:true) 表示当应用高度大于等于1000个像素单位或者设备屏幕是圆形时,条件成立。

        -

        or

        -

        将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。

        -

        例如:screen and (max-height: 1000) or (round-screen:true)表示当应用高度小于等于1000个像素单位或者设备屏幕是圆形时,条件成立。

        -
        - -在MediaQuery Level 4中引入了范围查询,使其能够使用max-,min-的同时,也支持了<=,\>=,<,\>操作符。 - -**表 2** 媒体逻辑范围操作符 - - - - - - - - - - - - - - - - - - -

        类型

        -

        说明

        -

        <=

        -

        小于等于,例如:screen and (height <= 50)。

        -

        >=

        -

        大于等于,例如:screen and (height >= 600)。

        -

        <

        -

        小于,例如:screen and (height < 50)。

        -

        >

        -

        大于,例如:screen and (height > 600)。

        -
        - -## 媒体特征 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        类型

        -

        说明

        -

        height

        -

        应用页面显示区域的高度。

        -

        min-height

        -

        应用页面显示区域的最小高度。

        -

        max-height

        -

        应用页面显示区域的最大高度。

        -

        width

        -

        应用页面显示区域的宽度。

        -

        min-width

        -

        应用页面显示区域的最小宽度。

        -

        max-width

        -

        应用页面显示区域的最大宽度。

        -

        resolution

        -

        设备的分辨率,支持dpi,dppx和dpcm单位。其中:

        -
        • dpi表示每英寸中物理像素个数,1dpi≈0.39dpcm;
        • dpcm表示每厘米上的物理像素个数,1dpcm ≈ 2.54dpi;
        • dppx表示每个px中的物理像素数(此单位按96px=1英寸为基准,与页面中的px单位计算方式不同),1dppx = 96dpi。
        -

        min-resolution

        -

        设备的最小分辨率。

        -

        max-resolution

        -

        设备的最大分辨率。

        -

        orientation

        -

        屏幕的方向。

        -

        可选值:

        -
        • orientation: portrait(设备竖屏)
        • orientation: landscape(设备横屏)
        -

        aspect-ratio

        -

        应用页面显示区域的宽度与高度的比值。

        -

        例如:aspect-ratio:1/2

        -

        min-aspect-ratio

        -

        应用页面显示区域的宽度与高度的最小比值。

        -

        max-aspect-ratio

        -

        应用页面显示区域的宽度与高度的最大比值。

        -

        device-height

        -

        设备的高度。

        -

        min-device-height

        -

        设备的最小高度。

        -

        max-device-height

        -

        设备的最大高度。

        -

        device-width

        -

        设备的宽度。

        -

        min-device-width

        -

        设备的最小宽度。

        -

        max-device-width

        -

        设备的最大宽度。

        -

        round-screen

        -

        屏幕类型,圆形屏幕为true, 非圆形屏幕为 false。

        -

        dark-mode6+

        -

        系统为深色模式时为true,否则为false。

        -
        - -## 示例代码 - -- 通用媒体特征示例代码: +**表1** 媒体逻辑操作符 + +| 类型 | 说明 | +| -------- | -------- | +| and | 将多个媒体特征(Media Feature)以“与”的方式连接成一个媒体查询,只有当所有媒体特征都为true,查询条件成立。另外,它还可以将媒体类型和媒体功能结合起来。
        例如:screen and (device-type: wearable) and (max-height: 600) 表示当设备类型是智能穿戴同时应用的最大高度小于等于600个像素单位时成立。 | +| not | 取反媒体查询结果,媒体查询结果不成立时返回true,否则返回false。在媒体查询列表中应用not,则not仅取反应用它的媒体查询。
        例如:not screen and (min-height: 50) and (max-height: 600) 表示当应用高度小于50个像素单位或者大于600个像素单位时成立。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用not运算符时必须指定媒体类型。 | +| only | 当整个表达式都匹配时,才会应用选择的样式,可以应用在防止某些较早的版本的浏览器上产生歧义的场景。一些较早版本的浏览器对于同时包含了媒体类型和媒体特征的语句会产生歧义,比如:
        screen and (min-height: 50)
        老版本浏览器会将这句话理解成screen,从而导致仅仅匹配到媒体类型(screen),就应用了指定样式,使用only可以很好地规避这种情况。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用only时必须指定媒体类型。 | +| ,(comma) | 将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。其效果等同于or运算符。
        例如:screen and (min-height: 1000),  (round-screen:true) 表示当应用高度大于等于1000个像素单位或者设备屏幕是圆形时,条件成立。 | +| or | 将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。
        例如:screen and (max-height: 1000) or  (round-screen:true)表示当应用高度小于等于1000个像素单位或者设备屏幕是圆形时,条件成立。 | + +在MediaQuery Level 4中引入了范围查询,使其能够使用max-,min-的同时,也支持了<=,>=,<,>操作符。 + +**表2** 媒体逻辑范围操作符 + +| 类型 | 说明 | +| -------- | -------- | +| <= | 小于等于,例如:screen and (height <= 50)。 | +| >= | 大于等于,例如:screen and (height >= 600)。 | +| < | 小于,例如:screen and (height < 50)。 | +| > | 大于,例如:screen and (height > 600)。 | + + +## 媒体特征 + +| 类型 | 说明 | +| -------- | -------- | +| height | 应用页面显示区域的高度。 | +| min-height | 应用页面显示区域的最小高度。 | +| max-height | 应用页面显示区域的最大高度。 | +| width | 应用页面显示区域的宽度。 | +| min-width | 应用页面显示区域的最小宽度。 | +| max-width | 应用页面显示区域的最大宽度。 | +| resolution | 设备的分辨率,支持dpi,dppx和dpcm单位。其中:
        - dpi表示每英寸中物理像素个数,1dpi≈0.39dpcm;
        - dpcm表示每厘米上的物理像素个数,1dpcm ≈ 2.54dpi;
        - dppx表示每个px中的物理像素数(此单位按96px=1英寸为基准,与页面中的px单位计算方式不同),1dppx = 96dpi。 | +| min-resolution | 设备的最小分辨率。 | +| max-resolution | 设备的最大分辨率。 | +| orientation | 屏幕的方向。
        可选值:
        - orientation: portrait(设备竖屏)
        - orientation: landscape(设备横屏) | +| aspect-ratio | 应用页面显示区域的宽度与高度的比值。
        例如:aspect-ratio:1/2 | +| min-aspect-ratio | 应用页面显示区域的宽度与高度的最小比值。 | +| max-aspect-ratio | 应用页面显示区域的宽度与高度的最大比值。 | +| device-height | 设备的高度。 | +| min-device-height | 设备的最小高度。 | +| max-device-height | 设备的最大高度。 | +| device-width | 设备的宽度。 | +| min-device-width | 设备的最小宽度。 | +| max-device-width | 设备的最大宽度。 | +| round-screen | 屏幕类型,圆形屏幕为true, 非圆形屏幕为 false。 | +| dark-mode6+ | 系统为深色模式时为true,否则为false。 | + + +## 示例代码 + +- 通用媒体特征示例代码: ``` @@ -296,4 +146,3 @@ } } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-methods.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-methods.md index 67a47db6444..4450c65ca2e 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-methods.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-methods.md @@ -1,679 +1,255 @@ -# 通用方法 +# 通用方法 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 当组件通过id属性标识后,可以使用该id获取组件对象并调用相关组件方法。 -## animate - -animate\( keyframes: Keyframes, options: Options\):void - -- 参数 - - - - - - - - - - - - - - - - - - -

        参数名

        -

        参数类型

        -

        必填

        -

        描述

        -

        keyframes

        -

        keyframes

        -

        -

        设置动画样式

        -

        options

        -

        Options

        -

        -

        用于设置动画属性的对象列表。options请见Options说明

        -
        - - **表 1** keyframes - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        frames

        -

        Array<Style>

        -

        用于设置动画样式的对象列表。Style类型说明请见Style类型说明

        -
        - - **表 2** Style类型说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        默认值

        -

        说明

        -

        width

        -

        number

        -

        -

        -

        动画执行过程中设置到组件上的宽度值。

        -

        height

        -

        number

        -

        -

        -

        动画执行过程中设置到组件上的高度值。

        -

        backgroundColor

        -

        <color>

        -

        none

        -

        动画执行过程中设置到组件上的背景颜色。

        -

        opacity

        -

        number

        -

        1

        -

        设置到组件上的透明度(介于0到1之间)。

        -

        backgroundPosition

        -

        string

        -

        -

        -

        格式为"x y",单位为百分号或者px。

        -

        第一个值是水平位置,第二个值是垂直位置。

        -

        如果仅规定了一个值,另一个值为 50%。

        -

        transformOrigin

        -

        string

        -

        'center center'

        -

        变换对象的中心点。

        -

        第一个参数表示x轴的值,可以设置为left、center、right、长度值或百分比值。

        -

        第二个参数表示y轴的值,可以设置为top、center、bottom、长度值或百分比值。

        -

        transform

        -

        Transform

        -

        -

        -

        设置到变换对象上的类型。

        -

        offset

        -

        number

        -

        -

        -
        • offset值(如果提供)必须在0.0到1.0(含)之间,并以升序排列。
        • 若只有两帧,可以不填offset。
        • 若超过两帧,offset必填。
        -
        - - **表 3** Options说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        参数

        -

        类型

        -

        默认值

        -

        说明

        -

        duration

        -

        number

        -

        0

        -

        指定当前动画的运行时长(单位毫秒)。

        -

        easing

        -

        string

        -

        linear

        -

        描述动画的时间曲线,支持类型见easing有效值说明

        -

        delay

        -

        number

        -

        0

        -

        设置动画执行的延迟时间(默认值表示无延迟)。

        -

        iterations

        -

        number | string

        -

        1

        -

        设置动画执行的次数。number表示固定次数,Infinity枚举表示无限次数播放。

        -

        direction6+

        -

        string

        -

        normal

        -

        指定动画的播放模式:

        -

        normal: 动画正向循环播放;

        -

        reverse: 动画反向循环播放;

        -

        alternate:动画交替循环播放,奇数次正向播放,偶数次反向播放;

        -

        alternate-reverse:动画反向交替循环播放,奇数次反向播放,偶数次正向播放。

        -

        fill

        -

        string

        -

        none

        -

        指定动画开始和结束的状态:

        -

        none:在动画执行之前和之后都不会应用任何样式到目标上。

        -

        forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。

        -

        backwards6+:动画将在animation-delay期间应用第一个关键帧中定义的值。当animation-direction为"normal"或"alternate"时应用from关键帧中的值,当animation-direction为"reverse"或"alternate-reverse"时应用to关键帧中的值。

        -

        both6+:动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。

        -
        - - **表 4** easing有效值说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        -

        描述

        -

        linear

        -

        动画线性变化。

        -

        ease-in

        -

        动画速度先慢后快,cubic-bezier(0.42, 0.0, 1.0, 1.0)。

        -

        ease-out

        -

        动画速度先快后慢,cubic-bezier(0.0, 0.0, 0.58, 1.0)。

        -

        ease-in-out

        -

        动画先加速后减速,cubic-bezier(0.42, 0.0, 0.58, 1.0)。

        -

        friction

        -

        阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。

        -

        extreme-deceleration

        -

        急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。

        -

        sharp

        -

        锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。

        -

        rhythm

        -

        节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。

        -

        smooth

        -

        平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。

        -

        cubic-bezier(x1, y1, x2, y2)

        -

        在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。

        -

        steps(number, step-position)6+

        -

        Step曲线。

        -

        number必须设置,支持的类型为int。

        -

        step-position参数可选,支持设置start或end,默认值为end。

        -
        - -- 返回值 - - animation对象属性: - - - - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        说明

        -

        finished

        -

        boolean

        -

        只读,用于表示当前动画是否已播放完成。

        -

        pending

        -

        boolean

        -

        只读,用于表示当前动画是否处于等待其他异步操作完成的等待状态(例如启动一个延时播放的动画)。

        -

        playState

        -

        string

        -

        可读可写,动画的执行状态:

        -
        • idle:未执行状态,包括已结束或未开始。
        • running:动画正在运行。
        • paused:动画暂停。
        • finished:动画播放完成。
        -

        startTime

        -

        number

        -

        可读可写,动画播放开始的预定时间,用途类似于options参数中的delay。

        -
        - - animation对象方法: - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        方法

        -

        参数

        -

        说明

        -

        play

        -

        -

        -

        组件播放动画。

        -

        finish

        -

        -

        -

        组件完成动画。

        -

        pause

        -

        -

        -

        组件暂停动画。

        -

        cancel

        -

        -

        -

        组件取消动画。

        -

        reverse

        -

        -

        -

        组件倒播动画。

        -
        - - animation对象事件: - - - - - - - - - - - - - - - - - - -

        事件

        -

        说明

        -

        start6+

        -

        动画开始事件。

        -

        cancel

        -

        动画被强制取消。

        -

        finish

        -

        动画播放完成。

        -

        repeat

        -

        动画重播事件。

        -
        - -- 示例 - - ``` - -
        -
        -
        - - -
        + +## animate + +animate( keyframes: Keyframes, options: Options):void + +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | keyframes | keyframes | 是 | 设置动画样式 | + | options | Options | 是 | 用于设置动画属性的对象列表。options请见表3 Options说明。 | + + **表1** keyframes + + | 属性 | 类型 | 说明 | + | -------- | -------- | -------- | + | frames | Array<Style> | 用于设置动画样式的对象列表。Style类型说明请见表2 Style类型说明。 | + + **表2** Style类型说明 + + | 参数 | 类型 | 默认值 | 说明 | + | -------- | -------- | -------- | -------- | + | width | number | - | 动画执行过程中设置到组件上的宽度值。 | + | height | number | - | 动画执行过程中设置到组件上的高度值。 | + | backgroundColor | <color> | none | 动画执行过程中设置到组件上的背景颜色。 | + | opacity | number | 1 | 设置到组件上的透明度(介于0到1之间)。 | + | backgroundPosition | string | - | 格式为"x y",单位为百分号或者px。
        第一个值是水平位置,第二个值是垂直位置。
        如果仅规定了一个值,另一个值为 50%。 | + | transformOrigin | string | 'center center' | 变换对象的中心点。
        第一个参数表示x轴的值,可以设置为left、center、right、长度值或百分比值。
        第二个参数表示y轴的值,可以设置为top、center、bottom、长度值或百分比值。 | + | transform | [Transform](../arkui-js/js-components-common-animation.md) | - | 设置到变换对象上的类型。 | + | offset | number | - | - offset值(如果提供)必须在0.0到1.0(含)之间,并以升序排列。
        - 若只有两帧,可以不填offset。
        - 若超过两帧,offset必填。 | + + **表3** Options说明 + + | 参数 | 类型 | 默认值 | 说明 | + | -------- | -------- | -------- | -------- | + | duration | number | 0 | 指定当前动画的运行时长(单位毫秒)。 | + | easing | string | linear | 描述动画的时间曲线,支持类型见表4 easing有效值说明。 | + | delay | number | 0 | 设置动画执行的延迟时间(默认值表示无延迟)。 | + | iterations | number \| string | 1 | 设置动画执行的次数。number表示固定次数,Infinity枚举表示无限次数播放。 | + | direction6+ | string | normal | 指定动画的播放模式:
        normal: 动画正向循环播放;
        reverse: 动画反向循环播放;
        alternate:动画交替循环播放,奇数次正向播放,偶数次反向播放;
        alternate-reverse:动画反向交替循环播放,奇数次反向播放,偶数次正向播放。 | + | fill | string | none | 指定动画开始和结束的状态:
        none:在动画执行之前和之后都不会应用任何样式到目标上。
        forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。
        backwards6+:动画将在animation-delay期间应用第一个关键帧中定义的值。当animation-direction为"normal"或"alternate"时应用from关键帧中的值,当animation-direction为"reverse"或"alternate-reverse"时应用to关键帧中的值。
        both:动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。 | + + **表4** easing有效值说明 + + | 值 | 描述 | + | -------- | -------- | + | linear | 动画线性变化。 | + | ease-in | 动画速度先慢后快,cubic-bezier(0.42, 0.0, 1.0, 1.0)。 | + | ease-out | 动画速度先快后慢,cubic-bezier(0.0, 0.0, 0.58, 1.0)。 | + | ease-in-out | 动画先加速后减速,cubic-bezier(0.42, 0.0, 0.58, 1.0)。 | + | friction | 阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。 | + | extreme-deceleration | 急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。 | + | sharp | 锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。 | + | rhythm | 节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。 | + | smooth | 平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。 | + | cubic-bezier(x1, y1, x2, y2) | 在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。 | + | steps(number, step-position)6+ | Step曲线。
        number必须设置,支持的类型为int。
        step-position参数可选,支持设置start或end,默认值为end。 | + +- 返回值 + animation对象属性: + + | 属性 | 类型 | 说明 | + | -------- | -------- | -------- | + | finished | boolean | 只读,用于表示当前动画是否已播放完成。 | + | pending | boolean | 只读,用于表示当前动画是否处于等待其他异步操作完成的等待状态(例如启动一个延时播放的动画)。 | + | playState | string | 可读可写,动画的执行状态:
        - idle:未执行状态,包括已结束或未开始。
        - running:动画正在运行。
        - paused:动画暂停。
        - finished:动画播放完成。 | + | startTime | number | 可读可写,动画播放开始的预定时间,用途类似于options参数中的delay。 | + + animation对象方法: + + | 方法 | 参数 | 说明 | + | -------- | -------- | -------- | + | play | - | 组件播放动画。 | + | finish | - | 组件完成动画。 | + | pause | - | 组件暂停动画。 | + | cancel | - | 组件取消动画。 | + | reverse | - | 组件倒播动画。 | + + animation对象事件: + + | 事件 | 说明 | + | -------- | -------- | + | start6+ | 动画开始事件。 | + | cancel | 动画被强制取消。 | + | finish | 动画播放完成。 | + | repeat | 动画重播事件。 | + +- 示例 + ``` + +
        +
        +
        + +
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - } - .box{ - width: 200px; - height: 200px; - background-color: #ff0000; - margin-top: 30px; - } - .buttonBox{ - margin-top: 30px; - width: 250px; - justify-content: space-between; - } - button{ - background-color: #8e8b89; - color: white; - width: 100px; - height: 40px; - font-size: 24px; +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + } + .box{ + width: 200px; + height: 200px; + background-color: #ff0000; + margin-top: 30px; + } + .buttonBox{ + margin-top: 30px; + width: 250px; + justify-content: space-between; + } + button{ + background-color: #8e8b89; + color: white; + width: 100px; + height: 40px; + font-size: 24px; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default{ + data:{ + animation:'', + }, + onInit(){ + }, + onShow(){ + var options = { + duration: 1500, + easing: 'friction', + delay: 500, + fill: 'forwards', + iterations: 2, + direction: 'normal', + }; + var frames = [ + {transform: {translate: '-120px -0px'}, opacity: 0.1, offset: 0.0}, + {transform: {translate: '120px 0px'}, opacity: 1.0, offset: 1.0} + ]; + this.animation = this.$element('idName').animate(frames, options); + // handle finish event + this.animation.onfinish = function(){ + prompt.showToast({ + message: "The animation is finished." + }); + }; + // handle cancel event + this.animation.oncancel = function(){ + prompt.showToast({ + message: "The animation is canceled." + }); + }; + // handle repeat event + this.animation.onrepeat = function(){ + prompt.showToast({ + message: "The animation is repeated." + }); + }; + }, + start(){ + this.animation.play(); + }, + cancel(){ + this.animation.cancel(); } - ``` - - ``` - // xxx.js - import prompt from '@system.prompt'; - export default{ - data:{ - animation:'', - }, - onInit(){ - }, - onShow(){ - var options = { - duration: 1500, - easing: 'friction', - delay: 500, - fill: 'forwards', - iterations: 2, - direction: 'normal', - }; - var frames = [ - {transform: {translate: '-120px -0px'}, opacity: 0.1, offset: 0.0}, - {transform: {translate: '120px 0px'}, opacity: 1.0, offset: 1.0} - ]; - this.animation = this.$element('idName').animate(frames, options); - // handle finish event - this.animation.onfinish = function(){ - prompt.showToast({ - message: "The animation is finished." - }); - }; - // handle cancel event - this.animation.oncancel = function(){ - prompt.showToast({ - message: "The animation is canceled." - }); - }; - // handle repeat event - this.animation.onrepeat = function(){ - prompt.showToast({ - message: "The animation is repeated." - }); - }; - }, - start(){ - this.animation.play(); - }, - cancel(){ - this.animation.cancel(); - } - } - ``` + } + ``` - ![](figures/AnimationAPI裁剪.gif) + ![zh-cn_image_0000001229677045](figures/zh-cn_image_0000001229677045.gif) -## getBoundingClientRect +## getBoundingClientRect -getBoundingClientRect\(\): [ ](#table1650917111414) +getBoundingClientRect(): \ 获取元素的大小及其相对于窗口的位置。 -- 返回值 - - **表 5** Rect对象说明6+ - - - - - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        描述

        -

        width

        -

        number

        -

        该元素的宽度。

        -

        height

        -

        number

        -

        该元素的高度。

        -

        left

        -

        number

        -

        该元素左边界距离窗口的偏移。

        -

        top

        -

        number

        -

        该元素上边界距离窗口的偏移。

        -
        - -- 示例 - - ``` - // xxx.js - var rect = this.$element('id').getBoundingClientRect(); - console.info(`current element position is ${rect.left}, ${rect.top}`); - ``` - - -## createIntersectionObserver - -createIntersectionObserver\(param?:ObserverParam\): Observer) +- 返回值 + + **表5** Rect对象说明6+ + + | 属性 | 类型 | 描述 | + | -------- | -------- | -------- | + | width | number | 该元素的宽度。 | + | height | number | 该元素的高度。 | + | left | number | 该元素左边界距离窗口的偏移。 | + | top | number | 该元素上边界距离窗口的偏移。 | + +- 示例 + ``` + // xxx.js + var rect = this.$element('id').getBoundingClientRect(); + console.info(`current element position is ${rect.left}, ${rect.top}`); + ``` -监听元素在当前页面的可见范围。 -- 参数 - - - - - - - - - - - - - -

        参数名

        -

        参数类型

        -

        必填

        -

        描述

        -

        param

        -

        ObserverParam

        -

        -

        -

        获取observer的回调。

        -
        - - **表 6** ObserverParam对象说明6+ - - - - - - - - - - - - -

        属性

        -

        类型

        -

        描述

        -

        ratios

        -

        Array<number>

        -

        组件超出或小于范围时触发observer的回调。

        -
        - -- 返回值 - - **表 7** Observer对象支持的方法6+ - - - - - - - - - - - - - - - - -

        方法

        -

        参数

        -

        描述

        -

        observe

        -

        callback: function

        -

        开启observer的订阅方法。超出或小于阈值时触发callback。

        -

        unobserve

        -

        -

        -

        取消observer的订阅方法。

        -
        - -- 示例 - - ``` - // xxx.js - let observer = this.$element('broad').createIntersectionObserver({ - ratios: [0.2, 0.5], // number - }); - - observer.observe((isVisible, ratio)=> { - console.info('this element is ' + isVisible + 'ratio is ' + ratio) - }) - - observer.unobserve() - ``` +## createIntersectionObserver +createIntersectionObserver(param?: ObserverParam): Observer + +监听元素在当前页面的可见范围。 +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | param | ObserverParam | - | 获取observer的回调。 | + + **表6** ObserverParam对象说明6+ + + | 属性 | 类型 | 描述 | + | -------- | -------- | -------- | + | ratios | Array<number> | 组件超出或小于范围时触发observer的回调。 | + +- 返回值 + + **表7** Observer对象支持的方法6+ + + | 方法 | 参数 | 描述 | + | -------- | -------- | -------- | + | observe | callback: function | 开启observer的订阅方法。超出或小于阈值时触发callback。 | + | unobserve | - | 取消observer的订阅方法。 | + +- 示例 + ``` + // xxx.js + let observer = this.$element('broad').createIntersectionObserver({ + ratios: [0.2, 0.5], // number + }); + + observer.observe((isVisible, ratio)=> { + console.info('this element is ' + isVisible + 'ratio is ' + ratio) + }) + + observer.unobserve() + ``` diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-styles.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-styles.md index 2cc5ed4fc8b..395c073392a 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-styles.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-styles.md @@ -1,616 +1,70 @@ -# 通用样式 +# 通用样式 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 组件普遍支持的可以在style或css中设置组件外观样式。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        width

        -

        <length> | <percentage>

        -

        -

        -

        设置组件自身的宽度。

        -

        缺省时使用元素自身内容需要的宽度。

        -

        height

        -

        <length> | <percentage>

        -

        -

        -

        设置组件自身的高度。

        -

        缺省时使用元素自身内容需要的高度。

        -

        min-width5+

        -

        <length> | <percentage>6+

        -

        0

        -

        设置元素的最小宽度。

        -

        min-height5+

        -

        <length> | <percentage>6+

        -

        0

        -

        设置元素的最小高度。

        -

        max-width5+

        -

        <length> | <percentage>6+

        -

        -

        -

        设置元素的最大宽度。默认无限制。

        -

        max-height5+

        -

        <length> | <percentage>6+

        -

        -

        -

        设置元素的最大高度。默认无限制。

        -

        padding

        -

        <length> | <percentage>5+

        -

        0

        -

        使用简写属性设置所有的内边距属性。

        -
        该属性可以有1到4个值:
        • 指定一个值时,该值指定四个边的内边距。

          -
        • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

          -
        • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

          -
        • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

          -
        -
        -

        padding-[left|top|right|bottom]

        -

        <length> | <percentage>5+

        -

        0

        -

        设置左、上、右、下内边距属性。

        -

        padding-[start|end]

        -

        <length> | <percentage>5+

        -

        0

        -

        设置起始和末端内边距属性。

        -

        margin

        -

        <length> | <percentage>5+

        -

        0

        -

        使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

        -
        • 只有一个值时,这个值会被指定给全部的四个边。

          -
        • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

          -
        • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

          -
        • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

          -
        -

        margin-[left|top|right|bottom]

        -

        <length> | <percentage>5+

        -

        0

        -

        设置左、上、右、下外边距属性。

        -

        margin-[start|end]

        -

        <length> | <percentage>5+

        -

        0

        -

        设置起始和末端外边距属性。

        -

        border

        -

        -

        -

        0

        -

        使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

        -

        border-style

        -

        string

        -

        solid

        -

        使用简写属性设置所有边框的样式,可选值为:

        -
        • dotted:显示为一系列圆点,圆点半径为border-width的一半。
        • dashed:显示为一系列短的方形虚线。
        -
        • solid:显示为一条实线。
        -

        border-[left|top|right|bottom]-style

        -

        string

        -

        solid

        -

        分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

        -

        border-[left|top|right|bottom]

        -

        -

        -

        -

        -

        使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

        -

        border-width

        -

        <length>

        -

        0

        -

        使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

        -

        border-[left|top|right|bottom]-width

        -

        <length>

        -

        0

        -

        分别设置左、上、右、下四个边框的宽度。

        -

        border-color

        -

        <color>

        -

        black

        -

        使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

        -

        border-[left|top|right|bottom]-color

        -

        <color>

        -

        black

        -

        分别设置左、上、右、下四个边框的颜色。

        -

        border-radius

        -

        <length>

        -

        -

        -

        border-radius属性设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

        -
        说明:

        顺序为左下、右下、左上和右上。

        -
        -

        border-[top|bottom]-[left|right]-radius

        -

        <length>

        -

        -

        -

        分别设置左上,右上,右下和左下四个角的圆角半径。

        -

        background

        -

        <linear-gradient>

        -

        -

        -

        仅支持设置渐变样式,与background-color、background-image不兼容。

        -

        background-color

        -

        <color>

        -

        -

        -

        设置背景颜色。

        -

        background-image

        -

        string

        -

        -

        -

        设置背景图片。与background-color、background不兼容,支持本地图片资源地址。

        -

        示例:

        -
        • background-image: url("/common/background.png")
          说明:

          不支持svg格式图片。

          -
          -
        -

        background-size

        -
        • string
        • <length> <length>
        • <percentage> <percentage>
        -

        auto

        -

        设置背景图片的大小。

        -
        • string可选值:
          • contain:把图片扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
          • cover:把背景图片扩展至足够大,以使背景图片完全覆盖背景区域;背景图片的某些部分也许无法显示在背景定位区域中。
          • auto:保持原图的比例不变。
          -
        • length值参数方式:

          设置背景图片的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

          -
        • 百分比参数方式:

          以父元素的百分比来设置背景图片的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

          -
        -

        background-repeat

        -

        string

        -

        repeat

        -

        针对重复背景图片样式进行设置,背景图片默认在水平和垂直方向上重复。

        -
        • repeat:在水平轴和竖直轴上同时重复绘制图片。
        • repeat-x:只在水平轴上重复绘制图片。
        • repeat-y:只在竖直轴上重复绘制图片。
        • no-repeat:不会重复绘制图片。
        -

        background-position

        -
        • string string
        • <length> <length>
        • <percentage> <percentage>
        -

        0px 0px

        -
        • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
          • left:水平方向上最左侧。
          • right:水平方向上最右侧。
          • top:竖直方向上最顶部。
          • bottom:竖直方向上最底部。
          • center:水平方向或竖直方向上中间位置。
          -
        -
        • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
        • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
        • 可以混合使用<percentage>和<length>。
        -

        box-shadow5+

        -

        string

        -

        0

        -

        语法:box-shadow: h-shadow v-shadow blur spread color

        -

        通过这个样式可以设置当前组件的阴影样式,包括水平位置(必填)、垂直位置(必填)、模糊半径(可选,默认值为0)、阴影延展距离(可选,默认值为0)、阴影颜色(可选,默认值为黑色)。

        -

        示例:

        -
        • box-shadow :10px 20px 5px 10px #888888
        • box-shadow :100px 100px 30px red
        • box-shadow :-100px -100px 0px 40px
        -

        filter5+

        -

        string

        -

        -

        -

        语法:filter: blur(px)

        -

        通过这个样式可以设置当前组件布局范围的内容模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

        -

        示例:

        -
        • filter: blur(10px)
        -

        backdrop-filter5+

        -

        string

        -

        -

        -

        语法:backdrop-filter: blur(px)

        -

        通过这个样式可以设置当前组件布局范围的背景模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

        -

        示例:

        -
        • backdrop-filter: blur(10px)
        -

        opacity

        -

        number

        -

        1

        -

        元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

        -

        display

        -

        string

        -

        -

        flex

        -

        确定一个元素所产生的框的类型,可选值为:

        -
        • flex:弹性布局。
        • none:不渲染此元素。
        -

        visibility

        -

        string

        -

        -

        visible

        -

        是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

        -
        • visible:元素正常显示。
        • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
        -
        说明:

        visibility和display样式都设置时,仅display生效。

        -
        -

        flex

        -

        number | string

        -

        -

        -

        规定当前组件如何适应父组件中的可用空间。

        -

        flex可以指定1个、2个5+或3个5+值。

        -

        单值语法:

        -
        • 一个无单位数:用来设置组件的flex-grow。
        • 一个有效的宽度值5+:用来设置组件的flex-basis。
        -

        双值语法5+

        -

        第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

        -
        • 一个无单位数:用来设置组件的flex-shrink。
        • 一个有效的宽度值:用来设置组件的flex-basis。
        -

        三值语法5+

        -

        第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

        -
        -

        flex-grow

        -

        number

        -

        0

        -

        设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

        -
        -

        flex-shrink

        -

        number

        -

        1

        -

        设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

        -
        -

        flex-basis

        -

        <length>

        -

        -

        -

        -

        设置组件在主轴方向上的初始大小。

        -
        说明:

        仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

        -
        -

        align-self6+

        -

        string

        -

        -

        -

        设置自身在父元素交叉轴上的对齐方式,该样式会覆盖父元素的align-items样式,仅在父容器为div、list。可选值为:

        -
        • stretch 弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
        • flex-start 元素向交叉轴起点对齐。
        • flex-end 元素向交叉轴终点对齐。
        • center 元素在交叉轴居中。
        • baseline 元素在交叉轴基线对齐。
        -

        position

        -

        string

        -

        relative

        -

        设置元素的定位类型,不支持动态变更。

        -
        • fixed:相对与整个界面进行定位。
        • absolute:相对于父元素进行定位。
        • relative:相对于其正常位置进行定位。
        -
        说明:

        absolute属性仅在父容器为<div>、<stack>时生效。

        -
        -

        [left|top|right|bottom]

        -

        <length> | <percentage>6+

        -

        -

        -

        left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

        -
        • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
        • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
        • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
        • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
        -

        [start | end]6+

        -

        <length> | <percentage>

        -

        -

        -

        start | end需要配合position样式使用,来确定元素的偏移位置。

        -
        • start属性规定元素的起始边缘。该属性定义了定位元素起始外边距边界与其包含块起始边界之间的偏移。
        • end属性规定元素的结尾边缘。该属性定义了一个定位元素的结尾边距边界与其包含块结尾边界之间的偏移。
        -

        z-index6+

        -

        number

        -

        -

        -

        表示对于同一父节点其子节点的渲染顺序。数值越大,渲染数据越靠后。

        -
        说明:

        z-index不支持auto,并且opacity等其他样式不会影响z-index的渲染顺序。

        -
        -

        image-fill6+

        -

        <color>

        -

        -

        -

        为svg图片填充颜色,支持组件范围(与设置图片资源的属性):button(icon属性)、piece(icon属性)、search(icon属性)、input(headericon属性)、textarea(headericon属性)、image(src属性)、toolbar-item(icon属性)。

        -

        svg图片文件内的fill属性颜色值在渲染时将被替换为image-fill所配的颜色值,且仅对svg图片内显示声明的fill属性生效。

        -

        clip-path6+

        -

        [ <geometry-box> || <basic-shape> ] | none

        -

        -

        -

        设置组件的裁剪区域。区域内的部分显示,区域外的不显示。

        -

        <geometry-box>:表示裁剪区域的作用范围,默认为border-box。可选值为:

        -
        • margin-box:margin计算入长宽尺寸内。
        • border-box:border计算入长宽尺寸内。
        • padding-box:padding计算入长宽尺寸内。
        • content-box:margin/border/padding不计算入长宽尺寸内。
        -

        <basic-shape>:表示裁剪的形状。包含以下类型:

        -
        • inset,格式为:inset( <percentage>{1,4} [ round <'border-radius'> ]? )。
        • circle,格式为:circle( [ <percentage> ]? [ at <percentage> <percentage> ]? )。
        • ellipse,格式为:ellipse( [ <percentage>{2} ]? [ at <percentage> <percentage> ]? )。
        • polygon,格式为:polygon( [ <percentage> <percentage> ]# )
        • path,格式为:path( <string> )。
        -

        mask-image6+

        -
        • <linear-gradient>
        • string
        -

        -

        -

        设置渐变色遮罩或本地图片设置。

        -

        设置渐变色遮罩,示例:

        -

        linear-gradient(to left, black, white)

        -

        设置纯色遮罩,示例:

        -

        linear-gradient(to right, grey , grey)

        -

        设置本地svg图片为遮罩,示例:url(common/mask.svg)

        -

        mask-size6+

        -
        • string
        • <length><length>
        • <percentage> <percentage>
        -

        auto

        -

        设置遮罩图片显示大小,仅当mask-image为图片资源时有效。

        -

        string可选值:

        -
        • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
        • cover:把图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
        • auto:保持原图的比例不变。
        -

        length值参数方式:设置图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

        -

        百分比参数方式:以原图宽高的百分比来设置图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

        -

        mask-position6+

        -
        • string string
        • <length> <length>
        • <percentage> <percentage>
        -

        0px 0px

        -

        设置遮罩图片显示位置,仅当mask-image为图片资源时有效。关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。

        -

        string可选值:

        -
        • left:水平方向上最左侧。
        • right:水平方向上最右侧。
        • top:竖直方向上最顶部。
        • bottom:竖直方向上最底部。
        • center:水平方向或竖直方向上中间位置。
        -

        length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。

        -

        百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。

        -

        可以混合使用<percentage>和<length>。

        -

        border-image-source7+

        -

        string

        -

        -

        -

        指定元素的边框图片。

        -

        示例:

        -

        border-image-source: url("/common/images/border.png")

        -

        border-image-slice7+

        -

        <length> | <percentage>

        -

        0

        -

        指定图片的边界内向偏移。

        -

        该属性可以有1到4个值:

        -

        指定一个值时,该值指定四个边的内偏移。

        -

        指定两个值时,第一个值指定上下两边的内偏移,第二个指定左右两边的内偏移。

        -

        指定三个值时,第一个指定上边的内偏移,第二个指定左右两边的内偏移,第三个指定下边的内偏移。

        -

        指定四个值时分别为上、右、下、左边的内偏移(顺时针顺序)。

        -

        border-image-width7+

        -

        <length> | <percentage>

        -

        0

        -

        指定图片边界的宽度。

        -

        指定一个值时,该值指定四个边的宽度。

        -

        指定两个值时,第一个值指定上下两边的宽度 ,第二个指定左右两边的宽度。

        -

        指定三个值时,第一个指定上边的宽度 ,第二个指定左右两边的宽度 ,第三个指定下边的宽度。

        -

        指定四个值时分别为上、右、下、左边的宽度 (顺时针顺序)。

        -

        border-image-outset7+

        -

        <length> | <percentage>

        -

        0

        -

        指定边框图像可超出边框的大小。

        -

        指定一个值时,边框图像在四个方向超出边框的距离。

        -

        指定两个值时,第一个值指定上下两边的边框图像超出边框的距离,第二个指定左右两边的 。

        -

        指定三个值时,第一个指定上边的边框图像超出边框的距离 ,第二个指定左右两边的边框图像超出边框的距离 ,第三个指定下边的边框图像超出边框的距离 。

        -

        指定四个值时分别为上、右、下、左边的边框图像超出边框的距离 (顺时针顺序)。

        -

        border-image-repeat7+

        -

        string

        -

        stretch

        -

        定义图片如何填充边框。

        -

        stretch: 拉伸图片以填充边框。

        -

        repeat:平铺图片以填充边框。

        -

        round:平铺图像。当不能整数次平铺时,根据情况放大或缩小图像。

        -

        border-image7+

        -

        string

        -

        -

        -

        简写属性,可以选择以下两种设置方式:

        - -
        • 渐变色边框

          示例:

          -

          border-image: linear-gradient(red, yellow) 10px

          -
        -
        ->![](../../public_sys-resources/icon-note.gif) **说明:** ->通用样式都不是必填项。 +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| width | <length> \| <percentage> | - | 设置组件自身的宽度。
        缺省时使用元素自身内容需要的宽度。
        | +| height | <length> \| <percentage> | - | 设置组件自身的高度。
        缺省时使用元素自身内容需要的高度。
        | +| min-width5+ | <length> \| <percentage>6+ | 0 | 设置元素的最小宽度。 | +| min-height5+ | <length> \| <percentage>6+ | 0 | 设置元素的最小高度。 | +| max-width5+ | <length> \| <percentage>6+ | - | 设置元素的最大宽度。默认无限制。 | +| max-height5+ | <length> \| <percentage>6+ | - | 设置元素的最大高度。默认无限制。 | +| padding | <length> \| <percentage>5+ | 0 | 使用简写属性设置所有的内边距属性。
        该属性可以有1到4个值:
        - 指定一个值时,该值指定四个边的内边距。
        - 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。
        - 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。
        - 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。 | +| padding-[left\|top\|right\|bottom] | <length> \| <percentage>5+ | 0 | 设置左、上、右、下内边距属性。 | +| padding-[start\|end] | <length> \| <percentage>5+ | 0 | 设置起始和末端内边距属性。 | +| margin | <length> \| <percentage>5+ | 0 | 使用简写属性设置所有的外边距属性,该属性可以有1到4个值。
        - 只有一个值时,这个值会被指定给全部的四个边。
        - 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。
        - 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。
        - 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。 | +| margin-[left\|top\|right\|bottom] | <length> \| <percentage>5+ | 0 | 设置左、上、右、下外边距属性。 | +| margin-[start\|end] | <length> \| <percentage>5+ | 0 | 设置起始和末端外边距属性。 | +| border | - | 0 | 使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。 | +| border-style | string | solid | 使用简写属性设置所有边框的样式,可选值为:
        - dotted:显示为一系列圆点,圆点半径为border-width的一半。
        - dashed:显示为一系列短的方形虚线。
        - solid:显示为一条实线。 | +| border-[left\|top\|right\|bottom]-style | string | solid | 分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。 | +| border-[left\|top\|right\|bottom] | - | - | 使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。 | +| border-width | <length> | 0 | 使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度。 | +| border-[left\|top\|right\|bottom]-width | <length> | 0 | 分别设置左、上、右、下四个边框的宽度。 | +| border-color | <color> | black | 使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色。 | +| border-[left\|top\|right\|bottom]-color | <color> | black | 分别设置左、上、右、下四个边框的颜色。 | +| border-radius | <length> | - | border-radius属性设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left\|top\|right\|bottom]-width,border-[left\|top\|right\|bottom]-color ,border-[left\|top\|right\|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 顺序为左下、右下、左上和右上。 | +| border-[top\|bottom]-[left\|right]-radius | <length> | - | 分别设置左上,右上,右下和左下四个角的圆角半径。 | +| background | <linear-gradient> | - | 仅支持设置[渐变样式](../arkui-js/js-components-common-gradient.md),与background-color、background-image不兼容。 | +| background-color | <color> | - | 设置背景颜色。 | +| background-image | string | - | 设置背景图片。与background-color、background不兼容,支持网络图片资源和本地图片资源地址。
        示例:
        - background-image: url("/common/background.png")
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > 不支持svg格式图片。 | +| background-size | - string
        - <length> <length>
        - <percentage> <percentage> | auto | 设置背景图片的大小。
        - string可选值:
          - contain:把图片扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
          - cover:把背景图片扩展至足够大,以使背景图片完全覆盖背景区域;背景图片的某些部分也许无法显示在背景定位区域中。
          - auto:保持原图的比例不变。
        - length值参数方式:
          设置背景图片的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。
        - 百分比参数方式:
          以父元素的百分比来设置背景图片的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。 | +| background-repeat | string | repeat | 针对重复背景图片样式进行设置,背景图片默认在水平和垂直方向上重复。
        - repeat:在水平轴和竖直轴上同时重复绘制图片。
        - repeat-x:只在水平轴上重复绘制图片。
        - repeat-y:只在竖直轴上重复绘制图片。
        - no-repeat:不会重复绘制图片。 | +| background-position | - string string
        - <length> <length>
        - <percentage> <percentage> | 0px 0px | - 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
          - left:水平方向上最左侧。
          - right:水平方向上最右侧。
          - top:竖直方向上最顶部。
          - bottom:竖直方向上最底部。
          - center:水平方向或竖直方向上中间位置。
        - length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px)  。如果仅规定了一个值,另外一个值将是50%。
        - 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
        - 可以混合使用<percentage>和<length>。 | +| box-shadow5+ | string | 0 | 语法:box-shadow: h-shadow v-shadow blur spread color
        通过这个样式可以设置当前组件的阴影样式,包括水平位置(必填)、垂直位置(必填)、模糊半径(可选,默认值为0)、阴影延展距离(可选,默认值为0)、阴影颜色(可选,默认值为黑色)。
        示例:
        - box-shadow :10px 20px 5px 10px \#888888
        - box-shadow :100px 100px 30px red
        - box-shadow :-100px -100px 0px 40px | +| filter5+ | string | - | 语法:filter: blur(px)
        通过这个样式可以设置当前组件布局范围的内容模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。
        示例:
        - filter: blur(10px) | +| backdrop-filter5+ | string | - | 语法:backdrop-filter: blur(px)
        通过这个样式可以设置当前组件布局范围的背景模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。
        示例:
        - backdrop-filter: blur(10px) | +| window-filter5+ | string | - | 语法:window-filter: blur(percent), style5+
        通过这个样式可以设置当前组件布局范围的窗口模糊程度和模糊样式,如果没有设置值,则默认是0%(不模糊),多块模糊区域时不支持设置不同的模糊值和模糊样式。style可选值:small_light(默认值), medium_light, large_light, xlarge_light, small_dark, medium_dark, large_dark, xlarge_dark。
        示例:
        - window-filter: blur(50%)
        - window-filter: blur(10%), large_light
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅手机和平板设备支持。 | +| opacity | number | 1 | 元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。 | +| display | string | flex | 确定一个元素所产生的框的类型,可选值为:
        - flex:弹性布局。
        - none:不渲染此元素。 | +| visibility | string | visible | 是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:
        - visible:元素正常显示。
        - hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > visibility和display样式都设置时,仅display生效。 | +| flex | number \| string | - | 规定当前组件如何适应父组件中的可用空间。
        flex可以指定1个、2个5+或3个5+值。
        单值语法:
        - 一个无单位数:用来设置组件的flex-grow。
        - 一个有效的宽度值5+:用来设置组件的flex-basis。
        双值语法5+
        第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:
        - 一个无单位数:用来设置组件的flex-shrink。
        - 一个有效的宽度值:用来设置组件的flex-basis。
        三值语法5+
        第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。 | +| flex-grow | number | 0 | 设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。 | +| flex-shrink | number | 1 | 设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。 | +| flex-basis | <length> | - | 设置组件在主轴方向上的初始大小。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。 | +| align-self6+ | string | - | 设置自身在父元素交叉轴上的对齐方式,该样式会覆盖父元素的align-items样式,仅在父容器为div、list。可选值为:
        - stretch 弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
        - flex-start 元素向交叉轴起点对齐。
        - flex-end 元素向交叉轴终点对齐。
        - center 元素在交叉轴居中。
        - baseline 元素在交叉轴基线对齐。 | +| position | string | relative | 设置元素的定位类型,不支持动态变更。
        - fixed:相对与整个界面进行定位。
        - absolute:相对于父元素进行定位。
        - relative:相对于其正常位置进行定位。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > absolute属性仅在父容器为<div>、<stack>时生效。 | +| [left\|top\|right\|bottom] | <length> \| <percentage>6+ | - | left\|top\|right\|bottom需要配合position样式使用,来确定元素的偏移位置。
        - left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
        - top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
        - right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
        - bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。 | +| [start \| end]6+ | <length> \| <percentage> | - | start \| end需要配合position样式使用,来确定元素的偏移位置。
        - start属性规定元素的起始边缘。该属性定义了定位元素起始外边距边界与其包含块起始边界之间的偏移。
        - end属性规定元素的结尾边缘。该属性定义了一个定位元素的结尾边距边界与其包含块结尾边界之间的偏移。 | +| z-index6+ | number | - | 表示对于同一父节点其子节点的渲染顺序。数值越大,渲染数据越靠后。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > z-index不支持auto,并且opacity等其他样式不会影响z-index的渲染顺序。 | +| image-fill6+ | <color> | - | 为svg图片填充颜色,支持组件范围(与设置图片资源的属性):button(icon属性)、piece(icon属性)、search(icon属性)、input(headericon属性)、textarea(headericon属性)、image(src属性)、toolbar-item(icon属性)。
        svg图片文件内的fill属性颜色值在渲染时将被替换为image-fill所配的颜色值,且仅对svg图片内显示声明的fill属性生效。 | +| clip-path6+ | [ <geometry-box> \|\| <basic-shape> ] \| none | - | 设置组件的裁剪区域。区域内的部分显示,区域外的不显示。
        <geometry-box>:表示裁剪区域的作用范围,默认为border-box。可选值为:
        - margin-box:margin计算入长宽尺寸内。
        - border-box:border计算入长宽尺寸内。
        - padding-box:padding计算入长宽尺寸内。
        - content-box:margin/border/padding不计算入长宽尺寸内。
        <basic-shape>:表示裁剪的形状。包含以下类型:
        - inset,格式为:inset( <percentage>{1,4} [ round <'border-radius'> ]? )。
        - circle,格式为:circle( [ <percentage> ]? [ at <percentage> <percentage> ]? )。
        - ellipse,格式为:ellipse( [ <percentage>{2} ]? [ at <percentage> <percentage> ]? )。
        - polygon,格式为:polygon( [ <percentage> <percentage> ]\# )
        - path,格式为:path( <string> )。 | +| mask-image6+ | - <linear-gradient>
        - string | - | 设置渐变色遮罩或本地图片设置。
        设置渐变色遮罩,示例:
        linear-gradient(to left, black, white)
        设置纯色遮罩,示例:
        linear-gradient(to right, grey , grey)
        设置本地svg图片为遮罩,示例:url(common/mask.svg) | +| mask-size6+ | - string
        - <length><length>
        - <percentage> <percentage> | auto | 设置遮罩图片显示大小,仅当mask-image为图片资源时有效。
        string可选值:
        - contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
        - cover:把图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
        - auto:保持原图的比例不变。
        length值参数方式:设置图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。
        百分比参数方式:以原图宽高的百分比来设置图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。 | +| mask-position6+ | - string string
        - <length> <length>
        - <percentage> <percentage> | 0px 0px | 设置遮罩图片显示位置,仅当mask-image为图片资源时有效。关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
        string可选值:
        - left:水平方向上最左侧。
        - right:水平方向上最右侧。
        - top:竖直方向上最顶部。
        - bottom:竖直方向上最底部。
        - center:水平方向或竖直方向上中间位置。
        length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px)  。如果仅规定了一个值,另外一个值将是50%。
        百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
        可以混合使用<percentage>和<length>。 | +| border-image-source7+ | string | - | 指定元素的边框图片。
        示例:
        border-image-source: url("/common/images/border.png") | +| border-image-slice7+ | <length> \| <percentage> | 0 | 指定图片的边界内向偏移。
        该属性可以有1到4个值:
        指定一个值时,该值指定四个边的内偏移。
        指定两个值时,第一个值指定上下两边的内偏移,第二个指定左右两边的内偏移。
        指定三个值时,第一个指定上边的内偏移,第二个指定左右两边的内偏移,第三个指定下边的内偏移。
        指定四个值时分别为上、右、下、左边的内偏移(顺时针顺序)。 | +| border-image-width7+ | <length> \| <percentage> | 0 | 指定图片边界的宽度。
        指定一个值时,该值指定四个边的宽度。
        指定两个值时,第一个值指定上下两边的宽度 ,第二个指定左右两边的宽度。
        指定三个值时,第一个指定上边的宽度 ,第二个指定左右两边的宽度 ,第三个指定下边的宽度。
        指定四个值时分别为上、右、下、左边的宽度 (顺时针顺序)。 | +| border-image-outset7+ | <length> \| <percentage> | 0 | 指定边框图像可超出边框的大小。
        指定一个值时,边框图像在四个方向超出边框的距离。
        指定两个值时,第一个值指定上下两边的边框图像超出边框的距离,第二个指定左右两边的 。
        指定三个值时,第一个指定上边的边框图像超出边框的距离 ,第二个指定左右两边的边框图像超出边框的距离 ,第三个指定下边的边框图像超出边框的距离 。
        指定四个值时分别为上、右、下、左边的边框图像超出边框的距离 (顺时针顺序)。 | +| border-image-repeat7+ | string | stretch | 定义图片如何填充边框。
        stretch: 拉伸图片以填充边框。
        repeat:平铺图片以填充边框。
        round:平铺图像。当不能整数次平铺时,根据情况放大或缩小图像。
        | +| border-image7+ | string | - | 简写属性,可以选择以下两种设置方式:
        - 设置图片边框的每个属性。包含图像的边界向内偏移,图像边界的宽度,边框图像可超出边框盒的大小,图片如何填充边框,顺序设置为 border-image-source ,border-image-slice,border-image-width,border-image-outset,border-image-repeat,不设置的值为默认值。
        - 渐变色边框
          示例:
          border-image: linear-gradient(red, yellow) 10px | + + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 通用样式都不是必填项。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common-transition.md b/zh-cn/application-dev/reference/arkui-js/js-components-common-transition.md index d7582ada79c..15900d8ce4f 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common-transition.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common-transition.md @@ -1,82 +1,35 @@ -# 转场样式 - -## 共享元素转场 - -### 属性 - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        shareid

        -

        string

        -

        -

        进行共享元素转场时使用,若不配置,则转场样式不生效。共享元素转场当前支持的组件:list-item、image、text、button、label。

        -
        - -### 样式 - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        shared-transition-effect

        -

        string

        -

        exchange

        -

        配置共享元素转场时的入场样式。

        -
        • exchange(默认值):源页面元素移动到目的页元素位置,并进行适当缩放。
        • static:目的页元素位置不变,用户可配置透明度动画。当前仅跳转目标页配置的static效果生效。
        -

        shared-transition-name

        -

        string

        -

        -

        -

        转场时,目的页配置的样式优先生效。该样式用于配置共享元素的动画效果,一个由@keyframes定义的动画序列,支持transform和透明度动画。若共享元素效果与自定义的动画冲突,以自定义动画为准。

        -

        shared-transition-timing-function

        -

        string

        -

        friction

        -

        转场时,目的页配置的样式优先生效。该属性定义了共享元素转场时的差值曲线。若不配置,默认使用friction曲线。

        -
        - -### 注意事项 +# 转场样式 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +## 共享元素转场 + + +### 属性 + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| shareid | string | 无 | 进行共享元素转场时使用,若不配置,则转场样式不生效。共享元素转场当前支持的组件:list-item、image、text、button、label。 | + + +### 样式 + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| shared-transition-effect | string | exchange | 配置共享元素转场时的入场样式。
        - exchange(默认值):源页面元素移动到目的页元素位置,并进行适当缩放。
        - static:目的页元素位置不变,用户可配置透明度动画。当前仅跳转目标页配置的static效果生效。 | +| shared-transition-name | string | - | 转场时,目的页配置的样式优先生效。该样式用于配置共享元素的动画效果,一个由@keyframes定义的动画序列,支持transform和透明度动画。若共享元素效果与自定义的动画冲突,以自定义动画为准。 | +| shared-transition-timing-function | string | friction | 转场时,目的页配置的样式优先生效。该属性定义了共享元素转场时的差值曲线。若不配置,默认使用friction曲线。 | + + +### 注意事项 1. 若同时配置了共享元素转场和自定义页面转场样式,页面转场效果以自定义效果为准。 2. 共享元素的exchange效果类似下图。 -**图 1** 共享元素转场默认效果 -![](figures/共享元素转场默认效果.png "共享元素转场默认效果") +**图1** 共享元素转场默认效果 +![zh-cn_image_0000001238424309](figures/zh-cn_image_0000001238424309.png) 3. 共享元素动画对元素的边框、背景色不生效。 @@ -84,7 +37,8 @@ 5. 动态修改shareid5+:组件A的shareid被组件B的shareid覆盖,则组件A的共享元素效果失效,即使组件B的shareid被修改,此时组件A的共享元素效果也不会恢复。 -### 示例 + +### 示例 PageA跳转到PageB,跳转的共享元素为image, shareid为“shareImage”。 @@ -92,14 +46,12 @@ PageA跳转到PageB,跳转的共享元素为image, shareid为“shareImage
        - - -
        - - Click on picture to Jump to ths details -
        -
        -
        + + + + Click on picture to Jump to ths details + +
        ``` @@ -157,39 +109,23 @@ export default { } ``` -## 卡片转场样式 - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->卡片转场无法和其他转场\(包括共享元素转场和自定义转场\)共同使用。 - -### 样式 - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        transition-effect

        -

        string

        -

        -

        -

        用于配置当前页面中的某个组件在卡片转场过程中是否进行转场动效,当前支持如下配置:

        -
        • unfold:配置这个属性的组件,如在卡片的上方,则向上移动一个卡片的高度,如在卡片的下方,则向下移动一个卡片的高度。
        • none:转场过程中没有动效。
        -
        - -### 示例 - -source\_page包含顶部内容以及卡片列表,点击卡片可以跳转到target\_page。 + +## 卡片转场样式 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 卡片转场无法和其他转场(包括共享元素转场和自定义转场)共同使用。 + + +### 样式 + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| transition-effect | string | - | 用于配置当前页面中的某个组件在卡片转场过程中是否进行转场动效,当前支持如下配置:
        - unfold:配置这个属性的组件,如在卡片的上方,则向上移动一个卡片的高度,如在卡片的下方,则向下移动一个卡片的高度。
        - none:转场过程中没有动效。 | + + +### 示例 + +source_page包含顶部内容以及卡片列表,点击卡片可以跳转到target_page。 ``` @@ -270,73 +206,32 @@ export default { } ``` -![](figures/卡片转场.gif) - -## 页面转场样式 - -### 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        transition-enter

        -

        string

        -

        -

        -

        与@keyframes配套使用,支持transform和透明度动画,详见表2

        -

        transition-exit

        -

        string

        -

        -

        -

        与@keyframes配套使用,支持transform和透明度动画,详见表2

        -

        transition-duration

        -

        string

        -

        跟随设备默认的页面转场时间

        -

        支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms,未配置时使用系统默认值。

        -

        transition-timing-function

        -

        string

        -

        friction

        -

        描述转场动画执行的速度曲线,用于使转场更为平滑。详细参数见动画样式中“animation-timing-function”有效值说明。

        -
        - -### 注意事项 - -1. 配置自定义转场时,建议配置页面背景色为不透明颜色,否则在转场过程中可能会出现衔接不自然的现象。 -2. transition-enter和transition-exit可单独配置,没有配置时使用系统默认的参数。 -3. transition-enter/transition-exit说明如下: - 1. push场景下:进入页面栈的Page2.js应用transition-enter描述的动画配置;进入页面栈第二位置的Page1.js应用transition-exit描述的动画配置。 - - ![](figures/zh-cn_image_0000001193704354.png) - - 2. back场景下:退出页面栈的Page2.js应用transition-enter描述的动画配置,并进行倒播;从页面栈第二位置进入栈顶位置的Page1.js应用transition-exit描述的动画配置,并进行倒播。 - - ![](figures/zh-cn_image_0000001238184345.png) +![zh-cn_image_0000001193544358](figures/zh-cn_image_0000001193544358.gif) + + +## 页面转场样式 + + +### 样式 + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| transition-enter | string | - | 与@keyframes配套使用,支持transform和透明度动画,详见[动画样式 表 @keyframes属性说明](../arkui-js/js-components-common-animation.md)。 | +| transition-exit | string | - | 与\@keyframes配套使用,支持transform和透明度动画,详见[动画样式 表 @keyframes属性说明](../arkui-js/js-components-common-animation.md)。 | +| transition-duration | string | 跟随设备默认的页面转场时间 | 支持的单位为[s(秒)\|ms(毫秒) ],默认单位为ms,未配置时使用系统默认值。 | +| transition-timing-function | string | friction | 描述转场动画执行的速度曲线,用于使转场更为平滑。详细参数见[动画样式](../arkui-js/js-components-common-animation.md)中“animation-timing-function”有效值说明。 | + + +### 注意事项 + +1. 配置自定义转场时,建议配置页面背景色为不透明颜色,否则在转场过程中可能会出现衔接不自然的现象。 + +2. transition-enter和transition-exit可单独配置,没有配置时使用系统默认的参数。 +3. transition-enter/transition-exit说明如下: + a. push场景下:进入页面栈的Page2.js应用transition-enter描述的动画配置;进入页面栈第二位置的Page1.js应用transition-exit描述的动画配置。 + ![zh-cn_image_0000001193704354](figures/zh-cn_image_0000001193704354.png) + b. back场景下:退出页面栈的Page2.js应用transition-enter描述的动画配置,并进行倒播;从页面栈第二位置进入栈顶位置的Page1.js应用transition-exit描述的动画配置,并进行倒播。 + ![zh-cn_image_0000001238184345](figures/zh-cn_image_0000001238184345.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-common.md b/zh-cn/application-dev/reference/arkui-js/js-components-common.md index 44ae48f1a10..549f6c67a66 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-common.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-common.md @@ -1,23 +1,23 @@ -# 通用 +# 通用 -- **[通用属性](js-components-common-attributes.md)** -- **[通用样式](js-components-common-styles.md)** -- **[通用事件](js-components-common-events.md)** +- **[通用属性](js-components-common-attributes.md)** -- **[通用方法](js-components-common-methods.md)** +- **[通用样式](js-components-common-styles.md)** -- **[动画样式](js-components-common-animation.md)** +- **[通用事件](js-components-common-events.md)** -- **[渐变样式](js-components-common-gradient.md)** +- **[通用方法](js-components-common-methods.md)** -- **[转场样式](js-components-common-transition.md)** +- **[动画样式](js-components-common-animation.md)** -- **[媒体查询](js-components-common-mediaquery.md)** +- **[渐变样式](js-components-common-gradient.md)** -- **[自定义字体样式](js-components-common-customizing-font.md)** +- **[转场样式](js-components-common-transition.md)** -- **[原子布局](js-components-common-atomic-layout.md)** +- **[媒体查询](js-components-common-mediaquery.md)** +- **[自定义字体样式](js-components-common-customizing-font.md)** +- **[原子布局](js-components-common-atomic-layout.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-badge.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-badge.md index 0087e65fdaf..ae68f510ba6 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-badge.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-badge.md @@ -1,188 +1,66 @@ -# badge +# badge + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 应用中如果有需用户关注的新事件提醒,可以采用新事件标记来标识。 -## 权限列表 + +## 权限列表 无 -## 子组件 + +## 子组件 支持单个子组件。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->仅支持单子组件节点,如果使用多子组件节点,默认使用第一个子组件节点。 - -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        placement

        -

        string

        -

        rightTop

        -

        -

        事件提醒的数字标记或者圆点标记的位置,可选值为:

        -
        • right:位于组件右边框。
        • rightTop:位于组件边框右上角。
        • left:位于组件左边框。
        -

        count

        -

        number

        -

        0

        -

        -

        设置提醒的消息数,默认为0。当设置相应的提醒消息数大于0时,消息提醒会变成数字标记类型,未设置消息数或者消息数不大于0时,消息提醒将采用圆点标记。

        -
        说明:

        当数字设置为大于maxcount时,将使用maxcount显示。

        -

        count属性最大支持整数值为2147483647。

        -
        -

        visible

        -

        boolean

        -

        false

        -

        -

        是否显示消息提醒,当收到新信息提醒时可以设置该属性为true,显示相应的消息提醒,如果需要使用数字标记类型,同时需要设置相应的count属性。

        -

        maxcount

        -

        number

        -

        99

        -

        -

        最大消息数限制,当收到新信息提醒大于该限制时,标识数字会进行省略,仅显示maxcount+。

        -
        说明:

        maxcount属性最大支持整数值为2147483647。

        -
        -

        config

        -

        BadgeConfig

        -

        -

        -

        -

        设置新事件标记相关配置属性。

        -

        label6+

        -

        string

        -

        -

        -

        -

        设置新事件提醒的文本值。

        -
        说明:

        使用该属性时,count和maxcount属性不生效。

        -
        -
        - -**表 1** BadgeConfig - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        badgeColor

        -

        <color>

        -

        #fa2a2d

        -

        -

        新事件标记背景色。

        -

        textColor

        -

        <color>

        -

        #ffffff

        -

        -

        数字标记的数字文本颜色。

        -

        textSize

        -

        <length>

        -

        10px

        -

        -

        数字标记的数字文本大小。

        -

        badgeSize

        -

        <length>

        -

        6px

        -

        -

        圆点标记的默认大小

        -
        - -## 样式 - -支持[通用样式](js-components-common-styles.md)。 - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->badge组件的子组件大小不能超过badge组件本身的大小,否则子组件不会绘制。 - -## 事件 - -支持[通用事件](js-components-common-events.md)。 - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 仅支持单子组件节点,如果使用多子组件节点,默认使用第一个子组件节点。 + + +## 属性 + +除支持[通用属性](../reference/arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| placement | string | rightTop | 否 | 事件提醒的数字标记或者圆点标记的位置,可选值为:
        - right:位于组件右边框。
        - rightTop:位于组件边框右上角。
        - left:位于组件左边框。 | +| count | number | 0 | 否 | 设置提醒的消息数,默认为0。当设置相应的提醒消息数大于0时,消息提醒会变成数字标记类型,未设置消息数或者消息数不大于0时,消息提醒将采用圆点标记。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 当数字设置为大于maxcount时,将使用maxcount显示。
        > count属性最大支持整数值为2147483647。 | +| visible | boolean | false | 否 | 是否显示消息提醒,当收到新信息提醒时可以设置该属性为true,显示相应的消息提醒,如果需要使用数字标记类型,同时需要设置相应的count属性。 | +| maxcount | number | 99 | 否 | 最大消息数限制,当收到新信息提醒大于该限制时,标识数字会进行省略,仅显示maxcount+。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > maxcount属性最大支持整数值为2147483647。 | +| config | BadgeConfig | - | 否 | 设置新事件标记相关配置属性。 | +| label6+ | string | - | 否 | 设置新事件提醒的文本值。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 使用该属性时,count和maxcount属性不生效。 | + +**表1** BadgeConfig + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| badgeColor | <color> | \#fa2a2d | 否 | 新事件标记背景色。 | +| textColor | <color> | \#ffffff | 否 | 数字标记的数字文本颜色。 | +| textSize | <length> | 10px | 否 | 数字标记的数字文本大小。 | +| badgeSize | <length> | 6px | 否 | 圆点标记的默认大小 | + + +## 样式 + +支持[通用样式](../arkui-js/js-components-common-styles.md)。 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> badge组件的子组件大小不能超过badge组件本身的大小,否则子组件不会绘制。 + + +## 事件 + +支持[通用事件](../arkui-js/js-components-common-events.md)。 + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -229,5 +107,4 @@ export default { } ``` -![](figures/捕获.png) - +![zh-cn_image_0000001177265268](figures/zh-cn_image_0000001177265268.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-dialog.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-dialog.md index 8a509959411..3a5e23868d8 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-dialog.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-dialog.md @@ -1,121 +1,63 @@ -# dialog +# dialog + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 自定义弹窗容器。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持单个子组件。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        dragable7+

        -

        boolean

        -

        false

        -

        -

        设置对话框是否支持拖拽。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 弹窗类组件不支持focusable、click-effect属性。 - -## 样式 - -仅支持[通用样式](js-components-common-styles.md)中的width、height、margin、margin-\[left|top|right|bottom\]、margin-\[start|end\]样式。 - -## 事件 - -不支持[通用事件](js-components-common-events.md),仅支持如下事件: - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        cancel

        -

        -

        -

        用户点击非dialog区域触发取消弹窗时触发的事件。

        -

        show7+

        -

        -

        -

        对话框弹出时触发该事件。

        -

        close7+

        -

        -

        -

        对话框关闭时触发该事件。

        -
        - -## 方法 - -不支持[通用方法](js-components-common-methods.md),仅支持如下方法。 - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        show

        -

        -

        -

        弹出对话框。

        -

        close

        -

        -

        -

        关闭对话框。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->dialog属性、样式均不支持动态更新。 - -## 示例 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| dragable7+ | boolean | false | 否 | 设置对话框是否支持拖拽。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 弹窗类组件不支持focusable、click-effect属性。 + + +## 样式 + +仅支持[通用样式](../arkui-js/js-components-common-styles.md)中的width、height、margin、margin-[left|top|right|bottom]、margin-[start|end]样式。 + + +## 事件 + +不支持[通用事件](../arkui-js/js-components-common-events.md),仅支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| cancel | - | 用户点击非dialog区域触发取消弹窗时触发的事件。 | +| show7+ | - | 对话框弹出时触发该事件。 | +| close7+ | - | 对话框关闭时触发该事件。 | + + +## 方法 + +不支持[通用方法](../arkui-js/js-components-common-methods.md),仅支持如下方法。 + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| show | - | 弹出对话框。 | +| close | - | 关闭对话框。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> dialog属性、样式均不支持动态更新。 + + +## 示例 ``` @@ -218,5 +160,4 @@ export default { } ``` -![](figures/4.gif) - +![zh-cn_image_0000001167846062](figures/zh-cn_image_0000001167846062.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md index 254ac1cc82a..18aa7a8f976 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md @@ -1,702 +1,410 @@ -# div +# div + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 基础容器,用作页面结构的根节点或将内容进行分组。 -## 权限列表 +## 权限列表 无 -## 子组件 - -支持。 -## 属性 - -支持[通用属性](js-components-common-attributes.md)。 - -## 样式 - -除支持[组件通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        flex-direction

        -

        string

        -

        row

        -

        -

        flex容器主轴方向。可选项有:

        -
        • column:垂直方向从上到下。
        • row:水平方向从左到右。
        -

        flex-wrap

        -

        string

        -

        nowrap

        -

        -

        flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

        -
        • nowrap:不换行,单行显示。
        • wrap:换行,多行显示。
        -

        justify-content

        -

        string

        -

        flex-start

        -

        -

        flex容器当前行的主轴对齐格式。可选项有:

        -
        • flex-start:项目位于容器的开头。
        • flex-end:项目位于容器的结尾。
        • center:项目位于容器的中心。
        • space-between:项目位于各行之间留有空白的容器内。
        • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
        • space-evenly5+: 均匀排列每个元素,每个元素之间的间隔相等。
        -

        align-items

        -

        string

        -

        stretch

        -

        -

        flex容器当前行的交叉轴对齐格式,可选值为:

        -
        • stretch:弹性元素在交叉轴方向被拉伸到与容器相同的高度或宽度。
        • flex-start:元素向交叉轴起点对齐。
        • flex-end:元素向交叉轴终点对齐。
        • center:元素在交叉轴居中。
        -

        align-content

        -

        string

        -

        flex-start

        -

        -

        交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

        -
        • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
        • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
        • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
        • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
        • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
        -

        display

        -

        string

        -

        flex

        -

        -

        确定该元素视图框的类型,该值暂不支持动态修改。可选值为:

        -
        • flex:弹性布局
        • grid:网格布局
        • none:不渲染此元素
        -

        grid-template-[columns|rows]

        -

        string

        -

        1行1列

        -

        -

        用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。

        -

        示例:如设置grid-template-columns为:

        -
        • 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;
        • 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;
        • 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;
        • repeat(2,100px):分两列,第一列100px,第二列100px;
        • repeat(auto-fill,100px)5+:按照每列100px的大小和交叉轴大小计算最大正整数重复次数,按照该重复次数布满交叉轴;
        • auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。
        -

        grid-[columns|rows]-gap

        -

        <length>

        -

        0

        -

        -

        用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。

        -

        grid-row-[start|end]

        -

        number

        -

        -

        -

        -

        用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

        -

        grid-column-[start|end]

        -

        number

        -

        -

        -

        -

        用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

        -

        grid-auto-flow5+

        -

        string

        -

        -

        -

        -

        使用框架自动布局算法进行网格的布局,可选值为:

        -
        • row:逐行填充元素,如果行空间不够,则新增行;
        • column:逐列填充元素,如果列空间不够,则新增列。
        -

        overflow6+

        -

        string

        -

        visible

        -

        -

        设置元素内容区超过元素本身大小时的表现形式。

        -
        • visible:多个子元素内容超过元素大小时,显示在元素外面;
        • hidden:元素内容超过元素大小时,进行裁切显示;
        • scroll:元素内容超过元素大小时,进行滚动显示并展示滚动条(当前只支持纵向)。
        -
        说明:
        • overflow: scroll样式需要元素设置固定的大小。
        -
        -

        align-items6+

        -

        string

        -

        -

        -

        -

        设置容器中元素交叉轴上的对齐方式:

        -
        • stretch:Flex容器内容在交叉轴方向被拉伸到与容器相同的高度或宽度;
        • flex-start:Flex布局容器内元素向交叉轴起点对齐;
        • flex-end:Flex布局容器内元素向交叉轴终点对齐;
        • center:Flex布局容器内元素在交叉轴居中对齐;
        • baseline:如Flex布局纵向排列,则该值与'flex-start'等效。横向布局时,内容元素存在文本时按照文本基线对齐,否则底部对齐。
        -

        scrollbar-color6+

        -

        <color>

        -

        -

        -

        -

        设置滚动条的颜色。

        -

        scrollbar-width6+

        -

        <length>

        -

        -

        -

        -

        设置滚动条的宽度。

        -

        overscroll-effect6+

        -

        string

        -

        -

        -

        -

        设置滚动边缘效果,可选值为:

        -
        • spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹;
        • fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化;
        • none:滑动到边缘后无效果
        -
        - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        reachstart6+

        -

        -

        -

        当页面滑动到最开始的点时触发的事件回调,当flex-direction: row时才会触发。

        -

        reachend6+

        -

        -

        -

        当页面滑动到最末尾的点时触发的事件回调,当flex-direction: row时才会触发。

        -

        reachtop6+

        -

        -

        -

        当页面滑动到最上部的点时触发的事件回调,当flex-direction: column时才会触发。

        -

        reachbottom6+

        -

        -

        -

        当页面滑动到最下部的点时触发的事件回调,当flex-direction: column时才会触发。

        -
        - -## 方法 - -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        返回值

        -

        描述

        -

        getScrollOffset6+

        -

        -

        -

        ScrollOffset

        -

        获取元素内容的滚动偏移。

        -
        说明:
        • 需要设置overflow样式为scroll,默认滚动方向与容器方向一致。
        -
        -

        scrollBy6+

        -

        ScrollParam

        -

        -

        -

        指定元素内容的滚动偏移。

        -
        说明:
        • 需要设置overflow样式为scroll。
        -
        -
        - -**表 1** ScrollOffset6+ - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        描述

        -

        x

        -

        number

        -

        在x轴方向的偏移,单位为px。

        -

        y

        -

        number

        -

        在y轴方向的偏移,单位为px。

        -
        - -**表 2** ScrollParam6+ - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        描述

        -

        dx

        -

        number

        -

        水平方向滑动的偏移量,单位px。

        -

        dy

        -

        number

        -

        垂直方向滑动的偏移量,单位px。

        -

        smooth

        -

        boolean

        -

        是否平滑处理。

        -
        - -## 示例 - -1. Flex样式 - - ``` - -
        -
        -
        -
        -
        -
        -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 454px; - height: 454px; - } - .flex-box { - justify-content: space-around; - align-items: center; - width: 400px; - height: 140px; - background-color: #ffffff; - } - .flex-item { - width: 120px; - height: 120px; - border-radius: 16px; - } - .color-primary { - background-color: #007dff; - } - .color-warning { - background-color: #ff7500; - } - .color-success { - background-color: #41ba41; - } - ``` - - ![](figures/zh-cn_image_0000001127285076.png) - -2. Flex Wrap样式 - - ``` - -
        -
        -
        -
        -
        -
        -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 454px; - height: 454px; - } - .flex-box { - justify-content: space-around; - align-items: center; - flex-wrap: wrap; - width: 300px; - height: 250px; - background-color: #ffffff; - } - .flex-item { - width: 120px; - height: 120px; - border-radius: 16px; - } - .color-primary { - background-color: #007dff; - } - .color-warning { - background-color: #ff7500; - } - .color-success { - background-color: #41ba41; - } - ``` - - ![](figures/22.png) - -3. Grid样式 - - ``` - -
        -
        -
        -
        -
        -
        - ``` - - ``` - /* xxx.css */ - .common { - width: 400px; - height: 400px; - background-color: #ffffff; - align-items: center; - justify-content: center; - margin: 24px; - } - .grid-parent { - display: grid; - grid-template-columns: 35% 35%; - grid-columns-gap: 24px; - grid-rows-gap: 24px; - grid-template-rows: 35% 35%; - } - .grid-child { - width: 100%; - height: 100%; - border-radius: 8px; - } - .grid-left-top { - grid-row-start: 0; - grid-column-start: 0; - grid-row-end: 0; - grid-column-end: 0; - background-color: #3f56ea; - } - .grid-left-bottom { - grid-row-start: 1; - grid-column-start: 0; - grid-row-end: 1; - grid-column-end: 0; - background-color: #00aaee; - } - .grid-right-top { - grid-row-start: 0; - grid-column-start: 1; - grid-row-end: 0; - grid-column-end: 1; - background-color: #00bfc9; - } - .grid-right-bottom { - grid-row-start: 1; - grid-column-start: 1; - grid-row-end: 1; - grid-column-end: 1; - background-color: #47cc47; - } - ``` - - ![](figures/11.png) - -4. 拖拽7+ - - ``` - -
        -
        -
        -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - } - .content{ - width: 200px; - height: 200px; - background-color: red; - } - ``` - - ``` - // xxx.js - import prompt from '@system.prompt'; - export default { - data:{ - left:0, - top:0, - }, - dragstart(e){ - prompt.showToast({ - message: 'Start to be dragged' - }) - }, - drag(e){ - this.left = e.globalX; - this.top = e.globalY; - }, - dragend(e){ - prompt.showToast({ - message: 'End Drag' - }) - }, - } - ``` - - ![](figures/9.gif) - - ``` - -
        -
        -
        -
        -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - width: 100%; - position: relative; - max-width: 100%; - } - .content{ - width: 200px; - height: 200px; - background-color: red; - position: absolute; - } - ``` - - ``` - // xxx.js - import prompt from '@system.prompt'; - export default { - data:{ - left:0, - top:0, - }, - drag(e){ - this.left = e.globalX; - this.top = e.globalY; - }, - dragenter(e){ - prompt.showToast({ - message: 'enter' - }) - }, - dragover(e){ - prompt.showToast({ - message: 'over' - }) - }, - dragleave(e){ - prompt.showToast({ - message: 'leave' - }) - }, - drop(e){ - prompt.showToast({ - message: 'drop' - }) - } - } - ``` - - ![](figures/6.gif) - -5. 手指捏合7+ - - ``` - -
        -
        -
        -
        - ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 454px; - height: 454px;} - .content{ - width: 400px; - height: 400px; - background-color: aqua; - margin:30px - } - ``` - - ``` - // xxx.js - import prompt from '@system.prompt'; - export default { - pinchstart(e){ - prompt.showToast({ - message: 'pinchstart!!!' - }) - }, - pinchupdate(e){ - prompt.showToast({ - message: 'Two-finger pinch update' - }) - }, - pinchend(e){ - prompt.showToast({ - message: 'Finished with two fingers pinching' - }) - }, - pinchcancel(e){ - prompt.showToast({ - message: 'Finger pinching is interrupted' - }) - } - } - ``` +## 子组件 - ![](figures/5.gif) +支持。 +## 属性 + +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 + + +## 样式 + +除支持[组件通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| flex-direction | string | row | 否 | flex容器主轴方向。可选项有:
        - column:垂直方向从上到下。
        - row:水平方向从左到右。 | +| flex-wrap | string | nowrap | 否 | flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:
        - nowrap:不换行,单行显示。
        - wrap:换行,多行显示。 | +| justify-content | string | flex-start | 否 | flex容器当前行的主轴对齐格式。可选项有:
        - flex-start:项目位于容器的开头。
        - flex-end:项目位于容器的结尾。
        - center:项目位于容器的中心。
        - space-between:项目位于各行之间留有空白的容器内。
        - space-around:项目位于各行之前、之间、之后都留有空白的容器内。
        - space-evenly5+:  均匀排列每个元素,每个元素之间的间隔相等。 | +| align-items | string | stretch
        | 否 | flex容器当前行的交叉轴对齐格式,可选值为:
        - stretch:弹性元素在交叉轴方向被拉伸到与容器相同的高度或宽度。
        - flex-start:元素向交叉轴起点对齐。
        - flex-end:元素向交叉轴终点对齐。
        - center:元素在交叉轴居中。 | +| align-content | string | flex-start | 否 | 交叉轴中有额外的空间时,多行内容对齐格式,可选值为:
        - flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
        - flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
        - center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
        - space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
        - space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。 | +| display | string | flex | 否 | 确定该元素视图框的类型,该值暂不支持动态修改。可选值为:
        - flex:弹性布局
        - grid:网格布局
        - none:不渲染此元素 | +| grid-template-[columns\|rows] | string | 1行1列 | 否 | 用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。
        示例:如设置grid-template-columns为:
        - 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;
        - 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;
        - 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;
        - repeat(2,100px):分两列,第一列100px,第二列100px;
        - repeat(auto-fill,100px)5+:按照每列100px的大小和交叉轴大小计算最大正整数重复次数,按照该重复次数布满交叉轴;
        - auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。 | +| grid-[columns\|rows]-gap | <length> | 0 | 否 | 用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。 | +| grid-row-[start\|end] | number | - | 否 | 用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。 | +| grid-column-[start\|end] | number | - | 否 | 用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。 | +| grid-auto-flow5+ | string | - | 否 | 使用框架自动布局算法进行网格的布局,可选值为:
        - row:逐行填充元素,如果行空间不够,则新增行;
        - column:逐列填充元素,如果列空间不够,则新增列。 | +| overflow6+ | string | visible | 否 | 设置元素内容区超过元素本身大小时的表现形式。
        - visible:多个子元素内容超过元素大小时,显示在元素外面;
        - hidden:元素内容超过元素大小时,进行裁切显示;
        - scroll:元素内容超过元素大小时,进行滚动显示并展示滚动条(当前只支持纵向)。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > overflow: scroll样式需要元素设置固定的大小,默认滚动方向与容器方向一致。 | +| align-items6+ | string | - | 否 | 设置容器中元素交叉轴上的对齐方式:
        - stretch:Flex容器内容在交叉轴方向被拉伸到与容器相同的高度或宽度;
        - flex-start:Flex布局容器内元素向交叉轴起点对齐;
        - flex-end:Flex布局容器内元素向交叉轴终点对齐;
        - center:Flex布局容器内元素在交叉轴居中对齐;
        - baseline:如Flex布局纵向排列,则该值与'flex-start'等效。横向布局时,内容元素存在文本时按照文本基线对齐,否则底部对齐。 | +| scrollbar-color6+ | <color> | - | 否 | 设置滚动条的颜色。 | +| scrollbar-width6+ | <length> | - | 否 | 设置滚动条的宽度。 | +| overscroll-effect6+ | string | - | 否 | 设置滚动边缘效果,可选值为:
        - spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹;
        - fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化;
        - none:滑动到边缘后无效果 | + + +## 事件 + + + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| reachstart6+ | - | 当页面滑动到最开始的点时触发的事件回调,当flex-direction: row时才会触发。 | +| reachend6+ | - | 当页面滑动到最末尾的点时触发的事件回调,当flex-direction: row时才会触发。 | +| reachtop6+ | - | 当页面滑动到最上部的点时触发的事件回调,当flex-direction: column时才会触发。 | +| reachbottom6+ | - | 当页面滑动到最下部的点时触发的事件回调,当flex-direction: column时才会触发。 | + +## 方法 + +除支持[通用方法](../reference/arkui-js/js-components-common-methods.md)外,还支持如下方法: + +| 名称 | 参数 | 返回值 | 描述 | +| -------- | -------- | -------- | -------- | +| getScrollOffset6+ | - | ScrollOffset | 获取元素内容的滚动偏移。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > - 需要设置overflow样式为scroll。 | +| scrollBy6+ | ScrollParam | - | 指定元素内容的滚动偏移。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > - 需要设置overflow样式为scroll。 | + +**表1** ScrollOffset6+ + +| 名称 | 类型 | 描述 | +| -------- | -------- | -------- | +| x | number | 在x轴方向的偏移,单位为px。 | +| y | number | 在y轴方向的偏移,单位为px。 | + +**表2** ScrollParam6+ + +| 名称 | 类型 | 描述 | +| -------- | -------- | -------- | +| dx | number | 水平方向滑动的偏移量,单位px。 | +| dy | number | 垂直方向滑动的偏移量,单位px。 | +| smooth | boolean | 是否平滑处理。 | + + +## 示例 + +1. Flex样式 + ``` + +
        +
        +
        +
        +
        +
        +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 454px; + height: 454px; + } + .flex-box { + justify-content: space-around; + align-items: center; + width: 400px; + height: 140px; + background-color: #ffffff; + } + .flex-item { + width: 120px; + height: 120px; + border-radius: 16px; + } + .color-primary { + background-color: #007dff; + } + .color-warning { + background-color: #ff7500; + } + .color-success { + background-color: #41ba41; + } + ``` + + ![zh-cn_image_0000001127285076](figures/zh-cn_image_0000001127285076.png) + +2. Flex Wrap样式 + ``` + +
        +
        +
        +
        +
        +
        +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 454px; + height: 454px; + } + .flex-box { + justify-content: space-around; + align-items: center; + flex-wrap: wrap; + width: 300px; + height: 250px; + background-color: #ffffff; + } + .flex-item { + width: 120px; + height: 120px; + border-radius: 16px; + } + .color-primary { + background-color: #007dff; + } + .color-warning { + background-color: #ff7500; + } + .color-success { + background-color: #41ba41; + } + ``` + + ![zh-cn_image_0000001213396721](figures/zh-cn_image_0000001213396721.png) + +3. Grid样式 + + ``` + +
        +
        +
        +
        +
        +
        + ``` + + ``` + /* xxx.css */ + .common { + width: 400px; + height: 400px; + background-color: #ffffff; + align-items: center; + justify-content: center; + margin: 24px; + } + .grid-parent { + display: grid; + grid-template-columns: 35% 35%; + grid-columns-gap: 24px; + grid-rows-gap: 24px; + grid-template-rows: 35% 35%; + } + .grid-child { + width: 100%; + height: 100%; + border-radius: 8px; + } + .grid-left-top { + grid-row-start: 0; + grid-column-start: 0; + grid-row-end: 0; + grid-column-end: 0; + background-color: #3f56ea; + } + .grid-left-bottom { + grid-row-start: 1; + grid-column-start: 0; + grid-row-end: 1; + grid-column-end: 0; + background-color: #00aaee; + } + .grid-right-top { + grid-row-start: 0; + grid-column-start: 1; + grid-row-end: 0; + grid-column-end: 1; + background-color: #00bfc9; + } + .grid-right-bottom { + grid-row-start: 1; + grid-column-start: 1; + grid-row-end: 1; + grid-column-end: 1; + background-color: #47cc47; + } + ``` + + ![zh-cn_image_0000001213276619](figures/zh-cn_image_0000001213276619.png) + +4. 拖拽7+ + ``` + +
        +
        +
        +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + } + .content{ + width: 200px; + height: 200px; + background-color: red; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default { + data:{ + left:0, + top:0, + }, + dragstart(e){ + prompt.showToast({ + message: 'Start to be dragged' + }) + }, + drag(e){ + this.left = e.globalX; + this.top = e.globalY; + }, + dragend(e){ + prompt.showToast({ + message: 'End Drag' + }) + }, + } + ``` + + ![zh-cn_image_0000001213284927](figures/zh-cn_image_0000001213284927.gif) + + ``` + +
        +
        +
        +
        +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + width: 100%; + position: relative; + max-width: 100%; + } + .content{ + width: 200px; + height: 200px; + background-color: red; + position: absolute; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default { + data:{ + left:0, + top:0, + }, + drag(e){ + this.left = e.globalX; + this.top = e.globalY; + }, + dragenter(e){ + prompt.showToast({ + message: 'enter' + }) + }, + dragover(e){ + prompt.showToast({ + message: 'over' + }) + }, + dragleave(e){ + prompt.showToast({ + message: 'leave' + }) + }, + drop(e){ + prompt.showToast({ + message: 'drop' + }) + } + } + ``` + + ![zh-cn_image_0000001168005276](figures/zh-cn_image_0000001168005276.gif) + +5. 手指捏合7+ + ``` + +
        +
        +
        +
        + ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 454px; + height: 454px;} + .content{ + width: 400px; + height: 400px; + background-color: aqua; + margin:30px + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default { + pinchstart(e){ + prompt.showToast({ + message: 'pinchstart!!!' + }) + }, + pinchupdate(e){ + prompt.showToast({ + message: 'Two-finger pinch update' + }) + }, + pinchend(e){ + prompt.showToast({ + message: 'Finished with two fingers pinching' + }) + }, + pinchcancel(e){ + prompt.showToast({ + message: 'Finger pinching is interrupted' + }) + } + } + ``` + + ![zh-cn_image_0000001168440692](figures/zh-cn_image_0000001168440692.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-form.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-form.md index a8923bd7443..6c5360b474d 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-form.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-form.md @@ -1,78 +1,53 @@ -# form +# form + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 6开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 表单容器,支持容器内input元素的内容提交和重置。 -## 权限列表 + +## 权限列表 无 -## 子组件 + +## 子组件 支持。 -## 属性 - -支持[通用属性](js-components-common-attributes.md)。 - -## 样式 - -支持[组件通用样式](js-components-common-styles.md)。 - -## 事件 - -处支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        submit

        -

        FormResult

        -

        点击提交按钮,进行表单提交时,触发该事件。

        -

        reset

        -

        -

        -

        点击重置按钮后,触发该事件。

        -
        - -**表 1** FormResult - - - - - - - - - - - - -

        名称

        -

        类型

        -

        描述

        -

        value

        -

        Object

        -

        input元素的name和value的值。

        -
        - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 属性 + +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 + + +## 样式 + +支持[组件通用样式](../arkui-js/js-components-common-styles.md)。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| submit | FormResult | 点击提交按钮,进行表单提交时,触发该事件。 | +| reset | - | 点击重置按钮后,触发该事件。 | + +**表1** FormResult + +| 名称 | 类型 | 描述 | +| -------- | -------- | -------- | +| value | Object | input元素的name和value的值。 | + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -105,5 +80,4 @@ export default{ } ``` -![](figures/001.gif) - +![zh-cn_image_0000001180658376](figures/zh-cn_image_0000001180658376.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item-group.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item-group.md index ec3bb6aca1c..89b93114ef1 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item-group.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item-group.md @@ -1,140 +1,65 @@ -# list-item-group +# list-item-group -<[list](js-components-container-list.md)\>的子组件,用来展示分组,宽度默认充满list组件。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -- 使用该组件时父元素list组件的样式columns必须为1,否则功能异常。 -- 由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 +<[list](../arkui-js/js-components-container-list.md)>的子组件,用来展示分组,宽度默认充满list组件。 -## 权限列表 + +- 使用该组件时父元素list组件的样式columns必须为1,否则功能异常。 + +- 由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 + +## 权限列表 无 -## 子组件 - -仅支持<[list-item](js-components-container-list-item.md)\>。 - -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        default

        -

        -

        list-item-group类型,同一list支持多种type的list-item-group,相同type的list-item-group需要确保渲染后的视图布局也完全相同,当type固定时,使用show属性代替if属性,确保视图布局不变。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 通用属性中的id用来标识一个group。list中相关的函数的入参以及事件的信息皆以此标识一个唯一的group。 - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        flex-direction

        -

        string

        -

        row

        -

        -

        flex容器主轴方向。可选项有:

        -
        • column:垂直方向从上到下
        • row:水平方向从左到右
        -

        justify-content

        -

        string

        -

        flex-start

        -

        -

        flex容器当前行的主轴对齐格式。可选项有:

        -
        • flex-start:项目位于容器的开头。
        • flex-end:项目位于容器的结尾。
        • center:项目位于容器的中心。
        • space-between:项目位于各行之间留有空白的容器内。
        • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
        • space-evenly5+: 均匀排列每个元素,每个元素之间的间隔相等。
        -
        - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        groupclick

        -

        { groupid: string }

        -

        group点击事件。

        -

        groupid:被点击的group的id。

        -

        groupcollapse

        -

        { groupid: string }

        -

        group收拢事件。

        -

        groupid:收拢的group的id。

        -

        当不输入参数或者groupid为空时收拢所有分组。

        -

        groupexpand

        -

        { groupid: string }

        -

        group展开事件。

        -

        groupid:展开的group的id。

        -

        当不输入参数或者groupid为空时展开所有分组。

        -
        - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 + +## 子组件 + +仅支持<[list-item](../arkui-js/js-components-container-list-item.md)>。 + + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | default | 否 | list-item-group类型,同一list支持多种type的list-item-group,相同type的list-item-group需要确保渲染后的视图布局也完全相同,当type固定时,使用show属性代替if属性,确保视图布局不变。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 通用属性中的id用来标识一个group。list中相关的函数的入参以及事件的信息皆以此标识一个唯一的group。 + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| flex-direction | string | row | 否 | flex容器主轴方向。可选项有:
        - column:垂直方向从上到下
        - row:水平方向从左到右 | +| justify-content | string | flex-start | 否 | flex容器当前行的主轴对齐格式。可选项有:
        - flex-start:项目位于容器的开头。
        - flex-end:项目位于容器的结尾。
        - center:项目位于容器的中心。
        - space-between:项目位于各行之间留有空白的容器内。
        - space-around:项目位于各行之前、之间、之后都留有空白的容器内。
        - space-evenly5+:  均匀排列每个元素,每个元素之间的间隔相等。 | + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| groupclick | { groupid: string } | group点击事件。
        groupid:被点击的group的id。 | +| groupcollapse | { groupid: string } | group收拢事件。
        groupid:收拢的group的id。
        当不输入参数或者groupid为空时收拢所有分组。 | +| groupexpand | { groupid: string } | group展开事件。
        groupid:展开的group的id。
        当不输入参数或者groupid为空时展开所有分组。 | + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -243,5 +168,4 @@ export default { } ``` -![](figures/list6.gif) - +![zh-cn_image_0000001127284978](figures/zh-cn_image_0000001127284978.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item.md index 45606b65189..16bec43dd90 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item.md @@ -1,151 +1,59 @@ -# list-item +# list-item -<[list](js-components-container-list.md)\>的子组件,用来展示列表具体item。由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -## 权限列表 +<[list](../arkui-js/js-components-container-list.md)>的子组件,用来展示列表具体item。由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 + +## 权限列表 无 -## 子组件 + +## 子组件 支持单个子组件。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        default

        -

        -

        list-item类型,默认值为default,同一list中可以包含多种type的list-item,相同type的list-item需要确保渲染后的视图布局也相同,如果type固定,则使用show属性代替if属性,确保视图布局不变。

        -

        primary

        -

        boolean

        -

        false

        -

        -

        设置为true表示该item是group中的主item,即收拢时显示的item。如果有多个primary,以第一个为准。如果没有标记为primary的item,则以第一个item为主item。

        -

        section

        -

        string

        -

        -

        -

        -

        当前item的匹配字符串,如不设置则为空。不支持动态修改。group内只有主item设置有效。

        -

        sticky

        -

        string

        -

        none

        -

        -

        设置当前item是否为吸顶item以及其吸顶消失的效果,当前仅支持纵向list,group内部的item不可吸顶,设置该属性无效。

        -
        • none:当前item不吸顶。
        • normal:当前item吸顶,消失效果滑动消失。
        • opacity:当前item吸顶,消失效果渐隐消失,仅在智能穿戴上支持。
        -

        clickeffect5+

        -

        boolean

        -

        true

        -

        -

        设置当前item是否有点击动效。

        -
        • false:item点击时无点击动效。
        • true:item点击时有点击动效。
        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        column-span

        -

        <number>

        -

        1

        -

        -

        当前的list-item需要在list中占据的列的数量,默认占一列,仅在list为多列时生效。

        -
        - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        sticky

        -

        { state: boolean }

        -

        吸顶组件回调事件。

        -

        value: false表示当前item处于非吸顶状态;

        -

        value: true表示当前item处于吸顶状态;

        -

        说明:仅当item设置sticky属性时支持注册此事件。

        -
        - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 - -详见[List示例](js-components-container-list.md#示例)。 +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | default | 否 | list-item类型,默认值为default,同一list中可以包含多种type的list-item,相同type的list-item需要确保渲染后的视图布局也相同,如果type固定,则使用show属性代替if属性,确保视图布局不变。 | +| primary | boolean | false | 否 | 设置为true表示该item是group中的主item,即收拢时显示的item。如果有多个primary,以第一个为准。如果没有标记为primary的item,则以第一个item为主item。 | +| section | string | - | 否 | 当前item的匹配字符串,如不设置则为空。不支持动态修改。group内只有主item设置有效。 | +| sticky | string | none | 否 | 设置当前item是否为吸顶item以及其吸顶消失的效果,当前仅支持纵向list,group内部的item不可吸顶,设置该属性无效。
        - none:当前item不吸顶。
        - normal:当前item吸顶,消失效果滑动消失。
        - opacity:当前item吸顶,消失效果渐隐消失,仅在智能穿戴上支持。 | +| clickeffect5+ | boolean | true | 否 | 设置当前item是否有点击动效。
        - false:item点击时无点击动效。
        - true:item点击时有点击动效。 | + + +## 样式 + + + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| column-span | <number> | 1 | 否 | 当前的list-item需要在list中占据的列的数量,默认占一列,仅在list为多列时生效。 | + + +## 事件 + + + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| sticky | { state: boolean } | 吸顶组件回调事件。
        value: false表示当前item处于非吸顶状态;
        value: true表示当前item处于吸顶状态;
        说明:仅当item设置sticky属性时支持注册此事件。 | + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 + +详见[List示例](../arkui-js/js-components-container-list.md#示例)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-list.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-list.md index 620ba233854..c2fb21c57dd 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-list.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-list.md @@ -1,674 +1,155 @@ -# list +# list + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 -## 权限列表 +## 权限列表 无 -## 子组件 -仅支持<[list-item-group](js-components-container-list-item-group.md)\>和<[list-item](js-components-container-list-item.md)\>。 +## 子组件 + +仅支持<[list-item-group](../arkui-js/js-components-container-list-item-group.md)>和<[list-item](../arkui-js/js-components-container-list-item.md)>。 + -## 属性 +## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        scrollpage

        -

        boolean

        -

        false

        -

        -

        设置为true时,将 list 顶部页面中非 list 部分随 list 一起滑出可视区域,当list方向为row时,不支持此属性。

        -

        cachedcount

        -

        number

        -

        0

        -

        -

        长列表延迟加载时list-item最少缓存数量。

        -

        可视区域外缓存的list-item数量少于该值时,会触发requestitem事件。

        -

        scrollbar

        -

        string

        -

        off

        -

        -

        侧边滑动栏的显示模式(当前只支持纵向):

        -
        • off:不显示。
        • auto:按需显示(触摸时显示,2s后消失)。
        • on:常驻显示。
        -

        scrolleffect

        -

        string

        -

        spring

        -

        -

        滑动效果,目前支持如下滑动效果:

        -
        • spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。
        • fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化。
        • no:滑动到边缘后无效果。
        -

        indexer

        -

        boolean | Array<string>

        -

        false

        -

        -

        是否展示侧边栏快速字母索引栏。设置为true或者自定义索引时,索引栏会显示在列表右边界处。示例:

        -

        "indexer" : "true"表示使用默认字母索引表。

        -

        "indexer" : "false"表示无索引。

        -

        "indexer" : ['#',‘1’,'2',‘3’,'4',‘5’,'6',‘7’,'8']表示自定义索引表。自定义时"#"必须要存在。

        -
        说明:
        • indexer属性生效需要flex-direction属性配合设置为column,且columns属性设置为1。
        • 点击索引条进行列表项索引需要list-item子组件配合设置相应的section属性
        -
        -

        indexercircle5+

        -

        boolean

        -

        -

        -

        -

        是否为环形索引。

        -

        穿戴设备默认为true,其他为false。indexer为false时不生效。

        -

        indexermulti5+

        -

        boolean

        -

        false

        -

        -

        是否开启索引条多语言功能。

        -

        indexer为false时不生效。

        -

        indexerbubble5+

        -

        boolean

        -

        true

        -

        -

        是否开启索引切换的气泡提示。

        -

        indexer为false时不生效。

        -

        divider5+

        -

        boolean

        -

        false

        -

        -

        item是否自带分隔线。

        -

        其样式参考样式列表的divider-color、divider-height、divider-length、divider-origin。

        -

        shapemode

        -

        string

        -

        default

        -

        -

        侧边滑动栏的形状类型。

        -
        • default:不指定,跟随主题;
        • rect:矩形;
        • round:圆形。
        -

        updateeffect

        -

        boolean

        -

        false

        -

        -

        用于设置当list内部的item发生删除或新增时是否支持动效。

        -
        • false:新增删除item时无过渡动效。
        • true:新增删除item时播放过程动效。
        -

        chainanimation5+

        -

        boolean

        -

        false

        -

        -

        用于设置当前list是否启用链式联动动效,开启后列表滑动以及顶部和底部拖拽时会有链式联动的效果。链式联动效果:list内的list-item间隔一定距离,在基本的滑动交互行为下,主动对象驱动从动对象进行联动,驱动效果遵循弹簧物理动效。

        -
        • false:不启用链式联动
        • true:启用链式联动
          说明:
          • 不支持动态修改。
          • 如同时配置了indexer,链式动效不生效。
          • 如配置了链式动效,list-item的sticky不生效。
          -
          -
        -

        initialindex

        -

        number

        -

        0

        -

        -

        用于设置当前List初次加载时视口起始位置显示的item,默认为0,即显示第一个item,如设置的序号超过了最后一个item的序号,则设置不生效,当同时设置了initialoffset属性时,当前属性不生效。当indexer为true或者scrollpage为true时,不生效。

        -

        initialoffset

        -

        <length>

        -

        0

        -

        -

        用于设置当前List初次加载时视口的起始偏移量,偏移量无法超过当前List可滑动的范围,如果超过会被截断为可滑动范围的极限值。当indexer为true或者scrollpage为true时,不生效。

        -

        selected5+

        -

        string

        -

        -

        -

        -

        指定当前列表中被选中激活的项,可选值为list-item的section属性值。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| scrollpage | boolean | false | 否 | 设置为true时,将 list 顶部页面中非 list 部分随 list 一起滑出可视区域,当list方向为row时,不支持此属性。 | +| cachedcount | number | 0 | 否 | 长列表延迟加载时list-item最少缓存数量。
        可视区域外缓存的list-item数量少于该值时,会触发requestitem事件。 | +| scrollbar | string | off | 否 | 侧边滑动栏的显示模式(当前只支持纵向):
        - off:不显示。
        - auto:按需显示(触摸时显示,2s后消失)。
        - on:常驻显示。 | +| scrolleffect | string | spring | 否 | 滑动效果,目前支持如下滑动效果:
        - spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。
        - fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化。
        - no:滑动到边缘后无效果。 | +| indexer | boolean \| Array<string> | false | 否 | 是否展示侧边栏快速字母索引栏。设置为true或者自定义索引时,索引栏会显示在列表右边界处。示例:
        "indexer" : "true"表示使用默认字母索引表。
        "indexer" : "false"表示无索引。
        "indexer" : ['\#',‘1’,'2',‘3’,'4',‘5’,'6',‘7’,'8']表示自定义索引表。自定义时"\#"必须要存在。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > - indexer属性生效需要flex-direction属性配合设置为column,且columns属性设置为1。

        > - 点击索引条进行列表项索引需要list-item子组件配合设置相应的[section属性](../arkui-js/js-components-container-list-item.md#属性)。 | +| indexercircle5+ | boolean | - | 否 | 是否为环形索引。
        穿戴设备默认为true,其他为false。indexer为false时不生效。 | +| indexermulti5+ | boolean | false | 否 | 是否开启索引条多语言功能。
        indexer为false时不生效。 | +| indexerbubble5+ | boolean | true | 否 | 是否开启索引切换的气泡提示。
        indexer为false时不生效。 | +| divider5+ | boolean | false | 否 | item是否自带分隔线。
        其样式参考样式列表的divider-color、divider-height、divider-length、divider-origin。 | +| shapemode | string | default | 否 | 侧边滑动栏的形状类型。
        - default:不指定,跟随主题;
        - rect:矩形;
        - round:圆形。 | +| updateeffect | boolean | false | 否 | 用于设置当list内部的item发生删除或新增时是否支持动效。
        - false:新增删除item时无过渡动效。
        - true:新增删除item时播放过程动效。 | +| chainanimation5+ | boolean | false | 否 | 用于设置当前list是否启用链式联动动效,开启后列表滑动以及顶部和底部拖拽时会有链式联动的效果。链式联动效果:list内的list-item间隔一定距离,在基本的滑动交互行为下,主动对象驱动从动对象进行联动,驱动效果遵循弹簧物理动效。
        - false:不启用链式联动
        - true:启用链式联动
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > - 不支持动态修改。
          > - 如同时配置了indexer,链式动效不生效。
          > - 如配置了链式动效,list-item的sticky不生效。 | +| initialindex | number | 0 | 否 | 用于设置当前List初次加载时视口起始位置显示的item,默认为0,即显示第一个item,如设置的序号超过了最后一个item的序号,则设置不生效,当同时设置了initialoffset属性时,当前属性不生效。当indexer为true或者scrollpage为true时,不生效。 | +| initialoffset | <length> | 0 | 否 | 用于设置当前List初次加载时视口的起始偏移量,偏移量无法超过当前List可滑动的范围,如果超过会被截断为可滑动范围的极限值。当indexer为true或者scrollpage为true时,不生效。 | +| selected5+ | string | - | 否 | 指定当前列表中被选中激活的项,可选值为list-item的section属性值。 | -## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        divider-color5+

        -

        <color>

        -

        transparent

        -

        -

        item分隔线颜色,仅当list的divider属性为true时生效。

        -

        divider-height5+

        -

        <length>

        -

        1

        -

        -

        item分隔线高度,仅当list的divider属性为true时生效。

        -

        divider-length5+

        -

        <length>

        -

        主轴宽度

        -

        -

        item分隔线长度,不设置时最大长度为主轴宽度,具体长度取决于divider-origin,仅当list的divider属性为true时生效。

        -

        divider-origin5+

        -

        <length>

        -

        0

        -

        -

        item分隔线相对于item主轴起点位置的偏移量,仅当list的divider属性为true时生效。

        -

        flex-direction

        -

        string

        -

        -

        column

        -

        -

        设置flex容器主轴的方向,指定flex项如何放置在flex容器中,可选值为:

        -
        • column:主轴为纵向。
        • row:主轴为横向。
        -

        其他组件默认值为row,在list组件中默认值为column。

        -

        columns

        -

        number

        -

        1

        -

        -

        list交叉轴方向的显示列数,默认为1列。

        -
        说明:

        设置多列时,在list交叉轴上进行均分,每一列大小相同。

        -
        -

        align-items

        -

        string

        -

        stretch

        -

        -

        list每一列交叉轴上的对齐格式,可选值为:

        -
        • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
        • flex-start:元素向交叉轴起点对齐。
        • flex-end:元素向交叉轴终点对齐。
        • center:元素在交叉轴居中。
          说明:

          align-items样式作用在每一列的子元素上,列与列之间采用均分方式布局。

          -
          -
        -

        item-extent

        -

        <length> | <percentage>

        -

        -

        -

        -

        设置内部item为固定大小,设置为百分比格式时,指相对于list的视口主轴方向长度的百分比。

        -

        fade-color

        -

        <color>

        -

        grey

        -

        -

        设置渐隐物理动效的颜色。当滑动效果设置为渐隐物理动效时生效。

        -

        scrollbar-color6+

        -

        <color>

        -

        -

        -

        -

        设置滚动条的颜色。

        -

        scrollbar-width6+

        -

        <length>

        -

        -

        -

        -

        设置滚动条的宽度。

        -

        scrollbar-offset6+

        -

        <length>

        -

        0

        -

        -

        设置滚动条距离List默认位置的偏移量,只支持正数,默认位置在List右边缘,可以通过这个偏移量调整滚动条的水平位置,如果滚动条绘制在list外部,而list父组件有裁剪,会导致滚动条被裁剪。

        -
        +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: -## 事件 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| divider-color5+ | <color> | transparent | 否 | item分隔线颜色,仅当list的divider属性为true时生效。 | +| divider-height5+ | <length> | 1 | 否 | item分隔线高度,仅当list的divider属性为true时生效。 | +| divider-length5+ | <length> | 主轴宽度 | 否 | item分隔线长度,不设置时最大长度为主轴宽度,具体长度取决于divider-origin,仅当list的divider属性为true时生效。 | +| divider-origin5+ | <length> | 0 | 否 | item分隔线相对于item主轴起点位置的偏移量,仅当list的divider属性为true时生效。 | +| flex-direction | string | column | 否 | 设置flex容器主轴的方向,指定flex项如何放置在flex容器中,可选值为:
        - column:主轴为纵向。
        - row:主轴为横向。
        其他组件默认值为row,在list组件中默认值为column。 | +| columns | number | 1 | 否 | list交叉轴方向的显示列数,默认为1列。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 设置多列时,在list交叉轴上进行均分,每一列大小相同。 | +| align-items | string | stretch | 否 | list每一列交叉轴上的对齐格式,可选值为:
        - stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
        - flex-start:元素向交叉轴起点对齐。
        - flex-end:元素向交叉轴终点对齐。
        - center:元素在交叉轴居中。
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > align-items样式作用在每一列的子元素上,列与列之间采用均分方式布局。 | +| item-extent | <length> \| <percentage> | - | 否 | 设置内部item为固定大小,设置为百分比格式时,指相对于list的视口主轴方向长度的百分比。 | +| fade-color | <color> | grey | 否 | 设置渐隐物理动效的颜色。当滑动效果设置为渐隐物理动效时生效。 | +| scrollbar-color6+ | <color> | - | 否 | 设置滚动条的颜色。 | +| scrollbar-width6+ | <length> | - | 否 | 设置滚动条的宽度。 | +| scrollbar-offset6+ | <length> | 0 | 否 | 设置滚动条距离List默认位置的偏移量,只支持正数,默认位置在List右边缘,可以通过这个偏移量调整滚动条的水平位置,如果滚动条绘制在list外部,而list父组件有裁剪,会导致滚动条被裁剪。 | -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        indexerchange5+

        -

        { local: booleanValue }

        -

        多语言索引条切换事件,仅当indexer属性为true,indexermulti为true时生效。booleanValue可能值为true或者false:

        -
        • true: 当前展示本地索引。
        • false: 当前展示字母索引。
        -

        scroll

        -

        { scrollX: scrollXValue, scrollY: scrollYValue, scrollState: stateValue }

        -

        列表滑动的偏移量和状态回调。

        -

        stateValue: 0表示列表滑动已经停止。

        -

        stateValue: 1表示列表正在用户触摸状态下滑动。

        -

        stateValue: 2表示列表正在用户松手状态下滑动。

        -

        scrollbottom

        -

        -

        -

        当前列表已滑动到底部位置。

        -

        scrolltop

        -

        -

        -

        当前列表已滑动到顶部位置。

        -

        scrollend

        -

        -

        -

        列表滑动已经结束。

        -

        scrolltouchup

        -

        -

        -

        手指已经抬起且列表仍在惯性滑动。

        -

        requestitem

        -

        -

        -

        请求创建新的list-item。

        -

        长列表延迟加载时,可视区域外缓存的list-item数量少于cachedcount时,会触发该事件。

        -

        rotate7+

        -

        { rotateValue: number }

        -

        返回表冠旋转角度增量值,仅智能穿戴支持。

        -
        +## 事件 -## 方法 +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -支持[通用方法](js-components-common-methods.md)外,还支持如下方法: +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| indexerchange5+ | { local: booleanValue } | 多语言索引条切换事件,仅当indexer属性为true,indexermulti为true时生效。booleanValue可能值为true或者false:
        - true: 当前展示本地索引。
        - false: 当前展示字母索引。 | +| scroll | { scrollX: scrollXValue, scrollY: scrollYValue, scrollState: stateValue } | 列表滑动的偏移量和状态回调。
        stateValue: 0表示列表滑动已经停止。
        stateValue: 1表示列表正在用户触摸状态下滑动。
        stateValue: 2表示列表正在用户松手状态下滑动。 | +| scrollbottom | - | 当前列表已滑动到底部位置。 | +| scrolltop | - | 当前列表已滑动到顶部位置。 | +| scrollend | - | 列表滑动已经结束。 | +| scrolltouchup | - | 手指已经抬起且列表仍在惯性滑动。 | +| requestitem | - | 请求创建新的list-item。
        长列表延迟加载时,可视区域外缓存的list-item数量少于cachedcount时,会触发该事件。 | +| rotate7+ | { rotateValue: number } | 返回表冠旋转角度增量值,仅智能穿戴支持。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        scrollTo

        -

        { index: number(指定位置) }

        -

        list滑动到指定index的item位置。

        -

        scrollBy

        -

        ScrollParam

        -

        触发list滑动一段距离。

        -

        智慧屏特有方法。

        -

        scrollTop

        -

        { smooth: boolean }

        -

        smooth缺省为false,表示直接滚动到顶部。

        -

        smooth为true,表示平滑滚动到顶部。

        -

        scrollBottom

        -

        { smooth: boolean }

        -

        smooth缺省为false,表示直接滚动到底部。

        -

        smooth为true,表示平滑滚动到底部。

        -

        scrollPage

        -

        { reverse: boolean, smooth: boolean }

        -

        reverse缺省值为false,表示下一页,无完整页则滚动到底部。

        -

        reverse为true,表示上一页,无完整页则滚动到顶部。

        -

        smooth缺省值为false,表示直接滚动一页。

        -

        smooth为true,表示平滑滚动一页。

        -

        scrollArrow

        -

        { reverse: boolean, smooth: boolean }

        -

        reverse缺省值为false,表示向底部方向滑动一段距离,无足够距离则滚动到底部。

        -

        reverse为true,表示向顶部方向滑动一段距离,无足够距离则滚动到顶部。

        -

        smooth缺省值为false,表示直接滚动。

        -

        smooth为true,表示平滑滚动。

        -

        collapseGroup

        -

        { groupid: string }

        -

        收拢指定的group。

        -

        groupid:需要收拢的group的id。

        -

        当groupid未指定时收拢所有的group。

        -

        expandGroup

        -

        { groupid: string }

        -

        展开指定的group。

        -

        groupid:需要展开的group的id。

        -

        当groupid未指定时展开所有的group。

        -

        currentOffset

        -

        -

        -

        返回当前滑动的偏移量。返回值类型是Object,返回值说明请见表2

        -
        -**表 1** ScrollParam +## 方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        是否必选

        -

        默认值

        -

        备注

        -

        dx

        -

        number

        -

        -

        0

        -

        水平方向滑动的偏移量,单位为px。

        -

        dy

        -

        number

        -

        -

        0

        -

        垂直方向滑动的偏移量,单位为px。

        -

        smooth

        -

        boolean

        -

        -

        true

        -

        列表位置跳转时是否有滑动动画。

        -
        +支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: -**表 2** currentOffset返回对象属性说明 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| scrollTo | { index: number(指定位置) } | list滑动到指定index的item位置。 | +| scrollTop | { smooth: boolean } | smooth缺省为false,表示直接滚动到顶部。
        smooth为true,表示平滑滚动到顶部。 | +| scrollBottom | { smooth: boolean } | smooth缺省为false,表示直接滚动到底部。
        smooth为true,表示平滑滚动到底部。 | +| scrollPage | { reverse: boolean, smooth: boolean } | reverse缺省值为false,表示下一页,无完整页则滚动到底部。
        reverse为true,表示上一页,无完整页则滚动到顶部。
        smooth缺省值为false,表示直接滚动一页。
        smooth为true,表示平滑滚动一页。 | +| scrollArrow | { reverse: boolean, smooth: boolean } | reverse缺省值为false,表示向底部方向滑动一段距离,无足够距离则滚动到底部。
        reverse为true,表示向顶部方向滑动一段距离,无足够距离则滚动到顶部。
        smooth缺省值为false,表示直接滚动。
        smooth为true,表示平滑滚动。 | +| collapseGroup | { groupid: string } | 收拢指定的group。
        groupid:需要收拢的group的id。
        当groupid未指定时收拢所有的group。 | +| expandGroup | { groupid: string } | 展开指定的group。
        groupid:需要展开的group的id。
        当groupid未指定时展开所有的group。 | +| currentOffset | - | 返回当前滑动的偏移量。返回值类型是Object,返回值说明请见表 currentOffset返回对象属性说明。 | + +**表1** currentOffset返回对象属性说明 + +| 名称 | 类型 | 备注 | +| -------- | -------- | -------- | +| x | number | 当前x轴滑动偏移量,单位为px。 | +| y | number | 当前y轴滑动偏移量,单位为px。 | - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        备注

        -

        x

        -

        number

        -

        当前x轴滑动偏移量,单位为px。

        -

        y

        -

        number

        -

        当前y轴滑动偏移量,单位为px。

        -
        ## 示例 ``` -!-- index.hml --> -
        - - -
        - {{$item.title}} - {{$item.date}} -
        -
        -
        + +
        + + +
        + {{$item.title}} + {{$item.date}} +
        +
        +
        +
        ``` ``` // index.js export default { - data: { - todolist: [{ - title: '刷题', - date: '2021-12-31 10:00:00', - }, { - title: '看电影', - date: '2021-12-31 20:00:00', - }], + data: { + todolist: [{ + title: '刷题', + date: '2021-12-31 10:00:00', + }, { + title: '看电影', + date: '2021-12-31 20:00:00', + }], }, } ``` ``` /* index.css */ -.container { - display: flex; - justify-content: center; - align-items: center; - width: 100%; +.container { + display: flex; + justify-content: center; + align-items: center; + width: 100%; height: 100%; } -.todo-wrapper { - width: 100%; +.todo-wrapper { + width: 100%; height: 300px; } -.todo-item { - width: 100%; - height: 120px; +.todo-item { + width: 100%; + height: 120px; justify-content:center; } -.todo-title { - width: 100%; - height: 80px; +.todo-title { + width: 100%; + height: 80px; text-align: center; } ``` -![](figures/list.png) - +![zh-cn_image_0000001185033226](figures/zh-cn_image_0000001185033226.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-panel.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-panel.md index c961452d696..e68ebaa5625 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-panel.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-panel.md @@ -1,457 +1,86 @@ -# panel +# panel + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 可滑动面板。提供一种轻量的内容展示的窗口,可方便的在不同尺寸中切换。属于弹出式组件。 -## 子组件 + +## 子组件 支持 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        type

        -

        string

        -

        foldable

        -

        -

        设置可滑动面板类型,不可动态变更,可选值有:

        -
        • minibar:提供minibar和类全屏展示切换效果。

          -
        • foldable:内容永久展示类,提供大(类全屏)、中(类半屏)、小三种尺寸展示切换效果。

          -
        • temporary:内容临时展示区,提供大(类全屏)、中(类半屏)两种尺寸展示切换效果。

          -
        -

        mode

        -

        string

        -

        full

        -

        -

        设置初始状态,mode参数可选值为:

        -
        1. mini:类型为minibar和foldable时,为最小状态;类型为temporary,则不生效。

          -
        2. half: 类型为foldable和temporary时,为类半屏状态;类型为minibar,则不生效。

          -
        3. full: 类全屏状态。

          -
        -

        dragbar

        -

        boolean

        -

        true

        -

        -

        设置是否存在dragbar,true表示存在,false表示不存在。

        -

        fullheight

        -

        <length>

        -

        -

        -

        -

        指定full状态下的高度,默认为屏幕尺寸 - 8px。

        -

        halfheight

        -

        <length>

        -

        -

        -

        -

        指定half状态下的高度,默认为屏幕尺寸的一半。

        -

        miniheight

        -

        <length>

        -

        -

        -

        -

        指定mini状态下的高度,默认为48px。

        -
        +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 不支持渲染属性,包括for、if和show。 ->- 不支持focusable和disabled属性。 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | foldable | 是 | 设置可滑动面板类型,不可动态变更,可选值有:
        - minibar:提供minibar和类全屏展示切换效果。
        - foldable:内容永久展示类,提供大(类全屏)、中(类半屏)、小三种尺寸展示切换效果。
        - temporary:内容临时展示区,提供大(类全屏)、中(类半屏)两种尺寸展示切换效果。 | +| mode | string | full | 否 | 设置初始状态,mode参数可选值为:
        1. mini:类型为minibar和foldable时,为最小状态;类型为temporary,则不生效。
        2. half: 类型为foldable和temporary时,为类半屏状态;类型为minibar,则不生效。
        3. full: 类全屏状态。 | +| dragbar | boolean | true | 否 | 设置是否存在dragbar,true表示存在,false表示不存在。 | +| fullheight | <length> | - | 否 | 指定full状态下的高度,默认为屏幕尺寸 - 8px。 | +| halfheight | <length> | - | 否 | 指定half状态下的高度,默认为屏幕尺寸的一半。 | +| miniheight | <length> | - | 否 | 指定mini状态下的高度,默认为48px。 | -## 样式 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 不支持渲染属性,包括for、if和show。 +> +> - 不支持focusable和disabled属性。 -仅支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        padding

        -

        <length>

        -

        0

        -

        -
        该属性可以有1到4个值:
        • 指定一个值时,该值指定四个边的内边距。

          -
        • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

          -
        • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

          -
        • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

          -
        -
        -

        padding-[left|top|right|bottom]

        -

        <length>

        -

        0

        -

        -

        设置左、上、右、下内边距属性。

        -

        padding-[start|end]

        -

        <length>

        -

        0

        -

        -

        设置起始和末端内边距属性。

        -

        margin

        -

        <length>

        -

        0

        -

        -

        使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

        -
        • 只有一个值时,这个值会被指定给全部的四个边。

          -
        • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

          -
        • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

          -
        • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

          -
        -

        margin-[left|top|right|bottom]

        -

        <length>

        -

        0

        -

        -

        设置左、上、右、下外边距属性。

        -

        margin-[start|end]

        -

        <length>

        -

        0

        -

        -

        设置起始和末端外边距属性。

        -

        border

        -

        -

        -

        0

        -

        -

        使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

        -

        border-style

        -

        string

        -

        solid

        -

        -

        使用简写属性设置所有边框的样式,可选值为:

        -
        • dotted:显示为一系列圆点,圆点半径为border-width的一半。
        • dashed:显示为一系列短的方形虚线。
        -
        • solid:显示为一条实线。
        -

        border-[left|top|right|bottom]-style

        -

        string

        -

        solid

        -

        -

        分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

        -

        border-[left|top|right|bottom]

        -

        -

        -

        -

        -

        -

        使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

        -

        border-width

        -

        <length>

        -

        0

        -

        -

        使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

        -

        border-[left|top|right|bottom]-width

        -

        <length>

        -

        0

        -

        -

        分别设置左、上、右、下四个边框的宽度。

        -

        border-color

        -

        <color>

        -

        black

        -

        -

        使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

        -

        border-[left|top|right|bottom]-color

        -

        <color>

        -

        black

        -

        -

        分别设置左、上、右、下四个边框的颜色。

        -

        border-radius

        -

        <length>

        -

        -

        -

        -

        border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

        -

        border-[top|bottom]-[left|right]-radius

        -

        <length>

        -

        -

        -

        -

        分别设置左上,右上,右下和左下四个角的圆角半径。

        -

        background

        -

        <linear-gradient>

        -

        -

        -

        -

        仅支持设置渐变样式,与background-color、background-image不兼容。

        -

        background-color

        -

        <color>

        -

        -

        -

        -

        设置背景颜色。

        -

        background-image

        -

        string

        -

        -

        -

        -

        设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

        -

        background-size

        -
        • string
        • <length> <length>
        • <percentage> <percentage>
        -

        auto

        -

        -

        设置背景图片的大小。

        -
        • string可选值:
          • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
          • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
          • auto:保持原图的比例不变。
          -
        • length值参数方式:

          设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

          -
        • 百分比参数方式:

          以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

          -
        -

        background-repeat

        -

        string

        -

        repeat

        -

        -

        针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

        -
        • repeat:在水平轴和竖直轴上同时重复绘制图片。
        • repeat-x:只在水平轴上重复绘制图片。
        • repeat-y:只在竖直轴上重复绘制图片。
        • no-repeat:不会重复绘制图片。
        -

        background-position

        -
        • string string
        • <length> <length>
        • <percentage> <percentage>
        -

        0px 0px

        -

        -
        • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
          • left:水平方向上最左侧。
          • right:水平方向上最右侧。
          • top:竖直方向上最顶部。
          • bottom:竖直方向上最底部。
          • center:水平方向或竖直方向上中间位置。
          -
        -
        • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
        • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
        • 可以混合使用<percentage>和<length>
        -

        opacity

        -

        number

        -

        1

        -

        -

        元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

        -
        +## 样式 -## 事件 +仅支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| padding | <length> | 0 | 否 | 该属性可以有1到4个值:
        - 指定一个值时,该值指定四个边的内边距。
        - 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。
        - 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。
        - 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。 | +| padding-[left\|top\|right\|bottom] | <length> | 0 | 否 | 设置左、上、右、下内边距属性。 | +| padding-[start\|end] | <length> | 0 | 否 | 设置起始和末端内边距属性。 | +| margin | <length> | 0 | 否 | 使用简写属性设置所有的外边距属性,该属性可以有1到4个值。
        - 只有一个值时,这个值会被指定给全部的四个边。
        - 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。
        - 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。
        - 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。 | +| margin-[left\|top\|right\|bottom] | <length> | 0 | 否 | 设置左、上、右、下外边距属性。 | +| margin-[start\|end] | <length> | 0 | 否 | 设置起始和末端外边距属性。 | +| border | - | 0 | 否 | 使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。 | +| border-style | string | solid | 否 | 使用简写属性设置所有边框的样式,可选值为:
        - dotted:显示为一系列圆点,圆点半径为border-width的一半。
        - dashed:显示为一系列短的方形虚线。
        - solid:显示为一条实线。 | +| border-[left\|top\|right\|bottom]-style | string | solid | 否 | 分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。 | +| border-[left\|top\|right\|bottom] | - | - | 否 | 使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。 | +| border-width | <length> | 0 | 否 | 使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度。 | +| border-[left\|top\|right\|bottom]-width | <length> | 0 | 否 | 分别设置左、上、右、下四个边框的宽度。 | +| border-color | <color> | black | 否 | 使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色。 | +| border-[left\|top\|right\|bottom]-color | <color> | black | 否 | 分别设置左、上、右、下四个边框的颜色。 | +| border-radius | <length> | - | 否 | border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left\|top\|right\|bottom]-width,border-[left\|top\|right\|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。 | +| border-[top\|bottom]-[left\|right]-radius | <length> | - | 否 | 分别设置左上,右上,右下和左下四个角的圆角半径。 | +| background | <linear-gradient> | - | 否 | 仅支持设置[渐变样式](../arkui-js/js-components-common-gradient.md),与background-color、background-image不兼容。 | +| background-color | <color> | - | 否 | 设置背景颜色。 | +| background-image | string | - | 否 | 设置背景图片。与background-color、background不兼容;支持本地图片资源地址。 | +| background-size | - string
        - <length> <length>
        - <percentage> <percentage> | auto | 否 | 设置背景图片的大小。
        - string可选值:
          - contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
          - cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
          - auto:保持原图的比例不变。
        - length值参数方式:
          设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。
        - 百分比参数方式:
          以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。 | +| background-repeat | string | repeat | 否 | 针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。
        - repeat:在水平轴和竖直轴上同时重复绘制图片。
        - repeat-x:只在水平轴上重复绘制图片。
        - repeat-y:只在竖直轴上重复绘制图片。
        - no-repeat:不会重复绘制图片。 | +| background-position | - string string
        - <length> <length>
        - <percentage> <percentage> | 0px 0px | 否 | - 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
          - left:水平方向上最左侧。
          - right:水平方向上最右侧。
          - top:竖直方向上最顶部。
          - bottom:竖直方向上最底部。
          - center:水平方向或竖直方向上中间位置。
        - length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px)  。如果仅规定了一个值,另外一个值将是50%。
        - 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
        - 可以混合使用<percentage>和<length> | +| opacity | number | 1 | 否 | 元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。 | + + +## 事件 仅支持如下事件: - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        sizechange

        -

        { size: { height: heightLength, width: widthLength }, mode: modeStr }

        -

        当可滑动面板发生状态变化时触发,mode参数可选值为:

        -
        1. mini:类型为minibar和foldable时,处于最小状态;

          -
        2. half: 类型为foldable时,处于类半屏状态;

          -
        3. full: 类全屏状态。

          -
          说明:

          返回的height值为内容区高度值,当dragbar属性为true时,panel本身的高度值为dragbar高度加上内容区高度。

          -
          -
        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| sizechange | { size: { height: heightLength, width: widthLength }, mode: modeStr } | 当可滑动面板发生状态变化时触发,mode参数可选值为:
        1. mini:类型为minibar和foldable时,处于最小状态;
        2. half: 类型为foldable时,处于类半屏状态;
        3. full: 类全屏状态。
           > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
           > 返回的height值为内容区高度值,当dragbar属性为true时,panel本身的高度值为dragbar高度加上内容区高度。 | + -## 方法 +## 方法 仅支持如下方法: - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        show

        -

        -

        -

        弹出panel可滑动面板。

        -

        close

        -

        -

        -

        关闭panel可滑动面板。

        -
        +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| show | - | 弹出panel可滑动面板。 | +| close | - | 关闭panel可滑动面板。 | -## 示例 + +## 示例 ``` @@ -529,5 +158,4 @@ export default { } ``` -![](figures/panel6.gif) - +![zh-cn_image_0000001173164785](figures/zh-cn_image_0000001173164785.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-popup.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-popup.md index f38f0c4908a..c429f43f620 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-popup.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-popup.md @@ -1,184 +1,79 @@ -# popup +# popup + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 气泡指示。在点击绑定的控件后会弹出相应的气泡提示来引导用户进行操作。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持单个子组件节点5+。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性:↵ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        target

        -

        string

        -

        -

        -

        -

        目标元素的id属性值,不支持动态切换。

        -

        placement

        -

        string

        -

        bottom

        -

        -

        弹出窗口位置。可选值为:

        -
        • left:位于目标元素左边;
        • right:位于目标元素右边;
        • top:位于目标元素上边;
        • bottom:位于目标元素下边;
        • topLeft:位于目标元素左上角;
        • topRight:位于目标元素右上角;
        • bottomLeft:位于目标元素左下角;
        • bottomRight:位于目标元素右下角。
        -

        keepalive5+

        -

        boolean

        -

        false

        -

        -

        设置当前popup是否需要保留。设置为true时,点击屏幕区域或者页面切换气泡不会消失,需调用气泡组件的hide方法才可让气泡消失;设置为false时,点击屏幕区域或者页面切换气泡会自动消失。

        -

        clickable5+

        -

        boolean

        -

        true

        -

        -

        popup是否使用点击弹窗,当设置为false时,只支持方法调用显示。

        -

        arrowoffset5+

        -

        <length>

        -

        0

        -

        -

        popup箭头在弹窗处的偏移,默认居中,正值按照语言方向进行偏移,负值相反。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 不支持focusable属性。 - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        mask-color

        -

        <color>

        -

        -

        -

        -

        遮罩层的颜色,默认值为全透明。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 不支持position相关样式。 - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        visibilitychange

        -

        { visibility: boolean }

        -

        当气泡弹出和消失时会触发该回调函数。

        -
        - -## 方法 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| target | string | - | 是 | 目标元素的id属性值,不支持动态切换。 | +| placement | string | bottom | 否 | 弹出窗口位置。可选值为:
        - left:位于目标元素左边;
        - right:位于目标元素右边;
        - top:位于目标元素上边;
        - bottom:位于目标元素下边;
        - topLeft:位于目标元素左上角;
        - topRight:位于目标元素右上角;
        - bottomLeft:位于目标元素左下角;
        - bottomRight:位于目标元素右下角。 | +| keepalive5+ | boolean | false | 否 | 设置当前popup是否需要保留。设置为true时,点击屏幕区域或者页面切换气泡不会消失,需调用气泡组件的hide方法才可让气泡消失;设置为false时,点击屏幕区域或者页面切换气泡会自动消失。 | +| clickable5+ | boolean | true | 否 | popup是否使用点击弹窗,当设置为false时,只支持方法调用显示。 | +| arrowoffset5+ | <length> | 0 | 否 | popup箭头在弹窗处的偏移,默认居中,正值按照语言方向进行偏移,负值相反。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 不支持focusable属性。 + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| mask-color | <color> | - | 否 | 遮罩层的颜色,默认值为全透明。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 不支持position相关样式。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| visibilitychange | { visibility: boolean } | 当气泡弹出和消失时会触发该回调函数。 | + + +## 方法 仅支持如下方法: - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        show5+

        -

        -

        -

        弹出气泡提示。

        -

        hide5+

        -

        -

        -

        取消气泡提示。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->1. popup气泡弹窗属性、样式均不支持动态更新。 ->2. popup气泡弹窗的margin样式是相对于target元素进行生效的,如popup在target元素下方,此时只生效margin-top样式,popup在target元素左上方,此时只生效margin-bottom和margin-right样式。 ->3. popup的border四边样式需一致,若四边设置不一致且圆角为零,则按左、上、右、下的顺序取第一个被设置的样式,否则border不生效。 ->4. popup的target组件的click事件不生效。 - -## 示例 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| show5+ | - | 弹出气泡提示。 | +| hide5+ | - | 取消气泡提示。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 1. popup气泡弹窗属性、样式均不支持动态更新。 +> +> 2. popup气泡弹窗的margin样式是相对于target元素进行生效的,如popup在target元素下方,此时只生效margin-top样式,popup在target元素左上方,此时只生效margin-bottom和margin-right样式。 +> +> 3. popup的border四边样式需一致,若四边设置不一致且圆角为零,则按左、上、右、下的顺序取第一个被设置的样式,否则border不生效。 +> +> 4. popup的target组件的click事件不生效。 + + +## 示例 ``` @@ -232,5 +127,4 @@ export default { } ``` -![](figures/zh-cn_image_0000001178886129.png) - +![zh-cn_image_0000001178886129](figures/zh-cn_image_0000001178886129.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-refresh.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-refresh.md index c026bdcaead..c931d65811f 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-refresh.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-refresh.md @@ -1,180 +1,60 @@ -# refresh +# refresh + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 下拉刷新容器。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        offset

        -

        <length>

        -

        -

        -

        -

        刷新组件静止时距离父组件顶部的距离。

        -

        refreshing

        -

        boolean

        -

        false

        -

        -

        用于标识刷新组件当前是否正在刷新。

        -

        type

        -

        string

        -

        auto

        -

        -

        设置组件刷新时的动效。两个可选值,不支持动态修改。

        -
        • auto: 默认效果,列表界面拉到顶后,列表不移动,下拉后有转圈弹出。
        • pulldown: 列表界面拉到顶后,可以继续往下滑动一段距离触发刷新,刷新完成后有回弹效果(如果子组件含有list,防止下拉效果冲突,需将list的scrolleffect设置为no)。
        -

        lasttime

        -

        boolean

        -

        false

        -

        -

        是否显示上次更新时间,字符串格式为:“上次更新时间:XXXX ”,XXXX 按照时间日期显示规范显示,不可动态修改(建议type为pulldown时使用,固定距离位于内容下拉区域底部,使用时注意offset属性设置,防止出现重叠)。

        -

        timeoffset6+

        -

        <length>

        -

        -

        -

        -

        设置更新时间距离父组件顶部的距离。

        -

        friction

        -

        number

        -

        42

        -

        -

        下拉摩擦系数,取值范围:0-100,数值越大refresh组件跟手性高,数值越小refresh跟手性低。

        -
        说明:

        仅手机、平板和智能穿戴设备支持。

        -
        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        background-color

        -

        <color>

        -

        white

        -

        -

        用于设置刷新组件的背景颜色。

        -

        progress-color

        -

        <color>

        -

        black

        -

        -

        用于设置刷新组件的loading颜色。

        -
        - -## 事件 + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| offset | <length> | - | 否 | 刷新组件静止时距离父组件顶部的距离。 | +| refreshing | boolean | false | 否 | 用于标识刷新组件当前是否正在刷新。 | +| type | string | auto | 否 | 设置组件刷新时的动效。两个可选值,不支持动态修改。
        - auto: 默认效果,列表界面拉到顶后,列表不移动,下拉后有转圈弹出。
        - pulldown: 列表界面拉到顶后,可以继续往下滑动一段距离触发刷新,刷新完成后有回弹效果(如果子组件含有list,防止下拉效果冲突,需将list的scrolleffect设置为no)。 | +| lasttime | boolean | false | 否 | 是否显示上次更新时间,字符串格式为:“上次更新时间:XXXX ”,XXXX 按照时间日期显示规范显示,不可动态修改(建议type为pulldown时使用,固定距离位于内容下拉区域底部,使用时注意offset属性设置,防止出现重叠)。 | +| timeoffset6+ | <length> | - | 否 | 设置更新时间距离父组件顶部的距离。 | +| friction | number | 42 | 否 | 下拉摩擦系数,取值范围:0-100,数值越大refresh组件跟手性高,数值越小refresh跟手性低。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| background-color | <color> | white
        | 否 | 用于设置刷新组件的背景颜色。 | +| progress-color | <color> | black
        | 否 | 用于设置刷新组件的loading颜色。 | + + +## 事件 仅支持如下事件: - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        refresh

        -

        { refreshing: refreshingValue }

        -

        下拉刷新状态变化时触发。可能值:

        -
        • false:当前处于下拉刷新过程中。
        • true:当前未处于下拉刷新过程中。
        -

        pulldown

        -

        { state: string }

        -

        下拉开始和松手时触发。可能值:

        -
        • start:表示开始下拉。
        • end:表示结束下拉。
        -
        - -## 方法 - -不支持[通用方法](js-components-common-methods.md)。 - -## 示例 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| refresh | { refreshing: refreshingValue } | 下拉刷新状态变化时触发。可能值:
        - false:当前处于下拉刷新过程中。
        - true:当前未处于下拉刷新过程中。 | +| pulldown | { state: string } | 下拉开始和松手时触发。可能值:
        - start:表示开始下拉。
        - end:表示结束下拉。 | + + +## 方法 + +不支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -257,5 +137,4 @@ export default { } ``` -![](figures/zh-cn_image_0000001150719520.gif) - +![zh-cn_image_0000001150719520](figures/zh-cn_image_0000001150719520.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-stack.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-stack.md index efeb410e1f7..7cd91997c65 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-stack.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-stack.md @@ -1,32 +1,40 @@ -# stack +# stack + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持。 -## 属性 -支持[通用属性](js-components-common-attributes.md)。 +## 属性 + +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 + -## 样式 +## 样式 -支持[通用样式](js-components-common-styles.md)。 +支持[通用样式](../arkui-js/js-components-common-styles.md)。 -## 事件 -支持[通用事件](js-components-common-events.md)。 +## 事件 -## 方法 +支持[通用事件](../arkui-js/js-components-common-events.md)。 -支持[通用方法](js-components-common-methods.md)。 +## 方法 -## 示例 +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -68,5 +76,4 @@ } ``` -![](figures/zh-cn_image_0000001127284958.png) - +![zh-cn_image_0000001127284958](figures/zh-cn_image_0000001127284958.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper-item.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper-item.md index be9790a5144..972b8f94f02 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper-item.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper-item.md @@ -1,227 +1,73 @@ -# stepper-item +# stepper-item + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 步骤导航器子组件,作为步骤导航器某一个步骤的内容展示组件。 -## 权限列表 + +## 权限列表 无 -## 子组件 + +## 子组件 支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        label

        -

        Label

        -

        -

        -

        -

        自定义步骤导航器底部步骤提示文本按钮属性,不支持动态修改。如果没有定义该属性,步骤导航器在中文语言环境下,使用“返回”和“下一步”文本按钮,在非中文语言环境下,使用“BACK”和“NEXT”文本按钮。针对第一个步骤,没有回退文本按钮,针对最后一个步骤,下一步文本按钮文本使用“开始”(中文语言)或者“START”(非中文语言)。

        -
        - -**表 1** Label对象定义 - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        prevLabel

        -

        string

        -

        -

        -

        步骤导航器底部回退文本按钮的描述文本。

        -

        nextLabel

        -

        string

        -

        -

        -

        步骤导航器底部下一步文本按钮的描述文本。

        -

        status

        -

        string

        -

        normal

        -

        步骤导航器当前步骤的初始状态,可选值为:

        -
        • normal:正常状态,右侧文本按钮正常显示,可点击进入下一个步骤。
        -
        • disabled:不可用状态,右侧文本按钮灰度显示,不可点击进入下一个步骤。
        -
        • waiting:等待状态,右侧文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。
        -
        - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        color

        -

        <color>

        -

        -

        -

        -

        文本颜色。

        -

        font-size

        -

        <length>

        -

        -

        -

        -

        文本大小。

        -

        allow-scale

        -

        boolean

        -

        true

        -

        -

        文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

        -

        font-style

        -

        string

        -

        normal

        -

        -

        文本字体样式,可选值为:

        -
        • normal: 标准的字体样式;
        • italic: 斜体的字体样式。
        -

        font-weight

        -

        number|string

        -

        normal

        -

        -

        文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。

        -

        text-decoration

        -

        string

        -

        none

        -

        -

        文本修饰,可选值为:

        -
        • underline: 文本下划线修饰。
        • line-through: 穿过文本的修饰线。
        • none: 标准文本。
        -

        font-family

        -

        string

        -

        sans-serif

        -

        -

        字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

        -
        - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 不支持长宽样式,宽和父容器stepper一样,高是父容器stepper减去底部导航按钮的高度。 ->- 不支持posit样式。 - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        appear

        -

        -

        -

        当该步骤出现时触发。

        -

        disappear

        -

        -

        -

        当该步骤消失时触发。

        -
        - -## 方法 - -不支持[通用方法](js-components-common-methods.md)。 - -## 示例 - -详见[stepper示例](js-components-container-stepper.md)。 +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| label | Label | - | 否 | 自定义步骤导航器底部步骤提示文本按钮属性,不支持动态修改。如果没有定义该属性,步骤导航器在中文语言环境下,使用“返回”和“下一步”文本按钮,在非中文语言环境下,使用“BACK”和“NEXT”文本按钮。针对第一个步骤,没有回退文本按钮,针对最后一个步骤,下一步文本按钮文本使用“开始”(中文语言)或者“START”(非中文语言)。 | + +**表1** Label对象定义 + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| prevLabel | string | - | 步骤导航器底部回退文本按钮的描述文本。 | +| nextLabel | string | - | 步骤导航器底部下一步文本按钮的描述文本。 | +| status | string | normal | 步骤导航器当前步骤的初始状态,可选值为:
        - normal:正常状态,右侧文本按钮正常显示,可点击进入下一个步骤。
        - disabled:不可用状态,右侧文本按钮灰度显示,不可点击进入下一个步骤。
        - waiting:等待状态,右侧文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| color | <color> | - | 否 | 文本颜色。 | +| font-size | <length> | - | 否 | 文本大小。 | +| allow-scale | boolean | true | 否 | 文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。 | +| font-style | string | normal | 否 | 文本字体样式,可选值为:
        - normal: 标准的字体样式;
        - italic: 斜体的字体样式。 | +| font-weight | number\|string | normal | 否 | 文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。 | +| text-decoration | string | none | 否 | 文本修饰,可选值为:
        - underline: 文本下划线修饰。
        - line-through: 穿过文本的修饰线。
        - none: 标准文本。 | +| font-family | string | sans-serif | 否 | 字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过[自定义字体](../arkui-js/js-components-common-customizing-font.md)指定的字体,会被选中作为文本的字体。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 不支持长宽样式,宽和父容器stepper一样,高是父容器stepper减去底部导航按钮的高度。 +> +> - 不支持posit样式。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| appear | - | 当该步骤出现时触发。 | +| disappear | - | 当该步骤消失时触发。 | + + +## 方法 + +不支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 + +详见[stepper示例](../arkui-js/js-components-container-stepper.md)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper.md index b41c50933e9..9013c0a9d49 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-stepper.md @@ -1,125 +1,64 @@ -# stepper +# stepper + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 步骤导航器。当完成一个任务需要多个步骤时,可以使用步骤导航器展示当前进展。 -## 权限列表 + +## 权限列表 无 -## 子组件 - -仅支持子组件。 - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->步骤导航器内的步骤顺序按照子组件的顺序进行排序。 - -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        描述

        -

        index

        -

        number

        -

        -

        -

        设置步骤导航器步骤显示第几个stepper-item子组件。

        -
        - -## 样式 - -支持[通用样式](js-components-common-styles.md)。 - ->![](../../public_sys-resources/icon-note.gif) **说明:** ->stepper组件默认占满父容器大小,建议父组件使用应用窗口大小(或者父组件为根节点)来优化体验。 - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        finish

        -

        -

        当步骤导航器最后一个步骤完成时触发该事件。

        -

        skip

        -

        -

        当通过setNextButtonStatus方法设置当前步骤导航器可跳过时,点击右侧跳过按钮触发该事件。

        -

        change

        -

        { prevIndex:prevIndex, index: index}

        -

        当步骤导航器点击左边或者右边文本按钮进行步骤切换时触发该事件,prevIndex表示老步骤的序号,index表示新步骤的序号。

        -

        next

        -

        { index:index, pendingIndex: pendingIndex }

        -

        当用户点击下一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改下一个步骤使用哪个stepper-item子组件。

        -

        back

        -

        { index:index, pendingIndex: pendingIndex }

        -

        当用户点击上一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为Object:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改上一个步骤使用哪个stepper-item子组件。

        -
        - -## 方法 - -除支持[通用方法](js-components-common-methods.md)外,支持如下方法: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        setNextButtonStatus

        -

        { status: string, label: label }

        -

        设置当前步骤导航器下一步文本按钮的状态,参数中status类型为string,可选值为:

        -
        1. normal:正常状态,下一步文本按钮正常显示,可点击进入下一个步骤;
        2. disabled:不可用状态,下一步文本按钮灰度显示,不可点击进入下一个步骤;
        3. waiting:等待状态,下一步文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。
        4. skip:跳过状态,下一步文本按钮显示跳过按钮,点击时会跳过剩下步骤。
        -
        - -## 示例 + +## 子组件 + +仅支持<stepper-item>子组件。 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 步骤导航器内的步骤顺序按照子组件<stepper-item>的顺序进行排序。 + + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 描述 | +| -------- | -------- | -------- | -------- | +| index | number | - | 设置步骤导航器步骤显示第几个stepper-item子组件。 | + + +## 样式 + +支持[通用样式](../arkui-js/js-components-common-styles.md)。 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> stepper组件默认占满父容器大小,建议父组件使用应用窗口大小(或者父组件为根节点)来优化体验。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| finish | 无 | 当步骤导航器最后一个步骤完成时触发该事件。 | +| skip | 无 | 当通过setNextButtonStatus方法设置当前步骤导航器可跳过时,点击右侧跳过按钮触发该事件。 | +| change | { prevIndex:prevIndex, index: index} | 当步骤导航器点击左边或者右边文本按钮进行步骤切换时触发该事件,prevIndex表示老步骤的序号,index表示新步骤的序号。 | +| next | { index:index, pendingIndex: pendingIndex } | 当用户点击下一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改下一个步骤使用哪个stepper-item子组件。 | +| back | { index:index, pendingIndex: pendingIndex } | 当用户点击上一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为Object:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改上一个步骤使用哪个stepper-item子组件。 | + + +## 方法 + +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,支持如下方法: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| setNextButtonStatus | { status: string, label: label } | 设置当前步骤导航器下一步文本按钮的状态,参数中status类型为string,可选值为:
        1. normal:正常状态,下一步文本按钮正常显示,可点击进入下一个步骤;
        2. disabled:不可用状态,下一步文本按钮灰度显示,不可点击进入下一个步骤;
        3. waiting:等待状态,下一步文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。
        4. skip:跳过状态,下一步文本按钮显示跳过按钮,点击时会跳过剩下步骤。 | + + +## 示例 ``` @@ -212,5 +151,4 @@ export default { } ``` -![](figures/Video_2021-03-26_154549.gif) - +![zh-cn_image_0000001127125114](figures/zh-cn_image_0000001127125114.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-swiper.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-swiper.md index cfa71c0ab71..b017870ad79 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-swiper.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-swiper.md @@ -1,318 +1,75 @@ -# swiper +# swiper + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 滑动容器,提供切换子组件显示的能力。 -## 权限列表 +## 权限列表 无 -## 子组件 -支持除之外的子组件。 +## 子组件 + +支持除<list>之外的子组件。 + + +## 属性 -## 属性 +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| index | number | 0 | 否 | 当前在容器中显示的子组件的索引值。 | +| autoplay | boolean | false | 否 | 子组件是否自动播放,自动播放状态下,导航点不可操作5+。 | +| interval | number | 3000 | 否 | 使用自动播放时播放的时间间隔,单位为ms。 | +| indicator | boolean | true | 否 | 是否启用导航点指示器,默认true。 | +| digital5+ | boolean | false | 否 | 是否启用数字导航点,默认为false。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 必须设置indicator时才能生效数字导航点。 | +| indicatordisabled5+ | boolean | false | 否 | 指示器是否禁止用户手势操作,设置为true时,指示器不会响应用户的点击拖拽。 | +| loop | boolean | true | 否 | 是否开启循环滑动。 | +| duration | number | - | 否 | 子组件切换的动画时长。 | +| vertical | boolean | false | 否 | 是否为纵向滑动,纵向滑动时采用纵向的指示器。 | +| cachedsize7+ | number | -1 | 否 | swiper延迟加载时item最少缓存数量。-1表示全部缓存。 | +| scrolleffect7+ | string | spring | 否 | 滑动效果。目前支持如下:
        - spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。
        - fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化
        - none:滑动到边缘后无效果。
          > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
          > 该属性仅在loop属性为false时生效。 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        index

        -

        number

        -

        0

        -

        -

        当前在容器中显示的子组件的索引值。

        -

        autoplay

        -

        boolean

        -

        false

        -

        -

        子组件是否自动播放,自动播放状态下,导航点不可操作5+

        -

        interval

        -

        number

        -

        3000

        -

        -

        使用自动播放时播放的时间间隔,单位为ms。

        -

        indicator

        -

        boolean

        -

        true

        -

        -

        是否启用导航点指示器,默认true。

        -

        digital5+

        -

        boolean

        -

        false

        -

        -

        是否启用数字导航点,默认为false。

        -
        说明:

        必须设置indicator时才能生效数字导航点。

        -
        -

        indicatordisabled5+

        -

        boolean

        -

        false

        -

        -

        指示器是否禁止用户手势操作,设置为true时,指示器不会响应用户的点击拖拽。

        -

        loop

        -

        boolean

        -

        true

        -

        -

        是否开启循环滑动。

        -

        duration

        -

        number

        -

        -

        -

        -

        子组件切换的动画时长。

        -

        vertical

        -

        boolean

        -

        false

        -

        -

        是否为纵向滑动,纵向滑动时采用纵向的指示器。

        -

        cachedsize7+

        -

        number

        -

        -1

        -

        -

        swiper延迟加载时item最少缓存数量。-1表示全部缓存。

        -

        scrolleffect7+

        -

        string

        -

        spring

        -

        -

        滑动效果。目前支持如下:

        -
        • spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。
        • fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化
        • none:滑动到边缘后无效果。
          说明:

          该属性仅在loop属性为false时生效。

          -
          -
        -
        -## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        indicator-color

        -

        <color>

        -

        -

        -

        -

        导航点指示器的填充颜色。

        -

        indicator-selected-color

        -

        <color>

        -

        #ff007dff

        -

        -

        导航点指示器选中的颜色。

        -

        indicator-size

        -

        <length>

        -

        4px

        -

        -

        导航点指示器的直径大小。

        -

        indicator-top|left|right|bottom

        -

        <length> | <percentage>

        -

        -

        -

        -

        导航点指示器在swiper中的相对位置。

        -

        next-margin7+

        -

        <length> | <percentage>

        -

        -

        -

        -

        后边距,用于露出后一项的一小部分。

        -

        previous-margin7+

        -

        <length> | <percentage>

        -

        -

        -

        -

        前边距,用于露出前一项的一小部分。

        -
        +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| indicator-color | <color> | - | 否 | 导航点指示器的填充颜色。 | +| indicator-selected-color | <color> | \#ff007dff | 否 | 导航点指示器选中的颜色。 | +| indicator-size | <length> | 4px | 否 | 导航点指示器的直径大小。 | +| indicator-top\|left\|right\|bottom | <length> \| <percentage> | - | 否 | 导航点指示器在swiper中的相对位置。 | +| next-margin7+ | <length> \| <percentage> | - | 否 | 后边距,用于露出后一项的一小部分。 | +| previous-margin7+ | <length> \| <percentage> | - | 否 | 前边距,用于露出前一项的一小部分。 | -## 事件 -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: +## 事件 - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { index: currentIndex }

        -

        当前显示的组件索引变化时触发该事件。

        -

        rotation

        -

        { value: rotationValue }

        -

        智能穿戴表冠旋转事件触发时的回调。

        -

        animationfinish7+

        -

        -

        -

        动画结束时触发该事件。

        -
        +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: -## 方法 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { index: currentIndex } | 当前显示的组件索引变化时触发该事件。 | +| rotation | { value: rotationValue } | 智能穿戴表冠旋转事件触发时的回调。 | +| animationfinish7+ | - | 动画结束时触发该事件。 | -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: +## 方法 - - - - - - - - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        swipeTo

        -

        { index: number(指定位置) }

        -

        切换到index位置的子组件。

        -

        showNext

        -

        -

        显示下一个子组件。

        -

        showPrevious

        -

        -

        显示上一个子组件。

        -
        +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: -## 示例 +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| swipeTo | { index: number(指定位置) } | 切换到index位置的子组件。 | +| showNext | 无 | 显示下一个子组件。 | +| showPrevious | 无 | 显示上一个子组件。 | + + +## 示例 ``` @@ -397,5 +154,6 @@ export default { } ``` -![](figures/4-0.gif) +![zh-cn_image_0000001167823326](figures/zh-cn_image_0000001167823326.gif) + diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-bar.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-bar.md index 6234c067891..1d3a494dd20 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-bar.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-bar.md @@ -1,59 +1,44 @@ -# tab-bar +# tab-bar -<[tabs](js-components-container-tabs.md)\>的子组件,用来展示tab的标签区,子组件排列方式为横向排列。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -## 权限列表 +<[tabs](../arkui-js/js-components-container-tabs.md)>的子组件,用来展示tab的标签区,子组件排列方式为横向排列。 + +## 权限列表 无 -## 子组件 + +## 子组件 支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| mode | string | scrollable | 否 | 设置组件宽度的可延展性。可选值为:
        - scrollable:子组件宽度为实际设置的宽度,当宽度之和(包括margin边距)大于tab-bar的宽度时,子组件可以横向滑动。
        - fixed:子组件宽度均分tab-bar的宽度。 | + + +## 样式 - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        mode

        -

        string

        -

        scrollable

        -

        -

        设置组件宽度的可延展性。可选值为:

        -
        • scrollable:子组件宽度为实际设置的宽度,当宽度之和(包括margin边距)大于tab-bar的宽度时,子组件可以横向滑动。
        • fixed:子组件宽度均分tab-bar的宽度。
        -
        +支持[通用样式](../arkui-js/js-components-common-styles.md)。 -## 样式 -支持[通用样式](js-components-common-styles.md)。 +## 事件 -## 事件 +支持[通用事件](../arkui-js/js-components-common-events.md)。 -支持[通用事件](js-components-common-events.md)。 -## 方法 +## 方法 -支持[通用方法](js-components-common-methods.md)。 +支持[通用方法](../arkui-js/js-components-common-methods.md)。 -## 示例 -详见[tabs示例](js-components-container-tabs.md#section14993155318710)。 +## 示例 +详见[tabs示例](../arkui-js/js-components-container-tabs.md#示例)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-content.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-content.md index 0fc30eb91f1..fe4a72df6b7 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-content.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-tab-content.md @@ -1,54 +1,39 @@ -# tab-content +# tab-content -<[tabs](js-components-container-tabs.md)\>的子组件,用来展示tab的内容区,高度默认充满tabs剩余空间,子组件排列方式为横向排列,当作为容器组件的子元素时在主轴方向需要设置tab-content的确定长度,否则无法显示。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -## 权限列表 +<[tabs](../arkui-js/js-components-container-tabs.md)>的子组件,用来展示tab的内容区,高度默认充满tabs剩余空间,子组件排列方式为横向排列,当作为容器组件的子元素时在主轴方向需要设置tab-content的确定长度,否则无法显示。 + +## 权限列表 无 -## 子组件 + +## 子组件 支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| scrollable | boolean | true | 否 | 是否可以通过左右滑动进行页面切换。默认为true,设置为false后,页面的切换只能通过tab-bar的点击实现。 | + - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        scrollable

        -

        boolean

        -

        true

        -

        -

        是否可以通过左右滑动进行页面切换。默认为true,设置为false后,页面的切换只能通过tab-bar的点击实现。

        -
        +## 样式 -## 样式 +支持[通用样式](../arkui-js/js-components-common-styles.md)。 -支持[通用样式](js-components-common-styles.md)。 -## 事件 +## 事件 -支持[通用事件](js-components-common-events.md)。 +支持[通用事件](../arkui-js/js-components-common-events.md)。 -## 示例 -详见[tabs示例](js-components-container-tabs.md#section14993155318710)。 +## 示例 +详见[tabs示例](../arkui-js/js-components-container-tabs.md#示例)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container-tabs.md b/zh-cn/application-dev/reference/arkui-js/js-components-container-tabs.md index 73d2d2daaaf..93ce100f898 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container-tabs.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container-tabs.md @@ -1,86 +1,45 @@ -# tabs +# tabs + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 tab页签容器。 -## 权限列表 +## 权限列表 无 -## 子组件 - -仅支持最多一个<[tab-bar](js-components-container-tab-bar.md)\>和最多一个<[tab-content](js-components-container-tab-content.md)\>。 - -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: - - - - - - - - - - - - - - - - - - - - - -

        名称

        -

        类型

        -

        默认值

        -

        必填

        -

        描述

        -

        index

        -

        number

        -

        0

        -

        -

        当前处于激活态的tab索引。

        -

        vertical

        -

        boolean

        -

        false

        -

        -

        是否为纵向的tab,默认为false,可选值为:

        -
        • false:tabbar和tabcontent上下排列。
        • true:tabbar和tabcontent左右排列。
        -
        - -## 样式 - -支持[通用样式](js-components-common-styles.md)。 - -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - -

        名称

        -

        参数

        -

        描述

        -

        change

        -

        { index: indexValue }

        -

        tab页签切换后触发。

        -
        说明:

        动态修改index值不会触发该回调。

        -
        -
        - -## 示例 + +## 子组件 + +仅支持最多一个<[tab-bar](../arkui-js/js-components-container-tab-bar.md)>和最多一个<[tab-content](../arkui-js/js-components-container-tab-content.md)>。 + + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| index | number | 0 | 否 | 当前处于激活态的tab索引。 | +| vertical | boolean | false | 否 | 是否为纵向的tab,默认为false,可选值为:
        - false:tabbar和tabcontent上下排列。
        - true:tabbar和tabcontent左右排列。 | + + +## 样式 + +支持[通用样式](../arkui-js/js-components-common-styles.md)。 + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| change | { index: indexValue } | tab页签切换后触发。
        > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
        > 动态修改index值不会触发该回调。 | + + +## 示例 ``` @@ -149,5 +108,4 @@ export default { } ``` -![](figures/tab.gif) - +![zh-cn_image_0000001127125116](figures/zh-cn_image_0000001127125116.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-container.md b/zh-cn/application-dev/reference/arkui-js/js-components-container.md index 99afacd5084..b3a1fada257 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-container.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-container.md @@ -1,37 +1,37 @@ -# 容器组件 +# 容器组件 -- **[badge](js-components-container-badge.md)** -- **[dialog](js-components-container-dialog.md)** -- **[div](js-components-container-div.md)** +- **[badge](js-components-container-badge.md)** -- **[form](js-components-container-form.md)** +- **[dialog](js-components-container-dialog.md)** -- **[list](js-components-container-list.md)** +- **[div](js-components-container-div.md)** -- **[list-item](js-components-container-list-item.md)** +- **[form](js-components-container-form.md)** -- **[list-item-group](js-components-container-list-item-group.md)** +- **[list](js-components-container-list.md)** -- **[panel](js-components-container-panel.md)** +- **[list-item](js-components-container-list-item.md)** -- **[popup](js-components-container-popup.md)** +- **[list-item-group](js-components-container-list-item-group.md)** -- **[refresh](js-components-container-refresh.md)** +- **[panel](js-components-container-panel.md)** -- **[stack](js-components-container-stack.md)** +- **[popup](js-components-container-popup.md)** -- **[stepper](js-components-container-stepper.md)** +- **[refresh](js-components-container-refresh.md)** -- **[stepper-item](js-components-container-stepper-item.md)** +- **[stack](js-components-container-stack.md)** -- **[swiper](js-components-container-swiper.md)** +- **[stepper](js-components-container-stepper.md)** -- **[tabs](js-components-container-tabs.md)** +- **[stepper-item](js-components-container-stepper-item.md)** -- **[tab-bar](js-components-container-tab-bar.md)** +- **[swiper](js-components-container-swiper.md)** -- **[tab-content](js-components-container-tab-content.md)** +- **[tabs](js-components-container-tabs.md)** +- **[tab-bar](js-components-container-tab-bar.md)** +- **[tab-content](js-components-container-tab-content.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-custom-basic-usage.md b/zh-cn/application-dev/reference/arkui-js/js-components-custom-basic-usage.md index 8ac685f138c..1d70ef0cf76 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-custom-basic-usage.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-custom-basic-usage.md @@ -1,7 +1,6 @@ -# 基本用法 +# 基本用法 自定义组件是用户根据业务需求,将已有的组件组合,封装成的新组件,可以在工程中多次调用,从而提高代码的可读性。自定义组件通过element引入到宿主页面,使用方法如下: - ```
        @@ -9,8 +8,8 @@
        ``` -结合if-else使用自定义组件的示例: +结合if-else使用自定义组件的示例: ``` @@ -20,45 +19,17 @@
        ``` -- name属性指自定义组件名称\(非必填\),组件名称对大小写不敏感,默认使用小写。src属性指自定义组件hml文件路径\(必填\),若没有设置name属性,则默认使用hml文件名作为组件名。 -- 事件绑定:自定义组件中绑定子组件事件使用\(on|@\)child1语法,子组件中通过this.$emit\('child1', \{ params: '传递参数' \}\)触发事件并进行传值,父组件执行bindParentVmMethod方法并接收子组件传递的参数。 - - >![](../../public_sys-resources/icon-note.gif) **说明:** - >子组件中使用驼峰命名法命名的事件,在父组件中绑定时需要使用短横线分隔命名形式,例如:@children-event表示绑定子组件的childrenEvent事件,如 @children-event="bindParentVmMethod"。 +- name属性指自定义组件名称(非必填),组件名称对大小写不敏感,默认使用小写。src属性指自定义组件hml文件路径(必填),若没有设置name属性,则默认使用hml文件名作为组件名。 -**表 1** 对象 +- 事件绑定:自定义组件中绑定子组件事件使用(on|@)child1语法,子组件中通过this.$emit('child1', { params: '传递参数' })触发事件并进行传值,父组件执行bindParentVmMethod方法并接收子组件传递的参数。 + > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** + > 子组件中使用驼峰命名法命名的事件,在父组件中绑定时需要使用短横线分隔命名形式,例如:\@children-event表示绑定子组件的childrenEvent事件,如 \@children-event="bindParentVmMethod"。 - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        描述

        -

        data

        -

        Object/Function

        -

        页面的数据模型,类型是对象或者函数,如果类型是函数,返回值必须是对象。属性名不能以$或_开头,不要使用保留字for, if, show, tid。

        -

        data与private和public不能重合使用。(Rich)

        -

        props

        -

        Array/Object

        -

        props用于组件之间的通信,可以通过<tag xxxx='value'>方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for, if, show, tid。目前props的数据类型不支持Function。

        -

        computed

        -

        Object

        -

        计算属性,用于在读取或设置时,进行预先处理,其结果会被缓存。计算属性名不能以$或_开头,不要使用保留字。

        -
        +**表1** 对象 +| 属性 | 类型 | 描述 | +| -------- | -------- | -------- | +| data | Object/Function | 页面的数据模型,类型是对象或者函数,如果类型是函数,返回值必须是对象。属性名不能以$或_开头,不要使用保留字for, if, show, tid。
        data与private和public不能重合使用。(Rich) | +| props | Array/Object | props用于组件之间的通信,可以通过<tag xxxx='value'>方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for, if, show, tid。目前props的数据类型不支持Function。 | +| computed | Object | 计算属性,用于在读取或设置时,进行预先处理,其结果会被缓存。计算属性名不能以$或_开头,不要使用保留字。 | diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-custom-event-parameter.md b/zh-cn/application-dev/reference/arkui-js/js-components-custom-event-parameter.md index 2d90c7f8884..2127b2ab202 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-custom-event-parameter.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-custom-event-parameter.md @@ -1,7 +1,8 @@ -# 事件参数 +# 事件参数 子组件也可以通过绑定的事件向上传递参数,在自定义事件上添加传递参数的示例如下: + ```
        @@ -10,6 +11,7 @@
        ``` + ``` // comp.js export default { @@ -20,8 +22,10 @@ export default { } ``` + 子组件向上传递参数text,父组件接收时通过e.detail来获取参数: + ```
        @@ -30,6 +34,7 @@ export default {
        ``` + ``` // xxx.js export default { @@ -41,4 +46,3 @@ export default { }, } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-custom-events.md b/zh-cn/application-dev/reference/arkui-js/js-components-custom-events.md index 37859f0bdc8..1f717b06caf 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-custom-events.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-custom-events.md @@ -1,7 +1,8 @@ -# 自定义事件 +# 自定义事件 子组件comp定义如下: + ```
        @@ -10,6 +11,7 @@
        ``` + ``` /* comp.css */ .item { @@ -26,6 +28,7 @@ } ``` + ``` // comp.js export default { @@ -39,8 +42,10 @@ export default { } ``` + 引入子组件的示例如下: + ``` @@ -49,6 +54,7 @@ export default {
        ``` + ``` /* xxx.css */ .container { @@ -59,10 +65,10 @@ export default { } ``` + ``` // xxx.js export default { textClicked () {}, } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-custom-lifecycle.md b/zh-cn/application-dev/reference/arkui-js/js-components-custom-lifecycle.md index e4f6ad79419..959fa1d089e 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-custom-lifecycle.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-custom-lifecycle.md @@ -1,87 +1,24 @@ -# 生命周期定义 +# 生命周期定义 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API Version 5 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 我们为自定义组件提供了一系列生命周期回调方法,便于开发者管理自定义组件的内部逻辑。生命周期主要包括:onInit,onAttached,onDetached,onLayoutReady,onDestroy,onPageShow和onPageHide。下面我们依次介绍一下各个生命周期回调的时机。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        属性

        -

        类型

        -

        描述

        -

        触发时机

        -

        onInit

        -

        Function

        -

        初始化自定义组件

        -

        自定义组件初始化生命周期回调,当自定义组件创建时,触发该回调,主要用于自定义组件中必须使用的数据初始化,该回调只会触发一次调用。

        -

        onAttached

        -

        Function

        -

        自定义组件装载

        -

        自定义组件被创建后,加入到Page组件树时,触发该回调,该回调触发时,表示组件将被进行显示,该生命周期可用于初始化显示相关数据,通常用于加载图片资源、开始执行动画等场景。

        -

        onLayoutReady

        -

        Function

        -

        自定义组件布局完成

        -

        自定义组件插入Page组件树后,将会对自定义组件进行布局计算,调整其内容元素尺寸与位置,当布局计算结束后触发该回调。

        -

        onDetached

        -

        Function

        -

        自定义组件摘除

        -

        自定义组件摘除时,触发该回调,常用于停止动画或异步逻辑停止执行的场景。

        -

        onDestroy

        -

        Function

        -

        自定义组件销毁

        -

        自定义组件销毁时,触发该回调,常用于资源释放。

        -

        onPageShow

        -

        Function

        -

        自定义组件Page显示

        -

        自定义组件所在Page显示后,触发该回调。

        -

        onPageHide

        -

        Function

        -

        自定义组件Page隐藏

        -

        自定义组件所在Page隐藏后,触发该回调。

        -
        -## 示例 +| 属性 | 类型 | 描述 | 触发时机 | +| -------- | -------- | -------- | -------- | +| onInit | Function | 初始化自定义组件 | 自定义组件初始化生命周期回调,当自定义组件创建时,触发该回调,主要用于自定义组件中必须使用的数据初始化,该回调只会触发一次调用。 | +| onAttached | Function | 自定义组件装载 | 自定义组件被创建后,加入到Page组件树时,触发该回调,该回调触发时,表示组件将被进行显示,该生命周期可用于初始化显示相关数据,通常用于加载图片资源、开始执行动画等场景。 | +| onLayoutReady | Function | 自定义组件布局完成 | 自定义组件插入Page组件树后,将会对自定义组件进行布局计算,调整其内容元素尺寸与位置,当布局计算结束后触发该回调。 | +| onDetached | Function | 自定义组件摘除 | 自定义组件摘除时,触发该回调,常用于停止动画或异步逻辑停止执行的场景。 | +| onDestroy | Function | 自定义组件销毁 | 自定义组件销毁时,触发该回调,常用于资源释放。 | +| onPageShow | Function | 自定义组件Page显示 | 自定义组件所在Page显示后,触发该回调。 | +| onPageHide | Function | 自定义组件Page隐藏 | 自定义组件所在Page隐藏后,触发该回调。 | + + +## 示例 ``` @@ -113,4 +50,3 @@ export default { } } ``` - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-custom-props.md b/zh-cn/application-dev/reference/arkui-js/js-components-custom-props.md index 6e48255e0e2..c92c4399ead 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-custom-props.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-custom-props.md @@ -1,6 +1,7 @@ -# Props +# Props + +自定义组件可以通过props声明属性,父组件通过设置属性向子组件传递参数,props支持类型包括:String,Number,Boolean,Array,Object,Function。camelCase (驼峰命名法) 的 prop 名,在外部父组件传递参数时需要使用 kebab-case (短横线分隔命名) 形式,即当属性compProp在父组件引用时需要转换为comp-prop。给自定义组件添加props,通过父组件向下传递参数的示例如下: -自定义组件可以通过props声明属性,父组件通过设置属性向子组件传递参数,props支持类型包括:String,Number,Boolean,Array,Object,Function。camelCase \(驼峰命名法\) 的 prop 名,在外部父组件传递参数时需要使用 kebab-case \(短横线分隔命名\) 形式,即当属性compProp在父组件引用时需要转换为comp-prop。给自定义组件添加props,通过父组件向下传递参数的示例如下: ``` @@ -9,6 +10,7 @@

        ?bM$CcIt-0I=;edS$k@E<} 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�hi}%jz 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 z zaY;~1z~QBx4R-{ToHzH=a?m6C*7xS|M=Vo|AavAPR`KRZeuCGqT|KYqlDpXHU63GX} zG>(_&Ii64*jqTdl)4!$hQ#FtSWz7p1!|M64t@sy6i_N1D&`OH#Ux7loi zXo6w>4+-!`?VNW|zFqg>tp%sM`Zf2&my*Z#8!40_syHxeCfAa3z^YR0<#~m^!wR5K zz2MzCI%3_@VbS_Vg9r!K^^1mjq-oa2bQ^IED=BryULx$HMvd8~2KveE>MeSQo&oV} z(`GSy_+1dq|2%yb9C*BlqD=QTK*Z}eAD44mYcA%;)rtG~Z%I>u5pT0t)v?HiU!`ZS zFF(tu*;w4}#eWoAJYxv%$;F9)$UVskSsx1w8EbamM2s(EfTMe zV*1`&J0@Uy{*f)3pWd(iP#-pRr-?x*=SMH!SVx>%bnhFQoDJK5ohU57nVOR4Sl<;5 z6KpQ|okv|Ao_e^a&b-k_g&H-zNj9xO@Ya5RhYlX31J-FL>*r9A#9`e zY&Le1jiCM5to^-iht99m*pKvs|3}rm$20lH{{z489c*KmIgQYq&q8tv&G}rD^C8VK zB8`Nkx;KaB*qjd`B&X1jW7M3ALI?@8zvQe&4^o-#_=~9((M%?(4qZuh+At z(ErT-vAXb`7*1i)gQ;gZ=1@k)kK5aEvz}dldaaSB1BsU0?W=Jfal8hz5c6EqTO?Z38mq5WbxYKz^hsuW;+E|x6rW9*%iEOyJ@m} zCz6CtU=|`){(exZdTf_w;`!4(a)23^QLIC3FW7s2;-Sp7CVd}O~lX7IC@-L#Hx~kj0J{?rPd^G?-xRVVqXvkN}4fnp@YEzu4c?uj$tHP|X`HPymh>c(7 z#%G#sr|~UK3(nm~Pk*CA2nf48B@hu)L*24Kl^jM%sqNeqFtySAu5ej(g5$S4Vf{|h zVm^5Dr<|5T4x2xRy?QcmTnl>FdC_|qBRg}_ndHJhqH*{t&TFK;aq5=eCJ?363O*PdP zWrXg2-Isb-6FAxEa2vVF6c|Z-^i6@q8)sM97n){luli8k!HP;=Q=O_gxhgZHg!o`4 z_WHU=UFHfKlf!;5)AlYyaIKQ8ZG0K!UVE$jorb3+sXto!`^3R~0LD9ZdTpj+8l2mx7W~K7F3TB)(byx=SAwY*fcR=C^wV zk0=Q|7j`P2FyVVwFcO{mC(SOR>y=WEVv)#$ryp=U6>Ll(^-k#aJa7E~;RAqxmwzS2 z@7QNDFlNj(?%`p#GBkh+fOZJ66S-n7O!ufAir=y3j&bu!>3*YLk&8!r?6%^>k}74Sa8!#k^!A zN41iZ<%K}Xr`R{@!Bc~Bgh5$Z-G55$pIYg!+?vg5Y({sR5CN5+z6|m3I6)we0|*d> z4+!k~gdLf6RQOj9I#Di%&5Fmq^{jP)*|UF0hJN{=J+O0PeIooEfhQs~JTH&FH1rn1 z4=8n|D3vJzIc(`5R{*(<#-3PBt0{gp40qzF>5v3l@nFwK`C?d1mhu=~BXumVH835< z!x6P)Xo}+jLO>FM!%Kjk#p+nrWMA`Rq!DKFUp1yCyfIB(o3;6=&MExAUA9xK&)#5S5E{ai>m=!ta17t^qD z_3SmwYeo)zx?Vx6iCCw6weVJy;UKCO=R&ajo3+;Hda*Tb|uh@C{^GqSNmu_o_G0Ov+Bx-%flK`CH@g#AmxS> zw@OZWDmfkN&REaM7`tCECe=|SNqNY9M=Qh8xkwh|PF7_U9AV{JJeB_*h9ToQUcp-R zdJmq}t%)5gfKh;ho!i!)fLB$h=@iShG&KzEVrmY2bF%J~JS#B}QbMI5S6ZHHxxy}h zJQkun9vo}jd+g=$b+r#@t)`=@L{Mzr#brES=B&p#hRYqEKMRL5St_dxrB<@2k_rS* zao0BDeE9b^qW$g3)=;GK+~BSg5mD30V#D@PJ{+ldFRPvo24?#5iK5bMEAkF}S-^ON z7w#IzxGZmCL%!K!0K^9he(jrt60K$JfbfU;=Ngiwwrg; z`R4oSwgWQGH1I9Tzmw7tXQ%EFao%ly_AT&P!0(M^O`1s1`I=7NnZ67qfe?l=OBfi^ zNAPfXTfe9RZ1gS*;9J`E@+bRR9#4=oUW&`^OfzO~eiXz-X^>>xWJp7|>qW7hN2kGt=jH037=MA#I!2gLJ&{2Qiz13S*=7 zfy3dbGd)fo?r-lEJw!N>c<8d&`y{MCiSIU`G(N;$r=or|>ZTxTEv=XHu1g z-yINk_#t2uAM45Szm$o~7RgKz2r^9vh=`%@+{sO^e5wbsD$Km9s7^oVR<`M! ze8MgW@My%P74fFFH7KXdgEAU)1or})gl?&oU< zWY%acuL{FI9yojLdxB0OoYx>AO8os&I{ZHWCBx=;&&6Zeo?jM{fiq9`S@)1jH8W%L zJty6=B)wbvHPcl&*7kGO*XiIJ68{_t>qbG`2Y~w&Yy(NuNeuo+%%wfhrRUvOht#9@ zI<+VOtdfHL1E4k7h!2NdhF~_2Nkv=@LSZ|u^sM)l?wkW&5l`LiUOSbVbHa9)PtE*` z4+j&VOg9>al4C^4={_}8GM|r_r5!Rnvxoxwczc@{(UEeh<*G|U$*kji zt9q9c2S@;5O#~3nVTvLF52C;v07OE9zli(*ksqIk`o{S+Z=Ru_=5#INU z?{4DxbClrg#!aA4=8S|=Lp;*|wpOfAO($LMm{_QaWYF1d%q~FTH6(c%RwZ4NEH+R9 zVLp8AK*;;U+Cs%OK7G_)(V&jR^2TR=${8uh*VcxjGa2{o&RL{Nf3Y`h?2OV&bKT|0R`R4 zYJE2XU}4gG>aMw*I1_*Fk#q9+yqjTrgL+Z23nA=)!5wXE;`JZQW3iq5emxQZ4?*ml zRAinY8x3&y9PZ=d4)P`b{&Nur`Uw1+HRd1TV0T$ivQ0VPreJ;l&@(BhH(&_Bb=O2R z;<%TCIr=xQ6ah}`R=~MwU=Mtoge6x$l93O&^0L#jBqe|6eihT z)m)DB7{z@#f9$}{mB-|BZ{_A01;E{J*3Mn5w?)nT<(=zSn!69oqvspfyPVs8@J(^B zcez>0gU!Q3AnS?xzX;?kw*?<^vomQbZj2-ATbkI(-J*k{nM+{E>3?&+Jr%cJ}saA6$>KvHk*IHKKKW?Y{Z#8#7$CCV3j{aMHC5B ziP~Fo8cPy6126BnmmFR8R*u`W%`7T;x?E$#X?;uQZ6INTNm&e@fXij^-qMNWt2O>9 zU{q;Zz+Bq6^yJMme8tC(o7%Mu(ow8J-tV#Pp!b&fhp#99%D^c#c`@E#X^Z5$vFO5tltq-w6hsqXEU z=6uEC#X`*y_=9a1ifVR=W^3;OB`yDt`!2%Xu(H;@BJvaRdNojA<<)#Xd~}zoxKk-G zExGbm4%7$u?oxP5D7?X>)A43}SlY9Kf#D~9$DhaZYDK6s5+3K8wH>~N$XR?8G2U}Y z#HMHqSSc1{NubKjux8x!Au;lY(a^oXv6t#G>%@$Y(*l)jp+E>b%lDu2Xb&6`jHHO| z0O(f_j}7l67aN#Z6F=^|`@4~d8G5iTEgG5g^?uu#wD6LzuXUFi4OX5ch4D%OOMp@& zP;pLLNpi1^5F1^^;Q{1w_+`;Ju4bD$#R~vZ+LST&DlY{KYA2v6m-p(p0t$dOvQs_r-=aH zyaG2Bj>r|1j#>LjsH-W#0ZUb%@c;l4v=Ms5X_6AuEw<&umM@kq93bUwO{nir;Rd1w z&|MS-o#7E1qV~l|1Urr2Mt{4ZAB5H>JR4wXXv#@zgm)xBq&?g(0+_53y=3JkXrl3C zQ}0~1`6xq3S|h1_JtHbpT@57X-w3eJQ`o0V!2pSm9>)aCjo1^FkOCqQL!ykMG7CR4 z6pR^XaRAFeyaE9Tv8Y$phNYl`KsF-ny+je-oGy3Ci3wny&42ZX6A9aWFpU;C`stZJ z?x?LS5R|3O1E@7nWiJOsa;ru6G;yC00j5b%BB1{Y_~7v-{;JlyZL1$)pc(`>TrWjDH9M( z9oeW9ioH#<)xe4L4hhR)C1zU0y!HG9`iw|$MYJ|_(m_t5mhHgP>lT^%*~1EeBN%KZ z_kb7yiUiV7VcM;<*wHr+_PGrS%8J6W<=QS3LM`+JJLVTW{xt*B|GERgq;$S7mbSuMMiG z<_eQvZbaw4$f=Z3re&VxT&2NBm;mSlkRfEC6q_b5BEmG6P~yCk?-Lyr zCH+Do++CK>{~QE-kDaObx3Kx&e`o(;`{VOAdUMKERWGE)=+J=IcA}EKoPYpJ-Nyp6 zz+g$i#+iX|#v2|c9H4-LYIdpS8TzR@k*h@ezI0IUfPT3GC-GzeATY*e3ck}a!6cAQ zE)gqnJr9T%riVl#ai}yj$m>dmODqjRJP4vbusysNHVrA8tP1*25mRe;akd^M6Omx? zd&L%|nY|$wxw@P0+qVFnl(5Q{50~e$%}dt5*vkEx1VB>@+x!s)25&P?n7|bSHU@Fk zL-;pR%)wQab_I>$K>?2^X~%VH897uzIJLcMaXbgWya9lJ%>A$=07xz2dak5l#G*O& z0%p)9&6By`i6$^xJtERhW-91cMMwZ_RMN%)p@~2cnho^tQUL@KK4qRHS(}Rx>yNkO zf=Vm_Y$ewmp^!|YVjlto1NN@>c8>1&r0uJQ@eHSF(0eS)y6W~GD@i<{wEx*b3ETq> zk~x24gCwku{qU-va>c>+@rz;fW&~i4kP1^l$*^gE`?)2(a+xl%gbIw-gen1Y__I6G zbwKaK=ZhYX*8CiP74_gqwY~}GC(QAmW5Ve@{ncs-Y)ZVp z6%v&-l!^PpDO}BcW>+;k$xYX35lPcxyJgm-zwVk|h~|B*n=)8AitbV%hKKOkD@}#i z4nUzt_&>X%N?eUG%J$b{UZZM1?cmgNyHS#?Pm9$S(0s-L)o`7DgiZid;;T=h5Fa#1>1=LcIGJ2a!O>e>6VJoJFKx^bfG0N(GE z%hTUexYOZ^0wsX|+V=c@4rQ>cj}Lf960+IZ|FgwX&Y-SWXWF?}aA5jep|L>5Y4 z6l7Gp;u2n-)=KX5`3LdoXqtAk-IL)DT=WR#s}K&Ua56`G3Q*b=Q~$> z@s%7zYqGxh@X+-4$MlLNQF(c~%u>dPsS=w8e30YmO&IDf<&J@GlX!S)ttSqAT0-<2 zis&D@J)B1CP?!A$7{_~E-?TsJ8|Uq$=YMK+KJV3j<+p2*fp_F|ECC{=dGZZu|ASKn zxqdH_k6*bx6LLzU-T2_kC}rthi}LSMbx)RGJpCRTn;~_wKnglR`MZTpDzV=CkImF) zRAY5jg?UF|P>98b^3U{fMAT8g%QZ13{dVk~g|bLt(z~g>1wz;^H2qkVP}}6$cR*F? zB=to8vTj`TL|}Vf*o(rMiR#05pO>7@?e9`BfA43xF&0$U9=AIX7nRuSxO{b`WWvbh zs6C553RiiT>OU8qkm}?hty)A+6{VS`Y1Gk+{S&yl#k*R(fgUEK72<-aorJ$-D?EBs!(bi)5#i`~q_!+J{JZh=owAdyV?A>pcNBd77`A`xxK5S?G^I%WWf$9?Y~s4 z5ZoT}Nm;lqK2asj+R#!7*LCTHt)CRU2l zaKKMqcy!~$9kj}Dg3V~jq5CC=whfd93-^;_kdM*Xk9%MmixM0Kap(5K3d6c(Lx$CK zHONYorjSFklKyW;qFPRvFB+xI!u^+kQfKGfmc8;ZL5+rhe^j}mOA~sGR($y-vk%SG zb%9ZInJ{mm(W6XMDHA@<)Sh7?$C>-gHI7?o@SkIrx$Qq^&J>f#1%FE5dYJ+kg5bH_ zeV>>Z31M_;uFQCz=4ReLOulAgo{oKfNlc!)cfL_$J|K~+!gc4s|Lt7}10dM_f4qzO z7o0ci>zj8vZ;TChc6Ie|`HL}jOJULfColTj%Q(+p_1zif8W&vqqU&ZMm%sq9yW^h>yE{MSuF#i7i z$HgwVJ_eV?;Nlfr7Nf1DV}9-tAAZm5#28n-h>uHXtSwU2BH0+Lb~U8uK0tfBFNpexxJg~T_`Il`MBC1v~ayy!%&nGH8geM${5V-LN16= zQPHlhbI`-Xb9Sg%K$MuDmBzI-4rnNpWS)7>SyGjke7F6HAk5c(YeZ99tF(}jQC-E= zHt<-~%MbOd&$rtvFL2!q8R8y&eFJV5NKa*tjtt>!L`Y3}QCzs2k+#&tOm}Rs<4|{o zt*zbMK=;+ElxoJQBV=1Hj=_~NI)ZKBL5;(8^K*Unj_z~w*$HRDKX1Ns zIi$V3(dcTe;bNwCXSVA>ZDtshI$B-8Zv%#(4nNNT*5 zt~5UmYiVMU92NXzzM*39Dvlqwu{h8@*4cI=v8iVy=9p!2q(@#)c5LbG!rIb`{79~+ z(KR~9XwKkL6}5fSP9DLs(z0B0!`DBCi)(Cbj-6+eTpz5+Y|Pgn3eY2*99`UHymxUzIBE;&A zpOlFG>^P%Nb zEa=V(M@b+e3ulQ{^Xnp<7SM^4#s8~@5Eu5&dRpxT8tCTfA(&V>U>2ir45u0RbvnJ-g|H z-8+Hju2Ey#=2&3teu>R*oucCm>!hP2moKn)YARsW^+A=19~yEip%0s{Z6!?r1v^t1 zyCQeS9--z~qsoykhEKdPG=Ty-@H1$GckHLtgBp=BB0bg*iIfRVJI|=rUXwvC>5Dyg<7_K52Zn3#K8a|AZ2G<-!JKb z$F2UjdUfELjz*;ILN+3-jemc+%V@kQ(51|Q`6i&s19tS#Ra+EB ze5G6)x0E=MbZzp-T=9rJsY;lMfnPEYI1!`QME^ z8hI>IRLccK=7kMf@k~tXtX@(%zUWnu`|*6pJuA3IjmCd2E#|1l4lOD}m@@2N_F30?gvKAkx zF8FVjjJ}uglaI=Hh{$EfR~^dy_WIhD|JIq>MU;g$e&lbK-H6&jnWZoHa^l{}sYcY= zVlZDA}4r4*Nr&4ucZ{C*58dEKw%CJaaM5wZx78 znH^^{;EJ3f7i?RK;+O?bLis3v(%A}%&c+2`@tS4a8_Vpm(+Z0)A$*#RqQZib!B3jR ze}Q5|7xOgT4ooGl74EiX=oOvm-*Trlf_(6mcB2~!y=WG5bYGFm-Xb~7fBk@RLxRNnE>MdGF!e@eL7%Mv_ zb;Zt*s0cgh7$crNfx@9%spm3v-)vukg6PW&H1KcGy-U+&N^jl07<#iHv(%B`F+DE4YZBk zIX*;1xzvPir^`z1c;40UDqg?qQ=u9(Aty$o-|Jt%on74k@WQA%7r79r+_q97VKk0h zkR%VmD5?*TZ2VSn{hm!#w5DA}aQ)5cTuR*GssS+`#p@#v5iPQ{@0GmVNwNxhHG+=Q z4sxLfm-`k9lzab1cp>uWBGW(ADXSTt>>(tLT3ye#*m#8J{K_${0K~-Ef~WUwp7V4E zn^~9a5pjd`RB1#mapN25p^tm<=e_-iFZx`eI2||ENuF*CCqsM%zY|}MVjFH{z2^)1 z!@Hqw`tvk5_vg3Ht2gj0w~2oJEk~}SHtw7GAj*H6@Bs2aCUj)+VoPozP8P`KRuAGI z9(^ME196`(T?g3m4f@-)I6=9q1N^%4>fYzuyUIQiyaA~XMHrra12sX~;(s`@LT975!OA0jU!ovrokc|Mpl?DqOf#_f%u+ zzklDl?;jgG>Ln3uvQHs0@r6*9neL(7m5owomD}A-TWZV9A2rXLUKDnR@9|Zk!7C5D z)XGm5zFa}vD}RAGEQx=QFYoP+)bAu004HF3;xO2-lAA%t#=L)cGiB|MUWnmOwFvea z)?p9<6}SEWOhWyRBubz&xI=E*0neseG4(`szq!S9TCl{lJ&WH-ilLjy3$z=$pB6myA%5_OfZxIFFw4w%2RK>_bmpDkD|J zy4bskYrZG77D$LD$vvC+nJ|TkI+b!fan)qk;ZpZs-)2G_V!Zs|^HO6+08L-dlH3FH zn3K7B0gtT0(|GawyERS~e!4ntT%_(T8=-AZ)a}+9lo)zf{^rkUfKo=+LBSux3;U|C zKkYelHYG}mhb{Y7*E^p#x+?Y=_O`Hp(r)l<-^|jV4=;6CJf8oY@#HJN)@Swal%Zz7 zOY(~tR2Gwfz~x=^0dTS%-+VALb)^ONu_XE z*;B@!@H?Vn)DrJO2)KoSC@-{aEs`fj=^v;h zl4rlH;2|v}F##P{#U)A0#z|JwY`4eo|EmvErO4E|ralqX@LW`( z6(Cc_60O=!XGZT&?g-8z=-u2stCSzD8enZbVk4n8jlEYd_3eQ0nMEN@k8n8X<)96d zsydKbLuQIbC=-OunX#TFu_+As#90^t5XZIwWR9%+4PS?@^JQ^#bkE=&6)cpl(O`CPQOSaW&jO5%_O zmY9P8#SDUu>c~qVKTDiIW*y5*fCpyr=SpMrRy)9s1WxC8;3#LJX5O zf@?{LKNFyQvzxB9%K*}uXad_}bxg{ceS!R)z}|t?t}+Pbj>G|d?IzW}14vEsh%j?eMn{H-6Fln<*F;Y0_vkmGmA`H$D zZB^AMYl{4HxrJ{cKsoqsmz4Z?x&i8B>3tl3_qpZ!u+^?hO+9qO@qCRnIb?d##o2sy z5rk1=s>U2QI+M%pCREV_uF{IHM|*UdJDgaIDJXGvZ$~8e%G>n_Z>?YCrv=sXoKOXH zk2RintWz|bDwIYzc(OG1U~eK}`?RuLnPGr=Tw`&fJ?e%K+=pUMnKjXrPnZ0(*Y`fS zt5m47J1DxqBcfP(H6ktudRdaRb5*y^&9R;mv{_`61}fDQ`81RV-3LdFa75eWr{|RX zk4o};$+phqQ08^(I%DM72z^>)s)Vp%u~5a%aX3v>ihbD)eF%%m_g<`~e$k!@h$`8% z{E>dmv^SA5cugZXlXnpO2%ZlcQlu%vYIAeXpQ|!XsEF*TstE*{Md8+l!W-d1uYU>) zh>4#8IK&@?J=-1*rlOm*KUo}xS^T@Ai<2hprTsp(JW@c9h z_tyx2@|n;N`y}s-8gBst>8(b zeoZ$qxMc7e*JX4{ZYJ*D4TM));VKx1wvJqa9h06TgbGMeQ0KQ-iR z;bx6ny!&u|Wi@IKfwVW}yFcT<@F>}MOJ1iDCxs>D0Lgk|iKmU{Z*HCaj&)w*^!e<_OLP|&$@Sjk9VSKCQ1L6J9kb)+z3Xt$M3L2) zRB@M$T~6sohns{1=|9C~VUEkAOBLFT(aYIrDk%7t^->lm!e(6x1b8^jw@Ys5+LriA zwgf#By7JJ%lzVtckW*hP2c{7hAMAy)6YDJI5VB+_F%~Bb+$Y>~W_-Bc)|` zNlG=K4Lf*aYrRePO*yuz>*#Eknq#XR5x4cGebc8qaw$Ss_qy=xS&nzg?*qDl`t@QN zzVOi_2GhrF%dSF&o_>RcS@XDq!5Z1AtY^`HB-C5@mUT35Z=Ad*Ms166=lU;26BXRv?F4u(%p$X1 z&m)|VeFV6Hh^UVfak%*<{xXvXbmbd>w`o`%wQLa!HcpXo{eAlgAMipQx2}#GTj~{u zdJiuTjs0RB4+7NLcTZxDW%OBuX5!!fF0$S!f`7{IR;g0_#;EdG6G)(RuzS*p?GW0MJ2r=nQHtBqpNuK{Dq`Mn02i?J`a?1IrWvdQN zj^(XI{kZPs5qphp7p&6tUl^S<_P@AMnYMIO@lXL}s$I{;vHD7bN5bdM$`P=-CVHt1 zha22Tk&4t8S~tteuH}vtCEYoD2S+w(!WuRmCLJ$Y5EYQE9K2Z)6gv7!HJSf) zH)U0rkK_47rE|ZV3W`-IseQ<4xmV~WAfSok0e-ZXcEPa<-COoMfX+8;XU^q(Wo4<=8xnt7Rk-J+s4I=FAY-Vkf zBAGgMEqmNKY5Yyn+>J>@FwfMu0VgB;c)9+qXf)@bdZ?~gP_+qXl8wNWY<#MkmdG+z+3jIAWgB6#>EecY^utKni0`wLIJFW>xFu}M}lj>%R z5pI*GPr<~Y7n_d5>eDcFZTNo93!-e0-s|#D$8?=J~;lo?-R-`sh5B$AbTv59$25EzknM2d4!tfC&O?JVZbc zcTA8v%WVamXjzHbeJ_UNW{Rm#&q^;|Xo0711DelgjdIo(nrEU`7ot9KEB;WK1zpbF|YP}p;tVcUM)rZG@bjEJznmF8spy0m$3Qb^SH=^KaE}T{XD8Td@%EP ze2;I>w^uK7;S-f`h4NnB?RU6GuW_b0IB`py`u_4{&Bn}xF%wV}TbycHKjnNNy=8_A z4q+e}X>QdgX5H<{rusjz5*a`V0;&bJcqyGQ^I=`P62sNIzI%H7YPC@K1mv2ecjbu8 zv=IO4@!j9x7=uPJyQF!4&cNe%*gs)@|8Smv7q2b)dQGB}ZXj|n@X0Bj*$=EFft8u4 zp*O#$vAa4zSPSsld37P0G!GEBrT&Xpx_rh4v98)-twPI%yXCa~;3C_;e)sXYT1TvjW~7r>s1* zlRViQ?&|vYBEJsHd-CQ%>kO60@6?XGej+oIQ2Bl=@im|M7l6FLLw&E#Lb~9PQp`@1 zbkMa4zAXFNm@E@h2pF@$blk_&LNHB!upBd4aronN{>830PYeHTR+(+UWw$y6laAd> zpLn(2R8)t#)E!m!oqwMs|CJG#%O7_$Tr4Z3CT{ew^B`%kL+r6=P5(7JbViKLa?eXw zn_U{Ha_{q#!|%`M3<2BI7Y;AHj`#v+Av18i)zh#!zscmRTS6`PF(q#Uxat*avaqNdW zH~pG7vJalk@O&BFj2GefamR6{1YlGF91z6qgTbeuS&77x$>{x3PPtc?z z89d0A;BPQV7gBU68kZPhd|C~exVqPjG~O!=J+4}4IWDM1Z-@tCi|m~H^m^G1FFVab z?tSYgZKw~^`F-yxUhfDy%>vkgh)e-LYIU-}3wmZTALrrQTUlB?YzRy_Lj}-$*Qt<# z2quJ2z!*{}@go{3l~5+yBFi8Bqgcc7!1ly`7<#9WUw026=sHylL0p5Umbhnb9jg zbhvRb&_kODAqXK^E}qBsS}>jxQ>9coQFIlMo-fOqA|e=&858h`#sQ zf4n>M{)XY1HefF=l|=5t;M}-%@>bkVL4GQeqvWYAm#$!wU|13sldec`KG>Gv7KipVtjI3DLT#l*_U2S9))!b72S$^rGs#aN(zXq%0*6GOh$?uhiIyR+g{)zJ3 z`cd^(>ayFNpgD2(zRgw=2`*$xqFJM(DBGGl)IpgM)to(Ti*tLiVWo$s;jsL5Y*_FH zv=Tc-gh$&UbU*U`wtJEI@pt6|EjD%gb9$e?>-}e4gm@ zDeHlBg@`3awc&~zTVM36iF(+}PZ^%Ck_T9tlq0a*r~R+yl>w4GK9?|v*Jj>@HQd@C z{Wj}40@*-tC)z;tD#2GMI6(?H$`6q6{w|jVtl-fxQWP!Y0CvWw8sSfrT)5+U>5K>v zZ00bA+{cYQ5Eb@v029JijB=_#zx{o+hbIdx$&-+(CsJw{hd7S{d4=e?K`hs345_c8{K3iNwiMzC8VjANEc>} z!z}l2e+0=9RtVk+;tB6Bi&3SSuAPP^i z+2aCe;XY>zsQ@%Vdjm1wqO_tr8c|wAqI)_8Qk%QU>uy5A9qGM)fSNy;#G7)*Slfb1$GWL`58>R3`0 z;S8r&Sd0T`RG!?N#X9SG;te9WA9cqPRs0-J_4sTb32r7KXT#j(MSfY%8ruAQe~CLr zY`IdwjoM zaWDb-Lf-6e*nu`33q=6>L+0xQ_KI5GHG6j8vwCu+d~(P(pfODkBx~cSbYAw|YP`Pr zrkPe^Us#5cxFN8M$EJEv+nUUwJ@z@;h=OSbP*e&csGz7zZuEJq2U{K3<^l_<8g&=_{=)v&5LtnBbfb>beQK1zHqhLtY&b*#X zt5!v5PQz#nP?QK)Zb$~bQox=R%$TXg*r@-=z;Tn_n-5JL8${Mz+Y-`;KFaRlINHo- zbgD+Sn6ZY8SV&z09s7l@%Av`sq)7zlsMCqMa!_p(tR4;p4l^Q*A&~~S_?a{h0u7k} z7(B|p9H!3wYtpJ9bcrSE&x4(#{4^D2;WT724JBEQp}g$Ul7Q5&tpnk9>3(*M5oni4 z-uJB?oeY+JmyD5iK4ZBP$503ji`K7Iv7f%B}F`ZnK1B!Rd$M+wkS~ zJ-SUWamF59JmahrJl+bfrvmq7(zvb_Hm2iZ`6C?3k{OPkA9Ea-aP%L1v_$5=u>7ch z4wQx<)HE&qt5${;^l52NrrRwd33{-6Rg46o7WV{(LwA2NkOYj-TtEIDph$$Tkcvym zpoa*WAP3j0f?>weA`>PfS@45)u%&)y$1&$6tJG)xlTPI1UHu(i0Loyjs|&XR?2 zqiN@*iAhf;+%_zE@6LDy@9aWiTSWxVA$G5-!XZy0-5}vGz&tF&0XGqdeQf&v2AVXE zzPBM+v<%48!l<^G5Kq3JIKW&j)70=+eB^Npr7u?F(d&fMiHjR zNtWQio8gep9XYMMJv6%`JpoTN8{pNEsSZq<2)7KB0f`wN9LRza-<5CdA!G4xr94UzE@cx2Ij4d+^P3 zd)O5l+Kq*7G-f+ekAp~Sb8+06=YEaDhKR!)gb~5#Fcm=wOV(2HsCM(Hh)CfL$_d#4 za8w>Ea=XjeQse%+(UaOtY3ep zj<4sbF|O62M}!wB(ryM4UHLCscuj#~Gk}D_x>T|q3AAIA3bQY|s^8Azw+X@6q;?#f z2V^i1{Ebykt!}z@5xE?UUbD;Do<*6@YQw;5CRGu1V?1n00B)nCHvVdWFLED^5DMEEAad52RZ38^tH zAh&(J+x$ZFbDE?IoW@+%Wh9G^(d=1DF6?DbhQFgZ{9-C(j9hs# zeWdH;p<#YV!!FGslJbS_NINPzOS$RVX4TtU|5t>c&LF06T5-5qJ))G*VVFEyZ3qJw z5rE6HK(Ww(rlDI`7|DhFnR;H{4Qs%nHE>zhfg4DF?dz=9gS;;7^Fq{L{xEXwY>Imo z55;ate<$@gDcP2d2zr@p%zPo3t^)kGF8Z^zaG17rpNi8Xloe4 z)E8|Og<-N`x(+?5`r9tD+NnmAG#gHkG5{I1rWh~Mc? zCr*VJUIAkFL8-;@l3@AMv$rRGpGmx+8?pl)z?nao7{V4_HvwTS6L@$m#nLcP!R&=% zU0M{hws(hSOIk2ZKuA!B9atVth9_hUljXJH8rj@u?AJ;Ov!AV(Pnp2=1)j=N*H3NG zTo^%eVaflGu6uuE^8e!oe(gLnGv{-LVdQ)YQ8ROvoCz@!atb+Bs*O43e2APHA*Y!0 zq0^iXNsfiocO7-{oGs|t@+@m7( zrWyo55ks@x93i2ebD;^_*p(7USM4Uacn z#y7+M!En2q7E8gh5%8W7IziWMU&u3d6e8b5Q`#N%BfzzGy=9PgoIeXSELfZMUXz(9 zvlO`d`Mt{PBx3+Lh4qyna_FES&r5KbC6K>+C~yF>u%}xDLG0Y=R`r1PphX_-DH^_D zwMlu50{ak}Y8u3I1<7buS4#w?mvd>v>z?(w+t+y*~VIrrjmd#EB) zS1|&7f-^}i`eMX9WqcEA6XAO@iMkIdgmoUH7-Z$nM!2+ z?(A9{6*k=h^HW}$)3f++p&1ZyMixbJXTU9(bPXo7<{JI*_ZwG_-4)#}kG2Z9 zw#H8AqN8p-^!`;<<=>$Fvp)N37r&nfG+NqGsW^udjmE{(ZMSG>rHJac5H60c$AsAE zuSl4|ETltAbpZXe4}HE(-|NSajqXVrU-^%HU1gGSYen&I(Q?Zo!o_*kcxt>;SSk{* z964=SffH8;BzHRAyot2bOzdr;57$GK)4*aUzG0BeB2n7Ks@E5)k~G~@VuTZY(zcI> zLr70juWG83u*G$UJ ziJ#sHIp;{y(KH7Ah^D|9$;R76Y33A<8pQ zv#mt6To+|F;O)S5`|SRwdafN#>;|3Vv?a&5Ued-Pq5x>~*p(( zzqYP9-6hDWw4Zne*v#I;U=y3<_z>y+Ln;Ul&bx=B1@XCexir_ zbrr@kZ`zf!^>fX4{xvHiob=U<4px{I@GoP(bw|NOeTX&=teg8uI`?g|-S&m~1}*ok zDoqT(p{gfdGX$44Co@rR0P=Hso(nUPnTsk_9KOpJs!X{M%uJ4Y_6?I9~Mc`Qfo z2^CO!*8{)L>f8q!+73sj#QH4ivOv)KTgBt<+0AQh5TH`(I2|dozN}sCs$!n&?YP;# zxlnrS#S-m(j1o|s3;-l3lB(ACAlhVOc;a5LU3IjsBa>nZ2r&Jmay6T7qSUT?3pUIe zj#i3sQMNJBit!Z&SAR>MUQYnsR)8(}-_Zs+?3<@=qVsg1G%Qy%Ho~3}XeZ<@p9l7k zcP{7i8p)%BusHh^bjbOQL_XiNs&v`lKTHJQN&9v)eqZ;wB+)4U{0W)V=600ElalsP z@eM%hS>`$0b8f0#lD;EYC->3Y*sIa|VtGO2HYi}DvNje#nxY|P#qXye0$SG`l6=}= zXUfbU{y2oMDqfnB8A6*+X(W-*r)F5@)2a(p5TCxi32b|jW3#yo07;NV1C6;mTKCNg ztqiip_(6Dfp}-aWszAbBg{)`+`_zC!6F6Z)kmc}SGQ$a31=pCXh9M(NTs@WOSU2x3 zz=Rvy*!3dXQ+~XNN545EsfB;{caxMaT_#mhS$S^cNW5h1sFf|L`*K-=k){K* zjA;mH-lk~O!4Q;0_%Tqf;lS5qDDjGd=fn1E8^#$z_QbcGlk8;tk~R;}WBdWt$^ zGN!sQ8YQOsK1IShHP70oc1G(MugmGDLq!tzN0-Bv!F;VN=W+nRL#y|&df(&fR_l|# zi%*Ti%(vjw>0NW4vn5FajlSxN!!kZ&1_eAbf&*_^4Df#B8B5vS1|$cWDrR^Mt2t7k zMmW$JB4;yrP)Yy~oPYw54_-vj};2y+>VrqB)lP!I{d0F(sc77HSh)QH*8{JVKy8ZOAKdZzKD zt)=a{OjtYTX9d3ysd>dxSI>zjOZ3lVST3A~pN|;%>(!Pgy<3|{B*KAzTE_s(5D%!c zsaU9H>M_eibT`(Ne~PYv-27x~?mht0*=qlofLF9-5V;SP*^t9#f6k?R5UHD+EZsfh z@P2}Lgns}CV&0V=)K}2@pG>yDs9bcJevVZ%1w3b>0)oz%2si)Aw+(9{;Ah9zW8L^a z&(z3+XZ)mQ7%5U{89@ShNaD{7IIElu1@!OkwHNd0MP3AlyPq>%3W93thf#_Ag8}H$ zF@@Ko+9wa>a1VfSX+r*W|L;Q{*JtEkFQllGqMohRDD*fWtGJ6Iz`Wzc6a`MAddw0@ zl5Al8R+o_|!=xOO0{HpMcR`}q({a`#^?OWgD%27HmoTAcR6yb{v2@MMJmBvZOLX0S zOmmTM5nb}79@<-FV++nl)Z{9DT`o7*ia9*q&KP6ZED`nn9UsKK9-pv?SnzheK$MmVcHue(3$J$z5ps5)$}$AU?!r#6uY1pVm&Gs zC+0OW!DG`+0{Lej|8n7U zTxk&V<8DpzcU3O?`U61gAr1K?5-dK+w&T$UStrUj8=qy>y(7Hf$#TKaaW=?@Oi4^ykdOy&I}SF%3Bk4eSgGYygu!;&;Lb$zguw+2)d z?Tfa+nF<0}Cj{opMR<6)8)a$^HDYM%^OspG2%8uK%n1+1)d@n?{UiZjimstCXQ zol>IYAiz4F>1zl~2%S&}+OerVU~V&^PeK;Q?JU;;`1lCQ2?&)}c7S7sCxw`nG%*QW zUQL*PoA^ZKo;U>p*y{;21tpm;#7bZ8(Ze?&qCJTIlRnOnM=nVyfa3aj>GQ1}*iT(7BU@QI2mM6Kid_;-rXj$(bBc;WdH~W$`{shB;(TI!~~CN)Rz!23)|ic;)+-N!l_A30YswM z)$075+eFcA;nWX;T}le-67rf2+3yIq?%dABL-`mi5P_|JLn<6xsL|VjJwex9y_Iit zr~w(~OLz{^0Hk@{O$56mbO0}s!Srk;{f`oeJDo;$j-ZP#?2hTNbMih*Fdle4TM51G z0lyyvo4N#nsy7Jpxp_c@gJ(ndw*Rmns2yPAXMEfWK|C?;M3hGaAd19+qe}}wYB=T& z+ENa=JvO|WA2MG3&qTChEIJ=R?v_2cn?%%`BBF5AD#1yc-7*H! z+Cye?So8>#@Mc~HV)86d2*ryaC{pg5DN0Bp^-P{P4yAv zk|Q@;$Z(Zh!Fs*v4}qzUVuAONMjs@~1@N=J-S zi@NS3ASy*F5uk!=wxDmmHVIQg2LReXNh%1UYzy9ro<>fjUdgP8U7%mLr?Pw@YbwK~ z`UnNT5x-hKdHtJ;-;nQqjsGH-8@o_3)J)=3o5Px^Y_B zY$1d}Mb2aCPtMt85jfF5cp6=wD9ldM*I)@7fyEgkXe092gzQIE60tUqXLvwuA8^c1 zQ_xS8)v4X~^{`le)>#6+<@Hnouu!~TD7@|Q+^lMV2ZY>plN(Nwi7?@!5V>p4dxWp) z$I6U6IuB(L5le0s^tC(AESTUc5OV4c)z^+btwWn4eOrr`ul`_PCiprRV6kKwiF&(` zlMD_7IVA5j2=xNXcn!)DYxG!$5J_h$fttCCB|0t9ACEv!MFVS;)v^N{GDQ+#al}oj zkF~RMIyV);K#nafheG0^95Fsm2H^({@PlX_s=^5dc=>by z5SpQ+6t1qUreMj>I&HJW&@|UX&Ldu;I|}GoCkpJDoQa|ylO=NdS8=`{=#)Iri-t>i zi{!fi_N+Tl>pRGC6BaN*%!suWGy7*Dd!_i#SMonIw95u3)I2enADrU1C2Jo9GXO*_ zMT(4*;W~L&n(eB{MDFs5k*tkshv5<5@)1qw=<;TE{Ce0albk=#1*fQVFOWbp1l&w@ z4YHITC(aok(&?v4qJxKB0ixrVb+zC@)jzTte&RmkqZj{`ib&FghgtAZqGs-ZA`yA) z%G-pw_rk$4Gtn%_^(qH1vIUd{A+apz05piIjsze6wHo$fMcl69&7F$7EFw+HpvZ0( zrk@!mT2tGld_F?Cyg=ikmC~}f8#5vx#^#Oc2@(~r;Nj)^=c(mrUG+$iNi-<@O10Q_ zfc$NmZ6d`yZ7`>s^~9FS6HODC8bmIb@E_pEPL)U~jk&rjs;kw?=?@mJ;Ofp?P->># ze^-K-0p;)vXbBD}9+==c%OHM0&vc;vN2(_n=yjCr4XFB=EaNk(1o+c%8Z=z}9qyt- zTTVo9P7Ae~tNcl{40@anK?>Ed?WO*`rD2+79sPTiCY}E_+3F;lm(sZeiHJ_>qbth! zEjZV-k0Vl9^(_;TSd+#t0Xch{7fGug2lf2%HBo!4BlRYNnN&1&HSvSf#|x`t@&hsZ zKr+Sni@=%KhbJL?$i#Y%Q9=N%ubLQT@Tw(Tn>+ZW0Ah@g;)of#Vr#cgRH4 zsm1YeTPl1Dgv%!Xx%r5LU3jrT8lI<1&~*gA#NQ!R{M+_xWMDxK9g`hnl~>|G%)O;- zX$T#`0A|BmWnLp?(VOU zGu|bYX~PTS@0vaJ2bJr?Q-GwD+#C+;hExF{WHm5d?n}6@Bc5e^B9mj^Sm1=<5iIZ) z@m+%I#FUi_-cCH03L&!C3OrA2LzUN->$kH7UBoWDajTFWk;b^JUO7wuW^Zi|AolP# zTX2@H4AV}9Q3q&)8rcM(`DM~NRMg}_xweMk=Ai@F&;gYDW@xxsY=1MFPC9)e@UDF7 zGXNOB-BPfwQpj(r-k%KPggMv`!d{w4s(cpKQw5h}!K`};?Wu9w7_LZw>k#X6U3KvS znI&XrGCWbfdwwZj^@-&$DAY%++NBn{B|YgPi?Q`|IYeN)W;jDvbwFB|kgXGuD2(Ui zF!~EV90ZI^Xb1kk;Vn-RltVmZ&sniB1UUR#-5r;?Y|IPu2o|;ztQSDwrkULjWE6lPb9<3!t@x%8{~n(iFC~o9tJ=z#XpD<-&15PvY8-;F+P^ zsf8?hUq5=Js}}D~6kfNoat1+>tC(V$iUc2OHX?2}ThuYHNNiHfa038QQWp*~*jI=C!4e6JKp($DQ--qPZCAgnZv&TNGUg!nVV2mPs7?s(2>5_|jhO*;&V4FK zC8Q-*?PlMIzrSjZW?*%!h-MYOWb5r1eqUAd@~YFj!}XTvcsj=U&zd`T1DMig-L%K~ zyo3W`?CH9jD@Ugnh<sqrVNdE8^_GoNKhlXHg6_AH)=9|QFQ&v45s#yh{jFC+0ZARGi` zJ9=`z_X_-3J*PDxXuT5(t>B41@q+&Dz#>jG8AH#&kY|6o=79vqp&ELc$H>AEz+Xh$ z*2gS#wDp;&iC6Adu@V~f^Z=m{?9!gDtIm={Ubuu)qMv`CszJZhyLb0dx)Y>5MpnKs z{J=rsyyy~AMd(n zPCWFHecTnKcc?QkDfBvfGFAjfpInUF#U^0USe}vmVrxK>NYl{+H1-A1M9rL!|J#3B zw#2&eb6JdCFH}McOzPI{pdPi|kHRUDnbFstZj%5`E~of-UQ0@WWr|NsTB?a;LN7Dg zEd4zSv&31r1M@u{<}3v$g_)5AhXH6K&d)oNREMX4wsVpeVMtMjq%BAj zPyvA{Ju7XxiH#LaIlqMt5DiJ0*>PugzkMlRBwLfIyp|uwqNATghK&#jYFCf(sz$~m z)5u1&XZP5@uYBxC+E{aZ;I(>7%yvL*m)JcIZWb1Xih@RhtEWo;>wBsWY-GC82i%rI z373=I==|=^mbS}8b)=2DXn%!tKQk>2Jj3-m+(`Bdte`wO{rzArn zL`NqPp8)1gklJDVj@PLlLm<%`ECC&s0HZ&9Cw$_D@5c>#w&!ncqal&p!$FY*8ZTPG z>t+Rlg{zIprgOs zf_xE(DBo=zDTNxT4dqh)Ks&j9AnI0qEx~oDX0za_IW|gnkNS+OxlRi zRMN49A?YnLW1J)-Xku71G{z5-t_Ey|uhw;1$9QO{utB^t6VUhlaoBhhbh7WCWWCw+tR4Z^>MHk-{g(lX66KhH;8jU*CEzj%C05?^rhRDOe#u>1bS5y1IZW2uGRmqk#DF!iLnmw-ZoFTKv!Om&dVc z4%Nut5p0Oxu)5G~C$H;~)hw_CH<-Yfc{@47#qU2((F)iqR@A0j_AwJ*gHTc3KCLXp zKR>=M^8&av2cDxAOv%XK(Si*xN(Pj(aj#JI6#((+iOw0V8Df_>t4g(Jo9RnMD(_a+ zqLi`hZit`;5iEyi4WtMPaS!FQz-31fBA7;?>M+YgmYAFHCtY6HGKxkPzwmMPy@Y@x z3I{0)y2=G`hE^!F5A8>B)YsGp-+JBK`n z*2AYP`4UHKB4XFR@je6+<;Q!k>SGA+W0DZj2CP}%`z}>{>Yx?gVEyYI7xGy94p+6Z z6w9PixHIRjjeamSSKxa-E)|6#rMc_^`p9-(*cKxRqSnh$IH?}t+dcs>oT#o+^+fS& zA7{5EE^K_D7h|CH>-giQ-03x0I5q`@G@Seb9BoC{NZAh;4Oa62NGIE^QcpLOeWe%% z(7j)#2Bmj;DnY)GkTMg+duS8Hq12Sz>C?+|a)N86*At)Lv%MH~6s>uMk(jTSd*&_L zBllObfO2eGC)i&5^Tdf{^~DbZTu7xN5*Ivoc1Y|(=;EljjWSnNf#lNdz%tL@1~LdJ zk&y&-JtrhDF4w{Lo|musJ4j)3(e4>4B0_F8@@3eUK8+qdH&k}_i8zQ?!i?qJ<+>ql z(Dhf)a}S`okMpS5emRQWH7Cd8;2$Yh)D_Dmg>~j(M>}OQj|e`m;mKCDisa8t7jHaT zPCUh|N7xuA0KCRe!~$P{4^|x|cvmjBSC~Gz9gYaNstpKO$|`~K$zy%^2LhaVVuUD` z+N~7#>&hq1Cki5=8_$f3Ll3pA_>%jRJsL%-x_`+7U%uK}YeA%r)V~fd7{2%YAy}EZ zw)5nDhnJ#BT%(4%+#pV&;K()$)H<$OA$j8I=}n}wq$cW*S6$;cGsQf&!NLFGkn+r0 zi}`)=vrJNP$F5|q9GETj4DXbG+XVpI1`Svn@vBQy(?dS3AitJcxt4-4_F z4ob~2sRyH|5P+>=07S?~81)S&>5-7#1fq*nf5nz;8lJ0t)5W+$aK`=Ky@HuE`O`KG z8%dz*77_=-Vu3?wWnstm_F(*Q!N$_Ko~gYvK2%+2-Xg-1{|yKSJ&yOW-ZvxTi!2af z-!X*0`jwwHs7{H&So`L9vjbg52G(YZf_!T>0W))w1UV-LJC49t14;GYOoDdPOkRO_ z@QeJf8++#)YgJEaK?(TR;0fCqnHp5(_n9qxLBDvif;YaNh=1~ew4Tl_=zFOOT^6Sn z1tOwqG%$|=92HAu7ciPDU@>m3i7Q!Gj5h3EU5}R%ImjZ6(52It5^d6C>O_)FW<_L% zHL9Vo68Yn|uOXMHlFgHWQYvQ=*MtG25dg|)eqkOU-k;=^dRy=4MkelUVqkI&O2%Pj z%j=L0b}?YfL-VpAj{(lr6Pr@73iJh}Jrs)CsN5S?R9dM;BrlEM@%?)b?5SNIP}GfMA*pMa#NmpcjOY)XfD)adK;;7j7sziTzQ)$<-Bw zN6$2iA)0;yJma6+<~tm~1R@Ao(;lmR{#jecYU7|1gmC*oI@_Ko_60}E`8RVBULH}<+sm2EQV`Z zVVvtflXd|}2%Gii{)Oqp-zq>akymPFh%RTe_R`KT@FgDr3OZf^um>Cbu2wBAy(8Hw zUp(tW2#-{hR3XYLK_%8Or;>hnNkzOoMYy~YXYW{*s^L^d)IKR)~F^@jWVP|RVw!+Uq{UlBvR|qAntsS4XS_Pn2H}&G~nHwdc zE%40+6HPy$6GIiS?vUl=qg4 z*7zGHXU-jg18B<9aNhV`a=?qMs^$NLY$kii54MM$jvFlGKMnErCLM|aj&K%el0Y~U zpypQI4-|hIw}5aRQ1zk28$wH~NEPSs-~b*Ndi%_mh~G<5+ls*;dzjG;iRae>Af0-z z>WWs8GFRe*t3{sW**FSae(I~4+(fyMJY((+j}piaFx(VpSyrzfLNeYudiFu;P z+#nkzSS3R0f1@jjd5~wK^a4Pz7ta~+-%o1p%R!NAR`I=t6H97+7XnM zVbwadu-%02<9*{sJgR(Wkg{EpeXbY&T7>J15XA*Wfw`{T)(tNKCi02A|deuEMkB3VDIT9H7(e zap(nA3_EZ;<;lZyJ{x!ic8VV7huPeEO9y54=S#3Sz}!QSFgJHmr^zXa*W$tO^>H_S z^{L-hu_|WxEpj*#fO}A20Tg&A%xbRL8|R-oZlx7#0Xs?slo|D#y91ldu8a&2jB0v> z&>X(GN>WtNY7UH6kniWQ+aLafZ28oFZb4YN$PX<8D5Mqc{G?u#vm|a}DX=tb@r!kS z3eH`Y>f@DYT^LfeP3ChO1pS7p6NZtOm0GLEc}ix8n5JFo#G{qFs82^XmB(q7=}DE( zp48m*Xt|jx$d#jT)V;cqY-tOIf>Ye;Lm6jHy(h6tM|=C$nDD)vg8772jz!3 zq-AYqC|>8wh+HSv@fUgW`88`P^{f?JHc6FlfT-6D;ha4|;#6eqMODrsez#I?VTj!x zRAFBeAK(XD9Tegk+L$f8??<2~s*9+X`@z&|NGkI35#ygdt z1+`h96KYSz!sVk|7mdKu^Lf_%EY>$1Z#$0rVI&(FuJToNv|R;v$~tCu>tHp&Xj0C{ z@q^Tpp#%)o8Cj(viO)EEk%$e7oQ$H#p+7N6({c{)n@Y?jFKkZ>7kFSh@U{#HrxAu` z0V+2A|0V+5CnX~-^H4Y+Fwr!#5iCo^d}7uc5(z`Lr3)FcWK;Qri2mOn2w`J&wu8!- z&9Sc>P8AZ;@n1ph0Kn4X{zg=pXdly}f`N8WVW{`2?{G9a5|{xCwOAhOnwqKj36 zGC>mN-v=x^>VaU)ah!Pu3V$n1tdGC&U)B>0SDEk}o~Op+qf@p~YPrz{?N4iYF0}ul zBl$b~*x^vS_a+`<%?yKbR2E-=Fn`*6!Qjl0Dg;l%p^8DuDykwy5Gg-DCg;CGywA#Uvaa33F zd1$9R-jLM+5IuYELXO}VTJ@b%vvzknHJ7!uD>h00eK=TkhEyNr1*h15g?`?chW=Ip zVOgjBblhS`?nDeO8IDI3n(^p)lJVD_t^7@>{|^LjAo2Nmnc{@ zVG*rZ>=I{2=qTcZFn9?#BM_5k$ik0JojRW>C+w1kkJS_?vOE7B?YVwj4_p>r$%ukimP8-%yRJiJ(YdG!|%c(-(t`C90e^q zow{ss>b%McJ}XGtXxIhx>2pPOAJt18vEhNq4oUz#6BEuuU)Fd@3Ulr(>=sQW;OQ<} z>O_#*Tr>|A9Z3C6=?tz23U`PNc_s*Vq+qgH+};#q3IL5N#sF;CIOEQV4Qn~Qy_)Fw z+L-XFLf5oKH=n1M{}YyIT0BD-l?6 zg6D#qzg(5*aFJyNfmpx+gMX5No&j#mvaVZD;Q7QD-%f)kA@=4m;iq2s>vqA)*)UEs zV3G<$Q=NFJV10%V#h3P;0iy@_e(3a&-1jYra~pZ~{BViw=GFzFFT#v`&j~%Zg9)d~ zb|@4-BcjoqIv~u04Kg}v@H#r=g4z3e7rj@bN`0O2AEFhY9Z{d2<4upIWGUdc=yu(% zdRcrj!SBFEKY%R|ceg0;kOd*LAP*0C9E*Q@FF1TUXHU>JdRFMV6)H!KL;5pdDBeUq zwyT0RDxL^Up@4*6#!oDM{#_WJRUH0b=0$|bIraT6!`O3ek#*C8c?6u+ucn}tf{t6F zb*t!sBh&+SbX8?xoG^-E_ci^dLx5?IbF#~FkV}fo=^vp*9)6*6(Ud?F0jpy|i4EI; zGKialV{jTq8@Vl%b_OxUoR0g7_Kv2=@dcp8*JDp4&|Th z|60%C?V^WCZ*;)O<*)m>zi!db0;FEK{BtjD-$%zEzdS0qO=vxKNt=+HCldGqP1bX< z;^7tyRP3xgm6Wo?bIHZaplQYMQ+82jblfl478_a4F<`5hs1Wk4`P0qltk)35Tbs(& z%_$Wwp0V+AnJ--F6DLvzf$(Z{FfC`ymQvxE!c!6y62H6=Q_dx3U91PnxWzNISFS#H zufDL(e*fx$&HE#I)=!dR-@LeYxAWd-K`ULCU^#up`Hxnw#a6oG=2x0w`Yhx)GZQ8t zVpCjPLCpCd5d^1A`ZxHmo}-%8_#b9Q8?NeT-K;~CSy{S^Oe|Z$d*$UuF_KJ0yZ!_N z!e9!Ka`wz<3UB2zooi+Es{$gV_|%HEm+pVNT}-q~L*hrB1y9$m#G5XMebNb>7g^DB zN|K#-?KEWc{JscVwvz*bHL0L(9LkZ}(?car#uF-Mm{E*Y9$$D0z`aRqvT?hWk{JE! z?%mXe+ds0}pJ#%+S&nJK6doIhtB3uDTaM|P8N|`eA9d->gYcU#YlcII^f)-u#JRE+E@LUM3ni6CNUhTFiGCHMuvUP7+wgBuwfyW<5 zRWmSZlD&6xVqhK7ml*tq01@s*;jSZ!lv9~xJnGv06ZLu<)aq#aTgzDAT2W&50|}5n z0MzXBG9&;d6;YpaSLu?0+mB`bmAOIWyq)nFa882$>j4_6|iyrooW586*JdXeXnZav#Q*M+snOZ%@!{!O5@h+KW zwHZvyLGr5k7tdaf`&L$W#I#oVK|Af%@r^FXoG{6o0!q-oQ&4Pt&u!j1-#=A^k-Na` zKOPa@#&!5A;n}hgg8oDAL^l&o5!g8=*Uj!JAU-dk2)qvgMmwS>&Rp{{H23iW=?h_w zJd(>$sD}~9WQJ`$DaeNmbnLW@HewCk_~Be_W{&MR<~hzf-;} z?i&uVo=-HaS9~R`HwZCe5ser*6(!|29=-JZWoP!%)$cfp=cW^+L%8gbvsCsT;RXNrQ8e)HN#Tlyrd@C$ODSj1atTv zBQ}l=r(T6OQ+YM!`jRhXx&|YI2mS{_I)^9PL$%#x18a`UPJ>Y3af%q0Viy*VBoo(+ zZN|o^oZSgtEal)`95R~%_jk@Z2L5%40%x*4vWbYgbI4G4Zk21b{zSReJ%-B;qqYmC z0RY2y$_sv4g^T{>V}oYy{54?xbrSi-9t|7swM0@jg<1h8WA zdY;^LshH>HuqF;-Q!a#BpiD*r)X_`?TXL&D^6eOe>pmqt-(lbofGHz-qZ`<7ISeVf zxdh4{PS1r=$Ol%wmX?4NsT*L|qG2e&9}pcPK@uA{>;2RiJnC7gOR9&IBMB}hD&#S9 z0pvSi5Ayy`BOU+}sTe7K!ShXgtuG%X{I@T}S@<$%d6VM}wnt3YIdy+I^HTS(l+paZ z;PLpicJ6zCAfP`uuqYvd2$<1~V8cH`L|mQ05wt9trm016<}XeBSe`+?``NzscTYhg zC&KS@0fBavQnL6omQKxCq!|d!SLFxbC?fLaRS8C7WA1{Rp#<-Wc-G0Xg14hw@u`KMdKWu0SFf#y31U3LuLCdyWh(z@} zdp1b3tFg)R;3O++j>32wN*w&&Wm!~sW2E-RD<1aFv>g|+{xD~p=8 z3iQ9!II+pWGm@#7&xM){OUln_4#9k*?8hXGoX?LWGrh(gY$e*FUs*&nBc1pQMH!B^ zq7B0?SM-#6=Iy7=umMnP5LpVGRRkI+jtSBM$E(`Hh*(oeO$b<*M`Hkb^+?+wa1@z5 z>duFY7=~yt0V20L`5ufL6o0t*?ld3s$7%@|bA;H79;PZ(h(DVH!#{H7+xkBRZ-jGy zh+>*O+8^aZ00&<_NdQ)RpDtPgp0~<;;QpJ7ptC$K@(zjzyQ!1-Ih;V8Bz%4{Cc zmW-4EsLf26uo9Vt5CgM*5D`yRI343R4l@V5qG;^J#9QESJD=gUK%42}| zxjzx+@-ELb=>m$+ynZ634>al0my+>?z{#Sp;vR7Pf1i66Z*#Mdd@Sm}(?NGDUSI8=@JXD1YRa*O-xM^%Ob~h$tBl ze8{GMcOK!^T0()f9I1y$hK>00Y~v9Px^@iP2AF|Ki4sA(XfD7#mxfM_I|57%D7$D9 z3D>Flm|j5r;41{^7O9h~w)R~4?G3hNs$RT62m3GG6d`FAaC7ih?CwN&ch`ycD(?WB zUx$lVKK9%jylf`_cj$jN+)0v8EK$S+dlqavevB}Mi>3;2L8X?eQ}Uqj3qfev_53`Bx?u=1w_*#aOUpN&5%eLp)$ zS?k))3Hj~QU|E@TP02N+-4bb5+}^s_i=n>|InZs3JGovFsUQ4s>MypNuVkvm?DtWD zf2GUC!}2ZUs&l#Q&I@HAdN%(0&A|_wGl`|xsuXd8ButVi37$1e&sjj89bKA6&6!az4AGfOWCCgv$Kh~`=2!J&V zgDgx?ZjfBZ+h*TUw$T~poXt=CrE)G?iu0+mFJ`2KhRI5!WBjw%GRX?!R-RYuk6fyr z1~erGirit(4-0>s@SU6Wt`^{jTP8Qvd|qx{`0k=Tw*fv|&TR^Tp19fKqTr=ed)9_) zswZ&)U?sdJ9>zWS%a?j%@6v0l)K`vwU(aUIx@-f$Kc)Y{?Cz~Jx1_y*9G+=G3MJXi zB%eXp$To=P3w-&F)VpJHg_^8iQRNZh6t&0{u~j1Q(V+&FYTZ2I{$!vg%$?r z8T?JSXeHL14Q8<(s@5`D)~kPl9zB)Ug85viuG+?bWR#g%$k9*S)ZeF;Q zl(KMt#0n(FWEQ)a;5x1^zX^C-ZTx`TWdKlJKWBWS&i+Qzvc(UL(tWWe7&ieF~G2hbh-aB#_ ziIZ^LD}ATo5qY~cqkHai^85N}DoIsOscUsJ2 zu~I0@(6*p)L3>_MDzdmN^f4+sNA-%;BR8`CDtpwQVg1~dG?}X9Ty1=vm?Ygl>iyCE z(n-^=rUL8Qg#>%*q~qD2piQ2=*njmEd-8J4+*ekTV!j^UbouhrWXy=Id1G1G(MRKA zZOf-U|2~FbN_y&TW5blH*|$AaoA0Aa&1Q{_hKu>~UbWt2rU@WQ4P*YhX&BWmnX;#E zr)Pq&)u@v}y*N63<|YvRzNpW3<*4%`+nMC)FL!eA6XCi+r_v@~tO z^3V11h@SkDlu2HndP9Dm;o#TXZ~XGIF9q{lzj+=|yb=Ke&btZ(j0$na%a-Hp9|^}kd=WF|a1xnx zMGY4FLBxwM_DWM=V2zx9gs|kRXtB!{F*faB?oo%^U&C(3QIiyL5vIo?l0>%OT3?n) zP8Z=1Amd1^T%1gY;9io*Cx{Gs=(|ErgpTq8S~8jG~g8 z;KB6#t(y-mZ$2Sp4q0Z71Z9q;WhNEh94N_rww3uDnfVBrHE)@<7?kz0H=`ph>(zMH z>#eN8rHrq8S#K?~-vwn?jAw%QvHxFhqPeqY_(6U5gQ3puzJ-P5imIB|?Dx~Ni>2k& z|5u$DXzuT-t*NW$XcQAeor7Ja1CNJ?9(Js~+2q8r7ZsPmx%tP&Cghd$XQvl9{KTKX zf2U@jw%_mG-2BQBB_4L%=I9bri*I|HidNaL%Bspaz{K*0qPgem${NN(!eSg_;z3&$ z49?Xv-rYYm+FhTqzPhro`1I{gse!Qr2d&7;FXnI+Rh4zeO`IfTRLu;OuUt(+^NHtX z-G^$$P9K7Ov6KER3~T%^BxhjX37Ty`Bb90hEQc ztAdn}t%+(!W&XGA}W*W2fdDQ?8tMwl%-sG+b~qnU9A*>a2OFuXW)y zKim<#p@x*bu|`a20P%!Xew-JFoCpq$>As!X`e=q@UT^@5;r5KAQ0M6LHvV3&X&vc9 zoiTVZG)J14oA2wGykB~++s^Uyl}i^+nwx7)VZ^M)fMeG>k8kz9l3O?-Oo;c zq@k32(y@H7G_NN!>4I%kcB z?w5C~6V@*NP9){yM4OGJ$CtvQs)s5GlY&yi^nyk{(L0NY72F^-A+~OY+Xldwe+| z*EzU8jGA}5m+}9+i4B%7gOvmzl~vMqaYJ-&E<-P*L-hzYkP9U;4N@(eeINIzq(Vo)~=#f)EOLW=QO8NUl011jM6U zK#KzUcIBL7-dIViak$X|sas_kb8N0LYf>0^buW}x(%6GVOneakee?5-FYSL%Z2$dx z_tdR*Z7AM`;63Hu27+YC*8E7X%q68ub#_0b;#_)5c)3tX_gnw8Ap5(!MD|w zm3Ful_NwQy+;Dms!anI*miQ%SsgnOK(Et8-@Ogga`5o7P|Jk+)xk#dhBMWI5TyHvr zTTj#?Nod$%fG&u_5tD@j>eo`B(OYY&xWss~RJrT!vT29`PQIIR%eX9BeRRA!RfAO` zZi%Ae2I2i5G{$l+vAYN00Je|DXNutviElsm-n|&?#ZKaR_A7$M?cUE$Lg|ZA&%}B! zF^4b%G6ox0$-mU-`;-ZK|^Ino%E zBBS?l>#oKe;cks?o%`F`64%lXbs9!kPZLzGQet?Y*!Q>L78&n7^WXk`fxq}<`7i_H?4mSvMtx$i>Lz1+)K8q7u3X4ftTJl!@5@0 zeiJ}$nS?Jr8`Gk9ZCC?CM7R za5{rDaKHLzMF}s2GBoTQ&g85I)@WGpotx`Emp_&$8C5oc`twE;jAbRKt_{w76HW2^Gn#42|6_Cem zjRMvL-cpyrea#W^@L_SKs65z^a^mZnj}cQswqBFN?-{8_e)pJ5OWjXNv5S`xnU6Bz z(fz-3I4Opo9(GPz9z%7dzw6(sdg*eNF!OTw?zrrVO!a3yOTKTCgKcAyOH|eI#et26+C((lNmAk%R3^13eutyL1(BYvWKp?I&l>Alxirl?8+q- z+Tspe!yO_}Bie7nhoj=eIf;iai1V*AgE~IFcqXcA{^~LzNTp!qOTY`xiDuU`Ns%dqAOtqBI(t;R5rIC|F0Hx2sGDK<6 z6hfW(`scJSV$1x8`wG8D{trcG{nzBz#_{`JumJ-GjIPlm9ifiWjU4GHC3PSY5&}~8 zlI|`M6c7<{3J56bMo3DDiU>Lp6&ny0>&vs}AGm+GU*~nsxvq14-fv-rC145igy@jQ zTRnaN#aG#D{vaT(1=4mE_@tWFY24gaq3E(OCg`fv6h)@Wg}r{X@V!A?ikc5YKF{9Y z*yYGWrb%ImU}uzVuKASH@fMy4dr;{`XZ9{;PzVpGhuGhiE^^$F?CSuSB^ibPJU*K&CMd#;*{RmJ_k4x8EdQ>32s zE9S=fv7RA5m_WgSW32P=S~rt==|wir>4s92YC=CE{r^t@|Tze<;!i?8z%-?VwkUsP099Gcp8 zmONK?*fvXJF7FrzY>b#_IoR#|;E+^F`-2#RhuMLPeJ>^}WgFiJ!T+>CFi)BZ?w|6L z2Ih;{!@H|@9(|)9=>HwRLEx&3+e9&KWL6+B`<05SwdTejJwMJk1&Bu%Z9aZ_P_z7O zh_*qr{r(zXE+~Sh69#$ds>)2s$&KlRbI%$eNNUaCzoz6JF-u}4CXB}$@vzVOi+vki z?Qguk9PBy~j7s&!CRj-qFiMr`TM>P$6Ll{J#~YpE_IK1gn z-w$%m*B{eO%8T+v$O*SZS8E@lYh{%=be;{eqw*9DkNlRl1$)-y;LuAw&q(^S`2+WJSl#; zj-(oPe8iqTIws&>UOZM4(51XC|5|Z|pP`?*o^gl}iaCJ+81C`VYqeD6gAeHK2>@`g zr!y|8@0U>QEap_yY)E9ilYZQ&(dWu48e^QnAG3Y~i&a}*=-lB20 zQvc|+nLbaum$w#1zQkF|!2u_TfFPsFaXJ=4B1ts~on;M$rq`d@c6k zq)HGLO;nXF_XEz{!L*B#~_l=0|3qo5}ye+J-=yr1JxT9h9%=L~nEcw6G1OqNI z{;1Hgmc|ivxOj)uH~E3gxyB?NltppdJ8bVehK8G|bd6+;br zUX~TRO9ij(f}I6V!`2WT^}r%kMud}c^neURiZLlC<3mrKsYu;B9WC1(Z6g3T{YXuI za)ypb)Z~TZ&09+!F&K@*B(y$wC~?Zm+*X#QKM!Jz(_ zr0U{;FU-$^_&8~vX@kWhV&b9ah`^>7J(?1E4vn3bliO66NsyF@la%>kf|)>^IS~;J zNl2K4FzFG&5HJx!OiOM~oRWz95cI74=~Yr4LD zICKqa;B!RPdo?Mqi;R5j!DK;2>vzfC!q|gyJ`KPin&D-l7N?#g7;X3_Nd}9daXs0I zevG}G_++^Rf4a;edWhjIjrepay?2Qgm5Ec1X>U>w6n00X${bJC$(tpIsO`^-9m26v z{A@DNWYnih2-eO=ln|pwj*iKH)p}IM=0r|rRb_TnX{LYa zf2##Lh18-GYRWyQy?ODny6A)9;ImCPdW6~W^fK+DwCP)A{E9RkdZubt?2~yTV&&O_ zh@ebFY{rih(5~b(O~{O=f0cu;PlZkKV9jX@y8=w5V{aus1)cM((r&bJT!H)>S5>4} z76(7<*`6l$mqzo=9HfGo#>&JU0$ z8Z?W$4)Pix%QGkK-X0#I=2&p+$KKc5_ttK271&#x|6$UA`HcbAQqU36F?>K^N~yb2 z^iU^LcB4$;SA#OINGJVl8v8)xv!bHZ2xnxhNvn6gqgG~VjRK&u_cxhu62`4MTzSO5 z>=x?QD&P{(lAc|AYy{)!avr&@Q0Cd2>ZcCiO+gi}NPre&icAa(XlAD}r&7}RQFThZ zqMWqmW|5khu^8q?GkZ%f&U3du%;G-;VD!sokbe38`%6A@jeYMuu-KNwgqHq*mVcGC z|FsmvcV|CwZaS3#g>V{%BZJXVv1ik8%cE)MkH#)6gzUT=u6z69mD@PA;WN5Xk;jfh zcku(97-ap<3mM;RmIf~0whVLRUaoK!{pIZk>_loL$>yz><<7oL1~OOj=Z8^l_W6P3pk zkG;K!`FKt4`NeDvT=oVcq*~qY4sIi&oe1v!x4dKXh|&ntyK_2@k9WX@&y2UG61Y{*%mw0-5OnVu+42~KWQ2#o4Qbcb;)>>5 zu;ST^mK_~k2d=8CW%L?2C60eX>+mD3@cPXMly`AeUVzto^smSMsVQiL-GTSFPu@=# zX*%Y|m_hWMbs|dfH6B@7tH?zd-|l&)f0m)kGz>TMykm~E@166)Wrg-Wxq}O|x~T1R z4$ITb!a`WDqg=HO_HQV^H88nXb+r?ueI6ozzN#A((qXFHwt1@C;?%(Ds|9f;O>q$k zx_n^Zs#E`;@Tez!>LKc5uGJHNI;CAhr{L}KHI}msOF1uInL%{=G7yjx;$9Q{Yr}n0 zra$FGzV^fgt~wg`{AMTp(ho;vrD@Tx(F0p|YFT44DQ=jaoI9@BmEUJt;v%AnD9s&w zjX9mxEYTYoZq+W^s5DA+u8?(C{}G;V&=8r#D?hCsU>L1b%#Hgt^rZosRS&TuTDTrD zIFNWLBDdeC?4}RkT;-U2WEz^_)^W?VgOxSxPO7|Z-LjdJvy96r&^zDPB75sc8>!7{ zVet6Cw}#BVGva}XyOaH9!aLn+I~DdDwSF_qG#xFE;Vu1r_-Hv%X>n9yz5MGsZ*jnb zuW4{#8FDpQ4@I&@QKhg@*||2EDHme@ zNA>6STx8#wM~ay_i)EsVBMZYuYzF#(;m`}zBsNby@L8vLJ*X5i8LKh&(oSdp(@6vL zspGw428$1Bw!1+8fbLs?9o?sgZwHC=oF3n_lKKWVK)f1;ln2jSjKrHqFw0|{u3l-> zYtBY>EtGaDsyM2N0sNpL^?wh&ClXaDvssVtZZ_eu)Kj8q`TqSE_5={#GX-;(C3}S| z2=N$Z^`k$^Rp94GJ&RK!+^4rcHQFw9jNCrGm)f991s9zG*x>x}A8wB0q5H3O%GfkZ z|3L(vVtQIz1)sO9TY855oa7>C zrF*AahxO8<)QLx_wUtb0dh5yG*|EWd=ReOQ_ZCk5 zIMs3H-&D}6N8!<4mGi`kelyTF|s=pKxv<_$oJVLelwR{zS;5 z?3qJRv8=}edC@ue? z@#)MSva-NA@-|lWqck4q*aJW*fEXW?ssD%#es}8Ta`IW~DTeNev$~QR%PAWlO^g8q zz7n>Cel2fm26KL>j`rVpopTSe@MYCLDGX>4^1&ZFN_>Ai_WiFh8LRVOXm_8cSPxGr z6rNQ+6Z8f6vHV7AkGqiJH5JQ|(_1|WIv)YGkDYry_TJ-_x9MU`<&q|KQ@-fdP_Yu{ z-X$BWm$~t(g1}pTAOgMmT;E5ZR$1`y{oSQpd=RyI?|Juj z&Up2`@tU*WRy`K`KVZ_ua`*DV0a32&Qq$vG35&O5$Tc&{59Yy_n~EA6~bxE7N^w;`xcv;&owH*+OUQVN5>r`RokHudqmv@7Tt*>1}rS45y)^{`ls_TyskvTPAm& zi_|p5H9jbzd9Q2Bo{(;LP&fc^(`9ZK=3BsbeJIjXz5INV{H1UZeMKeJ?StXE&#w?8 zJ>g{U_FnAkL?^TP0{uNz{gEL)q>Yofil5CnON)Y|jkT{h?%coT4V8f8f$%qo+@3eogMq}yWimEAO^a8KSILi z6MU?*1wu!l3)N|e&NurHo^Xw~1bcoPz6#uiwjPv&o_rH)L~C8&iG>5^@?Mt zYfZ7rKYOWl5(IF49KBWiM95A7maE}GjbOfhm(m=Lp~KhT_19be4B!z;A?VCHJuQR~ zuL$bR4;tg1jv?8#4|4Td_gYx4Zh2Y89;AGv(B_@_piO(0-Gmk7OQu`i% zso3KtJ-gtj;6}we7Puat9bDRjG*yoDcp6ld``x!FHp5U?Q{-*kx4oTPt=9W_bb$3( zAY7m%L*s+tx?EZv$@SDWePKKBhxyLtvihift^g~$`_6Jh6tbppSh4nLU#qVXe9KD? znA>@`bu=36tXcZR;M&~!K5o8zYQ)ctqbQ+5g<8r>Ixjd$Z^@9(%7~T?eMpu5OaF8( z;O~X8;){)i{&7~;rr`C=2JZBEz7Syzs6ii>M}^`A!H*{)LI7`L8KoM0mH;~VuCoJL9gK|pL z#W?AT0f}HV8IZQdkBa9JHD{#*MJ9yqil6a1sDkExGM}+qa2L8LLaKVJnArX8Jg|G$ z2(dX|(?JRIsvL6%xx*ku`cPt#FV8K!P3K+pXw;0AO?H`Z%x|}Y>-tH%M_l$JIqvlk zUwlZl8{B}*i~n)C)b%{-P-46gPPq|M!*gX&@vsvw;z4oZK9oV0j{JP7u(mwuF--sN z`>4VCwGFMOT70nCu{7hjZw*49k7LB*5N3pzVyCh9E6FiBQdf(d#hz;%@^GjeT)c?? z<)pPOVRXf!eP-FAzUonJ@jIbMFhD$h4Jr(ifwYTCd%h?0E+};6cO8yB5&#O5Ss=CQ z*~H!@XIz^&saq6HgNWc6H}~i5gRBA4p~%IXtp+9gnR0h8%IzZFqm@b|?r+0huhC19h9m+=AaAA(B&!_ zqCq$Zy%je=hcCP@0SnCRDKr= zb&%x>EJzOE17Sq!E9eaNo@7fO;xOwhc z|B<_~CzM~yGZ8q-$X}KP5h;7QdZsq&8EILjaD;^L^33vSv{fm?vW?$Pz};DQFhSVr zuK$8okB*AYfYY+~%+UY}1p;HDG+i^jlI3w&zgM2PVu8l>%SS+>o1?}DE|{(MzyOO*Of;o&DU>~9p=7~yJA~KePLdeBML3x zdD~xtzi!&a6*&pOv@FqxOCK*v&Fc)!*1SmaZe$3*Yu}cg5x;9L?s`2qGOt1Rr-jxl z$x=YvkJx>X6Lo965?7ZpxoP)MG0)E)@%$-C%)XFb$d{_fIMd~_zqm#-VsUNf-S_TS zHe^O;D%O9!N&a^@<=jq)l|kSW5hd$WCw8sUO^DS`ddl?+EA->5O$ABgOBOwa?LzX} zPk!&VB0#JF7z)pxuelo&csu^ErFRbk(sH}?YI#mid92=5fMCEpdQWCW)(rv(XF@@4 z13;0Jpa62EK-aeh?+ub#wG|@GN=YgEqkz%Hy`#v#_xX~xB#@<&N$|XKF&hNRhrs_4s1biz22+_Zs(^9=ZeiL2l&`!0iEWdt8(YF81k1=IN)=pmVa~u3W&6*j@!z zk2gnv{m*Vd4LA(*LO_fq6j^B#_lVtm{C2!u24RaKmt& z{blU!pzWp8@7LTm4gZwgHQ#oN*7S`B0xi}6iU=;sT5O_WnRdWxpLH7~wt*H?WoNml zB0GKQnK~$yN!R2+$dxoZbGFO;tvKlJ%h8sn@bn!$%+^aZTfrl^bZ44BPx2$@3Ergn zmtxxnfZA#lUsF}H9J*C=ew%*cj&f0E&j2ouW7T(c=ySBtm+18H7P{hy1KTW1g~HU+ z*eh4hP#Xbt)gAx#U$5%C8Qw`->$!OgDE}8NHYMUxA7dBuiLScJmhO?wql`)XafJ3| zUVS91z`YH1qy43VNE$9BX83Ul;NAiYrlkj0-it z#X9lV)p9qh-~DccuU2IJ-Mw03MZaV6FG^gLe>HzDQ_Qdb%T+L7!m8x-#4x5v%2P6j zDXG6e_dr6cVybFS7mt6i4WBSIGc3TpzghR8ZQH=*(%=KY=i$LM$oZ8%X>($9k$Xi) zxl|ers05KXAeo`RjYE1^Vd+AdjO1L<0ALAkxd;f+!4$+PbGSRf_1KmW3>dK$rP2O& zoa?k}kK&yy=~jZ>TXCVsdde|ND89}R{}6#t|Lii_1!@}upXVy zbSr7oUh^jC6Y_1-VCRvrfd7kR5yq`i%RI zE$t?A(y^GvV{@5=r0S#^I)ui+(^%$2)&V?|M1*Mh!IyI(uXAZBG3+;OuuDp=H|OBq zgz?~dc#10sS72XNWTY`?(~gtqUUE0|hJe+IUKmXsxOUUDMLE&nhjo+JD#?!u-7VW>kNZ4+9_EW0 z0m-W@k^p;$W(LYY)$vRloQLZ9^Jpwxvk=%n&kn}I!`z?5l}tAO$%vDuBjh3Lm26Rx zD!2s&<)uJi5A&!&_sJYWuc&fyoyYI$)f4niJBRzF`%KJ1iB$kXrGI;clpJvwtkniT zBhmE?k4OQ`8hE02Z8m_R9SNj#LRs2$WF~-3n?p8H!eQqlH+F3Q_wlCt<7qJ!Pt$lf zWtCyE3Nc-y6b(U5u~3Q)2&F!T{l!Q3mhanQN&jUb()@*KFtatLJuW>IcxDoR;0x*Q zvn&RZ#t?`i5Bu&9dvi;(%pz!5_;tH+Nk0$m=wpDNBTM+OTY=7k` zC%|EdVU4>CysA3fp!tc>PS&oTy{MXWLEhGHI?j zl&Rvj*DQvYx8^hu+O#VNZFcIdD z_O)IU0MBUOaaw+cEF;hRBJP@tv<)FpZV5e&~!4Wuf2vLmAPe&wVuY^=%4x5}% z0IikiE&+1F@jNB1Jtri!757hyPb5jW5VP-&glx)a|oj{inU-fe*!pm=W`f7HcqlKRR)~bgBvB zu?7g_vsFz4lV(7r=5S2!Lujp?0uDs20XQPelnVv>=&5CL3V1DXt7_SY&B-5VUL(6g zjo3Qnc|cYO;{FlhdH6f1pDu zQ2bJ(Qns|gD^YOTTtRx^EgnpIK!Z$MOZ)=WDqojc=fCEF=t8)I{3Od^UXw#KphX*C z88#e-d?wv7l5N9LiZIXFfh-7qYxu@;D{1}8;4mMCIB=1sR2wc;UqoJjLR zh`L~`)sJ5In{N@{OY{y-tX14KbldcV1=8=mNBt3h9MpOZ5NnBQE~0ZrCB&%UtI>zs z6^|SfpXpu;fWA7&Y%eJx&_Rn32HZbRs8`CasCD7CXw&`=6WHttd2Mba&Nqhk<5cTb zCy;TPp8N#KJ`vF=o~8JVZlA`siDd8RKz`~#e${=oX*p(7$+#28x_$4fZyH<+4dFFE z7{5C|A;WcVYTl^~-L=Mupu#A8*uKgb!!(9&Aw(|?VnKvjq(Mv~84lCX_-Wyy08l^k zIekLb)+JWn<8#F$2#&_$c|gtZP!}Q$q*lLprDD_e`Gt6A6Nqu>Xhhi=T+>gyb{nsG z2)a`;+L$e>S0)M;O7!(e8#Zi=_!WR_z0WL|ml+gM0`$7L0N9!6+zV{yTYfD>3Zv^; zd*-2c+K>IIgIHYn_NV;#?w3%DuS^FtE06#)!^YHW#qWz<%e(d_=kfHx%$VrRcwI6> zixW>q0G5Itc|BBD5Kp2p&5;a9CDY!BX}`u2kvBh4L;7CR1o)vuO zNQbH4mHU&pqhMcm-VxKMnWBXn<~y>`BpCe()TZUD#i5@Ty0BDTmR{P=|72n6NcLW* zPdVpTBtQF28VONWDUR`MV?N9zl4%+bu{)DQzQ3m112gZ5+_p?(jNRMZwZ;imyHcleL?3{{!uia0rrI4 zaMDa!$yRSbC@K8b*UYGcQwv6@CDEbMmtRU)XPHQm9pMBhK7*kgc}Z?WOF}p`!6}+; zz%a!_>EWp<=TbYrGJXC2+<*Jc4heVRTK9hS*_XU#u@+>w7FJ-i<@)uM(}69~`)jV8 z)tqu>=4Aor0-_qp+(m%prLv1ZGa6aJ#|=v?%xOYt-_0w1&Eh+Rv9VB!bPsW#^1Eu1 zOGt_mc?r`FtFK5r-+;mI`_?(mw`}LP{#*Dey{+-HQCnB;b-E~0-o~o9eBR%QeAf_< zf)H+e{$}!Rt2a{xxUWG0Zw|v!D~@+golQN!@-2jYJ$6bf5~5nj=(+I6Ad`3_V?!gY~wJ3LI(=`ZixR$0rYZqMcr0;%d;yM~)@c9)}wkdnc$P>864uPWs< z_7YgX=gcfNpj3x!F9tdm!-%G|Q9#>6ATT*BMnh;FIqJvZYSC(Sp(FF}kFOxhHGy3D z5Nrzw71ffbyaz>u?bp2Pc#F%_p@iIL?%a!%(_AS(UxVVszoj=`esCv-V@X2 zXOfCIsI)7$(*Ml?$p$V13f&*J?N_XIutZ1T;9Zf`c8SH280K$p%I%m6O1`1f{P2>D z-$G_pi9v<#K95>0lQ8mFNl3+NP_gDPJWeh$+*Lh|f-H78BWn_uI8tE94knzCdY$2= zM%2Ozjb^q;YnYv1jw)2wbP%~f4~S0}R!v%ixWo^=u?tR?0d3V! zKI1^OGygfrtFskS{6cfxzX<`|D9EV9R1^KYVd<9og9vK^9j=nJS#Gc3UQU9`I9rpR zS9J-78nH_E|s2nL*z_>?j00^+o}5Q)=R z00VUcKv6?^A`dET9uE^Xnm=j4@^kQgB{|Dd&x3~`YswMwWVA+*ZV<&j%b~F)RQ+t9 z#^@ol04vQMf~YofM{ys6g)LbT&QPDuH{y%EfQ+~SBxoJ2BsV8p=cjCPsn=#1Pd{xm~Io%$3d zq-=|ncEPPmt*|hi&LNG`?Fz*(nIl@ohdS&+b^eAykQ+z)aEPTe>m0VBtIh-{v6WCZTp{$ zpSs_=oqxZ}H>SDUG=S=(3LWu&A_9@j>}bd{K1yZ`-7dQ(yupZj)H7s`p<8NvqN9r| zVN&8eCZ*3&#LKT%y^f;vP%j?=5c>@#rs1Y|h=h$iR5^`ei&xM{&<5=H*)Gk%X&lizITd z=QZE9n;wf$yD)iC9w&HNl&f_wMY-`sR?*pZi_5YZ=yd#csHAA@w5jYw4}4L} z1ex_~nssk5T_p8VuO%u}GSaJ3>UX>ykP9MgBJHHmKYJe=P9A@xg_OwjvsX6<)4f-j z(pF5Qa4%2H1Yjz0r!y1FJM_D59zqJ?@A79JQG|Ogd)%v_!P~$+wsu^V!KV)@&ky1j z1G&igZ(t41$16rz?XsKc^rbOv| zRXXydytq^~QOkM-h9FR(x}0C_(Zw=Jho$T!oiny!T5cC5+)?j*=c7FE^^a=1sxSQ2 zaK10ZsTZ+W&v#~AE;*%x)jPTQnwZf%EZImqW#XpP>bDf1ps4D)p}Ty8v%WLk^zoqNdj5|yh=m%0_bXnG;( zAszp$ZGN?SExoJV7abZIELS+g#s@jL`LgX`qlbmvQqU4M`)!q7dyLP~dts5#A#8DFhtwc?(s-3* zkmfBdY;DOem^=p2(v)yK)okNDb2$bC6kJY*tJ#PMVl)evenUj2C;N4MOnJb_59x)^ zAy~Koqj}ZcS}J=4fTECB$Ol}@9I^iA^EeQU4wkM=rj3|z4lz?|SEz2Jtj>+Em@Fny{8sU01_qy^%Q^uJ}U_?9+vGe=XSN?Cpd{=hbe6&*+U<8 zc=f5`aW1pJ$4jQru>pilD)uie*TJVR1H?-1xvi4<(xHqqrwv_f_0YpMCqId+B6dC? zxzi0ZEgLkpWnW@Tic8ljwct)X;PUDtKj*1x4MUnyenH;1uo3_&FVBRIh0_i{y$<&= zux!`B-bX73pN*S`>ZHxU!Ut^=+HW+ImXpvXg*6|N^$$q%IbSBycryD7?x_i~o5#CP zeEL==4O}c>m6V5D#OXr0-Jyt7V@t>*QdWPosgy7WEAs7ErMq&BYNmA3#;2TT4pk!X zMbgOUjENw{Ww7`N_z(!qzPwiSLu+V{f`bUmfkGjs%{z&7R-c#{gmM=E@0jkDC(2$GBC5EZjdzr&k z^QKll5ATUmbm5LcIb6R&q85wRz9NPp6A_Jc_=upUmiR*V5m1-^CM~0O+2X1F=8IUf zi7a`HTX`ovt@pYA&I{+KvY+a`)K~=9&!fS6E93IC6%I_MyQ5`Y_B3I88h(wmpkR0w5Q4*oc@0 zJe2c$BFJTH2JvJFka4ZKq4(-S`H-~vLA3P~G`RqRp^d9!wt^JZh1eeG&{Z*?bMo14 zM6M=D%GeLoNrGUKXh6KJIIzThe^Be$i_e~Ut_#@*9T)}+BJ%j>_u{>4d?$?l(+coJ z?LMN`1H29>B1!PU?^V12G26ovPX&lDDctK-&a>LSoai=36(l{?(^es^zrEibutWf67#PUki^$G8)?p)T#zmg^x)DDPd~-Bl_|8uF92tvZohp9VAe+DT)tu zN-JBPE}_Dkh&bzFEkr{kL3)u{YRa^ravs?EHhPj6dux>@w#d~}BtPEw!i{9eDE!f& zBE3H%AWIEcS=~BcilsoF>S?R?Y%@~DY?F+m_77EvFN-+Z*9c-u-$>4r zShd>1*r4Vtm$VVCiVasW2m~i=FEHZlP5>0J5M^?f8Wy6kLPYox6&kTX zk4}tYWnL_acO>sKy>!WesC!F|1shm#L%pGw{c;t!f>nMeW2~!*hbYiQ zlN{d!7)2#1dX`($y-zr2<$5KUjEi)FT2!y!u~%3uV7SrVLm3V+FCPx#DJI!LsQb@U zW?zmGfyYmg<+r(l-z2;V%o?g;D2t?2*m|X$%iT#tptGyG^x7wBhQ;jNF$)h!TsmbHDY@R7yaswK7a`dw&>& zW?y@Kg!Jsiph`0_^YOJt^H2Ni+d^aaBdA1hi&rw5BaMM-$J^=>04!JV{nabsd9dm2 zfjxZy7R!(^R0P^SIR)p9f1sKljN5+Bd!ef7+1gi9B1ZSWQ*1w zE_yA(oI|n}dU$3{66F&<(MY?3dl(XD$MvXQs{5?+gvrt{@Bv3a46qnd7$E306vJ43-R-E*|f z@{Uk)WlB7o5wl$~)F$5Z- z4+t#16!K~qMI|CM#>j;Rki|=yx!fb}%AvhQ=a6&Y99lJg;Mc~CDo^CFyE4C7LTHPj zQcDN8o+EJJWxrc9yE0vG(Zg`X3quslcxj0dwTfu+T3MJ8*FL0MDF8t4H(#0L&T)X9 zn*-K3K&z2wl18$o`yh7kR?F?kWpU&BRjN4f!>laO*Kbf5e|W1^`e0LS%#q!9=?ZD| z8#)NxP4};F@v~Apg4>Ad7>G<7M7OX4PM}GN(rj+R&CHG?a<2qZSTG_93@Y7+qFhtx&IH^WS!?K~7fSJ|?)DzzJ4LqYfv@3iNd z)?eK#tK14qVM;mgj3z==GkM`K&T#xRAbWLC=xsW5`gz_nYtmt>lf1-w(P547prrNA6&B z%a?gS=u9BLk2Vyqv>v6rc2J)i>O*zu%I_4{>M}*7#_!%Kow*F@%&zAEXzTBgNbU_v z_U;bi6Ii<&QRTw?Ds!5Qrf=lKkeD@|G%>*h6_YjzWnfJ6*8S{+4|~p$vB@`|Nx4JVTQJ zX!(OK&!!~`H&g@}2#x(!A zhq^@2r+=Ny=nZrlJl7`qKx}q@V11+d+;$TUL1a6@dupFoVxctJ0W!>we%Q*KX*OxU zwHK;ML3S|k<3 zA0{azftq|8Tp2KZ*P|>&^xp3IIAjUnjJzIB;tW+C^`&dNj zU(}0#4kxB#f_|rEcU-?hWEXUZS|weAHJ&D=J}(jq8k^?7W|*`r!-*i;oHqVT>+VrD zE`{CKTDN!m*1F;``)@Q1U>T&vJs}S68MH%lsiH{`sd}h*BT0Tv=Y6@cFO7iAi0}CK zr0MIZ@O?UZ5JGtjZy9%0zzo!A?=&55FjW&1A{TsA!Jw2aga|Z&juqPHvJW=(gEOQ< zvHRf?;NX{?^c)oC_n$l#x1k?+gmFF3bT5h9`Ly z?SF=V%zd{rneiR&pbq{o!pQNFWPWKp#H)@5*ZQuunFg9Czjg(L+DQM&lzU-lK+<-> z0SWq>JBq->aDQ;GgBJHz^u9K98U|^4$pOyJ3>Ba+oVR8!3*WW<9Af4D3lT~?3oC5_ zjR!+&kC*&Bz)?rL%^t0?@|#~;RZXHtJeVWch_-Z`)>v*|0|)bpbzn>2Rgw}hOj_7 zR1Aja5E(ROkwgL-s}8`kFsjyt^1vm!I9ky@in~k~fR|J!BGKRxSdcoIMRkURmx59v zkjhLTViJK&*|4Wl?P-!QQ6Y}=jb)~Un*MUw?^hnOFw7oGVYTPBt+*7l$27Aai1BNe zd?22Q*05y?8ILCVKBw73ZM^ENoo#={6>E8Ad)|Pe^)c#OxD`L4ZYapzO z`elIU3K=j(>@8gko6z~Int7@x<)KnzldWy+ZF#CC0|{9EG3Ks50O7R=Nxr&7H= zB+Xq(9f~+tqYA9gRra2``oq4K=AEu0c4_40Tr@bq%{8^AvkWlai<)A@gDjZQ*t7`G zv^;>Yykn9E^AfhXD0Z{sC{wsOU{Vo}g^R&VS9i)QGeYu~Q)Uy#VdZ~4AU*Xo1`Iiv zGh!*y+VPWMv{XVCO8WQM^zQacMYy@mib(9SnZ3tCJE_FIf~jG%AM=_lx1FCchVBaF zD~9k#rZOuPK8ig6Y#LVDItLzmZZpTx!pihdS?jI=}fSEfKyu zq{5u!dUhZB`?pgLpZ@Kzp9bn8F(xNR5@X=Qu}(pU^-!~2eGhmF)whdF_*>w`2>?IC zi9^#gE`6|J4blG1)yhRrcui;rnT~%#hJ#qes7al-x$hS$gkEQ&!{U{eE~2RPOIUIx zsGIADKD&NB*4kELn;6fj*WjvRvwm|cZ+>7JZg%SDSUq{7`uFqC&O0+`_!sF*S1?~n z_?e0_tep?Svnj?k>92~89lOaXZ8A4GP4RJ&%_ZEuq#Sc*Q$xOft>ZGh5jeZ9 z0I8P$u5E;hJ4}5wF!W)T8WlOKeptNxcZj15n^mlv>R zl?p%JL9VbU(_*t8aQbUcZBFH6VP~>Dw1mA2GY2oVeBHfxbXLxr3bgvb^j1qi51{1U zo~q0H))hz;MRrRoAc15be*GURVg&FQ@sZ3X>VC<*S^C*izM*jC4P*df<41={$}hgc zM3on^xsHdTmk`kraOM+Zw*82f{35lA+{qQw^-&c5{ap$0AwjhG4dQ{*G-0b=Yhy&4zswHTwsHXAaNb>!e@bOjuhxt8{ zhjXo$od3twUH&!I2W$X8=PcFg6-Rq@=-tbO{Iuh&ob4 zP(VaP&{2x$tzg|)H_x8uc zuL&KijRd`$i@1-$K1>a12dzFU-D4S@UM-vr*Vb*gy#`I!YYnefk=J+7yS}V zm$r%?c`kHk`E#f80?gU?dMdiNTgUP^@VvngVN)^Jn@_yW4HW6ku3SA51v?)4p{SS# zFCp-NOGgsBYXCd2uu}(}@-noS)_7paf#M$~QO15G{@*ziVc}Ub?fLv%zZK#UR3{k> zR&w=|vqGxOx*1402iRBck4^25IXuWqeVNr#GoYJhC(M*pi5y%UU6$9D;h_X~u+R)30BjJ6|xPf7!e zn1(d}!iohPdrvgWlXFa(x7;yAVC=J)f0b!_l>nmcZ*YZ&83)A2$15%} z<)-NUustLMLsU}0&IWCY2s13xr&dJ1!&--?5%{`#d7<7tF4rIzx^|OA=p_H+Lb=-1 zycPmK>2QYG^KIOhPwA0I`bObZae;T{FF3FCTd8bQIZpec+rz8k6Yl)+MFPyLTK`_R z|57e!|KrL7HpKkoQ#_OXd`<2ioX<&eZ@K1anF2qPCP3S^HCa7?pU=ZhbtPR02jtIn+S)$Jns992BTsS#hHs|HWnc*Y zA_0;DXZ&#lGcK{L?SQkbh6rHV?nZb+2i5GR019d$+xI=1q^a*$9^0us_Vhrm_Vu6o z*9;~3wkP2Wr%YWs;r>+JXaJTK79PGvxc~XL%hlZ}zK5nA8^%w>!q*zIniED8zDxyP z6x#Za^?9*Bd$Jgk$B|cac~pMMcSw=V&51ZBQ8bGv`h$i^pkulvkwqY60sqm%<`S>w zXS8=vpwJ#B?B*@_v$VeO5tEc-KYL`3w!GKd=J~j?VUM&zo^qn7Oc7mCuv@l+QZ2^BlYblN>!UGds+rM_>^<5&k{~I$M{$i z;azYmMFc+C`I!hdWBIX?_p9lNI4IFxh-1puaJ~P8VFuqv6Nn9TVF!kA`QtSgB^8Q2WqLk4R zBq${*D}&=1CL$B|q*0bKO$7`bB|0EEdGFF9<6e zv@&f{0<8VfeRjl(_mhkaefOg#Do}#9f{N~rEKyTR6y$!1Dh#8w%5WJG&h$kB7y^nf78BXP|ODEi4C=i zb>S`6fRmW)i>ziik)>>YEUMsLj7&lLfkTt3XiLokMosUF5Xcw`esUvtbG3i2wp&Ky zO6~p;Qbq>M7fl05wC383e#)c`7gJ}tQ15cexn)<=if<-mu}Ix$>tT}) zkxdOWs)zjOGhw9X&QUW$c#Xgc-Z4!I*p@LZhAXeWv&%~T2_f~agj6sz5z#4^W4~S< znl_`<(#_SSR@<=4IAAwI@S2w8`aGE==LQfpwlC)fyZ!n_C4kQq&Y<^6WEikPBr(1y zU2~hs*Bej$>HE|(fn_=P85`!eCg6q}ZGxOCkiMtNda zhSD#qdml}j9+Rp}Ye6F~98`x(xpdg2)L!W?D5bS~^ry(06S0v^Pu*l`KnBqc1!3M>$VX1vy(+ZR z^5;4|Nr8{(pN_NFEz~-EX5AS3eBv8ny2zo*3>lz;yZWf1z=2qe(+wW=fmrhyIZB>S zOd-mPG;_|?4KK-Y9V{a`LCRno9VJ4`2g2is??do9kLM#Hjftgw7S$;TsLsGTlFHyQ zm=eDI&2N$GagM4}ikaFRH~9>-$^VoRH0OFKTVGAzTkTld9VN)(_tor8qV8xeI#@|g zv@qs#w;O|ZvJV!oL4Nsq)tgFNZi=LDY$LCtj|2DwNV~gUp_&sVwH3rpnepsxB}jpx z);DyKUYa+p-J4X69`UFZ2({8eZT{r}x33Zcp~~jkFVn8A&G0N3X}y8(N&wHMwkhrD z`JJ0PwbpYvwQ}>D4o@8SUw<{ZmSz_riPs#?z*!Mj8k|}Hu%qZtys~0djX=g(CrU?F zp2GPyg+v7()r)de{ZJrrP$3rsf- zi<{8VBI{X708kH^s}F#&|0x>Vz3l)u)6b2#Dl|P&pm-=`9FxTZ$gFU7e+VQ{1SqVi zgEz1f34-C2Nkxs3h&z@ECytx8Tbo`NoOx{_8Wn9H%pw&0n-pog4_V1S310khHhlL- z@~JEO1@Ii!hSIQna-U5yBOElQM7>4J5h0Cdu3MY(@^7EM_!t67D4U1N_>N!C89pwg z@uha&k!v=ND{Jx5atiqNW}3fCEzp6PepJMW3V0>RRy?DL#XE>DUm5X8#V zIqP_a$fs~VfO^*wCPPG*9yO=^kR12)eHtKyDhX;U@4K_J_Vni3)?xjmUr zfVE=m2;NBcfjd3DEOs@mRFY*^RYtHF3(rup8!9eq54JhULU1x+N=#Uj7cqZI@#Jp# z?Uxq>88GAP`fYD*bL%SSyi6l%9E@lj(*~Mb78PEDWzzWOfUGj-K^P^l1}2T<0V>|S z^^1B@gGl+}?#!?;+ae2p%8*j%) zNy}cml^uV2#Dc;Bo!j#6XrG9<@uhjok;qU-+)qX1rI~#d-e(M!70Ogx{g=262Uc90 zQh(W6n)MWl+&)y%c-`_uk%(rbck3}jyOv+J<>mDoGyl-eY6jZ2JnzWO4ls4Ynp`88 z7xojo>$-TQ+~jCrRw7g#tgz|WsAFW=?Q;8rp<~2L)xMi#A+||iZWSrJYUo{hH#M{@ zKA(g2F+rPD`Legh`-Ir5vZwHt_T)QJzYuXgjrU|tPkZTQB<0VQaX`k+FyH0}ikXjTqIduZB4SJvzsV)7Hn2KNO9HzF(Q ze~qsiWl+$Ex_)+Xt@p;g>hn*|_o7@A6rScXZW1hhB>1zj4CWScxA?|jul%#&nn4lC zXDcg5bGN?x821v=kMJA$GG=1Xvv^zQyB7l|4}b9n)`GPc;Z&&uHonPu{5;H;23sMr(JO~WcthzO`X1w@W_+!zr+`Sb=ys=v* zXXOn|1mo`9+D*XP3J}{wEJ(4RLIvxgk+Xp2E|Y7BvAV|uN9uIs?om}%&0>v7J3-y8 zBDzB`4|f)H#1h<*X%c608Jn@*k%8T}h^<%Qo1*K=#w|L(de#4{_W9d8BMj&l@R>?% z{-jwMUF0gIaQR_0d!tQBlvMxJ?vt-{PJ6$7Gc>Jrk@&HDOsdi(b{P`u(d z2eLFS32s1xmH`KG+NbrUHnIR& zZaDF_luRS&LkyjR{AmX;1*a74grCv0=`t8wCuCA+P3c^RDBHXE&`iNoYWw*#|B*CM z&=rOcVwB*dyE!+cP@r){yyi& zFJOV^{s#aMUN789gL6@P$)Etv2>^vOGu+Jc9kt(hamM`+LgFtjzK%dr0Dd^aeADRy z2iWIj&V8bXVt(s7273xOgu%mueMv|Hu-)JWlMx%n*{`o^7`~A%_Xpd=9{z2+vbNUR;`YWz@vO>LkkX*mueA!L8y;7k{9J1&lwXzk^7B z_8zKd=Z;Xk2>}9q%U7G;dC=+Lo7TcyrIy zz!*8EIqC=x`7Qhb4+p^IPr;(axE*F`)NxtVmg7vio-6D)gjqE+Rqdpp0N(>Ll1ol1 zosOu|?p$yQBNw!tOPVyZ!eA&wey(U!BrUMqZjqjvG>B5FZXADyi2Vnr@$DA{fY6IA3ejFj-f z5*@Ce7DVsR&c+@USvT1_!-=Uv3a5X&D1-&H5@ak^zn38og?~DdUUIQoC3cw8P37xj z)JaCl{#ui9CsU#H;`i6*8xe1#EEGNAK+6vfOX*~u;e_|la`b`tCwSdD;W|i|UGxLk zh^Kd4CjTrz2&u$cVk9;zH8BtTNp(-^$rfn6Ob*O(rQ;if14~5-u=8Q!O1vjQEuBOGJT3 z>zouH`_mjp3dQOk1<6YW=4G~-)lH>ko0)AKNVwd$L6NiCjbKC&=)}NPM&M8ub406& zc;y%2CU*`%u8=AcF{Xf6w{6HOh>q}xmE=i?*o+{40mKxX=+S_gRMHyAKG2UM{DDwP z+iVV9ldTKlEvLf#1aUSI#XcAWI$Pg z%<-0%iJEPIUG?SjIKXYtIo-&BrxSwJ@Now0<%Hy z-ur-fB^o0<+Cqf=#K-P{C{I@Wm?TK34969<*@rmIL4<7xv@NG3`y>Uv=w$Cxh+)@HP%7O zhw5+8!t+mYU9Vmt$_YG+^`GKTFgZBb@tqIpoPfi_6m6L`8%*bA;XfD=g*L#~pO)g{ zM@c{N_7it(C%MbX=6F-v>^=PKi10i^t++}SULx# zTm=C3ZVEbe$teT0;FI$yn-1=B7zLOW(P+C1qw@m@Tow0Kmr6a2h!ZUiYN;QTQ0*a0uQC41ph3| zA9^}M9rBzd@+S8ia*oh`sLiJ1k1)sNZTBue?u5ty*|=T^F#NAlOrFRd^sfeyoKZk0 z;AI{mX#piU(R$k$8dt%o;5PnSyhSyG>v42Gm1Y`5D0%GHM`IHa%a)YkX=gvJ3ND|> z55E=>k-NFBR0CSwl8eA8pkx79LmicoMJwyW^lK>TsEQhHPxPqJHWi8Pk>swi>pUrc z!BF|z@M=Q@Z_Md391uGw|K$j}4Z%>wAJ41c-|)IJWsnSV_M6%9b*G3guyc!X zOkqP}DlY59N4_R=ehCUKf2RkMjHAJpau+!Di6{eo3*`|^hWkhGv-|elH-9f89~@fy zY@?rb?)C52h2oalm~9JO>~kQE&m4{MOu4a9ihO0afpSNuiWv@bXfx^fXi9^dwCcN} zt~_HZ5YkNpXaQtU_I)c3Mfw9goX)}vGKc4GWY8gih~b1>r$7d&`aaXv4n5L+`aZ^% z%=~JmKiYjL52-ZGU{B02A&Dp$;06HjJV3&5mnNq2yRU0mDBRe!c;iqQYM_(WSMobM z$e4xaqajr81GJMgpyu0w!3~(Si&@yFrTuZ4u)@9s4r{By^?=73U=$L(7?1SMLtb;D z-`0f%lMzBxxN(VNY!D_7pB=i(>s5WX|3Hr z4kLOOB2OXuIf+PS}K8WcKdi9IDT*%OOYfB^W&x6$QG-L;rd}os3J5NLd7J#eZD{ zd?mpO1m3w;jFxVHqzm&3uh-x!}17`WJD1WMe9V2)p|_^vA;s$ z4POuNLY>r?n^dE$)W%V^*>u#MjIcI~@}|M*EW}u}m=>Vg@1f3-4O=x5^HQG zl#&mSNReutkP^TN?LtV_rN8o7k9IEsS)4^KhkWy;gqT@`24ie+HvhY%WjCt=eN#0# zT}=%nb=Kp-Fc3yUhvXg8*%wW-<_M%^a|$5MIuV8mhP)oQ{>h=6X2&nm(Xa zBBnxw72Z~F2C*W#SOi>1dtFjpOP;<){JzO?Dvyh?%XMSd?%>@eco{dSpdm4*i5Z3- z)@bvVsc_p`sn&@J3CqUBM~#}}Z7lO2q}ulig?Q(2xEy!Xusg03YS@bgx%Nf1{S89^ zKq}Z!2h1UNdN~B0;zv zQ(Bk0Y_~AJE9iS_+QU%c%F*I9e^GG~++r6v$+~o)X9kpV7tLcUY6Fi!o_s$`^)yUf zx(NbHVg;W0ul})`A`Zk=>C6Y^V&$oi48BWO z{g}tTvIB1rv-oC9z#+XyCi%7xqm{iIBYZQ6At-loDw8-6`K$`HB$Yh)W%>mz7;hcAcGn z({lBvpIJPiR;oP-0=7z1f%T7_?cGGOizkg_^N%^>kZw-=$~2Vxi__b88jQ`PleDm? z&MQWIN!5`b6Z(a$zsD?neVLpLN@yX7Cd93`s( zhjz8;2C}BYkTXT>n0fDeJJX%S-iGkbDgVy3=oYuJF;$#-cNk%?f3~=|d^=F8`zFQ%HgP*;Jf@BF?Cb}nT6wQrt z?vga3TVYJ+Tl2B2lWIR~wLV0N^hTSn4X00*_1L#PsQi81VR~%cc@Rj}#<};F{K$jC zr;hEFviG0sCBnveE3@^x60{z*Y~afkhZ&P=xWTWG7w+LddJkukbJPcGV?YT&6u1w=Qqf=Lk z@YKn}S#sY$%-l#HAWP<0!ip)14_3GbSBzuWU2+-XyvWSJrIs<4Z*PX)l(K4l`^UV( z#48~=_>cnQnGqH6u5m+7p944_kt23f)Mh|f`D(feS!3j_?h(ZiOnsDI!f?@q~m`t*SstUo|k%u1>&R3e}_48iG>u}D)D}}(d&yN(*y%AVB~9v@=>_wU23aZ z$Dj{8xOFXV@z3->gsRUDW8SxmWrD|_@J@t&G27y>~+>CYFbRb|vUwZ_aO zA#zTKj%JwunW}ricTmf7lFLHK<=7Q%GvVd>s^!+1<(uL~#$C%Z<-ygu%UoF1dLHpx zs>^-t%l+-k)pM_!Pvp!*$lm|EEGfOxYqB!Bx;*yJ%cnf6bAMkxnOW&lU43zN^=13& ztC`i+e^%dAy{b8p^StWSn&T?#>g)IIuV+Mlca;n{o?n~Y+MP^+v}HW|fsq1b#>aY^~y3~PFBs=K3? zjYzR+sLNLh;Yjq$_eE?_iVZ}uDXF`o6O}cUJ?-^`ap4W-xyn#>Z&?lo_CghA$@MBHSYAO{QfIBCH1#&Jz_IX<|aoT zw$(cy*2uh_&B#4hGg>t?G{5ooVbx&Gv-`Kl%Cgwv)QQkoZY;05#-UeRtr6!^p1;1i zvNq=E?Cxx$=xU)_T$}D25LVXId+B^(Oi`DH1U4s0DsK2rlUtdK=YPbX2wF>YHs2(j(EKf|LU3ff}B*_PqmG-jU6p#*a zT&*w2ZWw598_CFO4340sRCeb?JJOR2kGO}$oXMEImwvvB-ZQiQ;UP1*A;rfpdc5=k z8=xAy)j8K$9h?!t=&Q~yznEDze*E&uv#C`3z{ZT`?C^@Sfz(ENReHy@vXbFzrHKsh zY)V*B%!Pu~|6`)WY&#jlsmktXw|_rRD>Fmgy^2#5lWQ7Gf13{T z>%^qO+Ch>iKUD!c95m?2fOE-IPaKK?7_-hP3hW(u{K55MW)3tHx^Y#j`kbGcBt}bG zV+Lzlft_`BSkgx?MI|$@@Ul~!!evgWWdw#3;}X32p!B7g&H|Z^RbUOakhND5 zM>sUN^+v1weD|$^Lc}hTA>+cN)bRbVd3!~*$)Br%b1AA>YB{>~pF1o+5!t{hiGezC zSbgTFrjJibWW}ZGFm$L$I4wn_CK4HONy+pB(X4mkWpF$1GN%ed9!*dP<=!2Bh@g@l zr`$d?pcol^nb(cc8?P|(&)waCviiFc5B`-HEHNB-Z@9J&%Phwq=p0 znzas(VbEuOygE5C|DVrj3am`g>GVNLh6qC&Euz51d_v^v=ExCNm{n?dnNL^HlCB+zJ(au{d|`@$vSt&=7Swd z2bwB=HIyn>aHTLNLVG%_rFbe`$yTA_?#`p&u{!1$cSTI(o;4DpjMY~5k{GIzZCkpp z02%YlyO6(~^&OoD|LP51k{0eSOu2L3__`v02aud~XaSZAcbQIm5w4^<+wyez@;9=L zD^USai837IRtl<31EiWXU~KNT|Ex9AJanb@)<{h#S2vMrWOny4-^CSK$V!angZj9X zY}jiIS0E=o#)|O7Ejadtm9rXQciiqp@k)QDe%UU%WBe znwlb4!La4+g6c!lWZViXonm^XbY{|6_(S1GZA}G+=&*Y9RZg~y z^Y8mzKjM4tw1Dyczk5%4Pmhv)rHI`w{7DxWYRza3_J&BT4E)($COQ0BZVZS=J^ z*}54!qY_Sj@wMhfrIjh+K9=%FV=W9_D{H=n;uWPa7F^r2#z1HOpqC;dZ}!V&p>@F@bw@TT@{xnoMFRZ>N{R^QMyIk{ zyeO4~y|XXI8ssdt?p#gyQlXt%ZS8k%La;3AB3CV7D*mkv{_}(T4YQf~O^#zIuh9Ck zm+~5X1c>sl3Yaf1yf0Q94Va0&_=hvh=C=c9;j@9%%3V0G=lhO@g<9GX-qMCW#o3@2 zIZ@{=IK)WSP*I{{pe2FJ5QBCrBEOt+cjx8n4{GX9dR|VXlrN73dFbGdmKb2#B*Knv z0M4*3oljZ{#6w}Wg(TF$sfl`S$V^lbg*J=IjX`qEq-$c!?|i|B@=YBNF0bK@&I%+< zY)?G#%)gB>W*Fu@r^nxDIU!DE-Cg-Rt`0aMWwq&G`AlfYBOS+-EJ9MHs%R{zhcY|WgL$B8!=0pS~;6HD!Rn9*7M9y z;T2Vb-zQEfxG|tzZ=%snfEIt*JYe_Yox5TH8Q-SpnA`Cpc+uezEHWqWk3i&ULKet1 zD3`Z{%e<~^BA>dxJb_MsduPMPwcT^K{K>er7T}VZuAy?mFt(Jpjfk-9nsYl#p^q)E zak}K-GIZ`N9k7cfd#)fOjk~Vop`OHZ+4pzH#m)u66$5?)l1M#1x~=}M3LJq5x`QI-gfFL zp(C$BA{z!zcYjt`2nxNqy3oFa0KW<2Pd&pk6s;m0kDdk>Y^yzODTGfF^|A;Zi+4(7&mzFGd}tL!~4%Yw>1;zwI!FTYhj;=H*}JSdUA3231UaJ^Lq{`7~ayg zmu&ayb!xcm6;$Otl*+L?+iScL8W~%}!y4c*&!c(RqGhPZUB?Mve63RUhikd2vvjNq zWDv%CnFnnnhc!bd$~w*8`8qB}T9r4=%n`%Mt|?IbYYBk$@#a~*SAo^odBLFXjU`40 zGl74@Yba(fqLAdLj(NWuKHrzl%sl)>bG%tR89uwu^=;wO^`7?RwUf(z2HNS`gX40& z(SFb7V4MmV1}diIU+lBB3rd1#|2x_`~f1&Ch%D;%E6wGHXswDO7~B z;=l4DzhQ2(NR>Z(!nGQS6&^N)4OlRS#!b1_b{)tILIET$;H8 zPF?<@qJYRPZ55)!&HPlw5m0+Q zFi?{IB^0--dv2;Y2dX*e&yYnmrsrT!st6~%H&fg;yJV|L)etT`dNApw=1jtCSt-2st_TZ%rX-da|2Zp3vJCh2?HSp!oaMa$J{I)td%@p*tlm#2J-e() zt?-M55?%=aM_C?1(!&rg%`N3S8ZD2v&><+gzH&9~aZz@#lNNu8AKoweCnX0N6>Puf z#?82nTex0XD*+B*Aw9*D25L8OkT3>nx(=Rq&URoR`wBS9_wr(*4l->+OvmnCQHTu^GRHLSd zM#7QIgn|@fBXb#B%|fMAiHbZh`{q?KXUuqzD1E({nC4EHR>M+tLwZV`+h%Tt2LuBn&r{Pb~2GTtpi7Z@A0vy9Pt~cczM%)gkxd@%p$g z3559l6P&X(&PgXV{R6W{y-I`BlmlyZ{JG%={@fl)n4)Y6VOrjwG7#LoQR;7-k2<`O z>T!Dx)Y?5N=oOb2N*nsZ=z~yllt${(1#1z!`ChOX`M9SgGTpFVeJx^eCqh_5QMU}# zU}th`^p=-2!^5n;b2MDPTxP0;c@}7^%J6ZMHbvuMH+Fzy?xw?CE_W7)jC_$0AheB> zUW>Y(lOOX&2cmJh_m{Vx{8hiY8^H|6EcZ(TPPYs-ahA2ka%=UW%~ypx0X{R#({Nk4 zF_qKd?YCP#F zeC?FJGSe$p1OgZ@ewh+}Dv!{QeJOI+w1S1r!d5tXiF+;5;8`KtbFC9~;twqc3}Q=r zS}$o8LXB7F-MYiQx@`iwce?rlCEKL@rFU%w>U^X(!Ol=Gg7+G3A7${|{7U06q{R}s zVJK?(Q~CHgd9EXvCV%@%_D*qYbf;o3rRJv`N}3Z`=#L7OS7^mJE2~?A!u+eW!-Fxs@nKFwY_|2&a4eP9Rf>s%DQd2)Grm zG#D3-@!64X_|Sbi;==n^Nm6j-jCFHCm%Ci8cOPh~SO~)w9vL*`b3CwuUC7I(EZFHj{W0+c+@?BtBmjXAjwc7NTXlaSz?o3ALb(w z(b~PG0ck~##ONjdrDqL%35si#-2E*AX~3eqQ1>-8%1G?9ZVr71(CBoXY0bE|%Fs*H z7}+?&R0Y>^&`0p39-8R$GIkF9zt?l6gv)(h8H6M878nJIrt8HU%z&E zqvl=%_x)xE=_0T2HbV#>s7yLe+l+zYNIhK13|=Qx9H8<|^Z}0j=|1xCqKd%JIB5&) zkm&^eeSG}w_yF~{;*B;*mcCO;F~e7*~1F}VM+3FEQA*2 zq4sI{gjQ08G)nw^;$lgX^!rrgUjF-u09kjWlhynw1|&@yLYb9{Q6TXMy}6BZ1xC+w z4n_k@&tvpfvGZKOhmTJd?CKRBF=?4J7gVnTcdf3+Sh_qZ`wY^sAn2p2lGEmM}z2rpfSUl?Ah_gX_NajYH#Wt@z2Dr-#a> zVeOFiq|2S0(b<4a!TN7wAo>4&JP*_M0DaqpL_ zGZ#6~N$^%0XLYu=OV=m;Aw2>Ij2>Dw6mok#{>c<<%BfQTV?LXN|K_)w*GE(x zIcbmdRF`0DPhR|n$Ry!7HGoXPfFvNPYbDNXgZ5-aQZO3c3Fv(iOghNF%|!*1%+^C{ z0AcE?^4+Pi$tw0nkmY@T85bRb6XIz$sjmFZpP9#h#J3K3M%|8rhAe!VF`@O&E0g>) zfs$(gcg2aQ2-!u6ZI1eT@%kUvo~2Yh+jdw*IDyZUf%90Q$@@ZCYl10ez$FVHMFR+_ z5j-OaCDFGpTx^CafRdem;202%Vdr?%Khf_gUpW&nmv8x`gkN-0xa&}JlyGpkNFo<7 zD!Ie$xHB;Q80wnU5`)zY?vUG}Ih*EQ*j#&oI+xNqe6w}IqB3pc<<*Ny8*+ZfSF}G) zM6L*Ttxn(5omUe+uL02a1a)%(J`5;xNJv`(;J_g7Q+Y2OT-->?7Xysf-jy5Ji8@y_}~}>2j3xP_w%McHR{dECmtIc zQmWzr_+~aM-~2pK`|fLk8FB!{!s?n!&QPlH|2>}b12F)cS4N+jM&=S2;&GGAP37bj zAXt(p0F4eIh~(K&EP3Jzf-`r>(}iLUy9A_7=B?47QYooA+dLLT2S6D(Kqfy%Akb29 zrrkGl2+N(tkI2(v2YoqmUaOSjnKU?33Ef8NS|7g!co$Hd`aY78d=hy<`Y>9FkjBn} z!Eo)-6(RYZp}5%>AniWvFXy-4|Eja@>*#+Y_7|%Hy^t`h)Ipe*ogzo7*q%$(GMl+( z*D@=)TY{itR0Ntl^K~ZjI#8Dh2kmhY2pk={>J*_1gO#ZBXJPVFf*m*b^u?%2YoRG< zZq@*Gr--~zse9A#L0$}#4YqTOvC1_95nm4t2RkX2%OC)PXC>4A&RIWo;3&a5r+=3+ zf{tONin!UfG9<)AIkX;<@Cuq!V$(TwBqyy&^FHD_E%jK^?iB4Rc_r)S^H9Oro&vCaseU-W;nN|hvaf)C*er9Q6mx!z!dCSD6NII z30L+0wT`AC_QNTl8fv$E4gUAX@3Tza|Gs|id|*hu&B=uu$}yW;jPBHY)GZU5mI|N) z8EF`ZjNrFkCubgz;?)*%E?)>MZAgucRqev3LW zc!8MP-r=it@njtpn$wdhr%{Y{v?6Puu)IuvM{`D$)7;!_#L36qQJ$0yu=1{_9laQS8Elf7q#fzJ z`22F3;_>if!w)4G4CLRDoGbT#Gro^-{fB(^!#kWKI);oHI>BWg^Y~sH!xZuB_DEW7 zAHa2xvLqgB0UUX}d_r7+DT(S7OcEF=<8pf`+D`xX&(GR<&crp0l zEg%Bp)aZYB=+_r$SttofWrl%GKi)++XB86TUKWrZb6VX_TII=nBl5xG`o8Q3kh8=L z*$GZcHi~nu(KByLmd^Y69oEceaCYyHNTz^7o`Nf@pv^7Kg?J?vLtFF(xK{Vrm z<3|Uj*&P@bI6>tE)TlHG8KQ>@-nO%RvRlqDPbJ@r3nnxQ^tII^gy2jm9dwEadrG`8 zhwBpD@~-x&Xz$QL0lew$k(57*MSxIAe~bH&1xH#$tFMRf6a&5mGB^Y<*IVEK+?mdU z&ctWI0m|4(Bn9O(QXRQpYLKE$=GN;6MSZE`VGhz~eZK|##vRPvzod}j_RVPH?|rZJG?F6@i%?*-k_m%O zS|)DsGUqKqgl-D|DW|}dzTtuLc(rB?-EfhXWwPgh@yree=nzAzZ0)|x-_&k=Sl`J_ z<b6uv@Gd=3I z6!WaaAw+$yv+(^#T;G ztF)VSAK8P-$D7tU#=_eOXq7{SFXdz`z;CTvw*N!XxyLj0|8e}Bvx{wpVeX5$kHlP~ zi_T^kxy&^p%_XT+?x|E~GpwlGL#mMwl1ifMTtkwiqU%T+sdU%no8Nwq$Nt~r^El^m z&UwGzulMu0%PbPCDQe)y?m<3*_h2Qr6Z>0*8IX> zN1$6ayj%NMT*Tfo!UR-yD%?v$X=HOS216o6l4}vFMvOJ8r|L)iyFAwJ9ecO5P+!m6 zc1!AlXNW@;K8dp@Q?2r2jGaCR4<+aNUFB60(64XEC6lX(^c`(8-_+^cN-a z>)_*TX8=)w^`Qb%7LABSwr!76J8?{4qDgHa3lL)iIV3@)47`_RVJ?qDbmbPdOOJg8 z%oiR8Z2wq{6ClU8T~N8V_zgMG&xjT{+l}X3^|3K1FW+`Y{R^~NcSmabN9TFQr~OhF)tK^K zsTaf4y(RdD5Q5-<>YkH}&3hEt;_S7!C|n5*qwz{a^tx1q)=OWMv-vWq6Gv56`}Cpr zr-QEBiNaC=_p6G*p9pM=DpQUBcME0DQLoYHqk7@ z(2_zcAzGABT9CDlnf{I_#yBdb9*ZS`kfzS_h0|Z#c{pn3k=5BeN9?VK?NPMsppaYg z18%k6X4Gh6ItZoYi|x&B|Z2BT-u^+!UsIZeqUm<6H9vm>nrJUvO#I_~W=wz7{+ zXTFFxr;0Nq(G;{@K0I=^#0i>o3YIp|kR^~v>zK;8 zzi029?_6g=E!Lj8vlMWyDU{CRTmvm&M|zgI2+;0FlciY^q}2g56lR=9={G)mk5~4) z$6)*U%0bvu40`s1YpLzZtZWlnrZNYB`pq6a1J9@&4gl6-sF~6Aj<*UrZ(edd=iiV~ zb_K+NstXw20%kM&h#v{3O5%0xCnOa%*Kkbh=!(XZw|XZJqhaU$gUxThTCJEaLP@*M zo(1PJYqaY@88OncQp--jKkA72z8b?B7eeEAoiZ?u(K6t3w>=k)IN7cn>uz^3UKeOP zb*V}x=>%qZrbEEBrI`L3c8;0m{Q@m%u2w!|NrM>x>TLJ9i=d8Hi*a}%f_G60kf;6B%_!wXE(0CtL%v27MOyN(z;BgeKla(8c-YX za2MarlicLZLt+cWl5^*K*d5D7x-|m1Eo!)A2oPOnqQZ87>BKDri>tZI6DTMZMBG2>qn%hlg*Gxv&srUYPN)x z_CzIMrYwBkv}W$`L`MnFD6oM7d2s7D40a()4u_iimSy@^Q7g{6%c)tRzU)HNF|_0Q z<#_c1nOw@z-S8`Ej&5tk6@bOWnESFRsL!ANP`;m5+O+*#EnXS_gHqH0+K^Eo`F z>h;9fcY@<8w^!1;}E zly+;hX!)a3wg}AxQoNtO3x7(4pUMF87`V|n>X9G)F7d<}$_ugq9#^D|nu1214 zkRu7t(Z31DshJr($EDGuFWWbyTHq`kOMez0KlE0`yq@Po4RMDjSMco<#>^H#uaQjG6!sp*HRq8bJ871Qq{8BY(;Dr~x8E8E? zYv@0L?;?gZ`{Ks?%sc@qvXO7j&dhy*D(>Z|IXoWQ^is(fS}qJNzX};}Hfgo-^tnM> z@C+OD#-&}%rLtfxdbLEF6@|JA3_82!(wi_(C=bH5l9SH!Fg}=x0$d6UiOU-E* zk5(Ry`*t;g4rz`grDijP6N<~w%W02g8KsE}XuW3iwvijCR%C|Z{Rpi?ea0h%PV-KBOdq8A`$FT z94v4@1qH%co{Q5~aS-Vrx+pbrxDsv7i40&{5wG%Aw`bCXZ?)T?<>{LgKa7kU^Cy-; zfsRmR-?nEL1fJ)wZiZ8qX+=VLa2`snO|8%-Jc+qlFAy!t zTos_UxdCtRrOW55-KFNTB!kTW|L~Lb0G(^n7Q2IS3yc`&x8LTih}%&-K#6EUVCt2d z2LPJ{UPjOr%`zo^8lqJnz;grzyU>yCF*y$Ceg}a)5+5m)x*rg@_oEnG)V6y5v%ilW zU9#84Id~NFH=LXGq+=dCV93HrV;mMpz;5i@QkJGVeie#n1A!La(#bTG7mVsnMf)s( z3`h9P4D{?m=t}N(`a+P70>&o}eY6BEos5_}H`h>W_Uf;qhBpw+K}M1;d<-(2`fx6( zq0BU$e>k!vSowWp3&B($A(42$@St7X4r|T1<-jEsZtXvHp$?m`LIZhaD|m}w1dw^l z2ltXq(#Y3!NklwWy4RCCA_m}aR74RwA}FON&o6<1is2}J^Y4iQHn4ddt);3qwaT(- z;|kDGjpC>lc3E#f3fN^(nY8_MBL@&pAYeLx8bLHTUrYRDT?-Vz=1=?vd2Gncisynd zrvnJw0?-#z#uiaJcxk`Qd_ZY#cXrT!BG6JK?K>79a(q4^KW^xtz&%!WS~R09(`ROu zw)lPG+-C-rZ?ts_w+=8DK`&QeY{h~QQ3%Ts(g}f{rERNl2%^+&lATkpALYgg0XUd@ zU$>o6#MmzI3}MWs_HDKR;ueSYO3&V~z_Mzdi)b)AJ$~5Ap^n%7%vOW<$pipJPb%aI zn7CVb$NQ^&KM^e~t4YApl>eGtOs33+u-)!#{Kw(I0-i?xisMV^fMe?wr~&=+oA0{4 zCF%EY#~*i;@isi3@T!Lb(*}-2>AWbarZi_2c=daG6G)DwnO#vf> zzc~k8dk3X;5en$fS}D!?%s{8qC2AiG-6;NH?7K_P4FgEhcI}n{bP$7t%;k5IR)*}L zEuh06WNs4uvhU}wK=?Y;1t{cO+4VBJr}*>3yJD76!&W65YT2(Mi9RBW!fPwZJJlfi zF-}LrVKcR+edlL*i+HJ~f?W#Z=~sasfGWG7#O4p{?By>45hIyJyALpefAJ+icUtMT z#)W4&LC46@QeYW>&cV5+=ecEon4PQrAUjy}!J$C(kj-$W? zIcGDDx{xE-{OO=}#Fvl0y97EoJ;jfjc98%{bvKAI0!Rf@T|l;$oFn=CLwy8* z*bX-n^o_w{c_4<^!V%{}>zs``q*nkmKqAE8Q-um;H6D5_A@|WcS2f$Fp}039mz-6p z6i1!Uw?o4HM;~UZv2dVRKc{@sCA={4 zGd}u=y*11D1luHZi--B_1j$9{uu<1pe+os}eKXO`GG|ErWc-zZrEEFfO~Q%Z-5Li* zbnsS`Jq5)6Z9Oj_wDpEfZVx9qMm>i%Wl=^Jnx1Y@lH*EgW+jL zw^|Xvw`n>6SVIO7y^~)w#^hQV1-*x82N@7RpvtLXL-Q)KOfMxQ;e%}Rtot^Ul=1ov z_f9AFSYDSV$z8g>*dU*4d91xD@0z0jS&{=WvPR)V_~H}v*viA=m1AH)y!r(oE)DA$^e~KVpUl?EX(wRF4e9QCw zTW*7SJ>0O;h3-4x^Ng>%(K=0)`%wMVmnq5@w}p!oKU*`Z9=Qq%T*-bLPVMKb8}Zy! z(fOx62~JHTgSSxm5&fzX0F7Pw{_blf;}|KD+qL6}gVB2f<>3C^(P}~LrROnm)n*5kHQbE?ut3F#AZAe^3~R?V9!#z2 zb{g3Au>ul!e$I}aHqh7#px)Yq@G&pnnXX-zvcj(5{+*E!H&dfX`BOB=;0wuuJP{54~MH~6?KgTjmjnCM8KbX>_eeRzH^!O@r)=K<2j@9`)rL? zyQKZGII?IZ38kLgeQV)A5oCpf2PJ0<&=xS(EWc;Dk@XF94Ghj|Eu-(*YZhkNRHqtx zSUnuq9pNm{w<~75w&IlwrL*N`H*jp9FZu6Vz1H>x^w+*BzqnkbuZGBhN2h*yFQh5~ z>j1;@{;?&*=AQ{Z#*?WIEC@G^q-s2|*$|^5Tw$_heOS1pYs?cRv%*}KU5!i~Hx#nQ zOW!jQyyJX{$wt%z0KE=sjy44Tj7>XN(Omeo@=@a&z;P1wHD-AR?+Ufe1SFhZ=yAn< z;0`=lQ9wAT;byir%SAI-5y;P^YAdt|{tR{sPB$q8x1u+aB2|jYKuisHF5n8NP;^71 z(It$xET!Xw5$^%ERgz2g(ue}$R9%nl9Xc{Js$U}koTjd#ee+BTmcZ8I9x9KZ+XlT!OC-8oRaraOFMyzHXRG&-r^0cbq^ z3f!LP8k{uSWSz7A#Uw!jy~uAfC?gg;+qIuVqy~QX@a4`^VLID(E@h zP05A@=0p1Acsh(8CgE;vM&lfp!}{}Z`A(nmK;S@-*cC?!9NB=fQ0Us*^&2Mj7(W?f zzj9@i_VwQ5GM@D=8#7EleNiClI;=Z;6bw%2-GE?%EALyhGRQ-qHkU)?J`6p~K*hm| ztplz@1D+Yr(KQH;hFE){FMd~N;a=~fEg}0Uu$IMZTI;gn`}xMA;!`6%CM+E~4NBZX z+#5cD5g-~7<*o~|(nWZeHnAJ@DrApJP${Zm+ zsyBf1Aj0xSnT*<^w(chV_@Z*0c`LI}G(ya*(C7JxaC=s;=2^`ku>$2Xx{ zcxo|x9Z!&QouQ2^F{n5uZb1*2hf#k|VFmD7Zns`br#`})Of+~`43HPmUDkX+u#!(We){X<}Dcqp0zS%dsxnkN_=E`q?PPnd0 zLjDZxfgIZPPHN|<*i#vRl__q9;XP5F;nb|`0x3U+HRamg32ceb`vwUXgbMjfFQ|D@ z&%=cSrwr8Cog`eBpOLFlK7cRYvdkQjXTcB-{n3#Hab=l>p$3{4VQeG70ze^rapIWk z{Kx{Ms*lUFkQFNe#)Shp=cL-+30|MZSye<>L(EUZid#YndTTnbg$nkM`FJj(wN?p; z`H_P+5qSy#5h7$iGc~}}iy7AZYT1^)@S(RWgJ1~AT$9J7CNOE^d`g~}kIv$}Al9RM z!@&ElI0fw<$k4(Bu!D}kF_QdTRAh)=%#4m0)F|c)IQ{tHt_>|>qE{Eb1;C8KW;7R7 zDJ;`1LhKE@I&0-=!11{_bgSIX-vW>dcEQ6jPU0jZz%(S&th$LwDbqRqj?lBwr&2Wm58gzz%bXt0wpU3olS06Agi3 z{vdz@)neS#Uf=@z%biVlU=84$520iRsj^PpeujNMe5&HG@BH2SWqx7CoujNcfyqo( zgrG-ZqrpUwAQfv^!Z)k$9Q5nlP&{SSB5o|LMc=Q-tU->(iot2~3G~D0n-w6{J9VK{eiJY%Wcg{mW6qCg{TBEs15h54){N4vWP06#6*avS zr-A+KF0;70G(Mj%8S#u?(qTIe6?W#QSN6y>)F1%hE16)i+9L7QFlTNCcqM1owUGcS z1L8Atrbge+RsKSsDjx%5^znbOrnF3pex6Eki9R;3OuRw+zxAl!tdTs=s3ZuWGF_M) zslq+!fbT3`b{+szFU7Y<4xVRNegls>!&vr-k*T<4Kg_XQWYFk>d`cKv#yM#RGDLMu zT4QJsoac9U!PwKG_gGbrPb$SUkkzA#7b}MIR!hJe&6&?GFSn>%VIkqIzRAqnx#Bbq zCbV-r!Y5So(Ryex*krQtqfTJF=kNiwUIF!xmEdxP>i=WaC&bkvi@3@aLs zPzInRAtMHG^W0oA2x!>5LL@=Q=^g0l?P*3UP7><6Scqmgj~H&H7-Ll$Yo+vIWRIrl zVsH*)6`Dk@10=w8Psr=msF`pF;VshK`<@OOmaDvD)xZgBdFt(AJz-}r)FjzCTq_;g zKS$JuUQycLo^fa*%RF82;lOwVkO!^HM|Ru6%w17h(#~2^#N2NlGOceO z7vavC4KI_r=7jeWB^GLBOub?r;TwPw0I0vs3tyzkd&2^RNWAlgWob(}9lu!}o(QxE zIfk6FwmT(l!2@wX#$a&EZRDcQo1fYm?^_j>9-_tL__pTAkZifqwqwNlBUQzUeM6(z zxGjG!&6vSicaEu;y(DgYG9=cP+zt|x$JlSo=ij*9>yCXO$L2#du#yyY`lXyn0$*1O z+smft$y2X8H<;p&Hp;pm>R?t9G}dz5pK-*F_f7#$1~WYR7zYJ!C`MV`o}} zJC1{N5@5|m%jVm)(9IbT_vve`mz6Pa{K;jUWTTSTiGqkvSC90R&WImb!apv{Db{;{ zi;ZQKhs8r?|E}IGn2E6CStkWI`khL2%^;>z+zAOR7qqJAFG=J5@>6ZLKngu%NdRU) z5Tl1Ge`M>7vBR$8)GQdWNX)tuZxkqyDhJSE&$*^_`oNv~K>mtvAVYh4&54f>s0?N` z2#6RX)LPTKP>g$;g#|8Vbr()#7h=DZ1>L+1eG{XkPYQ+)!zAEREaKtv=Gn4G-`nsX zn}P${XDdGfWIuu;=ThiW_U^yS%se2h=J^!LL1N#FdfJRW5fqx~Gv)qlr+C_KDq z15*RVj6Y~vo{GMSWcSE<@DuU$_iUxbtkc)o2VZrnuq^|LfF=z^2<$xXwbIv-Nee%{ zBCs1*XD_av*d6cTy5pO{k86jPej4;K4}Im!bK!vg*cEl(c3|Jd+F}A&~QtSBF@T<&AKy!QpZtwKB-Jx>yDfjA{Z&6+wKXHIzR}xrosJ8ixf+wqHLhj10Oi_AZ+cD&Tl~--H3; zlVnUE7~z4zei2M2f9bq#d1Sw#u@)Xr8k1<>zaGSK^S{)r29 zkWG=pwj`OVbXG;`ci`THd>~_+F7p9tm)!Fq zB`%XT)TuG98;BcPdEim}3)uBahuhaZZqco#xTC(XlB-LnlHGSc`5XX%Bod4sdC~B< zvmtBrezY=PG7bpL+~%LzySt~P9SAvc%q{%lNlmi}rE8~$W*Xu?+&NiwswpQpnx(q; zksJaQtXq>BW^NX`U7X^pyM9l3IO}W5&5M6r!`$vIv+(YTKx>8YNM2nUW54-hLl1~~ z`_FhRdMzE;JhP^0$Vr=0`OfggG~8LsRQe4+V5z>TR)ymYa7t{yp8^$O(U24PPqSQ2 zC8N{yFCU7#_&FT?GxlPFUpsNW&`0^uIm)4sBe!l}JaRi4?U8peq;{O1dkJ7Gzcj5c zpO-6G|CbXVUXBzP!R>(BgEP6MSM$DXb{x#RLb zc`SJWvI2V4X<=w4FX@fjVI$)#|MewDY2S)8hixPRViC$ZZlZutkxbOJ7gR@jqzWK^EoCk+Dnt=b z0j6cs>Mv7z>$Jo765wniip_DDC^Fg5Y?r{PnUq0t{mL}YFjJ3=y?t1*{`e7J^D8$H z;5~>AS$K5-!B0fqCbvi?y@f9t8}76?BlW+Fwi~orhV5uZzpfzK4t^PJ1c6<`sf%|? zsZ62#&X!5VUiEvC7qKs@b1icSi(H#~^wGxL0?K76)<^_*=`W4IhPb;=69gB~rWq;x zs%P=bMTW1clh`$CIbmP2gtzBV7{|VCv6Z_A#ZYeeSiTALn_Dq(+cbfsdedfQzJAVG zx~He(NjiT~mPJoCZ@{C|c?_INac&MYZF330 z`PUGy5WbAYcijKvjG5FAd21BhYK^!&GF~WDsSa*B9hrqXt6$he22U}cA6L!uTA6>g~)$ZE) zeDhB|_0RgH@mV$9w)`rI55x}nz}r|N91kK(87p_`VFZ8enS1SS`{`u zeG;QLEVOoU-fpN^TA|8w51Tn<)U5m`1w+$_YOW z=bWE9YwDtW^$3u^CblJL(9WeG*3;|;sIr{@i##UpZSvUV3__P|!NELvfJ1w!>3Too z@({i-_6D0+w2Mwfrd#HY0!vVuW(B$+I}E3v8Gq%1K#7l|$^fkwo>lGq-C?S>-!8GY zWT)NUcc;3wII+*eN&~K#ZyDXNo3CN_^^$%@GTRR4NIdaZo|o0#Kcy&_iB(}H zqTXv9FnC%7ZjwO2NF}fcmo%j>L_*^*Z_1yUC#nZD&&q#vFtD{A=aMo3uln$hoxbJT9U6!2!487mWGis(DzFKLJwWWYfMokxi zT(REQcK20netkRJ`I>3$o}Wph#gz#K0KOl=*wFP>N1>IRx8cCEkqSG$J=A_%?<&Ry zvwNM;iNX}olD@_}(0!js?M)(^(mYjsfi`CXimAxZXi+^;0^v1DL3E(-c%+Op5Un3> z(JRv9MiH*#vWeR?i8@Tao88%$;gq22=eT(2@Y(37D8KsR$%I!_#70d^fk zI$&s9jwfw@81#D8!s+8^AoQ+wxVs93vv&&FbGr~(a8C{b8cc7fmE+%%bLY_7ZF25pVf*d|uVWzAWOE9L60Cir#je3jMrhL*PYG_M2+ zb2>6CTUDR>)!a@G+XE_Lhu6fk%^yY}uLQ6>UJj7Oft?TC^Sxw#tX)^~F5$n9ykHCF z1rKohPSdBHftS+|L32HF`toV{xJd||aKzZT9o2>~TZ*nr4@adLR8I0j(%DSYBOJkV zqexBiW0(|dJ|5H+A8YFAk4pHFsbrMc_FW(1Mh?bo_|NGHqv$c}S^~vuUs7xaNUegT=iMu-x8}TZ!aUCU z=xvc$geP+2ii6ITx=!7|8g=3~)rVecakn^H)|v>E*(lMrpFi5WM6NY*N(IyME5Z3X z@7O0yU&cL;1#cfvPKMzdvf!>@Zn>K5a?GyoWjt_eqAuubKTuj-zcJ=)yHLGZ*kS(h zAiwO)wfZcK&W8!ks;5Jlms_gCDuB7R~7;)EGWbOBUrnTc(6qKWAF^ zY;_ z=to&_%BDr?EWK5zZu7Y6*Hh{T*{6$6|IuZyepQ<|BEgEtyu&|${_+K?&iGKHIf&s9^x4J$>$o#SW&}q|qfCyqsu+?{? zDbQ9g{)g05~@tRbqj%bj$JQ7#$WF3|D-dU0^-0&t4GE)K8g1eFi>Q(eg6d zKO-xsE&r{k8Nb$d>4z*rAR@&nCOqkO?(w*<$oUT4mvTR;Q)bn1k@p$C_AK%Cpy?1}cHaaSbWz$DU;HOFo*^ z(owEPU}swQeoB*X<=cOi(-pW+|Fm~Mr$C#TyTEX`uVG}m;@p4Y{G~L%uYWI+92-~a z`uhF$!4m0>&+=c4?S$mbxCPw;bLj4z!-0V&APipF2f- zTUoO*O1@J2(^`|drIbq=r{quso}BEdKyUf$v)pv5wy!18q9^JB4u)n7%^i?tskbS;ZaH0Oo^4RX9Qapu_K0z^Q zGfTeS&3`6F5%uqQ{TRx3N!@UWu%Lc{vX=Y35_W{lvKQWO2FD~60jP+}FyQ<=kzOQ@N8^FyGm>Z`6FYc? zOa>k{i>WxWcF9@3)#3d3!j*+@7C!1g+{bB16FWNHbACJ7nJd3pyKl6jPQzXab&$;F z70c0K%Qw-H+=7*J@s;DMN5&s{oO-n1W;FLE`&2(3Xlr>JZ-I#!S`GloG|vaLBk26C z@98+73OO08=Wd&dVaw-aA@Ge=8C&}Da@~QKEO|r%lfzs-5^V4Hy2iVzWi2yxr^yf? z%iK;|1wYLU2(v#X^6`=MT%8`gng*aKQ=1P&5v{p$bA>ji=GKZ${5oqbAp0Z1L4FsD z<>h@hPoP@+&JTMQkORJXD?Z+!CdPzQm5<(!dU`fw&sG~EZ0D`^u5DN7ru8$e?B)o` zCKo8cToS!8ySgnu_Qy9v;5%me6Yzs9UXyFheG(cSG&5fk`eB;WS$mS37NqKMY?`qB z!}KgX=AK!+Bda)I)_(gN96)~Tb1<+KdK{#t##XhDXEa)FQ2VO*I5^A!ntEru&F}LP z=i42r8tVc!8fynt%mv+fV)y#OTlM2X_}w;km|AS3?s=i_FFOdy27imm^<0%$0H_!1 zyCE)NLEE)TBlJoWd`sN!q$Px2JxNXj*)YoJ@{VYYo!t)LL6pzJxdnufDtB#MR1(1( z+#j!2Z%`fcJ+F!d#LOy%BqXi~hp-WzqQ~_2BI(ACH{N^lG0@ z`?!o?l!4e~GZ)>?#jfIF>%|AwT}#n+h}BZxHCwXz#@G6r0})$>w_A&S(j=I0J1{~V zu2!;hGdFeC9ul?&tqXWd4B7bj>eU~6f*84#;%wHAt9z3D8Z?hoxgAqqTefpa`nXv$ z<)4iRI;O^w7eRkdY>zGt4Fa?%OvP!jDHDcPsehFrZj=Ni5)H%j#V{p11z9h?2GCmb z)7`onKc^h5k-1joM3Cv?&bMt5viX9B#C^jN;syfGT9V7Ni#wPSbT_ym{fFm(vP@~kFlWW+#!n)%d;a_ZQ=;m@(Ib`)>hv0VIEFU6$8Y;fV{`s<5G6LC(6%p)nhxs zRY0NPFCtxx2`p2!3bpCdFf?MQATyr!h}=IBLDtPmp+Y?#(I8b0Cr)055V}O2p5)+7 z%L!YOjyMH!7^$1^iqtMxqVm4yv8#Ok(UG^ZJnGWB2c@&$|3zHg8`&P5 zRg&8tSN`LBTIS&LsKCuW*Z3#5ZVb|7d5EBJYUbG>=!Y1LMKC`kvN^rh53V8_Boe8p ze{Cu8A0`QK(SfKW7j={_OrVI#Ok`>9ONCjo(i|6SL2YOiuB6MRa+<=IA<%pb$hw%j z7bsh|@0>7jyR~H9f{R~O{@c?IkczL#PW#HE_n)bhhl4dasbqLs5E*Qr`Rc<D-V@O3Ah=yaDXGTLa z6L-}*&DQP+t{*t;wsyy7+NbcBgbNo#A8fq7SD}|9ic*Z7Bv#ATJHV~~jYSh$;b_8E zZ`0b0sWaPVHZKzq;2&^fPylzq=HC;*0FiseRc{b~BJMw^Vc16ek$m#qp|#J>ez=}1 zFKbk0=WdqF(2u)aYEU7gPGD8X z_~~40-5XcS9uH?sMb*{ZXxvNzesQEQu%M zTiCk0E?ac~Vyh_g^Q`dswuhw&VfMScAG4O$HD0aUdd~S-4=6q{K#INVSJTM^*;h+O6^{552g%WPxt5{nXrHGu6v)reDQ%c)y?5`<|z+ zL*5wQJk8t-B120umhs`4#oEZ6S{tbP3kWANAaZLm*8i49&&{Y;xp9sTjz<2f6~ zqv>v1%^8zoME#kBXo=b=&OrP8ftLn;iNPJ#>7{RNLzEjVms@ndf;bJG{ zkEJG|$|7&d?a|N-HnWcm+Pf(r>x%Hk_7l&GJ_V|pCE@4>g{Jza*gU6|h{}}swVxMI z-x#wwH}tD(?x0Sk>(86-N+a7A0MQ=vZq;Z7dvWFWt8IHW2Mq(vC%|-xZ+D5@43~IY zJlRYonRJ5f)GR{B#(=o2L+N`c{3~3Au^Z>{6t1zlA*x=aApS02_#3vy7{ykRZN#wm zbQ>taIO{7^jQ;?{tN7vN8W)K*Rd^@_BBm()faRV%ZpyuIeDbBffmY#NE|w+%Ln2XA zK<~4I%6|`_9RKSGxw>~L`V#BG(AvSW>xtTJP5HSA*9r^NrZS+o3RwGzJzxMUj>4E= z%2zT~YZO+bd{^2hQMxUW_fHpgtFiXNT5h^4F9P^_(fv&4Eo=KMo#i^0RjYaC+&J`& zND&REo+j8my?^M{kMB-~CJe$cT@TAlx!(w(kU>E6N*k$KKH@9eGm`(ngkgzqlCy$y zRf^ib;Et{H1GiBWuF7_i(rNMQrT;#3AHq0@Y(DFzKhIoQ9XMp+=&|!^%~{;7ARiUS zJ1&MAhP(a{YhcBC5gv#Fc;>bFp_9~1ARB{iz&Y8T9mS~u;~`EgJ_}Tk1#S=klu>k+ z-3|xE%FC9J5{uR9i<(KYtrtv$HeGB}H(Y`T0z(h$Glz+*Hw?qG)^+(Fhk_4sLnYa2 zfR3=ab&3hd0eD5WA2L~w5N(A?AY$ka5Yg%++(Ic5er=~}O#4X&0a48OGn^mg`2wKm zILQ7J&7M?nOdwLv!JWJT)`jNQeG<#J#FMr(fE1dPO7%Lf+hqGNf6XBKmz-%Xe*19ThXN%of|C< z(cf&lF+Cf55kG)hk4*{e*YIx_cgvT@B8 z5UxB#x~-*a#;)(|vfebK^{aE@-u}V^*x`@ldYk|fGtfB(m^1FSvpo@NIh4z)o7B@+ zxu8|v-}BGJBS#o&_EF$~(xBqNkbDaUK~Pt14*5P2$i+rJCl`fP5UoMwEhwYyn#LT8rRx?81|{%hX%^lI)Jdits& zJ|WSiK>MZ>5%@gAvfi+@h4tzA7q=06F_s3e^eJLj`T1-ql!-qV#LigGDF`h&iPE<; z{j!`4NT#TZX40r#`r!b!MJ3n|#7rfC##1of(=Jv}9KxdbIP%DLmcXvi!)V-7bt0RI zDlGFYM>L9#6YsHK%x?0j<*%qfItfNJ^c6cgwDAR^-~x2xPUqkqXfhr9h_>gkb45wA z7W|_>xII)lMy_mnkG=j9DE)_m{?<9d|Zq#>v8FI8p}#+dyql}6;aLR2=sdxIA6^iu!Wx>&(94f zQd>@~eaDr1qxf>n*kXgpdeR0bw0kxc!|*y6A7j8H3&fa>fqWCz#sS4O7~a>nM!0Q+ z0rh1GScfcD-Wri_+py5>R1AT(+a(-59+JIm6PB^uLwir~fQmzVWVpftTdU@?oVsqZ zX@1NAPTSP_G#z(v?Y5Cakc59GCJsxZ^Y9v%JOsPAMIxe@7Rp96sy$8jKGLa_VjUzO zI9s1ToYYu)A(CT7GD&RFlRY!GqgF4bxfXb4YWBI>l^4)>W}J)N?ygLFLyE}*kJl{~ zEvjn$`fGpM!m7oR@*7C3F_Q}{N|Rd%E$2Z68i0nVJPgPU#K%>laU=b56*f)DllYJo zPx{*uwyfAf?i0iyId%t?M6M224jc&+X%<7rz z2C||3?eUxV%Uk^)sWl|4*kN`XTb5V^HoN3Hv@?vHPGwP=@Q6$vby7MYcF-t14R=r> zOWb{MdQ1)z_|0$c>T$W#UwGx5$3P*iF|74BWS?~I%-tXkPu$>k!Odp#a{U+)ePOAC zT*F0CYkEBAuRnFP-~;C9`Hgckv{NnqIUGFxWRgL^DPp|Ir~fP}S~OK1N*Y&fd**S# zPeqV?>eFglGe8N_N5}meR*2??_^_$E-!aSGILkylj)0O}Q9+|$fH0Q8atyjV` zombDcAsQqJX6dlet#7Oc*xB<1zxTaJe%lqq>Bw5)_{4HguY3f@(f}~00O4HWtF&V| z&Q8VWg08gH{vN%5Z1uLcu^RiE{zWP8sJIpNX=;6);igF}696=9=vfZL663wO3yKdo z7q8jV+hT-7tsen)0Cl25YOsQXcyG|p3^sIEh^~{pFblvLl z&OD7)REP9%n{q#b!!9s5+Y4`Q)Py1b1Z!eOEns9xIB=z?_}D8nWO4tK8!_zegY9Hv zs$XsNl_&4*c7|RGRUC-yt>rDJg`xIIrnK7WnJ&O}Xr_rq*|6<4Emp|JoBxULaofvSz!# zGLY3p$EOq{AK!~vRpl^f!~5b1Po1u5uQ=B|>eI1r!~BQdzNc2dHk~a@#WcQTp}6^7 z#E64J(g}|!NHbXe$}JTQT2I%GZbaUZlcjlK{rST;F1YLJhL;B0E%heNuH2-%;Znwq z?}?gmHPz8HdhjDbLrRh&D!8^B_dl-A`=84H|Krznmg88*K4$0GyJMeF9sAhF-a2Lo zove(;bV zWiVa|{C4%Ya`I)%U&G&9*Jj=~Tz3f3ewC}(V*0BgDfn%W*aPW5PRaLk^mzDX20DMP zm}InpwHys#BT_;?a+qIhGM0XH3;ElP;@Uz*mfff9T@rK(vuN{p{9?7I?eeW84eGU2 z+w11h6D6$oFgpxEH{NY0vc?#l=e|H3gz zG$$2kgcN&4KKBS~s01bwH1a)?NIj9}4A+5fWARN;ycEjx@*8DZ4Jk`&RiML`CHPw)|z^V zJ~61vGNky>>);)qtp=al#g3|_qMC2QtG}y=&gpoMxP>v3Q;Sp5)x>ZGu#c~^-`1$F z+@M&vvd!2Bc>q(@+FdH8+FACI#bZQix<;LaWCDTET$21riyC9VTPA-dOPZ53eTbRMneS>^9mYxIGtrWX;u!wnAW-QO4CYYFNBxBt|`+pFS}x1mibP4EK9KTe0jxP;k{&% zmayynUQ11`pQiBMYV}|(LPexf#e30;53es=?yI=+u0rHqMUzy8Nnyp6eHB#?E_7ZH zy_{OvpHq3quA))Bs^MKlBX8CHoT?$W%DcZVJa||2nD^q8`o*WsRjqxM-MkfpQ5SDN zubO^$@fGjI;dkmiywz`_s^8{RzvHc1Xs-VFuKF|YrKio6refIt`9ENQmLMPsAi!P! zM^{(Z=z|Bl7LeAKmIqT4PoGW?3=G~H9)ADs`}bd-Og!x$y!r3nzbhTBuUB4= zPd&YU<@)q!-}u8PL$`(>4Bznb_N}{E`+n`i-GQ#f7t8*%AW13Z>G6A4Iy+UARa1^1 zkBB%dDS?}rdp0vO_x#!XNM8#Q#cOMA+tzyh+xzzlvQn$7?@2}^S%SKNh}6pBZVWxO ztF6J<*oK!++}YLn>&I`ha=Ps7Y!x-5P=BA2ysWy)vhwp~FQ@unE-fFS$2qx%JG=Tu zhWh{c{yQ)@ysxvll2b{cc=`I$ef&d3`1veN_oYLp=AS;@^^(4R{`}k5Z@U%~IR(Ac zgvi%V`oC@cdcFSs+1&ix)L2z*t%97QftGrD8uKJG^IH3*{p5ox3NrixguJ2>4Nddz zrVH|T>5;a&{pOz2H=6`S6&9aQAF!af+f&}XUUhTwEHBR0A!=Iew|+g|n-~*8($gr- zPKl3AjEYJqIgyxGkbj}*#NzVvq)1-?0M=&i{{FVrSkAsue@0t(-|OYYdUj04iQ^$b zp}y|+_wG#V>DWBIb=_jWcSCMc$=Q;PcW)>bCae<~2HFM``_PnQ0V@+TnQ`IlMBgV9 zE2bvy-Q{V?0XDBEhBH$l1+juX7mJ>cw2F%eoMsiDIa5qMVD)u=+|$~4q$w|#8B?E^ zAuK4y$t#GBPtui<$T(~_)>U!0rOZM{Nn6*dva)8E{*)SOH*%>s!pr7DW|X0d^wO=i zvb69&zkc+zSG`?d?Kqq2Zf20+ZQ4|vS`h2rU6DOledbAbW!=dLyqx~-POzpp<|?-} z$j!93E~hlfkA9RL;_QArWPfL2jGJ?)uZ_mfU%x_}td(R0zi)o5sqT!4aH5dZjt6>t zU!9?n_vAAII?geFu1*Aoq*&?89q}}AGgYSr#@mxMBBQep+Z!>X_vIuyC)gUEE$lq( zs$-!eUw(-j7|J|CFG^1;jkneE)Rs66dHNa36(6@uj4R!3^Z)nk`ah89UH=Dd5QP?1 z5o@Q?SPYEZ0S{8)ip3e6ezd{p|NI|YIN=q`ENNl;JfDu`(K5WtP}M%S%a#?Sg!eBV zbT&S|gc25`kh_|u>L|q;fn#0GPaCZavG$uw?^vxqozaUGrFZLif(B0sI3&0Ec0`Ud zzrR__l|cjv({H6M!Djlr-yGmV$6M#`91@l#(Hq*Ahg{86aNIc%x?iAZ8{yb@{mpoZ zBJr6S)cJM-F6$ugbh9fA)#TplyuV_Qh7m)JS3C75LkqnLA6`!M-}wB32R14=*?}6;mN(dx45a`4uIOc1c8E)oYOEBA2Ji%n5~qg5tjnu9wAj1Gj~~l=2=roqXfjP zIX(nbU{Y!&)AFbxIil^{Da$iwC4EooJ=?wro?A`{$|v1E9(0cUY4mmar>URvg(f$7 zp!i?^diH>P8Pt+)PtTAzfZVu1lMQNGtBC1QmqP^Q)vV;s z9h-H{D=KY#S)De&-gwC*clPbMO*yGU`TJhp3o9PTeDJ33hWQw$zCb5Z{q&>EW`9Yw zl2icfG|!Gmh&!LQ*gRQ7X=E=X@vL8Jx7fM7+GdA(7gTTnwiFaikv35a6GH$pb!QK} z3kS<2+TUD<>9xj`QEldxSpy7gP2we{Ms$3{k00+4N2@WlSx@fvMPI!72p7cZ=#jZl zZKu%kA@s*P_RDh{ANy9pL5yu%+&{xP+T|zCe#C|+_Ph~g0bh+SXIzTVd|$!i$o)t= zn%~-y_)M4pwX>?(}^ScYm?_j~ERW1s$eaJ5L|zHGu(;-2OYS6d0u+*t7!&pzMj z+tGcYH$43KVB zj~le!5Akq$_Ws=*;XD29%L8Se5nP`ChQd6odE(breMjr(g>RoIH)~oJHIK#&y%aF$ zvbUA`xPj)0F<9RClMJA>(H#t=1e##=@9R;{&VPS@e%{#uUH~!~Kn5O1=0CkHJ579X>uTha-{(I59^MUawHb@;mRRHycQu!rnZ&#r z{=*bYY58Dy8;2l)Tj$D;Ie3}som<#>n4qc9azD`ma~}0ixvJW*BdOnf&nte^Wf5o1 zD7@10CoyD(bT2B@6Yh!YPO5RqSqB0&XI6a7dkoE?u;WjvgwiAT1Wjxt*xj6&Fe_`_ z$T@n#dn~ZQV%r#bac{7cM)0SB8S7cLuEzs^F`TN+J$BTQA_Oh8a-*bg-|xvFlXUMi z%KbXml?}EQocs9qn~~GJ+LrENuLujr+ZtwyGWuPeC0WDc%RWw)b+AW@;fnVhq(wcX z#+EBouz<6)Ra$inUhSM}=cH@FISO;>SUK8S<$8XlidIFLGy1Y4VLi7eKpJC7g{$~Z z9J(tj7@uKz^;l_P(H(?1wu`po@)5zcKDJS_hWd?T!nmCHF4tR2rTg7hG}%JkE~xVe z%A%HDRc33T&4a!!jjw9}p&gnr=p}_|Xn2&?*H^;YAB)>HdV&qrJPP{m750}e7c@7U z`@3J`8ymNMrnM3sqtclR+c>(i+GL{H;M(w2rT+O?fwF4W1A{1vl{8FJsw2XMAFPq{ z@$o!^V?Rx{1^{6?*LMa3@YHjz9671!FO=(bze>C@;iP2h>iPYD0?u7~$v16#(#9uP z{8zpew+-G3t#vsQ;gtT=C#~i@0g;GM@8=o!j5?;_!GWdveDQiyBV(qQOI`hx z6)R?HznjjB$x+?cW}obw)zj7w|F?!A9i4*etT)jDycyeOw+AEIri*tem zgz6Ql?#$MeqrqpL{3e_e?fWyBR zKfi3spZ}n)@lM6+&Z%!Zj#oyUstz5u2z_33W2Aff_f3yiJFq@WiL^&OR++vhbV&Xf zuNSjp>#OKH6rdq9FY=~Yb$`Y7<$PX&z$*iR6XdlK!}xWB?>^?+y^^*sO+>@rjo z*Sk-B|3$3qy$sw37=77R;K_UT@zwn|2KjmpdkgIrY-jY`bj=S+HkMrxsPwvWbmqF> zOof;Bjc)yi|8*t5yZKT3sCUhe3YkOSl>XwWMw_?HuuWu83O){JV?t`Kzjtt(GA3S6vscl2|KfufFpnm%Cv z^to5!^97Z7O_NbSKYRO+JNe(2ejIuAa!z`7E3YrJ%E9K0K>s9QD_+ckY*_ll1!X~# zBlrJ=e{OrWZt|UYLwNp~n2)K~Txiod_Uf$Ml+R37tXSOdfw!u6^=NYBUv!@71B+A+ zij4I5oSrm%MX4bn~vYmK2ATeYYmVcjcIY z>&vYVFPt^F{f7b{6(0x8U2-2iNT}-9Ub_ddfuV!~(Z|g{UPM>EF?=mC0aRNq%_*Do z&XXU`&nGPOAMfs368imfFv0ZdqVnHm&@^tV{A>27D*dC$_a+uW$&2k(;U(Az2cft^ zu;x-hJTfqhmUd|HZxDTFdtv%FK)#S&&)c!)Mw`{SRLXg3)M*~bw|(>+YI^O;tkvN^ zifns&yVQvO!!KGc*NIar{@oeQcA}(f^)mcaI36GN-;je_l8fy#+S0E2876n7kJ_Gv9qlXrv1gbercBenA4lWdiV zk7}KnPmQ&CEc(O%AspjHee#0_l^qpb_qX&rAJO*Sth|PLz|pRa0VEW3Jf1;9^{l=S zb5kFG5-j76d8nwK^S`_JQ`>QT`T-6Jsny42000(93ny? z4}R~YRYc^OongnApX!1I$@voQ3qN8mUCxsCI{N~Z)jE^)Vm;^f&z#G_ChDPpQ~~S8 zjIC~#%uQtKLvtd=^5~Oz%I99?l3D-T!o{Lr9rR|8{`=u@7F`e>l{aSr2y*lCCC<8g zQLAmJ(id{XZzNuv!oimk84qw?KTI=H%l(XUhZ>JJ4(e%pS-saS1)!jF9aafHQW9~# zqF?j<8+~|(4}qLB@1|uUE(GYS(jP!%kP`}ftW@(fe*T{$~VocT`+sJ`4r3Lk+RB2Su-nks5^IlbJW!wi+=a<91e_Z-6 zm3rY>CFhx+Y+um#B2F_Rb?jK2U$c6p-Qhwc@t>=+zk+(kYZ*ZZ7PJ{B?!!2o>QbCR z+uL1nMXIus7cA%0`VD91H3vrZ28yYsl(?3cEMM}HIL7uZH_Ht-eS<^XEWZ-Gx9+m- zv0>MKNhO2z%lj+p+Hn{BPp%cv36F!*xsP?kwe zeGZJY)1IBZEh`*atd2ZBiaY)areg~r+G^$IIx^L23et^_Z65a$-aJ)WSjYCQgC3mX zN^$a*69;aTyehZPV@Cs3MnJ5wz%L zH(M^|Et5CmTk{unspU6xS(T9R(aYxvjW2&+-uZP3z_VURv;@w%8?vNjv*kZZ$G0d! zPVw0txRYFI2ZV*TKvUBA)S3Iy6<_L;i|Z@0QJJt=cAz0@1(FkOubtLV=;m$7DD#S$ zsf;19UcSHdUvo>@vKQ+?i+{wWXDLysU#s%GTbnu+*C@XGhn4huqQz?SgH{Zb>nSI8 z*7r!7Xpidxc`YZsi_fk0wTaew#u?M4%C$o$tF@jqS4Wpsh=!yZdW-+O+~(JPZLFhY zIZ-}cirE)fQ&Sj}byoC-x7$9erV-T>_Mr+7WLE4BE3d}={2eE#P%Sw_yrT=yI6V5P zcJG^H-$<2>cU8<1bVDZ*TD689#yPVltf2nD?p12Xi2-u@p8vB>O5-J zBM(*CAf$fP^c<0_nOdoF8otmSYVDPHgGNM&h1d<$A33i~w;oU4_tUVJ)~kHIR%5=a z$M5F-`A=vB0+&t9kdhw3*YKdh-E{vzSTE^p5w9 z#0W^M?@XUA;K(&w_4SOt?`!ug+47G=?q!~!O;R{_I?WWAf36^m7;8)LtYny!(rKL4TtRSIQA># zEY%hTQ^jwb?U25D{!eB3mm#McQ7)1tK|a^b4ea;cQ#2{Jx?q=mmDG7VZP3Z&w#a*J z$w}D$rOwMgYgYS?Mod>AKd4N*4prt3T~lWLmZ{UtEBF6!Io_|_|44cJyj1XqlKQku zLSm(LKlWMZ9XQh3nXGaqpe%d(r;H?k+RruR#HXI$YI0H2@M%bsP@^L_8un}b&v%47 z&S*;a+TL==ZV5tN4XkQe9!tM*Z~r5mug-e-I3`# z^8QMBp5KdPL?9NX2B5S7l*AI!Y{pjOOs-sx`P-DF#qs*~E!iMR6&3Z{P9o!E2%bhn zh0+nW9Hih9Fy79ezAC-TCTLT59P{?PBuww(@A1(2CsCcJ=H3Tuyr^SefO(yN=(ljk z)K6-5Eoy-cH{8wsK`=EcPXLwYcDbt6@50kb``;0Y1bz=YPbkM~W^6tK?JTX!Z^_EW z?p9&J{#qWaj|Km@BM7@=6BpyOgd}lh0k3dzacQ~)fE2&{o-f}0irS7y>UJWi8{)(K2aAmW?l!C#^CO#+CPMZ{(vysmwQ zu$wnjkkR_MV4N2WZzx>(Z92wRbyB-8$mVMPF_1u>i>J*caS^f9MQs`wzZD`Fc!Do8 zh%P%-kvgKh&w9v^@^eha7Jw0EP;44#$gOd|Ybr*P8P&zT17CgF|BAGP{5gS1!Oq)p zU%|uXe{_O&c)=8i2LNWregsE0M2!WWZJZz2S$O<1diFm)?}}uvP%3;67ZInk7=Y&u z;3AT!JfzL4PPaXgHuVRU<9$+P9{#j_CHFEzzG3Oeh}O>AL%qQOo(iW;qUx`}*^{t6 z)Z>;fO(I2BzloKNc-V9m%C{{c@dfr*rl==9q?0A+n+4dR)2qqsLPH zW$~-Xqu7L4MLl2e%!EH+_MSdi7pr9?bZ)CGPLCITr)5yFK^??{V4AWRLY;K*`A;WcTe_3 zv^_oh2ob;ZVNiY}U=mhDg&$T<5=y+)tacNt9SU_3Vq{*H{hO9}r6!1l6;R=pn;%WE zFvm?WnD})MhllK(_V%Sip`YEY#7B;`b}m|SUv}hY1L98W^p@RFZ46rTYBPENU*E&z zMOqec zpWZ*&EiB2BNd`^mTd`E0>9eqs|G=WXyxN;vllw|P4gQjw{Ux9rzrg=8;2^sv=GvlO zp4c8=zIM2&GmrdfbS$2CPdiMZ9T9sJMZh|~t1{D^864FI63*n1mF$E!+zgEIAAfF0QOiu0!?26Kp09`$BMEES+bGJC?84z8N&KW z$d^wZvw$>V(rCPTd>9i1JX#z<8kCI|^tilL@Z^nSnW6h_1jqd?BnHnARBq8<9|!f0 z!sx_$r%GeT)zRkRj0f35nqI^{8W$S71`O$K+Z(}m4^6!zfX#xXg&a`gp*C^$Q{YYH z)>`0Z&tB_Z#;YKN*_^_lqKoOr8a=D~p%jJlY|emE$ps=|Nh5LL*Oj-uV!Zl}xDf7r zrYPwE|Gw*CtYV`JSL=5I7cOt0Z-fi7CyOK9Y7UKYK? z)6%%IB?wK7D6-A|K1{y`{rRMrfcX8yvH09C4y||svE=yewxJ-PcwX;6A1kbeV{mPL zn_BBby@%x9rp_JKkZEMQm8dm)C|ApbgBDVuvFq|FC$xL!)BK~ApIdm^-7oj5pHi*K zzy9S$U7{lf^1Vq^%~4XAVu(d@2uKmT_Mu!p8umhPmLs$Ljpnrir)1xbqFZswdxtCe z2*fY?2?(v1GQnqsG1PDV2hcgi=Xg$SFN2AXt&cDA$m?>Da{sBl5mJXuF?eGSlk2TM`@cKv^>KD-?#&3zJGNX)m~?_fE6YM$?R` zhK`xvAx^k|-mls|sR?dRXDB=}2&OE70yN^!n1l!6KZO;`cbPN?uNUCYnw5Xq$A9uz zoN@_O;x7%-e6+?A(!$($d>{iKsrF>*rTuCxFaI1KIb$+ZQdeMaAZ!hoiT4>b(CyV% zoufLBk?OL(a#`oCcteWpA}8uI`C>ZWh&f@Tvd%j>)}SQKvmP-beG5ia+Abe?`l!Es zAj9F>*A|t8-@|r3tcs0I?;gvbZm2utCE8J-RO6;#5t9o-pwU z3`Fcs=$QY$-#@hTUmydiHAx0L$S_0^0OQMmZ27TF`%JXE#M6L#q@VlvL+GkT&z*K$ zB8oK5FOI_Xq%uXA1-v#~L8<7uLD?spx$b{gaQcb&l%<8yM91KiefVMi>cX}L-En&q z^^Es?XO(L5z|V&f|km~YS4+6GQWk*xKl&H0W1 zbrO$u(MsE1cZmFh0%$IP+HM5?s*}&9uZHgV*Lz=64MHkSLVcKQB+3GxP@!lC)7u^u zTeh;+tPytiI&ShBuvG(amLg2LMco8hK$gqW2?8ypo)k!=0=9CAOH*aY%Mso4&dmdv~$g~@W2VIOx11gr#y)a z41>ZF8!gW=*xC~5?j147aLpIra?%WrgrU|)nI=O$%^$;5Jzh(>?6)xoUE3M3m`VS% zXYK%%%6p){MWM3bs?nb=yEtlcNgch7x5EJ@t;g`vDy= zun8xC^Jz1hQu#b{;i+W4&e5!-dqWL{C?L&Iwpi?%t)qdIKIkPjD|9bYutIQEEt2y*Gixf$%I9B$FTW5VZzYEj=a5#Js=r3K%A zHeqEmLuY-=h2W0uR)kzvex*IHC7j}~2knF2`^o~h_jBPGKj;lsZ4gG{IME77)x*w0 z4N7#OPPi8B*kFm!lT)32a}8Hv5EmO;0H~65d3+*kg)_HpsQ1ltwZ%+KG|_{yQWqaJ z=!u_m&NSGQRJpJi(#=#PeDaENKQA@go47;!=;V|rGK9bN=;rlu7?1OQq%hrESR1n0 zJtd$zupyKV{W{-POO|Y&#Vl%<|2VL8#ExjrlRe2mzJy@1#3hqo4Wp-8FKd63ZTElf z9~HJ-&xkyC_QD6ZS$HxHO$mcUPZt1Mh#KB-rQsL#+Ys8L1Fz4<3-VL8YQxi=Q^)&9 z)NcR0#adWdF>y-$wc5o!sxQjZ)Z!`FOBP0(@EVL-NEk11`3$6w3C5W7D{!m{t7Dmx zbm+A^&Fs|-8C9sNiA*6|@VN<|#bzw&sx84jj)p)tJeJ0P&+s7xTe}fzM(Ll0iD9Rg z)^>lM?`*>rZ2hmo5Mjt4)|#vCXI)Sq2ZoOkOXblRIQfZ&u||H_o9JoT!s-IsS?S; za#+}PxEvd^W0#UIgo96>VfXp~m8}(V453>Tt)D4Ip%yBi`i!(Sc6k^q0uDx}z+bXV z;?L|>ogj74@G&BMd=i7D!{4MEwu! z$>LkO-d4Y%Ao@DD(pr~_lteR)3*d*Iwl4Q|%cP(Jzd_QG@W3h10mrmNGmHulIy4dC zNf7WM6I+K5Ra6H*sSsJ(N6*pvjYpK3;It@`M?|f5Yj1SgSv`8-3)d_Qppizm(qUUY z=*^Qr1L9PT=h0o*gqG*=2gIJsdnW?my#;b5d|uBA7)&%j;O zNLaE=8p4u6ViN;92}iMuwf!XdX^=FOWz(KH={6F!o#lkjG{G6@6Is;FjBy`Ombwe^ zFi1%^#!Zi;vJ75eM(q>o!lsyWKNQ6^Wv>q1P6vO!?q|Dq`_?mL zdf|Md7I%*@%tzI9C)IpSAo&6Wx)Xutu#A>q6evTPVK;_m>7euWzCQOPv^H2;^y&i% z)yVz)`~a2)BLXa;NXBdz#K7LHU@}!EL50`)?6mvMZMoBW@SQ88Ci?3{WUrOu^vLNF zRl82}Ws$pApLCUO4xUIem0PaQ9?W5zZ7A83$7-K>WzbCkr#Qw;={yesW70Lt-k@q3jfegz){U zOT&h)GO|q=v2D?Pbf>k=rw7AfR>hOazJP5nU`66_Cr=wiP8-xBVxbK2_UU{Cya_u7 zr!i*j4N?@xowUYx4(6(g)lGFhbamTMEqu)tz}B!+7)N##wyN*D`U z&ba*=&?6y~w+$sZjEo_8pbV1826=rlJSM>-?ODMhtjlBb@ansd2K9FT3d>;)aRsg5050oX$8Ut`XHkE!N!*J;=mYshvma#t);oh5R zwvKQo&CSLzq_IX~H2B_0AZg`(2Vw^IPf-kRJ<+Gi+A^SM^!of0dkf30(lb|Uj)1w`En3EZ}iP||C zg{15fI!9fGiiZC~h|Y8Yd?dshIi@tggsXMN_B}9h0@TR2`BE^4m5_RE@G?t=NxNI- z8;miztVcQHLoX{e(N1TbWk$?2LnAzZ5|M5XJ}ygv4AXJ|#RFSTWw@@M&~S})_Ggas zGaotg%6Vic4i! zUk(qPM9@i@ez+ieanNNl*WkNXG(nWlGl*{z#B;$nau9+lG!kMo{YT;$FR+VXbc=*j z+H*^evUafCLws16(%f#)Si|w} zE5JD*{hRihRljYKv-@8Iar2q#atEnk%u9L>o(y->zvG{DP}#}tc0a>%$=Z&ZX$e7A zO{<<{P?*G!WH0{H2e4!Yj>3vmMuiZwEO0^f;$rq68G%J-zCn;q6DTjp&{>BmHG#mA zbcupS*TD^T>7Cz;jDXS_Z%_U&|xz9g5k_7St(xflILGljT$E9v>B+x$k# z=t(Uh7@8ric261rvwtiAOBJRk6by2Nev<&~99V+}DZSz}iXyFvg$x#H^C>Xp&f3!9 z#y)^txozx87Mk2BQUJFj`Pmh~>9^l2?J9tzGgmfVIU+oBzt_D9dm-}9nBQWQKU$a& zfN7v&ZVsI7AI}&txl?@cPLSslNwl8WI&9xM?MEd;feN$6f(M(97;ZA1Q2>71Es(oT zPssEk4~nB%ts}Y89Gg4q%6v{yYixuvogvi3*uob--8ldBuY~M6Q+JXj-wseFQIYMe z14JZ^IDhiF#g}y#G!E3p z!Z?4sb)X3$0KDqkwnf?hlgq3)0NV>NX{>{O=nM}i^AMgVdUH{k1WF!)xkNIMK9cpP z5V%ODGVgb5RhZAUjHuD8##APLFHE=^l$=Z2N(6T|cFM=6a+Gx`32!kX074CYqvY-5 z=c@P@w|5y$Oups9?{7a2QDSWGus;x1*O+*BLyraKU!4t6EZh)#@1#8g%LW4}@VsY; zs9xmnySZb6a6Y;`x^eN~S-3$yt89xo-Fa@rMD~vw_?rgtt;6`5KqVYg4?^y+UEuWI z3@1udqj&OHZrih1YtXOOo0RVorIU1W<^0FMx$;*&yob!nXiTb(t#KI zP8oFE4$TvW)X0F~^qkYTP-%A^?|&LX=w&};xZ%3+mq6h_;kH!1kFO(o10+q_F)|hz955VkB`a9^CfuK2a^= z_AdZZ1YrNH83b%N?>c0S&5F%M#pAN69L57QT!ozR!8&OdGl(t7eOAiin>!|hL)ws2 zmAIw^GD?rl%925pdzzUod7QFx2LAI%D^?AC^-C=!BaG+w&Zn!oyMbzZ%(nO0D!W`{1FnfFd{3*E$Lqf@N!>kP|P zwEaMHim;u6f|ZDFh}h~)te&xz;{`oSiENpD@h52R7AmN%{o<>CbBb?0<{Ye3!$ohY zxivWQIDY(mP!kYD7?BacrZ>k^P^?!Ry{|wQ&LdonE%S@Mdv{Dm!Ew|rWiNVpP$Ko> z-7+4ORnj2#l5DagVTgaqW)GnY|7Wc3fwsT<%KbbHg6mySD`F|= zuR>ma1|DjB^2Z!;-WlP`%Z#kOO&yI|n}CET+N9pyS+lar!dAuvH)$o~NdIDv+p{@2 z7;g4^I}`{-`&xz-GC(rSvBd}`;j99|D~qOyWchFdH%Hw&*kW5^7k{T6@p6Hi^Zv>( z4y?jKeAA{h-KH;({E&mgWPc(A_6 zc?e?3Ue`Sa3LUO0%F<31E4C%vS%Q65IazP%q7Bjtu3^OR!BbU76NTvtc8&@eSQ+$g zhpMVQ+~U{i-E8C&8xK?a@b${u4k}@fp&krLNsIT;=>O~C?M&D<^?X%1*WmvTmFmQ_#kgzCiX?g1kXhXK$bJ^#tg|hB?!5L+ZEr3^&=JIR<2rb^uQsPUruJ(}@)J{S zq>)JG-B<2Ak-M3r*A;9LZElI~Arf?nd0L&d^5{6m85;uyaXoYakL+$ms^F5K2hKus z2+Kh6b9`bUCPwR6Tl>r);(Rk1z>x1eB;pacW^-99ND)OlVwWYmyAH2ofVg%)Qy)m| zNkOhf)e8UJIpn}^I`85O7?LmL1>9$nCEZ08jHDsZ*1<>xGfQ-FuQPTh4%!v6v;PbB0?)b{Cy~8zK1HOHfj-E>ay`BuAdi!pMqZOlTG|VUrL*Ryb?4V&3`H2SD?8 z0c5PXniUQ8kHG*Xal=snJJV{{KOr%BD9n$}Fj%j}c0rjsZ1XcT$4!xoYF4UbATv8) z5TLMG3M$!%M+EayE#iGm78PMYr@cp?{A7%>W?X8bD@_r55 zia{5={<#Q6aM_LzY2ppr!+Y!tQM5@8UmKSt8?dx9;l=odw4*`$Zm98xY=r-JbZS*$7%NlW26Qs`)-6Byn|GTh19JOk|*Dm|+{B({Rhxc-n_W?Vjm zSFn=cYX=TEgfA-2D>_;WKg~YqxaQe8E^hOX-1_vdrFc^_pIHW1L5+Gh!;H}=)5OS) z+$2jB69j@!z^(s;p52;nfSQ_q3T0T9G|1b2UIE^^zDrqy zBt6@Hq7J*Vv}6IM)2g}j9c+flbGv)s5*}*`u`u-s54E-ksEj5n2{NrtoD4fxminxa zzDavvgF;F`0#@$&Han`1iwUBY8K78T$1E0ZzH4wAV7*v|vcEr`(d?Kul8iVK~Mw(n9;|<{6hN#>I_+ z8Nm%sw&36I*EAp||9SyK%YzHBd+#yQxmpjm*&GlUmgwP33UzUYI&w$=AN30#XKB!X zhdiVv$lZ0!ErV2&rH0X<;NiS9T;;$nw(-lR6utXRF4XXtN(LPr6_u>XgM8~&DCy02 zZ?THk(eg$ZP0|fj9MR-@VRci4sVU}MZjT2#N@3S$_?sWE^c^Jri>eF0mrFO7aWkJc zC?O!Su|E~Q0({N|wH|HpgIWXJvpT1S&~cKXh!@XUa#q|s_myBUGKg#&l1e1=cmT4H zlV+Y1K!G}Ct0b)MNtB!0c;Ya0Q1CC8P-6o_a2@&p8GZm}0DS3yb}bVET97tPq`7a1 zIBBtG1Emi!WD_M_n`b@{@*a)IK+#Bw^Vb1D3drRv$V^$^5$O=WB+%jfRejGl zL(FcKyGOt!ar;-_qb_YpL0jRMp2mugXYycH2c@b&1B!*rCZugJgydS9j=#Y<8CF@ zxzk?#$b3!Gd5ZLSo>z(x&jCaspnaXI8o(=u-vMzqp-D%E{1TvTz$BJ{o-baRJogm) zD=7>N;k_()sN_3IWE5@)6TsRqUpa>*3wS8J-XEYcGy$I!xLXKdPwbB9VPaMwzk%fL z+b49?Ms?E+VurNwOc6)8-L{?J60blPcS6}*I4`41%n`e7_jYso+^?LW604N*e8~-~ zspSy^75gXutb`V`PbqOFY+ku1DoUClC7E>+A%st)X|L2=1-xa!F$ifjgp`G$19CL= z7+?dU)sZ1d1#E8(Nm8wLo16#gcE)N|-H^Bt>hmL;q z-~$*UBl7~>c@#-VU<8zjyw68|T)oPDBZgtP))f)RUqMk1okfqhOU7=m61@(QqLq`1 z>XIu)#e?=7&#jZFu4`3i`ou7BYD38Sw;FBAD&0deU7)(`_>q@f{MOm?45nB>qX!AX zY+9I0D516+4#8BARSaPO5EoNH^1nQ%1W8)iTtBh<8A>)MxWZw4MQV1S67WWjtbQFp zh4CFec^Nea@RtC_RQUPcA)SZj;)$?bDMUv3;YV5wx;U6$YtA=Pfvv~JAsH>b+}H`O z7#rH1|8ho_%o8T8;x$wm9og{;kO1lMMuy`lD3UiNR3c58;CV}l1)q{4iri^KN1g#U|BjI;IjsER6vb!^gCEdh`L0*4B1>+ zs|BoP@LNH`n`9gjL>4&7O9cs7`Gk!ykY+DrM(*+OlY5A~MM{ub0KlsN@SBn4qqv9? zvO)<2=#jZ7D` zpjRUuVim}yWF8We-fH9Q!XyaG|vnjhq78!IlkyUqHBrWTj0$QO+!H z6D(tZD>1nwLHU3`!9;}l_h>Wa@?rogfZPfM4Iqr{jwrs@9PqM0`ouBPHttI^_5=Y8 z9B{7uJx?ze;f%AfvEzfx0jp^=kr!+y!|5aNjg5RN1U4x=KF@`1kmY?~YMUCW6tXmW zSS7=}*%2**Bk!INJEItWHQeX}=(z7HlLl3>Z=jJbE`I&V@D`Bf<5(mmKbr0{s)_Us8~DtmhX5gT2soj4Lz5!vgf2xwm8OOwMG+%i1)R`P#85><3{4SH z0YR{=JE4nZQ4s-M4Tvk&Ma8=A^5*}(=j9WJPf5r*$#Xx~ef@eabi~OJs(pW@{YBJ= zp8oBZvJnpx75gqnc1j2t+VVsflv z{mbVr^N1?fn`|#oR6;0EQz#fk!N{$|0##gDo?YzOp#c!+AJ=$drkFEq1DQnT88=|0 zDS#Y_>_h=7uUMl2DZ7HvZh#ti={+PywSDpTpXlqla&H<`KD<})rpLg=)xFtIg{d11 z|Gl^;b;MHZmGz$?YnH#R{px^j5Fw#uV_5}b(r#lWqM~LKlU3*PggI!OpKn0NnW4^l ze+XdaUm#QZARzR88`U196{G>NSj$E;!0C;^9W}XR^``v3$ysy^5>s8Bp-zs@qmgI5RNhLPg8OpoBi1?d&r>^QEk{(jz`FMuyh!dEx{VdiAV3& zA5-7G?*~O1!5H@RVU|GapSxCDy&TYfQeCwBxhcLC-?-&RKgD)5=bw%{ZI*teD>67~8BSX{_+2Pe3Zodd7n+x-&89 z-DVFd0n&j}6D#(vc>gim(3Gs2jSN>H<_~+IU&?pC_JDfmOACZMgfxc?TAq~hVb&HR zXDgAjQ&X~{1Ot6gaAkp*1W+dd(!iw34dy8`+EUjft!|dzIO4FnSwSx><;vb>(Y`J1 zz7yLb5aFm)i$^u0$Lgh*=N)UBKLO(y zVe-58*?1XwRE37>_9A$R6-5cP@K_Zn&maIBTXhz@uT?pQ2sD3zhGv5Sc94Z6Ps_$x zs)LntF$EL@lrTIV&{m3Bd-$IBOYC;3?a&Nt_gF9D>c!V0Z2!~Y5hL|aN8cXoC5_uW z-|(vca!pt z97EcW>uIqL@9QV19InGkyh$*65y*wc@}$KfSm$l5?2s5(#$KN>^sc&p^q&K=OoTGi zW1gygcMg?y=*f#LiobNdblk7cz69Givx4@s@Xl-7FRsO*sz@dUk5Et`Lv|Ay1Hx^NHr6{O&F~oQ8hz#lf)ZyolSn_ zQDRXGeuNzlcle(*H-nS)xj^Sh#OUF*z!}H!2}}{QIr?q>(m$*Re>m%Xw=#dhR$#98 zU?TD*gM}f~h6xf4LvOyWp|0Db>(p z>ngE%D={y?dCd~0ub1x#xa3_&p~tA4PhAo!AVj+A(Kr@eONMD1mTM2#3GF#vBvX@C z+Pmz@Z~rOMemi)L2y?S01g%q6vGvk={mzkW=fa{5o04bO^1w?0ZVKI08KoF5|=zd*aqg&l&P39 zT@O`@vR1Yg_w+``qRyeS_qKJ)n{L06;Gch+WMQtC!=GS1whyn(RsN|gS;d+iZVYq) zQz8)7L3?7yk@<%NoO^69VRGGImF^DWRGa#IUYSffDbn-4YS$b@@KVAMyk&(^NHf0c zZEHZ=rZ%r1=%e-utDOS8wBEnTrCCl!B@*xtbfKt}3q?p?!BDA+O$s@xAht-uGAWPD zO3lZ~`svv7xq(mJQdB*8v>*Xz9(n!1at2Niil72&2PJ{-uOr<{V3#|gU!-4D;l1V6 zTyTZ?BRG5NRa%pGtIP(z>tJ_Gu?#>r25{|@pn_}fKDSf6_F04D$|2uHh00s#f+MX) zi-VfG5@y>foF=dd)C^nDr*;7xfUazm;7!!d%Bmo(s+X0BF5GO)avr_8GI7M<`gev^ z9)X(AqUvv63{;k?cRhPt%^lW!D&Q)9n&rmPe4 zT<{u^_EAN4Ns0?ang#S|qUvGAd4gOddx$1?g?q11#f#4XX>6V+T%;yt&GMAG(%|Bo zI6t&>bZ7~vFtYcXs*qHP@*M&$INuC;`FXy~%%}t@)^cPwtLpm9*w*NHSn-ZIA?>(| z@aBER8gZlQhP9z@*t$yAgVK;?V0+UjgYO)P-(Up%s4XFuz@7vnE9|49`X8t+UF}8X zZq!f`Ix_a#&%@Zo-`@R}2{Jsp!0uI}BsDeSmIwCVYqlmi?37zG0eGlK`IKNsbalvz zy^{eYtt6lU6%@)iXWvzdhRWm%JTtl|Zl`P6`O)os>Qawiw_r!`zo zc6{CWa0{VTF#rkNLg-pJ?6;Tk`bLG-*C@Fy;TMkWUbAFPc}ttVi&NuSw2NpQJOwYu z$yyT2(4EzEmOIzaesc%#iuf|ZE*-V8f)0OV6#&{J9Ug1my z!hJvAdqkIPUO`}7SLJRrs~%i( zg(sFv5ln~fLgtX=n(+E?6S0HZ1O>}^jWqt5#4#`1$Z^GHD==g+SF`D(y8-M7m-BDDW>*wXEERT0)ayp!;DKw6z> zKd4nSNp!SnrYCldtS#V_(GUS-pD;KQ*N4h+F^X1bp{@=cP~&0JQ5m8dx~@=hQi9L# zI=XuM#$$nt(V*XAszBp#o;Byf9|X8d(4x}@{o~e=(5OVdUpY-bn=?k_a@*wp`$pOl zNkLP)0&+To4)Y6IG)=f5s~*60{R(h1SsGpA!$2sD^D15#&T)}-EdD8{^lFI&$$mw^I5jh5c+&>e zLPZoy5hTCNXw3<(NIz#Sjmro%)G!fVUs{M<&nIb#P^vUnYih$Pu?|9Qi~)`wz*nIP z4Vsm*N^vR}BwN-jQ;OkkcV(io&?|p2i1ObD9384Sz<4aL69*L5QAGn!C$Py3>%!I|>33+OMYzPRT3zQ@hIX&6U zpUQ&rl3WKBv=0IVIZlAgI7mr#jJ>nnI-lX>lTUoos`gX=j8cW&xFjr3ztFT3{m$a>xTQaX zIFM@HnA4|^W$_Xg{^`+q1=fiov6`=HZ8LdL~n3NQfDi+}>B zcMGZ#p}%}+9?txQq*c}BoNGJ-B_&9py=W;R4uuqEs)^Qgh!HoPKd}O-?y-NWa?N|H zIR(C9J&74;D))XK^g9>O_B`l?X2p+Z{a*4a66Q1^Z{x58szJI21`pS*br#rw;|M{e zy9DPYk-t=*kGJCGDcxC(K2S0#CM~cFkf)gnmqPJIa!Y*<=z{WH?x?p5SRWSeCXnc_k_{M z$is)m-<5dU%-h`G_`2SkuRvr1Kt&fu(BW9EgHx^@yckH34&ymCkZMi>NTOb#21}A; z97=GSZ2xEOr1$>5TH&ovO@li&F0Q}1q>+K>);!>oQOYeS92Rh3Dm>&2TAO z%IncIuUFA(ru)4_E9?cb4rjiXMs7TU`-RDqWn^QC1S_a#>$q#Qv=h(vDnnuH#Q;Ik(c7bLceB1&YU0-j@y z=V;bW1&RmS8H1<r5-1b&lE2fA2wZSvh#-nQYmdg-ofdeEo9~g%K3UeY^F1Bv3 zB7@5#XGtLUv#AH>b)q=*0FIiFuI$*PaQL$Pejb=1ed!19WT1D-CChoO(^jzQCKizv zMM@W`?imCQAdcU3ARWy5LCmR}R)kR==>{f~fkiXH>~K_e7cc)XPgx|w4I9wyb@5zO z7DJG|57*6#Htt5q>v%YoH%%H-oHbLjx+_gqiq=sWu}jw63sGs zGynzN^`Wx+003;UUg$I673c13E=MmOUXb%N}5HXzY@hfUp@Bp?q6QuwkVCC#HM7&>D>=wSh?39`C>NGSLyk4C`s zxec&!R8|`$NNd17`ha)i8+@V_&ZOC%<8AtIL9sER@mbNGJiO^2Fz#n635rtw$upY` zGb zAr}kE?+dcEjrE&~^|NvFPw%8x1^X%LbD@yn*H*TGB6ZQ}hv5dBJY5~bIVu+9QR5ng z1bPFCHIMX4WRs94S_64)T$DyfO*R5JtTPxjx>rn{adqR_QPITWKIp{?|o0c zGrS)X0cr^4onrEJ$vzX_Qk= zcbHFxq(p)ceRO0xYw6$7gKIBGSYPI>tqL*!Y~}XI{dBsAsi?K&o*p}ZzOi^ywGqA@ zlNnD^j)jRIuFx7Wx%#&&(6HKBcfG~x9jYkrhb>`cWz#RE3>^$|mXPB>je~%zaYkY~ z=6?jsXK#%$?ISxQOlO|Ts?ldqiqJh3MYyS^2Y!q7wga1C7u~`1(uQnsl+mDXDgOx)cKsR9N?N{o z2M+L*ZopU7GC?K_|Gk&A4B+i;{7t_q{zNE;B~fcKQXL)#jDVc5CT^e4ZL9P&zszcv zkV0GKqF`H{?0LPC4?80qKsO#`K_YiR1bwdoeQ>nctJ3m+=`o*kRP~qpAm3WFxuUPM zEy$}4omrh4pmh#Bs(kRM(ke^_qcBkV&6x;u>$3Mo9-LliQZpo!ZBBbf>R%J6Pg6>96hQ?{t)+_9`6%lqZy>cOFb5c36PA{0{Tv3;>qzWxEhJgRY(P&^0! zq40Ci=j+djIhQ#a3jSBKWkZXFj)>&iM9F;&I1`!(v9u2W@bw{nLb?kvPiH^Qw{j$} z6J55jPFWpQYs^g!GZt;W9VGuOoLb8vN+kw72oTYpXpFIh$vKTNjG_!1tQt9pJn?@L zhX-(_+a(&9sPdIpV>47q#E2#kNj?Suqmthfe8cynm8t6_1!IfQ%u^0dZu8 zgvx-egEg+iN49OVuQ@4i+49fH91)bFp|IU920Z{;?Hj+$`-LLPmH%u#B)4QFIk~CV zCAjMR`T7$l)DvB%>Z5*v+4Eqogyas(P~SF-_<6y8~o;6Sf}>-n(D8?X5xh5d(4^MC(sfv}5Q< zfYH4}W1^UH6q?%_F3aIpO9X^RQ~ib7z19_(?&9XL)N)t`l7ixZVT)Oty+xeC|@6L58 zoDT0AKOQl1AnrO-#uM|jfwx|^brbuY-}=z(9{L`ATk2^@k6okyB9d@Y?uw#vUQp>$ z$M5og(j{nW83tw*kh%i4{G;%6a>bJtoP?dj*tR0jk5-;R0dJUfk29ml6!HZE>B z84&j8qmzitMjpkCH=X$BbRzSL|H`OCAy^O7Z^GB~rFS}oB=@SK&qguAKi#eWdi91! zsR!D1W0tJX%-zpCf4uMf+1i6wAFB@hdh*-Wgs~wj)6Ykqm*F225N-~%{kya7hwW1R z3=pCSNPsl7hvLW@Z+)on;kQkze``Jc`CBs7D2MV$Ok}ebPk0d9b`X$TK^*(w-_@V` zkuZgN9_gO08aTZ7bPcrYE}1BilVdI7g2`UlEy^|&`^SqrM3h_!6r?>jSi^SioA#a! zO3nF890Snj1uwpmxv)}^2&$E)x1@D|D2XO;Ik>WEi$1^$mUk7&$)%6~pNf@LrZ<;YNxS+AZBZ-VsW!wNcTw`s^&NpSyka??u-!cQwWprv5Riq)C#$bt zi#Coc?!eN351LOmzET7rq*wuWfC)-?=pg8!QNF)@XB1Ul8(@k6q^Jx4)zpAV7e9GG z-Kvgl{9^NJ3Ej(Vpcfu)6Uy4`HkjqMk{eYTZ#aFI4ptd5peMeL&BF2^{d$9}pGrkV z_`tIUT`Um?2S#2eE<<_+w>9DhQAyNdYxUYSwFM$B2VyFi64QimQ~q|(ri|FINfuH} zJ)j?CB-H0Wy&;g7+Fk2mvNOP5h zV2JHmheBa{9w~1nOPi8Cw~JtBrV2(Z(DGPb<`}5}deD zM>slldVB=0igEK4Q)=nVQ+hNKrxDNYD#P72({;-X0J_R3a!*4rjotSC7_L10D^7)u zdI(Zf6r4*mcdJE%WY-D$6FKGT*gOR}qx*xT{PDCknn_c=Vqd!v4QCmhtR@bq=foG2 zY(h~u(D#u#lOi_HIvYrV`B6n076Zg$+Y&ky>Jqxj%_le(upk{dHI9IlHZR;Bsimgi z&Qy{-da;dRCY?xTX7dEwje6;WR9G#}IdTWmgQwnfl6YT$v!xlp+9s9oA-T)^!W#Oq zugH*wp3Xh5wR^HX0k&Rc2@xDPpE-EI58z&E*rrX?sO?@vLRJfA!8zcnU z_^!#fmj*Rt`n!GaZs_kOu+P_AhMWfBV)IS_07Je_;^``#Fr>x;1Vi)}JqfOhZB*VU zuz!AJJK)~QAJ(uc5prPDx>ZR5D=KK&O>Jk|69<+TO39;|;plT&RdM0$#AR7iKWK2azazbK;LNax$ z07ZrGuGhdjnw0c{kpSnJ-w}~n_V~}+opoRlMlcnLDbJS1kOw@WA-u?_T^_U5exTUM zU1Y7fHR|zGEbqg|zNiRA08ie60dTaaibcBc!r`wng>WN~CkOC0UU^e*C}fL6CnjX@ z%RDJlDF7u{nG7UH-Ynsmkpl}x9Gjj6*)xd)T{(}!P%Ae!9$;;_&^lU1=1WJq)Z$J=L{A2$jM2Q7M{)#)5dI zDhV#coAeSc#vv+?JL8v8yh4K{SaVz;Qz?Pg72GwjbAVLd#q|^X^}{F+g30-xl@t!J zIiqPRR%1(pIHj{?!SW{8k49G4tx&YE$$s;w1oQcf@ zz$p}!wV+FvBqXJOq@c1aQ7L0QZdK77yL)atnoH4vsXkVOWPMK|srV%)Zl~Mc?1(7f zzc|#&q)>NzFu^}|iEwQN1>^<*Ih2ieEfCX6MER_*`~s`io$`;>P)a~Q&ZHMuyW{%~ z;=9R913**bncE0q-8cN#>Q+5B2U!_UzCh`G)`+SaLX~b9$*}icKABD-6JeaT4TujC z;goY}5Ii|A7X*N08YnIQ0!Soq&3B_p2tclm_-B0j!ay&Zt;XUd6@baq&OF09j(kfs zDCgXTXEJ#-MK(e{%vbb7StP@8F=@Mq*kmHu6#E%FmAwBpJ`|J380AkHY@!|@G4}AK zhfMDdhE{25(B9BIBYV9a@mEHmh`X1_2ZTxs(m|ztDEJtr;$7YWa!D63xjV~*4UsP> zS|UhQdJ3?pZt~Q;h=C?PC)LW5gIY{VX_zwVmG)PZ8ZRT^*DZ*iR5ohCah3OpF3@_% zlh0UM*Z-}nIG7au)XB(B?gkxD(KEh%O7K8_%jf(*gI`+Pztu^%UjSHMAU+P+X;joD zu=!%|_K)I5bMig8XH{oTRRXjiA%7UFc7tJ4->Vf21 zK3UG8_U0Noc($hUxpG;PJu?hdyg~00O2_9JcT~K#X%l5!FUm$D1vej5s%+n3xoQDT ziK*?}cM1pVX0{|uBo@8&GvP>2-#j3^+g8O@0s!vgC0E|l^Lx+dyw8})(01(32LTue z&Fa796qETZ5s*3c5gy-E1=PPCakM25_0s(Z$3ytq@yxtZzPP0$2i;bjQE7YZDKS(wk}V305$dWKWudzC|FR!6gub_A;kK5 zA{Yh8Nyvaj7mi+lkW#(_YH}dN#8~)}8FBtjV9hOx^I_MY7upw$3l)w{08DZ7-jdX_ zqgwz)eGG39DniNJLznkvxyX)6h&VMCZu~ho_o$Jy`)o$h@@kAKK+saKCZ}YcQZPRF zjngRLJQ7%`!;!x&$$;@&e(zNmP`*z&=$c(vIH9dh}NY+nj|bu`*^_6n#pJ!k2zwwOO;LB z2CI~a%vtmt;=ZJcK;mz7hmF!!)2+kfbggu}RyOeu6 zF3fJL%gY6koK!Cbmr+ZuhggAx;k^N9%&?F#0N^nN>5Yv~Z?=l4kcALBMsYhO%=+(y zS4Ix%?ymX@x!Oe$y3^%4DnMAKMjhSCx2-I6)aZ^FcOD?2MkrL0v1uB&1z{>KY0t(h zSWW3`ECU4LM(5PMN<0${PWcWDXO9-UpAkg)Z&R5hydMfBu&KP}HQzu}(L)#BK{VFusvMZ+i z$7-D$U8NW?*qH(nP^FzgfT{>DKgTd=uZ$kbL-;`E;C^KXrboY_7B)bk$;^6oE zqi&FTF|@`l^;W1Bfd>>Ls>kE_B>&VQhlUX`t{pud#3$|SaSAumyg%j}ZGUPitmZ=n zxHx=jx0;_a;N-=ry;T8zOT_QQaH~s=pu_Q69)-W`k`u-lo^ExGX2fHsOG_)9cqC6E z1nnZP|BEZ_J3L*Z$YKN3@Ph<8NbkUNmKi5cR5GgZotXFKaX3gpdY&>Z89K5U45(N& ztLwPb5etk|NH)u01^e8mJ`vN3$m_zJVg*DyBGA>m&auIXjtfFoDLImu4Mn(uhesnk z2~Sq=s$p%5?Fxze82a7hBgmPkxz-%=#%$yC4=h~XGDR|)kx+bmJ&$1)4e7CRW5P|0 z_nq;>aHj_->c*Yo=-oVH4w92MPx?bocpecbTMFYewLctpjH!0tL=T^MV;gPDg*5(S#lNj!k)H>BLr)%8)oS^;T^ zC_GvE#0P}Q8IzP8;A)y^iyuc z`?GD+)U~l)_?Zr#=ivwd(c=r~IIQ>Ae*B>X@-|q+J)aG{ax^nmiL)gN6TwbCz|1@9 zt&msunqjEk?!Zxu0l?Ss`@VTWF#tYGB#=C*@WARvt@_nJ0acF7$dS-ECEzmG^zO?` z5tGnemjOn?z#7{^+iSo3mQdTV)s8o=l%Ou_Xl1}TB=&FPt6kkrj?&nRbm1O2b$@fY zyNSb~M*5VOiGf(``R3Y1&D{6**QzC5e=qJiHIDmr^@87%3nF{`?1MGJTW1kIUi%y# zhF!i=!AN~--H(e=GVKgf{ALj$EyY_7N>FGX_J0|qv(kPyIymRD2tRp~<^@4~#C%%I z!KdteH}KGjW02+U%GX$rpofutKGfmV4$;_+ zYsWvZ2%Cb8HXmSU{}Nw(a@_S3ZwFt;*o^EXB3Vujay5H{xVTr>?1i@&#dHIABLn-V zp+Ps4^k*5H$|~1cUfK+-0{UG;P`dZG1KvenIios9u(~QpbThI|RC6vDlE9{!9i&+n ziE~a}Mte~ekX!z}9ii;`6|-JZjTuF*#$u9bnD##%o2FyZ=$h$fHAN`SiI30DE-wjd zz0pzL@?b5R1Ql8Zyv-hm;AlDYf`_nf>$Nj~9xj%48syiJ(opinhZWDy-%2mQRdg}j z(4nekk;gtgUh|1V9cw-w&Pxwh>be8R9lU}P^Dn+OJH|c-qPHK19<+4?UCG(%Cx2&n zYCUV(Fc$;#gFrP(h1po=9BBtEc$ob#Q5CC{xmvNCg6!$B;OJN`H+bDXo!8a-@|{aD z?UDa)rN<&ylaKv6mPEz>Op4w8c=Tb!WY%&VJsju#ouN{%)O1Ekfd}s8uKC)1BA429 zs(Fa!#muT~()jIu4(?okAB zKOg0QIsL=WWuI}Ql!HIwZhv~r&3+~(kBHlqBj%r}K6v&)>-lHj=lcVne>?j8+g+J( zf7u`Jk34_BP4?eE0qEZI&$7=~H$4C6u8d5%M0U$_nVZk$$|Xy`9e9)TOtpMoy?p-L zpUQvdNIqVeSIV7-wHNer{on6dFuu58+W5@q-h%qQXDg>z-`|^QZ(m@_y4B5W;O6&joRKWjy zDhBX>eJbhub8LM4^5x4{uU`B2*S~XfPai&*x;ZrT@b1Hjq5c;Oixc-BhV!;h-5$xz z%)HQj`So9Khi~+Dc6Le;s;yhY{zp_z-X)SK@7{czf3`S0aQ^p+iO}$vH?QAGb*btj zh4!}g21d3|pDr+DX;P)CrT(}sQ+;}BRw`UciK@Ee$G333XCKY=UA-o&pjJ{;92pgN zuDMMLTkTIxluA?AdwVt_4pIxt%G_o*Kgre6Ve{q?Etc`&ysR5nFE^iRj*SSFWv~*X zBkk6Qt5Sw* zi+@aObIZAwdMgVLYg6M5(%yv)?k{HNq&k*V#L{9}CMKp-7w=zL`Eh&b-1Zp$i`!SF zR#jb9>F0MVg_(&*E2}S@Ysp3rIdMXzsMJ7rWzEc-e}4W_A}o{2 zS1;~gzubA5rENWY{`maT8>#ga)TK%-Q?)WLz7(Ce^^C+STF1Re#Pe+#I-K`I9G`TgwV0cP>cbEPp5K zCo@xCUOQW|cOEz(7-}nf_=n`miQ*FBU?t84dDPxEK%y38b zu26Af(PYmFcN?vg5Jy9G`J!FHI|A1G1@e1^d*TvHdA@GD0v)ANR!VYJtefdY@wv|n zGY4Yrs}A}(n=|+M+E(t0`o3_lrz|OMqhVHRMdzh^k+zyYmfs!C;M5EJlLO79FaH1g zk@{5N|9mQuIG?PjqK6>xP!UzvtHHCodE|dS)zkm)Q!zL9EMmoU-;T&zJ#Dv-E2!(( zz+K2)XdNhdx<6IwQz7|OLPu)5e-m*ZRcZbl@UQ`|Y@}xYrFrWA`cxBrZ-arrwg4?| z+f0Zc>i4*J*p&+r1QL`sn#k?fh&OV4ulr4IrsX7=ru z;qQ4b#*Qu47|lk%d^On;sBMOg0dF5$MvUFtc0Kd0dFSrcGivoMdj;fh8K>X>LGzXN z?Rnn#`@H1CKi{{K`Vn^4AsHE-hEFc0M^&!z)vJzvA++QSwja=!() zMk@ln_LBlxD(og>8$ETRAV5y2n@{GE1CMF^)#Y3aYsD|P%Goq6R<1Qz*;;+i!E>kE z$(;uC)wr;&V3Ow1gr-_GZOP8aHSWE05J(Si-@W<2%m&V&ezRVRjL~uWjvVuG=1Jzr zE%ll}&+*N>vf^3|Plo@OC??(zcrJ=M8R5Krzxq}~pEg5H2?BPxMQLO`<*V(9yobN7 z)G6FdZao)YuLU=yw|os@ol);NgU4x>C312ft5BIuvl`M_U$67w$jVF4>dAsWi)Ct+ zvMtHn`9qxJE1-cMyRA6fQrk2{^5bIK#`E;Gp0`spkrPX`B&L*6E z|7Fgk_fJ<1TIc<~$0o5=z8dk`?-jbWEmw0U$FqwZ{X6~+k;UUg3$>b~&}N@CQw6#| z&37q3p}roq&_DI#0cGQF&u$vV?_b$P8g6*#LIVB0Avn@+CRP5h;?nnl3?=_$1{FzD)psa$J~ zVGBKXW~KAbJ3S>Em7bUKUt_zhq*HqG$UvUMNFengJnZzBT*YfI$z+9ob?>6XTO(h( zf9j^b9zo(BAUZ*2%tP*!4Vwq-jv^Z2Ro^KtBwRv@UZsXKiQ7lxmB2r|a#!y;Tnnq*vmY zG`72`!^Js|h&sZ%xZ4xI-&?IT>^&EIfqoeu^k;_Nj_V4D`F6>Zri^qQz^W*z!fWP_ zjIYhjgr?m3Sq+%@m^l1r$4>JeAjXK*b**{Nw{ZcX4fWo6PL@EBJxV z3RL#lb%mRbT^Fb-?gInow7vEW5BC)+CL5ZWq;_OFk9|2>^bpu#e&9Q1Lbs$p)_*3n zAr5L;?h7}k8h)=2@v~FggP4Bur{NGNT-0sqHh9{mBE=zYLWz7p>0!;zk_pJ37u{Xn z;K_djzq)bZ{5@&B>-gVyj$6dIK4^UT+12UsLR{%eclwQ%_O&*BwofFJdwhF0@0d)e zah@Bi{rZt(a7|QNZ&!LMr0?|F-g>rS=foOMjXSeL39gQ6dasMvn4|tmuVC9ARv4f*yKeGIg}GVV2X4dU z=T!2Oe>DwPF=DW!U-bOnJcp{ckJgla@ha#%<8{}lCdKK5M@UtyU~k1^AOXVCHQ!|( zTEG+c+w^-o(f5v)@XoI`1Pl{iR;(u;@NSFqRYd5^2?vIu3r61sukJG0rjdvA_YO$k zP5gbkOjz!4zr=A*oXyFz9$4_v(cRBZ9?N1bescfb`Ec(2G&}ok&0*b)kUJ-uBka3( zWn4?!AHGpJ>FHlu;va@(cRv$1yF&7w>wIo%>yGpP{@d$9^KQk1;R(C(J+wPqjikvk zzk~Pf>_R;GOtk;h?muBDVXrIgb86MpwM8+b?E2D_Uz^{J7LzFX(>A?X6#moT^}luU zgRrd?yO%!{zWz1N(iIr6=Rmo3=qu!sT=V-aYjgJXi^ogf9&3Mg>U@}!!Ip%Rgq!7d zogZtrKh95`i)hq=La(fHmK!s_By0zM%LM2F0H8U8g6W}EJN`<$eKM&;i}I<+XD%A(ahZYkY1JJ1?%9hvwEG3upgD?a$Kru8h^v_kcKhFw%V}y zZ;&xc2o({e)vNXZWV}qGLRsIOzcMI}j;4$SF$9LUa9vkO4|CX~)3;6k7+G zaB`GE?|?Q*0Mki4ZW5aR2DDDnM!D%z$PNr)=DC48i3>27svs$vaAAM?mG4|h0CCVbZQe8+QcuMH&BQeEz}YuGGM?L z142cVa4Z)V;f&EDhwp`<)mk1~4*|k#YjS2@ZGy79qwg~0fB~imXxar~lTgb(%}3u^ zj}wlbX<`dP)r#uKd#Z>>$=Mb5(%n02<1XkhV9f+@JC+G2gp|N8fnt;zZ9z3%C~YRj z{i=f;MU+qgaD;{FY@q&y$BOn!P3lAF&=;tVPA=tAO@zeL%g_mS@t;+NDxUyoby@rB%(1w3Tx>heUIO5F z8KZ`VZpQTC@6k31!D@K`PKYz+%9sN9psTqsjI+Xk2F!7KyykA8hPE?3rg!atz*PN# z^L0+d&{=v!9E%~s|F?AP*Y{(qo<*U{Yqf%^54=`S894M;g+gXKz4@|6Is&faR|LIY z8w%rg!Z?8E%)C|csDv)-Ko>MSI`C+n0Y+!kfR3fiPNUq6QQ-9el$ux+jvb4iA&Ec@ z%dBdP1e^RCBTI3OFwjPMXSbMrxFRY6EGvCJ(aW5ieCZPR!P5g`KEPJn`wH z?op2o8$O*FdgZ%kmeI9TmeY0Q>e8|D#G=qu5l$o!Qugb<6qx0xYaZI455;?c5`CrR zlR>wDjm9_w>3#&ap-+N)6o2&6M~(6-$J(n-k32<3FKZ515?i_Z%$t2dfU0S9;B57& z0{>j*zW4^!Bbxzy&TQS<^VbMSciRN+U%X(k!w5b)E=)?{5_clrkB+yV7nm>tUEdDvc1;0jKTTRaEgBt~o}@MsmIu z=J-#N5R_<*wIB#+4C7K(yH4vax9g$!bue&$*8YNZt+$u^w~sr{eFQf40If48rqz$s z2B>e(RO>bZ)8R8kUAd;PP}i|}*92gKNeMr*euI{Hk}VY^m>~-G`yfL^G2M}#byypu z^IY-(d3sGXK&poEIWQ%9qJ6};RaaUld${$uLxSN;&5(SV*C{%uDfKxDN4^eZw$~F+ z0=PX$1p-tj4AcQYs})QM=TS~bY-lCtb%uo6AVFnb(UwJ5mmZT$A-9i;+{vyr(o8f8 zMbk;vFg4ZqJcoL2?i$pve40AZ`gy*4^F-@8=it^BygA>wiSE{K*Ys1bUU9x{laRs` z(I!@xNv~jP6-?<{K2~l_uNUE@tm#%BWkN_km6zf<>(_Jj{DWR#ES&y(J>3jYCiw#q zB1IlY*}uDQiv+OZQQvdP8a%4AkXp}^LF!M>n2;(=a3(_YR+pYj_k-(9bWV1xDZ=Zk zF?e=Z*k-|g%Lkh-hYVb_&&^r}{9*FC^EAI@(jJj)0!pl5Q_dl>iMwU00HV}YVRgxD z?ZVAY8o%UJ5xX0kEfq!_6{$^17i562gY;lfC7>JMCjxH^Wnx93kS#aPZXP;Eso}}E zn2MW?9i1+r7phG9= z7c~_eEU))O0A2vzM<`Rsrn=Ed{cOrqSKUqt`63`UJJ;?hgotd_BoIjM9;8nWdhqd7 zA!ro|NF&*U2ZqRK^2~ZdQ3`W5vyJQz{H&p~*V8YSTs*yu58_dhx~S(T35wE&PK-P~ zDLaNyLw}L``D7IPy-^cdeL}@Wx}Dj5NRV)VA^^^xq*Hw8GG+=6{s29aPL)usVZ0BU z+JX?>M5L}snK_tRFQoSKX~*bt!-+TGRW=YmISAb!q+=>-C>TEps_|}BHQcH%1Eqm- zVK$z=JgANWI$WRy55OLUcBq3@RA1ippx>Y@&bQR+qN>xp%ZqIMRz4w>j#r!{y76S6 zNvK;JMrI~uiba$iOlUisw1YkR@7$$RV)Vh&aL?Y+&Xe@Lope%!qG3*grru#@T zQaLkSjHISia-R}HYey~{8+&G&YII?c#D*y$v^LjmSL~Sz6R{&9mt`U(A;h=cMZfv| zH-FCK^El^o-kC+ z44FbW{hP?$_UJE~(83VjrQD(|Z+4d@a^st;-_$2-g_nM)rY*t9E;lG^EnRaARGFH5 zSH-?VupbeO?Vz^_&~lC4K|x%h1hJD``8ZndxBP~_{x(Iko;5_wWA;deb=ZyjS$!n= zFyv~a#u=g2C{y{Bc1q1WMKFF-QaWbXHfBl$4h}rJL()9-Z+$4-(aGL?4(Z!>;D;X? zP}Yg&OL;2#4^h;$#(R1d1N};CQkkzBI5?Mz8K?nl;9w=s8M88}#32M_G`_R^5^1n6k zW=Rm=K*`tLhSdEe(`}~%cM~7qPkM_i8;0b7CRjkrHn8U0q#pmu{>w|a$P%uC*mb^c0VBL{ekAGzy`+wm{Bet^jJ2gUlvjXgceU`<1>BaY3 zEG+joH{xGP#&Y7v3YQls8QaP){T)qp;38H}dbJ%9Nhs9W-4S@e*%1}YjGVl1{_ zwb@TLw%p|>=Pm0wU@v}Y!<&~MZhrhb3VIq1ZL~sCqiq0|ZcDtz0NDF+xAhx*Eff@8 z+x|0$JEb}h>ZT%2vE$TXE)o;~y}b{mS%rCna_5i(X2B`EV>|jA7I=hcn4z@UZ%1-? z^{~$r9WfzYx8t{*=gXqX*3YUM=OXH_0cfdi>pZ6j3|F5z7T=h1Sl)qW8Eot^psPKe zg5xKhO)!`r{&dc1p0sJ+(iKV0A&bTp&_e63>(KQd`!BBRWRm^omEZ#~s@sDul;=c9 z$hXU)H^)MAy<_#f7^=fgU^vv*-UxBm=@b!xu_xz;IGLN%ZH+mIQ5!Zkx7)WP$Tu}H zJ7;#r>6kO4$e~F#zJNn*xogmpWv_1QEy)M3p!P9>W5QL5FFALHGEc*vR{DtUmxm~~ zs6c(I*tR9?8G;9xgvB`s9Vu11drtsap8l69LVu`!r|-XtI@INZg68ceQY-v#B~E;E zwkP%B%JO^1mD$CPf&!Tql-p~HzX|xb-t6|B0e>he5a-C|Roa=6sOhBSW3LY8wyN!P z?cAc*<$ks!lFlyCC3h=7?3SDv`)_|2;9i4_rfb;7p?VIPp)yBN3ZG`NyV88G<8+ zy%Ek4eHv9-hU-v|FbLZfJ$a%D@pXr19V(58=#j^JRO(~sVvCH*m0UIydPu}0S`8&PvyhW1G zgTqciM&J~@;D&V%B~w<)ccqvpB1{3{3I7!kvv<`NKs4cqs-Jsh`QGPFDX}io`Mhfw zSr?k8sB@Yj8nCse54{GYh2iPTZ?JS+ay55A5aCoU?0=u&}jZ5Zyfub32Z+)1Tx1*<2Km()?_r z76ZX5CKV%o?&CKTS!D2UW>zW%R?DFZ$0RtV2I5+{tgwnA-WheQKTcH4sAVy!I|O>M zl40NDzmBUR#s(7ZdHf7v>({RO`?YGkJ>7OO<=?75gA5lRd?Q~F+=A~peeOb?BL#Ri zo18Ia*jf`#Ld~#UD_<89_KqAe3S7#7enx}U{i%ZdImh6R2~E(cf9}Ov_Uwp>D}xfu z8q!^hj#R5k2~@iMtt0_XIu7sJcaS4F2fO74lPPoC#}?Fs@iYwfwLrXU%}81o%IPv* zVXf}dht>||htqCx@-U54%{UR3pqI{s(?;(*KCTY~HgJdB zZT9bK0Lzr9UF}}Ny`<5r?zyi+U5%EJYDBP+dgqQtB;4~oYiO@3543obIb*|7TRSKz zObM_h-fXcu9OA2pj+~;#xZl^r1Z~uaQc;q}x>?Bqy|OJMXa3}mzT2Ke!^rzAr2(GP zdAQ)Jv;?9kD9@$gIK&bgiUV`JN!Wvi_~@4+)|WN~7dkv0kpRDez(8|o7Sl^fj``BH z;dCn&_!8ccXL@e87nd=(6Es{MpkA}c83y7)FzXC?dmYhOtEgDglFhrtVu16@NnWbk z<$4(R?;$`__9x~++AVPR9^FRH&^2zXBvSzLLvTe_1aZ*GfBnoGuZ)O?Vh7v+6@w0p zH>b+!xf0mv?_rAQn&kYE z)yWyD#rp7|d@;2Nhr1m+yuJbNUyp<|E!q48inij9zs;gvotxRNR#Nm~i4?TvwHIWi zGb3?$4gxr~F)T+BV9*5bdX*;2(MU{Iy#jmj>A=nP9VEk~S-D!|_1_wa(|^Silvy-kvrNpXPyxk;IaS38)6cazrtOp5 zQl>ngcTyA#EX^f%>;Ec=Qt4;)8q=lRj&aBYgg07OvaU0pxuKluTZOYK#JfFLR z7tpB=9&;8<`px@|CLmH~YxY3iA9gwe!7V$`C@j39TIr{#+j`=2{M8de&PtT3bO2S) zML51-sx#Qo*v2?*y&D)SV{RO%@Tg$pN&W6kt`jhiy9PS73w7L8qw_;GC94)ZbL&G* zwA#1prnIQY^GBZ?!pN}0g6u~TL_0d5E}3K8I&rEIzi@R}=Yj28FqaF(P0Ig%{Hq@W zf`=yGOq&4(-hbP7zW7-8xMA%qwTdcj>1c-}t<1#Mr!q5g!92~z@Q*?F*-Ed`O9?gCHWAjr)Y)4XyW>mE`+~5`^vAcRIkqgWe+= zeG={B-2_cY3*VstQmUdFRS@eD!~dTnujHgC3rT7qM_EbpS}4n#$xr@^I+Uq#IQ0i- zRMYL|=Ba>?;Xf9S>Vy`pEhHV+3vu+Wa+)UJ1(suQ2%%ft;&_xBR=eZEbPc?vz3Ib8 z#<|SmfZyR!qOO|f>O8PBSgDPgaH^CE%^ZcNanGfE)TXY2#{2}pC%0&=(tXuHNxrm1 zh1vQzE?dp+UfA#DnOFrEw_6dE@IkwKM$xZY#wj`5N2v+v)%^Ji5(L1Z*5XAiclPdb3K17e0Iv}T@>Ojo z#kja>>M;Y5nRm8-w7cXs>GLq|p$0()&F5W{fl(VPfTq!opf#jKqNSu!yB4>PGPdWp z6sKhh(f}h00gl7%d9crfd72-)+x^8Q`)}(Vnv1rBE6z2CBKJYw#tv_(&L-ZSCpLX= zD6&VP9IVvVnVT?`K7IgCCNx3|dCa3%Gako(y`ZT|MYiV@35VgiwWPT$Xw?qLa}=pO zJ$YQk)ML2_n-!ncO7m+Zxtoiom`OpV{SH1YGd==}p#JZ@`&QS%iL^YIj0Z)Z@q3aeJ!D?qSTmiPbmu$;A`2i8Rd=^UhYH?!d^5kWQTks+m#l=WK-i ztk5*YHF`5LmZ-kww*p3MuH_r4o6r(1s-FQdj&^Gp#JJteC8JHUTQzwyy7y@i=hgRz%$*FB~oUwH;4X zk^Bo_e;WfFMM8du{ZYhuSZiBifmD0A_i{BN9KQ}$g;nnzVn7nDvzcUEF)O6kL+h|F z#Z60Vk|sQ?3z1%9qSt~!l3xK3+lz!2%AY#wcb1|A1tc_TkSY3SJ2e8;)fc=PkQ?rs z8>Gizx8dWpXQtobYMd328x5k0HO_msriy6r-iOKaRXszM|LC-ATO8Y%;`WshX*)AYH1-Oz*BhG^4tE`J z4b+Pqa!H~)M`B&@WlKPy)l;7fPi-ddI-G!;Q{4ot8Aixvr=C;bosA>Ws#=~XV%g|S zwH`0+`U{gFK`rJvVaQ_h?8Ut%_&F{d&`xQ=x%xi?8ZWK4motpYYUIXSb(;^KM*Ugd z9eLwdgBBZZ4p1=z3h(tk5{C35_a4+a-6$VR{c-%c)LT?ly7Nxp+lZuyi|o0@DY+z} z0g^~+-$w*HVAw0ZAnq6*rVkb=^?Zd6)O1%4-@M;E8*?wrB-XyED!c)5iW{`R&=g zE&I!+AMWAY3G|a7?iO;ueU05Hn1xEqF4*h}I(lYn2T@KJpL0=_zdR``7Z&M#Zw zi`o9?5dn(x06eP(8Q%-v*sakuYX%aDzuIYHJ)bMg-~ovK{&-v~?e3Dwam`gfCqh1A zm~9|uNK5P@k+Ic)swPSjXeBF}6G&2+rqa-IevA730h}I9Q&RlJO45GZqlPIr!)xs2 zaszZ>6z;$HTRG!w_wS8SwDQ+A3>xVD{gb7_LB}mf47X?nnI#J>V3t60y+NDEJ>cr9 z&C|4?xy4SI+8NfOxnQ<8z93cqh<{CEmkFmxv`rY8zgtH`fvZL1G1Fxd`giwIH>#Dj zYlkLKitkF8`Qy5aFoyF1Uk|k2Vt6i55+fzgwHB>VC$DKCCs>PI%$oCOiZaZmNDKMI z=F6}4!*C;R4pdTF;E)2X=|*a8_N+Azkm9di^p%3`jOpbEkQTNI6=KL z&)E=R+G)*C7MRIVGzRgX_J^_*aFZGI9xtD$iXJFlq9+CCs;EhIE|MY_G4zYMOw28w zA=b$BI$ul|+DsPZl7b)LufhPcpl@2Ar&}Y*5sO_~wD8_k$lic+4U@twAj(>@0;S9; z(5DB-)a~Z7sH2PjtZv>v>v(BZav*zyAOy2`;vR3 z8&z%ZquApgkv@O7_`v-?g#<6CQ6r6B9$$l$Jltikzct}hdFkyN?o#U_sZOdUO)}ui zaw*hBMZ5tGPg>N30vdXsr`IVOHJO(WxHNS)G(TXx82x)gS-H3ar zwhvx->fYHLMkDz)Y{T51T`Oz)e%wyKW6)f@$PR~(+7$=Y$B2aAl7K>;jrSk zgGwpP8Gc1_lv4!oXRGFJYxUUCKFE)F!C9a7**8LD9 zE!qH^fv%=+HcHAhlf6fAvD96tAP09!ikO;ZYH)e;s>uc5_i_FD-ud_u(xtm)OB;1A z1x1r{abE8oHCF73rGXrt*D5O#Y>L^S#XnmyGAoRhL&4|V6 z&GeSy=@<#EdArvWc5h_*i!YcFmVJxHT$s%>!xS21XNBC%+6z|A1za!8oys6DAKwsg zykw`Vy1hiAg>v_o{i#u zyCq|rO30Iqn$IU+JC4ZlW5Na<#Nv95g~U;c&uv7)-{&u%Ad;_9;R0^%Ufo z=~X$PgAKr@(>(nT>}bX%v?8BeFvn23$ym((vv_`^F2R6|9x`*yB$x5f;HTMf1=_^~ za{5P@gQk&!ZZ$u*Tela7UupuIN!HJzp5JNX(}0qDtVFzF$+XWt(?0aN95x)+h97ww z3ADDNFkbSPuh~l>AhRuaN{wz+f7_ZF$jFx0Iho(P+Njs(Q}pIl!NwwKDITZC?ezGU zlenk2NG;J!!lnev`6MnlQ@DHO=byhqn%JL0d)c^S;|lJm4z|7?TP%g`#W+WgFCt1Z zt@PD2%5+tUyAkX=@8OO@K8%&qF8h0R*s7&@*hQGq@|cNfYabL}XfAK|(2@t%FAfQ7 zNyq&l;8(EUSgNm^Jj+kLVerW6S{TMuh_?lvWzd<6NQ+xa^UzYXx%$|9ZCEDhJ1Heo z|C(C!`uB_6J&T01yRf_R(Qkt(V zNgzO2*rKTzppB9d6h2T;nyDvm8+$Nb9o;|W(}cO}r=^$JUScx0o)qz z_l|2@Z`!#3r~Qi;OO8q5C@H?jG07=0`g1Cs(xHX)Md<53u zj$_FM(DWKIhH6~}|DE1Lo5aQA%?yCzQx@yu8gXy)J4&O*MNsC54aH;uLDIy)VCEZsa%} zv%Y&Wk?Rz+>GqgaUBt*}*4<7Kf*e2*{RVDLBo{gEn{8F57;onsAafcrQ*g|u);rXF z<2eB9Sn=bc5`GxE8JSyn7Pt0kbX#Y7MlL{wJKL`a1GYrk?>#)Tde_=5f4PK~PLJa` zfF2eOeZD;mN_gKLCw6s1Pw!1zc>L^Er(fpC`#T+C=TrzTMV}SMSKJYm2wgYAwyX+4{GOOPGZ!-P9kN9BgTsK=*cFjZN25 zeHK{dPE*Bgwj%Mcp-AX`!ya}^7PqyNLx&8P-5q~7{*6qUp)uJeGp{a6nYGm-XD0YQ zkk8gf{41^}iS~IOPQ~_#K>|5{cgEU0$5_vwtnaU8#&Ms~ywMQ|&@xBDHK>{o-SAuE zm?Aqe_`bi0+*lV*^AMI5WFiHTSUXi@%m=W+)Iz|l8a%dAy6n815pG3I%QxtjVGz+E zvtdlc&2eCSv%39{z*=D&^{iuPvhasUb16quA#n%J1!x6hZf&Q=TbOgoX0mHNOCn88 zRGYXlL%a!gPAf_gVa=Cr2r1$XR?*6m_5~b{OxYBA%`bUu$LUl@1wqM}S1d94$_i7p z9Q}yxEV0=<0dktxU>)Qx>IGNDIX%}D_EhO+aFROIkQL_HZ9jt&h+^5~_~ACP^N%;I z7*MtdmW;PEtF)|1S^|(ua_cHDc!W_M@ z+*2i)eTC)&Bw7|H@%;=ZpOjN1`i8PFgp;QEZ+s4mfC za8dGXVEyl15{PMH-b)q4*vf#@3tj72OolUiDI zRB}T>pN3dRl59v_g(zbxB!iTqu?(HPeGfOBZKqCYBUPw$;1O65B7xKomXR2_6fhTP z*s$ui1O041!YzY`HsEeLt=bzSRIbexOCR;E*`#lmjG`Quw40;^F2?j6hTSS+?em6l z`h(bFZZDdYjCQE6oh@3pPD2f(%Vx^a3XXbcL%h%~Ie&ST;nlURPa)6owc+5{l*)~B ze{cIZ_z|&9A~3%rv|fR~d7N(mAQMA`y~9v;W|4iu)HvTNHU4SMDf@K;T*$jmrwGhm zWv|EYc@L9Zjbe(gQpQg+ToNfv&Iir0)AP{DH=3~d0pQ->qC=oZl7hIhh$TsebF9E@ z7YhdUj}=fT(ZhZAp*G{uJbT=)Q3VbPU`Mf0AIMrx{efY6+22pL6QpF%HMemyd9$i> z`Y3|jddDBV`Qik7v3KU&@cs1xpIF<+J4#EZi=IWfdJ4jB=wz-w15T9Y8^`J|&+kck+CkdR>-xI?z5-5 z{6FGJv7X(TVa+q?-Bf(rHKzvoF|5Q>nVIX_w^;K1^;!+k~5B*B7}z<*os-^qndl zBT-2IrLmm?gQ8cbvp8FtcR779#tff6oM@|*m=CgdL~ovipfy@m@6^Sh^|$fwzwUoG z^zee!<*)Id;+B(*SE7TioTEf>+nDo&x@a6!jC97(f_E6tYcNUxF!`QUb&GQ_E+!!d zsO+h$YGK#8Wz3M(=ZZNH&hg2YlUkGrfBt~s$6MuYO_mgpCcM%}CMrm$c3~4VquO#1~OGZTyc>k_spjzmY2Hn^ZCWY ze(ohZ+OphXr}j~dwGub4<*Cy`q?ongdWlB^!E^>PCxt{8?xJNcYP zoq9i1#`uQYx>(V*#0^^Cj!N}2AGA|DIPjckifEE?Bbdzrwzsx<80F+ghopMc4Z207_t zj-Qf;@FBoAi9766fjvo*{r0UgwrVk(tBIS?ojX_aKgWloHw5=S#qzM7y*oUZU1?7i zuunQdp4VW;XqBgVp?j|2ri*P02A*flY=A-k?zd}VBCQxLS5_FANZm(p1lq%=$QkR= z|7FHL|Bjkj48~QdexzTfhsH5De=(1EJG<~fhbrJL;?RS!z5vlNJm@%P>z|&%D7J=~ z5779u7Dczj_^V`|20ShYI{Z6hS|7Gq1%*ZyNzJ4QBQT0loZu@ithU8p>^(3Udsu$k zWZHU8;PZ9f^ut+Onta^GnUd2W&kh@`%{Kougq&Of+zFXGK7SG)Vhm`Mmt{zx+$w-p zuAfChG4f~zIo9M=ML^AbB(KdKd+La9WfuTWMaR!%Xv3uG2l^jhMm6JIA7#pjwo~aZ zrz~KN+jr$nNSfn=n8%v1SE%8x5yHlvQA6O`;28=Iu z&PMaEb2SU+nIf*#oVr}2c(1EShx%#($ie2p1lkOodoUQlUhZvyEpmH&{@;!!Z+#}Y z3S;rTL5l+NAM0nf;(!)QL5Yj9+v@ip=t9tOxBliB8DMOKq{F0dcaP;!>rMPei@-iGOP zrD<%Cx}X-)w5Fnog{07?@lIyhnkreP3i9vKPHZAgPV))K6Zi+g9)PK`5!)lHzI{oi zXWAaU`wQOc7JkEBGc}AbXzGFL6_@dUgg>uHHv#?r3u*IxYE3S&+9x&^k-I#iRvzju zpVT5p!ia!8h#yIKn*31%F6_eG6ml0u+oVLTXaE=E+b)mR$AY?28XN)q4d9hSpaFQ;I*J*|yH z>~f0qq&HuCIb_4wXimGfoyfg9XRa=e>;6NF&bdnNqq;5L^w=d&qt~nuV(m$H%lCfh zf9Tlul$8qiXq;Bpd4v|OU-3vGF)3^j`e5`?s@@1^y>2|FItA8lsykK$J zVitG4BX>Rz!C@AB)m=u>6ZABU<$jk{(-z2=+5A6z_vJ}KjMqglY3RuoGd-}4A1k9< zA=*-KU<>qgsj0n!E^%=X#bd%ijk7_tpA0>@JMITFMni2fhrJh;IXF1RMSY8Toyb`zNF1R;$jgVeM(UKg4%fZe19s z3J6d8RMcfGx-@uVLmJTk3Sw8C8ScLK0_TFZK*GfT0z6xP1$`!Fp4o&l6Zysk88MO!EDO>9ZI!Csc84G ziX3`ElkQ5~tMHImQ`se$VjWCcCxJRBlQ|zJ+}4ybx*0xMZ9)3>DQJwe26IuiPfqluskDjmu`7-!RkngmY?*?)l1xLS-;@ISg1aFHsqseb@X!%+vb@D`&&AY+ED+40X!YfQe&$xop$ul z1pX*VesDVI$r zO@NLASF=3mAlxr$3m?c?yPC8ns?DcEJFyC)_k*OmoupW3Yg`-JDswIui>x1=WA-o1 zheSZbsUdjoS4jQT3i@~5!Rs8pjN$g{2$yDD_D#0p2F`2H+Z>Rh!s?hUU@SruH%FG_ z;tfkqL+8DBPQlSH*tsLvV9)LIuCQY+L~hwn2^?anDWRM2xY`d0_mTgvI9zq7(0&qF zCrR${37Tl4?NSHt8h#oQ$WGqE9U}vL!#;n=&~gJI z5hk}YLX)aYNn%qLeD6}vG9f#%E7S>Ow9egU|^#OTLKR#|ox;iW5Pe96gV z;pJ!b<*j3|&$EP(#ivOP(Dw~a1XM!Z6ElP3d3OzK1^d8j|h8W6^}efi|Ss`^zQ#^4h}_BMyIG6d;954xXp1%k;r}y`U@WsQ1yTf8|pkxC-;{ zg-<+`OM7h>hA~Y(MVmgG){HaRb!DI0Tj0=JUp84&_Ar~LJ`Xn&;ERk?sHvEZF}g5* z*!88~WNyO+q9{Bk9r&yrchd4?+ict%JjGkTl}X&*KZKF^T6N|8-F0yOyRmgowq!Gu zen_l5VcxBppZ}5kJZ0a1Rr`MZ$HO3@+cpqZw+nW(+!p)H|M|z{&^#3p@&)$z(zfY+ zTC#nhh=A;e69v>5$*^W}K~bPC(#z5o6bVPfFg_DALZh3z(7z%M6`&MAZKZJ@kwM3U}qQ25uNw?lSP=u6}bK239nDI5P)h9VpN z6c8xc+0~^TlJA954+<54~Kze8V6l z;%Wl(NH5EwSJOCN9k7?ED8LMd6jp=10)8ya2C@m&kW&NUS~cjJ2fN~I`xeN3#G z)Ji**VKF6hXp1hcRGP|uM#NY>*XPQZPdboHt5?-el4-r|y?Yw7bXRspulf%(K0ozc znfruLbvc#3I6{1%&l^E8F#D0 z)iOii+>FG7i#+~g#FbS%QT!X#u6X~n_yBb5g9xt{w{FS9v&Y?`d~|Eoz{O;y{eS;B zivc=~#BKQne!%G0mV5Uvd3y2lS=V=m_9^wMKv$x%VW)4kI)^Td9N|`q2TwoM(Au)! z1#IV82zJ1M@^)4Lw*c3U&017bS811EY&v~y=cv5`Dzl)lcbMdImEAJjqzT(6$!0u) zcMvomq%jNJhi$!Yx5z(a;Xd#R?@H%x1BOq_=jvczcQbO+87@dBN$cSvP2{IX6aSi^ z68Mx(aHnC&7^|3jYx}pU-}{2d8AKFl-S@6C?rngoJZKw?`q_V&D#IRf1fKw4j3}-H zZi}5w8xVvSgR|Ko4YQM=V@D8I%t~2Yq1r}q?a`CC6B8tf#k}kSqb()es}+yun@8CH zzBsfpZgNWvw~}|4n?nh^I|>ZEok4Y5$8BiJp6ee_)Cp5cO(Se2}fAwWF0HhtYUtRFS&#NFRjDBfqL1} zo*7yA{_q6XBieUt=Dgxbe;zWOaDl-#soZD9Z+QK@Jui3tqVu%Wn0yil$+IH6MQS2( zsaH!mO%W|AF6UJ%vn#y@m9nxzDwohhKmcaprdl@elh|etBZdW^$g)K>p-*Rht8pN+ zoA4sNi}dEMvgoW~L5=|KG%9zk4*^Bn)8w5#WKi(T_vyVWJPr&-lB|VS8lVKY6sW<5MEP zt%{#2W{9zWT){CzRooo%Bc^*7wzc&aA$4XAl(WSU7+{-uYbqj%@L{c}N61c>wB1xp z@`n^zV6Ggj#;uG7K7A>^9xi+005K%7^-6}U11wFgDGj6z*|IYmVNuyv+$(PnQ`n`>t(N_`SneB zL$uQ9<$Y_^0s8Q9UY3UcOYMeVI`7~abAM+5Zxu4J3!`lt=5lpLVT!hoq{`HygQ(_e zY#kp~>^^>S4&*#Zj)a2n;%QA7ok$UtW85GmH#zCIRPn1?B`8 zKo-Yn!vo%_PV0X_<<=p&T$sBFY~9U}(P#Gd^Hv_$-joH-Y#KV6{9aN_k|x0g${WmY z65N)Uhi5cqIV@9>Ui5U9YPs(+_DqQta@L&KqJ?O-RI>~1_(ti7qM*l?r-kiAX-(DV zYK)XIcik;^ac0uy&)5C`i&%w>6O)nQx%lP`V_=w)EB$4Ct7e{WV714J?0X=6rYin7Q~ z8>h>y0MT-b{z~DV$f?6Ys37t!&+Y_C@F8vH6a%6HBeyeLL^?_%2$d z`10}P4kSY4q%NYI{BYII=097b3NyQ0)IXP=jy~*aa=kX0Q9j+@Ag)=WpEgx7%l>fv z*2HV}mu@fbellC^EtTEc*6h{sK=XX!!Cmo8=~dTQFe#%(_IMLUMlS}_Cj0AQf1f#j5j4i;Jp+a=3IRBfB(3A5X z15kLV?J>dX7yvZ$ycdd(gggVAHHS81-bxBT;pDQhn~k~Z>ExO3DlnmKo_F(i>lzdi2UT1!g<_m>(QadoxzQC$zjNI!>sZz3!Td4~g5CZ3+5U&eow$;<4 zjr2l{y~W6UMl9&YzI3DZ`)rA!KBxg>%tMzCcvFIJ1ZJxyrx8?tRiHN>2e7XXw!!Dy z-|&TR2P^hURjf-Wb?_}YlyDH)>{TlA=j}&V6Cm^L6TqZBJwW|`Bp%&u8%8H44TODd; z_J`a&Uj)Hxl25N>y|A-)U;+_FiO1n2!j$>Tok#lTy#v!yyQhUt5b?p6yBJ-HHe)E& z-Aa0jt^38$p_}DIO1c*ljlwlID*xzPv$(h~PMalSy#K0DzK+kT)ub z2b^u;#WflS#SX7k7#LbJM(dn*466f~^P>K>0Yl34Nef{T7V}>Wwr{KoJ1j zSS&Iy%O1~-IDPzPbJ^Z6Ijrz*9|p>e)WTob8If%v<4;YVdm|(zbSdSgPlPp^i|4n9 z$v9yasB9zHZ1qIA5QW^0j?;`+LcbfA2$(tY)RlQNT`?L^(O(Qjtu#?|MwUBzTu{dR z7p>SN=c);)m4F080lS`7$mKqYUq`moOW6c77!L};vApUi{BL!mEqsDhDuYd|7bZkmJISxC;!Pu2XhsZiXLclLQyP(S$bsa|Q z2W%xy^9FX0*nnmtw}P8|6S+jidOPdeHza3pko>K^GSnJAU8Q$tiN5eaYPydu%T% z;3g8(Gz|~lO35>^8|Acol*}UN{wf$oSt4Mc1YD<*WM(bIt@U}5*95B4h=m4R2xD+ zBwID zw6hCL?6w{jXOQG(L=@;29$cAo0YBf_zLz0n(|FT?sCTS*@PbRO9B9{XzbWLLlt zO#n$M$cFGuCG0rskc#s`yQ(oZKfSUVQGf$GGgiJi9<=xT%JlT~?dMngZPP!h$hvr3 zKNZdDtk8R6eE1B!}f$g*izod zbht&QPDVxiIU?dE!pIOI9dN>BpV1Xq#$igNH`AuYMudrwihSiT(n2iEwc3zD*`zXh zG=V(5>J!%Q(_D{)zK&f+P!cY0hzbL0jEwRpmKz}!!NDhjAx6si3F&*BR?*Mq{&wop zfyuW1CR}KR3}u_{r=)gZjykZEbc_{^@&2`b_YC7i6VwP3?OP7@<~2&!B*dU%6`;(} zZXXr!xr(wscUMMxFOF(^Qg9~0WzRdLM*7d5gJS1n+W7PejM9&diKo-W=cN@xQ+9BX zYkT5G&MLZ6KVTKAC}X@3>H>6~i;Bj= zU`)l363m*da4>57yl{DL-Yv8z%U&`$AnmO{E&|jqlTT$PMS4dVW@L}~2RX#!Bo?MR zk4)KW-k~w=yp8VgxDN%JDA%f>4E(X{CvpaXbTeqz&O0?@Jax~N@DoSZ8_)4DS`H2; zTK&qcoX+|{SJbcS!R)qi^14&Ax1;RZ(GnScqVD9tCVclB3Xf2ocz@)7XAR10e>C~5 zoqgv&+57GgVOXHU#^^jBns3(4-U3RMk)-+Ly#GW3q22M`ENLQxZ%K@b9>AkBcF*n<@jJ(B_iL=6a16b%T9VhL94 zp($8{qGAtLY`+uKqgc7;`8%8}Z*DqXNTJ$zS`Hs?JNXR!@#UfRsFpotz1hz+p z80RDsOL)j1IW7@}7ru3*hBC;>$Ky+mw+=l|K_?S-#sqF`p6cJ599l8u(UcV`iVbg7 zL~dOVG01PS5>M?6+;Y}Y<2agh zdO`)h#p#H9{t&~uV&?wuo}Gxo19)K;)-XSMgB5+;ihd>Z$@yJRYyqQCRl)fJDpbUR z5`urO)!3@puYX@OZm*eHT)5tr{upg&E4%$?H=HTL;Uh$dj*z|j)2n|oe(l8R*3w_q zIb9su#y0_fKWzIm?C5{~h>I08`O!Q&dar%n(07CF@v>KQig*hXDB9jBoxQ7$E&7<( zSmieCGKcp-7HOc+JlI&ISEzH#aw7jK^!+ck*KM2(^A46>VIsV|@T??Q1yZAVMWcsK zH9WbPc4J`byFwOFp;%W+ilCNQ5Eb}m-|R>c^tH0)jT2D*feN2KnC9rO)jXe=$WX8~ zL#7`dGFS|}&#gVYk-_$nT?4Ap@7rv5|6}?<{A11@b+i-M@N#OHm9YKwoMQOJ;yZWq zV@xbx8v>$>*W=W`uZ4eq9arC%w6!j~E z2f-{d0B9EoGL8P;>2 z<|&k{MKGW^=!WW5irc$MVl&%9R+pqDxUB96*iWi!OKgfG;J^)1+wz4c^Isajy}diM zxa4M8_M%%>K1Wg#_PNBB87#FKI`To&RqH(yB^$NKA(@Mr9n)VKfsmN-Z1U#gTzkL- zBCKcXWejTUN-y{}Ip|~_j^G3=?1N8Am=sFOLPlg(w?uNGqQ6Qn`k&O!(1NQ}M%V(Q z1~S^_bLv$EX^ya=Bc}{26pBj}RxOxS&GmlTX%FvFtPh;l3!G`9Ji`<3`sQ*U`yH^D zG)+;>@jF%e_fO(~@sTf0Q^LzkpKo{@i5T0g?3%dOOIkj>);u!^V57|1R~mr%SDJcp zM4lX73A3+2xOkwg6Ky%7u%s_2>fkK`MGJXh{+s7w3k8L8AC?&A4T_r@HCEtg*_G6- zWP1|Nlv{y@dq8T$A)K`b;aMH1*LO1@f$~beja#7g4Cm0d0%t$onFwZ3()udo;U@jg zg6GA_#tg1$(~gv|=$$*}89p(Q7!)s2q8nsObS0*%6Z$44XBztCr4%#gh~lR8wUneq z^!~>;*zo#P)IsJAWw>aYk6w!7ImsIV-ct8^<^02ft}?(q{UUeg;<^EbYB2BRR@XMp z`!)|Cg27q^C#P~oi3dqwgA2m__QSSoT61y&=tfQ zZ4Z6hlk@V6&Uj%s>1F?&)h@Isr6&{CTmst7u&UY~wFXXZMkQvUa4Mu0{G}17QmHoBrP4x^Gf^bQ*{} zWaR+=BNS$rpSAn6^v>Qja~<>2pXc$cfUu;%w92b{GwQeZvoMz4;?YPHaDxZ`Ymr%mY>DSq8c))yW}p60ZJByHBr%9bj+hPK z0=(t{E{iJpv6FA-J0)wAbVGa|eb7SNK7XqOYE?a}XozyTQ?!!S{IFrXqGk8~ET6I} z{sdSAa|p3X_6UxXdCosk`ND#~^4H_}mi1q7Gleh@j|b+=L}x-X-<^>@drh0MYtVlh zdgV*0quYU!dMz4S2RB+!=bZam@lkH(7f+p|@M-K9GNvoSZ4T>YliD==f$o@tk9cJ^ zf^MHMbWWIvMP|KGQJk8TIHHmF1xuC5jn#C5Nxo4(Z!o#mGMsfdZ)!n?cRgO%j`l)jH2I;GtM2~{|6E89jx58 zmiVnxP*Pe_`SI4q9`M~sXThs+*d%&j^1_^HQtT$wXBin2gFn>lesAKq8Q z-^g8XZ){<%BSoz7nHAykRe8VJjc2@NkiKBn?C_Sc;{7~wmR~kGM-k1 zCp`oQcExl>1F?_nEq(#9tIpkAagGQxjlj26y=#yMw|nhBJMoZi*dxWYtng6CUK88C zYCoSzSZCLApVo}GpIQE|Sfv~6>q6ZIOZt3R_LB&xk=&(@y-W&$U%4x(*(h}QtCNQi z50qyQ?ek%gcKy&+n29egDVf`Fe`s+Y6@4_+Yz8Lh9a)-@hTbnJAspWH32@-z+c(&a zXQMM~fcVI-x)HauAE?198iCEyk$MBdjb8|#yjbFV&hGIwn#K6UH3QCP$fP|b{oPC4 z$*!Hl#{7c$P?iQFY9=kz z%3Ur1;4Q!{PTG=+KUse4NM13{onAq02i-RRQ7 zu!MQCDS+`l{Ciz21OfXWc!&xBm}~${!5?q}9Kd+_*REav`TghFbLa2g9qPM&?OIP~ zPj4R{Pkj97N#BK&7});fhcOJO&z-`(bK@>Xpnv-K1;)$Ap!fyr*Z=>>e2ks{{>?{M zXIEGDl)%8K@Q|R4?1k5RdoU)wzXy9pl%Q^BZBPG|dqWQ$tt|zDxlCjG5AQzNIrv`d zy^bOFG5-B#bmQxn@8gBDFhW0u)j!m7@Wze7mgbflckb+KY<}_d)fU-?oV4VVhxgmD ztRCGRI(6<`{f;sWv|q29)bo{kTbLU0{VPyi@896WS zT-YL6mN+ZL#)fmEv1)&x zo?Tcd>ulcg_~E_2L$wXXOAc0VxN!C)hVwsi{DiM(l(a~;JYQ0>YF_g{t9I{ec|H1} zv1(n%?tRLCq(%&rmP3bHE96sLt&JJWs^6G1ljr5AuGsKQ z_u})-E>EAx8G&qhUi7PxCq1p@I|~=CPmO9RSvo6WK|)e~>5|!4;$+pbbu2soMRNtO zZx0O~!TrhMZv3f9hnvc^N9!=+{@A0w#S3OFTC5lyeO0w?URvU`9V-*ott@Uk+FPz@ zUO3fbuzOFKuU&iB!SRK%bGFVfzYS~g{S$_1!9PU-kp24F{i{d?`D?*O< z9;@0IbNu4a3|BMk=>I>z|BILJp5Cu+>XA|G9OU*L&Ee(vETIjrr}=6zG_4%t<+pSb zG2d>e=1xmYsXgs@QTNE}eyb^~->(T0fi5C0b^nv->ZaYu{PN)4@Ihi+t8ky$#~?K% ztnp}_IaQq09>#+A7TTV_yXc-O=VFO6MYF#WHbHqaV*(G%lf-Ek9@+IpW4wj%=$yY% z?Xj%w(~O_n>LFlMLkhK-V)+Be%?)rQv(9>zNE%f!L|(4sutA(_dnP7;X;hQv6)MjD zTmTvD^f4d0aejT;&D|s`i1ldk=-|H6>9))zE0*6oVt8(|t;zbgZzpvyO^Tk1Bxf{% z|4jVz-hac7FWmZ&_^pjAzRK=G>2vZm72m#@c1-!ub@}qd#NSP0#qO|Ko{mhaQ0b&} z_qJ=sD)g$gk(chky^X{^5=fm)VAU5JoWjIEkR;?A<0{*PB%tOBNt`R}1r^8|(6yD5 zJ;kwtm04G}X8pxCl1(H$Cu}?O)K{1tD}{S^#7}W+t>$qbI#mnHft>6RJC;*BTW;xM zvL+9Ts7r|(v#gp)2)dUfC=l{CefKc|%TIO4vlC~0d*=$CF28E6da}vvbjy?&z4XfNHR z#z?yMTXZ7n;8Clk?T!~8*&P6E_8oFdut`ed#h=&Q`Ei|x-mP8;^xek&R_8Oq2j+f_ zBsGM-|CqwRQX8S}zHfF1c=sCu@gC@$@C;+?x8;5>wxuPVJ=#}VB{x`N|>OmXBL6c=KIj4*LSA-5OkhlD2Sej+N*1-aP&OlrzxOdxz_o4jj!BtCoG7o*+;p%k%Q|B&|S7+~>j+-m6&okWkyvxzQ zXv}HkPeaV)=?4~n*|M7PW6_{NlFS7)ir*A=e_zohUc(CLWZ24oE+2^qsLMY02Ds%C2)=;^lqaRK2q-+QqE zRBWSP-zCXWyZ7BSA#KgEPAon~6uH?Gzt2#XwF+56i|AL~=HZqzU&-Mg4~P>7bo?J1 z7A=|jHH$CjhVRLmIsf5;`LSGH#1Y$1EMjQCNp%6@GB+Y|tu#r1kJ{D1zFmIEXuyPx zT3r%|a`F#mEmz{r zXTRwy#k+ZD-AFQ=pBNCiO0=Ch_Uw0rkpSEfRec^*I#a6T(KR_cgb6KnS!egpFp5Cq z9Gw!9$`IA?=YQaNuj~f%A~w{><->!y4^3X+t=|xKUcfzacwTFXV2vTtB7rmG4xq4i zu%FuqxCxy%-{;<0ynF;Oj*rL41kDW74r;iQc2=MZ-ubmnSti$f!f5U39Zqn>o3IP> z;x~TtRjeDE|Aq{-CN^&IIJ3&$}?lP=Mc$ z*>9qJt|9EaCW2?3)T`-`atEcQX3|Y-z}2G9cfSWO26w8e0?r0pq=BQHy`kpa#G{vT zTK!R}O(p^}#i|UCj8=R5Yc36ay|Gx~qFbyzG|L~IjvEhK7S~!Ia#KWHm~qIb@5`?B z9b*XxCJ)3ny+{OF05buK`)O6m6{{$=mD{HsXcqcR9RHWKUK+M!m&n0rkk4XE4e>ya zNysYfMFE>!z?V<03p0+^-6lC*x6ZPC>$wU5ir3O>*GuL)?Q{Ob&(q@(69{iJ3}X@( zK)5=}=acPg_8ZL=!CR+5!m>Fh5t#B-W!a#`Tbq4o@#90(lumcTuwtK!{`47VqZM6d zyPv$C8{P437i=_TH|O7yu-%`XuXEEh5{H)Li_8Lu^yIq4S+`p9)i$~Be<8p+Z^V06 zK^F}Z)#3xlzHSN8iTIXsNKeuQE{3;HpEv~vHCZSP(DOR zS1N&9Ev%$*NBs#~(l`YR&2M!9x!&q;C9pLX#OTEJ@$>7-6yb^mS?(y)Alp zmTZz$$13-Ye$*4_L<7GW5;o-rpvK-DIg7k!;g{wIP-LEjz!{4SzB=sEB6Sg5Arrzc zsGhvJ#V6Z{N{w3V86oU0Gb?3YH}e&(daBV}=G=cTFMmrzxcG&SSItW(U+?tv)LkkUncU&;-JV(Y*yJFKR0m9tD#=Ye+5D4mcmhX1B!3@~toV@Z=)$1yTxnd;6y9 zWr@Eg>K5}PS#sWkG)`~%qUk@*21?)~y_=rT^LxA3;F%L%h1Y+NN8dd?lYJ}^bP%C5 z6|op0F9D=CM3N<-`vBm>+ax@LL-by0uI>&^)XCCSje};Mi|kicuiIZt$m2n|8tBL( zQY;BXYNXCe$c9C>)@D>FCwP_*nqonsFrH;7BKX4Hy`&|lDjs;Iggk>&p9%+R7_^5 zD9cgeB^~XhhBP1|2dOsOs8@WLi!T5qdo@%kf|qM8R-mDW$JYOv$U)XcAedINLtvDH zBDdZw!;LX`LVS^iP^g9vsE9TQ&GJCLwX38ykd&e~lP9iPR-Dv)!Wt6$eQ`xr3_CtE zDcz{07>i3Up~MyqeNe|-pdxNk(oZ9_HVt%@3|k3lr_@lR*lR04T=Yst^(m`qGhM32 z7x2heH3XU(=4(kEO6Y_+&Y44R1N6n>4Ix4ZV?{-c%748z@l*R==CiLZ!d#V34PzOs zVGyk*IIbEucGZy(RQea zZYrqYAt6Hqm#UZ05~}=)k;*(nj{&5(3@KVi@U5pL3n_<1l=Dh@2SU3nrtH+Mi4R;q zMT3uyMm$Sly0{wd0!`5kK-kb)24TT_cmxg<>U4ufn}oF|GE~HTVOTO}EEpm!bqs9*hyxt!5I;dDLVjt)Ioz zi4PR~q{x-@!Gn+tX>%>c|IR}E3)?1XWRv=QpH7_JM>CY0b}%SvMyy54LI82agc*9W zhn~ErkaA8>6H*O!@>+oqUabQpbps7jF?{xuAE^jk7#&^p$sSt9f-h-lR7=V!RZ|9! zki;UFsTg|!V`Ulr0=BM^HvaP~dg@K5l}vTf(KzC4S>a%nZ^ z_FWC2dML?qA?4%Zdf|J@M-{!Ue(!2PP-yF^(Eejq?fWU<XxGnB-HBUz+I11FK#$Hz zg+ovh10~N~io}EzR_pN`UIKPxicAO1UMbJ2LY*-hj-O>(9Wy14X`n9A0NU)rKFeNNL|V<`S2PW77i%QC)oh| z*zW4Qt0go;j2%ls4NsumfM@t>4)Mdlo*E@>XHd`3gs5jna%+el4PlWus@CR>2%ml` zjDBj)W0j!DqO*|bz=2YKwg39nE4-lTE`+;Tr==oNq+acCRxJ)WZ`)3e7RmbCGi{W( zA{EinMtnROAJ17t4Zj+nbrp|Zq%_?iXUTJv@<=v<+VtD$@ws|(pORdrC!f`x@HH0rd$DDc-BSK8P8sl8gIxC+E1YX0_3zZ;zy zpg~~>+qXD~R>)O5?`oJ+ms0jjsA+*g8-S8HhqZkrZ{Y9Zf!4IZuR|0U(auV6By-Dc zR}H-X!cb-iK3oNLAsa|nhtT(zt;J;jV8{kx7|nu$)Py%z7DlRioVD;&pQ~#t5c?bV zX_cT8_y-N)cep@~h@nO01I*pv3E%@l%Hz;WeIkn4LlP6A>^ zJ$pnw1rq>HFkfqBzE-HICyn)dv>A%}jZ`nUcq)H*^f6}D>2pPJKhmG?Or}oOX_C@O zm9-GA31X_CRo9yD9i-R*VzQ7i2%r*eX4m0-XE9_k709Bm_WWsNHI6v%26!#J=~Q;U z4mhhGuj1jVRd+l#;aY^mfBujk-K0H!`qV~CveBcK%9oZL(rN_8YxWXGs?!fW`*0IE zxY2^$K{6I$y68|64{tE4K6v3d;NY2BioNO)(7;SJgtOBS+MqW2pkiUPEaGx~2($8eM^xrwki6W!5{?l^Ti)5hs3E5#Nr7tp_X@P#lxot zPe}=ZFDf#YIOuw6Y*Z0m?LT3B0?O!mc*<4WXHWorV}KtYHUDKmZEK-lN1#gu*zMvr z@h_niffuOv1W-sF;;uH$Hcw2cWkP1pHrjqVf{}v1t^xef5$cG|R4Oh`xa5N=oT-G` z5jfaIoW_DIR4<-$K*fg_J29O{M7h8rZbFz(5$5s_ARoZPe_>OAr+~}2%3BeCIddgO z%Q3Z2*Pfxi9gc#GCl6cypphE5Rfu;_sqUqR@Z+Sfnmr}yh2gCt_Iid3d2rju#s z5!xj?++y|1*^7u#0mun^fo4V~qR00W@VE)|;;%)>x@YoPZEx*W3*X&aSkwoN{Y?&4 z6YpLml2`;FBDbMbv6}EyL){~y-4It4a7dOYX=57Xf_~b_8E7nf_Oa+y++DB;HL6mP zV{e_(2J7d<;^F-Fl)bQvkd&#vma&ZPA|hq7&ZMW)UWsI;fW+sK_v$JCnEokKgY`LWBb9765AWlp}gdhblkk*P7L8 zoNC8sxZ^VyD)Iz~H=yHr{B4xUc(N0Vr({t;wNY#=U_l1#v@o$wQ5vo=x3)#aI?+pG z-=!jeb`T#xwA}1Z?5ZwF!-^%;t=&GP-feVCuF8ISzFb@+(cOgt-K4fWs)O_@<@|G^1O zm)0z#BXkuTh9ii;F*;13u5!Lkf>g5gW=hvXJV+jSMB6&hVB@{#S(iJUe*fir$FEZTmk z;oPAMhliH_JBxc3<{23`D_XYjQ`j_#y+Y@G*vmy@P;YgeS{=9uV@?+IFXd0=! zxzxa>1>J6%SAV5DT{+KXr%{;a3s}Vi4k)h0UF26x)`s;V097%({lz>v{(q?aM8>?A z5IV^vn8#$JYDhY1q(D}m^Hc4d1j0P+OZ@MMHL{f{OWs+VIEhsX|3pZ#eNtU^w#l}c zZrwEgm9M!n2okIx6vaI1&7gXEyFVKN%b*3Xg= zGgk`&1cJ_&+eEobB~r7WqYLVM;v`Y^6VrC`b4!!%w87}%(tZ_WGB=e%NN14)YTQ5S zPM(D4wUZR@GcoFanIivfb>%uO%X7~k4FQ8T+reU8&P?F7-m;j$zw<;8ZL z%h3WP>!WN9`S+5bmU<_QXQ!NL6y1_TU*FNHFdC(<-DVr67A-7ID$p#1;Q|LICLk}A z(giI(y-Kow`%65FS3CALZVG5V)Wzt{WRrD;VARCdUj#}P=y+8c$}+T-W_;KH zl!&`d^@_+=3h4w+=feJtnPc7hE%vhKZgKj`qC|^fv%37^yN!oU_vpZC=@}d|7Z_|M zYsgWrl=ZJythXKn_%OtTgy$tECv1&e2rz6W08)0iJ(aI;bb4W=7G4R+HazOiQc(|r zy#c%Zl>vuGfT2g2+sqEg`s8+sKy!r{#!^tx1F-cl&&FRY@f!UER|)Q3B*QgDmIx|a z00Yj;W5g@(Bx~X8MBf<%ux!PG2v)ZVA*;$k_ZBY`Kvw>$j!VKO^H-w~DC7WZix(z$ z>Y}_-2g|FE(4+a#HZxdM0<$EnfS0k1RFM>^XrVC4*UT!^y$2`zK#*Eu#+!Iq?CS)B zHk=)$kjJtuqXYcF=F znD~>mNr>fu#NT(0G9qtd6-rp9i?;ZuH^;@Bi@1-M!KPxAIO*yclh`KM$~f26y|o+a zH>2K|s@W8+V}t_>BOl)0V#oxWJ#hB zr0iF*DoY$OT`)(+Sd(R((TSPFe_p&2bq(JLx(L&;=?4vCW*6=5a~hL4`O8>~gyG1^ z{Fuy>4pt@o5QfuqLWWGJ2G}(UP1*Nk@d#xWQbt?{q^gc6_dB5gpQ(LB#gZR2ZN1KG zx~MU~Us&E2mIQGlw&ot5=rQUPM(=paB2Qz=BfUgYa7!dDiW9-@iXH;%JT;O&dbBK+ zKb-l=Vxl5-S1Iz zfyAUn-RpEHVe8D%7nUhc2?5J0>8oG8wA`sWx&z_2KYKbGxuWtlzLwzX8Ly({>vx!& zbev)2@#F=bn)(9{^LsiruvV0O*>y|k!B_@cuR0RB$9vcu-`iwtDR55xJ5=nHcbYoh zk>c9lln2IR@DuIMi`?T9Dr|;dFqVQIadW0aWDW{W*SVnB)EwrO<>Y$d29AB&Dt3$k!HM7F7JZ(Nc!Y0Kt+Lwq`KO9J;R z?DCrMV<%;{Q&>_bwv`T~gfTy>rs9!i!zDVNZ-EZa<@hDBRM4RkOR(kNYGNwNv-wJe zG1KprxS)nerSe8)e-~v7JHxp=ff5#*U2+X*yoY#O7uCIFOf~4Evk?za&-?C@HxXXr zi9BQH{di<;5ylEsm!Do1!WHOG^FMv~@7TV#O>V=yhsk_NRE6YIQJ99nRznU$yQW)z z=p*q4OMQyM{uJi{%|nioIJt?=72PsB-CK(2BnX@m#@IC*p8tsM#|8BmbyW$1@?f*a zP+btXc^;?8V~CcAq}G|#)h&r)iVLhv5m_2;4Favc<~z#t!o!sn;~<(K{&g$y+wkpKx&;k_`d zmw8b;P!!T0=LEI8w zb<->?%X_%q3ONOI=n{&ZezC+Rq4}Wj6uuMk1mz|O)wNTatd_@f8e=*Mxx>Zt^>QDz zoJWQzB4AWt?X8;j>CQze2l|#J%~wb>>%jav)L0?q^1%D^sL80*WOT12h0vO(a=cI; zIJ^5u9;T|$jMeZ8oiz8P+&>Ry53{`@fX$Qbf4LHqVVu<{E}l)C*C}^Y0*bQStpI1= zF9}e&LItS7mXZYk_0!1S)X6;SY-e=S=SmpK{iu-uXV6jRl82hi45w^ zxG9nd&=s#GW_A{5Jno&~jmvp?kg3Y}6AXSN$Pw+-P1$=%+T)p{1b^*Oia=s72GeI^ zFfEzMsDYUf-->#F74LAkQJ&=#bvO^TYmGp4)8Yy&il^&vzC66IsN_MH3>iZ)W^Lmk!!3D|#qYM$ z6|!d=ATmoZXEizUq{2!mGf_y~+0gU?e8yt}1{O+D3t}vAK!>09!m*AHMHX~#N{saI zE1`({D2f4XY&BQ6%kcOWnhIx5ChYE|iXTUR9UTy4hkwm05$X2LDv%MdF3J{y7XnYj zaWK22EOFHCuXe|8i^MyNMg}{U{f>h^C|*_NOJG`8gnI^y6Y|tqQ>gOkWa9A-pwPT6Qb(!vM&SeqmqBG zdrw1~lKZiYoYX@vaZZuC_T$1>#dH>I)@iY^9Y^Vx_>5nPCd-HgmvJVr4I*__$v>K) zn4RC2MfA`EE*na!!%;bKQddQJPa{r@+O}1huZ{=c?8MEDiyz-FvjNDHuR?e1Y}aTh97#9=qB+FdyTS5ZAX3-DO(|xeyDv&+CX1xP zI&TLXh4Jze^-Z%(|ErA~mj5{}3meu%6ck5T6g#sB-a^^zHhijHwv|ug>_+YH702Wi zM~mf7#nYuKY@Gsq8@RPV4;FHZJx;+k!-=APiO~=H{+FgKv1K9zF*y=tfrO-tztxFL zra*5Lwn5|8kO-Zuc3)jkGW8E3pVj4q;+{mz@$PNe^qvr`Jw8V?&A(I2=1P8SI9FGJ zTQ+psV9v3rx}^9`J8*Z(6FyNV0)+{sqvgT8d$Y741mMC7duVbo7+|rDM*|mOgvUCoq1i#z9^ZDNa-iB`3lbzdok5BgbNt3635KaTzG|@ z3!i<>@`D1@&7#a!m}IVUHFbjM{nFWFS20^VAH`I9ruQfu(ss^x6xjfwdHZB@*g$V2 z*PS2Qyj3>Mvg!OC1H<=HHxVi%-!sbH9#GdwIG$44egGL-XeDJ8}NAFv3zg zXEZs*rp{^{oNG-pYyiQmrk$@GFT8M^o-LUI(vKS3l#=II3|Ev-P4E3w?qmU)hK6Mj zIOZ!Ck)iN5V%YGYF6o?!)&QtvQ-!$s&iE|P-CJsa8#Z!A%B@*MQw}=0U%LA^6bed$ z5XjNOaL*D`$~eVogM^Bjl2kZcg{DLRD8qoH#TRD7L+wL_kb8f>;W8vp133&oyNWZbZy^SiymA>+E9j(nOzU;IdL?{yJ z<06lnQo}J2%f`K3A|VNC;Lt-+Uo((?M^i~^G1Bld8nDHvo9e(J1xgk}<`z(^7_w7f z`(QL(NLs5S+H1DbEu@Kc+2F(r$?$OohY;7cgWcJ#^OL+hT>QIXAPz=twdjveLnYE# zpD7?#wV+fC11#1&E@LRI;rio;W*TCUXrIO@gTp+O@|haD*qi+-F!GT1rK8G!L98(=z1x8c%OUTfNvI5 zKCsa64*YXYLdz})6H43H$>t^wCR?EfZL-ikD&kbgUy0Rt5W_8sm#|(L_~DsqiosUt zk~&gqKmKk$hJ{OSKfNT@0#x6+6|*ic+ae2SA`v6HBY==(jN8X!ZZ+_@?_mXl| z60+X0N|xl;k5@?`m8(fz@oxq&QiF7}FmnVZaEV?(9$O%{_&pag)uWLG89#Rd zTQx)x<7jGIY-j|-plxzZ(wjzlUFH1xc-R683WKsJsHH$^D3(l~hs(|@9oj5+tiwK* z(*BC#L<^}APi8;{RzNz33~g>*h)*dFra%m`gsmqeJcssmCK*-@T)YE+B_&tZ`==3(!la1q|)kzwsIB5Vhh|VDs=do=k*Ots2mHFw> zz!N}#pfmR$2;j*B`d8wHzXeRk*>V=SA<%krY$q!T*DaacCYxH0BkAv(#P2r&QoJ%% zbJ+I>m5{}Uvl<|r&zGS~(izG%2?${#MiHCDCK%UA;WlWwKOrPLIAJ|F*XNb@MH=U8 z%$Y53^Pv1K!}%Ya@BAb`P`6}~_u<1{M) zdmOeJ2G926B1Pw${Kj1Am%Oz6$M;dXaN40Q|4}Rq;`_$B)>6}-|5rDot=?6UIf+cu z{D?tu*(A_sDW6EFbc@Ib+Lc=vIyt7rB_h(Ni$eZz62>^_2>NV-7q zC6bE^D0Tg1Cf5G`ca{nw~jN;eybh+%32PlZBv&cH+4l;2 zCspCUSdfZ~9JXYZX}bxYcbq==Q;DIdV3{JPtH&pft&BW1|@!en!jy1Hzfa}e0dGDleIwET%a z%5cGNINLcn2cymdr$mbVmXt1s?7#vZ-De+nq>Bpr$tWDG@ZdYn6raAz-fQY6$qR{Q z!Q>Pt4G#MH4B1sJQ0RIstMwX!b9$)5HRlD#zvQyQ`t=ehY6C|`a1gQ}tedN;i)a;u zY6vdF`TXdj6-Wr9POBF?xAkh zI?a%0ongduj+9Vav6u&awoNLB39oHJ1fM^uD6@x_Yd#KjIWRxUEc+DLQkg}QTL#Opj`}xmmhQi4{sjhgo>rbbk8u#c~s?CfVhKAN=;S z7$ZPUB1g!KC!&0KV1_E4F<<=q8 z_9M#7<%OHe$K}RWs|iaC5udAijYHl^ysHI|WQ0eV!iQvQHYDX&b$LugW0-v{pt=L} z1?Da5ISf@}uoVw4s5v$?d-ahvx#aES3c{%U+U2Z1qn%nJRR};#9?$Lzd)mTRfVre?#?%-5?YSoQ$(F-_d1W6k?*aD=ifI=ZW>vuLv z&}%423hYDIl0g9zgdq|t#y%pEA$qP3*laf3zDWDh>NGEMvJjF6VcYQ#y(w9*ku2@4 z{%7Y`U=*syi0wE-1!!HA`9U5v&Z7jUNII(yC0Ub4YU1t)>6p}zWYbRFv;)6r6c9x1(0K=R)gHQbKa>0t#koziA$i{jUQ36RY@5! zg+(E%G#%TIJe<0=DxM}>$Jx0$f9qM{0_}SzTC~LK$yjTcS~{^^ zqykp%!q=YqCPGnNk6E|jwiOx)Zj<2Xj7KaAb*Kq*4TG37yscRU-BkB+J9p@0NL;nm(VMdeqG}3RtAz%;^Yk zF~`A}PoBZl>KH38^jN>N=&_&%m1O0p3;-H#KRW>qS6H`7C)7QNmsY@RgNioLH5c#m zJn4udEtu8YxYj|=Ys;cP{q*>K8cMLa010BJCNA`Uxkx#&0XPji$EAy9E@!i-Cb}M{ zX&utsL+^GPXzb0ThN8|Y7VLN7IkZB98mwt%E=#}wQ{X_x(q{tALH4+Q8$mP|+ zMp%3pKh~ zB3G2}|CLYY@wn9*C%n{iIBe1|Y)4O~fN*z{M0yL~5Y^nH^FRgfyA4V`+{Lizd8vfh z7k3(blpFX**x|$KooWyrAfOP_AKn!(VOrRA$Ky}E@gYjXL5-!226qFc+H@P81cYjc zxx3rjAFc{5jw?dxcpRbA6daEF$G*!*DW%`g-1h96Bm_~tw~!}IIAz2S3O^*BPcV`E zZUwZVN54L4LN5Lvy6!w4%KiNx`1`(RU)}bd8OBZx*`w|mOQVobRH`8fsfJV(oqNV! zmLZj-8bXpf+NI^pAR!ecX&)s=%jrz((Q=OO{rUg*``;fPkJ+#5bv#H0ms_?7+*<^ei72xgrSS|MtCghlC@>2HLuyy=a=Npyt5S%_ zyTXZrAd-+X4Z2()fC;D~)Ii+(g8v{&TB!S9F;b^W^Vm!51BY-*JYptV*H3`t$PSl) z?DVHP5}ENRGUsyeZ_6=hdB*s;ZWY>nh3s<_n~KIomH81l&;rhR4uTmld-eFgfh%d6;oRYxtdi!H&!M$nS-ms zj#8OZb%0$o#+|@cwy3lR$DHZ{Jki?lp)Mz$a8{hm?icKAPjGC6EO;t63xIE_2yGB~ z?3r;X>>!s_k|6M&6Xz?_ah6jt0eej7Tzt&*SDAdO=Y{w9(MJF|zi-wvbj}6o6spn% zz%m*bO-P|Zxil!+Gy^8dWh6h0(t>S}&!BtV?^D`)EvQ1%xYg8rusS`Inw(Gb1`g*5 zu7|sfjD+M4-MK+aG(A`$Z5cgOP&~dSCx-ys8Kq|qTf{+J4dmbq+xfG}OiT812sBv< zT^U|-RRRZolD};I8!3Al;${hvFOX4-)TD3BDY0uTgs}5^m%Cq=yNCe%gtOF!2BA%q3M{Z(1s#ri-kvLV+V!`S_ z7blhwC9-uwlpU>PoL8FmmEE}j0z;~cA7h&Wb!n2xQY)$6V|?l&Bo(7naSu6@h!evL zYA`Em7d$cZjF(?xpVej7e*fnUOv9naOVQ2$+48oTOX%x!+E>{|!w$vhn{3Q93pGfT z>c>hG#CFV&N{asrtqW8#N4P#r$aMxTnPM+QXju$f_t}Bz6XC@|Hq(*YHVU_?!e*(% zPOAv+U3?5UQezrrN;hXhV=vtNLttQpc9wQkWI1--(C#X071QzB3XBm5pkkDPD)FLD zl2XNx$e2@d=6L}_(xp?32GUfZy1X>Qmi@YtDaN}ql$OZ?>X?e$$DVrw`kpOdAbDu0 zOp+MDN#Nb&ij@-WF>Ow(L-V6e z_^5@M=Mw#Pb9}0^BCmg!*ga8dI<>a2Q|2Tw8|-xklBY~>_OXR3%lCn#G!>&5O}e8r zRy&gL4lgPMM9N*PF~XqznOw}Nc*@cbB00a)Opo6&!E@|KWLKdH;?EUyF6-i0S_o%#-0ttK#>jpK6Ey@SKqHod+<-|X{AHH)X(gL zli#|o-CeV@WHxbdV}a_Tci|>?j>Gwt8DAl`Xr>S+w}WyF)dNZ1UsP^6;y$;SHy>nn zr4=;^stS$ux?bnOJ8gG8)dKGERr4&UU*2m$8%?jOhTb02bH~C(QEvi!D0M2GK~rKx zHFr!(sFpowRytx))brq68~zq8wQm=CH3}XWt9BA#9&)qbVZ5Ei8E5_AbHum>ct!L za&MJYUooW^U0@7Twv@FMqLI7N%ULl-ziO1bg`6q)C3nh5Pw1%^inP=0K)>Gmw`M6* z1^2LIVhABtNsm*lbCyxB3Qk_1!OTKc5IQ&ztcN|){uH_C4FJ(~(C;rD^+cigmZUyS zKtfRpuaPu{gP(bfpTO)_Ps)+zub#tofzD@1Djw0QBSMx$a#U3G?GDCBy}=#nl=RJtxQun=BB3ems!pT?>UaO-4RV%5o1 zymtUTR9eU~6B3ZWYp3#=VY>4Vt8NLU=|mUeh>GYA1?A2`5^-f0HOjoBjY%UjQ3^mQ zIE;hee-n$99NkZT56_s-@D^t+JGkEg4|{L>u~~J73_5V)%I%xzquZZD1ck%41Unle z>H0InHZg9(uuP%9Wo?U+Zl`E^>DbZ&sa6bN)gXH07bK!;SfZube1EBoI=dPh|S zyOp`$G&*>k-Rz95SYVeaO>zRK17f_SpJ2JqJyoYxd>gU>p1t%zVp#*5GbDy+>P}ZsVjJzAmuHd16F_ zZ~Vp4JC7OYxv<(FZU2rUbwVxzFPX2><4krL1?li0tV6{`J-{H^B%0$B=V1q=!ze^d zmJ$JGn=G*FlOl-%nu|=wOyF7iX$8e#ah-15G02YqNF&&)1>3k!KHIF6uK((~ehKef zgpkmuVzdNl#{tgEOQ_E`bip>WCtopw(j0N)?p0k)_7r-A2CmJh7=CW5Nev8f67$4m@4-kxcLS}h(c~@ z7rhv@zpvCoA;cYRNn89IQ)!%dY5VUbq_z;9G0Z6xPtF7ayn$szo0YTG{5<;FJv7o> zm2i5_;+CzXmJ7Z&FW}=U+WXm3r=Zk1!Zll%ugG# zylL$zzp3POqmIQdKPTIa2ntkjj?ymG!9|uM`>#@MBD$U|?+ky65|!AqZ=2y9WNdk6 zkeyz+;+u8UC%V0q=&ZsE6D?6-8G$m?m{$8bgsS47gosM*gnOtKg|)7JfFiDDg{14m zqB?PNqRasVq-Nf_7Z(Z5i)TR2i`({Q_y_FQ6@U7yi~(`ywooKn?Lwo2SUl9E;Wi$H6iBCWs%n8{4h!KONaPKVSfvEINPs}I{w__drcct|%ELT+9` zN{NWZsxi0P|SDBR`VKEALRV{FJF+ZvhqgtF_dA1{c*K8VY-gN!+}CH@!!p6 z-Jn+&pZ|f|z|Z5c`=IqsgFBQPi_3lcyqE)@JB|H7+q?Xt0nbx;-pq9>LXBYHbN=GT zSD_(bJN2vB6fq>-$=0q zAm7@e^sJt9A7Q+L$fp8Ha-MXLskV-sqlPfu1x}}pV%11vH;F9TVU_~0n^jIx&2bvH z*9)tH?JGl2jB?O)ZanB1?+RKBXvLrS2{$l(2H7lI0vD7S0|QW;t~WVTyq8=M{#_A4 zE@E4XM>02q}=b(Wii7ZGe zb#gL$+4qt1nOLOjzG2?n@wNb}IVTMu)`_XO1(w(IS{u`URLb;jN$6u*7w!0Bd#P-6$3TLgsoW^{{uRK7pKsc&b zP({I9yI>6ZLe|pa9awZmkq2}26s4^Hsp}qX3E#LDkhsZic7teiuPqpCqSUk@y{h)h6y6bC%^q7#>nAm zYB`UMHr(JPBhYRGo{|A*&9TDMz6(|eDCW*TUxnP+AE)DP-&A*&4O)})es?r$D7Jr4 zO#i${Zogc*cz~&iFPiabR13A_M$*}hGSsn;@MHzxFp9s*9eHz{uYW#vpysE&L$JM% z7BDi=A2=Qm5?(e$+*J%(7Q`20`6d>e_!j4Hi&AY!&Mi?zUeA^F1qQGRVps+y2NEsm z4m}ido|22K<7`FVr4;N!@iL3zAmX5HM|< z=k1)%N=d9$;g0!Wb!6oX0YK zA0vy^ZdRC5qkcUM)D4j=BQ(D*68orVk!l0IOth-pp2IAUl~w(k^s=pg7gDe&k}?$0 z#Jak{ij$4Yt#bTUUFrW%YYegcrU?zVcJLAA&^CYtGmG62qQK+`;u<^+fQ`2-ZG?!q zG{SW4lVghp#d50^T(6M&{JtGBIFPU8&KIZ*-hHW2Jmp;8r-AB# z!7&THDlF+A;q$Au3xItDfWwku$~`6Y(VWY4!Uvm^0FR)c%w<`zv_Qq7f(z*CpiEJA z@TWqv2*ozGG%r(6Q#CDz=*W<)Ax;D6IREYZvt+Self6N6FRA}Y2r;SNEk9pTMqBqv zPt3=3=BYuHxAGcCP|~+_cM`87fEBFRotZOY(P{))+h8RSr3;)V`oxIGl;J0@m%HU{WN`zQ^8rT}WZ4Wsfr0~1$p zBLC&Qsw*_eUK@mpg+w4G*eKfb^rz$5lmUopu!M@>XAUMUC`A}iU|-K=yJr2a2K-y> z_sJ^mc;xluWy|~tn36ns4{E<GBJwf}(f-4G4+J0) z1&+?f&p+(ne&zLFv$k`^)BvDFG%lNed${xYhYx1gUfd4e{s%fQAO!FRu@ZMD3eZy$ z4l?-^OJzJGjT+zy)Px0Nm~Jwfm*nRE=3GAJQM4s!qr(E9K1khmHM0*I-5|Y6R9;F_ z2*|ZGyg!gjbhU?wIpVzJNL%JgNuR#wMQrLl(7mT3hz7ALA8NhtJU})Tb>V{(E7ryc zh`1Z;I)twu64m!+&mX#+qcZ(4la}`V>B@4jcDXX4G#Ybsn@md;LTql|N-h8eq= z#LKU_8>%TSbBS6=9|5#l1irZ%_%6;1P%^|sdLkfF71*I-S)Iv+#d;HDy|Sf_7+rwI^lQxyPi>(a)+Ce@>~h| z2`R)dXa>e}^5S<)l&MjW0@Kdy4_NQViP|x^=Q$B1b9mo4JiHUCeKP|e<=XSKrp2i_ z!G-n;)_DLOq3#qtNa`JsJxIDOxgWOn`Xh6u)RFxJ)Bp@Zoxqw55VpjGE$XRQ*6XzHnM<4{ly$Ldrw*@X4}i*{YrAC z0$PSI762(vt2mRxP;zX#05MZcngo=y>K+p*Z%oYorQr3Rgletkm0D*rU(fr{9f8T9 zX3mFuYSu3fHM3GL!DbmyYMC{p)b?)3RA@J&Xm!ouos#0JshR@c>I(up}IGcX}Ej7TS^D9L%c#=bj;8JRiY5hQ3_6NA>0Vz|w zZkcU%;mezHJIE7!IHKN}qfG&TlHi5_4w7&~>z7(@)XuhE4SK0db`0JGs4_Ite$HF= zk#rMX{1QW%;2az~2H2B;y^TZUC`fJ!B2#J^!U0K2eMdE%z`1WGoCy2?3l%fffeXK3 zf5ci_eqA!6j`Y~{ffPATs{^C*6SNt%`cICU^io0VORD+=*b>fW?61Z2cq30|w`Cma z3TL;Kn4KgA-U~iFrZSkQVeZG21RdLWH`{cj;R`X-9)+V7129Gm z|HLCPYmTJXI41Zf9e;~&klZ(k9M#;T_-{Zp$y)*Q07z9*MHsp71~>GTgh_cV6z07Z ze|oPCJqws+{<66Ca+WVBTgTndATUle1eOK7XdU&zkqUo@L&g!jAuaF^L23QW7$iwval-_KW+HbHa@Ua2>{UehJld^_xMugPbTGJVw>uA!+q< z2@aam04;1su_;zUW^l?E8h$*%1yrh-{FK z(nC4VNltJNPC4(r=N!zz$cnq4e@xLvK7~XFxM&?`{nA83!=CE1F3H$~6&}2KvuBf0 z7*miq3g*kVqY^Zx0*krwCzToa3M(UpBrLj|=`(#l*5`GSC}I8eX!3zPR`6c;kf`vb zQQ>QE2zpUk>Nba(avyTzI_vJS@*8j+N?|u9o)XY<6tui%(wBYSt^^Q#41fIeO%lk7 zwg69|3Oqd8QuCVgE%tm_^!$^BrIPBm_%n|~7-b>ZIzbv)!pzEU!n6pMh?&y>=5Qz( z>OVKR7#66hQwzQ=^!#RJzsOG4W?qO}%?J9+3rVvd&Rgt|`Y*@B#ocz%7Q=L8K!0a01{<_}c+hQL)_;+q|E*aCN`0PjTL|(=MOa zWx!|lHZLB@NwO{jl$i0$z0EcEFDI^I7X^l+a=cSLSqkF zXIQqZyQ{V3a}@b|ezIzvUc)wF)aNZB+_=2absN5Aex!r5g-dr8tZ4NNj*ki6+aH02zNBaWan8wDV{vmcJ()AR%?o_< z#4~KEpHNmI5@Ui&Jv}M4>TM26E#dxMY$ETT7h#MlGHidh(!D5AKA#dx+jRqN7~PoQ&Py<4-Gg}(sk9yE*Us4|^Qa*I=#||eiRL6P zWD7QWES_sFB&gkHuRi{{W%lOWyE~c=kOw)N*L-c>#NK?t3z=3Fo+{LOj*%a9!=tgR z0r579VT@oI&4e2lILc*DBvyE@FW>g}uRwjQYz@(S>js0s#*UPPCgk~?P}l7!wF6se zDAhFrvZP?IjdO-x(wY^K=M172iAH#8tr`t`iHD zi#~P15sd|_zAinGSvS^A<#TNv^0f-(S`vld=7ssUfG|N%;?W3a0C}1{NtsazZB`$+Od4ingek1(t~J&sITeZFiJdv z#la8ts+WHzW71VLUPEAc&;#yUOl10PQO<@Ro?AWYP6CQDr#E}n&E-Mg`{2YXssoYo zl-QAsX(ePbkC2(kdJ;;^!A*a0{`ILgj!Cqp9{4AGOa9W>mERXFlGETj#t+OV*EFztcJ|hsI_a4#z9+cXu*T^t?Z@vT zTeX$~WmFU4T1W-3s0Vql%+S4#x3JJFq#YwZCY-s}^V#T01?zI%x&-t_aD7T7Nl^SG<;{9)<>N)Mk52xv zBbGKD6C0FD5Cp$Q*UY>IJ!=fVxvgZa#_%`T&SA0pK+R^~Z=JWpu5A7QomZPfijZ2K zyZdxh%&a+gpDe2S$3mA=Xuf;ng`Fdkp}M&xtlH*RzNe=o@E=)9xRy-M;g~jj8whw= zB<<^$YBR9H)C+))DYR{$avy6>9_VHc7k^Onfw2gWG|tde;ihIK7v4x8C_;eZZV*Vu zcYx$)cTVga`nYsfyL!m(ZRZ!f6BUDb+*{CtU)(=x{&?l9hsO>-{v+}6N%JS?Rz3OL^ze88(M#q}yH`EEx$5Dy z+_8T1XT$y+@c&a}2YyWd=)7{Z=hgtO#di1f;GFEO;d`%MzQPsRngcaB7>kRt{X=(F zidVgve0T5meQyu1r%ztS#V3v2>cw4IQIH6SWVdhMj+3+R-hO=h<~{Dm;?k@c*TJ0Y zW@}?N*x!wNvzO1c;C;O4B=encB1jbzC8sv18c!C&XwiicI(8e zw*xnB;hb!UXqm0OM^8uV__K+cy}NPi6{l$PcW%3Ixif6Za-3s5f9hPIuMf`2wl>z{ z#_X-ZVVtYAHZz_t@JN$vdNpu4FELbVPw&6r4y~aM6K5`Lt;}5bvv6(eb`<}KYDUm*n1sn3y z5~KX=cdQj1C{?uNNCeJSJ&h$*o7TR2Gg-AMW@Ut5=9;Le=ydhflSvD``_3L(mr|G+ zGgsYz>d&dkV=ax{M{++u?PIaIJJxA0ft?|zkCp$e`Ro6o$dXyq z;81mY!;L*`2Tu(i!n~1Z;kqI;0;@PKvkPjC>p$D1gh^C3UwyXuwiJ&xbHv1YDe%%V zX_rt0L&rp>Y$JulA?l#}ax$nrKOQY}r&Nas0a%|7RvSeLjQ3qIMp^ol$8{&DYP zr>}M{<35wxWMt?wJkug6?13XB`Nh-Y-SD_=bBf|j-<4vTkc^<4W3LncW%snnvAhCo zZG`tq@3U`kKG1LLubQ_h(!FI9gObbQjZf;9?kbP3*OA?u72lO}`{Jp$$4T#*Xk|m- zqK7?bN=y(vv_;_SB!_>&z1#TCPj^ zH|b?b3bc%t9eg>R0~}U~;!?d&c_DgpZWL9PzuAXkg~riV6LMj1LT&`$u-bfLa}>qvtJ9De@yxlD^*g%E^?~7GIX-&6)Nd4~qF{f3(mb@vQQ=qR`Q? z<;eaYCypx`Ti>>x+&$iE#IK%#@=hv>>sxIWAF+)KtuWvTIkSf2smG)FIMAlyQWwD4NnRRF3`blIrJ6Q-pivwT>rLym3TI_%lf%f_u`%p4_4d@&t`m1vDWx~S?b{VFL>~| z^xC&`mqz~G{-S91yzjpsEOq;L+mij)9G;wf{pjaM#?zACqCff+v$Njbx767LVMkhC z=c<>3X=29}*s7TTc^jP>@zRgtNPlCu(TUoC9^WD2$j*s(M0?G-(hyH zf6s*gV(*41^jhWKttYtwGpq4wm$O*vK4Br=G;K^&zRk~f9oAYi2ZLKa`0P10sJ-64 zr%wsU5o!HznmZ7Cbt52i42|^-F&Ep)O&5Mv=*A<8eWmGT^z`V2p_=QtHt&n8HBUDn znjkNv&}Ms&wa}txK~UuD;`FSs6e_LPesoFYQf*^!x_Ck1a+oGfTNC+I6Ex3{wKvt( zdRb?OYC(TnnMi}#?-hz%JEp2x!#qbrw`)hwPwuGx-bi`w-M<|Av+BzE5=Tk`U@glp z9{$J!bgt-r=8YP%U^2}6rF7GO5f!ZtN@)AY%}ydp2_Nclu9RU+EP+z_u^F9Mj?P6I zD<`Tenw!tg5P8WBbxu$y*+6kyQ9MYm&T;4AIGy`YUmhuT5&v zeGp1P_DzL#RY^njG7t6pS-SUAs%_$w238kJF1ktf?6v)DYeE9#!`}lAssN2|6JC_O z8?)k&s6d(Qrr+5Q6esrDU@FoM5b+E_jXZ3MgPbyo4!vyT?Bm!P=kAa~J?Cu`waGTS zedVV-15XTxH2#sAKv}IXK7P2dH2U_yz?}{rKRWj0vQ@I^j*LYIew__5JtA}SDBtI1 zY=2VwNA0Cn1F4s6;|Afx3MAiT)O{_{Fk$7Vy~oS<*;aZurS~O3VP?eCy0BEQHz9R_ zGrh}feBLImjeMdMdU`Wd3pP8#ycC1Q=epM0;cCZnvwpw1d25E>?Rh%%G;BI zgm;fB3I^BATX|a4TjG04b=xPnI4#y^%jllC?R=8dB_JUoZk4{8=8Fl)ZX9xX@pc=d ziK!rJ#8ShvrH=Pq@*t`hJK}dM=@Il~n`71Ce>yK%oiDqiyI-Eq;EZ=0in?^K|6Efv z#x3^bYE}$79V`gm2E9_`Q{3xI;4fnEAysQzvrt?(PFZi57glU0K4qcT9O%@qS-~{j zOY%cuTe*@nf)w&OBO&wm1gy!3LtEF8XKODgNiTh6aJ2P-&h?Hp@yy+eGZW4oapshIccYYx zty@Y{{K_eMRwM`ewKXB zAX4uJzwtjRCetE1?>+JqRR8V|hu@l51amKib@`niG)9@pGqbu$z*XkP;Zhkb+mAkZ z#mn}Zob*o#y>0euUw`LG9r&HV)O}pK(hukzIh${jiPG0lk1g5v8AN`6J+Wcs6}?hw z*M%^}SB_u(ZYS>Ys6T$)(x1~th-3+kgT>@IK*1CgXAG|Y&`7>x`h4r%2WTm(yKM3} zrR-jKY$QT}Gx`Z-yGo44@;`1^>Gxq*dls84C+}~xZG$h0TAHjbkvekzilY8Yb({Al z9Rw{8t91@b7@8&fazXW4mMa7=2tR){J2~*LmUjNsIj|blS`|ZRdLa30!#ni7LHzDM zz9?ghZ5uErkLV2zePh%pv~qESc;N9Cspgtp+rynRF`5tm9xbeQud;YuuhR-VGFHB*8N%! zb2Uo{V#>EhGf$azgfe16&$4z7k~zGfO&2WT!$lfGGDZesa*>8oHAzZD$+H3ZH#ub@ zV;3uM`9W|42DXVd`3?a-l zvfWXb!&WUg7?VNa7&GrDWazG%nt@FZMiMRfBx^nmXbAVWQw4zBDzuCdC(|?D-p;X9k{U`7L&jpVK)wg(ArIQ7=o-Ny z1!XBpN*{s*3yQ0%OoUkoO&20c%V2I9JPfQ-5JX#>R9|I7)6P+oAJi1*CU=Sbw*=#|0)GgS`1pqj4zQLw zXZw^DrqlE)0ZUA7YNuXPlJ~UJ&bR-jn?*b&A^rv`v}bAxd^l_xA40guTnV@}=@Ad< z{p}NPqyv_|IYLEgb1Mx}MEiF4&N0%bL?etd>U~uhbrDK^fcFmbnWGxoA4AL`1?z<7 zkf)ds89`d#4va#w`?8U16VU;Ls!^jVyAr(%;4r{v$$U6jPI`C(+M}l5z?g$rZmybI zfwD9rvTB+@Q$naCB6v%4i)aj7(P)8RPx2u=0WIVZ?_`5t{YQhA5-*{oWZ}{MnaMGa zoK6}maI~%pVH7K1YXx+f!@yvH$=GQ9?&R zqggw2w6zu2Ct82Bw$LHdh(H$m>7Xn00vjc32iAK#22@d(G|Ymu zWe!MDZ39a~n6H596~yFPYO98NY>3&8o$A)mdcp3;>tT|TWQw+uv>Vw@ji(;Bwhgor zhtqD8!Dj5tW=-qS0SMs`jIZo`7DOxKE6zyB+jlc=@1~wmFuVDzJ44OyG>kunX!02e z#EGcSL#P~tb`K%!yjb6xzV_zFycbp(%ezlg#!tJXlQ19T^IPpje3F;C#S5jD$f;n6 z#`dNEiLs7F;4gQWD<@buwUU>#vUi@*zje{@3=}6n6UPB>mdF>{EG|IlOpc-oWBBi3 zc#7Fl1*sp^x{sae!C3g(xD!xHBaTaz=Qv6>YI<7TY!rMl%3!K;p=patGJTXRhJ#mvuZdoI+ITxb0pxorL8 zvUYt{qf=)S<8Yl?dz%z5#ijwBsdZISe$VRoj9l$G8_6*nvp_&Y;axwC0KH~wut7ro}Tizwb zk9ASfi=R%tj|dDg6pj%M`7rLw+?=_|NqP{Wt?4E}{rbZo2CrE1>G`y~!6KcsNI@tc zB6&qz_{pH%Q8NDB!)yX%jZx`r3DH_YTE7!vI5(PsGpikcJ6w>}7;!bev+eO*ijkOr z@9=Wf6oHZ&%V%^C(PBA}lLnGT)H}Apxz4uOQ*xyZv`ew)N(;rXow&Eb?DXe82De{J zTYFzzRbXj9oX%qKigBzGWU(GX7MsOU3YC_R@Xd@#t?WI|mUsp4q&?$i4jsM7=HK=?dF{3dwZP!KIYKdSzTG4yH;Bo} z5~{%^ura=vI>T)!I)DD}&g;To+CY5(9@i!)3CTlnz5MrIzKl-ET^wp}N8s8WL}VJC z|36Ex^_*WT_2UTx)tUbsR;IVJSh?hWIzY^aAHRd$H4sq4i3ss-1oIS1aKzJ{0N!@H z*Xb&2)QrI3!%b+)8+*C|r(kqD5qZtonvGcP2BCYd8)&!f&*|UQf8XIP*_TfW%!N(l z7bbALDHd4SG1$74<;N2Zf2yXw7=SxZ=?Q^(81JJa~#5%-k;K-u6EnYK~AO<dk43aRC9gh2II?rk7M-H=o4i*6fUfz})wdw&?^|<}ti+WdH^uolAC_TRHYMLKq zC7+VIQSFYeM%z`6C?Qf!2v-wz0K9c0;n7M`t+3WlhxT>7BNWk)_`7W&Xqt={TCm>5Q4iqn^>DS7;-PNj@$aQ^xG{PP@2 zvXUCnQ550-B0;V9=IqO?%jYMbA|H2xx3=qDw*%RC?P7fX<7CJ9c8L1d#=FOq^a_W^ zv(bY(HPF(si|5*2EIy4ad7eW1OQ%3gu9DDqV^k@oHhua!PxCq>?4jOY@H&*Fx9Q>1 z{pW75;4}*Y2_Z(cGw%K`hzVD3gLY~5M3|Rqsq+pU^2mB~n$mtisQHt|J-k?*Arj|} zECCdLPr<>4ER5o!q?XI+Uw%;=-#;oHlIynQx}$_xd&nMB9^3Jt?b#dJ$2b0Yw;Y$q znGtU{Fb7wngq8e$s<&`g7NJs?dYkk zT%UV?sDF+E|>TH_u+r~K>55>d*qqw+5JAs@UAi^ZEYOJ z{|&b*Fk)4&t-*F^G5=M815tLHut$x5K+xWllNBt+xG@~BNViN%vTvW5K8!TcU;pcZ z{J8GWT^~(q2OijK>`B|KAvOIEQv8}>gIN!YouSoiIB^~|p7YC7@^P^Q^27PBcEiEK+gVp%onTo$B1(+|^2Pwz*o*^esLGc?yMd>8B00S~xYSaxjko;X zM1Pfq=&kqGh1ymQ(&&y@scO=|a8|O|C|^aQGIoTvC;=v&?XjzFC<5vtHyJIK^$jC$ zdn|&R)aG;I-;1awtA+U;YA6UZwy_4NL=CXH#?FbcXVoQAa@g}Kzaiyp><<<&6J-d( zPDBb89@K1s`bm8lFHwZq30~hq8z$@v+D0lO%U5q*J5g-l#Emy zhX|BXv*6laed*nYp4k^@*_EHEv^ucfDp#{y7la=U6NnY*D*T4WeKJQG-Ca>TZ&q<| z!$`f7Q_PpQD`nbs zk_I+)(-oJ#C*F=aP3l0$O(C{noq4isG!Q;3>SDFkEkv<+@0DJgOsN8OOU$%wy3cY)X{LtwBr(WnQTbM-@ z=Tn?ptZDw4u|tg^q<4Z+Ci-BcV!r39!3w_6=&PdNd5*SLv=wJuKCgVLTPwI(*|5jd zQA`}Q4qk`R9qq;F7{yoJb2(Fpssa~1|7+6S6l(i+O`-lClQ zS|;TBMEGKq5jWo>ZcJDZyQBS36(h@=Tb z0`ULRE~YW$5@9LL=zVe|IMN5INfsS^YO2waXBEHyU_$kVhrp3E#0&*Q`35y0`7fioL-Nr93%WyCuH7 z;c63v9Syt;LiHOJU4|)qnyl1gnfNGt<~SRdAing_Ha8cg8S|YK6Pn z9Be~Necu?cdaNP;=`LCTq`b7_tn8O+17qUM6Oh@yCqfc{5qV_i5AN-?t{M_QHa6sW z1|TK^yi^ml4n@fGvlLK{`WBSmo<|N<)A;yAO$_!VC{+5Lc$Idifc0H2*k`b$iO3XR zxy4hPw0H+nONZ%h#CQl+!-f)+q!~h4JB(_F6V3!4%2CpE#{hDCyEavvzI!NR^s8v* z<+T$V(^mime6jbq%(*0;5x?OWLvIO%Q6qqJr$;F$=d{Pf=9OC%Yqfy9Xx4c$)^{VSpZ z&rT`x`}r=$8gYu#b+HVRCZ0s#l0Ew(!<}_J=lDvYr4f0o>o(2XyOtaQ z{006edh^!v@=OOJg8!H&Ek$x{+VgiFez|Z+Tf5^mfJ8DaU!HWP>*{?PG%a56R9$FJ z9S4ii~q_JD-!ErwW0EngTw{KgCeSr$*vxQ#-ZBQjal$C z_J~Zx2dh~i(MJxxuV%n?JIjdZp&?YRa5Xa4EC5khdN&Xb~nR*N3%ANy~ju$ft^)S8`q ztOouF8S&90-UqwAe24z9$O5dpLu+#_hs)D`jcc8y3kHZ@1^*%HcEd{bD|SSu8%IT4 zhb*NI00nu?gv!uEi5Kt~(SBiw-4Fns;IvC=I<)v>a3TCa0V9cb?jyU4~5X^ z;)TD^*a-vU;wN}l0+{oU(qLnY33AVxks&{3{#OlgN3*=f=h72t>F0_d179OTW)*B6 zdHWri-(M9sI-6i$s>>4>8aO9loi)AI&(qlwvsaD1Xt3-1`U-!wYF!qlWE!E49?bj9 z(*~G(_!2@Wa)G{d%z%1FP1L7uZ}ZH;n6+;$mh+KBm8>g?>4#}6#v`T4m>d2Pb_?6eDGOj(`;IGxEJiIsm zT~~n*X6Tx5R9_Ap0p#<;{~-1H_+Ha5KG!Xh^G1)En0pgrz42edut*6nqr!M}-f{~0 z&sW9()y85Yv|bTF$4Hp8OJWy$22j*_<{Gb3`4yUoa8r(HWAN7+(#&#ELHrPD^)zw) zG->xca`!n())?Wj6mZ4BgDNw*pJyT`$LztDTeq5sTlE2Cr#|DT&^b)#YvGDWtKLkAv7-@=$9Xa9g;)+~FXznoZg z47?HsmG8yo#5x{VR58TO_pNCu16JBR)lB$AF@zMvojZ-6iQ7(*NK~0?Ye{em?54Qr zf?6KrQ~r;nJCBQL|Nj8~IcN51nwhp~s;N$^X*I1X;Y_6_;!bJP!jzLwi^EAsclcB2)ua3!-^*^5AsL5_4CwJ}lBx$@2~IyKjb#3dOCS%ecz z;{%dVVLMtTB3IEb0vkHXtP2pVr%jhUicd|DkpD+2%`Pj6t-Cf)30YM`^di`IwZczI z`fWhzKkBj$4~x%H6^uFr}NyWEYK-!1v2vq{w2?kB^T zGE$(hG!2l?i^F5bln3J6$N#By7n0`y@(Mjg|5gEOu1_BWPg&>ebD%5@=E21#eMHK6 zt0_>9A}M2slLYR}xiQISoudP^2x{*;$CW6k`D*H*{MXJhQMXVlQCI?bdmZc|n!96o zN_tsIc2Ei7nbNDMxCwv_a9915OCg6g21H$#;_ z0Tsu*f|Rzz09VJ^1pgUysgz0yyxA#Xv{(-vSNOFmcyx*jG4w>gRe->#l!OM68EVK^ zL*EaMpna+-lGt>92`{~vpTOV%*vB9j_JPp8yMmRFKeu=hU%51hyhOHR7N(%x^JB#M z^NZxJC;XhH$_gKB?&BMkqc^C1t&E)i5eoMoZ{Y--nvYXA8j4R$P`*7?CQZnlbCdvu0`9lp~~0(MKll)iHN27i4^r6Gsk{)X_VePQX+(o;LkFM{PRu3MSI4 zrfF{eycF?Z4G(a0_*@myO0Q#nK3K)Z^lKa-O zR4Q>LZy};@1m4>oRI5nE7t1NYyVdT40|N>Ix?+V3!*J3a4DG+<7eulVHq9Iy zSds@BOUOtalndZoJ!x`({)OZ*5VKVk#ZBLJE4n^QE))U_>TQo?Dk76JMJiJ%<|aD0 zIGyh#f?*lg9>>~oFmfK)=M%#abEqtDYjM-h*gvekOQC5$JnnY5d#Fv zM-|uSFFfW3>U*!l6R{R0mQnu}hrERX(t*6q7LDd{5^f|HZ53 z&(uR^8kJy+a$28rYdv(oMsC`==1^()~A}-qgMGI0YDbdOIeI@e9PtXiH z$p$Q&f-`LN?QWA;y@t@;0JfWcd4})T?eD&Qi~t|Y>~{S+>E<(X5MVB4BwjT&KqQaX zP>Y1r!nv!sbQ`x;0v(KBg}_2g0fX^Hs#p_g1}Gwhb`cfde4}4-g?cFTI-s=<{Wn-i zo4|;>4tCS9H((^mCoNdc90X9;Hu7kt-+U;0r`$tUyaXdJtt;IiQ_eu_SctMd=(<-c z<8?N+lK!Vr8R?Z(Ek{buf7R_(4bQHIlX{a{V2D3a_V>YMUuyd{T|G!rTh6k>{@ZZr zzxLvgV@<2x?vn`D?;k4;)4+3u#ZH=%TusR`loVMFlyv$3<`>UMQf!ICR@#H<6YI~H zz-)B_0P_X>+{jrF4}naRDU30A(k>tSuXUWnCw8x%(f(Z1{{b@%aETnQB!v7TFtd7? zi~*;aZy9vpP-bV2lGcxvY^+-w2yD^@v0&V^~E@7JHS$99IU3IAGd4PbYK?<*=XzgIHvJQf@d zM-~=K4S%Nv$=M=65EkdDBc$p~#V_No$tA9>SWl+Bc#7O!BFL4vn{3u~v! zO#xlVECT>`zGH?6VRBi%jHWR17pcIKVHm5jtX5%n@ooD_R**pCXt-s=HU`bI!Nc_J zbnZz_Q0%D#YFVXeOF_c>K1)lGrZQ=YF15C2IlILTy;N}Qm*oY;_Nq%N0_-;rXc}OZ zIhQ|kvt~$nhx&^kvV#H|yqT=8n&Yr?o9*I`@GwV=! zn2KHw#};@d%Ze%0kXuM{zN3~*C)$AEL4Kw-s@j3mwZRD^P3)$^{827+jck>4ay)ZQ z=8~hFzy0D!6T+WKuJ0A z$@y~T^1dNSz|;ICDUK~g=)o0}{ee&T^9CPAP%gDhLKFw*GRADXSRkW-D-BjOZgFor z#-E!d)6$m)Eeo@;x7AFsr=_hir7@f}J?s-LqHq&qgT~Hg4*rcUs+W8(_c>9eK}}{P zn<`yQg#lqokJg5$BqMj1Vk7(b*xCF*gRcX9shpU_F+5G|K3rzNsqr@cEtLz=aP`kaT-p zac$DBF&76W3IPUM#!&5D+0MQ8ztuoW*A^FPP%BqSwT^&`@Ag8B{@OU$*!gh^@FOF= z7TaF!lx#j#=K03%kxC|}%`TiouENkLA~sHn*65h?Cx}s*05V;t+!-&gB=f6g*PcC{ zcvpPVR(GaWv-whcxD5Lzp)F0-pntgdUA8~!aIOfjyb?rT-y`;{uo9i?=5=zrjLmA; zb?$`Y9P9k%j+>sR`x;e<;s8oFiz&lk_m50{uf>vhZjib2VC7U3)Eu9>FL7kG0C?uy z4vSn}G!`K!PR8VB0Z=pzKc^c@yq;9Do9$g zc!0{KByJw2Sn5*AsjCN;?@UivXc%p61H z(pW7IaH)(=$6XtxJtof85HCV)F3vCUwre*^$ie;dgi%xH>x-ENZTdVRw5N?5{XL3wi}_ z{4m+24g!uM5`v?&Q{})-mrwOo$cz!faYPAQ=na(M(W-D{UZAjIRGwCE7SVMyIj6n& zcb;uIV!y%DTwv-g%&dGUd$*6@j5ND-omi3LOC~D8E#3IFV1+(9XqA>SU!pT9s8Asw z4BjY{Tf_jPOx6<1ladI=e6?y3pAC}Y(yZM9CRA6GCrr%%@jmLnh4xy#IhGVPe4dh~ zCbcT-db67nuhgqs&+E~t9U6Mj(=$ee2;?vaG0v}5!+v!H;wn{yWEmKnOcgFVHFZi5 zkybrgW#lYUv`!w#`v*n|iFmxD?rZ0B3*GWJ*Cgk=veQeeK1d>@ zu*XIK4vVh9$xq z7BrB59r$9R67?>ai@_d3#F(=+UnSR&ZBenauZEm3pustFamupf=iAP{R=$pg4yO*j zr@0PiHacX`&MR*6^I{yUwih}J^FObw`LJ)vspDivJxaN8vJfZ z2!+`ZLal{Lr1Td|q5S=GTv>h&kh09+ZIZR(KlB+E1F{Xv=)Klf`F^F(H?pS|LBit0 zCpao`qu*`%Db=>ee|#Cd-golEiaFIgm=URrg`!Qo?`Orv{6x~aNy)AaA1jFiO)c= zg{O!D%&VE}XNGdj7N25ytU8aL#!PRM`PYmzQ$U^>SiTZ4RXBu<0@Ge;$uzr9Wec4Z zjCpnVf_I29^7N}#Q7>kmG*(4iM_?zt#@h4Aa_*=+o;7wuahpqJvC64yWFfZKVFeeH zL1|qfVEN`0DF4!qz~2fYBe)+<|9#7U;lyu`zsv)sVZOV7gIeqpA*XsO>IBJ_BU)gN zzb3>sK$QL<4}VgSzcQdpN$l)B{gb#ty^$WJJ4*w*NK*-%vlCzZAd%GlX#J3u@2P|} zsHJn7d7;=A*K$W6aXnG0XInX;r!f`ON-f^m`A5_TED`* z5Hc^spv?k+YE1{Apl44TSPxA-fq4W@&O;rt4q12KW#)+1!~xd8gVpH6+DoXMyiph`q&b=M1eGTJtItGTVMX@QtNq z9Pvx*lBw&K=w z1`z6OL#~bCgL)2V7b$2DTJuB@Dk7l40qz>@g#Pm>%LijTPv-7Oh zdH%r>LF2YJAQW5Kz0la3#AS)i2cXnfXk17bTVo0GoH#h3e8x7dd_YRk!US&Zs0x8` zmH=PaVnI;38~ZT}XSo0uHwS3@je+XcZPq9z#1=4FBdi#lqh1gT5s&;qL-N9Cnk6=HexlT=rBQZCfn02HSacS?-H4H zDx9xnH-o@!3!o9ean_oL#=f+Qpka?$8kCxag=M`8YR_OMhuIdPWKpw!GA1mHEWPCb za8}X)%1ste+1-wYZ^m$O{kOXz``-O6gIt9Dikvn0*tXd!|-^Vt`!wv(BEOc9l*jR=s_4se- z@76NdtR55ezoK#7W^eDkAG~X4iQMhyEBlr*gf(S%b}w};#EF5d-)p(aatG|_#cpkc z3+NWgslAiOJL~b+(WL1bl7(99AW-NDa9^dIuNO}lg+X7Kh^+K%g}3;VdK!C7I&~Cb zX^n-#jeji90GTJtEmqky1-kPK&3>86p`GK2;EzSQ=OJ0 zK-K=JEivezm(@B8y2fxjnRrH~)~@ShA50STiMgY1>^&dcqCS4vt5;*{!rG|H^fRzA=f=xt98x6kkBxpDddSN5EaSjTt1N==d6c4Lc=X_ zXlCZ3S67oMFyrSQyC^x<+RG(8o&XOwgG``X^=Vc6OKPM!2O-hDVdb=(-_RYRo;2mj=L#>0x4 zRSup#zGJ3#RSz?60QX-PP5tR5z_rF)#k4#H>wZ|EbC{@zWH_cvpAk02JUkV`Us=ts z^&dObx?;*%lxTMLRg+AdNCBkuBZTd?-1b-lUOiE)Kp3fipVc~Ap zdz@MbIdj7-%e+L+uo!Uw~XXf1zW4-hp&4A2`QC#V%qxCJ7#P5JimJ24E~ugPeQ?A zdZL4;meew|y0Bq!z=yxD_z-yxZeuvL4U$8j^-u{UqA{6;=@t_h-q$m9U5) zG-GtaUEiEz6i(d*AK%Lt+tLa*G_B4$ZSHiRWsFh|;04zTjG7y*c8N_pW5`9P{FB3s zocGeqfx~XxYUbd|9mkg4TYWcBM+ca7JY+h7QHUNBXW~iZ=8y*q@^r3MfH(#t{0gh& z_3;tK?5AH>PQeG@BSGrGP6#||4}A2jh;-_j#pqWu!0*HV{61|G^j0nS_MG=a|17@} zjm*Jwmua;J15?orBFR4zk$mw3Bl9sV_)ft2?E%&?a={4Jm)-m80bpkM#(0VwSEI)N z^F2UP!u{BRA|KX(yq{TRd})um*pB$YH#vZFak0@TN^rU?Ppn|@>3({Qk1;;8?q{*kJ(y%{GRQp$C8u3HSBY+|!PO)&WkBqnf?lZkXY<7* z*+$H^n#kUU)6bx`ecF;rIp4Y2@~qf~?%eyD((JdAi~yO}wOc&e*$pT`7$$57q|qw~^aP*h!-&-m4You6bxk(}&Zb4?`%7 z0?V4^*8YnH|NGtY>tKVqnEW2+)EE9fbq-0bBTh5UE)yF>(5}ft=W4b@mPM1VEO-^O ziP5{lFtK|DQt`lpd9P>PyL_ER_m4A4Xg3VDCV@pG*r>Pgg-$+gV-tHo9O|)PM2Ii? zpz~NV4UB-B=J+DRWbq;vYAv~4-uidQv?A+Hu>e_U%|-zhN-En3mB}@)Fo&npO!VpI zN4Qd{_MR8OkHZ#fCu4l^!l)Zexy%Evhh=s@8^_s&Klv z;}?vZ{O^fnWOmjVGu$8*dj+|JM-FTv;7{HAztoYh1FitjD_8(` zv(JX}b?-FhMe4tlrk(xUz0-nm~>iM=oi5Ct`q-pgQ@u!0yY-a^S z+ppz1y(p@54iEu_(I5OF|O7ZpVfw(uL(-*voUm*jPUm777JS(Ff-hA#t` z7I+~&rgH1v9U{`&3&H1yHEPc4tMi6c{(vM|*h zrlUk@7NQ?24LVZyH!ZlxFmxe(-J>N;qu$i8DoS=32Q!E1V1_yKjjZGg7|l3Bd5g@Z zA#jkP+~si@34?3<5MvkrvN`TX{NCj!j`Q&fInzyFUBX#fA5hs=c2hxTToz@N_wN%m zm%A3$$dzrEMP(!_I}#{mfFMLcbh84cDLqzwnu(^G`MY)}$V`5n)pOQQ8M0*fn!~n! zcZKUo3E=eI)_qE%eRj;5cjtXr&3SgBcunf0(qC!_ax_#gVfwr8TT>D8SKbiKZ>wyG z@s2l!yL@4L=`c1`*lbLa>KXLv-KUDFyRYX$*%FT`e)Podse_7@Ffl!u4yrSp2U&>8XAMdz=$Vjsyk^YjCD}=<2VG zt}wIVS0RWHVTNi*7cM`npU2X&!-?6#uLgS57+|NAEjXaZnSTB(svs6HFewlYRJ)Eg z)X|tyv)X28-RcPjXIP3^^{ctXvb`HH^fZas$nv-c$L0qpOaM-s*_EjTno##{_YGTv zc&E#1o7fM+B!{jmzDAA}BLoKg=w_wq$DMl&WZLGEeALE858WNS;yp)i_fKCG_fDB> zT9oe4F;wyJ?1YBwBWv8_cG$h zndQJdE(vF+pkYyc+WFfjw9c*>x_(!jmsaRVn8m3e*uKioS@@!r1PM-pFcx6Fia)))KYn4 zu!t)+eo{FvadfcrRy<}LQ;mAaq_aXy$Yd24FhtqQzz?%6F~?zDYHZ!Ia>`wcY^Kz|0gdM%9Qu|s|2(qx6plR^W+a^8F_;=AB04rBx7zO=Q~DZ?&^iPoVzO&8;Iw6eb;+~q zXBgx`p&7^bc3s*0W<|9fpGld9h{fFru&F1WS1*YxN$09jp#$XoQ>V3M69>S zC{>-HnrqeDQqnTz%d5Q>smYU9+-G&+JZ~wOK5}|>I8a(fRv-2p#f^X=&o-k+=>ucg z{(tKqu^T8r)G#LnrhrL5*MGM}=(~AElsHaGt23N0f( z9z}!_9sMf`Pw(V|wj3Xm2tzJ)0%0L^B?tXiM&H!JJ#upFGK9Mo@)GHqtq=7X|Hk>P zQa7FLBeQmjif2_rjOf<+=4GfNK_zD`&1r{=48=|(=%!OXeI|7)?&$laVgR;Ym<+9f8} z8Z0cj5f%V){@gmGV7LEJkG5AXX$LRNQiTzWO9&=mVjhOmaB}!GHm&{>SkQUjeLWt zHRc-XYW&!6c_d~n0MA1r%u}wBc$j$(yzenGC5=`V>_fdxca08pz@-wHqixX*>=bVnJDt{&zhz#HkmETeP` zn>8&nzHCUoEHj_6!+e1WNHdrv$tY=F}ss_)G z(t(--WVBnXw4F}NmJ+)eNUA1BVB|b4z0S#FD+)8iARIMf55akI zb^&gb*Z_Ho>kj~s2pHWu>P*DuVp-9{a#MH}jegu|Mla-O5OA6VoTYzmM96&xSeVJI z#;A+btYc0ze&v6eOG^$o=Y5Zr)fqVMu*{aViqrli2B4BI)qk)cH(5P3V&RJ8cOwm}X#cHY@Nj0Enq7;98s1!f z-+x)HUcdzOP@EZxk^ickJ&cuhWCFG$-@)m{5t;1GPU54FQo;<5CF-|%4R2%Ojr=j! z*nUKE6Dh;VC7&pf9!%H-lo{yE)g@_pRF!%m|5tcI_N(4;tkKg$(?aDx7rnx$X zGuCpf^kJvxEXIQ8k!tQI^P_FX;45l0HhyF$nO%Sy`N|*_(&8L@GiRRZKWfL^ZJeiy z*fVVl*;t$tlkyQ`mw^?g!leL zd|OlqT;vQU$#Cidv%S(zmM5UvAq&0KV+UQ>LKW1E5I++(7yFR5u~*EDX*F?)S7Vdb zjucGq-STu9l!Ftyb0{+ts#U*fBWxoMRikWwkA}Q4Sp6j>cc^3fsi_a)-#RkS=&zi3 zdJGmeJ@^^-c`$Gq&j6!1S%)$20s3+VSblWT>ERWdm>a+0^HU5h*_g{j6I9T14(3I5 zD16r;8E!A6)FVsm#@T@mW+}wAadJ!4*I#K!6x$H=rlLrY6;^wsvg=bqVNF5#)uk`P z_)XWq0fUjJ`gvAj;ZXCBHsQi=vWt!n*G{Qpe>6!u_%+JF{B8VtUdUih&(+0R(dc9{ z^F0VY`1- ze@@x%QGm;kpF8pL8e*Xy!aO9&#ut`i))#X;W*QHyy3H(xAlGld?e<+0{FxYb6lMi_ zz(`7_BeNHmTz>=Y1XM$H^sQ4yu61v8$oIkZ5>%=GJP_ja!4L22X5OnA^q19N@AHby^dq$4xG4vlzkApR(L|6tLfX}`Q% zdvF78(ka`)(jE4#TW$S%O9TS5lui5kmK*)teamweT)?S6M2a!4R1U#d8or_Epp->Kl}Bt zGy)922S%%M_l!hr_d*z*;K)L^fH%nRP7g=uu9ER`ndb44e;%#dU%Og@y6?KM)7Y_O z#hcnrLrREq^*_sAUU-qsw`Qlv+8i#FAHl@6GRE03k6y%N)9EEq=!Wg%6=hR5%=yZb zo;|rZFy&`Qcwj^#TLwIb7^Z{a|9zK|pO|D{a2&z*q+KjL2e(^na!Qmdrc6-3CwI^y zmD69WJDyVQcCq7wNk!<771!5wo@!}-_#-c(mvd$#ebJlUjd(*wYTJ{fv%j=#k9r8l zEQQpRAdUfPJd$eBpztwfWc0BN-tIx*cf$?yA zujwVPP0G3P4OSs$wLx{dJBWfo{Wt=##rf<1Ewm+T4+kxqM**RD|Mct6(srFYA=%K` zTJ(?sR0Q1XxpdE#(YEAsJ*ywj%McU=$d{faH$Hpr$UNG*{%GwSBfNf_5w@qJvc&%1 zyDyzH3QqLq?`ud;I`iz(Zr;#+ujTyzEm%n{xbgS(`VY42A5}F>Ub;BG+tBk@1LwaL zNB3A%ek)OI4 z7aF`~+zSuC+e6Q`yV$>PjxcNyvfAshG{2K5}*Ntb>p!?!k znHSIZ?H~CAgm}EyTuEzt{vrLIc?dHw!wKXqer9>r542sWrR6lRG*k`rU*D~HwrYM%$eFhf+EOoGt=jkZyGNZXNOYp@_#ZMvBm@9Y6JP;;fYaaz zm;~4Q`o4erhfsuX_H?}%dhz)2)Bc-x3BCB@#cqitk#LJ|-n~y~#800L5%6%)`t?z> zqu#uHmnvIC*v1jlg9)_w`0+LZExx4dA%J092e&CMQ|k8Y>1=CZaU6mIf`X>a9)31L zoD(|=tj?c4N~ptxPn@)H36IBr|LzkZAMaBiFwy}Bt9>PN2xKUZNt;S2_b^63{3Rh$c1U|X>s|cU?+1-n0E?jJ?Z(1-f zp{%sjgw4yzOe0|9X+9o@_mmNmv6HQH)y`cfjy11emV6yQPTEFZ=IZIkqQiny?@(E;n}#v6f|p$)?7vgEi~DeIjO{3tO6x zHf>WiA3MHRwfw<_BYmCqgd1J6d0oi#_+<%_p-X2ZVWCeS4|JYCQ?prR=x;mUaq#cA z@17fm2w9oMWox#p4wtVxu)ncm`}&d<@$+Ldm!ubM$c$EH&v`lejbKUo3^ZJYbqxcaX4~ z&&S?wyS!m@=Cq7x_wqH-XLhWL^Riwt%SU%;yK;H(nctVMUA;rGQC%mWOMH9(j~3H$ zOst@rxu^AM8hT2(PIC@O+8ZOLp7b^s%G#ZDFoQp`vkb_u)d&|HiwMFD7z8EWh#518 z=k7HpNiwwH$elxI!d2Gt_LmsLER)Kg6Q6<2ye}}$(i0c_aq*ta-F$;_+=*0^nIA@4 z-5+S&=KdE0u$9T092>SoltFpgwdCm6&`N#Q)3W7TI@VtN@^Nu7$u1ely7CXr-~11= zTYB%WjMCa9SLA1{+oC&FPuv&H**C7c*WzRsyiNq4pODF`K(egK91H@my^`|cMG5Mib#>0q zM_-3XW`*jJoiTxrAftI5pkScFuc@H;_-}{a;_i!nO&*IZ>G^&wqTS@n#%yrmx%zqgEFZ+<%-!#$*s7sGa{!xc zzP?hLK&Guce>MT~?mpot?cvToSs8Z`>Yn@8;+UT+PF|Wgc=%LQ0yZUot18*N^|#lN z*p>Pdw(s+G|9V&b*=-aR+J0rq`KaCYaiSybD@P9Y^Djh8s}g^4RV9h)& z>tLS$x1YS5*RQ|V7lXo%(|07-){4opr&VjD@m9Ci+>58J6;tLJ)!#FT`;mG^owCH@ z{)2^0SDu>WNqoNi!TlB-2xOsxf#rGQ?SW5<)^`r@ED9&Nfpb^`Th>2U**uB<)Aa{4 zz-WuWr)a3!uX8=cQ{b^aidC4eT(o2T%)2}gzjfiO{rg{@d0l_4_uOcy4~TrDpRs-8 z(5BL@!BUnCn*RFqx658eK=WzZoJ9veZh8x8r1G%`|M~ZFubwK@QclnNt@}wslBPJW z$VWuxrOx}s>dPO;&zq0cC)?D1OUqok<)5wIlt{{(KR7Bu;+ zCIPw0PSJwDJTlH`WF+z+XG**rrNxN+$ko3%3SB5?M&PuAf-wBXk;z?KFK3C@cVqS;V!gZ&uw>v*?kat03Gtlp5Saky zkm{MJf%@lMIPj5%B5%}jJX-Bv-}W^PxZ6(iB<$NR&`;0T)*xlM#(nwru_b;`Dy|D( zE0TLS8>FZ)I#)Hv{aF^~mCy>qUkAz!4Ce-;4?W>d?spk{$A|!3Y`}?sv@tG22fzHx zqIBVO`vEg@DbXy$NZMzIs$Dr;g!5cwch1A85vLWhEE>b!Ml6qa zvmxd{Z(iCu={+}Y!yNm?ojc`;`WvOZoHq+0yf_L2hi+ztt#w>aG=j>&iYicEk^fls z9i!!FKup|WoB6?gZf6tv8bZ6gzG!NEvl|z2$O=ppgTMi;E0W)wUwH9k(r?j4D5X

``` + ``` // comp.js export default { @@ -16,6 +18,7 @@ export default { } ``` + ``` @@ -24,10 +27,12 @@ export default {
``` ->![](../../public_sys-resources/icon-note.gif) **说明:** ->自定义属性命名时禁止以on、@、on:、grab: 等保留关键字为开头。 -## 添加默认值 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 自定义属性命名时禁止以on、@、on:、grab: 等保留关键字为开头。 + + +## 添加默认值 子组件可以通过固定值default设置默认值,当父组件没有设置该属性时,将使用其默认值。此情况下props属性必须为对象形式,不能用数组形式,示例如下: @@ -59,7 +64,8 @@ export default { ``` -## 数据单向性 + +## 数据单向性 父子组件之间数据的传递是单向的,只能从父组件传递给子组件,子组件不能直接修改父组件传递下来的值,可以将props传入的值用data接收后作为默认值,再对data的值进行修改。 @@ -78,7 +84,8 @@ export default { } ``` -## $watch 感知数据改变 + +## $watch 感知数据改变 如果需要观察组件中属性变化,可以通过$watch方法增加属性变化回调。使用方法如下: @@ -95,7 +102,8 @@ export default { } ``` -## computed 计算属性 + +## computed 计算属性 自定义组件中经常需要在读取或设置某个属性时进行预先处理,提高开发效率,此种情况就需要使用computed字段。computed字段中可通过设置属性的getter和setter方法在属性读写的时候进行触发,使用方式如下: @@ -130,4 +138,3 @@ export default { ``` 这里声明的第一个计算属性message默认只有getter函数,message的值会取决于objTitle的值的变化。getter函数只能读取不能改变设值,当需要赋值给计算属性的时候可以提供一个setter函数,如示例中的notice。 - diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-custom-slot.md b/zh-cn/application-dev/reference/arkui-js/js-components-custom-slot.md index 2a8c3934e49..a318bbf7355 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-custom-slot.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-custom-slot.md @@ -1,9 +1,10 @@ -# slot插槽 +# slot插槽 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->从API Version 7 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API Version 7 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 -## 默认插槽 + +## 默认插槽 自定义组件中通过slot标签来承载父组件中定义的内容,使用slot标签可以更加灵活的控制自定义组件的内容元素,使用方式如下: @@ -16,7 +17,6 @@ ``` 引用该自定义组件方式如下: - ``` @@ -27,7 +27,8 @@ ``` -## 具名插槽 + +## 具名插槽 当自定义组件中需要使用多个插槽时,可通过对插槽命名的方式进行区分,当填充插槽内容时,通过声明插槽名称,将内容加到对应的插槽中。 @@ -41,7 +42,6 @@ ``` 引用该自定义组件方式如下: - ``` @@ -53,6 +53,5 @@ ``` ->![](../../public_sys-resources/icon-note.gif) **说明:** ->name 和 slot 属性不支持绑定动态数据。 - +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> name 和 slot 属性不支持绑定动态数据。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-custom.md b/zh-cn/application-dev/reference/arkui-js/js-components-custom.md index 4b91521dce6..04d47d810da 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-custom.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-custom.md @@ -1,15 +1,15 @@ -# 自定义组件 +# 自定义组件 -- **[基本用法](js-components-custom-basic-usage.md)** -- **[自定义事件](js-components-custom-events.md)** -- **[Props](js-components-custom-props.md)** +- **[基本用法](js-components-custom-basic-usage.md)** -- **[事件参数](js-components-custom-event-parameter.md)** +- **[自定义事件](js-components-custom-events.md)** -- **[slot插槽](js-components-custom-slot.md)** +- **[Props](js-components-custom-props.md)** -- **[生命周期定义](js-components-custom-lifecycle.md)** +- **[事件参数](js-components-custom-event-parameter.md)** +- **[slot插槽](js-components-custom-slot.md)** +- **[生命周期定义](js-components-custom-lifecycle.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-grid-basic-concepts.md b/zh-cn/application-dev/reference/arkui-js/js-components-grid-basic-concepts.md index ae70830fb1c..8c15ecf94c5 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-grid-basic-concepts.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-grid-basic-concepts.md @@ -1,44 +1,44 @@ -# 基本概念 +# 基本概念 -提供栅格布局效果,通过栅格系统进行元素布局,主要提供栅格容器组件。 +提供栅格布局效果,通过栅格系统进行元素布局,主要提供<grid-container><grid-row><grid-col>栅格容器组件。 -栅格系统作为一种辅助布局的定位工具,在平面设计和网站设计都起到了很好的作用,对移动设备对界面设计有较好的借鉴作用。总结栅格系统对于移动设备的优势主要有: -1. 给布局提供一种可循的规律,解决多尺寸多设备的动态布局问题。 +栅格系统作为一种辅助布局的定位工具,在平面设计和网站设计都起到了很好的作用,对移动设备对界面设计有较好的借鉴作用。总结栅格系统对于移动设备的优势主要有: -2. 给系统提供一种统一的定位标注,保证各模块各设备的布局一致性。 -3. 给应用提供一种灵活的间距调整方法,满足特殊场景布局调整的可能性。 +1. 给布局提供一种可循的规律,解决多尺寸多设备的动态布局问题。 +2. 给系统提供一种统一的定位标注,保证各模块各设备的布局一致性。 -## 栅格系统的概念 +3. 给应用提供一种灵活的间距调整方法,满足特殊场景布局调整的可能性。 -栅格系统有Margins、Gutters、Columns三个属性。 -1. Margins: +## 栅格系统的概念 - 是用来控制元素距离屏幕最边缘的距离关系,可以根据设备的不同尺寸,定义不同的Margin值作为断点系统中的统一规范。 +栅格系统有Margins、Gutters、Columns三个属性。 -2. Gutters: +1. Margins: - 是用来控制元素和元素之间的距离关系,可以根据设备的不同尺寸,定义不同的Gutters值作为断点系统中的统一规范。为了保证较好的视觉效果,Gutters通常的取值不会大于Margins的取值。 + 是用来控制元素距离屏幕最边缘的距离关系,可以根据设备的不同尺寸,定义不同的Margin值作为断点系统中的统一规范。 -3. Columns: +2. Gutters: - 是用来辅助布局的主要定位工具,不同的屏幕尺寸匹配不同的Columns数量来辅助布局定位。Columns的宽度在保证Margins和Gutters符合规范的情况下,根据实际设备的宽度和Columns数量自动计算每一个Columns的宽度。![](figures/zh-cn_image_0000001127125136.png) + 是用来控制元素和元素之间的距离关系,可以根据设备的不同尺寸,定义不同的Gutters值作为断点系统中的统一规范。为了保证较好的视觉效果,Gutters通常的取值不会大于Margins的取值。 - **栅格断点系统** +3. Columns: - 栅格系统定义了不同水平宽度设备对应Columns的数量关系,形成了一套断点规则定义。 + 是用来辅助布局的主要定位工具,不同的屏幕尺寸匹配不同的Columns数量来辅助布局定位。Columns的宽度在保证Margins和Gutters符合规范的情况下,根据实际设备的宽度和Columns数量自动计算每一个Columns的宽度。![zh-cn_image_0000001127125136](figures/zh-cn_image_0000001127125136.png) - 栅格系统以水平分辨率值作为断点依据,不同的设备根据自身当前水平宽度px值\(配置了autoDesignWidth为true\)在不同的断点范围内的情况,显示不同数量的栅格数。 + **栅格断点系统** - xs: 0<水平分辨率<320时:2 Columns栅格; + 栅格系统定义了不同水平宽度设备对应Columns的数量关系,形成了一套断点规则定义。 - sm: 320<=水平分辨率<600时:4 Columns栅格; + 栅格系统以水平分辨率值作为断点依据,不同的设备根据自身当前水平宽度px值(配置了autoDesignWidth为true)在不同的断点范围内的情况,显示不同数量的栅格数。 - md: 600<=水平分辨率<840时:8 Columns栅格; + xs: 0<水平分辨率<320时:2 Columns栅格; - lg: 840<=水平分辨率时:12 Columns栅格; + sm: 320<=水平分辨率<600时:4 Columns栅格; + md: 600<=水平分辨率<840时:8 Columns栅格; + lg: 840<=水平分辨率时:12 Columns栅格; diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-grid-col.md b/zh-cn/application-dev/reference/arkui-js/js-components-grid-col.md index 76a19eae4f7..288ddd88a99 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-grid-col.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-grid-col.md @@ -1,253 +1,66 @@ -# grid-col +# grid-col + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 grid-col是栅格布局容器grid-row的子容器组件。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持。 -## 属性 -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| xs | number\|object | - | 否 | 在分辨率为xs模式下,设置该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0} | +| sm | number\|object | - | 否 | 在分辨率为sm模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0} | +| md | number\|object | - | 否 | 在分辨率为md模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0} | +| lg | number\|object | - | 否 | 在分辨率为lg模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0} | +| span | number | 1 | 否 | 在未设置明确断点时,默认占用列数 | +| offset | number | 0 | 否 | 未设置具体分辨率模式下偏移时,当前元素延容器布局方向,默认偏移的列数 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

xs

-

number|object

-

-

-

-

在分辨率为xs模式下,设置该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

sm

-

number|object

-

-

-

-

在分辨率为sm模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

md

-

number|object

-

-

-

-

在分辨率为md模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

lg

-

number|object

-

-

-

-

在分辨率为lg模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

span

-

number

-

1

-

-

在未设置明确断点时,默认占用列数

-

offset

-

number

-

0

-

-

未设置具体分辨率模式下偏移时,当前元素延容器布局方向,默认偏移的列数

-
-## 样式 +## 样式 -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

flex-direction

-

string

-

row

-

-

flex容器主轴方向。可选项有:

-
  • column:垂直方向从上到下
  • row:水平方向从左到右
-

flex-wrap

-

string

-

nowrap

-

-

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

-
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
-

align-items

-

string

-

stretch

-

-

flex容器当前行的交叉轴对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
-

align-content

-

string

-

flex-start

-

-

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

-
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
-

display

-

string

-

flex

-

-

确定该元素视图框的类型,该值暂不支持动态修改。可选值为:

-
  • flex:弹性布局
  • grid:网格布局
  • none:不渲染此元素
-

grid-template-[columns|rows]

-

string

-

1行1列

-

-

用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。

-

示例:如设置grid-template-columns为:

-

(1) 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;

-

(2) 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;

-

(3) 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;

-

(4) repeat(2,100px):分两列,第一列100px,第二列100px;

-

(5) auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。

-

grid-[columns|rows]-gap

-

<length>

-

0

-

-

用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。

-

grid-row-[start|end]

-

number

-

-

-

-

用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

-

grid-column-[start|end]

-

number

-

-

-

-

用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

-
+| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| flex-direction | string | row | 否 | flex容器主轴方向。可选项有:
- column:垂直方向从上到下
- row:水平方向从左到右 | +| flex-wrap | string | nowrap | 否 | flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:
- nowrap:不换行,单行显示。
- wrap:换行,多行显示。 | +| justify-content | string | flex-start | 否 | flex容器当前行的主轴对齐格式。可选项有:
- flex-start:项目位于容器的开头。
- flex-end:项目位于容器的结尾。
- center:项目位于容器的中心。
- space-between:项目位于各行之间留有空白的容器内。
- space-around:项目位于各行之前、之间、之后都留有空白的容器内。 | +| align-items | string | stretch | 否 | flex容器当前行的交叉轴对齐格式,可选值为:
- stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
- flex-start:元素向交叉轴起点对齐。
- flex-end:元素向交叉轴终点对齐。
- center:元素在交叉轴居中。 | +| align-content | string | flex-start | 否 | 交叉轴中有额外的空间时,多行内容对齐格式,可选值为:
- flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
- flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
- center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
- space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
- space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。 | +| display | string | flex | 否 | 确定该元素视图框的类型,该值暂不支持动态修改。可选值为:
- flex:弹性布局
- grid:网格布局
- none:不渲染此元素 | +| grid-template-[columns\|rows] | string | 1行1列 | 否 | 用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。
示例:如设置grid-template-columns为:
(1) 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;
(2) 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;
(3) 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;
(4) repeat(2,100px):分两列,第一列100px,第二列100px;
(5) auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。 | +| grid-[columns\|rows]-gap | <length> | 0 | 否 | 用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。 | +| grid-row-[start\|end] | number | - | 否 | 用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。 | +| grid-column-[start\|end] | number | - | 否 | 用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。 | ->![](../../public_sys-resources/icon-note.gif) **说明:** ->不支持宽度相关样式。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 不支持宽度相关样式。 -## 事件 -支持[通用事件](js-components-common-events.md)。 +## 事件 -## 方法 +支持[通用事件](../arkui-js/js-components-common-events.md)。 -支持[通用方法](js-components-common-methods.md)。 -## 示例 +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 ``` @@ -300,5 +113,4 @@ export default { } ``` -![](figures/grid.gif) - +![zh-cn_image_0000001192960596](figures/zh-cn_image_0000001192960596.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-grid-container.md b/zh-cn/application-dev/reference/arkui-js/js-components-grid-container.md index 3e76f756fc2..eeac8459fa3 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-grid-container.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-grid-container.md @@ -1,275 +1,76 @@ -# grid-container +# grid-container + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 栅格布局容器根节点,使用grid-row与grid-col进行栅格布局。 -## 权限列表 +## 权限列表 无 -## 子组件 -仅支持。 +## 子组件 + +仅支持<grid-row>。 + + +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下属性: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| columns | string \| number | auto | 否 | 设置当前布局总列数,使用string类型时仅支持auto,配置为auto时按照当前的sizetype决定总列数:
- xs:2列
- sm:4列
- md:8列
- lg:12列 | +| sizetype | string | auto | 否 | 设置当前栅格使用的响应尺寸类型,支持xs, sm, md, lg类型,使用auto时按照当前容器大小自动选择xs, sm, md, lg类型。 | +| gutter | <length> | 24px | 否 | 设置Gutter宽度 | +| gridtemplate6+ | string | default | 否 | 当设置了columns和sizetype属性为auto时,可以设置栅格容器的布局模板,通过布局模块设置不同响应尺寸下的Columns、Gutters和Margins,详见表 gridtemplate可选值说明。 | -## 属性 +**表1** gridtemplate可选值说明6+ -除支持[通用属性](js-components-common-attributes.md)外,还支持如下属性: +| | 模板值 | 可响应的**栅格断点系统** | Columns | Margins(px) | Gutters(px) | +| -------- | -------- | -------- | -------- | -------- | -------- | +| 默认栅格 | default | xs | 2 | 12 | 12 | +| | | sm | 4 | 24 | 24 | +| | | md | 8 | 32 | 24 | +| | | lg | 12 |48|24| +| 宫格布局栅格 | grid | sm(0<设备水平分辨率<600px) | 4 | 24 | 12 | +| | | md | 8 |32|12| +| | | lg | 12 |48|12| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

columns

-

string | number

-

auto

-

-

设置当前布局总列数,使用string类型时仅支持auto,配置为auto时按照当前的sizetype决定总列数:

-
  • xs:2列
  • sm:4列
  • md:8列
  • lg:12列
-

sizetype

-

string

-

auto

-

-

设置当前栅格使用的响应尺寸类型,支持xs, sm, md, lg类型,使用auto时按照当前容器大小自动选择xs, sm, md, lg类型。

-

gutter

-

<length>

-

24px

-

-

设置Gutter宽度

-

gridtemplate6+

-

string

-

default

-

-

当设置了columns和sizetype属性为auto时,可以设置栅格容器的布局模板,通过布局模块设置不同响应尺寸下的Columns、Gutters和Margins,详见可选值说明

-
+> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> 本章中px单位是在js标签中配置了autoDesignWidth为true。6+ -**表 1** gridtemplate可选值说明6+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  

模板值

-

可响应的栅格断点系统

-

Columns

-

Margins(px)

-

Gutters(px)

-

默认栅格

-

default

-

xs

-

2

-

12

-

12

-

sm

-

4

-

24

-

24

-

md

-

8

-

32

-

24

-

lg

-

12

-

48

-

24

-

宫格布局栅格

-

grid

-

sm(0<设备水平分辨率<600px)

-

4

-

24

-

12

-

md

-

8

-

32

-

12

-

lg

-

12

-

48

-

12

-
+## 样式 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 本章中px单位是在js标签中配置了autoDesignWidth为true。6+ +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: -## 样式 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| justify-content | string | flex-start | 否 | flex容器当前行的主轴对齐格式。可选项有:
- flex-start:项目位于容器的开头。
- flex-end:项目位于容器的结尾。
- center:项目位于容器的中心。
- space-between:项目位于各行之间留有空白的容器内。
- space-around:项目位于各行之前、之间、之后都留有空白的容器内。 | +| align-items | string | stretch | 否 | flex容器当前行的交叉轴对齐格式,可选值为:
- stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
- flex-start:元素向交叉轴起点对齐。
- flex-end:元素向交叉轴终点对齐。
- center:元素在交叉轴居中。 | +| align-content | string | flex-start | 否 | 交叉轴中有额外的空间时,多行内容对齐格式,可选值为:
- flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
- flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
- center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
- space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
- space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。 | -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
-

align-items

-

string

-

stretch

-

-

flex容器当前行的交叉轴对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
-

align-content

-

string

-

flex-start

-

-

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

-
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
-
+## 事件 -## 事件 +支持[通用事件](../arkui-js/js-components-common-events.md)。 -支持[通用事件](js-components-common-events.md)。 -## 方法 +## 方法 -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

getColumns

-

-

-

返回栅格容器列数

-

getColumnWidth

-

-

-

返回栅格容器column宽度

-

getGutterWidth

-

-

-

返回栅格容器gutter宽度

-

getSizeType

-

-

-

返回当前容器响应尺寸类型(xs|sm|md|lg)

-
+| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| getColumns | - | 返回栅格容器列数 | +| getColumnWidth | - | 返回栅格容器column宽度 | +| getGutterWidth | - | 返回栅格容器gutter宽度 | +| getSizeType | - | 返回当前容器响应尺寸类型(xs\|sm\|md\|lg) | -## 示例 -详见[grid-col示例](js-components-grid-col.md#section2021865273710)。 +## 示例 +详见[grid-col示例](../arkui-js/js-components-grid-col.md#示例)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-grid-row.md b/zh-cn/application-dev/reference/arkui-js/js-components-grid-row.md index 8e83bc573ee..ffd6bb56ea2 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-grid-row.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-grid-row.md @@ -1,98 +1,50 @@ -# grid-row +# grid-row + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 grid-row是栅格布局容器grid-container的子容器组件,使用flex横向布局,排列每个grid-col容器,justify-content与align-items默认为flex-start,支持折行显示。 -## 权限列表 +## 权限列表 无 -## 子组件 - -仅支持。 - -## 属性 - -支持[通用属性](js-components-common-attributes.md)。 - -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

flex-wrap

-

string

-

nowrap

-

-

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

-
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
-

align-items

-

string

-

flex-start

-

-

flex容器当前行的交叉轴对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
-

align-content

-

string

-

flex-start

-

-

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

-
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
-
- ->![](../../public_sys-resources/icon-note.gif) **说明:** ->不支持宽度相关样式。 - -## 事件 - -支持[通用事件](js-components-common-events.md)。 - -## 方法 - -支持[通用方法](js-components-common-methods.md)。 - -## 示例 - -详见[grid-col示例](js-components-grid-col.md#section2021865273710)。 +## 子组件 + +仅支持<grid-col>。 + + +## 属性 + +支持[通用属性](../arkui-js/js-components-common-attributes.md)。 + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| flex-wrap | string | nowrap | 否 | flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:
- nowrap:不换行,单行显示。
- wrap:换行,多行显示。 | +| justify-content | string | flex-start | 否 | flex容器当前行的主轴对齐格式。可选项有:
- flex-start:项目位于容器的开头。
- flex-end:项目位于容器的结尾。
- center:项目位于容器的中心。
- space-between:项目位于各行之间留有空白的容器内。
- space-around:项目位于各行之前、之间、之后都留有空白的容器内。 | +| align-items | string | flex-start | 否 | flex容器当前行的交叉轴对齐格式,可选值为:
- stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
- flex-start:元素向交叉轴起点对齐。
- flex-end:元素向交叉轴终点对齐。
- center:元素在交叉轴居中。 | +| align-content | string | flex-start | 否 | 交叉轴中有额外的空间时,多行内容对齐格式,可选值为:
- flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
- flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
- center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
- space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
- space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 不支持宽度相关样式。 + + +## 事件 + +支持[通用事件](../arkui-js/js-components-common-events.md)。 + + +## 方法 + +支持[通用方法](../arkui-js/js-components-common-methods.md)。 + + +## 示例 + +详见[grid-col示例](../arkui-js/js-components-grid-col.md#示例)。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-grid.md b/zh-cn/application-dev/reference/arkui-js/js-components-grid.md index f0657b7133f..03adf7973f4 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-grid.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-grid.md @@ -1,11 +1,11 @@ -# 栅格组件 +# 栅格组件 -- **[基本概念](js-components-grid-basic-concepts.md)** -- **[grid-container](js-components-grid-container.md)** -- **[grid-row](js-components-grid-row.md)** +- **[基本概念](js-components-grid-basic-concepts.md)** -- **[grid-col](js-components-grid-col.md)** +- **[grid-container](js-components-grid-container.md)** +- **[grid-row](js-components-grid-row.md)** +- **[grid-col](js-components-grid-col.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-media-video.md b/zh-cn/application-dev/reference/arkui-js/js-components-media-video.md index d026b711485..90071c93594 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-media-video.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-media-video.md @@ -1,236 +1,75 @@ -# video +# video -视频播放组件。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 需要在config.json配置 -> ``` -> "configChanges": ["orientation"] -> ``` +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> +> - 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - 需要在config.json配置 +> ``` +> "configChanges": ["orientation"] +> ``` + +视频播放组件。 -## 权限列表 -## 子组件 +## 子组件 不支持。 -## 属性 - -除支持[通用属性](js-components-common-attributes.md)外,还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

muted

-

boolean

-

false

-

-

视频是否静音播放。

-

src

-

string

-

-

-

-

播放视频内容的路径。

-

autoplay

-

boolean

-

false

-

-

视频是否自动播放。

-

controls

-

boolean

-

true

-

-

控制视频播放的控制栏是否显示,如果设置为false,则不显示控制栏。默认为true,由系统决定显示或隐藏控制栏。

-
- -## 样式 - -除支持[通用样式](js-components-common-styles.md)外,还支持如下样式: - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

object-fit

-

string

-

contain

-

-

视频源的缩放类型,如果poster设置了值,那么此配置还会影响视频海报的缩放类型,可选值参考表1

-
- -**表 1** object-fit 类型说明 - - - - - - - - - - -

类型

-

描述

-

fill

-

不保持宽高比进行放大缩小,使得图片填充满显示边界。

-
- -## 事件 - -除支持[通用事件](js-components-common-events.md)外,还支持如下事件: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

prepared

-

{ duration: value }5+

-

视频准备完成时触发该事件,通过duration可以获取视频时长,单位为s。

-

start

-

-

-

播放时触发该事件。

-

pause

-

-

-

暂停时触发该事件。

-

finish

-

-

-

播放结束时触发该事件。

-

error

-

-

-

播放失败时触发该事件。

-

seeking

-

{ currenttime: value }

-

操作进度条过程时上报时间信息,单位为s。

-

seeked

-

{ currenttime: value }

-

操作进度条完成后,上报播放时间信息,单位为s。

-

timeupdate

-

{ currenttime: value }

-

播放进度变化时触发该事件,单位为s,更新时间间隔为250ms。

-
- -## 方法 - -除支持[通用方法](js-components-common-methods.md)外,还支持如下方法: - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

start

-

-

-

请求播放视频。

-

pause

-

-

-

请求暂停播放视频。

-

setCurrentTime

-

{ currenttime: value }

-

指定视频播放的进度位置,单位为s。

-
- ->![](../../public_sys-resources/icon-note.gif) **说明:** ->在attached组件生命周期回调后,可以调用上述组件方法。 +## 属性 + +除支持[通用属性](../arkui-js/js-components-common-attributes.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| muted | boolean | false | 否 | 视频是否静音播放。 | +| src | string | - | 否 | 播放视频内容的路径。 | +| autoplay | boolean | false | 否 | 视频是否自动播放。 | +| controls | boolean | true | 否 | 控制视频播放的控制栏是否显示,如果设置为false,则不显示控制栏。默认为true,由系统决定显示或隐藏控制栏。 | + + +## 样式 + +除支持[通用样式](../arkui-js/js-components-common-styles.md)外,还支持如下样式: + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| object-fit | string | contain | 否 | 视频源的缩放类型,如果poster设置了值,那么此配置还会影响视频海报的缩放类型,可选值参考表 object-fit 类型说明。 | + +**表1** object-fit 类型说明 + +| 类型 | 描述 | +| -------- | -------- | +| fill | 不保持宽高比进行放大缩小,使得图片填充满显示边界。 | + + +## 事件 + +除支持[通用事件](../arkui-js/js-components-common-events.md)外,还支持如下事件: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| prepared | { duration: value }5+ | 视频准备完成时触发该事件,通过duration可以获取视频时长,单位为s。 | +| start | - | 播放时触发该事件。 | +| pause | - | 暂停时触发该事件。 | +| finish | - | 播放结束时触发该事件。 | +| error | - | 播放失败时触发该事件。 | +| seeking | { currenttime: value } | 操作进度条过程时上报时间信息,单位为s。 | +| seeked | { currenttime: value } | 操作进度条完成后,上报播放时间信息,单位为s。 | +| timeupdate | { currenttime: value } | 播放进度变化时触发该事件,单位为s,更新时间间隔为250ms。 | + + +## 方法 + +除支持[通用方法](../arkui-js/js-components-common-methods.md)外,还支持如下方法: + +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| start | - | 请求播放视频。 | +| pause | - | 请求暂停播放视频。 | +| setCurrentTime | { currenttime: value } | 指定视频播放的进度位置,单位为s。 | + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 在attached组件生命周期回调后,可以调用上述组件方法。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-media.md b/zh-cn/application-dev/reference/arkui-js/js-components-media.md index 3f561002ae7..ab7993298a0 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-media.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-media.md @@ -1,5 +1,5 @@ -# 媒体组件 +# 媒体组件 -- **[video](js-components-media-video.md)** +- **[video](js-components-media-video.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-animate.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-animate.md index b0d01e9f97f..0a9654cadd1 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-animate.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-animate.md @@ -1,198 +1,42 @@ -# animate +# animate -设置svg组件的属性动画。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +设置svg组件的属性动画。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

attributeName

-

string

-

-

-

-

设置需要进行动效的属性名。

-

begin

-

<time>

-

0

-

-

设置动效的延迟时间。

-

支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持

-

dur

-

<time>

-

0

-

-

设置动效持续时间,如果dur没设置,按照end-begin的结果作为持续时间,小于等于0时,动效不触发。

-

支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持

-

end

-

<time>

-

0

-

-

设置动效多久时间后结束。支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持

-

repeatCount

-

<number | indefinite>

-

1

-

-

设置动画播放的次数,默认无限次播放(indefinite),可通过设置为数值1仅播放一次。

-

fill

-

<freeze | remove>

-

remove

-

-

设置动画结束时的状态。

-

calcMode

-

<discrete | linear | paced | spline>

-

linear

-

-

设置动画的插值模式。

-

discrete:阶跃,from值直接跳转到to的值;

-

linear:线性;

-

paced:线性,设置此项后keyTimes和keyPoints值无效

-

spline:自定义贝塞尔曲线,spline点定义在keyTimes属性中,每个时间间隔控制点由keySplines定义

-

keyTimes

-

string

-

-

-

-

设置关键帧动画的开始时间,值为0~1之间的数值用分号隔开,比如0;0.3;0.8;1。keyTimes、keySplines、values组合设置关键帧动画。keyTimes和values的个数保持一致。keySplines个数为keyTimes个数减一

-

keySplines

-

string

-

-

-

-

与keyTimes相关联的一组贝塞尔控制点。定义每个关键帧的贝塞尔曲线,曲线之间用分号隔开。曲线内的两个控制掉格式为x1 y1 x2 y2。比如0.5 0 0.5 1; 0.5 0 0.5 1;0.5 0 0.5 1

-

by

-

number

-

-

-

-

在动画中对某一指定属性,添加相对偏移值,from默认为原属性值。

-

from

-

string

-

-

-

-

设置需要进行动画的属性的开始值。

-

如果已经设置了values属性,则from失效。

-

to

-

string

-

-

-

-

设置需要进行动画的属性的结束值。

-

如果已经设置了values属性,则to都失效。

-

values

-

string

-

-

-

-

设置一组动画的变化值。格式为value1;value2;value3。

-
+## 属性 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| attributeName | string | - | 否 | 设置需要进行动效的属性名。 | +| begin | <time> | 0 | 否 | 设置动效的延迟时间。
支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持 | +| dur | <time> | 0 | 否 | 设置动效持续时间,如果dur没设置,按照end-begin的结果作为持续时间,小于等于0时,动效不触发。
支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持 | +| end | <time> | 0 | 否 | 设置动效多久时间后结束。支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持 | +| repeatCount | <number \| indefinite> | 1 | 否 | 设置动画播放的次数,默认无限次播放(indefinite),可通过设置为数值1仅播放一次。 | +| fill | <freeze \| remove> | remove | 否 | 设置动画结束时的状态。 | +| calcMode | <discrete \| linear \| paced \| spline> | linear | 否 | 设置动画的插值模式。
discrete:阶跃,from值直接跳转到to的值;
linear:线性;
paced:线性,设置此项后keyTimes和keyPoints值无效
spline:自定义贝塞尔曲线,spline点定义在keyTimes属性中,每个时间间隔控制点由keySplines定义 | +| keyTimes | string | - | 否 | 设置关键帧动画的开始时间,值为0~1之间的数值用分号隔开,比如0;0.3;0.8;1。keyTimes、keySplines、values组合设置关键帧动画。keyTimes和values的个数保持一致。keySplines个数为keyTimes个数减一 | +| keySplines | string | - | 否 | 与keyTimes相关联的一组贝塞尔控制点。定义每个关键帧的贝塞尔曲线,曲线之间用分号隔开。曲线内的两个控制掉格式为x1 y1 x2 y2。比如0.5 0 0.5 1; 0.5 0 0.5 1;0.5 0 0.5 1 | +| by | number | - | 否 | 在动画中对某一指定属性,添加相对偏移值,from默认为原属性值。 | +| from | string | - | 否 | 设置需要进行动画的属性的开始值。
如果已经设置了values属性,则from失效。 | +| to | string | - | 否 | 设置需要进行动画的属性的结束值。
如果已经设置了values属性,则to都失效。 | +| values | string | - | 否 | 设置一组动画的变化值。格式为value1;value2;value3。 | + -## 示例 +## 示例 ``` @@ -206,7 +50,9 @@ ``` -![](figures/animate-1.gif) + +![zh-cn_image_0000001173324703](figures/zh-cn_image_0000001173324703.gif) + ``` @@ -220,7 +66,9 @@ ``` -![](figures/1-3.gif) + +![zh-cn_image_0000001167662852](figures/zh-cn_image_0000001167662852.gif) + ``` @@ -233,7 +81,9 @@ ``` -![](figures/animate-3.gif) + +![zh-cn_image_0000001127284938](figures/zh-cn_image_0000001127284938.gif) + ``` @@ -265,5 +115,5 @@ ``` -![](figures/animate-4.gif) +![zh-cn_image_0000001127125126](figures/zh-cn_image_0000001127125126.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatemotion.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatemotion.md index ddb8f30d578..0c6874915cd 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatemotion.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatemotion.md @@ -1,71 +1,33 @@ -# animateMotion +# animateMotion -路径动效。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +路径动效。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 - -支持animate属性\(values不生效\)和以下表格中的属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

keyPoints

-

string

-

-

-

-

一组关键帧的点位置,每帧的值为对象沿路径的距离比例。功能与animate属性中的values相同。

-

path

-

string

-

-

-

-

定义运动的路径,使用与path组件d属性相同的语法。

-

rotate

-

[auto | auto-reverse | <number>]

-

auto

-

-

-

设置动画对象的旋转方向

-
- -## 示例 + +## 属性 + +支持animate属性(values不生效)和以下表格中的属性。 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| keyPoints | string | - | 是 | 一组关键帧的点位置,每帧的值为对象沿路径的距离比例。功能与animate属性中的values相同。 | +| path | string | - | 是 | 定义运动的路径,使用与path组件d属性相同的语法。 | +| rotate | [auto \| auto-reverse \| <number>] | auto | - | 设置动画对象的旋转方向 | + + +## 示例 ``` @@ -89,5 +51,5 @@ ``` -![](figures/2-4.gif) +![zh-cn_image_0000001213381209](figures/zh-cn_image_0000001213381209.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatetransform.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatetransform.md index 47f29efe330..cae336c9b05 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatetransform.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-animatetransform.md @@ -1,51 +1,34 @@ -# animateTransform +# animateTransform + + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 transform动效,支持的组件范围: -, , , , , , , ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +<circle>, <ellipse>, <line>, <path>, <polygon>, <polyline>, <rect>, <text> -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 不支持。 -## 属性 + +## 属性 支持animate属性和以下表格中的属性。 - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

[translate | scale | rotate | skewX | skewY]

-

-

-

-

设置transform动画的类型

-
- -## 示例 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| type | [translate \| scale \| rotate \| skewX \| skewY] | - | 是 | 设置transform动画的类型 | + + +## 示例 ``` @@ -106,10 +89,13 @@ transform动效,支持的组件范围: } ``` -![](figures/animate-transform.gif) + +![zh-cn_image_0000001127285004](figures/zh-cn_image_0000001127285004.gif) + 动画叠加 + ```
@@ -144,6 +130,7 @@ transform动效,支持的组件范围:
``` + ``` /* xxx.css */ .container { @@ -161,10 +148,13 @@ transform动效,支持的组件范围: } ``` -![](figures/animate-transform2.gif) + +![zh-cn_image_0000001127125192](figures/zh-cn_image_0000001127125192.gif) + 涉及组件示例 + ```
@@ -211,6 +201,7 @@ transform动效,支持的组件范围:
``` + ``` /* xxx.css */ .container { @@ -228,5 +219,6 @@ transform动效,支持的组件范围: } ``` -![](figures/animate-transform3.gif) + +![zh-cn_image_0000001173324765](figures/zh-cn_image_0000001173324765.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-circle.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-circle.md index ddbd7afe877..7ee5c552aa7 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-circle.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-circle.md @@ -1,82 +1,34 @@ -# circle +# circle -圆形形状。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +圆形形状。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持animate、animateMotion、animateTransform。 -## 属性 - -支持Svg组件[通用属性](js-components-svg-common-attributes.md)和以下属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

cx

-

<length>|<percentage>

-

0

-

-

设置圆心的x轴坐标。支持属性动画

-

cy

-

<length>|<percentage>

-

0

-

-

设置圆心的y轴坐标。支持属性动画

-

r

-

<length>|<percentage>

-

0

-

-

设置圆的半径。支持属性动画

-
- -## 示例 + +## 属性 + +支持Svg组件[通用属性](../arkui-js/js-components-svg-common-attributes.md)和以下属性。 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| cx | <length>\|<percentage> | 0 | 否 | 设置圆心的x轴坐标。支持属性动画。 | +| cy | <length>\|<percentage> | 0 | 否 | 设置圆心的y轴坐标。支持属性动画。 | +| r | <length>\|<percentage> | 0 | 否 | 设置圆的半径。支持属性动画。 | + + +## 示例 ``` @@ -88,5 +40,5 @@ ``` -![](figures/zh-cn_image_0000001173164853.png) +![zh-cn_image_0000001173164853](figures/zh-cn_image_0000001173164853.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-common-attributes.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-common-attributes.md index 83a90a2823b..4a07df76614 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-common-attributes.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-common-attributes.md @@ -1,175 +1,21 @@ -# 通用属性 +# 通用属性 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

fill

-

<color>

-

black

-

-

使用简写属性设置元素的填充色。支持属性动画。

-

fill-opacity

-

number

-

1

-

-

填充色的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

-

fill-rule

-

nonzero | evenodd

-

nonzero

-

-

nonzero:非零规则; evenodd:奇偶规则

-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

-

stroke

-

<color>

-

-

-

-

设置形状轮廓的颜色。支持属性动画。

-

stroke-dasharray

-

<string>

-

-

-

-

指定短划线和缺口的长度。格式为[length length length length],短划线和缺口的长度中间空格隔开成对出现。

-

stroke-dashoffset

-

<length>

-

0

-

-

设置关联虚线数组渲染时的偏移量。支持属性动画

-

stroke-linejoin

-

[bevel | miter | round]

-

miter

-

-

进行描边时在路径的拐角处使用的形状。

-

bevel:使用斜角连接路径段;

-

miter:使用尖角连接路径段;

-

round:使用圆角连接路径段。

-

stroke-linecap

-

[butt | round | square]

-

butt

-

-

路径描边时在它们的结尾处使用的形状。

-

butt:不在路径两端扩展;

-

round:在路径的末端延伸半个圆,直径等于线度。

-

square:在路径的末端延伸半个圆,宽度等于线宽的一半,高度等于线宽。

-

stroke-miterlimit

-

number

-

4

-

-

设置将锐角绘制成斜角的极限值。支持属性动画

-

stroke-opacity

-

number

-

1

-

-

轮廓线条的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画

-

stroke-width

-

<length>

-

1px

-

-

设置轮廓线条的宽度。支持属性动画

-

transform

-

<string>

-

-

-

-

设置组件以及子组件的坐标变换参数。

-

支持以下格式:

-

translate(<x> [<y>]) :沿x[y]轴方向平移

-

scale(<x> [<y>]) :沿x[y]轴缩放

-

rotate(<a> [<x> <y>]) :以(x,y)点进行旋转a度角

-

skewX(<a>) :沿x轴倾斜a度角的变换

-

skewY(<a>) :沿y轴倾斜a度角的变换

-
+| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| fill | <color> | black | 否 | 使用简写属性设置元素的填充色。支持属性动画。 | +| fill-opacity | number | 1 | 否 | 填充色的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。 | +| fill-rule | nonzero \| evenodd | nonzero | 否 | nonzero:非零规则; evenodd:奇偶规则 | +| opacity | number | 1 | 否 | 元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。 | +| stroke | <color> | - | 否 | 设置形状轮廓的颜色。支持属性动画。 | +| stroke-dasharray | <string> | - | 否 | 指定短划线和缺口的长度。格式为[length length length length],短划线和缺口的长度中间空格隔开成对出现。 | +| stroke-dashoffset | <length> | 0 | 否 | 设置关联虚线数组渲染时的偏移量。支持属性动画 | +| stroke-linejoin | [bevel \| miter \| round] | miter | 否 | 进行描边时在路径的拐角处使用的形状。
bevel:使用斜角连接路径段;
miter:使用尖角连接路径段;
round:使用圆角连接路径段。 | +| stroke-linecap | [butt \| round \| square] | butt | 否 | 路径描边时在它们的结尾处使用的形状。
butt:不在路径两端扩展;
round:在路径的末端延伸半个圆,直径等于线度。
square:在路径的末端延伸半个圆,宽度等于线宽的一半,高度等于线宽。 | +| stroke-miterlimit | number | 4 | 否 | 设置将锐角绘制成斜角的极限值。支持属性动画 | +| stroke-opacity | number | 1 | 否 | 轮廓线条的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画 | +| stroke-width | <length> | 1px | 否 | 设置轮廓线条的宽度。支持属性动画 | +| transform | <string> | - | 否 | 设置组件以及子组件的坐标变换参数。
支持以下格式:
translate(<x> [<y>]) :沿x[y]轴方向平移
scale(<x> [<y>]) :沿x[y]轴缩放
rotate(<a> [<x> <y>]) :以(x,y)点进行旋转a度角
skewX(<a>) :沿x轴倾斜a度角的变换
skewY(<a>) :沿y轴倾斜a度角的变换 | diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-ellipse.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-ellipse.md index 46fd26dd93f..9c69504f6a8 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-ellipse.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-ellipse.md @@ -1,93 +1,35 @@ -# ellipse +# ellipse -椭圆形状。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +椭圆形状。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持animate、animateMotion、animateTransform。 -## 属性 - -支持Svg组件[通用属性](js-components-svg-common-attributes.md)和以下属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

cx

-

<length>|<percentage>

-

0

-

-

设置椭圆的x轴坐标。支持属性动画

-

cy

-

<length>|<percentage>

-

0

-

-

设置椭圆的y轴坐标。支持属性动画

-

rx

-

<length>|<percentage>

-

0

-

-

设置椭圆x轴的半径。支持属性动画

-

ry

-

<length>|<percentage>

-

0

-

-

设置椭圆y轴的半径。支持属性动画

-
- -## 示例 + +## 属性 + +支持Svg组件[通用属性](../arkui-js/js-components-svg-common-attributes.md)和以下属性。 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| cx | <length>\|<percentage> | 0 | 否 | 设置椭圆的x轴坐标。支持属性动画 | +| cy | <length>\|<percentage> | 0 | 否 | 设置椭圆的y轴坐标。支持属性动画 | +| rx | <length>\|<percentage> | 0 | 否 | 设置椭圆x轴的半径。支持属性动画 | +| ry | <length>\|<percentage> | 0 | 否 | 设置椭圆y轴的半径。支持属性动画 | + + +## 示例 ``` @@ -99,5 +41,5 @@ ``` -![](figures/zh-cn_image_0000001173164793.png) +![zh-cn_image_0000001173164793](figures/zh-cn_image_0000001173164793.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-line.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-line.md index 78b0f4c506e..ae898c10942 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-line.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-line.md @@ -1,93 +1,35 @@ -# line +# line -绘制线条。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +绘制线条。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持animate、animateMotion、animateTransform。 -## 属性 + +## 属性 支持所列的Svg组件通用属性和以下表格的属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

x1

-

<length>|<percentage>

-

-

-

-

设置线条起点的x轴坐标。支持属性动画

-

y1

-

<length>|<percentage>

-

-

-

-

设置线条起点的y轴坐标。支持属性动画

-

x2

-

<length>|<percentage>

-

-

-

-

设置线条终点的x轴坐标。支持属性动画

-

y2

-

<length>|<percentage>

-

-

-

-

设置线条终点的y轴坐标。支持属性动画

-
- -## 示例 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| x1 | <length>\|<percentage> | - | 否 | 设置线条起点的x轴坐标。支持属性动画。 | +| y1 | <length>\|<percentage> | - | 否 | 设置线条起点的y轴坐标。支持属性动画。 | +| x2 | <length>\|<percentage> | - | 否 | 设置线条终点的x轴坐标。支持属性动画。 | +| y2 | <length>\|<percentage> | - | 否 | 设置线条终点的y轴坐标。支持属性动画。 | + + +## 示例 ``` @@ -103,5 +45,5 @@ ``` -![](figures/zh-cn_image_0000001127284954.png) +![zh-cn_image_0000001127284954](figures/zh-cn_image_0000001127284954.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-path.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-path.md index 287f8897618..ba7ba55af69 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-path.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-path.md @@ -1,62 +1,32 @@ -# path +# path -绘制路径。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +绘制路径。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持animate、animateMotion、animateTransform。 -## 属性 - -支持Svg组件[通用属性](js-components-svg-common-attributes.md)和以下属性,设置的通用属性会传递给子组件。 - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

d

-

string

-

-

-

-

设置路径的形状。包含一组字符指令,大写字母为绝对路径,小写字符为相对路径。

-

字母指令表示的意义如下:

-
  • M/m = moveto
  • L/l = lineto
  • H/h = horizontal lineto
  • V/v = vertical lineto
  • C/c = curveto
  • S/s = smooth curveto
  • Q/q = quadratic Belzier curve
  • T/t = smooth quadratic Belzier curveto
  • A/a = elliptical Arc
  • Z/z = closepath
-
- -## 示例 + +## 属性 + +支持Svg组件[通用属性](../arkui-js/js-components-svg-common-attributes.md)和以下属性,设置的通用属性会传递给子组件。 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| d | string | - | 否 | 设置路径的形状。包含一组字符指令,大写字母为绝对路径,小写字符为相对路径。
字母指令表示的意义如下:
- M/m = moveto
- L/l = lineto
- H/h = horizontal lineto
- V/v = vertical lineto
- C/c = curveto
- S/s = smooth curveto
- Q/q = quadratic Belzier curve
- T/t = smooth quadratic Belzier curveto
- A/a = elliptical Arc
- Z/z = closepath | + + +## 示例 ``` @@ -69,5 +39,5 @@ ``` -![](figures/zh-cn_image_0000001173164891.png) +![zh-cn_image_0000001173164891](figures/zh-cn_image_0000001173164891.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-polygon.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-polygon.md index edd2d806a4d..1f4c4870bad 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-polygon.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-polygon.md @@ -1,62 +1,32 @@ -# polygon +# polygon -绘制多边形。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +绘制多边形。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持animate、animateMotion、animateTransform。 -## 属性 - -支持Svg组件[通用属性](js-components-svg-common-attributes.md)和以下属性。 - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

points

-

string

-

-

-

-

设置多边形的多个坐标点

-

格式为[x1,y1 x2,y2 x3,y3]。

-

支持属性动画,如果属性动画里设置的动效变化值的坐标个数与原始points的格式不一样,则无效

-
- -## 示例 + +## 属性 + +支持Svg组件[通用属性](../arkui-js/js-components-svg-common-attributes.md)和以下属性。 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| points | string | - | 否 | 设置多边形的多个坐标点
格式为[x1,y1 x2,y2 x3,y3]。
支持属性动画,如果属性动画里设置的动效变化值的坐标个数与原始points的格式不一样,则无效 | + + +## 示例 ``` @@ -68,5 +38,5 @@ ``` -![](figures/zh-cn_image_0000001173324721.png) +![zh-cn_image_0000001173324721](figures/zh-cn_image_0000001173324721.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-polyline.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-polyline.md index 1d34290e28c..4b39e2e6192 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-polyline.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-polyline.md @@ -1,62 +1,32 @@ -# polyline +# polyline -绘制折线。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +绘制折线。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持animate、animateMotion、animateTransform。 -## 属性 + +## 属性 支持所列的Svg组件通用属性和以下表格的属性。 - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

points

-

string

-

-

-

-

设置折线的多个坐标点

-

格式为[x1,y1 x2,y2 x3,y3]。

-

支持属性动画,如果属性动画里设置的动效变化值的坐标个数与原始points的格式不一样,则无效

-
- -## 示例 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| points | string | - | 否 | 设置折线的多个坐标点
格式为[x1,y1 x2,y2 x3,y3]。
支持属性动画,如果属性动画里设置的动效变化值的坐标个数与原始points的格式不一样,则无效 | + + +## 示例 ``` @@ -68,5 +38,5 @@ ``` -![](figures/zh-cn_image_0000001173164845.png) +![zh-cn_image_0000001173164845](figures/zh-cn_image_0000001173164845.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-rect.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-rect.md index 06b2c9bf17b..5acb102656d 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-rect.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-rect.md @@ -1,115 +1,37 @@ -# rect +# rect -用于绘制矩形、圆角矩形。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +用于绘制矩形、圆角矩形。 -## 权限列表 +## 权限列表 无 -## 子组件 + +## 子组件 支持animate、animateMotion、animateTransform。 -## 属性 - -支持Svg组件[通用属性](js-components-svg-common-attributes.md)和以下属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

width

-

<length>|<percentage>

-

0

-

-

设置矩形的宽度。支持属性动画

-

height

-

<length>|<percentage>

-

0

-

-

设置矩形的高度。支持属性动画

-

x

-

<length>|<percentage>

-

0

-

-

设置矩形左上角x轴坐标。支持属性动画

-

y

-

<length>|<percentage>

-

0

-

-

设置矩形左上角y轴坐标。支持属性动画

-

rx

-

<length>|<percentage>

-

0

-

-

设置矩形圆角x方向半径。支持属性动画

-

ry

-

<length>|<percentage>

-

0

-

-

设置矩形圆角y方向半径。支持属性动画

-
- -## 示例 + +## 属性 + +支持Svg组件[通用属性](../arkui-js/js-components-svg-common-attributes.md)和以下属性。 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| width | <length>\|<percentage> | 0 | 否 | 设置矩形的宽度。支持属性动画 | +| height | <length>\|<percentage> | 0 | 否 | 设置矩形的高度。支持属性动画 | +| x | <length>\|<percentage> | 0 | 否 | 设置矩形左上角x轴坐标。支持属性动画 | +| y | <length>\|<percentage> | 0 | 否 | 设置矩形左上角y轴坐标。支持属性动画 | +| rx | <length>\|<percentage> | 0 | 否 | 设置矩形圆角x方向半径。支持属性动画 | +| ry | <length>\|<percentage> | 0 | 否 | 设置矩形圆角y方向半径。支持属性动画 | + + +## 示例 ``` @@ -124,5 +46,5 @@ ``` -![](figures/0.png) +![zh-cn_image_0000001212053183](figures/zh-cn_image_0000001212053183.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-text.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-text.md index 778a5a80b4f..34b96424911 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-text.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-text.md @@ -1,184 +1,49 @@ -# text +# text 文本,用于呈现一段信息。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ->- 文本的展示内容需要写在元素标签内,可嵌套tspan子元素标签分段,可嵌套textPath子元素标签按指定路径绘制。 ->- 只支持被父元素标签svg嵌套。 ->- 只支持默认字体sans-serif。 -## 权限列表 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - 文本的展示内容需要写在元素标签内,可嵌套tspan子元素标签分段,可嵌套textPath子元素标签按指定路径绘制。 +> +> - 只支持被父元素标签svg嵌套。 +> +> - 只支持默认字体sans-serif。 + +## 权限列表 无 -## 子组件 + +## 子组件 支持tspan、textpath、animate、animateTransform。 -## 属性 -支持以下表格中的属性。 +## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

x

-

<length>|<percentage>

-

0

-

-

设置组件左上角x轴坐标

-

y

-

<length>|<percentage>

-

0

-

-

设置组件左上角y轴坐标

-

dx

-

<length>|<percentage>

-

0

-

-

设置文本x轴偏移

-

dy

-

<length>|<percentage>

-

0

-

-

设置文本y轴偏移

-

rotate

-

number

-

0

-

-

字体以左下角为圆心旋转角度,正数顺时针,负数逆时针

-

font-size

-

<length>

-

30px

-

-

设置文本的尺寸。

-

fill

-

<color>

-

black

-

-

字体填充颜色

-

fill-opacity

-

number

-

1.0

-

-

字体填充透明度

-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

-

stroke

-

<color>

-

black

-

-

绘制字体边框并指定颜色

-

stroke-width

-

number

-

1px

-

-

字体边框宽度

-

stroke-opacity

-

number

-

1.0

-

-

字体边框透明度

-
+支持以下表格中的属性。 -## 示例 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| x | <length>\|<percentage> | 0 | 否 | 设置组件左上角x轴坐标 | +| y | <length>\|<percentage> | 0 | 否 | 设置组件左上角y轴坐标 | +| dx | <length>\|<percentage> | 0 | 否 | 设置文本x轴偏移 | +| dy | <length>\|<percentage> | 0 | 否 | 设置文本y轴偏移 | +| rotate | number | 0 | 否 | 字体以左下角为圆心旋转角度,正数顺时针,负数逆时针 | +| font-size | <length> | 30px | 否 | 设置文本的尺寸。 | +| fill | <color> | black | 否 | 字体填充颜色 | +| fill-opacity | number | 1.0 | 否 | 字体填充透明度 | +| opacity | number | 1 | 否 | 元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。 | +| stroke | <color> | black | 否 | 绘制字体边框并指定颜色 | +| stroke-width | number | 1px | 否 | 字体边框宽度 | +| stroke-opacity | number | 1.0 | 否 | 字体边框透明度 | + + +## 示例 ``` /* xxx.css */ @@ -209,7 +74,7 @@ ``` -![](figures/text-part1.png) +![zh-cn_image_0000001173324697](figures/zh-cn_image_0000001173324697.png) 属性动画示例 @@ -238,7 +103,7 @@ ``` -![](figures/text-animate-part1.gif) +![zh-cn_image_0000001173324699](figures/zh-cn_image_0000001173324699.gif) ``` @@ -253,7 +118,7 @@ ``` -![](figures/text-animate-part2.gif) +![zh-cn_image_0000001173164783](figures/zh-cn_image_0000001173164783.gif) ``` @@ -272,5 +137,4 @@ ``` -![](figures/text-animate-part3.gif) - +![zh-cn_image_0000001127125122](figures/zh-cn_image_0000001127125122.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-textpath.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-textpath.md index 083819fcf94..eb9ffb6b56a 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-textpath.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-textpath.md @@ -1,165 +1,49 @@ -# textPath +# textPath 沿路径绘制文本。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ->- 按指定的路径绘制文本,可嵌套子标签tspan分段。 ->- 只支持被父元素标签text嵌套。 -## 权限列表 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - 按指定的路径绘制文本,可嵌套子标签tspan分段。 +> +> - 只支持被父元素标签text嵌套。 + +## 权限列表 无 -## 子组件 + +## 子组件 tspan。 -## 属性 + +## 属性 + 支持以下表格中的属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

path

-

string

-

0

-

-

设置路径的形状。

-

字母指令表示的意义如下:

-
  • M = moveto
  • L = lineto
  • H = horizontal lineto
  • V = vertical lineto
  • C = curveto
  • S = smooth curveto
  • Q = quadratic Belzier curve
  • T = smooth quadratic Belzier curveto
  • A = elliptical Arc
  • Z = closepath
-

startOffset

-

<length>|<percentage>

-

0

-

-

设置文本沿path绘制的起始偏移。

-

font-size

-

<length>

-

30px

-

-

设置文本的尺寸。

-

fill

-

<color>

-

black

-

-

字体填充颜色

-

by

-

number

-

-

-

-

相对被指定动画的属性偏移值,from默认为原属性值。

-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

-

fill-opacity

-

number

-

1.0

-

-

字体填充透明度

-

stroke

-

<color>

-

black

-

-

绘制字体边框并指定颜色

-

stroke-width

-

number

-

1px

-

-

字体边框宽度

-

stroke-opacity

-

number

-

1.0

-

-

字体边框透明度

-
- -## 示例 - -textspan属性示例,textpath文本内容沿着属性path中的路径绘制文本,起点偏移20%的path长度。(绘制的元素曲线仅做参照) + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| path | string | 0 | 是 | 设置路径的形状。
字母指令表示的意义如下:
- M = moveto
- L = lineto
- H = horizontal lineto
- V = vertical lineto
- C = curveto
- S = smooth curveto
- Q = quadratic Belzier curve
- T = smooth quadratic Belzier curveto
- A = elliptical Arc
- Z = closepath | +| startOffset | <length>\|<percentage> | 0 | 否 | 设置文本沿path绘制的起始偏移。 | +| font-size | <length> | 30px | 否 | 设置文本的尺寸。 | +| fill | <color> | black | 否 | 字体填充颜色 | +| by | number | - | 否 | 相对被指定动画的属性偏移值,from默认为原属性值。 | +| opacity | number | 1 | 否 | 元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。 | +| fill-opacity | number | 1.0 | 否 | 字体填充透明度 | +| stroke | <color> | black | 否 | 绘制字体边框并指定颜色 | +| stroke-width | number | 1px | 否 | 字体边框宽度 | +| stroke-opacity | number | 1.0 | 否 | 字体边框透明度 | + + +## 示例 + +textspan属性示例,textpath文本内容沿着属性path中的路径绘制文本,起点偏移20%的path长度。(绘制的元素<path>曲线仅做参照) ``` /* xxx.css */ @@ -186,7 +70,7 @@ textspan属性示例,textpath文本内容沿着属性path中的路径绘制文 ``` -![](figures/textPath-part1.png) +![zh-cn_image_0000001173164775](figures/zh-cn_image_0000001173164775.png) textpath与tspan组合示例与效果图 @@ -206,7 +90,7 @@ textpath与tspan组合示例与效果图 ``` -![](figures/textPath-part2.png) +![zh-cn_image_0000001173324691](figures/zh-cn_image_0000001173324691.png) ``` @@ -226,7 +110,7 @@ textpath与tspan组合示例与效果图 ``` -![](figures/textPath-part3.png) +![zh-cn_image_0000001173324689](figures/zh-cn_image_0000001173324689.png) ``` @@ -247,7 +131,7 @@ textpath与tspan组合示例与效果图 ``` -![](figures/textPath-part4.png) +![zh-cn_image_0000001127284930](figures/zh-cn_image_0000001127284930.png) startOffset属性动画,文本绘制时起点偏移从10%运动到40%,不绘制超出path长度范围的文本。 @@ -279,7 +163,7 @@ startOffset属性动画,文本绘制时起点偏移从10%运动到40%,不绘 ``` -![](figures/textpath-animate1.gif) +![zh-cn_image_0000001127125118](figures/zh-cn_image_0000001127125118.gif) textpath与tspan组合属性动画与效果图 @@ -310,13 +194,13 @@ textpath与tspan组合属性动画与效果图 ``` -![](figures/textpath-animate2.gif) +![zh-cn_image_0000001173324693](figures/zh-cn_image_0000001173324693.gif) -\(1\) "tspan attribute x|rotate" 文本绘制起点偏移从50px运动到100px,顺时针旋转0度到360度。 +(1) "tspan attribute x|rotate" 文本绘制起点偏移从50px运动到100px,顺时针旋转0度到360度。 -\(2\) "tspan attribute dx|opacity" 在 "tspan static." 绘制结束后再开始绘制,向后偏移量从0%运动到30%,透明度从浅到深变化。 +(2) "tspan attribute dx|opacity" 在 "tspan static." 绘制结束后再开始绘制,向后偏移量从0%运动到30%,透明度从浅到深变化。 -\(3\) "tspan move" 在上一段tspan绘制完成后,向后偏移5%的距离进行绘制,呈现跟随前一段tspan运动的效果。 +(3) "tspan move" 在上一段tspan绘制完成后,向后偏移5%的距离进行绘制,呈现跟随前一段tspan运动的效果。 textpath与tspan组合属性动画与效果图 @@ -346,15 +230,15 @@ textpath与tspan组合属性动画与效果图 ``` -![](figures/textpath-animate3.gif) +![zh-cn_image_0000001173164779](figures/zh-cn_image_0000001173164779.gif) -\(1\) "This is TextPath." 在path上无偏移绘制第一段文本内容,大小30px,颜色"\#D2691E"。 +(1) "This is TextPath." 在path上无偏移绘制第一段文本内容,大小30px,颜色"\#D2691E"。 -\(2\) "tspan attribute fill|fill-opacity" 相对上一段文本结束后偏移20px,颜色从蓝到红,透明度从浅到深。 +(2) "tspan attribute fill|fill-opacity" 相对上一段文本结束后偏移20px,颜色从蓝到红,透明度从浅到深。 -\(3\) "tspan attribute font-size" 绘制起点相对上一段结束后偏移20px,起点静止,字体大小从10px到50px,整体长度持续拉长。 +(3) "tspan attribute font-size" 绘制起点相对上一段结束后偏移20px,起点静止,字体大小从10px到50px,整体长度持续拉长。 -\(4\) "Single tspan" 在上一段的尾部做水平绘制,呈现跟随上一段运动的效果。 +(4) "Single tspan" 在上一段的尾部做水平绘制,呈现跟随上一段运动的效果。 textpath与tspan组合属性动画与效果图 @@ -383,9 +267,8 @@ textpath与tspan组合属性动画与效果图 ``` -![](figures/textpath-animate4.gif) - -\(1\) "tspan attribute stroke" 轮廓颜色从红色逐渐转变成绿色。 +![zh-cn_image_0000001127284924](figures/zh-cn_image_0000001127284924.gif) -\(2\) "tspan attribute stroke-width-opacity" 轮廓宽度从细1px转变粗5px,透明度从浅到深。 +(1) "tspan attribute stroke" 轮廓颜色从红色逐渐转变成绿色。 +(2) "tspan attribute stroke-width-opacity" 轮廓宽度从细1px转变粗5px,透明度从浅到深。 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg-tspan.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg-tspan.md index c8991502709..0a1cb24abbc 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg-tspan.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg-tspan.md @@ -1,179 +1,46 @@ -# tspan +# tspan ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ->- 文本的展示内容需要写在元素标签内,可嵌套子元素标签tspan分段。 ->- 文本分段,只支持被父元素标签svg嵌套。 +添加文本样式。 -## 权限列表 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - 文本的展示内容需要写在元素标签内,可嵌套子元素标签tspan分段。 +> +> - 文本分段,只支持被父元素标签svg嵌套。 + +## 权限列表 无 -## 子组件 + +## 子组件 支持tspan。 + 支持以下表格中的属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

x

-

<length>|<percentage>

-

0

-

-

设置组件左上角x轴坐标

-

y

-

<length>|<percentage>

-

0

-

-

设置组件左上角y轴坐标。作为textpath子组件时失效。

-

dx

-

<length>|<percentage>

-

0

-

-

设置文本x轴偏移

-

dy

-

<length>|<percentage>

-

0

-

-

设置文本y轴偏移。作为textpath子组件时失效。

-

rotate

-

number

-

0

-

-

字体以左下角为圆心旋转角度,正数顺时针,负数逆时针

-

font-size

-

<length>

-

30px

-

-

设置文本的尺寸。

-

fill

-

<color>

-

black

-

-

字体填充颜色

-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

-

fill-opacity

-

number

-

1.0

-

-

字体填充透明度

-

stroke

-

<color>

-

black

-

-

绘制字体边框并指定颜色

-

stroke-width

-

number

-

1px

-

-

字体边框宽度

-

stroke-opacity

-

number

-

1.0

-

-

字体边框透明度

-
-## 示例 +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| x | <length>\|<percentage> | 0 | 否 | 设置组件左上角x轴坐标。 | +| y | <length>\|<percentage> | 0 | 否 | 设置组件左上角y轴坐标。作为textpath子组件时失效。 | +| dx | <length>\|<percentage> | 0 | 否 | 设置文本x轴偏移。 | +| dy | <length>\|<percentage> | 0 | 否 | 设置文本y轴偏移。作为textpath子组件时失效。 | +| rotate | number | 0 | 否 | 字体以左下角为圆心旋转角度,正数顺时针,负数逆时针。 | +| font-size | <length> | 30px | 否 | 设置文本的尺寸。 | +| fill | <color> | black | 否 | 字体填充颜色。 | +| opacity | number | 1 | 否 | 元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。 | +| fill-opacity | number | 1.0 | 否 | 字体填充透明度。 | +| stroke | <color> | black | 否 | 绘制字体边框并指定颜色。 | +| stroke-width | number | 1px | 否 | 字体边框宽度。 | +| stroke-opacity | number | 1.0 | 否 | 字体边框透明度。 | + + +## 示例 ``` /* xxx.css */ @@ -206,7 +73,7 @@ ``` -![](figures/tspan-part1.png) +![zh-cn_image_0000001127125196](figures/zh-cn_image_0000001127125196.png) 属性动画示例 @@ -244,7 +111,7 @@ ``` -![](figures/tspan-animate-part1.gif) +![zh-cn_image_0000001127285008](figures/zh-cn_image_0000001127285008.gif) ``` @@ -261,7 +128,7 @@ ``` -![](figures/tspan-animate-part2.gif) +![zh-cn_image_0000001127125198](figures/zh-cn_image_0000001127125198.gif) ``` @@ -277,7 +144,7 @@ ``` -![](figures/tspan-animate-part3.gif) +![zh-cn_image_0000001173164863](figures/zh-cn_image_0000001173164863.gif) ``` @@ -300,5 +167,4 @@ ``` -![](figures/tspan-animate-part4.gif) - +![zh-cn_image_0000001127125200](figures/zh-cn_image_0000001127125200.gif) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-svg.md b/zh-cn/application-dev/reference/arkui-js/js-components-svg.md index 261829752b5..85eeaf0f798 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-svg.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-svg.md @@ -1,104 +1,38 @@ -# svg +# svg 基础容器,主要作为svg的根节点使用,也可以在svg中嵌套使用。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->- 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ->- svg父组件或者svg组件需要定义宽高值,否则不进行绘制。 -## 权限列表 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +> +> - svg父组件或者svg组件需要定义宽高值,否则不进行绘制。 + +## 权限列表 无 -## 子组件 + +## 子组件 支持svg、rect、circle、ellipse、path、line、polygon、polyline、text、animate、animateTransform。 -## 属性 - -支持Svg组件[通用属性](js-components-svg-common-attributes.md)和以下属性,设置的通用属性会传递给子组件。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

width

-

<length>|<percentage>

-

-

-

-

设置组件的宽度

-

height

-

<length>|<percentage>

-

-

-

-

设置组件的高度

-

x

-

<length>|<percentage>

-

-

-

-

设置当前svg的x轴坐标,根svg节点无效

-

y

-

<length>|<percentage>

-
  

-

设置当前svg的y轴坐标,根svg节点无效

-

viewBox

-

string

-

-

-

-

设置当前svg的视口。支持的格式为<number number number number>,4个参数分别表示min-x, min-y, width and height,viewBox的宽高和svg的宽高不一致,会以中心对齐进行缩放。

-
- -## 示例 + +## 属性 + +支持Svg组件[通用属性](../arkui-js/js-components-svg-common-attributes.md)和以下属性,设置的通用属性会传递给子组件。 + +| 名称 | 类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| id | string | - | 否 | 组件的唯一标识。 | +| width | <length>\|<percentage> | - | 否 | 设置组件的宽度。 | +| height | <length>\|<percentage> | - | 否 | 设置组件的高度。 | +| x | <length>\|<percentage> | - | 否 | 设置当前svg的x轴坐标,根svg节点无效。 | +| y | <length>\|<percentage> | | 否 | 设置当前svg的y轴坐标,根svg节点无效。 | +| viewBox | string | - | 否 | 设置当前svg的视口。支持的格式为<number number number number>,4个参数分别表示min-x, min-y, width and height,viewBox的宽高和svg的宽高不一致,会以中心对齐进行缩放。 | + + +## 示例 ``` @@ -118,5 +52,5 @@ ``` -![](figures/zh-cn_image_0000001173164789.png) +![zh-cn_image_0000001173164789](figures/zh-cn_image_0000001173164789.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components.md b/zh-cn/application-dev/reference/arkui-js/js-components.md index 611910fda1f..c6f4fa44f91 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components.md @@ -1,17 +1,17 @@ -# 组件 +# 组件 -- **[通用](js-components-common.md)** -- **[容器组件](js-components-container.md)** -- **[基础组件](js-components-basic.md)** +- **[通用](js-components-common.md)** -- **[媒体组件](js-components-media.md)** +- **[容器组件](js-components-container.md)** -- **[画布组件](js-components-canvas.md)** +- **[基础组件](js-components-basic.md)** -- **[栅格组件](js-components-grid.md)** +- **[媒体组件](js-components-media.md)** -- **[svg组件](js-svg.md)** +- **[画布组件](js-components-canvas.md)** +- **[栅格组件](js-components-grid.md)** +- **[svg组件](js-svg.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/js-offscreencanvasrenderingcontext2d.md b/zh-cn/application-dev/reference/arkui-js/js-offscreencanvasrenderingcontext2d.md index 3839b5cfc0c..d653c4fd911 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-offscreencanvasrenderingcontext2d.md +++ b/zh-cn/application-dev/reference/arkui-js/js-offscreencanvasrenderingcontext2d.md @@ -1,333 +1,223 @@ -# OffscreenCanvasRenderingContext2D对象 +# OffscreenCanvasRenderingContext2D对象 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ->![](../../public_sys-resources/icon-note.gif) **说明:** ->从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 使用OffscreenCanvasRenderingContext2D在offscreen canvas上进行绘制,绘制对象可以是矩形、文本、图片等 -## 属性 + +## 属性 除支持与CanvasRenderingContext2D对象相同的属性外,还支持如下属性: - - - - - - - - - - -

属性

-

类型

-

描述

-

filter

-

string

-

设置图像的滤镜。

-

支持的滤镜效果如下:

-
  • blur:给图像设置高斯模糊
  • brightness:给图片应用一种线性乘法,使其看起来更亮或更暗
  • contrast:调整图像的对比度
  • drop-shadow:给图像设置一个阴影效果
  • grayscale:将图像转换为灰度图像
  • hue-rotate:给图像应用色相旋转
  • invert:反转输入图像
  • opacity:转化图像的透明程度
  • saturate:转换图像饱和度
  • sepia:将图像转换为深褐色
-
- -- 示例 - - ``` - -
- -
- ``` - - ``` - //xxx.js - export default { - onShow(){ - var ctx = this.$refs.canvasId.getContext('2d'); - var offscreen = new OffscreenCanvas(360, 500); - var offCanvas2 = offscreen.getContext("2d"); - var img = new Image(); - img.src = 'common/images/flower.jpg'; - offCanvas2.drawImage(img, 0, 0, 100, 100); - offCanvas2.filter = 'blur(5px)'; - offCanvas2.drawImage(img, 100, 0, 100, 100); - - offCanvas2.filter = 'grayscale(50%)'; - offCanvas2.drawImage(img, 200, 0, 100, 100); - - offCanvas2.filter = 'hue-rotate(90deg)'; - offCanvas2.drawImage(img, 0, 100, 100, 100); - - offCanvas2.filter = 'invert(100%)'; - offCanvas2.drawImage(img, 100, 100, 100, 100); - - offCanvas2.filter = 'drop-shadow(8px 8px 10px green)'; - offCanvas2.drawImage(img, 200, 100, 100, 100); - - offCanvas2.filter = 'brightness(0.4)'; - offCanvas2.drawImage(img, 0, 200, 100, 100); - - offCanvas2.filter = 'opacity(25%)'; - offCanvas2.drawImage(img, 100, 200, 100, 100); - - offCanvas2.filter = 'saturate(30%)'; - offCanvas2.drawImage(img, 200, 200, 100, 100); - - offCanvas2.filter = 'sepia(60%)'; - offCanvas2.drawImage(img, 0, 300, 100, 100); - - offCanvas2.filter = 'contrast(200%)'; - offCanvas2.drawImage(img, 100, 300, 100, 100); - var bitmap = offscreen.transferToImageBitmap(); - ctx.transferFromImageBitmap(bitmap); - } +| 属性 | 类型 | 描述 | +| -------- | -------- | -------- | +| filter | string | 设置图像的滤镜。
支持的滤镜效果如下:
- blur:给图像设置高斯模糊
- brightness:给图片应用一种线性乘法,使其看起来更亮或更暗
- contrast:调整图像的对比度
- drop-shadow:给图像设置一个阴影效果
- grayscale:将图像转换为灰度图像
- hue-rotate:给图像应用色相旋转
- invert:反转输入图像
- opacity:转化图像的透明程度
- saturate:转换图像饱和度
- sepia:将图像转换为深褐色 | + +- 示例 + ``` + +
+ +
+ ``` + + ``` + //xxx.js + export default { + onShow(){ + var ctx = this.$refs.canvasId.getContext('2d'); + var offscreen = new OffscreenCanvas(360, 500); + var offCanvas2 = offscreen.getContext("2d"); + var img = new Image(); + img.src = 'common/images/flower.jpg'; + offCanvas2.drawImage(img, 0, 0, 100, 100); + offCanvas2.filter = 'blur(5px)'; + offCanvas2.drawImage(img, 100, 0, 100, 100); + + offCanvas2.filter = 'grayscale(50%)'; + offCanvas2.drawImage(img, 200, 0, 100, 100); + + offCanvas2.filter = 'hue-rotate(90deg)'; + offCanvas2.drawImage(img, 0, 100, 100, 100); + + offCanvas2.filter = 'invert(100%)'; + offCanvas2.drawImage(img, 100, 100, 100, 100); + + offCanvas2.filter = 'drop-shadow(8px 8px 10px green)'; + offCanvas2.drawImage(img, 200, 100, 100, 100); + + offCanvas2.filter = 'brightness(0.4)'; + offCanvas2.drawImage(img, 0, 200, 100, 100); + + offCanvas2.filter = 'opacity(25%)'; + offCanvas2.drawImage(img, 100, 200, 100, 100); + + offCanvas2.filter = 'saturate(30%)'; + offCanvas2.drawImage(img, 200, 200, 100, 100); + + offCanvas2.filter = 'sepia(60%)'; + offCanvas2.drawImage(img, 0, 300, 100, 100); + + offCanvas2.filter = 'contrast(200%)'; + offCanvas2.drawImage(img, 100, 300, 100, 100); + var bitmap = offscreen.transferToImageBitmap(); + ctx.transferFromImageBitmap(bitmap); } - ``` + } + ``` - ![](figures/c3.png) + ![zh-cn_image_0000001152773860](figures/zh-cn_image_0000001152773860.png) -## 方法 +## 方法 除支持与CanvasRenderingContext2D对象相同的方法外,还支持如下方法: -### isPointInPath -isPointInPath\(path?: Path2D, x: number, y: number\): boolean +### isPointInPath + +isPointInPath(path?: Path2D, x: number, y: number): boolean 判断指定点是否在路径的区域内。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

参数类型

-

必填

-

描述

-

path

-

Path2D

-

-

可选对象,指定用来判断的路径。若没有设置,则使用当前路径。

-

x

-

number

-

-

待判断点的x轴坐标。

-

y

-

number

-

-

待判断点的y轴坐标。

-
- -- 返回值 - - - - - - - - - -

类型

-

说明

-

boolean

-

指定点是否在路径的区域内。

-
- -- 示例 - - ``` - -
- In path:{{textValue}} - -
- ``` - - ``` - // xxx.js - export default { - data: { - textValue: 0 - }, - onShow(){ - var canvas = this.$refs.canvas.getContext('2d'); - var offscreen = new OffscreenCanvas(500,500); - var offscreenCanvasCtx = offscreen.getContext("2d"); - - offscreenCanvasCtx.rect(10, 10, 100, 100); - offscreenCanvasCtx.fill(); - this.textValue = offscreenCanvasCtx.isPointInPath(30, 70); - - var bitmap = offscreen.transferToImageBitmap(); - canvas.transferFromImageBitmap(bitmap); - } +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | path | Path2D | 否 | 可选对象,指定用来判断的路径。若没有设置,则使用当前路径。 | + | x | number | 是 | 待判断点的x轴坐标。 | + | y | number | 是 | 待判断点的y轴坐标。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | boolean | 指定点是否在路径的区域内。 | + +- 示例 + ``` + +
+ In path:{{textValue}} + +
+ ``` + + ``` + // xxx.js + export default { + data: { + textValue: 0 + }, + onShow(){ + var canvas = this.$refs.canvas.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + + offscreenCanvasCtx.rect(10, 10, 100, 100); + offscreenCanvasCtx.fill(); + this.textValue = offscreenCanvasCtx.isPointInPath(30, 70); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); } - ``` + } + ``` - ![](figures/zh-cn_image_0000001224354967.png) + ![zh-cn_image_0000001224354967](figures/zh-cn_image_0000001224354967.png) -### isPointInStroke +### isPointInStroke -isPointInStroke\(path?: Path2D, x: number, y: number\): boolean +isPointInStroke(path?: Path2D, x: number, y: number): boolean 判断指定点是否在路径的边缘线上。 -- 参数 - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

参数类型

-

必填

-

描述

-

path

-

Path2D

-

-

可选对象,指定用来判断的路径。若没有设置,则使用当前路径。

-

x

-

number

-

-

待判断点的x轴坐标。

-

y

-

number

-

-

待判断点的y轴坐标。

-
- -- 返回值 - - - - - - - - - -

类型

-

说明

-

boolean

-

指定点是否在路径的区域内。

-
- -- 示例 - - ``` - -
- In path:{{textValue}} - -
- ``` - - ``` - // xxx.js - export default { - data: { - textValue: 0 - }, - onShow(){ - var canvas = this.$refs.canvas.getContext('2d'); - var offscreen = new OffscreenCanvas(500,500); - var offscreenCanvasCtx = offscreen.getContext("2d"); - - offscreenCanvasCtx.rect(10, 10, 100, 100); - offscreenCanvasCtx.stroke(); - this.textValue = offscreenCanvasCtx.isPointInStroke(50, 10); - - var bitmap = offscreen.transferToImageBitmap(); - canvas.transferFromImageBitmap(bitmap); - } - } - ``` - - ![](figures/zh-cn_image_0000001178875308.png) - - -### resetTransform - -resetTransform\(\): void - -- 示例 - - ``` - -
- In path:{{textValue}} - -
- ``` - - ``` - //xxx.js - export default { - data:{ - textValue:0 - }, - onShow(){ - var canvas = this.$refs.canvas.getContext('2d'); - var offscreen = new OffscreenCanvas(500,500); - var offscreenCanvasCtx = offscreen.getContext("2d"); - - offscreenCanvasCtx.transform(1, 0, 1.7, 1, 0, 0); - offscreenCanvasCtx.fillStyle = 'gray'; - offscreenCanvasCtx.fillRect(40, 40, 50, 20); - offscreenCanvasCtx.fillRect(40, 90, 50, 20); - - // Non-skewed rectangles - offscreenCanvasCtx.resetTransform(); - offscreenCanvasCtx.fillStyle = 'red'; - offscreenCanvasCtx.fillRect(40, 40, 50, 20); - offscreenCanvasCtx.fillRect(40, 90, 50, 20); - - var bitmap = offscreen.transferToImageBitmap(); - canvas.transferFromImageBitmap(bitmap); - } - } - ``` - - ![](figures/zh-cn_image_0000001179035242.png) - +- 参数 + | 参数名 | 参数类型 | 必填 | 描述 | + | -------- | -------- | -------- | -------- | + | path | Path2D | 否 | 可选对象,指定用来判断的路径。若没有设置,则使用当前路径。 | + | x | number | 是 | 待判断点的x轴坐标。 | + | y | number | 是 | 待判断点的y轴坐标。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | boolean | 指定点是否在路径的区域内。 | + +- 示例 + ``` + +
+ In path:{{textValue}} + +
+ ``` + + ``` + // xxx.js + export default { + data: { + textValue: 0 + }, + onShow(){ + var canvas = this.$refs.canvas.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + + offscreenCanvasCtx.rect(10, 10, 100, 100); + offscreenCanvasCtx.stroke(); + this.textValue = offscreenCanvasCtx.isPointInStroke(50, 10); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); + } + } + ``` + + ![zh-cn_image_0000001178875308](figures/zh-cn_image_0000001178875308.png) + + +### resetTransform + +resetTransform(): void + +- 示例 + ``` + +
+ In path:{{textValue}} + +
+ ``` + + ``` + //xxx.js + export default { + data:{ + textValue:0 + }, + onShow(){ + var canvas = this.$refs.canvas.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + + offscreenCanvasCtx.transform(1, 0, 1.7, 1, 0, 0); + offscreenCanvasCtx.fillStyle = 'gray'; + offscreenCanvasCtx.fillRect(40, 40, 50, 20); + offscreenCanvasCtx.fillRect(40, 90, 50, 20); + + // Non-skewed rectangles + offscreenCanvasCtx.resetTransform(); + offscreenCanvasCtx.fillStyle = 'red'; + offscreenCanvasCtx.fillRect(40, 40, 50, 20); + offscreenCanvasCtx.fillRect(40, 90, 50, 20); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); + } + } + ``` + + ![zh-cn_image_0000001179035242](figures/zh-cn_image_0000001179035242.png) diff --git a/zh-cn/application-dev/reference/arkui-js/js-svg.md b/zh-cn/application-dev/reference/arkui-js/js-svg.md index b308a4d49cf..ee133a95eaf 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-svg.md +++ b/zh-cn/application-dev/reference/arkui-js/js-svg.md @@ -1,33 +1,33 @@ -# svg组件 +# svg组件 -- **[通用属性](js-components-svg-common-attributes.md)** -- **[svg](js-components-svg.md)** -- **[rect](js-components-svg-rect.md)** +- **[通用属性](js-components-svg-common-attributes.md)** -- **[circle](js-components-svg-circle.md)** +- **[svg](js-components-svg.md)** -- **[ellipse](js-components-svg-ellipse.md)** +- **[rect](js-components-svg-rect.md)** -- **[path](js-components-svg-path.md)** +- **[circle](js-components-svg-circle.md)** -- **[line](js-components-svg-line.md)** +- **[ellipse](js-components-svg-ellipse.md)** -- **[polyline](js-components-svg-polyline.md)** +- **[path](js-components-svg-path.md)** -- **[polygon](js-components-svg-polygon.md)** +- **[line](js-components-svg-line.md)** -- **[text](js-components-svg-text.md)** +- **[polyline](js-components-svg-polyline.md)** -- **[tspan](js-components-svg-tspan.md)** +- **[polygon](js-components-svg-polygon.md)** -- **[textPath](js-components-svg-textpath.md)** +- **[text](js-components-svg-text.md)** -- **[animate](js-components-svg-animate.md)** +- **[tspan](js-components-svg-tspan.md)** -- **[animateMotion](js-components-svg-animatemotion.md)** +- **[textPath](js-components-svg-textpath.md)** -- **[animateTransform](js-components-svg-animatetransform.md)** +- **[animate](js-components-svg-animate.md)** +- **[animateMotion](js-components-svg-animatemotion.md)** +- **[animateTransform](js-components-svg-animatetransform.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-caution.gif b/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-caution.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-danger.gif b/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-danger.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-note.gif b/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-notice.gif b/zh-cn/application-dev/reference/arkui-js/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 GIT binary patch literal 406 zcmV;H0crk6Nk%w1VIu$@0J8u9|NsB@_xJDb@8;&_*4Ea}&d#;9wWXz{jEszHYim+c zQaU<1At50E0000000000A^8Le000gEEC2ui03!e%000R7038S%NU)&51O^i-Tu6`s z0)`MFE@;3YqD6xSC^kTNu_J>91{PH8XfZ(p1pp2-SU@u3#{mEUC}_}tg3+I#{z}{Ok@D_ZUDg- zt0stin4;pC8M{WLSlRH*1pzqEw1}3oOskyNN?j;7HD{BBZ*OEcv4HK!6Bk6beR+04 z&8}k>SkTusVTDmkyOz#5fCA$JTPGJVQvr3uZ?QzzPQFvD0rGf_PdrcF`pMs}p^BcF zKtKTd`0wipR%nKN&Wj+V}pX;WC3SdJV!a_8Qi zE7z`U*|Y^H0^}fB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md index 61d0b41a286..821bad6125b 100644 --- a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md +++ b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md @@ -1,4 +1,4 @@ -# reference/arkui-ts +# 基于TS扩展的声明式开发范式 - 组件 - 通用 -- Gitee From 9aa60190b1a2ff2ed96b0efe2a8e7f6985f73db2 Mon Sep 17 00:00:00 2001 From: bird_j Date: Thu, 3 Mar 2022 09:17:01 +0800 Subject: [PATCH 071/282] delete seek Signed-off-by: bird_j --- zh-cn/application-dev/reference/apis/js-apis-media.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index a404d3261f9..b575b112344 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1464,12 +1464,10 @@ videoPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 视频播放的Seek模式枚举,可通过seek方法作为参数传递下去。 -| 名称 | 值 | 描述 | -| ----------------- | ---- | ------------------------------------------------------------ | -| SEEK_NEXT_SYNC | 0 | 表示跳转到指定时间点的下一个关键帧,建议向后快进的时候用这个枚举值。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| SEEK_PREV_SYNC | 1 | 表示跳转到指定时间点的上一个关键帧,建议向前快进的时候用这个枚举值。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| SEEK_CLOSEST_SYNC | 2 | 表示跳转到指定时间点最近的关键帧。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| SEEK_CLOSEST | 3 | 表示精确跳转到指定时间点。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| 名称 | 值 | 描述 | +| -------------- | ---- | ------------------------------------------------------------ | +| SEEK_NEXT_SYNC | 0 | 表示跳转到指定时间点的下一个关键帧,建议向后快进的时候用这个枚举值。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| SEEK_PREV_SYNC | 1 | 表示跳转到指定时间点的上一个关键帧,建议向前快进的时候用这个枚举值。
**系统能力:** SystemCapability.Multimedia.Media.Core | ## PlaybackSpeed8+ -- Gitee From 85d98ae311205868dc7ffc128d595c536453d9e1 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Thu, 3 Mar 2022 09:53:36 +0800 Subject: [PATCH 072/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 253 ++++++++---------- 1 file changed, 117 insertions(+), 136 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index e0b9562cf39..48ad0b65bb4 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -15,7 +15,7 @@ function getMediaLibrary(context: Context): MediaLibrary; 获取媒体库。 -**需要权限**:ohos.permission.GET_BUNDLE_INFO_PRIVILEGED +**需要权限**:无 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -46,7 +46,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 获取文件资源,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -67,14 +67,13 @@ let imagesfetchOp = { selectionArgs: [imageType.toString()], }; medialibrary.getFileAssets(imagesfetchOp, (error, fetchFileResult) => { - if (fetchFileResult != undefined) { - console.info('MediaLibraryTest : ASSET_CALLBACK fetchFileResult success'); - fetchFileResult.getAllObject((err, fileAssetList) => { - if (fileAssetList != undefined) { - fileAssetList.forEach(getAllObjectInfo); - console.info('MediaLibraryTest : getAllObject :PASS'); - } - }); + if (fetchFileResult != undefined) { + console.info('MediaLibraryTest : ASSET_CALLBACK fetchFileResult success'); + fetchFileResult.getAllObject((err, fileAssetList) => { + if (fileAssetList != undefined) { + fileAssetList.forEach(getAllObjectInfo); + } + }); }); ``` ## medialibrary.getFileAssets @@ -83,7 +82,7 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; 获取文件资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -172,7 +171,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal 创建媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -192,23 +191,20 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; medialibrary.createAsset(mediaType, “imageCallBack.jpg”, path, (err, albumFetchFileResult) => { - if (albumFetchFileResult != undefined) { - console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets success'); - albumFetchFileResult.getAllObject((err, fileAssetList) => { - if (fileAssetList != undefined) { - fileAssetList.forEach(getAllObjectInfo); - console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 success'); - } else { - console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 fail, message = ' + err); - console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 getFileAssets :No data'); - - } - }); + if (albumFetchFileResult != undefined) { + console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets success'); + albumFetchFileResult.getAllObject((err, fileAssetList) => { + if (fileAssetList != undefined) { + fileAssetList.forEach(getAllObjectInfo); } else { - console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets 004_01 fail, message = ' + err); - + console.info('getFileAssets fail, message = ' + err); + console.info('getFileAssets getFileAssets :No data'); } }); + } else { + console.info('getFileAssets failed, message = ' + err); + } +}); ``` ## medialibrary.createAsset @@ -217,7 +213,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr 创建媒体资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -254,7 +250,7 @@ deleteAsset(uri: string, callback: AsyncCallback<void>): void; 删除媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -279,7 +275,7 @@ deleteAsset(uri: string): Promise<void>; 删除媒体资源,使用promise方式返回结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -329,10 +325,9 @@ getPublicDirectory(type: DirectoryType, callback: AsyncCallback): void; let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; media.getPublicDirectory(DIR_CAMERA,(err, dicResult) => { if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory 001 passed'); + console.info('MediaLibraryTest : getPublicDirectory passed'); } else { - console.info('MediaLibraryTest : getPublicDirectory 001 failed'); - + console.info('MediaLibraryTest : getPublicDirectory failed'); } }); ``` @@ -365,9 +360,9 @@ getPublicDirectory(type: DirectoryType): Promise; let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; const dicResult = await media.getPublicDirectory(DIR_CAMERA); if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory 001 passed'); + console.info('MediaLibraryTest : getPublicDirectory passed'); } else { - console.info('MediaLibraryTest : getPublicDirectory 001 failed'); + console.info('MediaLibraryTest : getPublicDirectory failed'); } ``` @@ -377,7 +372,7 @@ getAlbums(options: MediaFetchOptions, callback: AsyncCallback; 获取实体相册,使用 promise 方式返回结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -432,7 +427,7 @@ getActivePeers(callback: AsyncCallback): void; 获取活动注册设备 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -456,7 +451,7 @@ getActivePeers(): Promise; 获取活动注册设备 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -480,7 +475,7 @@ getAllPeers(callback: AsyncCallback): void; 获取所有注册设备 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -504,7 +499,7 @@ getAllPeers(): Promise; 获取所有注册设备 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore @@ -570,7 +565,7 @@ isDirectory(callback: AsyncCallback<boolean>): void; 判断fileAsset是否为目录,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -594,7 +589,7 @@ isDirectory():Promise<boolean>; 判断fileAsset是否为目录,使用Promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -620,7 +615,7 @@ commitModify(callback: AsyncCallback<void>): void; 修改文件的元数据,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -634,16 +629,8 @@ commitModify(callback: AsyncCallback<void>): void; ``` asset.title = ‘newtitle'; -asset.commitModify(commitModifyCallBack); -function commitModifyCallBack(err, commitModify) { - if (commitModify != undefined) { - console.info('MediaLibraryTest : ASSET_CALLBACK commitModify success'); - - } else { - console.info('MediaLibraryTest : ASSET_CALLBACK commitModify Unsuccessfull = ' + err); - - } - +asset.commitModify(() => { + console.info('commitModify success'); } ``` @@ -653,7 +640,7 @@ commitModify(): Promise<void>; 修改文件的元数据,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -676,7 +663,7 @@ open(mode: string, callback: AsyncCallback<number>): void; 打开当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -708,7 +695,7 @@ open(mode: string): Promise<number>; 打开当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -745,7 +732,7 @@ close(fd: number, callback: AsyncCallback<void>): void; 关闭当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -760,13 +747,12 @@ close(fd: number, callback: AsyncCallback<void>): void; ``` fileAsset.close(fd, (closeErr) => { - if (closeErr != undefined) { - console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); - console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); - } else { - console.info("=======asset.close success====>"); - - } + if (closeErr != undefined) { + console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + } else { + console.info("=======asset.close success====>"); + } }); ``` @@ -776,7 +762,7 @@ close(fd: number): Promise<void>; 关闭当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -796,13 +782,13 @@ close(fd: number): Promise<void>; ``` fileAsset.close(fd).then((closeErr) => { - if (closeErr != undefined) { - console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); - console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); - - } else { - console.info("=======asset.close success====>"); - } + if (closeErr != undefined) { + console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + + } else { + console.info("=======asset.close success====>"); + } }); ``` @@ -812,7 +798,7 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -836,7 +822,7 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; 获取文件的缩略图,传入缩略图尺寸,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -861,7 +847,7 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; 获取文件的缩略图,传入缩略图尺寸,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -891,7 +877,7 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; 将文件设置为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -916,7 +902,7 @@ favorite(isFavorite: boolean): Promise<void>; 将文件设置为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -948,7 +934,7 @@ isFavorite(callback: AsyncCallback<boolean>): void; 判断该文件是否为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -976,7 +962,7 @@ isFavorite():Promise<boolean>; 判断该文件是否为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1004,7 +990,7 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; 放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1020,8 +1006,7 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; ``` asset.trash(true, trashCallBack); function trashCallBack(err, trash) { - console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); - + console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); } ``` @@ -1033,7 +1018,7 @@ trash(isTrash: boolean,): Promise<void>; 放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1065,7 +1050,7 @@ isTrash(callback: AsyncCallback<boolean>): void; 当文件被定位,判断文件是否为垃圾文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1098,7 +1083,7 @@ isTrash():Promise<boolean>; 当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1265,7 +1250,7 @@ queryResultSet_.getFirstObject().then(function(fileAsset){ 获取文件检索结果中的下一个文件资产。此方法使用callback形式返回结果。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1293,7 +1278,7 @@ data.getNextObject((err, value) => { 获取文件检索结果中的下一个文件资产。此方法使用promise方式来异步返回FileAsset。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1405,7 +1390,7 @@ getPositionObject(index: number): Promise<FileAsset>; 获取文件检索结果中具有指定索引的文件资产。此方法使用Promise形式返回文件Asset。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1439,7 +1424,7 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; 获取文件检索结果中的所有文件资产。此方法使用Callback回调来返回FileAsset结果集。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1497,7 +1482,7 @@ commitModify(callback: AsyncCallback<void>): void; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1511,12 +1496,12 @@ commitModify(callback: AsyncCallback<void>): void; ``` album.albumName = 'hello'; -album.commitModify((err, value) => { +album.commitModify((err) => { if (err) { console.error('Failed '); return; } - console.log(value); + console.log('Modify successful.'); }) ``` @@ -1526,7 +1511,7 @@ commitModify(): Promise<void>; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.MEDIA_READ,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1553,7 +1538,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe 按照检索条件获取相册中的文件。此方法使用Callback回调来返回文件结果集。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1580,7 +1565,7 @@ function getFileAssetsCallBack(err, fetchFileResult) { 按照检索条件获取相册中的文件。此方法使用异步回调来返回文件结果集。 -**需要权限**:ohos.permission.MEDIA_READ +**需要权限**:ohos.permission.READ_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1680,45 +1665,41 @@ FileKey 枚举,文件关键信息。 -| 名称 | 默认值 | 可读 | 可写 | 描述 | -| ------------- | ------------------- | ---- | ---- | ------------------------------------------------------ | -| ID | file_id | 是 | 否 | 文件编号 | -| RELATIVE_PATH | relative_path | 是 | 是 | 相对路径 | -| DISPLAY_NAME | display_name | 是 | 是 | 显示名字 | -| PARENT | parent | 是 | 否 | 父目录id | -| MIME_TYPE | mime_type | 是 | 否 | 文件扩展属性 | -| MEDIA_TYPE | media_type | 是 | 否 | 媒体类型 | -| SIZE | size | 是 | 否 | 文件大小 | -| DATE_ADDED | date_added | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | -| DATE_MODIFIED | date_modified | 是 | 否 | 修改日期(修改文件时间到1970年1月1日的秒数值) | -| DATE_TAKEN | date_taken | 是 | 否 | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | -| TITLE | title | 是 | 是 | 文件标题 | -| ARTIST | artist | 是 | 否 | 作者 | -| AUDIOALBUM | audio_album | 是 | 否 | 专辑 | -| DURATION | duration | 是 | 否 | 持续时间(单位:秒) | -| WIDTH | width | 是 | 否 | 图片宽度(单位:像素) | -| HEIGHT | height | 是 | 否 | 图片高度(单位:像素) | -| ORIENTATION | orientation | 是 | 否 | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | -| ALBUM_ID | bucket_id | 是 | 否 | 文件所归属的相册编号 | -| ALBUM_NAME | bucket_display_name | 是 | 否 | 文件所归属相册名称 | +| 名称 | 默认值 | 描述 | +| ------------- | ------------------- | ------------------------------------------------------ | +| ID | file_id | 文件编号 | +| RELATIVE_PATH | relative_path | 相对路径 | +| DISPLAY_NAME | display_name | 显示名字 | +| PARENT | parent | 父目录id | +| MIME_TYPE | mime_type | 文件扩展属性 | +| MEDIA_TYPE | media_type | 媒体类型 | +| SIZE | size | 文件大小 | +| DATE_ADDED | date_added | 添加日期(添加文件时间到1970年1月1日的秒数值) | +| DATE_MODIFIED | date_modified | 修改日期(修改文件时间到1970年1月1日的秒数值) | +| DATE_TAKEN | date_taken | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | +| TITLE | title | 文件标题 | +| ARTIST | artist | 作者 | +| AUDIOALBUM | audio_album | 专辑 | +| DURATION | duration | 持续时间(单位:秒) | +| WIDTH | width | 图片宽度(单位:像素) | +| HEIGHT | height | 图片高度(单位:像素) | +| ORIENTATION | orientation | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | +| ALBUM_ID | bucket_id | 文件所归属的相册编号 | +| ALBUM_NAME | bucket_display_name | 文件所归属相册名称 | DirectoryType ------------- 枚举,目录类型。 -| 名称 | 默认值 | 描述 | -| ---------------------- | ------ | ------------------ | -| DIR_CAMERA | 0 | 表示Camera文件路径 | -| DIR_VIDEO | 1 | 表示视频路径 | -| DIR_IMAGE | 2 | 表示图片路径 | -| DIR_AUDIO | 3 | 表示音频路径 | -| DIR_AUDIO_RINGS | 4 | 表示铃声音频路径 | -| DIR_AUDIO_NOTICE | 5 | 表示提示音频路径 | -| DIR_AUDIO_CLOCK | 6 | 表示时钟音频路径 | -| DIR_DOCUMENTS | 7 | 表示文档路径 | -| DIR_DOWNLOAD | 8 | 表示下载路径 | -| DIR_DOWNLOAD_BLUETOOTH | 9 | 表示蓝牙下载路径 | +| 名称 | 默认值 | 描述 | +| ------------- | ------ | ------------------ | +| DIR_CAMERA | 0 | 表示Camera文件路径 | +| DIR_VIDEO | 1 | 表示视频路径 | +| DIR_IMAGE | 2 | 表示图片路径 | +| DIR_AUDIO | 3 | 表示音频路径 | +| DIR_DOCUMENTS | 4 | 表示文档路径 | +| DIR_DOWNLOAD | 5 | 表示下载路径 | DeviceType ----------- @@ -1739,14 +1720,14 @@ DeviceType 检索条件。 -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------------- | ------------- | ---- | ---- | ---------------- | -| selections | string | 是 | 是 | 检索条件 | -| selectionArgs | Array | 是 | 是 | 检索条件的值 | -| order | string | 是 | 是 | 检索结果排序方式 | -| uri | string | 是 | 是 | 文件URI | -| networkId | string | 是 | 是 | 注册设备网络ID | -| extendArgs | string | 是 | 是 | 扩展的检索参数 | +| 名称 | 类型 | 可读 | 可写 | 必填 |说明 | +| ------------- | ------------- | ---- | ---- | ---- |---------------- | +| selections | string | 是 | 是 |是 | 检索条件 | +| selectionArgs | Array | 是 | 是 |是 | 检索条件的值 | +| order | string | 是 | 是 | 否 |检索结果排序方式 | +| uri | string | 是 | 是 | 否 |文件URI | +| networkId | string | 是 | 是 | 否 |注册设备网络ID | +| extendArgs | string | 是 | 是 | 否 |扩展的检索参数 | ## Size -- Gitee From 9f0a10559a1ee796618156ca0677de215e0ac732 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Thu, 3 Mar 2022 10:19:43 +0800 Subject: [PATCH 073/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 328 +++++++++++++++++- 1 file changed, 309 insertions(+), 19 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 48ad0b65bb4..0760833be07 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -264,7 +264,16 @@ deleteAsset(uri: string, callback: AsyncCallback<void>): void; **示例:** ``` -medialibrary.deleteAsset(fileAsset.uri, (deleteAssetErr, deleteRows) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); +medialibrary.deleteAsset(asset.uri, (deleteAssetErr, deleteRows) => { // do something }); ``` @@ -294,6 +303,15 @@ deleteAsset(uri: string): Promise<void>; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); medialibrary.deleteAsset(asset.uri).then(()=>{ console.info("deleteAsset successfully"); }).catch(function(err){ @@ -360,7 +378,7 @@ getPublicDirectory(type: DirectoryType): Promise; let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; const dicResult = await media.getPublicDirectory(DIR_CAMERA); if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory passed'); + console.info('MediaLibraryTest : getPublicDirectory passed'); } else { console.info('MediaLibraryTest : getPublicDirectory failed'); } @@ -386,7 +404,21 @@ getAlbums(options: MediaFetchOptions, callback: AsyncCallback { + if (albumList != undefined) { + const album = albumList[0]; + console.info('album.albumName = ' + album.albumName); + console.info('album.count = ' + album.count); + done(); + } else { + console.info('getAlbum fail, message = ' + err); + done(); + } +}); ``` ## medialibrary.getAlbums @@ -414,6 +446,10 @@ getAlbums(options: MediaFetchOptions): Promise; **示例:** ``` +let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], +}; medialibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ console.info("getAlbums successfully:"+ JSON.stringify(albumList)); }).catch(function(err){ @@ -578,6 +614,15 @@ isDirectory(callback: AsyncCallback<boolean>): void; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.isDirectory((err, isDirectory) => { // do something }); @@ -602,6 +647,15 @@ isDirectory():Promise<boolean>; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.isDirectory().then(function(isDirectory){ console.info("isDirectory result:"+ isDirectory); }).catch(function(err){ @@ -628,9 +682,18 @@ commitModify(callback: AsyncCallback<void>): void; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.title = ‘newtitle'; asset.commitModify(() => { - console.info('commitModify success'); + console.info('commitModify success'); } ``` @@ -653,6 +716,15 @@ commitModify(): Promise<void>; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.title = ‘newtitle'; asset.commitModify(); ``` @@ -746,7 +818,16 @@ close(fd: number, callback: AsyncCallback<void>): void; **示例:** ``` -fileAsset.close(fd, (closeErr) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); +asset.close(fd, (closeErr) => { if (closeErr != undefined) { console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); @@ -781,7 +862,16 @@ close(fd: number): Promise<void>; **示例:** ``` -fileAsset.close(fd).then((closeErr) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); +asset.close(fd).then((closeErr) => { if (closeErr != undefined) { console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); @@ -811,7 +901,16 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -fileAsset.getThumbnail((err, pixelmap) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); +asset.getThumbnail((err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); ``` @@ -836,7 +935,16 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -fileAsset.getThumbnail(size, (err, pixelmap) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); +asset.getThumbnail(size, (err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); ``` @@ -866,7 +974,16 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; **示例:** ``` -fileAsset.getThumbnail(size, (err, pixelmap) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); +asset.getThumbnail(size, (err, pixelmap) => { console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); ``` @@ -891,6 +1008,15 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.favorite(true,function(err){ // do something }); @@ -921,6 +1047,15 @@ favorite(isFavorite: boolean): Promise<void>; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.favorite(true).then(function() { console.info("favorite successfully"); }).catch(function(err){ @@ -947,6 +1082,15 @@ isFavorite(callback: AsyncCallback<boolean>): void; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.isFavorite((err, isFavorite) => { if (isFavorite) { console.info('FileAsset is favorite'); @@ -975,6 +1119,15 @@ isFavorite():Promise<boolean>; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.isFavorite().then(function(isFavorite){ console.info("isFavorite result:"+ isFavorite); }).catch(function(err){ @@ -1004,6 +1157,15 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.trash(true, trashCallBack); function trashCallBack(err, trash) { console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); @@ -1037,6 +1199,15 @@ trash(isTrash: boolean,): Promise<void>; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.trash(true).then(function() { console.info("trash successfully"); }).catch(function(err){ @@ -1063,6 +1234,15 @@ isTrash(callback: AsyncCallback<boolean>): void; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.isTrash(isTrashCallBack); function isTrashCallBack(err, isTrash) { if (isTrash == true) { @@ -1096,6 +1276,15 @@ isTrash():Promise<boolean>; **示例:** ``` +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +const fetchFileResult = await media.getFileAssets(getImageOp); +const asset = await fetchFileResult.getFirstObject(); asset.isTrash().then(function(isTrash){ console.info("isTrash result:"+ isTrash); }).catch(function(err){ @@ -1155,7 +1344,14 @@ isAfterLast(): boolean; **示例**: ``` -let fetchFileResult = await media.getFileAssets(getFileCountTenOp); +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); const fetchCount = fetchFileResult.getCount(); console.info('MediaLibraryTest : count:' + fetchCount); let fileAsset = await fetchFileResult.getFirstObject(); @@ -1185,7 +1381,14 @@ close(): void; **示例**: ``` -let fetchFileResult = await media.getFileAssets(getFileCountTenOp); +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.close(); ``` @@ -1208,7 +1411,15 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void; **示例**: ``` -data.getFirstObject((err, value) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +fetchFileResult.getFirstObject((err, value) => { if (err) { console.error('Failed '); return; @@ -1237,7 +1448,15 @@ getFirstObject(): Promise<FileAsset>; **示例**: ``` -queryResultSet_.getFirstObject().then(function(fileAsset){ +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +fetchFileResult.getFirstObject().then(function(fileAsset){ console.info("getFirstObject successfully:"+ JSON.stringify(fileAsset)); }).catch(function(err){ console.info("getFirstObject failed with error:"+ err); @@ -1263,7 +1482,15 @@ queryResultSet_.getFirstObject().then(function(fileAsset){ **示例**: ``` -data.getNextObject((err, value) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +fetchFileResult.getNextObject((err, value) => { if (err) { console.error('Failed '); return; @@ -1291,7 +1518,14 @@ data.getNextObject((err, value) => { **示例**: ``` -let fetchFileResult = await media.getFileAssets(getFileCountTenOp); +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); const fetchCount = fetchFileResult.getCount(); console.info('MediaLibraryTest : count:' + fetchCount); fileAsset = await fetchFileResult.getNextObject(); @@ -1316,7 +1550,15 @@ getLastObject(callback: AsyncCallback<FileAsset>): void; **示例**: ``` -data.getLastObject((err, value) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +fetchFileResult.getLastObject((err, value) => { if (err) { console.error('Failed '); return; @@ -1375,7 +1617,15 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void **示例**: ``` -data. getPositionObject(1,(err, value) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +fetchFileResult.getPositionObject(1,(err, value) => { if (err) { console.error('Failed '); return; @@ -1409,7 +1659,15 @@ getPositionObject(index: number): Promise<FileAsset>; **示例**: ``` -data.getPositionObject(1,(err, value) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +fetchFileResult.getPositionObject(1,(err, value) => { if (err) { console.error('Failed '); return; @@ -1437,7 +1695,15 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; **示例**: ``` -data.getAllObject((err, value) => { +let imageType = mediaLibrary.MediaType.IMAGE; +let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", +}; +let fetchFileResult = await media.getFileAssets(getImageOp); +fetchFileResult.getAllObject((err, value) => { if (err) { console.error('Failed '); return; @@ -1495,6 +1761,12 @@ commitModify(callback: AsyncCallback<void>): void; **示例**: ``` +let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], +}; +const albumList = await media.getAlbums(AlbumNoArgsfetchOp); +const album = albumList[0]; album.albumName = 'hello'; album.commitModify((err) => { if (err) { @@ -1524,6 +1796,12 @@ commitModify(): Promise<void>; **示例**: ``` +let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], +}; +const albumList = await media.getAlbums(AlbumNoArgsfetchOp); +const album = albumList[0]; album.albumName = 'hello'; album.commitModify().then(function() { console.info("commitModify successfully"); @@ -1552,6 +1830,12 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe **示例**: ``` +let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], +}; +const albumList = await media.getAlbums(AlbumNoArgsfetchOp); +const album = albumList[0]; album.getFileAssets(fileNoArgsfetchOp, getFileAssetsCallBack); }) function getFileAssetsCallBack(err, fetchFileResult) { @@ -1584,6 +1868,12 @@ function getFileAssetsCallBack(err, fetchFileResult) { **示例**: ``` +let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], +}; +const albumList = await media.getAlbums(AlbumNoArgsfetchOp); +const album = albumList[0]; album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ console.info("getFileAssets successfully:"+ JSON.stringify(albumFetchFileResult)); }).catch(function(err){ -- Gitee From db523824dc9ab63f0b5f27ae4693431f22d6eb6a Mon Sep 17 00:00:00 2001 From: honglie Date: Thu, 3 Mar 2022 11:15:16 +0800 Subject: [PATCH 074/282] Description: add kconfig guid in root README Signed-off-by: honglie --- zh-cn/device-dev/subsystems/Readme-CN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/zh-cn/device-dev/subsystems/Readme-CN.md b/zh-cn/device-dev/subsystems/Readme-CN.md index d18d16d5b17..a3910318ec8 100755 --- a/zh-cn/device-dev/subsystems/Readme-CN.md +++ b/zh-cn/device-dev/subsystems/Readme-CN.md @@ -4,6 +4,7 @@ - [轻量和小型系统编译构建指导](subsys-build-mini-lite.md) - [标准系统编译构建指导](subsys-build-standard-large.md) - [构建系统编码规范和最佳实践指导](subsys-build-gn-coding-style-and-best-practice.md) + - [编译构建Kconfig可视化配置指导](subsys-build-gn-kconfig-visual-config-guid.md) - [分布式远程启动](subsys-remote-start.md) - [图形图像](subsys-graphics.md) - [图形图像概述](subsys-graphics-overview.md) -- Gitee From 6edecc8c6c2dadc87884ec664bf36e0f0abd0f61 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Thu, 3 Mar 2022 11:50:46 +0800 Subject: [PATCH 075/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 223 ++---------------- 1 file changed, 25 insertions(+), 198 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 0760833be07..8f91da0a391 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -13,7 +13,7 @@ import medialibrary from '@ohos.multimedia.medialibrary'; function getMediaLibrary(context: Context): MediaLibrary; -获取媒体库。 +获取媒体库的实例,用于访问和修改用户的个人数据信息。 **需要权限**:无 @@ -35,8 +35,10 @@ function getMediaLibrary(context: Context): MediaLibrary; ``` import featureAbility from '@ohos.ability.featureAbility'; +import mediaLibrary from ‘ohos.multimedia.mediaLibrary'; + var context = featureAbility.getContext() -var media = mediaLibrary.getMediaLibrary(context); +var mediaLibrary = mediaLibrary.getMediaLibrary(context); ``` ## medialibrary.getFileAssets @@ -171,7 +173,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal 创建媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -190,19 +192,11 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal // 使用Callback方式创建Image类型文件 let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; -medialibrary.createAsset(mediaType, “imageCallBack.jpg”, path, (err, albumFetchFileResult) => { - if (albumFetchFileResult != undefined) { - console.info('MediaLibraryTest : ALBUM_CALLBACK getFileAssets success'); - albumFetchFileResult.getAllObject((err, fileAssetList) => { - if (fileAssetList != undefined) { - fileAssetList.forEach(getAllObjectInfo); - } else { - console.info('getFileAssets fail, message = ' + err); - console.info('getFileAssets getFileAssets :No data'); - } - }); +medialibrary.createAsset(mediaType, “imageCallBack.jpg”, path, (err, fileAsset) => { + if (fileAsset != undefined) { + console.info('createAsset successfully, message = ' + err); } else { - console.info('getFileAssets failed, message = ' + err); + console.info('createAsset failed, message = ' + err); } }); ``` @@ -213,7 +207,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr 创建媒体资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -237,88 +231,13 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr // 使用Promise方式创建Image类型文件 let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; -medialibrary.createAsset(mediaType, "image01.jpg", path).then(function(asset){ +medialibrary.createAsset(mediaType, "image01.jpg", path).then (function (asset) { console.info("createAsset successfully:"+ JSON.stringify(asset)); }).catch(function(err){ console.info("createAsset failed with error:"+ err); }); ``` -## medialibrary.deleteAsset - -deleteAsset(uri: string, callback: AsyncCallback<void>): void; - -删除媒体资源,使用callback方式返回结果。 - -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE - -**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------- | ---- | ---------------------- | -| uri | string | 是 | 文件uri | -| callback | AsyncCallback<void> | 是 | 回调返回空 | - -**示例:** - -``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -medialibrary.deleteAsset(asset.uri, (deleteAssetErr, deleteRows) => { - // do something -}); -``` - -## medialibrary.deleteAsset - -deleteAsset(uri: string): Promise<void>; - -删除媒体资源,使用promise方式返回结果。 - -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE - -**系统能力**:SystemCapability.Multimedia.MediaLibrary.Core - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | ------- | -| uri | string | 是 | 文件uri | - -**返回值:** - -| 类型 | 说明 | -| ------------- | ------------------------------------------------- | -| Promise<void> | Promise实例,用于异步获取结果。本调用将返回空值 | - -**示例:** - -``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -medialibrary.deleteAsset(asset.uri).then(()=>{ - console.info("deleteAsset successfully"); -}).catch(function(err){ - console.info("deleteAsset failed with error:"+ err); -}); -``` - ## medialibrary.getPublicDirectory getPublicDirectory(type: DirectoryType, callback: AsyncCallback): void; @@ -457,103 +376,11 @@ medialibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ }); ``` -## medialibrary.getActivePeers - -getActivePeers(callback: AsyncCallback): void; - -获取活动注册设备 - -**需要权限**:ohos.permission.READ_MEDIA - -**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------ | ---- | ---------------------- | -| callback | AsyncCallback> | 是 | 回调表示成功还是失败 | - -**示例:** - -``` -medialibrary.getActivePeers((err, data) => { - // do something -}); -``` - -## medialibrary.getActivePeers - -getActivePeers(): Promise; - -获取活动注册设备 - -**需要权限**:ohos.permission.READ_MEDIA - -**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore - -**参数:** - -返回值: - -| 类型 | 说明 | -| ------------------------------------- | --------------------------------- | -| Promise> | Promise实例,用于获取异步返回结果 | - -**示例:** - -``` -peerInfoList = medialibrary.getActivePeers(); -``` - -## medialibrary.getAllPeers - -getAllPeers(callback: AsyncCallback): void; - -获取所有注册设备 - -**需要权限**:ohos.permission.READ_MEDIA - -**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------ | ---- | ---------------------- | -| callback | AsyncCallback> | 是 | 回调表示成功还是失败 | - -**示例:** - -``` -medialibrary.getAllPeers((err, data) => { - // do something -}); -``` - -## medialibrary.getAllPeers - -getAllPeers(): Promise; - -获取所有注册设备 - -**需要权限**:ohos.permission.READ_MEDIA - -**系统能力**:SystemCapability.Multimedia.MediaLibrary.DistributedCore - -**返回值:** - -| 类型 | 说明 | -| ------------------------------------- | --------------------------------- | -| Promise> | Promise实例,用于获取异步返回结果 | - -**示例:** - -peerInfoList = media.getAllPeers(); - ## medialibrary.release release(callback: AsyncCallback<void>): void; -释放MediaLibrary实例 +释放MediaLibrary实例,当用户确认后续不再使用MediaLibrary实例中的方法后调用release方法释放MediaLibrary实例。 **需要权限**:无 @@ -577,7 +404,7 @@ medialibrary.release((err, data) => { release(): Promise<void>; -释放MediaLibrary实例 (补充说明) +释放MediaLibrary实例,当用户确认后续不再使用MediaLibrary实例中的方法后调用release方法释放MediaLibrary实例。 **需要权限**:无 @@ -669,7 +496,7 @@ commitModify(callback: AsyncCallback<void>): void; 修改文件的元数据,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -703,7 +530,7 @@ commitModify(): Promise<void>; 修改文件的元数据,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -735,7 +562,7 @@ open(mode: string, callback: AsyncCallback<number>): void; 打开当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA(‘w’模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -767,7 +594,7 @@ open(mode: string): Promise<number>; 打开当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.MEDIA_WRITE(‘w’模式打开) +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA(‘w’模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -804,7 +631,7 @@ close(fd: number, callback: AsyncCallback<void>): void; 关闭当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -843,7 +670,7 @@ close(fd: number): Promise<void>; 关闭当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -994,7 +821,7 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; 将文件设置为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1028,7 +855,7 @@ favorite(isFavorite: boolean): Promise<void>; 将文件设置为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1143,7 +970,7 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; 放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1180,7 +1007,7 @@ trash(isTrash: boolean,): Promise<void>; 放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1748,7 +1575,7 @@ commitModify(callback: AsyncCallback<void>): void; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1783,7 +1610,7 @@ commitModify(): Promise<void>; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.MEDIA_WRITE +**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core -- Gitee From 47c1c35b37056918a9eb96da1592968709c67289 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Thu, 3 Mar 2022 12:00:42 +0800 Subject: [PATCH 076/282] update docs Signed-off-by: annie_wangli --- .../figure/ohos_device_security_level.png | Bin 0 -> 79740 bytes .../ohos_system_security_architecture.png | Bin 0 -> 77472 bytes .../subsys-security-devicesecuritylevel.md | 481 ++++++++++++++++++ .../subsystems/subsys-security-overview.md | 24 +- en/device-dev/subsystems/subsys-security.md | 10 +- 5 files changed, 501 insertions(+), 14 deletions(-) create mode 100644 en/device-dev/subsystems/figure/ohos_device_security_level.png create mode 100644 en/device-dev/subsystems/figure/ohos_system_security_architecture.png create mode 100644 en/device-dev/subsystems/subsys-security-devicesecuritylevel.md diff --git a/en/device-dev/subsystems/figure/ohos_device_security_level.png b/en/device-dev/subsystems/figure/ohos_device_security_level.png new file mode 100644 index 0000000000000000000000000000000000000000..5431ff80c7d601113b2c767655165859ef1316cf GIT binary patch literal 79740 zcmeFZ2~<<(_b!aJibX}+>Q6xit!=faU`0?OAp%vLnL&n-S|%j|VhB@6P^n^V0WAWe zkca_+kU_yPBqXR*5ds8-;Av*Ue|I#2;sbE zzx&<$+0TCV`Ni#!%VGm#13f*x#e4Vs;Gw5CZ@He{CodMvhkkPD^CynbmpK>@7biV> zo5?Wr;?r=)gU}CeXD*yNG7ozF*@-=V7(G41hS~pf8ly`?^z>$m_x|AMl@K(d<1;ut zcuAVbuWx7jsapnLeR1}aqB$#k_O0G^^t}6-()kH<|L|VxxY2q+XwjWjqPrLO9y0#s zgkJ5>7xsr-T(V8Ry&V$F8LCA|%uIGKWe7OmQ-mUlb&lmn$$dcbu z8;rjgELk+>dDgn{#$28?wh!-Ey5Q~mFYj*u`tsy2e|&CT_>-#Olb4o%eJHPVq3@8Irgk7_0A0w)I*jf;W{c zJNqL0UB;)f}a|+&XOVsWaKC7Qkx4qxbZRCX;md2!nuldWlPhER_cKP|5`pS1!x!XE) z-{6N{iQl^|c@`FXWZqYD#m0BWI$_Pa^~vYz`2W0f&>AD;;nU}}I~KmPVefC2)SZ9m z{%0)bg8I2HSEJ<5o+Nq7fE5GrwU-FSVCGcTGm;}Mu3kHw8zBSFk&Usqw_IOmuTqvMWd=X{q z1Zh1|d#dn7;>}#AU7{TxU`GN{a*UQ$c%u`v+}O%oYQg=7aV_#sF7U-Z8n{k7cR}eH zSGDkNM1j|uYYm&#ese1+ve?2K%^YHW+Gul;^RCREvlqzt3f9b3H+O&>Q(;>8eE&bZ z!F{PuYL&4CB{C>LDSd5xpnK6OZ$#==WaeOqpz2&Sk3dKKw)5{D-o(F1f%ZJ^{5sQ$PXU}D9nSYGhg!5YUa`8~C5#5Fy=CF^ z`k24%R*=`q;_DWzw^}qrXDj_6Kk?ZhLw*HOA#ihNNumrr)ESz~^0mC<$Y|5Xz93F+ zWXNLG3wMd(y5d2U^8^1z4RJ)}`-KHD?Oh@=-eR9wod_y)#~6BTF2x);9arPj{{0P89P6iC%v@Amy=czRqUzVk{)z{l>QS z>g-;yT+)Unc9FM#oH`B{f3gjKlFBYweY9lfuWq*)mF%A{%*_8N;oNpgF@ClFmPbJn zD$?UDo-1A2f)7YbGMEU=IdW4D5>pRc3(j4grS0aCD55H4aOhd(~RKbWve&6NYwyXRzUg`n}y zP;IAU{@l|2YjRCn?_~(1IdLG1{A?rOBRwt>YRiDy|A6fW8I>s9U~Pzbne;?!cQG9^ z%97&gg~uo-8Q87W-Rg+HInah!H_ue+C8O6xhPONUc`utS0#8m95!mg`co0foYVwc! zfVJ?nMaxBvmncBj*$YfWW)>E#i=>YpDBUh|(fG-*Dm33dcVw-=KV%c4GA=K8j|h`O zL?f$P99%Hvct+gEk@2>ZzMrOBlxwt9aO+XndF;1!6*8XgyR9-!+vc)!5#&iPZ+>5= z`{wwjD0^hNJugIPnx3b%)%-#1VFfZcIbNYemp51JMS~TV<2z=r_~>~2aMlIrYS@2l zs>O17?7fTB!v6J7n=TF=NC*|Q^>vgg7L`V9-xfjETEs8C>EH#ZEBRZ2$6ZXY*`EKn zjwVg?DmfQLwi~psn6+l7E*8N|hrhW}V8c-nQBkZ80^*844y_lwVVz};*$vc1X{@`Y z^IgO5Zzw19<~ox{dP0qT0i<3rn9pwH!&s!k8(@eZ(j|PwjbZ;$dl$en4~!ejF{=#1 z8Aj!Xih4l@0in1@pe$<{JBjeCZ?l6g?WcXrNe(mHCiT%isx4+J1b@R|KH#bK%91}Q z%%F4oX0QCcsmXU+Pfq0G!*%Z4rK@?u#2u@%iN5pWY=OsRF(au1`Fa9Y|60IEQ9X7sXA=5;MMd<~6<_U` ztq4@&J+y&0sf$k-?T^Nn0wQ)Ac4MpJiAnt=$DD9f{icFo4knj}7da?{hUB9~L>)(* zJ9$7B#P}O?3$)W9Wd-dU&W)=~aSgJLKD&FGNseSgj(}MuI-6*js!0zL$ zHe_$G-1PY{IzEN@^953_+pD-Q-c_ShGsE{Uw2|H1Q#5`JmT6YU7EhW?`&E|}<~?jp za!HBsZ}hHtf%A73mxJzk-O>c+p%oTMIgE=_lAA|9|yw6Wp^9;JOualEk;#j@J#5PwjRKixnCirHAprE47o^lh&W2F z7-6rf7nY&N4kJqkz_us^dWX_aYm`2qYrhI#r;j9JGNfE&;~Za+FS9ky*j3}-Uxv&P zaCZnwWTh#&=|TmJKx7i77x99`{eq?~3Qu~i3aKu3$YKGaz}>h_oSSsfH-9^%1qJ~T zdxDprdjUso*wX|v^e~~85*E7!Hb$C0+@5e7`Qv5SPz)PZMVoUeD17_3rmF2;Po8$| z9xIJ3l6AswFA;mbLt{Vy<=v2D43i#M?r%iNbfNnB=T7joO+$nL_c zUbPK5?wbczm(2emT(P0%F&<1xLZ+Gl0BjuQOeSN08x)r%5r2){={3gKhNrJs@RHPA60C62~uAk#A?5vE;N#v#=5E#e@ngrrj2jBgFw@YO7`N zT?VI1DCCoBKPe3$dX@-D+V3lbWjGpO+@p@94~zt%{^4EMr3aq5H<(^?Y%a}cIhme2 zN9bodzWq1Kz0B6x^*|OXOWeM`*$utS5P7nb-qtb3gR$E1AaVbw3r4Q`UaPh)!%!S^ zHBH>khd67prUe^P3oRww>sxRNtgDn*~3Iq>UxliBsyLeytNCW z+l8q#0b!MgRHR6jHg4<9QB@=6rG_Q7O-jL{+Y-|Uvw~}))$U*?a59VmCp|WnH^UYX~);WReSg@DA7$h6X z#ryH>K&31QfY}1i;M8D%!~Hv%L5p45IS)P&2=f||_u2g|P;Br@IP6^9k~zpr#6 z>2L3rkCV=IYov^cx-Tra;*an3e=7s_e{eqkAD}BQ;3j5C!8f&PrDEz?qm{hufO@xD za$hk$RAN3jmL8o_&#|h1`M?UV%4QHaocJQmXtUx-wc_fSrPkg}|00>a}sZ{PTrq5UvUm zmrJTo{FO#et?Lg*XuHx{e5xhEtUEJasd(<$t z_7MG^(&P$DkyL=mx!Q4bRPw0a3rF@_!Jh+(8c4Anbu~KUs1K=1b==b zlyTH#;cZH8A5r!~48o-AL5x5*(h!DXN=)L%TR7%+8FY@K3XOApzoIWProXmJ-6{AI z`1yi}vQKDaF z<7M5TO6R^b=Uz}`Fj^w&hH%mm6$lHLhJZCyDjI-A$cTRYdw3aB&AnFXonp2YmDxfF zmHUaxy$0j~D6B}(#8r&GE7V<`&i(xQ3ur0Rl~PxS$q?42x+Sbz&&^=Bns)AGc>6e; zoV6#^$5E!&kAr7y0D(!Y?&`FsG7EIq8Ak~84(W!w)g1k`0&dl9rXp&T-VYZ7bvdGG z6Iu^m_`16~2+$2R7Xd@eA*S@%tKAx-qhh3_OeXC<$(NaUWV5630<5p}s3huxCH>K8 zo-)<9+JE#+eV5x~#~TlyAv!-oJ7kwZMR~NQU|&0(fs2s ze>JlLF3xAM=#6$JrH*ExR$vaY7m zQ5`A%bGHZ>g*gCiI(GE?WJF_ZUW@LvnSe6}>#YjFiPY{WdWi$(U;zXm)dHQV;5JrH z>E|Gl{$qEJD^%{!u01rmuF*8TAKt;j!u_2A74cmW{IV!e)A{^B>0$75i~HwiPd$0{ zK8y2@Ig3JK3+7x(H3f|3?L^)hWEq})!PJ#RkmlsecGOh_Rckt!nhvbc9pN{4yV5E> z3){1$J?pcvURAwvRc$O>{kZh}Fi4FBqwp@2!rGlENuEAsqAL zVd?K5Uyy?X?*YEF+foM56u;YuJu}2=jV~0A=`aQYlKi|o+(rCTiPRg1? zE2y`_@|sug2LeL@594v=V=w$}CyGnL1%s z_*HL~CG~D&d!KK-!g%?uCV5czyy6XJ!YElLuwD(ukcZ%6*#;$Q{ z@jm!|ctS&{LO5otX#R*6CRF|PIta9!b?k~o5#zSatE&8G>+ zu13A1Y(KOW?Fj#oKYxzTIeWv{Ko=CYV9nwA+buz=vNtz&!61z2+(w)4LW~XyFX*oB z)KU9aAM9sQRbXPA_IIrt7GWkqm*HzSYM)@Mvaxaz7l;$}qIW19f$H%()ArhE;FXR7 z;-cXzP~m=Uu46;0Zh#mqKZp+_2B@i(qW5^|LjxKu@V0J`fu}jyT)AY3H~FLUR3jzw z+)oAAWWQ81{&%SrFnzGfZf4P?SVmh}mAfuVOzE$UXzgN{GMTIrLIpJ=8eADZNW|Q+ znb?sOWX9LA(#MIwv|u-sD@oqSUj>}NR50AM4CZImcoDmpjQ1^oRVSM_b$e%qO@$nqI197vZuv~pK zim3>A*Zz2a0wCY{6jLDtoi?X!H_RQ^>=F1Pm{ZKc8>!!vYYiLdiLvw!izcaO207eGgBAL|tZyR6g;&9VHngR>}RTyxbeY}tIlG`lvlTjoDt zD3ncM8Et~d&KdWe*%Vj(AImiI=E!PN?wReV`Y^el!&SDl5a?nkKrB$N8LMM4YZy^M z*z_v7XU3Y!0%`GWyo6%Tz~15i_wL>0^gia>d;f(6JGpFSF$>jj-Pj3>i8oD469z+~ zk__1%W&f#&J5|(7&>sNv*#MJhrMZ|Fm$uI|FdE-J_SDcM&K;!cD+3N|O-<`w)omDlSTA(H z?m<(s+Dp#u=eDVH$Z%=nTl`G%f2j9Pti`nQ)?p6CRVfbEmf-g<@&9V|U4yu@m= zVYfY2AFd_^q2$@x-z_`9N(`Udo5`zdwBu_`BI>&=wK@KoQg4#CX^9Lw$PW?t`pw!& z)CQd#2Wxdd2-_C$w_SRKyJZ$gTauFal-=macl^P0W|OIDCko_f@Cqn;&iKEvUxzyE z+>VpuVh_J0m9{0=U;hVr%GP+G@@k3nrY*%&%D^e57qm^&y2`IwZGG@s?n4iWrdyCL zBJ4{G@d1dr>c<0J@|Iqt3#u|wc&W<;V5qB9WMx9oBvpo?B_X@BHu|zPEpYR)II$Jq zQHTZbbbNRI4DB5SHhZYVsj&9pAL9qbaKj{rSj}d3Dmhhy=J?htL{NyW*N>la*p>gT z?0T~qODxuJ|8f~6NamW;>3ZXlj$YNTY&7Kk_Jv^ zq%7%mmJPNpiolGnHdmH2n56tlD&IvJO3TGf5Civao3E>jR^ZTa4Y-YKrzTr&S zn)-c!^DZXu7B38!7Q@WYHoM(kD2E~WjzxmNEiXI^VD#kkA;LohHFU%vv%J((YfZe~MAoy+nA#Rlcce8(S!)drOn1t8WjKz6sqv8!|@ zc9~a_ArS*ejxNfs6?+)2 z4Ahqv6q+12UDo{Ba@@bH*PiXNCdcc1c3*Z-_@3O;hyCZ?qGw=Bhc+L;3-3~42Ft;u zlV(*LvTB9K?RH*u%i<_)Xr~7dffw!cfDfhqf2^^Kv+M`KPB%xN`6nX+=EBl`wv2Dj z#TIGf@cPHN4hGVQgrn%EIb$mYw~gci{44CX5|akBOja6MEfLjVO%%WMV9`Swg4Mr3 zki;bxOTjZ6b9ann8B}a3>R`$y{AK=OaAf$?o6mUo9h-SE_El%Lyv*-FnQM7|BYoeoEq? z6`AYq&~OXu$5PExR#vjNfwL-&U-5XTAErBroVhmh3^DmqIol))PzMplaEPhRbfH*e zUY1DDM~nCY4&|nA@$a+KFH_R}e3lt&#K%joM2;bvA(dhFJ3#K@cKXt^ntpD#!EG-B zWApxgkwqzMnT3Ukz<-%+Kq+&3lGn)F5->C6rz=~M+ha_)$+YUB z)eB$s)DxjgVdw56M;6b7IqkZXGCz_rS-r9^5julV z_ZUJG668D=gLD?Iz{sh#WlfgTH^}gd*v>=2;Y$YzfsMMdL#lz77IV3a?!n;PxmM~+ zWA5g)E3j>bdUy$bj{sXccnPzgvyHB>k@ngIjd}uhzCe>6qfHVVYKja;1(ACa`Pc%? z6R?i1F4nZXGJmHjn+@gfjI#9Tw+lQjb_)0x%NACKEWRmY&b8GKcv9#)$_w6}z!_+VZ) zz3R4E4?12OA-eXs#_kYDl`os#r;oGw@c^3}!C{e3A2svu>o4EDr_f`uo~Oun!W&g$fhqM$wGK!vgVc=2i6p0rjf_IS#rG&S_T`1o z*Y{#}Fdm>WI6M^TcZbj3g~eE}3_D7$q+7MVew@$$`9kdqiX>gR{$Fk(<`qK;Q^9skXr~}9v?UJHMcvoxF=-AP-1H?H$0G!v-Zb8 ze!4G(#IowqDI95@Qa|+rA#@ZeIVgX%{3Ek&P@b+Z>rK{E&B5w3K3k68EIMXtEweM3 zXUqn#-#hZax)wqce-y-C@pt|Mjn5&OegqLMOl#5&PiubItNtvz`ggZiub_H=v1sCa zbTPL?Ikue_i|5U7+W8#V!?kZCnx5V)9;14sRgs;qf3oJRqtODpuPba`o?I}f*G|do zwoP?Ff*rqK%~Sxj*uopm4fNK>fx6EQ;)Y+!Vk!zW0H-^*1wM9!-PSnTQOAfA^Qo9) za${a(We@-f)zIo15xeK|=}bdH;>6hL&CYA}9TSIQj}D+Y^6pRxGu@eWy#Ez` zbn|BE2%+Kt;F9)}x_@%}_Hs;fh5tG&12_Ea02Wz-_SNPvGt@hr_ak{DsK}EkpiWjS zy%b6$kuEVfZOLJ*wn=unRAGB^Fi+I;FR%nsbzzo$<;~XEeC_dw3{v~`TJQZHyGMF) z4+FjP1`9KaoTNe40?Yuev)LQEoW$I-HwdQyl zKCUm*8Ky1)kVmuUKz$TWoc59-MYf&Ddt~XAB`;~attv@kMz!tm&P%Nb45w^Slr$R8 zyAdT(7NZrvD6QcJ%Q^qyTf-}%yI#D&rbG@Oij!r!U2^;UmHS7$l~37b>H5n}r%KQ5 zI(F`Gwc&DaIaevrnY6B>^(R;&H^+x;6R#hkU@_ujRiiEYq+f9-3cA95Db zQ?CJCOyK*79ZID1n@Z8qjkChHe>H8k;i-tj!OJH?j*e9}R3hhE zi1-AS?UuPL*rCymj58a0n5&cn%8bECOr3i{An#}f)~woKxp#fl?QkHdu@rp*FR89I zCu7->IkZ?Psehounx!rt?K5rZy!-I^iuZ7wqBpob0tQBHa-l^O4eeB|am_6Q& zO)$T>W!Lwrv&Jw_voWz8YJfD-I|swS*CKtPFW5VVf-z<%7D-a`am7HCG$!I{IG@hR z=!?UO?6y_Mm?KwpaTx!4t4za43KFUBVC(!%8R#!Oi!i)yk}=E#yDV3FCgy}*3?1Wk zCVLU@d7GBE)yiT_Vg;|E#<~Ao)^RD!W_^c=D08r=imbbXCC$cm@e(1P=Zt;7uSAza(X>nxL&j>6ntEiY_!!VEr~J z)Lq~4+icl%ebtItSc*LSY7sP81x&OQ{uI90NYR()_W8_PnenrEq9d~~ZJwy+4XC+) zA^f7-E7cbk@_|45doRz(H_!6lXQBe%aMe%>+rG*|1Dh!l;tvBcw+6MA)%8kt$^_3L zqs8`#?xw-hibK_A>ABdgRuWI#JggrI4-Jd>Dl15mnffV&L$Uxq^IfcrrF6Z>S?7{+ zHBh|)7cnK?&>L}Iq4g}-fPCpgBhoTcO)w^_d73vWF)N{%cYQW>=m`@=rP zm=41XN4Bg7sn}k6MlPuv94y*=FqBKzYwZ?&k}TG=THr)(qWc%#W&?f6U0s^lY$2{4HB!^0~+Y18rxV zS9E7uW2cGrZ>#LSw15?5iRUuBg<$@#5J)T$DmnvA&-?Qq@X2lQcYKZL4&;xn52+b+ zsp0a^Ex18W541HOx`M$JHMI= zuaSq}cum>AXvuB=!_R^c#OmE)G?Jr=x_@e%DLFB=)?@4IlbR-LBHZ zbGPOVggZT`WLZ^%_wQ1qy`oA{V3d&stOlcdOyCI$e*ysOw~DCQGh@#-EDf2DE-)NQ z9=*7!VPkISUFpszfRTX=rhUmVUV78$W@4L5e^UM;bu3?Lawx353>yX!bmRV^a$g~r zQ&0EQV$HeoK@T+_KUg``%~|K$p8o4>_sEi(Fds^3GXEo9izy}#?GCd;OV^KOVUuWF zbU}WJ)Uz?(6dKg=kRky~(-(=filF`cHByHsc$mo@Vx~Oa@yAGCX%F)f(RWkIfBr1| zW`pJ>^^fy^wN3rLTyJCQ#%dnSBT^(jlHY*1h9Bl?WM|li0MBb1)yXE$1e@vQ!RQ*_ z281#jUF{cr$K0<()sx;c%8_-($cRF&Bx}Ra!(FrOuN6M_spPwS*cIb>=qS>hEA--2 z=Hr#fi@C7#Jg#Ye=z^QzB3`d$Dm0X)?})<{pJv>5OnJh` zQx46KWtA`|x(A7+(SBeN6UFh7B#ln~HMvE@*Uy@_$FF_`MKp%ruO!xwb7>lFF;~Bw zQYnL%*$Hls!()zROmYUoa}nww@*t+1D=!mgsS{8_0*2wsdb2Gqr%Bk&*k#n(B_KL2 zoc#T=qfHyjDF;=X*scP*Ta|`F4}EOaIh>N)=-|&ztsCJfBapcOer2BSk@5VXFD?Al ze%gfHAMOb?C2yQ*_(-{P2=?UO4=YZEUZeDsr*nf~y)ZB85y!=!vgT6haDL~Sy(=tO zlC|Ehx;T7E7o!tht!A;7-stIIO?RttC!v^JK&X#Z1S9$jh#h(ANP)yk2|tXi6>6pt zI~qIrbgfywG6ydTXdQdP7oqEX>nmq-=dJ2<0TY15vSi*;{^_6M6?tz_Sx~#_ZfFK( z>3*Set>K7aRWeP>twQSgfJH3D=DT>ad2`5699}0q!rtNsT%B{a;q?Bre(SyistuSW znGc(|oD!^#sZhT#V8!gP;-JP&bS?2OTeMaF^{CyHHi|j~KSL@AmW4}6YZ$NoT2}S@ zWzDE3#4!6F?@>X(e5jczeKY+0#*4$%>(8G|7(fd=@u&^wAEC=_AwIQ);kQmJ1nd)J zn)NSMo-LGjtZ~`~@zoKL7HX_$1u`Df{Jo42YFbUx#r4PamuB>&3*EE?S19dOcO3EH zmUtq@k_kz17L{bRzi?QrKP|pRh|Zw)YqXu{Js7y*$P}}Dt+$UPD`=*)_0jRQm69Yy z{B*}mhm`IO;QH}dSL;;*?F%e`6-fJRLh`)wG>9ZaJ1$l0SJDJ^6U6 zP}8ys_xf5u)e=;GkX8ax<6q3eo|*1s!fW_^Uza3Q#01OV=>g`=1ni$-9ZdCyKdQA~ zLU-sLV9K_izbJDF_2Y+fRi``fK#aX=sQpSB(mca@^9hbzZ-ciLkNqkZv1CAw;3c2p zL&d)O37&mu6u=z@0c?nACdhYF&(7Lb+8IWA-9n zRe#)c;xpT>cx)J>GJ~6BSZftQu7IVD@PfngNCgZw7v#p`6Bwb}R*3j8xwX0!{ihM$ zwbHcG+npk zH8&Tm#%4l8fJ{l!g4`ey4Lzjtr39J1d=s)p$F)V=lF-HIWF)DWNG7o*OC}vo7920v z7}Y&}97ydBVVmq|Rp&}+48KOjK@?=B1XE_~(Iv-6JA{dVI%O2-2RLr#K@1X7wHCB) z*F_!bs@J|w!Xq0QcwbHiD;jHB=XdUAo z|FMvp83={W_mc~=;jV_1YuE?T;Evm(N}MlUvN73*MrMDv{S~;?**ddJNn2gA@chVQ zd7 z<6Ll&OuD>F<5$BsnK`=THOE8Ew$^6X0%YkLj5u7S`F+Fi2Se6xke<5I?B?gQL37w` z@c6SryQiCgL>TSiNC6MGvLwc9ZzuHYPP3R z#AxBDSS*f@DMD(E!#8DrIPCofVru=CbexA$&}i(H*l%B!_GPrL4)t2+Y@OoTd3WSD zgJ_dy6W#Y*uR8K=9D(&FtQV!of|4NI#yl+aT6=M zZgg%uE^;id7(1ObnwY67^M7j~m;Mk5S&Gs+oP@CP`+@TJuo;RUPx9^tFT1kdE2g#~ z*EqJ8=4`={I}zP)gvbQ)(Ffp%f0Ett1Y~*Z3Mu;`o^*8-ySwi zyYSm0;cC_)zaC9@fBHl7^kW>u%t#RD!T`q@*yExO7y-!jT2-$fi_kuTMFnU_AJY0e zbt`FwD*T(+@zJsQ69h*|i!ZMCHWjp9Z(6f&{&xn!ue%+yIurbI`dL=Mu$RQ}LNc;v z{Q{3XaA1PoaTel3+DpLzz>Xk5KXPl;h3w2ek~3}s7q0L0M9E#S-X$3&;7AXCAPAQk zILJL&7quxO7c7m#jaH06pK=+tdoitn`vSS>m>CzvH|m05Ry0tCe-RX}3v>}J$pp~> z|Boi*b=_?!{6)ZYE?7h`De?niPOUYKE9P$7(zCtSy)+A7YTsa*IqJ3^43${$+V{qR zt=aup`FKO!i`EmgRVKvII04WdcXNZM%8L z*Nwr~Rz^#B>a(r3Rl+7N8VbZ!@?g;t#gUx7*#kl5wNRda|CE5)G&n1%X;0VYz-|r8 z`^JXaY4cAfK#i;qoZP{Zl}zV$!H8rFoV#+2z$Uq(CLPyRuTNI_;J>@9TsO<+yS zy`QQL(~$Ijz2T$NMA!K!v;C|VoQ#<;wP;vo!hVHZ*T@bNSExKmZ0#j_|MwKbb$Aht zj~^hGBOTZMTw%1#XOcRqK_cJ5Z1(xU)q zV~gW!ZUPXAoqK<8W;Sj$IMxAbMr8KPDi{$cWnecdeYKY%WvyKGm0Ac%AFlO>B_aXz zTan58u<=(xmu`4uoGHe%KM{dmqWy)Pj}{TA(r?jEJIWjaQAuK~Df#-N(;Y`SNVfaR z;w}2VNutqTrR4zf?jX$Y3B91Y8{lM%QLXr8Ro*rvNNT(UA_V$hZ50;V@$w}@#Maxf z1>hqvKNZS1BknrC_ug_zKo}@T&AeRbp?TA5)&9v&Y-Y@=|3-C}Boit%;;EpENwR&1?1@5;7Z&$S7L39q=oL>)ijJ1Q%v;uR?M$sY7?gD?d?06eH8IKG1u8?p40~$)FL@f?&yXx3}i9(La zICBf8NTNYzi)zvQr2DDte8D_;My%jrR5mfI_3 zY`>UCb}iRP@4+2flW0WGcvsEL);#=7+4PX~Ih?AcE3Or&5?^o#w#P=NB?V|wpW$qY z7DRT=vh0o7j#)NUL7O)E$GQ`NA2&9RbCcTEy5I%1!%FwkQZ$VwY?9(`LTbAlcC^|X49_#6Nx;?$^aq8X z&(Ph7WyX|1eb%B^CSMeHJ;cNG?y%^Q)nabe@ISf)8t#xeJ=l-&t?v?2kdfEMT7GQ6$i3jzcK+IRZtsg zg-_jX{cScOmvZk@C^F#*Db1%<(#?v6`-p@f$7go_9c0 zSKMskR(nW(kiNF(#RNSo6le*c9Fm9PZSlB-6>wHdK~^CMY4 zI`B^khK>{4YIC6HMJNuGLenN?qh3DJ z0d@D|F`n9U@$yii65jev&t69Oooz<2W>(`9e5_;@@K!oHi;<~rX~MizaDA*tp7U4c zTdj|tJe31I3nDM|g8R;*E#`9k(^v_4rz1YmVN2sBJINhkxr`9$+gQ<+3$a_INEiKK z)uwGQA>2H8b_nn}1lnJF-}!U&WQk)GkbJ{Z?}%kSNtu1ZuQHPyE@i zt0aJ-ohH1rpMt5847{ruJk`C{3$aBV6o*)G(!oDf9-23995QMxb(1PMu4qY=B;Aix z*s9JLuM3^-ZAubZvrC{->O%PAH6HOxVweVI=);pAhOXtZQ#P1KPpp)Qx9&LnC}S=; zn&Qo1!-8I(&=ZucCfpJ^)%i}}|!m&y^)EUCm1%}J2 zk_t}$Kr12iazUOh8MsHpFnKgM?~#hg1qF zQS6J$p6uptlPn=rZ6OuV$BfvKc*P4`CuSTgP<*cLbEsUxAZKJL)YfPv)JWHrQVEEV z9oYli{Q^Figi1Q(my<-OEfHI#L+#!^m?c9QGRngZqlc9mR!>$p6huw=O={5kGOMk& zCLOGCO&m94SHCfc2WjOF?J>JQa1_#7<(H+5x9ZB-%pRna;K&WH zIxHLPI~103^;b=k)+5y6fcDuC0TLXW?^AX|{lK;0J-9#zYwRX9HnFf`AGB)DHXx5h zgNi)!d{1S+3JHyv;=a-y5TR6;C>hc`q94xGIpVj#YPpt3Q&b-hh7&}nkw|-rz#QnjdGuSYtZfnxaQw_YM)g`Ib1;`ab&nh{D1doo2<53_X2t6H9 zqOt@Z?#H@DMkHn^2xCULjG$c8(P9NOiCyi-aHyweXkYoe^bZE@p*7(X@>zUrn>uc` z$8ucOC6c)w`kdiTa;wAE!2gsSy*V)L`qZQa2gZIBnm#FNPS%qfMmj7L#(3S-B+=%c z0OHN6z(VX+QbdO5l2Yrqe$%syXT3tu1`P&dUvpyvIA*4*(9sQZKN}{zUM-)lTM>ck zDWhJ?wTD`;=UUY-1SKl=`^H`aGD_KIhocE~U?v9#r6_GJ4u zSpYWqJS|P+zDmHid$FAxM><9)SE7OJL=HJIAbsG~Zmi6IH>Ty)I8*+smfw)P_*)qv zX~bRcVsJO>O<<@Yh;y+B7Sx#)RsOlt5t(C&6O#gUmYPrmYNd{9E>F=!Ee8nGYjr^{ zaa*-}L2dc9%+BO7PCgJ0Pyp<~Em~t5M=R!m{)4(Et+z4{U4cYQ!nby>Ejy{s*&z|U}tz~t#-1cHs`SeU?+hj1%E3LEB2W`m91$_W7uD2Mdb`Lp}ie3jEsVq zOZpabP4eniE^-jG-zw|YZ_H+NH0wVA@6 z>;Y)VAw6L3XVpAq;!Lb7AS*eymZ@}AGcXo4UGzn46bDkY6xR*_F8qMlJOWC;wmTL4T))7 z3SpZM3?c=w+T=TGJ2kY=IE9xeUNi$eB29}hUe}YZs%@JT|Dzv!Ng%s;v%#m^)B=Ba z{}>_u=vd(`RS9&*v2J(d)n+CxX-J@2$(4Q$I@+|_7En4&pP&)49ZR_6L>$NO=5(c1 zbt?=j$C6k(zgp63Iab*TM@sXRHjR5K6-f*_a`0-ex)=*=zK-t4mugv0pti7>rx~G= zG9?>401JN77E*S-nx#hKAJTDNE`v2hUs|xv>{T6ma!;!r;K9JOYy~I`C0vHB89j=` zO1u#anzY!#lA}PAY^D9AgGs_j_l>1c1x z^vAwkw~am5?z#L;^vyW4zU=iPjLCG!iT)oOu`IozN_}*)A=MkGF)bp9oAYiP3njS8vvl~o@Z+*u*UKMjbYtEAc z&-!mY64u&XZ?3pA-$RsKq-lM&p%Km&(lZ|NxGrdhR-VM9^Dy+aI%{thgOw6g0$fRA z9N!ieZ`GKErM>o$TrFu9_~OqoGg@t0>Kf&cZ1;mFGQOd6qctykM9#eeXp5frKRp`& z$WGA~&MBWdfQNM0|4x9!Ae2qD#?M8XtQgG?lCJAezj<`F>+~^oI@^sNdiVfNOZh!u zrgy@B`L`^-oUpF&dCzP!?cdm(w`JM?ed`Uk^}oRy2@6xe_?b5o@<)dnQ>LVmY-Fbi zb3SL9>^dWBP|m6utYjkpOf0CIoE12PYUy~b0HsY=i4R3&%c}eI`?B%MC_Dy zLBw&{?ED~GyumB*yTa$#4?2r~`peq}X5HC0irtz+Z=U3q0Q)=L6y0~AbZGUaR;|HP zubT*jN|%Y4tk)?4RBxr>FXMtxSOpns zX$zu)qNs#Pr3Ed@9FQSIi--~dH7ur(pruN0D}zNu1cDk62qaN3AOV6(3o=HABr+t? zA_TG^5kd$gggjTUwsyCDzP#^oyzfVk9EO!^UDJ7<|Nrk4vijp}njYuVCJwYAlF{K# zr!S}Xi+dQZ$%_*V&PeS^fmFfEp(p{hkuNb6NIrrWtB$18=<|%OJJs3Y3K~nb?Y%JU zZQ}7=24R)aSd82|)meY;5#_sWD7$^wWku&xLjtT)?yaW9P#j&kmhBfd!zUh(D%k^k z%=3H~$okWEMCIk=*#W37T~b##q{Xt8CVS?P#6)pzNu%2ijaU!OP91p^d8X zHxAi*saLBdtZUOI3yqOez-h=fAZ;m>X$XYhq6PC$GMs9vt&*nP3h^Mj5)Jd)m%t9q zM4o>qek8a~Rl%is;Uo@kh(}ReMaEsub>(%~9tL~juiJbdlkl*(pOk4axaD6x@amF? zeJ6GXSL)POrVo6R!<`q=mHM5%QZn{zsg1YF@mru6JBTSQP4o`4tVw9>4JGqz?)-{T zB>zVGd`}N$T=vFUt8{gY;p|ulcw(Ci32EUVgLq!Qqv7k)cnTygZ;(~}lz^wnUqsa5 zd*}yVZMD;sHKsm6ycic3lZUsPBXgU~FC8Vv{pfj4?;G~~Xg%XXXBf2A*1*(3d(35I zdH@o9<~z|=@zho;M&vJ>85lm9SD#!o3UCZNByq8S8p(qtP2Y7H>Gs|7_jl}hlIj@7 z=G6qk9z@eC0P;BbI#w^6hrsk{`R}1x~yY zl}Oy!9HfQJQS``tm|7xPR|GNImK)@-rLk~Y=?(|Vs^#fbLZ{D3PSgAay_U1JUtEyyPpI!ZU?2Oy3v=6(9+TirY#7&7P8_Ia&3G& zQ#{`AGz%xgrD@7jGdLdsj)yOkN2-dlXT2xS;G^qUfh@Vvhk@+QWxXR}e>Cb#xC$V+ z8k&7ojY0yQBK<}EZ!jvnavyVRw+aLTb#7c8(FX* zm>@1e2XQGlGbAT_Fwsc~2`nVU+`)s5CL$?06b>AzwTgl(75txSTMU|%qsl0Fu~-!E z7`3J0leDZ6Q_Z0peJ7& zz3wE9^eWx#tMjT7A2OvAZ3hL23@;7Q}9wq!G6jU-6E zzllXV9frEL$ygt9<+rNP+*S!!u?PWL$7~sA$^c7X+^{9^JV1=kb4hf!C5V(V;qB2J z=@cvlc zS8a`T3q8cY%ZpZ3h)9;5i!3##jjP{31rX4fzR}5~f0MPS3%`7Ga^tx34H-0R3LMud zLG<);N4y8-8Lrk?R#s{MoQ?42CM>(2GjP?n;Y^N-gKJbKFTBQbspZ_-jKD^k^tovH zefUtu7Y&yaGyONx%m%-aOPcB^8j%8~GYI&);lOE!Va0Cl^^r=P6`RRp!Zl+0jKW)x zRm%-<#dId-EETBbo8*dT-AanMB!nx!G{{IFoMXz7BbHef<+zFP5eB0W4~g)Z*fw~e zP?o>o*olY&EVf3H{41mIhbNQObBy#IfzceFLX?p#506^|1V(7(G-6sAw~I(&2_nF8 zS^ri_kd79Ty6k^I!pF<(I?A@{I@8m1 zkM*Q(&l!2ddr~oAR3C%V#rMbUAy7==0eipdZWUuOqNb2uFq+4eWm-6dgY*I$dp=k3 z9HOE_%R9J^LmWJ^A-_b?Mi_Dr1)g&h5OY*y!L9i2d?c-FlXCiIz$m`Wh70rzeFQip z4ts9jON7{m;m#HRq}c%`W~UEI4sDY=&gH@oQ&1#lDaRk+8)tV|R3-8W_ecrF0gWNJ zD4t{K5T;drZJ<=Q2AM0MkyJByAd~^P=y^idxneO}m0epxPov<=36pMIu`4J13szTa zEdHSE+-XN^;jY9GTdlMbjbIwrs4_n6;8YH8W$iXF6`qkcJkO3B_WR5I`e2EUBkxI1 zYLGw*ISg@{GDDR2k?^BP<3;Z@cIPjOH=}U({;j$(#2Ve7IH|5C2%9M559@Z5enZpg z=A#-JRGgPCO=PNkKpqZ%xx}WU5Y9I+#Kf;>QAU$cL5hMc^D+wJ1`8<-bg>4aBB%cAbCdvB*E`l<1IH7|&9zPHLRJ7AaD?j8^G4c=RZU zELcG}h!oRb=Oe#lH)Cg#s_=l*;mYORDpqvjIrdm_1h%NTEb`1`kgS1OK{}7-hJPVV z7&Sgo@No9DjVr4}43rSAk{^Tf6i6q2sEh&!*C`(`sMt3HNO7#KyJ*p6#8nykw*!Uf zh!Gv@qhCX0hM|luC+#iQGBtS`bGC=xJfWCzQ;`>Bmt$02MEL<%Yjj#u3mDZB1j>9L)oa zE=<1}T^{7{Y<}%M1_PJ`NGZs;vAzXfmsXqo^Mnb6S=o7$)zX)uC2$|FoncX)+GW4c z#&GiH%C-k7y-bM7WZU@k`6L&BNu7=-q?=;Jnh~nA9Wc6{u5Ff&R^8Go)}=Rk^r-?^I;iE06eMCST4Tz~w@`Ft0V!%wWuG)!`JUe*BH z0kCSwP&t&}eT$7|mcY2fv^sf`*qMhekL~w^`YhoSPUrh_0AEMMN5aw?Xd8)M)`5G; z6e&Fu9cO~5Y;6eFS)>m? zDYxrrwSSZ_k@zUfLNimyq~))^aGey{+cetiaaGsAit=3=3eob)5M^$kEs%-hlPxV@RQ*;B}f!k zHM5wo+G)8U&Pj$JPYj^izTU|_+V5W?5@N|*v1uWV3RlUJ&L`0(dkjVLwo{$+%q*G1 zD50_g`-~Z3MB4%E3V1)r39hOnHg?F}ON7B(^885BPF24mXWvScXYR9b+^@;IWvfF_a zEv^?{HhJFULpVQayR07TPTK7~Vo-CV-7VEEryL*WDO-FNl|P^!>n}?ehHy_~f>6SE z-rV_J_Y5b4Kq@;VL-c}ilHNI0$1ED9#wJcOd9Ivug9FifqV~9pTTZQ^OWZU`nVDSO}%Tu^Leo$&Q68J3@)bYoB`$^uF1wfU`em;m|hphjV?e4*joIR0hgqOk!b z054Q_Yeb#>3VsE&t8t*F4Mu?c$5yNfovLVCOz)e6GGb7JxWb-#iQKs+L?AV87w5JD zANy%XVz?^cT4G^EOBceJqN^x?zsHYPYsPXjiQ* z;IdM6#Q4{kf??qYKHStC?~F$ zylHq;d6>hrs@2qeZIy(EBBt3iZth@m;XF>{P}(p~Fi!ugh^+w8k?*h%vFkwu>}jT( zrgP%V`srsCrkD-A;|!fR!-*3Km+fpD1Fe*7gjR&R-!Vtu;I;K<|{`1bnPQ+hMh-VF*9^|n32{Zbe9bfp?Yi|C( zr5662rP?yF_|=SqYV#oOhUe67FbRJ%T>Lq4_$M#MKYpa{SI?=x{#oliPr{$P4}bJR z`AY!*|LsRloEF!swLda>{$KmTQko96|8MO+ONn&tx9P-x5aInl7)lWSo?2`ZEd18Z zg*k24DBw3{H>z|OCz|#qO9~gHx?HrX!NW0Ftx8r{q5JS@24>v5Tmv)MzMLN_DI-oc z6vCu`^wS))cWF0V9Nv<6zqw==_t7sz-Rlk>Oie+yiJ*`e;-T5{5 zEJ#Od(r=ThDvJx)%u=q-YCCvgCNOe_&Y?3sN`EN$V}{%Rq!4_X>aKWrcS1Dgk-g4y zoZbh#lGUPi=)~e_?3#6TPRX-oW|OBJPhUPMBPzhLpv(G&bFR+?Qz45fkdbx5GX`Ry zhwGUVhrLznp+*O^qzq6R|v zWY}UH#95vn*@5fQyKI>rX4yz)Dd8v2FzY7MOGy2#h=*-2+b`xQCj%x_62!byPQ61ZNqnYcK9L#=l`0J0|1~@BXOV6n3=8n! zoUK@i+^sDCATOnS^<&WsV^=iFN#d4PAT3voLDju5BAqKf#)`DxlLwKBn8+-$V6|0b zSHG(7TxF!#jWa&`aHEw{9*8lTJY6l5_WEbXMH>HR#MkK2PWT%kHh)f*Tj!JIWPNK$ zZZ-ZuWY6$CjOb{yMwK%a&&v7d z`dP+M^=vVXaU)_lRzX%)=4Hu&ay5M1x~BD9WxBGp+L*<)dw+h8d0IH_FsnQ3$wg(} zJJ!1Y=$hFxD~|)rsdEFO@ESFG=K?5cukLh#Z$t=fu70;W8^Rrj(4%vv4(s6uuGo%- z8U6@(8-C}VVO>O8w`u*kwrdtI@@(*br2TjT7&GE{Qze7gq?YNO|kPXn_^ zGHdwSpH}!q=eRfISAExXa;a<5t?!dL&f{a5RO{4Wa^b}s#T$dF5ZS3tdUEP+*H~G- zKWgtVJ%Bbi(%+1wu)0*ZHMgpSF9{1a@}j&9Wu>?UxTW07p!jW?_c+8Q3#}8KMDs8Z zFOmr!^9|TEg2`M1w8izfTs$fdj#KxumD3caTt+a)ql1SvsgsZTa1E<|I+i+ zrSw!$owDsNBu18&E+R{A2sePzoMnHM-iy{Vdkoydat{2`hly!~sD5F5X|Csv|cUPQd(b zhdnweN}%m(sjoIRmH+(Y`@v@nD~@WuHp~G?6&X(Q0@c_6gFyWy^tCkB$&@w04SG8; z4Mvl+#+Eu9veAEmU+dD~;UYlO&Yd)}8<+gZoftRGb86uqNK2knTOu`Ai@Knu26EHq z0xl-?+v=5Q(*3Q2oO77%_hzB|)f+RKpG^;Bgp{Y#WQn`dQz{3VPZm^#Xuq+qZio4S zovpAT8!Yg2GprGbPDY8#m7Et)zU$k8(GqI7FmIefOn2Jn|7TrQ6mq|*{T|JV$9vMA zT+d$`0v97hh7M6YID9G!Wt6H+is`0DH~_?esZhPZvy_z-Q2&{o71G@a(N z62c3_{cL<|;Rm-o3c@LXz+GWghp&+Q2!uy0(ham`T74V0PA}}JFKD3kvXixK`Bqf; z(PD1@m+eXT&Au}#L$j1^spu$)(xP2926d4xgLWV-WjOD_quI7s%Q><`smW2p^Cvfy zoI~Ej^?xZevnh#67q?FWC8IDO>rq@-(~`qCrTu~zGRYYe!tN!#=gTME>P%D*@M}` zj^oyF&Cr6q#)?NvjpCk5Fmi(XYGYYPRC57!Lpal_jP8Lx&IsuNk~0}u(`=-v=VN5p z3GsYwoSeK=Jf%z6Jh2Qe6_|SC$rGm*8HLbLMu#n1UZI&dJWJuE zttfZ_7^;ry!hp;Wn9GN;zP+NYp? zHVISbmCStvYN{{#4bG=^ylI!o*e4&oR&bz*m%h$>h;X4@U4tT3SPa%~gu}smjzvaBF%;dXgcteUp^!9F zj2_*;mm*Jk+_gLsFc}>Ox zBe6}~W?bSJosl&nwrY8ysZlfi9CEsq-Abn($&Oq}*0ugPB(_u#6yYPNDQl^a=*qG% z(+C%?AKYq#WZ&a+A)Zrm^tfzH$-;8+$sUHl8H^c4$*Tz_oI)+rI$2v1ff$GK=;~E^ zxA>Td(P)&q$9Uc$GxR8r2G`FJAJkHp#x{PpY<0$WyT9-OA!nf;PyiAU>C7@4y1CI)skH$*YmY(|cjE33@-7^cD9BruXf ztBpzJM)=e6azwA=8NzUq(y^XPf2PP!D$v4b^c(fnLGd)otf}s_n1%}>Vglg_5r~1% z<-}KGs+$s$Tdbr&pIyx~1G2hK8kten4kP-|a{Pq+^tKuXxAOrZ`h*jKBFA%DCCeqe z(scREtppRiy4;BcT2_%orBU0s^$Ynfl1oG7B-_D!G;$;&+QAP%*$S`+U0KI`lR26L zu&ONl>(U=sqf2IT-L54nbIz@Z^#)7;t8)6^*%Fgiw&Oac@c~Aj_}gD6tpXP$WuOed zQ^5~dXMwPXpIW4PoaS?fP-3Vrfs5gq*lKeCo%6w}0_*J?Cy!GT^iI{L%YA7X6QlT< z;D=~pozOn8ZYC++x1sxHt$(enDVETKJ8e@KwH2kb9l2>Ouqxo?tC)#tO9D0@))mi> z3OkoB6vPV(^eK1g$Cm)NWvA!s#$~DnKqas*(IFs?#md)8CYOef8SQeXmF($7rlj1y zCJK_-3%u6Ge(CF*OJk8^p>&&vKk4608y&mguG~Ff$30gY!s;5taa3pe92t$>_C6qI zxgUB+94a3oUAt8XXK=dHifzgw#SbK5h2b5xjm_`JP#!-Qdu#*p&6BsECC|^}fp6ta zzHC|gBaI-2>33;sWu1T1BU9J?JpneUJ1+)k^uuMetu&e5|3Db#!w_Ei#lZE55kuDZ z$4U38;_;=Kn?7z^ZVw}E2q```e;xa{{?BjeKhKh# zc66$zs{o{dSms(fH}pGM!!d91W3JfvS8bVDZ=x>WdMM;CqMP`Q(7}3HpBGH%b&$CEM7yGTnK_&vGP zRBvE$PiMNqxykL$uca)6h7B}o?rWGmJP9sdzws~roalKnc+`1sYC_p^yVSF&m+^WQ z4AiW@=KtSSh!?+~|K!fMHOBv(yNcgfx7HGwDSSy;8BZrFfjweR^BEvact|e@;Xbeg zJ?#vmh5tCP&6eN08HsHVPKZoaT#yl=+i|;nV*ogZK|8ONl86WY7~I-4$oTFZtnUvf zuk8D!T0bt z&JU_zvK*Cdk_7@z*Q7nj(XAm`<|q;KnlvZVON+&R^djb~qP_Cl68$Xh%oDaRcR7mPD9v+ zM0E&oHAepjbRV~Tz9iWTA1AbeB@S++Z>Qaq`2tMs3JOU%9Yy?nH}B$xE{yQ02tiJ_i18n@9i6Lp}ZE zlBG^c#IezR?Xt@Hl{OaTP+$0Eq|OC^@7SDjd!P&3P5@mxuMdpSQ_9bjC@rLba>%_q z9c5pJ=ubutqX#~gl`(g|?4>IwM=O9%9#q-T+}+Hs9rjc%s^x5+!Lwp+2mYa;2V%qq zhKlLRb4GH1d0d}A-cr64fjzqNPlLSkK9B*0>OJ3kwKY*EYK9FJ51c&eyWAvTP(--w zT6sBt@!gye5jl_Cs{a2RC9i<^g)+>bo&OAqx!W#w&a*<$=}@?LuqJYG?iFKQU>`(2=uF7>}vWNL0Zl-Ptk2f~JMVX(fOEt&lhwAXE5- z>F|e`tFY6mk*TiluNb>BG+W{<>oQ65YBkAaQ%=XM0o=nXaKoJ+#ktArYzGl8Hga#} zHMwY^L3g*jGV!#S#*3!7DG-Il9gY>EIP7dNnBy5f} z!!PzX)3bpT)u!DK20l+)yA`)Y*f!W;)XIYu5dJo-Ww zkhsV+&Td8c%WML<4ofj7_3je)iq)g~2^0x5nFd!Mt=&fM_+w(xP#Z?KdneI$yHi!d z?PLk=98juENsg-)f!d}`@5O82W}H{@UmfSPPFr@ANoZ8}H5;)LzEEW_ZRZaL^!6PY z2fk(@@v*9+aQRoX2FpC$T?H{n6boE)oa6AKuN6hwF+}4@7-EEfgP$F`-3tw6oL^Y? z4{y~pSIgF95qSejD#fDmWR;PevQ*I0bw3gkJ$a$!Zg=L9KnF2_sihPrh%8bd1G-Q&DPF_`R#LV^Jz+<|>LVXcBZ-FV~7Px8zsdNFcS)kl~Z&Iu6q*Qb#94J z{}}mJi~9^qq~@rCZ&gjqngZD4v-}icHYc1vKTw-78>BjcwoMl)guc}e zAgl8Ql{gdrQdjJk7E2`<`Bt8l{%`kry}IS+_t?SgcA~IH#^I3e}x}xu)qT-H!fJ-Ar2$g{!+7 z)h5ZaXq7y9zBW-UQ_obfm{XIImkH4wo&3;=PZGDDjvBRlp68{e5B`wUk|^YHEs=rFnJyZAqz{|w@x0<<5Q z=}(^1QjYK)j$Y{Dw)HjDgO0RXd=tcftDR za=TX$ydwc*t2@7_`I*C6lwFl>orZDx8`WJi!G6u{GaH`yk>ptXg6DI;^nQ1kT!;Pd zb&^3fZdx<(GVbwrRvI@)Q=C6A*@d}qc8iTWH7w>4!KI;v88Q`YqDkC1ewV}C1F__= zoZjhZ=*^aYyQW?Ah#`F5b}<_c%y80fOcIRH3lTL4vmkC6x8~pL9GC;?&9Og>okxR) z9M-f@Usokun95%zNu$8eVFrg0Z7o=D+hzJ5sq^i_#{5vcomNNluoN*tAE%3GQ6hup zlrvkhF-$J(U20CAq}>DQ9VKYU)gvlP(C@y&AF`vk;u#W#C2Gq)RfBrEQR(R_m6`3Z z+0z*?GR`> zL2X3>6mI%w=Ao4VAwR~P9j!!U1k*-u15VcwPB*k>AYz06B%uqj;IlC!OU3XQx2;Qq zk7l!NM+uJ#+UOzuj^#l#c-yq_tC8{CMvrA_*Tru)GI|tU+#KJRGJ%o3KOFk!A$f6%836g>y3mo;tlJiFpZuOeQ%ezYW!E<4 zB5Ro^odCvTb&lk->oo!z*XyLZD!>2YX-phy`~Zas%J zLWi4FcD3UV*3c&HS&X=hmw!;}-;PA@rflD3#Q-^|T^oT~;X@Wac4OcvlIP{smM@%lW~butdRfxMonU#6ns> zFk_z|ZSe``t+>>N73_&Gff9qGe83eOQH%e%Zr377&R=#oNji?M>kOwK=ylZ8}w zC;5)5l6PqmZf7|1;1Ypzh9cyN90;G@q50qbNZ%(}j>wV=?WrDRZ#JvHuU*yP!eNlM zZ-p+5-u5nh0gI44>Pj3jMXAsB$vx1xH7l@ATvkA>lVMN;d$Nn?%bdA&4+->g6=3@* zQO`wFLw=#BLqMMatIlEl-+pA%ved71R3}yj=`an~o_IF$+@jquetuxMHkrq|&@SJ3 ztle?v87V#|?C2egY(zsZNa9g^xB)F#mMmt{TY~JOQENlOa|aWS^gu&#pl>aj+r@RA zWH5n}9LeQpP&-LL^fDCQD-no^GNoCg$47Cof1q78=g%)y<&TdPzLuK7dY6sx-YoLr zCpQjkzvLH@1IY$n4IR`vHG5_*`$>>Z%cO|?^8PJ3Lk24j)^u`B>lU$HHhT|a2EF3< zS|sn*+~20mMG4`jI4iy;y?M6(JLeJu-$Ppei3%F*^L((eWqOs}h1T5=#?DTy=eZ=lX|txB7ctKYnd_Q6TN| zzao5^taJC@Y|_#?u75JES$}+f&@hM#4&;YXxvJMg6UE1Vmcw(V4JH7um0p{3E4-jE zCI}tgc-qm5Jx(lWtF$VcLVl?!;DRS#%8UHoe@hcb#ebBGOV?y&SSpO3=+pyx8$5@gz8bZG{ZtL$Tc4-Z0xK zZ)xB7*G@xG%Kj`}bXV#w zWovCeWAs`?N#btd=yR56K$X}<^^t!j_r`PP57o%%Ezba5k?jhOW7UM)QX%$_`1nuz zV~;xa`1;aAD?%6&_5DNZ6F1*BPz~Y(xB!r?ZrY^XXLz3doHd*_8qT9$jx_GQ^V;0E ze#RtXs&Pv{MF3SE=447b6m^SmzU!-^~i_o}??>;ZX={$A0bGO~- z=;k7k!e`$6dHc&Q6&tvjm_7Nl-|MS6*eZUFWzoj*V_hl{)P>{-cibY4zJ_8hYF-Kq z?LkvIrJe;q#97JEB4fg5kGsB0$f-stN{fg?cCnyeGf42y;rjao{;L%0tYUMzj+Cw!3YkK=KM)w#5slsY$HYF7$wh2Zg z1R<6Qx;2JFMm&J$%!?63pj#5YdiNXuun=mZE~3{8q|UvHr!+;Y)3}G#HvpNA*M6dR zv+VGb{O`73I>qSnbPv<%DQZ3&|7G2C*71Br=XBqs9=VJdV)yBUC@dFw+g})aQss@U zz}-%iWo6`WtT1X`KHZ%TIe^CGn|$qE<2Ll89Hgs%But8GdU zu7Dvu7?w-Jc0o=H_E_DW`}*k0F3=2fR(k5MQncW&*ZaLB7+<}K0D)V8jw$Q&JD)k0|DjQOr^3_Z8y*#Yf90s= zCnbFOpLJ6Kzpu*Qt*XB#Y5of){4SaL|JTody{399P{VvYqf%F$I=grk(tTJ{^Fq)k zm0^>1Yx0$vqg~V1vFi8gz;AhKV`OTw&L^}rSz>(`iuO9mD+(~1r9!$fM@sh!-|Yt= zI{}V}|H49(ZXIW14pgxr{vgYC*cjKLZW|lqn<@# z+V~hhdaV{GMtp7J!>55QBdF4`DR{u7`)&60U5NW%pljE@i#L~BX?>%A<&YLZ zf31R5j7K$<=6XKh^v3IpZTrs8Z8jn%h^fQM9=JDH6j-c$laDDq+LFnLeZ*OD8Pcso zuq`_(lyEJm9tfEb?q#JSxc+hli7T^J@Vgh@_Con1!v60+|8P~6-lt*lW|(JY>#W0G z_%@lR`s*h`vBR~|T3DM6RsG2Y8NPO`L8-K%ivjBIoe-H&P}dPlEtG!K;1N>Zc`gQY zj4go9=Zgb5_*REQyxlGM>U~~+PT9Px)4fCc-qNXx_&0k+y!IWJCxy#P48BWK(9%Vx z4tIV{b0`TcsqWkjjQcwcJWiG#<;ESN2@;Jhodz>TGgXfYMl0Zoa=1INKHN|0nZP5F zg>b@EMY8YTPbhvjrvI;euIY;7H2H{ zDp;&D86Ds?wM_f5dL+e2$&Z@iF=;$A;>6`cAedvPDsSjWW(F?$-+Gm^yfV-=%+`Z; zi00tLYT+cDc)WWf2(D$pm4cmj?sCIzgaek`lMs(0AX9{64qf=knMWE9<(s$Cso&FV z@1`YAcc(8%p_55Cat*e0>?Hs@O*M>EeeOFHw8F*4{GmRzl}c^0NDa{;x!n2nAp6`) zWV;c;HU<`*P#gQG$~sTsIVwg*Kez~`MhI(hXcraWf@skTmN!+9Ff5QirYCpyV}XWJ zBrC=zef|&Q<(zs2JzpSDzoD<1();`yo|*5@>;A`rNLsbUxYa8&%xG)aS_mMuF9$;e z9d%{;go102N`A=Pq0P+p+X+!P<9h*oXK-&s= z`btJN=zK+Ko^~i>SV&8DxXOw|F(b1*#G`4sP`yr&Fu2gos6=`FG_NVwY=6IA@e4t_v1ITxbwdKn+O6rQ-7=K$JG{*T1SqHQ$=$l+~|N$Hac zxqSpa6+=XGWG`%dWAaunoVS``q?0fSyM1RI8O#owM+L%Pfj=&!QEn&i#JkbDW#{XM zHf9tkiyV=ouhVuFWXJ7KYX`b?Xq%CJZQ<%$hWFQ7<(_Lyq zl>8cIoD@vPtFEGD8E672P1)sJP~^K7OWH6L8DOFOKR*tTwUnCA(= z_L@5=8-HBBDx+xNb+E6Kv-!B~X##_aXWIsGv39A!sDga|t~zN4G3GciW{~kEta=Ww z*6KBMmBWN$a@@lkUHQ(UaOo`-b7pHX6=r~?XDWY&BjR~W*ou%6zA0*ZJVocR_13Q* z{yE?Gj*2NczUDi<<`d>cI8;O5oiyksvgz}@S3~Bd=Y!IMB(-U>{D`%X-j`)VQhV)t z);HT9SlSL`1>;HvA^3((k{ew|>vXLv3e7L~LKpNW3o)~G)N)6+T)biSA>fG$G3kVj zHFNC^LS|eWR$9s=zWNx7H~GhvXsZLJ#FJ}JH)!pqhg|j!pmL*z5jGEdRG^volT5bk zl)FyGP>m9}*AikuDWaA=AHztWoc)~3ABWPL%R+stBvh)rnWH3Pg~h;btegxVmtPSQ zrJatINA`rXdmS2Pi5$A19c*(eG~)yIIJoe`IB4xZJW`WE$KDRF+NUO3JLtp%cPx*2 z8)-R-+xK7VJQk_<)rfsefoh<8$U#WjzIhPZloO*CxrUmoh?wpmz8=@1H(S?i{zL1_5)S;- zP;0*>XcJs!{YIbNz1M>Kh-X;b^jS`wRjMl~7V5BkUCAh!KM8~t*wY^N;ho#y1P^;5 z!mk=`z7~i8RK}5 z2q*q>I58kZez$AtJsM8ZXERO**_sA}jgOSkZyJCUb7uV)!nxO3jf*B&{0fjPtC`(` zRw=9m0whn#QsF#u z?u593Bkt#6>kI6`-S({$1nkf^vpztsABzD(dop3Ai@0U~HRPC&^A}oyoc)<8n=%T? z6_>*kDY*XR$-0$3sAt*aBkAW(q?^LTqpV(z17laXB=VNLxY?dO{AOEcxMSsP&|q+t zfWWNP<(qOR6+iKCrjm~>KKnHaTqEZGwJ;Ixgqw2mJH6%ulq2ZKBQA9Uz4DI#5>&o# zY!!N;Cw19YWc%uRHLO1y%0H5`Uz*^XEQL7JU;4(-t2#e<3^l$v7{#|-3p}Th6}K}s-}&qZkcYrnfqrNu^7}M3tR4?9 z)buUH&&7}g0&OE{?^XS|`QCJ$7v9N;9cZ^pxl45dbtR>b-d49G*w3ibS$?v4PMkqd zyyBMp>GYdcO@c2CaEHBs7OOpdCBR6}dv^J^I2ynJZ99o<%uG3KhtLg&J)(6=sDEY@xIL>78$^3QL~4 zu-(`>ifcNiHr1eru9Y*ep6ylJd?Rr(JZHEyI74*0U|>sH&Xc>M(%?vJ8bCbN#e)dL zdf2NJ7+ky{d8{Ya)c0r8|E&86=#YQcEzSMwbz|Jk^rub&r;jZx4(|H?N~UJo1UYXi zKi2ZWHRmm<-)di}q&_882;tRjXZD0tBL$$B;7?+ZwT1^m=NQ;s8T~sR>blDG9)}$S zKO&4QtfUfW9C3~Vh4nXx*n%Iwdo;v~O7@XcfYTxMUVsOgUkvsWJUOkfn2it(K?P4L zW(eF_ySI;9?D>E%SzM@HZ22%|5=TPxhg|d^+%+2v-#G4}yt?Rx2Q~MfglFIdLj*gK zM|_Pht7ZyqM*{n3Ob#=+W@FPyr)t7Lnb>(fF+rz#)~lt}roY|_lNnSP%^U8*j1nbz zLroPqs=kCWY9Ab2qm(%eHu(Dz!?=I2Tz}JCd3^UBb0N%z-B^3`(SmpB(M`VJYe*V_ zD-IBn<3xltPY_7%@yw=8ctr)LeQn#x!E55){UHrv`&+KUQ&$I=oL<=SI`-%o?A2h< zd^%b0lamGA!6HJe62op(yeZMOO1LN4idEZGWG}uZ(PWHO1xUhp!<$ctKzi44)VYbA zvQg`Z4$APUc}&?8H%^Xrg7sJ#e(&08dh^Vq{u<{`xmk>^3vM!O1@%ZlM#^2%1N%b5 za&a0hjMIG-%INdxx-)Re-_oa$!5NCdKP2!ZoDs*Na9-~jpO!a|2&~d5RG}D$M$mHW z1bdA4$d#uSZ@JFGpsOV~KU$f6mV>dZk--1X_e{0!m6m;-^O40 zS}1Od@u0aD{#unl8zglHNAReW7@Pww(Idi0d#jDsio!*o*KYXmfHgY3L#xWTypXGH zf&mb6U(?6z>nl_0{9yQOZ@kybpPqQKWky3sS0Hqth_j}yuZ~n_k+GX^l3(3uGOv*y zh0+6BF8c6uY)#}rEimY@LJzqW8sxM^g6FLow>>3r#m>HfOwObaBaEwjRBT7fgjlgf zJA&XBpza~S1R(Jx_W9?u0>ZGX?IPyC^CQ2Qxi;Po9L5~@I)2U4#<0Kp+Tu)suN_M1 zfi+s0_Tl#aw46v;*+H#9?Rj7S!c$oD5yyR-$h6&LlP^F#xl?MDePxA(pzBbI zc90C9B?4SZ=VpP`=abyXGizcHP~*zOI!ut;e0-3$^SQT^vE)>w?Wnmq86Tu|gfq-u zM&`)v?P;XjmYoh=gc(L&;pBI9eJpQjxx6x(;=v^`EgQ5DRqC#!^wUhWi;@E8yWw?D znpol{aU<`!s@`5+rk>2VdJv{x<#?8H*Qv&fFXH!r_M3F1KD5x`-^?L|I!r$v-aW^4zcfX_r-G1@1p9k z)E^zLUZ`beq`!Ny8Bg`bU%DK>Lap1^99EV>HW-UJc`6i>jFi*3`W9gu*qvaM}S&E_NfY@u8Vca|OqkaiJaGjma(}w(C`}6MJ5foSizIHS0ZsmpI9k zo&GAPSR6MaaWR&m+9UQxs7||61YxKK(sa$N<~V9L@I@L`&nE~<~c8c0kIsbCfX z7e$QSr6_Vqa*8*uY?kP@=<3D@x4z{@$>S127=Cr+(aFawtbgt7*V60#aq@}t_P`ZT zuIMp*7(&NxEJF}R$4eI|OE;1!^TXF{hQ>e4jacb4kAP1+C(&$f8(jLvrmq`bogHDv zi~IBhW`hkFjjmIU0 z7{Vx%{74BLh+CT&C3C2-W_MO1T+-El-QxcDxfO}6KodSeHCWvFEEwds`2z;pDDR6I z>ZYyQSM-cGZ}m1G@lbC*+=ItcCf8N4)%V?)oRYb|5`|x_NJMP1N{#+)c64WBP})3S zOR(p6!)Jov(=1WRzw3S*8HMN^qCsf$FX+_7yfQ1BS5-dj#)J8$pl{D!pGD5nNdQ!- z7Bk%qtI-jkg4T>bcwNZa1m6ODL`^U3xu;zD6bHKPl3dN?PW7y>tW9#$VP z$*N3bgTTdcBPs_&flIMTe`DQ#FPPYg7#g1d;Z&w=Z`TL;lqa3$r`mU)*ZbF@ONT`z z=@K9+QmUn?$r1|bwu5v&S6eve-QK$_jjZ<;z-jZN>(72r4rCc)R zYDyR&^G_^Z(#idyEgSfbAo&#ZKNcS@Tlnrbf#zEm`tPdT zWUc?K%V0CtTJSvpBk;oiq3pfmlJ2|z@wRQthM6gqnx>UknU<4mXl7~dEJs75OB^|H zfIy{X!;veqRC1I9h0@R*KxJx9v_xEpdw_}yQ4sjO@w)2jzV7S#+~42dKIHux=XK8W zobx>AIR7BNE=I-wx-ND%;PCfQUITP=d-%Ta>0Opl3TOe8%pHEC zs7rd;(K7GPFMj!-L6ODG#mb-avvr3*W<9X6kvOw4%xyvk6G(--549m zM{-%b79`LD+P8sFtR8k1CXi7*7uCmudD3?fqH>0^i$ByYO$VruOTn zRbPENlAD+lm+N|v-aQ9hd8}hgzu8H!Qn-BD& zN*tu*Hl;KRI{!1Ozes#71!(3|PI+NX1b$QETI7MFL}?AfzHD<+rFFEf^h+{GFYXPOOeD_mdu_B@SVqCVzmBM9&~T1Xoix-OWu@bFc4(;tDjut-Cc_RcN!)yPs1H~>#B zEGjnV5cm2fxev`FzybflP-b8`Ck*oC!%IVQa5kP4`A*hS9Z9UgN9LWEoDyyRCU;*H zJa4{sG@WG(bHu?fSKV?4)#bIr8(;$M!n);UelIVpv&sS%?>wDrM_6@6D4gIXI1O>X zLT9*l`P1Ahd6_=c?@&6MB(kIwue$R4Se38$OHX>jEG|b_s-?=+F=kckB$r^Ov2cn{ zup`uwNgIIYmB84>eF)4<3CYfdevHLs+#=~Nww?d^?te1u*fw%nr6IQo^5iv*h-_X1<~5Uo7=`^VpChi?g`^r-+u>P= zGcBC95{&L*PlNttVxki)d(7R{~@DQA$ zHj2FCeNeFTz5S_3GF!zBP+n5`EoKCxEV?UV!e`E%KkkCnXrKdbI znf!1BIP8sS3NM%7wk7Wdn( z0+QV~UT&$NbFmiir#=0P7K?9LK7W>4y*zhgyg@6i`&Ik>75VZXu>kdQ!ht{W=?WgX z+d!wkC4`vg!O@Xy0Y+htJCP;Z3^HiiQM0W#O3_4rOyR6REN2EOR_s0vu$_Fx0;)>z zpV9iC)Nd~H;HfhVUFcZBbXRJc-_`CV>g-vyg zcjfQ38RH1f_SCdy;!f0vPKRHPStR>o!(E3B!@0|g;mMyI8|;1SdD&H2W3Ov9c2HqB zmSvWTrgZ##3C@c7;^Jg0K)C;-=;q;EL)m{7HIVGKMbh_L$88*UCxXA-eObSR?G9v5 zKDH&XfjE&(Q7QgNlxrz0Xaf^+6cTmKH`&sa;B~TsQu>pRx|xw!^mmrMLoh>i>*(i` zE8&{Ez7+ZXWQFY|X?Xnr96uG$9EyY48-Q5_BnN@m{r|PtUjFxMX}Rdf?rXMj#RTs^ z0-k^Vs9yf!bgEkC@TdjeF;TxCk`_-FFhL6=&I|d%XfzATm>Wg&F$>ZlV4!3n^?6AH z57G>G2~Za-_EMgs6A@X2euI>EvSYdx@QG?h-ggx@$raUgpUgippzvM1FiqZ2hZ#1$*#28xUCeCoP&7ss^(J$ z90xj*PC|Fp7`?{;=; z@0!*FngDOQV3^iEVxH-`DhM~kQ8{b9BU8BR>qt9NyYV~H5uqp2F7(qy!V<@^bs|)1 z$No-h=M*~ucfCy&Q0I3$S;u%pztJw?cT$NhlJK3^nZPPG!x>ID>4!a~^o#l4@<1?t z2*_zC{p)%>fk2J6gnP@U=R+eweA3Bd_kWjp4oox1PoY_X_h-Si+3n=2fC&|9WyyIi zo!rbS*-kOtgQ?AT5}Z!s0JYiLuHbwqMv$2J6fdQRACN9GA@N%l~ zUG?Q2`6M7$7GzS71sbv>|K7zdn<5XYmTCh1AzV)66c3YT)mVOltjHRTTlHGS4A}WR z*vt^c-h8mDhbsI6uXh)cE?rDMJ|z3${%_CvB@yez>pS?NJ%LI$VnS$ zF5Dps$Li@JN-tvQW<@y@^z$68?i5=}c{XA(6?`(j;pF4Mq= zv~i^K&~jq?p`pG>H#rK0i_8=1KkIPOr6<6X$AFnZ6jnQ{bzB)3{+;vEBZJmOK)Cz} zQ~u!1|EZ@^stZ!nm=Sfn92PqLtp<36He$}B&Nsh0j~uy-mz&5w0Mx+dKL|^oYBy62 z^lcpiYqUVA(-;Mf8+Dqyz{HT)671t->p}FS5F5;qAJCNjYydGt z&>XqneSJ!K=R5I3xwF6wIv)LvK|&HG{b%v--?Ytnow=M(aW<_Pd^*q|1bN|v<_q%; zH4f@*SgL(XZ2FSCXEgtBcQa3(NA7LHj9ckC>UQS()`6?#v*9UZpbKj*;v&$29Jr7? zD0=%JLKgY?Gc(I+!`rRLwH;zh>`uLXzwTRZP3c7o+D>Ddwk?ylk?pp+H5*PhaCvIG zTo3E5mr$adoYQgNSG879qdhO<2d##~7Ivz(KwRi%ea%|WE_z4)Ip_X=t=>lTh1T*a z_W=ryoTXq&=c!Zee`rdIG3lN1C(1+gi?Ws zdCOd$E-paRi%~muhW?!Z45~^^vnG$5-fSJ<9irJWSTj7Jg8?vCy{!e&r-=Y&Rajmj z;`&NK?AK0^+rR(+UF^V#Tw$W$h8jID21pQgd253!(c+G6EmUMH$W9rbXIS{PW+G(V zbwYFdf}HGe@Qs26ufr{nG|ihq^er9n5RnbNk6|6`AZM-pR3{&6xBS3LGhkM0me`Gax3`%*r@kh=hVhW9>`z?)ZH#iN?-r>zfn-;O^Tqek^l_B0H+4@|bo|-S z%X5L7B@D7*`DtoNFR%Y^2c;HenVsY6Wjv0W6v+Nf4v zGklzZvgCZM6?(J&v?*eh6ON4_8Su^^wiagB2_jL~?Bt3#oxmt}t66)hJ{v0BYXG-} znZd?VqWC$Ky1^tj*_VigU-TEdzDeY1a8JnSOlO$eYV+h=;}cM#KruV-bTFiAkq<4` zK)qU{W36|j{KGhk+S7J+<*l_J^K(}LwLx)fMS9NnZ>^o##Vj`4AZa|XwhI8_e5*$U zN%UTzivsrQZ_CXHdHlSoPH9fMxqeB+>}kO;p`%6ronvvkn|X;({C)?&wgMn+1yH?x zfCd)B86~7yb-cZ8h&IqT;u=-ZubwM>gRAf(@9=O*$Yl1 z&D=963cWTRBg?%At-&1R1wEx)o%+PMbHjur<3(eEP5o^_;CwK?M{OG=DzmNTISur||Ii%*LMZ#tFlHDZ< zVU5wkitjw>8=}3J(ZAz4u8~$l@g9-Oma&arNZfByA7vKIvX&Rs1IZTSeKAddZ3_<`?}aP zidJ6^GZMXI3JT`Q<;k4+ucO})+3<9&%TcreoqXK81{>F6BLbHI^qsNf>iN@O23HE{ zmA-hGkJF2yj%t4I*?&rDaz7{7yE>;a9NN^DO$fj zV6o)tA^tG>lYvzvO-mF%5j9n8yi`Rh)vS^cU98rrGTym*FU2YThWc$Qw)mMwbOO>$Ks< z?Hl-cVy|d2IY2o z8{sDR<0!oSX8`(m!g`=s-??Tw0l{)Eo0fJj>jEkcNUwFmNAz8$i5c7^$!v zdOq{ibT!bZ3lWV-4D)}943zW%>7&_UwRyam);6<2jagy|r35!^=~#q-0&x=2b|!IP z$U|VzNE;_AK>>N-bC4_u8{*W_%x~c=$g`Mp#6cZ;8J*0!R76EOViFNFavd^z+W%#) zdcg%MILs}mp<MO|P@vXX zT3gbxaUzdX*|Sl+{d)Hw&9i@F5`+iJu!sm=T-wPF$U@Q9vBj!Dd=oj`RCF(eC(VYh z{>&0L`?``{p4bH@;ldo`n*GK?UUzxvd~|&Y6w;#{J4SRQAJPpk!lphBhj@_4)O{TT z+_ON984xt@H!N&mjdlV|IU8>N`1e}}Id_tnPB^M-n^#_+x2Bh40My66fm}EpEJBYF zow2YE|CXQ=dsq4F&bsya)76KSA)g+nJ+n<+BX#uN&edtp?ycRvH~P+{t1CCFmu1~i zS-J9F_x;^lRRVh)Jy|E2IMO|gt2D(x*nsLPyaGy(Djpog;x$twP<7gHFCsx0P^aCV z0wvEx`NUI;C!h;+A1*2M`i^P6-xAj((M~+3My+t(fM9Ul?-N|m%|18+iDb?qEgf4k zyOJNr0k=!4CXm}#F)tYj{F^1)mKZ>I22*U05jEu0Y}ChvCEm=k5h8EM<39HSJ|C+^ zpvX%wTUkz71}9Lh3NYfUmk6(-<#zEI*H<6wvuDO^+Y>5CwBaf#guVrIG~CU_UjA-oh9UGtpQ4*KNaH_3#TNsBjH ze+#V5aX;aKMfS2T;Zt>^Mq@1wr232z+gG`vjYzHJS8zfTBDi4&+0US?L%ufeLTwLT zBKU^rZ5Ea$_aUvoevTe)82ydS?|d&HIZLNb)s;APBUk+2dt`<OUgmv<+DueYh zrapdMexNz*3vc&v_(P6FZ&UdVx!Nqo3Fjr40wjBZR>;KSIH;LB!7D3bC3ib0T7ykNaVp~zJE8X`b!s>0IXFBqG z9u|{VqHKh)%yJOkvf?{bed8dS3oDaH__v%E%9;b~5;`zFhvnv#%*Mzx?XIFG?Kc!- z60^1V4JlH#-x%4*|9{(C)$m$XB#O%_^t_y)9)HyI{$Fz zmgkbafg-3}GfDhJv_8{Z`mu%aL}&g7x%l6cXGk3gLR9xy*UNZjFIi%AIU|fTbg348 z^8}1QyvQ#pR4vC3&#vIt*7}VNMH^fzpWiZ*&N?<34Awy1B`1=i2G3~CDW_0?W{?NI za3^(UDr)@>KD0t^Dw<_<1j^8W@vBCQVtUMT54dg*)Yc7C%15<(hSiSSy`XN)c5VG zzYsAr=HHzYW4*rTrk<%|{$4=e6fj9Hp_^tQ_e(yoS4xIE1V~ai*JJ`Oa%Mk+Y=g2g z)|1l^o8lr8HkX4A*s!(qKCUgw7TD^w&4p<8RWZa{ZSBDXHV52@mIOTs0i*BCYAc&@ z3_IJ=Uf<_&V-L^BW{qtvoi5kR3fFe2FH13iO$LuMVu9O5pMDQ!*>8q1%3d@H;h|Kd zbA=gXOu^U2MD@XKjg;4i>^Glm#n{7~kDOf1FF5Jg$qiN9l%z!2)kcHMcbV+EtNeY% zn)B}a?aq7Al$HX0%N`AI9LY9Dx~cx}ZO}LQUGsR8Cx?n3Z1@^Qv(tO@P=C5IDH}vJ zcl>_HaClmB{DxNcFfz{Lm}lw{Uflv*-}ie(Ivr79>9`QJ3XzM;ZcO1IXAUsumn6rI zr%bHIGx@5`A{}XZ;`%7>e_dnLYDu@OHx%Bq>?vmawhfg+=5=8PzLqyLI~b_Zo8jk8vcCUBy^{FWJJu%sEMZ7 z$1~)H3dq@eqaV+~CQq&A|NF^Bt$0Ly(HUZ=Jg8@&r`Ceyla^I>hocT|$Gro#yXmvg z!6xSMp3ZQ{2zs6@WNi8@;bKcq2nYUB1o5>1LiHyP}vSSI8KYMzsqSK4TU z<1JjD?2FFm)%it7ln;fXAI%R5+rdy)dDV5m>;MM6I43OjFY{1U!u<$g#$~dEL z+LrA@yq@Vin{9R&HN@r%-{xHuxv-HI&c=P&Un9TlKfKkBO;v9DN{;c3Q+p8eF6X7p z4Z-WZ!hXzTHj!t+KPWq2UNkzAkS_d9BHv=6EhCNBH+=xCiuFHtV9O~#r~%Z9Mrgkk z&eYY)hcsNfiO#+L-&e<)!-$GR{4j>@Cl&{^*18gX{0>_XMV`8!+=w|=T2EQHPZn{o z*Dtcs!te_o#`?{z^IMquA9578o%$fNc#KNt`iIMn9$|2(6(+}(*l`PcqBFkisNO?l zzHoUu8n?nS@nb^Gfa%zPapAf3BQ^u)JgbdpQv-)XrOZ`hy?7@b+>KQ3hM5zr5a!(@ zm;IT`4XBcBIb)+cs7}I#7xUMHTjwrkIk+;n2uCoucUI`Pu@SfdXMv8Xs@n$YGt^i0 z!$+UFWePW+64>pMO4ZN`k0quD<{Hv?5tM4QNnT=cs+`FaB!|_UEuu9=|$9GM0bfY!KZH>=h+0&}B z?G2+*@pU=;7_t7`#_WASm@wUwMLzVcyg1AM+|Cb-RH1fl%G{Pt-I)|$C$?ZgpI?NV*3e15_;2e>5;$@EoZOpHdBoQH9>-O%F*Cz*8iXd z8zKQmH_`~;S1e+UUYp&PrHbnpmO4rDx;DOiVZHVJ$igPfB>-D-m2)AB+v4cmYXDV) z8+#n;8O-?nEroW8T2`^RWmZ-~!r7iW4 z=cVP6eVW%!T#s6DSH1=|ro}NNAp)xg4`g48T{?~}T-vVsAR!EvYb^~flW&;VoZqKM zGPaCHd|A!i*7A!Hm^^2M&cAFi^}tzBzi(Uo%pUDCQ)Z9$x}Oz3)ss~UnNd4R_>|C1 zgHB~nwO4*3pUSUe1b7U8SGlI8`(ypX3Gj)QjJ;#`E7LeO_pI5!>oW1a6>o$meM4t6 zd7o3Zyl^hkZU?FTs*$0`&(&oox!gd0l~$DPPjAT}PIUM^udUTtJy19*oBM7u?7lGZvO5p=gSiSC$$J7ZSnmT8=Y!@$_huciJ~0 zDj!Vh$IQfnT1v6fu)j&u-LQqtdS7W_!4|P_xae_4T6@jSFZTHgWszcopgFwWS6+^+ zUYF$BfF|^WgI`$hYI|tGDA&QMnpAA^tSo3&Qghm1lHG*gX43!kz~0TTS44MEfxYj) zHlh_*3ht%3#4Y%Z>04CdN8Ox_kh$Sf*EH>is|_Ij;RL}~=YzCMrJ;D<(17FA)1bV8 zjar)3b{+YJu&Cce`Q+2w`7~42NO|Udw5eqi zt6W}u(7AVgSwk-o5|Dtw1HNNJiT=F@P0rv1;3K!$$4klgX+D3Un0L!!?9WxItjSpM z)G7YGMR8ZDezhF&y6Lj>j}(fcz1mc~l|=a##WgOOcH~vOjQ(imifRM%drii@S?Z5_ zkTR(m@$I$GytkC|tz(hDEs78RSuF-fH70U}^Xfa^-M~Fx9xtcVdUmQ9&AB^2UHDk} zO69rr6~SK~kW>#rv$**dK{WOF!=AWFg_$nFf4=q9ee-uh_ec(N_AoqdU5StanU*D$ade&%-lvXk^M(3Pj zjhRQ>)oH~PDSy>+j63zg>Fw2f=4mi#<5|U|6(;+NERx!#Is5~ut7l?&xM5wMcYRlu zx|CiBS(LF7pO!NNCw*TzPZdW@^e6EYoX@S52P{F+mR#*>aKz>-6`Y`F5j0BsEtLKn z-X&nFh^4kxU0%m2UJp5Xc zbErw?WYyw_luat2irI4pVl0QNQL zWk62x#_2hSUw@MJNuBPdO?Jo~*c1L7h*b2AD`p2qC~jkfiR}v|q`^aK6-Er|!=fZG z0~bhDSAQ{sXm0q+@9N# zKbet+W8v?;f%TZhJdBZyt$jww|li?CINx)GED&aq5Kt2!M z_yM|pLXFk<*Fx}0j+2N&ZqN$dEVk*La#GhFle0|D$T#R`+s3*$#GWm;mE_;^Pgy_X z-@K0LYMQtZbM*O$r1!0mgEzQ}DIKupjO#-;D)G2P(1iDWb+K}udp>NCuCWTmSc6$S zF)>>FFOLfN(pAV+eAx7h^;Y*TXekQaEX|u;c5QNIV?hKOLCQnk%Jp$7S3|Hzi{=>u z+Wm%0pY(1FC`#sF3pJaX2x_`H8w};yM8%{a&T*eC*JvV7!#e2fV z$mU;uy!eH+;{3`I+r8)6CeKG~Xeqm2UQjKOTXV)-5om)_HzOfyuKKNNv!a%oyt$we z8#VpdnJ{!2zf&F7WBNBJ{SSwuR1i1HWS+jD+VbW3^9!o}-fosnTOPudHUoOVW^d&2 zI1Fb<1@O+2QhDDH=Bu10pX7D1Y)IG(b4!8v*q@mHpFN)O1|Y0iqTdPk;N4#hH{Da?YG=s9k}K(RZDj zX-#_u6YObFNgWxOvbk}5Zt5M?+i}wL3LzWTBm1uh6l^xLNi@2mTP^s3w%EV;plcWV zIOYBF`2E+6q;AJqZ~d}7#?SMVjEUhV^(D|Lk2m1-jI>wy6E8PAT1FcLe!JbGE}Utn zhJoG!T14!<{nMtx<`lPqB^NR7M9S0PQRe4k|LWyk3K8y_uR?LTB-DrP=x)ja(+)k4 z5e=!k&kWVHE_{tb6%j1x>I)%g0Tm>i28wKD9YqZct^i+aEfTw3!rxY9g%>izMma)d zk|+~39H8YN^O#+}h<3`9d9ZZRUX7W5{eGbSxh1N5GEXN<1)m$;@13dGg%=KbAw7U9 zs;}E+skIHU2*4~!-8-kaHYPMb7A*DTi^7ANe)C6$@v#rfq;yRxxYri_n6BkYTVRyq zd|%eY@_#-4vh7L(XD5P+rQqk<_dnuFqx-<`*OcP&aPbqqx-k#CNYj}|ly(zG-A2Wl z@0ZBLKOZ$=nDRJ2+^QFkl|I*8U5Vbd8qBFejj(iZ94E4hpKJ{z<}qQ6+G?Uo`r|tO z2*dP9kaP5TXYvgAPV-N$%nQ$whpFIw1EO12f%|C&XW(y*5 zu9!SaA>F!?{cdI7OrbF&uI8!I#qUp_wT%Aqq7QO{ZS%m(Pzrc{g*nRGQJq}^ zUvO$T)OhS|CRzSv;TMTy=XO~4lgZT!@GGMq*=k*&nyc2Rfd5$bi15>vRF||Gh%j}# z5?6&aS~AsuQ$rYyPQZWl^*I@7U9^lBHNc1z!QGTFxYEkE3Wj&k#3`q_Q$@-LwqnBE z+Ay53kOxA3XkiKznsPu#`QR}OQ((O^<$GfdNusL)MQ6>+(5dZ843kK^n!7< zKz4I6*mIVLLtjoFfK@-9fX_sw4==yCMq6of{KaPS!sr@ZB{|o0JNFs9UTp*V%tH{) zc)%?aJz`Iq!G3L6)wNT%EaewLp181VbTxVc@T+#MllKeSgqN&J+t+u(bq=8I2A+^M5aPIhXT|5RbS}7|gy)Cw*#E~fWMg(^~Sd{d;v6f=fab=W0 zr9lIdo+3xxFF#}%2#OrnpX*s@0$)t5l1fJbd7437yXx%du6bl_)izT9FSaz-5WOnz zbh5#&_*|>BXcv&mwIQu@Q$d#IVu#^uujRnGt^QgKSFVTAehuPON*2AMkSvHbHj;WX z*fN7J{N-ioM;2&duz1$eEBN0wE#d zH9Xv>wkH_IQLH>s=rlf*X_~fXd|fNge$scqgOkF47$SF@o!Z&)!K>!Pq>Sl(|IVl! zxxNuzrq+zf*GR=ai_)h+W~V0<^4~Eq2Xob!6HD}mW7c=~T$$B0)Pk?JOXLUW2E+GS z6plmQfLj}lzD5;c!{s~mQ+U=@+N`2|tNX+H4d-G2aK%W*nw*Jo`$%d*GMM(%Y!9u(!`{J&|{uNGfOVXR6U=!b&ETez9)= zy7<*?qs2U?hZJ>ROOSxH@k8G2sAxJ>kPv%9@mWnE8}Ec_0maCBe&=|v;+_c>TV%B> zcQG%{uK`~LfLFkfo29p3i>tyFA|B#rz3=Q=crnfue>@3HOhETca!9(dUFHq17^X%7 z?R1{yt|&&u&bxU|GR}}i9FjC~0CwyZphN3&pyC*u7*aw_fbVOWtgI;w3v@3#-#n*x zn)YRh;5Mj0FmgRgN(u64#r)K}9$B#6f~9TMPLj)?%ZSz=(?a23^kfNwos7xJVRx9* zL(}5+5%;xR3-;lAm*T#ID{{05;FANe@H^_f3Ibn-z~<%T>$FUG{L}{YJBuI-=kaG; z5T~>)==f~dHTgNgUAx(-CmTMfe+u#8Zp!mPuTF@l(VKNgKMdKhDGVC3dK{ltqN7Ea zJnS%u_35b&pHNy<**anE>FrgH`a@56C8Cx5B#lO;wJYDL42@b}0T0D_gEw{AjmtS1 zfwYU>=M6m-25JjC8$Km)iyAfyxCjTrQr<O!`$EF z{UbY;-{9~~=d|oNw=LiCMMv)gpxB=2d16t-Xj*@yH8=DSEi5zk8GTMzge6>;xQzAA zKYh^gRa+OM{T|{_vKYN|Z9(0QbNO^w9D452Z&Ken4U%v88F&g<&U2q|E{GHc8*_v` zGn++f^KCn>wT!DS>_2NKp`mpx(jNBLPc4smgy%(0wOtYeUiMOSN;2e;_AjStAZwzE zs?Md`+?0CoxBvZb5aoFS6JZ?l7!+-%v<_lo>3y((+5X@U)BO*Coqoqamco0Twy@9z zo*E(*Zes|#C@9B4Ema!%;Ts+9JVXQp-FeDfNY6w(hsQ@$X2J=Rzr>GKV$C)$Q(?qXvv=`Pt+~tI>YLQ@mND?GzA>ex|b)#=k?|9d4N{mD{y&Yg!{ zG?yg~z4)?=Eai7LJo?Kwz8X0ume|XOdElK_<~U52l^uCZujqc^e8n{9v^ zx5P@n8t=vc+{YSX?v1T{l?PGN>!lEGSgmuyYUvx85oN8$ido)9(38QZ;JYpA+ilQF z+5G54o1YKxk6g*Ge$)7>nYKV%OAGX6Q^7-vU8ttByBw#X`bF$^*5v`GmL|ejji9|s z`((9_z~|yv+}SvyRKN@?IwP%;!siW9R9{|LUt>0FjD91q|9|<8_r4}-MGwUvs*NVG z28_o{x|Wjb6!z1^pMe9c-UZQ4sXs|Zbh^Nnr5l->e)@bx#dU`lVTbH9eWKJcB{+XG!ZnXzcQ_k$EzZG)aY>>rkPf*Cd~Rb)+W5*W z#C=wYd}(R{3sM}SPowJBv<0uF20*le4c<4{(cu5=v5OUeUMEPuF}rJvB%DoKzW5e#xjTclNsWKcfCH-%BCeGtinUw3|h1M4g-i}*w0~Ey!aNUD$5B`id~0!V%+jSmnc-pR_PC0@%-XFtni5ER%6$5o>@+7ep6z`Es2#hkBewu zSK$LXceDj8JKo+h1wROyI&w>$V{Ma&`<>R*_Vjd|vpV)LE0Auh z<@kA0Lj#NR0JJ7W$)uuNFTdrV-FUzVd^SG$s50vLC|nIttNsobRDJUNTc38rvbKEL zU3_3-$aOdRy-iG_3z*|HG#0#GaT_r?i)2$tc!j^XC6<0k|M!`*mQ6P-{f}lgXN%(Q zR?_3w#bZeg#l19dnh=w>g+q;s+R`jhlPFd3L%io-o<<=$zemjrU zePY8uCCmL@pNZ2qaIJfn#R>%(>ebwA;W7gu!Ok*xe&V%%6SI?ZtB3C`$`Hq5;h@yDn zV6{i6`!FlLFL_d5!>PyPrZ`9@22MFoK!8R6>74)w&tTbt=pd&NUF5v~@!|>gKE0Uz zG&Gg8&(+8z_K?NV$9v8$Sy~uZdT@=LI@a&e9-bkC9&q76@?G`aEp?aP(bRmcS(HI* zhYMG!v-dbNUpkr`euLcE0PRJc9!u{-h1M8BSpq#KW-y)*=u%cdf>f!!OxGN_^sg&g z#GD=8&sHd`Ii*i?GhQ~hnjllL`|$F7Y@y=265t*!e8N_2>b`<6@n;xUD`xd61@*r( zx&ga|_lI*bzK;0|3Y4HA7Tiha*yGwSYe^7*~a6`8= zJ~LS2!6C8iJb;W|=+lW%tD#tUjd7okHT%&%FZG*)&9ytKEY9yKZFll$o^^}K!)>7% zn-uCWJWmBVD!e)<qLkOntD zO8qc*{Dsx4yosre^EVEhK!CRRW|y?V($M3^fiW9o+gG=oxLB#@J9gs>*wr9v?(<;u zWJ!HAu)fDk$OEx6@=uUyEnrN=j|^h+o74f#p5E$%F-IbmuNWQH(_X1cQ+p&6qusSJ zYq@!sN^#$#-wgEt1{MyPW3t~7L9FaY0TN{Gyyb%8x8aVqB%K`Wjj@YhkV!sOd$TGH z8_X2A$3zq_bNnt*dFZ+1Fi)E)t*7JUJ&5oxYlRgm{JV;BY+Np2iz>*}7J4%9z{-cx zO&=nS&Njecmf` zc$$kGh(80jV%_K1m;iMB`ik6slS!-~_<=s7;}z+O&kZEYQlLfI zkFF!P2NJIj7u+dah8EhZxD0vBuTSklPHQipYsTV;$-}_`NRC#?Ebq|%am@Yqp!!UA zV~;X*W8ZVhPW!inmp%)r#A;^w;!1SJ+ePhf8eTKcaIDD6jmDV`?v@EAJX(ejfVo!?L(;<_!0%mo`LZ zU%Yp|S~HcKuaNyl-KwP0$Rqx!RbtlRx!a8dl66fb`Tf_h(YRN!5xXt2j*P}#ocSu~V<)z;l^z+kD}H}UBcFFhIR2MQ64{*sE|F$U z*RhJVf6DVJYhzzXRi-TdMZVbalWy+!l0f7bb#Q>$kan z8FAm$2Aeei#P*mvY`nR_Lp2ABf*rghyN3*UXFaHugGVugkN8KKC-Te^aiy@yz_`Ov zX@#-G8eC*RB{zPu1fv01DuxBc@HK7^&47K6vjig@WvDOg4?8kZm>=sk==^roxOunL z+wm?lYX*=le1-2uNR&Cv8Kjb)Y0o@?MvWj-bFr~eIIpRW_;r;)uTvVV(;(p4$!*!GCo8nCG1RTs8ytiP5#yv+I8!sW5xUEz7N_G`f0`DZ&$ zx^_9SbSm4<4P3??7HWTQ zyEED>-AhBkNb?7BkgL2x(0EWp{Cv*bhj)30ZM0;oJW7PxInqx1_)O!&)^DB{u)YkD zJDLsDY$Mdm81xTsQxBqCSy}{q*Q$m}T^8bI8KHhX;I^}O)UWx?j9GkBJ`{&M_}th1 z;hwh^GJHe!{><>8ffxFr2ch+vhliD+XMfRgO>YpB7lr)`0IBTpXNs=+M{cl400YvQRgF5^==u zzw?X04t5f>_uQ)>nZn@P;aUFaI|_tzSNkrrOC@DQ(-6Un&ARgebGQ4<@lloS_3J=y zy&?>?g(a+s4S)Ie3Ui}9hFPDHDR3Mog|dkVm+g@}2RR%%>bkr&rwrwkgnW>d7d#j8 zG7D2M{!-#&x`EEzvg^qa@!D1n#3RN8p}U!kg5;?2*vF0#oXxnavG1NM)TLTG%{f;5 z;YR1Hax*oEDt=HiIKE(eRCquOw=NLUl93On(T$a`RlemP62qDjCkVTZ9PyqTSbBYo zq2l%>g>bxPzkYb|cdjQIF3V*%`{!r(`Rq7Gf}W?=S6W~`*n(^-16An&gj>ON?DN<9 zf z#3S&p{XOw;^z(t#-&b(wE!I;@kr1o|ju+%TEA#mjM6jMiG4CPC)ZUUmEr-WJbDJ)G z0$Xi!#tUWibTdB>8F~*yl|+vB*w6@$$?Ga646Cs9&} zP(D$o%buap=bDE^QpCX?iN0^0ew^@FI1V_y7rZh|#U_}?+t&^TZ()o$o0~0fd9xoN z-Rtz8;aFXME?8kxA(q|#-5JM1f$~;1&t88YWz$l>(pPdOc8WQaWzH<+e@lvNDV()p zmkQ^T^u+R3&?lESu=%I&>3JgH=FHM2X_kB3I7ce1m!#%)7+kjHqR6R)ua%2xo}!- zj^srd-@6+w;<{1~-Or$w5;$^WkUkAgDc>gfG_q!XJ?naSFSFoNEhoqxtbU8-dXMtV zg6yWtz3`IvQBW>X4otRiM_QU|A7*}dg&Oy{z_(!BuVHbQ)y(KTUPCX(ieIa+(O{>! zqq3tNIQ+i$Sc{Zw&7&c$lOB_lBr4&vw68KB+n3DI*XSx~(Ey^Gj(@;GFMjrX#!i zSwh6@yPD@unsy?VMXdITUW19+i?4)7DHBY3ZGwDWb ze5CYC4dAtoweZ5lAmz71jO82qGE$&}cjsrc?jaRLj^P%aCCYS3t@p1byP^684}h6> zb6qRiz7|fK5EFpTz!!`Qo$ydE@Z<0G1fJ3rg7)M6JMfE#=R)B#U;4*saH&z0-;=$H zQp<3g8@G$X+dM*Ro|hU|>GlD3>f|hhW%)}?xkMvf@*(_&H1(O}E#%Xz^XOH%TIb#r zJ9-?O%9NBOP{Sf>X3iy!-m1cwsHJ8A<&Wchx}i>=844X%^j zBg=hV;%QzS5gZ^GY{87F^_gv*{j(J)tM4FlQ&K0Jkr@ic2WjWqq;y!G0phPcqm~yNMTho zd-?>XL?;Xdmtol>vFB$|V_&<5o+E5H3bLOxkxQse5+L2_rO6`Cyx@Zjar~&DuL4&f z_mh1N_%j9)j+Tdm<^K|c@}bj`na0(RqEVzPZf^ZZ88I(?Nn%=Qowt!-ldIaM@aj#3MqSZbd--X&!q&69s6G0Zc?Qceg~ zesh#sDQ2GcOdDDX3zGI!_K`1d4LFy&my8UZ`{W;34)QL)X3F>|G2{5}?qkS#AR6@Z3>fO-YL36fKM+sX{NYZE z6DXs1zX`{k2Q93G%(z;6?TDFE3FueQ+Lv5kptx2X@3jsO>TuKZUdDY zu0L#Th$&CKu=N)oa!MduY&-)41UR=;s~6MZw4sI_mE)s**`)iC6=#trJR{edyEY2{ zjtKIYyG~F^7iOhPBD2R&;Md$HjIKY%Ky8(CcZi{jPrb*5A8@mggalm!sn7Eh*K zfg~GjT{GKyn57~d5dPYS{aE~DM6P*Tf$e07E+pe2@whdi)&3F|L~UoCbVRRsA@ep! zeG@WQ4nK?h**R%LYF{k9B@@D0?L0-%L&RpjgSvAY9xlQwdLk!$E1B%fe=iTqb~L`L zB_^Q$=wF@{`D0K;2>NntX$0LS<}AD)$q#F?adl3$mv**7MzDV*Z2kMkeS=N!+1g^( zvm@b|R#f$`s|Ob<_B-7eS?_QUyJeH>MCXseb==nVuJ#HqJDpiG-@P4y`Rb1~=oYu6 zub_+E2Tzt*yeG!qDooH#bU(jub}`9rdTxH$S28|NF+?zQWAd>q&u1ZPZu{Q5CCDS& z>CcU|Eth^ZO-MB#T9|q>a+Azs#j!J{77_Q897g+S>veVo3}Jt^tH#r%;f zO^U_e4_~@bn)Imi!c0J+7Q($@dqR`B$Uv?1kj*cP%)Aio&Fcl8$oE*SCty^Is z_w=9(QAobmo%jy)hiq=#$M2htwry|-U{_wVSWNvAUP25-m@J_IQrk*aFTu#-wD^?| zNM+mBahP`_q@-<2zk{bO830M@Err_7y)lvKW3Fc4#kA*tMtK8gZ|_%s+^xg-?dRz~ z$U@^IYvxp|iA()8lt<3H=LCh(($VonFP= zymE%ydw0{|f^U2lqv*(qNYJ8_cCx?Uhm-oEA6?i$ck2R+l1j$A)SLrtXUH#dpA6rX zWaK{CEU7>AXkpn2>xMXV0dUv+bpS>hZCmRW_X~J)Qj%|BJW&-sz9=rWz0RclhER3J z&Ly*O1T?3)pLqqF6HrisT%^N?#YOrYvO(d-8ebT$awPl z*ww1QwRu|GF@?6jImT~}>~>=lUk&vyPV7Vm%~YkCts1lr7NX8bgzL{SQeaaf(%Ix# z76LI+jLsY!N8jwjF`(%sb>sJR%mND-WBb0jF~^!p2h3S7PA!Z4cI9Zb zLw_ILY~-PNUlM)OY2W@zrrl>F9eQRYC<^pFPtyoX0?vV7MH{#dennu^D!0CRhR4-% z`?(`SBi~ThJ=dM!KvxnD^dO>#sUQs%c++*R1ukx#P2=-({NYdzbjS(JUdN=HT>Gow z;cfQhowoJgVT!dioxdzZJ<>U|^pnsr9o&3kv@{!n zMh%B$-WYMus@Fr%&u+0Ov>=tAZP4g6Ozzo)ng}AveMLv&OLyw%H7{Bwqw{npH^xP$ zcOr0{Hv3}XKv;(0CeB>oBNkC=h)Lhe2D0~$8v7Nie{uA;WnD)F`L1tT+z8T!LSy+C zm!d!vrZvR)ty*}DT?K`_GAX8p&L^dWNjV&%LGO-BRA`Kxuz?4a-`(h}X$aF>3@7$H zbEty0zKnzMG)u&;=+U%wdK`GJXw)c z$b7$Xx&Hi}fsyF@T2biePI;QEwDw!uYFl3K2>zPp~1`nn`=qheX}zX}`vMZ5heNOAm8=Z)i>K)pKg z)U)H#(HI?$rR(7qmo%demU#SEkUrO;;K-(P2SJ7)-PkQUZw(gXM)nZ;j>pKc^bR}X z@$A=2=DRGP*iIM90X_DM)w5Lx36!exC~47ctpe}Nm6#Yo&ZM8{KfK9*hIfJU=U%-7 z4MTNWSLrYU3{5W`pPqWnaHbA>LjrnN1pAI?OF}S%TJC=sY+Z*g@a6%ZW>HKv`a&nhNUs?01%|35x&!S+{?x#E5yHN98*1odZ>(#rLQ)I5BU!T?y@NlIEbOX(g%8dC8>jabkj-wO=G5aI}~fUxVyNGUJ}>f{l~34F6}G&HZ9Jj zNhG%zOXSx&?Me~v?Z^`&Td)KBP7SGzTfYPob{5z5cI) zu0I*I#h4x7Yi(V0D4Ie4*1EAb{h-o>Ik^^!6(@@Sqnkv&38iKmI^~cC?ysbXjb^`t zhdYA?+@;6qjt34nfGWm5-v5D^a>RDA{lmExDlYSCwklz;L7~17<08N;$rDdRg16sa z5I7I|VTftqbjFsc6uBRpo64|J4{wBX)X$W$kaHP-J7=Tg$C2~r`buIok5)LocgDn% zrCWZQJWQ><(ihw1?m@k`t~wz5Y_T=R8FKT7$uHlTa*KD*E?UW8Tm zoBJ67RE8nHM;LOVGGs?-`n#TBdOfQ3H2qE3Au2DvOblC__!o)VU-PX0s8s$Jg<$&E z+~_pOlAB$p*#T4v6Yoh32;2mJJGR6GZ~Z4xaie zL}TTTU63rO{+T*nYey7jNG+$lu%k9KB^N#?tr73~H*xn@VtlLXVW&yfg{yO6^pR$o zG5|Ykj*&*wHH5xc=Ke@n?#rIl>AoXl_S)BQH`kn_^W7KHfonM)#Y7M_RsqZ>&mbmwTX<>2HR()93DKyKuml4!Z zu)mm1xXH}-h-dW_JY~p#645(PWqNp1@9_dK@eaU6Cv!U=Qio?k{_di&Nag3?B$@(Y9N!H)7f}%!EP4b@b?1gp zwmmZ-Ls26u@V`>|MER4=I{L~ruDM2C(u=vNZk1EBdYer(5`(`VylM?Y45 zx%L|POc72w8EbUrh6^7iDm?0HzqTODr|#$YIHvPN=%f_#MWWnDH%ESE6)~qY@3?6Y zcYJ+xS9*H|badKy{*1L_8A->nBZNNZ+|XT>)ahH-G!t}is8bIq`DAp%s*2Bye_+ou z?(&73bj0t|f)zZG`2J_`~oqg`fhqfUFfWUW*2RSpi-#I%GQO=mWDLG zbK&Rjo#?3u#&M2;f}r}vqYrHqCs4}6cG0DnR<(=u#6_G|CP-A`+15Knas!xBQHo>< zDA}u3SdDJYmMqUg!A&bvjs0xR#~MFNYLV#JimX-_+RNQW&KF;F`kx2D-yVnA;~hAn z6$w}as-MyhkCY)dRtbU=Ub#^rDe_cm1)Hq#`7cC+8gjx@=ZNFwgyHnPM%>xby^0QJ z^Du-FIi}pak7c8ikJk3}3pJZg1yyfwN(;_6`u<61%vUa>k0FE%%0qpH2?&MO;)4`mdx z=&R)P!J*$)C{DnAc7K77PMB2tnP2@P-kmO{v9uI3d!b-fcWVr69SB~UjmI7Ch^TcCzROZq2sc(0+-86loAI2q z`q7+}cAk*|x8~Zsu}?@ae787--3_zP1LtZ@MMeDu!R zVjU3LV&u*5vZ0p#J7vW*>8A4356V3&EI%$sv&}PR^Ku;XyOSXIJO(M-GF@WBi55WT z9iZ*SjI=oIe6asRoPBDKB`m$NZ>mFtnNSX7#cBV@VkZTu2UdBHg^+4+Th_k!JKv?= z)x}VkyP4*f%s5@OAQ3WT$%2;)!iPRN#tc2wsS2W#Uw;spVrB2F_VOz~fX8}JC)T!} zhknO5IS^>fSx@Q9Q0am0ScCHKJ{c`DD5I^>xba4(VCu4~)BbWI}bmQ2EH=MYMjp^F?&$ zdI1qK5wke{2<;zwzdA(^O+J5(Wb?`S=F+49U86J~i{OPDtrUUUSo>OS(<1}y0PF)@sYI%~PET9BFt6W>j|jM5HZ{|Xc@QGfUT`E9SO*xS zN@rgPboD{m0?zeHl!5%+DM8Y>ta?(zwqS$Vi3hM~u>pDyyQjpQ>sAqNA~4WBx(6CS z0N5y^y$KOK)XH~bgCiayvJ@M?_Nleux)vjOc9D>mr072giM#YbVFhmhSP68^ZhTUK z*;X-2UEcSZhNzazD~WIIgaYtpQuCr%06J)iIK&<+N7rDwJ29GZ+Eg2pDE~wKR(=bY zA$yF)oqpp(RV{eky>Lu@$E$9ed)}1`z8nKf9bc}Cg^^+p-W3*)(TbF6LX%0bSj1>V z_2>M1gP-*-e%@N2f7d+AurRh~ikmBn-c=EDrs4#UksT9<=m)m#UmOHi%aQJf1Q-SS-Y)b-ClG&zjUcm)BE#7rQG#^*Gr- z$cGabeqv8C-;%*)sZ^%?mXANH-ele3a{h9H2cF#fMSAJ+O>p9?Y3u2&#q}+o(+86h zY$0z|mItLT9Clzy_%YYf#GeYNH`CB16T7stdco{z$}`T!nWvhG^`{;SdBx`8s&2i2 z1e;$XYyS5h+8n-fP?~l-bx%i5eH1j>dGiT&+48UkM&~?!>vppBnVYN=%rEPP2I{qIjh1aU^EX~!* z#!~w(Fx%U=d9Nis2${FUkfR@k5SWR(=1xHF@41UVkLvBrsa#ZSH0U24&C|Hdill?<&u<+-n6W)A~d?CR0^jtI2w^5DHO&vd3whjr=T zL0MkgRAgSY0XE$Di`VGv?_)-`x9l8}(yPe&@;Etg*d0*eH$E|cMw*ndG-NdPYPC}c zGagEjC3h(4>D-`b;i1nG}oyTkc7Gy zjdOO0u7q<1u+7iTw<*Q43x?*=F#chYJ%M>1(4yl$l~=M^3724oV+Q+*U~o)v8Kb_t ztG^3L@N;DV zLnM>MHnJtp$**Zq15gg)v3Ol?JZ5yK3*xf~=*4z*x^v(;?$rZ0&+nlQdGwudDWX)U zgRJ)70~O;e;w)T5R}`Lp6%{kZQ_q_gZ|e;l1bh`PTVm?M_KiS|HJ3vWhQH&49Fsy+8c@Pw2O#Ng&RuCT$pQy%vVXWjGOhz8aNBK4)^ z+txlGN%RK4(A}8bWWsy+nbEXCao%6L2dTZTu{7}WTs@f3eq}5zK}bHJskgc`k=a^% zzP>%EjV0R!D5>lpu>SYtdI(Bq7D~X7%o3Q&#TDD09O})0ouHDf=w`Z!6?>C*J=+^W zRBwUw$zM!aL$$3Mv(x3S;4inGZbcNTu1t&*d5}xW*O(>xxS}XD%W1C}LNZ>RabH~` zotj=v%&8h-pYm>^e0&faKwwS;W4l};>weU{`$3cAmG#vrHUQN$bn$T?=|5I;J_`oxUPp!MvrK}SAi#UQI;0`vH-?ZGA+RR3>p@n*tVIEV1ES2AWUXwz9j*SMPlPO%y7#q$v8%) zfO>p=a|y!Rn*h`&x$9Dn< z^~0Z7^(zC{6T!=ynhjWX8>FtZfmM(;ec`V`$?20cVIN!6Ry#hQHg+~<*FJE>%t-)i zU-+pki)kK|ga!&B>i5b{a=fnAAy+Q*jZTs)|of$#h1HcA1bfZgPvZ2GA!7wFd6 z+S}@4vG(Zm1ZioA#D+%Rwsw3yn>bBOx!N*$6ok`jyx{+sQLcoE z7)`RE6Hj5uef1E6oT%RH5=gFzxY?OSDsS2W2eK=Y=4=0sHOmkJG!RNT#00VwGHTJ6 zn}mekp!^q|)i|HghdT2XHeHs8#HYuSPOa|)A`8s0^Pvw=C-><96P8? ztuh;Hq8iq^4$cnt6V>q<;zB`xt|7gth4RrwUdX6ux^3QF)5i+wEj46kH2vmZ7>nfA z%aGi{DyQ3pa2rAjy@}E(_@sSc_en``!%HNN%GAg^H5MNUDtY~B( za-unCC@Gk32=IF2ROPSs`qiTDfMN-kfw@ZdVN}m6tUl<}a5mb`P1>C+2nGo$0t{ZK z@BC+JCF5c`8wirG3y#k8EKbJv-m23)T65{ju&KsVE-`BK^2OP>wmUwhqOmvk?N})I zA}+mx-k)|}yL`ixy^E^2X*wy+T0rEYsFShpOOv{w609L^f+VS;7R#y^gO86oh!hJ} z)gO?)Zt(5I48gbHW5!~~GcJ277L&8#DBhh4h?swy^j*D$lA>W5sz2%oNEMh{& zrCAi_EKE3RO*{qjZN-OIXyZoJ;?SJDzFJD{7ozgbbxqtz2@TgYAx(T5+SQy`BZZA1 z_2)Yu2op8?aBYj9&oyQ$=yo|;&=)3XxS3n&&6}{08+*I(LiC5bteIn_54Nq_k$CD; zGLp0Q;i0g^(0xM>ZJmm>CoUP0y~P(3U$LCYkXfUxYY%|u4|qzP5`O(sFAEqU-6jhW zTh;>5#=L3aYZqyP)A_YtAF{h!__CdaoBeuk2;wfS+GhmvqQ>rPMskIHB!7#B(0yYJ zStlU;S#vUtF#XSM_Fc0x>Nivgx9B8*_rC+0K?3>E-1pw}Hf=Ft0zx~hKy0?A@ak4d z56TZj6j}G&7T?ZWG^AkIGtnQabBQ5H>;$yafS zkhA_sO#=?O@&YNulfFWQ?qb?0ZxcKTdXU(IG&EUT7wStXet`dkCnid(3beA=npn8Y6d+n0)3|gc z#0v7`W_R-*d-DLu@u z0dG2;55^mQ^GdWO%H*BTQ{!I?jMA=!W*9a2NGt|m6^^eV%lOB}6K9`~&p8MAn!E6D zK27;)jMI3MIQl^yR>HAz@m8L(CG8s8 z7lLdcCPc11Y7JF=Sq6|}*rnaUFCkXYGVSOVgLl2TPYU!FM}`=`0^P0l?R+Hwm&Vht zBn+NO67-fv`^Zf?v;|qqomyoYOYKrM`>|Rf+mXF)TWv{XJ-EBBY>EO-mu0HX8`URx z{W*1nXMo0Ep+WuS5f{6dP(T`?G2Wv!p|}OeB0!I%4tXJPm7wT0q>l}aUr{}ZsU9*Y zE};5`4Y-T^M08aOC0nS8ap;RvBL#Lpw|Q~iApyUpyxiWkAg@g6g&M?0!(qfv#{M*L7ox9qWU z(=*&rHrJ*}tW(d$D&H*GCWToGNUGI9iSz5^Fkj!h>A2N^->Od{mAAYaI{@DUMS|lW z$zCWofd#rV@2zO3Y{>Nqq!3cb;)?DHd6OfIFOf8D264yA0k&*mbq<{8{(Am7B*zQx z8=BHTm;b{0C2^$`8L_OKH9pYxez33Ehn-hRGRPCC#zQ^3rPazpy!>>B*3gLLHME)} z+|p&jle}c@xcFXb_o*89123}^-j}9)Kj#F)9}U2bwYPrh4{VzwqgDW$+lJ*yl**s; zteOAnkNsaf7kHTt+)#SX&0F8e<0Av)CZ+WOXU*K%9Y44Pt2c4kZ)oaDste%RbZ&Yy z`wN9jwy>+|0-WkCxeu1GseERl%T6*@!O#kkxTXa=FU$(0Js@cbxdc}UE=xwUke`t0 zkzf3Z%arGKVH#dG*C^M81BlzV;F5L29x}1I!z!8yJ}&=FBd-8irW;)y9K2p_pxj5S&n6D7aay)WzY*t9#1+)qLu|2JSlUX4178qmSPMU6U6(O@Y8h^UEYojNkv-Y|5VZpF}ul`Bq)& zbJ)U`h^?+>xylFs_<{`_Ww&d5)cLJ9rj$i_}!`Qa!UDAy9fZBC`}X=j|9b23_`U!8%D)F>{9bsj_k1ovky`=qqLLM! z>K#(}f)J}dSGF(*S{T8at8>m+Twjp!H2v(zeG%huO)FOM&dwVXW3HYyUzpZmgV5Nr zJ7V3wR3@N)iDx+_qlPNfeHCi?Jxmu~<$I$}syZSz7e2+b=R4p}iqb8SD8zb&5!aK# z9|voKx4Tg37Um9Ixwv=-0t=nOJOMjQps}x#DOC&0Sdyz~@J(MdbiV97Bi|PS2Omw+ zA@PpFq-7pbfn+9533H?rsSJK{^n zp_sA|L8+R@i+|@h zaoD>1Om>W2T>B0JiSxL3ORMaaHriW}`r7iofls~TexT?>e4RVhqBc!{z#?(ujBXO6 zpF~e_EcM|hHD+HKKV`}9qxXoWbDyiYQyS4Wv4bSbJ5AQXs#>_4$$TJR7roF@B~i)O z@qUnOUSkVI1Eq*8RUlh3LpZE4s7Zt*Wis#knXIcfe+jkuuFnn`iTQlMX)xSNcPTA$ z@R;V#sCvD0d9LzcUGp^fBW0f>CMxIJu!J>879ROqB%GJf`Uo@D4 zLx%bm8Det;zbZq^pZSX3rTBRQZ-0q>df{mwO-vuxSDfw~prF(D;h?CIAV~tgHIQwE zj*)aQL|Y}g=iwg+%`@s_8@iHyL%N%tTwig&wq#^l>fzsl;ikw-7YCVtjaDc zXO7(yI@dQfVU!{}e*XAt)wVi`J@YMlxBUZ&F)!qvq>;iG8tJzuRFe>&n1tIsH2Gwq zROa+JNmmOcaVTC@->37ncvT(!H$!JmHu#q>YBJ)Puz8|4rVd`NYw?ENtyXb=-rXp* zhY*nlgQzD;Bj8%Pv$c#LiU(AK7-y(DJ6J_|0Di#S)Z`<7&WywZd`9&y`!miT)vp|D zxJQ%Vld)!U+ZS?KhGe1C6K>zRz9Xl{7r9%IE0nq0xI?4G(WZ)mla9Q1?@1z|o$Wm) zW}PSmyFIlJ(E=Rv{O8a+&vm3=qA6EJAK4Fp?jz8fmnxAyA zGJ(=4T6Oh{KKbo7!7o2MK8Vkxwwf-Q?kpHiqmODjvRsKM z7knx)`d8b2JUKth(?GgV47&`5PI>s61mW!U4`AzQG4g@|IBW;6A2Ad4(k4S@gk;eP zu5d()nI$UK@-*|2+^}Tj#f&dACx#qdp|O{rFt|fWmK5k-Mit6bAh30S@|%zsiZmI@ zx2Ilp+dn2I%wnRg-G+p^>7&sw=GYN1a~0|*r1jg8%NjK32uJ-E^ABl$0vRe#?Nm3( z*P>qPS{s6YY+?#0)n45SNmLnTQ{mNWa&GmbdknD@~u%dRdBSR?^<}Fb3u|^A2;Xps54zS+XPAkD%Y8=V!wu)A9IyW&{zv zc0J|6K({(6=J%ao*tjfD4f=3<*Rpo0%jwa4CL8ctiCbU3v0icW+CbGd&9<&xU_Yf3)$SZs_!-{>E)iywN}|HTo33VofaV?$(ydQA$R+Qa`=i;cQwpqcCOH zR0CBdjbzoOaox`Zb~nnK@4BF%r6`V??Q~jR+OGtIMB7XHD~iQ_yyUd%9f2$IT@Tr* zr9D2GY>WB~C5(T)2QSK+u{+~1tY|ozX=zgp{}A@1vxhRhxNygwzGH{}bKxQZ5I>Ad ziR&?u`cs@XpA==!pA!boMp5Mh!yZmW(Ju`8)(9x)U$w=vFXJrm^70~T@4Ybry#|a)d}vB4?D3>$b0ut zAThMxu@`wAaX=l{X(+FCAJxr#yrr-H*he&Z;F6jVqd<%N8Oc9gO#}tC{ja_PHm%(+SdN) zr(*h=(YEhUje$oqNuYaU$u+F*(aNtjVIg#k=EjIfy&@)>b5mw?J9f68KY&TF!|*BM zttI;GVgjdOPjlH1CpOG@j$)Q}HQqtHZ$8hCtiz6lyez7BvL{AJTJ&#dLy}#y=R16Q zHgT^1EWI<=RF+EVA3)fjL0hlTBKH3=UaZ4%xB2nri`CO3vEXJrIuvJgz9b_oWI~fzvB!>G^Cd$d#N2;WxzW!%6*Dld7C< z`KZ$vP8W?Q+mQjSrJWBKhXXR52dv&4{<0aXK7A+(M@jrqfZ0E+?4)|hzmGz_KSe5+ z++QtFbtVahk#C=6)GE96pfw!F$7CGm6_sxM1r_VRCRW9Q z`_u$Jh3w7>qQ;a*v5e8NA+5P_D4ti+wt2@c^%JVKvC?FI1zzzuBjKxZ7i(saZH!JM z6Tz&i(P*!*5Q0Ao_rAI!o7w+UEotV&Xkeh*Q}X<83(%yeodxQh(+N>}=BU`EA=dTR ziO8?uTJ(aqV&i%2%Z$t_CW0*u@@HvTxSZt&BD=8J%ymd&lB#DzAR8taquf_z;%ndW zf_AP_4^i@F#9Uhe!e%#FNbyzV*mnepdvwBEk?ZTpzHC^j{K;vI>cYVOW2IQVdchXe z`4eOMS61FaTNr%Nzh4tN=t;W*A zNYFqZ2r=5d_a}680Q*Ht^O*d~KL;QhTepp;)usxHFc48a@v8IqS4lCFF6tixMgXqz ze^{&TWT>wVu2^V1BD0&;WZaSTM!NQ}6y>8(u&@VhB*-`97(Wh~PC$U`j66jGrFVMw zQMQ>})p*yP(a^6dC`DX-^qzj#Gm#p>BqA;tPcT!ewNN`E~YAF+PM zB*$5v>Jr^-@M;%3V1fb*K$X-NF~*OY+pNAX(C_py$!#B%ajty*61($x#Ie3LpKYE$ znf8R-HBWN7Q!OFdehP|qMH*)`;W!fq-hxil)l#EwYzVQj4xQpuXS+;2mS;jtBgwp1V`_?14v~J3;bJaHNAI zud5O0l_hdEBs32jrJ#=o9%kX_=vH))aZSDV!USs2|-Yl z&%mtCXl0@L?;5I4IDL|u#v&knMQacTWiRo)mSB^|^)?>9YQ=`90qlsI8tva@p|SS% z=2mWOXv}EZZvaC|&?3la^`b- zNEb8Qf4029D@zxsJ`cQ%y%D*b;2_KBUsGRjcQ=d;+t}#vIU5$fdE5L7YcFbvE39ca z?UywU*4cpF5>M9-jUP3Eqpvg=5JDd@2=X`0gLxUr`|MY6ev~G4aCKH*3}?5mi@jHi zco!$y3f~c0FZ*N)o7GG^#VthzOht&D0(38P!?ou!gj@xyGPG%Xx(_TvOA z+<+S!L&k*qaGR@WBUSbEcr24qB+spMR;tB<|{Bd~9rPZ;+J7FfZff-v{a@+~#wLm|Q zNsFjU=uj~{1Yep+&E|aBbWVCMA{lLxvrz^Lo4;+F0uwOw>azMsC#$Y%H@Q#x~D>?95 zlckYgploTwkpTLZ7J>b5WuteGXGzXM;%1NUftfo8K#JQk9=Yp60qA`jrF7k?9_=H7}w##5{c% z{}ouKo=zW(Dajpg9xJX3&z>8|(7R_I-Y6BY;`m%|w!OY5A3e4LB(fP2x}6S)zKI!= z5mig3sb57d_6~gUNYF$+qGZvaS2M<1n3q_+m;)W$=5h5QXtYQ39(z@v2~7Mdqe+N* z#Hbb@C!*djKJwOK%rjJ5r+>1fl2UW|C2mKXuuXHp{6$=_!AHn_v?Nxwgr!mF;bLB< zUX!GgVXxXd`6c_ga7lL#9I=uEj`Q0RVa#lrlsK@u~6&p z>%))TV_pl1aYmBBIUjKzT8ap`MK6HBr%XT>QfN)qf z7t9;40%e*h9yxU>?l^{5mqZU3o+$~RC&M`dxK)*1hO}VIU`bfL1r$|Wf3Cagi+w+i z#t$(JQ@p2trHva$a-!CTA%g|j^rG4**KuOQl8nP@DcD$6 zIUjR^5VV9tD~X+Ee{;ITNxLaM&cjFc5yZ;$Pzt7_#38jBj)d(4-xQJ~5b|H-r-h7e zO989APES--Wp&UJ@k*S~*roJA3F=S1FVRdb*$tX0ULc3l9jsyveQji(bZR-tugH?6 zYU<3N)2mk*oWOFRHdtbnd3#%WS9-0CM84f;z%hPOrQu19-sKpII^B?<^a-E=k9eIz zAUhui-*42cj#Dj381P&GBKcF1E~t@Ex+`+kA;Y5POloVODNPmFMwD^9upZVMs`ywFIQ2i0YGe9$iL$l+FiKXdJwZXquQVo~Cj@V)b`+x5Q*7+8P~7d=H;hWEQ=5f3ygxCT1;yrOX`+;JgaY zmu~a+PgSEWh!emsU9H%yGEV|Wt$59>%{DQQ1dVQ=(gmZdKu*oL@_Y z<=f0n+^kuA=_m_w( I!LwKY7vRX|7ytkO literal 0 HcmV?d00001 diff --git a/en/device-dev/subsystems/figure/ohos_system_security_architecture.png b/en/device-dev/subsystems/figure/ohos_system_security_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9105f6e4ac4bd9d9f0628c061d560fabf2979d GIT binary patch literal 77472 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�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 literal 0 HcmV?d00001 diff --git a/en/device-dev/subsystems/subsys-security-devicesecuritylevel.md b/en/device-dev/subsystems/subsys-security-devicesecuritylevel.md new file mode 100644 index 00000000000..a6203cb30ec --- /dev/null +++ b/en/device-dev/subsystems/subsys-security-devicesecuritylevel.md @@ -0,0 +1,481 @@ +# Development Guidelines on Device Security Level Management + +## Overview + +### DSLM + +The OpenHarmony distributed technology can converge resources of different devices and virtualize multiple devices into a Super Device. When different types of user data are hopped or processed in the Super Device, poor security capabilities of any device may threaten the security of the Super Device. + +The OpenHarmony Device Security Level Management (DSLM) module is introduced to manage the security levels of OpenHarmony devices. When different types of user data are hopped or processed in OpenHarmony distributed services, the DSLM APIs can be called to obtain the security levels of related devices for subsequent processing. + +### Basic Concepts + +- Device security level + + The security level of an OpenHarmony device depends on the system security capabilities of the device. The OpenHarmony system security capabilities are based on the root of trust (RoT) for boot, RoT for storage, and RoT for compute on the hardware. Security technologies and capabilities focus on device integrity protection, data confidentiality protection, and vulnerability defense. + + The following figure shows the OpenHarmony security architecture. + + ![OpenHarmony system security Architecture](figure/ohos_system_security_architecture.png) + + The above figure shows the typical security architecture for a single device. The architecture may vary depending on the risk level as well as the software and hardware resources of the device. The security capabilities of OpenHarmony devices are classified into five levels from SL1 to SL5, based on an industry standard security classification model and actual OpenHarmony service scenarios and device types. In the OpenHarmony ecosystem, higher security levels include all the capabilities of lower security levels by default. The figure below shows the security levels of OpenHarmony devices. + + ![OpenHarmony device security levels](figure/ohos_device_security_level.png) + + - SL1: SL1 is the lowest security level of OpenHarmony devices. Usually equipped with a lightweight operating system and low-end microprocessors, such devices implement simple services and do not need to process sensitive data. SL1 devices are required to support software integrity protection and eliminate common errors. Devices that cannot meet the requirements can only be controlled by OpenHarmony devices and cannot control OpenHarmony devices for more complex service collaboration. + + - SL2: OpenHarmony devices of SL2 can label their own data and define access control rules to implement discretionary access control (DAC). These devices must have basic anti-penetration capabilities. Devices of this level support a lightweight, secure, and isolated environment for deploying a small number of necessary security services. + + - SL3: OpenHarmony devices of SL3 have comprehensive security protection capabilities, and their operating systems have relatively complete security semantics and support mandatory access control (MAC). The system data can be structured as critical elements and non-critical elements. The critical elements are protected by a well-defined security policy model. Devices of this level must have certain anti-penetration capabilities to defend against common vulnerability exploits. + + - SL4: OpenHarmony devices of SL4 must have simplified trusted computing base (TCB) and come with anti-tampering capabilities. The implementation of SL4 should be concise and secure enough. Adequate authentication and arbitration are required for any access to critical elements. Devices of this level have considerable anti-penetration capabilities and can defend against most software attacks. + + - SL5: SL5 indicates the highest security protection capabilities for OpenHarmony devices. The system core software modules must have passed formal verification. Key hardware modules, such as the RoT and cryptographic computing engine, must be able to defend against physical attacks and attacks simulated in labs. Devices at this level must have high-security units, such as dedicated security chips, to enhance the startup, storage, and running of the root of trust (RoT). + +- DSLM + + DSLM is a module for OpenHarmony device security level management. It verifies and updates device security level information for OpenHarmony devices in collaboration. It also provides an interface for querying the security level of each device. + +### WOrking Principles + +The security level of each device in a Super Device provides the decision-making criteria for processing or hopping various user data. For example, the distributed file storage service does not allow sensitive data to be stored on devices with security level lower than SL3. + +### Constraints + +The default security level of OpenHarmony devices is SL1. Device manufacturers can customize a higher security level based on service requirements. For details, see [Customizing Device Security Levels](#Customizing_Device_Security_Levels). + +## Development Guidelines + +### When to Use + +When processing or hopping various user data, the subsystems can invoke the APIs provided by the DSLM module to obtain the security level information of related devices. Then, the subsystems determine the subsequent processing based on the security level and data to be processed. + +### Available APIs + +All the APIs are native C interfaces for implementing underlying capabilities and are not open to apps. The APIs are described as follows: +| API| Description| +| :----------------------------------------------------------- | :------------------------------------------- | +| int32_t RequestDeviceSecurityInfo(const DeviceIdentify \*identify, const RequestOption \*option, DeviceSecurityInfo \*\*info); | Requests the security level information of a device synchronously.| +| int32_t RequestDeviceSecurityInfoAsync(const DeviceIdentify \*identify, const RequestOption \*option, DeviceSecurityInfoCallback callback); | Requests the security level information of a device asynchronously.| +| void FreeDeviceSecurityInfo(DeviceSecurityInfo \*info); | Releases the device security level information.| +| int32\_t GetDeviceSecurityLevelValue(const DeviceSecurityInfo \*info, int32_t \*level); | Obtains the device security level from the security level information.| + +### How to Develop + +1. Add the dependencies for compilation. + + ```undefined + external_deps += [ "device_security_level:dslm_sdk" ] + ``` + +2. Add the header files of the dependencies. + + ```cpp + #include "device_security_defines.h" // Header file for defining critical data structures. + #include "device_security_info.h" // Header file for defining APIs. + ``` + +3. Call APIs. + + ```cpp + // Obtain the unique device identifier (UDID). + const DeviceIdentify *device = GetDestDeviceUdid(); + + // Obtain the RequestOption. + const RequestOption *option = DEFAULT_OPTION; + + // Define a pointer to the device security level obtained. + DeviceSecurityInfo *info = NULL; + + // Call RequestDeviceSecurityInfo to obtain the device security level information of the peer device. + int32_t ret = RequestDeviceSecurityInfo(device, DEFAULT_OPTION, &info); + + int32_t level = 0; + // Obtain the device security level from the device security level information. + ret = GetDeviceSecurityLevelValue(info, &level); + if (ret == SUCCESS) { + // The operation is successful. + return; + } + // Release the memory before the processing is complete. + FreeDeviceSecurityInfo(info); + ``` + +### Development Example + +A service with file sharing function needs to be developed. To prevent sensitive files from being shared unintentionally, the following judgments must be performed before any file is sent: + +- If the security level of the destination device is SL3 or higher, send the file. +- If the security level of the destination device is lower than SL3, deny the file transfer and display a dialog box to notify the user. + +**Example of synchronously obtaining the device security level** + +```cpp +void CheckDestDeviceSecurityLevel(const DeviceIdentify *device, RequestOption *option) +{ + // Pointer to the device security level information. + DeviceSecurityInfo *info = NULL; + // Obtain the security level information of the device. + int32_t ret = RequestDeviceSecurityInfo(device, option, &info); + if (ret != SUCCESS) { + // Failed to obtain the information. You can develop a retry process as required. + return; + } + int32_t level = 0; + // Obtain the device security level from the device security level information. + ret = GetDeviceSecurityLevelValue(info, &level); + if (ret != SUCCESS) { + // Failed to obtain the security level. You can develop a retry process as required. + return; + } + // After the device security level is successfully obtained, check the lowest security level required for the current operation. + // The lowest device security level required for the current operation is 3. + if (level >= 3) { + // The security level of the target device meets the requirements. Services are processed properly. + } else { + // The security level of the target device does not meet the requirements. An alert or dialog box is displayed as required. + } + // Release the memory before the processing is complete. + FreeDeviceSecurityInfo(info); +} +``` + +**Example of asynchronously obtaining the device security level** + +```cpp +// Callback +void DeviceSecurityInfoCallback(const DeviceIdentify *identify, struct DeviceSecurityInfo *info) +{ + int32_t level = 0; + // Obtain the device security level from the device security level information. + int32_t ret = GetDeviceSecurityLevelValue(info, &level); + if (ret != SUCCESS) { + // Failed to obtain the information. You can develop a retry process as required. + return; + } + // After the device security level is successfully obtained, check the lowest security level required for the current operation. + // The lowest device security level required for the current operation is 3. + if (level >= 3) { + // The security level of the target device meets the requirements. Services are processed properly. + } else { + // The security level of the target device does not meet the requirements. An alert or dialog box is displayed as required. + } + // Release the memory before the processing is complete. + FreeDeviceSecurityInfo(info); +} + +void CheckDestDeviceSecurityLevelAsync(const DeviceIdentify *device, RequestOption *option) +{ + // Invoke the asynchronous callback to return the device security level obtained. + int ret = RequestDeviceSecurityInfoAsync(device, option, DeviceSecurityInfoCallback); + if (ret != SUCCESS) { + // Failed to obtain the security level. You can develop a retry process as required. + // In this case, the callback will not be invoked. + return; + } + // The callback is invoked. Wait for the callback to return the device security level. +} +``` + +## Customizing Device Security Levels + +### Device Security Level Credential + +To ensure its integrity and non-repudiation, the security level information must be encapsulated in a "device security level credential" (credential for short) file for transmission between devices. In addition to the security level information of the device, the credential may include device attributes, such as the device model and version. Moreover, the credential must be signed using the public key infrastructure (PKI) technology. Other basic security capabilities of OpenHarmony, such as [Device Authentication] (https://gitee.com/openharmony/security_deviceauth) and [HUKS](https://gitee.com/openharmony/security_huks), are used to ensure secure transmission of credentials. + +### Default Implementation + +The DSLM module provides default implementation of security level information synchronization and verification. It is assumed that the security level of all OpenHarmony devices is SL1, and a loose verification scheme is used. For details, see the [source code] (https://gitee.com/openharmony/security_device_security_level/tree/master/oem_property/ohos). + +You can change the device security level as required. For details about the OpenHarmony device security levels, see [Basic Concepts](#Basic_Concepts). You can also use more severe verification schemes, including but are not limited to using device-specific credential, periodically downloading updated credentials from a server and strictly authenticating the issuer and validity period of the credentials, and using Trusted Execution Environment (TEE) or even Secure Element (SE) for signing credential files. + +### Generating a Credential File + +The credential file consists of four Base64-encoded strings, separated by periods (.). The following is an example: + +```undefined +... +``` + +#### 1. Construct the `header`. + +The header is a fixed JSON string in the following format: + +``` json +{ + "typ": "DSL" +} +``` + +Encode the header string to Base64 format to obtain ``. + +```undefined +eyJ0eXAiOiAiRFNMIn0= +``` + +#### 2. Construct the `payload`. + +Construct the payload in a JSON string. The following is an example: + +``` json +{ + "type": "debug", + "manufacture": "ohos", + "brand": "rk3568", + "model": "rk3568", + "softwareVersion": "3.2.2", + "securityLevel": "SL1", + "signTime": "20220209150259", + "version": "1.0.1" +} +``` + +Encode the payload string to Base64 format obtain ``. + +```undefined +eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIm9ob3MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4yLjIiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDEiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTAyNTkiLCAidmVyc2lvbiI6ICIxLjAuMSJ9 +``` + +The fields in the `payload` are described as follows: + +| Field| Description| Mandatory| Value Range| +| :-------------- | :----------------- | :----------- | :-------------------- | +| type | Credential type.| Yes| [debug release] | +| manufacture | Device manufacturer information.| Yes| string [0..128] | +| brand | Device brand.| Yes| string [0..128] | +| model | Device model.| Yes| string [0..128] | +| softwareVersion | Device software version.| Yes| string [0..128] | +| securityLevel | Device security level.| Yes| [SL1 SL2 SL3 SL4 SL5] | +| signTime | Time when the credential was signed.| Yes| string [0..128] | +| version | Credential version.| Yes| string [0..32] | +| sn | Device SN.| No| string [0..128] | +| udid | Device UDID.| No| string [0..128] | + +#### 3. Construct the `signature`. + +Construct the signature of the header and payload. + +##### 3.1 Construct the raw data to be signed. + +Combine the Base64-encoded header and payload with a period (.) in between to obtain `.`. +Example: + +```undefined +eyJ0eXAiOiAiRFNMIn0=.eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIm9ob3MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4yLjIiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDEiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTAyNTkiLCAidmVyc2lvbiI6ICIxLjAuMSJ9 +``` + +##### 3.2 Generate a private key for signature. + +The Elliptic Curve Digital Signature algorithm (ECDSA) is used to sign the raw data in the credential file. Generate an ECDSA key pair `` and `` first. + +> ![notice](../public_sys-resources/icon-notice.gif)**NOTICE** +> +> This step must be performed in a secure and reliable environment, for example, a cryptographic machine that meets related security requirements, to ensure that the key used for signature is not disclosed. + +##### 3.3 Sign the raw data. + +Use the ECC private key `` to sign `.`, and encode the signature to Base64 format to obtain ``. + +```undefined +MGUCMDb9xoiFzTWVkHDU3VWSVQ59gLyw4TchZ0+eQ3vUfQsLt3Hkg0r7a/PmhkNr3X/mTgIxAIywIRE6vRTRs0xk6xKp8A0XwMMiIyjZlujPJfasCvFonpsvXLAqCAIYbe1J0k4Zfg== +``` + +#### 4. Construct the `attestation`. + +> ![notice](../public_sys-resources/icon-notice.gif)**NOTICE** +> +> This step must be performed in a secure and reliable environment, for example, a cryptographic machine that meets related security requirements, to ensure that the key used for signature is not disclosed. +> The key pairs involved in this step do not need to be generated each time. Secure key pairs can be directly reused. + +##### 4.1 Generate level-3 signature verification information. + +1. Generate an ECDSA key pair `` and `` for a level-2 signature. +2. Use `` to sign `` (generated in 3.2) to obtain ``. +3. Combine `` and `` into a JSON string. The following is an example: + +``` json +{ + "userPublicKey": "", + "signature": "" +} +``` + +##### 4.2 Generate level-2 signature verification information. + +1. Generate an ECDSA key pair `` and `` for a level-1 signature. +2. Use `` to sign `` (generated in 4.1) to obtain ``. +3. Combine `` and `` into a JSON string. The following is an example: + +``` json +{ + "userPublicKey": "", + "signature": "" +} +``` + +##### 4.3 Generate root signature verification information. + +1. Use `` to sign the `` (generated in 4.2) to obtain `` (a self-signature). +2. Combine `` and `` into a JSON string. The following is an example: + +``` json +{ + "userPublicKey": "", + "signature": "" +} +``` + +##### 4.4 Generate the `attestation`. + +1. Combine the preceding three pieces of signature information into a JSON array. + + ```json + [ + { + "userPublicKey": "", + "signature": "" + }, + { + "userPublicKey": "", + "signature": "" + }, + { + "userPublicKey": "", + "signature": "" + } + ] + ``` + +2. Encode the JSON array to Base64 format to obtain ``. + + ```undefined + W3sidXNlclB1YmxpY0tleSI6ICJNSG93RkFZSEtvWkl6ajBDQVFZSkt5UURBd0lJQVFFTEEySUFCREdOMU9xYWZrWFc2a0l1SEZrMVQ0TS84RVJUY3p0eWRDaGtramFROEkzNEc2Q3E1aTNJcnczVnRhQS9KTTF2a0lHOUZDVWRUaHZFUlJFUTFUdG9xemdxZW9SUzVwQW1EYUUyalEwYzdDem8rOHVUWTRIYW1weXZ1TENtenlYUXFnPT0iLCAic2lnbmF0dXJlIjogIk1HTUNMeHVjUnoyZndKZ092QkxyU1U3K1hlVTA3R0EyVXhZbDFMbEJLUnVIUS9wZlNWVHBEd0ZHSTNTb3h5ODR3NThIQWpBeGRtNEY3b3YvYUtEL0NFZi9QZlZDWHVlbE1mQys1L3pkUExXUUJEVnlGdWQrNVdYL3g4U083VXM5UGFhRW1mZz0ifSwgeyJ1c2VyUHVibGljS2V5IjogIk1Ib3dGQVlIS29aSXpqMENBUVlKS3lRREF3SUlBUUVMQTJJQUJHMWU3TDJVd1AyWWxTajB2RWViUGJpNVpLMDh5NS9UeHRWb3VrRFpIUGtSNlRtb2JoVGpyMVRVNzZpUkU4bDlWQlhuU1h1QVB6cjBuSHdKVkdVZVJMdmp4MVh0YUZReE9QNjhjNlIvRTdFWkZ2STdRUFg1N0tvRkhYdkEvVlJaNnc9PSIsICJzaWduYXR1cmUiOiAiTUdRQ01FUVdFNnk0Rm42SFg1ekFvTzNkYzl5cG1Sd2lBclplc2o5aVBROTZEaEhuNXJkRTdNaGFMdWNRZ0MvaXhjSWJsZ0l3QkN5aFBvRUg2RjFITFlwM2xqbWVncVlZQ1E5NHEyZm1kbDB6dHhrWEVTOVpPOVRNSUZQRVpKYlpmUnU5ZHcyOSJ9LCB7InVzZXJQdWJsaWNLZXkiOiAiTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkZRUUlDWmpWUTV4bkE0c2RMbUJzUmVaMzRJeWdkSmZhanA3SnRReFBzU2RwWTJXV0FneXp6Rm40OFFRRWhoU1BtdzhJYUU3VlJKRENBT3FYRnhGektJbFBFTDFvcFJDUmhhWmJrRzc5Y3ZrWC9HVVhlaFVYc2V2ZGhyb2VRVERFdz09IiwgInNpZ25hdHVyZSI6ICJNR1FDTUdQRndvSDJLbHhwbVZhWXRWV1ViMHpDSUJxYXFXY2F6czFqOVp4YklLUmVkR2tJY0VJdHN0UFoxdnVTanYvNDJnSXdSeGZPcTRoQTdNMHlGV2ZPSndqRTlTc2JsYXhvRDNiRTZCYzN2QjUyMmsyQ0ZJNWJqelpkeUFTVW04d2J2TW5WIn1d + ``` + +#### 5. Construct a complete credential. + +Put the four pieces of data together with a period (.) in between to obtain `...`. The following is an example: + +```undefined +eyJ0eXAiOiAiRFNMIn0=.eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIm9ob3MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4yLjIiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDEiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTAyNTkiLCAidmVyc2lvbiI6ICIxLjAuMSJ9.MGUCMDb9xoiFzTWVkHDU3VWSVQ59gLyw4TchZ0+eQ3vUfQsLt3Hkg0r7a/PmhkNr3X/mTgIxAIywIRE6vRTRs0xk6xKp8A0XwMMiIyjZlujPJfasCvFonpsvXLAqCAIYbe1J0k4Zfg==.W3sidXNlclB1YmxpY0tleSI6ICJNSG93RkFZSEtvWkl6ajBDQVFZSkt5UURBd0lJQVFFTEEySUFCREdOMU9xYWZrWFc2a0l1SEZrMVQ0TS84RVJUY3p0eWRDaGtramFROEkzNEc2Q3E1aTNJcnczVnRhQS9KTTF2a0lHOUZDVWRUaHZFUlJFUTFUdG9xemdxZW9SUzVwQW1EYUUyalEwYzdDem8rOHVUWTRIYW1weXZ1TENtenlYUXFnPT0iLCAic2lnbmF0dXJlIjogIk1HTUNMeHVjUnoyZndKZ092QkxyU1U3K1hlVTA3R0EyVXhZbDFMbEJLUnVIUS9wZlNWVHBEd0ZHSTNTb3h5ODR3NThIQWpBeGRtNEY3b3YvYUtEL0NFZi9QZlZDWHVlbE1mQys1L3pkUExXUUJEVnlGdWQrNVdYL3g4U083VXM5UGFhRW1mZz0ifSwgeyJ1c2VyUHVibGljS2V5IjogIk1Ib3dGQVlIS29aSXpqMENBUVlKS3lRREF3SUlBUUVMQTJJQUJHMWU3TDJVd1AyWWxTajB2RWViUGJpNVpLMDh5NS9UeHRWb3VrRFpIUGtSNlRtb2JoVGpyMVRVNzZpUkU4bDlWQlhuU1h1QVB6cjBuSHdKVkdVZVJMdmp4MVh0YUZReE9QNjhjNlIvRTdFWkZ2STdRUFg1N0tvRkhYdkEvVlJaNnc9PSIsICJzaWduYXR1cmUiOiAiTUdRQ01FUVdFNnk0Rm42SFg1ekFvTzNkYzl5cG1Sd2lBclplc2o5aVBROTZEaEhuNXJkRTdNaGFMdWNRZ0MvaXhjSWJsZ0l3QkN5aFBvRUg2RjFITFlwM2xqbWVncVlZQ1E5NHEyZm1kbDB6dHhrWEVTOVpPOVRNSUZQRVpKYlpmUnU5ZHcyOSJ9LCB7InVzZXJQdWJsaWNLZXkiOiAiTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkZRUUlDWmpWUTV4bkE0c2RMbUJzUmVaMzRJeWdkSmZhanA3SnRReFBzU2RwWTJXV0FneXp6Rm40OFFRRWhoU1BtdzhJYUU3VlJKRENBT3FYRnhGektJbFBFTDFvcFJDUmhhWmJrRzc5Y3ZrWC9HVVhlaFVYc2V2ZGhyb2VRVERFdz09IiwgInNpZ25hdHVyZSI6ICJNR1FDTUdQRndvSDJLbHhwbVZhWXRWV1ViMHpDSUJxYXFXY2F6czFqOVp4YklLUmVkR2tJY0VJdHN0UFoxdnVTanYvNDJnSXdSeGZPcTRoQTdNMHlGV2ZPSndqRTlTc2JsYXhvRDNiRTZCYzN2QjUyMmsyQ0ZJNWJqelpkeUFTVW04d2J2TW5WIn1d +``` + +### Credential Exchange Protocol + +When detecting a device goes online, the DSLM module requests the device security level credential from the device through the channel provided by [DSoftBus](https://gitee.com/openharmony/communication_dsoftbus). + +The packet for requesting the credential is in the following format: + +``` json +{ + "message": 1, + "payload": { + "version": 196608, + "challenge": "0102030405060708", + "support": [ + 300 + ] + } +} +``` + +The fields in the request message are described as follows: + +| Field| Description| +| :-------- | :------------------------------------ | +| message | Message header. The value **1** indicates a request for the device security level credential.| +| payload | Message payload, which is the specific request information.| +| version | Version of the protocol used by the requester.| +| challenge | Challenge value corresponding to this request.| +| support | List of credential formats supported by the requester.| + +After receiving the request, the peer device returns a response in the following format: + +``` json +{ + "message": 2, + "payload": { + "version": 196608, + "type": 300, + "challenge": "0102030405060708", + "info": "YWJjZAEDBQcJ..." + } +} +``` + +The fields in the response message are described as follows: +| Field| Description| +| :-------- | :--------------------------------------------------------- | +| message | Message header. The value **2** indicates a response to the request for the device security level credential.| +| payload | Message payload, which is the specific response information.| +| version | Version of the protocol used by the responder. | +| type | Format of the credential returned, which describes how to parse the **info** field.| +| challenge | Challenge value corresponding to this response message.| +| info | Signed credential information, which also includes the device information and challenge value verification information.| + +### Tool + +The DSLM module provides a [credential tool](https://gitee.com/openharmony/security_device_security_level/blob/master/oem_property/ohos/dslm_cred_tool.py) to help you better understand the issuing and verification of credentials. This tool is a Python script encapsulated with OpenSSL commands. +You can use the tool as follows: + +1. Initialize the signature key. + + ``` undefined + ./dslm_cred_tool.py init + ``` + +2. Generate a credential. + + For example, to generate a credential file **cred.txt** with the device model of **rk3568**, device version of **3.0.0**, and device security level of **SL3**, run the following command: + + ``` undefined + ./dslm_cred_tool.py create --field-manufacture OHOS --field-brand rk3568 --field-model rk3568 --field-software-version 3.0.0 --field-security-level SL3 --cred-file cred.txt + ``` + + A credential file is generated as follows: + + ``` undefined + cat cred.txt + eyJ0eXAiOiAiRFNMIn0=.eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIk9IT1MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4wLjAiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDMiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTUzMDMiLCAidmVyc2lvbiI6ICIxLjAuMSJ9.MGQCMEqZy/snsRyjMupnEvTpQfhQn+IcdCc5Q3NGxllNQVhoZX8PNyw6ATTgyx+26ghmtQIwVH5KwQ4/VejxckeHmtkBVhofhgmRapzvyVnyiB3PdsU7nvHk8A/zC7PFy1CWBG3z.W3sidXNlclB1YmxpY0tleSI6ICJNSG93RkFZSEtvWkl6ajBDQVFZSkt5UURBd0lJQVFFTEEySUFCQzFXRUxSVlU1NGp1U1ZXWlUrT29CM3hacFd5MWg3QW5uSFdKWm5QbTB3S2l0ZlJZelJKZ3FiUGQyZ3ltVXBUWVl1cmhyRDQxbFdPbUNzcmt0VWdaNTFXdGNCTmc5SG1GODkzc2ZHVFM5eUJNS0JoMGcxSHZaSVFSN1k0S3FXaWpnPT0iLCAic2lnbmF0dXJlIjogIk1HUUNNRFVicTZ2Z2R1YVF0bFVwOTR0azd4VjRJcEx2WVZWY3Y4aFNOTkw0azdPRHhmbEVGTHJFaUdPRWhwMUcweGFGYlFJd1pUbTk1cWx4OTBFZnptV3VIOGlEY2ZWYVlQS2N5SEYwR2ZFcEUzb1NESzQwZEFOZ0FJMWVQY09rTzBPOTdnTFAifSwgeyJ1c2VyUHVibGljS2V5IjogIk1Ib3dGQVlIS29aSXpqMENBUVlKS3lRREF3SUlBUUVMQTJJQUJGKzY1a0lSYTM2dkE4QVZWNXFrcUozYXpXTkdGQy9oaVdPL0tFNHR0S1pMOUsyNlhzQ2hQbjVNc3BlT2F3b1dqSU02bTVLOFZTcU1DYlZNN0svY0VRU0tYdDJTeVJGZERVZU9TaFZmQm9YVmxqaXRUU2puN0V5Q2pERVZiWjFRNEE9PSIsICJzaWduYXR1cmUiOiAiTUdRQ01HanF2cnZ5VW1YNVZLVVc1UkFkUTNkZ2hBYmNBazBRQnppQlFWMVFZUTNQMVFPSzdMckM1b0RObXh6T2Y0QUtmd0l3SzVWU2x3ZG5JSUR6Zm9PUXBEUVAycGhTVGgxSGVjbXJRK1F4VGxWelo0aHJsdnJyd2xCNnp0T3pWRFdNblRELyJ9LCB7InVzZXJQdWJsaWNLZXkiOiAiTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkZCa2FDNE9mc2VTREt2cW8vbU5VaUtXQ3JtK1VDNGFQcjVsODRNM2tMVCtDdkd3OWhqOGJ6d2I1MzNtVVlFZVhWWWtUdFlRYWRURkRJZXV1dGIzNU1QZDlEKytNMFRFWnZvcTY4NFhoYTVQMzBUbVRhK0ZvOG02UWliZWc3TmFQdz09IiwgInNpZ25hdHVyZSI6ICJNR1FDTURJcmpNYzhvODVPRHFZT0R4c05PcmpYdUhvWjM5endpZlhVTkdDc0lkN2xjU2FWcnhCVlNqRjRyaWg5Y1R6T3dRSXdWQXA3RUF5c1pucEI5REJWVWczQzlMeGQ3eTQxWEMwYVVPcGZUKzI3REVvWmM1WVVldDFGa1FwdmFQckduaFhVIn1d + ``` + +3. Verify a credential. + + ``` undefined + ./dslm_cred_tool.py verify --cred-file cred.txt + ``` + + The command output is as follows: + + ``` undefined + head: + { + "typ": "DSL" + } + payload: + { + "type": "debug", + "manufacture": "OHOS", + "brand": "rk3568", + "model": "rk3568", + "softwareVersion": "3.0.0", + "securityLevel": "SL3", + "signTime": "20220209155303", + "version": "1.0.1" + } + verify success! + ``` + +## FAQs + +- Q: How can I use the credential tool in a real production environment? + + A: The credential tool cannot be directly used in the production environment. It is used to demonstrate the format and generation process of credentials. In a real production environment, you are advised to generate credentials and save related keys in a cryptographic machine that meets related security requirements. + +- Q: How do I verify a credential in a real production environment? + + A: You are advised to use a properly kept private key to sign the credential and use more severe signature verification process instead of the default verification process provided by the DSLM module. For example, allow only the credentials issued by trusted certification authority (CA), and bind the credential and device ID to enhance the security. + +## References + +None diff --git a/en/device-dev/subsystems/subsys-security-overview.md b/en/device-dev/subsystems/subsys-security-overview.md index 9119937fb2e..52a022fdfc2 100644 --- a/en/device-dev/subsystems/subsys-security-overview.md +++ b/en/device-dev/subsystems/subsys-security-overview.md @@ -1,18 +1,23 @@ # Overview + The OpenHarmony security subsystem provides security capabilities that make your applications and devices more secure and help you manage permissions. This subsystem has the following modules: - Application signature verification - To ensure the content integrity of applications, the system controls sources of the applications through application signatures and profiles. For a debugging application, the system uses the signature verification API to check whether the Unique Device Identifier \(UDID\) of the application matches that of the device, so as to ensure that the application is installed on the right device. + To ensure the content integrity of applications, the system controls sources of the applications through application signatures and profiles. For a debugging application, the system uses the signature verification API to check whether the Unique Device Identifier (UDID) of the application matches that of the device, so as to ensure that the application is installed on the right device. - Application permission management - Application permissions determine what system resources and capabilities an application can access. During application development, you need to declare the permissions that the application may require in the **profile.json** file. Static permissions need to be registered during application installation, while dynamic permissions usually involve sensitive information and need users' dynamic authorization. + Application permissions determine what system resources and capabilities an application can access. During application development, you need to declare the permissions that the application may require in the **profile.json** file. Static permissions need to be registered during application installation, while dynamic permissions usually involve sensitive information and need users' dynamic authorization. - Trusted device group management - You can create and query a group of trusted devices that use the same ID or a peer-to-peer group created by scanning a QR code or using OneHop. With this capability, distributed applications can perform trusted authentication between devices and request from the distributed virtual bus for secure sessions between devices. + You can create and query a group of trusted devices that use the same HUAWEI ID or a peer-to-peer group created by scanning a QR code or using OneHop. With this capability, distributed applications can perform trusted authentication between devices and request from the distributed virtual bus for secure sessions between devices. + +- DSLM + + The OpenHarmony Device Security Level Management (DSLM) module manages the security levels of OpenHarmony devices. When different types of user data are hopped or processed in OpenHarmony distributed services, the DSLM APIs can be called to obtain the security levels of related devices for subsequent processing. ## Basic Concepts @@ -21,22 +26,22 @@ Before developing an application that depends on the signature verification comp - Samgr - System Ability Manager \(Samgr\) is a module of OpenHarmony for managing system capabilities. For details, see the Application Framework development guidelines. + System Ability Manager (Samgr) is a module of OpenHarmony for managing system capabilities. For details, see the Application Framework development guidelines. - BMS - Bundle Manager Service \(BMS\) manages application installation, uninstallation, and data on OpenHarmony. + Bundle Manager Service (BMS) manages application installation, uninstallation, and data on OpenHarmony. - Profile - The profile in this document refers to HarmonyAppProvision \(profile for short\). HarmonyAppProvision is in JSON format. + The profile in this document refers to HarmonyAppProvision (profile for short). HarmonyAppProvision is in JSON format. - Debugging application - A debugging application is a HAP that is signed with a debugging certificate and profile obtained from the application market. + A debugging application is a HarmonyOS Ability Package (HAP) that is signed with a debugging certificate and profile obtained from the application market. - Released application @@ -46,11 +51,10 @@ Before developing an application that depends on the signature verification comp - OpenHarmony self-signed application - A self-signed application is one that has been signed with the signing certificate and profile issued by OpenHarmony's open-source root CA, which is comprised of a certificate and a key. + A self-signed application is one that has been signed with the signing certificate and profile issued by OpenHarmony's open-source root CA, which consists of a certificate and a key. -## Limitations and Constraints +## Constraints - Only signatures of debugging, released, and OpenHarmony self-signed applications can be verified. - To verify the signature of a debugging application, the UDID of the device on which the debugging application is installed must be in the UDID list contained in the profile. - diff --git a/en/device-dev/subsystems/subsys-security.md b/en/device-dev/subsystems/subsys-security.md index b4ac9422314..aa27b416d52 100644 --- a/en/device-dev/subsystems/subsys-security.md +++ b/en/device-dev/subsystems/subsys-security.md @@ -1,11 +1,13 @@ # Security -- **[Overview](subsys-security-overview.md)** +- **[Overview](subsys-security-overview.md)** -- **[Development Guidelines on Application Signature Verification](subsys-security-sigverify.md)** +- **[Development Guidelines on Application Signature Verification] (subsys-security-sigverify.md)** -- **[Development Guidelines on Application Permission Management](subsys-security-rightmanagement.md)** +- **[Development Guidelines on Application Permission Management](subsys-security-rightmanagement.md)** -- **[Development Guidelines on IPC Authentication](subsys-security-communicationverify.md)** +- **[Development Guidelines on IPC Authentication](subsys-security-communicationverify.md)** +- **[Development Guidelines on Device Security Level Management](subsys-security-devicesecuritylevel.md)** +- **[Development Guidelines on Key Management](subsys-security-huks.md)** -- Gitee From 7457791a658a883ee42156be6404d748e1e1f115 Mon Sep 17 00:00:00 2001 From: VictoriaGuo Date: Thu, 3 Mar 2022 14:26:54 +0800 Subject: [PATCH 077/282] add SystemCapability Signed-off-by: VictoriaGuo --- .../apis/js-apis-resource-manager.md | 82 +++++++++++++------ 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md b/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md index 400480d8d1e..58054eb9b5a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md +++ b/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md @@ -10,18 +10,14 @@ import resourceManager from '@ohos.resourceManager'; ``` - -## 权限 - -无 - - ## resourceManager.getResourceManager getResourceManager(callback: AsyncCallback<ResourceManager>): void 获取当前应用的资源管理对象,使用callback形式返回ResourceManager对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -51,6 +47,8 @@ getResourceManager(bundleName: string, callback: AsyncCallback<ResourceManage 获取指定应用的资源管理对象,使用callback形式返回ResourceManager对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -70,6 +68,8 @@ getResourceManager(): Promise<ResourceManager> 获取当前应用的资源管理对象,使用Promise形式返回ResourceManager对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -97,6 +97,8 @@ getResourceManager(bundleName: string): Promise<ResourceManager> 获取指定应用的资源管理对象,使用Promise形式返回ResourceManager对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -123,8 +125,8 @@ getResourceManager(bundleName: string): Promise<ResourceManager> | 名称 | 默认值 | 说明 | | -------- | -------- | -------- | -| DIRECTION_VERTICAL | 0 | 竖屏 | -| DIRECTION_HORIZONTAL | 1 | 横屏 | +| DIRECTION_VERTICAL | 0 | 竖屏
**系统能力**:SystemCapability.Global.ResourceManager | +| DIRECTION_HORIZONTAL | 1 | 横屏
**系统能力**:SystemCapability.Global.ResourceManager | ## DeviceType @@ -133,12 +135,12 @@ getResourceManager(bundleName: string): Promise<ResourceManager> | 名称 | 默认值 | 说明 | | -------- | -------- | -------- | -| DEVICE_TYPE_PHONE | 0x00 | 手机 | -| DEVICE_TYPE_TABLET | 0x01 | 平板 | -| DEVICE_TYPE_CAR | 0x02 | 汽车 | -| DEVICE_TYPE_PC | 0x03 | 电脑 | -| DEVICE_TYPE_TV | 0x04 | 电视 | -| DEVICE_TYPE_WEARABLE | 0x06 | 穿戴 | +| DEVICE_TYPE_PHONE | 0x00 | 手机
**系统能力**:SystemCapability.Global.ResourceManager | +| DEVICE_TYPE_TABLET | 0x01 | 平板
**系统能力**:SystemCapability.Global.ResourceManager | +| DEVICE_TYPE_CAR | 0x02 | 汽车
**系统能力**:SystemCapability.Global.ResourceManager | +| DEVICE_TYPE_PC | 0x03 | 电脑
**系统能力**:SystemCapability.Global.ResourceManager | +| DEVICE_TYPE_TV | 0x04 | 电视
**系统能力**:SystemCapability.Global.ResourceManager | +| DEVICE_TYPE_WEARABLE | 0x06 | 穿戴
**系统能力**:SystemCapability.Global.ResourceManager | ## ScreenDensity @@ -147,12 +149,12 @@ getResourceManager(bundleName: string): Promise<ResourceManager> | 名称 | 默认值 | 说明 | | -------- | -------- | -------- | -| SCREEN_SDPI | 120 | 小规模的屏幕密度 | -| SCREEN_MDPI | 160 | 中规模的屏幕密度 | -| SCREEN_LDPI | 240 | 大规模的屏幕密度 | -| SCREEN_XLDPI | 320 | 特大规模的屏幕密度 | -| SCREEN_XXLDPI | 480 | 超大规模的屏幕密度 | -| SCREEN_XXXLDPI | 640 | 超特大规模的屏幕密度 | +| SCREEN_SDPI | 120 | 小规模的屏幕密度
**系统能力**:SystemCapability.Global.ResourceManager | +| SCREEN_MDPI | 160 | 中规模的屏幕密度
**系统能力**:SystemCapability.Global.ResourceManager | +| SCREEN_LDPI | 240 | 大规模的屏幕密度
**系统能力**:SystemCapability.Global.ResourceManager | +| SCREEN_XLDPI | 320 | 特大规模的屏幕密度
**系统能力**:SystemCapability.Global.ResourceManager | +| SCREEN_XXLDPI | 480 | 超大规模的屏幕密度
**系统能力**:SystemCapability.Global.ResourceManager | +| SCREEN_XXXLDPI | 640 | 超特大规模的屏幕密度
**系统能力**:SystemCapability.Global.ResourceManager | ## Configuration @@ -162,8 +164,8 @@ getResourceManager(bundleName: string): Promise<ResourceManager> | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| direction | [Direction](#direction) | 是 | 否 | 当前设备屏幕方向 | -| locale | string | 是 | 否 | 当前系统语言 | +| direction | [Direction](#direction) | 是 | 否 | 当前设备屏幕方向
**系统能力**:SystemCapability.Global.ResourceManager | +| locale | string | 是 | 否 | 当前系统语言
**系统能力**:SystemCapability.Global.ResourceManager | ## DeviceCapability @@ -173,8 +175,8 @@ getResourceManager(bundleName: string): Promise<ResourceManager> | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| screenDensity | [ScreenDensity](#screendensity) | 是 | 否 | 当前设备屏幕密度 | -| deviceType | [DeviceType](#devicetype) | 是 | 否 | 当前设备类型 | +| screenDensity | [ScreenDensity](#screendensity) | 是 | 否 | 当前设备屏幕密度
**系统能力**:SystemCapability.Global.ResourceManager | +| deviceType | [DeviceType](#devicetype) | 是 | 否 | 当前设备类型
**系统能力**:SystemCapability.Global.ResourceManager | ## ResourceManager @@ -193,6 +195,8 @@ getString(resId: number, callback: AsyncCallback<string>): void 用户获取指定资源ID对应的字符串,使用callback形式返回字符串。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -219,6 +223,8 @@ getString(resId: number): Promise<string> 用户获取指定资源ID对应的字符串,使用Promise形式返回字符串。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -247,6 +253,8 @@ getStringArray(resId: number, callback: AsyncCallback<Array<string>> 用户获取指定资源ID对应的字符串数组,使用callback形式返回字符串数组。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -273,6 +281,8 @@ getStringArray(resId: number): Promise<Array<string>> 用户获取指定资源ID对应的字符串数组,使用Promise形式返回字符串数组。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -301,6 +311,8 @@ getMedia(resId: number, callback: AsyncCallback<Uint8Array>): void 用户获取指定资源ID对应的媒体文件内容,使用callback形式返回字节数组。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -327,6 +339,8 @@ getMedia(resId: number): Promise<Uint8Array> 用户获取指定资源ID对应的媒体文件内容,使用Promise形式返回字节数组。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -355,6 +369,8 @@ getMediaBase64(resId: number, callback: AsyncCallback<string>): void 用户获取指定资源ID对应的图片资源Base64编码,使用callback形式返回字符串。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -381,6 +397,8 @@ getMediaBase64(resId: number): Promise<string> 用户获取指定资源ID对应的图片资源Base64编码,使用Promise形式返回字符串。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -409,6 +427,8 @@ getConfiguration(callback: AsyncCallback<Configuration>): void 用户获取设备的Configuration,使用callback形式返回Configuration对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -434,6 +454,8 @@ getConfiguration(): Promise<Configuration> 用户获取设备的Configuration,使用Promise形式返回Configuration对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -457,6 +479,8 @@ getDeviceCapability(callback: AsyncCallback<DeviceCapability>): void 用户获取设备的DeviceCapability,使用callback形式返回DeviceCapability对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -482,6 +506,8 @@ getDeviceCapability(): Promise<DeviceCapability> 用户获取设备的DeviceCapability,使用Promise形式返回DeviceCapability对象。 +**系统能力**:SystemCapability.Global.ResourceManager + - 返回值: | 类型 | 说明 | | -------- | -------- | @@ -505,6 +531,8 @@ getPluralString(resId: number, num: number, callback: AsyncCallback<string> 根据指定数量获取指定ID字符串表示的单复数字符串,使用callback形式返回字符串。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -532,6 +560,8 @@ getPluralString(resId: number, num: number): Promise<string> 根据指定数量获取对指定ID字符串表示的单复数字符串,使用Promise形式返回字符串。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -560,6 +590,8 @@ getRawFile(path: string, callback: AsyncCallback<Uint8Array>): void 用户获取指定路径对应的rawfile文件内容,使用callback形式返回字节数组。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -585,6 +617,8 @@ getRawFile(path: string): Promise<Uint8Array> 用户获取指定路径对应的rawfile文件内容,使用Promise形式返回字节数组。 +**系统能力**:SystemCapability.Global.ResourceManager + - 参数: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -- Gitee From 5f2b7556db0c2b459d849257ab260e3e59a53cab Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Thu, 3 Mar 2022 14:49:57 +0800 Subject: [PATCH 078/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 58 +++++++++---------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 8f91da0a391..ee1e26d7224 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -137,7 +137,7 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| ``` medialibrary.on('imageChange', () => { - this.sendNotify('image'); + // image file had changed, do something }) ``` ## medialibrary.off @@ -163,7 +163,7 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' ``` medialibrary.off('imageChange', () => { - this.sendNotify('image'); + // stop listening success }) ``` @@ -183,7 +183,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal | ------------ | -------------------------------------- | ---- | ------------------------------------------------------------ | | mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | | displayName | string | 是 | 展示文件名 | -| relativePath | string | 是 | 相对路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | +| relativePath | string | 是 | 相对公共目录路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | | callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取媒体数据FileAsset之后的回调 | **示例:** @@ -262,7 +262,7 @@ getPublicDirectory(type: DirectoryType, callback: AsyncCallback): void; let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; media.getPublicDirectory(DIR_CAMERA,(err, dicResult) => { if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory passed'); + console.info('MediaLibraryTest : getPublicDirectory'); } else { console.info('MediaLibraryTest : getPublicDirectory failed'); } @@ -297,7 +297,7 @@ getPublicDirectory(type: DirectoryType): Promise; let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; const dicResult = await media.getPublicDirectory(DIR_CAMERA); if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory passed'); + console.info('MediaLibraryTest : getPublicDirectory'); } else { console.info('MediaLibraryTest : getPublicDirectory failed'); } @@ -327,17 +327,15 @@ let AlbumNoArgsfetchOp = { selections: '', selectionArgs: [], }; -medialibrary.AlbumNoArgsfetchOp, (err, albumList) => { +medialibrary.getAlbums(AlbumNoArgsfetchOp, (err, albumList) => { if (albumList != undefined) { const album = albumList[0]; console.info('album.albumName = ' + album.albumName); console.info('album.count = ' + album.count); - done(); } else { console.info('getAlbum fail, message = ' + err); - done(); } -}); +}) ``` ## medialibrary.getAlbums @@ -580,11 +578,11 @@ let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; asset = await media.createAsset(mediaType, "image00003.jpg", path); asset.open('rw', (openError, fd) => { - if(fd > 0){ - asset.close(fd); - }else{ - console.info('File Open Failed!' + openError); - } + if(fd > 0){ + asset.close(fd); + }else{ + console.info('File Open Failed!' + openError); + } }); ``` @@ -617,11 +615,11 @@ let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; asset = await media.createAsset(mediaType, "image00003.jpg", path); asset.open('rw').then((openError, fd) => { - if(fd > 0){ - asset.close(fd); - }else{ - console.info('File Open Failed!' + openError); - } + if(fd > 0){ + asset.close(fd); + }else{ + console.info('File Open Failed!' + openError); + } }); ``` @@ -1072,15 +1070,13 @@ const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); asset.isTrash(isTrashCallBack); function isTrashCallBack(err, isTrash) { - if (isTrash == true) { - console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash); - asset.trash(true, trashCallBack); - - } else { - console.info('MediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err); - console.info('MediaLibraryTest : ASSET_CALLBACK isTrash : FAIL'); - - } + if (isTrash == true) { + console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash); + asset.trash(true, trashCallBack); + } else { + console.info('MediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err); + console.info('MediaLibraryTest : ASSET_CALLBACK isTrash : FAIL'); + } } ``` @@ -1732,7 +1728,7 @@ FileAsset | mediaType | MediaType | 是 | 否 | 媒体类型 | | displayName | string | 是 | 是 | 显示文件名 | | title | string | 是 | 是 | 文件标题 | -| relativePath | string | 是 | 是 | 相对路径 | +| relativePath | string | 是 | 是 | 相对公共目录路径 | | parent | number | 是 | 否 | 父目录id | | size | number | 是 | 否 | 文件大小(单位:字节) | | dateAdded | number | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | @@ -1785,7 +1781,7 @@ FileKey | 名称 | 默认值 | 描述 | | ------------- | ------------------- | ------------------------------------------------------ | | ID | file_id | 文件编号 | -| RELATIVE_PATH | relative_path | 相对路径 | +| RELATIVE_PATH | relative_path | 相对公共目录路径 | | DISPLAY_NAME | display_name | 显示名字 | | PARENT | parent | 父目录id | | MIME_TYPE | mime_type | 文件扩展属性 | @@ -1840,7 +1836,7 @@ DeviceType | 名称 | 类型 | 可读 | 可写 | 必填 |说明 | | ------------- | ------------- | ---- | ---- | ---- |---------------- | | selections | string | 是 | 是 |是 | 检索条件 | -| selectionArgs | Array | 是 | 是 |是 | 检索条件的值 | +| selectionArgs | Array<string> | 是 | 是 |是 | 检索条件的值 | | order | string | 是 | 是 | 否 |检索结果排序方式 | | uri | string | 是 | 是 | 否 |文件URI | | networkId | string | 是 | 是 | 否 |注册设备网络ID | -- Gitee From c74300296a1d2d01c030fccf8a534f33ad58ee92 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Thu, 3 Mar 2022 14:54:55 +0800 Subject: [PATCH 079/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index ee1e26d7224..d7c00987327 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -19,7 +19,7 @@ function getMediaLibrary(context: Context): MediaLibrary; **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core -**参数:** +**参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------- | ---- | -------------------- | @@ -44,7 +44,7 @@ var mediaLibrary = mediaLibrary.getMediaLibrary(context); ## medialibrary.getFileAssets -getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; +getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; 获取文件资源,使用callback方式返回异步结果。 @@ -137,7 +137,7 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| ``` medialibrary.on('imageChange', () => { - // image file had changed, do something + // image file had changed, do something }) ``` ## medialibrary.off @@ -240,7 +240,7 @@ medialibrary.createAsset(mediaType, "image01.jpg", path).then (function (asset) ## medialibrary.getPublicDirectory -getPublicDirectory(type: DirectoryType, callback: AsyncCallback): void; +getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): void; 获取公共目录路径 @@ -271,7 +271,7 @@ media.getPublicDirectory(DIR_CAMERA,(err, dicResult) => { ## medialibrary.getPublicDirectory -getPublicDirectory(type: DirectoryType): Promise; +getPublicDirectory(type: DirectoryType): Promise<string>; 获取公共目录路径 @@ -297,7 +297,7 @@ getPublicDirectory(type: DirectoryType): Promise; let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; const dicResult = await media.getPublicDirectory(DIR_CAMERA); if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory'); + console.info('MediaLibraryTest : getPublicDirectory'); } else { console.info('MediaLibraryTest : getPublicDirectory failed'); } @@ -518,7 +518,7 @@ const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); asset.title = ‘newtitle'; asset.commitModify(() => { - console.info('commitModify success'); + console.info('commitModify success'); } ``` @@ -1186,7 +1186,7 @@ for (var i = 1; i < fetchCount; i++) { console.info('MediaLibraryTest : isAfterLast:' + result); console.info('MediaLibraryTest : isAfterLast end'); fetchFileResult.close(); - + } } ``` @@ -1814,7 +1814,7 @@ DirectoryType | DIR_DOCUMENTS | 4 | 表示文档路径 | | DIR_DOWNLOAD | 5 | 表示下载路径 | -DeviceType +DeviceType ----------- 枚举,设备类型。 @@ -1829,7 +1829,7 @@ DeviceType | TYPE_CAR | 5 | 车载设备 | | TYPE_TV | 6 | 电视设备 | -## MediaFetchOptions +## MediaFetchOptions 检索条件。 -- Gitee From 8888bddf2f68eb8b044da9740d4b186df65ffac5 Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 3 Mar 2022 15:11:09 +0800 Subject: [PATCH 080/282] update docs Signed-off-by: zengyawen --- zh-cn/OpenHarmony-Overview_zh.md | 2 +- .../reference/apis/js-apis-audio.md | 169 ++++++++++++------ .../reference/apis/js-apis-bytrace.md | 2 +- .../reference/apis/js-apis-camera.md | 3 + .../reference/apis/js-apis-image.md | 3 + .../reference/apis/js-apis-media.md | 151 +++++++++------- zh-cn/figures/1.png | Bin 208587 -> 250969 bytes 7 files changed, 209 insertions(+), 121 deletions(-) diff --git a/zh-cn/OpenHarmony-Overview_zh.md b/zh-cn/OpenHarmony-Overview_zh.md index 0364f1359d1..9e766989453 100644 --- a/zh-cn/OpenHarmony-Overview_zh.md +++ b/zh-cn/OpenHarmony-Overview_zh.md @@ -23,7 +23,7 @@ OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及 OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 \> 子系统 \> 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的组件。OpenHarmony技术架构如下所示: -![](https://gitee.com/openharmony/docs/raw/master/zh-cn/figures/1.png) +![](figures/1.png) **内核层** 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 4369e06d571..607758131ea 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-audio.md +++ b/zh-cn/application-dev/reference/apis/js-apis-audio.md @@ -1,5 +1,8 @@ # 音频管理 +> **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + ## 导入模块 ``` @@ -13,6 +16,8 @@ getAudioManager(): AudioManager 获取音频管理器。 +**系统能力:** SystemCapability.Multimedia.Audio.Core + **返回值:** | 类型 | 说明 | | -------- | -------- | @@ -30,8 +35,8 @@ var audioManager = audio.getAudioManager(); | 名称 | 默认值 | 描述 | | -------- | -------- | -------- | -| RINGTONE | 2 | 表示铃声。 | -| MEDIA | 3 | 表示媒体。 | +| RINGTONE | 2 | 表示铃声。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | +| MEDIA | 3 | 表示媒体。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | ## DeviceFlag @@ -40,9 +45,9 @@ var audioManager = audio.getAudioManager(); | 名称 | 默认值 | 描述 | | -------- | -------- | -------- | -| OUTPUT_DEVICES_FLAG | 1 | 表示输出设备种类。 | -| INPUT_DEVICES_FLAG | 2 | 表示输入设备种类。 | -| ALL_DEVICES_FLAG | 3 | 表示所有设备种类。 | +| OUTPUT_DEVICES_FLAG | 1 | 表示输出设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| INPUT_DEVICES_FLAG | 2 | 表示输入设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| ALL_DEVICES_FLAG | 3 | 表示所有设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | ## DeviceRole @@ -51,42 +56,42 @@ var audioManager = audio.getAudioManager(); | 名称 | 默认值 | 描述 | | -------- | -------- | -------- | -| INPUT_DEVICE | 1 | 输入设备角色。 | -| OUTPUT_DEVICE | 2 | 输出设备角色。 | +| INPUT_DEVICE | 1 | 输入设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| OUTPUT_DEVICE | 2 | 输出设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | ## DeviceType 枚举,设备类型。 -| 名称 | 默认值 | 描述 | -| -------------- | ------ | ------------------------------------------------------- | -| INVALID | 0 | 无效设备。 | -| EARPIECE | 1 | 听筒。 | -| SPEAKER | 2 | 扬声器。 | -| WIRED_HEADSET | 3 | 有线耳机。 | -| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。 | -| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP连接(Advanced Audio Distribution Profile)。 | -| MIC | 15 | 麦克风。 | +| 名称 | 默认值 | 描述 | +| -------------- | ------ | ------------------------------------------------------------ | +| INVALID | 0 | 无效设备。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| EARPIECE | 1 | 听筒。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| WIRED_HEADSET | 3 | 有线耳机。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP连接(Advanced Audio Distribution Profile)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| MIC | 15 | 麦克风。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -## ActiveDeviceType7+ +## ActiveDeviceType 枚举,活跃设备类型。 -| 名称 | 默认值 | 描述 | -| ------------- | ------ | -------------------------------------------------- | -| SPEAKER | 2 | 扬声器。 | -| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。 | +| 名称 | 默认值 | 描述 | +| ------------- | ------ | ------------------------------------------------------------ | +| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -## AudioRingMode7+ +## AudioRingMode 枚举,铃声模式。 | 名称 | 默认值 | 描述 | | -------- | -------- | -------- | -| RINGER_MODE_SILENT | 0 | 静音模式 | -| RINGER_MODE_VIBRATE | 1 | 震动模式 | -| RINGER_MODE_NORMAL | 2 | 响铃模式 | +| RINGER_MODE_SILENT | 0 | 静音模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | +| RINGER_MODE_VIBRATE | 1 | 震动模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | +| RINGER_MODE_NORMAL | 2 | 响铃模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | ## AudioManager @@ -99,6 +104,8 @@ setVolume(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback&l 设置指定流的音量,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -126,6 +133,8 @@ setVolume(volumeType: AudioVolumeType, volume: number): Promise<void> 设置指定流的音量,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -154,6 +163,8 @@ getVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): v 获取指定流的音量,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -180,6 +191,8 @@ getVolume(volumeType: AudioVolumeType): Promise<number> 获取指定流的音量,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -207,6 +220,8 @@ getMinVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>) 获取指定流的最小音量,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -233,6 +248,8 @@ getMinVolume(volumeType: AudioVolumeType): Promise<number> 获取指定流的最小音量,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -260,6 +277,8 @@ getMaxVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>) 获取指定流的最大音量,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -286,6 +305,8 @@ getMaxVolume(volumeType: AudioVolumeType): Promise<number> 获取指定流的最大音量,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -307,12 +328,14 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> ) ``` -### mute7+ +### mute mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback<void>): void 设置指定音量流静音,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -334,12 +357,14 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { }) ``` -### mute7+ +### mute mute(volumeType: AudioVolumeType, mute: boolean): Promise<void> 设置指定音量流静音,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -364,12 +389,14 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => ``` -### isMute7+ +### isMute isMute(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void 获取指定音量流是否被静音,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -391,12 +418,14 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { ``` -### isMute7+ +### isMute isMute(volumeType: AudioVolumeType): Promise<boolean> 获取指定音量流是否被静音,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -418,12 +447,14 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => ) ``` -### isActive7+ +### isActive isActive(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void 获取指定音量流是否为活跃状态,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -444,12 +475,14 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### isActive7+ +### isActive isActive(volumeType: AudioVolumeType): Promise<boolean> 获取指定音量流是否为活跃状态,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Volume + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -471,12 +504,14 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => ) ``` -### setRingerMode7+ +### setRingerMode setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void 设置铃声模式,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Communication + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -497,12 +532,14 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { }) ``` -### setRingerMode7+ +### setRingerMode setRingerMode(mode: AudioRingMode): Promise<void> 设置铃声模式,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Communication + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -525,12 +562,14 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => ``` -### getRingerMode7+ +### getRingerMode getRingerMode(callback: AsyncCallback<AudioRingMode>): void 获取铃声模式,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Communication + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -551,12 +590,14 @@ audioManager.getRingerMode((err, value) => { ``` -### getRingerMode7+ +### getRingerMode getRingerMode(): Promise<AudioRingMode> 获取铃声模式,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Communication + **返回值:** | 类型 | 说明 | @@ -572,12 +613,14 @@ audioManager.getRingerMode().then((value) => ) ``` -### setAudioParameter7+ +### setAudioParameter setAudioParameter(key: string, value: string, callback: AsyncCallback<void>): void 音频参数设置,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -599,12 +642,14 @@ audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { }) ``` -### setAudioParameter7+ +### setAudioParameter setAudioParameter(key: string, value: string): Promise<void> 音频参数设置,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -627,12 +672,14 @@ audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => ) ``` -### getAudioParameter7+ +### getAudioParameter getAudioParameter(key: string, callback: AsyncCallback<string>): void 获取指定音频参数值,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -653,12 +700,14 @@ audioManager.getAudioParameter('PBits per sample', (err, value) => { }) ``` -### getAudioParameter7+ +### getAudioParameter getAudioParameter(key: string): Promise<string> 获取指定音频参数值,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -686,6 +735,8 @@ getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescrip 获取音频设备列表,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -711,6 +762,8 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ 获取音频设备列表,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -732,12 +785,14 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> ) ``` -### setDeviceActive7+ +### setDeviceActive setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback<void>): void 设置设备激活状态,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -759,12 +814,14 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { }) ``` -### setDeviceActive7+ +### setDeviceActive setDeviceActive(deviceType: DeviceType, active: boolean): Promise<void> 设置设备激活状态,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -788,12 +845,14 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> ) ``` -### isDeviceActive7+ +### isDeviceActive isDeviceActive(deviceType: DeviceType, callback: AsyncCallback<boolean>): void 获取指定设备的激活状态,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -815,12 +874,14 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { ``` -### isDeviceActive7+ +### isDeviceActive isDeviceActive(deviceType: DeviceType): Promise<boolean> 获取指定设备的激活状态,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -842,12 +903,14 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => ) ``` -### setMicrophoneMute7+ +### setMicrophoneMute setMicrophoneMute(mute: boolean, callback: AsyncCallback<void>): void 设置麦克风静音状态,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -868,12 +931,14 @@ audioManager.setMicrophoneMute(true, (err) => { }) ``` -### setMicrophoneMute7+ +### setMicrophoneMute setMicrophoneMute(mute: boolean): Promise<void> 设置麦克风静音状态,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -895,12 +960,14 @@ audioManager.setMicrophoneMute(true).then(() => ) ``` -### isMicrophoneMute7+ +### isMicrophoneMute isMicrophoneMute(callback: AsyncCallback<boolean>): void 获取麦克风静音状态,使用callback方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -920,12 +987,14 @@ audioManager.isMicrophoneMute((err, value) => { }) ``` -### isMicrophoneMute7+ +### isMicrophoneMute isMicrophoneMute(): Promise<boolean> 获取麦克风静音状态,使用promise方式返回异步结果。 +**系统能力:** SystemCapability.Multimedia.Audio.Device + **返回值:** | 类型 | 说明 | @@ -949,12 +1018,12 @@ audioManager.isMicrophoneMute().then((value) => | 名称 | 参数型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。 | -| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。 | +| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。
**系统能力:** SystemCapability.Multimedia.Audio.Device | ## AudioDeviceDescriptors | 名称 | 描述 | | -------- | -------- | -| 设备属性数组 | AudioDeviceDescriptor的数组,只读。 | +| 设备属性数组 | AudioDeviceDescriptor的数组,只读。
**系统能力:** SystemCapability.Multimedia.Audio.Device | diff --git a/zh-cn/application-dev/reference/apis/js-apis-bytrace.md b/zh-cn/application-dev/reference/apis/js-apis-bytrace.md index 9276e557f64..22baa86785c 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-bytrace.md +++ b/zh-cn/application-dev/reference/apis/js-apis-bytrace.md @@ -1,7 +1,7 @@ # 性能打点 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> - 从API Version 8开始,该接口不再维护,推荐使用新接口[hiTraceMeter](js-apis-hitracemeter.md)。具体新接口在接口描述中说明。 +> - 从API Version 8开始,该接口不再维护,推荐使用新接口[hiTraceMeter](js-apis-hitracemeter.md)。 > - 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-camera.md b/zh-cn/application-dev/reference/apis/js-apis-camera.md index 5393f3f49ca..ed5e53a56ef 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-camera.md +++ b/zh-cn/application-dev/reference/apis/js-apis-camera.md @@ -1,5 +1,8 @@ # 相机管理 +> **说明:** +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + ## 导入模块 ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-image.md b/zh-cn/application-dev/reference/apis/js-apis-image.md index 6795829a272..9dbb932ac72 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-image.md +++ b/zh-cn/application-dev/reference/apis/js-apis-image.md @@ -1,6 +1,9 @@ 图片处理 ========== +> **说明:** +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + 导入模块 --------- diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index b575b112344..bc8c7da071b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1,5 +1,8 @@ # 媒体服务 +> **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + 媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。 媒体子系统包含了音视频相关媒体业务,提供以下常用功能: @@ -23,13 +26,13 @@ createAudioPlayer(): [AudioPlayer](#audioplayer) 同步方式创建音频播放实例。 - +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer **返回值:** | 类型 | 说明 | | --------------------------- | ------------------------------------------------------------ | -| [AudioPlayer](#audioplayer) | 返回AudioPlayer类实例,失败时返回null。可用于音频播放、暂停、停止等操作。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| [AudioPlayer](#audioplayer) | 返回AudioPlayer类实例,失败时返回null。可用于音频播放、暂停、停止等操作。 | **示例:** @@ -43,11 +46,13 @@ createVideoPlayer(callback: AsyncCallback\<[VideoPlayer](#videoplayer8)>): void 异步方式创建视频播放实例,通过注册回调函数获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------------------- | ---- | ------------------------------------------------------------ | -| callback | AsyncCallback<[VideoPlayer](#videoplayer8)> | 是 | 异步创建视频播放实例回调方法。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------- | ---- | ------------------------------ | +| callback | AsyncCallback<[VideoPlayer](#videoplayer8)> | 是 | 异步创建视频播放实例回调方法。 | **示例:** @@ -70,11 +75,13 @@ createVideoPlayer: Promise<[VideoPlayer](#videoplayer8)> 异步方式创建视频播放实例,通过Promise获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + **返回值:** -| 类型 | 说明 | -| ------------------------------------- | ------------------------------------------------------------ | -| Promise<[VideoPlayer](#videoplayer8)> | 异步创建视频播放实例Promise返回值。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| 类型 | 说明 | +| ------------------------------------- | ----------------------------------- | +| Promise<[VideoPlayer](#videoplayer8)> | 异步创建视频播放实例Promise返回值。 | **示例:** @@ -104,11 +111,13 @@ createAudioRecorder(): AudioRecorder 创建音频录制的实例来控制音频的录制。 +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + **返回值:** -| 类型 | 说明 | -| ------------------------------- | ------------------------------------------------------------ | -| [AudioRecorder](#audiorecorder) | 返回AudioRecorder类实例,失败时返回null。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| 类型 | 说明 | +| ------------------------------- | ----------------------------------------- | +| [AudioRecorder](#audiorecorder) | 返回AudioRecorder类实例,失败时返回null。 | **示例:** @@ -122,11 +131,13 @@ createVideoRecorder(callback: AsyncCallback\<[VideoRecorder](#videorecorder8)>): 异步方式创建视频录制实例。通过注册回调函数获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------- | ---- | ------------------------------------------------------------ | -| callback | AsyncCallback<[VideoRecorder](#videorecorder8)> | 是 | 异步创建视频录制实例回调方法。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------- | ---- | ------------------------------ | +| callback | AsyncCallback<[VideoRecorder](#videorecorder8)> | 是 | 异步创建视频录制实例回调方法。 | **示例:** @@ -149,11 +160,13 @@ createVideoRecorder: Promise<[VideoRecorder](#videorecorder8)> 异步方式创建视频录制实例。通过Promise获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + **返回值:** -| 类型 | 说明 | -| ----------------------------------------- | ------------------------------------------------------------ | -| Promise<[VideoRecorder](#videorecorder8)> | 异步创建视频录制实例Promise返回值。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| 类型 | 说明 | +| ----------------------------------------- | ----------------------------------- | +| Promise<[VideoRecorder](#videorecorder8)> | 异步创建视频录制实例Promise返回值。 | **示例:** @@ -181,7 +194,7 @@ await media.createVideoRecorder.then((video) => { ## MediaErrorCode8+ -媒体服务错误类型枚举 +媒体服务错误类型枚举。 | 名称 | 值 | 说明 | | -------------------------- | ---- | ------------------------------------------------------------ | @@ -198,7 +211,7 @@ await media.createVideoRecorder.then((video) => { ## MediaType8+ -媒体类型枚举 +媒体类型枚举。 | 名称 | 值 | 说明 | | -------------- | ---- | ------------------------------------------------------------ | @@ -207,7 +220,7 @@ await media.createVideoRecorder.then((video) => { ## CodecMimeType8+ -Codec MIME类型枚举 +Codec MIME类型枚举。 | 名称 | 值 | 说明 | | ------------ | ----------------- | ------------------------------------------------------------ | @@ -218,7 +231,7 @@ Codec MIME类型枚举 ## MediaDescriptionKey8+ -媒体信息描述枚举 +媒体信息描述枚举。 | 名称 | 值 | 说明 | | ------------------------ | --------------- | ------------------------------------------------------------ | @@ -235,7 +248,7 @@ Codec MIME类型枚举 ## BufferingInfoType8+ -缓存事件类型枚举 +缓存事件类型枚举。 | 名称 | 值 | 说明 | | ----------------- | ---- | ------------------------------------------------------------ | @@ -254,7 +267,7 @@ Codec MIME类型枚举 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----------- | ------------------------- | ---- | ---- | ------------------------------------------------------------ | -| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | +| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg)。
**支持路径示例**:
1、fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
2、http网络播放路径:开发中
3、hls网络播放路径:开发中
**注意事项**:
使用媒体素材需要获取读权限,否则无法正常播放。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | | loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | | currentTime | number | 是 | 否 | 音频的当前播放位置。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | | duration | number | 是 | 否 | 音频时长。
**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer | @@ -640,17 +653,17 @@ audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 视频播放demo可参考:[视频播放开发指导](../../media/video-playback.md) -### 属性8+ +### 属性 -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ----------- | ---------------------------------- | ---- | ---- | ------------------------------------------------------------ | -| url | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
**注意事项**:
媒体素材需至少赋予读权限后,才可正常播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| loop | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| currentTime | number | 是 | 否 | 视频的当前播放位置。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| duration | number | 是 | 否 | 视频时长,返回-1表示直播模式。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| state | [VideoPlayState](#videoplaystate8) | 是 | 否 | 视频播放的状态。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| width | number | 是 | 否 | 视频宽。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | -| height | number | 是 | 否 | 视频高。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------------------ | ---------------------------------- | ---- | ---- | ------------------------------------------------------------ | +| url8+ | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd://xxx
![zh-cn_image_0000001164217678](figures/zh-cn_image_url.png)
**注意事项**:
使用媒体素材需要获取读权限,否则无法正常播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| loop8+ | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| currentTime8+ | number | 是 | 否 | 视频的当前播放位置。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| duration8+ | number | 是 | 否 | 视频时长,返回-1表示直播模式。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| state8+ | [VideoPlayState](#videoplaystate8) | 是 | 否 | 视频播放的状态。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| width8+ | number | 是 | 否 | 视频宽。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | +| height8+ | number | 是 | 否 | 视频高。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer | ### setDisplaySurface8+ @@ -1485,7 +1498,7 @@ videoPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 ### [key : string] : any -通过key-value方式获取媒体信息 +通过key-value方式获取媒体信息。 | 名称 | 类型 | 说明 | | ----- | ------ | ------------------------------------------------------------ | @@ -1763,11 +1776,11 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | 名称 | 默认值 | 说明 | | ------- | ------ | ------------------------------------------------------------ | -| DEFAULT | 0 | Default audio encoding format is AMR_NB。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_NB | 1 | AMR-NB(Adaptive Multi Rate-Narrow Band Speech Codec) 编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_WB | 2 | AMR-WB(Adaptive Multi Rate-Wide Band Speech Codec) 编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| DEFAULT | 0 | Default audio encoding format is AMR_NB。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_NB | 1 | AMR-NB(Adaptive Multi Rate-Narrow Band Speech Codec) 编码格式。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_WB | 2 | AMR-WB(Adaptive Multi Rate-Wide Band Speech Codec) 编码格式。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | | AAC_LC | 3 | AAC-LC(Advanced Audio Coding Low Complexity)编码格式。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | -| HE_AAC | 4 | HE_AAC(High-Efficiency Advanced Audio Coding)编码格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| HE_AAC | 4 | HE_AAC(High-Efficiency Advanced Audio Coding)编码格式。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | ## AudioOutputFormat @@ -1776,10 +1789,10 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' | 名称 | 默认值 | 说明 | | -------- | ------ | ------------------------------------------------------------ | -| DEFAULT | 0 | 默认封装格式为MPEG-4。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| DEFAULT | 0 | 默认封装格式为MPEG-4。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | | MPEG_4 | 2 | 封装为MPEG-4格式。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_NB | 3 | 封装为AMR_NB格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | -| AMR_WB | 4 | 封装为AMR_WB格式。本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_NB | 3 | 封装为AMR_NB格式。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | +| AMR_WB | 4 | 封装为AMR_WB格式。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | | AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder | ## VideoRecorder8+ @@ -1790,11 +1803,11 @@ audioRecorder.prepare(); // prepare不设置参数,触发'error' ### 属性 -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ----- | ------------------------------------- | ---- | ---- | ---------------- | -| state | [VideoRecordState](#videorecordstate) | 是 | 否 | 视频录制的状态。 | +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------------ | ------------------------------------- | ---- | ---- | ---------------- | +| state8+ | [VideoRecordState](#videorecordstate) | 是 | 否 | 视频录制的状态。 | -### prepare +### prepare8+ prepare(config: VideoRecorderConfig, callback: AsyncCallback\): void; @@ -1862,7 +1875,7 @@ media.createVideoRecorder((err, recorder) => { }); ``` -### prepare +### prepare8+ prepare(config: VideoRecorderConfig): Promise\; @@ -1933,7 +1946,7 @@ await videoRecorder.prepare(videoConfig).then(() => { }); ``` -### getInputSurface +### getInputSurface8+ getInputSurface(callback: AsyncCallback\): void; @@ -1966,7 +1979,7 @@ videoRecorder.getInputSurface((err, surfaceId) => { }); ``` -### getInputSurface +### getInputSurface8+ getInputSurface(): Promise\; @@ -1999,13 +2012,13 @@ await videoRecorder.getInputSurface().then((surfaceId) => { }); ``` -### start +### start8+ start(callback: AsyncCallback\): void; 异步方式开始视频录制。通过注册回调函数获取返回值。 -在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)后调用,需要依赖数据源先给surface传递数据。 +在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface8)后调用,需要依赖数据源先给surface传递数据。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder @@ -2028,13 +2041,13 @@ videoRecorder.start((err) => { }); ``` -### start +### start8+ start(): Promise\; 异步方式开始视频录制。通过Promise获取返回值。 -在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)后调用,需要依赖数据源先给surface传递数据。 +在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface8)后调用,需要依赖数据源先给surface传递数据。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder @@ -2057,7 +2070,7 @@ await videoRecorder.start().then(() => { }); ``` -### pause +### pause8+ pause(callback: AsyncCallback\): void; @@ -2086,7 +2099,7 @@ videoRecorder.pause((err) => { }); ``` -### pause +### pause8+ pause(): Promise\; @@ -2115,7 +2128,7 @@ await videoRecorder.pause().then(() => { }); ``` -### resume +### resume8+ resume(callback: AsyncCallback\): void; @@ -2142,7 +2155,7 @@ videoRecorder.resume((err) => { }); ``` -### resume +### resume8+ resume(): Promise\; @@ -2169,13 +2182,13 @@ await videoRecorder.resume().then(() => { }); ``` -### stop +### stop8+ stop(callback: AsyncCallback\): void; 异步方式停止视频录制。通过注册回调函数获取返回值。 -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface8)接口才能重新录制。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder @@ -2198,13 +2211,13 @@ videoRecorder.stop((err) => { }); ``` -### stop +### stop8+ stop(): Promise\; 异步方式停止视频录制。通过Promise获取返回值。 -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface8)接口才能重新录制。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder @@ -2227,7 +2240,7 @@ await videoRecorder.stop().then(() => { }); ``` -### release +### release8+ release(callback: AsyncCallback\): void; @@ -2254,7 +2267,7 @@ videoRecorder.release((err) => { }); ``` -### release +### release8+ release(): Promise\; @@ -2281,13 +2294,13 @@ await videoRecorder.release().then(() => { }); ``` -### reset +### reset8+ reset(callback: AsyncCallback\): void; 异步方式重置视频录制。通过注册回调函数获取返回值。 -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface8)接口才能重新录制。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder @@ -2310,13 +2323,13 @@ videoRecorder.reset((err) => { }); ``` -### reset +### reset8+ reset(): Promise\; 异步方式重置视频录制。通过Promise获取返回值。 -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface)接口才能重新录制。 +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface8)接口才能重新录制。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder @@ -2339,7 +2352,7 @@ await videoRecorder.reset().then(() => { }); ``` -### on('error') +### on('error')8+ on(type: 'error', callback: ErrorCallback): void @@ -2430,8 +2443,8 @@ videoRecorder.on('error', (error) => { // 设置'error'事件回调 | 名称 | 值 | 说明 | | ----------- | ----- | ------------------------------------------------------------ | -| CFT_MPEG_4 | "mp4" | 视频的容器格式,MP4。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | -| CFT_MPEG_4A | "m4a" | 音频的容器格式,M4A。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder | +| CFT_MPEG_4 | "mp4" | 视频的容器格式,MP4。
**系统能力:** SystemCapability.Multimedia.Media.Core | +| CFT_MPEG_4A | "m4a" | 音频的容器格式,M4A。
**系统能力:** SystemCapability.Multimedia.Media.Core | ## Location8+ diff --git a/zh-cn/figures/1.png b/zh-cn/figures/1.png index 6bde46d324c6d9da612d5070a99481ee11aab047..5910b98a0fb9b950b402b93be2cdf35e1b64d638 100644 GIT binary patch literal 250969 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

rw7Y_j~tr?=Fr1%X0(xWGBZh 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%0DXn#32ZHuc`GTi^id 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%0ALYF3$ExNkM#Kl$;v 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

/home/source_code/out/release/tests - - ``` - - 2. For devices that support serial port connection only, specify the NFS directory for the PC \(**host\_dir**\) and the corresponding directory for the development board \(**board\_dir**\) inside the **** tags. For example: - - ``` - - D:\nfs - user - - ``` - - -- Prepare the test environment. Check that the test environment meets the following conditions if the tested device supports only serial ports: - - The system image and file system have been burnt into a development board and are running properly on the development board. For example, in system mode, the device prompt **OHOS\#** is displayed during shell login, indicating that the system is running properly. - - The development host has been connected to the serial port of the development board and the network port. - - The IP addresses of the development host and development board are in the same network segment and can ping each other. - - An empty directory is created on the development host for mounting test cases through NFS, and the NFS service is started properly. - -- Run test suites. - - Start the test framework and go to the **test/developertest** directory. - 1. Run the following command to start the test framework in Windows. - - ``` - start.bat - ``` - - 2. Run the following command to start the test framework in Linux. - - ``` - ./strat.sh - ``` - - - - Select a device form. - - Configure device forms based on the actual development board, for example, **developertest/config/framework\_config.xml**. - - - Run the test command. - 1. To query the subsystems, modules, product forms, and test types supported by test cases, run the **show** commands. - - ``` - usage: - show productlist Querying supported product forms - show typelist Querying the supported test type - show subsystemlist Querying supported subsystems - show modulelist Querying supported modules - ``` - - 2. Run the following command to execute the test \(**-t** is mandatory, and **-ss** and **-tm** are optional\): - - ``` - run -t ut -ss test -tm example - ``` - - 3. Specify the parameters that can be used to execute the test suite specific to a specified feature or module. - - ``` - usage: run [-h] [-p PRODUCTFORM] [-t [TESTTYPE [TESTTYPE ...]]] - [-ss SUBSYSTEM] [-tm TESTMODULE] [-ts TESTSUIT] - [-tc TESTCASE] [-tl TESTLEVEL] - - optional arguments: - -h, --help show this help message and exit - -p PRODUCTFORM, --productform PRODUCTFORM Specified product form - -t [TESTTYPE [TESTTYPE ...]], --testtype [TESTTYPE [TESTTYPE ...]] - Specify test type(UT,MST,ST,PERF,ALL) - -ss SUBSYSTEM, --subsystem SUBSYSTEM Specify test subsystem - -tm TESTMODULE, --testmodule TESTMODULE Specified test module - -ts TESTSUIT, --testsuite TESTSUIT Specify test suite - -tc TESTCASE, --testcase TESTCASE Specify test case - -tl TESTLEVEL, --testlevel TESTLEVEL Specify test level - ``` - - - -- View test framework help if needed. - - Run the following command to query commands supported by the test platform: - - ``` - help - ``` - - -- Run the following command to exit the self-test platform: - - ``` - quit - ``` - - -## Test Result and Logs - -- Test logs and test reports are generated after you execute the test commands. -- Test result - - Reports are displayed on the console. The root directory of the test result is as follows: - - ``` - reports/xxxx-xx-xx-xx-xx-xx - ``` - - - Test case formatting result - - ``` - result/ - ``` - - - Test case logs - - ``` - log/plan_log_xxxx-xx-xx-xx-xx-xx.log - ``` - - - Report summary - - ``` - summary_report.html - ``` - - - Report details - - ``` - details_report.html - ``` - - -- Test framework logs - - ``` - reports/platform_log_xxxx-xx-xx-xx-xx-xx.log - ``` - -- Latest test reports - - ``` - reports/latest - ``` - - -## Repositories Involved - -**Testing subsystem** - -test\_developertest - -test\_xdevice - -test\_xdevice\_extension - diff --git a/en/readme/subsys-user-iam.md b/en/readme/user-iam.md similarity index 100% rename from en/readme/subsys-user-iam.md rename to en/readme/user-iam.md diff --git a/en/readme/x-test-suite.md b/en/readme/xts.md old mode 100755 new mode 100644 similarity index 100% rename from en/readme/x-test-suite.md rename to en/readme/xts.md diff --git a/en/website-directory.md b/en/website-directory.md new file mode 100644 index 00000000000..154190c39d7 --- /dev/null +++ b/en/website-directory.md @@ -0,0 +1,1869 @@ +# OpenHarmony + +——>——> Learn About the OpenHarmony Community + +——>——>——> [OpenHarmony](OpenHarmony-Overview.md) + +——>——>——> Learn About the OpenHarmony OS + +——>——>——>——>[Kernel](readme/kernel.md) + +——>——>——>——>[Driver](readme/driver.md) + +——>——>——>——>[ARK Runtime](readme/ark-runtime.md) + +——>——>——>——>[DFX](readme/dfx-subsystem.md) + +——>——>——>——>[JS UI Framework](readme/js-ui-framework.md) + +——>——>——>——>[Misc Services](readme/misc-services.md) + +——>——>——>——>[XTS](readme/xts.md) + +——>——>——>——>[Common Event and Notification](readme/common-event-notification.md) + +——>——>——>——>[Globalization](readme/globalization.md) + +——>——>——>——>[utils](readme/utils.md) + +——>——>——>——>[Distributed Scheduler](readme/distributed-scheduler.md) + +——>——>——>——>[Distributed Data Management](readme/distributed-data-management.md) + +——>——>——>——>[Distributed File](readme/distributed-file.md) + +——>——>——>——>[DSoftBus](readme/dsoftbus.md) + +——>——>——>——>[Update](readme/update.md) + +——>——>——>——>[Startup](readme/startup.md) + +——>——>——>——>[Graphics](readme/graphics.md) + +——>——>——>——>[Multimodal Input](readme/multimodal-input.md) + +——>——>——>——>[Multimedia](readme/multimedia.md) + +——>——>——>——>[Account](readme/account.md) + +——>——>——>——>[Pan-Sensor](readme/pan-sensor.md) + +——>——>——>——>[Test](readme/test.md) + +——>——>——>——>[Power Management](readme/power-management.md) + +——>——>——>——>[Telephony](readme/telephony.md) + +——>——>——>——>[System Apps](readme/system-apps.md) + +——>——>——>——>[Programming Language Runtime](readme/programming-language-runtime.md) + +——>——>——>——>[AI](readme/ai.md) + +——>——>——> [Glossary](device-dev/glossary/glossary.md) + +——>——>——> [OpenHarmony Release Notes](release-notes/Readme.md) + +——>——> Quick Start + +——>——>——>[Mini and Small Systems](device-dev/quick-start/quickstart-lite.md) + +——>——>——>——>[Overview of Mini and Small Systems](device-dev/quick-start/quickstart-lite-overview.md) + +——>——>——>——>[Environment Setup for Mini and Small Systems](device-dev/quick-start/quickstart-lite-env-setup.md) + +——>——>——>——>——>[Environment Setup Overview](device-dev/quick-start/quickstart-lite-env-setup-overview.md) + +——>——>——>——>——>[Environment Setup FAQs](device-dev/quick-start/quickstart-lite-env-setup-faqs.md) + +——>——>——>——>[Running Hello World](device-dev/quick-start/quickstart-lite-steps.md) + +——>——>——>——>——>[Hi3861 Development Board](device-dev/quick-start/quickstart-lite-steps-hi3861.md) + +——>——>——>——>——>——>[Setting Up the Environment](device-dev/quick-start/quickstart-lite-steps-hi3861-setting.md) + +——>——>——>——>——>——>[Running a Hello World Program](device-dev/quick-start/quickstart-lite-steps-hi3816-running.md) + +——>——>——>——>——>——>[FAQs](device-dev/quick-start/quickstart-lite-steps-hi3861-faqs.md) + +——>——>——>——>——>[Hi3516 Development Board](device-dev/quick-start/quickstart-lite-steps-hi3516.md) + +——>——>——>——>——>——>[Setting Up the Environment](device-dev/quick-start/quickstart-lite-steps-hi3516-setting.md) + +——>——>——>——>——>——>[Running a Hello OHOS Program](device-dev/quick-start/quickstart-lite-steps-hi3516-running.md) + +——>——>——>——>——>——>[FAQs](device-dev/quick-start/quickstart-lite-steps-hi3516-faqs.md) + +——>——>——>——>——>[Hi3518 Development Board](device-dev/quick-start/quickstart-lite-steps-hi3518.md) + +——>——>——>——>——>——>[Setting Up the Environment](device-dev/quick-start/quickstart-lite-steps-hi3518-setting.md) + +——>——>——>——>——>——>[Running a Hello OHOS Program](device-dev/quick-start/quickstart-lite-steps-hi3518-running.md) + +——>——>——>——>——>——>[FAQs](device-dev/quick-start/quickstart-lite-steps-hi3518-faqs.md) + +——>——>——>——>[Introduction](device-dev/quick-start/quickstart-lite-introduction.md) + +——>——>——>——>——>[Hi3861 Development Board](device-dev/quick-start/quickstart-lite-introduction-hi3861.md) + +——>——>——>——>——>[Hi3516 Development Board](device-dev/quick-start/quickstart-lite-introduction-hi3516.md) + +——>——>——>——>——>[Hi3518 Development Board](device-dev/quick-start/quickstart-lite-introduction-hi3518.md) + +——>——>——>[Standard System](device-dev/quick-start/quickstart-standard.md) + +——>——>——>——>[Standard System Introduction](device-dev/quick-start/quickstart-standard-overview.md) + +——>——>——>——>[Running an Image](device-dev/quick-start/quickstart-standard-running.md) + +——>——>——>——>[FAQs](device-dev/quick-start/quickstart-standard-faqs.md) + +——>——> Compatibility and Security + +——>——>——> [Privacy and Security](device-dev/security/security.md) + +——>——>——>——> [Privacy Protection](device-dev/security/security-privacy-protection.md) + +——>——>——>——> [Security Guidelines](device-dev/security/security-guidelines-overall.md) + +——>——> Porting + +——>——>——>[Mini System SoC Porting Guide](device-dev/porting/porting-minichip.md) + +——>——>——>——>[Porting Preparations](device-dev/porting/porting-chip-prepare.md) + +——>——>——>——>——>[Before You Start](device-dev/porting/oem_transplant_chip_prepare_knows.md) + +——>——>——>——>——>[Building Adaptation Process](device-dev/porting/porting-chip-prepare-process.md) + +——>——>——>——>[Kernel Porting](device-dev/porting/porting-chip-kernel.md) + +——>——>——>——>——>[Overview](device-dev/porting/porting-chip-kernel-overview.md) + +——>——>——>——>——>[Basic Kernel Adaptation](device-dev/porting/porting-chip-kernel-adjustment.md) + +——>——>——>——>——>[Kernel Porting Verification](device-dev/porting/porting-chip-kernel-verify.md) + +——>——>——>——>[Board-Level OS Porting](device-dev/porting/porting-chip-board.md) + +——>——>——>——>——>[Overview](device-dev/porting/porting-chip-board-overview.md) + +——>——>——>——>——>[Board-Level Driver Adaptation](device-dev/porting/porting-chip-board-driver.md) + +——>——>——>——>——>[Implementation of APIs at the HAL](device-dev/porting/porting-chip-board-hal.md) + +——>——>——>——>——>[System Modules](device-dev/porting/porting-chip-board-component.md) + +——>——>——>——>——>[lwIP Module Adaptation](device-dev/porting/porting-chip-board-lwip.md) + +——>——>——>——>——>[Third-party Module Adaptation](device-dev/porting/porting-chip-board-bundle.md) + +——>——>——>——>——>[XTS](device-dev/porting/porting-chip-board-xts.md) + +——>——>——>——>[FAQs](device-dev/porting/porting-chip-faqs.md) + +——>——>——>[Small System SoC Porting Guide](device-dev/porting/porting-smallchip.md) + +——>——>——>——>[Porting Preparations](device-dev/porting/porting-smallchip-prepare.md) + +——>——>——>——>——>[Before You Start](device-dev/porting/porting-smallchip-prepare-needs.md) + +——>——>——>——>——>[Compilation and Building](device-dev/porting/porting-smallchip-prepare-building.md) + +——>——>——>——>[Kernel Porting](device-dev/porting/porting-smallchip-kernel.md) + +——>——>——>——>——>[LiteOS Cortex-A](device-dev/porting/porting-smallchip-kernel-a.md) + +——>——>——>——>——>[Linux Kernel](device-dev/porting/porting-smallchip-kernel-linux.md) + +——>——>——>——>[Driver Porting](device-dev/porting/porting-smallchip-driver.md) + +——>——>——>——>——>[Overview](device-dev/porting/porting-smallchip-driver-overview.md) + +——>——>——>——>——>[Platform Driver Porting](device-dev/porting/porting-smallchip-driver-plat.md) + +——>——>——>——>——>[Device Driver Porting](device-dev/porting/porting-smallchip-driver-oom.md) + +——>——>——>[Standard System Porting Guide](device-dev/porting/standard-system-porting-guide.md) + +——>——>——>——>[Standard System Porting Guide](device-dev/porting/standard-system-porting-guide.md) + +——>——>——>——>[A Method for Rapidly Porting the OpenHarmony Linux Kernel](device-dev/porting/porting-linux-kernel.md) + +——>——>——>[Third-Party Library Porting Guide for Mini and Small Systems](device-dev/porting/porting-thirdparty.md) + +——>——>——>——>[Overview](device-dev/porting/porting-thirdparty-overview.md) + +——>——>——>——>[Porting a Library Built Using CMake](device-dev/porting/porting-thirdparty-cmake.md) + +——>——>——>——>[Porting a Library Built Using Makefile](device-dev/porting/porting-thirdparty-makefile.md) + +——>——> Subsystem Development + +——>——>——> [Kernel](device-dev/kernel/kernel.md) + +——>——>——>——> [Kernel for the Mini System](device-dev/kernel/kernel-mini.md) + +——>——>——>——>——> [Kernel Overview](device-dev/kernel/kernel-mini-overview.md) + +——>——>——>——>——> [Basic Kernel](device-dev/kernel/kernel-mini-basic.md) + +——>——>——>——>——>——> [Interrupt Management](device-dev/kernel/kernel-mini-basic-interrupt.md) + +——>——>——>——>——>——> [Task Management](device-dev/kernel/kernel-mini-basic-task.md) + +——>——>——>——>——>——> [Memory Management](device-dev/kernel/kernel-mini-basic-memory.md) + +——>——>——>——>——>——>——> [Basic Concepts](device-dev/kernel/kernel-mini-basic-memory-basic.md) + +——>——>——>——>——>——>——> [Static Memory](device-dev/kernel/kernel-mini-basic-memory-static.md) + +——>——>——>——>——>——>——> [Dynamic Memory](device-dev/kernel/kernel-mini-basic-memory-dynamic.md) + +——>——>——>——>——>——> [Kernel Communication Mechanisms](device-dev/kernel/kernel-mini-basic-ipc.md) + +——>——>——>——>——>——>——> [Event](device-dev/kernel/kernel-mini-basic-ipc-event.md) + +——>——>——>——>——>——>——> [Mutex](device-dev/kernel/kernel-mini-basic-ipc-mutex.md) + +——>——>——>——>——>——>——> [Queue](device-dev/kernel/kernel-mini-basic-ipc-queue.md) + +——>——>——>——>——>——>——> [Semaphore](device-dev/kernel/kernel-mini-basic-ipc-sem.md) + +——>——>——>——>——>——> [Time Management](device-dev/kernel/kernel-basic-mini-time.md) + +——>——>——>——>——>——> [Software Timer](device-dev/kernel/kernel-mini-basic-soft.md) + +——>——>——>——>——> [Extended Components](device-dev/kernel/kernel-mini-extend.md) + +——>——>——>——>——>——> [C++ Support](device-dev/kernel/kernel-mini-extend-support.md) + +——>——>——>——>——>——> [CPUP](device-dev/kernel/kernel-mini-extend-cpup.md) + +——>——>——>——>——>——> [Dynamic Loading](kernel-mini-extend-dynamic-loading.md) + +——>——>——>——>——>——> [File System](device-dev/kernel/kernel-mini-extend-file.md) + +——>——>——>——>——>——>——> [FAT](device-dev/kernel/kernel-mini-extend-file-fat.md) + +——>——>——>——>——>——>——> [LittleFS](device-dev/kernel/kernel-mini-extend-file-lit.md) + +——>——>——>——>——> [Kernel Debugging](device-dev/kernel/kernel-memory-inner.md) + +——>——>——>——>——>——> [Memory Debugging](device-dev/kernel/kernel-mini-memory-debug.md) + +——>——>——>——>——>——>——> [Memory Information Statistics](device-dev/kernel/kernel-mini-memory-debug-mes.md) + +——>——>——>——>——>——>——> [Memory Leak Check](device-dev/kernel/kernel-mini-imemory-debug-det.md) + +——>——>——>——>——>——>——> [Memory Corruption Check](device-dev/kernel/kernel-mini-memory-debug-cet.md) + +——>——>——>——>——>——> [Exception Debugging](device-dev/kernel/kernel-mini-memory-exception.md) + +——>——>——>——>——>——> [Trace](device-dev/kernel/kernel-mini-memory-trace.md) + +——>——>——>——>——>——> [LMS](device-dev/kernel/kernel-mini-debug-lms.md) + +——>——>——>——>——> [Appendix](device-dev/kernel/kernel-mini-app.md) + +——>——>——>——>——>——> [Kernel Coding Specification](device-dev/kernel/kernel-mini-appx-code.md) + +——>——>——>——>——>——> [Basic Data Structure](device-dev/kernel/kernel-mini-appx-data.md) + +——>——>——>——>——>——>——> [Doubly Linked List](device-dev/kernel/kernel-mini-appx-data-list.md) + +——>——>——>——>——>——> [Standard Libraries](device-dev/kernel/kernel-mini-appx-lib.md) + +——>——>——>——>——>——>——> [CMSIS Support](device-dev/kernel/kernel-mini-appx-lib-cmsis.md) + +——>——>——>——>——>——>——> [POSIX Support](device-dev/kernel/kernel-mini-appx-lib-posix.md) + +——>——>——>——> [Kernel for the Small System](device-dev/kernel/kernel-small.md) + +——>——>——>——>——> [Kernel Overview](device-dev/kernel/kernel-small-overview.md) + +——>——>——>——>——> [Kernel Startup](device-dev/kernel/kernel-small-start.md) + +——>——>——>——>——>——> [Startup in Kernel Mode](device-dev/kernel/kernel-small-start-kernel.md) + +——>——>——>——>——>——> [Startup in User Mode](device-dev/kernel/kernel-small-start-user.md) + +——>——>——>——>——> [Basic Kernel](device-dev/kernel/kernel-small-basics.md) + +——>——>——>——>——>——> [Interrupt and Exception Handling](device-dev/kernel/kernel-small-basic-interrupt.md) + +——>——>——>——>——>——> [Process Management](device-dev/kernel/kernel-small-basic-process.md) + +——>——>——>——>——>——>——> [Process](device-dev/kernel/kernel-small-basic-process-process.md) + +——>——>——>——>——>——>——> [Task](device-dev/kernel/kernel-small-basic-process-thread.md) + +——>——>——>——>——>——>——> [Scheduler](device-dev/kernel/kernel-small-basic-process-scheduler.md) + +——>——>——>——>——>——> [Memory Management](device-dev/kernel/kernel-small-basic-memory.md) + +——>——>——>——>——>——>——> [Heap Memory Management](device-dev/kernel/kernel-small-basic-memory-heap.md) + +——>——>——>——>——>——>——> [Physical Memory Management](device-dev/kernel/kernel-small-basic-memory-physical.md) + +——>——>——>——>——>——>——> [Virtual Memory Management](device-dev/kernel/kernel-small-basic-memory-virtual.md) + +——>——>——>——>——>——>——> [Virtual-to-Physical Mapping](device-dev/kernel/kernel-small-basic-inner-reflect.md) + +——>——>——>——>——>——> [Kernel Communication Mechanisms](device-dev/kernel/kernel-small-basic-trans.md) + +——>——>——>——>——>——>——> [Event](device-dev/kernel/kernel-small-basic-trans-event.md) + +——>——>——>——>——>——>——> [Semaphore](device-dev/kernel/kernel-small-basic-trans-semaphore.md) + +——>——>——>——>——>——>——> [Mutex](device-dev/kernel/kernel-small-basic-trans-mutex.md) + +——>——>——>——>——>——>——> [Queue](device-dev/kernel/kernel-small-basic-trans-queue.md) + +——>——>——>——>——>——>——> [RW Lock](device-dev/kernel/kernel-small-basic-trans-rwlock.md) + +——>——>——>——>——>——>——> [Futex](device-dev/kernel/kernel-small-basic-trans-user-mutex.md) + +——>——>——>——>——>——>——> [Signal](device-dev/kernel/kernel-small-basic-trans-user-signal.md) + +——>——>——>——>——>——> [Time Management](device-dev/kernel/kernel-small-basic-time.md) + +——>——>——>——>——>——> [Software Timer](device-dev/kernel/kernel-small-basic-softtimer.md) + +——>——>——>——>——>——> [Atomic Operation](device-dev/kernel/kernel-small-basic-atomic.md) + +——>——>——>——>——> [Extended Components](device-dev/kernel/kernel-small-bundles.md) + +——>——>——>——>——>——> [System Call](device-dev/kernel/kernel-small-bundles-system.md) + +——>——>——>——>——>——> [Dynamic Loading and Linking](device-dev/kernel/kernel-small-bundles-linking.md) + +——>——>——>——>——>——> [Virtual Dynamic Shared Object](device-dev/kernel/kernel-small-bundles-share.md) + +——>——>——>——>——>——> [LiteIPC](device-dev/kernel/kernel-small-bundles-ipc.md) + +——>——>——>——>——>——> [File Systems](device-dev/kernel/kernel-small-bundles-fs.md) + +——>——>——>——>——>——>——> [Virtual File System](device-dev/kernel/kernel-small-bundles-fs-virtual.md) + +——>——>——>——>——>——>——> [Supported File Systems](device-dev/kernel/kernel-small-bundles-fs-support.md) + +——>——>——>——>——>——>——>——> [FAT](device-dev/kernel/kernel-small-bundles-fs-support-fat.md) + +——>——>——>——>——>——>——>——> [JFFS2](device-dev/kernel/kernel-small-bundles-fs-support-jffs2.md) + +——>——>——>——>——>——>——>——> [NFS](device-dev/kernel/kernel-small-bundles-fs-support-nfs.md) + +——>——>——>——>——>——>——>——> [Ramfs](device-dev/kernel/kernel-small-bundles-fs-support-ramfs.md) + +——>——>——>——>——>——>——>——> [procfs](device-dev/kernel/kernel-small-bundles-fs-support-procfs.md) + +——>——>——>——>——>——>——> [File System Adaptation](device-dev/kernel/kernel-small-bundles-fs-new.md) + +——>——>——>——>——> [Debugging and Tools](device-dev/kernel/kernel-small-debug.md) + +——>——>——>——>——>——> [Shell](device-dev/kernel/kernel-small-debug-shell.md) + +——>——>——>——>——>——>——> [Introduction to the Shell](device-dev/kernel/kernel-small-debug-shell-overview.md) + +——>——>——>——>——>——>——> [Shell Command Development Guidelines](device-dev/kernel/kernel-small-debug-shell-guide.md) + +——>——>——>——>——>——>——> [Shell Command Programming Example](device-dev/kernel/kernel-small-debug-shell-build.md) + +——>——>——>——>——>——>——> [Shell Command Reference](device-dev/kernel/kernel-small-debug-shell-details.md) + +——>——>——>——>——>——>——>——> [System Commands](device-dev/kernel/kernel-small-debug-shell-cmd.md) + +——>——>——>——>——>——>——>——>——> [cpup](device-dev/kernel/kernel-small-debug-shell-cmd-cpup.md) + +——>——>——>——>——>——>——>——>——> [date](device-dev/kernel/kernel-small-debug-shell-cmd-date.md) + +——>——>——>——>——>——>——>——>——> [dmesg](device-dev/kernel/kernel-small-debug-shell-cmd-dmesg.md) + +——>——>——>——>——>——>——>——>——> [exec](device-dev/kernel/kernel-small-debug-shell-cmd-exec.md) + +——>——>——>——>——>——>——>——>——> [free](device-dev/kernel/kernel-small-debug-shell-cmd-free.md) + +——>——>——>——>——>——>——>——>——> [help](device-dev/kernel/kernel-small-debug-shell-cmd-help.md) + +——>——>——>——>——>——>——>——>——> [hwi](device-dev/kernel/kernel-small-debug-shell-cmd-hwi.md) + +——>——>——>——>——>——>——>——>——> [kill](device-dev/kernel/kernel-small-debug-shell-cmd-kill.md) + +——>——>——>——>——>——>——>——>——> [log](device-dev/kernel/kernel-small-debug-shell-cmd-log.md) + +——>——>——>——>——>——>——>——>——> [memcheck](device-dev/kernel/kernel-small-debug-shell-cmd-memcheck.md) + +——>——>——>——>——>——>——>——>——> [oom](device-dev/kernel/kernel-small-debug-shell-cmd-oom.md) + +——>——>——>——>——>——>——>——>——> [pmm](device-dev/kernel/kernel-small-debug-shell-cmd-pmm.md) + +——>——>——>——>——>——>——>——>——> [reset](device-dev/kernel/kernel-small-debug-shell-cmd-reset.md) + +——>——>——>——>——>——>——>——>——> [sem](device-dev/kernel/kernel-small-debug-shell-cmd-sem.md) + +——>——>——>——>——>——>——>——>——> [stack](device-dev/kernel/kernel-small-debug-shell-cmd-stack.md) + +——>——>——>——>——>——>——>——>——> [su](device-dev/kernel/kernel-small-debug-shell-cmd-su.md) + +——>——>——>——>——>——>——>——>——> [swtmr](device-dev/kernel/kernel-small-debug-shell-cmd-swtmr.md) + +——>——>——>——>——>——>——>——>——> [systeminfo](device-dev/kernel/kernel-small-debug-shell-cmd-sysinfo.md) + +——>——>——>——>——>——>——>——>——> [task](device-dev/kernel/kernel-small-debug-shell-cmd-task.md) + +——>——>——>——>——>——>——>——>——> [uname](device-dev/kernel/kernel-small-debug-shell-cmd-uname.md) + +——>——>——>——>——>——>——>——>——> [vmm](device-dev/kernel/kernel-small-debug-shell-cmd-vmm.md) + +——>——>——>——>——>——>——>——>——> [watch](device-dev/kernel/kernel-small-debug-shell-cmd-watch.md) + +——>——>——>——>——>——>——>——>——>[reboot](device-dev/kernel/kernel-small-debug-shell-cmd-reboot.md) + +——>——>——>——>——>——>——>——>——>[top](device-dev/kernel/kernel-small-debug-shell-cmd-top.md) + +——>——>——>——>——>——>——>——> [File Commands](device-dev/kernel/kernel-small-debug-shell-file.md) + +——>——>——>——>——>——>——>——>——> [cat](device-dev/kernel/kernel-small-debug-shell-file-cat.md) + +——>——>——>——>——>——>——>——>——> [cd](device-dev/kernel/kernel-small-debug-shell-file-cd.md) + +——>——>——>——>——>——>——>——>——> [chgrp](device-dev/kernel/kernel-small-debug-shell-file-chgrp.md) + +——>——>——>——>——>——>——>——>——> [chmod](device-dev/kernel/kernel-small-debug-shell-file-chmod.md) + +——>——>——>——>——>——>——>——>——> [chown](device-dev/kernel/kernel-small-debug-shell-file-chown.md) + +——>——>——>——>——>——>——>——>——> [cp](device-dev/kernel/kernel-small-debug-shell-file-cp.md) + +——>——>——>——>——>——>——>——>——> [format](device-dev/kernel/kernel-small-debug-shell-file-format.md) + +——>——>——>——>——>——>——>——>——> [ls](device-dev/kernel/kernel-small-debug-shell-file-ls.md) + +——>——>——>——>——>——>——>——>——> [lsfd](device-dev/kernel/kernel-small-debug-shell-file-lsfd.md) + +——>——>——>——>——>——>——>——>——> [mkdir](device-dev/kernel/kernel-small-debug-shell-file-mkdir.md) + +——>——>——>——>——>——>——>——>——> [mount](device-dev/kernel/kernel-small-debug-shell-file-mount.md) + +——>——>——>——>——>——>——>——>——> [partinfo](device-dev/kernel/kernel-small-debug-shell-file-partinfo.md) + +——>——>——>——>——>——>——>——>——> [partition](device-dev/kernel/kernel-small-debug-shell-file-partition.md) + +——>——>——>——>——>——>——>——>——> [pwd](device-dev/kernel/kernel-small-debug-shell-file-pwd.md) + +——>——>——>——>——>——>——>——>——> [rm](device-dev/kernel/kernel-small-debug-shell-file-rm.md) + +——>——>——>——>——>——>——>——>——> [rmdir](device-dev/kernel/kernel-small-debug-shell-file-rmdir.md) + +——>——>——>——>——>——>——>——>——> [statfs](device-dev/kernel/kernel-small-debug-shell-file-statfs.md) + +——>——>——>——>——>——>——>——>——> [sync](device-dev/kernel/kernel-small-debug-shell-file-sync.md) + +——>——>——>——>——>——>——>——>——> [touch](device-dev/kernel/kernel-small-debug-shell-file-touch.md) + +——>——>——>——>——>——>——>——>——> [writeproc](device-dev/kernel/kernel-small-debug-shell-file-write.md) + +——>——>——>——>——>——>——>——>——> [umount](device-dev/kernel/kernel-small-debug-shell-file-umount.md) + +——>——>——>——>——>——>——>——>——>[du](device-dev/kernel/kernel-small-debug-shell-file-du.md) + +——>——>——>——>——>——>——>——>——>[mv](device-dev/kernel/kernel-small-debug-shell-file-mv.md) + +——>——>——>——>——>——>——>——> [Network Commands](device-dev/kernel/kernel-small-debug-shell-net.md) + +——>——>——>——>——>——>——>——>——> [arp](device-dev/kernel/kernel-small-debug-shell-net-arp.md) + +——>——>——>——>——>——>——>——>——> [dhclient](device-dev/kernel/kernel-small-debug-shell-net-dhclient.md) + +——>——>——>——>——>——>——>——>——> [ifconfig](device-dev/kernel/kernel-small-debug-shell-net-ifconfig.md) + +——>——>——>——>——>——>——>——>——> [ipdebug](device-dev/kernel/kernel-small-debug-shell-net-ipdebug.md) + +——>——>——>——>——>——>——>——>——> [netstat](device-dev/kernel/kernel-small-debug-shell-net-netstat.md) + +——>——>——>——>——>——>——>——>——> [ntpdate](device-dev/kernel/kernel-small-debug-shell-net-ntpdate.md) + +——>——>——>——>——>——>——>——>——> [ping](device-dev/kernel/kernel-small-debug-shell-net-ping.md) + +——>——>——>——>——>——>——>——>——> [ping6](device-dev/kernel/kernel-small-debug-shell-net-ping6.md) + +——>——>——>——>——>——>——>——>——> [telnet](device-dev/kernel/kernel-small-debug-shell-net-telnet.md) + +——>——>——>——>——>——>——>——>——> [tftp](device-dev/kernel/kernel-small-debug-shell-net-tftp.md) + +——>——>——>——>——>——>——> [Magic Key](device-dev/kernel/kernel-small-debug-shell-magickey.md) + +——>——>——>——>——>——>——> [User-Mode Exception Information](device-dev/kernel/kernel-small-debug-shell-error.md) + +——>——>——>——>——>——> [Trace](device-dev/kernel/kernel-small-debug-trace.md) + +——>——>——>——>——>——> [Process Commissioning](device-dev/kernel/kernel-small-debug-process.md) + +——>——>——>——>——>——>——> [CPUP](device-dev/kernel/kernel-small-debug-process-cpu.md) + +——>——>——>——>——>——> [Kernel-Mode Memory Debugging](device-dev/kernel/kernel-small-debug-memory.md) + +——>——>——>——>——>——>——> [Memory Information Statistics](device-dev/kernel/kernel-small-debug-memory-info.md) + +——>——>——>——>——>——>——> [Memory Leak Check](device-dev/kernel/kernel-small-debug-memory-leak.md) + +——>——>——>——>——>——>——> [Memory Corruption Check](device-dev/kernel/kernel-small-debug-memory-corrupt.md) + +——>——>——>——>——>——>[User-Mode Memory Debugging](device-dev/kernel/kernel-small-debug-user.md) + +——>——>——>——>——>——>——>[Basic Concepts](device-dev/kernel/kernel-small-debug-user-concept.md) + +——>——>——>——>——>——>——>[Working Principles](device-dev/kernel/kernel-small-debug-user-function.md) + +——>——>——>——>——>——>——>[Usage](device-dev/kernel/kernel-small-debug-user-guide.md) + +——>——>——>——>——>——>——>——>[API Description](device-dev/kernel/kernel-small-debug-user-guide-api.md) + +——>——>——>——>——>——>——>——>[How to Use](device-dev/kernel/kernel-small-debug-user-guide-use.md) + +——>——>——>——>——>——>——>——>——>[Calling APIs](device-dev/kernel/kernel-small-debug-user-guide-use-api.md) + +——>——>——>——>——>——>——>——>——>[Using the CLI](device-dev/kernel/kernel-small-debug-user-guide-use-cli.md) + +——>——>——>——>——>——>——>[Typical Memory Problems](device-dev/kernel/kernel-small-debug-user-faqs.md) + +——>——>——>——>——>——> [Other Kernel Debugging Methods](device-dev/kernel/kernel-small-debug-other.md) + +——>——>——>——>——>——>——> [Dying Gasp](device-dev/kernel/kernel-small-debug-trace-other-lastwords.md) + +——>——>——>——>——>——>——> [Common Fault Locating Methods](device-dev/kernel/kernel-small-debug-trace-other-faqs.md) + +——>——>——>——>——> [Appendix](device-dev/kernel/kernel-small-apx.md) + +——>——>——>——>——>——> [Basic Data Structure](device-dev/kernel/kernel-small-apx-structure.md) + +——>——>——>——>——>——>——> [Doubly Linked List](device-dev/kernel/kernel-small-apx-dll.md) + +——>——>——>——>——>——>——> [Bitwise Operation](device-dev/kernel/kernel-small-apx-bitwise.md) + +——>——>——>——>——>——> [Standard Library](device-dev/kernel/kernel-small-apx-library.md) + +——>——>——>——> [Kernel for Standard System](device-dev/kernel/kernel-standard.md) + +——>——>——>——>——> [Linux Kernel Overview](device-dev/kernel/kernel-standard-overview.md) + +——>——>——>——>——> [Guidelines for Using Patches on OpenHarmony Development Boards](device-dev/kernel/kernel-standard-patch.md) + +——>——>——>——>——> [Guidelines for Compiling and Building the Linux Kernel](device-dev/kernel/kernel-standard-build.md) + +——>——>——> [Driver](device-dev/driver/driver.md) + +——>——>——>——>[HDF](device-dev/driver/driver-hdf.md) + +——>——>——>——>——>[HDF Overview](device-dev/driver/driver-hdf-overview.md) + +——>——>——>——>——>[Driver Development](device-dev/driver/driver-hdf-development.md) + +——>——>——>——>——>[Driver Service Management](device-dev/driver/driver-hdf-servicemanage.md) + +——>——>——>——>——>[Driver Message Mechanism Management](device-dev/driver/driver-hdf-message-management.md) + +——>——>——>——>——>[Driver Configuration Management](device-dev/driver/driver-hdf-manage.md) + +——>——>——>——>——>[HDF Development Example](device-dev/driver/driver-hdf-sample.md) + +——>——>——>——>[Platform Driver Development](device-dev/driver/driver-develop.md) + +——>——>——>——>——>[ADC](device-dev/driver/driver-platform-adc-develop.md) + +——>——>——>——>——>[GPIO](device-dev/driver/driver-platform-gpio-develop.md) + +——>——>——>——>——>[HDMI](device-dev/driver/driver-platform-hdmi-develop.md) + +——>——>——>——>——>[I2C](device-dev/driver/driver-platform-i2c-develop.md) + +——>——>——>——>——>[I3C](device-dev/driver/driver-platform-i3c-develop.md) + +——>——>——>——>——>[MIPI CSI](device-dev/driver/driver-platform-mipicsi-develop.md) + +——>——>——>——>——>[MIPI DSI](device-dev/driver/driver-platform-mipidsi-develop.md) + +——>——>——>——>——>[MMC](device-dev/driver/driver-platform-mmc-develop.md) + +——>——>——>——>——>[PWM](device-dev/driver/driver-platform-pwm-develop.md) + +——>——>——>——>——>[RTC](device-dev/driver/driver-platform-rtc-develop.md) + +——>——>——>——>——>[SDIO](device-dev/driver/driver-platform-sdio-develop.md) + +——>——>——>——>——>[SPI](device-dev/driver/driver-platform-spi-develop.md) + +——>——>——>——>——>[UART](device-dev/driver/driver-platform-uart-develop.md) + +——>——>——>——>——>[Watchdog](device-dev/driver/driver-platform-watchdog-develop.md) + +——>——>——>——>[Driver Platform Usage](device-dev/driver/driver-platform.md) + +——>——>——>——>——>[ADC](device-dev/driver/driver-platform-adc-des.md) + +——>——>——>——>——>[GPIO](device-dev/driver/driver-platform-gpio-des.md) + +——>——>——>——>——>[HDMI](device-dev/driver/driver-platform-hdmi-des.md) + +——>——>——>——>——>[I2C](device-dev/driver/driver-platform-i2c-des.md) + +——>——>——>——>——>[I3C](device-dev/driver/driver-platform-i3c-des.md) + +——>——>——>——>——>[MIPI CSI](device-dev/driver/driver-platform-mipicsi-des.md) + +——>——>——>——>——>[MIPI DSI](device-dev/driver/driver-platform-mipidsi-des.md) + +——>——>——>——>——>[PWM](device-dev/driver/driver-platform-pwm-des.md) + +——>——>——>——>——>[RTC](device-dev/driver/driver-platform-rtc-des.md) + +——>——>——>——>——>[SDIO](device-dev/driver/driver-platform-sdio-des.md) + +——>——>——>——>——>[SPI](device-dev/driver/driver-platform-spi-des.md) + +——>——>——>——>——>[UART](device-dev/driver/driver-platform-uart-des.md) + +——>——>——>——>——>[Watchdog](device-dev/driver/driver-platform-watchdog-des.md) + +——>——>——>——>[Peripheral Driver Usage](device-dev/driver/driver-peripherals.md) + +——>——>——>——>——>[LCD](device-dev/driver/driver-peripherals-lcd-des.md) + +——>——>——>——>——>[Touchscreen](device-dev/driver/driver-peripherals-touch-des.md) + +——>——>——>——>——>[Sensor](device-dev/driver/driver-peripherals-sensor-des.md) + +——>——>——>——>——>[WLAN](device-dev/driver/driver-peripherals-external-des.md) + +——>——>——>——>——>[Audio](device-dev/driver/driver-peripherals-audio-des.md) + +——>——>——>——>——>[USB](device-dev/driver/driver-peripherals-usb-des.md) + +——>——>——>——>——>[Camera](device-dev/driver/driver-peripherals-camera-des.md) + +——>——>——> [Compilation and Building](device-dev/subsystems/subsys-build.md) + +——>——>——>——> [Building Guidelines for Mini and Small Systems](device-dev/subsystems/subsys-build-mini-lite.md) + +——>——>——>——> [Building Guidelines for Standard Systems](device-dev/subsystems/subsys-build-standard-large.md) + +——>——>——>——>[Build System Coding Specifications and Best Practices](device-dev/subsystems/subsys-build-gn-coding-style-and-best-practice.md) + +——>——>——> [Distributed Remote Startup](device-dev/subsystems/subsys-remote-start.md) + +——>——>——> [Graphics](device-dev/subsystems/subsys-graphics.md) + +——>——>——>——> [Graphics](device-dev/subsystems/subsys-graphics-overview.md) + +——>——>——>——> [Development Guidelines on Container Components](device-dev/subsystems/subsys-graphics-container-guide.md) + +——>——>——>——> [Development Guidelines on Layout Container Components](device-dev/subsystems/subsys-graphics-layout-guide.md) + +——>——>——>——> [Development Guidelines on Common Components](device-dev/subsystems/subsys-graphics-common-guide.md) + +——>——>——>——> [Development Guidelines on Animators](device-dev/subsystems/subsys-graphics-animation-guide.md) + +——>——>——> [Multimedia](device-dev/subsystems/subsys-multimedia.md) + +——>——>——>——> [Camera](device-dev/subsystems/subsys-multimedia-camera.md) + +——>——>——>——>——> [Overview](device-dev/subsystems/subsys-multimedia-camera-overview.md) + +——>——>——>——>——> [Development Guidelines on Photographing](device-dev/subsystems/subsys-multimedia-camera-photo-guide.md) + +——>——>——>——>——> [Development Guidelines on Video Recording](device-dev/subsystems/subsys-multimedia-camera-record-guide.md) + +——>——>——>——>——> [Development Guidelines on Previewing](device-dev/subsystems/subsys-multimedia-camera-preview-guide.md) + +——>——>——>——> [Audio/Video](device-dev/subsystems/subsys-multimedia-video.md) + +——>——>——>——>——> [Overview](device-dev/subsystems/subsys-multimedia-video-overview.md) + +——>——>——>——>——> [Development Guidelines on Media Playback](device-dev/subsystems/subsys-multimedia-video-play-guide.md) + +——>——>——>——>——> [Development Guidelines on Media Recording](device-dev/subsystems/subsys-multimedia-video-record-guide.md) + +——>——>——> [Utils](device-dev/subsystems/subsys-utils.md) + +——>——>——>——> [Utils Overview](device-dev/subsystems/subsys-utils-overview.md) + +——>——>——>——> [Utils Development Guidelines](device-dev/subsystems/subsys-utils-guide.md) + +——>——>——>——> [Utils FAQ](device-dev/subsystems/subsys-utils-faqs.md) + +——>——>——> [AI Framework](device-dev/subsystems/subsys-aiframework.md) + +——>——>——>——> [AI Engine Framework](device-dev/subsystems/subsys-aiframework-guide.md) + +——>——>——>——> [Development Environment](device-dev/subsystems/subsys-aiframework-envbuild.md) + +——>——>——>——> [Technical Specifications](device-dev/subsystems/subsys-aiframework-tech.md) + +——>——>——>——>——> [Code Management](device-dev/subsystems/subsys-aiframework-tech-codemanage.md) + +——>——>——>——>——> [Naming](device-dev/subsystems/subsys-aiframework-tech-name.md) + +——>——>——>——>——> [API Development](device-dev/subsystems/subsys-aiframework-tech-interface.md) + +——>——>——>——> [Development Guidelines](device-dev/subsystems/subsys-aiframework-devguide.md) + +——>——>——>——>——> [SDK](device-dev/subsystems/subsys-aiframework-devguide-sdk.md) + +——>——>——>——>——> [Plug-in](device-dev/subsystems/subsys-aiframework-devguide-plugin.md) + +——>——>——>——>——> [Configuration File](device-dev/subsystems/subsys-aiframework-devguide-conf.md) + +——>——>——>——> [Development Examples](device-dev/subsystems/subsys-aiframework-demo.md) + +——>——>——>——>——> [KWS SDK](device-dev/subsystems/subsys-aiframework-demo-sdk.md) + +——>——>——>——>——> [KWS Plug-in](device-dev/subsystems/subsys-aiframework-demo-plugin.md) + +——>——>——>——>——> [KWS Configuration File](device-dev/subsystems/subsys-aiframework-demo-conf.md) + +——>——>——> [Sensors](device-dev/subsystems/subsys-sensor.md) + +——>——>——>——> [Sensors Overview](device-dev/subsystems/subsys-sensor-overview.md) + +——>——>——>——> [Sensors Usage Guidelines](device-dev/subsystems/subsys-sensor-guide.md) + +——>——>——>——> [Sensors Usage Example](device-dev/subsystems/subsys-sensor-demo.md) + +——>——>——> [Application Framework](device-dev/subsystems/subsys-application-framework.md) + +——>——>——>——> [Overview](device-dev/subsystems/subsys-application-framework-overview.md) + +——>——>——>——> [Setting Up a Development Environment](device-dev/subsystems/subsys-application-framework-envbuild.md) + +——>——>——>——> [Development Guidelines](device-dev/subsystems/subsys-application-framework-guide.md) + +——>——>——>——> [Development Example](device-dev/subsystems/subsys-application-framework-demo.md) + +——>——>——> [OTA Update](device-dev/subsystems/subsys-ota-guide.md) + +——>——>——>[Telephony Service](device-dev/subsystems/subsys-tel.md) + +——>——>——> [Security](device-dev/subsystems/subsys-security.md) + +——>——>——>——> [Overview](device-dev/subsystems/subsys-security-overview.md) + +——>——>——>——> [Development Guidelines on Application Signature Verification](device-dev/subsystems/subsys-security-sigverify.md) + +——>——>——>——> [Development Guidelines on Application Permission Management](device-dev/subsystems/subsys-security-rightmanagement.md) + +——>——>——>——> [Development Guidelines on IPC Authentication](device-dev/subsystems/subsys-security-communicationverify.md) + +——>——>——> [Startup](device-dev/subsystems/subsys-boot.md) + +——>——>——>——> [Startup](device-dev/subsystems/subsys-boot-overview.md) + +——>——>——>——> [init Module](device-dev/subsystems/subsys-boot-init.md) + +——>——>——>——> [appspawn Module](device-dev/subsystems/subsys-boot-appspawn.md) + +——>——>——>——> [bootstrap Module](device-dev/subsystems/subsys-boot-bootstrap.md) + +——>——>——>——> [syspara Module](device-dev/subsystems/subsys-boot-syspara.md) + +——>——>——>——> [FAQs](device-dev/subsystems/subsys-boot-faqs.md) + +——>——>——>——> [Reference](device-dev/subsystems/subsys-boot-ref.md) + +——>——>——> [DFX](device-dev/subsystems/subsys-dfx.md) + +——>——>——>——>[DFX Overview](device-dev/subsystems/subsys-dfx-overview.md) + +——>——>——>——>[HiLog Development](device-dev/subsystems/subsys-dfx-hilog-rich.md) + +——>——>——>——>[HiLog_Lite Development](device-dev/subsystems/subsys-dfx-hilog-lite.md) + +——>——>——>——>[HiTrace Development](device-dev/subsystems/subsys-dfx-hitrace.md) + +——>——>——>——>[HiCollie Development](device-dev/subsystems/subsys-dfx-hicollie.md) + +——>——>——>——>[HiSysEvent Development](device-dev/subsystems/subsys-dfx-hisysevent.md) + +——>——>——>——>——>[HiSysEvent Logging Configuration](device-dev/subsystems/subsys-dfx-hisysevent-logging-config.md) + +——>——>——>——>——>[HiSysEvent Logging](device-dev/subsystems/subsys-dfx-hisysevent-logging.md) + +——>——>——>——>——>[HiSysEvent Listening](device-dev/subsystems/subsys-dfx-hisysevent-listening.md) + +——>——>——>——>——>[HiSysEvent Query](device-dev/subsystems/subsys-dfx-hisysevent-query.md) + +——>——>——>——>——>[HiSysEvent Tool Usage](device-dev/subsystems/subsys-dfx-hisysevent-tool.md) + +——>——> Featured Topics + +——>——>——> [Bundle Development](device-dev/bundles/bundles.md) + +——>——>——>——> [Bundle Development Specifications](device-dev/bundles/oem_bundle_standard_des.md) + +——>——>——>——> [Development Guidelines](device-dev/bundles/bundles-guide.md) + +——>——>——>——>——> [Overview](device-dev/bundles/bundles-guide-overview.md) + +——>——>——>——>——> [Installing hpm-cli Tool](device-dev/bundles/bundles-guide-prepare.md) + +——>——>——>——>——> [Developing Bundles](device-dev/bundles/bundles-guide-develop.md) + +——>——>——>——> [HPM User Guide](device-dev/bundles/bundles-demo.md) + +——>——>——>——>——> [Introduction](device-dev/bundles/bundles-demo-hpmdescription.md) + +——>——>——>——>——> [Configuring the Compilation Environment](device-dev/bundles/bundles-demo-environment.md) + +——>——>——>——>——> [Development Example](device-dev/bundles/bundles-demo-devsample.md) + +——>——> Device Development Examples + +——>——>——> [Mini- and Small-System Devices](device-dev/guide/device-lite.md) + +——>——>——>——> [WLAN-connected Products](device-dev/guide/device-wlan.md) + +——>——>——>——>——> [LED Peripheral Control](device-dev/guide/device-wlan-led-control.md) + +——>——>——>——>——> [Third-Party SDK Integration](device-dev/guide/device-wlan-sdk.md) + +——>——>——>——> [Cameras Without a Screen](device-dev/guide/device-iotcamera.md) + +——>——>——>——>——> [Camera Control](device-dev/guide/device-iotcamera-control.md) + +——>——>——>——>——>——> [Overview](device-dev/guide/device-iotcamera-control-overview.md) + +——>——>——>——>——>——> [Development Guidelines](device-dev/guide/device-iotcamera-control-demo.md) + +——>——>——>——>——>——>——> [Photographing](device-dev/guide/device-iotcamera-control-demo-photodevguide.md) + +——>——>——>——>——>——>——> [Video Recording](device-dev/guide/device-iotcamera-control-demo-videodevguide.md) + +——>——>——>——>——>——> [Use Case](device-dev/guide/device-iotcamera-control-example.md) + +——>——>——>——> [Cameras with a Screen](device-dev/guide/device-camera.md) + +——>——>——>——>——> [Screen and Camera Control](device-dev/guide/device-camera-control.md) + +——>——>——>——>——>——> [Overview](device-dev/guide/device-camera-control-overview.md) + +——>——>——>——>——>——> [Development Guidelines](device-dev/guide/device-camera-control-demo.md) + +——>——>——>——>——>——>——> [Photographing](device-dev/guide/device-camera-control-demo-photoguide.md) + +——>——>——>——>——>——>——> [Video Recording](device-dev/guide/device-camera-control-demo-videoguide.md) + +——>——>——>——>——>——>——> [Previewing](device-dev/guide/device-camera-control-demo-previewguide.md) + +——>——>——>——>——>——> [Use Case](device-dev/guide/device-camera-control-example.md) + +——>——>——>——>——> [Visual Application Development](device-dev/guide/device-camera-visual.md) + +——>——>——>——>——>——> [Overview](device-dev/guide/device-camera-visual-overview.md) + +——>——>——>——>——>——> [Preparations](device-dev/guide/device-camera-visual-prepare.md) + +——>——>——>——>——>——> [Adding Pages](device-dev/guide/device-camera-visual-addpage.md) + +——>——>——>——>——>——> [Building the Home Page](device-dev/guide/device-camera-visual-firstpage.md) + +——>——>——>——>——>——> [Building the Details Page](device-dev/guide/device-camera-visual-details.md) + +——>——>——>——>——>——> [Debugging and Packaging](device-dev/guide/device-camera-visual-debug.md) + +——>——>——>——>——>——> [Running on the Device](device-dev/guide/device-camera-visual-run.md) + +——>——>——>——>——>——> [FAQs]](device-dev/guide/device-camera-visual-faqs.md) + +——>——>——> [Standard-System Devices](device-dev/guide/device-standard.md) + +——>——>——>——> [Development Guidelines on Clock Apps](device-dev/guide/device-clock-guide.md) + +——>——>——>——> [Development Example for Platform Drivers](device-dev/guide/device-driver-demo.md) + +——>——>——>——> [Development Example for Peripheral Drivers](device-dev/guide/device-outerdriver-demo.md) + +——>——> Application Development + +——>——>——> [Getting Started](application-dev/quick-start) + +——>——>——>——> [Preparations](application-dev/quick-start/start-overview.md) + +——>——>——>——> [Getting Started with JavaScript](application-dev/quick-start/start-with-js.md) + +——>——>——> ArkUI + +——>——>——>——> JavaScript-based Web-like Development Paradigm + +——>——>——>——>——> [Overview](application-dev/ui/ui-js-overview.md) + +——>——>——>——>——> Framework + +——>——>——>——>——>——> [File Organization](application-dev/ui/js-framework-file.md) + +——>——>——>——>——>——> ["js" Tag](application-dev/ui/js-framework-js-tag.md) + +——>——>——>——>——>——> [app.js](application-dev/ui/js-framework-js-file.md) + +——>——>——>——>——>——> Syntax + +——>——>——>——>——>——>——> [HML](application-dev/ui/js-framework-syntax-hml.md) + +——>——>——>——>——>——>——> [CSS](application-dev/ui/js-framework-syntax-css.md) + +——>——>——>——>——>——>——> [JavaScript](application-dev/ui/js-framework-syntax-js.md) + +——>——>——>——>——>——> [Lifecycle](application-dev/ui/js-framework-lifecycle.md) + +——>——>——>——>——>——> [Resource Limitations and Access](application-dev/ui/js-framework-resource-restriction.md) + +——>——>——>——>——>——> [Multi-Language Capability](application-dev/ui/js-framework-multiple-languages.md) + +——>——>——>——>——> Building the UI + +——>——>——>——>——>——> [Component Overview](application-dev/ui/ui-js-building-ui-component.md) + +——>——>——>——>——>——> Building the Layout + +——>——>——>——>——>——>——> [Layout Description](application-dev/ui/ui-js-building-ui-layout-intro.md) + +——>——>——>——>——>——>——> [Adding Title and Paragraph Text](application-dev/ui/ui-js-building-ui-layout-text.md) + +——>——>——>——>——>——>——> [Adding an Image](application-dev/ui/ui-js-building-ui-layout-image.md) + +——>——>——>——>——>——>——> [Adding a Comment](application-dev/ui/ui-js-building-ui-layout-comment.md) + +——>——>——>——>——>——>——> [Adding a Container](application-dev/ui/ui-js-building-ui-layout-external-container.md) + +——>——>——>——>——>——> [Adding Interactions](application-dev/ui/ui-js-building-ui-interactions.md) + +——>——>——>——>——>——> [Developing Animations](application-dev/ui/ui-js-building-ui-animation.md) + +——>——>——>——>——>——> [Defining Events](application-dev/ui/ui-js-building-ui-event.md) + +——>——>——>——>——>——> [Defining Page Routes](application-dev/ui/ui-js-building-ui-routes.md) + +——>——>——>——>——> Common Component Development Guidelines + +——>——>——>——>——>——> [Text](application-dev/ui/ui-js-components-text.md) + +——>——>——>——>——>——> [Input](application-dev/ui/ui-js-components-input.md) + +——>——>——>——>——>——> [Button](application-dev/ui/ui-js-components-button.md) + +——>——>——>——>——>——> [List](application-dev/ui/ui-js-components-list.md) + +——>——>——>——>——>——> [Picker](application-dev/ui/ui-js-components-picker.md) + +——>——>——>——>——>——> [Dialog](application-dev/ui/ui-js-components-dialog.md) + +——>——>——>——>——>——> [Form](application-dev/ui/ui-js-components-form.md) + +——>——>——>——>——>——> [Stepper](application-dev/ui/ui-js-components-stepper.md) + +——>——>——>——>——>——> [Tabs](application-dev/ui/ui-js-component-tabs.md) + +——>——>——>——>——>——> [Image](application-dev/ui/ui-js-components-images.md) + +——>——>——>——>——> Animation Development Guidelines + +——>——>——>——>——>——> CSS Animation + +——>——>——>——>——>——>——> [Defining Attribute Style Animations](application-dev/ui/ui-js-animate-attribute-style.md) + +——>——>——>——>——>——>——> [Defining Animations with the transform Attribute](application-dev/ui/ui-js-animate-transform.md) + +——>——>——>——>——>——>——> [Defining Animations with the background-position Attribute](application-dev/ui/ui-js-animate-background-position-style.md) + +——>——>——>——>——>——> JS Animation + +——>——>——>——>——>——>——> [Component Animation](application-dev/ui/ui-js-animate-component.md) + +——>——>——>——>——>——>——> Interpolator Animation + +——>——>——>——>——>——>——>——> [Animation Effect](application-dev/ui/ui-js-animate-dynamic-effects.md) + +——>——>——>——>——>——>——>——> [Animation Frame](application-dev/ui/ui-js-animate-frame.md) + +——>——>——>——>——> [Custom Components](application-dev/ui/ui-js-custom-components.md) + +——>——>——>——> TypeScript-based Declarative Development Paradigm + +——>——>——>——>——> [Overview](application-dev/ui/ui-ts-overview.md) + +——>——>——>——>——> Framework Overview + +——>——>——>——>——>——> File Organization + +——>——>——>——>——>——>——> [Directory Structure](application-dev/ui/ts-framework-directory.md) + +——>——>——>——>——>——>——> [Rules for Accessing Application Code Files](application-dev/ui/ts-framework-file-access-rules.md) + +——>——>——>——>——>——> ["js" Tag](application-dev/ui/ts-framework-js-tag.md) + +——>——>——>——>——>——> Resource Access + +——>——>——>——>——>——>——> [Media Resource Types](application-dev/ui/ts-media-resource-type.md) + +——>——>——>——>——>——> [Pixel Units](application-dev/ui/ts-pixel-units.md) + +——>——>——>——>——>——> [Types](application-dev/ui/ts-types.md) + +——>——>——>——>——> Declarative Syntax + +——>——>——>——>——>——> [Overview](application-dev/ui/ts-syntax-intro.md) + +——>——>——>——>——>——> General UI Description Specifications + +——>——>——>——>——>——>——> [Basic Concepts](application-dev/ui/ts-general-ui-concepts.md) + +——>——>——>——>——>——>——> Declarative UI Description Specifications + +——>——>——>——>——>——>——>——> [Configuration Without Parameters](application-dev/ui/ts-parameterless-configuration.md) + +——>——>——>——>——>——>——>——> [Configuration with Mandatory Parameters](application-dev/ui/ts-configuration-with-mandatory-parameters.md) + +——>——>——>——>——>——>——>——> [Attribute Configuration](application-dev/ui/ts-attribution-configuration.md) + +——>——>——>——>——>——>——>——> [Event Configuration](application-dev/ui/ts-event-configuration.md) + +——>——>——>——>——>——>——>——> [Child Component Configuration](application-dev/ui/ts-child-component-configuration.md) + +——>——>——>——>——>——>——> Componentization + +——>——>——>——>——>——>——>——> [@Component](application-dev/ui/ts-component-based-component.md) + +——>——>——>——>——>——>——>——> [@Entry](application-dev/ui/ts-component-based-entry.md) + +——>——>——>——>——>——>——>——> [@Preview](application-dev/ui/ts-component-based-preview.md) + +——>——>——>——>——>——>——>——> [@Builder](application-dev/ui/ts-component-based-builder.md) + +——>——>——>——>——>——>——>——> [@Extend](application-dev/ui/ts-component-based-extend.md) + +——>——>——>——>——>——>——>——> [@CustomDialog](application-dev/ui/ts-component-based-customdialog.md) + +——>——>——>——>——>——> About UI State Management + +——>——>——>——>——>——>——> [Basic Concepts](application-dev/ui/ts-ui-state-mgmt-concepts.md) + +——>——>——>——>——>——>——> Managing Component States + +——>——>——>——>——>——>——>——> [@State](application-dev/ui/ts-component-states-state.md) + +——>——>——>——>——>——>——>——> [@Prop](application-dev/ui/ts-component-states-prop.md) + +——>——>——>——>——>——>——>——> [@Link](application-dev/ui/ts-component-states-link.md) + +——>——>——>——>——>——>——> Managing Application States + +——>——>——>——>——>——>——>——> Interfaces + +——>——>——>——>——>——>——>——>——> [AppStorage](application-dev/ui/ts-application-states-appstorage.md) + +——>——>——>——>——>——>——>——>——> [PersistentStorage](application-dev/ui/ts-application-states-apis-persistentstorage.md) + +——>——>——>——>——>——>——>——>——> [Environment](application-dev/ui/ts-application-states-apis-environment.md) + +——>——>——>——>——>——>——>——> [Synchronization Between AppStorage and Components](application-dev/ui/ts-application-states-storagelink-storageprop.md) + +——>——>——>——>——>——>——> Managing Other States + +——>——>——>——>——>——>——>——> [@Observed and @ObjectLink](application-dev/ui/ts-other-states-observed-objectlink.md) + +——>——>——>——>——>——>——>——> [@Consume and @Provide](application-dev/ui/ts-other-states-consume-provide.md) + +——>——>——>——>——>——>——>——> [@Watch](application-dev/ui/ts-other-states-watch.md) + +——>——>——>——>——>——> About Rendering Control Syntax + +——>——>——>——>——>——>——> [if/else](application-dev/ui/ts-rending-control-syntax-if-else.md) + +——>——>——>——>——>——>——> [ForEach](application-dev/ui/ts-rending-control-syntax-foreach.md) + +——>——>——>——>——>——>——> [LazyForEach](application-dev/ui/ts-rending-control-syntax-lazyforeach.md) + +——>——>——>——>——>——> About @Component + +——>——>——>——>——>——>——> [build Function](application-dev/ui/ts-function-build.md) + +——>——>——>——>——>——>——> [Initialization of Custom Components' Member Variables](application-dev/ui/ts-custom-component-initialization.md) + +——>——>——>——>——>——>——> [Custom Component Lifecycle Callbacks](application-dev/ui/ts-custom-component-lifecycle-callbacks.md) + +——>——>——>——>——>——>——> [Component Creation and Re-initialization](application-dev/ui/ts-component-creation-re-initialization.md) + +——>——>——>——>——>——> About Syntactic Sugar + +——>——>——>——>——>——>——> [@Decorator](application-dev/ui/ts-syntactic-sugar-decorator.md) + +——>——>——>——>——>——>——> [Chain Call](application-dev/ui/ts-syntactic-sugar-chaining.md) + +——>——>——>——>——>——>——> [struct](application-dev/ui/ts-syntactic-sugar-struct.md) + +——>——>——>——>——>——>——> [Instantiating a struct Without the new Keyword](application-dev/ui/ts-instantiating-a-struct-without-new-keyword.md) + +——>——>——>——>——>——>——> [Using a Separate Line for New Component](application-dev/ui/ts-using-a-separate-line-for-new-component.md) + +——>——>——>——>——>——>——> [Restrictions on Using TypeScript for Generators](application-dev/ui/ts-restrictions-for-generators.md) + +——>——>——>——>——> Experiencing the Declarative UI + +——>——>——>——>——>——> [Creating a Declarative UI Project](application-dev/ui/ui-ts-creating-project.md) + +——>——>——>——>——>——> [Getting to Know Components](application-dev/ui/ui-ts-components.md) + +——>——>——>——>——>——> [Creating a Simple Page](application-dev/ui/ui-ts-creating-simple-page.md) + +——>——>——>——>——> Defining Page Layout and Connection + +——>——>——>——>——>——> [Building a Food Data Model](application-dev/ui/ui-ts-building-data-model.md) + +——>——>——>——>——>——> [Building a Food Category List Layout](application-dev/ui/ui-ts-building-category-list-layout.md) + +——>——>——>——>——>——> [Building a Food Category Grid Layout](application-dev/ui/ui-ts-building-category-grid-layout.md) + +——>——>——>——>——>——> [Implementing Page Redirection and Data Transmission](application-dev/ui/ui-ts-page-redirection-data-transmission.md) + +——>——>——> Media + +——>——>——>——> Audio + +——>——>——>——>——> [Audio Overview](application-dev/media/audio-overview.md) + +——>——>——>——>——> [Audio Playback Development](application-dev/media/audio-playback.md) + +——>——>——>——>——> [Audio Management Development](application-dev/media/audio-management.md) + +——>——>——>——>——> [Audio Recording Development](application-dev/media/audio-recorder.md) + +——>——>——>——>——> [Audio Playback Development Using AudioRenderer](application-dev/media/audio-renderer.md) + +——>——>——>——>——> [Audio Recorder Development Using AudioCapturer](application-dev/media/audio-capturer.md) + +——>——>——> User Authentication + +——>——>——>——> [User Authentication Overview](application-dev/security/userauth-overview.md) + +——>——>——>——> [User Authentication Development](application-dev/security/userauth-guidelines.md) + +——>——>——> IPC & RPC + +——>——>——>——> [IPC & RPC Overview](application-dev/connectivity/ipc-rpc-overview.md) + +——>——>——>——> [IPC & RPC Development Guidelines](application-dev/connectivity/ipc-rpc-development-guideline.md) + +——>——>——>——> [Subscribing to State Changes of a Remote Object](application-dev/connectivity/subscribe-remote-state.md) + +——>——>——> Data Management + +——>——>——>——> Distributed Data Service + +——>——>——>——> [Distributed Data Service Overview](application-dev/database/database-mdds-overview.md) + +——>——>——>——> [Distributed Data Service Development](application-dev/database/database-mdds-guidelines.md) + +——>——>——>——> Relational Database Overview + +——>——>——>——> [RDB Overview](application-dev/database/database-relational-overview.md) + +——>——>——>——> [RDB Development](application-dev/database/database-relational-guidelines.md) + +——>——>——>——> Lightweight Data Store + +——>——>——>——> [Lightweight Data Store Overview](application-dev/database/database-preference-overview.md) + +——>——>——>——> [Lightweight Data Store Development](application-dev/database/database-preference-guidelines.md) + +——>——>——> USB Service + +——>——>——>——> [USB Service Overview](application-dev/usb/usb-overview.md) + +——>——>——>——> [USB Service Development](application-dev/usb/usb-guidelines.md) + +——>——>——> DFX + +——>——>——>——> [Overview of Application Event Logging](application-dev/dfx/hiappevent-overview.md) + +——>——>——>——> [Development Guidelines on Application Event Logging](application-dev/dfx/hiappevent-guidelines.md) + +——>——>——> [DevEco Studio \(OpenHarmony\) User Guide](application-dev/quick-start/deveco-studio-user-guide-for-openharmony.md) + +——>——>——>——> [Overview](application-dev/quick-start/deveco-studio-overview.md) + +——>——>——>——> [Version Change History](application-dev/quick-start/deveco-studio-release-notes.md) + +——>——>——>——> [Configuring the OpenHarmony SDK](application-dev/quick-start/configuring-openharmony-sdk.md) + +——>——>——>——> [Creating an OpenHarmony Project](application-dev/quick-start/create-openharmony-project.md) + +——>——>——>——>——> [Using the Project Wizard to Create a Project](application-dev/quick-start/use-wizard-to-create-project.md) + +——>——>——>——>——> [Importing a Sample to Create a Project](application-dev/quick-start/import-sample-to-create-project.md) + +——>——>——>——> [Configuring the OpenHarmony App Signature](application-dev/quick-start/configuring-openharmony-app-signature.md) + +——>——>——>——> [Installing and Running Your OpenHarmony App](application-dev/quick-start/installing-openharmony-app.md) + +——>——> Debugging + +——>——>——> [Test Subsystem](device-dev/subsystems/subsys-testguide-test.md) + +——>——>——> [R&D Tools](device-dev/subsystems/subsys-toolchain.md) + +——>——>——>——> [bytrace Usage Guidelines](device-dev/subsystems/subsys-toolchain-bytrace-guide.md) + +——>——>——>——> [hdc\_std Usage Guidelines](device-dev/subsystems/subsys-toolchain-hdc-guide.md) + +——>——> XTS Certification + +——>——>——> [XTS](device-dev/subsystems/subsys-xts-guide.md) + +——>——> Tools + +——>——>——> [Docker Environment](device-dev/get-code/gettools-acquire.md) + +——>——>——> [IDE](device-dev/get-code/gettools-ide.md) + +——>——> References + +——>——>——> [JS APIs](application-dev/reference/apis/Readme-EN.md) + +——>——>——>——> Ability Framework + +——>——>——>——>——> [FeatureAbility Module](application-dev/reference/apis/js-apis-featureAbility.md) + +——>——>——>——>——> [ParticleAbility Module](application-dev/reference/apis/js-apis-particleAbility.md) + +——>——>——>——>——> [DataAbilityHelper Module](application-dev/reference/apis/js-apis-dataAbilityHelper.md) + +——>——>——>——>——> [DataUriUtils Module](application-dev/reference/apis/js-apis-DataUriUtils.md) + +——>——>——>——>——> [Bundle Module](application-dev/reference/apis/js-apis-Bundle.md) + +——>——>——>——>——> [CommonEvent Module](application-dev/reference/apis/js-apis-commonEvent.md) + +——>——>——>——>——> [Notification Module](application-dev/reference/apis/js-apis-notification.md) + +——>——>——>——>——> [Context Module](application-dev/reference/apis/js-apis-Context.md) + +——>——>——>——> Resource Management + +——>——>——>——>——> [Resource Manager](application-dev/reference/apis/js-apis-resource-manager.md) + +——>——>——>——>——> [Internationalization \(i18n\) ](application-dev/reference/apis/js-apis-i18n.md) + +——>——>——>——>——> [Internationalization \(intl\) ](application-dev/reference/apis/js-apis-intl.md) + +——>——>——>——> Media + +——>——>——>——>——> [Audio Management](application-dev/reference/apis/js-apis-audio.md) + +——>——>——>——>——> [Media](application-dev/reference/apis/js-apis-media.md) + +——>——>——>——> Security + +——>——>——>——>——> [User Authentication](application-dev/reference/apis/js-apis-useriam-userauth.md) + +——>——>——>——>——> [Access Control](application-dev/reference/apis/js-apis-abilityAccessCtrl.md) + +——>——>——>——> Data Management + +——>——>——>——>——> [Lightweight Storage (deprecated since 8)](application-dev/reference/apis/js-apis-data-storage.md) + +——>——>——>——>——> [Distributed Data Management](application-dev/reference/apis/js-apis-distributed-data.md) + +——>——>——>——>——> [Relational Database](application-dev/reference/apis/js-apis-data-rdb.md) + +——>——>——>——>——> [Result Set](application-dev/reference/apis/js-apis-data-resultset.md) + +——>——>——>——>——> [DataAbilityPredicates](application-dev/reference/apis/js-apis-data-ability.md) + +——>——>——>——>——> [Settings](application-dev/reference/apis/js-apis-settings.md) + +——>——>——>——> File Management + +——>——>——>——>——> [File Management](application-dev/reference/apis/js-apis-fileio.md) + +——>——>——>——>——> [Statfs](application-dev/reference/apis/js-apis-statfs.md) + +——>——>——>——>——> [Environment](application-dev/reference/apis/js-apis-environment.md) + +——>——>——>——>——> [Public File Access and Management](application-dev/reference/apis/js-apis-filemanager.md) + +——>——>——>——>——> [App Storage Statistics](application-dev/reference/apis/js-apis-storage-statistics.md) + +——>——>——>——>——> [Volume Management](application-dev/reference/apis/js-apis-volumemanager.md) + +——>——>——>——> Account Management + +——>——>——>——>——> [Distributed Account Management](application-dev/reference/apis/js-apis-distributed-account.md) + +——>——>——>——>——> [Application Account Management](application-dev/reference/apis/js-apis-appAccount.md) + +——>——>——>——> Telephony Service + +——>——>——>——>——> [Call](application-dev/reference/apis/js-apis-call.md) + +——>——>——>——>——> [SMS](application-dev/reference/apis/js-apis-sms.md) + +——>——>——>——>——> [SIM Management](application-dev/reference/apis/js-apis-sim.md) + +——>——>——>——>——> [Radio](application-dev/reference/apis/js-apis-radio.md) + +——>——>——>——> Network and Connectivity + +——>——>——>——>——> [WLAN](application-dev/reference/apis/js-apis-wifi.md) + +——>——>——>——>——> [Bluetooth](application-dev/reference/apis/js-apis-bluetooth.md) + +——>——>——>——> Device Management + +——>——>——>——>——> [Sensor](application-dev/reference/apis/js-apis-sensor.md) + +——>——>——>——>——> [Vibrator](application-dev/reference/apis/js-apis-vibrator.md) + +——>——>——>——>——> [Brightness](application-dev/reference/apis/js-apis-brightness.md) + +——>——>——>——>——> [Battery Info](application-dev/reference/apis/js-apis-battery-info.md) + +——>——>——>——>——> [Power Management](application-dev/reference/apis/js-apis-power.md) + +——>——>——>——>——> [Running Lock](application-dev/reference/apis/js-apis-runninglock.md) + +——>——>——>——>——> [Device Info](application-dev/reference/apis/js-apis-device-info.md) + +——>——>——>——>——> [systemParameter](application-dev/reference/apis/js-apis-system-parameter.md) + +——>——>——>——>——> [Device Management](application-dev/reference/apis/js-apis-device-manager.md) + +——>——>——>——>——> [Window](application-dev/reference/apis/js-apis-window.md) + +——>——>——>——>——> [Display](application-dev/reference/apis/js-apis-display.md) + +——>——>——>——>——> [Update](application-dev/reference/apis/js-apis-update.md) + +——>——>——>——>——> [USB](application-dev/reference/apis/js-apis-usb.md) + +——>——>——>——> Basic Features + +——>——>——>——>——> [Application Context](application-dev/reference/apis/js-apis-basic-features-app-context.md) + +——>——>——>——>——> [Console Logs](application-dev/reference/apis/js-apis-basic-features-logs.md) + +——>——>——>——>——> [Page Routing](application-dev/reference/apis/js-apis-basic-features-routes.md) + +——>——>——>——>——> [Pop-up Window](application-dev/reference/apis/js-apis-basic-features-pop-up.md) + +——>——>——>——>——> [Application Configuration](application-dev/reference/apis/js-apis-basic-features-configuration.md) + +——>——>——>——>——> [Timer](application-dev/reference/apis/js-apis-basic-features-timer.md) + +——>——>——>——>——> [Setting the System Time](application-dev/reference/apis/js-apis-system-time.md) + +——>——>——>——>——> [Animation](application-dev/reference/apis/js-apis-basic-features-animator.md) + +——>——>——>——>——> [WebGL](application-dev/reference/apis/js-apis-webgl.md) + +——>——>——>——>——> [WebGL2](application-dev/reference/apis/js-apis-webgl2.md) + +——>——>——>——> DFX + +——>——>——>——>——> [HiAppEvent](application-dev/reference/apis/js-apis-hiappevent.md) + +——>——>——>——>——> [Performance Tracing](application-dev/reference/apis/js-apis-hitracemeter.md) + +——>——>——>——>——> [Fault Logger](application-dev/reference/apis/js-apis-faultLogger.md) + +——>——>——>——>——> [Distributed Call Chain Tracing](application-dev/reference/apis/js-apis-hitracechain.md) + +——>——>——>——>——> [HiLog](application-dev/reference/apis/js-apis-hilog.md) + +——>——>——>——>——> [HiChecker](application-dev/reference/apis/js-apis-hichecker.md) + +——>——>——>——>——> [HiDebug](application-dev/reference/apis/js-apis-hidebug.md) + +——>——>——>——> Language Base Class Library + +——>——>——>——>——> [Obtaining Process Information](application-dev/reference/apis/js-apis-process.md) + +——>——>——>——>——> [URL String Parsing](application-dev/reference/apis/js-apis-url.md) + +——>——>——>——>——> [URI String Parsing](application-dev/reference/apis/js-apis-uri.md) + +——>——>——>——>——> [Util](application-dev/reference/apis/js-apis-util.md) + +——>——>——>——>——> [XML Parsing and Generation](application-dev/reference/apis/js-apis-xml.md) + +——>——>——>——>——> [XML-to-JavaScript Conversion](application-dev/reference/apis/js-apis-convertxml.md) + +——>——>——>——>——> [Worker Startup](application-dev/reference/apis/js-apis-worker.md) + +——>——>——> ArkUI Component References + +——>——>——>——> [TypeScript-based Declarative Development Paradigm](application-dev/reference/arkui-js/Readme-EN.md) + +——>——>——>——>——> Components + +——>——>——>——>——>——> Common + +——>——>——>——>——>——>——> [Universal Attributes](application-dev/reference/arkui-js/js-components-common-attributes.md) + +——>——>——>——>——>——>——> [Universal Styles](application-dev/reference/arkui-js/js-components-common-styles.md) + +——>——>——>——>——>——>——> [Universal Events](application-dev/reference/arkui-js/js-components-common-events.md) + +——>——>——>——>——>——>——> [Universal Methods](application-dev/reference/arkui-js/js-components-common-methods.md) + +——>——>——>——>——>——>——> [Animation Styles](application-dev/reference/arkui-js/js-components-common-animation.md) + +——>——>——>——>——>——>——> [Gradient Styles](application-dev/reference/arkui-js/js-components-common-gradient.md) + +——>——>——>——>——>——>——> [Transition Styles](application-dev/reference/arkui-js/js-components-common-transition.md) + +——>——>——>——>——>——>——> [Media Query](application-dev/reference/arkui-js/js-components-common-mediaquery.md) + +——>——>——>——>——>——>——> [Custom Font Styles](application-dev/reference/arkui-js/js-components-common-customizing-font.md) + +——>——>——>——>——>——>——> [Atomic Layout](application-dev/reference/arkui-js/js-components-common-atomic-layout.md) + +——>——>——>——>——>——> Container Component + +——>——>——>——>——>——>——> [badge](application-dev/reference/arkui-js/js-components-container-badge.md) + +——>——>——>——>——>——>——> [dialog](application-dev/reference/arkui-js/js-components-container-dialog.md) + +——>——>——>——>——>——>——> [div](application-dev/reference/arkui-js/js-components-container-div.md) + +——>——>——>——>——>——>——> [form](application-dev/reference/arkui-js/js-components-container-form.md) + +——>——>——>——>——>——>——> [list](application-dev/reference/arkui-js/js-components-container-list.md) + +——>——>——>——>——>——>——> [list-item](application-dev/reference/arkui-js/js-components-container-list-item.md) + +——>——>——>——>——>——>——> [list-item-group](application-dev/reference/arkui-js/js-components-container-list-item-group.md) + +——>——>——>——>——>——>——> [panel](application-dev/reference/arkui-js/js-components-container-panel.md) + +——>——>——>——>——>——>——> [popup](application-dev/reference/arkui-js/js-components-container-popup.md) + +——>——>——>——>——>——>——> [refresh](application-dev/reference/arkui-js/js-components-container-refresh.md) + +——>——>——>——>——>——>——> [stack](application-dev/reference/arkui-js/js-components-container-stack.md) + +——>——>——>——>——>——>——> [stepper](application-dev/reference/arkui-js/js-components-container-stepper.md) + +——>——>——>——>——>——>——> [stepper-item](application-dev/reference/arkui-js/js-components-container-stepper-item.md) + +——>——>——>——>——>——>——> [swiper](application-dev/reference/arkui-js/js-components-container-swiper.md) + +——>——>——>——>——>——>——> [tabs](application-dev/reference/arkui-js/js-components-container-tabs.md) + +——>——>——>——>——>——>——> [tab-bar](application-dev/reference/arkui-js/js-components-container-tab-bar.md) + +——>——>——>——>——>——>——> [tab-content](application-dev/reference/arkui-js/js-components-container-tab-content.md) + +——>——>——>——>——>——> Basic Components + +——>——>——>——>——>——>——> [button](application-dev/reference/arkui-js/js-components-basic-button.md) + +——>——>——>——>——>——>——> [chart](application-dev/reference/arkui-js/js-components-basic-chart.md) + +——>——>——>——>——>——>——> [divider](application-dev/reference/arkui-js/js-components-basic-divider.md) + +——>——>——>——>——>——>——> [image](application-dev/reference/arkui-js/js-components-basic-image.md) + +——>——>——>——>——>——>——> [image-animator](application-dev/reference/arkui-js/js-components-basic-image-animator.md) + +——>——>——>——>——>——>——> [input](application-dev/reference/arkui-js/js-components-basic-input.md) + +——>——>——>——>——>——>——> [label](application-dev/reference/arkui-js/js-components-basic-label.md) + +——>——>——>——>——>——>——> [marquee](application-dev/reference/arkui-js/js-components-basic-marquee.md) + +——>——>——>——>——>——>——> [menu](application-dev/reference/arkui-js/js-components-basic-menu.md) + +——>——>——>——>——>——>——> [option](application-dev/reference/arkui-js/js-components-basic-option.md) + +——>——>——>——>——>——>——> [picker](application-dev/reference/arkui-js/js-components-basic-picker.md) + +——>——>——>——>——>——>——> [picker-view](application-dev/reference/arkui-js/js-components-basic-picker-view.md) + +——>——>——>——>——>——>——> [piece](application-dev/reference/arkui-js/js-components-basic-piece.md) + +——>——>——>——>——>——>——> [progress](application-dev/reference/arkui-js/js-components-basic-progress.md) + +——>——>——>——>——>——>——> [qrcode](application-dev/reference/arkui-js/js-components-basic-qrcode.md) + +——>——>——>——>——>——>——> [rating](application-dev/reference/arkui-js/js-components-basic-rating.md) + +——>——>——>——>——>——>——> [richtext](application-dev/reference/arkui-js/js-components-basic-richtext.md) + +——>——>——>——>——>——>——> [search](application-dev/reference/arkui-js/js-components-basic-search.md) + +——>——>——>——>——>——>——> [select](application-dev/reference/arkui-js/js-components-basic-select.md) + +——>——>——>——>——>——>——> [slider](application-dev/reference/arkui-js/js-components-basic-slider.md) + +——>——>——>——>——>——>——> [span](application-dev/reference/arkui-js/js-components-basic-span.md) + +——>——>——>——>——>——>——> [switch](application-dev/reference/arkui-js/js-components-basic-switch.md) + +——>——>——>——>——>——>——> [text](application-dev/reference/arkui-js/js-components-basic-text.md) + +——>——>——>——>——>——>——> [textarea](application-dev/reference/arkui-js/js-components-basic-textarea.md) + +——>——>——>——>——>——>——> [toolbar](application-dev/reference/arkui-js/js-components-basic-toolbar.md) + +——>——>——>——>——>——>——> [toolbar-item](application-dev/reference/arkui-js/js-components-basic-toolbar-item.md) + +——>——>——>——>——>——>——> [toggle](application-dev/reference/arkui-js/js-components-basic-toggle.md) + +——>——>——>——>——>——> Media Components + +——>——>——>——>——>——>——> [video](application-dev/reference/arkui-js/js-components-media-video.md) + +——>——>——>——>——>——> Canvas Components + +——>——>——>——>——>——>——> [canvas](application-dev/reference/arkui-js/js-components-canvas-canvas.md) + +——>——>——>——>——>——>——> [CanvasRenderingContext2D](application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md) + +——>——>——>——>——>——>——> [Image](application-dev/reference/arkui-js/js-components-canvas-image.md) + +——>——>——>——>——>——>——> [CanvasGradient](application-dev/reference/arkui-js/js-components-canvas-canvasgradient.md) + +——>——>——>——>——>——>——> [ImageData](application-dev/reference/arkui-js/js-components-canvas-imagedata.md) + +——>——>——>——>——>——>——> [Path2D](application-dev/reference/arkui-js/js-components-canvas-path2d.md) + +——>——>——>——>——>——>——> [ImageBitmap](application-dev/reference/arkui-js/js-components-canvas-imagebitmap.md) + +——>——>——>——>——>——>——> [OffscreenCanvas](application-dev/reference/arkui-js/js-components-canvas-offscreencanvas.md) + +——>——>——>——>——>——>——> [OffscreenCanvasRenderingContext2D](application-dev/reference/arkui-js/js-offscreencanvasrenderingcontext2d.md) + +——>——>——>——>——>——> Grid + +——>——>——>——>——>——>——> [Basic Concepts](application-dev/reference/arkui-js/js-components-grid-basic-concepts.md) + +——>——>——>——>——>——>——> [grid-container](application-dev/reference/arkui-js/js-components-grid-container.md) + +——>——>——>——>——>——>——> [grid-row](application-dev/reference/arkui-js/js-components-grid-row.md) + +——>——>——>——>——>——>——> [grid-col](application-dev/reference/arkui-js/js-components-grid-col.md) + +——>——>——>——>——>——> SVG Components + +——>——>——>——>——>——>——> [Universal Attributes](application-dev/reference/arkui-js/js-components-svg-common-attributes.md) + +——>——>——>——>——>——>——> [svg](application-dev/reference/arkui-js/js-components-svg.md) + +——>——>——>——>——>——>——> [rect](application-dev/reference/arkui-js/js-components-svg-rect.md) + +——>——>——>——>——>——>——> [circle](application-dev/reference/arkui-js/js-components-svg-circle.md) + +——>——>——>——>——>——>——> [ellipse](application-dev/reference/arkui-js/js-components-svg-ellipse.md) + +——>——>——>——>——>——>——> [path](application-dev/reference/arkui-js/js-components-svg-path.md) + +——>——>——>——>——>——>——> [line](application-dev/reference/arkui-js/js-components-svg-line.md) + +——>——>——>——>——>——>——> [polyline](application-dev/reference/arkui-js/js-components-svg-polyline.md) + +——>——>——>——>——>——>——> [polygon](application-dev/reference/arkui-js/js-components-svg-polygon.md) + +——>——>——>——>——>——>——> [text](application-dev/reference/arkui-js/js-components-svg-text.md) + +——>——>——>——>——>——>——> [tspan](application-dev/reference/arkui-js/js-components-svg-tspan.md) + +——>——>——>——>——>——>——> [textPath](application-dev/reference/arkui-js/js-components-svg-textpath.md) + +——>——>——>——>——>——>——> [animate](application-dev/reference/arkui-js/js-components-svg-animate.md) + +——>——>——>——>——>——>——> [animateMotion](application-dev/reference/arkui-js/js-components-svg-animatemotion.md) + +——>——>——>——>——>——>——> [animateTransform](application-dev/reference/arkui-js/js-components-svg-animatetransform.md) + +——>——>——>——>——> Custom Components + +——>——>——>——>——>——> [Basic Usage](application-dev/reference/arkui-js/js-components-custom-basic-usage.md) + +——>——>——>——>——>——> [Custom Events](application-dev/reference/arkui-js/js-components-custom-events.md) + +——>——>——>——>——>——> [props](application-dev/reference/arkui-js/js-components-custom-props.md) + +——>——>——>——>——>——> [Event Parameter](application-dev/reference/arkui-js/js-components-custom-event-parameter.md) + +——>——>——>——>——>——> [slot](application-dev/reference/arkui-js/js-components-custom-slot.md) + +——>——>——>——>——>——> [Lifecycle Definition](application-dev/reference/arkui-js/js-components-custom-lifecycle.md) + +——>——>——>——>——> [Appendix](application-dev/reference/arkui-js/js-appendix.md) + +——>——>——>——>——>——> [Type Attributes](application-dev/reference/arkui-js/js-appendix-types.md) + +——>——>——>——> [TypeScript-based Declarative Development Paradigm](application-dev/reference/arkui-ts/Readme-EN.md) + +——>——>——>——>——> Components + +——>——>——>——>——>——> Universal Components + +——>——>——>——>——>——>——> [Universal Events](application-dev/reference/arkui-ts/ts-universal-events.md) + +——>——>——>——>——>——>——>——> [Click Event](application-dev/reference/arkui-ts/ts-universal-events-click.md) + +——>——>——>——>——>——>——>——> [Touch](application-dev/reference/arkui-ts/ts-universal-events-touch.md) + +——>——>——>——>——>——>——>——> [Show/Hide Event](application-dev/reference/arkui-ts/ts-universal-events-show-hide.md) + +——>——>——>——>——>——>——>——> [Key Event](application-dev/reference/arkui-ts/ts-universal-events-key.md) + +——>——>——>——>——>——>——>——>[Component Area Change Event](application-dev/reference/arkui-ts/ts-universal-events-component-area-change.md) + +——>——>——>——>——>——>——> Universal Attributes + +——>——>——>——>——>——>——>——> [Size](application-dev/reference/arkui-ts/ts-universal-attributes-size.md) + +——>——>——>——>——>——>——>——> [Location](application-dev/reference/arkui-ts/ts-universal-attributes-location.md) + +——>——>——>——>——>——>——>——> [Layout Constraints](application-dev/reference/arkui-ts/ts-universal-attributes-layout-constraints.md) + +——>——>——>——>——>——>——>——> [Flex Layout](application-dev/reference/arkui-ts/ts-universal-attributes-flex-layout.md) + +——>——>——>——>——>——>——>——> [Border Configuration](application-dev/reference/arkui-ts/ts-universal-attributes-border.md) + +——>——>——>——>——>——>——>——> [Background](application-dev/reference/arkui-ts/ts-universal-attributes-background.md) + +——>——>——>——>——>——>——>——> [Opacity](application-dev/reference/arkui-ts/ts-universal-attributes-opacity.md) + +——>——>——>——>——>——>——>——> [Visibility](application-dev/reference/arkui-ts/ts-universal-attributes-visibility.md) + +——>——>——>——>——>——>——>——> [Enable/Disable](application-dev/reference/arkui-ts/ts-universal-attributes-enable.md) + +——>——>——>——>——>——>——>——> [Overlay](application-dev/reference/arkui-ts/ts-universal-attributes-overlay.md) + +——>——>——>——>——>——>——>——> [Z-order Control](application-dev/reference/arkui-ts/ts-universal-attributes-z-order.md) + +——>——>——>——>——>——>——>——> [Transformation](application-dev/reference/arkui-ts/ts-universal-attributes-transformation.md) + +——>——>——>——>——>——>——>——> [Image Effect Configuration](application-dev/reference/arkui-ts/ts-universal-attributes-image-effect.md) + +——>——>——>——>——>——>——>——> [Shape Clipping](application-dev/reference/arkui-ts/ts-universal-attributes-sharp-clipping.md) + +——>——>——>——>——>——>——>——> [Text Style](application-dev/reference/arkui-ts/ts-universal-attributes-text-style.md) + +——>——>——>——>——>——>——>——> [Grid](application-dev/reference/arkui-ts/ts-universal-attributes-grid.md) + +——>——>——>——>——>——>——>——> [Gradient Color](application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md) + +——>——>——>——>——>——>——>——> [Popup Control](application-dev/reference/arkui-ts/ts-universal-attributes-popup.md) + +——>——>——>——>——>——>——>——> [Menu Control](application-dev/reference/arkui-ts/ts-universal-attributes-menu.md) + +——>——>——>——>——>——>——>——>[Click Control](application-dev/reference/arkui-ts/ts-universal-attributes-touchable.md) + +——>——>——>——>——>——>——>——>[Touch Target](application-dev/reference/arkui-ts/ts-universal-attributes-response-region.md) + +——>——>——>——>——>——>——> Gesture Processing + +——>——>——>——>——>——>——>——> [Gesture Binding Methods](application-dev/reference/arkui-ts/ts-gesture-settings.md) + +——>——>——>——>——>——>——>——> Basic Gestures + +——>——>——>——>——>——>——>——>——> [TapGesture](application-dev/reference/arkui-ts/ts-basic-gestures-tapgesture.md) + +——>——>——>——>——>——>——>——>——> [LongPressGesture](application-dev/reference/arkui-ts/ts-basic-gestures-longpressgesture.md) + +——>——>——>——>——>——>——>——>——> [PanGesture](application-dev/reference/arkui-ts/ts-basic-gestures-pangesture.md) + +——>——>——>——>——>——>——>——>——> [PinchGesture](application-dev/reference/arkui-ts/ts-basic-gestures-pinchgesture.md) + +——>——>——>——>——>——>——>——>——> [RotationGesture](application-dev/reference/arkui-ts/ts-basic-gestures-rotationgesture.md) + +——>——>——>——>——>——>——>——>——> [SwipeGesture](application-dev/reference/arkui-ts/ts-basic-gestures-swipegesture.md) + +——>——>——>——>——>——>——>——> [Combined Gestures](application-dev/reference/arkui-ts/ts-combined-gestures.md) + +——>——>——>——>——>——> Basic Components + +——>——>——>——>——>——>——> [Blank](application-dev/reference/arkui-ts/ts-basic-components-blank.md) + +——>——>——>——>——>——>——> [Button](application-dev/reference/arkui-ts/ts-basic-components-button.md) + +——>——>——>——>——>——>——> [DataPanel](application-dev/reference/arkui-ts/ts-basic-components-datapanel.md) + +——>——>——>——>——>——>——> [Divider](application-dev/reference/arkui-ts/ts-basic-components-divider.md) + +——>——>——>——>——>——>——>[Gauge](application-dev/reference/arkui-ts/ts-basic-components-gauge.md) + +——>——>——>——>——>——>——> [Image](application-dev/reference/arkui-ts/ts-basic-components-image.md) + +——>——>——>——>——>——>——> [ImageAnimator](application-dev/reference/arkui-ts/ts-basic-components-imageanimator.md) + +——>——>——>——>——>——>——> [Progress](application-dev/reference/arkui-ts/ts-basic-components-progress.md) + +——>——>——>——>——>——>——> [QRCode](application-dev/reference/arkui-ts/ts-basic-components-qrcode.md) + +——>——>——>——>——>——>——> [Rating](application-dev/reference/arkui-ts/ts-basic-components-rating.md) + +——>——>——>——>——>——>——> [Span](application-dev/reference/arkui-ts/ts-basic-components-span.md) + +——>——>——>——>——>——>——> [Slider](application-dev/reference/arkui-ts/ts-basic-components-slider.md) + +——>——>——>——>——>——>——> [Text](application-dev/reference/arkui-ts/ts-basic-components-text.md) + +——>——>——>——>——>——>——> [TextArea](application-dev/reference/arkui-ts/ts-basic-components-textarea.md) + +——>——>——>——>——>——>——> [TextInput](application-dev/reference/arkui-ts/ts-basic-components-textinput.md) + +——>——>——>——>——>——>——> [Toggle](application-dev/reference/arkui-ts/ts-basic-components-toggle.md) + +——>——>——>——>——>——> Container Components + +——>——>——>——>——>——>——> [AlphabetIndexer](application-dev/reference/arkui-ts/ts-container-alphabet-indexer.md) + +——>——>——>——>——>——>——> [Badge](application-dev/reference/arkui-ts/ts-container-badge.md) + +——>——>——>——>——>——>——> [Column](application-dev/reference/arkui-ts/ts-container-column.md) + +——>——>——>——>——>——>——> [ColumnSplit](application-dev/reference/arkui-ts/ts-container-columnsplit.md) + +——>——>——>——>——>——>——> [Counter](application-dev/reference/arkui-ts/ts-container-counter.md) + +——>——>——>——>——>——>——> [Flex](application-dev/reference/arkui-ts/ts-container-flex.md) + +——>——>——>——>——>——>——> [GridContainer](application-dev/reference/arkui-ts/ts-container-gridcontainer.md) + +——>——>——>——>——>——>——> [Grid](application-dev/reference/arkui-ts/ts-container-grid.md) + +——>——>——>——>——>——>——> [GridItem](application-dev/reference/arkui-ts/ts-container-griditem.md) + +——>——>——>——>——>——>——> [List](application-dev/reference/arkui-ts/ts-container-list.md) + +——>——>——>——>——>——>——> [ListItem](application-dev/reference/arkui-ts/ts-container-listitem.md) + +——>——>——>——>——>——>——> [Navigator](application-dev/reference/arkui-ts/ts-container-navigator.md) + +——>——>——>——>——>——>——> [Navigation](application-dev/reference/arkui-ts/ts-container-navigation.md) + +——>——>——>——>——>——>——> [Panel](application-dev/reference/arkui-ts/ts-container-panel.md) + +——>——>——>——>——>——>——> [Row](application-dev/reference/arkui-ts/ts-container-row.md) + +——>——>——>——>——>——>——> [RowSplit](application-dev/reference/arkui-ts/ts-container-rowsplit.md) + +——>——>——>——>——>——>——> [Scroll](application-dev/reference/arkui-ts/ts-container-scroll.md) + +——>——>——>——>——>——>——> [ScrollBar](application-dev/reference/arkui-ts/ts-container-scrollbar.md) + +——>——>——>——>——>——>——> [Stack](application-dev/reference/arkui-ts/ts-container-stack.md) + +——>——>——>——>——>——>——> [Swiper](application-dev/reference/arkui-ts/ts-container-swiper.md) + +——>——>——>——>——>——>——> [Tabs](application-dev/reference/arkui-ts/ts-container-tabs.md) + +——>——>——>——>——>——>——> [TabContent](application-dev/reference/arkui-ts/ts-container-tabcontent.md) + +——>——>——>——>——>——>——> [Stepper](application-dev/reference/arkui-ts/ts-container-stepper.md) + +——>——>——>——>——>——>——> [StepperItem](application-dev/reference/arkui-ts/ts-container-stepperitem.md) + +——>——>——>——>——>——> Drawing Components + +——>——>——>——>——>——>——> [Circle](application-dev/reference/arkui-ts/ts-drawing-components-circle.md) + +——>——>——>——>——>——>——> [Ellipse](application-dev/reference/arkui-ts/ts-drawing-components-ellipse.md) + +——>——>——>——>——>——>——> [Line](application-dev/reference/arkui-ts/ts-drawing-components-line.md) + +——>——>——>——>——>——>——> [Polyline](application-dev/reference/arkui-ts/ts-drawing-components-polyline.md) + +——>——>——>——>——>——>——> [Polygon](application-dev/reference/arkui-ts/ts-drawing-components-polygon.md) + +——>——>——>——>——>——>——> [Path](application-dev/reference/arkui-ts/ts-drawing-components-path.md) + +——>——>——>——>——>——>——> [Rect](application-dev/reference/arkui-ts/ts-drawing-components-rect.md) + +——>——>——>——>——>——>——> [Shape](application-dev/reference/arkui-ts/ts-drawing-components-shape.md)‘ + +——>——>——>——>——>——> Canvas Components + +——>——>——>——>——>——>——>[Canvas](application-dev/reference/arkui-ts/ts-components-canvas-canvas.md) + +——>——>——>——>——>——>——>[Lottie](application-dev/reference/arkui-ts/ts-components-canvas-lottie.md) + +——>——>——>——>——> Animation + +——>——>——>——>——>——> [Attribute Animation](application-dev/reference/arkui-ts/ts-animatorproperty.md) + +——>——>——>——>——>——> [Explicit Animation](application-dev/reference/arkui-ts/ts-explicit-animation.md) + +——>——>——>——>——>——> Transition Animation + +——>——>——>——>——>——>——> [Page Transition](application-dev/reference/arkui-ts/ts-page-transition-animation.md) + +——>——>——>——>——>——>——> [Component Transition](application-dev/reference/arkui-ts/ts-transition-animation-component.md) + +——>——>——>——>——>——>——> [Transition of Shared Elements](application-dev/reference/arkui-ts/ts-transition-animation-shared-elements.md) + +——>——>——>——>——>——> [Motion Path Animation](application-dev/reference/arkui-ts/ts-motion-path-animation.md) + +——>——>——>——>——>——> [Matrix Transformation](application-dev/reference/arkui-ts/ts-matrix-transformation.md) + +——>——>——>——>——>——> [Interpolation Calculation](application-dev/reference/arkui-ts/ts-interpolation-calculation.md) + +——>——>——>——>——> Global UI Methods + +——>——>——>——>——>——> [Alert Dialog Box](application-dev/reference/arkui-ts/ts-methods-alert-dialog-box.md) + +——>——>——>——>——>——> [Custom Dialog box](application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md) + +——>——>——>——>——>——> [Image Cache](application-dev/reference/arkui-ts/ts-methods-image-cache.md) + +——>——>——>——>——>——> [Media Query](application-dev/reference/arkui-ts/ts-methods-media-query.md) + +——>——>——>——>——>——> [List Selection Dialog Box](application-dev/reference/arkui-ts/ts-methods-action-sheet.md) + +——>——>——>——>——> Appendix + +——>——>——>——>——>——> [Built-in Enums](application-dev/reference/arkui-ts/ts-appendix-enums.md) + +——>——>——>[Directory Structure](application-dev/quick-start/package-structure.md) + +——>——>——> FAQs-Device Management + +——>——>——>——>[Overview of FAQs](device-dev/faqs/faqs-overview.md) + +——>——>——>——>[Environment Setup](device-dev/faqs/faqs-environment-setup.md) + +——>——>——>——>[Compilation and Building Subsystem](device-dev/faqs/faqs-building.md) + +——>——>——>——>[Burning](device-dev/faqs/faqs-burning.md) + +——>——>——>——>[Kernel](device-dev/faqs/faqs-kernel.md) + +——>——>——>——>[Porting](device-dev/faqs/faqs-porting.md) + +——>——>——>——>[Startup](device-dev/faqs/faqs-startup.md) + +——>——>——>——>[System Applications](device-dev/faqs/faqs-system-applications.md) + +——>——> Contribution + +——>——>——>[Contribution](contribute/contribution.md) + +——>——>——> [Code of Conduct](contribute/code-of-conduct.md) + +——>——>——>[Code Contribution](contribute/code-contribution.md) + +——>——>——>[Contribution Process](contribute/contribution-process.md) + +——>——>——> [Documentation Contribution](contribute/documentation-contribution.md) + +——>——>——>——>[Writing Instructions](contribute/writing-instructions.md) + +——>——>——>——>[Writing Documents for a Release](contribute/docs-release-process.md) + +——>——>——>[Communication in Community](contribute/communication-in-community.md) + +——>——>——>[FAQ](contribute/FAQ.md) diff --git a/zh-cn/application-dev/database/Readme-CN.md b/zh-cn/application-dev/database/Readme-CN.md index 12b66f04eb2..ab2703c93e6 100644 --- a/zh-cn/application-dev/database/Readme-CN.md +++ b/zh-cn/application-dev/database/Readme-CN.md @@ -5,7 +5,7 @@ - [分布式数据服务开发指导](database-mdds-guidelines.md) - 关系型数据库 - [关系型数据库概述](database-relational-overview.md) - - [分布式数据服务开发指导](database-relational-guidelines.md) + - [关系型数据库开发指导](database-relational-guidelines.md) - 轻量级数据存储 - [轻量级数据存储概述](database-preference-overview.md) - [轻量级数据存储开发指导](database-preference-guidelines.md) diff --git "a/zh-cn/contribute/\350\264\241\347\214\256\346\214\207\345\215\227.md" "b/zh-cn/contribute/\350\264\241\347\214\256\346\214\207\345\215\227.md" new file mode 100644 index 00000000000..49a74323ed7 --- /dev/null +++ "b/zh-cn/contribute/\350\264\241\347\214\256\346\214\207\345\215\227.md" @@ -0,0 +1,17 @@ +# 贡献指南 + +- **[参与贡献](参与贡献.md)** + +- **[行为准则](行为准则.md)** + +- **[贡献代码](贡献代码.md)** + +- **[贡献流程](贡献流程.md)** + +- **[FAQ](FAQ.md)** + +- **[贡献文档](贡献文档.md)** + +- **[写作规范](写作规范.md)** + +- **[社区沟通与交流](社区沟通与交流.md)** diff --git a/zh-cn/device-dev/faqs/Readme-CN.md b/zh-cn/device-dev/faqs/Readme-CN.md index 3cc4b5009fa..dd6d4efe122 100644 --- a/zh-cn/device-dev/faqs/Readme-CN.md +++ b/zh-cn/device-dev/faqs/Readme-CN.md @@ -6,6 +6,6 @@ - [烧录常见问题](faqs-burning.md) - [内核常见问题](faqs-kernel.md) - [移植常见问题](faqs-porting.md) -- [启动恢复常见问题](faqs-startup-and-recovery.md) +- [启动恢复常见问题](faqs-startup.md) - [系统应用常见问题](faqs-system-applications.md) diff --git a/zh-cn/device-dev/faqs/faqs-startup-and-recovery.md b/zh-cn/device-dev/faqs/faqs-startup.md similarity index 100% rename from zh-cn/device-dev/faqs/faqs-startup-and-recovery.md rename to zh-cn/device-dev/faqs/faqs-startup.md diff --git a/zh-cn/device-dev/subsystems/subsys-dfx.md b/zh-cn/device-dev/subsystems/subsys-dfx.md index 4c74132f820..6cfb9cf7ea4 100644 --- a/zh-cn/device-dev/subsystems/subsys-dfx.md +++ b/zh-cn/device-dev/subsystems/subsys-dfx.md @@ -6,6 +6,10 @@ - **[HiLog\_Lite开发指导](subsys-dfx-hilog-lite.md)** +- **[HiTrace开发指导](subsys-dfx-hitrace.md)** + +- **[HiCollie开发指导](subsys-dfx-hicollie.md)** + - **[HiSysEvent开发指导](subsys-dfx-hisysevent.md)** -[HiSysEvent打点配置指导](subsys-dfx-hisysevent-logging-config.md) -- Gitee From a747a85f765b759019ad5cd5b6a11876c95cc3b0 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 07:52:58 +0000 Subject: [PATCH 083/282] update zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md. Signed-off-by: Austin --- zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md index 0d9f9fe060e..0279282d1f3 100644 --- a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md @@ -52,7 +52,7 @@ uname [_-a | -s | -r | -m | -n | -v | --help_] ``` OHOS:/$ uname -a -Huawei LiteOS hisilicon 2.0.0.37 Huawei LiteOS 2.0.0.37 Oct 21 2021 17:39:32 Cortex-A7 +LiteOS hisilicon 2.0.0.37 Huawei LiteOS 2.0.0.37 Oct 21 2021 17:39:32 Cortex-A7 OHOS:/$ ``` @@ -60,6 +60,6 @@ OHOS:/$ ``` OHOS:/$ uname -ms -Huawei LiteOS Cortex-A7 +LiteOS Cortex-A7 OHOS:/$ ``` -- Gitee From 7edbd16b5dd0b1ea9c8f0c67bd7e10251839aa38 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 15:54:55 +0800 Subject: [PATCH 084/282] updated docs Signed-off-by: wusongqing --- en/device-dev/subsystems/subsys-build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/device-dev/subsystems/subsys-build.md b/en/device-dev/subsystems/subsys-build.md index b26c0743bcb..b8aa6b81f76 100644 --- a/en/device-dev/subsystems/subsys-build.md +++ b/en/device-dev/subsystems/subsys-build.md @@ -4,6 +4,6 @@ - **[Building Guidelines for Standard Systems](subsys-build-standard-large.md)** -- **[Build System Coding Specifications and Best Practices](subsys-build-gn-coding-style-and-best-practice)** +- **[Build System Coding Specifications and Best Practices](subsys-build-gn-coding-style-and-best-practice.md)** -- Gitee From c6794de2be7e7f1ca2c553eaa414c1854e4708b2 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 07:55:11 +0000 Subject: [PATCH 085/282] update en/device-dev/faqs/faqs-system-applications.md. Signed-off-by: Austin --- en/device-dev/faqs/faqs-system-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/device-dev/faqs/faqs-system-applications.md b/en/device-dev/faqs/faqs-system-applications.md index 8be8a965d70..10f999d9f36 100644 --- a/en/device-dev/faqs/faqs-system-applications.md +++ b/en/device-dev/faqs/faqs-system-applications.md @@ -17,7 +17,7 @@ The compiled executable program is run directly without being converted to an ap Call the **UtilsSetEnv** function of the KV store to set the data storage path. ``` -UtilsSetEnv("/storage/com.huawei.kv"); +UtilsSetEnv("/storage/com.example.kv"); ``` ## Visual Applications -- Gitee From 49e6ba80dba6afdbb7915081becabc77d1c797d0 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 15:56:04 +0800 Subject: [PATCH 086/282] updated docs Signed-off-by: wusongqing --- en/device-dev/subsystems/subsys-dfx.md | 1 + 1 file changed, 1 insertion(+) diff --git a/en/device-dev/subsystems/subsys-dfx.md b/en/device-dev/subsystems/subsys-dfx.md index a0fb539b3c3..993690cd1c6 100644 --- a/en/device-dev/subsystems/subsys-dfx.md +++ b/en/device-dev/subsystems/subsys-dfx.md @@ -6,6 +6,7 @@ - [HiTrace Development](subsys-dfx-hitrace.md) - [HiCollie Development](subsys-dfx-hicollie.md) - [HiSysEvent Development](subsys-dfx-hisysevent.md) + - [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md) - [HiSysEvent Logging](subsys-dfx-hisysevent-logging.md) - [HiSysEvent Listening](subsys-dfx-hisysevent-listening.md) -- Gitee From 69c0ec2222a5fa96605af4df374f60ad0f654501 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 07:56:52 +0000 Subject: [PATCH 087/282] update en/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md. Signed-off-by: Austin --- en/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md b/en/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md index 78cb1416ad0..781a427e634 100644 --- a/en/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md +++ b/en/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md @@ -84,7 +84,7 @@ Example 1: all information of the operating system ``` OHOS:/$ uname -a -Huawei LiteOS hisilicon 2.0.0.37 Huawei LiteOS 2.0.0.37 Oct 21 2021 17:39:32 Cortex-A7 +LiteOS hisilicon 2.0.0.37 Huawei LiteOS 2.0.0.37 Oct 21 2021 17:39:32 Cortex-A7 OHOS:/$ ``` @@ -92,7 +92,7 @@ Example 2: operating system name and architecture ``` OHOS:/$ uname -ms -Huawei LiteOS Cortex-A7 +LiteOS Cortex-A7 OHOS:/$ ``` -- Gitee From 23316acf98d4006ea66e81369079484abf0064c2 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 15:59:16 +0800 Subject: [PATCH 088/282] updated docs Signed-off-by: wusongqing --- en/device-dev/subsystems/subsys-dfx.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/en/device-dev/subsystems/subsys-dfx.md b/en/device-dev/subsystems/subsys-dfx.md index 993690cd1c6..cce0e6ee8c5 100644 --- a/en/device-dev/subsystems/subsys-dfx.md +++ b/en/device-dev/subsystems/subsys-dfx.md @@ -1,15 +1,14 @@ # DFX Development Guide -- [DFX Overview](subsys-dfx-overview.md) -- [HiLog Development](subsys-dfx-hilog-rich.md) -- [HiLog_Lite Development](subsys-dfx-hilog-lite.md) -- [HiTrace Development](subsys-dfx-hitrace.md) -- [HiCollie Development](subsys-dfx-hicollie.md) -- [HiSysEvent Development](subsys-dfx-hisysevent.md) - - - [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md) - - [HiSysEvent Logging](subsys-dfx-hisysevent-logging.md) - - [HiSysEvent Listening](subsys-dfx-hisysevent-listening.md) - - [HiSysEvent Query](subsys-dfx-hisysevent-query.md) - - [HiSysEvent Tool Usage](subsys-dfx-hisysevent-tool.md) +- [DFX Overview](subsys-dfx-overview.md) +- [HiLog Development](subsys-dfx-hilog-rich.md) +- [HiLog_Lite Development](subsys-dfx-hilog-lite.md) +- [HiTrace Development](subsys-dfx-hitrace.md) +- [HiCollie Development](subsys-dfx-hicollie.md) +- [HiSysEvent Development](subsys-dfx-hisysevent.md) + - [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md) + - [HiSysEvent Logging](subsys-dfx-hisysevent-logging.md) + - [HiSysEvent Listening](subsys-dfx-hisysevent-listening.md) + - [HiSysEvent Query](subsys-dfx-hisysevent-query.md) + - [HiSysEvent Tool Usage](subsys-dfx-hisysevent-tool.md) -- Gitee From 316d5f067b2277a954c33a9b34cb038a108ccff3 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:01:12 +0800 Subject: [PATCH 089/282] updated docs Signed-off-by: wusongqing --- zh-cn/device-dev/subsystems/subsys-dfx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/device-dev/subsystems/subsys-dfx.md b/zh-cn/device-dev/subsystems/subsys-dfx.md index 6cfb9cf7ea4..2fdce0127f3 100644 --- a/zh-cn/device-dev/subsystems/subsys-dfx.md +++ b/zh-cn/device-dev/subsystems/subsys-dfx.md @@ -12,7 +12,7 @@ - **[HiSysEvent开发指导](subsys-dfx-hisysevent.md)** - -[HiSysEvent打点配置指导](subsys-dfx-hisysevent-logging-config.md) + - [HiSysEvent打点配置指导](subsys-dfx-hisysevent-logging-config.md) - [HiSysEvent打点指导](subsys-dfx-hisysevent-logging.md) -- Gitee From 0443f182903841ee994d035047b8eb682fee3358 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 08:04:42 +0000 Subject: [PATCH 090/282] update en/device-dev/kernel/kernel-small-debug-shell-cmd-task.md. Signed-off-by: Austin --- en/device-dev/kernel/kernel-small-debug-shell-cmd-task.md | 1 - 1 file changed, 1 deletion(-) diff --git a/en/device-dev/kernel/kernel-small-debug-shell-cmd-task.md b/en/device-dev/kernel/kernel-small-debug-shell-cmd-task.md index 702530ad0a5..3eceba9af02 100644 --- a/en/device-dev/kernel/kernel-small-debug-shell-cmd-task.md +++ b/en/device-dev/kernel/kernel-small-debug-shell-cmd-task.md @@ -62,7 +62,6 @@ OHOS # task 6 1 6 0 Pending 0x688000 0x137000 0x11c518 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa1ddf 0.89 wms_server 8 1 1 1000 Running 0x2bf000 0x8f000 0x2a8c6 0.0 shell - 9 5 5 101 Pending 0x11ea000 0x2f9000 0x20429d 0.97 com.huawei.launcher 11 1 11 0 Pending 0x4d4000 0x112000 0xe0ad7 0.0 deviceauth_service 12 1 12 0 Pending 0x34f000 0xbd000 0x519ee 0.0 sensor_service 13 1 13 2 Pending 0x34e000 0xb3000 0x523d9 0.0 ai_server -- Gitee From 703955fde12739a3bf559e916195785b4c19d423 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 08:05:39 +0000 Subject: [PATCH 091/282] update en/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md. Signed-off-by: Austin --- en/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/en/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md b/en/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md index a6752e9588f..0dd40f28567 100644 --- a/en/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md +++ b/en/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md @@ -90,7 +90,6 @@ kill \[-l \[_signo_\] | _-s signo_ | _-signo_\] _pid..._ 6 1 6 0 Pending 0x688000 0x137000 0x11bca0 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa1cdf 0.88 wms_server 8 1 8 2 Pending 0x1f5000 0x48000 0x47dc2 0.2 mksh - 10 5 5 101 Pending 0x11ec000 0x2f9000 0x206047 0.93 com.huawei.launcher 12 1 12 0 Pending 0x4d4000 0x112000 0xe0882 0.0 deviceauth_service 13 1 13 0 Pending 0x34f000 0xbd000 0x51799 0.0 sensor_service 14 1 14 2 Pending 0x34e000 0xb3000 0x52184 0.0 ai_server @@ -116,7 +115,6 @@ kill \[-l \[_signo_\] | _-s signo_ | _-signo_\] _pid..._ 6 1 6 0 Pending 0x688000 0x137000 0x11c1ba 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa21f9 0.89 wms_server 8 1 8 2 Pending 0x1f5000 0x48000 0x482dc 0.2 mksh - 10 5 5 101 Pending 0x11ec000 0x2f9000 0x206561 0.93 com.huawei.launcher 12 1 12 0 Pending 0x4d4000 0x112000 0xe0d9c 0.0 deviceauth_service 13 1 13 0 Pending 0x34f000 0xbd000 0x51cb3 0.0 sensor_service 14 1 14 2 Pending 0x34e000 0xb3000 0x5269e 0.0 ai_server -- Gitee From bb9c1c71767460a1aab1e7916223e3a26177292d Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 08:06:25 +0000 Subject: [PATCH 092/282] update en/device-dev/kernel/kernel-small-debug-shell-cmd-top.md. Signed-off-by: Austin --- en/device-dev/kernel/kernel-small-debug-shell-cmd-top.md | 1 - 1 file changed, 1 deletion(-) diff --git a/en/device-dev/kernel/kernel-small-debug-shell-cmd-top.md b/en/device-dev/kernel/kernel-small-debug-shell-cmd-top.md index 9826e59c8eb..3f605a6d21a 100644 --- a/en/device-dev/kernel/kernel-small-debug-shell-cmd-top.md +++ b/en/device-dev/kernel/kernel-small-debug-shell-cmd-top.md @@ -73,7 +73,6 @@ OHOS:/$ top 6 1 6 0 Pending 0x688000 0x137000 0x11c1ba 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa21f9 0.87 wms_server 8 1 8 2 Pending 0x1f5000 0x48000 0x462dc 0.0 mksh - 9 5 5 101 Pending 0x11ea000 0x2f9000 0x204561 0.94 com.huawei.launcher 11 1 11 0 Pending 0x4d4000 0x112000 0xe0d9c 0.0 deviceauth_service 12 1 12 0 Pending 0x34f000 0xbd000 0x51cb3 0.0 sensor_service 13 1 13 2 Pending 0x34e000 0xb3000 0x5269e 0.0 ai_server -- Gitee From ddf0efbb49c2ccd8bd9ec4e57b01025c56a90514 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 08:07:13 +0000 Subject: [PATCH 093/282] update en/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md. Signed-off-by: Austin --- en/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md | 1 - 1 file changed, 1 deletion(-) diff --git a/en/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md b/en/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md index 65d163661af..df743e04bb4 100644 --- a/en/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md +++ b/en/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md @@ -105,7 +105,6 @@ OHOS # 6 1 6 0 Pending 0x688000 0x137000 0x11c518 0.0 media_server 7 1 7 0 Pending 0x9d2000 0x103000 0xa1ddf 0.95 wms_server 8 1 1 1000 Running 0x2bf000 0x8f000 0x2a8c6 0.0 shell - 9 5 5 101 Pending 0x11ea000 0x2f9000 0x20429d 1.2 com.huawei.launcher 11 1 11 0 Pending 0x4d4000 0x112000 0xe0ad7 0.0 deviceauth_service 12 1 12 0 Pending 0x34f000 0xbd000 0x519ee 0.0 sensor_service 13 1 13 2 Pending 0x34e000 0xb3000 0x523d9 0.0 ai_server -- Gitee From 1fa626a641774317fffaa7defff95ad820464b8d Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:09:28 +0800 Subject: [PATCH 094/282] updated docs Signed-off-by: wusongqing --- en/contribute/template/js-template.md | 79 +++++++++++++-------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/en/contribute/template/js-template.md b/en/contribute/template/js-template.md index 4b1a5a91302..146a6ae4240 100644 --- a/en/contribute/template/js-template.md +++ b/en/contribute/template/js-template.md @@ -7,10 +7,8 @@ > 0.2 - Upload JS API reference documents to **docs/en/application-dev/reference/apis**. If these documents contain figures, upload the figures to the **figures** folder. > > 0.3 - Use a .d.ts file for a JS API reference document. **The file name must be in the following format: js-apis-.md**. Examples: -> -> ​ For @ohos.multimedia.audio in the Media subsystem, the file name is **js-apis-audio.md**. -> -> ​ For @ohos.telephony.sms in the Telephony subsystem, the file name is **js-apis-sms.md**. +> For @ohos.multimedia.audio in the Media subsystem, the file name is **js-apis-audio.md**. +> For @ohos.telephony.sms in the Telephony subsystem, the file name is **js-apis-sms.md**. > > 0.4 - After uploading a JS API reference document, update the **Readme-EN.md** file in **docs/en/application-dev/reference/apis**. > @@ -19,17 +17,15 @@ > 0.6 - Use the document title as the level-1 heading. Use the attributes, functions, classes, interfaces, enums, and types under the namespace as level-2 headings. Use the attributes and functions under classes as level-3 headings. > > 0.7 - **When introducing an API to an existing module, use the \ tag to mark its earliest version.** -> -> ​ Example: For an existing module of API 6, if an attribute is added in API 7, suffix the \ tag to the name of the new attribute, for example, **newAttribute7+**. -> -> ​ If a method is added, suffix the \ tag to the method name, for example, **sim.getSimIccId7+**. The processing of new interfaces, classes, and enums is similar. +> Example: For an existing module of API 6, if an attribute is added in API 7, suffix the \ tag to the name of the new attribute, for example, **newAttribute7+**. +> If a method is added, suffix the \ tag to the method name, for example, **sim.getSimIccId7+**. The processing of new interfaces, classes, and enums is similar. > > 0.8 - **Deprecated content**: Do not delete the deprecated content directly from the document. Instead, suffix **deprecated** as a superscript to the content, and use the greater-than symbol (>) to introduce the substitute method plus the corresponding link. -> -> ​ Example: abandonmentMethod(deprecated) +> Example: abandonmentMethod(deprecated) > > > Discarded. This change is effective since API version 7. You are advised to use [newMethod](#newMethod) instead. > +> 0.9 - **Required permissions and system capabilities**: Keep consistent with the code implementation. Provide them at the level of methods, enumerations, and attributes. > The following describes the instructions for writing a specific API. *** @@ -42,22 +38,25 @@ > 1.3 - Use the following sentence: "The initial APIs of this module are supported since API version ***x***. Newly added APIs will be marked with a superscript to indicate their earliest API version." Change ***x*** to the actual version. + > **Note** > > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. Describe the module from its functionalities, use cases, and use suggestions in this section. + + ## Modules to Import + > *Writing Instructions* > > 2.1 - Write the modules to import based on the actual conditions. Provide the **import** statement in the form of a code segment. > > 2.2 - If no module needs to be imported, change "Modules to Import" to "How to Use" and provide a usage description. +> Example of **How to Use**: +> Before using the **AbilityContext**, obtain the **Context** object through **[getContext()]**(***API-reference***.md). > -> ​ Example of **How to Use**: -> -> ​ Before using the **AbilityContext**, obtain the **Context** object through **[getContext()]**(***API-reference***.md). > ```js > import ability_featureAbility from '@ohos.ability.featureAbility'; > var context = ability_featureAbility.getContext(); @@ -67,12 +66,6 @@ Describe the module from its functionalities, use cases, and use suggestions in import call from '@ohos.telephony.call'; ``` -## System Capabilities -> *Writing Instructions* -> -> 3.1 - Mandatory. -> -Example: SystemCapability.BundleManager.BundleFramework ## Attributes @@ -87,9 +80,9 @@ Example: SystemCapability.BundleManager.BundleFramework > 4.4 - For a writable attribute, if only fixed fields are supported, describe them. | Name| Type| Readable| Writable| Description| -| ---------------- | ----------------------------------------- | ---- | ---- | ------------------------------------------ | -| pluggedType | [BatteryPluggedType](#BatteryPluggedType) | Yes| No| Charger type of the current device.| -| isBatteryPresent | boolean | Yes| No| Whether the battery is supported or present.| +| ---------------- | ----------------------------------------- | ---- | ---- | ------------------------------------------------------------ | +| pluggedType | [BatteryPluggedType](#BatteryPluggedType) | Yes| No| Charger type of the current device.
**System capabilities**: SystemCapability.xxx.xxx (mandatory)| +| isBatteryPresent | boolean | Yes| No| Whether the battery is supported or present.
**System capabilities**: SystemCapability.xxx.xxx (mandatory)| ## Enums @@ -102,8 +95,8 @@ Example: SystemCapability.BundleManager.BundleFramework Provide a brief description of the enum type. Example: Enumerates charger types. | Name| Value| Description| -| ---- | ---- | -------------------------- | -| NONE | 1 | Unknown type.| +| ---- | ---- | ------------------------------------------------------------ | +| NONE | 1 | Unknown type.
**System capabilities**: SystemCapability.xxx.xxx (mandatory)| ## Methods @@ -113,17 +106,17 @@ Provide a brief description of the enum type. Example: Enumerates charger types. > > 6.2 - Use the actual method name, in the format of ClassName.methodName, as the level-2 heading. For a subscription method, add the subscription event to the method name. > -> ​ Example of a common method: sim.getSimIccId -> -> ​ Example of a subscription method: sim.on('exampleEvent') +> Example of a common method: sim.getSimIccId +> +> Example of a subscription method: sim.on('exampleEvent') > > 6.3 - **Method calling mode**: The description must be the same as that in the .d.ts file. The description must include the parameter type, parameter name, and return value type. > -> ​ Example: getNetworkState(slotId: number, callback: AsyncCallback\): void -> -> ​ Note: The angle bracket (<>) may be identified as a label and not displayed. To ensure normal display, you can either add a backslash (\\) (in the format of "\\<>") or use escape characters \< and \>. +> Example: getNetworkState(slotId: number, callback: AsyncCallback\): void +> +> Note: The angle bracket (<>) may be identified as a label and not displayed. To ensure normal display, you can either add a backslash (\\) (in the format of "\\<>") or use escape characters \< and \>. > -> 6.4.1 - **Method description**: Describe the features implemented by the method and include the prerequisites for using the method, the impact of the method, and the permissions required to use the command. (*Example of prerequisites: The method can be called only after the xx method is called; you must ensure that the connection to the Internet is normal. Example of impact: xx does not take effect after this method is called.*) +> 6.4.1 - **Method description**: Describe the features implemented by the method and include the prerequisites for using the method, the impact of the method, and the permissions and system capabilities required to use the method. (*Example of prerequisites: This method can be called only after the xx method is called; you must ensure that the connection to the Internet is normal. Example of impact: xx does not take effect after this method is called.*) > > 6.4.2 - **Asynchronous method**: If there are asynchronous methods, describe their return type in the method description. The return type can be a callback function or a **Promise** instance. > @@ -133,7 +126,9 @@ Provide the method name in the following format: (**static** if it is a static m Describe the method. For details, see 6.4.1 and 6.4.2. -Required permission: ohos.permission.XXX (Delete this part if no permission is involved. If a system permission is required, describe it.) +**Required permission**: ohos.permission.xxx (Delete this part if no permission is involved. If a system permission is required, specify it.) + +**System capabilities**: SystemCapability.xxx.xxx (mandatory) **Parameters: ** (Optional. Delete this heading if there is no parameter.) @@ -171,7 +166,7 @@ Required permission: ohos.permission.XXX (Delete this part if no permission is i > > 7.3 - If the class or interface contains both attributes and methods, write the attributes above the methods. Write their actual names in separate level-3 headings. > -> ​ If the class of interface contains only attributes, you do not need to create a level-3 heading. Instead, use a table to display the attributes. For details, see [CustomType](#CustomType). +> If the class of interface contains only attributes, you do not need to create a level-3 heading. Instead, use a table to display the attributes. For details, see [CustomType](#CustomType). Describe the class or interface. If there are usage restrictions, describe them as well, for example, whether there is a prerequisite and whether an instance needs to be created by using any method. @@ -187,9 +182,9 @@ Describe the class or interface. If there are usage restrictions, describe them > > 7.4 - Use the actual method name as the level-3 heading. **Do not add a prefix**. For a subscription method, add the corresponding subscription event to the method name. > -> ​ Example of a common method: getSimIccId -> -> ​ Example of a subscription method: on('exampleEvent') +> Example of a common method: getSimIccId +> +> Example of a subscription method: on('exampleEvent') > > The other instructions are the same as those stipulated in [Methods](#Methods). @@ -197,7 +192,9 @@ Describe the method calling mode. For details, see 6.3. Describe the method. For details, see 6.4.1 and 6.4.2. -Required permission: ohos.permission.XXX (Delete this part if no permission is involved. If a system permission is required, describe it.) +**Required permission**: ohos.permission.xxx (Delete this part if no permission is involved. If a system permission is required, specify it.) + +**System capabilities**: SystemCapability.xxx.xxx (mandatory) **Parameters: ** (Optional. Delete this heading if there is no parameter.) @@ -229,7 +226,7 @@ Required permission: ohos.permission.XXX (Delete this part if no permission is i The following is an example of the custom type of a key-value pair. -| Name| Type| Readable|Writable| Description| -| ------------ | ---- | ---- | ---- | ---- | -| parameterUrl | string | Yes| Yes|Media output URI. The following types of URIs are supported:
1. Relative path whose protocol type is **internal**. Example:
Temporary directory: internal://cache/test.mp4

2. Absolute path. Example:
file:///data/data/ohos.xxx.xxx/files/test.mp4| -| parameterOne | [CustomEnum](#Enumeration)| Yes| Yes|Describe the attributes. The requirements are similar to those for the parameter description.| +| Name| Type| Readable| Writable| Description| +| ------------ | ------------------- | ---- | ---- | ------------------------------------------------------------ | +| parameterUrl | string | Yes| Yes| Media output URI. The following types of URIs are supported:
1. Relative path whose protocol type is **internal**. Example:
Temporary directory: internal://cache/test.mp4

2. Absolute path. Example:
file:///data/data/ohos.xxx.xxx/files/test.mp4
**System capabilities**: SystemCapability.xxx.xxx (mandatory)| +| parameterOne | [CustomEnum](#Enumeration)| Yes| Yes| Describe the attributes. The requirements are similar to those for the parameter description.
**System capabilities**: SystemCapability.xxx.xxx (mandatory)| -- Gitee From c20102243366028b7f8ccd083a81ef7f2b119af1 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 08:09:29 +0000 Subject: [PATCH 095/282] update en/device-dev/bundles/bundles-standard-rules.md. Signed-off-by: Austin --- en/device-dev/bundles/bundles-standard-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/device-dev/bundles/bundles-standard-rules.md b/en/device-dev/bundles/bundles-standard-rules.md index 559ff09b219..edd766e0bde 100644 --- a/en/device-dev/bundles/bundles-standard-rules.md +++ b/en/device-dev/bundles/bundles-standard-rules.md @@ -161,7 +161,7 @@ Bundle dependencies are then stored in the **ohos\_bundles** folder in the roo username@server MINGW64 /f/showcase/demo/demo $ hpm list +--demo@1.0.0 -| +--@huawei/media@1.0.2 +| +--@example/media@1.0.2 | +--@demo/sport_hi3518ev300_liteos_a@1.0.0 | | +--@demo/app@4.0.1 | | | +--@demo/build@4.0.1 -- Gitee From 71a7e9c4402b5c9709c3ac4b2a4ef3eda53f49ef Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Mar 2022 08:11:30 +0000 Subject: [PATCH 096/282] update en/device-dev/subsystems/subsys-utils-guide.md. Signed-off-by: Austin --- en/device-dev/subsystems/subsys-utils-guide.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/en/device-dev/subsystems/subsys-utils-guide.md b/en/device-dev/subsystems/subsys-utils-guide.md index 1988c6b9c43..6a6a786790f 100644 --- a/en/device-dev/subsystems/subsys-utils-guide.md +++ b/en/device-dev/subsystems/subsys-utils-guide.md @@ -165,8 +165,8 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); ``` { "app": { - "bundleName": "com.huawei.launcher", - "vendor": "huawei", + "bundleName": "com.example.launcher", + "vendor": "example, "version": { "code": 1, "name": "1.0" @@ -189,7 +189,7 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); } }, "module": { - "package": "com.huawei.launcher", + "package": "com.example.launcher", "name": ".MyHarmonyAbilityPackage", "deviceType": [ "phone", "tv","tablet", "pc","car","smartWatch","sportsWatch","smartCamera" @@ -242,7 +242,7 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); 3. Send the command for running the native KV store application to the board through the serial port. ``` - ./nfs/dev_tools/bin/aa start -p com.huawei.launcher -n ServiceAbility + ./nfs/dev_tools/bin/aa start -p com.example.launcher -n ServiceAbility ``` -- Gitee From 634d7c91d6dffcf19a20b993cb33b30bbb475abc Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 3 Mar 2022 08:23:44 +0000 Subject: [PATCH 097/282] update zh-cn/OpenHarmony-Overview_zh.md. Signed-off-by: zengyawen --- zh-cn/OpenHarmony-Overview_zh.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/OpenHarmony-Overview_zh.md b/zh-cn/OpenHarmony-Overview_zh.md index 9e766989453..f7e698c5051 100644 --- a/zh-cn/OpenHarmony-Overview_zh.md +++ b/zh-cn/OpenHarmony-Overview_zh.md @@ -42,14 +42,14 @@ OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统 - 增强软件服务子系统集:提供针对不同设备的、差异化的能力增强型软件服务,由智慧屏专有业务、穿戴专有业务、IoT专有业务等子系统组成。 -- 硬件服务子系统集:提供硬件服务,由位置服务、生物特征识别、穿戴专有硬件服务、IoT专有硬件服务等子系统组成。 +- 硬件服务子系统集:提供硬件服务,由位置服务、用户IAM、穿戴专有硬件服务、IoT专有硬件服务等子系统组成。 根据不同设备形态的部署环境,基础软件服务子系统集、增强软件服务子系统集、硬件服务子系统集内部可以按子系统粒度裁剪,每个子系统内部又可以按功能粒度裁剪。 **框架层** -框架层为应用开发提供了C/C++/JS等多语言的用户程序框架和Ability框架,适用于JS语言的JS UI框架,以及各种软硬件服务对外开放的多语言框架API。根据系统的组件化裁剪程度,设备支持的API也会有所不同。 +框架层为应用开发提供了C/C++/JS等多语言的用户程序框架和Ability框架,适用于JS语言的ArkUI框架,以及各种软硬件服务对外开放的多语言框架API。根据系统的组件化裁剪程度,设备支持的API也会有所不同。 **应用层** -- Gitee From 854b52faedd867b4b7e3c23ee5be8346b0e107db Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:26:52 +0800 Subject: [PATCH 098/282] updated docs Signed-off-by: wusongqing --- en/device-dev/subsystems/Readme-EN.md | 13 ++++++++----- en/device-dev/subsystems/subsys-dfx-hisysevent.md | 2 +- en/device-dev/subsystems/subsys-sensor-demo.md | 2 +- en/device-dev/subsystems/subsys-sensor-guide.md | 2 +- en/device-dev/subsystems/subsys-sensor-overview.md | 2 +- en/device-dev/subsystems/subsys-sensor.md | 8 ++++---- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/en/device-dev/subsystems/Readme-EN.md b/en/device-dev/subsystems/Readme-EN.md index 0e088b60b74..517ef499726 100644 --- a/en/device-dev/subsystems/Readme-EN.md +++ b/en/device-dev/subsystems/Readme-EN.md @@ -3,6 +3,7 @@ - [Compilation and Building](subsys-build.md) - [Building Guidelines for Mini and Small Systems](subsys-build-mini-lite.md) - [Building Guidelines for Standard Systems](subsys-build-standard-large.md) + - [Build System Coding Specifications and Best Practices](subsys-build-gn-coding-style-and-best-practice.md) - [Distributed Remote Startup](subsys-remote-start.md) - [Graphics](subsys-graphics.md) - [Graphics](subsys-graphics-overview.md) @@ -46,10 +47,10 @@ - [Lightweight Data Store](subsys-data-storage.md) - [Lightweight Data Store Overview](subsys-data-storage-overview.md) - [Lightweight Data Store Development](subsys-data-storage-guide.md) -- [Sensors](subsys-sensor.md) - - [Sensors Overview](subsys-sensor-overview.md) - - [Sensors Usage Guidelines](subsys-sensor-guide.md) - - [Sensors Usage Example](subsys-sensor-demo.md) +- [Sensor](subsys-sensor.md) + - [Sensor Overview](subsys-sensor-overview.md) + - [Sensor Usage Guidelines](subsys-sensor-guide.md) + - [Sensor Usage Example](subsys-sensor-demo.md) - [USB](subsys-usbservice.md) - [[USB Overview](subsys-usbservice-overview.md) - [USB Usage Guidelines](subsys-usbservice-guide.md) @@ -80,7 +81,9 @@ - [DFX](subsys-dfx.md) - [DFX](subsys-dfx-overview.md) - [HiLog Development](subsys-dfx-hilog-rich.md) - - [HiLog_Lite Development](subsys-dfx-hilog-lite.md) + - [HiLog\_Lite Development](subsys-dfx-hilog-lite.md) + - [HiTrace Development](subsys-dfx-hitrace.md) + - [HiCollie Development](subsys-dfx-hicollie.md) - [HiSysEvent Development](subsys-dfx-hisysevent.md) - [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md) - [HiSysEvent Logging](subsys-dfx-hisysevent-logging.md) diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent.md b/en/device-dev/subsystems/subsys-dfx-hisysevent.md index b29223652d0..aba11496ba7 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent.md @@ -1,4 +1,4 @@ -# DHiSysEvent Development +# HiSysEvent Development - **[HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md)** diff --git a/en/device-dev/subsystems/subsys-sensor-demo.md b/en/device-dev/subsystems/subsys-sensor-demo.md index 6a243c21fc0..f914d045a59 100644 --- a/en/device-dev/subsystems/subsys-sensor-demo.md +++ b/en/device-dev/subsystems/subsys-sensor-demo.md @@ -1,4 +1,4 @@ -# Sensors Usage Example +# Sensor Usage Example The following sample code uses the sensor whose **sensorTypeId** is **0** as an example. The code for other sensor types is similar. diff --git a/en/device-dev/subsystems/subsys-sensor-guide.md b/en/device-dev/subsystems/subsys-sensor-guide.md index dc4cfb878fd..4f65a3d5005 100644 --- a/en/device-dev/subsystems/subsys-sensor-guide.md +++ b/en/device-dev/subsystems/subsys-sensor-guide.md @@ -1,4 +1,4 @@ -# Sensors Usage Guidelines +# Sensor Usage Guidelines The following steps use the sensor whose **sensorTypeId** is **0** as an example. The guidelines for other sensor types are similar. diff --git a/en/device-dev/subsystems/subsys-sensor-overview.md b/en/device-dev/subsystems/subsys-sensor-overview.md index ffd7478fe93..baaa934fe1e 100644 --- a/en/device-dev/subsystems/subsys-sensor-overview.md +++ b/en/device-dev/subsystems/subsys-sensor-overview.md @@ -1,4 +1,4 @@ -# Sensors Overview +# Sensor Overview ## Introduction diff --git a/en/device-dev/subsystems/subsys-sensor.md b/en/device-dev/subsystems/subsys-sensor.md index 937d03221f5..86091571411 100644 --- a/en/device-dev/subsystems/subsys-sensor.md +++ b/en/device-dev/subsystems/subsys-sensor.md @@ -1,9 +1,9 @@ -# Sensors +# Sensor -- **[Sensors Overview](subsys-sensor-overview.md)** +- **[Sensor Overview](subsys-sensor-overview.md)** -- **[Sensors Usage Guidelines](subsys-sensor-guide.md)** +- **[Sensor Usage Guidelines](subsys-sensor-guide.md)** -- **[Sensors Usage Example](subsys-sensor-demo.md)** +- **[Sensor Usage Example](subsys-sensor-demo.md)** -- Gitee From cf978181ed3a4a05c7e44dd0c820b2bf36925cb2 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:29:36 +0800 Subject: [PATCH 099/282] updated docs Signed-off-by: wusongqing --- en/website-directory.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/en/website-directory.md b/en/website-directory.md index 154190c39d7..408d2993c0e 100644 --- a/en/website-directory.md +++ b/en/website-directory.md @@ -722,13 +722,13 @@ ——>——>——>——>——> [KWS Configuration File](device-dev/subsystems/subsys-aiframework-demo-conf.md) -——>——>——> [Sensors](device-dev/subsystems/subsys-sensor.md) +——>——>——> [Sensor](device-dev/subsystems/subsys-sensor.md) -——>——>——>——> [Sensors Overview](device-dev/subsystems/subsys-sensor-overview.md) +——>——>——>——> [Sensor Overview](device-dev/subsystems/subsys-sensor-overview.md) -——>——>——>——> [Sensors Usage Guidelines](device-dev/subsystems/subsys-sensor-guide.md) +——>——>——>——> [Sensor Usage Guidelines](device-dev/subsystems/subsys-sensor-guide.md) -——>——>——>——> [Sensors Usage Example](device-dev/subsystems/subsys-sensor-demo.md) +——>——>——>——> [Sensor Usage Example](device-dev/subsystems/subsys-sensor-demo.md) ——>——>——> [Application Framework](device-dev/subsystems/subsys-application-framework.md) -- Gitee From 6658f8baac9a46e49d86a96b85af09d7871bd58e Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:35:10 +0800 Subject: [PATCH 100/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-Context.md | 52 +- .../reference/apis/js-apis-DataUriUtils.md | 10 +- .../apis/js-apis-dataAbilityHelper.md | 594 ++++++++---------- .../apis/js-apis-service-extension-context.md | 24 +- .../apis/js-apis-service-extension.md | 24 +- .../apis/js-apis-dataAbilityHelper.md | 8 +- 6 files changed, 346 insertions(+), 366 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-Context.md b/en/application-dev/reference/apis/js-apis-Context.md index 3687d1cea22..57a9f803f3f 100644 --- a/en/application-dev/reference/apis/js-apis-Context.md +++ b/en/application-dev/reference/apis/js-apis-Context.md @@ -63,8 +63,8 @@ If this method is called for the first time, a root directory is created. ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getOrCreateLocalDir().then((void) => { - console.info("==========================>getOrCreateLocalDirCallback=======================>"); +context.getOrCreateLocalDir().then((data) => { + console.info("data=" + data); }); ``` @@ -91,9 +91,9 @@ Verifies whether a specific PID and UID have the given permission. This method u import featureAbility from '@ohos.ability.featureAbility' import bundle from '@ohos.bundle' var context = featureAbility.getContext(); -var datainfo = await bundle.getBundleInfo('com.context.test',1); -context.verifyPermission("com.example.permission",datainfo.uid) - +bundle.getBundleInfo('com.context.test', 1, (datainfo) =>{ + context.verifyPermission("com.example.permission", datainfo.uid); +}); ``` @@ -146,8 +146,9 @@ Verifies whether a specific PID and UID have the given permission. This method u import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); var Permission = context.PermissionOptions(1,1); -context.getOrCreateLocalDir('com.context.permission',Permission).then((void) => { - console.info("==========================>verifyPermissionCallback=======================>"); +context.verifyPermission('com.context.permission',Permission).then((data) => { + console.info("======================>verifyPermissionCallback====================>"); + console.info("====>data====>" + JSON.stringify(data)); }); ``` @@ -172,13 +173,16 @@ Requests certain permissions from the system. This method uses a callback to ret ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getOrCreateLocalDir( +context.requestPermissionsFromUser( ["com.example.permission1", "com.example.permission2", "com.example.permission3", "com.example.permission4", "com.example.permission5"], - 1, + 1,(err, data)=>{ + console.info("====>requestdata====>" + JSON.stringify(data)); + console.info("====>requesterrcode====>" + JSON.stringify(err.code)); + } ) ``` @@ -223,8 +227,9 @@ Obtains information about the current application. This method uses a promise to ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getApplicationInfo().then((void) => { - console.info("==========================>getApplicationInfoCallback=======================>"); +context.getApplicationInfo().then((data) => { + console.info("=====================>getApplicationInfoCallback===================>"); + console.info("====>data====>" + JSON.stringify(data)); }); ``` @@ -269,8 +274,9 @@ Obtains the bundle name of the current ability. This method uses a promise to re ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getBundleName().then((void) => { - console.info("==========================>getBundleNameCallback=======================>"); +context.getBundleName().then((data) => { + console.info("=======================>getBundleNameCallback====================>"); + console.info("====>data====>" + JSON.stringify(data)); }); ``` @@ -315,8 +321,9 @@ Obtains information about the current process, including the PID and process nam ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getProcessInfo().then((void) => { - console.info("==========================>getProcessInfoCallback=======================>"); +context.getProcessInfo().then((data) => { + console.info("=======================>getProcessInfoCallback====================>"); + console.info("====>data====>" + JSON.stringify(data)); }); ``` @@ -365,8 +372,9 @@ This method is available only to Page abilities. ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getElementName().then((void) => { - console.info("==========================>getElementNameCallback=======================>"); +context.getElementName().then((data) => { + console.info("=======================>getElementNameCallback====================>"); + console.info("====>data====>" + JSON.stringify(data)); }); ``` @@ -407,8 +415,9 @@ Obtains the name of the current process. This method uses a promise to return th ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getProcessName().then((void) => { - console.info("==========================>getProcessNameCallback=======================>"); +context.getProcessName().then((data) => { + console.info("=======================>getProcessNameCallback====================>"); + console.info("====>data====>" + JSON.stringify(data)); }); ``` @@ -453,8 +462,9 @@ Obtains the bundle name of the calling ability. This method uses a promise to re ```js import featureAbility from '@ohos.ability.featureAbility' var context = featureAbility.getContext(); -context.getCallingBundle().then((void) => { - console.info("==========================>getCallingBundleCallback=======================>"); +context.getCallingBundle().then((data) => { + console.info("======================>getCallingBundleCallback====================>"); + console.info("====>data====>" + JSON.stringify(data)); }); ``` diff --git a/en/application-dev/reference/apis/js-apis-DataUriUtils.md b/en/application-dev/reference/apis/js-apis-DataUriUtils.md index 4aa00cd0b3c..b45c839bc40 100644 --- a/en/application-dev/reference/apis/js-apis-DataUriUtils.md +++ b/en/application-dev/reference/apis/js-apis-DataUriUtils.md @@ -27,7 +27,6 @@ Obtains the ID attached to the end of a given URI. **Example** ```js -import dataUriUtils from '@ohos.ability.datauriutils' dataUriUtils.getIdSync("com.example.dataUriUtils/1221") ``` @@ -55,10 +54,9 @@ Attaches an ID to the end of a given URI. **Example** ```js -import dataUriUtils from '@ohos.ability.datauriutils' var idint = 1122; dataUriUtils.attachId( - "com.example.dataUriUtils" + "com.example.dataUriUtils", idint, ) ``` @@ -85,7 +83,6 @@ Deletes the ID from the end of a given URI. **Example** ```js -import dataUriUtils from '@ohos.ability.datauriutils' dataUriUtils.deleteId("com.example.dataUriUtils/1221") ``` @@ -112,10 +109,9 @@ Updates the ID in a given URI. **Example** ```js -import dataUriUtils from '@ohos.ability.datauriutils' var idint = 1122; dataUriUtils.updateId( - "com.example.dataUriUtils" - idint, + "com.example.dataUriUtils", + idint ) ``` diff --git a/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md b/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md index dc09e186854..75adfb3f60a 100644 --- a/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md +++ b/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md @@ -1,6 +1,6 @@ # DataAbilityHelper Module (JavaScript SDK APIs) -#### Modules to Import +## Modules to Import ``` import featureAbility from '@ohos.ability.featureAbility' @@ -8,26 +8,23 @@ import ohos_data_ability from '@ohos.data.dataability' import ohos_data_rdb from '@ohos.data.rdb' ``` -#### DataAbilityHelper.openFile(uri: string, mode: string, callback: AsyncCallback\) +## DataAbilityHelper -- Functionality +### openFile - Opens a file with a specified URI. This method uses a callback to return the result. +openFile(uri: string, mode: string, callback: AsyncCallback\): void +Opens a file with a specified URI. This method uses a callback to return the result. -* Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | -------- | -------- | -------------------- | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the file to open.| - | mode | Read-only| string | Yes| Mode for opening the file. The value can be **rwt**.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | ---------------------- | ---- | ---------------------------------- | +| uri | string | Yes| URI of the file to open.| +| mode | string | Yes| Mode for opening the file. The value can be **rwt**.| +| callback | AsyncCallback\ | Yes| Callback used to return the file descriptor.| -* Return values - - Returns a file descriptor. - -* Example +**Example** ```javascript import featureAbility from '@ohos.ability.featureAbility' @@ -43,24 +40,25 @@ DAHelper.openFile( }); ``` -#### DataAbilityHelper.openFile(uri: string, mode: string) - -- Functionality +### openFile - Opens a file with a specified URI. This method uses a promise to return the result. +openFile(uri: string, mode: string): Promise\ -* Parameters +Opens a file with a specified URI. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ---- | -------- | ------ | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the file to open.| - | mode | Read-only| string | Yes| Mode for opening the file. The value can be **rwt**.| +**Parameters** -* Return values +| Name| Type| Mandatory| Description| +| ---- | ------ | ---- | ------------------------ | +| uri | string | Yes| URI of the file to open.| +| mode | string | Yes| Mode for opening the file. The value can be **rwt**.| - Returns a file descriptor. +**Return value** +| Type| Description| +| ---------------- | ---------------- | +| Promise\ | Promise used to return the file descriptor.| -* Example +**Example** ```javascript import featureAbility from '@ohos.ability.featureAbility' @@ -70,30 +68,26 @@ var DAHelper = featureAbility.acquireDataAbilityHelper( var mode = "rwt"; DAHelper.openFile( "dataability:///com.example.DataAbility", - mode).then((void) => { + mode).then((data) => { console.info("==========================>openFileCallback=======================>"); }); ``` -#### DataAbilityHelper.on(type: 'dataChange', uri: string, callback: AsyncCallback\) - -- Functionality - - Registers an observer to observe data specified by a given URI. This method uses a callback to return the result. +### on('dataChange') -- Parameters +on(type: 'dataChange', uri: string, callback: AsyncCallback\): void - | Name| Readable/Writable| Type| Mandatory| Description| - | -------- | -------- | -------------------- | ---- | ------------------------ | - | type | Read-only| string | Yes| Type of the event to observe. The value is **dataChange**.| - | uri | Read-only| string | Yes| URI of the data.| - | callback | Read-only| AsyncCallback\ | Yes| Callback invoked when the data is changed.| +Registers an observer to observe data specified by a given URI. This method uses a callback to return the result. -- Return value +**Parameters** - void +| Name| Type| Mandatory| Description| +| -------- | -------------------- | ---- | ------------------------ | +| type | string | Yes| Type of the event to observe. The value is **dataChange**.| +| uri | string | Yes| URI of the data.| +| callback | AsyncCallback\ | Yes| Callback invoked when the data is changed.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -110,25 +104,21 @@ helper.on( ) ``` -#### DataAbilityHelper.off(type: 'dataChange', uri: string, callback?: AsyncCallback\) +### off('dataChange') -- Functionality +off(type: 'dataChange', uri: string, callback?: AsyncCallback\): void - Unregisters the observer used to observe data specified by a given URI. This method uses a callback to return the result. +Unregisters the observer used to observe data specified by a given URI. This method uses a callback to return the result. -- Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | -------- | -------- | -------------------- | ---- | ------------------------ | - | type | Read-only| string | Yes| Type of the event to observe. The value is **dataChange**.| - | uri | Read-only| string | Yes| URI of the data.| - | callback | Read-only| AsyncCallback\ | No| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | -------------------- | ---- | ------------------------ | +| type | string | Yes| Type of the event to observe. The value is **dataChange**.| +| uri | string | Yes| URI of the data.| +| callback | AsyncCallback\ | No| Callback used to return the result.| -- Return value - - void - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -149,24 +139,20 @@ helper.off( ) ``` -#### DataAbilityHelper.getType(uri: string, callback: AsyncCallback\) - -- Functionality +### getType - Obtains the MIME type of the data specified by a given URI. This method uses a callback to return the result. +getType(uri: string, callback: AsyncCallback\): void -- Parameters +Obtains the MIME type of the data specified by a given URI. This method uses a callback to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | -------- | -------- | ---------------------- | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the data.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| -------- | ---------------------- | ---- | --------------------------------------------- | +| uri | string | Yes| URI of the data.| +| callback | AsyncCallback\ | Yes| Callback used to return the MIME type.| - Returns the MIME type that matches the data specified by the URI. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -180,23 +166,24 @@ DAHelper.getType( }); ``` -#### DataAbilityHelper.getType(uri: string) - -- Functionality +### getType - Obtains the MIME type of the data specified by a given URI. This method uses a promise to return the result. +getType(uri: string): Promise\ -- Parameters +Obtains the MIME type of the data specified by a given URI. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ---- | -------- | ------ | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the data.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ---- | ------ | ---- | ------------------------ | +| uri | string | Yes| URI of the data.| - Returns the MIME type that matches the data specified by the URI. +**Return value** +| Type| Description| +| ---------------- | ----------------------------------- | +| Promise\ | Promise used to return the MIME type.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -210,25 +197,21 @@ DAHelper.getType( }); ``` -#### DataAbilityHelper.getFileTypes(uri: string, mimeTypeFilter: string, callback: AsyncCallback>) +### getFileTypes -- Functionality +getFileTypes(uri: string, mimeTypeFilter: string, callback: AsyncCallback>): void - Obtains the supported MIME types of a specified file. This method uses a callback to return the result. +Obtains the supported MIME types of a specified file. This method uses a callback to return the result. -- Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | -------------- | -------- | ------------------------------ | ---- | ---------------------------- | - | uri | Read-only| string | Yes| URI of the file.| - | mimeTypeFilter | Read-only| string | Yes| MIME type of the file.| - | callback | Read-only| AsyncCallback\> | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------------- | ------------------------------ | ---- | ---------------------------------- | +| uri | string | Yes| URI of the file.| +| mimeTypeFilter | string | Yes| MIME type of the file.| +| callback | AsyncCallback\> | Yes| Callback used to return the supported MIME types.| -- Return value - - Returns a MIME type array. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -243,24 +226,27 @@ DAHelper.getFileTypes( }); ``` -#### DataAbilityHelper.getFileTypes(uri: string, mimeTypeFilter: string) -- Functionality - Obtains the supported MIME types of a specified file. This method uses a promise to return the result. +### getFileTypes + +getFileTypes(uri: string, mimeTypeFilter: string): Promise\> -- Parameters +Obtains the supported MIME types of a specified file. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | -------------- | -------- | ------ | ---- | ---------------------------- | - | uri | Read-only| string | Yes| URI of the file.| - | mimeTypeFilter | Read-only| string | Yes| MIME type of the file.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| -------------- | ------ | ---- | ---------------------------- | +| uri | string | Yes| URI of the file.| +| mimeTypeFilter | string | Yes| MIME type of the file.| - Returns a MIME type array. +**Return value** +| Type| Description| +| ------------------------ | ------------------------ | +| Promise\> | Promise used to return the supported MIME types.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -275,24 +261,20 @@ DAHelper.getFileTypes( }); ``` -#### DataAbilityHelper.normalizeUri(uri: string, callback: AsyncCallback\) - -- Functionality - - Converts the URI that refers to a Data ability into a normalized URI. This method uses a callback to return the result. +### normalizeUri -- Parameters +normalizeUri(uri: string, callback: AsyncCallback\): void - | Name| Readable/Writable| Type| Mandatory| Description| - | -------- | -------- | ---------------------- | ---- | ----------------------- | - | uri | Read-only| string | Yes| URI object to normalize.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +Converts the URI that refers to a Data ability into a normalized URI. This method uses a callback to return the result. -- Return value +**Parameters** - Returns the normalized URI object if the Data ability supports URI normalization; returns **null** otherwise. +| Name| Type| Mandatory| Description| +| -------- | ---------------------- | ---- | ------------------------------------------------------------ | +| uri | string | Yes| URI object to normalize.| +| callback | AsyncCallback\ | Yes| Callback used to return the normalized URI object if the Data ability supports URI normalization. If the Data ability does not support URI normalization, **null** is returned.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -306,23 +288,24 @@ DAHelper.normalizeUri( }); ``` -#### DataAbilityHelper.normalizeUri(uri: string) +### normalizeUri -- Functionality +normalizeUri(uri: string): Promise\ - Converts the URI that refers to a Data ability into a normalized URI. This method uses a promise to return the result. +Converts the URI that refers to a Data ability into a normalized URI. This method uses a promise to return the result. -- Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | ---- | -------- | ------ | ---- | ----------------------- | - | uri | Read-only| string | Yes| URI object to normalize.| +| Name| Type| Mandatory| Description| +| ---- | ------ | ---- | ----------------------- | +| uri | string | Yes| URI object to normalize.| -- Return value +**Return value** +| Type| Description| +| ---------------- | ------------------------------------------------------ | +| Promise\ | Promise used to return the normalized URI object if the Data ability supports URI normalization. If the Data ability does not support URI normalization, **null** is returned.| - Returns the normalized URI object if the Data ability supports URI normalization; returns **null** otherwise. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -336,24 +319,20 @@ DAHelper.normalizeUri( }); ``` -#### DataAbilityHelper.denormalizeUri(uri: string, callback: AsyncCallback\) - -- Functionality - - Converts a normalized URI generated by **DataAbilityHelper.normalizeUri(uri: string, callback: AsyncCallback\)** to a denormalized one. This method uses a callback to return the result. +### denormalizeUri -- Parameters +denormalizeUri(uri: string, callback: AsyncCallback\): void - | Name| Readable/Writable| Type| Mandatory| Description| - | -------- | -------- | ---------------------- | ---- | ----------------------- | - | uri | Read-only| string | Yes| URI object to denormalize.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +Converts a normalized URI generated by **DataAbilityHelper.normalizeUri(uri: string, callback: AsyncCallback\)** to a denormalized one. This method uses a callback to return the result. -- Return value +**Parameters** - Returns the denormalized URI object. +| Name| Type| Mandatory| Description| +| -------- | ---------------------- | ---- | --------------------------------------------------- | +| uri | string | Yes| URI object to normalize.| +| callback | AsyncCallback\ | Yes| Callback used to return the denormalized URI object.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -361,29 +340,32 @@ var DAHelper = featureAbility.acquireDataAbilityHelper( "dataability:///com.example.DataAbility" ); DAHelper.denormalizeUri( - "dataability:///com.example.DataAbility",, + "dataability:///com.example.DataAbility", (err, data) => { console.info("==========================>Called=======================>"); }); ``` -#### DataAbilityHelper.denormalizeUri(uri: string) -- Functionality - Converts a normalized URI generated by **DataAbilityHelper.normalizeUri(uri: string)** to a denormalized one. This method uses a promise to return the result. +### denormalizeUri + +denormalizeUri(uri: string): Promise\ -- Parameters +Converts a normalized URI generated by **DataAbilityHelper.normalizeUri(uri: string)** to a denormalized one. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ---- | -------- | ------ | ---- | ----------------------- | - | uri | Read-only| string | Yes| URI object to denormalize.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ---- | ------ | ---- | ----------------------- | +| uri | string | Yes| URI object to normalize.| - Returns the denormalized URI object. +**Return value** +| Type| Description| +| ---------------- | ----------------------------------------- | +| Promise\ | Promise used to return the denormalized URI object.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -397,24 +379,20 @@ DAHelper.denormalizeUri( }); ``` -#### DataAbilityHelper.notifyChange(uri: string, callback: AsyncCallback\) +### notifyChange -- Functionality +notifyChange(uri: string, callback: AsyncCallback\): void - Notifies the registered observer of a change to the data specified by the URI. This method uses a callback to return the result. +Notifies the registered observer of a change to the data specified by the URI. This method uses a callback to return the result. -- Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | -------- | -------- | -------------------- | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the data.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| -------- | -------------------- | ---- | ------------------------ | +| uri | string | Yes| URI of the data.| +| callback | AsyncCallback\ | Yes| Callback used to return the result.| -- Return value - - void - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -422,29 +400,30 @@ var helper = featureAbility.acquireDataAbilityHelper( "dataability:///com.example.DataAbility" ); helper.notifyChange( - "dataability:///com.example.DataAbility",, + "dataability:///com.example.DataAbility", (err) => { console.info("==========================>Called=======================>"); }); ``` -#### DataAbilityHelper.notifyChange(uri: string) +### notifyChange -- Functionality +notifyChange(uri: string): Promise\ - Notifies the registered observer of a change to the data specified by the URI. This method uses a promise to return the result. +Notifies the registered observer of a change to the data specified by the URI. This method uses a promise to return the result. -- Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | ---- | -------- | ------ | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the data.| +| Name| Type| Mandatory| Description| +| ---- | ------ | ---- | ------------------------ | +| uri | string | Yes| URI of the data.| -- Return value +**Return value** +| Type| Description| +| -------------- | --------------------- | +| Promise\ | Promise used to return the result.| - void - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -453,30 +432,26 @@ var DAHelper = featureAbility.acquireDataAbilityHelper( ); DAHelper.notifyChange( "dataability:///com.example.DataAbility", - ).then((void) => { + ).then(() => { console.info("==========================>notifyChangeCallback=======================>"); }); ``` -#### DataAbilityHelper.insert(uri: string, valuesBucket: rdb.ValuesBucket, callback: AsyncCallback\) - -- Functionality +### insert - Inserts a single data record into the database. This method uses a callback to return the result. +insert(uri: string, valuesBucket: rdb.ValuesBucket, callback: AsyncCallback\): void -- Parameters +Inserts a single data record into the database. This method uses a callback to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | ---------------------- | ---- | ------------------------------------------------------ | - | uri | Read-only| string | Yes| URI of the data to insert.| - | valuesBucket | Read-only| rdb.ValuesBucket | Yes| Data record to insert. If this parameter is **null**, a blank row will be inserted.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ------------ | ---------------------- | ---- | ------------------------------------------------------ | +| uri | string | Yes| URI of the data to insert.| +| valuesBucket | rdb.ValuesBucket | Yes| Data record to insert. If this parameter is **null**, a blank row will be inserted.| +| callback | AsyncCallback\ | Yes| Callback used to return the index of the inserted data record.| - Returns the index of the inserted data record. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -497,24 +472,25 @@ DAHelper.insert( }); ``` -#### DataAbilityHelper.insert(uri: string, valuesBucket: rdb.ValuesBucket) - -- Functionality +### insert - Inserts a single data record into the database. This method uses a promise to return the result. +insert(uri: string, valuesBucket: rdb.ValuesBucket): Promise\ -- Parameters +Inserts a single data record into the database. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | ---------------- | ---- | ------------------------------------------------------ | - | uri | Read-only| string | Yes| URI of the data to insert.| - | valuesBucket | Read-only| rdb.ValuesBucket | Yes| Data record to insert. If this parameter is **null**, a blank row will be inserted.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ------------ | ---------------- | ---- | ------------------------------------------------------ | +| uri | string | Yes| URI of the data to insert.| +| valuesBucket | rdb.ValuesBucket | Yes| Data record to insert. If this parameter is **null**, a blank row will be inserted.| - Returns the index of the inserted data record. +**Return value** +| Type| Description| +| ---------------- | ------------------------ | +| Promise\ | Promise used to return the index of the inserted data record.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -535,25 +511,21 @@ DAHelper.insert( }); ``` -#### DataAbilityHelper.batchInsert(uri: string, valuesBuckets: Array, callback: AsyncCallback\) - -- Functionality +### batchInsert - Inserts multiple data records into the database. This method uses a callback to return the result. +batchInsert(uri: string, valuesBuckets: Array, callback: AsyncCallback\): void -- Parameters +Inserts multiple data records into the database. This method uses a callback to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | ----------------------- | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the data to insert.| - | valuesBucket | Read-only| Array | Yes| Data records to insert.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ------------ | ----------------------- | ---- | -------------------------------- | +| uri | string | Yes| URI of the data to insert.| +| valuesBucket | Array | Yes| Data records to insert.| +| callback | AsyncCallback\ | Yes| Callback used to return the number of inserted data records.| - Returns the number of inserted data records. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -571,24 +543,25 @@ DAHelper.batchInsert( }); ``` -#### DataAbilityHelper.batchInsert(uri: string, valuesBuckets: Array) - -- Functionality +### batchInsert - Inserts multiple data records into the database. This method uses a promise to return the result. +batchInsert(uri: string, valuesBuckets: Array): Promise\ -- Parameters +Inserts multiple data records into the database. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | ----------------------- | ---- | ------------------------ | - | uri | Read-only| string | Yes| URI of the data to insert.| - | valuesBucket | Read-only| Array | Yes| Data records to insert.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ------------ | ----------------------- | ---- | ------------------------ | +| uri | string | Yes| URI of the data to insert.| +| valuesBucket | Array | Yes| Data record to insert.| - Returns the number of inserted data records. +**Return value** +| Type| Description| +| ---------------- | ---------------------- | +| Promise\ | Promise used to return the number of inserted data records.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -606,25 +579,21 @@ DAHelper.batchInsert( }); ``` -#### DataAbilityHelper.delete(uri: string, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) +### delete -- Functionality +delete(uri: string, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\): void - Deletes one or more data records from the database. This method uses a callback to return the result. +Deletes one or more data records from the database. This method uses a callback to return the result. -- Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | - | uri | Read-only| string | Yes| URI of the data to delete.| - | valuesBucket | Read-only| dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +| Name| Type| Mandatory| Description| +| ------------ | --------------------------------- | ---- | ------------------------------------------------ | +| uri | string | Yes| URI of the data to delete.| +| valuesBucket | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +| callback | AsyncCallback\ | Yes| Callback used to return the number of deleted data records.| -- Return value - - Returns the number of deleted data records. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -641,24 +610,25 @@ DAHelper.delete( }); ``` -#### DataAbilityHelper.delete(uri: string, predicates: dataAbility.DataAbilityPredicates) - -- Functionality +### delete - Deletes one or more data records from the database. This method uses a promise to return the result. +delete(uri: string, predicates: dataAbility.DataAbilityPredicates): Promise\ -- Parameters +Deletes one or more data records from the database. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | - | uri | Read-only| string | Yes| URI of the data to delete.| - | valuesBucket | Read-only| dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ------------ | --------------------------------- | ---- | ------------------------------------------------ | +| uri | string | Yes| URI of the data to delete.| +| valuesBucket | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| - Returns the number of deleted data records. +**Return value** +| Type| Description| +| ---------------- | ------------------------ | +| Promise\ | Promise used to return the number of deleted data records.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -674,26 +644,22 @@ DAHelper.delete( }); ``` -#### DataAbilityHelper.update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) - -- Functionality - - Updates data records in the database. This method uses a callback to return the result. +### update -- Parameters +update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\): void - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | - | uri | Read-only| string | Yes| URI of the data to update.| - | valuesBucket | Read-only| rdb.ValuesBucket | Yes| New values.| - | predicates | Read-only| dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +Updates data records in the database. This method uses a callback to return the result. -- Return value +**Parameters** - Returns the number of updated data records. +| Name| Type| Mandatory| Description| +| ------------ | --------------------------------- | ---- | ------------------------------------------------ | +| uri | string | Yes| URI of the data to update.| +| valuesBucket | rdb.ValuesBucket | Yes| New values.| +| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +| callback | AsyncCallback\ | Yes| Callback used to return the number of updated data records.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -717,25 +683,26 @@ DAHelper.update( }); ``` -#### DataAbilityHelper.update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates) +### update -- Functionality +update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates): Promise\ - Updates data records in the database. This method uses a promise to return the result. +Updates data records in the database. This method uses a promise to return the result. -- Parameters +**Parameters** - | Name| Readable/Writable| Type| Mandatory| Description| - | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | - | uri | Read-only| string | Yes| URI of the data to update.| - | valuesBucket | Read-only| rdb.ValuesBucket | Yes| New values.| - | predicates | Read-only| dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +| Name| Type| Mandatory| Description| +| ------------ | --------------------------------- | ---- | ------------------------------------------------ | +| uri | string | Yes| URI of the data to update.| +| valuesBucket | rdb.ValuesBucket | Yes| New values.| +| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| -- Return value +**Return value** +| Type| Description| +| ---------------- | -------------------------------------------- | +| Promise\ | Promise used to return the number of updated data records.| - Returns the number of updated data records. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -759,26 +726,22 @@ DAHelper.update( }); ``` -#### DataAbilityHelper.query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) - -- Functionality +### query - Queries data in the database. This method uses a callback to return the result. +query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\): void -- Parameters +Queries data in the database. This method uses a callback to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ---------- | -------- | --------------------------------- | ---- | ------------------------------------------------ | - | uri | Read-only| string | Yes| URI of the data to query.| - | columns | Read-only| rdb.ValuesBucket | Yes| Columns to query. If this parameter is **null**, all columns will be queried.| - | predicates | Read-only| dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| - | callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ---------- | --------------------------------- | ---- | ------------------------------------------------ | +| uri | string | Yes| URI of the data to query.| +| columns | rdb.ValuesBucket | Yes| Columns to query. If this parameter is **null**, all columns will be queried.| +| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +| callback | AsyncCallback\ | Yes| Callback used to return the data queried.| - Returns the data queried. - -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -786,7 +749,7 @@ import ohos_data_ability from '@ohos.data.dataability' var DAHelper = featureAbility.acquireDataAbilityHelper( "dataability:///com.example.DataAbility" ); -var cars=new Array({"value1"}, {"value2"}, {"value3"}, {"value4"}); +var cars=new Array("value1", "value2", "value3", "value4"); let da = new ohos_data_ability.DataAbilityPredicates() DAHelper.query( "dataability:///com.example.DataAbility", @@ -799,25 +762,26 @@ DAHelper.query( -#### DataAbilityHelper.query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates) - -- Functionality +### query - Queries data in the database. This method uses a promise to return the result. +query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates): Promise\ -- Parameters +Queries data in the database. This method uses a promise to return the result. - | Name| Readable/Writable| Type| Mandatory| Description| - | ---------- | -------- | --------------------------------- | ---- | ------------------------------------------------ | - | uri | Readable and writable| string | Yes| URI of the data to query.| - | columns | Readable and writable| rdb.ValuesBucket | Yes| Columns to query. If this parameter is **null**, all columns will be queried.| - | predicates | Readable and writable| dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +**Parameters** -- Return value +| Name| Type| Mandatory| Description| +| ---------- | --------------------------------- | ---- | ------------------------------------------------ | +| uri | string | Yes| URI of the data to query.| +| columns | rdb.ValuesBucket | Yes| Columns to query. If this parameter is **null**, all columns will be queried.| +| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| - Returns the data queried. +**Return value** +| Type| Description| +| ------------------- | -------------- | +| Promise\ | Promise used to return the data queried.| -- Example +**Example** ```js import featureAbility from '@ohos.ability.featureAbility' @@ -825,7 +789,7 @@ import ohos_data_ability from '@ohos.data.dataability' var DAHelper = featureAbility.acquireDataAbilityHelper( "dataability:///com.example.DataAbility" ); -var cars=new Array({"value1"}, {"value2"}, {"value3"}, {"value4"}); +var cars=new Array("value1", "value2", "value3", "value4"); let da = new ohos_data_ability.DataAbilityPredicates() DAHelper.query( "dataability:///com.example.DataAbility", diff --git a/en/application-dev/reference/apis/js-apis-service-extension-context.md b/en/application-dev/reference/apis/js-apis-service-extension-context.md index fa46ef6df13..de067acf57d 100644 --- a/en/application-dev/reference/apis/js-apis-service-extension-context.md +++ b/en/application-dev/reference/apis/js-apis-service-extension-context.md @@ -1,6 +1,6 @@ # ServiceExtensionContext -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > The initial APIs of this module are supported since API 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -29,8 +29,8 @@ Starts an ability. This method uses a callback to return the result. "abilityName": "com.example.myapp.MyAbility" }; this.context.startAbility(want, (err) => { - console.log('startAbility result:' + JSON.stringfy(err); - } + console.log('startAbility result:' + JSON.stringfy(err)); + }); ``` @@ -58,7 +58,7 @@ Starts an ability. This method uses a promise to return the result. }; this.context.startAbility(want).then((data) => { console.log('success:' + JSON.stringfy(data)); - )).catch((error) => { + }).catch((error) => { console.log('failed:' + JSON.stringfy(error)); }); ``` @@ -78,8 +78,8 @@ Terminates this ability. This method uses a callback to return the result. - Example ``` this.context.terminateSelf((err) => { - console.log('terminateSelf result:' + JSON.stringfy(err); - } + console.log('terminateSelf result:' + JSON.stringfy(err)); + }); ``` @@ -98,7 +98,7 @@ Terminates this ability. This method uses a promise to return the result. ``` this.context.terminateSelf(want).then((data) => { console.log('success:' + JSON.stringfy(data)); - )).catch((error) => { + }).catch((error) => { console.log('failed:' + JSON.stringfy(error)); }); ``` @@ -128,8 +128,8 @@ Connects this ability to a Service ability. "abilityName": "com.example.myapp.MyAbility" }; let options = { - onConnect: function(elementName, proxy) {} - onDisConnect: function(elementName) {} + onConnect: function(elementName, proxy) {}, + onDisConnect: function(elementName) {}, onFailed: function(code) {} } let connection = this.context.connectAbility(want,options); @@ -151,8 +151,8 @@ Disconnects this ability from the Service ability. This method uses a callback t - Example ``` this.context.disconnectAbility(connection, (err) => { // connection is the return value of connectAbility. - console.log('terminateSelf result:' + JSON.stringfy(err); - } + console.log('terminateSelf result:' + JSON.stringfy(err)); + }); ``` @@ -176,7 +176,7 @@ Disconnects this ability from the Service ability. This method uses a promise to ``` this.context.disconnectAbility(connection).then((data) => { // connection is the return value of connectAbility. console.log('success:' + JSON.stringfy(data)); - )).catch((error) => { + }).catch((error) => { console.log('failed:' + JSON.stringfy(error)); }); ``` diff --git a/en/application-dev/reference/apis/js-apis-service-extension.md b/en/application-dev/reference/apis/js-apis-service-extension.md index 22f46948c07..3696ec05ec8 100644 --- a/en/application-dev/reference/apis/js-apis-service-extension.md +++ b/en/application-dev/reference/apis/js-apis-service-extension.md @@ -1,6 +1,6 @@ # ServiceExtension -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > The initial APIs of this module are supported since API 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -39,8 +39,10 @@ Called when an extension is created to initialize the service logic. - Example ``` - onCreate(want) { + class ServiceExt extends ServiceExtension { + onCreate(want) { console.log('onCreate, want:' + want.abilityName); + } } ``` @@ -53,9 +55,10 @@ Called when this extension is destroyed to clear resources. - Example ``` - onDestroy() { + class ServiceExt extends ServiceExtension { + onDestroy() { console.log('onDestroy'); - destory(); + } } ``` @@ -74,8 +77,10 @@ Called after **onCreate** is invoked when an ability is started by calling **sta - Example ``` - onRequest(want: Want, startId: number) { + class ServiceExt extends ServiceExtension { + onRequest(want, startId) { console.log('onRequest, want:' + want.abilityName); + } } ``` @@ -106,10 +111,11 @@ Called after **onCreate** is invoked when an ability is started by calling **con onRemoteRequest(code, data, reply, option) { } } - ... - onConnect(want) { + class ServiceExt extends ServiceExtension { + onConnect(want) { console.log('onConnect , want:' + want.abilityName); return new StubTest("test"); + } } ``` @@ -127,7 +133,9 @@ Called when the ability is disconnected. - Example ``` - onDisconnect(want) { + class ServiceExt extends ServiceExtension { + onDisconnect(want) { console.log('onDisconnect, want:' + want.abilityName); + } } ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md index 3c0e4627e4c..7985887426e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md +++ b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md @@ -44,6 +44,8 @@ DAHelper.openFile( openFile(uri: string, mode: string): Promise\ +在指定的远程路径中打开文件(promise形式)。 + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -270,7 +272,7 @@ normalizeUri(uri: string, callback: AsyncCallback\): void | 名称 | 类型 | 必填 | 描述 | | -------- | ---------------------- | ---- | ------------------------------------------------------------ | | uri | string | 是 | 指示要规范化的uri对象。 | -| callback | AsyncCallback\ | 是 | 回调方法。如果数据功能支持uri规范化或null,则返回规范化uri对象。 | +| callback | AsyncCallback\ | 是 | 回调方法。如果数据功能支持uri规范化,则返回规范化uri对象;否则返回null。 | **示例:** @@ -301,7 +303,7 @@ normalizeUri(uri: string): Promise\ **返回值:** | 类型 | 说明 | | ---------------- | ------------------------------------------------------ | -| Promise\ | 如果数据功能支持uri规范化或null,则返回规范化uri对象。 | +| Promise\ | 如果数据功能支持uri规范化,则返回规范化uri对象;否则返回null。 | **示例:** @@ -698,7 +700,7 @@ update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.Data **返回值:** | 类型 | 说明 | | ---------------- | -------------------------------------------- | -| Promise\ | 返回值为Promise对象,Promise中包含应用信息。 | +| Promise\ | 返回更新的数据记录数。 | **示例:** -- Gitee From 287b9999411923f787e5ac55a5229e8dfb7df51e Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:40:18 +0800 Subject: [PATCH 101/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-formextension.md | 80 +++++++++++-------- 1 file changed, 46 insertions(+), 34 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-formextension.md b/en/application-dev/reference/apis/js-apis-formextension.md index 3368ad16eb8..ee3e0f92b41 100644 --- a/en/application-dev/reference/apis/js-apis-formextension.md +++ b/en/application-dev/reference/apis/js-apis-formextension.md @@ -1,6 +1,6 @@ # FormExtension -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. Provides **FormExtension** APIs. @@ -42,14 +42,16 @@ Called to notify the widget provider that a **Form** instance (widget) has been - Example ``` - onCreate(want) { - console.log('FormExtension onCreate, want:' + want.abilityName); - let dataObj1 = { - temperature:"11c", - "time":"11:00" - }; - let obj1 = formBindingData.createFormBindingData(dataObj1); - return obj1; + export default class MyFormExtension extends FormExtension { + onCreate(want) { + console.log('FormExtension onCreate, want:' + want.abilityName); + let dataObj1 = { + temperature:"11c", + "time":"11:00" + }; + let obj1 = formBindingData.createFormBindingData(dataObj1); + return obj1; + } } ``` @@ -68,8 +70,10 @@ Called to notify the widget provider that a temporary widget has been converted - Example ``` - onCastToNormal(formId) { - console.log('FormExtension onCastToNormal, formId:' + formId); + export default class MyFormExtension extends FormExtension { + onCastToNormal(formId) { + console.log('FormExtension onCastToNormal, formId:' + formId); + } } ``` @@ -88,14 +92,16 @@ Called to notify the widget provider that a widget has been updated. After obtai - Example ``` - onUpdate(formId) { - console.log('FormExtension onUpdate, formId:' + formId); - let obj2 = formBindingData.createFormBindingData({temperature:"22c", time:"22:00"}); - this.context.updateForm(formId, obj2) - .then((data)=>{ - console.log('FormExtension context updateForm, data:' + data); - }).catch((error) => { - console.error('Operation updateForm failed. Cause: ' + error);}); + export default class MyFormExtension extends FormExtension { + onUpdate(formId) { + console.log('FormExtension onUpdate, formId:' + formId); + let obj2 = formBindingData.createFormBindingData({temperature:"22c", time:"22:00"}); + this.context.updateForm(formId, obj2) + .then((data)=>{ + console.log('FormExtension context updateForm, data:' + data); + }).catch((error) => { + console.error('Operation updateForm failed. Cause: ' + error);}); + } } ``` @@ -114,17 +120,19 @@ Called to notify the widget provider of the change of visibility. - Example ``` - onVisibilityChange(newStatus) { - console.log('FormExtension onVisibilityChange, newStatus:' + newStatus); - let obj2 = formBindingData.createFormBindingData({temperature:"22c", time:"22:00"}); - - for (let key in newStatus) { - console.log('FormExtension onVisibilityChange, key:' + key + ", value=" + newStatus[key]); - this.context.updateForm(key, obj2) - .then((data)=>{ - console.log('FormExtension context updateForm, data:' + data); - }).catch((error) => { - console.error('Operation updateForm failed. Cause: ' + error);}); + export default class MyFormExtension extends FormExtension { + onVisibilityChange(newStatus) { + console.log('FormExtension onVisibilityChange, newStatus:' + newStatus); + let obj2 = formBindingData.createFormBindingData({temperature:"22c", time:"22:00"}); + + for (let key in newStatus) { + console.log('FormExtension onVisibilityChange, key:' + key + ", value=" + newStatus[key]); + this.context.updateForm(key, obj2) + .then((data)=>{ + console.log('FormExtension context updateForm, data:' + data); + }).catch((error) => { + console.error('Operation updateForm failed. Cause: ' + error);}); + } } } ``` @@ -145,8 +153,10 @@ Called to instruct the widget provider to receive and process the widget event. - Example ``` - onEvent(formId, message) { - console.log('FormExtension onEvent, formId:' + formId + ", message:" + message); + export default class MyFormExtension extends FormExtension { + onEvent(formId, message) { + console.log('FormExtension onEvent, formId:' + formId + ", message:" + message); + } } ``` @@ -165,7 +175,9 @@ Called to notify the widget provider that a **Form** instance (widget) has been - Example ``` - onDestroy(formId) { - console.log('FormExtension onDestroy, formId:' + formId); + export default class MyFormExtension extends FormExtension { + onDestroy(formId) { + console.log('FormExtension onDestroy, formId:' + formId); + } } ``` -- Gitee From be6644cd4cb495c0373b5f4463a72146df8077e5 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:43:28 +0800 Subject: [PATCH 102/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-display.md | 120 +++++++++++++----- 1 file changed, 86 insertions(+), 34 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-display.md b/en/application-dev/reference/apis/js-apis-display.md index dd7e82d3265..5ca404121fd 100644 --- a/en/application-dev/reference/apis/js-apis-display.md +++ b/en/application-dev/reference/apis/js-apis-display.md @@ -1,9 +1,8 @@ # Display -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. - ## Modules to Import ``` @@ -11,24 +10,19 @@ import display from '@ohos.display'; ``` -## Required Permissions - -None - - ## DisplayState Provides the state of a display. | Name| Default Value| Description| | -------- | -------- | -------- | -| STATE_UNKNOWN | 0 | Unknown.| -| STATE_OFF | 1 | The display is shut down.| -| STATE_ON | 2 | The display is powered on.| -| STATE_DOZE | 3 | The display is in sleep mode.| -| STATE_DOZE_SUSPEND | 4 | The display is in sleep mode, and the CPU is suspended.| -| STATE_VR | 5 | The display is in VR mode.| -| STATE_ON_SUSPEND | 6 | The display is powered on, and the CPU is suspended.| +| STATE_UNKNOWN | 0 | Unknown.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| STATE_OFF | 1 | The display is shut down.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| STATE_ON | 2 | The display is powered on.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| STATE_DOZE | 3 | The display is in sleep mode.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| STATE_DOZE_SUSPEND | 4 | The display is in sleep mode, and the CPU is suspended.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| STATE_VR | 5 | The display is in VR mode.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| STATE_ON_SUSPEND | 6 | The display is powered on, and the CPU is suspended.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| ## Display @@ -37,31 +31,33 @@ Describes the attributes of a display. | Name| Type| Readable| Writable| Description| | -------- | -------- | -------- | -------- | -------- | -| id | number | Yes| No| ID of the display.| -| name | string | Yes| No| Name of the display.| -| alive | boolean | Yes| No| Whether the display is alive.| -| state | [DisplayState](#displaystate) | Yes| No| State of the display.| -| refreshRate | number | Yes| No| Refresh rate of the display.| -| rotation | number | Yes| No| Screen rotation angle of the display.| -| width | number | Yes| No| Width of the display, in pixels.| -| height | number | Yes| No| Height of the display, in pixels.| -| densityDPI | number | Yes| No| Screen density of the display, in DPI.| -| densityPixels | number | Yes| No| Screen density of the display, in pixels.| -| scaledDensity | number | Yes| No| Scaling factor for fonts displayed on the display.| -| xDPI | number | Yes| No| Exact physical dots per inch of the screen in the horizontal direction.| -| yDPI | number | Yes| No| Exact physical dots per inch of the screen in the vertical direction.| +| id | number | Yes| No| ID of the display.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| name | string | Yes| No| Name of the display.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| alive | boolean | Yes| No| Whether the display is alive.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| state | [DisplayState](#DisplayState) | Yes| No| State of the display.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| refreshRate | number | Yes| No| Refresh rate of the display.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| rotation | number | Yes| No| Screen rotation angle of the display.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| width | number | Yes| No| Width of the display, in pixels.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| height | number | Yes| No| Height of the display, in pixels.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| densityDPI | number | Yes| No| Screen density of the display, in DPI.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| densityPixels | number | Yes| No| Screen density of the display, in pixels.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| scaledDensity | number | Yes| No| Scaling factor for fonts displayed on the display.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| xDPI | number | Yes| No| Exact physical dots per inch of the screen in the horizontal direction.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| yDPI | number | Yes| No| Exact physical dots per inch of the screen in the vertical direction.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| ## display.getDefaultDisplay -getDefaultDisplay(callback: AsyncCallback<Display>): void; +getDefaultDisplay(callback: AsyncCallback<Display>): void Obtains the default display object. +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | - | callback | AsyncCallback<[Display](#display)> | Yes| Callback used to return the attributes of the default display.| + | callback | AsyncCallback<[Display](#Display)> | Yes| Callback used to return the default display object.| - Example ``` @@ -76,19 +72,47 @@ Obtains the default display object. }); ``` +## display.getDefaultDisplay + +getDefaultDisplay(): Promise<Display> + +Obtains the default display object. + +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + +- Return value + + | Type| Description| + | ---------------------------------- | ---------------------------------------------- | + | Promise<[Display](#Display)> | Promise used to return the default display object.| + +- Example + + ``` + let promise = display.getDefaultDisplay(); + promise.then(() => { + console.log('getDefaultDisplay success'); + }).catch((err) => { + console.log('getDefaultDisplay fail: ' + JSON.stringify(err)); + }); + ``` ## display.getAllDisplay -getAllDisplay(callback: AsyncCallback<Array<Display>>): void; +getAllDisplay(callback: AsyncCallback<Array<Display>>): void Obtains all the display objects. +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + - Parameters + | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | callback | AsyncCallback<Array<[Display](#display)>> | Yes| Callback used to return the attributes of all displays.| + | -------- | ---------------------------------------------------- | ---- | ------------------------------- | + | callback | AsyncCallback<Array<[Display](Display)>> | Yes| Callback used to return all the display objects.| - Example + ``` display.getAllDisplay((err, data) => { if (err) { @@ -99,13 +123,39 @@ Obtains all the display objects. }); ``` +## display.getAllDisplay + +getAllDisplay(): Promise<Array<Display>> + +Obtains all the display objects. + +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + +- Return value + + | Type| Description| + | ----------------------------------------------- | ------------------------------------------------------- | + | Promise<Array<[Display](#Display)>> | Promise used to return an array containing all the display objects.| + +- Example + + ``` + let promise = display.getAllDisplay(); + promise.then(() => { + console.log('getAllDisplay success'); + }).catch((err) => { + console.log('getAllDisplay fail: ' + JSON.stringify(err)); + }); + ``` ## display.on('add'|'remove'|'change') -on(type: 'add'|'remove'|'change', callback: Callback<number>): void; +on(type: 'add'|'remove'|'change', callback: Callback<number>): void Enables listening. +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -124,10 +174,12 @@ Enables listening. ## display.off('add'|'remove'|'change') -off(type: 'add'|'remove'|'change', callback?: Callback<number>): void; +off(type: 'add'|'remove'|'change', callback?: Callback<number>): void Disables listening. +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | -- Gitee From f3ba5426b1fa0d1dd14087222130d14f2099af5f Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:49:17 +0800 Subject: [PATCH 103/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-featureAbility.md | 201 +++++++++++++++--- 1 file changed, 172 insertions(+), 29 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-featureAbility.md b/en/application-dev/reference/apis/js-apis-featureAbility.md index 8ec9fcf1b2a..49119078246 100644 --- a/en/application-dev/reference/apis/js-apis-featureAbility.md +++ b/en/application-dev/reference/apis/js-apis-featureAbility.md @@ -27,6 +27,7 @@ Starts an ability. This method uses a callback to return the result. ```javascript import featureAbility from '@ohos.ability.featureAbility' +import wantConstant from '@ohos.ability.wantConstant' featureAbility.startAbility( { want: @@ -34,15 +35,14 @@ featureAbility.startAbility( action: "", entities: [""], type: "", - flags: FLAG_AUTH_READ_URI_PERMISSION, + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, deviceId: "", bundleName: "com.example.startability", abilityName: "com.example.startability.MainAbility", uri: "" }, }, - ); -) +); ``` @@ -63,6 +63,7 @@ Starts an ability. This method uses a promise to return the result. ```javascript import featureAbility from '@ohos.ability.featureAbility' +import wantConstant from '@ohos.ability.wantConstant' featureAbility.startAbility( { want: @@ -70,14 +71,14 @@ featureAbility.startAbility( action: "action.system.home", entities: ["entity.system.home"], type: "MIMETYPE", - flags: FLAG_AUTH_READ_URI_PERMISSION, - deviceId: deviceId, + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, + deviceId: "", bundleName: "com.example.startability", abilityName: "com.example.startability.MainAbility", uri: "" }, } - ).then((void) => { + ).then((data) => { console.info("==========================>startAbility=======================>"); }); ``` @@ -126,6 +127,7 @@ Starts an ability. This method uses a callback to return the execution result wh ```javascript import featureAbility from '@ohos.ability.featureability'; +import wantConstant from '@ohos.ability.wantConstant' featureAbility.startAbilityForResult( { want: @@ -133,7 +135,7 @@ featureAbility.startAbilityForResult( action: "action.system.home", entities: ["entity.system.home"], type: "MIMETYPE", - flags: FLAG_AUTH_READ_URI_PERMISSION, + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, deviceId: "", bundleName: "com.example.featureabilitytest", abilityName: "com.example.featureabilitytest.MainAbility", @@ -164,6 +166,7 @@ Starts an ability. This method uses a promise to return the execution result whe ```javascript import featureAbility from '@ohos.ability.featureability'; +import wantConstant from '@ohos.ability.wantConstant' featureAbility.startAbilityForResult( { want: @@ -171,7 +174,7 @@ featureAbility.startAbilityForResult( action: "action.system.home", entities: ["entity.system.home"], type: "MIMETYPE", - flags: FLAG_AUTH_READ_URI_PERMISSION, + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, deviceId: "", bundleName: "com.example.featureabilitytest", abilityName: "com.example.featureabilitytest.MainAbility", @@ -190,7 +193,7 @@ featureAbility.startAbilityForResult( }, requestCode: 2, }, -).then((void) => { +).then((data) => { console.info("==========================>startAbilityForResult=======================>"); }); ``` @@ -212,6 +215,7 @@ Destroys this Page ability, with the result code and data sent to the caller. Th ```javascript import featureAbility from '@ohos.ability.featureAbility' +import wantConstant from '@ohos.ability.wantConstant' featureAbility.terminateSelfWithResult( { resultCode: 1, @@ -220,7 +224,7 @@ featureAbility.terminateSelfWithResult( action: "action.system.home", entities: ["entity.system.home"], type: "MIMETYPE", - flags: FLAG_AUTH_READ_URI_PERMISSION, + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, deviceId: "", bundleName: "com.example.featureabilitytest", abilityName: "com.example.featureabilitytest.MainAbility", @@ -261,6 +265,7 @@ Destroys this Page ability, with the result code and data sent to the caller. Th ```javascript import featureAbility from '@ohos.ability.featureability'; +import wantConstant from '@ohos.ability.wantConstant' featureAbility.terminateSelfWithResult( { resultCode: 1, @@ -269,7 +274,7 @@ featureAbility.terminateSelfWithResult( action: "action.system.home", entities: ["entity.system.home"], type: "MIMETYPE", - flags: FLAG_AUTH_READ_URI_PERMISSION, + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, deviceId: "", bundleName: "com.example.featureabilitytest", abilityName: "com.example.featureabilitytest.MainAbility", @@ -286,7 +291,7 @@ featureAbility.terminateSelfWithResult( } }, } -).then((void) => { +).then((data) => { console.info("==========================>terminateSelfWithResult=======================>"); }); ``` @@ -330,7 +335,7 @@ Checks whether the main window of this ability has the focus. This method uses a ```javascript import featureAbility from '@ohos.ability.featureability'; -featureAbility.hasWindowFocus().then((void) => { +featureAbility.hasWindowFocus().then((data) => { console.info("==========================>hasWindowFocus=======================>"); }); ``` @@ -373,7 +378,7 @@ Obtains the **Want** object sent from this ability. This method uses a promise t ```javascript import featureAbility from '@ohos.ability.featureability'; -featureAbility.getWant().then((void) => { +featureAbility.getWant().then((data) => { console.info("==========================>getWantCallBack=======================>"); }); ``` @@ -435,7 +440,7 @@ Destroys this Page ability, with the result code and data sent to the caller. Th ```javascript import featureAbility from '@ohos.ability.featureability'; -featureAbility.terminateSelf().then((void) => { console.info("==========================>terminateSelfCallBack=======================>"); +featureAbility.terminateSelf().then((data) => { console.info("==========================>terminateSelfCallBack=======================>"); }); ``` @@ -476,6 +481,7 @@ ConnectOptions **Example** ```javascript +import rpc from '@ohos.rpc' import featureAbility from '@ohos.ability.featureAbility' function onConnectCallback(element, remote){ console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); @@ -488,7 +494,7 @@ function onFailedCallback(code){ } var connId = featureAbility.connectAbility( { - deviceId: deviceId, + deviceId: "", bundleName: "com.ix.ServiceAbility", abilityName: "ServiceAbilityA", }, @@ -516,6 +522,7 @@ Disconnects this ability from a specific Service ability. This method uses a cal **Example** ```javascript +import rpc from '@ohos.rpc' import featureAbility from '@ohos.ability.featureAbility' function onConnectCallback(element, remote){ console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); @@ -564,6 +571,7 @@ Disconnects this ability from a specific Service ability. This method uses a pro **Example** ```javascript +import rpc from '@ohos.rpc' import featureAbility from '@ohos.ability.featureAbility' function onConnectCallback(element, remote){ console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); @@ -611,21 +619,156 @@ ContinueAbilityOptions **Example** ```javascript -import featureAbility from '@ohos.ability.featureAbility' +import device from '@system.device' +import ability from '@ohos.ability.featureability' + +var DEVICE_LIST_LOCALHOST +export default { + data: { + title: "", + deviceId: '', + deviceList: [], + remoteDeviceModel : new RemoteDeviceModel() + }, + onInit() { + DEVICE_LIST_LOCALHOST = { + id: 'localhost', + }; + this.deviceList = [DEVICE_LIST_LOCALHOST]; + }, + onShow() { + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + const reportExtend = new ReportExtend(file) + core.addService('expect', expectExtend) + core.addService('report', reportExtend) + core.init() + const configService = core.getDefaultService('config') + configService.setConfig(this) + core.execute() + }, + onReady() { + }, + GetNetWorkId(){ + let self = this; + this.remoteDeviceModel.registerDeviceListCallback(() => { + var list = []; + list[0] = DEVICE_LIST_LOCALHOST; + var deviceList = self.remoteDeviceModel.deviceList; + for (var i = 0; i < deviceList.length; i++) { + list[i] = { + id: deviceList[i].deviceId, + }; + } + self.deviceList = list; + }); + }, + ShowNetWorkId(){ + this.deviceId = this.deviceList[0].id; + }, -async StartContinueAbility(deviceId) { - let continueAbilityOptions = { - reversible: false, - deviceId: deviceId, - } - function ContinueAbilityCallback(err, data) { - console.info("[Demo] ContinueAbilityCallback, result err = " + JSON.stringify(err)); - console.info("[Demo] ContinueAbilityCallback, result data= " + JSON.stringify(data)); - } - await featureAbility.continueAbility(continueAbilityOptions, ContinueAbilityCallback); - console.info('[Demo] featureAbility.StartContinueAbility end'); + async ContinueAbility(){ + function ContinueAbilityCallback(err) { + console.info("=============>ContinueAbilityCallback============>"); + } + var continueAbilityOptions = { + reversible: false, + deviceId: this.deviceId, + } + //continueAbility callback + await ability.continueAbility(continueAbilityOptions, ContinueAbilityCallback); + }, +} +``` + +## featureAbility.continueAbility + +continueAbility(options: ContinueAbilityOptions): Promise\; + +Migrates an ability to another device. This method uses a promise to return the execution result. + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------- | ---------------------- | ---- | ------------------- | +| options | ContinueAbilityOptions | Yes| Ability to migrate.| + +ContinueAbilityOptions + +| Name| Readable/Writable| Type| Mandatory| Description| +| ---------- | -------- | ------- | ---- | ------------------------------------------------------------ | +| deviceId | Read-only| string | Yes| Information about the ability to migrate.| +| reversible | Read-only| boolean | Yes| Whether migration back is supported. Currently, this feature is not supported. This parameter is reserved and can be set to **false**.| + +**Example** + +```javascript +import device from '@system.device' +import ability from '@ohos.ability.featureability' + +var DEVICE_LIST_LOCALHOST +export default { + data: { + title: "", + deviceId: '', + deviceList: [], + remoteDeviceModel : new RemoteDeviceModel() + }, + onInit() { + DEVICE_LIST_LOCALHOST = { + id: 'localhost', + }; + this.deviceList = [DEVICE_LIST_LOCALHOST]; + }, + onShow() { + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + const reportExtend = new ReportExtend(file) + core.addService('expect', expectExtend) + core.addService('report', reportExtend) + core.init() + const configService = core.getDefaultService('config') + configService.setConfig(this) + core.execute() + }, + onReady() { + }, + GetNetWorkId(){ + let self = this; + this.remoteDeviceModel.registerDeviceListCallback(() => { + var list = []; + list[0] = DEVICE_LIST_LOCALHOST; + var deviceList = self.remoteDeviceModel.deviceList; + for (var i = 0; i < deviceList.length; i++) { + list[i] = { + id: deviceList[i].deviceId, + }; + } + self.deviceList = list; + }); + }, + ShowNetWorkId(){ + this.deviceId = this.deviceList[0].id; + }, + + async ContinueAbility(){ + function ContinueAbilityCallback(err) { + console.info("=============>ContinueAbilityCallback============>"); + } + var continueAbilityOptions = { + reversible: false, + deviceId: this.deviceId, + } + //continueAbility promise + await ability.continueAbility(continueAbilityOptions).then(() => { + console.info("=======>continueAbilityCallback=========>"); + }); + }, } -this.StartContinueAbility(remoteDeviceId); //remoteDeviceId is acquired from DeviceManager ``` ## AbilityResult -- Gitee From cae3d0f734e9ef3c414b4aacb8119b6f4e804a43 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:52:32 +0800 Subject: [PATCH 104/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-abilityAccessCtrl.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/en/application-dev/reference/apis/js-apis-abilityAccessCtrl.md b/en/application-dev/reference/apis/js-apis-abilityAccessCtrl.md index b69cb0e03eb..8a747168fbe 100644 --- a/en/application-dev/reference/apis/js-apis-abilityAccessCtrl.md +++ b/en/application-dev/reference/apis/js-apis-abilityAccessCtrl.md @@ -217,3 +217,12 @@ promise.then(data => { console.log(`promise: data->${JSON.stringify(data)}`); }); ``` + +### GrantStatus + +Enumerates the permission grant states. + +| Name| Default Value| Description| +| ----------------------------- | ---------------------- | ----------------------- | +| PERMISSION_DENIED | -1 | Permission denied.| +| PERMISSION_GRANTED | 0 | Permission granted.| -- Gitee From e511fcf35ce7ed652de372fcfe035d47512fd97d Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 16:55:55 +0800 Subject: [PATCH 105/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-dataAbilityHelper.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md index 7985887426e..3c0e4627e4c 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md +++ b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md @@ -44,8 +44,6 @@ DAHelper.openFile( openFile(uri: string, mode: string): Promise\ -在指定的远程路径中打开文件(promise形式)。 - **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -272,7 +270,7 @@ normalizeUri(uri: string, callback: AsyncCallback\): void | 名称 | 类型 | 必填 | 描述 | | -------- | ---------------------- | ---- | ------------------------------------------------------------ | | uri | string | 是 | 指示要规范化的uri对象。 | -| callback | AsyncCallback\ | 是 | 回调方法。如果数据功能支持uri规范化,则返回规范化uri对象;否则返回null。 | +| callback | AsyncCallback\ | 是 | 回调方法。如果数据功能支持uri规范化或null,则返回规范化uri对象。 | **示例:** @@ -303,7 +301,7 @@ normalizeUri(uri: string): Promise\ **返回值:** | 类型 | 说明 | | ---------------- | ------------------------------------------------------ | -| Promise\ | 如果数据功能支持uri规范化,则返回规范化uri对象;否则返回null。 | +| Promise\ | 如果数据功能支持uri规范化或null,则返回规范化uri对象。 | **示例:** @@ -700,7 +698,7 @@ update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.Data **返回值:** | 类型 | 说明 | | ---------------- | -------------------------------------------- | -| Promise\ | 返回更新的数据记录数。 | +| Promise\ | 返回值为Promise对象,Promise中包含应用信息。 | **示例:** -- Gitee From 9d36a1a6231408d8ec8d7b64f3606d5a7da6ddf8 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Thu, 3 Mar 2022 19:35:10 +0800 Subject: [PATCH 106/282] update docs Signed-off-by: annie_wangli --- en/device-dev/driver/driver-hdf-manage.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/en/device-dev/driver/driver-hdf-manage.md b/en/device-dev/driver/driver-hdf-manage.md index 1481fec76a6..5d9d738234f 100644 --- a/en/device-dev/driver/driver-hdf-manage.md +++ b/en/device-dev/driver/driver-hdf-manage.md @@ -6,7 +6,7 @@ HCS is the source code that describes the configuration of the HDF using key-val HDF Configuration Generator \(HC-GEN\) is a tool for converting a configuration file into a file that can be read by the target software. -- In a low-performance system on a chip \(SoC\), this tool can convert a configuration file into the source code of the configuration tree so that the driver can obtain the configuration by directly calling the C library code. +- In a low-performance system on a chip \(SoC\), this tool can convert a configuration file into the source code or macro definitions of the configuration tree so that the driver can obtain the configuration by calling the C library code or macro-based APIs. - In a high-performance SoC, this tool can convert an HCS configuration file into the HDF Configuration Binary \(HCB\) file, allowing the driver to obtain the configuration through the APIs provided by the HDF. The following figure shows the typical application scenario of the HCB mode. @@ -392,6 +392,7 @@ options: -a hcb align with four bytes -b output binary output, default enable -t output config in C language source file style + -m output config in macro source file style -i output binary hex dump in C language source file style -p prefix of generated symbol name -d decompile hcb to hcs @@ -412,6 +413,12 @@ Generate an HCB file. hc-gen -o [OutputHcbFileName] -b [SourceHcsFileName] ``` +Generate a macro definition file. + +``` +hc-gen -o [OutputMacroFileName] -m [SourceHcsFileName] +``` + Compile an **HCB** file to an **HCS** file: ``` -- Gitee From 6352ecddc44db5d84d089d380f86e60af7201c15 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Thu, 3 Mar 2022 19:58:10 +0800 Subject: [PATCH 107/282] update docs Signed-off-by: annie_wangli --- en/application-dev/reference/apis/js-apis-useriam-userauth.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/en/application-dev/reference/apis/js-apis-useriam-userauth.md b/en/application-dev/reference/apis/js-apis-useriam-userauth.md index 267445bbd61..1ce2456d568 100644 --- a/en/application-dev/reference/apis/js-apis-useriam-userauth.md +++ b/en/application-dev/reference/apis/js-apis-useriam-userauth.md @@ -10,6 +10,10 @@ import userIAM_userAuth from '@ohos.userIAM.userAuth'; ``` +## System Capabilities + +SystemCapability.UserIAM.UserAuth + ## Required Permissions ohos.permission.ACCESS\_BIOMETRIC -- Gitee From 8291ded6e1ad1925594a5516e85dd3af1d790504 Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 3 Mar 2022 20:18:42 +0800 Subject: [PATCH 108/282] update docs Signed-off-by: zengyawen --- .../figures/en-us_image_0000001238544451.png | Bin 32563 -> 97440 bytes .../figures/zh-cn_image_0000001238544451.png | Bin 30678 -> 97440 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/en/application-dev/webgl/figures/en-us_image_0000001238544451.png b/en/application-dev/webgl/figures/en-us_image_0000001238544451.png index 7e95598c6f204f9e9165ad183e2b33b7adcadca4..9d953fc57d179bd67edebd43c2a247585bad7bbe 100644 GIT binary patch literal 97440 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 AF8}}l literal 32563 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 diff --git a/zh-cn/application-dev/webgl/figures/zh-cn_image_0000001238544451.png b/zh-cn/application-dev/webgl/figures/zh-cn_image_0000001238544451.png index 007ac6263648c83671d4b085cfc9103f6391be6d..9d953fc57d179bd67edebd43c2a247585bad7bbe 100644 GIT binary patch literal 97440 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 AF8}}l literal 30678 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 rRvE($z Date: Fri, 4 Mar 2022 09:13:00 +0800 Subject: [PATCH 109/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 1039 +++++++++-------- 1 file changed, 559 insertions(+), 480 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index d7c00987327..7723c69dc0e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -35,7 +35,7 @@ function getMediaLibrary(context: Context): MediaLibrary; ``` import featureAbility from '@ohos.ability.featureAbility'; -import mediaLibrary from ‘ohos.multimedia.mediaLibrary'; +import mediaLibrary from '@ohos.multimedia.mediaLibrary'; var context = featureAbility.getContext() var mediaLibrary = mediaLibrary.getMediaLibrary(context); @@ -44,7 +44,7 @@ var mediaLibrary = mediaLibrary.getMediaLibrary(context); ## medialibrary.getFileAssets -getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; +getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; 获取文件资源,使用callback方式返回异步结果。 @@ -75,7 +75,8 @@ medialibrary.getFileAssets(imagesfetchOp, (error, fetchFileResult) => { if (fileAssetList != undefined) { fileAssetList.forEach(getAllObjectInfo); } - }); + }); + } }); ``` ## medialibrary.getFileAssets @@ -294,12 +295,14 @@ getPublicDirectory(type: DirectoryType): Promise<string>; **示例:** ``` -let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; -const dicResult = await media.getPublicDirectory(DIR_CAMERA); -if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory'); -} else { - console.info('MediaLibraryTest : getPublicDirectory failed'); +async function (done) { + let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; + const dicResult = await media.getPublicDirectory(DIR_CAMERA); + if (dicResult == 'camera/') { + console.info('MediaLibraryTest : getPublicDirectory'); + } else { + console.info('MediaLibraryTest : getPublicDirectory failed'); + } } ``` @@ -393,7 +396,8 @@ release(callback: AsyncCallback<void>): void; **示例:** ``` -medialibrary.release((err, data) => { +var mediaLibrary = mediaLibrary.getMediaLibrary(context); +mediaLibrary.release((err, data) => { // do something }); ``` @@ -417,7 +421,8 @@ release(): Promise<void>; **示例:** ``` -medialibrary.release() +var mediaLibrary = mediaLibrary.getMediaLibrary(context); +mediaLibrary.release() ``` ## FileAsset.isDirectory @@ -439,18 +444,20 @@ isDirectory(callback: AsyncCallback<boolean>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.isDirectory((err, isDirectory) => { - // do something -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.isDirectory((err, isDirectory) => { + // do something + }); +} ``` ## FileAsset.isDirectory @@ -472,20 +479,22 @@ isDirectory():Promise<boolean>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.isDirectory().then(function(isDirectory){ - console.info("isDirectory result:"+ isDirectory); -}).catch(function(err){ - console.info("isDirectory failed with error:"+ err); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.isDirectory().then(function(isDirectory){ + console.info("isDirectory result:"+ isDirectory); + }).catch(function(err){ + console.info("isDirectory failed with error:"+ err); + }); +} ``` ## FileAsset.commitModify @@ -507,18 +516,20 @@ commitModify(callback: AsyncCallback<void>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.title = ‘newtitle'; -asset.commitModify(() => { - console.info('commitModify success'); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.title = ‘newtitle'; + asset.commitModify(() => { + console.info('commitModify success'); + } } ``` @@ -541,17 +552,19 @@ commitModify(): Promise<void>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.title = ‘newtitle'; -asset.commitModify(); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.title = ‘newtitle'; + asset.commitModify(); +} ``` ## FileAsset.open @@ -574,16 +587,18 @@ open(mode: string, callback: AsyncCallback<number>): void; **示例:** ``` -let mediaType = mediaLibrary.MediaType.IMAGE; -let path = "Pictures/"; -asset = await media.createAsset(mediaType, "image00003.jpg", path); -asset.open('rw', (openError, fd) => { - if(fd > 0){ - asset.close(fd); - }else{ - console.info('File Open Failed!' + openError); - } -}); +async function (done) { + let mediaType = mediaLibrary.MediaType.IMAGE; + let path = "Pictures/"; + asset = await media.createAsset(mediaType, "image00003.jpg", path); + asset.open('rw', (openError, fd) => { + if(fd > 0){ + asset.close(fd); + }else{ + console.info('File Open Failed!' + openError); + } + }); +} ``` ## FileAsset.open @@ -611,16 +626,18 @@ open(mode: string): Promise<number>; **示例:** ``` -let mediaType = mediaLibrary.MediaType.IMAGE; -let path = "Pictures/"; -asset = await media.createAsset(mediaType, "image00003.jpg", path); -asset.open('rw').then((openError, fd) => { - if(fd > 0){ - asset.close(fd); - }else{ - console.info('File Open Failed!' + openError); - } -}); +async function (done) { + let mediaType = mediaLibrary.MediaType.IMAGE; + let path = "Pictures/"; + asset = await media.createAsset(mediaType, "image00003.jpg", path); + asset.open('rw').then((openError, fd) => { + if(fd > 0){ + asset.close(fd); + }else{ + console.info('File Open Failed!' + openError); + } + }); +} ``` ## FileAsset.close @@ -643,23 +660,25 @@ close(fd: number, callback: AsyncCallback<void>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.close(fd, (closeErr) => { - if (closeErr != undefined) { - console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); - console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); - } else { - console.info("=======asset.close success====>"); - } -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.close(fd, (closeErr) => { + if (closeErr != undefined) { + console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + } else { + console.info("=======asset.close success====>"); + } + }); +} ``` ## FileAsset.close @@ -687,24 +706,26 @@ close(fd: number): Promise<void>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.close(fd).then((closeErr) => { - if (closeErr != undefined) { - console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); - console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); - - } else { - console.info("=======asset.close success====>"); - } -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.close(fd).then((closeErr) => { + if (closeErr != undefined) { + console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + + } else { + console.info("=======asset.close success====>"); + } + }); +} ``` ## FileAsset.getThumbnail @@ -726,18 +747,20 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.getThumbnail((err, pixelmap) => { - console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.getThumbnail((err, pixelmap) => { + console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); + }); +} ``` ## FileAsset.getThumbnail @@ -760,18 +783,20 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.getThumbnail(size, (err, pixelmap) => { - console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.getThumbnail(size, (err, pixelmap) => { + console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); + }); +} ``` ## FileAsset.getThumbnail @@ -799,18 +824,20 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.getThumbnail(size, (err, pixelmap) => { - console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.getThumbnail(size, (err, pixelmap) => { + console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); + }); +} ``` ## FileAsset.favorite @@ -833,18 +860,20 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.favorite(true,function(err){ - // do something -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.favorite(true,function(err){ + // do something + }); +} ``` ## FileAsset.favorite @@ -872,20 +901,22 @@ favorite(isFavorite: boolean): Promise<void>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.favorite(true).then(function() { - console.info("favorite successfully"); -}).catch(function(err){ - console.info("favorite failed with error:"+ err); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.favorite(true).then(function() { + console.info("favorite successfully"); + }).catch(function(err){ + console.info("favorite failed with error:"+ err); + }); +} ``` ## FileAsset.isFavorite @@ -907,22 +938,24 @@ isFavorite(callback: AsyncCallback<boolean>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.isFavorite((err, isFavorite) => { - if (isFavorite) { - console.info('FileAsset is favorite'); - }else{ - console.info('FileAsset is not favorite'); - } -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.isFavorite((err, isFavorite) => { + if (isFavorite) { + console.info('FileAsset is favorite'); + }else{ + console.info('FileAsset is not favorite'); + } + }); +} ``` ## FileAsset.isFavorite @@ -944,20 +977,22 @@ isFavorite():Promise<boolean>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.isFavorite().then(function(isFavorite){ - console.info("isFavorite result:"+ isFavorite); -}).catch(function(err){ - console.info("isFavorite failed with error:"+ err); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.isFavorite().then(function(isFavorite){ + console.info("isFavorite result:"+ isFavorite); + }).catch(function(err){ + console.info("isFavorite failed with error:"+ err); + }); +} ``` ## FileAsset.trash @@ -982,18 +1017,20 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.trash(true, trashCallBack); -function trashCallBack(err, trash) { - console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.trash(true, trashCallBack); + function trashCallBack(err, trash) { + console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); + } } ``` @@ -1024,20 +1061,22 @@ trash(isTrash: boolean,): Promise<void>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.trash(true).then(function() { - console.info("trash successfully"); -}).catch(function(err){ - console.info("trash failed with error:"+ err); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.trash(true).then(function() { + console.info("trash successfully"); + }).catch(function(err){ + console.info("trash failed with error:"+ err); + }); +} ``` ## FileAsset.isTrash @@ -1059,23 +1098,27 @@ isTrash(callback: AsyncCallback<boolean>): void; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.isTrash(isTrashCallBack); -function isTrashCallBack(err, isTrash) { - if (isTrash == true) { - console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash); - asset.trash(true, trashCallBack); - } else { - console.info('MediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err); - console.info('MediaLibraryTest : ASSET_CALLBACK isTrash : FAIL'); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.isTrash(isTrashCallBack); + function isTrashCallBack(err, isTrash) { + if (isTrash == true) { + console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash); + asset.trash(true, trashCallBack); + + } else { + console.info('MediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err); + console.info('MediaLibraryTest : ASSET_CALLBACK isTrash : FAIL'); + + } } } ``` @@ -1099,20 +1142,22 @@ isTrash():Promise<boolean>; **示例:** ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -const fetchFileResult = await media.getFileAssets(getImageOp); -const asset = await fetchFileResult.getFirstObject(); -asset.isTrash().then(function(isTrash){ - console.info("isTrash result:"+ isTrash); -}).catch(function(err){ - console.info("isTrash failed with error:"+ err); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + const fetchFileResult = await media.getFileAssets(getImageOp); + const asset = await fetchFileResult.getFirstObject(); + asset.isTrash().then(function(isTrash){ + console.info("isTrash result:"+ isTrash); + }).catch(function(err){ + console.info("isTrash failed with error:"+ err); + }); +} ``` **FetchFileResult** @@ -1138,14 +1183,16 @@ getCount(): number; **示例**: ``` -let getFileCountOneOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [fileType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,1", -}; -let fetchFileResult = await media.getFileAssets(getFileCountOneOp); -const fetchCount = fetchFileResult.getCount(); +async function (done) { + let getFileCountOneOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [fileType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,1", + }; + let fetchFileResult = await media.getFileAssets(getFileCountOneOp); + const fetchCount = fetchFileResult.getCount(); +} ``` ## FetchFileResult.isAfterLast @@ -1167,27 +1214,29 @@ isAfterLast(): boolean; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -const fetchCount = fetchFileResult.getCount(); -console.info('MediaLibraryTest : count:' + fetchCount); -let fileAsset = await fetchFileResult.getFirstObject(); -for (var i = 1; i < fetchCount; i++) { - fileAsset = await fetchFileResult.getNextObject(); - if(i == fetchCount - 1) { - console.info('MediaLibraryTest : isLast'); - var result = fetchFileResult.isAfterLast(); - console.info('MediaLibraryTest : isAfterLast:' + result); - console.info('MediaLibraryTest : isAfterLast end'); - fetchFileResult.close(); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + const fetchCount = fetchFileResult.getCount(); + console.info('MediaLibraryTest : count:' + fetchCount); + let fileAsset = await fetchFileResult.getFirstObject(); + for (var i = 1; i < fetchCount; i++) { + fileAsset = await fetchFileResult.getNextObject(); + if(i == fetchCount - 1) { + console.info('MediaLibraryTest : isLast'); + var result = fetchFileResult.isAfterLast(); + console.info('MediaLibraryTest : isAfterLast:' + result); + console.info('MediaLibraryTest : isAfterLast end'); + fetchFileResult.close(); - } + } + } } ``` @@ -1204,15 +1253,17 @@ close(): void; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.close(); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.close(); +} ``` ## FetchFileResult.getFirstObject @@ -1234,21 +1285,23 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.getFirstObject((err, value) => { - if (err) { - console.error('Failed '); - return; - } - console.log(value); -}) +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.getFirstObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); + }) +} ``` ## FetchFileResult.getFirstObject @@ -1271,19 +1324,21 @@ getFirstObject(): Promise<FileAsset>; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.getFirstObject().then(function(fileAsset){ - console.info("getFirstObject successfully:"+ JSON.stringify(fileAsset)); -}).catch(function(err){ - console.info("getFirstObject failed with error:"+ err); -}); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.getFirstObject().then(function(fileAsset){ + console.info("getFirstObject successfully:"+ JSON.stringify(fileAsset)); + }).catch(function(err){ + console.info("getFirstObject failed with error:"+ err); + }); +} ``` ## FetchFileResult.getNextObject @@ -1305,21 +1360,23 @@ fetchFileResult.getFirstObject().then(function(fileAsset){ **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.getNextObject((err, value) => { - if (err) { - console.error('Failed '); - return; - } - console.log(value); -}) +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.getNextObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); + }) +} ``` ## FetchFileResult.getNextObject @@ -1341,17 +1398,19 @@ fetchFileResult.getNextObject((err, value) => { **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -const fetchCount = fetchFileResult.getCount(); -console.info('MediaLibraryTest : count:' + fetchCount); -fileAsset = await fetchFileResult.getNextObject(); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + const fetchCount = fetchFileResult.getCount(); + console.info('MediaLibraryTest : count:' + fetchCount); + fileAsset = await fetchFileResult.getNextObject(); +} ``` ## FetchFileResult.getLastObject @@ -1373,21 +1432,23 @@ getLastObject(callback: AsyncCallback<FileAsset>): void; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.getLastObject((err, value) => { - if (err) { - console.error('Failed '); - return; - } - console.log(value); -}) +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.getLastObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); + }) +} ``` ## FetchFileResult.getLastObject @@ -1409,15 +1470,17 @@ getLastObject(): Promise<FileAsset>; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -let lastObject = await fetchFileResult.getLastObject(); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + let lastObject = await fetchFileResult.getLastObject(); +} ``` ## FetchFileResult.getPositionObject @@ -1440,21 +1503,23 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.getPositionObject(1,(err, value) => { - if (err) { - console.error('Failed '); - return; - } - console.log(value); -}) +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.getPositionObject(1,(err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); + }) +} ``` ## FetchFileResult.getPositionObject @@ -1482,21 +1547,23 @@ getPositionObject(index: number): Promise<FileAsset>; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.getPositionObject(1,(err, value) => { - if (err) { - console.error('Failed '); - return; - } - console.log(value); -}) +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.getPositionObject(1,(err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); + }) +} ``` ## FetchFileResult.getAllObject @@ -1518,21 +1585,23 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -fetchFileResult.getAllObject((err, value) => { - if (err) { - console.error('Failed '); - return; - } - console.log(value); -}) +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + fetchFileResult.getAllObject((err, value) => { + if (err) { + console.error('Failed '); + return; + } + console.log(value); + }) +} ``` ## FetchFileResult.getAllObject @@ -1554,15 +1623,17 @@ getAllObject(): Promise<Array<FileAsset>>; **示例**: ``` -let imageType = mediaLibrary.MediaType.IMAGE; -let getImageOp = { - selections: fileKeyObj.MEDIA_TYPE + '= ?', - selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", -}; -let fetchFileResult = await media.getFileAssets(getImageOp); -var data = fetchFileResult.getAllObject(); +async function (done) { + let imageType = mediaLibrary.MediaType.IMAGE; + let getImageOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [imageType.toString()], + order: fileKeyObj.DATE_ADDED, + extendArgs: "LIMIT 0,10", + }; + let fetchFileResult = await media.getFileAssets(getImageOp); + var data = fetchFileResult.getAllObject(); +} ``` ## Album.commitModify @@ -1584,20 +1655,22 @@ commitModify(callback: AsyncCallback<void>): void; **示例**: ``` -let AlbumNoArgsfetchOp = { - selections: '', - selectionArgs: [], -}; -const albumList = await media.getAlbums(AlbumNoArgsfetchOp); -const album = albumList[0]; -album.albumName = 'hello'; -album.commitModify((err) => { - if (err) { - console.error('Failed '); - return; - } - console.log('Modify successful.'); -}) +async function (done) { + let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], + }; + const albumList = await media.getAlbums(AlbumNoArgsfetchOp); + const album = albumList[0]; + album.albumName = 'hello'; + album.commitModify((err) => { + if (err) { + console.error('Failed '); + return; + } + console.log('Modify successful.'); + }) +} ``` ## Album.commitModify @@ -1619,18 +1692,20 @@ commitModify(): Promise<void>; **示例**: ``` -let AlbumNoArgsfetchOp = { - selections: '', - selectionArgs: [], -}; -const albumList = await media.getAlbums(AlbumNoArgsfetchOp); -const album = albumList[0]; -album.albumName = 'hello'; -album.commitModify().then(function() { - console.info("commitModify successfully"); -}).catch(function(err){ - console.info("commitModify failed with error:"+ err); -}); +async function (done) { + let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], + }; + const albumList = await media.getAlbums(AlbumNoArgsfetchOp); + const album = albumList[0]; + album.albumName = 'hello'; + album.commitModify().then(function() { + console.info("commitModify successfully"); + }).catch(function(err){ + console.info("commitModify failed with error:"+ err); + }); +} ``` ## Album.getFileAssets @@ -1653,16 +1728,18 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe **示例**: ``` -let AlbumNoArgsfetchOp = { - selections: '', - selectionArgs: [], -}; -const albumList = await media.getAlbums(AlbumNoArgsfetchOp); -const album = albumList[0]; -album.getFileAssets(fileNoArgsfetchOp, getFileAssetsCallBack); -}) -function getFileAssetsCallBack(err, fetchFileResult) { - // do something +async function (done) { + let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], + }; + const albumList = await media.getAlbums(AlbumNoArgsfetchOp); + const album = albumList[0]; + album.getFileAssets(fileNoArgsfetchOp, getFileAssetsCallBack); + }) + function getFileAssetsCallBack(err, fetchFileResult) { + // do something + } } ``` @@ -1691,17 +1768,19 @@ function getFileAssetsCallBack(err, fetchFileResult) { **示例**: ``` -let AlbumNoArgsfetchOp = { - selections: '', - selectionArgs: [], -}; -const albumList = await media.getAlbums(AlbumNoArgsfetchOp); -const album = albumList[0]; -album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ - console.info("getFileAssets successfully:"+ JSON.stringify(albumFetchFileResult)); -}).catch(function(err){ - console.info("getFileAssets failed with error:"+ err); -}); +async function (done) { + let AlbumNoArgsfetchOp = { + selections: '', + selectionArgs: [], + }; + const albumList = await media.getAlbums(AlbumNoArgsfetchOp); + const album = albumList[0]; + album.getFileAssets(fileNoArgsfetchOp).then(function(albumFetchFileResult){ + console.info("getFileAssets successfully:"+ JSON.stringify(albumFetchFileResult)); + }).catch(function(err){ + console.info("getFileAssets failed with error:"+ err); + }); +} ``` ## PeerInfo -- Gitee From 79cdaa07de05a5a686e86099b83d95aba355e2b7 Mon Sep 17 00:00:00 2001 From: zengyawen Date: Fri, 4 Mar 2022 01:41:15 +0000 Subject: [PATCH 110/282] update zh-cn/application-dev/reference/apis/js-apis-thermal.md. Signed-off-by: zengyawen --- .../reference/apis/js-apis-thermal.md | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-thermal.md b/zh-cn/application-dev/reference/apis/js-apis-thermal.md index 5154348d097..1231c3e0218 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-thermal.md +++ b/zh-cn/application-dev/reference/apis/js-apis-thermal.md @@ -17,13 +17,13 @@ import thermal from '@ohos.thermal'; | 名称 | 默认值 | 描述 | | -------- | -------- | -------- | -| COOL | 0 | 表明设备处于低温的状态,业务执行不受热控的限制。 | -| NORMAL | 1 | 表明设备处于正常工作状态,但温度不低,需要注意是否临近发热状态。 | -| WARM | 2 | 表明设备已经进入温热状态,部分无感知业务需要考虑停止或延迟执行。 | -| HOT | 3 | 表明设备已经明显发热,无感知业务应全面停止,其他业务应考虑降规格及负载。 | -| OVERHEATED | 4 | 表明设备已经发热严重,无感知业务应全面停止,主要业务需降低规格及负载。 | -| WARNING | 5 | 表明设备已经发热严重并且即将进入紧急状态,无感知业务应全面停止,主要业务应降低至最低规格。 | -| EMERGENCY | 6 | 表明设备已经进入紧急状态,所有业务应当全面停止工作,可保留部分紧急求助功能。 | +| COOL | 0 | 表明设备处于低温的状态,业务执行不受热控的限制。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| NORMAL | 1 | 表明设备处于正常工作状态,但温度不低,需要注意是否临近发热状态。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| WARM | 2 | 表明设备已经进入温热状态,部分无感知业务需要考虑停止或延迟执行。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| HOT | 3 | 表明设备已经明显发热,无感知业务应全面停止,其他业务应考虑降规格及负载。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| OVERHEATED | 4 | 表明设备已经发热严重,无感知业务应全面停止,主要业务需降低规格及负载。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| WARNING | 5 | 表明设备已经发热严重并且即将进入紧急状态,无感知业务应全面停止,主要业务应降低至最低规格。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| EMERGENCY | 6 | 表明设备已经进入紧急状态,所有业务应当全面停止工作,可保留部分紧急求助功能。
**系统能力:** SystemCapability.PowerManager.ThermalManager | ## thermal.subscribeThermalLevel @@ -32,9 +32,7 @@ subscribeThermalLevel(callback: AsyncCallback<ThermalLevel>): void 订阅热档位变化时的回调提醒。 -**系统能力:** - -SystemCapability.PowerManager.ThermalManager +**系统能力:** SystemCapability.PowerManager.ThermalManager **参数:** @@ -56,9 +54,7 @@ unsubscribeThermalLevel(callback?: AsyncCallback): void 取消订阅热档位变化时的回调提醒。 -**系统能力:** - -SystemCapability.PowerManager.ThermalManager +**系统能力:** SystemCapability.PowerManager.ThermalManager **参数:** @@ -80,9 +76,7 @@ getThermalLevel(): ThermalLevel 获取当前热档位信息。 -**系统能力:** - -SystemCapability.PowerManager.ThermalManager +**系统能力:** SystemCapability.PowerManager.ThermalManager **返回值:** -- Gitee From 777c971a80538d1dea56dbcd8869fa0d3aad8e95 Mon Sep 17 00:00:00 2001 From: wanghang Date: Fri, 4 Mar 2022 10:26:04 +0800 Subject: [PATCH 111/282] IssueNo:#I4W159:fix bundle docs Description:fix bundle docs Sig:SIG_ApplicaitonFramework Feature or Bugfix:Feature Binary Source:No Signed-off-by: wanghang Change-Id: I01939a296efad3abc38b9b24c9a5c37642f48300 --- .../reference/apis/js-apis-Bundle.md | 105 +++++++----------- 1 file changed, 39 insertions(+), 66 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-Bundle.md b/zh-cn/application-dev/reference/apis/js-apis-Bundle.md index 636c52056e2..dd04004618e 100755 --- a/zh-cn/application-dev/reference/apis/js-apis-Bundle.md +++ b/zh-cn/application-dev/reference/apis/js-apis-Bundle.md @@ -490,66 +490,6 @@ bundle.queryAbilityByWant(want, bundleFlags, (err, data) => { }) ``` -## bundle.getBundleArchiveInfo - -getBundleArchiveInfo(hapFilePath: string, bundleFlags: number): Promise\ - -以异步方法从给定的HAP中获取BundleInfo,使用Promise形式返回结果。 - -**参数:** - -| 名称 | 类型 | 必填 | 描述 | -| ----------- | ------ | ---- | ------------------------------------------------------------ | -| hapFilePath | string | 是 | HAP文件路径 | -| bundleFlags | number | 是 | 用于指定返回的应用信息对象中包含信息的标记。默认值:0,取值范围:大于等于0。 | - -**返回值:** - -| 类型 | 说明 | -| -------------------- | ------------------------------------------ | -| Promise\ | 返回值为Promise对象,Promise中包含包信息。 | - -**示例:** - -```js -let hapFilePath = "/data/test.hap"; -let bundleFlags = 1; -bundle.getBundleArchiveInfo(hapFilePath, bundleFlags) -.then((data) => { - console.info('Operation successful. Data: ' + JSON.stringify(data)); -}).catch((error) => { - console.error('Operation failed. Cause: ' + JSON.stringify(error)); -}) -``` - -## bundle.getBundleArchiveInfo - -getBundleArchiveInfo(hapFilePath: string, bundleFlags: number, callback: AsyncCallback\): void - -以异步方法从给定的HAP中获取BundleInfo,使用callback形式返回结果。 - -**参数:** - -| 名称 | 类型 | 必填 | 描述 | -| ----------- | ------------------------- | ---- | ------------------------------------------------------------ | -| hapFilePath | string | 是 | HAP文件路径 | -| bundleFlags | number | 是 | 用于指定返回的应用信息对象中包含信息的标记。默认值:0,取值范围:大于等于0。 | -| callback | AsyncCallback | 是 | 程序启动作为入参的回调函数,返回包信息。 | - -**示例:** - -```js -let hapFilePath = "/data/test.hap"; -let bundleFlags = 1; -bundle.getBundleArchiveInfo(hapFilePath, bundleFlags, (err, data) => { - if (err) { - console.error('Operation failed. Cause: ' + JSON.stringify(err)); - return; - } - console.info('Operation successful. Data:' + JSON.stringify(data)); -}) -``` - ## bundle.getBundleInstaller getBundleInstaller(): Promise @@ -635,6 +575,10 @@ getLaunchWantForBundle(bundleName: string): Promise\ 以异步方法查询拉起指定应用的want对象,使用Promise形式返回结果。 +**需要权限:** + +ohos.permission.GET_BUNDLE_INFO_PRIVILEGED + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -664,6 +608,10 @@ getLaunchWantForBundle(bundleName: string, callback: AsyncCallback): void; 以异步方法查询拉起指定应用的want对象,使用callback形式返回结果。 +**需要权限:** + +ohos.permission.GET_BUNDLE_INFO_PRIVILEGED + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -748,13 +696,14 @@ bundle.getNameForUid(uid, (err, data) => { | deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。 | | bundleName | 只读 | string | 是 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | | abilityName | 只读 | string | 是 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | +| uri | 只读 | string | 否 | 资源标识符。 | +| shortName | 只读 | string | 否 | ElementName的简名。 | ## InstallStatus | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------- | -------- | ---------------- | ---- | ------------------------------------------------------------ | -| status | 只读 | InstallErrorCode | 是 | 安装结果code
SUCCESS = 0
STATUS_INSTALL_FAILURE = 1
STATUS_INSTALL_FAILURE_ABORTED = 2,
STATUS_INSTALL_FAILURE_INVALID = 3
STATUS_INSTALL_FAILURE_CONFLICT = 4
STATUS_INSTALL_FAILURE_STORAGE = 5
STATUS_INSTALL_FAILURE_INCOMPATIBLE = 6
STATUS_INSTALL_FAILURE_DOWNLOAD_TIMEOUT = 0x0B
STATUS_INSTALL_FAILURE_DOWNLOAD_FAILED = 0x0C
STATUS_ABILITY_NOT_FOUND = 0x40
STATUS_BMS_SERVICE_ERROR = 0x41 | -| statusMessage | 只读 | string | 是 | 安装结果Message | +| status | 只读 | InstallErrorCode | 是 | 安装结果code
SUCCESS = 0
STATUS_INSTALL_FAILURE = 1
STATUS_INSTALL_FAILURE_ABORTED = 2,
STATUS_INSTALL_FAILURE_INVALID = 3
STATUS_INSTALL_FAILURE_CONFLICT = 4
STATUS_INSTALL_FAILURE_STORAGE = 5
STATUS_INSTALL_FAILURE_INCOMPATIBLE = 6
STATUS_UNINSTALL_FAILURE = 7
STATUS_UNINSTALL_FAILURE_BLOCKED = 8
STATUS_UNINSTALL_FAILURE_ABORTED = 9
STATUS_UNINSTALL_FAILURE_CONFLICT = 10
STATUS_INSTALL_FAILURE_DOWNLOAD_TIMEOUT = 0x0B
STATUS_INSTALL_FAILURE_DOWNLOAD_FAILED = 0x0C
STATUS_RECOVER_FAILURE_INVALID = 0x0D
STATUS_ABILITY_NOT_FOUND = 0x40
STATUS_BMS_SERVICE_ERROR = 0x41
STATUS_FAILED_NO_SPACE_LEFT = 0x42
STATUS_GRANT_REQUEST_PERMISSIONS_FAILED = 0x43
STATUS_INSTALL_PERMISSION_DENIED = 0x44
STATUS_UNINSTALL_PERMISSION_DENIED = 0x45 | ## BundleFlag @@ -773,6 +722,7 @@ bundle.getNameForUid(uid, (err, data) => { | GET_ABILITY_INFO_SYSTEMAPP_ONLY | 0x00000080 | 获取仅包括系统应用的ability信息 | | GET_ABILITY_INFO_WITH_DISABLE | 0x00000100 | 获取包括被禁用的ability信息 | | GET_APPLICATION_INFO_WITH_DISABLE | 0x00000200 | 获取包括被禁用的应用信息 | +| GET_ALL_APPLICATION_INFO | 0xFFFF0000 | 获取应用所有的信息 | ## BundleOptions @@ -785,7 +735,7 @@ bundle.getNameForUid(uid, (err, data) => { ## BundleInfo -应用包的信息。 +应用包的信息 | 名称 | 类型 | 可读 | 可写 | 说明 | | ------ | ------ | ------ | ------ | ------ | @@ -815,7 +765,7 @@ bundle.getNameForUid(uid, (err, data) => { ## ApplicationInfo -应用程序信息。 +应用程序信息 | 名称 | 类型 | 可读 | 可写 | 说明 | | ------ | ------ | ------ | ------ | ------ | @@ -843,7 +793,7 @@ bundle.getNameForUid(uid, (err, data) => { ## ModuleInfo -应用程序的模块信息。 +应用程序的模块信息 | 名称 | 类型 | 可读 | 可写 | 说明 | | ------ | ------ | ------ | ------ | ------ | @@ -852,7 +802,7 @@ bundle.getNameForUid(uid, (err, data) => { ## CustomizeData -自定义元数据。 +自定义元数据 | 名称 | 类型 | 可读 | 可写 | 说明 | | ----- | ------ | ---- | ---- | ---------------- | @@ -863,6 +813,8 @@ bundle.getNameForUid(uid, (err, data) => { ## HapModuleInfo +Hap模块信息 + | 名称 | 类型 | 可读 | 可写 | 说明 | | ------ | ------ | ------ | ------ | ------ | | name | string | 是 | 否 | 模块名称 | @@ -884,6 +836,8 @@ bundle.getNameForUid(uid, (err, data) => { ## ReqPermissionDetail +应用运行时需向系统申请的权限集合的详细信息 + | 名称 | 类型 | 可读 | 可写 | 说明 | | ------ | ------ | ------ | ------ | ------ | | name | string | 是 | 是 | 需要使用的权限名称 | @@ -892,6 +846,8 @@ bundle.getNameForUid(uid, (err, data) => { ## UsedScene +描述权限使用的场景和时机 + | 名称 | 类型 | 可读 | 可写 | 说明 | | ------ | ------ | ------ | ------ | ------ | | abilities | Array | 是 | 是 | 使用到该权限的Ability集合 | @@ -900,6 +856,8 @@ bundle.getNameForUid(uid, (err, data) => { ## AbilityInfo +Ability信息 + | 名称 | 类型 | 可读 | 可写 | 说明 | | ------ | ------ | ------ | ------ | ------ | | bundleName | string | 是 | 否 | 应用包名 | @@ -938,6 +896,8 @@ bundle.getNameForUid(uid, (err, data) => { ## AbilityType +Ability类型 + | 名称 | 类型 | 说明 | | ------- | ---- | --------------------------- | | UNKNOWN | 无 | 未知Ability类型 | @@ -947,6 +907,8 @@ bundle.getNameForUid(uid, (err, data) => { ## DisplayOrientation +屏幕显示方向 + | 名称 | 类型 | 说明 | | ------------- | ---- | ------------------------ | | UNSPECIFIED | 无 | 屏幕方向--不指定 | @@ -956,7 +918,18 @@ bundle.getNameForUid(uid, (err, data) => { ## LaunchMode +启动模式 + | 名称 | 类型 | 说明 | | ----------- | ---- | ------------------- | | UNSPECIFIED | 0 | Ability只有一个示例 | | STANDARD | 1 | Ability有多个示例 | + +## AbilitySubType + +Ability的子类型 + +| 名称 | 类型 | 说明 | +| ----------- | ---- | ----------------------------- | +| UNSPECIFIED | 0 | 未定义Ability子类型 | +| CA | 1 | Ability子类型是带有 UI 的服务 | -- Gitee From b73ce5b8bd54c7fbd35edd37b65bf1d7d1e58918 Mon Sep 17 00:00:00 2001 From: PaDaBoo Date: Fri, 4 Mar 2022 11:41:51 +0800 Subject: [PATCH 112/282] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=B7=AE=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: PaDaBoo --- .../apis/js-apis-data-preferences.md | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md index 68da7c3cd1a..b1e0b8b5c27 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md +++ b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md @@ -27,7 +27,7 @@ getPreferences(context: Context, name: string, callback: AsyncCallback<Prefer 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用callback形式返回结果。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -59,7 +59,7 @@ getPreferences(context: Context, name: string): Promise<Preferences> 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用Promise方式作为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -94,7 +94,7 @@ deletePreferences(context: Context, name: string, callback: AsyncCallback<voi 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用callback方式作为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -124,7 +124,7 @@ deletePreferences(context: Context, name: string): Promise<void> 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -159,7 +159,7 @@ removePreferencesFromCache(context: Context, name: string, callback: AsyncCallba 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -191,7 +191,7 @@ removePreferencesFromCache(context: Context, name: string): Promise<void> 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -231,7 +231,7 @@ get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -261,7 +261,7 @@ get(key: string, defValue: ValueType): Promise<ValueType> 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - **参数:** @@ -294,7 +294,7 @@ put(key: string, value: ValueType, callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -324,7 +324,7 @@ put(key: string, value: ValueType): Promise<void> 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -357,7 +357,7 @@ has(key: string, callback: AsyncCallback<boolean>): boolean 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -393,7 +393,7 @@ has(key: string): Promise<boolean> 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -427,7 +427,7 @@ delete(key: string, callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -456,7 +456,7 @@ delete(key: string): Promise<void> 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -488,7 +488,7 @@ flush(callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -516,7 +516,7 @@ flush(): Promise<void> 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 返回值: @@ -543,7 +543,7 @@ clear(callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -571,7 +571,7 @@ clear(): Promise<void> 此方法为异步方法。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 返回值: @@ -596,7 +596,7 @@ on(type: 'change', callback: Callback<{ key : string }>): void 订阅数据变更者类,订阅的key的值发生变更后,在执行flush方法后,callback方法会被回调。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -622,7 +622,7 @@ off(type: 'change', callback: Callback<{ key : string }>): void 当不再进行订阅数据变更时,使用此接口取消订阅。 -### 系统能力### +### 系统能力 ### SystemCapability.DistributedDataManager.Preferences.Core - 参数: -- Gitee From f32f83d5f2cec16afe63de96448ed29fa93e5e32 Mon Sep 17 00:00:00 2001 From: PaDaBoo Date: Fri, 4 Mar 2022 11:54:01 +0800 Subject: [PATCH 113/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: PaDaBoo --- .../apis/js-apis-data-preferences.md | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md index b1e0b8b5c27..c683d70f83a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md +++ b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md @@ -27,7 +27,9 @@ getPreferences(context: Context, name: string, callback: AsyncCallback<Prefer 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用callback形式返回结果。 -### 系统能力 ### + +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -59,7 +61,8 @@ getPreferences(context: Context, name: string): Promise<Preferences> 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用Promise方式作为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -94,7 +97,8 @@ deletePreferences(context: Context, name: string, callback: AsyncCallback<voi 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用callback方式作为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -124,7 +128,8 @@ deletePreferences(context: Context, name: string): Promise<void> 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -159,7 +164,8 @@ removePreferencesFromCache(context: Context, name: string, callback: AsyncCallba 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -191,7 +197,8 @@ removePreferencesFromCache(context: Context, name: string): Promise<void> 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -231,7 +238,8 @@ get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -261,7 +269,8 @@ get(key: string, defValue: ValueType): Promise<ValueType> 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - **参数:** @@ -294,7 +303,8 @@ put(key: string, value: ValueType, callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -324,7 +334,8 @@ put(key: string, value: ValueType): Promise<void> 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -357,7 +368,8 @@ has(key: string, callback: AsyncCallback<boolean>): boolean 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -393,7 +405,8 @@ has(key: string): Promise<boolean> 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -427,7 +440,8 @@ delete(key: string, callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -456,7 +470,8 @@ delete(key: string): Promise<void> 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -488,7 +503,8 @@ flush(callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -516,7 +532,8 @@ flush(): Promise<void> 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 返回值: @@ -543,7 +560,8 @@ clear(callback: AsyncCallback<void>): void 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -571,7 +589,8 @@ clear(): Promise<void> 此方法为异步方法。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 返回值: @@ -596,7 +615,8 @@ on(type: 'change', callback: Callback<{ key : string }>): void 订阅数据变更者类,订阅的key的值发生变更后,在执行flush方法后,callback方法会被回调。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: @@ -622,7 +642,8 @@ off(type: 'change', callback: Callback<{ key : string }>): void 当不再进行订阅数据变更时,使用此接口取消订阅。 -### 系统能力 ### +**系统能力**: + SystemCapability.DistributedDataManager.Preferences.Core - 参数: -- Gitee From 04321f71366e6abab5a27c858884949def11e616 Mon Sep 17 00:00:00 2001 From: PaDaBoo Date: Fri, 4 Mar 2022 11:59:36 +0800 Subject: [PATCH 114/282] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: PaDaBoo --- .../apis/js-apis-data-preferences.md | 86 ++++++------------- 1 file changed, 24 insertions(+), 62 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md index c683d70f83a..36fe951e6c8 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md +++ b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md @@ -17,8 +17,10 @@ import data_Preferences from '@ohos.data.preferences' | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| MAX_KEY_LENGTH | string | 是 | 否 | key的最大长度限制,大小为80字节。
**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core | -| MAX_VALUE_LENGTH | string | 是 | 否 | string类型value的最大长度限制,大小为8192字节。
**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core | +| MAX_KEY_LENGTH | string | 是 | 否 | key的最大长度限制,大小为80字节。
- 系统能力: +SystemCapability.DistributedDataManager.Preferences.Core | +| MAX_VALUE_LENGTH | string | 是 | 否 | string类型value的最大长度限制,大小为8192字节。
- 系统能力: +SystemCapability.DistributedDataManager.Preferences.Core | ## data_Preferences.getPreferences @@ -28,9 +30,7 @@ getPreferences(context: Context, name: string, callback: AsyncCallback<Prefer 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用callback形式返回结果。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -61,9 +61,7 @@ getPreferences(context: Context, name: string): Promise<Preferences> 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用Promise方式作为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -97,9 +95,7 @@ deletePreferences(context: Context, name: string, callback: AsyncCallback<voi 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用callback方式作为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -128,9 +124,7 @@ deletePreferences(context: Context, name: string): Promise<void> 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -164,9 +158,7 @@ removePreferencesFromCache(context: Context, name: string, callback: AsyncCallba 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -197,9 +189,7 @@ removePreferencesFromCache(context: Context, name: string): Promise<void> 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -238,9 +228,7 @@ get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -269,9 +257,7 @@ get(key: string, defValue: ValueType): Promise<ValueType> 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -303,9 +289,7 @@ put(key: string, value: ValueType, callback: AsyncCallback<void>): void 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -334,9 +318,7 @@ put(key: string, value: ValueType): Promise<void> 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -368,9 +350,7 @@ has(key: string, callback: AsyncCallback<boolean>): boolean 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -405,9 +385,7 @@ has(key: string): Promise<boolean> 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -440,9 +418,7 @@ delete(key: string, callback: AsyncCallback<void>): void 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -470,9 +446,7 @@ delete(key: string): Promise<void> 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -503,9 +477,7 @@ flush(callback: AsyncCallback<void>): void 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -532,9 +504,7 @@ flush(): Promise<void> 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 返回值: | 类型 | 说明 | @@ -560,9 +530,7 @@ clear(callback: AsyncCallback<void>): void 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -589,9 +557,7 @@ clear(): Promise<void> 此方法为异步方法。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 返回值: | 类型 | 说明 | @@ -615,9 +581,7 @@ on(type: 'change', callback: Callback<{ key : string }>): void 订阅数据变更者类,订阅的key的值发生变更后,在执行flush方法后,callback方法会被回调。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 说明 | @@ -642,9 +606,7 @@ off(type: 'change', callback: Callback<{ key : string }>): void 当不再进行订阅数据变更时,使用此接口取消订阅。 -**系统能力**: - -SystemCapability.DistributedDataManager.Preferences.Core +- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 说明 | -- Gitee From fd9c6d50fafe598811d02fda7070689c1e9be223 Mon Sep 17 00:00:00 2001 From: hujun211 Date: Thu, 3 Mar 2022 20:17:36 -0800 Subject: [PATCH 115/282] modify docs of powermanger Signed-off-by: hujun211 --- .../reference/apis/js-apis-battery-info.md | 64 ++++++++++--------- .../reference/apis/js-apis-brightness.md | 8 ++- .../reference/apis/js-apis-power.md | 28 ++++---- .../reference/apis/js-apis-runninglock.md | 62 +++++++++--------- .../reference/apis/js-apis-thermal.md | 37 ++++++----- 5 files changed, 105 insertions(+), 94 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-battery-info.md b/zh-cn/application-dev/reference/apis/js-apis-battery-info.md index 0bed039fe93..1727267bc29 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-battery-info.md +++ b/zh-cn/application-dev/reference/apis/js-apis-battery-info.md @@ -2,6 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +> 该模块主要提供电池状态和充放电状态的查询接口。 ## 导入模块 @@ -12,22 +14,22 @@ import batteryInfo from '@ohos.batteryInfo'; ## 系统能力 -SystemCapability.PowerManager.BatteryManager +SystemCapability.PowerManager.BatteryManager.Core ## 属性 描述电池信息。 -| 名称 | 类型 | 可读 | 可写 | 描述 | -| -------- | -------- | -------- | -------- | -------- | -| batterySOC | number | 是 | 否 | 表示当前设备剩余电池电量百分比。 | -| chargingStatus | [BatteryChargeState](#batterychargestate) | 是 | 否 | 表示当前设备电池的充电状态。 | -| healthStatus | [BatteryHealthState](#batteryhealthstate) | 是 | 否 | 表示当前设备电池的健康状态。 | -| pluggedType | [BatteryPluggedType](#batterypluggedtype) | 是 | 否 | 表示当前设备连接的充电器类型。 | -| voltage | number | 是 | 否 | 表示当前设备电池的电压,单位微伏。 | -| technology | string | 是 | 否 | 表示当前设备电池的技术型号。 | -| batteryTemperature | number | 是 | 否 | 表示当前设备电池的温度,单位0.1摄氏度。 | -| isBatteryPresent7+ | boolean | 是 | 否 | 表示当前设备是否支持电池或者电池是否在位。 | +| 名称 | 类型 | 可读 | 可写 | 描述 | +| ----------------------------- | ---------------------------------------- | ---- | ---- | --------------------- | +| batterySOC | number | 是 | 否 | 表示当前设备剩余电池电量百分比。 | +| chargingStatus | [BatteryChargeState](#batterychargestate) | 是 | 否 | 表示当前设备电池的充电状态。 | +| healthStatus | [BatteryHealthState](#batteryhealthstate) | 是 | 否 | 表示当前设备电池的健康状态。 | +| pluggedType | [BatteryPluggedType](#batterypluggedtype) | 是 | 否 | 表示当前设备连接的充电器类型。 | +| voltage | number | 是 | 否 | 表示当前设备电池的电压,单位微伏。 | +| technology | string | 是 | 否 | 表示当前设备电池的技术型号。 | +| batteryTemperature | number | 是 | 否 | 表示当前设备电池的温度,单位0.1摄氏度。 | +| isBatteryPresent7+ | boolean | 是 | 否 | 表示当前设备是否支持电池或者电池是否在位。 | - 示例: ``` @@ -41,12 +43,12 @@ SystemCapability.PowerManager.BatteryManager 表示连接的充电器类型的枚举。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| NONE | 0 | 表示连接充电器类型未知。 | -| AC | 1 | 表示连接的充电器类型为交流充电器。 | -| USB | 2 | 表示连接的充电器类型为USB。 | -| WIRELESS | 3 | 表示连接的充电器类型为无线充电器。 | +| 名称 | 默认值 | 描述 | +| -------- | ---- | ----------------- | +| NONE | 0 | 表示连接充电器类型未知。 | +| AC | 1 | 表示连接的充电器类型为交流充电器。 | +| USB | 2 | 表示连接的充电器类型为USB。 | +| WIRELESS | 3 | 表示连接的充电器类型为无线充电器。 | ## BatteryChargeState @@ -54,12 +56,12 @@ SystemCapability.PowerManager.BatteryManager 表示电池充电状态的枚举。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| NONE | 0 | 表示电池充电状态未知。 | -| ENABLE | 1 | 表示电池充电状态为使能状态。 | -| DISABLE | 2 | 表示电池充电状态为停止状态。 | -| FULL | 3 | 表示电池充电状态为已充满状态。 | +| 名称 | 默认值 | 描述 | +| ------- | ---- | --------------- | +| NONE | 0 | 表示电池充电状态未知。 | +| ENABLE | 1 | 表示电池充电状态为使能状态。 | +| DISABLE | 2 | 表示电池充电状态为停止状态。 | +| FULL | 3 | 表示电池充电状态为已充满状态。 | ## BatteryHealthState @@ -67,11 +69,11 @@ SystemCapability.PowerManager.BatteryManager 表示电池的健康状态的枚举。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| UNKNOWN | 0 | 表示电池健康状态未知。 | -| GOOD | 1 | 表示电池健康状态为正常。 | -| OVERHEAT | 2 | 表示电池健康状态为过热。 | -| OVERVOLTAGE | 3 | 表示电池健康状态为过压。 | -| COLD | 4 | 表示电池健康状态为低温。 | -| DEAD | 5 | 表示电池健康状态为僵死状态。 | +| 名称 | 默认值 | 描述 | +| ----------- | ---- | -------------- | +| UNKNOWN | 0 | 表示电池健康状态未知。 | +| GOOD | 1 | 表示电池健康状态为正常。 | +| OVERHEAT | 2 | 表示电池健康状态为过热。 | +| OVERVOLTAGE | 3 | 表示电池健康状态为过压。 | +| COLD | 4 | 表示电池健康状态为低温。 | +| DEAD | 5 | 表示电池健康状态为僵死状态。 | diff --git a/zh-cn/application-dev/reference/apis/js-apis-brightness.md b/zh-cn/application-dev/reference/apis/js-apis-brightness.md index 9692cb136f5..d08f6276f3e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-brightness.md +++ b/zh-cn/application-dev/reference/apis/js-apis-brightness.md @@ -2,6 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +> 该模块提供屏幕亮度的设置接口。 ## 导入模块 @@ -21,9 +23,9 @@ setValue(value: number) 设置系统的屏幕亮度。 - 参数: - | 参数名 | 类型 | 必填 | 说明 | - | -------- | -------- | -------- | -------- | - | value | number | 是 | 亮度的值(0~255) | + | 参数名 | 类型 | 必填 | 说明 | + | ----- | ------ | ---- | ----------- | + | value | number | 是 | 亮度的值(0~255) | - 示例: ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-power.md b/zh-cn/application-dev/reference/apis/js-apis-power.md index f4e764d4cef..1130de52f2a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-power.md +++ b/zh-cn/application-dev/reference/apis/js-apis-power.md @@ -2,6 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +> 该模块主要提供重启、关机、查询屏幕状态等接口。 ## 导入模块 @@ -12,7 +14,7 @@ import power from '@ohos.power'; ## 系统能力 -SystemCapability.PowerManager.PowerManager +SystemCapability.PowerManager.PowerManager.Core ## power.shutdownDevice @@ -25,9 +27,9 @@ shutdownDevice(reason: string): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| reason | string | 是 | 关机原因。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ----- | +| reason | string | 是 | 关机原因。 | **示例:** @@ -43,13 +45,13 @@ rebootDevice(reason: string): void 重启设备。 -需要权限:ohos.permission.REBOOT(重启权限)、ohos.permission.REBOOT_RECOVERY(重启并进入recovery模式的权限) +需要权限:ohos.permission.REBOOT(重启权限)、ohos.permission.REBOOT_UPDATER(重启并进入updater模式的权限) **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| reason | string | 是 | 重启原因。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ----- | +| reason | string | 是 | 重启原因。 | **示例:** @@ -67,9 +69,9 @@ isScreenOn(callback: AsyncCallback<boolean>): void **参数:** -| 类型 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| callback | AsyncCallback<boolean> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:亮屏返回true,灭屏返回false。 | +| 类型 | 类型 | 必填 | 说明 | +| -------- | ---------------------------- | ---- | ---------------------------------------- | +| callback | AsyncCallback<boolean> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:亮屏返回true,灭屏返回false。 | **示例:** @@ -91,8 +93,8 @@ isScreenOn(): Promise<boolean> 检测当前设备的亮灭屏状态。 **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ---------------------- | --------------------------------------- | | Promise<boolean> | Promise实例,用于异步获取返回值,亮屏返回true,灭屏返回false。 | **示例:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-runninglock.md b/zh-cn/application-dev/reference/apis/js-apis-runninglock.md index 16c3f0e119a..8a5a26f33b3 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-runninglock.md +++ b/zh-cn/application-dev/reference/apis/js-apis-runninglock.md @@ -2,6 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +> 该模块主要提供Runninglock锁相关操作的接口,包括创建、查询、持锁、释放锁等操作。 ## 导入模块 @@ -13,17 +15,17 @@ import runninglock from '@ohos.runningLock'; ## 系统能力 -SystemCapability.PowerManager.PowerManager +SystemCapability.PowerManager.PowerManager.Core ## RunningLockType RunningLock锁的类型。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| BACKGROUND | 1 | 阻止系统休眠的锁。 | -| PROXIMITY_SCREEN_CONTROL | 2 | 通过接近或者远离状态来控制亮灭屏的锁。 | +| 名称 | 默认值 | 描述 | +| ------------------------ | ---- | ------------------- | +| BACKGROUND | 1 | 阻止系统休眠的锁。 | +| PROXIMITY_SCREEN_CONTROL | 2 | 通过接近或者远离状态来控制亮灭屏的锁。 | ## isRunningLockTypeSupported @@ -34,10 +36,10 @@ isRunningLockTypeSupported(type: RunningLockType, callback: AsyncCallback<boo **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| type | RunningLockType | 是 | 需要查询的锁的类型。 | -| callback | AsyncCallback<boolean> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:支持返回true,不支持返回false。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------- | ---- | ---------------------------------------- | +| type | RunningLockType | 是 | 需要查询的锁的类型。 | +| callback | AsyncCallback<boolean> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:支持返回true,不支持返回false。 | **示例:** @@ -60,14 +62,14 @@ isRunningLockTypeSupported(type: RunningLockType): Promise<boolean> **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| type | RunningLockType | 是 | 需要查询的锁的类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---- | --------------- | ---- | ---------- | +| type | RunningLockType | 是 | 需要查询的锁的类型。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ---------------------- | ---------------------------------------- | | Promise<boolean> | Promise实例,用于异步获取返回值,支持返回true,不支持返回false。 | **示例:** @@ -93,11 +95,11 @@ createRunningLock(name: string, type: RunningLockType, callback: AsyncCallback&l **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| name | string | 是 | 锁的名字。 | -| type | RunningLockType | 是 | 要创建的锁的类型。 | -| callback | AsyncCallback<[RunningLock](#runninglock)> | 是 | 指定的callback回调方法,用于获取返回的RunningLock锁对象。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------- | ---- | -------------------------------------- | +| name | string | 是 | 锁的名字。 | +| type | RunningLockType | 是 | 要创建的锁的类型。 | +| callback | AsyncCallback<[RunningLock](#runninglock)> | 是 | 指定的callback回调方法,用于获取返回的RunningLock锁对象。 | **示例:** @@ -126,15 +128,15 @@ createRunningLock(name: string, type: RunningLockType): Promise<RunningLock&g **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| name | string | 是 | 锁的名字。 | -| type | RunningLockType | 是 | 要创建的锁的类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---- | --------------- | ---- | --------- | +| name | string | 是 | 锁的名字。 | +| type | RunningLockType | 是 | 要创建的锁的类型。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ---------------------------------------- | ---------------------------------- | | Promise<[RunningLock](#runninglock)> | Promise实例,用于异步获取返回的RunningLock锁对象。 | **示例:** @@ -163,9 +165,9 @@ lock(timeout: number): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| timeout | number | 否 | 锁定和持有RunningLock的时长。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------ | ---- | -------------------- | +| timeout | number | 否 | 锁定和持有RunningLock的时长。 | **示例:** @@ -208,8 +210,8 @@ isUsed(): boolean 查询当前Runninglock是持有状态,还是释放状态。 **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------- | ------------------------------------- | | boolean | 当前RunningLock是持有状态返回true,释放状态返回false。 | **示例:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-thermal.md b/zh-cn/application-dev/reference/apis/js-apis-thermal.md index 1231c3e0218..ea63870d427 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-thermal.md +++ b/zh-cn/application-dev/reference/apis/js-apis-thermal.md @@ -2,6 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +> 该模块主要提供设备热状态的监听接口。 ## 导入模块 @@ -15,15 +17,15 @@ import thermal from '@ohos.thermal'; 热档位信息。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| COOL | 0 | 表明设备处于低温的状态,业务执行不受热控的限制。
**系统能力:** SystemCapability.PowerManager.ThermalManager | -| NORMAL | 1 | 表明设备处于正常工作状态,但温度不低,需要注意是否临近发热状态。
**系统能力:** SystemCapability.PowerManager.ThermalManager | -| WARM | 2 | 表明设备已经进入温热状态,部分无感知业务需要考虑停止或延迟执行。
**系统能力:** SystemCapability.PowerManager.ThermalManager | -| HOT | 3 | 表明设备已经明显发热,无感知业务应全面停止,其他业务应考虑降规格及负载。
**系统能力:** SystemCapability.PowerManager.ThermalManager | -| OVERHEATED | 4 | 表明设备已经发热严重,无感知业务应全面停止,主要业务需降低规格及负载。
**系统能力:** SystemCapability.PowerManager.ThermalManager | -| WARNING | 5 | 表明设备已经发热严重并且即将进入紧急状态,无感知业务应全面停止,主要业务应降低至最低规格。
**系统能力:** SystemCapability.PowerManager.ThermalManager | -| EMERGENCY | 6 | 表明设备已经进入紧急状态,所有业务应当全面停止工作,可保留部分紧急求助功能。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| 名称 | 默认值 | 描述 | +| ---------- | ---- | ---------------------------------------- | +| COOL | 0 | 表明设备处于低温的状态,业务执行不受热控的限制。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| NORMAL | 1 | 表明设备处于正常工作状态,但温度不低,需要注意是否临近发热状态。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| WARM | 2 | 表明设备已经进入温热状态,部分无感知业务需要考虑停止或延迟执行。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| HOT | 3 | 表明设备已经明显发热,无感知业务应全面停止,其他业务应考虑降规格及负载。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| OVERHEATED | 4 | 表明设备已经发热严重,无感知业务应全面停止,主要业务需降低规格及负载。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| WARNING | 5 | 表明设备已经发热严重并且即将进入紧急状态,无感知业务应全面停止,主要业务应降低至最低规格。
**系统能力:** SystemCapability.PowerManager.ThermalManager | +| EMERGENCY | 6 | 表明设备已经进入紧急状态,所有业务应当全面停止工作,可保留部分紧急求助功能。
**系统能力:** SystemCapability.PowerManager.ThermalManager | ## thermal.subscribeThermalLevel @@ -36,13 +38,14 @@ subscribeThermalLevel(callback: AsyncCallback<ThermalLevel>): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| callback | AsyncCallback<ThermalLevel> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:热档位信息。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------- | ---- | ---------------------------------------- | +| callback | AsyncCallback<ThermalLevel> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:热档位信息。 | **示例:** ``` +var lev = 0; thermal.subscribeThermalLevel((lev) => { console.info("Thermal level is: " + lev); }) @@ -58,9 +61,9 @@ unsubscribeThermalLevel(callback?: AsyncCallback): void **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| callback | AsyncCallback<void> | 可选 | 指定的callback回调方法,无返回值。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------- | ---- | --------------------- | +| callback | AsyncCallback<void> | 可选 | 指定的callback回调方法,无返回值。 | **示例:** @@ -80,8 +83,8 @@ getThermalLevel(): ThermalLevel **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------ | ------ | | ThermalLevel | 热档位信息。 | **示例:** -- Gitee From d16eeabe29aca7c486f17b37c8ff3c8bc6cf5710 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Fri, 4 Mar 2022 14:09:30 +0800 Subject: [PATCH 116/282] update docs Signed-off-by: annie_wangli --- en/readme/figures/dms-architecture.png | Bin 47693 -> 48217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/readme/figures/dms-architecture.png b/en/readme/figures/dms-architecture.png index e16d44ad783fc68a6a18a22ec497e360ff7dcab9..826d579fdce32aa57080e14141153f7dda7035f7 100644 GIT binary patch literal 48217 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 literal 47693 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 Date: Fri, 4 Mar 2022 14:33:12 +0800 Subject: [PATCH 117/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9await=E5=85=B3?= =?UTF-8?q?=E9=94=AE=E5=AD=97=E7=9A=84=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: PaDaBoo --- .../reference/apis/js-apis-data-preferences.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md index 36fe951e6c8..88849e67760 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md +++ b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md @@ -43,7 +43,7 @@ getPreferences(context: Context, name: string, callback: AsyncCallback<Prefer ``` import Ability from '@ohos.application.Ability' import data_Preferences from '@ohos.data.preferences' - var path = await this.context.getDataBaseDir() + var path = this.context.getDataBaseDir() data_Preferences.getPreferences(this.context, 'mystore', function (err, preferences) { if (err) { console.info("Get the preferences failed, path: " + path + '/mystore') @@ -78,7 +78,7 @@ getPreferences(context: Context, name: string): Promise<Preferences> ``` import Ability from '@ohos.application.Ability' import data_Preferences from '@ohos.data.preferences' - var path = await this.context.getDataBaseDir() + var path = this.context.getDataBaseDir() let promise = data_Preferences.getPreferences(this.context, 'mystore') promise.then((preferences) => { preferences.putSync('startup', 'auto') -- Gitee From 26a59debd44fae5c9ecf752c6badedd8fbc20735 Mon Sep 17 00:00:00 2001 From: PaDaBoo Date: Fri, 4 Mar 2022 14:44:48 +0800 Subject: [PATCH 118/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E5=85=B3=E9=94=AE=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: PaDaBoo --- .../apis/js-apis-data-preferences.md | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md index 88849e67760..d7fad75e681 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md +++ b/zh-cn/application-dev/reference/apis/js-apis-data-preferences.md @@ -17,10 +17,8 @@ import data_Preferences from '@ohos.data.preferences' | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| MAX_KEY_LENGTH | string | 是 | 否 | key的最大长度限制,大小为80字节。
- 系统能力: -SystemCapability.DistributedDataManager.Preferences.Core | -| MAX_VALUE_LENGTH | string | 是 | 否 | string类型value的最大长度限制,大小为8192字节。
- 系统能力: -SystemCapability.DistributedDataManager.Preferences.Core | +| MAX_KEY_LENGTH | string | 是 | 否 | key的最大长度限制,大小为80字节。
**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core | +| MAX_VALUE_LENGTH | string | 是 | 否 | string类型value的最大长度限制,大小为8192字节。
**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core | ## data_Preferences.getPreferences @@ -30,7 +28,7 @@ getPreferences(context: Context, name: string, callback: AsyncCallback<Prefer 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用callback形式返回结果。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -61,7 +59,7 @@ getPreferences(context: Context, name: string): Promise<Preferences> 读取指定文件,将数据加载到Preferences实例,用于数据操作,使用Promise方式作为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -95,7 +93,7 @@ deletePreferences(context: Context, name: string, callback: AsyncCallback<voi 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用callback方式作为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -124,7 +122,7 @@ deletePreferences(context: Context, name: string): Promise<void> 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -158,7 +156,7 @@ removePreferencesFromCache(context: Context, name: string, callback: AsyncCallba 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -189,7 +187,7 @@ removePreferencesFromCache(context: Context, name: string): Promise<void> 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -228,7 +226,7 @@ get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -257,7 +255,7 @@ get(key: string, defValue: ValueType): Promise<ValueType> 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -289,7 +287,7 @@ put(key: string, value: ValueType, callback: AsyncCallback<void>): void 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -318,7 +316,7 @@ put(key: string, value: ValueType): Promise<void> 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -350,7 +348,7 @@ has(key: string, callback: AsyncCallback<boolean>): boolean 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -385,7 +383,7 @@ has(key: string): Promise<boolean> 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -418,7 +416,7 @@ delete(key: string, callback: AsyncCallback<void>): void 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -446,7 +444,7 @@ delete(key: string): Promise<void> 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -477,7 +475,7 @@ flush(callback: AsyncCallback<void>): void 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -504,7 +502,7 @@ flush(): Promise<void> 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 返回值: | 类型 | 说明 | @@ -530,7 +528,7 @@ clear(callback: AsyncCallback<void>): void 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -557,7 +555,7 @@ clear(): Promise<void> 此方法为异步方法。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 返回值: | 类型 | 说明 | @@ -581,7 +579,7 @@ on(type: 'change', callback: Callback<{ key : string }>): void 订阅数据变更者类,订阅的key的值发生变更后,在执行flush方法后,callback方法会被回调。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 说明 | @@ -606,7 +604,7 @@ off(type: 'change', callback: Callback<{ key : string }>): void 当不再进行订阅数据变更时,使用此接口取消订阅。 -- 系统能力:SystemCapability.DistributedDataManager.Preferences.Core +**系统能力**:SystemCapability.DistributedDataManager.Preferences.Core - 参数: | 参数名 | 类型 | 说明 | -- Gitee From d7772d61e2a4ab5055bc794cd87ba56b8e32f432 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 4 Mar 2022 14:19:05 +0800 Subject: [PATCH 119/282] Fix: USB Moudle delete usb. prefix Signed-off-by: YOUR_NAME --- .../reference/apis/js-apis-usb.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-usb.md b/zh-cn/application-dev/reference/apis/js-apis-usb.md index ab99f323c24..868cbf4c446 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-usb.md +++ b/zh-cn/application-dev/reference/apis/js-apis-usb.md @@ -11,7 +11,7 @@ import usb from "@ohos.usb"; ## usb.getDevices -usb.getDevices(): Array<Readonly<USBDevice>> +getDevices(): Array<Readonly<USBDevice>> 获取USB设备列表。 @@ -81,7 +81,7 @@ usb.getDevices(): Array<Readonly<USBDevice>> ## usb.connectDevice -usb.connectDevice(device: USBDevice): Readonly<USBDevicePipe> +connectDevice(device: USBDevice): Readonly<USBDevicePipe> 打开USB设备。 @@ -108,7 +108,7 @@ usb.connectDevice(device: USBDevice): Readonly<USBDevicePipe> ## usb.hasRight -usb.hasRight(deviceName: string): boolean +hasRight(deviceName: string): boolean 判断是否有权访问该设备。 @@ -134,7 +134,7 @@ usb.hasRight(deviceName: string): boolean ## usb.requestRight -usb.requestRight(deviceName: string): Promise<boolean> +requestRight(deviceName: string): Promise<boolean> 请求软件包的临时权限以访问设备。 @@ -161,7 +161,7 @@ usb.requestRight(deviceName: string): Promise<boolean> ## usb.claimInterface -usb.claimInterface(pipe: USBDevicePipe, iface: USBInterface, force?: boolean): number +claimInterface(pipe: USBDevicePipe, iface: USBInterface, force?: boolean): number 注册通信接口。 @@ -190,7 +190,7 @@ usb.claimInterface(pipe: USBDevicePipe, iface: USBInterface, force?: boolean): n ## usb.releaseInterface -usb.releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number +releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number 释放注册过的通信接口。 @@ -218,7 +218,7 @@ usb.releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number ## usb.setConfiguration -usb.setConfiguration(pipe: USBDevicePipe, config: USBConfig): number +setConfiguration(pipe: USBDevicePipe, config: USBConfig): number 设置设备配置。 @@ -246,7 +246,7 @@ usb.setConfiguration(pipe: USBDevicePipe, config: USBConfig): number ## usb.setInterface -usb.setInterface(pipe: USBDevicePipe, iface: USBInterface): number +setInterface(pipe: USBDevicePipe, iface: USBInterface): number 设置设备接口。 @@ -274,7 +274,7 @@ usb.setInterface(pipe: USBDevicePipe, iface: USBInterface): number ## usb.getRawDescriptor -usb.getRawDescriptor(pipe: USBDevicePipe): Uint8Array +getRawDescriptor(pipe: USBDevicePipe): Uint8Array 获取原始的USB描述符。 @@ -300,7 +300,7 @@ usb.getRawDescriptor(pipe: USBDevicePipe): Uint8Array ## usb.getFileDescriptor -usb.getFileDescriptor(pipe: USBDevicePipe): number +getFileDescriptor(pipe: USBDevicePipe): number 获取文件描述符。 @@ -326,7 +326,7 @@ usb.getFileDescriptor(pipe: USBDevicePipe): number ## usb.controlTransfer -usb.controlTransfer(pipe: USBDevicePipe, contrlparam: USBControlParams, timeout?: number): Promise<number> +controlTransfer(pipe: USBDevicePipe, contrlparam: USBControlParams, timeout?: number): Promise<number> 控制传输。 @@ -356,7 +356,7 @@ usb.controlTransfer(pipe: USBDevicePipe, contrlparam: USBControlParams, timeout? ## usb.bulkTransfer -usb.bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout?: number): Promise<number> +bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout?: number): Promise<number> 批量传输。 @@ -390,7 +390,7 @@ usb.bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, ## usb.closePipe -usb.closePipe(pipe: USBDevicePipe): number +closePipe(pipe: USBDevicePipe): number 关闭设备消息控制通道。 @@ -536,8 +536,8 @@ USB设备消息传输通道,用于确定设备。 | 名称 | 默认值 | 说明 | | -------- | -------- | -------- | -| USB_REQUEST_TYPE_STANDARD | 0 | 写数据,主设备往从设备。
**系统能力**: SystemCapability.USB.USBManager | -| USB_REQUEST_TYPE_CLASS | 0x80 | 读数据,从设备往主设备。
**系统能力**: SystemCapability.USB.USBManager | +| USB_REQUEST_DIR_TO_DEVICE | 0 | 写数据,主设备往从设备。
**系统能力**: SystemCapability.USB.USBManager | +| USB_REQUEST_DIR_FROM_DEVICE | 0x80 | 读数据,从设备往主设备。
**系统能力**: SystemCapability.USB.USBManager | | 名称 | 默认值 | 说明 | | -------- | -------- | -------- | -- Gitee From adb6bacdbf6664ea0a3fa4dcf16522ceae37f5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E?= Date: Fri, 4 Mar 2022 15:49:57 +0800 Subject: [PATCH 120/282] =?UTF-8?q?=E5=BB=B6=E8=BF=9F=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=B0=83=E5=BA=A6Extension=E5=90=8D=E7=A7=B0=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈明 --- ...md => js-apis-WorkSchedulerExtensionAbility.md} | 14 +++++++------- .../work-scheduler/work-scheduler-dev-guide.md | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) rename zh-cn/application-dev/reference/apis/{js-apis-workSchedulerExtension.md => js-apis-WorkSchedulerExtensionAbility.md} (57%) diff --git a/zh-cn/application-dev/reference/apis/js-apis-workSchedulerExtension.md b/zh-cn/application-dev/reference/apis/js-apis-WorkSchedulerExtensionAbility.md similarity index 57% rename from zh-cn/application-dev/reference/apis/js-apis-workSchedulerExtension.md rename to zh-cn/application-dev/reference/apis/js-apis-WorkSchedulerExtensionAbility.md index 335929c07c3..99af6cd9045 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-workSchedulerExtension.md +++ b/zh-cn/application-dev/reference/apis/js-apis-WorkSchedulerExtensionAbility.md @@ -7,10 +7,10 @@ ## 导入模块 ``` -import workSchedulerExtension from '@ohos.WorkSchedulerExtension' +import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility' ``` -## WorkSchedulerExtension.onWorkStart +## WorkSchedulerExtensionAbility.onWorkStart - **系统能力**: SystemCapability.ResourceSchedule.WorkScheduler @@ -23,14 +23,14 @@ onWorkStart(workInfo: WorkInfo); - **示例**: ``` - export default class MyWorkSchedulerExtension extends WorkSchedulerExtension { + export default class MyWorkSchedulerExtensionAbility extends WorkSchedulerExtensionAbility { onWorkStart(workInfo) { - console.log('MyWorkSchedulerExtension onWorkStart' + JSON.stringify(workInfo)); + console.log('MyWorkSchedulerExtensionAbility onWorkStart' + JSON.stringify(workInfo)); } } ``` -## WorkSchedulerExtension.onWorkStop +## WorkSchedulerExtensionAbility.onWorkStop - **系统能力**: SystemCapability.ResourceSchedule.WorkScheduler @@ -43,9 +43,9 @@ onWorkStop(workInfo: WorkInfo); - **示例**: ``` - export default class MyWorkSchedulerExtension extends WorkSchedulerExtension { + export default class MyWorkSchedulerExtensionAbility extends WorkSchedulerExtensionAbility { onWorkStop(workInfo) { - console.log('MyWorkSchedulerExtension onWorkStop' + JSON.stringify(workInfo)); + console.log('MyWorkSchedulerExtensionAbility onWorkStop' + JSON.stringify(workInfo)); } } ``` \ No newline at end of file diff --git a/zh-cn/application-dev/work-scheduler/work-scheduler-dev-guide.md b/zh-cn/application-dev/work-scheduler/work-scheduler-dev-guide.md index d61b52a6d54..4d72584bf0f 100644 --- a/zh-cn/application-dev/work-scheduler/work-scheduler-dev-guide.md +++ b/zh-cn/application-dev/work-scheduler/work-scheduler-dev-guide.md @@ -13,7 +13,7 @@ import workScheduler from '@ohos.workScheduler'; 回调相关接口包导入: ```js -import WorkSchedulerExtension from '@ohos.WorkSchedulerExtension'; +import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility'; ``` ### 延迟任务调度 @@ -60,14 +60,14 @@ function onWorkStop(work: WorkInfo): void; | 延迟调度任务结束回调 **开发对应的Extension** - import WorkSchedulerExtension from '@ohos.WorkSchedulerExtension'; + import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility'; - export default class MyWorkSchedulerExtension extends WorkSchedulerExtension { + export default class MyWorkSchedulerExtensionAbility extends WorkSchedulerExtensionAbility { onWorkStart(workInfo) { - console.log('MyWorkSchedulerExtension onWorkStart' + JSON.stringify(workInfo)); + console.log('MyWorkSchedulerExtensionAbility onWorkStart' + JSON.stringify(workInfo)); } onWorkStop(workInfo) { - console.log('MyWorkSchedulerExtension onWorkStop' + JSON.stringify(workInfo)); + console.log('MyWorkSchedulerExtensionAbility onWorkStop' + JSON.stringify(workInfo)); } } -- Gitee From 406f552e2ba9aa88e16757b22baddec645e1bb4e Mon Sep 17 00:00:00 2001 From: lixingchi1 Date: Mon, 28 Feb 2022 12:05:52 +0800 Subject: [PATCH 121/282] add developer web doc. Signed-off-by: lixingchi1 --- .../ui/ui-ts-components-web.md | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 zh-cn/application-dev/ui/ui-ts-components-web.md diff --git a/zh-cn/application-dev/ui/ui-ts-components-web.md b/zh-cn/application-dev/ui/ui-ts-components-web.md new file mode 100644 index 00000000000..05d6270d9c5 --- /dev/null +++ b/zh-cn/application-dev/ui/ui-ts-components-web.md @@ -0,0 +1,195 @@ +# Web + +Web是提供网页显示能力的组件,具体用法请参考 [Web API](../reference/arkui-ts/ts-media-components-web.md)。 + +## 创建组件 + +在main/ets/MainAbility/pages目录下的ets文件中创建一个Web组件。在web组件中通过src指定引用的网页路径,controller为组件的控制器,通过controller绑定Web组件,用于调用Web组件的方法。 + + ``` + // xxx.ets + @Entry + @Component + struct WebComponent { + controller: WebController = new WebController(); + build() { + Column() { + Web({ src: 'https://www.example.com', controller: this.controller }) + } + } + } + ``` + +## 设置样式和属性 + +Web组件的使用需要添加丰富的页面样式和功能属性。设置height、padding样式可为Web组件添加高和内边距,设置fileAccess属性可为Web组件添加文件访问权限,设置javaScriptAccess属性为true使Web组件具有执行JavaScript代码的能力。 + +``` +// xxx.ets +@Entry +@Component +struct WebComponent { + fileAccess: boolean = true; + controller: WebController = new WebController(); + build() { + Column() { + Text('Hello world!') + .fontSize(20) + Web({ src: 'https://www.example.com', controller: this.controller }) + // 设置高和内边距 + .height(500) + .padding(20) + // 设置文件访问权限和脚本执行权限 + .fileAccess(this.fileAccess) + .javaScriptAccess(true) + Text('End') + .fontSize(20) + } + } +} +``` +## 添加事件和方法 + +为Web组件添加onProgressChange事件,该事件回调Web引擎加载页面的进度值。将该进度值赋值给Progress组件的value,控制Progress组件的状态。当进度为100%时隐藏Progress组件,Web页面加载完成。 + +``` +// xxx.ets +@Entry +@Component +struct WebComponent { + @State progress: number = 0; + @State hideProgress: boolean = true; + fileAccess: boolean = true; + controller: WebController = new WebController(); + build() { + Column() { + Text('Hello world!') + .fontSize(20) + Progress({value: this.progress, total: 100}) + .color('#0000ff') + .visibility(this.hideProgress ? Visibility.None : Visibility.Visible) + Web({ src: 'https://example.com', controller: this.controller }) + .fileAccess(this.fileAccess) + .javaScriptAccess(true) + .height(500) + .padding(20) + // 添加onProgressChange事件 + .onProgressChange(e => { + this.progress = e.newProgress; + // 当进度100%时,进度条消失 + if (this.progress === 100) { + this.hideProgress = true; + } else { + this.hideProgress = false; + } + }) + Text('End') + .fontSize(20) + } + } +} +``` +在onPageEnd事件中添加runJavaScript方法。onPageEnd事件是网页退出时的回调,runJavaScript方法可以执行HTML中的JavaScript脚本。当页面退出时,触发onPageEnd事件,调用HTML文件中的test方法,在控制台打印信息。 + +``` +// xxx.ets +@Entry +@Component +struct WebComponent { + @State progress: number = 0; + @State hideProgress: boolean = true; + fileAccess: boolean = true; + // 定义Web组件的控制器controller + controller: WebController = new WebController(); + build() { + Column() { + Text('Hello world!') + .fontSize(20) + Progress({value: this.progress, total: 100}) + .color('#0000ff') + .visibility(this.hideProgress ? Visibility.None : Visibility.Visible) + // 初始化Web组件,并绑定controller + Web({ src: 'https://gitee.com', controller: this.controller }) + .fileAccess(this.fileAccess) + .javaScriptAccess(true) + .height(500) + .padding(20) + .onProgressChange(e => { + this.progress = e.newProgress; + if (this.progress === 100) { + this.hideProgress = true; + } else { + this.hideProgress = false; + } + }) + .onPageEnd(e => { + // test()在index.html中定义 + this.controller.runJavaScript('test()'); + console.info('url: ', e.url); + }) + Text('End') + .fontSize(20) + } + } +} +``` + +在main/resources/rawfile目录下创建一个HTML文件。 + +``` + + + + + + Hello world! + + + +``` +## 场景示例 + +​该场景实现了Web组件中视频的动态播放。首先在HTML页面内嵌入视频资源,再使用Web组件的控制器调用onActive和onInactive方法激活和暂停页面渲染。页面消失时,Web组件停止渲染,视频暂停播放;页面显示时,激活Web组件,视频继续播放。 + + ``` + // xxx.ets + @Entry + @Component + struct WebComponent { + controller: WebController = new WebController(); + build() { + Column() { + Web({ src: $rawfile('index.html'), controller: this.controller }) + .fileAccess(true) + } + } + + onPageHide() { + // 页面消失时调用 + this.controller.onInactive(); + } + + onPageShow() { + // 页面显示时调用 + this.controller.onActive(); + } + } + ``` + + ``` + + + + + + + + + ``` -- Gitee From 4d1e120abed0fa79d674bc3f0456b96e2809f384 Mon Sep 17 00:00:00 2001 From: liwenzhen Date: Mon, 28 Feb 2022 11:06:26 +0800 Subject: [PATCH 122/282] add web component reference for web-like Paradigm Signed-off-by: liwenzhen Change-Id: I65da67e833dee4acfb460bb556515222d239bb33 --- .../arkui-js/js-components-basic-web.md | 70 +++++++++++++++++++ .../reference/arkui-ts/Readme-CN.md | 2 +- ...ents-web.md => ts-basic-components-web.md} | 0 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md rename zh-cn/application-dev/reference/arkui-ts/{ts-media-components-web.md => ts-basic-components-web.md} (100%) diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md new file mode 100644 index 00000000000..83fb9c4f41a --- /dev/null +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md @@ -0,0 +1,70 @@ +# web +展示网页内容的组件。 +>![](../../public_sys-resources/icon-note.gif) **说明:** +> 该组件从API version 6开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +## 权限列表 +ohos.permission.INTERNET + +## 约束 +web组件不跟随转场动画。一个页面仅支持一个web组件。 + +## 子组件 +不支持。 + +## 属性 + +| 名称 | 参数类型 | 默认值 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| src | string | - | 否 |设置需要显示网页的地址,网址的域名必须为https协议且经过ICP备案。| +| id | string | - | 否 | 组件的唯一标识。 | + + +## 样式 +仅支持通用样式中的width8+、height8+、padding8+、margin8+、border8+。 + +## 事件 +仅支持如下事件: +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| pagestart | {url: string} | 加载网页时触发。 | +| pagefinish | {url: string} | 网页加载结束时触发。 | +| error | {url: string, errorCode: number, description: string} | 加载网页出现错误时触发或打开网页出错时触发。 | + +## 方法 +仅支持如下方法: +| 名称 | 参数 | 描述 | +| -------- | -------- | -------- | +| reload | - | 重新加载页面。 | + +## 示例 +``` + +

+ + +
+``` + +``` + +export default { + reloadWeb() { + this.$element('web').reload() + }, + + pageStart: function(e) { + console.info('web pageStart: ' + e.url) + }, + + pageFinish: function(e) { + console.info('web pageFinish: ' + e.url) + }, + + pageError: function(e) { + console.info('web pageError url: ' + e.url) + console.info('web pageError errorCode: ' + e.errorCode) + console.info('web pageError description: ' + e.description) + } +} +``` \ No newline at end of file diff --git a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md index 1179c545604..f61a6db1079 100644 --- a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md +++ b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md @@ -48,6 +48,7 @@ - [SwipeGesture](ts-basic-gestures-swipegesture.md) - [组合手势](ts-combined-gestures.md) - 基础组件 + - [Web](ts-basic-components-web.md) - [Blank](ts-basic-components-blank.md) - [Button](ts-basic-components-button.md) - [DataPanel](ts-basic-components-datapanel.md) @@ -94,7 +95,6 @@ - [TabContent](ts-container-tabcontent.md) - 媒体组件 - [Video](ts-media-components-video.md) - - [Web](ts-media-components-web.md) - 绘制组件 - [Circle](ts-drawing-components-circle.md) - [Ellipse](ts-drawing-components-ellipse.md) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md b/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md similarity index 100% rename from zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md rename to zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md -- Gitee From bcff974c321e0ac219dda21312d194ab754b1f49 Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Fri, 4 Mar 2022 16:41:25 +0800 Subject: [PATCH 123/282] refresh Signed-off-by: zhouyongfei --- .../reference/apis/js-apis-inputmethod.md | 38 ++++---- .../apis/js-apis-inputmethodengine.md | 88 ++++++++++--------- 2 files changed, 65 insertions(+), 61 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-inputmethod.md b/zh-cn/application-dev/reference/apis/js-apis-inputmethod.md index 3824dc28314..239cbad0772 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-inputmethod.md +++ b/zh-cn/application-dev/reference/apis/js-apis-inputmethod.md @@ -68,7 +68,7 @@ getInputMethodSetting(): InputMethodSetting ## InputMethodController
-下列API示例中都需使用[getInputMethodController](#getInputMethodController)回调获取到InputMethodController实例,再通过此实例调用对应方法 +下列API示例中都需使用[getInputMethodController](#getInputMethodController)回调获取到InputMethodController实例,再通过此实例调用对应方法。 ### stopInput @@ -100,11 +100,11 @@ stopInput(): Promise<boolean> **系统能力**: SystemCapability.MiscServices.InputMethod -- 参数 +- 返回值 - | 参数名 | 类型 | 必填 | 说明 | - | -------- | -------- | -------- | -------- | - | callback | Promise<boolean> | 是 | 返回输入法隐藏是否成功。 | + | 类型 | 说明 | + | -------- | -------- | + | Promise<boolean> | 返回输入法隐藏是否成功。 | - 示例 @@ -114,11 +114,11 @@ stopInput(): Promise<boolean> console.info('stopInput isSuccess = ' + isSuccess); ``` -## InputMethodSetting +## InputMethodSetting8+ -下列API示例中都需使用[getInputMethodSetting](#getInputMethodSetting)回调获取到InputMethodSetting实例,再通过此实例调用对应方法 +下列API示例中都需使用[getInputMethodSetting](#getInputMethodSetting)回调获取到InputMethodSetting实例,再通过此实例调用对应方法。 -### listInputMethod8+ +### listInputMethod listInputMethod(callback: AsyncCallback<Array<InputMethodProperty>>): void @@ -126,10 +126,10 @@ listInputMethod(callback: AsyncCallback<Array<InputMethodProperty>>) **系统能力**: SystemCapability.MiscServices.InputMethod -- 返回值 - | 类型 | 说明 | - | ------------------------------- | ------------------------------------------------------------ | - | Array<[InputMethodProperty](#InputMethodProperty)> | 返回已安装输入法列表。 | +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------------------------------------------------- | ---- | ---------------------- | + | callback | Array<[InputMethodProperty](#InputMethodProperty)> | 是 | 返回已安装输入法列表。 | - 示例 ``` @@ -139,7 +139,7 @@ listInputMethod(callback: AsyncCallback<Array<InputMethodProperty>>) }); ``` -### listInputMethod8+ +### listInputMethod listInputMethod(): Promise<Array<InputMethodProperty>> @@ -148,9 +148,9 @@ listInputMethod(): Promise<Array<InputMethodProperty>> **系统能力**: SystemCapability.MiscServices.InputMethod - 返回值 - | 类型 | 说明 | - | ------------------------------- | ------------------------------------------------------------ | - | Array<[InputMethodProperty](#InputMethodProperty)> | 返回已安装输入法列表。 | + | 类型 | 说明 | + | ----------------------------------------------------------- | ---------------------- | + | Promise> | 返回已安装输入法列表。 | - 示例 ``` @@ -161,7 +161,7 @@ listInputMethod(): Promise<Array<InputMethodProperty>> } ``` -### displayOptionalInputMethod8+ +### displayOptionalInputMethod displayOptionalInputMethod(callback: AsyncCallback<void>): void @@ -182,7 +182,7 @@ displayOptionalInputMethod(callback: AsyncCallback<void>): void }); ``` -### displayOptionalInputMethod8+ +### displayOptionalInputMethod displayOptionalInputMethod(): Promise<void> @@ -192,7 +192,7 @@ displayOptionalInputMethod(callback: AsyncCallback<void>): void - 返回值 -| 参数名 | 说明 | +| 类型 | 说明 | | -------- | -------- | | Promise<void> | 回调函数。 | diff --git a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md index 6d7e7e6f862..00e4a69a66b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md +++ b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md @@ -46,7 +46,7 @@ import inputMethodEngine from '@ohos.inputMethodEngine'; getInputMethodEngine(): InputMethodEngine -获取服务端实例[InputMethodEngine](#InputMethodEngine)。 +获取服务端实例。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -66,7 +66,7 @@ getInputMethodEngine(): InputMethodEngine createKeyboardDelegate(): KeyboardDelegate -获取客户端监听实例[KeyboardDelegate](#KeyboardDelegate)。 +获取客户端监听实例。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -90,7 +90,7 @@ createKeyboardDelegate(): KeyboardDelegate on(type: 'inputStart', callback: (kbController: KeyboardController, textInputClient: TextInputClient) => void): void; -订阅输入法绑定成功事件,使用callback输入法操作相关实例。 +订阅输入法绑定成功事件,使用callback回调返回输入法操作相关实例。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -99,7 +99,7 @@ on(type: 'inputStart', callback: (kbController: KeyboardController, textInputCli | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------- | ---- | ------------------------------------------------------------ | | type | string | 是 | 设置监听类型。
-type为‘inputStart’时表示订阅输入法绑定。 | -| callback | [KeyboardController](#KeyboardController), [TextInputClient](#TextInputClient) | 是 | 回调返回监听到的信息。 | +| callback | [KeyboardController](#KeyboardController), [TextInputClient](#TextInputClient) | 是 | 回调返回输入法操作相关实例。 | - 示例: @@ -123,7 +123,7 @@ off(type: 'inputStart', callback?: (kbController: KeyboardController, textInputC | 参数名 | 类型 | 必填 | 说明 | | -------- | -------------------- | ---- | ------------------------ | | type | string | 是 | 设置监听类型。
-type为‘inputStart’时表示订阅输入法绑定。 | - | callback | [KeyboardController](#KeyboardController), [TextInputClient](#TextInputClient) | 否 | 回调返回监听到的信息。 | + | callback | [KeyboardController](#KeyboardController), [TextInputClient](#TextInputClient) | 否 | 回调返回输入法操作相关实例。 | @@ -146,7 +146,7 @@ on(type: 'keyboardShow'|'keyboardHide', callback: () => void): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | ------ | ---- | ------------------------------------------------------------ | | type | string | 是 | 设置监听类型。
- type为'keyboardShow',表示订阅输入法显示。
- type为'keyboardHide',表示订阅输入法隐藏。 | - | callback | void | 否 | 无返回值。 | + | callback | void | 否 | 无回调函数。 | - 示例: @@ -169,7 +169,7 @@ off(type: 'keyboardShow'|'keyboardHide', callback?: () => void): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | ------ | ---- | ------------------------------------------------------------ | | type | string | 是 | 设置监听类型。
- type为'keyboardShow',表示订阅输入法显示。
- type为'keyboardHide',表示订阅输入法隐藏。 | - | callback | void | 否 | 无返回值。 | + | callback | void | 否 | 无回调函数。 | - 示例: @@ -180,13 +180,13 @@ off(type: 'keyboardShow'|'keyboardHide', callback?: () => void): void; ## KeyboardDelegate -下列API示例中都需使用[createKeyboardDelegate](#createKeyboardDelegate)回调获取到TextInputClient实例,再通过此实例调用对应方法。 +下列API示例中都需使用[createKeyboardDelegate](#createKeyboardDelegate)回调获取到KeyboardDelegate实例,再通过此实例调用对应方法。 ### on('keyDown'|'keyUp') on(type: 'keyDown'|'keyUp', callback: (event: KeyEvent) => boolean): void; -订阅硬键盘事件,使用callback回调按键信息。 +订阅硬键盘事件,使用callback回调返回按键信息。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -220,7 +220,7 @@ off(type: 'keyDown'|'keyUp', callback?: (event: KeyEvent) => boolean): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | --------------------- | ---- | ------------------------------------------------------------ | | type | string | 是 | 设置监听类型。
- type为'keyDown',表示订阅硬键盘按下。
- type为'keyUp',表示订阅硬键盘抬起。 | - | callback | [KeyEvent](#KeyEvent) | 否 | 回调返回监听到的信息。 | + | callback | [KeyEvent](#KeyEvent) | 否 | 回调返回按键信息。 | - 示例: @@ -232,7 +232,7 @@ off(type: 'keyDown'|'keyUp', callback?: (event: KeyEvent) => boolean): void; on(type: 'cursorContextChange', callback: (x: number, y:number, height:number) => void): void; -订阅光标变化事件,使用callback返回光标信息。 +订阅光标变化事件,使用callback回调返回光标信息。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -241,7 +241,7 @@ on(type: 'cursorContextChange', callback: (x: number, y:number, height:number) = | 参数名 | 类型 | 必填 | 说明 | | -------- | ------ | ---- | ------------------------------------------------------------ | | type | string | 是 | 光标变化事件。
-type为’cursorContextChange‘时,表示光标变化。 | - | callback | number | 是 | 回调返回监听到的信息。 | + | callback | number | 是 | 回调返回光标信息。 | @@ -266,7 +266,7 @@ off(type: 'cursorContextChange', callback?: (x: number, y:number, height:number) | 参数名 | 类型 | 必填 | 说明 | | -------- | -------------------- | ---- | ------------------------ | | type | string | 是 | 光标变化事件。
-type为’cursorContextChange‘时,表示光标变化。 | - | callback | number | 否 | 回调返回监听到的信息。 | + | callback | number | 否 | 回调返回光标信息。 | - 示例: @@ -278,7 +278,7 @@ off(type: 'cursorContextChange', callback?: (x: number, y:number, height:number) on(type: 'selectionChange', callback: (oldBegin: number, oldEnd: number, newBegin: number, newEnd: number) => void): void; -订阅文本选择变化事件,使用callback回调文本选择信息。 +订阅文本选择变化事件,使用callback回调返回文本选择信息。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -287,7 +287,7 @@ on(type: 'selectionChange', callback: (oldBegin: number, oldEnd: number, newBegi | 参数名 | 类型 | 必填 | 说明 | | -------- | ------ | ---- | ------------------------------------------------------------ | | type | string | 是 | 文本选择变化事件。
-type为’selectionChange‘时,表示选择文本变化。 | - | callback | number | 是 | 回调返回监听到的信息。 | + | callback | number | 是 | 回调返回文本选择信息。 | - 示例: @@ -310,7 +310,7 @@ off(type: 'selectionChange', callback?: (oldBegin: number, oldEnd: number, newBe | 参数名 | 类型 | 必填 | 说明 | | -------- | -------------------- | ---- | ------------------------ | | type | string | 是 | 文本选择变化事件。
-type为’selectionChange‘时,表示选择文本变化。 | - | callback | number | 否 | 回调返回监听到的信息。 | + | callback | number | 否 | 回调返回文本选择信息。 | - 示例: @@ -323,7 +323,7 @@ off(type: 'selectionChange', callback?: (oldBegin: number, oldEnd: number, newBe on(type: 'textChange', callback: (text: string) => void): void; -订阅文本变化事件,使用callback回调当前文本内容。 +订阅文本变化事件,使用callback回调返回当前文本内容。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -332,7 +332,7 @@ on(type: 'textChange', callback: (text: string) => void): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------- | ---- | ------------------------------------------------------------ | | type | string | 是 | 文本变化事件。
-type为’textChange‘时,表示当前文本变化。 | - | callback | string | 是 | 回调返回监听到的信息。 | + | callback | string | 是 | 回调返回当前文本内容。 | - 示例: @@ -355,7 +355,7 @@ off(type: 'textChange', callback?: (text: string) => void): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | -------------------- | ---- | ------------------------ | | type | string | 是 | 文本变化事件。
-type为’textChange‘时,表示当前文本变化。 | - | callback | string | 否 | 回调返回监听到的信息。 | + | callback | string | 否 | 回调返回当前文本内容。 | - 示例: @@ -363,8 +363,6 @@ off(type: 'textChange', callback?: (text: string) => void): void; KeyboardDelegate.off('textChange'); ``` - - ## KeyboardController 下列API示例中都需使用[inputStart](#inputStart)回调获取到KeyboardController实例,再通过此实例调用对应方法。 @@ -377,6 +375,12 @@ hideKeyboard(callback: AsyncCallback<void>): void **系统能力**: SystemCapability.MiscServices.InputMethod +- 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------- | ---- | ------------ | + | callback | AsyncCallback<void> | 否 | 不需要的参数 | + - 示例 @@ -421,7 +425,7 @@ getForward(length:number, callback: AsyncCallback<string>): void - 示例 ``` - var text = TextInputClient.getForward(5,(text) =>{ + TextInputClient.getForward(5,(text) =>{ console.info("text = " + text); }); ``` @@ -441,13 +445,10 @@ getForward(length:number): Promise<string> | length | number | 是 | 文本长度。 | - 返回值 - ​ | 类型 | 说明 | | ------------------------------- | ------------------------------------------------------------ | | Promise<string> | 返回文本。 | - - ​ - + - 示例 ``` var text = TextInputClient.getForward(5); @@ -471,7 +472,7 @@ getBackward(length:number, callback: AsyncCallback<string>): void - 示例 ``` - var text = TextInputClient.getBackward(5,(text)=>{ + TextInputClient.getBackward(5,(text)=>{ console.info("text = " + text); }); ``` @@ -572,6 +573,7 @@ deleteBackward(length:number, callback: AsyncCallback<boolean>): void ### deleteBackward deleteBackward(length:number): Promise<boolean> + 删除光标后固定长度的文本。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -604,7 +606,7 @@ sendKeyFunction(action:number, callback: AsyncCallback<boolean>): void | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | length | number | 是 | 文本长度。 | + | action | number | 是 | 编辑框属性。 | | callback | AsyncCallback<boolean> | 是 | 操作成功与否。 | - 示例 @@ -625,7 +627,7 @@ sendKeyFunction(action:number): Promise<boolean> - 参数 | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | length | number | 是 | 文本长度。 | + | action | number | 是 | 编辑框属性。 | - 返回值 | 类型 | 说明 | @@ -635,8 +637,8 @@ sendKeyFunction(action:number): Promise<boolean> - 示例 ``` - var isSuccess = TextInputClient.sendKeyFunction(inputMethod.ENTER_KEY_TYPE_NEXT); - console.info("isSuccess = " + isSuccess); + var isSuccess = TextInputClient.sendKeyFunction(inputMethod.ENTER_KEY_TYPE_NEXT); + console.info("isSuccess = " + isSuccess); ``` ### insertText @@ -664,6 +666,7 @@ insertText(text:string, callback: AsyncCallback<boolean>): void ### insertText insertText(text:string): Promise<boolean> + 插入文本。 **系统能力**: SystemCapability.MiscServices.InputMethod @@ -681,22 +684,22 @@ insertText(text:string): Promise<boolean> - 示例 ``` - var isSuccess = TextInputClient.insertText("test"); - console.info("isSuccess = " + isSuccess); + var isSuccess = TextInputClient.insertText("test"); + console.info("isSuccess = " + isSuccess); ``` ### getEditorAttribute getEditorAttribute(callback: AsyncCallback<EditorAttribute>): void -获取编辑框属性[EditorAttribute](#EditorAttribute)实例。 +获取编辑框属性值。 **系统能力**: SystemCapability.MiscServices.InputMethod - 参数 | 参数名 | 类型 | 必填 | 说明 | | ------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | - | callback | AsyncCallback<EditorAttribute> | 是 | 编辑框属性实例。 | + | callback | AsyncCallback<[EditorAttribute](#EditorAttribute)> | 是 | 编辑框属性值。 | - 示例 ``` @@ -707,14 +710,15 @@ getEditorAttribute(callback: AsyncCallback<EditorAttribute>): void ### getEditorAttribute getEditorAttribute(): Promise<EditorAttribute> -获取编辑框属性[EditorAttribute](#EditorAttribute)实例。 + +获取编辑框属性值。 **系统能力**: SystemCapability.MiscServices.InputMethod - 返回值 | 类型 | 说明 | | ------------------------------- | ------------------------------------------------------------ | - | Promise<EditorAttribute> | 返回编辑框属性实例。 | + | Promise<[EditorAttribute](#EditorAttribute)> | 返回编辑框属性值。 | - 示例 ``` @@ -727,15 +731,15 @@ getEditorAttribute(): Promise<EditorAttribute> | 名称 | 参数类型 | 可读 | 可写 | 说明 | | ------------ | -------- | ---- | ---- | ------------------------------------------------------------ | -| enterKeyType | number | 是 | 否 | 功能键属性。
**系统能力**: SystemCapability.MiscServices.InputMethod | -| inputPattern | number | 是 | 否 | 编辑框属性。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| enterKeyType | number | 是 | 否 | 编辑框的功能属性。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| inputPattern | number | 是 | 否 | 编辑框的文本属性。
**系统能力**: SystemCapability.MiscServices.InputMethod | ## KeyEvent -按键属性值 +按键属性值。 | 名称 | 参数类型 | 可读 | 可写 | 说明 | | --------- | -------- | ---- | ---- | ------------------------------------------------------------ | -| keyCode | number | 是 | 否 | 键值。
**系统能力**: SystemCapability.MiscServices.InputMethod | -| keyAction | number | 是 | 否 | 按键状态。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| keyCode | number | 是 | 否 | 按键的键值。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| keyAction | number | 是 | 否 | 按键的状态。
**系统能力**: SystemCapability.MiscServices.InputMethod | -- Gitee From 19526e3294c48bcb9056eeb57cdec26fd02a6fd4 Mon Sep 17 00:00:00 2001 From: clevercong Date: Fri, 4 Mar 2022 17:01:25 +0800 Subject: [PATCH 124/282] add netstack js api doc. Signed-off-by: clevercong --- .../reference/apis/js-apis-http.md | 466 ++++++ .../reference/apis/js-apis-socket.md | 1374 +++++++++++++++++ .../reference/apis/js-apis-webSocket.md | 600 +++++++ 3 files changed, 2440 insertions(+) create mode 100644 zh-cn/application-dev/reference/apis/js-apis-http.md create mode 100644 zh-cn/application-dev/reference/apis/js-apis-socket.md create mode 100644 zh-cn/application-dev/reference/apis/js-apis-webSocket.md diff --git a/zh-cn/application-dev/reference/apis/js-apis-http.md b/zh-cn/application-dev/reference/apis/js-apis-http.md new file mode 100644 index 00000000000..ff82b65406a --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-http.md @@ -0,0 +1,466 @@ +# 数据请求 + +- [导入模块](#s56d19203690d4782bfc74069abb6bd71) +- [权限列表](#section11257113618419) +- [完整示例](#section119676440437) +- [http.createHttp](#section375081875219) +- [HttpRequest](#section775213486457) + - [request](#section08941433184616) + - [request](#section1361727114718) + - [request](#section47538114482) + - [destroy](#section613614500483) + - [on\('headerReceive'\)](#section617831813498) + - [off\('headerReceive'\)](#section017612118508) + - [on\('headersReceive'\)8+](#section6178318134982) + - [off\('headersReceive'\)8+](#section0176121185082) + - [once\('headersReceive'\)8+](#section68221041134718) +- [HttpRequestOptions](#section12262183471518) +- [RequestMethod](#section63024410264) +- [ResponseCode](#section769218832018) +- [HttpResponse](#section15920192914312) + +>![](public_sys-resources/icon-note.gif) **说明:** +> +>本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +>本模块所有接口需要设备具有系统能力:SystemCapability.Communication.NetStack + +## 导入模块 + +``` +import http from '@ohos.net.http'; +``` + +## 权限列表 + +ohos.permission.INTERNET + +## 完整示例 + +``` +import http from '@ohos.net.http'; + +// 每一个httpRequest对应一个http请求任务,不可复用 +let httpRequest = http.createHttp(); +// 用于订阅http响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息 +// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+ +httpRequest.on('headersReceive', (data) => { + console.info('header: ' + data.header); +}); +httpRequest.request( + // 填写http请求的url地址,可以带参数也可以不带参数。URL地址需要开发者自定义。GET请求的参数可以在extraData中指定 + "EXAMPLE_URL", + { + method: 'POST', // 可选,默认为“GET” + // 开发者根据自身业务需要添加header字段 + header: { + 'Content-Type': 'application/json' + }, + // 当使用POST请求时此字段用于传递内容 + + extraData: { + "data": "data to send", + }, + connectTimeout: 60000, // 可选,默认为60s + readTimeout: 60000, // 可选,默认为60s + },(err, data) => { + if (!err) { + // data.result为http响应内容,可根据业务需要进行解析 + console.info('Result:' + data.result); + console.info('code:' + data.responseCode); + // data.header为http响应头,可根据业务需要进行解析 + console.info('header:' + data.header); + console.info('cookies:' + data.cookies); // 8+ + } else { + console.info('error:' + err); + // 当该请求使用完毕时,调用destroy方法主动销毁。 + httpRequest.destroy(); + } + } +); +``` + +## http.createHttp + +createHttp\(\): HttpRequest + +创建一个http,里面包括发起请求、中断请求、订阅/取消订阅HTTP Response Header 事件。每一个HttpRequest对象对应一个Http请求。如需发起多个Http请求,须为每个Http请求创建对应HttpRequest对象。 + +- 返回值 + + | 类型 | 说明 | + | :---------- | :----------------------------------------------------------- | + | HttpRequest | 返回一个HttpRequest对象,里面包括request、destroy、on和off方法。 | + +- 示例 + + ``` + import http from '@ohos.net.http'; + let httpRequest = http.createHttp(); + ``` + + +## HttpRequest + +http请求任务。在调用HttpRequest的方法前,需要先通过[createHttp\(\)](#section375081875219)创建一个任务。 + +### request + +request\(url: string, callback: AsyncCallback\\):void + +根据URL地址,发起HTTP网络请求,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------- | ---- | ----------------------- | + | url | string | 是 | 发起网络请求的URL地址。 | + | callback | AsyncCallback\<[HttpResponse](#section12262183471518)\> | 是 | 回调函数。 | + +- 示例 + + ``` + let httpRequest = http.createHttp(); + httpRequest.request("EXAMPLE_URL", (err, data) => { + if (!err) { + console.info('Result:' + data.result); + console.info('code:' + data.responseCode); + console.info('header:' + data.header); + console.info('cookies:' + data.cookies); // 8+ + } else { + console.info('error:' + err.data); + } + }); + ``` + + +### request + +request\(url: string, options: HttpRequestOptions, callback: AsyncCallback\):void + +根据URL地址和相关配置项,发起HTTP网络请求,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------- | ---- | -------------------------------------------------- | + | url | string | 是 | 发起网络请求的URL地址。 | + | options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#section12262183471518)。 | + | callback | AsyncCallback\<[HttpResponse](#section12262183471518)\> | 是 | 回调函数。 | + +- 示例 + + ``` + let httpRequest= http.createHttp(); + httpRequest.request("EXAMPLE_URL", + { + method: 'GET', + header: { + 'Content-Type': 'application/json' + }, + readTimeout: 60000, + connectTimeout: 60000 + },(err, data) => { + if (!err) { + console.info('Result:' + data.result); + console.info('code:' + data.responseCode); + console.info('header:' + data.header); + console.info('cookies:' + data.cookies); // 8+ + console.info('header['Content-Type']:' + data.header['Content-Type']); + console.info('header['Status-Line']:' + data.header['Status-Line']); + console.info('header.Date:' + data.header.Date); + console.info('header.Server:' + data.header.Server); + } else { + console.info('error:' + err.data); + } + }); + ``` + + +### request + +request\(url: string, options? : HttpRequestOptions\): Promise + +根据URL地址,发起HTTP网络请求,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ------------------ | ---- | -------------------------------------------------- | + | url | string | 是 | 发起网络请求的URL地址。 | + | options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#section12262183471518)。 | + +- 返回值 + + | 类型 | 说明 | + | :-------------------- | :-------------------------------- | + | Promise<[HttpResponse](#section12262183471518)> | 以Promise形式返回发起请求的结果。 | + + +- 示例 + + ``` + let httpRequest= http.createHttp(); + let promise = httpRequest.request("EXAMPLE_URL", { + method: "GET", + connectTimeout: 60000, + readTimeout: 60000, + header: { + 'Content-Type': 'application/json' + } + }); + promise.then((value) => { + console.info('Result:' + value.result); + console.info('code:' + value.responseCode); + console.info('header:' + value.header); + console.info('cookies:' + value.cookies); // 8+ + console.info('header['Content-Type']:' + value.header['Content-Type']); + console.info('header['Status-Line']:' + value.header['Status-Line']); + console.info('header.Date:' + value.header.Date); + console.info('header.Server:' + value.header.Server); + }).catch((err) => { + console.error(`errCode:${err.code}, errMessage:${err.data}`); + }); + ``` + + +### destroy + +destroy\(\): void + +中断请求任务。 + +- 示例 + + ``` + let httpRequest= http.createHttp(); + httpRequest.destroy(); + ``` + + +### on\('headerReceive'\) + +on\(type: 'headerReceive', callback: AsyncCallback\):void + +订阅HTTP Response Header 事件。 + +>![](public_sys-resources/icon-note.gif) **说明:** +> 此接口已废弃,建议使用on\('headersReceive'\)替代。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | ------------------------------------- | + | type | string | 是 | 订阅的事件类型,如:'headerReceive'。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let httpRequest= http.createHttp(); + httpRequest.on('headerReceive', (err, data) => { + if (!err) { + console.info('header: ' + data.header); + } else { + console.info('error:' + err.data); + } + }); + ``` + + +### off\('headerReceive'\) + +off\(type: 'headerReceive', callback?: AsyncCallback\):void + +取消订阅HTTP Response Header 事件。 + +>![](public_sys-resources/icon-note.gif) **说明:** +> +>1. 此接口已废弃,建议使用off\('headersReceive'\)替代。 +> +>2. 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | ------------------------------------- | + | type | string | 是 | 取消订阅的事件类型,'headerReceive'。 | + | callback | AsyncCallback\ | 否 | 回调函数。 | + +- 示例 + + ``` + let httpRequest= http.createHttp(); + httpRequest.on('headerReceive', (err, data) => { + if (!err) { + console.info('header: ' + data.header); + } else { + console.info('error:' + err.data); + } + }); + httpRequest.off('headerReceive'); + ``` + +### on\('headersReceive'\)8+ + +on\(type: 'headersReceive', callback: Callback\):void + +订阅HTTP Response Header 事件。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------ | ---- | ---------------------------------- | + | type | string | 是 | 订阅的事件类型:'headersReceive'。 | + | callback | Callback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let httpRequest= http.createHttp(); + httpRequest.on('headersReceive', (data) => { + console.info('header: ' + data.header); + }); + ``` + + +### off\('headersReceive'\)8+ + +off\(type: 'headersReceive', callback?: Callback\):void + +取消订阅HTTP Response Header 事件。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------ | ---- | -------------------------------------- | + | type | string | 是 | 取消订阅的事件类型:'headersReceive'。 | + | callback | Callback\ | 否 | 回调函数。 | + +- 示例 + + ``` + let httpRequest= http.createHttp(); + httpRequest.off('headersReceive'); + ``` + +### once\('headersReceive'\)8+ + +once\(type: "headersReceive", callback: Callback\): void + +订阅HTTP Response Header 事件,但是只触发一次。一旦触发之后,订阅器就会被移除。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------ | ---- | ---------------------------------- | + | type | string | 是 | 订阅的事件类型:'headersReceive'。 | + | callback | Callback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let httpRequest= http.createHttp(); + httpRequest.once('headersReceive', (data) => { + console.info('header: ' + data.header); + }); + ``` + +## HttpRequestOptions + +发起请求可选参数的类型和取值范围。 + +| 参数 | 类型 | 必填 | 说明 | +| -------------- | ------------------------------------ | ---- | ---------------------------------------------------------- | +| method | [RequestMethod](#section63024410264) | 否 | 请求方式。 | +| extraData | string \| Object \| ArrayBuffer8+ | 否 | 发送请求的额外数据。详见下方说明。 | +| header | Object | 否 | HTTP请求头字段。默认{'Content-Type': 'application/json'}。 | +| readTimeout | number | 否 | 读取超时时间。单位为毫秒(ms),默认为60000ms。 | +| connectTimeout | number | 否 | 连接超时时间。单位为毫秒(ms),默认为60000ms。 | + +> ![](public_sys-resources/icon-note.gif) **说明:** +> +> 1. 当HTTP请求为POST、PUT等方法时,此字段为HTTP请求的content。 +> +> 2. 当HTTP请求为GET、OPTIONS、DELETE、TRACE、CONNECT等方法时,此字段为HTTP请求的参数补充,参数内容会拼接到URL中进行发送。8+ +> +> 3. 开发者传入string对象,开发者需要自行编码,将编码后的string传入。8+ + +## RequestMethod + +HTTP 请求方法。 + +| **method 的合法值** | 说明 | +| :------------------ | :------------------ | +| OPTIONS | HTTP 请求 OPTIONS。 | +| GET | HTTP 请求 GET。 | +| HEAD | HTTP 请求 HEAD。 | +| POST | HTTP 请求 POST。 | +| PUT | HTTP 请求 PUT。 | +| DELETE | HTTP 请求 DELETE。 | +| TRACE | HTTP 请求 TRACE。 | +| CONNECT | HTTP 请求 CONNECT。 | + +## ResponseCode + +发起请求返回的响应码。 + +| 变量 | 值 | 说明 | +| ----------------- | ---- | ------------------------------------------------------------ | +| OK | 200 | 请求成功。一般用于GET与POST请求。 | +| CREATED | 201 | 已创建。成功请求并创建了新的资源。 | +| ACCEPTED | 202 | 已接受。已经接受请求,但未处理完成。 | +| NOT_AUTHORITATIVE | 203 | 非授权信息。请求成功。 | +| NO_CONTENT | 204 | 无内容。服务器成功处理,但未返回内容。 | +| RESET | 205 | 重置内容。 | +| PARTIAL | 206 | 部分内容。服务器成功处理了部分GET请求。 | +| MULT_CHOICE | 300 | 多种选择。 | +| MOVED_PERM | 301 | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。 | +| MOVED_TEMP | 302 | 临时移动。 | +| SEE_OTHER | 303 | 查看其它地址。 | +| NOT_MODIFIED | 304 | 未修改。 | +| USE_PROXY | 305 | 使用代理。 | +| BAD_REQUEST | 400 | 客户端请求的语法错误,服务器无法理解。 | +| UNAUTHORIZED | 401 | 请求要求用户的身份认证。 | +| PAYMENT_REQUIRED | 402 | 保留,将来使用。 | +| FORBIDDEN | 403 | 服务器理解请求客户端的请求,但是拒绝执行此请求。 | +| NOT_FOUND | 404 | 服务器无法根据客户端的请求找到资源(网页)。 | +| BAD_METHOD | 405 | 客户端请求中的方法被禁止。 | +| NOT_ACCEPTABLE | 406 | 服务器无法根据客户端请求的内容特性完成请求。 | +| PROXY_AUTH | 407 | 请求要求代理的身份认证。 | +| CLIENT_TIMEOUT | 408 | 请求时间过长,超时。 | +| CONFLICT | 409 | 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突。 | +| GONE | 410 | 客户端请求的资源已经不存在。 | +| LENGTH_REQUIRED | 411 | 服务器无法处理客户端发送的不带Content-Length的请求信息。 | +| PRECON_FAILED | 412 | 客户端请求信息的先决条件错误。 | +| ENTITY_TOO_LARGE | 413 | 由于请求的实体过大,服务器无法处理,因此拒绝请求。 | +| REQ_TOO_LONG | 414 | 请求的URI过长(URI通常为网址),服务器无法处理。 | +| UNSUPPORTED_TYPE | 415 | 服务器无法处理请求的格式。 | +| INTERNAL_ERROR | 500 | 服务器内部错误,无法完成请求。 | +| NOT_IMPLEMENTED | 501 | 服务器不支持请求的功能,无法完成请求。 | +| BAD_GATEWAY | 502 | 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。 | +| UNAVAILABLE | 503 | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。 | +| GATEWAY_TIMEOUT | 504 | 充当网关或代理的服务器,未及时从远端服务器获取请求。 | +| VERSION | 505 | 服务器请求的HTTP协议的版本。 | + +## HttpResponse + +request方法回调函数的返回值类型。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | ---------------------------------------------- | ---- | ------------------------------------------------------------ | +| result | string \| Object \| ArrayBuffer8+ | 是 | Http请求根据响应头中Content-type类型返回对应的响应格式内容。详见下方说明。 | +| responseCode | [ResponseCode](#section769218832018) \| number | 是 | 回调函数执行成功时,此字段为[ResponseCode](#section769218832018)。若执行失败,错误码将会从AsyncCallback中的err字段返回。错误码如下:
- 200:通用错误
- 202:参数错误
- 300:I/O错误 | +| header | Object | 是 | 发起http请求返回来的响应头。当前返回的是JSON格式字符串,如需具体字段内容,需开发者自行解析。常见字段及解析方式如下:
- Content-Type:header['Content-Type'];
- Status-Line:header['Status-Line'];
- Date:header.Date/header['Date'];
- Server:header.Server/header['Server']; | +| cookies8+ | Array\ | 是 | 服务器返回的 cookies。 | + +> ![](public_sys-resources/icon-note.gif) **说明:** +> +> 根据响应头中Content-type类型的不同,返回的类型不同: +> +> - application/json:返回JSON格式的字符串,如需Http响应具体内容,需开发者自行解析 +> - application/octet-stream:ArrayBuffer +> - 其他:string diff --git a/zh-cn/application-dev/reference/apis/js-apis-socket.md b/zh-cn/application-dev/reference/apis/js-apis-socket.md new file mode 100644 index 00000000000..94c71c72362 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-socket.md @@ -0,0 +1,1374 @@ +# Socket连接 + +- [支持设备](#section11223131205610) +- [导入模块](#s56d19203690d4782bfc74069abb6bd71) +- [权限列表](#section11257113618419) +- [socket.constructUDPSocketInstance](#section375081875219) +- [UDPSocket](#section1957294511568) + - [bind](#section7382103811272) + - [bind](#section12433131831219) + - [send](#section1859172655111) + - [send](#section61591275527) + - [close](#section068563155214) + - [close](#section1788163335319) + - [getState](#section1028719549533) + - [getState](#section1333814412551) + - [setExtraOptions](#section16890953175514) + - [setExtraOptions](#section5493159165611) + - [on\('message'\)](#section1632573015551) + - [off\('message'\)](#section789519374558) + - [on\('listening' | 'close'\)](#section20461174410557) + - [off\('listening' | 'close'\)](#section649105218559) + - [on\('error'\)](#section16745135855515) + - [off\('error'\)](#section49111157568) + +- [NetAddress](#section159132241295) +- [UDPSendOptions](#section13297558184010) +- [UDPExtraOptions](#section1650575184117) +- [SocketStateBase](#section164609984111) +- [SocketRemoteInfo](#section46021613174115) +- [socket.constructTCPSocketInstance](#section283119484161) +- [TCPSocket](#section1180211014548) + - [bind](#section8465924145710) + - [bind](#section27150134582) + - [connect](#section82761299586) + - [connect](#section374992304) + - [send](#section74991317709) + - [send](#section2841321507) + - [close](#section71701043701) + - [close](#section13523755306) + - [getRemoteAddress](#section1268431414115) + - [getRemoteAddress](#section89019337116) + - [getState](#section830554511115) + - [getState](#section3460522026) + - [setExtraOptions](#section738911419219) + - [setExtraOptions](#section1847278215) + - [on\('message'\)](#section642292019182) + - [off\('message'\)](#section8426920151811) + - [on\('connect' | 'close'\)](#section6429202001812) + - [off\('connect' | 'close'\)](#section54325209187) + - [on\('error'\)](#section19436172061817) + - [off\('error'\)](#section6438202013182) + +- [TCPConnectOptions](#section13821005712) +- [TCPSendOptions](#section1689232415715) +- [TCPExtraOptions](#section13892555115718) + +>![](public_sys-resources/icon-note.gif) **说明:** +> +>本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +>本模块所有接口需要设备具有系统能力:SystemCapability.Communication.NetStack + +## 导入模块 + +``` +import socket from '@ohos.net.socket'; +``` + +## 权限列表 + +ohos.permission.INTERNET + +## socket.constructUDPSocketInstance + +constructUDPSocketInstance\(\): UDPSocket + +创建一个UDPSocket对象。 + +- 返回值 + + | 类型 | 说明 | + | :--------------------------------- | :---------------------- | + | [UDPSocket](#section1957294511568) | 返回一个UDPSocket对象。 | + + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + ``` + + +## UDPSocket + +UDPSocket连接。在调用UDPSocket的方法前,需要先通过[socket.constructUDPSocketInstance](#section375081875219)创建UDPSocket对象。 + +### bind + +bind\(address: NetAddress, callback: AsyncCallback\): void + +绑定IP地址和端口,端口可以指定或由系统随机分配。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | + | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + }) + ``` + + +### bind + +bind\(address: NetAddress\): Promise + +绑定IP地址和端口,端口可以指定或由系统随机分配。使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | + | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :----------------------------------------- | + | Promise\ | 以Promise形式异步返回UDPSocket绑定的结果。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + let promise = udp.bind({address: '192.168.xx.xxx', port: 8080, family: 1}); + promise .then(() => { + console.log('bind success'); + }).catch(err => { + console.log('bind fail'); + }); + ``` + + +### send + +send\(options: UDPSendOptions, callback: AsyncCallback\): void + +通过UDPSocket连接发送数据。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.send({ + data:'Hello, server!', + address: { + address:'192.168.xx.xxx', + port:xxxx, + family:1 + } + }, err=> { + if (err) { + console.log('send fail'); + return; + } + console.log('send success'); + }) + ``` + + +### send + +send\(options: UDPSendOptions\): Promise + +通过UDPSocket连接发送数据。使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :--------------------------------------------- | + | Promise\ | 以Promise形式返回UDPSocket连接发送数据的结果。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + let promise = udp.send({ + data:'Hello, server!', + address: { + address:'192.168.xx.xxx', + port:xxxx, + family:1 + } + }); + promise.then(() => { + console.log('send success'); + }).catch(err => { + console.log('send fail'); + }); + ``` + + +### close + +close\(callback: AsyncCallback\): void + +关闭UDPSocket连接。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------- | ---- | ---------- | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.close(err => { + if (err) { + console.log('close fail'); + return; + } + console.log('close success'); + }) + ``` + + +### close + +close\(\): Promise + +关闭UDPSocket连接。使用Promise方式作为异步方法。 + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :----------------------------------------- | + | Promise\ | 以Promise形式返回关闭UDPSocket连接的结果。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + let promise = udp.close(); + promise.then(() => { + console.log('close success'); + }).catch(err => { + console.log('close fail'); + }); + ``` + + +### getState + +getState\(callback: AsyncCallback\): void + +获取UDPSocket状态。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section7382103811272)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------ | ---- | ---------- | + | callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + udp.getState((err, data) => { + if (err) { + console.log('getState fail'); + return; + } + console.log('getState success:' + JSON.stringify(data)); + }) + }) + ``` + + +### getState + +getState\(\): Promise + +获取UDPSocket状态。使用Promise方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section7382103811272)方法调用成功后,才可调用此方法。 + +- 返回值 + + | 类型 | 说明 | + | :----------------------------------------------- | :----------------------------------------- | + | Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取UDPSocket状态的结果。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + let promise = udp.getState({}); + promise.then(data => { + console.log('getState success:' + JSON.stringify(data)); + }).catch(err => { + console.log('getState fail'); + }); + }) + ``` + + +### setExtraOptions + +setExtraOptions\(options: UDPExtraOptions, callback: AsyncCallback\): void + +设置UDPSocket连接的其他属性。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section7382103811272)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.bind({address:'192.168.xx.xxx', port:xxxx, family:1}, err=> { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + udp.setExtraOptions({ + receiveBufferSize:1000, + sendBufferSize:1000, + reuseAddress:false, + socketTimeout:6000, + broadcast:true + }, err=> { + if (err) { + console.log('setExtraOptions fail'); + return; + } + console.log('setExtraOptions success'); + }) + }) + ``` + + +### setExtraOptions + +setExtraOptions\(options: UDPExtraOptions\): Promise + +设置UDPSocket连接的其他属性。使用Promise方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section7382103811272)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :--------------------------------------------------- | + | Promise\ | 以Promise形式返回设置UDPSocket连接的其他属性的结果。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + let promise = udp.bind({address:'192.168.xx.xxx', port:xxxx, family:1}); + promise.then(() => { + console.log('bind success'); + let promise1 = udp.setExtraOptions({ + receiveBufferSize:1000, + sendBufferSize:1000, + reuseAddress:false, + socketTimeout:6000, + broadcast:true + }); + promise1.then(() => { + console.log('setExtraOptions success'); + }).catch(err => { + console.log('setExtraOptions fail'); + }); + }).catch(err => { + console.log('bind fail'); + }); + ``` + + +### on\('message'\) + +on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void + +订阅UDPSocket连接的接收消息事件。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | + | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | + | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.on('message', value => { + console.log("on message, message:" + value.message) + ", remoteInfo:" + value.remoteInfo); + }); + ``` + + +### off\('message'\) + +off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void + +取消订阅UDPSocket连接的接收消息事件。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | + | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | + | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + let callback = value =>{ + console.log("on message, message:" + value.message) + ", remoteInfo:" + value.remoteInfo); + } + udp.on('message', callback); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + udp.off('message', callback); + udp.off('message'); + ``` + + +### on\('listening' | 'close'\) + +on\(type: 'listening' | 'close', callback: Callback\): void + +订阅UDPSocket连接的数据包消息事件或关闭事件。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 订阅的事件类型。
- 'listening':数据包消息事件。
- 'close':关闭事件。 | + | callback | Callback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + udp.on('listening', () => { + console.log("on listening success")); + }); + udp.on('close', () => { + console.log("on close success" ); + }); + ``` + + +### off\('listening' | 'close'\) + +off\(type: 'listening' | 'close', callback?: Callback\): void + +取消订阅UDPSocket连接的数据包消息事件或关闭事件。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 订阅事件类型。
- 'listening':数据包消息事件。
- 'close':关闭事件。 | + | callback | Callback\ | 否 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance(); + let callback1 = () =>{ + console.log("on listening, success"); + } + udp.on('listening', callback1); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + udp.off('listening', callback1); + udp.off('listening'); + let callback2 = () =>{ + console.log("on close, success"); + } + udp.on('close', callback2); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + udp.off('close', callback2); + udp.off('close'); + ``` + + +### on\('error'\) + +on\(type: 'error', callback: ErrorCallback\): void + +订阅UDPSocket连接的error事件。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------- | ---- | ------------------------------------ | + | type | string | 是 | 订阅的事件类型。'error':error事件。 | + | callback | ErrorCallback | 是 | 回调函数。 | + + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance() + udp.on('error', err => { + console.log("on error, err:" + JSON.stringify(err)) + }); + ``` + + +### off\('error'\) + +off\(type: 'error', callback?: ErrorCallback\): void + +取消订阅UDPSocket连接的error事件。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------- | ---- | ------------------------------------ | + | type | string | 是 | 订阅的事件类型。'error':error事件。 | + | callback | ErrorCallback | 否 | 回调函数。 | + +- 示例 + + ``` + let udp = socket.constructUDPSocketInstance() + let callback = err =>{ + console.log("on error, err:" + JSON.stringify(err)); + } + udp.on('error', callback); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + udp.off('error', callback); + udp.off('error'); + ``` + + +## NetAddress + +目标地址信息。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------ | ---- | ------------------------------------------------------------ | +| address | string | 是 | 本地绑定的ip地址。 | +| port | number | 否 | 端口号 ,范围0~65535。如果不指定系统随机分配端口。 | +| family | number | 否 | 网络协议类型,可选类型:
- 1:IPv4
- 2:IPv6
默认为1。 | + +## UDPSendOptions + +UDPSocket发送参数。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------- | ---- | -------------- | +| data | string | 是 | 发送的数据。 | +| address | [NetAddress](#section159132241295) | 是 | 目标地址信息。 | + +## UDPExtraOptions + +UDPSocket连接的其他属性。 + +| 参数名 | 类型 | 必填 | 说明 | +| ----------------- | ------- | ---- | -------------------------------- | +| broadcast | boolean | 否 | 是否可以发送广播。默认为false。 | +| receiveBufferSize | number | 否 | 接收缓冲区大小(单位:Byte)。 | +| sendBufferSize | number | 否 | 发送缓冲区大小(单位:Byte)。 | +| reuseAddress | boolean | 否 | 是否重用地址。默认为false。 | +| socketTimeout | number | 否 | 套接字超时时间,单位毫秒(ms)。 | + +## SocketStateBase + +Socket的状态信息。 + +| 参数名 | 类型 | 必填 | 说明 | +| ----------- | ------- | ---- | ---------- | +| isBound | boolean | 是 | 是否绑定。 | +| isClose | boolean | 是 | 是否关闭。 | +| isConnected | boolean | 是 | 是否连接。 | + +## SocketRemoteInfo + +Socket的连接信息。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------ | ---- | ------------------------------------------------------------ | +| address | string | 是 | 本地绑定的ip地址。 | +| family | string | 是 | 网络协议类型,可选类型:
- IPv4
- IPv6
默认为IPv4。 | +| port | number | 是 | 端口号,范围0~65535。 | +| size | number | 是 | 服务器响应信息的字节长度。 | + +## socket.constructTCPSocketInstance + +constructTCPSocketInstance\(\): TCPSocket + +创建一个TCPSocket对象。 + +- 返回值 + + | 类型 | 说明 | + | :--------------------------------- | :---------------------- | + | [TCPSocket](#section1180211014548) | 返回一个TCPSocket对象。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + ``` + + +## TCPSocket + +TCPSocket连接。在调用TCPSocket的方法前,需要先通过[socket.constructTCPSocketInstance](#section283119484161)创建TCPSocket对象。 + +### bind + +bind\(address: NetAddress, callback: AsyncCallback\): void + +绑定IP地址和端口,端口可以指定或由系统随机分配。使用callback方法作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | + | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + tcp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + }) + ``` + + +### bind + +bind\(address NetAddress\): Promise + +绑定IP地址和端口,端口可以指定或由系统随机分配。使用Promise方法作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ---------------------------------- | ---- | ------------------------------------------------------ | + | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | + + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :------------------------------------------------------- | + | Promise\ | 以Promise形式返回TCPSocket绑定本机的IP地址和端口的结果。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}); + promise.then(() => { + console.log('bind success'); + }).catch(err => { + console.log('bind fail'); + }); + ``` + + +### connect + +connect\(options: TCPConnectOptions, callback: AsyncCallback\): void + +连接到指定的IP地址和端口。使用callback方法作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}, err => { + if (err) { + console.log('connect fail'); + return; + } + console.log('connect success'); + }) + ``` + + +### connect + +connect\(options: TCPConnectOptions\): Promise + +连接到指定的IP地址和端口。使用promise方法作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | + + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :--------------------------------------------------------- | + | Promise\ | 以Promise形式返回TCPSocket连接到指定的IP地址和端口的结果。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise.then(() => { + console.log('connect success') + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### send + +send\(options: TCPSendOptions, callback: AsyncCallback\): void + +通过TCPSocket连接发送数据。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise.then(() => { + console.log('connect success'); + tcp.send({ + data:'Hello, server!' + },err => { + if (err) { + console.log('send fail'); + return; + } + console.log('send success'); + }) + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### send + +send\(options: TCPSendOptions\): Promise + +通过TCPSocket连接发送数据。使用Promise方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | --------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :------------------------------------------------- | + | Promise\ | 以Promise形式返回通过TCPSocket连接发送数据的结果。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise1 = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise1.then(() => { + console.log('connect success'); + let promise2 = tcp.send({ + data:'Hello, server!' + }); + promise2.then(() => { + console.log('send success'); + }).catch(err => { + console.log('send fail'); + }); + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### close + +close\(callback: AsyncCallback\): void + +关闭TCPSocket连接。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------- | ---- | ---------- | + | callback | AsyncCallback\ | 是 | 回调函数。 | + + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + tcp.close(err => { + if (err) { + console.log('close fail'); + return; + } + console.log('close success'); + }) + ``` + + +### close + +close\(\): Promise + +关闭TCPSocket连接。使用Promise方式作为异步方法。 + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :----------------------------------------- | + | Promise\ | 以Promise形式返回关闭TCPSocket连接的结果。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.close(); + promise.then(() => { + console.log('close success'); + }).catch(err => { + console.log('close fail'); + }); + ``` + + +### getRemoteAddress + +getRemoteAddress\(callback: AsyncCallback\): void + +获取对端Socket地址。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------- | ---- | ---------- | + | callback | AsyncCallback<[NetAddress](#section159132241295)> | 是 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise.then(() => { + console.log('connect success'); + tcp.getRemoteAddress((err, data) => { + if (err) { + console.log('getRemoteAddressfail'); + return; + } + console.log('getRemoteAddresssuccess:' + JSON.stringify(data)); + }) + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### getRemoteAddress + +getRemoteAddress\(\): Promise + +获取对端Socket地址。使用Promise方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 返回值 + + | 类型 | 说明 | + | :------------------------------------------ | :------------------------------------------ | + | Promise<[NetAddress](#section159132241295)> | 以Promise形式返回获取对端socket地址的结果。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise1 = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise1.then(() => { + console.log('connect success'); + let promise2 = tcp.getRemoteAddress(); + promise2.then(() => { + console.log('getRemoteAddress success:' + JSON.stringify(data)); + }).catch(err => { + console.log('getRemoteAddressfail'); + }); + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### getState + +getState\(callback: AsyncCallback\): void + +获取TCPSocket状态。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------ | ---- | ---------- | + | callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | + + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise.then(() => { + console.log('connect success'); + tcp.getState((err, data) => { + if (err) { + console.log('getState fail'); + return; + } + console.log('getState success:' + JSON.stringify(data)); + }); + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### getState + +getState\(\): Promise + +获取TCPSocket状态。使用Promise方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 返回值 + + | 类型 | 说明 | + | :----------------------------------------------- | :----------------------------------------- | + | Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取TCPSocket状态的结果。 | + + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise.then(() => { + console.log('connect success'); + let promise1 = tcp.getState(); + promise1.then(() => { + console.log('getState success:' + JSON.stringify(data)); + }).catch(err => { + console.log('getState fail'); + }); + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### setExtraOptions + +setExtraOptions\(options: TCPExtraOptions, callback: AsyncCallback\): void + +设置TCPSocket连接的其他属性。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise.then(() => { + console.log('connect success'); + tcp.setExtraOptions({ + keepAlive: true, + OOBInline: true, + TCPNoDelay: true, + socketLinger: { on:true, linger:10 } + receiveBufferSize: 1000, + sendBufferSize: 1000, + reuseAddress: true, + socketTimeout: 3000, + },err => { + if (err) { + console.log('setExtraOptions fail'); + return; + } + console.log('setExtraOptions success'); + }); + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### setExtraOptions + +setExtraOptions\(options: TCPExtraOptions\): Promise + +设置TCPSocket连接的其他属性,使用Promise方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | + + +- 返回值 + + | 类型 | 说明 | + | :-------------- | :--------------------------------------------------- | + | Promise\ | 以Promise形式返回设置TCPSocket连接的其他属性的结果。 | + + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); + promise.then(() => { + console.log('connect success'); + let promise1 = tcp.setExtraOptions({ + keepAlive: true, + OOBInline: true, + TCPNoDelay: true, + socketLinger: { on:true, linger:10 } + receiveBufferSize: 1000, + sendBufferSize: 1000, + reuseAddress: true, + socketTimeout: 3000, + }); + promise1.then(() => { + console.log('setExtraOptions success'); + }).catch(err => { + console.log('setExtraOptions fail'); + }); + }).catch(err => { + console.log('connect fail'); + }); + ``` + + +### on\('message'\) + +on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void + +订阅TCPSocket连接的接收消息事件。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | + | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | + | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + tcp.on('message', value => { + console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo) + }); + ``` + + +### off\('message'\) + +off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void + +取消订阅TCPSocket连接的接收消息事件。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | + | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | + | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let callback = value =>{ + console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo); + } + tcp.on('message', callback); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + tcp.off('message', callback); + tcp.off('message'); + ``` + + +### on\('connect' | 'close'\) + +on\(type: 'connect' | 'close', callback: Callback\): void + +订阅TCPSocket的连接事件或关闭事件。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 订阅的事件类型。
- 'connect':连接事件。
- 'close':关闭事件。 | + | callback | Callback\ | 是 | 回调函数。 | + + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + tcp.on('connect', () => { + console.log("on connect success") + }); + tcp.on('close', data => { + console.log("on close success") + }); + ``` + + +### off\('connect' | 'close'\) + +off\(type: 'connect' | 'close', callback: Callback\): void + +取消订阅TCPSocket的连接事件或关闭事件。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 订阅的事件类型。
- 'connect':连接事件。
- 'close':关闭事件。 | + | callback | Callback\ | 否 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let callback1 = () =>{ + console.log("on connect success"); + } + tcp.on('connect', callback1); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + tcp.off('connect', callback1); + tcp.off('connect'); + let callback2 = () =>{ + console.log("on close success"); + } + tcp.on('close', callback2); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + tcp.off('close', callback2); + tcp.off('close'); + ``` + + +### on\('error'\) + +on\(type: 'error', callback: ErrorCallback\): void + +订阅TCPSocket连接的error事件。使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------- | ---- | ------------------------------------ | + | type | string | 是 | 订阅的事件类型。'error':error事件。 | + | callback | ErrorCallback | 是 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + tcp.on('error', err => { + console.log("on error, err:" + JSON.stringify(err)) + }); + ``` + + +### off\('error'\) + +off\(type: 'error', callback?: ErrorCallback\): void + +取消订阅TCPSocket连接的error事件。使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------- | ---- | ------------------------------------ | + | type | string | 是 | 订阅的事件类型。'error':error事件。 | + | callback | ErrorCallback | 否 | 回调函数。 | + +- 示例 + + ``` + let tcp = socket.constructTCPSocketInstance(); + let callback = err =>{ + console.log("on error, err:" + JSON.stringify(err)); + } + tcp.on('error', callback); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + tcp.off('error', callback); + tcp.off('error'); + ``` + + +## TCPConnectOptions + +TCPSocket连接的参数。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------- | ---- | -------------------------- | +| address | [NetAddress](#section159132241295) | 是 | 绑定的地址以及端口。 | +| timeout | number | 否 | 超时时间,单位毫秒(ms)。 | + +## TCPSendOptions + +TCPSocket发送请求的参数。 + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------ | ---- | ------------------------------------------------------------ | +| data | string | 是 | 发送的数据。 | +| encoding | string | 否 | 字符编码(UTF-8,UTF-16BE,UTF-16LE,UTF-16,US-AECII,ISO-8859-1),默认为UTF-8。 | + +## TCPExtraOptions + +TCPSocket连接的其他属性。 + +| 参数名 | 类型 | 必填 | 说明 | +| ----------------- | ------- | ---- | ------------------------------------------------------------ | +| keepAlive | boolean | 否 | 是否保持连接。默认为false。 | +| OOBInline | boolean | 否 | 是否为OOB内联。默认为false。 | +| TCPNoDelay | boolean | 否 | TCPSocket连接是否无时延。默认为false。 | +| socketLinger | Object | 是 | socket是否继续逗留。
- on:是否逗留(true:逗留;false:不逗留)。
- linger:逗留时长,单位毫秒(ms),取值范围为0~65535。
当入参on设置为true时,才需要设置。 | +| receiveBufferSize | number | 否 | 接收缓冲区大小(单位:Byte)。 | +| sendBufferSize | number | 否 | 发送缓冲区大小(单位:Byte)。 | +| reuseAddress | boolean | 否 | 是否重用地址。默认为false。 | +| socketTimeout | number | 否 | 套接字超时时间,单位毫秒(ms)。 | diff --git a/zh-cn/application-dev/reference/apis/js-apis-webSocket.md b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md new file mode 100644 index 00000000000..42a9304b267 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md @@ -0,0 +1,600 @@ +# WebSocket连接 + +- [导入模块](#s56d19203690d4782bfc74069abb6bd71) +- [权限列表](#section11257113618419) +- [完整示例](#section20761171275912) +- [webSocket.createWebSocket](#section375081875219) +- [WebSocket](#section16411174314593) + - [connect](#section1377525513113) + - [connect](#section18952991528) + - [connect](#section10573126422) + - [send](#section156451414213) + - [send](#section137609541324) + - [close](#section202411451433) + - [close](#section10491513437) + - [close](#section118451219536) + - [on\('open'\)](#section923017271834) + - [off\('open'\)](#section207051331730) + - [on\('message'\)](#section1066819418488) + - [off\('message'\)](#section1467019413484) + - [on\('close'\)](#section169378107484) + - [off\('close'\)](#section993911074812) + - [on\('error'\)](#section2997161484815) + - [off\('error'\)](#section13999114164815) + +- [WebSocketRequestOptions](#section11251233123910) +- [WebSocketCloseOptions](#section12262183471518) +- [close错误码说明](#section1635681416477) + +>![](public_sys-resources/icon-note.gif) **说明:** +>本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +使用WebSocket建立服务器与客户端的双向连接,需要先通过[createWebSocket](#section375081875219)方法创建[WebSocket](#section16411174314593)对象,然后通过[connect](WebSocket连接.md)方法连接到服务器。当连接成功后,客户端会收到[open](#section923017271834)事件的回调,之后客户端就可以通过[send](#section156451414213)方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到[message](#section1066819418488)事件的回调。当客户端不要此连接时,可以通过调用[close](#section202411451433)方法主动断开连接,之后客户端会收到[close](#section169378107484)事件的回调。 + +若在上述任一过程中发生错误,客户端会收到[error](#section2997161484815)事件的回调。 + + +## 导入模块 + +``` +import webSocket from '@ohos.net.webSocket'; +``` + +## 权限列表 + +需要ohos.permission.INTERNET权限。 + +## 完整示例 + +``` +import webSocket from '@ohos.net.webSocket'; + +var defaultIpAddress = "ws://"; +let ws = webSocket.createWebSocket(); +ws.on('open', (err, value) => { + console.log("on open, status:" + value.status + ", message:" + value.message); + // 当收到on('open')事件时,可以通过send()方法与服务器进行通信 + ws.send("Hello, server!", (err, value) => { + if (!err) { + console.log("send success"); + } else { + console.log("send fail, err:" + JSON.stringify(err)); + } + }); +}); +ws.on('message', (err, value) => { + console.log("on message, message:" + value); + // 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接 + if (value === 'bye') { + ws.close((err, value) => { + if (!err) { + console.log("close success"); + } else { + console.log("close fail, err is " + JSON.stringify(err)); + } + }); + } +}); +ws.on('close', (err, value) => { + console.log("on close, code is " + value.code + ", reason is " + value.reason); +}); +ws.on('error', (err) => { + console.log("on error, error:" + JSON.stringify(err)); +}); +ws.connect(defaultIpAddress, (err, value) => { + if (!err) { + console.log("connect success"); + } else { + console.log("connect fail, err:" + JSON.stringify(err)); + } +}); +``` + +## webSocket.createWebSocket + +createWebSocket\(\): WebSocket + +创建一个WebSocket,里面包括建立连接、关闭连接、发送数据和订阅/取消订阅WebSocket连接的打开事件、接收到服务器消息事件、关闭事件和错误事件。 + +- 返回值 + + | 类型 | 说明 | + | :---------------------------------- | :----------------------------------------------------------- | + | [WebSocket](#section16411174314593) | 返回一个WebSocket对象,里面包括connect、send、close、on和off方法。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ``` + + +## WebSocket + +在调用WebSocket的方法前,需要先通过[webSocket.createWebSocket](#section375081875219)创建一个WebSocket。 + +### connect + +connect\(url: string, callback: AsyncCallback\): void + +根据URL地址,建立一个WebSocket连接,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------ | ---- | ---------------------------- | + | url | string | 是 | 建立WebSocket连接的URL地址。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + ws.connect(url, (err, value) => { + if (!err) { + console.log("connect success"); + } else { + console.log("connect fail, err:" + JSON.stringify(err)) + } + }); + ``` + + +### connect + +connect\(url: string, options: WebSocketRequestOptions, callback: AsyncCallback\): void + +根据URL地址和header,建立一个WebSocket连接,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------ | ---- | ------------------------------------------------------- | + | url | string | 是 | 建立WebSocket连接的URL地址。 | + | options | WebSocketRequestOptions | 是 | 参考[WebSocketRequestOptions](#section11251233123910)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + ws.connect(url, { + header: { + "key": "value", + "key2": "value2" + } + }, (err, value) => { + if (!err) { + console.log("connect success"); + } else { + console.log("connect fail, err:" + JSON.stringify(err)) + } + }); + ``` + + +### connect + +connect\(url: string, options?: WebSocketRequestOptions\): Promise + +根据URL地址和header,建立一个WebSocket连接,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ----------------------- | ---- | ------------------------------------------------------- | + | url | string | 是 | 建立WebSocket连接的URL地址。 | + | options | WebSocketRequestOptions | 否 | 参考[WebSocketRequestOptions](#section11251233123910)。 | + +- 返回值 + + | 类型 | 说明 | + | :----------------- | :-------------------------------- | + | Promise\ | 以Promise形式返回建立连接的结果。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + let promise = ws.connect(url); + promise.then((value) => { + console.log("connect success") + }).catch((err) => { + console.log("connect fail, error:" + JSON.stringify(err)) + }); + ``` + + +### send + +send\(data: string | ArrayBuffer, callback: AsyncCallback\): void + +通过WebSocket连接发送数据,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------ | ---- | ------------ | + | data | string \| ArrayBuffer 8+ | 是 | 发送的数据。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + ws.connect(url, (err, value) => { + ws.send("Hello, server!", (err, value) => { + if (!err) { + console.log("send success"); + } else { + console.log("send fail, err:" + JSON.stringify(err)) + } + }); + }); + ``` + + +### send + +send\(data: string | ArrayBuffer\): Promise + +通过WebSocket连接发送数据,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | ------------ | + | data | string \| ArrayBuffer 8+ | 是 | 发送的数据。 | + +- 返回值 + + | 类型 | 说明 | + | :----------------- | :-------------------------------- | + | Promise\ | 以Promise形式返回发送数据的结果。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + ws.connect(url, (err, value) => { + let promise = ws.send("Hello, server!"); + promise.then((value) => { + console.log("send success") + }).catch((err) => { + console.log("send fail, error:" + JSON.stringify(err)) + }); + }); + ``` + + +### close + +close\(callback: AsyncCallback\): void + +关闭WebSocket连接,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------ | ---- | ---------- | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + ws.close((err, value) => { + if (!err) { + console.log("close success") + } else { + console.log("close fail, err is " + JSON.stringify(err)) + } + }); + ``` + + +### close + +close\(options: WebSocketCloseOptions, callback: AsyncCallback\): void + +根据可选参数code和reason,关闭WebSocket连接,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------ | ---- | ----------------------------------------------------- | + | options | WebSocketCloseOptions | 是 | 参考[WebSocketCloseOptions](#section12262183471518)。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + ws.close({ + code: 1000, + reason: "your reason" + }, (err, value) => { + if (!err) { + console.log("close success") + } else { + console.log("close fail, err is " + JSON.stringify(err)) + } + }); + ``` + + +### close + +close\(options?: WebSocketCloseOptions\): Promise + +根据可选参数code和reason,关闭WebSocket连接,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | --------------------- | ---- | ----------------------------------------------------- | + | options | WebSocketCloseOptions | 否 | 参考[WebSocketCloseOptions](#section12262183471518)。 | + +- 返回值 + + | 类型 | 说明 | + | :--------------- | :-------------------------------- | + | Promise | 以Promise形式返回关闭连接的结果。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let url = "ws://" + let promise = ws.close({ + code: 1000, + reason: "your reason" + }); + promise.then((value) => { + console.log("close success") + }).catch((err) => { + console.log("close fail, err is " + JSON.stringify(err)) + }); + ``` + + +### on\('open'\) + +on\(type: 'open', callback: AsyncCallback\): void + +订阅WebSocket的打开事件,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | ----------------------------- | + | type | string | 是 | 'open':WebSocket的打开事件。 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ws.on('open', (err, value) => { + console.log("on open, status:" + value.status + ", message:" + value.message); + }); + ``` + + +### off\('open'\) + +off\(type: 'open', callback?: AsyncCallback\): void + +取消订阅WebSocket的打开事件,使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | ----------------------------- | + | type | string | 是 | 'open':WebSocket的打开事件。 | + | callback | AsyncCallback\ | 否 | 回调函数。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + let callback1 = (err, value) => { + console.log("on open, status:" + value.status + ", message:" + value.message); + } + ws.on('open', callback1); + // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅 + ws.off('open', callback1); + ``` + + +### on\('message'\) + +on\(type: 'message', callback: AsyncCallback\): void + +订阅WebSocket的接收到服务器消息事件,使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>AsyncCallback中的数据可以是字符串\(API 6\)或ArrayBuffer\(API 8\)。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | -------------------------------------------- | + | type | string | 是 | 'message':WebSocket的接收到服务器消息事件。 | + | callback | AsyncCallback\8+\> | 是 | 回调函数。 | + + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ws.on('message', (err, value) => { + console.log("on message, message:" + value); + }); + ``` + + +### off\('message'\) + +off\(type: 'message', callback?: AsyncCallback\): void + +取消订阅WebSocket的接收到服务器消息事件,使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>AsyncCallback中的数据可以是字符串\(API 6\)或ArrayBuffer\(API 8\)。 +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------------------------------- | ---- | -------------------------------------------- | + | type | string | 是 | 'message':WebSocket的接收到服务器消息事件。 | + | callback | AsyncCallback\8+\> | 否 | 回调函数。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ws.off('message'); + ``` + + +### on\('close'\) + +on\(type: 'close', callback: AsyncCallback<\{ code: number, reason: string \}\>\): void + +订阅WebSocket的关闭事件,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------------------------------- | ---- | ------------------------------ | + | type | string | 是 | 'close':WebSocket的关闭事件。 | + | callback | AsyncCallback<{ code: number, reason: string }> | 是 | 回调函数。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ws.on('close', (err, value) => { + console.log("on close, code is " + value.code + ", reason is " + value.reason); + }); + ``` + + +### off\('close'\) + +off\(type: 'close', callback?: AsyncCallback<\{ code: number, reason: string \}\>\): void + +取消订阅WebSocket的关闭事件,使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------------------------------- | ---- | ------------------------------ | + | type | string | 是 | 'close':WebSocket的关闭事件。 | + | callback | AsyncCallback<{ code: number, reason: string }> | 否 | 回调函数。 | + + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ws.off('close'); + ``` + + +### on\('error'\) + +on\(type: 'error', callback: ErrorCallback\): void + +订阅WebSocket的Error事件,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------- | ---- | ------------------------------- | + | type | string | 是 | 'error':WebSocket的Error事件。 | + | callback | ErrorCallback | 是 | 回调函数。 | + + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ws.on('error', (err) => { + console.log("on error, error:" + JSON.stringify(err)) + }); + ``` + + +### off\('error'\) + +off\(type: 'error', callback?: ErrorCallback\): void + +取消订阅WebSocket的Error事件,使用callback方式作为异步方法。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------- | ---- | ------------------------------- | + | type | string | 是 | 'error':WebSocket的Error事件。 | + | callback | ErrorCallback | 否 | 回调函数。 | + +- 示例 + + ``` + let ws = webSocket.createWebSocket(); + ws.off('error'); + ``` + + +## WebSocketRequestOptions + +建立WebSocket连接时,可选参数的类型和说明。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| header | Object | 否 | 建立WebSocket连接可选参数,代表建立连接时携带的HTTP头信息。参数内容自定义,也可以不指定。 | + + +## WebSocketCloseOptions + +关闭WebSocket连接时,可选参数的类型和说明。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| code | number | 否 | 错误码,关闭WebSocket连接时的可选参数,可根据实际情况来填。默认值为1000。 | +| reason | string | 否 | 原因值,关闭WebSocket连接时的可选参数,可根据实际情况来填。默认值为空字符串("")。 | + +## close错误码说明 + +发送给服务端的错误码可以自行定义,下面的列表仅供参考。 + +| 值 | 说明 | +| :-------- | :----------------- | +| 1000 | 正常关闭 | +| 1001 | 服务器主动关闭 | +| 1002 | 协议错误 | +| 1003 | 无法处理的数据类型 | +| 1004~1015 | 保留值 | + -- Gitee From 0c29f70e1f582bf759c645bb9e9e0d6a97513592 Mon Sep 17 00:00:00 2001 From: Guangyao Ma Date: Fri, 4 Mar 2022 17:10:45 +0800 Subject: [PATCH 125/282] =?UTF-8?q?fix:=20liteos-m=20vfs=E9=87=8D=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E5=8F=96=E6=B6=88SetDefaultMountPath=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #I4RV26 Change-Id: I765d34fb38026d5d24ed815b84f18248e3156afb Signed-off-by: Guangyao Ma --- .../porting/porting-bes2600w-on-minisystem-display-demo.md | 1 - 1 file changed, 1 deletion(-) diff --git a/zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md b/zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md index f2725ccc223..b65533df179 100644 --- a/zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md +++ b/zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md @@ -410,7 +410,6 @@ static int32_t FsDriverInit(struct HdfDeviceObject *object) fs[i].lfs_cfg.lookahead_size = 16; fs[i].lfs_cfg.block_cycles = 1000; - SetDefaultMountPath(i, fs[i].mount_point); int ret = mount(NULL, fs[i].mount_point, "littlefs", 0, &fs[i].lfs_cfg); HDF_LOGI("%s: mount fs on '%s' %s\n", __func__, fs[i].mount_point, (ret == 0) ? "succeed" : "failed"); } -- Gitee From ecfa3d6cf68b363472065ff02cb1ef2e95ed762b Mon Sep 17 00:00:00 2001 From: clevercong Date: Fri, 4 Mar 2022 17:14:13 +0800 Subject: [PATCH 126/282] format file. Signed-off-by: clevercong --- .../reference/apis/js-apis-socket.md | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-socket.md b/zh-cn/application-dev/reference/apis/js-apis-socket.md index 94c71c72362..b9e682ac883 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-socket.md +++ b/zh-cn/application-dev/reference/apis/js-apis-socket.md @@ -1,6 +1,5 @@ # Socket连接 -- [支持设备](#section11223131205610) - [导入模块](#s56d19203690d4782bfc74069abb6bd71) - [权限列表](#section11257113618419) - [socket.constructUDPSocketInstance](#section375081875219) @@ -129,10 +128,9 @@ bind\(address: NetAddress\): Promise - 参数 - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | - | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ---------------------------------- | ---- | ------------------------------------------------------ | + | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | - 返回值 @@ -199,7 +197,7 @@ send\(options: UDPSendOptions\): Promise | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | | options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | - + - 返回值 | 类型 | 说明 | @@ -723,7 +721,6 @@ bind\(address NetAddress\): Promise | ------- | ---------------------------------- | ---- | ------------------------------------------------------ | | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | - - 返回值 | 类型 | 说明 | @@ -782,7 +779,6 @@ connect\(options: TCPConnectOptions\): Promise | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | | options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | - - 返回值 | 类型 | 说明 | @@ -849,7 +845,7 @@ send\(options: TCPSendOptions\): Promise >![](public_sys-resources/icon-note.gif) **说明:** >[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 参数 +- 参数 | 参数名 | 类型 | 必填 | 说明 | | ------- | --------------------------------------- | ---- | ------------------------------------------------------------ | @@ -861,7 +857,7 @@ send\(options: TCPSendOptions\): Promise | :-------------- | :------------------------------------------------- | | Promise\ | 以Promise形式返回通过TCPSocket连接发送数据的结果。 | -- 示例 +- 示例 ``` let tcp = socket.constructTCPSocketInstance(); @@ -1134,7 +1130,6 @@ setExtraOptions\(options: TCPExtraOptions\): Promise | ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | | options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | - - 返回值 | 类型 | 说明 | @@ -1202,14 +1197,14 @@ off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: So >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +- 参数 | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | -- 示例 +- 示例 ``` let tcp = socket.constructTCPSocketInstance(); @@ -1237,7 +1232,7 @@ on\(type: 'connect' | 'close', callback: Callback\): void | callback | Callback\ | 是 | 回调函数。 | -- 示例 +- 示例 ``` let tcp = socket.constructTCPSocketInstance(); @@ -1266,7 +1261,7 @@ off\(type: 'connect' | 'close', callback: Callback\): void | type | string | 是 | 订阅的事件类型。
- 'connect':连接事件。
- 'close':关闭事件。 | | callback | Callback\ | 否 | 回调函数。 | -- 示例 +- 示例 ``` let tcp = socket.constructTCPSocketInstance(); @@ -1300,7 +1295,7 @@ on\(type: 'error', callback: ErrorCallback\): void | type | string | 是 | 订阅的事件类型。'error':error事件。 | | callback | ErrorCallback | 是 | 回调函数。 | -- 示例 +- 示例 ``` let tcp = socket.constructTCPSocketInstance(); @@ -1319,14 +1314,14 @@ off\(type: 'error', callback?: ErrorCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +- 参数 | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------- | ---- | ------------------------------------ | | type | string | 是 | 订阅的事件类型。'error':error事件。 | | callback | ErrorCallback | 否 | 回调函数。 | -- 示例 +- 示例 ``` let tcp = socket.constructTCPSocketInstance(); -- Gitee From 494e5894013380caeb9d6e717e324a08adce8aa8 Mon Sep 17 00:00:00 2001 From: zhangxiao72 Date: Fri, 4 Mar 2022 17:21:13 +0800 Subject: [PATCH 127/282] =?UTF-8?q?=E5=A2=9E=E5=8A=A0JavaScriptProxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I689a5e3fb5c0a44878ba64aae52ff6f5d80efff1 Signed-off-by: zhangxiao72 --- .../arkui-ts/ts-media-components-web.md | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md index 9a3a3a1e1f3..566d3b60124 100755 --- a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-web.md @@ -34,16 +34,17 @@ ohos.permission.READ_USER_STORAGE > - 不支持横竖屏事件。 ## 属性 -| 名称 | 参数类型 | 默认值 | 描述 | -| ----------------- | --------- | -------------- | ---------------------------------------- | -| domStorageAccess | boolean | false | 设置是否开启DOM Storage API权限,默认未开启。 | -| fileAccess | boolean | true | 设置是否开启Web中通过FILE方式访问应用中的本地文件, 默认启用。 | -| geolocationAccess | boolean | true | 设置是否允许访问地理位置, 默认允许访问。 | -| imageAccess | boolean | true | 设置是否允许自动加载图片资源,默认允许。 | -| javaScriptAccess | boolean | true | 设置是否允许执行JavaScript脚本,默认允许执行。 | -| mixedMode | MixedMode | MixedMode.None | 设置是否允许加载HTTP和HTTPS混合内容,默认不允许加载HTTP和HTTPS混合内容。 | -| onlineImageAccess | boolean | true | 设置是否允许从网络加载图片资源(通过HTTP和HTTPS访问的资源),默认允许访问。 | -| zoomAccess | boolean | true | 设置是否支持使用屏幕控件或手势进行缩放,默认允许执行缩放。 | +| 名称 | 参数类型 | 默认值 | 描述 | +| ----------------- | ------------------------------------------------------------ | -------------- | ------------------------------------------------------------ | +| domStorageAccess | boolean | false | 设置是否开启DOM Storage API权限,默认未开启。 | +| fileAccess | boolean | true | 设置是否开启Web中通过FILE方式访问应用中的本地文件, 默认启用。 | +| geolocationAccess | boolean | true | 设置是否允许访问地理位置, 默认允许访问。 | +| imageAccess | boolean | true | 设置是否允许自动加载图片资源,默认允许。 | +| javaScriptAccess | boolean | true | 设置是否允许执行JavaScript脚本,默认允许执行。 | +| mixedMode | MixedMode | MixedMode.None | 设置是否允许加载HTTP和HTTPS混合内容,默认不允许加载HTTP和HTTPS混合内容。 | +| onlineImageAccess | boolean | true | 设置是否允许从网络加载图片资源(通过HTTP和HTTPS访问的资源),默认允许访问。 | +| zoomAccess | boolean | true | 设置是否支持使用屏幕控件或手势进行缩放,默认允许执行缩放。 | +| javaScriptProxy | {
obj: object,
name: string,
methodList: Array,
controller: [WebController](#WebController)
} | - | 注入ArkUI对象到HTML中,并在HTML中调用该对象的方法,参数不支持更新。
-obj: 参与注册的对象。
-name: 注册对象的名称,与HTML中调用的对象名一致。
-methodList: 参与注册的方法。
-controller: 控制器。 | > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > -- Gitee From 76bd202ff5d49ac4f4c42e3aac4b825c6ca03cad Mon Sep 17 00:00:00 2001 From: chyyy0213 Date: Fri, 4 Mar 2022 12:14:42 +0800 Subject: [PATCH 128/282] =?UTF-8?q?window=20=E8=B5=84=E6=96=99bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chyyy0213 Change-Id: I30bbb95da95a977d8f6af29e0c208a4c8679cd57 Signed-off-by: chyyy0213 --- .../reference/apis/js-apis-window.md | 74 +++++++++++++++---- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-window.md b/zh-cn/application-dev/reference/apis/js-apis-window.md index 5f991416a93..faac688921e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-window.md +++ b/zh-cn/application-dev/reference/apis/js-apis-window.md @@ -221,7 +221,7 @@ create(ctx: Context, id: string, type: WindowType, callback: AsyncCallback<Wi ## window.create8+ -function create(ctx: Context, id: string, type: WindowType): Promise<Window> +create(ctx: Context, id: string, type: WindowType): Promise<Window> 当Context为[ServiceExtensionContext](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-service-extension-context.md)时,创建系统窗口,使用Promise方式作为异步方法。 @@ -500,7 +500,7 @@ hide (callback: AsyncCallback<void>): void ### hide7+ -hide(): Promise<void>; +hide(): Promise<void> 隐藏当前窗口,使用Promise方式作为异步方法。 @@ -1285,9 +1285,9 @@ isShowing(): Promise<boolean> }); ``` -### on('windowSizeChange'|'systemAvoidAreaChange') +### on('windowSizeChange')7+ -on(type: 'windowSizeChange'|'systemAvoidAreaChange', callback: Callback<AvoidArea | Size>): void +on(type: 'windowSizeChange', callback: Callback<Size>): void 开启监听。 @@ -1295,10 +1295,10 @@ on(type: 'windowSizeChange'|'systemAvoidAreaChange', callback: Callback<Avoid - 参数 - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | - | type | string | 是 | 设置监听类型。
- type为'windowSizeChange'7+时表示监听类型为窗口尺寸变化监听;
- type为'systemAvoidAreaChange'7+时表示监听类型为系统窗口规避区变化监听。 | - | callback | Callback<[AvoidArea](#avoidarea) \| [Size](#size)> | 是 | 回调返回监听到的信息。 | + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'windowSizeChange'时表示监听类型为窗口尺寸变化监听; | + | callback | Callback<[Size](#size)> | 是 | 回调返回监听到的信息。 | - 示例 @@ -1309,9 +1309,9 @@ on(type: 'windowSizeChange'|'systemAvoidAreaChange', callback: Callback<Avoid }); ``` -### off('windowSizeChange'|'systemAvoidAreaChange')7+ +### off('windowSizeChange')7+ -off(type: 'windowSizeChange'|'systemAvoidAreaChange', callback?: Callback<AvoidArea | Size >): void +off(type: 'windowSizeChange', callback?: Callback<Size >): void 关闭监听。 @@ -1319,10 +1319,10 @@ off(type: 'windowSizeChange'|'systemAvoidAreaChange', callback?: Callback<Avo - 参数 - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | - | type | string | 是 | 设置监听类型。
- type为'windowSizeChange'7+时表示监听类型为窗口尺寸变化监听;
- type为'systemAvoidAreaChange'7+时表示监听类型为系统窗口规避区变化监听。 | - | callback | Callback<[AvoidArea](#avoidarea) \| [Size](#size)> | 否 | 回调返回监听到的信息。 | + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'windowSizeChange'7+时表示监听类型为窗口尺寸变化监听; | + | callback | Callback<[Size](#size)> | 否 | 回调返回监听到的信息。 | - 示例 @@ -1331,6 +1331,52 @@ off(type: 'windowSizeChange'|'systemAvoidAreaChange', callback?: Callback<Avo windowClass.off(type); ``` +### on('systemAvoidAreaChange')7+ + +on(type: 'systemAvoidAreaChange', callback: Callback<AvoidArea>): void + +开启监听。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'systemAvoidAreaChange'时表示监听类型为系统窗口规避区变化监听。 | + | callback | Callback<[AvoidArea](#avoidarea)> | 是 | 回调返回监听到的信息。 | + +- 示例 + + ``` + var type = 'systemAvoidAreaChange'; + windowClass.on(type, (data) => { + console.info('Succeeded in enabling the listener for system avoid area changes. Data: ' + JSON.stringify(data)); + }); + ``` + +### off('systemAvoidAreaChange')7+ + +off(type: 'systemAvoidAreaChange', callback?: Callback<AvoidArea>): void + +关闭监听。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'systemAvoidAreaChange'时表示监听类型为系统窗口规避区变化监听。 | + | callback | Callback<[AvoidArea](#avoidarea)> | 否 | 回调返回监听到的信息。 | + +- 示例 + + ``` + var type = 'systemAvoidAreaChange'; + windowClass.off(type); + ``` + ### isSupportWideGamut8+ isSupportWideGamut(callback: AsyncCallback<boolean>): void -- Gitee From 7723e8af6ad67667756aa16955b15af80bf4da3b Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Fri, 4 Mar 2022 17:33:11 +0800 Subject: [PATCH 129/282] refresh Signed-off-by: zhouyongfei --- .../reference/apis/js-apis-inputmethodengine.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md index 00e4a69a66b..83af08a877b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md +++ b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md @@ -146,7 +146,7 @@ on(type: 'keyboardShow'|'keyboardHide', callback: () => void): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | ------ | ---- | ------------------------------------------------------------ | | type | string | 是 | 设置监听类型。
- type为'keyboardShow',表示订阅输入法显示。
- type为'keyboardHide',表示订阅输入法隐藏。 | - | callback | void | 否 | 无回调函数。 | + | callback | void | 否 | 回调函数。 | - 示例: @@ -169,7 +169,7 @@ off(type: 'keyboardShow'|'keyboardHide', callback?: () => void): void; | 参数名 | 类型 | 必填 | 说明 | | -------- | ------ | ---- | ------------------------------------------------------------ | | type | string | 是 | 设置监听类型。
- type为'keyboardShow',表示订阅输入法显示。
- type为'keyboardHide',表示订阅输入法隐藏。 | - | callback | void | 否 | 无回调函数。 | + | callback | void | 否 | 回调函数。 | - 示例: @@ -397,6 +397,12 @@ hideKeyboard(): Promise<void> **系统能力**: SystemCapability.MiscServices.InputMethod +- 返回值 + + | 类型 | 说明 | + | ---------------------- | ------------ | + | AsyncCallback<void> | 不需要的参数 | + - 示例 @@ -701,11 +707,11 @@ getEditorAttribute(callback: AsyncCallback<EditorAttribute>): void | ------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | callback | AsyncCallback<[EditorAttribute](#EditorAttribute)> | 是 | 编辑框属性值。 | - - 示例 - ``` +- 示例 + ``` TextInputClient.getEditorAttribute((EditorAttribute)=>{ }); - ``` + ``` ### getEditorAttribute -- Gitee From 0411702e4574876fd46b7f3941a8737bc5b10f29 Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Fri, 4 Mar 2022 17:37:21 +0800 Subject: [PATCH 130/282] refresh Signed-off-by: zhouyongfei --- .../reference/apis/js-apis-inputmethodengine.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md index 83af08a877b..2eb63359f84 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md +++ b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md @@ -377,9 +377,9 @@ hideKeyboard(callback: AsyncCallback<void>): void - 参数: - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------------- | ---- | ------------ | - | callback | AsyncCallback<void> | 否 | 不需要的参数 | + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------- | ---- | -------- | + | callback | AsyncCallback<void> | 否 | 回调函数 | - 示例 @@ -399,9 +399,9 @@ hideKeyboard(): Promise<void> - 返回值 - | 类型 | 说明 | - | ---------------------- | ------------ | - | AsyncCallback<void> | 不需要的参数 | + | 类型 | 说明 | + | ---------------------- | -------- | + | AsyncCallback<void> | 回调函数 | - 示例 -- Gitee From 701f216eb7c1185788b2f5713bf8d665f91403ba Mon Sep 17 00:00:00 2001 From: clevercong Date: Fri, 4 Mar 2022 17:49:45 +0800 Subject: [PATCH 131/282] format files. Signed-off-by: clevercong --- .../reference/apis/js-apis-http.md | 345 ++-- .../reference/apis/js-apis-socket.md | 1496 ++++++++--------- .../reference/apis/js-apis-webSocket.md | 520 +++--- 3 files changed, 1180 insertions(+), 1181 deletions(-) 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 ff82b65406a..d330766001b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-http.md +++ b/zh-cn/application-dev/reference/apis/js-apis-http.md @@ -86,18 +86,18 @@ createHttp\(\): HttpRequest 创建一个http,里面包括发起请求、中断请求、订阅/取消订阅HTTP Response Header 事件。每一个HttpRequest对象对应一个Http请求。如需发起多个Http请求,须为每个Http请求创建对应HttpRequest对象。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :---------- | :----------------------------------------------------------- | - | HttpRequest | 返回一个HttpRequest对象,里面包括request、destroy、on和off方法。 | - -- 示例 +| 类型 | 说明 | +| :---------- | :----------------------------------------------------------- | +| HttpRequest | 返回一个HttpRequest对象,里面包括request、destroy、on和off方法。 | - ``` - import http from '@ohos.net.http'; - let httpRequest = http.createHttp(); - ``` +**示例:** + +``` +import http from '@ohos.net.http'; +let httpRequest = http.createHttp(); +``` ## HttpRequest @@ -110,29 +110,28 @@ request\(url: string, callback: AsyncCallback\\):void 根据URL地址,发起HTTP网络请求,使用callback方式作为异步方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------- | ---- | ----------------------- | - | url | string | 是 | 发起网络请求的URL地址。 | - | callback | AsyncCallback\<[HttpResponse](#section12262183471518)\> | 是 | 回调函数。 | +**参数:** -- 示例 +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------- | ---- | ----------------------- | +| url | string | 是 | 发起网络请求的URL地址。 | +| callback | AsyncCallback\<[HttpResponse](#section12262183471518)\> | 是 | 回调函数。 | - ``` - let httpRequest = http.createHttp(); - httpRequest.request("EXAMPLE_URL", (err, data) => { - if (!err) { - console.info('Result:' + data.result); - console.info('code:' + data.responseCode); - console.info('header:' + data.header); - console.info('cookies:' + data.cookies); // 8+ - } else { - console.info('error:' + err.data); - } - }); - ``` +**示例:** +``` +let httpRequest = http.createHttp(); +httpRequest.request("EXAMPLE_URL", (err, data) => { + if (!err) { + console.info('Result:' + data.result); + console.info('code:' + data.responseCode); + console.info('header:' + data.header); + console.info('cookies:' + data.cookies); // 8+ + } else { + console.info('error:' + err.data); + } +}); +``` ### request @@ -140,41 +139,41 @@ request\(url: string, options: HttpRequestOptions, callback: AsyncCallback | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------- | ---- | -------------------------------------------------- | +| url | string | 是 | 发起网络请求的URL地址。 | +| options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#section12262183471518)。 | +| callback | AsyncCallback\<[HttpResponse](#section12262183471518)\> | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let httpRequest= http.createHttp(); - httpRequest.request("EXAMPLE_URL", - { - method: 'GET', - header: { - 'Content-Type': 'application/json' - }, - readTimeout: 60000, - connectTimeout: 60000 - },(err, data) => { - if (!err) { - console.info('Result:' + data.result); - console.info('code:' + data.responseCode); - console.info('header:' + data.header); - console.info('cookies:' + data.cookies); // 8+ - console.info('header['Content-Type']:' + data.header['Content-Type']); - console.info('header['Status-Line']:' + data.header['Status-Line']); - console.info('header.Date:' + data.header.Date); - console.info('header.Server:' + data.header.Server); - } else { - console.info('error:' + err.data); - } - }); - ``` +``` +let httpRequest= http.createHttp(); +httpRequest.request("EXAMPLE_URL", +{ + method: 'GET', + header: { + 'Content-Type': 'application/json' + }, + readTimeout: 60000, + connectTimeout: 60000 +},(err, data) => { + if (!err) { + console.info('Result:' + data.result); + console.info('code:' + data.responseCode); + console.info('header:' + data.header); + console.info('cookies:' + data.cookies); // 8+ + console.info('header['Content-Type']:' + data.header['Content-Type']); + console.info('header['Status-Line']:' + data.header['Status-Line']); + console.info('header.Date:' + data.header.Date); + console.info('header.Server:' + data.header.Server); + } else { + console.info('error:' + err.data); + } +}); +``` ### request @@ -183,46 +182,45 @@ request\(url: string, options? : HttpRequestOptions\): Promise 根据URL地址,发起HTTP网络请求,使用Promise方式作为异步方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ------------------ | ---- | -------------------------------------------------- | - | url | string | 是 | 发起网络请求的URL地址。 | - | options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#section12262183471518)。 | - -- 返回值 - - | 类型 | 说明 | - | :-------------------- | :-------------------------------- | - | Promise<[HttpResponse](#section12262183471518)> | 以Promise形式返回发起请求的结果。 | - - -- 示例 - - ``` - let httpRequest= http.createHttp(); - let promise = httpRequest.request("EXAMPLE_URL", { - method: "GET", - connectTimeout: 60000, - readTimeout: 60000, - header: { - 'Content-Type': 'application/json' - } - }); - promise.then((value) => { - console.info('Result:' + value.result); - console.info('code:' + value.responseCode); - console.info('header:' + value.header); - console.info('cookies:' + value.cookies); // 8+ - console.info('header['Content-Type']:' + value.header['Content-Type']); - console.info('header['Status-Line']:' + value.header['Status-Line']); - console.info('header.Date:' + value.header.Date); - console.info('header.Server:' + value.header.Server); - }).catch((err) => { - console.error(`errCode:${err.code}, errMessage:${err.data}`); - }); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------------------ | ---- | -------------------------------------------------- | +| url | string | 是 | 发起网络请求的URL地址。 | +| options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#section12262183471518)。 | +**返回值:** + +| 类型 | 说明 | +| :-------------------- | :-------------------------------- | +| Promise<[HttpResponse](#section12262183471518)> | 以Promise形式返回发起请求的结果。 | + + +**示例:** + +``` +let httpRequest= http.createHttp(); +let promise = httpRequest.request("EXAMPLE_URL", { + method: "GET", + connectTimeout: 60000, + readTimeout: 60000, + header: { + 'Content-Type': 'application/json' + } +}); +promise.then((value) => { + console.info('Result:' + value.result); + console.info('code:' + value.responseCode); + console.info('header:' + value.header); + console.info('cookies:' + value.cookies); // 8+ + console.info('header['Content-Type']:' + value.header['Content-Type']); + console.info('header['Status-Line']:' + value.header['Status-Line']); + console.info('header.Date:' + value.header.Date); + console.info('header.Server:' + value.header.Server); +}).catch((err) => { + console.error(`errCode:${err.code}, errMessage:${err.data}`); +}); +``` ### destroy @@ -230,13 +228,12 @@ destroy\(\): void 中断请求任务。 -- 示例 - - ``` - let httpRequest= http.createHttp(); - httpRequest.destroy(); - ``` +**示例:** +``` +let httpRequest= http.createHttp(); +httpRequest.destroy(); +``` ### on\('headerReceive'\) @@ -247,25 +244,25 @@ on\(type: 'headerReceive', callback: AsyncCallback\):void >![](public_sys-resources/icon-note.gif) **说明:** > 此接口已废弃,建议使用on\('headersReceive'\)替代。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------- | ---- | ------------------------------------- | - | type | string | 是 | 订阅的事件类型,如:'headerReceive'。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | ------------------------------------- | +| type | string | 是 | 订阅的事件类型,如:'headerReceive'。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let httpRequest= http.createHttp(); - httpRequest.on('headerReceive', (err, data) => { - if (!err) { - console.info('header: ' + data.header); - } else { - console.info('error:' + err.data); - } - }); - ``` +``` +let httpRequest= http.createHttp(); +httpRequest.on('headerReceive', (err, data) => { + if (!err) { + console.info('header: ' + data.header); + } else { + console.info('error:' + err.data); + } +}); +``` ### off\('headerReceive'\) @@ -280,26 +277,26 @@ off\(type: 'headerReceive', callback?: AsyncCallback\):void > >2. 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------- | ---- | ------------------------------------- | - | type | string | 是 | 取消订阅的事件类型,'headerReceive'。 | - | callback | AsyncCallback\ | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | ------------------------------------- | +| type | string | 是 | 取消订阅的事件类型,'headerReceive'。 | +| callback | AsyncCallback\ | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let httpRequest= http.createHttp(); - httpRequest.on('headerReceive', (err, data) => { - if (!err) { - console.info('header: ' + data.header); - } else { - console.info('error:' + err.data); - } - }); - httpRequest.off('headerReceive'); - ``` +``` +let httpRequest= http.createHttp(); +httpRequest.on('headerReceive', (err, data) => { + if (!err) { + console.info('header: ' + data.header); + } else { + console.info('error:' + err.data); + } +}); +httpRequest.off('headerReceive'); +``` ### on\('headersReceive'\)8+ @@ -307,21 +304,21 @@ on\(type: 'headersReceive', callback: Callback\):void 订阅HTTP Response Header 事件。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------ | ---- | ---------------------------------- | - | type | string | 是 | 订阅的事件类型:'headersReceive'。 | - | callback | Callback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------ | ---- | ---------------------------------- | +| type | string | 是 | 订阅的事件类型:'headersReceive'。 | +| callback | Callback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let httpRequest= http.createHttp(); - httpRequest.on('headersReceive', (data) => { - console.info('header: ' + data.header); - }); - ``` +``` +let httpRequest= http.createHttp(); +httpRequest.on('headersReceive', (data) => { + console.info('header: ' + data.header); +}); +``` ### off\('headersReceive'\)8+ @@ -333,19 +330,19 @@ off\(type: 'headersReceive', callback?: Callback\):void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------ | ---- | -------------------------------------- | - | type | string | 是 | 取消订阅的事件类型:'headersReceive'。 | - | callback | Callback\ | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------ | ---- | -------------------------------------- | +| type | string | 是 | 取消订阅的事件类型:'headersReceive'。 | +| callback | Callback\ | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let httpRequest= http.createHttp(); - httpRequest.off('headersReceive'); - ``` +``` +let httpRequest= http.createHttp(); +httpRequest.off('headersReceive'); +``` ### once\('headersReceive'\)8+ @@ -353,21 +350,21 @@ once\(type: "headersReceive", callback: Callback\): void 订阅HTTP Response Header 事件,但是只触发一次。一旦触发之后,订阅器就会被移除。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------ | ---- | ---------------------------------- | - | type | string | 是 | 订阅的事件类型:'headersReceive'。 | - | callback | Callback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------ | ---- | ---------------------------------- | +| type | string | 是 | 订阅的事件类型:'headersReceive'。 | +| callback | Callback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let httpRequest= http.createHttp(); - httpRequest.once('headersReceive', (data) => { - console.info('header: ' + data.header); - }); - ``` +``` +let httpRequest= http.createHttp(); +httpRequest.once('headersReceive', (data) => { + console.info('header: ' + data.header); +}); +``` ## HttpRequestOptions diff --git a/zh-cn/application-dev/reference/apis/js-apis-socket.md b/zh-cn/application-dev/reference/apis/js-apis-socket.md index b9e682ac883..81a20ed2ddf 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-socket.md +++ b/zh-cn/application-dev/reference/apis/js-apis-socket.md @@ -75,18 +75,18 @@ constructUDPSocketInstance\(\): UDPSocket 创建一个UDPSocket对象。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :--------------------------------- | :---------------------- | - | [UDPSocket](#section1957294511568) | 返回一个UDPSocket对象。 | +| 类型 | 说明 | +| :--------------------------------- | :---------------------- | +| [UDPSocket](#section1957294511568) | 返回一个UDPSocket对象。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - ``` +``` +let udp = socket.constructUDPSocketInstance(); +``` ## UDPSocket @@ -99,25 +99,25 @@ bind\(address: NetAddress, callback: AsyncCallback\): void 绑定IP地址和端口,端口可以指定或由系统随机分配。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | - | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------- | ---- | ------------------------------------------------------ | +| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { - if (err) { - console.log('bind fail'); - return; - } - console.log('bind success'); - }) - ``` +``` +let udp = socket.constructUDPSocketInstance(); +udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); +}) +``` ### bind @@ -126,30 +126,30 @@ bind\(address: NetAddress\): Promise 绑定IP地址和端口,端口可以指定或由系统随机分配。使用Promise方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ---------------------------------- | ---- | ------------------------------------------------------ | - | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------- | ---- | ------------------------------------------------------ | +| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | -- 返回值 +**返回值:** - | 类型 | 说明 | - | :-------------- | :----------------------------------------- | - | Promise\ | 以Promise形式异步返回UDPSocket绑定的结果。 | +| 类型 | 说明 | +| :-------------- | :----------------------------------------- | +| Promise\ | 以Promise形式异步返回UDPSocket绑定的结果。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - let promise = udp.bind({address: '192.168.xx.xxx', port: 8080, family: 1}); - promise .then(() => { - console.log('bind success'); - }).catch(err => { - console.log('bind fail'); - }); - ``` +``` +let udp = socket.constructUDPSocketInstance(); +let promise = udp.bind({address: '192.168.xx.xxx', port: 8080, family: 1}); +promise .then(() => { + console.log('bind success'); +}).catch(err => { + console.log('bind fail'); +}); +``` ### send @@ -158,32 +158,32 @@ send\(options: UDPSendOptions, callback: AsyncCallback\): void 通过UDPSocket连接发送数据。使用callback方式作为异步方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | - -- 示例 - - ``` - let udp = socket.constructUDPSocketInstance(); - udp.send({ - data:'Hello, server!', - address: { - address:'192.168.xx.xxx', - port:xxxx, - family:1 - } - }, err=> { - if (err) { - console.log('send fail'); - return; - } - console.log('send success'); - }) - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | + +**示例:** + +``` +let udp = socket.constructUDPSocketInstance(); +udp.send({ + data:'Hello, server!', + address: { + address:'192.168.xx.xxx', + port:xxxx, + family:1 + } +}, err=> { + if (err) { + console.log('send fail'); + return; + } + console.log('send success'); +}) +``` ### send @@ -192,36 +192,36 @@ send\(options: UDPSendOptions\): Promise 通过UDPSocket连接发送数据。使用Promise方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | -- 返回值 +**返回值:** - | 类型 | 说明 | - | :-------------- | :--------------------------------------------- | - | Promise\ | 以Promise形式返回UDPSocket连接发送数据的结果。 | +| 类型 | 说明 | +| :-------------- | :--------------------------------------------- | +| Promise\ | 以Promise形式返回UDPSocket连接发送数据的结果。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - let promise = udp.send({ - data:'Hello, server!', - address: { - address:'192.168.xx.xxx', - port:xxxx, - family:1 - } - }); - promise.then(() => { - console.log('send success'); - }).catch(err => { - console.log('send fail'); - }); - ``` +``` +let udp = socket.constructUDPSocketInstance(); +let promise = udp.send({ + data:'Hello, server!', + address: { + address:'192.168.xx.xxx', + port:xxxx, + family:1 + } +}); +promise.then(() => { + console.log('send success'); +}).catch(err => { + console.log('send fail'); +}); +``` ### close @@ -230,24 +230,24 @@ close\(callback: AsyncCallback\): void 关闭UDPSocket连接。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | --------------------- | ---- | ---------- | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------- | ---- | ---------- | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - udp.close(err => { - if (err) { - console.log('close fail'); - return; - } - console.log('close success'); - }) - ``` +``` +let udp = socket.constructUDPSocketInstance(); +udp.close(err => { + if (err) { + console.log('close fail'); + return; + } + console.log('close success'); +}) +``` ### close @@ -256,23 +256,23 @@ close\(\): Promise 关闭UDPSocket连接。使用Promise方式作为异步方法。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :-------------- | :----------------------------------------- | - | Promise\ | 以Promise形式返回关闭UDPSocket连接的结果。 | +| 类型 | 说明 | +| :-------------- | :----------------------------------------- | +| Promise\ | 以Promise形式返回关闭UDPSocket连接的结果。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - let promise = udp.close(); - promise.then(() => { - console.log('close success'); - }).catch(err => { - console.log('close fail'); - }); - ``` +``` +let udp = socket.constructUDPSocketInstance(); +let promise = udp.close(); +promise.then(() => { + console.log('close success'); +}).catch(err => { + console.log('close fail'); +}); +``` ### getState @@ -284,31 +284,31 @@ getState\(callback: AsyncCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section7382103811272)方法调用成功后,才可调用此方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------ | ---- | ---------- | - | callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | - -- 示例 - - ``` - let udp = socket.constructUDPSocketInstance(); - udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { - if (err) { - console.log('bind fail'); - return; - } - console.log('bind success'); - udp.getState((err, data) => { - if (err) { - console.log('getState fail'); - return; - } - console.log('getState success:' + JSON.stringify(data)); - }) - }) - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------ | ---- | ---------- | +| callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | + +**示例:** + +``` +let udp = socket.constructUDPSocketInstance(); +udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + udp.getState((err, data) => { + if (err) { + console.log('getState fail'); + return; + } + console.log('getState success:' + JSON.stringify(data)); + }) +}) +``` ### getState @@ -320,30 +320,30 @@ getState\(\): Promise >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section7382103811272)方法调用成功后,才可调用此方法。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :----------------------------------------------- | :----------------------------------------- | - | Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取UDPSocket状态的结果。 | +| 类型 | 说明 | +| :----------------------------------------------- | :----------------------------------------- | +| Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取UDPSocket状态的结果。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { - if (err) { - console.log('bind fail'); - return; - } - console.log('bind success'); - let promise = udp.getState({}); - promise.then(data => { - console.log('getState success:' + JSON.stringify(data)); - }).catch(err => { - console.log('getState fail'); - }); - }) - ``` +``` +let udp = socket.constructUDPSocketInstance(); +udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + let promise = udp.getState({}); + promise.then(data => { + console.log('getState success:' + JSON.stringify(data)); + }).catch(err => { + console.log('getState fail'); + }); +}) +``` ### setExtraOptions @@ -355,39 +355,39 @@ setExtraOptions\(options: UDPExtraOptions, callback: AsyncCallback\): voi >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section7382103811272)方法调用成功后,才可调用此方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | - - -- 示例 - - ``` - let udp = socket.constructUDPSocketInstance(); - udp.bind({address:'192.168.xx.xxx', port:xxxx, family:1}, err=> { - if (err) { - console.log('bind fail'); - return; - } - console.log('bind success'); - udp.setExtraOptions({ - receiveBufferSize:1000, - sendBufferSize:1000, - reuseAddress:false, - socketTimeout:6000, - broadcast:true - }, err=> { - if (err) { - console.log('setExtraOptions fail'); - return; - } - console.log('setExtraOptions success'); - }) - }) - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | + + +**示例:** + +``` +let udp = socket.constructUDPSocketInstance(); +udp.bind({address:'192.168.xx.xxx', port:xxxx, family:1}, err=> { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); + udp.setExtraOptions({ + receiveBufferSize:1000, + sendBufferSize:1000, + reuseAddress:false, + socketTimeout:6000, + broadcast:true + }, err=> { + if (err) { + console.log('setExtraOptions fail'); + return; + } + console.log('setExtraOptions success'); + }) +}) +``` ### setExtraOptions @@ -399,41 +399,41 @@ setExtraOptions\(options: UDPExtraOptions\): Promise >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section7382103811272)方法调用成功后,才可调用此方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | - -- 返回值 - - | 类型 | 说明 | - | :-------------- | :--------------------------------------------------- | - | Promise\ | 以Promise形式返回设置UDPSocket连接的其他属性的结果。 | - -- 示例 - - ``` - let udp = socket.constructUDPSocketInstance(); - let promise = udp.bind({address:'192.168.xx.xxx', port:xxxx, family:1}); - promise.then(() => { - console.log('bind success'); - let promise1 = udp.setExtraOptions({ - receiveBufferSize:1000, - sendBufferSize:1000, - reuseAddress:false, - socketTimeout:6000, - broadcast:true - }); - promise1.then(() => { - console.log('setExtraOptions success'); - }).catch(err => { - console.log('setExtraOptions fail'); - }); - }).catch(err => { - console.log('bind fail'); - }); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | + +**返回值:** + +| 类型 | 说明 | +| :-------------- | :--------------------------------------------------- | +| Promise\ | 以Promise形式返回设置UDPSocket连接的其他属性的结果。 | + +**示例:** + +``` +let udp = socket.constructUDPSocketInstance(); +let promise = udp.bind({address:'192.168.xx.xxx', port:xxxx, family:1}); +promise.then(() => { + console.log('bind success'); + let promise1 = udp.setExtraOptions({ + receiveBufferSize:1000, + sendBufferSize:1000, + reuseAddress:false, + socketTimeout:6000, + broadcast:true + }); + promise1.then(() => { + console.log('setExtraOptions success'); + }).catch(err => { + console.log('setExtraOptions fail'); + }); +}).catch(err => { + console.log('bind fail'); +}); +``` ### on\('message'\) @@ -442,21 +442,21 @@ on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: Sock 订阅UDPSocket连接的接收消息事件。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | - | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | - | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | +| type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - udp.on('message', value => { - console.log("on message, message:" + value.message) + ", remoteInfo:" + value.remoteInfo); - }); - ``` +``` +let udp = socket.constructUDPSocketInstance(); +udp.on('message', value => { + console.log("on message, message:" + value.message) + ", remoteInfo:" + value.remoteInfo); +}); +``` ### off\('message'\) @@ -468,25 +468,25 @@ off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: So >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | - | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | - | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | +| type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - let callback = value =>{ - console.log("on message, message:" + value.message) + ", remoteInfo:" + value.remoteInfo); - } - udp.on('message', callback); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - udp.off('message', callback); - udp.off('message'); - ``` +``` +let udp = socket.constructUDPSocketInstance(); +let callback = value =>{ + console.log("on message, message:" + value.message) + ", remoteInfo:" + value.remoteInfo); +} +udp.on('message', callback); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +udp.off('message', callback); +udp.off('message'); +``` ### on\('listening' | 'close'\) @@ -495,24 +495,24 @@ on\(type: 'listening' | 'close', callback: Callback\): void 订阅UDPSocket连接的数据包消息事件或关闭事件。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------- | ---- | ------------------------------------------------------------ | - | type | string | 是 | 订阅的事件类型。
- 'listening':数据包消息事件。
- 'close':关闭事件。 | - | callback | Callback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 订阅的事件类型。
- 'listening':数据包消息事件。
- 'close':关闭事件。 | +| callback | Callback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance(); - udp.on('listening', () => { - console.log("on listening success")); - }); - udp.on('close', () => { - console.log("on close success" ); - }); - ``` +``` +let udp = socket.constructUDPSocketInstance(); +udp.on('listening', () => { + console.log("on listening success")); +}); +udp.on('close', () => { + console.log("on close success" ); +}); +``` ### off\('listening' | 'close'\) @@ -524,32 +524,32 @@ off\(type: 'listening' | 'close', callback?: Callback\): void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------- | ---- | ------------------------------------------------------------ | - | type | string | 是 | 订阅事件类型。
- 'listening':数据包消息事件。
- 'close':关闭事件。 | - | callback | Callback\ | 否 | 回调函数。 | - -- 示例 - - ``` - let udp = socket.constructUDPSocketInstance(); - let callback1 = () =>{ - console.log("on listening, success"); - } - udp.on('listening', callback1); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - udp.off('listening', callback1); - udp.off('listening'); - let callback2 = () =>{ - console.log("on close, success"); - } - udp.on('close', callback2); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - udp.off('close', callback2); - udp.off('close'); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 订阅事件类型。
- 'listening':数据包消息事件。
- 'close':关闭事件。 | +| callback | Callback\ | 否 | 回调函数。 | + +**示例:** + +``` +let udp = socket.constructUDPSocketInstance(); +let callback1 = () =>{ + console.log("on listening, success"); +} +udp.on('listening', callback1); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +udp.off('listening', callback1); +udp.off('listening'); +let callback2 = () =>{ + console.log("on close, success"); +} +udp.on('close', callback2); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +udp.off('close', callback2); +udp.off('close'); +``` ### on\('error'\) @@ -558,22 +558,22 @@ on\(type: 'error', callback: ErrorCallback\): void 订阅UDPSocket连接的error事件。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------- | ---- | ------------------------------------ | - | type | string | 是 | 订阅的事件类型。'error':error事件。 | - | callback | ErrorCallback | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------ | +| type | string | 是 | 订阅的事件类型。'error':error事件。 | +| callback | ErrorCallback | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance() - udp.on('error', err => { - console.log("on error, err:" + JSON.stringify(err)) - }); - ``` +``` +let udp = socket.constructUDPSocketInstance() +udp.on('error', err => { + console.log("on error, err:" + JSON.stringify(err)) +}); +``` ### off\('error'\) @@ -585,25 +585,25 @@ off\(type: 'error', callback?: ErrorCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------- | ---- | ------------------------------------ | - | type | string | 是 | 订阅的事件类型。'error':error事件。 | - | callback | ErrorCallback | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------ | +| type | string | 是 | 订阅的事件类型。'error':error事件。 | +| callback | ErrorCallback | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let udp = socket.constructUDPSocketInstance() - let callback = err =>{ - console.log("on error, err:" + JSON.stringify(err)); - } - udp.on('error', callback); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - udp.off('error', callback); - udp.off('error'); - ``` +``` +let udp = socket.constructUDPSocketInstance() +let callback = err =>{ + console.log("on error, err:" + JSON.stringify(err)); +} +udp.on('error', callback); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +udp.off('error', callback); +udp.off('error'); +``` ## NetAddress @@ -664,17 +664,17 @@ constructTCPSocketInstance\(\): TCPSocket 创建一个TCPSocket对象。 -- 返回值 +**返回值:** | 类型 | 说明 | | :--------------------------------- | :---------------------- | | [TCPSocket](#section1180211014548) | 返回一个TCPSocket对象。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +``` ## TCPSocket @@ -687,26 +687,26 @@ bind\(address: NetAddress, callback: AsyncCallback\): void 绑定IP地址和端口,端口可以指定或由系统随机分配。使用callback方法作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | - | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------- | ---- | ------------------------------------------------------ | +| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - tcp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { - if (err) { - console.log('bind fail'); - return; - } - console.log('bind success'); - }) - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +tcp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { + if (err) { + console.log('bind fail'); + return; + } + console.log('bind success'); +}) +``` ### bind @@ -715,29 +715,29 @@ bind\(address NetAddress\): Promise 绑定IP地址和端口,端口可以指定或由系统随机分配。使用Promise方法作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ---------------------------------- | ---- | ------------------------------------------------------ | - | address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------- | ---- | ------------------------------------------------------ | +| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | -- 返回值 +**返回值:** - | 类型 | 说明 | - | :-------------- | :------------------------------------------------------- | - | Promise\ | 以Promise形式返回TCPSocket绑定本机的IP地址和端口的结果。 | +| 类型 | 说明 | +| :-------------- | :------------------------------------------------------- | +| Promise\ | 以Promise形式返回TCPSocket绑定本机的IP地址和端口的结果。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}); - promise.then(() => { - console.log('bind success'); - }).catch(err => { - console.log('bind fail'); - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}); +promise.then(() => { + console.log('bind success'); +}).catch(err => { + console.log('bind fail'); +}); +``` ### connect @@ -746,25 +746,25 @@ connect\(options: TCPConnectOptions, callback: AsyncCallback\): void 连接到指定的IP地址和端口。使用callback方法作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}, err => { - if (err) { - console.log('connect fail'); - return; - } - console.log('connect success'); - }) - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}, err => { + if (err) { + console.log('connect fail'); + return; + } + console.log('connect success'); +}) +``` ### connect @@ -773,29 +773,29 @@ connect\(options: TCPConnectOptions\): Promise 连接到指定的IP地址和端口。使用promise方法作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | -- 返回值 +**返回值:** - | 类型 | 说明 | - | :-------------- | :--------------------------------------------------------- | - | Promise\ | 以Promise形式返回TCPSocket连接到指定的IP地址和端口的结果。 | +| 类型 | 说明 | +| :-------------- | :--------------------------------------------------------- | +| Promise\ | 以Promise形式返回TCPSocket连接到指定的IP地址和端口的结果。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise.then(() => { - console.log('connect success') - }).catch(err => { - console.log('connect fail'); - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise.then(() => { + console.log('connect success') +}).catch(err => { + console.log('connect fail'); +}); +``` ### send @@ -807,33 +807,33 @@ send\(options: TCPSendOptions, callback: AsyncCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | - -- 示例 - - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise.then(() => { - console.log('connect success'); - tcp.send({ - data:'Hello, server!' - },err => { - if (err) { - console.log('send fail'); - return; - } - console.log('send success'); - }) - }).catch(err => { - console.log('connect fail'); - }); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | + +**示例:** + +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise.then(() => { + console.log('connect success'); + tcp.send({ + data:'Hello, server!' + },err => { + if (err) { + console.log('send fail'); + return; + } + console.log('send success'); + }) +}).catch(err => { + console.log('connect fail'); +}); +``` ### send @@ -845,37 +845,37 @@ send\(options: TCPSendOptions\): Promise >![](public_sys-resources/icon-note.gif) **说明:** >[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | ------- | --------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | - -- 返回值 - - | 类型 | 说明 | - | :-------------- | :------------------------------------------------- | - | Promise\ | 以Promise形式返回通过TCPSocket连接发送数据的结果。 | - -- 示例 - - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise1 = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise1.then(() => { - console.log('connect success'); - let promise2 = tcp.send({ - data:'Hello, server!' - }); - promise2.then(() => { - console.log('send success'); - }).catch(err => { - console.log('send fail'); - }); - }).catch(err => { - console.log('connect fail'); - }); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | + +**返回值:** + +| 类型 | 说明 | +| :-------------- | :------------------------------------------------- | +| Promise\ | 以Promise形式返回通过TCPSocket连接发送数据的结果。 | + +**示例:** + +``` +let tcp = socket.constructTCPSocketInstance(); +let promise1 = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise1.then(() => { + console.log('connect success'); + let promise2 = tcp.send({ + data:'Hello, server!' + }); + promise2.then(() => { + console.log('send success'); + }).catch(err => { + console.log('send fail'); + }); +}).catch(err => { + console.log('connect fail'); +}); +``` ### close @@ -884,25 +884,25 @@ close\(callback: AsyncCallback\): void 关闭TCPSocket连接。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | --------------------- | ---- | ---------- | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------- | ---- | ---------- | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - tcp.close(err => { - if (err) { - console.log('close fail'); - return; - } - console.log('close success'); - }) - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +tcp.close(err => { + if (err) { + console.log('close fail'); + return; + } + console.log('close success'); +}) +``` ### close @@ -911,23 +911,23 @@ close\(\): Promise 关闭TCPSocket连接。使用Promise方式作为异步方法。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :-------------- | :----------------------------------------- | - | Promise\ | 以Promise形式返回关闭TCPSocket连接的结果。 | +| 类型 | 说明 | +| :-------------- | :----------------------------------------- | +| Promise\ | 以Promise形式返回关闭TCPSocket连接的结果。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.close(); - promise.then(() => { - console.log('close success'); - }).catch(err => { - console.log('close fail'); - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.close(); +promise.then(() => { + console.log('close success'); +}).catch(err => { + console.log('close fail'); +}); +``` ### getRemoteAddress @@ -939,30 +939,30 @@ getRemoteAddress\(callback: AsyncCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------- | ---- | ---------- | - | callback | AsyncCallback<[NetAddress](#section159132241295)> | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------- | ---- | ---------- | +| callback | AsyncCallback<[NetAddress](#section159132241295)> | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise.then(() => { - console.log('connect success'); - tcp.getRemoteAddress((err, data) => { - if (err) { - console.log('getRemoteAddressfail'); - return; - } - console.log('getRemoteAddresssuccess:' + JSON.stringify(data)); - }) - }).catch(err => { - console.log('connect fail'); - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise.then(() => { + console.log('connect success'); + tcp.getRemoteAddress((err, data) => { + if (err) { + console.log('getRemoteAddressfail'); + return; + } + console.log('getRemoteAddresssuccess:' + JSON.stringify(data)); + }) +}).catch(err => { + console.log('connect fail'); +}); +``` ### getRemoteAddress @@ -974,29 +974,29 @@ getRemoteAddress\(\): Promise >![](public_sys-resources/icon-note.gif) **说明:** >[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :------------------------------------------ | :------------------------------------------ | - | Promise<[NetAddress](#section159132241295)> | 以Promise形式返回获取对端socket地址的结果。 | +| 类型 | 说明 | +| :------------------------------------------ | :------------------------------------------ | +| Promise<[NetAddress](#section159132241295)> | 以Promise形式返回获取对端socket地址的结果。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise1 = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise1.then(() => { - console.log('connect success'); - let promise2 = tcp.getRemoteAddress(); - promise2.then(() => { - console.log('getRemoteAddress success:' + JSON.stringify(data)); - }).catch(err => { - console.log('getRemoteAddressfail'); - }); - }).catch(err => { - console.log('connect fail'); - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let promise1 = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise1.then(() => { + console.log('connect success'); + let promise2 = tcp.getRemoteAddress(); + promise2.then(() => { + console.log('getRemoteAddress success:' + JSON.stringify(data)); + }).catch(err => { + console.log('getRemoteAddressfail'); + }); +}).catch(err => { + console.log('connect fail'); +}); +``` ### getState @@ -1008,31 +1008,31 @@ getState\(callback: AsyncCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------ | ---- | ---------- | - | callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------ | ---- | ---------- | +| callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise.then(() => { - console.log('connect success'); - tcp.getState((err, data) => { - if (err) { - console.log('getState fail'); - return; - } - console.log('getState success:' + JSON.stringify(data)); - }); - }).catch(err => { - console.log('connect fail'); - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise.then(() => { + console.log('connect success'); + tcp.getState((err, data) => { + if (err) { + console.log('getState fail'); + return; + } + console.log('getState success:' + JSON.stringify(data)); + }); +}).catch(err => { + console.log('connect fail'); +}); +``` ### getState @@ -1044,30 +1044,30 @@ getState\(\): Promise >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :----------------------------------------------- | :----------------------------------------- | - | Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取TCPSocket状态的结果。 | +| 类型 | 说明 | +| :----------------------------------------------- | :----------------------------------------- | +| Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取TCPSocket状态的结果。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise.then(() => { - console.log('connect success'); - let promise1 = tcp.getState(); - promise1.then(() => { - console.log('getState success:' + JSON.stringify(data)); - }).catch(err => { - console.log('getState fail'); - }); - }).catch(err => { - console.log('connect fail'); - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise.then(() => { + console.log('connect success'); + let promise1 = tcp.getState(); + promise1.then(() => { + console.log('getState success:' + JSON.stringify(data)); + }).catch(err => { + console.log('getState fail'); + }); +}).catch(err => { + console.log('connect fail'); +}); +``` ### setExtraOptions @@ -1079,40 +1079,40 @@ setExtraOptions\(options: TCPExtraOptions, callback: AsyncCallback\): voi >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | - -- 示例 - - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise.then(() => { - console.log('connect success'); - tcp.setExtraOptions({ - keepAlive: true, - OOBInline: true, - TCPNoDelay: true, - socketLinger: { on:true, linger:10 } - receiveBufferSize: 1000, - sendBufferSize: 1000, - reuseAddress: true, - socketTimeout: 3000, - },err => { - if (err) { - console.log('setExtraOptions fail'); - return; - } - console.log('setExtraOptions success'); - }); - }).catch(err => { - console.log('connect fail'); - }); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | + +**示例:** + +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise.then(() => { + console.log('connect success'); + tcp.setExtraOptions({ + keepAlive: true, + OOBInline: true, + TCPNoDelay: true, + socketLinger: { on:true, linger:10 } + receiveBufferSize: 1000, + sendBufferSize: 1000, + reuseAddress: true, + socketTimeout: 3000, + },err => { + if (err) { + console.log('setExtraOptions fail'); + return; + } + console.log('setExtraOptions success'); + }); +}).catch(err => { + console.log('connect fail'); +}); +``` ### setExtraOptions @@ -1124,45 +1124,45 @@ setExtraOptions\(options: TCPExtraOptions\): Promise >![](public_sys-resources/icon-note.gif) **说明:** >[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | - | options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | - -- 返回值 - - | 类型 | 说明 | - | :-------------- | :--------------------------------------------------- | - | Promise\ | 以Promise形式返回设置TCPSocket连接的其他属性的结果。 | - - -- 示例 - - ``` - let tcp = socket.constructTCPSocketInstance(); - let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); - promise.then(() => { - console.log('connect success'); - let promise1 = tcp.setExtraOptions({ - keepAlive: true, - OOBInline: true, - TCPNoDelay: true, - socketLinger: { on:true, linger:10 } - receiveBufferSize: 1000, - sendBufferSize: 1000, - reuseAddress: true, - socketTimeout: 3000, - }); - promise1.then(() => { - console.log('setExtraOptions success'); - }).catch(err => { - console.log('setExtraOptions fail'); - }); - }).catch(err => { - console.log('connect fail'); - }); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | +| options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | + +**返回值:** + +| 类型 | 说明 | +| :-------------- | :--------------------------------------------------- | +| Promise\ | 以Promise形式返回设置TCPSocket连接的其他属性的结果。 | + + +**示例:** + +``` +let tcp = socket.constructTCPSocketInstance(); +let promise = tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , timeout: 6000}); +promise.then(() => { + console.log('connect success'); + let promise1 = tcp.setExtraOptions({ + keepAlive: true, + OOBInline: true, + TCPNoDelay: true, + socketLinger: { on:true, linger:10 } + receiveBufferSize: 1000, + sendBufferSize: 1000, + reuseAddress: true, + socketTimeout: 3000, + }); + promise1.then(() => { + console.log('setExtraOptions success'); + }).catch(err => { + console.log('setExtraOptions fail'); + }); +}).catch(err => { + console.log('connect fail'); +}); +``` ### on\('message'\) @@ -1171,21 +1171,21 @@ on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: Sock 订阅TCPSocket连接的接收消息事件。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | - | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | - | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | +| type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - tcp.on('message', value => { - console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo) - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +tcp.on('message', value => { + console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo) +}); +``` ### off\('message'\) @@ -1197,25 +1197,25 @@ off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: So >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | - | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | - | callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | +| type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - let callback = value =>{ - console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo); - } - tcp.on('message', callback); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - tcp.off('message', callback); - tcp.off('message'); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +let callback = value =>{ + console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo); +} +tcp.on('message', callback); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +tcp.off('message', callback); +tcp.off('message'); +``` ### on\('connect' | 'close'\) @@ -1224,25 +1224,25 @@ on\(type: 'connect' | 'close', callback: Callback\): void 订阅TCPSocket的连接事件或关闭事件。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------- | ---- | ------------------------------------------------------------ | - | type | string | 是 | 订阅的事件类型。
- 'connect':连接事件。
- 'close':关闭事件。 | - | callback | Callback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 订阅的事件类型。
- 'connect':连接事件。
- 'close':关闭事件。 | +| callback | Callback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - tcp.on('connect', () => { - console.log("on connect success") - }); - tcp.on('close', data => { - console.log("on close success") - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +tcp.on('connect', () => { + console.log("on connect success") +}); +tcp.on('close', data => { + console.log("on close success") +}); +``` ### off\('connect' | 'close'\) @@ -1254,32 +1254,32 @@ off\(type: 'connect' | 'close', callback: Callback\): void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ---------------- | ---- | ------------------------------------------------------------ | - | type | string | 是 | 订阅的事件类型。
- 'connect':连接事件。
- 'close':关闭事件。 | - | callback | Callback\ | 否 | 回调函数。 | - -- 示例 - - ``` - let tcp = socket.constructTCPSocketInstance(); - let callback1 = () =>{ - console.log("on connect success"); - } - tcp.on('connect', callback1); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - tcp.off('connect', callback1); - tcp.off('connect'); - let callback2 = () =>{ - console.log("on close success"); - } - tcp.on('close', callback2); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - tcp.off('close', callback2); - tcp.off('close'); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 订阅的事件类型。
- 'connect':连接事件。
- 'close':关闭事件。 | +| callback | Callback\ | 否 | 回调函数。 | + +**示例:** + +``` +let tcp = socket.constructTCPSocketInstance(); +let callback1 = () =>{ + console.log("on connect success"); +} +tcp.on('connect', callback1); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +tcp.off('connect', callback1); +tcp.off('connect'); +let callback2 = () =>{ + console.log("on close success"); +} +tcp.on('close', callback2); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +tcp.off('close', callback2); +tcp.off('close'); +``` ### on\('error'\) @@ -1288,21 +1288,21 @@ on\(type: 'error', callback: ErrorCallback\): void 订阅TCPSocket连接的error事件。使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------- | ---- | ------------------------------------ | - | type | string | 是 | 订阅的事件类型。'error':error事件。 | - | callback | ErrorCallback | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------ | +| type | string | 是 | 订阅的事件类型。'error':error事件。 | +| callback | ErrorCallback | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let tcp = socket.constructTCPSocketInstance(); - tcp.on('error', err => { - console.log("on error, err:" + JSON.stringify(err)) - }); - ``` +``` +let tcp = socket.constructTCPSocketInstance(); +tcp.on('error', err => { + console.log("on error, err:" + JSON.stringify(err)) +}); +``` ### off\('error'\) @@ -1314,25 +1314,25 @@ off\(type: 'error', callback?: ErrorCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 - - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------- | ---- | ------------------------------------ | - | type | string | 是 | 订阅的事件类型。'error':error事件。 | - | callback | ErrorCallback | 否 | 回调函数。 | - -- 示例 - - ``` - let tcp = socket.constructTCPSocketInstance(); - let callback = err =>{ - console.log("on error, err:" + JSON.stringify(err)); - } - tcp.on('error', callback); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 - tcp.off('error', callback); - tcp.off('error'); - ``` +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------ | +| type | string | 是 | 订阅的事件类型。'error':error事件。 | +| callback | ErrorCallback | 否 | 回调函数。 | + +**示例:** + +``` +let tcp = socket.constructTCPSocketInstance(); +let callback = err =>{ + console.log("on error, err:" + JSON.stringify(err)); +} +tcp.on('error', callback); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +tcp.off('error', callback); +tcp.off('error'); +``` ## TCPConnectOptions diff --git a/zh-cn/application-dev/reference/apis/js-apis-webSocket.md b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md index 42a9304b267..9a797ae52c0 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-webSocket.md +++ b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md @@ -28,6 +28,8 @@ >![](public_sys-resources/icon-note.gif) **说明:** >本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +>当前暂时不支持WebSocket,预计在MR版本支持。 使用WebSocket建立服务器与客户端的双向连接,需要先通过[createWebSocket](#section375081875219)方法创建[WebSocket](#section16411174314593)对象,然后通过[connect](WebSocket连接.md)方法连接到服务器。当连接成功后,客户端会收到[open](#section923017271834)事件的回调,之后客户端就可以通过[send](#section156451414213)方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到[message](#section1066819418488)事件的回调。当客户端不要此连接时,可以通过调用[close](#section202411451433)方法主动断开连接,之后客户端会收到[close](#section169378107484)事件的回调。 @@ -96,17 +98,17 @@ createWebSocket\(\): WebSocket 创建一个WebSocket,里面包括建立连接、关闭连接、发送数据和订阅/取消订阅WebSocket连接的打开事件、接收到服务器消息事件、关闭事件和错误事件。 -- 返回值 +**返回值:** - | 类型 | 说明 | - | :---------------------------------- | :----------------------------------------------------------- | - | [WebSocket](#section16411174314593) | 返回一个WebSocket对象,里面包括connect、send、close、on和off方法。 | +| 类型 | 说明 | +| :---------------------------------- | :----------------------------------------------------------- | +| [WebSocket](#section16411174314593) | 返回一个WebSocket对象,里面包括connect、send、close、on和off方法。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ``` +``` +let ws = webSocket.createWebSocket(); +``` ## WebSocket @@ -119,27 +121,27 @@ connect\(url: string, callback: AsyncCallback\): void 根据URL地址,建立一个WebSocket连接,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------ | ---- | ---------------------------- | - | url | string | 是 | 建立WebSocket连接的URL地址。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------ | ---- | ---------------------------- | +| url | string | 是 | 建立WebSocket连接的URL地址。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - ws.connect(url, (err, value) => { - if (!err) { - console.log("connect success"); - } else { - console.log("connect fail, err:" + JSON.stringify(err)) - } - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +ws.connect(url, (err, value) => { + if (!err) { + console.log("connect success"); + } else { + console.log("connect fail, err:" + JSON.stringify(err)) + } +}); +``` ### connect @@ -148,33 +150,33 @@ connect\(url: string, options: WebSocketRequestOptions, callback: AsyncCallback< 根据URL地址和header,建立一个WebSocket连接,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------ | ---- | ------------------------------------------------------- | - | url | string | 是 | 建立WebSocket连接的URL地址。 | - | options | WebSocketRequestOptions | 是 | 参考[WebSocketRequestOptions](#section11251233123910)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------ | ---- | ------------------------------------------------------- | +| url | string | 是 | 建立WebSocket连接的URL地址。 | +| options | WebSocketRequestOptions | 是 | 参考[WebSocketRequestOptions](#section11251233123910)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - ws.connect(url, { - header: { - "key": "value", - "key2": "value2" - } - }, (err, value) => { - if (!err) { - console.log("connect success"); - } else { - console.log("connect fail, err:" + JSON.stringify(err)) - } - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +ws.connect(url, { + header: { + "key": "value", + "key2": "value2" + } +}, (err, value) => { + if (!err) { + console.log("connect success"); + } else { + console.log("connect fail, err:" + JSON.stringify(err)) + } +}); +``` ### connect @@ -183,31 +185,31 @@ connect\(url: string, options?: WebSocketRequestOptions\): Promise 根据URL地址和header,建立一个WebSocket连接,使用Promise方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | ------- | ----------------------- | ---- | ------------------------------------------------------- | - | url | string | 是 | 建立WebSocket连接的URL地址。 | - | options | WebSocketRequestOptions | 否 | 参考[WebSocketRequestOptions](#section11251233123910)。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ----------------------- | ---- | ------------------------------------------------------- | +| url | string | 是 | 建立WebSocket连接的URL地址。 | +| options | WebSocketRequestOptions | 否 | 参考[WebSocketRequestOptions](#section11251233123910)。 | -- 返回值 +**返回值:** - | 类型 | 说明 | - | :----------------- | :-------------------------------- | - | Promise\ | 以Promise形式返回建立连接的结果。 | +| 类型 | 说明 | +| :----------------- | :-------------------------------- | +| Promise\ | 以Promise形式返回建立连接的结果。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - let promise = ws.connect(url); - promise.then((value) => { - console.log("connect success") - }).catch((err) => { - console.log("connect fail, error:" + JSON.stringify(err)) - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +let promise = ws.connect(url); +promise.then((value) => { + console.log("connect success") +}).catch((err) => { + console.log("connect fail, error:" + JSON.stringify(err)) +}); +``` ### send @@ -216,28 +218,28 @@ send\(data: string | ArrayBuffer, callback: AsyncCallback\): void 通过WebSocket连接发送数据,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------ | ---- | ------------ | - | data | string \| ArrayBuffer 8+ | 是 | 发送的数据。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------ | ---- | ------------ | +| data | string \| ArrayBuffer 8+ | 是 | 发送的数据。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - ws.connect(url, (err, value) => { - ws.send("Hello, server!", (err, value) => { - if (!err) { - console.log("send success"); - } else { - console.log("send fail, err:" + JSON.stringify(err)) - } - }); - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +ws.connect(url, (err, value) => { + ws.send("Hello, server!", (err, value) => { + if (!err) { + console.log("send success"); + } else { + console.log("send fail, err:" + JSON.stringify(err)) + } + }); +}); +``` ### send @@ -246,32 +248,32 @@ send\(data: string | ArrayBuffer\): Promise 通过WebSocket连接发送数据,使用Promise方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | ------ | ------ | ---- | ------------ | - | data | string \| ArrayBuffer 8+ | 是 | 发送的数据。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------ | +| data | string \| ArrayBuffer 8+ | 是 | 发送的数据。 | -- 返回值 +**返回值:** - | 类型 | 说明 | - | :----------------- | :-------------------------------- | - | Promise\ | 以Promise形式返回发送数据的结果。 | +| 类型 | 说明 | +| :----------------- | :-------------------------------- | +| Promise\ | 以Promise形式返回发送数据的结果。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - ws.connect(url, (err, value) => { - let promise = ws.send("Hello, server!"); - promise.then((value) => { - console.log("send success") - }).catch((err) => { - console.log("send fail, error:" + JSON.stringify(err)) - }); - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +ws.connect(url, (err, value) => { + let promise = ws.send("Hello, server!"); + promise.then((value) => { + console.log("send success") + }).catch((err) => { + console.log("send fail, error:" + JSON.stringify(err)) + }); +}); +``` ### close @@ -280,25 +282,25 @@ close\(callback: AsyncCallback\): void 关闭WebSocket连接,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------ | ---- | ---------- | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------ | ---- | ---------- | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - ws.close((err, value) => { - if (!err) { - console.log("close success") - } else { - console.log("close fail, err is " + JSON.stringify(err)) - } - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +ws.close((err, value) => { + if (!err) { + console.log("close success") + } else { + console.log("close fail, err is " + JSON.stringify(err)) + } +}); +``` ### close @@ -307,29 +309,29 @@ close\(options: WebSocketCloseOptions, callback: AsyncCallback\): void 根据可选参数code和reason,关闭WebSocket连接,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------------------ | ---- | ----------------------------------------------------- | - | options | WebSocketCloseOptions | 是 | 参考[WebSocketCloseOptions](#section12262183471518)。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------ | ---- | ----------------------------------------------------- | +| options | WebSocketCloseOptions | 是 | 参考[WebSocketCloseOptions](#section12262183471518)。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - ws.close({ - code: 1000, - reason: "your reason" - }, (err, value) => { - if (!err) { - console.log("close success") - } else { - console.log("close fail, err is " + JSON.stringify(err)) - } - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +ws.close({ + code: 1000, + reason: "your reason" +}, (err, value) => { + if (!err) { + console.log("close success") + } else { + console.log("close fail, err is " + JSON.stringify(err)) + } +}); +``` ### close @@ -338,33 +340,33 @@ close\(options?: WebSocketCloseOptions\): Promise 根据可选参数code和reason,关闭WebSocket连接,使用Promise方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | ------- | --------------------- | ---- | ----------------------------------------------------- | - | options | WebSocketCloseOptions | 否 | 参考[WebSocketCloseOptions](#section12262183471518)。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------- | ---- | ----------------------------------------------------- | +| options | WebSocketCloseOptions | 否 | 参考[WebSocketCloseOptions](#section12262183471518)。 | -- 返回值 +**返回值:** - | 类型 | 说明 | - | :--------------- | :-------------------------------- | - | Promise | 以Promise形式返回关闭连接的结果。 | +| 类型 | 说明 | +| :----------------- | :-------------------------------- | +| Promise\ | 以Promise形式返回关闭连接的结果。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let url = "ws://" - let promise = ws.close({ - code: 1000, - reason: "your reason" - }); - promise.then((value) => { - console.log("close success") - }).catch((err) => { - console.log("close fail, err is " + JSON.stringify(err)) - }); - ``` +``` +let ws = webSocket.createWebSocket(); +let url = "ws://" +let promise = ws.close({ + code: 1000, + reason: "your reason" +}); +promise.then((value) => { + console.log("close success") +}).catch((err) => { + console.log("close fail, err is " + JSON.stringify(err)) +}); +``` ### on\('open'\) @@ -373,22 +375,22 @@ on\(type: 'open', callback: AsyncCallback\): void 订阅WebSocket的打开事件,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------- | ---- | ----------------------------- | - | type | string | 是 | 'open':WebSocket的打开事件。 | - | callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | ----------------------------- | +| type | string | 是 | 'open':WebSocket的打开事件。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ws.on('open', (err, value) => { - console.log("on open, status:" + value.status + ", message:" + value.message); - }); - ``` +``` +let ws = webSocket.createWebSocket(); +ws.on('open', (err, value) => { + console.log("on open, status:" + value.status + ", message:" + value.message); +}); +``` ### off\('open'\) @@ -400,24 +402,24 @@ off\(type: 'open', callback?: AsyncCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------- | ---- | ----------------------------- | - | type | string | 是 | 'open':WebSocket的打开事件。 | - | callback | AsyncCallback\ | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | ----------------------------- | +| type | string | 是 | 'open':WebSocket的打开事件。 | +| callback | AsyncCallback\ | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - let callback1 = (err, value) => { - console.log("on open, status:" + value.status + ", message:" + value.message); - } - ws.on('open', callback1); - // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅 - ws.off('open', callback1); - ``` +``` +let ws = webSocket.createWebSocket(); +let callback1 = (err, value) => { + console.log("on open, status:" + value.status + ", message:" + value.message); +} +ws.on('open', callback1); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅 +ws.off('open', callback1); +``` ### on\('message'\) @@ -429,22 +431,22 @@ on\(type: 'message', callback: AsyncCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >AsyncCallback中的数据可以是字符串\(API 6\)或ArrayBuffer\(API 8\)。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------- | ---- | -------------------------------------------- | - | type | string | 是 | 'message':WebSocket的接收到服务器消息事件。 | - | callback | AsyncCallback\8+\> | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | -------------------------------------------- | +| type | string | 是 | 'message':WebSocket的接收到服务器消息事件。 | +| callback | AsyncCallback\8+\> | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ws.on('message', (err, value) => { - console.log("on message, message:" + value); - }); - ``` +``` +let ws = webSocket.createWebSocket(); +ws.on('message', (err, value) => { + console.log("on message, message:" + value); +}); +``` ### off\('message'\) @@ -457,19 +459,19 @@ off\(type: 'message', callback?: AsyncCallback\): void >AsyncCallback中的数据可以是字符串\(API 6\)或ArrayBuffer\(API 8\)。 >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | --------------------------------------------------- | ---- | -------------------------------------------- | - | type | string | 是 | 'message':WebSocket的接收到服务器消息事件。 | - | callback | AsyncCallback\8+\> | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------------- | ---- | -------------------------------------------- | +| type | string | 是 | 'message':WebSocket的接收到服务器消息事件。 | +| callback | AsyncCallback\8+\> | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ws.off('message'); - ``` +``` +let ws = webSocket.createWebSocket(); +ws.off('message'); +``` ### on\('close'\) @@ -478,21 +480,21 @@ on\(type: 'close', callback: AsyncCallback<\{ code: number, reason: string \}\>\ 订阅WebSocket的关闭事件,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------------------------------- | ---- | ------------------------------ | - | type | string | 是 | 'close':WebSocket的关闭事件。 | - | callback | AsyncCallback<{ code: number, reason: string }> | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------- | ---- | ------------------------------ | +| type | string | 是 | 'close':WebSocket的关闭事件。 | +| callback | AsyncCallback<{ code: number, reason: string }> | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ws.on('close', (err, value) => { - console.log("on close, code is " + value.code + ", reason is " + value.reason); - }); - ``` +``` +let ws = webSocket.createWebSocket(); +ws.on('close', (err, value) => { + console.log("on close, code is " + value.code + ", reason is " + value.reason); +}); +``` ### off\('close'\) @@ -504,20 +506,20 @@ off\(type: 'close', callback?: AsyncCallback<\{ code: number, reason: string \}\ >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ----------------------------------------------- | ---- | ------------------------------ | - | type | string | 是 | 'close':WebSocket的关闭事件。 | - | callback | AsyncCallback<{ code: number, reason: string }> | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------- | ---- | ------------------------------ | +| type | string | 是 | 'close':WebSocket的关闭事件。 | +| callback | AsyncCallback<{ code: number, reason: string }> | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ws.off('close'); - ``` +``` +let ws = webSocket.createWebSocket(); +ws.off('close'); +``` ### on\('error'\) @@ -526,22 +528,22 @@ on\(type: 'error', callback: ErrorCallback\): void 订阅WebSocket的Error事件,使用callback方式作为异步方法。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------- | ---- | ------------------------------- | - | type | string | 是 | 'error':WebSocket的Error事件。 | - | callback | ErrorCallback | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------- | +| type | string | 是 | 'error':WebSocket的Error事件。 | +| callback | ErrorCallback | 是 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ws.on('error', (err) => { - console.log("on error, error:" + JSON.stringify(err)) - }); - ``` +``` +let ws = webSocket.createWebSocket(); +ws.on('error', (err) => { + console.log("on error, error:" + JSON.stringify(err)) +}); +``` ### off\('error'\) @@ -553,19 +555,19 @@ off\(type: 'error', callback?: ErrorCallback\): void >![](public_sys-resources/icon-note.gif) **说明:** >可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 -- 参数 +**参数:** - | 参数名 | 类型 | 必填 | 说明 | - | -------- | ------------- | ---- | ------------------------------- | - | type | string | 是 | 'error':WebSocket的Error事件。 | - | callback | ErrorCallback | 否 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------- | +| type | string | 是 | 'error':WebSocket的Error事件。 | +| callback | ErrorCallback | 否 | 回调函数。 | -- 示例 +**示例:** - ``` - let ws = webSocket.createWebSocket(); - ws.off('error'); - ``` +``` +let ws = webSocket.createWebSocket(); +ws.off('error'); +``` ## WebSocketRequestOptions -- Gitee From 8948a76a9e747e1456443ac222f41fea7d0d4000 Mon Sep 17 00:00:00 2001 From: jyh926 Date: Fri, 4 Mar 2022 17:57:34 +0800 Subject: [PATCH 132/282] update call&sms js reference Signed-off-by: jyh926 --- .../reference/apis/js-apis-call.md | 74 +++++++++++++++++++ .../reference/apis/js-apis-sms.md | 28 +++++-- 2 files changed, 97 insertions(+), 5 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-call.md b/zh-cn/application-dev/reference/apis/js-apis-call.md index 2319264154c..1bf0985bda9 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-call.md +++ b/zh-cn/application-dev/reference/apis/js-apis-call.md @@ -102,6 +102,61 @@ promise.then(data => { }); ``` +## call.makeCall7+ + +makeCall(phoneNumber: string, callback: AsyncCallback): void + +跳转到拨号界面,并显示拨号的号码,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.CallManager + +**参数:** + +| 参数 | 类型 | 必填 | 说明 | +| ----------- | ------------------------- | ---- | ------------------------------------------ | +| phoneNumber | string | 是 | 电话号码。 | +| callback | AsyncCallback<void> | 是 | 以callback形式异步返回跳转拨号界面的结果。 | + +**示例:** + +``` +call.makeCall("138xxxxxxxx", err => { + console.log(`makeCall callback: err->${JSON.stringify(err)}`); +}); +``` + + +## call.makeCall7+ + +makeCall(phoneNumber: string): Promise + +跳转到拨号界面,并显示拨号的号码,使用Promise方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.CallManager + +**参数:** + +| 参数 | 类型 | 必填 | 说明 | +| ----------- | ------ | ---- | ---------- | +| phoneNumber | string | 是 | 电话号码。 | + +**返回值:** + +| 类型 | 说明 | +| ------------------- | --------------------------------- | +| Promise<void> | 以Promise形式异步返回拨号的结果。 | + +**示例:** + +``` +let promise = call.makeCall("138xxxxxxxx"); +promise.then(() => { + console.log(`makeCall success`); +}).catch(err => { + console.error(`makeCall fail, promise: err->${JSON.stringify(err)}`); +}); +``` + ## call.hasCall hasCall\(callback: AsyncCallback\): void @@ -199,6 +254,25 @@ promise.then(data => { }); ``` +## call.hasVoiceCapability7+ + +hasVoiceCapability(): boolean + +检查当前设备是否具备语音通话能力,该方法是同步方法。 + +**系统能力**:SystemCapability.Telephony.CallManager + +**返回值:** + +| 类型 | 说明 | +| ------- | ------------------------------------------------------------ | +| boolean | - true:设备具备语音通话能力
- false:设备不具备语音通话能力 | + +``` +let result = call.hasVoiceCapability(); +console.log(`hasVoiceCapability: ${JSON.stringify(result)}`); +``` + ## call.isEmergencyPhoneNumber7+ isEmergencyPhoneNumber\(phoneNumber: string, callback: AsyncCallback\): void diff --git a/zh-cn/application-dev/reference/apis/js-apis-sms.md b/zh-cn/application-dev/reference/apis/js-apis-sms.md index bad012c67fa..8b50b835799 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-sms.md +++ b/zh-cn/application-dev/reference/apis/js-apis-sms.md @@ -148,7 +148,7 @@ getDefaultSmsSlotId\(\): Promise **示例:** ``` -let promise = call.getDefaultSmsSlotId(); +let promise = sms.getDefaultSmsSlotId(); promise.then(data => { console.log(`getDefaultSmsSlotId success, promise: data->${JSON.stringify(data)}`); }).catch(err => { @@ -233,6 +233,8 @@ getSmscAddr\(slotId: number, callback: AsyncCallback\): void **系统能力**:SystemCapability.Telephony.SmsMms +**补充说明**:该接口为systemapi,仅供系统应用使用 + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -260,6 +262,8 @@ getSmscAddr\(slotId: number\): Promise **系统能力**:SystemCapability.Telephony.SmsMms +**补充说明**:该接口为systemapi,仅供系统应用使用 + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -284,6 +288,24 @@ promise.then(data => { }); ``` +## sms.hasSmsCapability7+ + +hasSmsCapability(): boolean + +检查当前设备是否具备短信发送和接收能力,该方法是同步方法。 + +**系统能力**:SystemCapability.Telephony.SmsMms + +**返回值:** + +| 类型 | 说明 | +| ------- | ------------------------------------------------------------ | +| boolean | - true:设备具备短信发送和接收能力
- false:设备不具备短信发送和接收能力 | + +``` +let result = sms.hasSmsCapability(); +console.log(`hasSmsCapability: ${JSON.stringify(result)}`); +``` ## ShortMessage @@ -293,10 +315,7 @@ promise.then(data => { | 变量 | 类型 | 说明 | | ------------------------ | --------------------------------------- | ------------------------------------------------------------ | -| emailAddress | string | 电子邮件地址。 | -| emailMessageBody | string | 电子邮件正文。 | | hasReplyPath | boolean | 收到的短信是否包含“TP-Reply-Path”,默认为false。
“TP-Reply-Path”:移动电话根据发送SMS消息的短消息中心进行回复。 | -| isEmailMessage | boolean | 收到的短信是否为电子邮件。 | | isReplaceMessage | boolean | 收到的短信是否为“替换短信”,默认为false。
“替换短信”有关详细信息,参见 “3GPP TS 23.040 9.2.3.9”。 | | isSmsStatusReportMessage | boolean | 当前消息是否为“短信状态报告”,默认为false。
“短信状态报告”是一种特定格式的短信,被用来从Service Center到Mobile Station传送状态报告。 | | messageClass | [ShortMessageClass](#ShortMessageClass) | 短信类型。 | @@ -305,7 +324,6 @@ promise.then(data => { | scAddress | string | 短消息服务中心(SMSC)地址。 | | scTimestamp | number | SMSC时间戳。 | | status | number | SMS-STATUS-REPORT消息中的短信状态指示短信服务中心(SMSC)发送的短信状态。 | -| userRawData | Array<number> | 除数据头外的用户数据。 | | visibleMessageBody | string | 短信正文。 | | visibleRawAddress | string | 发送者地址。 | -- Gitee From 1e8d506eab31132934388790d69a2883c055b102 Mon Sep 17 00:00:00 2001 From: xuyong Date: Fri, 4 Mar 2022 17:58:06 +0800 Subject: [PATCH 133/282] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E8=80=85=E5=8F=82=E8=80=83=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuyong --- .../subsystems/subsys-dfx-hisysevent-tool.md | 54 ++++++++++++++- .../subsystems/subsys-dfx-hisysevent-tool.md | 69 ++++++++++++++++--- 2 files changed, 113 insertions(+), 10 deletions(-) diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-tool.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-tool.md index af83b877ff9..eeb5bd0068a 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-tool.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-tool.md @@ -37,7 +37,7 @@ The HiSysEvent tool is a command line tool preconfigured in the **/system/bin** - Command for subscribing to real-time system events by event tag: ``` - hisysevnet -r -t [-c [WHOLE_WORD|PREFIX|REGULAR]] + hisysevent -r -t [-c [WHOLE_WORD|PREFIX|REGULAR]] ``` Description of command options: @@ -47,18 +47,47 @@ The HiSysEvent tool is a command line tool preconfigured in the **/system/bin** | -t  | Event tag used to filter subscribed real-time system events.| | -c  | Matching rule for event tags. The options can be **WHOLE_WORD**, **PREFIX**, or **REGULAR**.| + Example commands: + + ``` + # hisysevent -r -t "TAG" -c PREFIX + {"domain_":"ACE","name_":"UI_BLOCK_6S","type_":1,"time_":1501940269812,"tz_":"+0000","tag_":"TAG1","pid_":1428,"tid_":1452,"uid_":10001,"level_":"CRITICAL","info_":""} + # hisysevent -r -t "TA\w{0,1}" -c REGULAR + {"domain_":"WINDOWMANAGER","name_":"NO_FOCUS_WINDOW","type_":1,"time_":1501940269802,"tz_":"+0000","tag_":"TAG","pid_":1428,"tid_":1433,"uid_":10001,"level_":"CRITICAL","info_":""} + {"domain_":"ACE","name_":"UI_BLOCK_6S","type_":1,"time_":1501940269812,"tz_":"+0000","tag_":"TAG1","pid_":1428,"tid_":1452,"uid_":10001,"level_":"CRITICAL","info_":""} + # hisysevent -r -t "TA\w+" -c REGULAR + {"domain_":"WINDOWMANAGER","name_":"NO_FOCUS_WINDOW","type_":1,"time_":1501940269802,"tz_":"+0000","tag_":"TAG","pid_":1428,"tid_":1433,"uid_":10001,"level_":"CRITICAL","info_":""} + {"domain_":"ACE","name_":"UI_BLOCK_6S","type_":1,"time_":1501940269812,"tz_":"+0000","tag_":"TAG1","pid_":1428,"tid_":1452,"uid_":10001,"level_":"CRITICAL","info_":""} + ``` + - Command for subscribing to real-time system events by event domain and event name: ``` hisysevent -r -o -n [-c [WHOLE_WORD|PREFIX|REGULAR]] ``` + Description of command options: + | Option| Description| | -------- | --------- | | -o | Event domain used to filter subscribed real-time system events.| | -n | Event name used to filter subscribed real-time system events.| | -c | Matching rule for event domains and event names. The options can be **WHOLE_WORD**, **PREFIX**, or **REGULAR**.| + Example commands: + + ``` + # hisysevent -r -o "DOMAINA" -n "EVENTNAMEA" + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":1501940269802,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + # hisysevent -r -o "DOMA\w{0,10}" -n "EVENT\w+" -c REULAR + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":1501940269802,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINABC","name_":"EVENTNAMEABC","type_":1,"time_":1501940269938,"tz_":"+0000","pid_":1428,"tid_":1336,"uid_":10002,"level_":"CRITICAL","info_":""} + # hisysevent -r -o "DOMA\w{0,10}" -c REGULAR + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":1501940269802,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINABC","name_":"EVENTNAMEABC","type_":1,"time_":1501940269938,"tz_":"+0000","pid_":1428,"tid_":1336,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINABC","name_":"EVENTNAMEB","type_":1,"time_":1501940279938,"tz_":"+0000","pid_":1428,"tid_":1344,"uid_":10002,"level_":"CRITICAL","info_":""} + ``` + >![](../public_sys-resources/icon-note.gif) **NOTE:** >If **-t**, **-o**, and **-n** are specified, the system checks whether the configured event tag is null. If the event tag is not null, the system filters system events based on the matching rules for the event tag. Otherwise, the system filters system events based on the matching rules for the event domain and event name. @@ -89,6 +118,16 @@ The HiSysEvent tool is a command line tool preconfigured in the **/system/bin** | -s | Start time for querying historical system events. Only system events generated after the start time are returned.| | -e | End time for querying historical system events. Only system events generated before the end time are returned.| + Example commands: + + ``` + # hisysevent -l -s 20207388633 -e 20207389000 + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388633,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388634,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388900,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207389000,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + ``` + - Command for setting the maximum number of historical events that can be queried: ``` @@ -100,3 +139,16 @@ The HiSysEvent tool is a command line tool preconfigured in the **/system/bin** | Option| Description| | -------- | --------- | | -m | Maximum number of historical system events that can be queried. The value ranges from **0** to **1000**. The number of returned system events is not more than the value of this parameter.| + + Example commands: + + ``` + # hisysevent -l -s 20207388633 -e 20207389000 -m 3 + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388634,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388900,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207389000,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + # hisysevent -l -m 2 + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388633,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388634,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + ``` + diff --git a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-tool.md b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-tool.md index 7f27de82e6f..a71dcc312d7 100644 --- a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-tool.md +++ b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-tool.md @@ -37,15 +37,28 @@ - 通过事件标签方式实时订阅HiSysEvent事件: ``` - hisysevnet -r -t [-c [WHOLE_WORD|PREFIX|REGULAR]] + hisysevent -r -t [-c [WHOLE_WORD|PREFIX|REGULAR]] ``` 选项说明: | 选项名称 | 功能说明 | | -------- | --------- | - | -t  | 设置实时订阅的HiSysEvent事件标签,用来过滤订阅的HiSysEvent事件 | - | -c  | 设置实时订阅的HiSysEvent事件标签匹配规则,有“WHOLE_WORD”、“PREFIX”、“REGULAR”三种匹配规则| + | -t  | 设置实时订阅的HiSysEvent事件标签,用来过滤订阅的HiSysEvent事件。 | + | -c  | 设置实时订阅的HiSysEvent事件标签匹配规则,有“WHOLE_WORD”、“PREFIX”、“REGULAR”三种匹配规则。 | + + 命令实例: + + ``` + # hisysevent -r -t "TAG" -c PREFIX + {"domain_":"ACE","name_":"UI_BLOCK_6S","type_":1,"time_":1501940269812,"tz_":"+0000","tag_":"TAG1","pid_":1428,"tid_":1452,"uid_":10001,"level_":"CRITICAL","info_":""} + # hisysevent -r -t "TA\w{0,1}" -c REGULAR + {"domain_":"WINDOWMANAGER","name_":"NO_FOCUS_WINDOW","type_":1,"time_":1501940269802,"tz_":"+0000","tag_":"TAG","pid_":1428,"tid_":1433,"uid_":10001,"level_":"CRITICAL","info_":""} + {"domain_":"ACE","name_":"UI_BLOCK_6S","type_":1,"time_":1501940269812,"tz_":"+0000","tag_":"TAG1","pid_":1428,"tid_":1452,"uid_":10001,"level_":"CRITICAL","info_":""} + # hisysevent -r -t "TA\w+" -c REGULAR + {"domain_":"WINDOWMANAGER","name_":"NO_FOCUS_WINDOW","type_":1,"time_":1501940269802,"tz_":"+0000","tag_":"TAG","pid_":1428,"tid_":1433,"uid_":10001,"level_":"CRITICAL","info_":""} + {"domain_":"ACE","name_":"UI_BLOCK_6S","type_":1,"time_":1501940269812,"tz_":"+0000","tag_":"TAG1","pid_":1428,"tid_":1452,"uid_":10001,"level_":"CRITICAL","info_":""} + ``` - 通过事件领域及事件名称的方式实时订阅HiSysEvent事件: @@ -53,11 +66,27 @@ hisysevent -r -o -n [-c [WHOLE_WORD|PREFIX|REGULAR]] ``` + 选项说明: + | 选项名称 | 功能说明 | | -------- | --------- | - | -o | 设置实时订阅的HiSysEvent事件领域,用来过滤订阅的HiSysEvent事件 | - | -n | 设置实时订阅的HiSysEvent事件名称,用来过滤订阅的HiSysEvent事件| - | -c | 设置实时订阅的HiSysEvent事件领域及事件名称的匹配规则,有“WHOLE_WORD”、“PREFIX”、“REGULAR”三种匹配规则| + | -o | 设置实时订阅的HiSysEvent事件领域,用来过滤订阅的HiSysEvent事件。 | + | -n | 设置实时订阅的HiSysEvent事件名称,用来过滤订阅的HiSysEvent事件。 | + | -c | 设置实时订阅的HiSysEvent事件领域及事件名称的匹配规则,有“WHOLE_WORD”、“PREFIX”、“REGULAR”三种匹配规则。 | + + 命令实例: + + ``` + # hisysevent -r -o "DOMAINA" -n "EVENTNAMEA" + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":1501940269802,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + # hisysevent -r -o "DOMA\w{0,10}" -n "EVENT\w+" -c REULAR + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":1501940269802,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINABC","name_":"EVENTNAMEABC","type_":1,"time_":1501940269938,"tz_":"+0000","pid_":1428,"tid_":1336,"uid_":10002,"level_":"CRITICAL","info_":""} + # hisysevent -r -o "DOMA\w{0,10}" -c REGULAR + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":1501940269802,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINABC","name_":"EVENTNAMEABC","type_":1,"time_":1501940269938,"tz_":"+0000","pid_":1428,"tid_":1336,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINABC","name_":"EVENTNAMEB","type_":1,"time_":1501940279938,"tz_":"+0000","pid_":1428,"tid_":1344,"uid_":10002,"level_":"CRITICAL","info_":""} + ``` >![](../public_sys-resources/icon-note.gif) **说明:** >当同时通过-t、-o及-n指定了相关订阅规则参数设置,则判断设置的事件标签是否为空,若不为空,则使用事件标签规则进行订阅,否则使用事件领域及事件名称订阅规则进行订阅。 @@ -74,7 +103,7 @@ | 选项名称 | 功能说明 | | -------- | --------- | - | -l | 以缺省设置查询历史HiSysEvent事件,此次查询会返回最近不多于1000条的HiSysEvent事件 | + | -l | 以缺省设置查询历史HiSysEvent事件,此次查询会返回最近不多于1000条的HiSysEvent事件。 | - 通过设置开始/结束时间,过滤查询历史HiSysEvent事件的结果的命令: @@ -86,8 +115,18 @@ | 选项名称 | 功能说明 | | -------- | --------- | - | -s | 设置查询历史HiSysEvent事件的开始时间,此次查询只会返回不早于该时间点的HiSysEvent事件 | - | -e | 设置查询历史HiSysEvent事件的结束时间,此次查询只会返回不晚于该时间点的HiSysEvent事件 | + | -s | 设置查询历史HiSysEvent事件的开始时间,此次查询只会返回不早于该时间点的HiSysEvent事件。 | + | -e | 设置查询历史HiSysEvent事件的结束时间,此次查询只会返回不晚于该时间点的HiSysEvent事件。 | + + 命令实例: + + ``` + # hisysevent -l -s 20207388633 -e 20207389000 + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388633,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388634,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388900,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207389000,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + ``` - 通过设置最大数量值,限制查询历史HiSysEvent事件的数量: @@ -100,3 +139,15 @@ | 选项名称 | 功能说明 | | -------- | --------- | | -m | 设置查询历史HiSysEvent事件的数量,有效值范围[0,1000],此次查询返回的HiSysEvent事件数目不会多于此值。 | + + 命令实例: + + ``` + # hisysevent -l -s 20207388633 -e 20207389000 -m 3 + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388634,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388900,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207389000,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + # hisysevent -l -m 2 + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388633,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + {"domain_":"DOMAINA","name_":"EVENTNAMEA","type_":1,"time_":20207388634,"tz_":"+0000","pid_":1428,"tid_":1333,"uid_":10002,"level_":"CRITICAL","info_":""} + ``` -- Gitee From 0c9a5ecdf96535b7ce7e779888a71b0af19344f2 Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Fri, 4 Mar 2022 17:59:06 +0800 Subject: [PATCH 134/282] refres Signed-off-by: zhouyongfei --- .../reference/apis/js-apis-inputmethodengine.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md index 2eb63359f84..fdd75255cd6 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md +++ b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md @@ -399,9 +399,9 @@ hideKeyboard(): Promise<void> - 返回值 - | 类型 | 说明 | - | ---------------------- | -------- | - | AsyncCallback<void> | 回调函数 | + | 类型 | 说明 | + | ---------------- | -------- | + | Promise<void> | 回调函数 | - 示例 -- Gitee From 4b952ff78b92adb4480b5fc3ab3be0a5b39e0470 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Fri, 4 Mar 2022 18:23:48 +0800 Subject: [PATCH 135/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-particleAbility.md | 329 ++++++++++-------- .../apis/js-apis-dataAbilityHelper.md | 6 +- .../reference/apis/js-apis-particleAbility.md | 110 ++---- 3 files changed, 217 insertions(+), 228 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-particleAbility.md b/en/application-dev/reference/apis/js-apis-particleAbility.md index fdeb2c639f4..fa68ababf9d 100644 --- a/en/application-dev/reference/apis/js-apis-particleAbility.md +++ b/en/application-dev/reference/apis/js-apis-particleAbility.md @@ -14,7 +14,7 @@ import particleAbility from '@ohos.ability.particleAbility' startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\: void -Starts a Service ability. This method uses a callback to return the result. +Starts a particle ability. This method uses a callback to return the result. **Parameters** @@ -28,6 +28,7 @@ Starts a Service ability. This method uses a callback to return the result. ```js import particleAbility from '@ohos.ability.particleAbility' +import wantConstant from '@ohos.ability.wantConstant' particleAbility.startAbility( { want: @@ -35,7 +36,7 @@ particleAbility.startAbility( action: "action.system.home", entities: ["entity.system.home"], type: "MIMETYPE", - flags: FLAG_AUTH_READ_URI_PERMISSION; + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, deviceId: "", bundleName: "com.example.Data", abilityName: "com.example.Data.MainAbility", @@ -53,7 +54,7 @@ particleAbility.startAbility( ## particleAbility.startAbility startAbility(parameter: StartAbilityParameter): Promise\ -Starts a Service ability. This method uses a promise to return the result. +Starts a particle ability. This method uses a promise to return the result. **Parameters** @@ -70,6 +71,7 @@ Starts a Service ability. This method uses a promise to return the result. ```js import particleAbility from '@ohos.ability.particleAbility' +import wantConstant from '@ohos.ability.wantConstant' particleAbility.startAbility( { want: @@ -77,14 +79,14 @@ particleAbility.startAbility( action: "action.system.home", entities: ["entity.system.home"], type: "MIMETYPE", - flags: FLAG_AUTH_READ_URI_PERMISSION; + flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, deviceId: "", bundleName: "com.example.Data", - abilityName: "com.example.Data.MainAbility", + abilityName: "com.example. Data.MainAbility", uri:"" }, }, -).then((void) => { +).then((data) => { console.info("particleAbility startAbility"); }); ``` @@ -95,7 +97,7 @@ particleAbility.startAbility( terminateSelf(callback: AsyncCallback\): void -Terminates this Service ability. This method uses a callback to return the result. +Terminates this particle ability. This method uses a callback to return the result. **Parameters** @@ -120,7 +122,7 @@ particleAbility.terminateSelf( terminateSelf(): Promise\ -Terminates this Service ability. This method uses a promise to return the result. +Terminates this particle ability. This method uses a promise to return the result. **Return value** | Type| Description| @@ -131,7 +133,7 @@ Terminates this Service ability. This method uses a promise to return the result ```js import particleAbility from '@ohos.ability.particleAbility' -particleAbility.terminateSelf().then((void) => { +particleAbility.terminateSelf().then((data) => { console.info("particleAbility terminateSelf"); }); ``` @@ -164,148 +166,6 @@ var uri = ""; particleAbility.acquireDataAbilityHelper(uri) ``` -## particleAbility.connectAbility - -connectAbility(request: Want, options:ConnectOptions): number - -Connects this ability to a specific Service ability. This method uses a callback to return the result. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ------- | -------------- | ---- | -------------------------- | -| request | [Want](#want) | Yes| Service ability to connect.| -| options | ConnectOptions | Yes| Callback used to return the result.| - -ConnectOptions - -| Name| Readable/Writable| Type| Mandatory| Description| -| ------------ | -------- | -------- | ---- | ---------------------------------- | -| onConnect | Read-only| function | Yes| Callback invoked when the connection is set up.| -| onDisconnect | Read-only| function | Yes| Callback invoked when the connection is interrupted.| -| onFailed | Read-only| function | Yes| Callback invoked when the connection fails.| - -**Return value** -| Type| Description| -| ------ | -------------------------- | -| number | Unique identifier of the connection between the client and the service side.| - -**Example** - -```javascript -import particleAbility from '@ohos.ability.particleAbility' -function onConnectCallback(element, remote){ - console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); -} -function onDisconnectCallback(element){ - console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) -} -function onFailedCallback(code){ - console.log('particleAbilityTest ConnectAbility onFailed errCode : ' + code) -} -var connId = particleAbility.connectAbility( - { - bundleName: "com.ix.ServiceAbility", - abilityName: "com.ix.ServiceAbility.ServiceAbilityA", - }, - { - onConnect: onConnectCallback, - onDisconnect: onDisconnectCallback, - onFailed: onFailedCallback, - }, -); -``` - -## particleAbility.disconnectAbility - -disconnectAbility(connection: number, callback:AsyncCallback\): void - -Disconnects this ability from a specific Service ability. This method uses a callback to return the result. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ---------- | ------------- | ---- | ------------------------------ | -| connection | number | Yes| ID of the Service ability to disconnect.| -| callback | AsyncCallback\ | Yes| Callback used to return the result.| - -**Example** - -```javascript -import particleAbility from '@ohos.ability.particleAbility' -function onConnectCallback(element, remote){ - console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); -} -function onDisconnectCallback(element){ - console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) -} -function onFailedCallback(code){ - console.log('particleAbilityTest ConnectAbility onFailed errCode : ' + code) -} -var connId = particleAbility.connectAbility( - { - bundleName: "com.ix.ServiceAbility", - abilityName: "com.ix.ServiceAbility.ServiceAbilityA", - }, - { - onConnect: onConnectCallback, - onDisconnect: onDisconnectCallback, - onFailed: onFailedCallback, - }, -); -var result = particleAbility.disconnectAbility(connId, - (error,data) => { - console.log('particleAbilityTest DisConnectAbility result errCode : ' + error.code + " data: " + data) - }, -); -``` - -## particleAbility.disconnectAbility - -disconnectAbility(connection: number): Promise\ - -Disconnects this ability from a specific Service ability. This method uses a promise to return the result. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ---------- | ------ | ---- | ------------------------------ | -| connection | number | Yes| ID of the Service ability to disconnect.| - -**Return value** -| Type| Description| -| -------------- | ------------------------- | -| Promise\ | Promise used to return the result.| - -**Example** - -```javascript -import particleAbility from '@ohos.ability.particleAbility' -function onConnectCallback(element, remote){ - console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); -} -function onDisconnectCallback(element){ - console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) -} -function onFailedCallback(code){ - console.log('particleAbilityTest ConnectAbility onFailed errCode : ' + code) -} -var connId = particleAbility.connectAbility( - { - bundleName: "com.ix.ServiceAbility", - abilityName: "com.ix.ServiceAbility.ServiceAbilityA", - }, - { - onConnect: onConnectCallback, - onDisconnect: onDisconnectCallback, - onFailed: onFailedCallback, - }, -); -var result = particleAbility.disconnectAbility(connId).then((void) => { - console.info("particleAbilityTest disconnectAbility"); -}); -``` - ## StartAbilityParameter | Name| Readable/Writable| Type| Mandatory| Description| @@ -371,3 +231,170 @@ Defines the window display modes of a Page ability, for example, **featureAbilit | WINDOW_MODE_SPLIT_PRIMARY | 100 | The Page ability is displayed in the primary window when it is in split-screen mode.| | WINDOW_MODE_SPLIT_SECONDARY | 101 | The Page ability is displayed in the secondary window when it is in split-screen mode.| | WINDOW_MODE_FLOATING | 102 | The Page ability is displayed in floating window mode.| + + +## particleAbility.startBackgroundRunning + +startBackgroundRunning(id: number, request: NotificationRequest, callback: AsyncCallback<void>): void; + +Requests a continuous task from the system. This method uses an asynchronous callback to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) + +- **Parameters** + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | id | number | Yes| Notification ID of a continuous task.| + | request | NotificationRequest | Yes| Notification parameter, which is used to display information in the notification bar.| + | callback | AsyncCallback<void> | Yes| Callback used to return the execution result.| + +- **Example** +```js +import notification from '@ohos.notification'; +import particleAbility from '@ohos.ability.particleAbility'; +import wantAgent from '@ohos.wantAgent'; + +function callback(err, data) { + if (err) { + console.error("Operation failed Cause: " + err); + } else { + console.info("Operation succeeded"); + } +} + +let wantAgentInfo = { + wants: [ + { + bundleName: "com.example.myapplication", + abilityName: "com.example.myapplication.MainAbility" + } + ], + operationType: wantAgent.OperationType.START_ABILITY, + requestCode: 0, + wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESET_FLAG] +}; + +wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { + let basicContent = { + title: "title", + text: "text" + }; + let notificationContent = { + contentType: notification.ContentType.NOTIFICATION_CONTENT_TEXT, + normal: basicContent + }; + let request = { + content: notificatonContent, + wantAgent: wantAgentObj + }; + let id = 1; + particleAbility.startBackgroundRunning(id, request, callback); +}); + +``` + +## particleAbility.startBackgroundRunning + +startBackgroundRunning(id: number, request: NotificationRequest): Promise<void> + +Requests a continuous task from the system. This method uses a promise to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) + +**Parameters** +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| id | number | Yes| Notification ID of a continuous task.| +| request | NotificationRequest | Yes| Notification parameter, which is used to display information in the notification bar.| + +**Return value** +| Type| Description| +| -------------- | ------------------------- | +| Promise\ | Promise used to return the result.| + +- **Example** +```js +import notification from '@ohos.notification'; +import particleAbility from '@ohos.ability.particleAbility'; +import wantAgent from '@ohos.wantAgent'; + +let wantAgentInfo = { + wants: [ + { + bundleName: "com.example.myapplication", + abilityName: "com.example.myapplication.MainAbility" + } + ], + operationType: wantAgent.OperationType.START_ABILITY, + requestCode: 0, + wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESET_FLAG] +}; + +wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { + let basicContent = { + title: "title", + text: "text" + }; + let notificationContent = { + contentType: notification.ContentType.NOTIFICATION_CONTENT_TEXT, + normal: basicContent + }; + let request = { + content: notificatonContent, + wantAgent: wantAgentObj + }; + let id = 1; + particleAbility.startBackgroundRunning(id, request).then(() => { + console.info("Operation succeeded"); + }).catch((err) => { + console.error("Operation failed Cause: " + err); + }); +}); + +``` + +## particleAbility.cancelBackgroundRunning + +cancelBackgroundRunning(callback: AsyncCallback<void>): void; + +Requests to cancel a continuous task from the system. This method uses an asynchronous callback to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) + +- **Parameters** + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<void> | Yes| Callback used to return the execution result.| + +- **Example** +```js +import particleAbility from '@ohos.ability.particleAbility'; + +function callback(err, data) { + if (err) { + console.error("Operation failed Cause: " + err); + } else { + console.info("Operation succeeded"); + } +} + +particleAbility.cancelBackgroundRunning(callback); + +``` + +## particleAbility.cancelBackgroundRunning + +cancelBackgroundRunning(): Promise<void>; + +Requests to cancel a continuous task from the system. This method uses a promise to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) + +**Return value** +| Type| Description| +| -------------- | ------------------------- | +| Promise\ | Promise used to return the result.| + +- **Example** +```js +import particleAbility from '@ohos.ability.particleAbility'; + +particleAbility.cancelBackgroundRunning().then(() => { + console.info("Operation succeeded"); +}).catch((err) => { + console.error("Operation failed Cause: " + err); +}); + +``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md index c26248bb238..7eb8db1ada1 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md +++ b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md @@ -48,6 +48,8 @@ DAHelper.openFile( openFile(uri: string, mode: string): Promise\ +在指定的远程路径中打开文件(promise形式)。 + **系统能力:** SystemCapability.Ability.AbilityRuntime.FAModel @@ -306,7 +308,7 @@ SystemCapability.Ability.AbilityRuntime.FAModel | 名称 | 类型 | 必填 | 描述 | | -------- | ---------------------- | ---- | ------------------------------------------------------------ | | uri | string | 是 | 指示要规范化的uri对象。 | -| callback | AsyncCallback\ | 是 | 回调方法。如果数据功能支持uri规范化或null,则返回规范化uri对象。 | +| callback | AsyncCallback\ | 是 | 回调方法。如果数据功能支持uri规范化,则返回规范化uri对象;否则返回null。 | **示例:** @@ -341,7 +343,7 @@ SystemCapability.Ability.AbilityRuntime.FAModel **返回值:** | 类型 | 说明 | | ---------------- | ------------------------------------------------------ | -| Promise\ | 如果数据功能支持uri规范化或null,则返回规范化uri对象。 | +| Promise\ | 如果数据功能支持uri规范化,则返回规范化uri对象;否则返回null。 | **示例:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md b/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md index 9f12115ff00..fd6d47391da 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md @@ -16,10 +16,6 @@ startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\: v 使用此方法启动指定的particleAbility(callback形式)。 -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - **参数:** @@ -57,17 +53,9 @@ particleAbility.startAbility( ## particleAbility.startAbility -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - startAbility(parameter: StartAbilityParameter): Promise\ 使用此方法启动指定的particleAbility(Promise形式)。 -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - **参数:** @@ -111,10 +99,6 @@ terminateSelf(callback: AsyncCallback\): void 终止particleAbility(callback形式)。 -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -140,10 +124,6 @@ terminateSelf(): Promise\ 终止particleAbility(Promise形式)。 -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - **返回值:** | 类型 | 说明 | | -------------- | ------------------------- | @@ -166,10 +146,6 @@ acquireDataAbilityHelper(uri: string): DataAbilityHelper 获取dataAbilityHelper。 -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -194,43 +170,43 @@ particleAbility.acquireDataAbilityHelper(uri) | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------------- | -------- | --------------------- | ---- | ------------------------------------------------------------ | -| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | -| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。 | +| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。 | ## Want | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。
系统能力:SystemCapability.Ability.AbilityBase | -| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | -| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | -| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。
系统能力:SystemCapability.Ability.AbilityBase | -| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。
系统能力:SystemCapability.Ability.AbilityBase | -| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。
系统能力:SystemCapability.Ability.AbilityBase | -| action | 只读 | string | 否 | 表示action选项描述。
系统能力:SystemCapability.Ability.AbilityBase | -| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。
系统能力:SystemCapability.Ability.AbilityBase | -| entities | 只读 | Array\ | 否 | 表示entities相关描述。
系统能力:SystemCapability.Ability.AbilityBase | +| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。 | +| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | +| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | +| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。 | +| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。 | +| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。 | +| action | 只读 | string | 否 | 表示action选项描述。 | +| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。 | +| entities | 只读 | Array\ | 否 | 表示entities相关描述。 | ## flags说明 | 名称 | 参数 | 描述 | | ------------------------------------ | ---------- | ------------------------------------------------------------ | -| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Want}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。
系统能力:SystemCapability.Ability.AbilityBase | -| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | +| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | +| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力 | +| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | +| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS | +| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | +| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | +| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限 | +| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | +| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | +| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。 | +| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | +| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。 | +| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给**ohos.app.Context#startAbility**的**Want**设置此标志,并且必须与**flag_ABILITY_NEW_MISSION**一起使用 | +| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | +| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | ## AbilityStartSetting @@ -240,9 +216,9 @@ abilityStartSetting属性是一个定义为[key: string]: any的对象,key对 | 名称 | 参数 | 描述 | | --------------- | --------------- | -------------------------- | -| BOUNDS_KEY | "abilityBounds" | 窗口显示大小属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | -| WINDOW_MODE_KEY | "windowMode" | 窗口显示模式属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | -| DISPLAY_ID_KEY | "displayId" | 窗口显示设备ID属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| BOUNDS_KEY | "abilityBounds" | 窗口显示大小属性的名称。 | +| WINDOW_MODE_KEY | "windowMode" | 窗口显示模式属性的名称。 | +| DISPLAY_ID_KEY | "displayId" | 窗口显示设备ID属性的名称。 | ## AbilityWindowConfiguration @@ -250,11 +226,11 @@ abilityStartSetting属性是一个定义为[key: string]: any的对象,key对 | 名称 | 参数 | 描述 | | --------------------------- | ---- | ---------- | -| WINDOW_MODE_UNDEFINED | 0 | 未定义。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | -| WINDOW_MODE_FULLSCREEN | 1 | 全屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | -| WINDOW_MODE_SPLIT_PRIMARY | 100 | 分屏主屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | -| WINDOW_MODE_SPLIT_SECONDARY | 101 | 分屏次屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | -| WINDOW_MODE_FLOATING | 102 | 悬浮窗。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_UNDEFINED | 0 | 未定义。 | +| WINDOW_MODE_FULLSCREEN | 1 | 全屏。 | +| WINDOW_MODE_SPLIT_PRIMARY | 100 | 分屏主屏。 | +| WINDOW_MODE_SPLIT_SECONDARY | 101 | 分屏次屏。 | +| WINDOW_MODE_FLOATING | 102 | 悬浮窗。 | ## particleAbility.startBackgroundRunning @@ -263,10 +239,6 @@ startBackgroundRunning(id: number, request: NotificationRequest, callback: Async 向系统申请长时任务,使用callback形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) -**系统能力:** - -SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask - - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -323,10 +295,6 @@ wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { startBackgroundRunning(id: number, request: NotificationRequest): Promise<void> -**系统能力:** - -SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask - 向系统申请长时任务,使用promise形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) **参数**: @@ -387,10 +355,6 @@ cancelBackgroundRunning(callback: AsyncCallback<void>): void; 向系统申请取消长时任务,使用callback形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) -**系统能力:** - -SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask - - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -418,10 +382,6 @@ cancelBackgroundRunning(): Promise<void>; 向系统申请取消长时任务,使用promise形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) -**系统能力:** - -SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask - **返回值** | 类型 | 说明 | | -------------- | ------------------------- | -- Gitee From 085fb5ba51b08e5c86f8f1e936765744f80f1468 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Fri, 4 Mar 2022 18:26:15 +0800 Subject: [PATCH 136/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-particleAbility.md | 110 ++++++++++++------ 1 file changed, 75 insertions(+), 35 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md b/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md index fd6d47391da..9f12115ff00 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-particleAbility.md @@ -16,6 +16,10 @@ startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\: v 使用此方法启动指定的particleAbility(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** @@ -53,9 +57,17 @@ particleAbility.startAbility( ## particleAbility.startAbility +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + startAbility(parameter: StartAbilityParameter): Promise\ 使用此方法启动指定的particleAbility(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** @@ -99,6 +111,10 @@ terminateSelf(callback: AsyncCallback\): void 终止particleAbility(callback形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -124,6 +140,10 @@ terminateSelf(): Promise\ 终止particleAbility(Promise形式)。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **返回值:** | 类型 | 说明 | | -------------- | ------------------------- | @@ -146,6 +166,10 @@ acquireDataAbilityHelper(uri: string): DataAbilityHelper 获取dataAbilityHelper。 +**系统能力:** + +SystemCapability.Ability.AbilityRuntime.FAModel + **参数:** | 名称 | 类型 | 必填 | 描述 | @@ -170,43 +194,43 @@ particleAbility.acquireDataAbilityHelper(uri) | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------------- | -------- | --------------------- | ---- | ------------------------------------------------------------ | -| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。 | -| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。 | +| want | 只读 | [Want](#want) | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| abilityStartSetting | 只读 | {[key: string]: any} | 否 | 表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | ## Want | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。 | -| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | -| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | -| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。 | -| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。 | -| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。 | -| action | 只读 | string | 否 | 表示action选项描述。 | -| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。 | -| entities | 只读 | Array\ | 否 | 表示entities相关描述。 | +| deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。
系统能力:SystemCapability.Ability.AbilityBase | +| bundleName | 只读 | string | 否 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | +| abilityName | 只读 | string | 否 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
系统能力:SystemCapability.Ability.AbilityBase | +| uri | 只读 | string | 否 | 表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。
系统能力:SystemCapability.Ability.AbilityBase | +| type | 只读 | string | 否 | 表示MIME type类型描述,比如:"text/plain" 、 "image/*"等。
系统能力:SystemCapability.Ability.AbilityBase | +| flags | 只读 | number | 否 | 表示处理Want的方式。默认传数字,具体参考:[flags说明](#flags说明)。
系统能力:SystemCapability.Ability.AbilityBase | +| action | 只读 | string | 否 | 表示action选项描述。
系统能力:SystemCapability.Ability.AbilityBase | +| parameters | 只读 | {[key: string]: any} | 否 | 表示WantParams描述。
系统能力:SystemCapability.Ability.AbilityBase | +| entities | 只读 | Array\ | 否 | 表示entities相关描述。
系统能力:SystemCapability.Ability.AbilityBase | ## flags说明 | 名称 | 参数 | 描述 | | ------------------------------------ | ---------- | ------------------------------------------------------------ | -| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | -| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | -| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力 | -| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | -| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS | -| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | -| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | -| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限 | -| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | -| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | -| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。 | -| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | -| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。 | -| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给**ohos.app.Context#startAbility**的**Want**设置此标志,并且必须与**flag_ABILITY_NEW_MISSION**一起使用 | -| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | -| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | +| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给元能力
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否属于OHOS
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 按照前缀匹配的方式验证URI权限
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示迁移是可拉回的。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,使用后台模式安装该功能。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Want}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。
系统能力:SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。
系统能力:SystemCapability.Ability.AbilityBase | ## AbilityStartSetting @@ -216,9 +240,9 @@ abilityStartSetting属性是一个定义为[key: string]: any的对象,key对 | 名称 | 参数 | 描述 | | --------------- | --------------- | -------------------------- | -| BOUNDS_KEY | "abilityBounds" | 窗口显示大小属性的名称。 | -| WINDOW_MODE_KEY | "windowMode" | 窗口显示模式属性的名称。 | -| DISPLAY_ID_KEY | "displayId" | 窗口显示设备ID属性的名称。 | +| BOUNDS_KEY | "abilityBounds" | 窗口显示大小属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_KEY | "windowMode" | 窗口显示模式属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| DISPLAY_ID_KEY | "displayId" | 窗口显示设备ID属性的名称。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | ## AbilityWindowConfiguration @@ -226,11 +250,11 @@ abilityStartSetting属性是一个定义为[key: string]: any的对象,key对 | 名称 | 参数 | 描述 | | --------------------------- | ---- | ---------- | -| WINDOW_MODE_UNDEFINED | 0 | 未定义。 | -| WINDOW_MODE_FULLSCREEN | 1 | 全屏。 | -| WINDOW_MODE_SPLIT_PRIMARY | 100 | 分屏主屏。 | -| WINDOW_MODE_SPLIT_SECONDARY | 101 | 分屏次屏。 | -| WINDOW_MODE_FLOATING | 102 | 悬浮窗。 | +| WINDOW_MODE_UNDEFINED | 0 | 未定义。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_FULLSCREEN | 1 | 全屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_SPLIT_PRIMARY | 100 | 分屏主屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_SPLIT_SECONDARY | 101 | 分屏次屏。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_FLOATING | 102 | 悬浮窗。
系统能力:SystemCapability.Ability.AbilityRuntime.FAModel | ## particleAbility.startBackgroundRunning @@ -239,6 +263,10 @@ startBackgroundRunning(id: number, request: NotificationRequest, callback: Async 向系统申请长时任务,使用callback形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -295,6 +323,10 @@ wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { startBackgroundRunning(id: number, request: NotificationRequest): Promise<void> +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + 向系统申请长时任务,使用promise形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) **参数**: @@ -355,6 +387,10 @@ cancelBackgroundRunning(callback: AsyncCallback<void>): void; 向系统申请取消长时任务,使用callback形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -382,6 +418,10 @@ cancelBackgroundRunning(): Promise<void>; 向系统申请取消长时任务,使用promise形式返回结果。(此接口为api7接口,后续会被废弃,请使用新的api8接口) +**系统能力:** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + **返回值** | 类型 | 说明 | | -------------- | ------------------------- | -- Gitee From 42deec4676b06eb3d45e2151b7303cdd0ec17155 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Fri, 4 Mar 2022 18:52:16 +0800 Subject: [PATCH 137/282] update doc Signed-off-by: ester.zhou --- .../reference/apis/js-apis-commonEvent.md | 81 ++++++++++++++++++- 1 file changed, 77 insertions(+), 4 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-commonEvent.md b/en/application-dev/reference/apis/js-apis-commonEvent.md index 31ee5df26f9..655c8682e35 100644 --- a/en/application-dev/reference/apis/js-apis-commonEvent.md +++ b/en/application-dev/reference/apis/js-apis-commonEvent.md @@ -113,7 +113,7 @@ ## Modules to Import ```js -import CommonEvent from '@ohos.commonevent'; +import CommonEvent from '@ohos.commonEvent'; ``` ## System Capabilities @@ -183,6 +183,79 @@ CommonEvent.publish("publish_event", options, PublishCallBack); +## CommonEvent.publishAsUser + +publishAsUser(event: string, userId: number, callback: AsyncCallback\): void + +Publishes a common event to a specific user. This method uses a callback to return the result. + +**Parameters** + +| Name| Readable/Writable| Type| Mandatory| Description| +| -------- | -------- | -------------------- | ---- | ---------------------------------- | +| event | Read-only| string | Yes| Name of the common event to publish.| +| userId | Read-only| number | Yes| User ID.| +| callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| + +**Example** + +```js +// Callback for common event publication +function PublishAsUserCallBack(err) { + if (err.code) { + console.info("publishAsUser failed " + JSON.stringify(err)); + } else { + console.info("publishAsUser"); + } +} +// Specify the user to whom the common event will be published. +var userId = 100; +// Publish a common event. +CommonEvent.publish("publish_event", userId, PublishAsUserCallBack); +``` + + + +## CommonEvent.publishAsUser + +publishAsUser(event: string, userId: number, options: CommonEventPublishData, callback: AsyncCallback\): void + +Publishes a common event with given attributes to a specific user. This method uses a callback to return the result. + +**Parameters** + +| Name| Readable/Writable| Type| Mandatory| Description| +| -------- | -------- | ---------------------- | ---- | ---------------------- | +| event | Read-only| string | Yes| Name of the common event to publish.| +| userId | Read-only| number | Yes| User ID.| +| options | Read-only| [CommonEventPublishData](#commoneventpublishdata) | Yes| Attributes of the common event to publish.| +| callback | Read-only| AsyncCallback\ | Yes| Callback used to return the result.| + +**Example** + + +```js +// Attributes of a common event. +var options = { + code: 0; // Result code of the common event + data: "initial data";// Result data of the common event +} +// Callback for common event publication +function PublishAsUserCallBack(err) { + if (err.code) { + console.info("publishAsUser failed " + JSON.stringify(err)); + } else { + console.info("publishAsUser"); + } +} +// Specify the user to whom the common event will be published. +var userId = 100; +// Publish a common event. +CommonEvent.publish("publish_event", userId, options, PublishAsUserCallBack); +``` + + + ## CommonEvent.createSubscriber createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback\): void @@ -491,7 +564,7 @@ Sets the result code for this common event. This method uses a promise to return | Name| Type| Mandatory| Description| | ------ | ------ | ---- | ------------------ | -| code | number | Yes| Result code of the common event.| +| code | number | Yes| Callback used to return the result code.| **Example** @@ -584,7 +657,7 @@ Sets the result data for this common event. This method uses a promise to return | Name| Type| Mandatory| Description| | ------ | ------ | ---- | -------------------- | -| data | string | Yes| Result data of the common event.| +| data | string | Yes| Callback used to return the result data.| **Example** @@ -632,7 +705,7 @@ Sets the result code and result data for this common event. This method uses a p | Name| Type| Mandatory| Description| | ------ | ------ | ---- | -------------------- | | code | number | Yes| Result code of the common event.| -| data | string | Yes| Result data of the common event.| +| data | string | Yes| Callback used to return the result data.| **Example** -- Gitee From 9cc85592e9584c7caad026b6de605e4c50e3d013 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Fri, 4 Mar 2022 18:58:41 +0800 Subject: [PATCH 138/282] update doc Signed-off-by: ester.zhou --- .../reference/arkui-js/js-components-container-div.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/en/application-dev/reference/arkui-js/js-components-container-div.md b/en/application-dev/reference/arkui-js/js-components-container-div.md index d898cc4f90e..75dce6325ed 100644 --- a/en/application-dev/reference/arkui-js/js-components-container-div.md +++ b/en/application-dev/reference/arkui-js/js-components-container-div.md @@ -290,7 +290,7 @@ In addition to the methods in [Universal Methods](js-components-common-methods.

ScrollOffset

Obtains the scrolling offset of the element content.

-
NOTE:
  • To use this method, overflow must be set to scroll.
+
NOTE:
  • To use this method, overflow must be set to scroll. By default, the scrolling direction is the same as the container layout direction.
@@ -308,6 +308,7 @@ In addition to the methods in [Universal Methods](js-components-common-methods. + **Table 1** ScrollOffset6+ -- Gitee From 4f878edadbdc8c07a587ebce4be4e7704fafac2d Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Sat, 5 Mar 2022 15:12:19 +0800 Subject: [PATCH 139/282] update docs Signed-off-by: annie_wangli --- .../reference/apis/js-apis-data-ability.md | 9 +- .../reference/apis/js-apis-data-rdb.md | 3 +- .../reference/apis/js-apis-data-resultset.md | 6 +- .../reference/apis/js-apis-data-storage.md | 15 +- .../apis/js-apis-distributed-data.md | 5840 +++++++++++++---- 5 files changed, 4629 insertions(+), 1244 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-data-ability.md b/en/application-dev/reference/apis/js-apis-data-ability.md index f91f7a53f00..4045752d3f6 100644 --- a/en/application-dev/reference/apis/js-apis-data-ability.md +++ b/en/application-dev/reference/apis/js-apis-data-ability.md @@ -1,6 +1,7 @@ # DataAbilityPredicates ->![](../../public_sys-resources/icon-note.gif) **NOTE:** +>![](../../public_sys-resources/icon-note.gif) **NOTE** +> >The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import @@ -9,11 +10,8 @@ import dataAbility from '@ohos.data.dataAbility' ``` ## System Capabilities -SystemCapability.DistributedDataManager.DataShare.Consumer +SystemCapability.DistributedDataManager.DataShare.Core -## Required Permissions - -None ## dataAbility.createRdbPredicates @@ -1697,4 +1695,3 @@ Sets the **DataAbilityPredicates** to match the field with data type **Array< predicates.notIn("NAME", ["Lisa", "Rose"]) ``` - diff --git a/en/application-dev/reference/apis/js-apis-data-rdb.md b/en/application-dev/reference/apis/js-apis-data-rdb.md index e3fc6ff3f95..6d92a418fad 100644 --- a/en/application-dev/reference/apis/js-apis-data-rdb.md +++ b/en/application-dev/reference/apis/js-apis-data-rdb.md @@ -1,6 +1,7 @@ # Relational Database -> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> > The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. diff --git a/en/application-dev/reference/apis/js-apis-data-resultset.md b/en/application-dev/reference/apis/js-apis-data-resultset.md index 4a13518debf..654cff58ad2 100644 --- a/en/application-dev/reference/apis/js-apis-data-resultset.md +++ b/en/application-dev/reference/apis/js-apis-data-resultset.md @@ -1,6 +1,7 @@ # Result Set ->![](../../public_sys-resources/icon-note.gif) **NOTE:** +>![](../../public_sys-resources/icon-note.gif) **NOTE** +> >The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## System Capabilities @@ -20,9 +21,6 @@ promise.then((resultSet) => { console.log("resultSet columnCount:" + resultSet.columnCount); ``` -## Required Permissions - -None ## ResultSet diff --git a/en/application-dev/reference/apis/js-apis-data-storage.md b/en/application-dev/reference/apis/js-apis-data-storage.md index f58bf8d3732..b8dd0be285a 100644 --- a/en/application-dev/reference/apis/js-apis-data-storage.md +++ b/en/application-dev/reference/apis/js-apis-data-storage.md @@ -2,7 +2,8 @@ Lightweight storage provides applications with data processing capability and allows applications to perform lightweight data storage and query. Data is stored in key-value pairs. Keys are of the string type, and values can be of the numeric, string, or Boolean type. ->![](../../public_sys-resources/icon-note.gif) **NOTE:** +>![](../../public_sys-resources/icon-note.gif) **NOTE** +> >The initial APIs of this module are supported since API version 6. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import @@ -12,11 +13,8 @@ import dataStorage from '@ohos.data.storage' ``` ## System Capabilities -SystemCapability.DistributedDataManager.Preference.Core +SystemCapability.DistributedDataManager.Preferences.Core -## Required Permissions - -None ## Attributes @@ -119,7 +117,7 @@ Reads a specified file and loads the data to the **Storage** instance for data storage.putSync('startup', 'auto') storage.flushSync() })() - ``` + ``` ## dataStorage.getStorage @@ -180,7 +178,7 @@ Reads a specified file and loads the data to the **Storage** instance for data storage.flushSync() }) })() - ``` + ``` ## dataStorage.getStorage @@ -248,7 +246,7 @@ Reads a specified file and loads the data to the **Storage** instance for data console.info("Get the storage failed, path: " + path + '/mystore') }) }() - ``` + ``` ## dataStorage.deleteStorageSync @@ -1614,4 +1612,3 @@ Unsubscribes from data changes. - diff --git a/en/application-dev/reference/apis/js-apis-distributed-data.md b/en/application-dev/reference/apis/js-apis-distributed-data.md index 30de34fd1d6..5cedea5c5ab 100644 --- a/en/application-dev/reference/apis/js-apis-distributed-data.md +++ b/en/application-dev/reference/apis/js-apis-distributed-data.md @@ -1,9 +1,11 @@ -# Distributed Data Management +# Distributed Data Management ->![](../../public_sys-resources/icon-note.gif) **NOTE:** +>![](../../public_sys-resources/icon-note.gif) **NOTE** +> >The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## Modules to Import + +## Modules to Import ``` import distributedData from '@ohos.data.distributedData'; @@ -12,45 +14,21 @@ import distributedData from '@ohos.data.distributedData'; SystemCapability.DistributedDataManager.KVStore.DistributedKVStore -## distributedData.createKVManager -createKVManager\(config: KVManagerConfig, callback: AsyncCallback\): void -Creates a **KVManager** object to manage key-value \(KV\) stores. This method uses an asynchronous callback to return the result. +## distributedData.createKVManager -- Parameters +createKVManager(config: KVManagerConfig, callback: AsyncCallback<KVManager>): void + +Creates a **KVManager** object to manage key-value (KV) stores. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ------ | ------ | +| config | [KVManagerConfig](#kvmanagerconfig) | Yes| Configuration of the **KVManager** object, including the bundle name and user information of the caller.| +| callback | AsyncCallback<[KVManager](#kvmanager)> | Yes| Callback invoked to return the **KVManager** object created.| - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

config

-

KVManagerConfig

-

Yes

-

Configuration of the KVManager object, including the bundle name and user information of the caller.

-

callback

-

AsyncCallback<KVManager>

-

Yes

-

Callback invoked to return the KVManager object created.

-
- Example @@ -61,7 +39,7 @@ Creates a **KVManager** object to manage key-value \(KV\) stores. This method bundleName : 'com.example.datamanagertest', userInfo : { userId : '0', - userType : 0 + userType : distributedData.UserType.SAME_USER_ID } } distributedData.createKVManager(kvManagerConfig, function (err, manager) { @@ -77,54 +55,23 @@ Creates a **KVManager** object to manage key-value \(KV\) stores. This method } ``` +## distributedData.createKVManager -## distributedData.createKVManager - -createKVManager\(config: KVManagerConfig\): Promise +createKVManager(config: KVManagerConfig): Promise<KVManager> -Creates a **KVManager** object to manage KV stores. This method uses a promise to return the result. +Creates a **KVManager** object to manage KV stores. This method uses a promise to return the result. - Parameters - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

config

-

KVManagerConfig

-

Yes

-

Configuration of the KVManager object, including the bundle name and user information of the caller.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ------ | ------ | +| config |[KVManagerConfig](#kvmanager) | Yes| Configuration of the **KVManager** object, including the bundle name and user information of the caller.| -- Return values +- Return value - - - - - - - - - -

Type

-

Description

-

Promise<KVManager>

-

Promise used to return the KVManager object created.

-
+| Type| Description| +| -------- | -------- | +| Promise<[KVManager](#kvmanager)> | Promise used to return the **KVManager** object created.| - Example @@ -135,7 +82,7 @@ Creates a **KVManager** object to manage KV stores. This method uses a promise bundleName : 'com.example.datamanagertest', userInfo : { userId : '0', - userType : 0 + userType : distributedData.UserType.SAME_USER_ID } } distributedData.createKVManager(kvManagerConfig).then((manager) => { @@ -150,167 +97,67 @@ Creates a **KVManager** object to manage KV stores. This method uses a promise ``` -## KVManagerConfig - -Provides configuration of the **KVManager** object, including the bundle name and user information of the caller. - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

userInfo

-

UserInfo

-

Yes

-

User information.

-

bundleName

-

string

-

Yes

-

Bundle name.

-
- -## UserInfo +## KVManagerConfig + +Provides configuration of the **KVManager** object, including the bundle name and user information of the caller. + +| Name| Type| Mandatory| Description| +| ----- | ------ | ------ | ------ | +| userInfo | [UserInfo](#userinfo) | Yes| User information.| +| bundleName | string | Yes| Bundle name.| + + + +## UserInfo Defines user information. - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

userId

-

string

-

Yes

-

User ID.

-

userType

-

UserType

-

Yes

-

User type.

-
- -## UserType +| Name| Type| Mandatory| Description| +| ----- | ------ | ------ | ------ | +| userId | string | Yes| User ID.| +| userType | [UserType](#usertype) | Yes| User type.| + + +## UserType Defines the user type. - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

SAME_USER_ID

-

0

-

User who logs in to different devices using the same account.

-
- -## KVManager - -Creates a **KVManager** object to obtain KV store information. Before calling any method in **KVManager**, you must use **createKVManager** to create a **KVManager** object. - -### getKVStore - -getKVStore\(storeId: string, options: Options, callback: AsyncCallback\): void +| Name| Default Value| Description| +| ----- | ------ | ------ | +| SAME\_USER_ID| 0 | User who logs in to different devices using the same account.| + + +## KVManager + +Creates a **KVManager** object to obtain KV store information. Before calling any method in **KVManager**, you must use **createKVManager** to create a **KVManager** object. + +### getKVStore + +getKVStore(storeId: string, options: Options, callback: AsyncCallback<T>): void Creates and obtains a KV store. This method uses an asynchronous callback to return the result. -- Parameters +- Parameters - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

storeId

-

string

-

Yes

-

Unique identifier of the KV store. The length cannot exceed MAX_STORE_ID_LENGTH.

-

options

-

Options

-

Yes

-

Configuration of the KV store.

-

callback

-

AsyncCallback<T>,

-

<T extends KVStore>

-

Yes

-

Callback invoked to return the KV store created.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ------ | ------ | +| storeId | string | Yes| Unique identifier of the KV store. The length cannot exceed [MAX\_STORE\_ID\_LENGTH](#constants).| +| options | [Options](#options) | Yes| Configuration of the KV store.| +| callback | AsyncCallback<T>, <T extends KVStore>| Yes| Callback invoked to return the KV store created.| - Example ``` let kvStore; + let kvManager; try { const options = { createIfMissing : true, encrypt : false, backup : false, autoSync : true, - kvStoreType : 1, - securityLevel : 3, + kvStoreType : distributedData.KVStoreType.SINGLE_VERSION, + securityLevel : distributedData.SecurityLevel.S2, }; kvManager.getKVStore('storeId', options, function (err, store) { if (err) { @@ -326,1164 +173,4709 @@ Creates and obtains a KV store. This method uses an asynchronous callback to ret ``` -### getKVStore +### getKVStore -getKVStore\(storeId: string, options: Options\): Promise +getKVStore<T extends KVStore>(storeId: string, options: Options): Promise<T> Creates and obtains a KV store. This method uses a promise to return the result. -- Parameters +- Parameters + +| Name| Type| Mandatory| Description| +| ------- | ---------------------- | ---- | -------------------- | +| storeId | string | Yes| Unique identifier of the KV store. The length cannot exceed [MAX\_STORE\_ID\_LENGTH](#constants).| +| options | [Options](#options) | Yes| Configuration of the KV store.| + + +- Return value + +| Type| Description| +| -------------------------------------- | ------------------------ | +| Promise<T> <T extends KVStore> | Promise used to return the KV store created.| + + +- Example + + ``` + let kvStore; + let kvManager; + try { + const options = { + createIfMissing : true, + encrypt : false, + backup : false, + autoSync : true, + kvStoreType : distributedData.KVStoreType.SINGLE_VERSION, + securityLevel : distributedData.SecurityLevel.S2, + }; + kvManager.getKVStore('storeId', options).then((store) => { + console.log("getKVStore success"); + kvStore = store; + }).catch((err) => { + console.log("getKVStore err: " + JSON.stringify(err)); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + +### closeKVStore8+ ### + +closeKVStore(appId: string, storeId: string, kvStore: KVStore, callback: AsyncCallback<void>): void; + +Closes a KV store. This method uses an asynchronous callback to return the result. + +- Parameters + + +| Name| Type| Mandatory| Description| +| ------- | ----------------- | ---- | --------------------------- | +| appId | string | Yes| Bundle name of the app used by the KV store.| +| storeId | string | Yes| Unique identifier of the KV store to close. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| +| kvStore | [KVStore](#kvstore) | Yes| KV store to close.| +| callback | AsyncCallback<void> | Yes| Callback used to return the result. If the KV store is closed, **true** will be returned. Otherwise, **false** will be returned.| - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

storeId

-

string

-

Yes

-

Unique identifier of the KV store. The length cannot exceed MAX_STORE_ID_LENGTH.

-

options

-

Options

-

Yes

-

Configuration of the KV store.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<T>

-

<T extends KVStore>

-

Promise used to return the KV store created.

-
- Example ``` let kvStore; + let kvManager; + const options = { + createIfMissing : true, + encrypt : false, + backup : false, + autoSync : true, + kvStoreType : distributedData.KVStoreType.SINGLE_VERSION, + schema : '', + securityLevel : distributedData.SecurityLevel.S2, + } try { - const options = { - createIfMissing : true, - encrypt : false, - backup : false, - autoSync : true, - kvStoreType : 1, - securityLevel : 3, - }; - kvManager.getKVStore('storeId', options).then((store) => { - console.log("getKVStore success"); + kvManager.getKVStore('storeId', options, async function (err, store) { + console.log('getKVStore success'); kvStore = store; - }).catch((err) => { - console.log("getKVStore err: " + JSON.stringify(err)); + await kvManager.closeKVStore('appId', 'storeId', kvStore, function (err, data) { + console.log('closeKVStore success'); + }); }); } catch (e) { - console.log("An unexpected error occurred. Error:" + e); + console.log('closeKVStore e ' + e); } ``` +### closeKVStore8+ ### -## Options +closeKVStore(appId: string, storeId: string, kvStore: KVStore): Promise<void>; -Provides KV store configuration. +Closes a KV store. This method uses a promise to return the result. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

createIfMissing

-

boolean

-

No

-

Whether to create a KV store if no database file exists. By default, a KV store is created.

-

encrypt

-

boolean

-

No

-

Whether to encrypt database files. By default, database files are not encrypted.

-

backup

-

boolean

-

No

-

Whether to back up database files. By default, database files are backed up.

-

autoSync

-

boolean

-

No

-

Whether database files are automatically synchronized. By default, database files are not automatically synchronized.

-

kvStoreType

-

KVStoreType

-

No

-

Type of the KV store to create. By default, a device KV store is created. The device KV store stores data for multiple devices that collaborate with each other.

-

securityLevel

-

SecurityLevel

-

No

-

Security level of the KV store. By default, the security level is not set.

-
- -## KVStoreType +- Parameters -Defines the KV store types. +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------------- | +| appId | string | Yes| Bundle name of the app used by the KV store.| +| storeId | string | Yes| Unique identifier of the KV store to close. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| +| kvStore | [KVStore](#kvstore) | Yes| KV store to close.| - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

DEVICE_COLLABORATION

-

0

-

Device KV store.

-

SINGLE_VERSION

-

1

-

Single KV store.

-

MULTI_VERSION

-

2

-

Multi-version KV store. This type is not supported currently.

-
- -## SecurityLevel +- Return value -Defines the KV store security levels. +| Type| Description| +| ------------- | -------------- | +| Promise | Promise used to return the result. If the KV store is closed, **true** will be returned. Otherwise, **false** will be returned.| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

NO_LEVEL

-

0

-

No security level is set for the KV store.

-

S0

-

1

-

The KV store security level is public.

-

S1

-

2

-

The KV store security level is low. If data leakage occurs, minor impact will be caused on the database.

-

S2

-

3

-

The KV store security level is medium. If data leakage occurs, moderate impact will be caused on the database.

-

S3

-

5

-

The KV store security level is high. If data leakage occurs, major impact will be caused on the database.

-

S4

-

6

-

The KV store security level is critical. If data leakage occurs, severe impact will be caused on the database.

-
- -## Constants +- Example -Defines the KV store constants. + ``` + let kvManager; + let kvStore; + const options = { + createIfMissing : true, + encrypt : false, + backup : false, + autoSync : true, + kvStoreType : distributedData.KVStoreType.SINGLE_VERSION, + schema : '', + securityLevel : distributedData.SecurityLevel.S2, + } + try { + kvManager.getKVStore('storeId', options).then(async (store) => { + console.log('getKVStore success'); + kvStore = store; + await kvManager.closeKVStore('appId', 'storeId', kvStore).then(() => { + console.log('closeKVStore success'); + }).catch((err) => { + console.log('closeKVStore err ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('CloseKVStore getKVStore err ' + JSON.stringify(err)); + }); + } catch (e) { + console.log('closeKVStore e ' + e); + } + ``` + + +### deleteKVStore8+ ### + +deleteKVStore(appId: string, storeId: string, callback: AsyncCallback<void>): void; + +Deletes a KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| appId | string | Yes| Bundle name of the app used by the KV store.| +| storeId | string | Yes| Unique identifier of the KV store to delete. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| +| callback | AsyncCallback<void> | Yes| Callback used to return the result. If the KV store is deleted, **true** will be returned. Otherwise, **false** will be returned.| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

MAX_KEY_LENGTH

-

1024

-

Maximum length (in bytes) of a key in the KV store.

-

MAX_VALUE_LENGTH

-

4194303

-

Maximum length (in bytes) of a value in the KV store.

-

MAX_KEY_LENGTH_DEVICE

-

896

-

Maximum length of the device coordinate key.

-

MAX_STORE_ID_LENGTH

-

128

-

Maximum length (in bytes) of the KV store ID.

-

MAX_QUERY_LENGTH

-

512000

-

Maximum query length.

-

MAX_BATCH_SIZE

-

128

-

Maximum size of a batch operation.

-
- -## KVStore - -Provides methods to manage data in a KV store, for example, adding or deleting data and subscribing to data changes or completion of data synchronization. Before calling any method in **KVStore**, you must use **getKVStore** to create a **KVStore** object. - -### put - -put\(key: string, value: Uint8Array | string | number | boolean, callback: AsyncCallback\): void - -Adds a key-value pair of the specified type to the KV store. This method uses an asynchronous callback to return the result. - -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the key-value pair to add. It cannot be empty, and the length cannot exceed MAX_KEY_LENGTH.

-

value

-

Uint8Array | string | number | boolean

-

Yes

-

Value of the key-value pair to add. The value type can be Uint8Array, number, string, or boolean.

-

A value of the Uint8Array or string type cannot exceed MAX_VALUE_LENGTH.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback invoked to return the result.

-
- Example ``` - const KEY_TEST_STRING_ELEMENT = 'key_test_string'; - const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + let kvManager; + let kvStore; + const options = { + createIfMissing : true, + encrypt : false, + backup : false, + autoSync : true, + kvStoreType : distributedData.KVStoreType.SINGLE_VERSION, + schema : '', + securityLevel : distributedData.SecurityLevel.S2, + } try { - kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { - if (err != undefined) { - console.log("put err: " + JSON.stringify(err)); - return; - } - console.log("put success"); + kvManager.getKVStore('store', options, async function (err, store) { + console.log('getKVStore success'); + kvStore = store; + await kvManager.deleteKVStore('appId', 'storeId', function (err, data) { + console.log('deleteKVStore success'); + }); }); - }catch (e) { - console.log("An unexpected error occurred. Error:" + e); + } catch (e) { + console.log('DeleteKVStore e ' + e); } ``` +### deleteKVStore8+ ### -### put - -put\(key: string, value: Uint8Array | string | number | boolean\): Promise +deleteKVStore(appId: string, storeId: string): Promise<void>; -Adds a key-value pair of the specified type to the KV store. This method uses a promise to return the result. +Deletes a KV store. This method uses a promise to return the result. - Parameters - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the key-value pair to add. It cannot be empty, and the length cannot exceed MAX_KEY_LENGTH.

-

value

-

Uint8Array | string | number | boolean

-

Yes

-

Value of the key-value pair to add. The value type can be Uint8Array, number, string, or boolean.

-

A value of the Uint8Array or string type cannot exceed MAX_VALUE_LENGTH.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| appId | string | Yes| Bundle name of the app used by the KV store.| +| storeId | string | Yes| Unique identifier of the KV store to delete. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| -- Return values - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
+- Return value +| Type| Description| +| ------------- | -------------- | +| Promise<void> | Promise used to return the result. If the KV store is deleted, **true** will be returned. Otherwise, **false** will be returned.| - Example ``` - const KEY_TEST_STRING_ELEMENT = 'key_test_string'; - const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + let kvManager; + let kvStore; + const options = { + createIfMissing : true, + encrypt : false, + backup : false, + autoSync : true, + kvStoreType : distributedData.KVStoreType.SINGLE_VERSION, + schema : '', + securityLevel : distributedData.SecurityLevel.S2, + } try { - kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { - console.log("put success: " + JSON.stringify(data)); + kvManager.getKVStore('storId', options).then(async (store) => { + console.log('getKVStore success'); + kvStore = store; + await kvManager.deleteKVStore('appId', 'storeId').then(() => { + console.log('deleteKVStore success'); + }).catch((err) => { + console.log('deleteKVStore err ' + JSON.stringify(err)); + }); }).catch((err) => { - console.log("put err: " + JSON.stringify(err)); + console.log('getKVStore err ' + JSON.stringify(err)); }); - }catch (e) { - console.log("An unexpected error occurred. Error:" + e); + } catch (e) { + console.log('deleteKVStore e ' + e); } ``` -### delete +### getAllKVStoreId8+ ### -delete\(key: string, callback: AsyncCallback\): void +getAllKVStoreId(appId: string, callback: AsyncCallback<string[]>): void; -Deletes a KV pair from the KV store. This method uses an asynchronous callback to return the result. +Obtains the IDs of all the KV stores that are created using **getKvStore** and have not been deleted using **deleteKvStore**. This method uses an asynchronous callback to return the result. - Parameters - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the KV pair to delete. It cannot be empty, and the length cannot exceed MAX_KEY_LENGTH.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback invoked to return the result.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| appId | string | Yes| Bundle name of the app used by the KV store.| +| callback | AsyncCallback<void> | Yes|Callback used to return the KV store IDs obtained. | - Example ``` - const KEY_TEST_STRING_ELEMENT = 'key_test_string'; - const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + let kvManager; try { - kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { - if (err != undefined) { - console.log("put err: " + JSON.stringify(err)); - return; - } - console.log("put success"); - kvStore.delete(KEY_TEST_STRING_ELEMENT, function (err,data) { - if (err != undefined) { - console.log("delete err: " + JSON.stringify(err)); - return; - } - console.log("delete success"); - }); + kvManager.getAllKVStoreId('appId', function (err, data) { + console.log('GetAllKVStoreId success'); + console.log('GetAllKVStoreId size = ' + data.length); }); - }catch (e) { - console.log("An unexpected error occurred. Error:" + e); + } catch (e) { + console.log('GetAllKVStoreId e ' + e); } ``` -### delete +### getAllKVStoreId8+ ### -delete\(key: string\): Promise +getAllKVStoreId(appId: string): Promise<string[]>; -Deletes a KV pair from the KV store. This method uses a promise to return the result. +Obtains the IDs of all the KV stores that are created using **getKvStore** and have not been deleted using **deleteKvStore**. This method uses a promise to return the result. - Parameters - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the KV pair to delete. It cannot be empty, and the length cannot exceed MAX_KEY_LENGTH.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| appId | string | Yes| Bundle name of the app used by the KV store.| + + +- Return value + +| Type| Description| +| ------------- | -------------- | +| Promise<string[]>| Promise used to return the KV store IDs obtained.| - Example ``` - const KEY_TEST_STRING_ELEMENT = 'key_test_string'; - const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + let kvManager; try { - kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { - console.log("put success: " + JSON.stringify(data)); - kvStore.delete(KEY_TEST_STRING_ELEMENT).then((data) => { - console.log("delete success"); - }).catch((err) => { - console.log("delete err: " + JSON.stringify(err)); - }); + console.log('GetAllKVStoreId'); + kvManager.getAllKVStoreId('apppId').then((data) => { + console.log('getAllKVStoreId success'); + console.log('size = ' + data.length); }).catch((err) => { - console.log("put err: " + JSON.stringify(err)); + console.log('getAllKVStoreId err ' + JSON.stringify(err)); }); - }catch (e) { - console.log("An unexpected error occurred. Error:" + e); + } catch(e) { + console.log('getAllKVStoreId e ' + e); } ``` -### on +### on8+ ### -on\(event: 'dataChange', type: SubscribeType, observer: Callback\): void +on(event: 'distributedDataServiceDie', deathCallback: Callback<void>): void; -Subscribes to data changes of the specified type. This method uses a synchronization callback to return the result. +Subscribes to the **distributedDataServiceDie** events. This method uses a synchronous callback to return the result. - Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

event

-

'dataChange'

-

Type of the events.

-

type

-

SubscribeType

-

Type of data changes.

-

observer

-

Callback<ChangeNotification>

-

Callback invoked to return the result.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| event | 'distributedDataServiceDie' | Yes| Type of events to subscribe to. | +| deathCallback | Callback<void> | Yes| Callback invoked when the distributed data service is dead.| + + - Example ``` - kvStore.on('dataChange', 2, function (data) { - console.log("dataChange callback call data: " + JSON.stringify(data)); - }); + let kvManager; + try { + + console.log('KVManagerOn'); + const deathCallback = function () { + console.log('death callback call'); + } + kvManager.on('distributedDataServiceDie', deathCallback); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } ``` -### on +### off8+ ### -on\(event: 'syncComplete', syncCallback: Callback\>\): void +off(event: 'distributedDataServiceDie', deathCallback?: Callback<void>): void; -Subscribes to notifications of data synchronization completion. This method uses a synchronization callback to return the result. +Unsubscribes from the **distributedDataServiceDie** events. This method uses a synchronous callback to return the result. - Parameters - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

event

-

'syncComplete'

-

Type of the events.

-

syncCallback

-

Callback<Array<[string, number]>>

-

Callback invoked to return the result.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| event | 'distributedDataServiceDie' | Yes| Type of events to unsubscribe from. | +| deathCallback | Callback<void> | No| Callback used to return the **distributedDataServiceDie** events.| + - Example ``` - kvStore.on('syncComplete', function (data) { - console.log("syncComplete callback call data: " + data); - }); + let kvManager; + try { + console.log('KVManagerOff'); + const deathCallback = function () { + console.log('death callback call'); + } + kvManager.off('distributedDataServiceDie', deathCallback); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` +## Options + +Provides KV store configuration. -## SubscribeType +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| createIfMissing | boolean | No| Whether to create a KV store if no database file exists. By default, a KV store is created.| +| encrypt | boolean | No|Whether to encrypt database files. By default, database files are not encrypted.| +| backup | boolean | No|Whether to back up database files. By default, database files are backed up. | +| autoSync | boolean | No|Whether database files are automatically synchronized. By default, database files are not automatically synchronized.| +| kvStoreType | [KVStoreType](#kvstoretype) | No|Type of the KV store to create. By default, a device KV store is created. The device KV store stores data for multiple devices that collaborate with each other.| +| securityLevel | [SecurityLevel](#securitylevel) | No|Security level of the KV store. By default, the security level is not set.| -Defines the subscription type. - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

SUBSCRIBE_TYPE_LOCAL

-

0

-

Local data changes.

-

SUBSCRIBE_TYPE_REMOTE

-

1

-

Peer data changes.

-

SUBSCRIBE_TYPE_ALL

-

2

-

Local and peer data changes.

-
- -## ChangeNotification +## KVStoreType -Defines the content of data change notifications, including inserted data, updated data, deleted data, and device ID. +Defines the KV store types. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Readable

-

Writable

-

Description

-

insertEntries

-

Entry[]

-

Yes

-

Yes

-

Data inserted.

-

updateEntries

-

Entry[]

-

Yes

-

Yes

-

Data updated.

-

deleteEntries

-

Entry[]

-

Yes

-

Yes

-

Data deleted.

-

deviceId

-

string

-

Yes

-

Yes

-

UUID of the device.

-
- -## Entry - -Defines the key-value pairs stored in the database. - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Readable

-

Writable

-

Description

-

key

-

string

-

Yes

-

Yes

-

Key of the key-value pair stored in the database.

-

value

-

Value

-

Yes

-

Yes

-

Value of the key-value pair stored in the database.

-
- -## Value - -Defines the value in a key-value pair. - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Readable

-

Writable

-

Description

-

type

-

ValueType

-

Yes

-

Yes

-

Type of the value.

-

value

-

Uint8Array | string | number | boolean

-

Yes

-

Yes

-

Specific value. A value of the Uint8Array or string type cannot exceed MAX_VALUE_LENGTH.

-
- -## ValueType - -Defines the types of the value in a key-value pair. +| Name| Default Value| Description| +| --- | ---- | ----------------------- | +| DEVICE_COLLABORATION | 0 | Device KV store.| +| SINGLE_VERSION | 1 | Single KV store.| +| MULTI_VERSION | 2 | Multi-version KV store. This type is not supported currently.| -It can be used only by internal applications. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

STRING

-

0

-

String.

-

INTEGER

-

1

-

Integer.

-

FLOAT

-

2

-

Float (single-precision floating point).

-

BYTE_ARRAY

-

3

-

Byte array.

-

BOOLEAN

-

4

-

Boolean.

-

DOUBLE

-

5

-

Double (double-precision floating point).

-
- -## SingleKVStore - -Provides methods to query and synchronize data in a single KV store. This class inherits from **KVStore**. Before calling any method in **SingleKVStore**, you must use **getKVStore** to create a **KVStore** object. - -### get - -get\(key: string, callback: AsyncCallback\): void -Obtains the value of a specified key. This method uses an asynchronous callback to return the result. +## SecurityLevel -- Parameters +Defines the KV store security levels. + +| Name| Default Value| Description| +| --- | ---- | ----------------------- | +| NO_LEVEL | 0 | No security level is set for the KV store.| +| S0 | 1 | The KV store security level is public.| +| S1 | 2 | The KV store security level is low. If data leakage occurs, minor impact will be caused on the database.| +| S2 | 3 | The KV store security level is medium. If data leakage occurs, moderate impact will be caused on the database.| +| S3 | 5 | The KV store security level is high. If data leakage occurs, major impact will be caused on the database.| +| S4 | 6 | The KV store security level is critical. If data leakage occurs, severe impact will be caused on the database.| + + +## Constants + +Defines the KV store constants. + +| Name| Default Value| Description| +| --- | ---- | ----------------------- | +| MAX\_KEY_LENGTH| 1024 | Maximum length (in bytes) of a key in the KV store.| +| MAX\_VALUE_LENGTH| 4194303 | Maximum length (in bytes) of a value in the KV store.| +| MAX\_KEY\_LENGTH\_DEVICE| 896 | Maximum length of the device coordinate key.| +| MAX\_STORE\_ID\_LENGTH| 128 | Maximum length (in bytes) of the KV store ID.| +| MAX\_QUERY_LENGTH| 512000 | Maximum query length.| +| MAX\_BATCH_SIZE| 128 | Maximum size of a batch operation.| + +## Schema8+ ## + +Defines a database schema. When creating or opening a KV store, you can create **Schema** objects and put them into **Options**. - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the value to obtain. It cannot be empty, and the length cannot exceed MAX_KEY_LENGTH.

-

callback

-

AsyncCallback<Uint8Array | string | boolean | number>

-

Yes

-

Callback invoked to return the value obtained.

-
+### toJsonString8+ ### + +toJsonString():string; + +Obtains the schema in JSON format. + +- Return value + +| Type| Description| +| ------------- | -------------- | +| string |Schema in JSON format obtained.| - Example ``` - const KEY_TEST_STRING_ELEMENT = 'key_test_string'; - const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + import ddm from '@ohos.data.distributedData'; try { - kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { - if (err != undefined) { - console.log("put err: " + JSON.stringify(err)); - return; - } - console.log("put success"); - kvStore.get(KEY_TEST_STRING_ELEMENT, function (err,data) { - console.log("get success data: " + data); - }); - }); - }catch (e) { - console.log("An unexpected error occurred. Error:" + e); + let schema = new ddm.Schema(); + const str = schema.toJsonString(); + console.log("schema: " + str); + } catch (e) { + console.log("toJsonString " + e); } ``` -### get +## FieldNode8+ ## -get\(key: string\): Promise +Defines a node of a **Schema** instance. It provides methods for defining values stored in the KV store. -Obtains the value of a specified key. This method uses a promise to return the result. +### appendChild8+ ### + +appendChild(child: FieldNode): boolean; + +Adds a child node to this **FieldNode**. - Parameters - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the value to obtain. It cannot be empty, and the length cannot exceed MAX_KEY_LENGTH.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<Uint8Array | string | boolean | number>

-

Promise used to return the result.

-
+| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| child | [FieldNode](#FieldNode) | Yes| Field node to add.| + + +- Return value +| Type| Description| +| ------------- | -------------- | +| boolean |Returns **true** if the operation is successful; returns **false** otherwise.| - Example ``` - const KEY_TEST_STRING_ELEMENT = 'key_test_string'; - const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + import ddm from '@ohos.data.distributedData'; try { - kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { - console.log("put success: " + JSON.stringify(data)); - kvStore.get(KEY_TEST_STRING_ELEMENT).then((data) => { - console.log("get success data: " + data); - }).catch((err) => { - console.log("get err: " + JSON.stringify(err)); - }); + let node = new ddm.FieldNode("root"); + let child1 = new ddm.FieldNode("child1"); + let child2 = new ddm.FieldNode("child2"); + let child3 = new ddm.FieldNode("child3"); + node.appendChild(child1); + node.appendChild(child2); + node.appendChild(child3); + console.log("appendNode " + node.toJson()); + child1 = null; + child2 = null; + child3 = null; + node = null; + } catch (e) { + console.log("AppendChild " + e); + } + ``` + + +### toJson8+ ### + +toJson(): string; + +Obtains the field name. + +- Return value + +| Type| Description| +| ------ | -------------- | +| string |Field name obtained.| + +- Example + + ``` + import ddm from '@ohos.data.distributedData'; + try { + let node = new ddm.FieldNode("root"); + let child = new ddm.FieldNode("child"); + node.appendChild(child); + console.log("appendNode " + node.toJson()); + } catch (e) { + console.log("ToJson " + e); + } + ``` + + +## KvStoreResultSet8+ ## + +Provides methods to obtain the KV Store result set and query or move the data read position. Before calling **KvStoreResultSet**, you must create a **KvStore** instance using **KvStore**. + +### getCount8+ ### + +getCount(): number; + +Obtains the number of rows in the result set. + +- Return value + +| Type| Description| +| ------ | -------------- | +| number |Number of rows obtained.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; }).catch((err) => { - console.log("put err: " + JSON.stringify(err)); + console.log('getResultSet fail ' + err); }); - }catch (e) { - console.log("An unexpected error occurred. Error:" + e); + const count = resultSet.getCount(); + console.log("GetCount " + count); + } catch (e) { + console.log("GetCount fail " + e); } ``` -### sync +### getPosition8+ ### -sync\(deviceIdList: string\[\], mode: SyncMode, allowedDelayMs?: number\): void +getPosition(): number; -Triggers synchronization of the KV store, which is in manual synchronization mode. +Obtains the current data read position (position from which data is read) in the result set. -- Parameters +- Return value - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceIdList

-

string[]

-

Yes

-

List of IDs of the devices in the same networking environment to be synchronized.

-

mode

-

SyncMode

-

Yes

-

Synchronization mode.

-

allowedDelayMs

-

number

-

No

-

Allowed delay time, in ms.

-
+| Type| Description| +| ------ | -------------- | +| number |Current data read position obtained.| - Example ``` - kvStore.sync(deviceIds, 1, 1000); + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const positon = resultSet.getPosition(); + console.log("getPosition " + positon); + } catch (e) { + console.log("GetPosition fail " + e); + } ``` -## SyncMode +### moveToFirst8+ ### -Defines the synchronization mode. +moveToFirst(): boolean; - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

PULL_ONLY

-

0

-

Pull data from the peer end to the local end only.

-

PUSH_ONLY

-

1

-

Push data from the local end to the peer end only.

-

PUSH_PULL

-

2

-

Push data from the local end to the peer end and then pull data from the peer end to the local end.

-
+Moves the data read position to the first row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the operation is successful; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.moveToFirst(); + console.log("moveToFirst " + moved); + } catch (e) { + console.log("MoveToFirst fail " + e); + } + ``` + + +### moveToLast8+ ### + +moveToLast(): boolean; + +Moves the data read position to the last row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the operation is successful; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.moveToLast(); + console.log("moveToLast " + moved); + } catch (e) { + console.log("moveToLast fail " + e); + } + ``` + + +### moveToNext8+ ### + +moveToNext(): boolean; + +Moves the data read position to the next row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the operation is successful; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.moveToNext(); + console.log("moveToNext " + moved); + } catch (e) { + console.log("moveToNext fail " + e); + } + ``` + + +### moveToPrevious8+ ### + +moveToPrevious(): boolean; + +Moves the data read position to the previous row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the operation is successful; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.moveToPrevious(); + console.log("moveToPrevious " + moved); + } catch (e) { + console.log("moveToPrevious fail " + e); + } + ``` + + +### move8+ ### + +move(offset: number): boolean; + +Moves the data read position with the specified offset from the current position. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| offset | number | Yes| Offset to move the data read position. A negative value means to move backward, and a positive value means to move forward.| + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the operation is successful; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.move(); + console.log("move " + moved); + } catch (e) { + console.log("move fail " + e); + } + ``` + + +### moveToPosition8+ ### + +moveToPosition(position: number): boolean; + +Moves the data read position from 0 to an absolute position. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| position | number | Yes|Absolute position.| + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the operation is successful; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.moveToPosition(); + console.log("moveToPosition " + moved); + } catch (e) { + console.log("moveToPosition fail " + e); + } + ``` + + +### isFirst8+ ### + +isFirst(): boolean; + +Checks whether the data read position is the first row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the data read position is the first row; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.isFirst(); + console.log("isFirst " + moved); + } catch (e) { + console.log("isFirst fail " + e); + } + ``` + + +### isLast8+ ### + +isLast(): boolean; + +Checks whether the data read position is the last row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the data read position is the last row; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.isLast(); + console.log("isLast " + moved); + } catch (e) { + console.log("isLast fail " + e); + } + ``` + + +### isBeforeFirst8+ ### + +isBeforeFirst(): boolean; + +Checks whether the data read position is before the first row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the read position is before the first row; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.isBeforeFirst(); + console.log("isBeforeFirst " + moved); + } catch (e) { + console.log("isBeforeFirst fail " + e); + } + ``` + + +### isAfterLast8+ ### + +isAfterLast(): boolean; + +Checks whether the data read position is after the last row. + +- Return value + +| Type| Description| +| ------ | -------------- | +| boolean |Returns **true** if the data read position is after the last row; returns **false** otherwise.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.isAfterLast(); + console.log("isAfterLast " + moved); + } catch (e) { + console.log("isAfterLast fail " + e); + } + ``` + + +### getEntry8+ ### + +getEntry(): Entry; + +Obtains KV pairs. + +- Return value + +| Type| Description| +| ------ | ------- | +| Entry |KV pairs obtained.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + const moved = resultSet.moveToNext(); + const entry = resultSet.getEntry(); + console.log("getEntry " + JSON.stringify(entry)); + } catch (e) { + console.log("getEntry fail " + e); + } + ``` + + +## Query8+ ## + +Provides methods to create a **Query** object, which defines different data query criteria. + +### reset8+ ### + +reset(): Query; + +Resets the **Query** object that contains common query options. + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object reset.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.equalTo("key", "value"); + console.log("query is " + query.getSqlLike()); + query.reset(); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("simply calls should be ok :" + e); + } + ``` + + +### equalTo8+ ### + +equalTo(field: string, value: number|string|boolean): Query; + +Creates a **Query** object to match the specified field and value equal to the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.equalTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### notEqualTo8+ ### + +notEqualTo(field: string, value: number|string|boolean): Query; + +Creates a **Query** object to match the specified field and value not equal to the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value specified.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notEqualTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### greaterThan8+ ### + +greaterThan(field: string, value: number|string|boolean): Query; + +Creates a **Query** object to match the specified field and value greater than the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value specified.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.greaterThan("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### lessThan8+ ### + +lessThan(field: string, value: number|string): Query; + +Creates a **Query** object to match the specified field and value less than the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.lessThan("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### greaterThanOrEqualTo8+ ### + +greaterThanOrEqualTo(field: string, value: number|string): Query; + +Creates a **Query** object to match the specified field and value greater than or equal to the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value specified.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.greaterThanOrEqualTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### lessThanOrEqualTo8+ ### + +lessThanOrEqualTo(field: string, value: number|string): Query; + +Creates a **Query** object to match the specified field and value less than or equal to the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.lessThanOrEqualTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### isNull8+ ### + +isNull(field: string): Query; + +Creates a **Query** object to match the specified field whose value is **null**. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.isNull("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### inNumber8+ ### + +inNumber(field: string, valueList: number[]): Query; + +Creates a **Query** object to match the specified field whose value is within the specified list of numbers. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| valueList | number[] | Yes| List of numbers.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.inNumber("field", [0, 1]); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### inString8+ ### + +inString(field: string, valueList: string[]): Query; + +Creates a **Query** object to match the specified field whose value is within the specified list of strings. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| valueList | string[] | Yes| List of strings.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.inString("field", ['test1', 'test2']); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### notInNumber8+ ### + +notInNumber(field: string, valueList: number[]): Query; + +Creates a **Query** object to match the specified field whose value is not within the specified list of numbers. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| valueList | number[] | Yes| List of numbers.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notInNumber("field", [0, 1]); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### notInString8+ ### + +notInString(field: string, valueList: string[]): Query; + +Creates a **Query** object to match the specified field whose value is not within the specified list of strings. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| valueList | string[] | Yes| List of strings.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notInString("field", ['test1', 'test2']); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### like8+ ### + +like(field: string, value: string): Query; + +Creates a **Query** object to match the specified field whose value is similar to the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| valueList | string | Yes| String specified.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.like("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### unlike8+ ### + +unlike(field: string, value: string): Query; + +Creates a **Query** object to match the specified field whose value is not similar to the specified value. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| valueList | string | Yes| String specified.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.unlike("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### and8+ ### + +and(): Query; + +Creates a **Query** object with the AND condition. + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notEqualTo("field", "value1"); + query.and(); + query.notEqualTo("field", "value2"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### or8+ ### + +or(): Query; + +Creates a **Query** object with the OR condition. + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notEqualTo("field", "value1"); + query.or(); + query.notEqualTo("field", "value2"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### orderByAsc8+ ### + +orderByAsc(field: string): Query; + +Creates a **Query** object to sort the query results in ascending order. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notEqualTo("field", "value"); + query.orderByAsc("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### orderByDesc8+ ### + +orderByDesc(field: string): Query; + +Creates a **Query** object to sort the query results in descending order. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notEqualTo("field", "value"); + query.orderByDesc("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### limit8+ ### + +limit(total: number, offset: number): Query; + +Creates a **Query** object to specify the number of results and where to start. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| total | number | Yes|Number of results.| +| offset | number | Yes|Start position.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.notEqualTo("field", "value"); + query.limit("total", "offset"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### isNotNull8+ ### + +isNotNull(field: string): Query; + +Creates a **Query** object with a specified field that is not null. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| fieId | string | Yes|Field specified.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.isNotNull("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### beginGroup8+ ### + +beginGroup(): Query; + +Creates a **Query** object with a query condition group with a left parenthesis. + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.beginGroup(); + query.isNotNull("field"); + query.endGroup(); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### endGroup8+ ### + +endGroup(): Query; + +Creates a **Query** object with a query condition group with a right parenthesis. + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.beginGroup(); + query.isNotNull("field"); + query.endGroup(); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### prefixKey8+ ### + +prefixKey(prefix: string): Query; + +Creates a **Query** object with a specified key prefix. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| prefix | string | Yes|Key prefix.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.prefixKey("$.name"); + query.prefixKey("0"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### setSuggestIndex8+ ### + +setSuggestIndex(index: string): Query; + +Creates a **Query** object with an index preferentially used for query. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| index | string | Yes|Index to be set.| + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.setSuggestIndex("$.name"); + query.setSuggestIndex("0"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### deviceId8+ ### + +deviceId(deviceId:string):Query; + +Creates a **Query** object with the device ID as the key prefix. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId | string | Yes|Device ID.| + + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object created.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + query.deviceId("deviceId"); + console.log("query is " + query.getSqlLike()); + } catch (e) { + console.log("should be ok on Method Chaining : " + e); + } + ``` + + +### getSqlLike8+ ### + +getSqlLike():string; + +Obtains the query statement of this **Query** object. + +- Return value + +| Type| Description| +| ------ | ------- | +| [Query](#querysup8sup) |**Query** object.| + +- Example + + ``` + try { + let query = new distributedData.Query(); + let sql1 = query.getSqlLike(); + console.log("GetSqlLike sql=" + sql1); + } catch (e) { + console.log("dumplicated calls should be ok : " + e); + } + ``` + + +## KVStore + +Provides methods to manage data in a KV store, for example, adding or deleting data and subscribing to data changes or completion of data synchronization. Before calling any method in **KVStore**, you must use **getKVStore** to create a **KVStore** object. + +### put + +put(key: string, value: Uint8Array | string | number | boolean, callback: AsyncCallback<void>): void + +Adds a KV pair of the specified type to the KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| key | string | Yes|Key of the KV pair to add. It cannot be empty, and the length cannot exceed [MAX\_KEY\_LENGTH](#constants).| +| value | Uint8Array / string / number / boolean | Yes|Value of the KV pair to add. The value type can be Uint8Array, number, string, or boolean. A value of the Uint8Array or string type cannot exceed [MAX\_VALUE\_LENGTH](#constants).| + + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("put err: " + JSON.stringify(err)); + return; + } + console.log("put success"); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### put + +put(key: string, value: Uint8Array | string | number | boolean): Promise<void> + +Adds a KV pair of the specified type to the KV store. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| key | string | Yes|Key of the KV pair to add. It cannot be empty, and the length cannot exceed [MAX\_KEY\_LENGTH](#constants).| +| value | Uint8Array / string / number / boolean | Yes|Value of the KV pair to add. The value type can be Uint8Array, number, string, or boolean. A value of the Uint8Array or string type cannot exceed [MAX\_VALUE\_LENGTH](#constants).| + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { + console.log("put success: " + JSON.stringify(data)); + }).catch((err) => { + console.log("put err: " + JSON.stringify(err)); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### delete + +delete(key: string, callback: AsyncCallback<void>): void + +Deletes a KV pair from the KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| key | string | Yes|Key of the KV pair to delete. It cannot be empty, and the length cannot exceed [MAX\_KEY\_LENGTH](#constants).| +| callback | AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("put err: " + JSON.stringify(err)); + return; + } + console.log("put success"); + kvStore.delete(KEY_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("delete err: " + JSON.stringify(err)); + return; + } + console.log("delete success"); + }); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### delete + +delete(key: string): Promise<void> + +Deletes a KV pair from the KV store. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| key | string | Yes|Key of the KV pair to delete. It cannot be empty, and the length cannot exceed [MAX\_KEY\_LENGTH](#constants).| + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { + console.log("put success: " + JSON.stringify(data)); + kvStore.delete(KEY_TEST_STRING_ELEMENT).then((data) => { + console.log("delete success"); + }).catch((err) => { + console.log("delete err: " + JSON.stringify(err)); + }); + }).catch((err) => { + console.log("put err: " + JSON.stringify(err)); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### on + +on(event: 'dataChange', type: SubscribeType, observer: Callback<ChangeNotification>): void + +Subscribes to data changes of the specified type. This method uses a synchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| event |'dataChange' | Yes|Type of the events.| +| type |[SubscribeType](#subscribetypea) | Yes|Type of data changes.| +| observer |Callback<[ChangeNotification](#changenotificationa)> | Yes|Callback used to return the result.| + + +- Example + + ``` + let kvStore; + kvStore.on('dataChange', distributedData.SubscribeType.SUBSCRIBE_TYPE_LOCAL, function (data) { + console.log("dataChange callback call data: " + JSON.stringify(data)); + }); + ``` + + +### on + +on(event: 'syncComplete', syncCallback: Callback8+ + +off(event:'dataChange', observer?: Callback<ChangeNotification>): void; + +Unsubscribes from data change notifications. This method is a synchronous method. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| event |'dataChange' | Yes|Type of the events.| +| observer |Callback<[ChangeNotification](#changenotificationa)> |No|Callback used to return the result.| + +- Example + + ``` + let kvStore; + kvStore.on('dataChange', function (data) { + console.log("syncComplete callback call data: " + data); + }); + kvStore.off('dataChange', function (data) { + console.log("syncComplete callback call data: " + data); + }); + ``` + + +### putBatch8+ + +putBatch(entries: Entry[], callback: AsyncCallback<void>): void; + +Inserts KV pairs in batches to the KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| entries |[Entry](#entry)[] | Yes|KV pairs to insert in batches.| +| callback |Asyncallback<void> |Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + await kvStore.getEntries('batch_test_string_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + + ``` + + +### putBatch8+ + +putBatch(entries: Entry[]): Promise<void>; + +Inserts KV pairs in batches to the KV store. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| entries |[Entry](#entry)[] | Yes|KV pairs to insert in batches.| + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + await kvStore.getEntries('batch_test_string_key').then((entrys) => { + console.log('getEntries success'); + console.log('PutBatch ' + JSON.stringify(entries)); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### deleteBatch8+ + +deleteBatch(keys: string[], callback: AsyncCallback<void>): void; + +Deletes KV pairs in batches from the KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| keys |string[] | Yes|KV pairs to delete in batches.| +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + let keys = []; + for (var i = 0; i < 5; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + keys.push(key + i); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + await kvStore.deleteBatch(keys, async function (err,data) { + console.log('deleteBatch success'); + }); + }); + }catch(e) { + console.log('DeleteBatch e ' + e); + } + ``` + + +### deleteBatch8+ ### + +deleteBatch(keys: string[]): Promise<void>; + +Deletes KV pairs in batches from the KV store. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| keys |string[] | Yes|KV pairs to delete in batches.| + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + let keys = []; + for (var i = 0; i < 5; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + keys.push(key + i); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + await kvStore.deleteBatch(keys).then((err) => { + console.log('deleteBatch success'); + }).catch((err) => { + console.log('deleteBatch fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('DeleteBatch e ' + e); + } + ``` + + +### startTransaction8+ ### + +startTransaction(callback: AsyncCallback<void>): void; + +Starts transactions in the KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + function putBatchString(len, prefix) { + let entries = []; + for (var i = 0; i < len; i++) { + var entry = { + key : prefix + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + return entries; + } + try { + var count = 0; + kvStore.on('dataChange', 0, function (data) { + console.log('startTransaction 0' + data) + count++; + }); + kvStore.startTransaction(async function (err,data) { + console.log('startTransaction success'); + let entries = putBatchString(10, 'batch_test_string_key'); + console.log('entries: ' + JSON.stringify(entries)); + await kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + }); + }); + }catch(e) { + console.log('startTransaction e ' + e); + } + ``` + + +### startTransaction8+ ### + +startTransaction(): Promise<void>; + +Starts transactions in the KV store. This method uses a promise to return the result. + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + var count = 0; + kvStore.on('dataChange', distributedData.SubscribeType.SUBSCRIBE_TYPE_ALL, function (data) { + console.log('startTransaction ' + JSON.stringify(data)); + count++; + }); + kvStore.startTransaction().then(async (err) => { + console.log('startTransaction success'); + }).catch((err) => { + console.log('startTransaction fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('startTransaction e ' + e); + } + ``` + + +### commit8+ ### + +commit(callback: AsyncCallback<void>): void; + +Commits transactions in the KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + kvStore.commit(function (err,data) { + if (err == undefined) { + console.log('commit success'); + } else { + console.log('commit fail'); + } + }); + }catch(e) { + console.log('Commit e ' + e); + } + ``` + + +### commit8+ ### + +commit(): Promise<void>; + +Commits transactions in the KV store. This method uses a promise to return the result. + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + kvStore.commit().then(async (err) => { + console.log('commit success'); + }).catch((err) => { + console.log('commit fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('Commit e ' + e); + } + ``` + + +### rollback8+ ### + +rollback(callback: AsyncCallback<void>): void; + +Rolls back transactions in the KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + kvStore.rollback(function (err,data) { + if (err == undefined) { + console.log('commit success'); + } else { + console.log('commit fail'); + } + }); + }catch(e) { + console.log('Rollback e ' + e); + } + ``` + + +### rollback8+ ### + +rollback(): Promise<void>; + +Rolls back transactions in the KV store. This method uses a promise to return the result. + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + kvStore.rollback().then(async (err) => { + console.log('rollback success'); + }).catch((err) => { + console.log('rollback fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('Rollback e ' + e); + } + ``` + + +### enableSync8+ ### + +enableSync(enabled: boolean, callback: AsyncCallback<void>): void; + +Sets data synchronization, which can be enabled or disable. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| enabled |boolean | Yes|Whether to enable data synchronization. The value **true** means to enable data synchronization, and the value **false** means the opposite.| +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + kvStore.enableSync(true, function (err,data) { + if (err == undefined) { + console.log('enableSync success'); + } else { + console.log('enableSync fail'); + } + }); + }catch(e) { + console.log('EnableSync e ' + e); + } + ``` + + +### enableSync8+ ### + +enableSync(enabled: boolean): Promise<void>; + +Sets data synchronization, which can be enabled or disable. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| enabled |boolean | Yes|Whether to enable data synchronization. The value **true** means to enable data synchronization, and the value **false** means the opposite.| + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + kvStore.enableSync(true).then((err) => { + console.log('enableSync success'); + }).catch((err) => { + console.log('enableSync fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('EnableSync e ' + e); + } + ``` + + +### setSyncRange8+ ### + +setSyncRange(localLabels: string[], remoteSupportLabels: string[], callback: AsyncCallback<void>): void; + +Sets the data synchronization range. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| localLabels |string[] | Yes|Synchronization label set for the local device.| +| remoteSupportLabels |string[] | Yes|Synchronization labels set for remote devices.| +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + const localLabels = ['A', 'B']; + const remoteSupportLabels = ['C', 'D']; + kvStore.setSyncRange(localLabels, remoteSupportLabels, function (err,data) { + console.log('SetSyncRange put success'); + }); + }catch(e) { + console.log('SetSyncRange e ' + e); + } + ``` + + +### setSyncRange8+ ### + +setSyncRange(localLabels: string[], remoteSupportLabels: string[]): Promise<void>; + +Sets the data synchronization range. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| localLabels |string[] | Yes|Synchronization label set for the local device.| +| remoteSupportLabels |string[] | Yes|Synchronization labels set for remote devices.| + + +- Return value + +| Type| Description| +| ------ | ------- | +| Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + const localLabels = ['A', 'B']; + const remoteSupportLabels = ['C', 'D']; + kvStore.setSyncRange(localLabels, remoteSupportLabels).then((err) => { + console.log('setSyncRange success'); + }).catch((err) => { + console.log('delete fail ' + err); + }); + }catch(e) { + console.log('SetSyncRange e ' + e); + } + ``` + + +## SubscribeType + +Defines the subscription type. + +| Name| Default Value| Description| +| ----- | ------ | ----------------------- | +| SUBSCRIBE_TYPE_LOCAL |0 |Local data changes.| +| SUBSCRIBE_TYPE_REMOTE |1 |Peer data changes.| +| SUBSCRIBE_TYPE_ALL |2 |Local and peer data changes.| + +## ChangeNotification + +Defines the content of data change notifications, including inserted data, updated data, deleted data, and device ID. + +| Name| Type|Readable|Writable| Description| +| ----- | ------- | -----| ------|------------------------ | +| insertEntries | [Entry](#entry)[] | Yes| Yes|Data inserted.| +| updateEntries | [Entry](#entry)[] | Yes| Yes|Data updated.| +| deleteEntries | [Entry](#entry)[] | Yes| Yes|Data deleted.| +| deviceId | string | Yes| Yes|UUID of the device.| + +## Entry + +Defines the KV pairs stored in the database. + +| Name| Type|Readable|Writable| Description| +| ----- | ------- | -----| ------|------------------------ | +| key | string | Yes| Yes|Key of the KV pair stored in the database.| +| value | [Value](#value) | Yes| Yes|Value of the KV pair stored in the database.| + + +## Value + +Defines the value in a KV pair. + +| Name| Type|Readable|Writable| Description| +| ----- | ------- | -----| ------|------------------------ | +| type | [ValueType](#value) | Yes| Yes|Type of the value.| +| value | Uint8Array / string / number / boolean| Yes| Yes|Specific value.| + +## ValueType + +Defines the types of the value in a KV pair. + +It can be used only by internal applications. + +| Name| Default Value| Description| +| ----- | ------ | ----------------------- | +| STRING |0 |String.| +| INTEGER |1 |Integer.| +| FLOAT |2 |Float (single-precision floating point).| +| BYTE_ARRAY |3 |Byte array.| +| BOOLEAN |4 |Boolean.| +| DOUBLE |5 |Double (double-precision floating point).| + +## SingleKVStore + +Provides methods to query and synchronize data in a single KV store. This class inherits from **KVStore**. Before calling any method in **SingleKVStore**, you must use **getKVStore** to create a **SingleKVStore** object. + +### get + +get(key: string, callback: AsyncCallback<Uint8Array | string | boolean | number>): void + +Obtains the value of a specified key. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| key |string | Yes|Key of the value to obtain. It cannot be empty, and the length cannot exceed [MAX\_KEY\_LENGTH](#constants).| +| callback |AsyncCallback<Uint8Array / string / boolean / number>) | Yes|Callback invoked to return the value obtained.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("put err: " + JSON.stringify(err)); + return; + } + console.log("put success"); + kvStore.get(KEY_TEST_STRING_ELEMENT, function (err,data) { + console.log("get success data: " + data); + }); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### get + +get(key: string): Promise<Uint8Array | string | boolean | number> + +Obtains the value of a specified key. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| key |string | Yes|Key of the value to obtain. It cannot be empty, and the length cannot exceed [MAX\_KEY\_LENGTH](#constants).| + + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<Uint8Array / string / boolean / number> |Promise used to return the result.| + + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { + console.log("put success: " + JSON.stringify(data)); + kvStore.get(KEY_TEST_STRING_ELEMENT).then((data) => { + console.log("get success data: " + data); + }).catch((err) => { + console.log("get err: " + JSON.stringify(err)); + }); + }).catch((err) => { + console.log("put err: " + JSON.stringify(err)); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + +### getEntries8+ ### + +getEntries(keyPrefix: string, callback: AsyncCallback<Entry[]>): void; + +Obtains all KV pairs that match the specified key prefix. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| keyPrefix |string | Yes|Key prefix to match.| +| callback |AsyncCallback<Entry[]> | Yes|Callback used to return the KV pairs obtained.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_number_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.INTEGER, + value : 222 + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + await kvStore.getEntries('batch_test_number_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(keyPrefix: string): Promise<Entry[]>; + +Obtains all KV pairs that match the specified key prefix. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| keyPrefix |string | Yes|Key prefix to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[Entry](#entry)[]> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + await kvStore.getEntries('batch_test_string_key').then((entrys) => { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + console.log('entrys[0].value: ' + JSON.stringify(entrys[0].value)); + console.log('entrys[0].value.value: ' + entrys[0].value.value); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(query: Query, callback: AsyncCallback<Entry[]>): void; + +Obtains the KV pairs matching the specified **Query** object. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| +| callback |AsyncCallback<Entry[]> | Yes|Callback used to return the KV pairs obtained.| + +- Example + + ``` + let kvStore; + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + await kvStore.getEntries(query, function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }); + }); + console.log('GetEntries success'); + }catch(e) { + console.log('GetEntries e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(query: Query): Promise<Entry[]>; + +Obtains the KV pairs matching the specified **Query** object. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[Entry](#entry)[]> |Promise used to return the result.| + +- Example + + ``` + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + await kvStore.getEntries(query).then((entrys) => { + console.log('getEntries success'); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('GetEntries putBatch fail ' + JSON.stringify(err)) + }); + console.log('GetEntries success'); + }catch(e) { + console.log('GetEntries e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(keyPrefix: string, callback: AsyncCallback<KvStoreResultSet>): void; + +Obtains the result set with the specified prefix from the single KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| keyPrefix |string | Yes|Key prefix to match.| +| callback |AsyncCallback<[KvStoreResultSet](#kvstoreresultsetsup8sup)> | Yes|Callback used to return the result set obtained.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('GetResultSet putBatch success'); + await kvStore.getResultSet('batch_test_string_key', async function (err, result) { + console.log('GetResultSet getResultSet success'); + resultSet = result; + kvStore.closeResultSet(resultSet, function (err, data) { + console.log('GetResultSet closeResultSet success'); + }) + }); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(keyPrefix: string): Promise<KvStoreResultSet>; + +Obtains the result set with the specified prefix from the single KV store. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| keyPrefix |string | Yes|Key prefix to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + }).catch((err) => { + console.log('PutBatch putBatch fail ' + JSON.stringify(err)); + }); + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('GetResult getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('GetResult closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResult e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(query: Query, callback: AsyncCallback<KvStoreResultSet>): void; + +Obtains the **KvStoreResultSet** object that matches the specified **Query** object. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |Query | Yes|**Query** object.| +| callback |AsyncCallback<[KvStoreResultSet](#kvstoreresultsetsup8sup)> | Yes|Callback used to return the **KvStoreResultSet** object obtained.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + await kvStore.getResultSet(query, async function (err, result) { + console.log('getResultSet success'); + resultSet = result; + }); + }); + } catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(query: Query): Promise<KvStoreResultSet>; + +Obtains the **KvStoreResultSet** object that matches the specified **Query** object. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + kvStore.getResultSet(query).then((result) => { + console.log(' getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + +### closeResultSet8+ ### + +closeResultSet(resultSet: KvStoreResultSet, callback: AsyncCallback<void>): void; + +Closes the **KvStoreResultSet** object obtained by **getResultSet**. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| resultSet |[KvStoreResultSet](#kvstoreresultsetsup8sup) | Yes|**KvStoreResultSet** object to close.| +| callback |AsyncCallback<void> | Yes|Callback used to return the **KvStoreResultSet** object obtained by **getResultSet**.| + +- Example + + ``` + let kvStore; + try { + let resultSet = null; + kvStore.closeResultSet(resultSet, function (err, data) { + if (err == undefined) { + console.log('closeResultSet success'); + } else { + console.log('closeResultSet fail'); + } + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### closeResultSet8+ ### + +closeResultSet(resultSet: KvStoreResultSet): Promise<void>; + +Closes the **KvStoreResultSet** object obtained by **getResultSet**. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| resultSet |[KvStoreResultSet](#kvstoreresultsetsup8sup) | Yes|**KvStoreResultSet** object to close.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let resultSet = null; + kvStore.closeResultSet(resultSet).then(() => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### getResultSize8+ ### + +getResultSize(query: Query, callback: AsyncCallback<number>): void; + +Obtains the number of results matching the specified **Query** object. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| +| callback |AsyncCallback<number> | Yes|Callback used to return the number of results obtained.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + await kvStore.getResultSize(query, async function (err, resultSize) { + console.log('getResultSet success'); + }); + }); + } catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize8+ ### + +getResultSize(query: Query): Promise<number>; + +Obtains the number of results matching the specified **Query** object. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<number> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + kvStore.getResultSize(query).then((resultSize) => { + console.log('getResultSet success'); + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### removeDeviceData8+ ### + +removeDeviceData(deviceId: string, callback: AsyncCallback<void>): void; + +Deletes data of a device. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|Name of the target device.| +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-002'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, async function (err,data) { + console.log('put success'); + const deviceid = 'no_exist_device_id'; + await kvStore.removeDeviceData(deviceid, async function (err,data) { + if (err == undefined) { + console.log('removeDeviceData success'); + } else { + console.log('removeDeviceData fail'); + await kvStore.get(KEY_TEST_STRING_ELEMENT, async function (err,data) { + console.log('RemoveDeviceData get success'); + }); + } + }); + }); + }catch(e) { + console.log('RemoveDeviceData e ' + e); + } + ``` + + +### removeDeviceData8+ ### + +removeDeviceData(deviceId: string): Promise<void>; + +Deletes data of a device. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|Name of the target device.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-001'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((err) => { + console.log('removeDeviceData put success'); + }).catch((err) => { + console.log('put fail ' + JSON.stringify(err)); + }); + const deviceid = 'no_exist_device_id'; + kvStore.removeDeviceData(deviceid).then((err) => { + console.log('removeDeviceData success'); + }).catch((err) => { + console.log('removeDeviceData fail ' + JSON.stringify(err)); + }); + kvStore.get(KEY_TEST_STRING_ELEMENT).then((data) => { + console.log('get success data:' + data); + }).catch((err) => { + console.log('RemoveDeviceData get fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('RemoveDeviceData e ' + e); + } + ``` + + +### on8+ ### + +on(event: 'syncComplete', syncCallback: Callback { + console.log('syncComplete put success'); + }).catch((error) => { + console.log('syncComplete put fail ' + error); + }); + }catch(e) { + console.log('syncComplete put e ' + e); + } + ``` + + +### off8+ ### + +off(event: 'syncComplete', syncCallback?: Callback8+ ### + +setSyncParam(defaultAllowedDelayMs: number, callback: AsyncCallback<void>): void; + +Sets the default delay of database synchronization. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| defaultAllowedDelayMs |number | Yes|Default delay allowed for database synchronization, in ms.| +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + + +- Example + + ``` + let kvStore; + try { + const defaultAllowedDelayMs = 500; + kvStore.setSyncParam(defaultAllowedDelayMs, function (err,data) { + console.log('SetSyncParam put success'); + }); + }catch(e) { + console.log('testSingleKvStoreSetSyncParam e ' + e); + } + ``` + + +### setSyncParam8+ ### + +setSyncParam(defaultAllowedDelayMs: number): Promise<void>; + +Sets the default delay of database synchronization. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| defaultAllowedDelayMs |number | Yes|Default delay allowed for database synchronization, in ms.| + + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + const defaultAllowedDelayMs = 500; + kvStore.setSyncParam(defaultAllowedDelayMs).then((err) => { + console.log('SetSyncParam put success'); + }).catch((err) => { + console.log('SetSyncParam put fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('SetSyncParam e ' + e); + } + ``` + + +### getSecurityLevel8+ ### + +getSecurityLevel(callback: AsyncCallback<SecurityLevel>): void; + +Obtains the security level of a KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| callback |AsyncCallback<[SecurityLevel](#securitylevel)> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + kvStore.getSecurityLevel(function (err,data) { + console.log('getSecurityLevel success'); + }); + }catch(e) { + console.log('GetSecurityLeve e ' + e); + } + ``` + + +### getSecurityLevel8+ ### + +getSecurityLevel(): Promise<SecurityLevel>; + +Obtains the security level of a KV store. This method uses a promise to return the result. + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[SecurityLevel](#securitylevel)> |Promise used to return the result.| + + +- Example + + ``` + let kvStore; + try { + kvStore.getSecurityLevel().then((data) => { + console.log(' getSecurityLevel success'); + }).catch((err) => { + console.log('getSecurityLevel fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetSecurityLeve e ' + e); + } + ``` + + +## DeviceKVStore8+ ## + +Provides methods to manage distributed data by device in the distributed system. This class inherits from **KvStore** and provides data query and synchronization methods. Before calling any method in **DeviceKVStore**, you must use **getKVStore** to create a **DeviceKVStore** object. + +### get8+ ### + +get(deviceId: string, key: string, callback: AsyncCallback<boolean|string|number|Uint8Array>): void; + +Obtains the string value that matches the specified key for a device. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| key |string | Yes|Key to match.| +| callback |AsyncCallback<boolean/string/number/Uint8Array> | Yes|Callback used to return the value obtained.| + + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-002'; + try{ + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, async function (err,data) { + console.log('put success'); + kvStore.get('localDeviceId', KEY_TEST_STRING_ELEMENT, function (err,data) { + console.log('get success'); + }); + }) + }catch(e) { + console.log('get e' + e); + } + ``` + + +### get8+ ### + +get(deviceId: string, key: string): Promise<boolean|string|number|Uint8Array>; + +Obtains the string value that matches the specified key for a device. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| key |string | Yes|Key to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<boolean/string/number/Uint8Array> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-002'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then(async (data) => { + console.log(' put success'); + kvStore.get('localDeviceId', KEY_TEST_STRING_ELEMENT).then((data) => { + console.log('get success'); + }).catch((err) => { + console.log('get fail ' + JSON.stringify(err)); + }); + }).catch((error) => { + console.log('put error' + error); + }); + } catch (e) { + console.log('Get e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(deviceId: string, keyPrefix: string, callback: AsyncCallback<Entry[]>): void; + +Obtains all KV pairs that match the specified key prefix for a device. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| keyPrefix |string | Yes|Key prefix to match.| +| callback |AsyncCallback<[Entry](#entry)[]> | Yes|Callback used to return the KV pairs obtained.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + await kvStore.getEntries('localDeviceId', 'batch_test_string_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(deviceId: string, keyPrefix: string): Promise<Entry[]>; + +Obtains all KV pairs that match the specified key prefix for a device. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| keyPrefix |string | Yes|Key prefix to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[Entry](#entry)[]> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + await kvStore.getEntries('localDeviceId', 'batch_test_string_key').then((entrys) => { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + console.log('entrys[0].value: ' + JSON.stringify(entrys[0].value)); + console.log('entrys[0].value.value: ' + entrys[0].value.value); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(query: Query, callback: AsyncCallback<Entry[]>): void; + +Obtains the KV pairs matching the specified **Query** object. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| +| callback |AsyncCallback<[Entry](#entry)[]> | Yes|Callback used to return the KV pairs obtained.| + +- Example + + ``` + let kvStore; + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + expect(err == undefined).assertTrue(); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + query.deviceId('localDeviceId'); + await kvStore.getEntries(query, function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }); + }); + console.log('GetEntries success'); + }catch(e) { + console.log('GetEntries e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(query: Query): Promise<Entry[]>; + +Obtains the KV pairs matching the specified **Query** object. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[Entry](#entry)[]> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + await kvStore.getEntries(query).then((entrys) => { + console.log('getEntries success'); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('GetEntries putBatch fail ' + JSON.stringify(err)) + }); + console.log('GetEntries success'); + }catch(e) { + console.log('GetEntries e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(deviceId: string, query: Query, callback: AsyncCallback<Entry[]>): void; + +Obtains the KV pairs matching the specified **Query** object for a device. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| query |[Query](#querysup8sup) | Yes|**Query** object.| +| callback |AsyncCallback<[Entry](#entry)[]> | Yes|Callback used to return the KV pairs obtained.| + +- Example + + ``` + let kvStore; + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + expect(err == undefined).assertTrue(); + var query = new distributedData.Query(); + query.deviceId('localDeviceId'); + query.prefixKey("batch_test"); + await kvStore.getEntries('localDeviceId', query, function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }) + }); + console.log('GetEntries success'); + }catch(e) { + console.log('GetEntries e ' + e); + } + ``` + + +### getEntries8+ ### + +getEntries(deviceId: string, query: Query): Promise<Entry[]>; + +Obtains the KV pairs matching the specified **Query** object for a device. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[Entry](#entry)[]> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + JSON.stringify(entries)); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + var query = new distributedData.Query(); + query.deviceId('localDeviceId'); + query.prefixKey("batch_test"); + await kvStore.getEntries('localDeviceId', query).then((entrys) => { + console.log('getEntries success'); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + console.log('GetEntries success'); + }catch(e) { + console.log('GetEntries e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(deviceId: string, keyPrefix: string, callback: AsyncCallback<KvStoreResultSet>): void; + +Obtains the **KvStoreResultSet** object that matches the specified key prefix for a device. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| keyPrefix |string | Yes|Key prefix to match.| +| callback |AsyncCallback<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> | Yes|Callback used to return the **KvStoreResultSet** object obtained.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('localDeviceId', 'batch_test_string_key', async function (err, result) { + console.log('getResultSet success'); + resultSet = result; + await kvStore.closeResultSet(resultSet, function (err, data) { + console.log('closeResultSet success'); + }) + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(deviceId: string, keyPrefix: string): Promise<KvStoreResultSet>; + +Obtains the **KvStoreResultSet** object that matches the specified key prefix for a device. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| keyPrefix |string | Yes|Key prefix to match.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + kvStore.getResultSet('localDeviceId', 'batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(query: Query, callback: AsyncCallback<KvStoreResultSet>): void; + +Obtains the **KvStoreResultSet** object that matches the specified **Query** object. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| +| callback |AsyncCallback<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> | Yes|Callback used to return the **KvStoreResultSet** object obtained.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + query.deviceId('localDeviceId'); + await kvStore.getResultSet(query, async function (err, result) { + console.log('getResultSet success'); + resultSet = result; + await kvStore.closeResultSet(resultSet, function (err, data) { + console.log('closeResultSet success'); + }) + }); + }); + } catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(query: Query): Promise<KvStoreResultSet>; + +Obtains the **KvStoreResultSet** object that matches the specified **Query** object. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + }).catch((err) => { + console.log('putBatch fail ' + err); + }); + const query = new distributedData.Query(); + query.deviceId('localDeviceId'); + query.prefixKey("batch_test"); + console.log("GetResultSet " + query.getSqlLike()); + kvStore.getResultSet(query).then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(deviceId: string, query: Query, callback: AsyncCallback<KvStoreResultSet>): void; + +Obtains the **KvStoreResultSet** object that matches the specified **Query** object for a device. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| query |[Query](#querysup8sup) | Yes|**Query** object.| +| callback |AsyncCallback<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> | Yes|Callback used to return the **KvStoreResultSet** object obtained.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + await kvStore.getResultSet('localDeviceId', query, async function (err, result) { + console.log('getResultSet success'); + resultSet = result; + await kvStore.closeResultSet(resultSet, function (err, data) { + console.log('closeResultSet success'); + }) + }); + }); + } catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet8+ ### + +getResultSet(deviceId: string, query: Query): Promise<KvStoreResultSet>; + +Obtains the **KvStoreResultSet** object that matches the specified **Query** object for a device. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('GetResultSet putBatch success'); + }).catch((err) => { + console.log('PutBatch putBatch fail ' + JSON.stringify(err)); + }); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + kvStore.getResultSet('localDeviceId', query).then((result) => { + console.log('GetResultSet getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('GetResultSet getResultSet fail ' + JSON.stringify(err)); + }); + query.deviceId('localDeviceId'); + console.log("GetResultSet " + query.getSqlLike()); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('GetResultSet closeResultSet success'); + }).catch((err) => { + console.log('GetResultSet closeResultSet fail ' + JSON.stringify(err)); + }); + + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### closeResultSet8+ ### + +closeResultSet(resultSet: KvStoreResultSet, callback: AsyncCallback<void>): void; + +Closes the **KvStoreResultSet** object obtained by **getResultSet**. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| resultSet |[KvStoreResultSet](#getresultsetsup8sup) | Yes|**KvStoreResultSet** object to close.| +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + try { + console.log('CloseResultSet success'); + let resultSet = null; + kvStore.closeResultSet(resultSet, function (err, data) { + if (err == undefined) { + console.log('closeResultSet success'); + } else { + console.log('closeResultSet fail'); + } + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### closeResultSet8+ ### + +closeResultSet(resultSet: KvStoreResultSet): Promise<void>; + +Closes the **KvStoreResultSet** object obtained by **getResultSet**. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| resultSet |[KvStoreResultSet](#getresultsetsup8sup) | Yes|**KvStoreResultSet** object to close.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + console.log('CloseResultSet success'); + let resultSet = null; + kvStore.closeResultSet(resultSet).then(() => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### getResultSize8+ ### + +getResultSize(query: Query, callback: AsyncCallback<number>): void; + +Obtains the number of results that matches the specified **Query** object. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| +| callback |AsyncCallback<number> | Yes|Callback used to return the number of results obtained.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + query.deviceId('localDeviceId'); + await kvStore.getResultSize(query, async function (err, resultSize) { + console.log('getResultSet success'); + }); + }); + } catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize8+ ### + +getResultSize(query: Query): Promise<number>; + +Obtains the number of results that matches the specified **Query** object. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<number> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + query.deviceId('localDeviceId'); + kvStore.getResultSize(query).then((resultSize) => { + console.log('getResultSet success'); + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize8+ ### + +getResultSize(deviceId: string, query: Query, callback: AsyncCallback<number>): void; + +Obtains the number of results that matches the specified **Query** object for a device. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| query |[Query](#querysup8sup) | Yes|**Query** object.| +| callback |AsyncCallback<number> | Yes|Callback used to return the number of results obtained.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('putBatch success'); + const query = new distributedData.Query(); + query.prefixKey("batch_test"); + await kvStore.getResultSize('localDeviceId', query, async function (err, resultSize) { + console.log('getResultSet success'); + }); + }); + } catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize8+ ### + +getResultSize(deviceId: string, query: Query): Promise<number>; + +Obtains the number of results that matches the specified **Query** object for a device. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| query |[Query](#querysup8sup) | Yes|**Query** object.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<number> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : distributedData.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + var query = new distributedData.Query(); + query.prefixKey("batch_test"); + kvStore.getResultSize('localDeviceId', query).then((resultSize) => { + console.log('getResultSet success'); + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### removeDeviceData8+ ### + +removeDeviceData(deviceId: string, callback: AsyncCallback<void>): void; + +Deletes data of a device from this KV store. This method uses an asynchronous callback to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| +| callback |AsyncCallback<void> | Yes|Callback used to return the result.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-001'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, async function (err,data) { + console.log('RemoveDeviceData put success'); + const deviceid = 'no_exist_device_id'; + await kvStore.removeDeviceData(deviceid, async function (err,data) { + if (err == undefined) { + console.log('removeDeviceData success'); + } else { + console.log('removeDeviceData fail'); + await kvStore.get('localDeviceId', KEY_TEST_STRING_ELEMENT, async function (err,data) { + console.log('RemoveDeviceData get success'); + }); + } + }); + }); + }catch(e) { + console.log('RemoveDeviceData e ' + e); + } + ``` + + +### removeDeviceData8+ ### + +removeDeviceData(deviceId: string): Promise<void>; + +Deletes data of a device from this KV store. This method uses a promise to return the result. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceId |string | Yes|ID of the target device.| + +- Return value + +| Type| Description| +| ------ | ------- | +|Promise<void> |Promise used to return the result.| + +- Example + + ``` + let kvStore; + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-001'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((err) => { + console.log('RemoveDeviceData put success'); + }).catch((err) => { + console.log('RemoveDeviceData put fail ' + JSON.stringify(err)); + }); + const deviceid = 'no_exist_device_id'; + kvStore.removeDeviceData(deviceid).then((err) => { + console.log('removeDeviceData success'); + }).catch((err) => { + console.log('removeDeviceData fail ' + JSON.stringify(err)); + }); + kvStore.get('localDeviceId', KEY_TEST_STRING_ELEMENT).then((data) => { + console.log('RemoveDeviceData get success data:' + data); + }).catch((err) => { + console.log('RemoveDeviceData get fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('RemoveDeviceData e ' + e); + } + ``` + + +### sync8+ ### + +sync(deviceIdList: string[], mode: SyncMode, allowedDelayMs?: number): void; + +Manually triggers KV store synchronization synchronously. + +- Parameters + +| Name| Type| Mandatory| Description| +| ----- | ------ | ---- | ----------------------- | +| deviceIdList |string[] | Yes|IDs of the devices to be synchronized.| +| mode |[SyncMode](#syncmode) | Yes|Synchronization mode, which can be **PUSH**, **PULL**, or **PUSH_PULL**.| +| allowedDelayMs |number | No|Allowed delay time, in ms.| + + +- Example + + ``` + let kvStore; + const KEY_TEST_SYNC_ELEMENT = 'key_test_sync'; + const VALUE_TEST_SYNC_ELEMENT = 'value-string-001'; + try { + kvStore.on('syncComplete', function (data) { + console.log('Sync dataChange'); + }); + kvStore.put(KEY_TEST_SYNC_ELEMENT + 'testSync101', VALUE_TEST_SYNC_ELEMENT, function (err,data) { + console.log('Sync put success'); + const devices = ['deviceList']; + const mode = distributedData.SyncMode.PULL_ONLY; + kvStore.sync(devices, mode); + }); + }catch(e) { + console.log('Sync e' + e); + } + ``` + +### on8+ ### + +on(event: 'syncComplete', syncCallback: Callback { + console.log('syncComplete put success'); + }).catch((error) => { + console.log('syncComplete put fail ' + error); + }); + }catch(e) { + console.log('syncComplete put e ' + e); + } + ``` + + +### off8+ ### + +off(event: 'syncComplete', syncCallback?: Callback Date: Sat, 5 Mar 2022 18:28:34 +0800 Subject: [PATCH 140/282] update docs Signed-off-by: annie_wangli --- .../subsys-security-communicationverify.md | 2 +- .../subsys-security-devicesecuritylevel.md | 52 +++++++++---------- .../subsys-security-rightmanagement.md | 2 +- .../subsystems/subsys-security-sigverify.md | 2 +- en/device-dev/subsystems/subsys-security.md | 10 ++-- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/en/device-dev/subsystems/subsys-security-communicationverify.md b/en/device-dev/subsystems/subsys-security-communicationverify.md index ae5dfa0636e..c991dec8f5d 100644 --- a/en/device-dev/subsystems/subsys-security-communicationverify.md +++ b/en/device-dev/subsystems/subsys-security-communicationverify.md @@ -1,4 +1,4 @@ -# Development Guidelines on IPC Authentication +# Development on IPC Authentication ## When to Use diff --git a/en/device-dev/subsystems/subsys-security-devicesecuritylevel.md b/en/device-dev/subsystems/subsys-security-devicesecuritylevel.md index a6203cb30ec..28d25ab429d 100644 --- a/en/device-dev/subsystems/subsys-security-devicesecuritylevel.md +++ b/en/device-dev/subsystems/subsys-security-devicesecuritylevel.md @@ -1,12 +1,12 @@ -# Development Guidelines on Device Security Level Management +# Development on Device Security Level Management ## Overview ### DSLM -The OpenHarmony distributed technology can converge resources of different devices and virtualize multiple devices into a Super Device. When different types of user data are hopped or processed in the Super Device, poor security capabilities of any device may threaten the security of the Super Device. +The OpenHarmony distributed technology can converge resources from different devices to form a Super Device. Poor security capabilities of any device may threaten the security of the Super Device. -The OpenHarmony Device Security Level Management (DSLM) module is introduced to manage the security levels of OpenHarmony devices. When different types of user data are hopped or processed in OpenHarmony distributed services, the DSLM APIs can be called to obtain the security levels of related devices for subsequent processing. +The Device Security Level Management (DSLM) module is introduced to manage the security levels of OpenHarmony devices. When different types of user data are hopped or processed in OpenHarmony distributed services, the DSLM APIs can be called to obtain the security levels of related devices for subsequent processing. ### Basic Concepts @@ -16,13 +16,13 @@ The OpenHarmony Device Security Level Management (DSLM) module is introduced to The following figure shows the OpenHarmony security architecture. - ![OpenHarmony system security Architecture](figure/ohos_system_security_architecture.png) + ![OpenHarmony system security architecture](figure/ohos_system_security_architecture.png) The above figure shows the typical security architecture for a single device. The architecture may vary depending on the risk level as well as the software and hardware resources of the device. The security capabilities of OpenHarmony devices are classified into five levels from SL1 to SL5, based on an industry standard security classification model and actual OpenHarmony service scenarios and device types. In the OpenHarmony ecosystem, higher security levels include all the capabilities of lower security levels by default. The figure below shows the security levels of OpenHarmony devices. ![OpenHarmony device security levels](figure/ohos_device_security_level.png) - - SL1: SL1 is the lowest security level of OpenHarmony devices. Usually equipped with a lightweight operating system and low-end microprocessors, such devices implement simple services and do not need to process sensitive data. SL1 devices are required to support software integrity protection and eliminate common errors. Devices that cannot meet the requirements can only be controlled by OpenHarmony devices and cannot control OpenHarmony devices for more complex service collaboration. + - SL1: SL1 is the lowest security level of OpenHarmony devices. Usually equipped with a lightweight operating system and low-end microprocessors, such devices implement simple services and do not need to process sensitive data. SL1 devices are required to support software integrity protection and eliminate common errors. Devices that cannot meet the requirements of SL1 can only be controlled by OpenHarmony devices. They cannot control OpenHarmony devices for more complex service collaboration. - SL2: OpenHarmony devices of SL2 can label their own data and define access control rules to implement discretionary access control (DAC). These devices must have basic anti-penetration capabilities. Devices of this level support a lightweight, secure, and isolated environment for deploying a small number of necessary security services. @@ -30,13 +30,13 @@ The OpenHarmony Device Security Level Management (DSLM) module is introduced to - SL4: OpenHarmony devices of SL4 must have simplified trusted computing base (TCB) and come with anti-tampering capabilities. The implementation of SL4 should be concise and secure enough. Adequate authentication and arbitration are required for any access to critical elements. Devices of this level have considerable anti-penetration capabilities and can defend against most software attacks. - - SL5: SL5 indicates the highest security protection capabilities for OpenHarmony devices. The system core software modules must have passed formal verification. Key hardware modules, such as the RoT and cryptographic computing engine, must be able to defend against physical attacks and attacks simulated in labs. Devices at this level must have high-security units, such as dedicated security chips, to enhance the startup, storage, and running of the root of trust (RoT). + - SL5: SL5 indicates the highest security protection capabilities for OpenHarmony devices. The system core software modules must have passed formal verification. Key hardware modules, such as the RoT and cryptographic computing engine, must be able to defend against physical attacks and attacks simulated in labs. Devices at this level must have high-security units, such as dedicated security chips, to enhance the boot, storage, and running of the root of trust (RoT). - DSLM - DSLM is a module for OpenHarmony device security level management. It verifies and updates device security level information for OpenHarmony devices in collaboration. It also provides an interface for querying the security level of each device. + DSLM is a module to manage the security levels of OpenHarmony devices. It verifies and updates device security level information for OpenHarmony devices in collaboration. It also provides an interface for querying the security level of each device. -### WOrking Principles +### Working Principles The security level of each device in a Super Device provides the decision-making criteria for processing or hopping various user data. For example, the distributed file storage service does not allow sensitive data to be stored on devices with security level lower than SL3. @@ -48,7 +48,7 @@ The default security level of OpenHarmony devices is SL1. Device manufacturers c ### When to Use -When processing or hopping various user data, the subsystems can invoke the APIs provided by the DSLM module to obtain the security level information of related devices. Then, the subsystems determine the subsequent processing based on the security level and data to be processed. +When processing or hopping various user data, a subsystem can invoke the APIs provided by the DSLM module to obtain the security level information of related devices. Then, the subsystems determine the subsequent processing based on the security level and data to be processed. ### Available APIs @@ -68,7 +68,7 @@ All the APIs are native C interfaces for implementing underlying capabilities an external_deps += [ "device_security_level:dslm_sdk" ] ``` -2. Add the header files of the dependencies. +2. Add the header files of dependencies. ```cpp #include "device_security_defines.h" // Header file for defining critical data structures. @@ -78,7 +78,7 @@ All the APIs are native C interfaces for implementing underlying capabilities an 3. Call APIs. ```cpp - // Obtain the unique device identifier (UDID). + // Obtain the unique device identifier (UDID) of the device of which the security level is to be queried. const DeviceIdentify *device = GetDestDeviceUdid(); // Obtain the RequestOption. @@ -103,10 +103,10 @@ All the APIs are native C interfaces for implementing underlying capabilities an ### Development Example -A service with file sharing function needs to be developed. To prevent sensitive files from being shared unintentionally, the following judgments must be performed before any file is sent: +A service with the file sharing function needs to be developed. To prevent sensitive files from being shared unintentionally, the following judgments must be performed before any file is sent: -- If the security level of the destination device is SL3 or higher, send the file. -- If the security level of the destination device is lower than SL3, deny the file transfer and display a dialog box to notify the user. +- If the security level of the destination device is SL3 or higher, the service sends the file. +- If the security level of the destination device is lower than SL3, the service denies the file transfer and display a dialog box to notify the user. **Example of synchronously obtaining the device security level** @@ -181,13 +181,13 @@ void CheckDestDeviceSecurityLevelAsync(const DeviceIdentify *device, RequestOpti ### Device Security Level Credential -To ensure its integrity and non-repudiation, the security level information must be encapsulated in a "device security level credential" (credential for short) file for transmission between devices. In addition to the security level information of the device, the credential may include device attributes, such as the device model and version. Moreover, the credential must be signed using the public key infrastructure (PKI) technology. Other basic security capabilities of OpenHarmony, such as [Device Authentication] (https://gitee.com/openharmony/security_deviceauth) and [HUKS](https://gitee.com/openharmony/security_huks), are used to ensure secure transmission of credentials. +To ensure its integrity and non-repudiation, the security level information must be encapsulated in a "device security level credential" (credential for short) file for transmission between devices. In addition to the security level information of the device, the credential may include device attributes, such as the device model and version. Moreover, the credential must be signed using the public key infrastructure (PKI) technology. Other basic security capabilities of OpenHarmony, such as [Device Authentication](https://gitee.com/openharmony/security_deviceauth) and [HUKS](https://gitee.com/openharmony/security_huks), are used to ensure secure transmission of credentials. ### Default Implementation -The DSLM module provides default implementation of security level information synchronization and verification. It is assumed that the security level of all OpenHarmony devices is SL1, and a loose verification scheme is used. For details, see the [source code] (https://gitee.com/openharmony/security_device_security_level/tree/master/oem_property/ohos). +The DSLM module provides default implementation of security level information synchronization and verification. It is assumed that the security level of all OpenHarmony devices is SL1, and a loose verification scheme is used. For details, see the [source code](https://gitee.com/openharmony/security_device_security_level/tree/master/oem_property/ohos). -You can change the device security level as required. For details about the OpenHarmony device security levels, see [Basic Concepts](#Basic_Concepts). You can also use more severe verification schemes, including but are not limited to using device-specific credential, periodically downloading updated credentials from a server and strictly authenticating the issuer and validity period of the credentials, and using Trusted Execution Environment (TEE) or even Secure Element (SE) for signing credential files. +You can change the device security level as required. For details about the OpenHarmony device security levels, see [Basic Concepts](#Basic_Concepts). You can also use more severe verification schemes, including but are not limited to using device-specific credential, periodically downloading updated credentials from a server and strictly authenticating the issuer and validity period of the credentials, and using Trusted Execution Environment (TEE) or even Secure Element (SE) to sign credential files. ### Generating a Credential File @@ -230,7 +230,7 @@ Construct the payload in a JSON string. The following is an example: } ``` -Encode the payload string to Base64 format obtain ``. +Encode the payload string to Base64 format to obtain ``. ```undefined eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIm9ob3MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4yLjIiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDEiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTAyNTkiLCAidmVyc2lvbiI6ICIxLjAuMSJ9 @@ -285,12 +285,12 @@ MGUCMDb9xoiFzTWVkHDU3VWSVQ59gLyw4TchZ0+eQ3vUfQsLt3Hkg0r7a/PmhkNr3X/mTgIxAIywIRE6 > ![notice](../public_sys-resources/icon-notice.gif)**NOTICE** > > This step must be performed in a secure and reliable environment, for example, a cryptographic machine that meets related security requirements, to ensure that the key used for signature is not disclosed. -> The key pairs involved in this step do not need to be generated each time. Secure key pairs can be directly reused. +> The key pairs involved in this step do not need to be generated each time. Secure key pairs can be reused. ##### 4.1 Generate level-3 signature verification information. 1. Generate an ECDSA key pair `` and `` for a level-2 signature. -2. Use `` to sign `` (generated in 3.2) to obtain ``. +2. Use `` to sign `` (generated in step 3.2) to obtain ``. 3. Combine `` and `` into a JSON string. The following is an example: ``` json @@ -303,7 +303,7 @@ MGUCMDb9xoiFzTWVkHDU3VWSVQ59gLyw4TchZ0+eQ3vUfQsLt3Hkg0r7a/PmhkNr3X/mTgIxAIywIRE6 ##### 4.2 Generate level-2 signature verification information. 1. Generate an ECDSA key pair `` and `` for a level-1 signature. -2. Use `` to sign `` (generated in 4.1) to obtain ``. +2. Use `` to sign `` (generated in step 4.1) to obtain ``. 3. Combine `` and `` into a JSON string. The following is an example: ``` json @@ -315,7 +315,7 @@ MGUCMDb9xoiFzTWVkHDU3VWSVQ59gLyw4TchZ0+eQ3vUfQsLt3Hkg0r7a/PmhkNr3X/mTgIxAIywIRE6 ##### 4.3 Generate root signature verification information. -1. Use `` to sign the `` (generated in 4.2) to obtain `` (a self-signature). +1. Use `` to sign the `` (generated in step 4.2) to obtain `` (a self-signature). 2. Combine `` and `` into a JSON string. The following is an example: ``` json @@ -468,13 +468,13 @@ You can use the tool as follows: ## FAQs -- Q: How can I use the credential tool in a real production environment? +- Q: How can I use the credential tool in a production environment? - A: The credential tool cannot be directly used in the production environment. It is used to demonstrate the format and generation process of credentials. In a real production environment, you are advised to generate credentials and save related keys in a cryptographic machine that meets related security requirements. + A: The credential tool cannot be directly used in the production environment. It is used to demonstrate the format and generation process of credentials. In the production environment, you are advised to generate credentials and save related keys in a cryptographic machine that meets related security requirements. -- Q: How do I verify a credential in a real production environment? +- Q: How do I verify a credential in a production environment? - A: You are advised to use a properly kept private key to sign the credential and use more severe signature verification process instead of the default verification process provided by the DSLM module. For example, allow only the credentials issued by trusted certification authority (CA), and bind the credential and device ID to enhance the security. + A: You are advised to use a properly kept private key to sign the credential and use more severe signature verification process instead of the default verification process provided by the DSLM module. For example, allow only the credentials issued by trusted certification authorities (CAs), and bind the credential and device ID to enhance the security. ## References diff --git a/en/device-dev/subsystems/subsys-security-rightmanagement.md b/en/device-dev/subsystems/subsys-security-rightmanagement.md index 4505ed49f0c..38a63afd8bd 100644 --- a/en/device-dev/subsystems/subsys-security-rightmanagement.md +++ b/en/device-dev/subsystems/subsys-security-rightmanagement.md @@ -1,4 +1,4 @@ -# Development Guidelines on Application Permission Management +# Development on Application Permission Management ## How Application Permission Management Works diff --git a/en/device-dev/subsystems/subsys-security-sigverify.md b/en/device-dev/subsystems/subsys-security-sigverify.md index 482e70032b2..66ec4fba0f6 100644 --- a/en/device-dev/subsystems/subsys-security-sigverify.md +++ b/en/device-dev/subsystems/subsys-security-sigverify.md @@ -1,4 +1,4 @@ -# Development Guidelines on Application Signature Verification +# Development on Application Signature Verification ## When to Use diff --git a/en/device-dev/subsystems/subsys-security.md b/en/device-dev/subsystems/subsys-security.md index aa27b416d52..bcd80d87f49 100644 --- a/en/device-dev/subsystems/subsys-security.md +++ b/en/device-dev/subsystems/subsys-security.md @@ -2,12 +2,12 @@ - **[Overview](subsys-security-overview.md)** -- **[Development Guidelines on Application Signature Verification] (subsys-security-sigverify.md)** +- **[Development on Application Signature Verification] (subsys-security-sigverify.md)** -- **[Development Guidelines on Application Permission Management](subsys-security-rightmanagement.md)** +- **[Development on Application Permission Management](subsys-security-rightmanagement.md)** -- **[Development Guidelines on IPC Authentication](subsys-security-communicationverify.md)** +- **[Development on IPC Authentication](subsys-security-communicationverify.md)** -- **[Development Guidelines on Device Security Level Management](subsys-security-devicesecuritylevel.md)** +- **[Development on Device Security Level Management](subsys-security-devicesecuritylevel.md)** -- **[Development Guidelines on Key Management](subsys-security-huks.md)** +- **[Development on Key Management](subsys-security-huks.md)** -- Gitee From 2bd6e6ce48de1782eb8b8159f18a87a79cb3d403 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Sun, 6 Mar 2022 10:50:36 +0800 Subject: [PATCH 141/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 226 +++++++++--------- 1 file changed, 113 insertions(+), 113 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 7723c69dc0e..0f2fad66ffc 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -1,11 +1,13 @@ 媒体库管理 ========== - +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 该组件从API Version 6开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + 导入模块 --------- ``` -import medialibrary from '@ohos.multimedia.medialibrary'; +import mediaLibrary from '@ohos.multimedia.medialibrary'; ``` @@ -19,7 +21,7 @@ function getMediaLibrary(context: Context): MediaLibrary; **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core -**参数:** +**参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------- | ---- | -------------------- | @@ -29,19 +31,18 @@ function getMediaLibrary(context: Context): MediaLibrary; | 类型 | 说明 | | ------------ | :----- | -| MediaLibrary | 媒体库实例 | +| mediaLibrary | 媒体库实例 | **示例:** ``` import featureAbility from '@ohos.ability.featureAbility'; -import mediaLibrary from '@ohos.multimedia.mediaLibrary'; var context = featureAbility.getContext() -var mediaLibrary = mediaLibrary.getMediaLibrary(context); +var media = mediaLibrary.getMediaLibrary(context); ``` -## medialibrary.getFileAssets +## mediaLibrary.getFileAssets8+ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; @@ -68,9 +69,9 @@ let imagesfetchOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], }; -medialibrary.getFileAssets(imagesfetchOp, (error, fetchFileResult) => { +mediaLibrary.getFileAssets(imagesfetchOp, (error, fetchFileResult) => { if (fetchFileResult != undefined) { - console.info('MediaLibraryTest : ASSET_CALLBACK fetchFileResult success'); + console.info('mediaLibraryTest : ASSET_CALLBACK fetchFileResult success'); fetchFileResult.getAllObject((err, fileAssetList) => { if (fileAssetList != undefined) { fileAssetList.forEach(getAllObjectInfo); @@ -79,7 +80,7 @@ medialibrary.getFileAssets(imagesfetchOp, (error, fetchFileResult) => { } }); ``` -## medialibrary.getFileAssets +## mediaLibrary.getFileAssets8+ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; @@ -110,14 +111,14 @@ let imagesfetchOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], }; -medialibrary.getFileAssets(imagesfetchOp).then(function(fetchFileResult){ +mediaLibrary.getFileAssets(imagesfetchOp).then(function(fetchFileResult){ console.info("getFileAssets successfully:"+ JSON.stringify(dir)); }).catch(function(err){ console.info("getFileAssets failed with error:"+ err); }); ``` -## medialibrary.on +## mediaLibrary.on8+ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; @@ -131,17 +132,17 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
’audioChange‘:  音频文件变更
‘videoChange’:  视频文件变更
‘'fileChange':  文件变更
‘remoteFileChange’: 注册设备上文件变更 | +| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
'audioChange':  音频文件变更
'videoChange':  视频文件变更
'fileChange':  文件变更
'remoteFileChange': 注册设备上文件变更 | | callback | callback<void> | 是 | 回调返回空 | **示例:** ``` -medialibrary.on('imageChange', () => { +mediaLibrary.on('imageChange', () => { // image file had changed, do something }) ``` -## medialibrary.off +## mediaLibrary.off8+ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback?: Callback<void>): void; @@ -157,24 +158,24 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
’audioChange‘:  音频文件变更
‘videoChange’:  视频文件变更
‘'fileChange':  文件变更
‘remoteFileChange’: 注册设备上文件变更 | +| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
'audioChange':  音频文件变更
'videoChange':  视频文件变更
'fileChange':  文件变更
'remoteFileChange': 注册设备上文件变更 | | callback | callback<void> | 否 | 回调返回空 | **示例:** ``` -medialibrary.off('imageChange', () => { +mediaLibrary.off('imageChange', () => { // stop listening success }) ``` -## medialibrary.createAsset +## mediaLibrary.createAsset 8+ createAsset(mediaType: MediaType, displayName: string, relativePath: string, callback: AsyncCallback<FileAsset>): void; 创建媒体资源,使用callback方式返回结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -193,7 +194,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal // 使用Callback方式创建Image类型文件 let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; -medialibrary.createAsset(mediaType, “imageCallBack.jpg”, path, (err, fileAsset) => { +mediaLibrary.createAsset(mediaType, 'imageCallBack.jpg', path, (err, fileAsset) => { if (fileAsset != undefined) { console.info('createAsset successfully, message = ' + err); } else { @@ -202,13 +203,13 @@ medialibrary.createAsset(mediaType, “imageCallBack.jpg”, path, (err, fileAss }); ``` -## medialibrary.createAsset +## mediaLibrary.createAsset8+ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Promise<FileAsset>; 创建媒体资源,使用Promise方式返回结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -232,14 +233,14 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr // 使用Promise方式创建Image类型文件 let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; -medialibrary.createAsset(mediaType, "image01.jpg", path).then (function (asset) { +mediaLibrary.createAsset(mediaType, "image01.jpg", path).then (function (asset) { console.info("createAsset successfully:"+ JSON.stringify(asset)); }).catch(function(err){ console.info("createAsset failed with error:"+ err); }); ``` -## medialibrary.getPublicDirectory +## mediaLibrary.getPublicDirectory8+ getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): void; @@ -261,16 +262,16 @@ getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): ``` let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; -media.getPublicDirectory(DIR_CAMERA,(err, dicResult) => { +media.getPublicDirectory(DIR_CAMERA, (err, dicResult) => { if (dicResult == 'camera/') { - console.info('MediaLibraryTest : getPublicDirectory'); + console.info('mediaLibraryTest : getPublicDirectory passed'); } else { - console.info('MediaLibraryTest : getPublicDirectory failed'); + console.info('mediaLibraryTest : getPublicDirectory failed'); } }); ``` -## medialibrary.getPublicDirectory +## mediaLibrary.getPublicDirectory8+ getPublicDirectory(type: DirectoryType): Promise<string>; @@ -306,7 +307,7 @@ async function (done) { } ``` -## medialibrary.getAlbums +## mediaLibrary.getAlbums6+ getAlbums(options: MediaFetchOptions, callback: AsyncCallback): void; @@ -330,7 +331,7 @@ let AlbumNoArgsfetchOp = { selections: '', selectionArgs: [], }; -medialibrary.getAlbums(AlbumNoArgsfetchOp, (err, albumList) => { +mediaLibrary.getAlbums(AlbumNoArgsfetchOp, (err, albumList) => { if (albumList != undefined) { const album = albumList[0]; console.info('album.albumName = ' + album.albumName); @@ -341,7 +342,7 @@ medialibrary.getAlbums(AlbumNoArgsfetchOp, (err, albumList) => { }) ``` -## medialibrary.getAlbums +## mediaLibrary.getAlbums6+ getAlbums(options: MediaFetchOptions): Promise; @@ -370,18 +371,18 @@ let AlbumNoArgsfetchOp = { selections: '', selectionArgs: [], }; -medialibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ +mediaLibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ console.info("getAlbums successfully:"+ JSON.stringify(albumList)); }).catch(function(err){ console.info("getAlbums failed with error:"+ err); }); ``` -## medialibrary.release +## mediaLibrary.release8+ release(callback: AsyncCallback<void>): void; -释放MediaLibrary实例,当用户确认后续不再使用MediaLibrary实例中的方法后调用release方法释放MediaLibrary实例。 +释放mediaLibrary实例,当用户确认后续不再使用mediaLibrary实例中的方法后调用release方法释放mediaLibrary实例。 **需要权限**:无 @@ -396,17 +397,17 @@ release(callback: AsyncCallback<void>): void; **示例:** ``` -var mediaLibrary = mediaLibrary.getMediaLibrary(context); -mediaLibrary.release((err, data) => { +var media = mediaLibrary.getMediaLibrary(context); +media.release((err, data) => { // do something }); ``` -## medialibrary.release +## mediaLibrary.release8+ release(): Promise<void>; -释放MediaLibrary实例,当用户确认后续不再使用MediaLibrary实例中的方法后调用release方法释放MediaLibrary实例。 +释放mediaLibrary实例,当用户确认后续不再使用mediaLibrary实例中的方法后调用release方法释放mediaLibrary实例。 **需要权限**:无 @@ -421,11 +422,11 @@ release(): Promise<void>; **示例:** ``` -var mediaLibrary = mediaLibrary.getMediaLibrary(context); -mediaLibrary.release() +var media = mediaLibrary.getMediaLibrary(context); +media.release() ``` -## FileAsset.isDirectory +## FileAsset.isDirectory8+ isDirectory(callback: AsyncCallback<boolean>): void; @@ -460,7 +461,7 @@ async function (done) { } ``` -## FileAsset.isDirectory +## FileAsset.isDirectory8+ isDirectory():Promise<boolean>; @@ -497,13 +498,13 @@ async function (done) { } ``` -## FileAsset.commitModify +## FileAsset.commitModify8+ commitModify(callback: AsyncCallback<void>): void; 修改文件的元数据,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -526,20 +527,20 @@ async function (done) { }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); - asset.title = ‘newtitle'; + asset.title = 'newtitle'; asset.commitModify(() => { console.info('commitModify success'); - } + }); } ``` -## FileAsset.commitModify +## FileAsset.commitModify8+ commitModify(): Promise<void>; 修改文件的元数据,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -562,18 +563,18 @@ async function (done) { }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); - asset.title = ‘newtitle'; + asset.title = 'newtitle'; asset.commitModify(); } ``` -## FileAsset.open +## FileAsset.open8+ open(mode: string, callback: AsyncCallback<number>): void; 打开当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA(‘w’模式打开) +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA('w'模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -601,13 +602,13 @@ async function (done) { } ``` -## FileAsset.open +## FileAsset.open8+ open(mode: string): Promise<number>; 打开当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA(‘w’模式打开) +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA('w'模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -640,13 +641,13 @@ async function (done) { } ``` -## FileAsset.close +## FileAsset.close8+ close(fd: number, callback: AsyncCallback<void>): void; 关闭当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -672,8 +673,8 @@ async function (done) { const asset = await fetchFileResult.getFirstObject(); asset.close(fd, (closeErr) => { if (closeErr != undefined) { - console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); - console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + console.info('mediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('mediaLibraryTest : ASSET_CALLBACK : FAIL'); } else { console.info("=======asset.close success====>"); } @@ -681,13 +682,13 @@ async function (done) { } ``` -## FileAsset.close +## FileAsset.close8+ close(fd: number): Promise<void>; 关闭当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -718,8 +719,8 @@ async function (done) { const asset = await fetchFileResult.getFirstObject(); asset.close(fd).then((closeErr) => { if (closeErr != undefined) { - console.info('MediaLibraryTest : close : FAIL ' + closeErr.message); - console.info('MediaLibraryTest : ASSET_CALLBACK : FAIL'); + console.info('mediaLibraryTest : close : FAIL ' + closeErr.message); + console.info('mediaLibraryTest : ASSET_CALLBACK : FAIL'); } else { console.info("=======asset.close success====>"); @@ -728,7 +729,7 @@ async function (done) { } ``` -## FileAsset.getThumbnail +## FileAsset.getThumbnail8+ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; @@ -758,12 +759,12 @@ async function (done) { const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); asset.getThumbnail((err, pixelmap) => { - console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); + console.info('mediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); } ``` -## FileAsset.getThumbnail +## FileAsset.getThumbnail8+ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; @@ -794,12 +795,12 @@ async function (done) { const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); asset.getThumbnail(size, (err, pixelmap) => { - console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); + console.info('mediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); } ``` -## FileAsset.getThumbnail +## FileAsset.getThumbnail8+ getThumbnail(size?: Size): Promise<image.PixelMap>; @@ -835,18 +836,18 @@ async function (done) { const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); asset.getThumbnail(size, (err, pixelmap) => { - console.info('MediaLibraryTest : getThumbnail Successfull '+ pixelmap); + console.info('mediaLibraryTest : getThumbnail Successfull '+ pixelmap); }); } ``` -## FileAsset.favorite +## FileAsset.favorite8+ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; 将文件设置为收藏文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -876,13 +877,13 @@ async function (done) { } ``` -## FileAsset.favorite +## FileAsset.favorite8+ favorite(isFavorite: boolean): Promise<void>; 将文件设置为收藏文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -919,7 +920,7 @@ async function (done) { } ``` -## FileAsset.isFavorite +## FileAsset.isFavorite8+ isFavorite(callback: AsyncCallback<boolean>): void; @@ -958,7 +959,7 @@ async function (done) { } ``` -## FileAsset.isFavorite +## FileAsset.isFavorite8+ isFavorite():Promise<boolean>; @@ -995,7 +996,7 @@ async function (done) { } ``` -## FileAsset.trash +## FileAsset.trash8+ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; @@ -1003,7 +1004,7 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; 放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1029,12 +1030,12 @@ async function (done) { const asset = await fetchFileResult.getFirstObject(); asset.trash(true, trashCallBack); function trashCallBack(err, trash) { - console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); + console.info('mediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK trash'); } } ``` -## FileAsset.trash +## FileAsset.trash8+ trash(isTrash: boolean,): Promise<void>; @@ -1042,7 +1043,7 @@ trash(isTrash: boolean,): Promise<void>; 放入垃圾文件夹的文件不会被真正删除,可以通过isTrash = false参数恢复成正常文件。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1079,7 +1080,7 @@ async function (done) { } ``` -## FileAsset.isTrash +## FileAsset.isTrash8+ isTrash(callback: AsyncCallback<boolean>): void; @@ -1111,19 +1112,19 @@ async function (done) { asset.isTrash(isTrashCallBack); function isTrashCallBack(err, isTrash) { if (isTrash == true) { - console.info('MediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash); + console.info('mediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash); asset.trash(true, trashCallBack); } else { - console.info('MediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err); - console.info('MediaLibraryTest : ASSET_CALLBACK isTrash : FAIL'); + console.info('mediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err); + console.info('mediaLibraryTest : ASSET_CALLBACK isTrash : FAIL'); } } } ``` -## FileAsset.isTrash +## FileAsset.isTrash8+ isTrash():Promise<boolean>; @@ -1164,7 +1165,7 @@ async function (done) { 文件检索结果集。 -## FetchFileResult.getCount +## FetchFileResult.getCount8+ getCount(): number; @@ -1195,7 +1196,7 @@ async function (done) { } ``` -## FetchFileResult.isAfterLast +## FetchFileResult.isAfterLast8+ isAfterLast(): boolean; @@ -1224,15 +1225,15 @@ async function (done) { }; let fetchFileResult = await media.getFileAssets(getImageOp); const fetchCount = fetchFileResult.getCount(); - console.info('MediaLibraryTest : count:' + fetchCount); + console.info('mediaLibraryTest : count:' + fetchCount); let fileAsset = await fetchFileResult.getFirstObject(); for (var i = 1; i < fetchCount; i++) { fileAsset = await fetchFileResult.getNextObject(); if(i == fetchCount - 1) { - console.info('MediaLibraryTest : isLast'); + console.info('mediaLibraryTest : isLast'); var result = fetchFileResult.isAfterLast(); - console.info('MediaLibraryTest : isAfterLast:' + result); - console.info('MediaLibraryTest : isAfterLast end'); + console.info('mediaLibraryTest : isAfterLast:' + result); + console.info('mediaLibraryTest : isAfterLast end'); fetchFileResult.close(); } @@ -1240,7 +1241,7 @@ async function (done) { } ``` -## FetchFileResult.close +## FetchFileResult.close8+ close(): void; @@ -1266,7 +1267,7 @@ async function (done) { } ``` -## FetchFileResult.getFirstObject +## FetchFileResult.getFirstObject8+ getFirstObject(callback: AsyncCallback<FileAsset>): void; @@ -1304,7 +1305,7 @@ async function (done) { } ``` -## FetchFileResult.getFirstObject +## FetchFileResult.getFirstObject8+ getFirstObject(): Promise<FileAsset>; @@ -1341,7 +1342,7 @@ async function (done) { } ``` -## FetchFileResult.getNextObject +## FetchFileResult.getNextObject8+ getNextObject(callback: AsyncCallback<FileAsset>): void; @@ -1379,7 +1380,7 @@ async function (done) { } ``` -## FetchFileResult.getNextObject +## FetchFileResult.getNextObject8+ getNextObject(): Promise<FileAsset>; @@ -1408,12 +1409,12 @@ async function (done) { }; let fetchFileResult = await media.getFileAssets(getImageOp); const fetchCount = fetchFileResult.getCount(); - console.info('MediaLibraryTest : count:' + fetchCount); + console.info('mediaLibraryTest : count:' + fetchCount); fileAsset = await fetchFileResult.getNextObject(); } ``` -## FetchFileResult.getLastObject +## FetchFileResult.getLastObject8+ getLastObject(callback: AsyncCallback<FileAsset>): void; @@ -1451,7 +1452,7 @@ async function (done) { } ``` -## FetchFileResult.getLastObject +## FetchFileResult.getLastObject8+ getLastObject(): Promise<FileAsset>; @@ -1483,7 +1484,7 @@ async function (done) { } ``` -## FetchFileResult.getPositionObject +## FetchFileResult.getPositionObject8+ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void; @@ -1512,7 +1513,7 @@ async function (done) { extendArgs: "LIMIT 0,10", }; let fetchFileResult = await media.getFileAssets(getImageOp); - fetchFileResult.getPositionObject(1,(err, value) => { + fetchFileResult.getPositionObject(0, (err, value) => { if (err) { console.error('Failed '); return; @@ -1522,7 +1523,7 @@ async function (done) { } ``` -## FetchFileResult.getPositionObject +## FetchFileResult.getPositionObject8+ getPositionObject(index: number): Promise<FileAsset>; @@ -1556,7 +1557,7 @@ async function (done) { extendArgs: "LIMIT 0,10", }; let fetchFileResult = await media.getFileAssets(getImageOp); - fetchFileResult.getPositionObject(1,(err, value) => { + fetchFileResult.getPositionObject(1, (err, value) => { if (err) { console.error('Failed '); return; @@ -1566,7 +1567,7 @@ async function (done) { } ``` -## FetchFileResult.getAllObject +## FetchFileResult.getAllObject8+ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; @@ -1604,7 +1605,7 @@ async function (done) { } ``` -## FetchFileResult.getAllObject +## FetchFileResult.getAllObject8+ getAllObject(): Promise<Array<FileAsset>>; @@ -1636,13 +1637,13 @@ async function (done) { } ``` -## Album.commitModify +## Album.commitModify8+ commitModify(callback: AsyncCallback<void>): void; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1673,13 +1674,13 @@ async function (done) { } ``` -## Album.commitModify +## Album.commitModify8+ commitModify(): Promise<void>; 更新相册属性修改到数据库中。 -**需要权限**:ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1708,7 +1709,7 @@ async function (done) { } ``` -## Album.getFileAssets +## Album.getFileAssets8+ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; @@ -1736,14 +1737,13 @@ async function (done) { const albumList = await media.getAlbums(AlbumNoArgsfetchOp); const album = albumList[0]; album.getFileAssets(fileNoArgsfetchOp, getFileAssetsCallBack); - }) function getFileAssetsCallBack(err, fetchFileResult) { // do something } } ``` -## Album.getFileAssets +## Album.getFileAssets8+ getFileAssets(options?: MediaFetchOptions): Promise<FetchFileResult>; @@ -1783,7 +1783,7 @@ async function (done) { } ``` -## PeerInfo +## PeerInfo8+ 注册设备信息。 @@ -1908,7 +1908,7 @@ DeviceType | TYPE_CAR | 5 | 车载设备 | | TYPE_TV | 6 | 电视设备 | -## MediaFetchOptions +## MediaFetchOptions8+ 检索条件。 @@ -1921,7 +1921,7 @@ DeviceType | networkId | string | 是 | 是 | 否 |注册设备网络ID | | extendArgs | string | 是 | 是 | 否 |扩展的检索参数 | -## Size +## Size8+ 图片尺寸。 -- Gitee From 5437981e3ef83806743d0434532c9a171db93e8e Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Sun, 6 Mar 2022 14:40:43 +0800 Subject: [PATCH 142/282] update docs Signed-off-by: annie_wangli --- .../apis/js-apis-distributed-data.md | 271 +++++++++--------- 1 file changed, 135 insertions(+), 136 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-distributed-data.md b/en/application-dev/reference/apis/js-apis-distributed-data.md index 5cedea5c5ab..3f15e89a228 100644 --- a/en/application-dev/reference/apis/js-apis-distributed-data.md +++ b/en/application-dev/reference/apis/js-apis-distributed-data.md @@ -1,7 +1,6 @@ # Distributed Data Management >![](../../public_sys-resources/icon-note.gif) **NOTE** -> >The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -62,17 +61,17 @@ createKVManager(config: KVManagerConfig): Promise<KVManager> Creates a **KVManager** object to manage KV stores. This method uses a promise to return the result. - Parameters - + | Name| Type| Mandatory| Description| | ----- | ------ | ------ | ------ | | config |[KVManagerConfig](#kvmanager) | Yes| Configuration of the **KVManager** object, including the bundle name and user information of the caller.| - + - Return value | Type| Description| | -------- | -------- | | Promise<[KVManager](#kvmanager)> | Promise used to return the **KVManager** object created.| - + - Example ``` @@ -230,7 +229,7 @@ Closes a KV store. This method uses an asynchronous callback to return the resul | Name| Type| Mandatory| Description| | ------- | ----------------- | ---- | --------------------------- | -| appId | string | Yes| Bundle name of the app used by the KV store.| +| appId | string | Yes| Bundle name of the app that invokes the KV store.| | storeId | string | Yes| Unique identifier of the KV store to close. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| | kvStore | [KVStore](#kvstore) | Yes| KV store to close.| | callback | AsyncCallback<void> | Yes| Callback used to return the result. If the KV store is closed, **true** will be returned. Otherwise, **false** will be returned.| @@ -273,7 +272,7 @@ Closes a KV store. This method uses a promise to return the result. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------------- | -| appId | string | Yes| Bundle name of the app used by the KV store.| +| appId | string | Yes| Bundle name of the app that invokes the KV store.| | storeId | string | Yes| Unique identifier of the KV store to close. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| | kvStore | [KVStore](#kvstore) | Yes| KV store to close.| @@ -325,7 +324,7 @@ Deletes a KV store. This method uses an asynchronous callback to return the resu | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| appId | string | Yes| Bundle name of the app used by the KV store.| +| appId | string | Yes| Bundle name of the app that invokes the KV store.| | storeId | string | Yes| Unique identifier of the KV store to delete. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| | callback | AsyncCallback<void> | Yes| Callback used to return the result. If the KV store is deleted, **true** will be returned. Otherwise, **false** will be returned.| @@ -364,10 +363,10 @@ deleteKVStore(appId: string, storeId: string): Promise<void>; Deletes a KV store. This method uses a promise to return the result. - Parameters - + | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| appId | string | Yes| Bundle name of the app used by the KV store.| +| appId | string | Yes| Bundle name of the app that invokes the KV store.| | storeId | string | Yes| Unique identifier of the KV store to delete. The length cannot exceed the value of [MAX\_STORE\_ID_LENGTH](#constants).| @@ -419,7 +418,7 @@ Obtains the IDs of all the KV stores that are created using **getKvStore** and h | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| appId | string | Yes| Bundle name of the app used by the KV store.| +| appId | string | Yes| Bundle name of the app that invokes the KV store.| | callback | AsyncCallback<void> | Yes|Callback used to return the KV store IDs obtained. | - Example @@ -447,11 +446,11 @@ Obtains the IDs of all the KV stores that are created using **getKvStore** and h | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| appId | string | Yes| Bundle name of the app used by the KV store.| +| appId | string | Yes| Bundle name of the app that invokes the KV store.| - Return value - + | Type| Description| | ------------- | -------------- | | Promise<string[]>| Promise used to return the KV store IDs obtained.| @@ -518,7 +517,7 @@ Unsubscribes from the **distributedDataServiceDie** events. This method uses a s | ----- | ------ | ---- | ----------------------- | | event | 'distributedDataServiceDie' | Yes| Type of events to unsubscribe from. | | deathCallback | Callback<void> | No| Callback used to return the **distributedDataServiceDie** events.| - + - Example @@ -545,7 +544,7 @@ Provides KV store configuration. | createIfMissing | boolean | No| Whether to create a KV store if no database file exists. By default, a KV store is created.| | encrypt | boolean | No|Whether to encrypt database files. By default, database files are not encrypted.| | backup | boolean | No|Whether to back up database files. By default, database files are backed up. | -| autoSync | boolean | No|Whether database files are automatically synchronized. By default, database files are not automatically synchronized.| +| autoSync | boolean | No|Whether to automatically synchronize database files. By default, database files are not automatically synchronized.| | kvStoreType | [KVStoreType](#kvstoretype) | No|Type of the KV store to create. By default, a device KV store is created. The device KV store stores data for multiple devices that collaborate with each other.| | securityLevel | [SecurityLevel](#securitylevel) | No|Security level of the KV store. By default, the security level is not set.| @@ -585,7 +584,7 @@ Defines the KV store constants. | MAX\_KEY_LENGTH| 1024 | Maximum length (in bytes) of a key in the KV store.| | MAX\_VALUE_LENGTH| 4194303 | Maximum length (in bytes) of a value in the KV store.| | MAX\_KEY\_LENGTH\_DEVICE| 896 | Maximum length of the device coordinate key.| -| MAX\_STORE\_ID\_LENGTH| 128 | Maximum length (in bytes) of the KV store ID.| +| MAX\_STORE\_ID\_LENGTH| 128 | Maximum length (in bytes) of a KV store ID.| | MAX\_QUERY_LENGTH| 512000 | Maximum query length.| | MAX\_BATCH_SIZE| 128 | Maximum size of a batch operation.| @@ -633,8 +632,8 @@ Adds a child node to this **FieldNode**. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| child | [FieldNode](#FieldNode) | Yes| Field node to add.| - +| child | [FieldNode](#FieldNode) | Yes| Child node to add.| + - Return value @@ -694,7 +693,7 @@ Obtains the field name. ## KvStoreResultSet8+ ## -Provides methods to obtain the KV Store result set and query or move the data read position. Before calling **KvStoreResultSet**, you must create a **KvStore** instance using **KvStore**. +Provides methods to obtain the KV store result set and query or move the data read position. Before calling any method in **KvStoreResultSet**, you must use **KvStore** to create a **KvStore** instance. ### getCount8+ ### @@ -936,7 +935,7 @@ Moves the data read position from 0 to an absolute position. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| position | number | Yes|Absolute position.| +| position | number | Yes|Absolute position to move to.| - Return value @@ -1161,14 +1160,14 @@ Resets the **Query** object that contains common query options. equalTo(field: string, value: number|string|boolean): Query; -Creates a **Query** object to match the specified field and value equal to the specified value. +Creates a **Query** object to match the specified field whose value is equal to the specified value. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| -| value | number/string/boolean | Yes| Value to match.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value specified.| - Return value @@ -1194,13 +1193,13 @@ Creates a **Query** object to match the specified field and value equal to the s notEqualTo(field: string, value: number|string|boolean): Query; -Creates a **Query** object to match the specified field and value not equal to the specified value. +Creates a **Query** object to match the specified field whose value is not equal to the specified value. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | value | number/string/boolean | Yes| Value specified.| - Return value @@ -1227,13 +1226,13 @@ Creates a **Query** object to match the specified field and value not equal to t greaterThan(field: string, value: number|string|boolean): Query; -Creates a **Query** object to match the specified field and value greater than the specified value. +Creates a **Query** object to match the specified field whose value is greater than the specified value. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | value | number/string/boolean | Yes| Value specified.| - Return value @@ -1260,14 +1259,14 @@ Creates a **Query** object to match the specified field and value greater than t lessThan(field: string, value: number|string): Query; -Creates a **Query** object to match the specified field and value less than the specified value. +Creates a **Query** object to match the specified field whose value is less than the specified value. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| -| value | number/string/boolean | Yes| Value to match.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value specified.| - Return value @@ -1293,13 +1292,13 @@ Creates a **Query** object to match the specified field and value less than the greaterThanOrEqualTo(field: string, value: number|string): Query; -Creates a **Query** object to match the specified field and value greater than or equal to the specified value. +Creates a **Query** object to match the specified field whose value is greater than or equal to the specified value. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | value | number/string/boolean | Yes| Value specified.| - Return value @@ -1326,14 +1325,14 @@ Creates a **Query** object to match the specified field and value greater than o lessThanOrEqualTo(field: string, value: number|string): Query; -Creates a **Query** object to match the specified field and value less than or equal to the specified value. +Creates a **Query** object to match the specified field whose value is less than or equal to the specified value. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| -| value | number/string/boolean | Yes| Value to match.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| +| value | number/string/boolean | Yes| Value specified.| - Return value @@ -1365,7 +1364,7 @@ Creates a **Query** object to match the specified field whose value is **null**. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| - Return value @@ -1397,7 +1396,7 @@ Creates a **Query** object to match the specified field whose value is within th | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | valueList | number[] | Yes| List of numbers.| - Return value @@ -1431,7 +1430,7 @@ Creates a **Query** object to match the specified field whose value is within th | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | valueList | string[] | Yes| List of strings.| - Return value @@ -1464,7 +1463,7 @@ Creates a **Query** object to match the specified field whose value is not withi | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | valueList | number[] | Yes| List of numbers.| - Return value @@ -1497,7 +1496,7 @@ Creates a **Query** object to match the specified field whose value is not withi | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | valueList | string[] | Yes| List of strings.| - Return value @@ -1524,13 +1523,13 @@ Creates a **Query** object to match the specified field whose value is not withi like(field: string, value: string): Query; -Creates a **Query** object to match the specified field whose value is similar to the specified value. +Creates a **Query** object to match the specified field whose value is similar to the specified string. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | valueList | string | Yes| String specified.| - Return value @@ -1557,13 +1556,13 @@ Creates a **Query** object to match the specified field whose value is similar t unlike(field: string, value: string): Query; -Creates a **Query** object to match the specified field whose value is not similar to the specified value. +Creates a **Query** object to match the specified field whose value is not similar to the specified string. - Parameters | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| | valueList | string | Yes| String specified.| - Return value @@ -1652,7 +1651,7 @@ Creates a **Query** object to sort the query results in ascending order. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| - Return value @@ -1685,7 +1684,7 @@ Creates a **Query** object to sort the query results in descending order. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| fieId | string | Yes|Field specified. It must start with $ and cannot contain ^.| +| fieId | string | Yes|Field to match. It must start with $ and cannot contain ^.| - Return value @@ -1719,8 +1718,8 @@ Creates a **Query** object to specify the number of results and where to start. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| total | number | Yes|Number of results.| -| offset | number | Yes|Start position.| +| total | number | Yes|Number of results to query.| +| offset | number | Yes|Start position for query.| - Return value @@ -1779,7 +1778,7 @@ Creates a **Query** object with a specified field that is not null. beginGroup(): Query; -Creates a **Query** object with a query condition group with a left parenthesis. +Creates a **Query** object for a query condition group with a left parenthesis. - Return value @@ -1807,7 +1806,7 @@ Creates a **Query** object with a query condition group with a left parenthesis. endGroup(): Query; -Creates a **Query** object with a query condition group with a right parenthesis. +Creates a **Query** object for a query condition group with a right parenthesis. - Return value @@ -1874,7 +1873,7 @@ Creates a **Query** object with an index preferentially used for query. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| index | string | Yes|Index to be set.| +| index | string | Yes|Index preferentially used for query.| - Return value @@ -1956,13 +1955,13 @@ Obtains the query statement of this **Query** object. ## KVStore -Provides methods to manage data in a KV store, for example, adding or deleting data and subscribing to data changes or completion of data synchronization. Before calling any method in **KVStore**, you must use **getKVStore** to create a **KVStore** object. +Provides methods to manage data in a KV store, for example, adding or deleting data and subscribing to data changes or completion of data synchronization. Before calling any method in **KVStore**, you must use **getKVStore** to obtain a **KVStore** object. ### put put(key: string, value: Uint8Array | string | number | boolean, callback: AsyncCallback<void>): void -Adds a KV pair of the specified type to the KV store. This method uses an asynchronous callback to return the result. +Adds a KV pair of the specified type to this KV store. This method uses an asynchronous callback to return the result. - Parameters @@ -1996,7 +1995,7 @@ Adds a KV pair of the specified type to the KV store. This method uses an asynch put(key: string, value: Uint8Array | string | number | boolean): Promise<void> -Adds a KV pair of the specified type to the KV store. This method uses a promise to return the result. +Adds a KV pair of the specified type to this KV store. This method uses a promise to return the result. - Parameters @@ -2034,7 +2033,7 @@ Adds a KV pair of the specified type to the KV store. This method uses a promise delete(key: string, callback: AsyncCallback<void>): void -Deletes a KV pair from the KV store. This method uses an asynchronous callback to return the result. +Deletes a KV pair from this KV store. This method uses an asynchronous callback to return the result. - Parameters @@ -2074,7 +2073,7 @@ Deletes a KV pair from the KV store. This method uses an asynchronous callback t delete(key: string): Promise<void> -Deletes a KV pair from the KV store. This method uses a promise to return the result. +Deletes a KV pair from this KV store. This method uses a promise to return the result. - Parameters @@ -2121,7 +2120,7 @@ Subscribes to data changes of the specified type. This method uses a synchronous | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| event |'dataChange' | Yes|Type of the events.| +| event |'dataChange' | Yes|Type of the events to subscribe to.| | type |[SubscribeType](#subscribetypea) | Yes|Type of data changes.| | observer |Callback<[ChangeNotification](#changenotificationa)> | Yes|Callback used to return the result.| @@ -2140,13 +2139,13 @@ Subscribes to data changes of the specified type. This method uses a synchronous on(event: 'syncComplete', syncCallback: Callback8+ ## -Provides methods to manage distributed data by device in the distributed system. This class inherits from **KvStore** and provides data query and synchronization methods. Before calling any method in **DeviceKVStore**, you must use **getKVStore** to create a **DeviceKVStore** object. +Provides methods to manage distributed data by device in the distributed system. This class inherits from **KvStore** and provides data query and synchronization methods. Before calling any method in **DeviceKVStore**, you must use **getKVStore** to obtain a **DeviceKVStore** object. ### get8+ ### @@ -3772,7 +3771,7 @@ Obtains the string value that matches the specified key for a device. This metho | Type| Description| | ------ | ------- | -|Promise<boolean/string/number/Uint8Array> |Promise used to return the result.| +|Promise<boolean/string/number/Uint8Array> |Promise used to return the value obtained.| - Example @@ -3801,7 +3800,7 @@ Obtains the string value that matches the specified key for a device. This metho getEntries(deviceId: string, keyPrefix: string, callback: AsyncCallback<Entry[]>): void; -Obtains all KV pairs that match the specified key prefix for a device. This method uses an asynchronous callback to return the result. +Obtains the KV pairs that match the specified key prefix for a device. This method uses an asynchronous callback to return the result. - Parameters @@ -3847,7 +3846,7 @@ Obtains all KV pairs that match the specified key prefix for a device. This meth getEntries(deviceId: string, keyPrefix: string): Promise<Entry[]>; -Obtains all KV pairs that match the specified key prefix for a device. This method uses a promise to return the result. +Obtains the KV pairs that match the specified key prefix for a device. This method uses a promise to return the result. - Parameters @@ -3860,7 +3859,7 @@ Obtains all KV pairs that match the specified key prefix for a device. This meth | Type| Description| | ------ | ------- | -|Promise<[Entry](#entry)[]> |Promise used to return the result.| +|Promise<[Entry](#entry)[]> |Promise used to return the KV pairs obtained.| - Example @@ -3910,7 +3909,7 @@ Obtains the KV pairs matching the specified **Query** object. This method uses a | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| | callback |AsyncCallback<[Entry](#entry)[]> | Yes|Callback used to return the KV pairs obtained.| - Example @@ -3961,13 +3960,13 @@ Obtains the KV pairs matching the specified **Query** object. This method uses a | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| - Return value | Type| Description| | ------ | ------- | -|Promise<[Entry](#entry)[]> |Promise used to return the result.| +|Promise<[Entry](#entry)[]> |Promise used to return the KV pairs obtained.| - Example @@ -4018,7 +4017,7 @@ Obtains the KV pairs matching the specified **Query** object for a device. This | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | deviceId |string | Yes|ID of the target device.| -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| | callback |AsyncCallback<[Entry](#entry)[]> | Yes|Callback used to return the KV pairs obtained.| - Example @@ -4070,13 +4069,13 @@ Obtains the KV pairs matching the specified **Query** object for a device. This | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | deviceId |string | Yes|ID of the target device.| -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| - Return value | Type| Description| | ------ | ------- | -|Promise<[Entry](#entry)[]> |Promise used to return the result.| +|Promise<[Entry](#entry)[]> |Promise used to return the KV pairs obtained.| - Example @@ -4167,7 +4166,7 @@ Obtains the **KvStoreResultSet** object that matches the specified key prefix fo | Type| Description| | ------ | ------- | -|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the result.| +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the **KvStoreResultSet** object obtained.| - Example @@ -4202,7 +4201,7 @@ Obtains the **KvStoreResultSet** object that matches the specified **Query** obj | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| | callback |AsyncCallback<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> | Yes|Callback used to return the **KvStoreResultSet** object obtained.| - Example @@ -4252,13 +4251,13 @@ Obtains the **KvStoreResultSet** object that matches the specified **Query** obj | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| - Return value | Type| Description| | ------ | ------- | -|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the result.| +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the **KvStoreResultSet** object obtained.| - Example @@ -4315,7 +4314,7 @@ Obtains the **KvStoreResultSet** object that matches the specified **Query** obj | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | deviceId |string | Yes|ID of the target device.| -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| | callback |AsyncCallback<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> | Yes|Callback used to return the **KvStoreResultSet** object obtained.| - Example @@ -4365,13 +4364,13 @@ Obtains the **KvStoreResultSet** object that matches the specified **Query** obj | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | deviceId |string | Yes|ID of the target device.| -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| - Return value | Type| Description| | ------ | ------- | -|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the result.| +|Promise<[KvStoreResultSet](#kvstoreresultsetsup8sup)[]> |Promise used to return the **KvStoreResultSet** object obtained.| - Example @@ -4497,7 +4496,7 @@ Obtains the number of results that matches the specified **Query** object. This | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| | callback |AsyncCallback<number> | Yes|Callback used to return the number of results obtained.| - Example @@ -4542,13 +4541,13 @@ Obtains the number of results that matches the specified **Query** object. This | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| - Return value | Type| Description| | ------ | ------- | -|Promise<number> |Promise used to return the result.| +|Promise<number> |Promise used to return the number of results obtained.| - Example @@ -4597,7 +4596,7 @@ Obtains the number of results that matches the specified **Query** object for a | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | deviceId |string | Yes|ID of the target device.| -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| | callback |AsyncCallback<number> | Yes|Callback used to return the number of results obtained.| - Example @@ -4642,13 +4641,13 @@ Obtains the number of results that matches the specified **Query** object for a | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | deviceId |string | Yes|ID of the target device.| -| query |[Query](#querysup8sup) | Yes|**Query** object.| +| query |[Query](#querysup8sup) | Yes|**Query** object to match.| - Return value | Type| Description| | ------ | ------- | -|Promise<number> |Promise used to return the result.| +|Promise<number> |Promise used to return the number of results obtained.| - Example @@ -4689,7 +4688,7 @@ Obtains the number of results that matches the specified **Query** object for a removeDeviceData(deviceId: string, callback: AsyncCallback<void>): void; -Deletes data of a device from this KV store. This method uses an asynchronous callback to return the result. +Removes data of a device from this KV store. This method uses an asynchronous callback to return the result. - Parameters @@ -4729,7 +4728,7 @@ Deletes data of a device from this KV store. This method uses an asynchronous ca removeDeviceData(deviceId: string): Promise<void>; -Deletes data of a device from this KV store. This method uses a promise to return the result. +Removes data of a device from this KV store. This method uses a promise to return the result. - Parameters @@ -4783,8 +4782,8 @@ Manually triggers KV store synchronization synchronously. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | deviceIdList |string[] | Yes|IDs of the devices to be synchronized.| -| mode |[SyncMode](#syncmode) | Yes|Synchronization mode, which can be **PUSH**, **PULL**, or **PUSH_PULL**.| -| allowedDelayMs |number | No|Allowed delay time, in ms.| +| mode |[SyncMode](#syncmode) | Yes|Data synchronization mode, which can be **PUSH**, **PULL**, or **PUSH_PULL**.| +| allowedDelayMs |number | No|Allowed synchronization delay time, in ms.| - Example -- Gitee From 6c9445b2375858e3ea639f8476a49a2bbbc6a615 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Sun, 6 Mar 2022 14:43:40 +0800 Subject: [PATCH 143/282] update docs Signed-off-by: annie_wangli --- .../reference/apis/js-apis-distributed-data.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-distributed-data.md b/en/application-dev/reference/apis/js-apis-distributed-data.md index 3f15e89a228..ed190a2e4e5 100644 --- a/en/application-dev/reference/apis/js-apis-distributed-data.md +++ b/en/application-dev/reference/apis/js-apis-distributed-data.md @@ -1,6 +1,7 @@ # Distributed Data Management >![](../../public_sys-resources/icon-note.gif) **NOTE** +> >The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -61,17 +62,17 @@ createKVManager(config: KVManagerConfig): Promise<KVManager> Creates a **KVManager** object to manage KV stores. This method uses a promise to return the result. - Parameters - + | Name| Type| Mandatory| Description| | ----- | ------ | ------ | ------ | | config |[KVManagerConfig](#kvmanager) | Yes| Configuration of the **KVManager** object, including the bundle name and user information of the caller.| - + - Return value | Type| Description| | -------- | -------- | | Promise<[KVManager](#kvmanager)> | Promise used to return the **KVManager** object created.| - + - Example ``` @@ -363,7 +364,7 @@ deleteKVStore(appId: string, storeId: string): Promise<void>; Deletes a KV store. This method uses a promise to return the result. - Parameters - + | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | appId | string | Yes| Bundle name of the app that invokes the KV store.| @@ -450,7 +451,7 @@ Obtains the IDs of all the KV stores that are created using **getKvStore** and h - Return value - + | Type| Description| | ------------- | -------------- | | Promise<string[]>| Promise used to return the KV store IDs obtained.| @@ -517,7 +518,7 @@ Unsubscribes from the **distributedDataServiceDie** events. This method uses a s | ----- | ------ | ---- | ----------------------- | | event | 'distributedDataServiceDie' | Yes| Type of events to unsubscribe from. | | deathCallback | Callback<void> | No| Callback used to return the **distributedDataServiceDie** events.| - + - Example @@ -633,7 +634,7 @@ Adds a child node to this **FieldNode**. | Name| Type| Mandatory| Description| | ----- | ------ | ---- | ----------------------- | | child | [FieldNode](#FieldNode) | Yes| Child node to add.| - + - Return value -- Gitee From da182291f9ea7e4d5e0b273632ac531a22b979a2 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Sun, 6 Mar 2022 15:07:51 +0800 Subject: [PATCH 144/282] update docs Signed-off-by: annie_wangli --- en/application-dev/usb/usb-guidelines.md | 2 +- en/application-dev/usb/usb-overview.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/en/application-dev/usb/usb-guidelines.md b/en/application-dev/usb/usb-guidelines.md index caa2c920c74..1c7aa85a9c5 100644 --- a/en/application-dev/usb/usb-guidelines.md +++ b/en/application-dev/usb/usb-guidelines.md @@ -6,7 +6,7 @@ In Host mode, you can obtain the list of connected devices, enable or disable th ## APIs -The OpenHarmony USB service provides the following functions: query of USB device list, bulk data transfer, control transfer, and access permission management. +The USB service provides the following functions: query of USB device list, bulk data transfer, control transfer, and access permission management. The following table lists the USB APIs currently available. For details, see the _API Reference_. diff --git a/en/application-dev/usb/usb-overview.md b/en/application-dev/usb/usb-overview.md index f2304ed3b7d..51636403c0d 100644 --- a/en/application-dev/usb/usb-overview.md +++ b/en/application-dev/usb/usb-overview.md @@ -2,7 +2,7 @@ ## Basic Concepts -The USB service in OpenHarmony is an abstraction of underlying hardware-based USB devices. Your application can access the USB devices via the USB service. With the APIs provided by the USB service, you can obtain the list of connected USB devices, manage device access permissions, and perform data transfer or control transfer between the host and connected devices. +The USB service is an abstraction of underlying hardware-based USB devices. Your application can access the USB devices via the USB service. With the APIs provided by the USB service, you can obtain the list of connected USB devices, manage device access permissions, and perform data transfer or control transfer between the host and connected devices. ## Working Principles -- Gitee From 1422394175e45b9db934a7037793d2c2668b9758 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Mon, 7 Mar 2022 08:54:12 +0800 Subject: [PATCH 145/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-screenshot.md | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 en/application-dev/reference/apis/js-apis-screenshot.md diff --git a/en/application-dev/reference/apis/js-apis-screenshot.md b/en/application-dev/reference/apis/js-apis-screenshot.md new file mode 100644 index 00000000000..1a402eb84c1 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-screenshot.md @@ -0,0 +1,126 @@ +# Screenshot + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. + +## Modules to Import + +``` +import screenshot from '@ohos.screenshot'; +``` + +## ScreenshotOptions + +Describes screenshot options. + +| Name| Type| Mandatory| Description| +| ---------- | ------------- | ---- | ------------------------------------------------------------ | +| screenRect | [Rect](#Rect) | No| Region of the screen to capture. If this parameter is null, the full screen will be captured.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| imageSize | [Size](#Size) | No| Size of the screen region to capture. If this parameter is null, the full screen will be captured.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| rotation | number | No| Rotation angle of the screenshot. The value can be **0**, **90**, **180**, or **270**. The default value is **0**.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| + + +## Rect + +Describes the region of the screen to capture. + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | ------------------------------------------------------------ | +| left | number | Yes| Left boundary of the screen region to capture.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| top | number | Yes| Top boundary of the screen region to capture.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| width | number | Yes| Width of the screen region to capture.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| height | number | Yes| Height of the screen region to capture.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| + + +## Size + +Describes the size of the screen region to capture. + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | ------------------------------------------------------------ | +| width | number | Yes| Width of the screen region to capture.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| +| height | number | Yes| Height of the screen region to capture.
**System capabilities**: SystemCapability.WindowManager.WindowManager.Core| + +## screenshot.save + +save(options?: ScreenshotOptions, callback: AsyncCallback<image.PixelMap>): void + +Takes a screenshot and saves it as a **PixelMap** object. This method uses a callback to return the result. + +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + +**Required permissions**: ohos.permission.CAPTURE_SCREEN + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [ScreenshotOptions](#ScreenshotOptions) | No| Screenshot options, which consist of **screenRect**, **imageSize**, and **rotation**. You need to set these parameters.| + | callback | AsyncCallback<image.PixelMap> | Yes| Callback used to return a **PixelMap** object.| + +- Example + + ``` + var ScreenshotOptions = { + "screenRect": { + "left": 200, + "top": 100, + "width": 200, + "height": 200}, + "imageSize": { + "width": 300, + "height": 300}, + "rotation": 0 + }; + screenshot.save(ScreenshotOptions, (err, data) => { + if (err) { + console.error('Failed to save the screenshot. Error: ' + JSON.stringify(err)); + return; + } + console.info('Screenshot saved. Data: ' + JSON.stringify(data)); + }); + ``` + +## screenshot.save + +save(options?: ScreenshotOptions): Promise<image.PixelMap> + +Takes a screenshot and saves it as a **PixelMap** object. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.WindowManager.WindowManager.Core + +**Required permissions**: ohos.permission.CAPTURE_SCREEN + +- Parameters + + | Name| Type| Mandatory| Description| + | ------- | --------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [ScreenshotOptions](#ScreenshotOptions) | No| Screenshot options, which consist of **screenRect**, **imageSize**, and **rotation**. You need to set these parameters.| + +- Return value + + | Type| Description| + | ----------------------------- | ----------------------------------------------- | + | Promise<image.PixelMap> | Promise used to return an **image.PixelMap** object.| + +- Example + + ``` + var ScreenshotOptions = { + "screenRect": { + "left": 200, + "top": 100, + "width": 200, + "height": 200}, + "imageSize": { + "width": 300, + "height": 300}, + "rotation": 0 + }; + let promise = screenshot.save(ScreenshotOptions); + promise.then(() => { + console.log('screenshot save success'); + }).catch((err) => { + console.log('screenshot save fail: ' + JSON.stringify(err)); + }); + ``` -- Gitee From 63e918ae4d90a6f099b9f9327b50fc8b5d0c2cb8 Mon Sep 17 00:00:00 2001 From: NEEN Date: Mon, 7 Mar 2022 01:22:40 +0000 Subject: [PATCH 146/282] update zh-cn/release-notes/Readme.md. Signed-off-by: NEEN --- zh-cn/release-notes/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/release-notes/Readme.md b/zh-cn/release-notes/Readme.md index aa3297ec732..b4f5de9c3a2 100644 --- a/zh-cn/release-notes/Readme.md +++ b/zh-cn/release-notes/Readme.md @@ -7,7 +7,7 @@ ## OpenHarmony 2.x Releases - [OpenHarmony v2.2 beta2 (2021-08-04)](OpenHarmony-v2.2-beta2.md) -- [OpenHarmony 2.0 Canary (2021-06-02)](OpenHarmony-2-0-Canary.md) +- [OpenHarmony 2.0 Canary (2021-06-01)](OpenHarmony-2-0-Canary.md) ## OpenHarmony 1.x Releases - [OpenHarmony v1.1.4 LTS (2022-02-11)](OpenHarmony-v1-1-4-LTS.md) - [OpenHarmony v1.1.3 LTS (2021-09-30)](OpenHarmony-v1-1-3-LTS.md) -- Gitee From a0dde8691a5deb8970f8a0c146379178bd4be839 Mon Sep 17 00:00:00 2001 From: NEEN Date: Mon, 7 Mar 2022 01:23:08 +0000 Subject: [PATCH 147/282] update en/release-notes/Readme.md. Signed-off-by: NEEN --- en/release-notes/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/release-notes/Readme.md b/en/release-notes/Readme.md index 3d7db33edef..38c48debb7a 100644 --- a/en/release-notes/Readme.md +++ b/en/release-notes/Readme.md @@ -6,7 +6,7 @@ ## OpenHarmony 2.x Releases - [OpenHarmony v2.2 beta2 (2021-08-04)](OpenHarmony-v2.2-beta2.md) -- [OpenHarmony 2.0 Canary (2021-06-02)](OpenHarmony-2-0-Canary.md) +- [OpenHarmony 2.0 Canary (2021-06-01)](OpenHarmony-2-0-Canary.md) ## OpenHarmony 1.x Releases - [OpenHarmony v1.1.4 LTS (2022-02-11)](OpenHarmony-v1-1-4-LTS.md) - [OpenHarmony v1.1.3 LTS (2021-09-30)](OpenHarmony-v1-1-3-LTS.md) -- Gitee From bc654129b0df2494bb0e28fca5585dbdcff09e10 Mon Sep 17 00:00:00 2001 From: NEEN Date: Mon, 7 Mar 2022 01:23:30 +0000 Subject: [PATCH 148/282] update en/release-notes/OpenHarmony-2-0-Canary.md. Signed-off-by: NEEN --- en/release-notes/OpenHarmony-2-0-Canary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/release-notes/OpenHarmony-2-0-Canary.md b/en/release-notes/OpenHarmony-2-0-Canary.md index 4b366d44787..252ea69f5cb 100644 --- a/en/release-notes/OpenHarmony-2-0-Canary.md +++ b/en/release-notes/OpenHarmony-2-0-Canary.md @@ -1,4 +1,4 @@ -# OpenHarmony 2.0 Canary \(2021-06-02\) +# OpenHarmony 2.0 Canary \(2021-06-01\) ## Version Description -- Gitee From 60b733ad69aca1e7c229ad698a91a40bd587ebde Mon Sep 17 00:00:00 2001 From: lixingchi1 Date: Mon, 7 Mar 2022 09:24:08 +0800 Subject: [PATCH 149/282] fix the web example. Signed-off-by: lixingchi1 --- zh-cn/application-dev/ui/ui-ts-components-web.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zh-cn/application-dev/ui/ui-ts-components-web.md b/zh-cn/application-dev/ui/ui-ts-components-web.md index 05d6270d9c5..f17a05c89d7 100644 --- a/zh-cn/application-dev/ui/ui-ts-components-web.md +++ b/zh-cn/application-dev/ui/ui-ts-components-web.md @@ -1,6 +1,6 @@ # Web -Web是提供网页显示能力的组件,具体用法请参考 [Web API](../reference/arkui-ts/ts-media-components-web.md)。 +Web是提供网页显示能力的组件,具体用法请参考 [Web API](../reference/arkui-ts/ts-basic-components-web.md)。 ## 创建组件 @@ -68,7 +68,7 @@ struct WebComponent { Progress({value: this.progress, total: 100}) .color('#0000ff') .visibility(this.hideProgress ? Visibility.None : Visibility.Visible) - Web({ src: 'https://example.com', controller: this.controller }) + Web({ src: 'https://www.example.com', controller: this.controller }) .fileAccess(this.fileAccess) .javaScriptAccess(true) .height(500) @@ -89,7 +89,7 @@ struct WebComponent { } } ``` -在onPageEnd事件中添加runJavaScript方法。onPageEnd事件是网页退出时的回调,runJavaScript方法可以执行HTML中的JavaScript脚本。当页面退出时,触发onPageEnd事件,调用HTML文件中的test方法,在控制台打印信息。 +在onPageEnd事件中添加runJavaScript方法。onPageEnd事件是网页加载完成时的回调,runJavaScript方法可以执行HTML中的JavaScript脚本。当页面加载完成时,触发onPageEnd事件,调用HTML文件中的test方法,在控制台打印信息。 ``` // xxx.ets @@ -109,7 +109,7 @@ struct WebComponent { .color('#0000ff') .visibility(this.hideProgress ? Visibility.None : Visibility.Visible) // 初始化Web组件,并绑定controller - Web({ src: 'https://gitee.com', controller: this.controller }) + Web({ src: $rawfile('index.html'), controller: this.controller }) .fileAccess(this.fileAccess) .javaScriptAccess(true) .height(500) @@ -124,7 +124,7 @@ struct WebComponent { }) .onPageEnd(e => { // test()在index.html中定义 - this.controller.runJavaScript('test()'); + this.controller.runJavaScript({ script: 'test()' }); console.info('url: ', e.url); }) Text('End') -- Gitee From 450c1f4951bd436e8495c1a1193774b462a1a8bf Mon Sep 17 00:00:00 2001 From: NEEN Date: Mon, 7 Mar 2022 01:38:23 +0000 Subject: [PATCH 150/282] update en/release-notes/OpenHarmony-2-0-Canary.md. Signed-off-by: NEEN --- en/release-notes/OpenHarmony-2-0-Canary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/release-notes/OpenHarmony-2-0-Canary.md b/en/release-notes/OpenHarmony-2-0-Canary.md index 252ea69f5cb..b8b23c579d2 100644 --- a/en/release-notes/OpenHarmony-2-0-Canary.md +++ b/en/release-notes/OpenHarmony-2-0-Canary.md @@ -78,7 +78,7 @@ repo forall -c'git lfs pull' | Source Code | Version | Mirror | SHA-256 Checksum | | -------- | -------- | -------- | -------- | | Full code base | 2.0 | [Download](https://repo.huaweicloud.com/harmonyos/os/2.0/code-2.0-canary_20210601.tar.gz) | [Download](https://repo.huaweicloud.com/harmonyos/os/2.0/code-2.0-canary_20210601.tar.gz.sha256) | -| Release Notes | 2.0 | [Download](https://gitee.com/openharmony/docs/blob/master/en/release-notes/OpenHarmony-2-0-canary.md) | - | +| Release Notes | 2.0 | [Download](https://gitee.com/openharmony/docs/blob/master/en/release-notes/OpenHarmony-2-0-Canary.md) | - | ## What's New -- Gitee From aa2551c29b8c00ab66f039ea000ea7c4286d4286 Mon Sep 17 00:00:00 2001 From: wangdongdong Date: Mon, 7 Mar 2022 10:35:22 +0800 Subject: [PATCH 151/282] Signed-off-by: wangdongdong Change-Id: I9105a9a702d3140f7f087faeae7dc339e628b9ec --- .../reference/apis/js-apis-featureAbility.md | 183 ------------------ 1 file changed, 183 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md b/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md index 54ac9cd1bc3..8a6528d5fd6 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-featureAbility.md @@ -664,189 +664,6 @@ var connId = featureAbility.connectAbility( var result = await featureAbility.disconnectAbility(connId); ``` -## featureAbility.continueAbility - -continueAbility(options: ContinueAbilityOptions, callback: AsyncCallback\): void - -迁移一个ability到目标设备,并返回执行结果(callback形式)。 - -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - -**参数:** - -| 名称 | 类型 | 必填 | 描述 | -| -------- | ---------------------- | ---- | ------------------- | -| options | ContinueAbilityOptions | 是 | 表示被启动的Ability | -| callback | AsyncCallback\ | 是 | 被指定的回调方法 | - -**ContinueAbilityOptions类型说明:** - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| ---------- | -------- | ------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | -| reversible | 只读 | boolean | 是 | 是否支持回迁的标志,目前不支持该功能,为保留字段,可填false。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | - -**示例:** - -```javascript -import device from '@system.device' -import ability from '@ohos.ability.featureability' - -var DEVICE_LIST_LOCALHOST -export default { - data: { - title: "", - deviceId: '', - deviceList: [], - remoteDeviceModel : new RemoteDeviceModel() - }, - onInit() { - DEVICE_LIST_LOCALHOST = { - id: 'localhost', - }; - this.deviceList = [DEVICE_LIST_LOCALHOST]; - }, - onShow() { - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - const reportExtend = new ReportExtend(file) - core.addService('expect', expectExtend) - core.addService('report', reportExtend) - core.init() - const configService = core.getDefaultService('config') - configService.setConfig(this) - core.execute() - }, - onReady() { - }, - GetNetWorkId(){ - let self = this; - this.remoteDeviceModel.registerDeviceListCallback(() => { - var list = []; - list[0] = DEVICE_LIST_LOCALHOST; - var deviceList = self.remoteDeviceModel.deviceList; - for (var i = 0; i < deviceList.length; i++) { - list[i] = { - id: deviceList[i].deviceId, - }; - } - self.deviceList = list; - }); - }, - ShowNetWorkId(){ - this.deviceId = this.deviceList[0].id; - }, - - async ContinueAbility(){ - function ContinueAbilityCallback(err) { - console.info("=============>ContinueAbilityCallback============>"); - } - var continueAbilityOptions = { - reversible: false, - deviceId: this.deviceId, - } - //continueAbility callback - await ability.continueAbility(continueAbilityOptions, ContinueAbilityCallback); - }, -} -``` - -## featureAbility.continueAbility - -continueAbility(options: ContinueAbilityOptions): Promise\; - -迁移一个ability到目标设备,并返回执行结果(Promise形式)。 - -**系统能力:** - -SystemCapability.Ability.AbilityRuntime.FAModel - -**参数:** - -| 名称 | 类型 | 必填 | 描述 | -| ------- | ---------------------- | ---- | ------------------- | -| options | ContinueAbilityOptions | 是 | 表示被启动的Ability | - -**ContinueAbilityOptions类型说明:** - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| ---------- | -------- | ------- | ---- | ------------------------------------------------------------ | -| deviceId | 只读 | string | 是 | 表示需要包含有关目标启动能力的信息。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | -| reversible | 只读 | boolean | 是 | 是否支持回迁的标志,目前不支持该功能,为保留字段,可填false。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | - -**示例:** - -```javascript -import device from '@system.device' -import ability from '@ohos.ability.featureability' - -var DEVICE_LIST_LOCALHOST -export default { - data: { - title: "", - deviceId: '', - deviceList: [], - remoteDeviceModel : new RemoteDeviceModel() - }, - onInit() { - DEVICE_LIST_LOCALHOST = { - id: 'localhost', - }; - this.deviceList = [DEVICE_LIST_LOCALHOST]; - }, - onShow() { - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - const reportExtend = new ReportExtend(file) - core.addService('expect', expectExtend) - core.addService('report', reportExtend) - core.init() - const configService = core.getDefaultService('config') - configService.setConfig(this) - core.execute() - }, - onReady() { - }, - GetNetWorkId(){ - let self = this; - this.remoteDeviceModel.registerDeviceListCallback(() => { - var list = []; - list[0] = DEVICE_LIST_LOCALHOST; - var deviceList = self.remoteDeviceModel.deviceList; - for (var i = 0; i < deviceList.length; i++) { - list[i] = { - id: deviceList[i].deviceId, - }; - } - self.deviceList = list; - }); - }, - ShowNetWorkId(){ - this.deviceId = this.deviceList[0].id; - }, - - async ContinueAbility(){ - function ContinueAbilityCallback(err) { - console.info("=============>ContinueAbilityCallback============>"); - } - var continueAbilityOptions = { - reversible: false, - deviceId: this.deviceId, - } - //continueAbility promise - await ability.continueAbility(continueAbilityOptions).then(() => { - console.info("=======>continueAbilityCallback=========>"); - }); - }, -} -``` - ## AbilityResult | 名称 | 读写属性 | 类型 | 必填 | 描述 | -- Gitee From ec838858fcd1df3aeb336e17ec8cfcc3b4fa25c0 Mon Sep 17 00:00:00 2001 From: hujun211 Date: Sun, 6 Mar 2022 19:05:51 -0800 Subject: [PATCH 152/282] modify docs of powermanger Signed-off-by: hujun211 --- zh-cn/application-dev/reference/apis/js-apis-thermal.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-thermal.md b/zh-cn/application-dev/reference/apis/js-apis-thermal.md index ea63870d427..9bd06886745 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-thermal.md +++ b/zh-cn/application-dev/reference/apis/js-apis-thermal.md @@ -53,7 +53,7 @@ thermal.subscribeThermalLevel((lev) => { ## thermal.unsubscribeThermalLevel -unsubscribeThermalLevel(callback?: AsyncCallback): void +unsubscribeThermalLevel(callback?: AsyncCallback\): void 取消订阅热档位变化时的回调提醒。 -- Gitee From bcbb0783d03c14b3e18e15dbf8bf0867dd286a4e Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Mon, 7 Mar 2022 11:10:09 +0800 Subject: [PATCH 153/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 0f2fad66ffc..f1615341834 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -296,7 +296,7 @@ getPublicDirectory(type: DirectoryType): Promise<string>; **示例:** ``` -async function (done) { +async function example() { let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; const dicResult = await media.getPublicDirectory(DIR_CAMERA); if (dicResult == 'camera/') { @@ -445,7 +445,7 @@ isDirectory(callback: AsyncCallback<boolean>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -480,7 +480,7 @@ isDirectory():Promise<boolean>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -517,7 +517,7 @@ commitModify(callback: AsyncCallback<void>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -553,7 +553,7 @@ commitModify(): Promise<void>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -588,7 +588,7 @@ open(mode: string, callback: AsyncCallback<number>): void; **示例:** ``` -async function (done) { +async function example() { let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; asset = await media.createAsset(mediaType, "image00003.jpg", path); @@ -627,7 +627,7 @@ open(mode: string): Promise<number>; **示例:** ``` -async function (done) { +async function example() { let mediaType = mediaLibrary.MediaType.IMAGE; let path = "Pictures/"; asset = await media.createAsset(mediaType, "image00003.jpg", path); @@ -661,7 +661,7 @@ close(fd: number, callback: AsyncCallback<void>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -707,7 +707,7 @@ close(fd: number): Promise<void>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -748,7 +748,7 @@ getThumbnail(callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -784,7 +784,7 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -825,7 +825,7 @@ getThumbnail(size?: Size): Promise<image.PixelMap>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -861,7 +861,7 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -902,7 +902,7 @@ favorite(isFavorite: boolean): Promise<void>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -939,7 +939,7 @@ isFavorite(callback: AsyncCallback<boolean>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -978,7 +978,7 @@ isFavorite():Promise<boolean>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1018,7 +1018,7 @@ trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1062,7 +1062,7 @@ trash(isTrash: boolean,): Promise<void>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1099,7 +1099,7 @@ isTrash(callback: AsyncCallback<boolean>): void; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1143,7 +1143,7 @@ isTrash():Promise<boolean>; **示例:** ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1184,7 +1184,7 @@ getCount(): number; **示例**: ``` -async function (done) { +async function example() { let getFileCountOneOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [fileType.toString()], @@ -1215,7 +1215,7 @@ isAfterLast(): boolean; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1254,7 +1254,7 @@ close(): void; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1286,7 +1286,7 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1325,7 +1325,7 @@ getFirstObject(): Promise<FileAsset>; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1361,7 +1361,7 @@ async function (done) { **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1399,7 +1399,7 @@ async function (done) { **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1433,7 +1433,7 @@ getLastObject(callback: AsyncCallback<FileAsset>): void; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1471,7 +1471,7 @@ getLastObject(): Promise<FileAsset>; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1504,7 +1504,7 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1548,7 +1548,7 @@ getPositionObject(index: number): Promise<FileAsset>; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1586,7 +1586,7 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1624,7 +1624,7 @@ getAllObject(): Promise<Array<FileAsset>>; **示例**: ``` -async function (done) { +async function example() { let imageType = mediaLibrary.MediaType.IMAGE; let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', @@ -1656,7 +1656,7 @@ commitModify(callback: AsyncCallback<void>): void; **示例**: ``` -async function (done) { +async function example() { let AlbumNoArgsfetchOp = { selections: '', selectionArgs: [], @@ -1693,7 +1693,7 @@ commitModify(): Promise<void>; **示例**: ``` -async function (done) { +async function example() { let AlbumNoArgsfetchOp = { selections: '', selectionArgs: [], @@ -1729,7 +1729,7 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe **示例**: ``` -async function (done) { +async function example() { let AlbumNoArgsfetchOp = { selections: '', selectionArgs: [], @@ -1768,7 +1768,7 @@ async function (done) { **示例**: ``` -async function (done) { +async function example() { let AlbumNoArgsfetchOp = { selections: '', selectionArgs: [], -- Gitee From a530c43b0a3ffd1e2acdf88490c9c8f66af961d4 Mon Sep 17 00:00:00 2001 From: clevercong Date: Mon, 7 Mar 2022 11:47:27 +0800 Subject: [PATCH 154/282] update net connection js doc. Signed-off-by: clevercong --- .../reference/apis/js-apis-net-connection.md | 334 +++++++++++++++--- 1 file changed, 292 insertions(+), 42 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md index 3b72f6733c4..e2c3220fd96 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -1,5 +1,6 @@ # 网络连接管理 + > **说明:** > > 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 @@ -104,6 +105,50 @@ connection.hasDefaultNet().then(function (has) { }) ``` +## connection.getAllNets + +getAllNets(callback: AsyncCallback<Array<NetHandle>>): void + +获取全部激活的数据网络列表,使用callback方式作为异步方法。 + +需要ohos.permission.GET_NETWORK_INFO权限。 + +**参数:** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<Array<[NetHandle](#nethandle)>> | 是 | 回调函数。 | + +**示例:** + +``` +connection.getAllNets(function (error, nets) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(nets)) +}); +``` + + +## connection.getAllNets + +getAllNets(): Promise<Array<NetHandle>> + +获取全部激活的数据网络列表,使用promise方式作为异步方法。 + +需要ohos.permission.GET_NETWORK_INFO权限。 + +**返回值:** +| 类型 | 说明 | +| -------- | -------- | +| Promise<Array<[NetHandle](#nethandle)>> | 以Promise形式返回激活的数据网络列表。 | + +**示例:** + +``` +connection.getAllNets().then(function (nets) { + console.log(JSON.stringify(nets)) +}); +``` + ## connection.getConnectionProperties getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback\): void @@ -224,6 +269,113 @@ connection.getDefaultNet().then(function (netHandle) { }) ``` +## connection.reportNetConnected + +reportNetConnected(netHandle: NetHandle, callback: AsyncCallback<void>): void + +报告网络状态已连接,使用callback方式作为异步方法。 + +需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 + +**参数:** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄,参考[NetHandle](#nethandle)。 | +| callback | AsyncCallback<void> | 是 | 回调函数。 | + +**示例:** + +``` +connection.getDefaultNet().then(function (netHandle) { + connection.reportNetConnected(netHandle, function (error) { + console.log(JSON.stringify(error)) + }); +}); +``` + + +## connection.reportNetConnected + +reportNetConnected(netHandle: NetHandle): Promise<void> + +报告网络状态已连接,使用promise方式作为异步方法。 + +需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 + +**参数:** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄,参考[NetHandle](#nethandle)。 | + +**返回值:** +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | 以Promise形式返回执行结果。 | + +**示例:** + +``` +connection.getDefaultNet().then(function (netHandle) { + connection.reportNetConnected(netHandle).then(function () { + console.log(`report success`) + }); +}); +``` + + +## connection.reportNetDisconnected + +reportNetDisconnected(netHandle: NetHandle, callback: AsyncCallback<void>): void + +报告网络状态已断开,使用callback方式作为异步方法。 + +需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 + +**参数:** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄,参考[NetHandle](#nethandle)。 | +| callback | AsyncCallback<void> | 是 | 回调函数。 | + +**示例:** + +``` +connection.getDefaultNet().then(function (netHandle) { + connection.reportNetDisconnected(netHandle, function (error) { + console.log(JSON.stringify(error)) + }); +}); +``` + + +## connection.reportNetDisconnected + +reportNetDisconnected(netHandle: NetHandle): Promise<void> + +报告网络状态已断开,使用promise方式作为异步方法。 + +需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 + +**参数:** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| netHandle | [NetHandle](#nethandle) | 是 | 数据网络的句柄,参考[NetHandle](#nethandle)。 | + +**返回值:** +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | 以Promise形式返回执行结果。 | + +**示例:** + +``` +connection.getDefaultNet().then(function (netHandle) { + connection.reportNetDisconnected(netHandle).then(function () { + console.log(`report success`) + }); +}); +``` + ## connection.getAddressesByName getAddressesByName(host: string, callback: AsyncCallback\>): void @@ -243,18 +395,17 @@ getAddressesByName(host: string, callback: AsyncCallback\>): **示例:** -```javascript -connection.getDefaultNet().then(function (netHandle) { - connection.getAddressesByName(netHandle, function (error, info) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(info)) - }) +``` +let host = "xxxx"; +connection.getAddressesByName(host, function (error, addresses) { + console.log(JSON.stringify(error)) + console.log(JSON.stringify(addresses)) }) ``` ## connection.getAddressesByName -getAddressesByName(netHandle: NetHandle): Promise\> +getAddressesByName(host: string): Promise\> 使用默认网络解析主机名以获取所有IP地址,使用Promise方式作为异步方法。 @@ -276,11 +427,10 @@ getAddressesByName(netHandle: NetHandle): Promise\> **示例:** -```javascript -connection.getDefaultNet().then(function (netHandle) { - connection.getAddressesByName(netHandle).then(function (info) { - console.log(JSON.stringify(info)) - }) +``` +let host = "xxxx"; +connection.getAddressesByName(host).then(function (addresses) { + console.log(JSON.stringify(addresses)) }) ``` @@ -309,12 +459,12 @@ createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnectio ```javascript // 关注默认网络 -let netConnection1 = connection.createNetConnection() +let netConnection = connection.createNetConnection() // 关注蜂窝网络 -let netConnection2 = connection.createNetConnection({ +let netConnectionCellular = connection.createNetConnection({ netCapabilities: { - networkCap: [0] + bearerTypes: [NetBearType.BEARER_CELLULAR] } }) ``` @@ -327,7 +477,7 @@ let netConnection2 = connection.createNetConnection({ on(type: 'netAvailable', callback: Callback\): void -监听网络可用事件。 +订阅网络可用事件。 **系统能力**:SystemCapability.Communication.NetManager.Core @@ -335,13 +485,13 @@ on(type: 'netAvailable', callback: Callback\): void | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 监听事件,固定为'netAvailable'。
netAvailable:数据网络可用事件。 | +| type | string | 是 | 订阅事件,固定为'netAvailable'。
netAvailable:数据网络可用事件。 | | callback | Callback\<[NetHandle](#nethandle)> | 是 | 回调函数。 | **示例:** ```javascript -connection.createNetConnection().on('netAvailable', function (data) { +netConnection.on('netAvailable', function (data) { console.log(JSON.stringify(data)) }) ``` @@ -350,7 +500,7 @@ connection.createNetConnection().on('netAvailable', function (data) { on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, netCap: NetCapabilities }>): void -监听网络能力变化事件。 +订阅网络能力变化事件。 **系统能力**:SystemCapability.Communication.NetManager.Core @@ -358,13 +508,13 @@ on(type: 'netCapabilitiesChange', callback: Callback<{ netHandle: NetHandle, net | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | -| type | string | 是 | 监听事件,固定为'netCapabilitiesChange'。
netCapabilitiesChange:网络能力变化事件。 | +| type | string | 是 | 订阅事件,固定为'netCapabilitiesChange'。
netCapabilitiesChange:网络能力变化事件。 | | callback | Callback<{ netHandle: [NetHandle](#nethandle), netCap: [NetCapabilities](#netcapabilities) }> | 是 | 回调函数。 | **示例:** ```javascript -connection.createNetConnection().on('netCapabilitiesChange', function (data) { +netConnection.on('netCapabilitiesChange', function (data) { console.log(JSON.stringify(data)) }) ``` @@ -373,7 +523,7 @@ connection.createNetConnection().on('netCapabilitiesChange', function (data) { on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHandle, connectionProperties: ConnectionProperties }>): void -监听网络连接信息变化事件。 +订阅网络连接信息变化事件。 **系统能力**:SystemCapability.Communication.NetManager.Core @@ -381,13 +531,36 @@ on(type: 'netConnectionPropertiesChange', callback: Callback<{ netHandle: NetHan | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | -| type | string | 是 | 监听事件,固定为'netConnectionPropertiesChange'。
netConnectionPropertiesChange:网络连接信息变化事件。 | +| type | string | 是 | 订阅事件,固定为'netConnectionPropertiesChange'。
netConnectionPropertiesChange:网络连接信息变化事件。 | | callback | Callback<{ netHandle: [NetHandle](#nethandle), connectionProperties: [ConnectionProperties](#connectionproperties) }> | 是 | 回调函数。 | **示例:** ```javascript -connection.createNetConnection().on('netConnectionPropertiesChange', function (data) { +netConnection.on('netConnectionPropertiesChange', function (data) { + console.log(JSON.stringify(data)) +}) +``` + +### on('netBlockStatusChange') + +on(type: 'netBlockStatusChange', callback: Callback<{ netHandle: NetHandle, blocked: boolean }>): void + +订阅网络阻塞状态事件,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Communication.NetManager.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 订阅事件,固定为'netBlockStatusChange'。
netBlockStatusChange:网络阻塞状态事件。 | +| callback | Callback<{ netHandle: [NetHandle](#nethandle), blocked: boolean }> | 是 | 回调函数。 | + +**示例:** + +```javascript +netConnection.on('netBlockStatusChange', function (data) { console.log(JSON.stringify(data)) }) ``` @@ -396,7 +569,7 @@ connection.createNetConnection().on('netConnectionPropertiesChange', function (d on(type: 'netLost', callback: Callback\): void -监听网络丢失事件。 +订阅网络丢失事件。 **系统能力**:SystemCapability.Communication.NetManager.Core @@ -404,13 +577,14 @@ on(type: 'netLost', callback: Callback\): void | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 监听事件,固定为'netLost'。
netLost:网络严重中断或正常断开事件。 | +| type | string | 是 | 订阅事件,固定为'netLost'。
netLost:网络严重中断或正常断开事件。 | | callback | Callback\<[NetHandle](#nethandle)> | 是 | 回调函数。 | **示例:** ```javascript -connection.createNetConnection().on('netLost', function (data) { +let netConnection1 = connection.createNetConnection() +netConnection1.on('netLost', function (data) { console.log(JSON.stringify(data)) }) ``` @@ -419,7 +593,7 @@ connection.createNetConnection().on('netLost', function (data) { on(type: 'netUnavailable', callback: Callback\): void -监听网络不可用事件。 +订阅网络不可用事件。 **系统能力**:SystemCapability.Communication.NetManager.Core @@ -427,13 +601,13 @@ on(type: 'netUnavailable', callback: Callback\): void | 参数名 | 类型 | 必填 | 说明 | | -------- | --------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 监听事件,固定为'netUnavailable'。
netUnavailable:网络不可用事件。 | +| type | string | 是 | 订阅事件,固定为'netUnavailable'。
netUnavailable:网络不可用事件。 | | callback | Callback\ | 是 | 回调函数。 | **示例:** ```javascript -connection.createNetConnection().on('netUnavailable', function (data) { +netConnection.on('netUnavailable', function (data) { console.log(JSON.stringify(data)) }) ``` @@ -442,7 +616,7 @@ connection.createNetConnection().on('netUnavailable', function (data) { register(callback: AsyncCallback\): void -注册网络的监听。 +订阅指定网络状态变化的通知。 **需要权限**:ohos.permission.GET_NETWORK_INFO @@ -457,7 +631,7 @@ register(callback: AsyncCallback\): void **示例:** ```javascript -connection.createNetConnection().register(function (error) { +netConnection.register(function (error) { console.log(JSON.stringify(error)) }) ``` @@ -466,7 +640,7 @@ connection.createNetConnection().register(function (error) { unregister(callback: AsyncCallback\): void -注销网络的监听。 +取消订阅默认网络状态变化的通知。 **系统能力**:SystemCapability.Communication.NetManager.Core @@ -479,7 +653,7 @@ unregister(callback: AsyncCallback\): void **示例:** ```javascript -connection.createNetConnection().unregister(function (error) { +netConnection.unregister(function (error) { console.log(JSON.stringify(error)) }) ``` @@ -496,6 +670,73 @@ connection.createNetConnection().unregister(function (error) { | ----- | ------ | ------------------------- | | netId | number | 网络ID,必须大于等于100。 | +### bindSocket + +bindSocket(socketParam: TCPSocket | UDPSocket, callback: AsyncCallback<void>): void + +将TCPSocket或UDPSocket绑定到当前网络,使用callback方式作为异步方法。 + +**参数:** +| 参数名 | 类型 | 必填 | 说明 | +| ----------- | ------------------------- | ---- | ---------------- | +| socketParam | TCPSocket \| UDPSocket | 是 | TCPSocket或UDPSocket对象。 | +| callback | AsyncCallback<void> | 是 | 回调函数。 | + +**示例:** + +``` +// 绑定TCPSocket +connection.getDefaultNet().then(function (netHandle) { + let tcpSocket = socket.constructTCPSocketInstance() + netHandle.bindSocket(tcpSocket, (function (error) { + console.log(JSON.stringify(error)) + })) +}) +// 绑定UDPSocket +connection.getDefaultNet().then(function (netHandle) { + let udpSocket = socket.constructUDPSocketInstance() + netHandle.bindSocket(udpSocket, (function (error) { + console.log(JSON.stringify(error)) + })) +}) +``` + + +### bindSocket + +bindSocket(socketParam: TCPSocket | UDPSocket): Promise<void> + +将TCPSocket或UDPSocket绑定到当前网络,使用promise方式作为异步方法。 + +**参数:** +| 参数名 | 类型 | 必填 | 说明 | +| ----------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| socketParam | TCPSocket \| UDPSocket | 是 | TCPSocket或UDPSocket对象。 | + +**返回值:** +| 类型 | 说明 | +| ------------------- | --------------------------- | +| Promise<void> | 以Promise形式返回执行结果。 | + +**示例:** + +``` +// 绑定TCPSocket +connection.getDefaultNet().then(function (netHandle) { + let tcpSocket = socket.constructTCPSocketInstance() + netHandle.bindSocket(tcpSocket).then(function () { + console.log("bind socket success") + }) +}) +// 绑定UDPSocket +connection.getDefaultNet().then(function (netHandle) { + let udpSocket = socket.constructUDPSocketInstance() + netHandle.bindSocket(udpSocket).then(function () { + console.log("bind socket success") + }) +}) +``` + ### getAddressesByName getAddressesByName(host: string, callback: AsyncCallback\>): void @@ -515,9 +756,10 @@ getAddressesByName(host: string, callback: AsyncCallback\>): ```javascript connection.getDefaultNet().then(function (netHandle) { - connection.getAddressesByName(netHandle, function (error, info) { + let host = "xxxx"; + netHandle.getAddressesByName(host, function (error, addresses) { console.log(JSON.stringify(error)) - console.log(JSON.stringify(info)) + console.log(JSON.stringify(addresses)) }) }) ``` @@ -546,8 +788,9 @@ getAddressesByName(netHandle: NetHandle): Promise\> ```javascript connection.getDefaultNet().then(function (netHandle) { - connection.getAddressesByName(netHandle).then(function (info) { - console.log(JSON.stringify(info)) + let host = "xxxx"; + netHandle.getAddressesByName(host).then(function (addresses) { + console.log(JSON.stringify(addresses)) }) }) ``` @@ -571,9 +814,10 @@ getAddressByName(host: string, callback: AsyncCallback\): void ```javascript connection.getDefaultNet().then(function (netHandle) { - connection.getAddressByName(netHandle, function (error, info) { + let host = "xxxx"; + netHandle.getAddressByName(host, function (error, address) { console.log(JSON.stringify(error)) - console.log(JSON.stringify(info)) + console.log(JSON.stringify(address)) }) }) ``` @@ -602,8 +846,9 @@ getAddressByName(netHandle: NetHandle): Promise\ ```javascript connection.getDefaultNet().then(function (netHandle) { - connection.getAddressByName(netHandle).then(function (info) { - console.log(JSON.stringify(info)) + let host = "xxxx"; + netHandle.getAddressByName(host).then(function (address) { + console.log(JSON.stringify(address)) }) }) ``` @@ -634,7 +879,10 @@ connection.getDefaultNet().then(function (netHandle) { | 变量 | 值 | 说明 | | ------------------------ | ---- | ---------------------- | +| NET_CAPABILITY_MMS | 0 | 表示网络可以访问运营商的MMSC(Multimedia Message Service,多媒体短信服务)发送和接收彩信。 | +| NET_CAPABILITY_NOT_METERED | 11 | 表示网络流量未被计费。 | | NET_CAPABILITY_INTERNET | 12 | 网络可以访问Internet。 | +| NET_CAPABILITY_NOT_VPN | 15 | 表示网络不使用VPN(Virtual Private Network,虚拟专用网络)。 | | NET_CAPABILITY_VALIDATED | 16 | 网络可用。 | ## NetBearType @@ -645,6 +893,7 @@ connection.getDefaultNet().then(function (netHandle) { | --------------- | ---- | ----------- | | BEARER_CELLULAR | 0 | 蜂窝网络。 | | BEARER_WIFI | 1 | Wi-Fi网络。 | +| BEARER_ETHERNET | 3 | 以太网网络。 | ## ConnectionProperties @@ -656,6 +905,7 @@ connection.getDefaultNet().then(function (netHandle) { | domains | string | 所属域,默认""。 | | linkAddresses | Array<[LinkAddress](#linkaddress)> | 链路信息。 | | routes | Array<[RouteInfo](#routeinfo)> | 路由信息。 | +| dnses | Array<[NetAddress](#netaddress)> | 网络地址,参考[NetAddress](#netaddress)。 | | mtu | number | 最大传输单元。 | ## LinkAddress -- Gitee From 15f361034ac984666e12575b4dd6a521bae18d8a Mon Sep 17 00:00:00 2001 From: clevercong Date: Mon, 7 Mar 2022 11:54:44 +0800 Subject: [PATCH 155/282] add sys cap. Signed-off-by: clevercong --- .../reference/apis/js-apis-net-connection.md | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md index e2c3220fd96..107a0b739fd 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-connection.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-connection.md @@ -111,7 +111,9 @@ getAllNets(callback: AsyncCallback<Array<NetHandle>>): void 获取全部激活的数据网络列表,使用callback方式作为异步方法。 -需要ohos.permission.GET_NETWORK_INFO权限。 +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -134,7 +136,9 @@ getAllNets(): Promise<Array<NetHandle>> 获取全部激活的数据网络列表,使用promise方式作为异步方法。 -需要ohos.permission.GET_NETWORK_INFO权限。 +**需要权限**:ohos.permission.GET_NETWORK_INFO + +**系统能力**:SystemCapability.Communication.NetManager.Core **返回值:** | 类型 | 说明 | @@ -275,7 +279,9 @@ reportNetConnected(netHandle: NetHandle, callback: AsyncCallback<void>): v 报告网络状态已连接,使用callback方式作为异步方法。 -需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 +**需要权限**:ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET + +**系统能力**:SystemCapability.Communication.NetManager.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -300,7 +306,9 @@ reportNetConnected(netHandle: NetHandle): Promise<void> 报告网络状态已连接,使用promise方式作为异步方法。 -需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 +**需要权限**:ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET + +**系统能力**:SystemCapability.Communication.NetManager.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -329,7 +337,9 @@ reportNetDisconnected(netHandle: NetHandle, callback: AsyncCallback<void>) 报告网络状态已断开,使用callback方式作为异步方法。 -需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 +**需要权限**:ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET + +**系统能力**:SystemCapability.Communication.NetManager.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -354,7 +364,9 @@ reportNetDisconnected(netHandle: NetHandle): Promise<void> 报告网络状态已断开,使用promise方式作为异步方法。 -需要ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET权限。 +**需要权限**:ohos.permission.GET_NETWORK_INFO 和 ohos.permission.INTERNET + +**系统能力**:SystemCapability.Communication.NetManager.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -676,6 +688,8 @@ bindSocket(socketParam: TCPSocket | UDPSocket, callback: AsyncCallback<void&g 将TCPSocket或UDPSocket绑定到当前网络,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Communication.NetManager.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ----------- | ------------------------- | ---- | ---------------- | @@ -708,6 +722,8 @@ bindSocket(socketParam: TCPSocket | UDPSocket): Promise<void> 将TCPSocket或UDPSocket绑定到当前网络,使用promise方式作为异步方法。 +**系统能力**:SystemCapability.Communication.NetManager.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ----------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | -- Gitee From 732852bb1322270e35f6b030fe8564ae984a8f43 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Mon, 7 Mar 2022 14:11:33 +0800 Subject: [PATCH 156/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 290 +++++++++--------- 1 file changed, 147 insertions(+), 143 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index f1615341834..cfe4281493d 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -2,7 +2,7 @@ ========== > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 该组件从API Version 6开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 - + 导入模块 --------- @@ -13,7 +13,7 @@ import mediaLibrary from '@ohos.multimedia.medialibrary'; ## getMediaLibrary -function getMediaLibrary(context: Context): MediaLibrary; +function getMediaLibrary(context: Context): MediaLibrary 获取媒体库的实例,用于访问和修改用户的个人数据信息。 @@ -31,7 +31,7 @@ function getMediaLibrary(context: Context): MediaLibrary; | 类型 | 说明 | | ------------ | :----- | -| mediaLibrary | 媒体库实例 | +| MediaLibrary | 媒体库实例 | **示例:** @@ -41,11 +41,12 @@ import featureAbility from '@ohos.ability.featureAbility'; var context = featureAbility.getContext() var media = mediaLibrary.getMediaLibrary(context); ``` +## MediaLibrary -## mediaLibrary.getFileAssets8+ +### getFileAssets8+ -getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; +getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void 获取文件资源,使用callback方式返回异步结果。 @@ -80,9 +81,9 @@ mediaLibrary.getFileAssets(imagesfetchOp, (error, fetchFileResult) => { } }); ``` -## mediaLibrary.getFileAssets8+ +### getFileAssets8+ -getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult>; +getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult> 获取文件资源,使用Promise方式返回结果。 @@ -118,9 +119,9 @@ mediaLibrary.getFileAssets(imagesfetchOp).then(function(fetchFileResult){ }); ``` -## mediaLibrary.on8+ +### on8+ -on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void; +on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback: Callback<void>): void 打开媒体媒体库变更通知,使用callback方式返回异步结果。 @@ -142,9 +143,9 @@ mediaLibrary.on('imageChange', () => { // image file had changed, do something }) ``` -## mediaLibrary.off8+ +### off8+ -off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback?: Callback<void>): void; +off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'|'fileChange'|'remoteFileChange', callback?: Callback<void>): void 关闭媒体媒体库变更通知,使用callback方式返回异步结果。 @@ -169,9 +170,9 @@ mediaLibrary.off('imageChange', () => { }) ``` -## mediaLibrary.createAsset 8+ +### createAsset 8+ -createAsset(mediaType: MediaType, displayName: string, relativePath: string, callback: AsyncCallback<FileAsset>): void; +createAsset(mediaType: MediaType, displayName: string, relativePath: string, callback: AsyncCallback<FileAsset>): void 创建媒体资源,使用callback方式返回结果。 @@ -203,9 +204,9 @@ mediaLibrary.createAsset(mediaType, 'imageCallBack.jpg', path, (err, fileAsset) }); ``` -## mediaLibrary.createAsset8+ +### createAsset8+ -createAsset(mediaType: MediaType, displayName: string, relativePath: string): Promise<FileAsset>; +createAsset(mediaType: MediaType, displayName: string, relativePath: string): Promise<FileAsset> 创建媒体资源,使用Promise方式返回结果。 @@ -240,9 +241,9 @@ mediaLibrary.createAsset(mediaType, "image01.jpg", path).then (function (asset) }); ``` -## mediaLibrary.getPublicDirectory8+ +### getPublicDirectory8+ -getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): void; +getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): void 获取公共目录路径 @@ -271,9 +272,9 @@ media.getPublicDirectory(DIR_CAMERA, (err, dicResult) => { }); ``` -## mediaLibrary.getPublicDirectory8+ +### getPublicDirectory8+ -getPublicDirectory(type: DirectoryType): Promise<string>; +getPublicDirectory(type: DirectoryType): Promise<string> 获取公共目录路径 @@ -307,9 +308,9 @@ async function example() { } ``` -## mediaLibrary.getAlbums6+ +### getAlbums6+ -getAlbums(options: MediaFetchOptions, callback: AsyncCallback): void; +getAlbums(options: MediaFetchOptions, callback: AsyncCallback): void 获取实体相册,使用callback 方式返回结果。 @@ -342,9 +343,9 @@ mediaLibrary.getAlbums(AlbumNoArgsfetchOp, (err, albumList) => { }) ``` -## mediaLibrary.getAlbums6+ +### getAlbums6+ -getAlbums(options: MediaFetchOptions): Promise; +getAlbums(options: MediaFetchOptions): Promise 获取实体相册,使用 promise 方式返回结果。 @@ -378,9 +379,9 @@ mediaLibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ }); ``` -## mediaLibrary.release8+ +### release8+ -release(callback: AsyncCallback<void>): void; +release(callback: AsyncCallback<void>): void 释放mediaLibrary实例,当用户确认后续不再使用mediaLibrary实例中的方法后调用release方法释放mediaLibrary实例。 @@ -403,9 +404,9 @@ media.release((err, data) => { }); ``` -## mediaLibrary.release8+ +### release8+ -release(): Promise<void>; +release(): Promise<void> 释放mediaLibrary实例,当用户确认后续不再使用mediaLibrary实例中的方法后调用release方法释放mediaLibrary实例。 @@ -426,7 +427,38 @@ var media = mediaLibrary.getMediaLibrary(context); media.release() ``` -## FileAsset.isDirectory8+ +## FileAsset8+ + +提供封装文件属性的方法。 + +### **属性** + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------ | --------- | ---- | ---- | ------------------------------------------------------ | +| id | number | 是 | 否 | 文件资源编号 | +| uri | string | 是 | 否 | 文件资源uri(如:dataability:///media/image/2) | +| mimeType | string | 是 | 否 | 文件扩展属性 | +| mediaType | MediaType | 是 | 否 | 媒体类型 | +| displayName | string | 是 | 是 | 显示文件名 | +| title | string | 是 | 是 | 文件标题 | +| relativePath | string | 是 | 是 | 相对公共目录路径 | +| parent | number | 是 | 否 | 父目录id | +| size | number | 是 | 否 | 文件大小(单位:字节) | +| dateAdded | number | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | +| dateModified | number | 是 | 否 | 修改日期(修改文件时间到1970年1月1日的秒数值) | +| dateTaken | number | 是 | 否 | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | +| artist | string | 是 | 否 | 作者 | +| audioAlbum | string | 是 | 否 | 专辑 | +| width | number | 是 | 否 | 图片宽度(单位:像素) | +| height | number | 是 | 否 | 图片高度(单位:像素) | +| orientation | number | 是 | 是 | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | +| duration | number | 是 | 否 | 持续时间(单位:秒) | +| albumId | number | 是 | 否 | 文件所归属的相册编号 | +| albumUri | string | 是 | 否 | 文件所归属相册uri | +| albumName | string | 是 | 否 | 文件所归属相册名称 | + + +### isDirectory8+ isDirectory(callback: AsyncCallback<boolean>): void; @@ -461,9 +493,9 @@ async function example() { } ``` -## FileAsset.isDirectory8+ +### isDirectory8+ -isDirectory():Promise<boolean>; +isDirectory():Promise<boolean> 判断fileAsset是否为目录,使用Promise方式返回异步结果。 @@ -498,9 +530,9 @@ async function example() { } ``` -## FileAsset.commitModify8+ +### commitModify8+ -commitModify(callback: AsyncCallback<void>): void; +commitModify(callback: AsyncCallback<void>): void 修改文件的元数据,使用callback方式返回异步结果。 @@ -534,9 +566,9 @@ async function example() { } ``` -## FileAsset.commitModify8+ +### commitModify8+ -commitModify(): Promise<void>; +commitModify(): Promise<void> 修改文件的元数据,使用promise方式返回异步结果。 @@ -568,9 +600,9 @@ async function example() { } ``` -## FileAsset.open8+ +### open8+ -open(mode: string, callback: AsyncCallback<number>): void; +open(mode: string, callback: AsyncCallback<number>): void 打开当前文件,使用callback方式返回异步结果。 @@ -602,9 +634,9 @@ async function example() { } ``` -## FileAsset.open8+ +### open8+ -open(mode: string): Promise<number>; +open(mode: string): Promise<number> 打开当前文件,使用promise方式返回异步结果。 @@ -641,9 +673,9 @@ async function example() { } ``` -## FileAsset.close8+ +### close8+ -close(fd: number, callback: AsyncCallback<void>): void; +close(fd: number, callback: AsyncCallback<void>): void 关闭当前文件,使用callback方式返回异步结果。 @@ -682,9 +714,9 @@ async function example() { } ``` -## FileAsset.close8+ +### close8+ -close(fd: number): Promise<void>; +close(fd: number): Promise<void> 关闭当前文件,使用promise方式返回异步结果。 @@ -729,9 +761,9 @@ async function example() { } ``` -## FileAsset.getThumbnail8+ +### getThumbnail8+ -getThumbnail(callback: AsyncCallback<image.PixelMap>): void; +getThumbnail(callback: AsyncCallback<image.PixelMap>): void 获取文件的缩略图,使用callback方式返回异步结果。 @@ -764,9 +796,9 @@ async function example() { } ``` -## FileAsset.getThumbnail8+ +### getThumbnail8+ -getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void; +getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void 获取文件的缩略图,传入缩略图尺寸,使用callback方式返回异步结果。 @@ -800,9 +832,9 @@ async function example() { } ``` -## FileAsset.getThumbnail8+ +### getThumbnail8+ -getThumbnail(size?: Size): Promise<image.PixelMap>; +getThumbnail(size?: Size): Promise<image.PixelMap> 获取文件的缩略图,传入缩略图尺寸,使用promise方式返回异步结果。 @@ -841,9 +873,9 @@ async function example() { } ``` -## FileAsset.favorite8+ +### favorite8+ -favorite(isFavorite: boolean, callback: AsyncCallback<void>): void; +favorite(isFavorite: boolean, callback: AsyncCallback<void>): void 将文件设置为收藏文件,使用callback方式返回异步结果。 @@ -877,9 +909,9 @@ async function example() { } ``` -## FileAsset.favorite8+ +### favorite8+ -favorite(isFavorite: boolean): Promise<void>; +favorite(isFavorite: boolean): Promise<void> 将文件设置为收藏文件,使用promise方式返回异步结果。 @@ -920,9 +952,9 @@ async function example() { } ``` -## FileAsset.isFavorite8+ +### isFavorite8+ -isFavorite(callback: AsyncCallback<boolean>): void; +isFavorite(callback: AsyncCallback<boolean>): void 判断该文件是否为收藏文件,使用callback方式返回异步结果。 @@ -959,9 +991,9 @@ async function example() { } ``` -## FileAsset.isFavorite8+ +### isFavorite8+ -isFavorite():Promise<boolean>; +isFavorite():Promise<boolean> 判断该文件是否为收藏文件,使用promise方式返回异步结果。 @@ -996,9 +1028,9 @@ async function example() { } ``` -## FileAsset.trash8+ +### trash8+ -trash(isTrash: boolean, callback: AsyncCallback<void&g;): void; +trash(isTrash: boolean, callback: AsyncCallback<void&g;): void 当文件被定位时,将文件放到垃圾文件夹,使用callback方式返回异步结果。 @@ -1035,9 +1067,9 @@ async function example() { } ``` -## FileAsset.trash8+ +### trash8+ -trash(isTrash: boolean,): Promise<void>; +trash(isTrash: boolean,): Promise<void> 当文件被定位时,将文件放到垃圾文件夹,使用promise方式返回异步结果。 @@ -1080,9 +1112,9 @@ async function example() { } ``` -## FileAsset.isTrash8+ +### isTrash8+ -isTrash(callback: AsyncCallback<boolean>): void; +isTrash(callback: AsyncCallback<boolean>): void 当文件被定位,判断文件是否为垃圾文件,使用callback方式返回异步结果。 @@ -1124,9 +1156,9 @@ async function example() { } ``` -## FileAsset.isTrash8+ +### isTrash8+ -isTrash():Promise<boolean>; +isTrash():Promise<boolean> 当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 @@ -1161,13 +1193,13 @@ async function example() { } ``` -**FetchFileResult** +## **FetchFileResult**8+ 文件检索结果集。 -## FetchFileResult.getCount8+ +### getCount8+ -getCount(): number; +getCount(): number 获取文件检索结果中的文件总数。 @@ -1196,9 +1228,9 @@ async function example() { } ``` -## FetchFileResult.isAfterLast8+ +### isAfterLast8+ -isAfterLast(): boolean; +isAfterLast(): boolean 检查结果集是否指向最后一行。 @@ -1241,9 +1273,9 @@ async function example() { } ``` -## FetchFileResult.close8+ +### close8+ -close(): void; +close(): void 释放 FetchFileResult 实例并使其失效。无法调用其他方法。 @@ -1267,9 +1299,9 @@ async function example() { } ``` -## FetchFileResult.getFirstObject8+ +### getFirstObject8+ -getFirstObject(callback: AsyncCallback<FileAsset>): void; +getFirstObject(callback: AsyncCallback<FileAsset>): void 获取文件检索结果中的第一个文件资产。此方法使用回调返回FileAsset。 @@ -1305,9 +1337,9 @@ async function example() { } ``` -## FetchFileResult.getFirstObject8+ +### getFirstObject8+ -getFirstObject(): Promise<FileAsset>; +getFirstObject(): Promise<FileAsset> 获取文件检索结果中的第一个文件资产。此方法使用返回FileAsset。 @@ -1342,9 +1374,9 @@ async function example() { } ``` -## FetchFileResult.getNextObject8+ +### getNextObject8+ - getNextObject(callback: AsyncCallback<FileAsset>): void; + getNextObject(callback: AsyncCallback<FileAsset>): void 获取文件检索结果中的下一个文件资产。此方法使用callback形式返回结果。 @@ -1380,9 +1412,9 @@ async function example() { } ``` -## FetchFileResult.getNextObject8+ +### getNextObject8+ - getNextObject(): Promise<FileAsset>; + getNextObject(): Promise<FileAsset> 获取文件检索结果中的下一个文件资产。此方法使用promise方式来异步返回FileAsset。 @@ -1414,9 +1446,9 @@ async function example() { } ``` -## FetchFileResult.getLastObject8+ +### getLastObject8+ -getLastObject(callback: AsyncCallback<FileAsset>): void; +getLastObject(callback: AsyncCallback<FileAsset>): void 获取文件检索结果中的最后一个文件资产。此方法使用callback回调来返回FileAsset。 @@ -1452,9 +1484,9 @@ async function example() { } ``` -## FetchFileResult.getLastObject8+ +### getLastObject8+ -getLastObject(): Promise<FileAsset>; +getLastObject(): Promise<FileAsset> 获取文件检索结果中的最后一个文件资产。此方法使用Promise方式来返回FileAsset。 @@ -1484,9 +1516,9 @@ async function example() { } ``` -## FetchFileResult.getPositionObject8+ +### getPositionObject8+ -getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void; +getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void 获取文件检索结果中具有指定索引的文件资产。此方法使用回调来返回FileAsset。 @@ -1523,9 +1555,9 @@ async function example() { } ``` -## FetchFileResult.getPositionObject8+ +### getPositionObject8+ -getPositionObject(index: number): Promise<FileAsset>; +getPositionObject(index: number): Promise<FileAsset> 获取文件检索结果中具有指定索引的文件资产。此方法使用Promise形式返回文件Asset。 @@ -1567,9 +1599,9 @@ async function example() { } ``` -## FetchFileResult.getAllObject8+ +### getAllObject8+ -getAllObject(callback: AsyncCallback<Array<FileAsset>>): void; +getAllObject(callback: AsyncCallback<Array<FileAsset>>): void 获取文件检索结果中的所有文件资产。此方法使用Callback回调来返回FileAsset结果集。 @@ -1605,9 +1637,9 @@ async function example() { } ``` -## FetchFileResult.getAllObject8+ +### getAllObject8+ -getAllObject(): Promise<Array<FileAsset>>; +getAllObject(): Promise<Array<FileAsset>> 获取文件检索结果中的所有文件资产。此方法使用Promise来返回FileAsset结果集。 @@ -1637,9 +1669,25 @@ async function example() { } ``` -## Album.commitModify8+ +## Album8+ + +实体相册 + +### **属性** + +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| ------------ | ------ | ---- | ---- | -------------- | +| albumId | number | 是 | 否 | 相册编号 | +| albumName | string | 是 | 是 | 相册名称 | +| albumUri | string | 是 | 否 | 相册Uri | +| dateModified | number | 是 | 否 | 修改日期 | +| count | number | 是 | 否 | 相册中文件数量 | +| relativePath | string | 是 | 否 | 相对路径 | +| coverUri | string | 是 | 否 | 封面文件Uri | -commitModify(callback: AsyncCallback<void>): void; +### commitModify8+ + +commitModify(callback: AsyncCallback<void>): void 更新相册属性修改到数据库中。 @@ -1674,9 +1722,9 @@ async function example() { } ``` -## Album.commitModify8+ +### commitModify8+ -commitModify(): Promise<void>; +commitModify(): Promise<void> 更新相册属性修改到数据库中。 @@ -1709,9 +1757,9 @@ async function example() { } ``` -## Album.getFileAssets8+ +### getFileAssets8+ -getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void; +getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void 按照检索条件获取相册中的文件。此方法使用Callback回调来返回文件结果集。 @@ -1743,9 +1791,9 @@ async function example() { } ``` -## Album.getFileAssets8+ +### getFileAssets8+ - getFileAssets(options?: MediaFetchOptions): Promise<FetchFileResult>; + getFileAssets(options?: MediaFetchOptions): Promise<FetchFileResult> 按照检索条件获取相册中的文件。此方法使用异步回调来返回文件结果集。 @@ -1794,51 +1842,7 @@ async function example() { | deviceType | DeviceType | 是 | 否 | 设备类型 | | isOnline | boolean | 是 | 否 | 是否在线 | -FileAsset ---------- - -**属性:** - -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------------ | --------- | ---- | ---- | ------------------------------------------------------ | -| id | number | 是 | 否 | 文件资源编号 | -| uri | string | 是 | 否 | 文件资源uri(如:dataability:///media/image/2) | -| mimeType | string | 是 | 否 | 文件扩展属性 | -| mediaType | MediaType | 是 | 否 | 媒体类型 | -| displayName | string | 是 | 是 | 显示文件名 | -| title | string | 是 | 是 | 文件标题 | -| relativePath | string | 是 | 是 | 相对公共目录路径 | -| parent | number | 是 | 否 | 父目录id | -| size | number | 是 | 否 | 文件大小(单位:字节) | -| dateAdded | number | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | -| dateModified | number | 是 | 否 | 修改日期(修改文件时间到1970年1月1日的秒数值) | -| dateTaken | number | 是 | 否 | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | -| artist | string | 是 | 否 | 作者 | -| audioAlbum | string | 是 | 否 | 专辑 | -| width | number | 是 | 否 | 图片宽度(单位:像素) | -| height | number | 是 | 否 | 图片高度(单位:像素) | -| orientation | number | 是 | 是 | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | -| duration | number | 是 | 否 | 持续时间(单位:秒) | -| albumId | number | 是 | 否 | 文件所归属的相册编号 | -| albumUri | string | 是 | 否 | 文件所归属相册uri | -| albumName | string | 是 | 否 | 文件所归属相册名称 | - -Album ---------- - -实体相册。 -**属性** - -| 名称 | 参数型 | 可读 | 可写 | 说明 | -| ------------ | ------ | ---- | ---- | -------------- | -| albumId | number | 是 | 否 | 相册编号 | -| albumName | string | 是 | 是 | 相册名称 | -| albumUri | string | 是 | 否 | 相册Uri | -| dateModified | number | 是 | 否 | 修改日期 | -| count | number | 是 | 否 | 相册中文件数量 | -| relativePath | string | 是 | 否 | 相对路径 | -| coverUri | string | 是 | 否 | 封面文件Uri | MediaType --------- -- Gitee From 1a0f26f7b496ccfb4a35649f2643b95d09a1f1a5 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Mon, 7 Mar 2022 14:19:21 +0800 Subject: [PATCH 157/282] update docs Signed-off-by: ester.zhou --- .../arkui-ts/ts-basic-components-select.md | 72 +++++++ .../arkui-ts/ts-basic-components-textclock.md | 83 ++++++++ .../reference/arkui-ts/ts-container-row.md | 183 +++++++----------- 3 files changed, 223 insertions(+), 115 deletions(-) create mode 100644 en/application-dev/reference/arkui-ts/ts-basic-components-select.md create mode 100644 en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md diff --git a/en/application-dev/reference/arkui-ts/ts-basic-components-select.md b/en/application-dev/reference/arkui-ts/ts-basic-components-select.md new file mode 100644 index 00000000000..adb2a254677 --- /dev/null +++ b/en/application-dev/reference/arkui-ts/ts-basic-components-select.md @@ -0,0 +1,72 @@ +# Select + +> ![](public_sys-resources/icon-note.gif) ** NOTE** This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version. + +The **** component provides a drop-down list box that allows users to select among multiple options. + +## Required Permissions + +None + +## Child Components + +None + +## APIs + +Select(options: Array) + +- `SelectOption` parameters + + | Name| Type| Mandatory| Default Value| Description| + | ------ | ----------------------------------------------- | ---- | ------ | -------------- | + | value | [ResourceStr](../../ui/ts-types.md#ResourceStr) | Yes| - | Value of an option in the drop-down list box.| + | icon | [ResourceStr](../../ui/ts-types.md#ResourceStr) | No| - | Icon of an option in the drop-down list box.| + +## Attributes + +| Name| Type| Default Value| Description| +| ----------------------- | --------------------------------------------------- | ------ | ----------------------------------------------- | +| selected | number | - | Index of the initial selected option in the drop-down list box. The index of the first option is **0**.| +| value | string | - | Text of the drop-down button.| +| font | [Font](../../ui/ts-types.md#Font) | - | Text font of the drop-down button.| +| fontColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Text color of the drop-down button.| +| selectedOptionBgColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Background color of the selected option in the drop-down list box.| +| selectedOptionFont | [Font](../../ui/ts-types.md#Font) | - | Text font of the selected option in the drop-down list box.| +| selectedOptionFontColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Text color of the selected option in the drop-down list box.| +| optionBgColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Background color of an option in the drop-down list box.| +| optionFont | [Font](../../ui/ts-types.md#Font) | - | Text font of an option in the drop-down list box.| +| optionFontColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Text color of an option in the drop-down list box.| + +## Events + +| Name| Description| +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| onSelected(callback: (index: number, value?:string) => void)| Invoked when an option in the drop-down list box is selected.**index** indicates the index of the selected option.**value** indicates the value of the selected option.| + +## Example + +``` +@Entry +@Component +struct SliderExample { + build() { + Column() { + Select([{value:'aaa',icon: "/common/1.png"}, + {value:'bbb',icon: "/common/2.png"}, + {value:'ccc',icon: "/common/3.png"}, + {value:'ddd',icon: "/common/4.png"}]) + .selected(2) + .value('TTT') + .font({size: 30, weight:400, family: 'serif', style: FontStyle.Normal }) + .selectedOptionFont({size: 40, weight: 500, family: 'serif', style: FontStyle.Normal }) + .optionFont({size: 30, weight: 400, family: 'serif', style: FontStyle.Normal }) + .onSelected((index:number)=>{ + console.info("Select:" + index) + }) + } + } +} +``` + +![](figures/select.png) diff --git a/en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md b/en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md new file mode 100644 index 00000000000..8487b4f8e42 --- /dev/null +++ b/en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md @@ -0,0 +1,83 @@ +# TextClock + +> ![](public_sys-resources/icon-note.gif) ** NOTE** This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version. + +The **** component displays the current system time in text format for different time zones. The time is accurate to seconds. + +## Required Permissions + +None + +## Child Components + +None + +## APIs + +TextClock(options?: {timeZoneOffset?: number, contorller?: TextClockController}) + +- Parameters + + | Name| Type| Mandatory| Default Value| Description| + | -------- | -------- | ---- | ------------------ | ------------------------------------------------------------ | + | timeZoneOffset | number | No| Time zone offset| Sets the time zone offset. The value range is [-14, 12], indicating UTC+12 to UTC-12. A negative value indicates Eastern Standard Time, and a positive value indicates Western Standard Time. For example, **-8** indicates UTC+8. For countries or regions crossing the International Date Line, use -13 (UTC+13) and -14 (UTC+14) to ensure consistent time within the entire country or region.| + | contorller | [TextClockContorller](#TextClockController) | No| null | Binds a controller to control the status of the **** component.| + +## Attributes + +| Name| Type| Default Value| Description| +| ------ | -------- | -------- | ------------------------------------------------------------ | +| format | string | 'hhmmss' | Time format, for example, **yyyy/mm/dd** or **yyyy-mm-dd**. Supported time format strings:
  • yyyy (year)
  • mm (two-letter abbreviated month name)
  • mmm (three-letter abbreviated month name)
  • mmmm (full month name)
  • dd (two-letter abbreviated day of the week)
  • ddd (three-letter abbreviated day of the week)
  • dddd (full day of the week)
  • HH (24-hour format)
  • hh (12-hour format)
  • MM/mm (minute)
  • SS/ss (second)
| + +## TextClockController + +Controller of the **** component, which can be bound to the component for status control. + +| API| Description| +| -------------------------------------------- | ------------------------------------------------------------ | +| start() | Starts the **** component.| +| stop() | Stops the **** component.| + + +## Events + +| Name| Description| +| -------------------------------------------- | ------------------------------------------------------------ | +| onDateChange(event: (value: number) => void) | Triggered when the time changes in seconds at minimum.
value: Unix time stamp, which is the number of milliseconds that have elapsed since the Unix epoch.| + +## Example + +``` +@Entry +@Component +struct Second { + @State accumulateTime: number = 0 + controller: TextClockController = new TextClockController() + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center}) { + Text('current milliseconds is' + this.accumulateTime) + .fontSize(20) + TextClock({timeZoneOffset: -8, controller: this.controller}) + .format('hhmmss') + .onDateChange((value: number) => { + this.accumulateTime = value + }) + .margin(20) + .fontSize(30) + Button("start TextClock") + .margin({ bottom: 10 }) + .onClick(()=>{ + this.controller.start() + }) + Button("stop TextClock") + .onClick(()=>{ + this.controller.stop() + }) + } + .width('100%') + .height('100%') + } +} +``` +![](figures/text_clock.png) diff --git a/en/application-dev/reference/arkui-ts/ts-container-row.md b/en/application-dev/reference/arkui-ts/ts-container-row.md index e25ea9b861a..5618345d45f 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-row.md +++ b/en/application-dev/reference/arkui-ts/ts-container-row.md @@ -1,106 +1,48 @@ -# Row +# Row ->![](../../public_sys-resources/icon-note.gif) **NOTE:** ->This component is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> This component is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version. -The **** component lays out child components horizontally. -## Required Permissions +The **** component lays out child components horizontally. + + +## Required Permissions None -## Child Components - -This component can contain child components. - -## APIs - -Row\(value:\{space?: Length\}\) - -- Parameters - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Default Value

-

Description

-

space

-

Length

-

No

-

0

-

Space between any two adjacent child components in the horizontal layout.

-
- - -## Attributes - - - - - - - - - - - - - - -

Name

-

Type

-

Default Value

-

Description

-

alignItems

-

VerticalAlign

-

Center

-

Alignment mode of the child components in the vertical direction.

-
- -- VerticalAlign enums - - - - - - - - - - - - - - - - -

Name

-

Description

-

Top

-

Top aligned.

-

Center

-

Center alignment. This is the default alignment mode.

-

Bottom

-

Bottom aligned.

-
- - -## Example + +## Child Components + +Supported + + +## APIs + +Row(value:{space?: Length}) + +- Parameters + | Name| Type| Mandatory| Default Value| Description| + | -------- | -------- | -------- | -------- | -------- | + | space | Length | No| 0 | Space between two adjacent child components in the horizontal layout.| + + +## Attributes + +| Name| Type| Default Value| Description| +| -------- | -------- | -------- | -------- | +| alignItems | VerticalAlign | VerticalAlign.Center | Alignment mode of the child components in the vertical direction.| +| justifyContent8+ | [FlexAlign](ts-container-flex.md) | FlexAlign.Start | Alignment mode of the child components in the horizontal direction.| + +- VerticalAlign enums + | Name| Description| + | -------- | -------- | + | Top | Top aligned.| + | Center | Center aligned. This is the default alignment mode.| + | Bottom | Bottom aligned.| + + +## Example ``` @Entry @@ -109,26 +51,37 @@ struct RowExample { build() { Column({ space: 5 }) { Text('space').fontSize(9).fontColor(0xCCCCCC).width('90%') - Row({ space: 20 }) { - Row().width(150).height(50).backgroundColor(0xAFEEEE) - Row().width(150).height(50).backgroundColor(0x00FFFF) - }.width(321).height(52).border({ width: 1 }) - - Text('alignItems(Bottom)').fontSize(9).fontColor(0xCCCCCC).width('90%') - Row() { - Row().width('50%').height(50).backgroundColor(0xAFEEEE) - Row().width('50%').height(50).backgroundColor(0x00FFFF) - }.alignItems(VerticalAlign.Bottom).width('90%').height(100).border({ width: 1 }) - - Text('alignItems(Top)').fontSize(9).fontColor(0xCCCCCC).width('90%') - Row() { - Row().width('50%').height(50).backgroundColor(0xAFEEEE) - Row().width('50%').height(50).backgroundColor(0x00FFFF) - }.alignItems(VerticalAlign.Top).width('90%').height(100).border({ width: 1 }) + Row({ space: 5 }) { + Row().width('30%').height(50).backgroundColor(0xAFEEEE) + Row().width('30%').height(50).backgroundColor(0x00FFFF) + }.width('90%').height(107).border({ width: 1 }) + + Text('alignItems(Top)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Row().width('30%').height(50).backgroundColor(0xAFEEEE) + Row().width('30%').height(50).backgroundColor(0x00FFFF) + }.alignItems(VerticalAlign.Top).height('15%').border({ width: 1 }) + + Text('alignItems(Center)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Row().width('30%').height(50).backgroundColor(0xAFEEEE) + Row().width('30%').height(50).backgroundColor(0x00FFFF) + }.alignItems(VerticalAlign.Center).height('15%').border({ width: 1 }) + + Text('justifyContent(End)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Row().width('30%').height(50).backgroundColor(0xAFEEEE) + Row().width('30%').height(50).backgroundColor(0x00FFFF) + }.width('90%').border({ width: 1 }).justifyContent(FlexAlign.End) + + Text('justifyContent(Center)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Row().width('30%').height(50).backgroundColor(0xAFEEEE) + Row().width('30%').height(50).backgroundColor(0x00FFFF) + }.width('90%').border({ width: 1 }).justifyContent(FlexAlign.Center) }.width('100%') } } ``` -![](figures/row.png) - +![zh-cn_image_0000001174422908](figures/Row.png) -- Gitee From fa0dd447456c5204510bf058b9bc02d98b468863 Mon Sep 17 00:00:00 2001 From: zengyawen Date: Mon, 7 Mar 2022 14:22:25 +0800 Subject: [PATCH 158/282] update docs Signed-off-by: zengyawen --- .../reference/apis/js-apis-battery-info.md | 4 +-- .../reference/apis/js-apis-brightness.md | 26 +++++++++++-------- .../reference/apis/js-apis-power.md | 10 ++++--- .../reference/apis/js-apis-runninglock.md | 12 ++++----- .../reference/apis/js-apis-thermal.md | 4 +-- 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-battery-info.md b/zh-cn/application-dev/reference/apis/js-apis-battery-info.md index 1727267bc29..d627fed7836 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-battery-info.md +++ b/zh-cn/application-dev/reference/apis/js-apis-battery-info.md @@ -2,8 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -> -> 该模块主要提供电池状态和充放电状态的查询接口。 + +该模块主要提供电池状态和充放电状态的查询接口。 ## 导入模块 diff --git a/zh-cn/application-dev/reference/apis/js-apis-brightness.md b/zh-cn/application-dev/reference/apis/js-apis-brightness.md index d08f6276f3e..07ed408bb13 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-brightness.md +++ b/zh-cn/application-dev/reference/apis/js-apis-brightness.md @@ -2,8 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -> -> 该模块提供屏幕亮度的设置接口。 + +该模块提供屏幕亮度的设置接口。 ## 导入模块 @@ -22,13 +22,17 @@ setValue(value: number) 设置系统的屏幕亮度。 -- 参数: - | 参数名 | 类型 | 必填 | 说明 | - | ----- | ------ | ---- | ----------- | - | value | number | 是 | 亮度的值(0~255) | +**补充说明:**该接口为system api,仅供系统应用使用。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----- | ------ | ---- | ----------- | +| value | number | 是 | 亮度的值(0~255) | -- 示例: - ``` - import brightness from '@ohos.brightness.d.ts'; - brightness.setValue(128); - ``` +**示例:** + +``` +import brightness from '@ohos.brightness.d.ts'; +brightness.setValue(128); +``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-power.md b/zh-cn/application-dev/reference/apis/js-apis-power.md index 1130de52f2a..3c223afea0f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-power.md +++ b/zh-cn/application-dev/reference/apis/js-apis-power.md @@ -2,8 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -> -> 该模块主要提供重启、关机、查询屏幕状态等接口。 + +该模块主要提供重启、关机、查询屏幕状态等接口。 ## 导入模块 @@ -23,7 +23,9 @@ shutdownDevice(reason: string): void 系统关机。 -需要权限:ohos.permission.SHUTDOWN +**需要权限:**ohos.permission.SHUTDOWN + +**补充说明:**该接口为system api,仅供系统应用使用。 **参数:** @@ -45,7 +47,7 @@ rebootDevice(reason: string): void 重启设备。 -需要权限:ohos.permission.REBOOT(重启权限)、ohos.permission.REBOOT_UPDATER(重启并进入updater模式的权限) +**需要权限:**ohos.permission.REBOOT(重启权限)、ohos.permission.REBOOT_UPDATER(重启并进入updater模式的权限) **参数:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-runninglock.md b/zh-cn/application-dev/reference/apis/js-apis-runninglock.md index 8a5a26f33b3..f26db121c4b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-runninglock.md +++ b/zh-cn/application-dev/reference/apis/js-apis-runninglock.md @@ -2,8 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -> -> 该模块主要提供Runninglock锁相关操作的接口,包括创建、查询、持锁、释放锁等操作。 + +该模块主要提供Runninglock锁相关操作的接口,包括创建、查询、持锁、释放锁等操作。 ## 导入模块 @@ -91,7 +91,7 @@ createRunningLock(name: string, type: RunningLockType, callback: AsyncCallback&l 创建RunningLock锁。 -需要权限:ohos.permission.RUNNING_LOCK +**需要权限:**ohos.permission.RUNNING_LOCK **参数:** @@ -124,7 +124,7 @@ createRunningLock(name: string, type: RunningLockType): Promise<RunningLock&g 创建Runninglock锁。 -需要权限:ohos.permission.RUNNING_LOCK +**需要权限:**ohos.permission.RUNNING_LOCK **参数:** @@ -161,7 +161,7 @@ runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.B lock(timeout: number): void -锁定和持有RunningLock +锁定和持有RunningLock。 **参数:** @@ -207,7 +207,7 @@ runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.B isUsed(): boolean -查询当前Runninglock是持有状态,还是释放状态。 +查询当前Runninglock是持有状态还是释放状态。 **返回值:** | 类型 | 说明 | diff --git a/zh-cn/application-dev/reference/apis/js-apis-thermal.md b/zh-cn/application-dev/reference/apis/js-apis-thermal.md index 9bd06886745..363db2384ab 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-thermal.md +++ b/zh-cn/application-dev/reference/apis/js-apis-thermal.md @@ -2,8 +2,8 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -> -> 该模块主要提供设备热状态的监听接口。 + +该模块主要提供设备热状态的监听接口。 ## 导入模块 -- Gitee From 72167816f3a2114384d2abc508b6561bf3f8892b Mon Sep 17 00:00:00 2001 From: xuyong Date: Mon, 7 Mar 2022 14:37:05 +0800 Subject: [PATCH 159/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E7=9A=84API=E6=96=87=E6=A1=A3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuyong --- .../reference/apis/js-apis-hitracechain.md | 2 +- .../reference/apis/js-apis-hitracemeter.md | 10 ++++------ .../reference/apis/js-apis-hitracechain.md | 2 +- .../reference/apis/js-apis-hitracemeter.md | 7 +++---- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-hitracechain.md b/en/application-dev/reference/apis/js-apis-hitracechain.md index 70ac9e5d594..2ad97f096f7 100644 --- a/en/application-dev/reference/apis/js-apis-hitracechain.md +++ b/en/application-dev/reference/apis/js-apis-hitracechain.md @@ -58,7 +58,7 @@ Defines a **HiTraceId** object. | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | | chainId | bigint | Yes| Call chain ID.| -| spandId | number | No| Span ID.| +| spanId | number | No| Span ID.| | parentSpanId | number | No| Parent span ID.| | flags | number | No| Trace flag combination.| diff --git a/en/application-dev/reference/apis/js-apis-hitracemeter.md b/en/application-dev/reference/apis/js-apis-hitracemeter.md index 14e6b745d1e..afa0da64065 100644 --- a/en/application-dev/reference/apis/js-apis-hitracemeter.md +++ b/en/application-dev/reference/apis/js-apis-hitracemeter.md @@ -18,9 +18,9 @@ SystemCapability.HiviewDFX.HiTrace ## hiTraceMeter.startTrace -startTrace(name: string, taskId: number, expectedTime?: number): void +startTrace(name: string, taskId: number): void -Starts a trace task. **expectedTime** is an optional parameter, which specifies the expected duration of the trace. +Starts a trace taske. If multiple trace tasks with the same name need to be performed at the same time or a trace task needs to be performed multiple times concurrently, different task IDs must be specified in **startTrace**. @@ -32,13 +32,11 @@ If the trace tasks with the same name are not performed at the same time, the sa | -------- | -------- | -------- | -------- | | name | string | Yes| Name of the trace task to start.| | taskId | number | Yes| Task ID.| -| expectedTime | number | No| Expected duration of the trace, in ms.| **Example** ``` hiTraceMeter.startTrace("myTestFunc", 1); -hiTraceMeter.startTrace("myTestFunc", 1, 5); // The expected duration of the trace task is 5 ms. ``` @@ -88,7 +86,7 @@ hiTraceMeter.finishTrace("myTestFunc", 1); ## hiTraceMeter.traceByValue -traceByValue(name: string, value: number): void +traceByValue(name: string, count: number): void Traces the value changes of a variable. @@ -97,7 +95,7 @@ Traces the value changes of a variable. | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | | name | string | Yes| Name of the variable.| -| value | number | Yes| Value of the variable.| +| count | number | Yes| Value of the variable.| **Example** ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-hitracechain.md b/zh-cn/application-dev/reference/apis/js-apis-hitracechain.md index be311c04091..78d3e21d8b0 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-hitracechain.md +++ b/zh-cn/application-dev/reference/apis/js-apis-hitracechain.md @@ -58,7 +58,7 @@ SystemCapability.HiviewDFX.HiTrace | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | chainId | bigint | 是 | 跟踪链标识。 | -| spandId | number | 否 | 分支标识。 | +| spanId | number | 否 | 分支标识。 | | parentSpanId | number | 否 | 父分支标识。 | | flags | number | 否 | 跟踪标志组合。 | diff --git a/zh-cn/application-dev/reference/apis/js-apis-hitracemeter.md b/zh-cn/application-dev/reference/apis/js-apis-hitracemeter.md index d2bf527c44c..0af8413c1b2 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-hitracemeter.md +++ b/zh-cn/application-dev/reference/apis/js-apis-hitracemeter.md @@ -18,7 +18,7 @@ SystemCapability.HiviewDFX.HiTrace ## hiTraceMeter.startTrace -startTrace(name: string, taskId: number, expectedTime?: number): void +startTrace(name: string, taskId: number): void 标记一个预追踪耗时任务的开始,expectedTime是可选参数,标识该任务的期望耗时。 @@ -32,7 +32,6 @@ startTrace(name: string, taskId: number, expectedTime?: number): void | -------- | -------- | -------- | -------- | | name | string | 是 | 要追踪的任务名称 | | taskId | number | 是 | 任务id | -| expectedTime | number | 否 | 期望的耗时时间,单位:ms | **示例:** @@ -88,7 +87,7 @@ hiTraceMeter.finishTrace("myTestFunc", 1); ## hiTraceMeter.traceByValue -traceByValue(name: string, value: number): void +traceByValue(name: string, count: number): void 用来标记一个预追踪的数值变量,该变量的数值会不断变化。 @@ -97,7 +96,7 @@ traceByValue(name: string, value: number): void | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | name | string | 是 | 要追踪的数值变量名称 | -| value | number | 是 | 变量的值 | +| count | number | 是 | 变量的值 | **示例:** ``` -- Gitee From f600dd525116a2afce66d261c24803f93fdf187f Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Mon, 7 Mar 2022 14:38:24 +0800 Subject: [PATCH 160/282] update docs Signed-off-by: ester.zhou --- .../reference/arkui-ts/figures/row.png | Bin 9327 -> 18829 bytes .../reference/arkui-ts/figures/select.png | Bin 0 -> 15640 bytes .../reference/arkui-ts/figures/text_clock.png | Bin 0 -> 51282 bytes .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes .../reference/arkui-ts/ts-container-row.md | 2 +- 10 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 en/application-dev/reference/arkui-ts/figures/select.png create mode 100644 en/application-dev/reference/arkui-ts/figures/text_clock.png create mode 100644 en/application-dev/reference/arkui-ts/public_sys-resources/icon-caution.gif create mode 100644 en/application-dev/reference/arkui-ts/public_sys-resources/icon-danger.gif create mode 100644 en/application-dev/reference/arkui-ts/public_sys-resources/icon-note.gif create mode 100644 en/application-dev/reference/arkui-ts/public_sys-resources/icon-notice.gif create mode 100644 en/application-dev/reference/arkui-ts/public_sys-resources/icon-tip.gif create mode 100644 en/application-dev/reference/arkui-ts/public_sys-resources/icon-warning.gif diff --git a/en/application-dev/reference/arkui-ts/figures/row.png b/en/application-dev/reference/arkui-ts/figures/row.png index 3b44b9a41cb0fa78afcde81f82e0ad63c90de58d..6bf426a5f019e76b7b3a0953643988690eb67b1e 100644 GIT binary patch literal 18829 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

ygLR5b`f@#yb9Bid>xuTOz@*l)Of9Oe zN349P-s!TIbd6pg*Y-+{3hFV)&<<8y`DUSp4R&b^x2uOH6JiuQ;Zd7ceQ&nMARhVS zo>o9%Bg!dV+Ut1Mci&JHtRg>Pxx<)c`}E_?_bZQ=mU#QM{9&5m-wsT?obGT8r(X+M zvP4!eQctY4^WCjxmCj>jrl-MQ9+&R6;KJoJ){UZQ_%ZszYSb8Yq3)&?9L_BY(1TTU zh$6Y;%-9y122ZEv#+YJVhwTE5Lkr-?)OV1U%%?Z&z=dKK7@kb6XdbPj$IPT^DA;m& z8+a~feds#B-;77;CP{EsR_X(J%&~~T7QPIdwXpdpic88^w@JK7;qZe$@FGIz26^du zsYBW1h13jW$U+mJIlc-$m%z1+X^T8v++jnS8 z8{UV{zEPKh_Hhp4+H^T)we)&r55G$<(`}KjovHReP8+IxG#$~VpOcQcF7HzNWg|H- z#Cw8la8&18pdPsSV4YGw7PdDaBRhLg>1`Bu9Fd<9bYtj z-MEXiI5}&H2une(_QC3@jZ&VR=F0fnykMBZMS?*-2V2$EPP}545dINnyD2cU{Mz6sVq$bf1)X!WGA$v~Rnerq z`y?|}4cXcqm(4@@;Z4QM%|TsS0hfr%*g0sl=pl_1B@pFnWa+PNtUwXqE(3I~YCql8 zieLbPCra5W5&<1~Mf7N#*{iPI^cOlX`uOUhska<|rj@FMtDAXyjcd~}Q&7VK!C2-7 zMhBR(>IUg6sl#fLU{J@{VmM+LO$`_pL`c$}Q~Ia8Kvm$0T`3KZ3e;BzmOws`n~j_} z)1F+)pu*ZBwRfE0mY%Xgmc2@|So?WQx!gj*K2Tg8SVz#;*b)K2Gixl=?}SLX5%J`n z%|!ul`(O}jxmGI?@T*NmOb8C<%};_V8_kAzcnC@xQLgBJhld z(8U{DpZ7PBG90WM|C%6c-zzMF#DbQ1jQuGsn3K$!#j3nI% z%$V10*&2Tkyf?1vkXJhn3~dm`9~(;tfrto7&n=ShDQ|t0CID! z12kt2%2l+yJROEdi3Y5eicaknQZ9EFaH1QOA9R^Lr zRWmvlele)X+zViM?D*tRaJ0hg?G&?l=Ph#}TkQO=e60hcQ1Q|#jtlZ6INTh4&|7SN zyFxC=0%72HlhhIhJW>ll?)$Y5jF26OM}y`9PSx6K8UXr|`Kt?C1v>>fd%^G&ZiOdV zgxzW^O^3}QK$N;N+?IB=K541aR;_1e*n=yEJ|KXqvzz;?8MPZiPLv#3x8SV_=zMpc z^5QA+(K!bthbp^l4-%U(#gnG9W-rU7z1WR6L0+fsLpiG25$5u|!Yxll zpU(vM!GbKY#Z?T&$BJPK4Qd>9kU#&(N!fdfnfkn#;;ICwZV1&`Qfi>=XEwWWUMa+E zI|^n@g3>*~&4rC$Ul>tuz$LipH`4DCuNO~V`()ur!B3N?2YZu-n(HbVpCY2LtU>PHi$aL912u2Z#T<;slM$&9%=eQ za9J<_poCInv=Iz>W zllEl!&lN@Tv0NYijdBu6+u)7w!PzL_H{Ne+qFetSuozMJj+|IW8C34m+k=TOwd&-> z#5Yolo2qv}on#l&h)XMt!QB+yk^Xlcs*~6%@f_n3fy=PWW%_C2BYT diff --git a/en/application-dev/reference/arkui-ts/figures/select.png b/en/application-dev/reference/arkui-ts/figures/select.png new file mode 100644 index 0000000000000000000000000000000000000000..2672d45f3ed5685aa6f350c2cade469c065a13af GIT binary patch literal 15640 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 uytxtwoSSHs}OK8 zOTq^*(yAPK;SmQm38Bc|=Y^A|sPo z!QT9HBof|rECF{=je5HQM{+2z*h#g%#D<7j3bvVp7hF_bw&9sg-%F)QR=oVSUMy{G zC})Ide~oMqcV&rAQ$O^fG?Yo~OwCX0X1Ku{ z;Us`nt1|Lo2U-JAi%J>qHW%P^7i4#j)grre?6wyBj@~%;?%-VYSy^MMo?7cIrNnWn zG+F35{8bt)T0<$DJ;9@bb$0sV+3K}V{(BuCVx%@*jP_4ewO|VHbh}mFno|wuI~0gB z8PAWOko-;sF=Y1-M~%p%7G(U+tHV(h*7Wpl@>-$njp#i_s*In|*a`-@jDuMNS_5k% zfXgOLSVM(&%>kP~PPEe;-Sx}YPQ2ngORC88iClirgO|p!h+GY(c+AVX!UBJdPP`Db z3|WJ_`NWzRorukFBc<2Q+rB48v)0K@FJfrcxD?nDXyC)e{Db-Loe4pqR-){Ms1^5k zo35GN1fkXzfJiRo{{i@J5Bq=M3$etJYr=)@(-5THv)-<}wA21|ojS;(9$ed(pW)qL z&9U{_)8Bd0U#NpenMpM0(cIhY@P_aJi2(T>ZZLWm=gQoWf1(RC!&5Sn=fPsT827W7 zn!<+JAVC+O7J?UFKQ;JwVY3_z<-Kj>fVSmq`>2Q3;rQLOR^%M z?lvZv5jrAlSaq!P>CbnOq&`<^+LquXC_GuO%I)9LTp%IAnQ#C!gWMy^N$BPxg&;;& zCbb17z;@4HYBuRr$5x&N&Pr&o$kx!Y56o54Y7z{E?)&WV9Ot`ocN>nV0`sIfkvtG|L7Ch+`K_y5gk`2m+}XH`3Y zT~5)}IcE;6-3#NK5AE%dm~r2Gp~Thw4R!06yb9-v&y7jU{E>BuJN?x6ocXGAe5)Q_ z`QQj5Hhb#xe2UQglk;fZv&cg;KiSSs=M5;efB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/en/application-dev/reference/arkui-ts/public_sys-resources/icon-danger.gif b/en/application-dev/reference/arkui-ts/public_sys-resources/icon-danger.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/en/application-dev/reference/arkui-ts/public_sys-resources/icon-note.gif b/en/application-dev/reference/arkui-ts/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/en/application-dev/reference/arkui-ts/public_sys-resources/icon-notice.gif b/en/application-dev/reference/arkui-ts/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 GIT binary patch literal 406 zcmV;H0crk6Nk%w1VIu$@0J8u9|NsB@_xJDb@8;&_*4Ea}&d#;9wWXz{jEszHYim+c zQaU<1At50E0000000000A^8Le000gEEC2ui03!e%000R7038S%NU)&51O^i-Tu6`s z0)`MFE@;3YqD6xSC^kTNu_J>91{PH8XfZ(p1pp2-SU@u3#{mEUC}_}tg3+I#{z}{Ok@D_ZUDg- zt0stin4;pC8M{WLSlRH*1pzqEw1}3oOskyNN?j;7HD{BBZ*OEcv4HK!6Bk6beR+04 z&8}k>SkTusVTDmkyOz#5fCA$JTPGJVQvr3uZ?QzzPQFvD0rGf_PdrcF`pMs}p^BcF zKtKTd`0wipR%nKN&Wj+V}pX;WC3SdJV!a_8Qi zE7z`U*|Y^H0^}fB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/en/application-dev/reference/arkui-ts/ts-container-row.md b/en/application-dev/reference/arkui-ts/ts-container-row.md index 5618345d45f..628b9672084 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-row.md +++ b/en/application-dev/reference/arkui-ts/ts-container-row.md @@ -84,4 +84,4 @@ struct RowExample { } ``` -![zh-cn_image_0000001174422908](figures/Row.png) +![en_image_0000001174422908](figures/row.png) -- Gitee From a3b21f49017e2ba4f00ff2977b213e2de82c8843 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Mon, 7 Mar 2022 14:42:33 +0800 Subject: [PATCH 161/282] update docs Signed-off-by: ester.zhou --- .../reference/arkui-ts/ts-basic-components-select.md | 4 ++-- .../reference/arkui-ts/ts-basic-components-textclock.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/en/application-dev/reference/arkui-ts/ts-basic-components-select.md b/en/application-dev/reference/arkui-ts/ts-basic-components-select.md index adb2a254677..630861707ac 100644 --- a/en/application-dev/reference/arkui-ts/ts-basic-components-select.md +++ b/en/application-dev/reference/arkui-ts/ts-basic-components-select.md @@ -1,6 +1,6 @@ # Select -> ![](public_sys-resources/icon-note.gif) ** NOTE** This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version. +> ![](public_sys-resources/icon-note.gif) **NOTE** This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version. The **** component provides a drop-down list box that allows users to select among multiple options. @@ -42,7 +42,7 @@ Select(options: Array) | Name| Description| | ------------------------------------------------------------ | ------------------------------------------------------------ | -| onSelected(callback: (index: number, value?:string) => void)| Invoked when an option in the drop-down list box is selected.**index** indicates the index of the selected option.**value** indicates the value of the selected option.| +| onSelected(callback: (index: number, value?:string) => void)| Invoked when an option in the drop-down list box is selected. **index** indicates the index of the selected option. **value** indicates the value of the selected option.| ## Example diff --git a/en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md b/en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md index 8487b4f8e42..6f23dd45ae1 100644 --- a/en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md +++ b/en/application-dev/reference/arkui-ts/ts-basic-components-textclock.md @@ -1,6 +1,6 @@ # TextClock -> ![](public_sys-resources/icon-note.gif) ** NOTE** This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version. +> ![](public_sys-resources/icon-note.gif) **NOTE** This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version. The **** component displays the current system time in text format for different time zones. The time is accurate to seconds. -- Gitee From 8e437e1fd9c4cfb6a9733598d3a9141c71f747d6 Mon Sep 17 00:00:00 2001 From: xuyong Date: Mon, 7 Mar 2022 14:45:58 +0800 Subject: [PATCH 162/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E7=9A=84API=E6=96=87=E6=A1=A3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuyong --- en/application-dev/reference/apis/js-apis-hitracemeter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/application-dev/reference/apis/js-apis-hitracemeter.md b/en/application-dev/reference/apis/js-apis-hitracemeter.md index afa0da64065..17f62fb18b4 100644 --- a/en/application-dev/reference/apis/js-apis-hitracemeter.md +++ b/en/application-dev/reference/apis/js-apis-hitracemeter.md @@ -20,7 +20,7 @@ SystemCapability.HiviewDFX.HiTrace startTrace(name: string, taskId: number): void -Starts a trace taske. +Starts a trace task. If multiple trace tasks with the same name need to be performed at the same time or a trace task needs to be performed multiple times concurrently, different task IDs must be specified in **startTrace**. -- Gitee From cbd44ca8dd790a7939b161ea8e6de1b9d4feb111 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Mon, 7 Mar 2022 15:38:05 +0800 Subject: [PATCH 163/282] update docs Signed-off-by: shawn_he --- .../reference/apis/js-apis-thermal.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 en/application-dev/reference/apis/js-apis-thermal.md diff --git a/en/application-dev/reference/apis/js-apis-thermal.md b/en/application-dev/reference/apis/js-apis-thermal.md new file mode 100644 index 00000000000..9c534aae3b5 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-thermal.md @@ -0,0 +1,98 @@ +# Thermal Management + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import thermal from '@ohos.thermal'; +``` + + +## ThermalLevel + +Represents the thermal level. + +| Name| Default Value| Description| +| -------- | -------- | -------- | +| COOL | 0 | The device is cool, and services are not restricted.| +| NORMAL | 1 | The device is operational but is not cool. You need to pay attention to its heating.| +| WARM | 2 | The device is warm. You need to stop or delay some imperceptible services.| +| HOT | 3 | The device is heating up. You need to stop all imperceptible services and downgrade or reduce the load of other services.| +| OVERHEATED | 4 | The device is overheated. You need to stop all imperceptible services and downgrade or reduce the load of major services.| +| WARNING | 5 | The device is overheated and is about to enter the emergency state. You need to stop all imperceptible services and downgrade major services to the maximum extent.| +| EMERGENCY | 6 | The device has entered the emergency state. You need to stop all services except those for the emergency help purposes.| + + +## thermal.subscribeThermalLevel + +subscribeThermalLevel(callback: AsyncCallback<ThermalLevel>): void + +Subscribes to thermal level changes. + +**System Capabilities** + +SystemCapability.PowerManager.ThermalManager + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<ThermalLevel> | Yes| Callback used to obtain the return value.
Return value: thermal level| + +**Example** + +``` +thermal.subscribeThermalLevel((lev) => { + console.info("Thermal level is: " + lev); +}) +``` + +## thermal.unsubscribeThermalLevel + +unsubscribeThermalLevel(callback?: AsyncCallback): void + +Unsubscribes from thermal level changes. + +**System Capabilities** + +SystemCapability.PowerManager.ThermalManager + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<void> | No| Callback without a return value.| + +**Example** + +``` +thermal.unsubscribeThermalLevel(() => { + console.info("Unsubscribe completed."); +}); +``` + +## thermal.getThermalLevel + +getThermalLevel(): ThermalLevel + +Obtains the current thermal level. + +**System Capabilities** + +SystemCapability.PowerManager.ThermalManager + +**Return value** + +| Type| Description| +| -------- | -------- | +| ThermalLevel | Thermal level obtained.| + +**Example** + +``` +var lev = thermal.getThermalLevel(); +console.info("Thermal level is: " + lev); +``` -- Gitee From d347b3070591b17b22f33bf865a2ae156e79b9e5 Mon Sep 17 00:00:00 2001 From: yaoyuchi Date: Mon, 7 Mar 2022 16:06:45 +0800 Subject: [PATCH 164/282] fix sidebar demo Signed-off-by: yaoyuchi --- .../reference/arkui-ts/ts-container-sidebarcontainer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md b/zh-cn/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md index aa7d64c8a43..d3f5d40f7d5 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md @@ -77,7 +77,7 @@ struct SideBarContainerExample { @State current: number = 1 build() { - SideBarContainer({ type: SideBarContainerType.Embed }) + SideBarContainer(SideBarContainerType.Embed) { Column() { ForEach(this.arr, (item, index) => { -- Gitee From 591bb3d7f7fbf86234e46a79ca4226d2a45064b4 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Mon, 7 Mar 2022 16:33:00 +0800 Subject: [PATCH 165/282] update link Signed-off-by: ester.zhou --- .../reference/arkui-ts/ts-basic-components-select.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/en/application-dev/reference/arkui-ts/ts-basic-components-select.md b/en/application-dev/reference/arkui-ts/ts-basic-components-select.md index 630861707ac..25d73234a37 100644 --- a/en/application-dev/reference/arkui-ts/ts-basic-components-select.md +++ b/en/application-dev/reference/arkui-ts/ts-basic-components-select.md @@ -29,13 +29,13 @@ Select(options: Array) | ----------------------- | --------------------------------------------------- | ------ | ----------------------------------------------- | | selected | number | - | Index of the initial selected option in the drop-down list box. The index of the first option is **0**.| | value | string | - | Text of the drop-down button.| -| font | [Font](../../ui/ts-types.md#Font) | - | Text font of the drop-down button.| +| font | [Font](../../ui/ts-types.md) | - | Text font of the drop-down button.| | fontColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Text color of the drop-down button.| | selectedOptionBgColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Background color of the selected option in the drop-down list box.| -| selectedOptionFont | [Font](../../ui/ts-types.md#Font) | - | Text font of the selected option in the drop-down list box.| +| selectedOptionFont | [Font](../../ui/ts-types.md) | - | Text font of the selected option in the drop-down list box.| | selectedOptionFontColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Text color of the selected option in the drop-down list box.| | optionBgColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Background color of an option in the drop-down list box.| -| optionFont | [Font](../../ui/ts-types.md#Font) | - | Text font of an option in the drop-down list box.| +| optionFont | [Font](../../ui/ts-types.md) | - | Text font of an option in the drop-down list box.| | optionFontColor | [ResourceColor](../../ui/ts-types.md#ResourceColor) | - | Text color of an option in the drop-down list box.| ## Events -- Gitee From 5ff1071bdc33720b0b6830872d4a32db139f417a Mon Sep 17 00:00:00 2001 From: maosiping Date: Mon, 7 Mar 2022 16:50:41 +0800 Subject: [PATCH 166/282] =?UTF-8?q?sim=E5=8D=A1=E7=AE=A1=E7=90=86API?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: maosiping --- .../reference/apis/js-apis-sim.md | 202 +++++++++++++++--- 1 file changed, 177 insertions(+), 25 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-sim.md b/zh-cn/application-dev/reference/apis/js-apis-sim.md index abdaf41abbe..be20dadb898 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-sim.md +++ b/zh-cn/application-dev/reference/apis/js-apis-sim.md @@ -10,11 +10,11 @@ import sim from '@ohos.telephony.sim'; ``` -## sim.getSimIccId +## sim.isSimActive -getSimIccId\(slotId: number, callback: AsyncCallback\): void +isSimActive\(slotId: number, callback: AsyncCallback\): void -获取指定卡槽SIM卡的ICCID(Integrate Circuit Card Identity),使用callback方式作为异步方法。 +获取指定卡槽SIM卡的是否激活,使用callback方式作为异步方法。 需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 @@ -23,22 +23,22 @@ getSimIccId\(slotId: number, callback: AsyncCallback\): void | 参数名 | 类型 | 必填 | 说明 | | -------- | --------------------------- | ---- | -------------------------------------- | | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | -| callback | AsyncCallback<string> | 是 | 回调函数。 | +| callback | AsyncCallback<boolean> | 是 | 回调函数。 | **示例:** ``` -sim.getSimIccId(0, (err, data) => { +sim.isSimActive(0, (err, data) => { console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); }); ``` -## sim.getSimIccId +## sim.isSimActive -getSimIccId\(slotId: number\): Promise +isSimActive\(slotId: number\): Promise -获取指定卡槽SIM卡的ICCID(Integrate Circuit Card Identity),使用Promise方式作为异步方法。 +获取指定卡槽SIM卡的是否激活,使用Promise方式作为异步方法。 需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 @@ -52,19 +52,20 @@ getSimIccId\(slotId: number\): Promise | 类型 | 说明 | | --------------------- | ---------------------------------- | -| Promise<string> | 以Promise形式返回指定卡槽的ICCID。 | +| Promise<boolean> | 以Promise形式返回指定卡槽的是否激活,如果激活返回true。 | **示例:** ``` -let promise = sim.getSimIccId(0); +let promise = sim.isSimActive(0); promise.then(data => { - console.log(`getSimIccId success, promise: data->${JSON.stringify(data)}`); + console.log(`isSimActive success, promise: data->${JSON.stringify(data)}`); }).catch(err => { - console.log(`getSimIccId fail, promise: err->${JSON.stringify(err)}`); + console.log(`isSimActive fail, promise: err->${JSON.stringify(err)}`); }); ``` + ## sim.getDefaultVoiceSlotId7+ getDefaultVoiceSlotId\(callback: AsyncCallback\): void @@ -109,6 +110,63 @@ promise.then(data => { }); ``` + +## sim.hasOperatorPrivileges + +hasOperatorPrivileges\(slotId: number, callback: AsyncCallback\): void + +检查应用是否操作电话服务的权限,使用callback方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------- | ---- | -------------------------------------- | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | +| callback | AsyncCallback<boolean> | 是 | 回调函数。 | + +**示例:** + +``` +sim.hasOperatorPrivileges(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + + +## sim.hasOperatorPrivileges + +hasOperatorPrivileges\(slotId: number\): Promise + +检查应用是否操作电话服务的权限,使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +**返回值:** + +| 类型 | 说明 | +| --------------------- | ---------------------------------- | +| Promise<boolean> | 以Promise形式返回指应用是否操作电话服务的权限,如果有返回true。 | + +**示例:** + +``` +let promise = sim.hasOperatorPrivileges(0); +promise.then(data => { + console.log(`hasOperatorPrivileges success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`hasOperatorPrivileges fail, promise: err->${JSON.stringify(err)}`); +}); +``` + + ## sim.getISOCountryCodeForSim getISOCountryCodeForSim\(slotId: number, callback: AsyncCallback\): void @@ -316,11 +374,11 @@ promise.then(data => { }); ``` -## sim.getSimGid1 +## sim.getCardType -getSimGid1\(slotId: number, callback: AsyncCallback\): void +getCardType\(slotId: number, callback: AsyncCallback\): void -获取指定卡槽SIM卡的GID1\(Group Identifier Level 1\),使用callback方式作为异步方法。 +获取指定卡槽SIM卡的卡类型,使用callback方式作为异步方法。 需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 @@ -329,22 +387,22 @@ getSimGid1\(slotId: number, callback: AsyncCallback\): void | 参数名 | 类型 | 必填 | 说明 | | -------- | ----------------------- | ---- | -------------------------------------- | | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | -| callback | AsyncCallback\ | 是 | 回调函数。 | +| callback | AsyncCallback\<[CardType](#cardtype)\> | 是 | 回调函数。 | **示例:** ``` -sim.getSimGid1(0, (err, data) => { +sim.getCardType(0, (err, data) => { console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); }); ``` -## sim.getSimGid1 +## sim.getCardType -getSimGid1\(slotId: number\): Promise +getCardType\(slotId: number\): Promise -获取指定卡槽SIM卡的GID1\(Group Identifier Level 1\),使用Promise方式作为异步方法。 +获取指定卡槽SIM卡的卡类型,使用Promise方式作为异步方法。 需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 @@ -358,20 +416,97 @@ getSimGid1\(slotId: number\): Promise | 类型 | 说明 | | ----------------- | ------------------------------------------------------------ | -| Promise\ | 以Promise形式返回获取指定卡槽SIM卡的GID1(Group Identifier Level 1)。 | +| Promise\<[CardType](#cardtype)\> | 以Promise形式返回指定卡槽SIM卡的卡类型。 | **示例:** ``` -let promise = sim.getSimGid1(0); +let promise = sim.getCardType(0); promise.then(data => { - console.log(`getSimGid1 success, promise: data->${JSON.stringify(data)}`); + console.log(`getCardType success, promise: data->${JSON.stringify(data)}`); }).catch(err => { - console.log(`getSimGid1 fail, promise: err->${JSON.stringify(err)}`); + console.log(`getCardType fail, promise: err->${JSON.stringify(err)}`); }); ``` +## sim.hasSimCard + +hasSimCard\(slotId: number, callback: AsyncCallback\): void + +获取指定卡槽SIM卡的是否插卡,使用callback方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------- | ---- | -------------------------------------- | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | +| callback | AsyncCallback<boolean> | 是 | 回调函数。 | + +**示例:** + +``` +sim.hasSimCard(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + + +## sim.hasSimCard + +hasSimCard\(slotId: number\): Promise + +获取指定卡槽SIM卡的是否插卡,使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +**返回值:** + +| 类型 | 说明 | +| --------------------- | ---------------------------------- | +| Promise<boolean> | 以Promise形式返回指定卡槽的是否插卡,如果插卡返回true。 | + +**示例:** + +``` +let promise = sim.hasSimCard(0); +promise.then(data => { + console.log(`hasSimCard success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`hasSimCard fail, promise: err->${JSON.stringify(err)}`); +}); +``` + + +## sim.getMaxSimCount + +getMaxSimCount\(\): number + +获取卡槽数量。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +**返回值:** + +| 类型 | 说明 | +| ----------------- | ------------------------------------------------------------ | +| number | 卡槽数量。 | + +**示例:** + +``` +console.log(sim.getMaxSimCount()) +``` + + ## SimState SIM卡状态。 @@ -383,4 +518,21 @@ SIM卡状态。 | SIM_STATE_LOCKED | 表示SIM卡处于locked状态,即SIM卡被PIN、PUK或网络锁锁定。 | | SIM_STATE_NOT_READY | 表示SIM卡处于not ready状态,即SIM卡在位但无法正常工作。 | | SIM_STATE_READY | 表示SIM卡处于ready状态,即SIM卡在位且工作正常。 | -| SIM_STATE_LOADED | 表示SIM卡处于loaded状态,即SIM卡在位且所有卡文件加载完毕。 | \ No newline at end of file +| SIM_STATE_LOADED | 表示SIM卡处于loaded状态,即SIM卡在位且所有卡文件加载完毕。 | + +## CardType + +卡类型。 + +| 变量 | 值 | 说明 | +| ----- | ----- | ----- | +UNKNOWN_CARD | -1 | 未知类型 | +SINGLE_MODE_SIM_CARD | 10 | 单SIM卡 | +SINGLE_MODE_USIM_CARD | 20 | 单USIM卡 | +SINGLE_MODE_RUIM_CARD | 30 | 单RUIM卡 | +DUAL_MODE_CG_CARD | 40 | 双卡模式C+G | +CT_NATIONAL_ROAMING_CARD | 41 | 中国电信内部漫游卡 | +CU_DUAL_MODE_CARD | 42 | 中国联通双模卡 | +DUAL_MODE_TELECOM_LTE_CARD | 43 | 双模式电信LTE卡 | +DUAL_MODE_UG_CARD | 50 | 双模式UG卡 | +SINGLE_MODE_ISIM_CARD | 60 | 单一ISIM卡类型 | \ No newline at end of file -- Gitee From 1c78c4deb026b2bde63248a85f3942be0df77dd2 Mon Sep 17 00:00:00 2001 From: maosiping Date: Mon, 7 Mar 2022 17:00:38 +0800 Subject: [PATCH 167/282] =?UTF-8?q?SIM=E5=8D=A1=E7=AE=A1=E7=90=86=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: maosiping --- .../reference/apis/js-apis-sim.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-sim.md b/zh-cn/application-dev/reference/apis/js-apis-sim.md index be20dadb898..e0b6edcb493 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-sim.md +++ b/zh-cn/application-dev/reference/apis/js-apis-sim.md @@ -16,7 +16,7 @@ isSimActive\(slotId: number, callback: AsyncCallback\): void 获取指定卡槽SIM卡的是否激活,使用callback方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -40,7 +40,7 @@ isSimActive\(slotId: number\): Promise 获取指定卡槽SIM卡的是否激活,使用Promise方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -117,7 +117,7 @@ hasOperatorPrivileges\(slotId: number, callback: AsyncCallback\): void 检查应用是否操作电话服务的权限,使用callback方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -141,7 +141,7 @@ hasOperatorPrivileges\(slotId: number\): Promise 检查应用是否操作电话服务的权限,使用Promise方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -380,7 +380,7 @@ getCardType\(slotId: number, callback: AsyncCallback\): void 获取指定卡槽SIM卡的卡类型,使用callback方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -404,7 +404,7 @@ getCardType\(slotId: number\): Promise 获取指定卡槽SIM卡的卡类型,使用Promise方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -436,7 +436,7 @@ hasSimCard\(slotId: number, callback: AsyncCallback\): void 获取指定卡槽SIM卡的是否插卡,使用callback方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -460,7 +460,7 @@ hasSimCard\(slotId: number\): Promise 获取指定卡槽SIM卡的是否插卡,使用Promise方式作为异步方法。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **参数:** @@ -492,7 +492,7 @@ getMaxSimCount\(\): number 获取卡槽数量。 -需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 +**需要权限**:ohos.permission.GET_TELEPHONY_STATE **返回值:** -- Gitee From e0b3d80b3d10f827cc6d5d37c802033a97e4b934 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Mon, 7 Mar 2022 17:03:26 +0800 Subject: [PATCH 168/282] update docs Signed-off-by: annie_wangli --- .../reference/apis/js-apis-distributed-data.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-distributed-data.md b/en/application-dev/reference/apis/js-apis-distributed-data.md index ed190a2e4e5..eb9d6b4f593 100644 --- a/en/application-dev/reference/apis/js-apis-distributed-data.md +++ b/en/application-dev/reference/apis/js-apis-distributed-data.md @@ -591,7 +591,7 @@ Defines the KV store constants. ## Schema8+ ## -Defines a database schema. When creating or opening a KV store, you can create **Schema** objects and put them into **Options**. +Defines a database schema. When creating or opening a KV store, you can create a **Schema** object and put it into **Options**. ### toJsonString8+ ### @@ -1096,13 +1096,13 @@ Checks whether the data read position is after the last row. getEntry(): Entry; -Obtains KV pairs. +Obtains a KV pair. - Return value | Type| Description| | ------ | ------- | -| Entry |KV pairs obtained.| +| Entry |KV pair obtained.| - Example @@ -2387,7 +2387,7 @@ Deletes KV pairs in batches from this KV store. This method uses a promise to re startTransaction(callback: AsyncCallback<void>): void; -Starts transactions in this KV store. This method uses an asynchronous callback to return the result. +Starts the transaction in this KV store. This method uses an asynchronous callback to return the result. - Parameters @@ -2437,7 +2437,7 @@ Starts transactions in this KV store. This method uses an asynchronous callback startTransaction(): Promise<void>; -Starts transactions in this KV store. This method uses a promise to return the result. +Starts the transaction in this KV store. This method uses a promise to return the result. - Return value @@ -2470,7 +2470,7 @@ Starts transactions in this KV store. This method uses a promise to return the r commit(callback: AsyncCallback<void>): void; -Commits transactions in this KV store. This method uses an asynchronous callback to return the result. +Commits the transaction in this KV store. This method uses an asynchronous callback to return the result. - Parameters @@ -2500,7 +2500,7 @@ Commits transactions in this KV store. This method uses an asynchronous callback commit(): Promise<void>; -Commits transactions in this KV store. This method uses a promise to return the result. +Commits the transaction in this KV store. This method uses a promise to return the result. - Return value @@ -2528,7 +2528,7 @@ Commits transactions in this KV store. This method uses a promise to return the rollback(callback: AsyncCallback<void>): void; -Rolls back transactions in this KV store. This method uses an asynchronous callback to return the result. +Rolls back the transaction in this KV store. This method uses an asynchronous callback to return the result. - Parameters @@ -2558,7 +2558,7 @@ Rolls back transactions in this KV store. This method uses an asynchronous callb rollback(): Promise<void>; -Rolls back transactions in this KV store. This method uses a promise to return the result. +Rolls back the transaction in this KV store. This method uses a promise to return the result. - Return value -- Gitee From f24cce0b88c4ccebd36f21bb36409efa8074f65f Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Mon, 7 Mar 2022 17:08:31 +0800 Subject: [PATCH 169/282] update docs Signed-off-by: annie_wangli --- en/device-dev/kernel/kernel-mini-basic-interrupt.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/en/device-dev/kernel/kernel-mini-basic-interrupt.md b/en/device-dev/kernel/kernel-mini-basic-interrupt.md index f1ac97b017c..6429771d823 100644 --- a/en/device-dev/kernel/kernel-mini-basic-interrupt.md +++ b/en/device-dev/kernel/kernel-mini-basic-interrupt.md @@ -128,10 +128,12 @@ static UINT32 Example_Interrupt(VOID) UINT32 ret; HWI_PRIOR_T hwiPrio = 3; HWI_MODE_T mode = 0; - HWI_ARG_T arg = 0; + HwiIrqParam irqParam; + (void)memset_s(&irqParam, sizeof(HwiIrqParam), 0, sizeof(HwiIrqParam)); + irqParam.pDevId = 0; /* Create an interrupt. */ - ret = HalHwiCreate(HWI_NUM_TEST, hwiPrio, mode, (HWI_PROC_FUNC)HwiUsrIrq, arg); + ret = LOS_HwiCreate(HWI_NUM_TEST, hwiPrio, mode, (HWI_PROC_FUNC)HwiUsrIrq, &irqParam); if(ret == LOS_OK){ printf("Hwi create success!\n"); } else { -- Gitee From c82a46957952c06f11b5fcd5023c28cd2cccaac1 Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Mon, 7 Mar 2022 17:13:00 +0800 Subject: [PATCH 170/282] update docs Signed-off-by: annie_wangli --- en/device-dev/driver/driver-hdf-manage.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/en/device-dev/driver/driver-hdf-manage.md b/en/device-dev/driver/driver-hdf-manage.md index 5d9d738234f..7acd765714a 100644 --- a/en/device-dev/driver/driver-hdf-manage.md +++ b/en/device-dev/driver/driver-hdf-manage.md @@ -330,8 +330,17 @@ This syntax indicates that the **attribute** value is a reference to **node** node1 { attributes; } +node2 { + attr_1 = &root.node1; +} +``` +Or +``` node2 { + node1 { + attributes; + } attr_1 = &node1; } ``` -- Gitee From 6e78271c6a6a6bd194733db21959856aa86c1ac4 Mon Sep 17 00:00:00 2001 From: wangyong1995626wywz Date: Mon, 7 Mar 2022 17:01:07 +0800 Subject: [PATCH 171/282] Correct the questionnaire questions raised by the test Description 1.Modify the problem trimToCurrentLength without parameters 2.Modify the problem that the descriptions of two interfaces of plainarray are consistent 3.Correct the wrong interface in lightweightset 4.Complete the missing equal case in XTS #I4WPBS:Correct the questionnaire questions raised by the test Signed-off-by: wangyong1995626wywz --- zh-cn/application-dev/reference/apis/js-apis-arraylist.md | 2 +- .../application-dev/reference/apis/js-apis-lightweightset.md | 4 ++-- zh-cn/application-dev/reference/apis/js-apis-plainarray.md | 2 +- zh-cn/application-dev/reference/apis/js-apis-vector.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-arraylist.md b/zh-cn/application-dev/reference/apis/js-apis-arraylist.md index efda37f74d4..7435c4bd4aa 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-arraylist.md +++ b/zh-cn/application-dev/reference/apis/js-apis-arraylist.md @@ -537,7 +537,7 @@ arrayList.add(2); arrayList.add(4); arrayList.add(5); arrayList.add(4); -arrayList.trimToCurrentLength(2); +arrayList.trimToCurrentLength(); ``` ### [Symbol.iterator] diff --git a/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md b/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md index 2780befaf7d..1ff86fc1903 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md +++ b/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md @@ -193,7 +193,7 @@ let result = lightWeightSet.equal(obj); ``` -### ensureCapacityTo +### increaseCapacityTo increaseCapacityTo(minimumCapacity: number): void @@ -209,7 +209,7 @@ increaseCapacityTo(minimumCapacity: number): void ``` let lightWeightSet = new LightWeightSet(); -lightWeightSet.ensureCapacityTo(10); +lightWeightSet.increaseCapacityTo(10); ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-plainarray.md b/zh-cn/application-dev/reference/apis/js-apis-plainarray.md index ab5dc6d0d61..0ff829fa745 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-plainarray.md +++ b/zh-cn/application-dev/reference/apis/js-apis-plainarray.md @@ -117,7 +117,7 @@ let result = plainArray.get(1); getIndexOfKey(key: number): number; -查找指定元素第一次出现的下标值,如果没有找到该元素返回-1。 +查找指定key第一次出现的下标值,如果没有找到该元素返回-1。 **参数:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-vector.md b/zh-cn/application-dev/reference/apis/js-apis-vector.md index d19a085e419..3e9285e735f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-vector.md +++ b/zh-cn/application-dev/reference/apis/js-apis-vector.md @@ -540,7 +540,7 @@ vector.add(2); vector.add(4); vector.add(5); vector.add(4); -vector.trimToCurrentLength(2); +vector.trimToCurrentLength(); ``` ### toString -- Gitee From 2bac59c582da44774a38ea1a0c04b0ab8e1d162c Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Mon, 7 Mar 2022 17:17:28 +0800 Subject: [PATCH 172/282] update docs Signed-off-by: annie_wangli --- en/application-dev/reference/apis/js-apis-fileio.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/application-dev/reference/apis/js-apis-fileio.md b/en/application-dev/reference/apis/js-apis-fileio.md index 99084fd0717..9b88c6a1bb9 100644 --- a/en/application-dev/reference/apis/js-apis-fileio.md +++ b/en/application-dev/reference/apis/js-apis-fileio.md @@ -553,7 +553,7 @@ Synchronously opens a file. | -------- | -------- | -------- | -------- | | path | string | Yes| Absolute path of the target file.| | flags | number | No| Option for opening a file. You must specify one of the following options. By default, the file is opened in read-only mode.
- **0o0**: Open the file in read-only mode.
- **0o1**: Open the file in write-only mode.
- **0o2**: Open the file in read/write mode.
You can also specify the following options, separated using a bitwise OR operator (|). By default, no extra option is specified.
- **0o100**: If the file does not exist, create it. If you use this option, you must also specify **mode**.
- **0o200**: If **0o100** is added and the file already exists, throw an exception.
- **0o1000**: If the file exists and is open in write-only or read/write mode, truncate the file length to 0.
- **0o2000**: Open the file in append mode. New data will be appended to the file (added to the end of the file).
- **0o4000**: If **path** points to a named pipe (also known as a FIFO), block special file, or character special file, perform non-blocking operations on the open file and in subsequent I/Os.
- **0o200000**: If **path** points to a directory, throw an exception.
- **0o400000**: If **path** points to a symbolic link, throw an exception.
- **0o4010000**: Open the file in synchronous I/O mode.| - | mode | number | No| Permissions on the file. You can specify multiple permissions, separated using a bitwise OR operator (|). The default value is **0o666**.
- **0o666**: The owner, user group, and other users have the read and write permissions on the file.
- **0o700**: The owner has the read, write, and execute permissions.
- **0o400**: The owner has the read permission.
- **0o200**: The owner has the write permission.
- **0o100**: The owner has the execute permission.
- **0o070**: The user group has the read, write, and execute permissions.
- **0o040**: The user group has the read permission.
- **0o020**: The user group has the write permission.
- **0o010**: The user group has the execute permission.
- **0o007**: Other users have the read, write, and execute permissions.
- **0o004**: Other users have the read permission.
- **0o002**: Other users have the write permission.
- **0o001**: Other users have the execute permission.| + | mode | number | No| Permissions on the file. You can specify multiple permissions, separated using a bitwise OR operator (|). The default value is **0o666**.
- **0o666**: The owner, user group, and other users have the read and write permissions on the file.
- **0o700**: The owner has the read, write, and execute permissions.
- **0o400**: The owner has the read permission.
- **0o200**: The owner has the write permission.
- **0o100**: The owner has the execute permission.
- **0o070**: The user group has the read, write, and execute permissions.
- **0o040**: The user group has the read permission.
- **0o020**: The user group has the write permission.
- **0o010**: The user group has the execute permission.
- **0o007**: Other users have the read, write, and execute permissions.
- **0o004**: Other users have the read permission.
- **0o002**: Other users have the write permission.
- **0o001**: Other users have the execute permission.
The file permissions of newly created files are affected by **umask**, which is set as the process starts. Currently, the modification of **umask** is not open. - Return value | Type| Description| -- Gitee From d5752d1518123d5467d8d290edb9d3a40c54eed6 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 7 Mar 2022 10:42:39 +0800 Subject: [PATCH 173/282] update api reference Signed-off-by: liujiandong --- .../reference/apis/js-apis-observer.md | 276 ++++++++++++++++++ .../reference/apis/js-apis-radio.md | 82 +++++- 2 files changed, 356 insertions(+), 2 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-observer.md b/zh-cn/application-dev/reference/apis/js-apis-observer.md index e020047aa5e..0a27461129a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-observer.md +++ b/zh-cn/application-dev/reference/apis/js-apis-observer.md @@ -263,3 +263,279 @@ observer.on('callStateChange', callback); observer.off('callStateChange', callback); observer.off('callStateChange'); ``` + + +## observer.on('cellularDataConnectionStateChange')7+ + +on\(type: 'cellularDataConnectionStateChange', callback: Callback\<{ state: DataConnectState, network: RadioTechnology }\>\): void; + +订阅蜂窝数据链路连接状态,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 蜂窝数据链路连接状态事件 | +| callback | Callback\<{ state: [DataConnectState](js-apis-telephony-data.md#DataConnectState), network: [RadioTechnology](js-apis-radio.md#RadioTechnology) }\> | 是 | 回调函数,参考data的[DataConnectState](js-apis-telephony-data.md#DataConnectState),radio的[RadioTechnology](js-apis-radio.md#RadioTechnology)。 | + +**示例:** + +``` +observer.on('cellularDataConnectionStateChange', value =>{ + console.log("on cellularDataConnectionStateChange, state:" + value.state + ", network:" + value.network); +}); +``` + + +## observer.on('cellularDataConnectionStateChange')7+ + +on\(type: 'cellularDataConnectionStateChange', options: { slotId: number }, callback: Callback\<{ state: DataConnectState, network: RadioTechnology }\>\): void; + +订阅指定卡槽位的蜂窝数据链路连接状态,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 蜂窝数据链路连接状态事件 | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | +| callback | Callback\<{ state: [DataConnectState](js-apis-telephony-data.md#DataConnectState), network: [RadioTechnology](js-apis-radio.md#RadioTechnology) }\> | 是 | 回调函数,参考data的[DataConnectState](js-apis-telephony-data.md#DataConnectState),radio的[RadioTechnology](js-apis-radio.md#RadioTechnology)。 | + +**示例:** + +``` +observer.on('cellularDataConnectionStateChange', {slotId: 0}, value =>{ + console.log("on cellularDataConnectionStateChange, state:" + value.state + ", network:" + value.network); +}); +``` + + +## observer.off('cellularDataConnectionStateChange')7+ + +off\(type: 'cellularDataConnectionStateChange', callback?: Callback\<{ state: DataConnectState, network: RadioTechnology }\>\): void; + +移除订阅蜂窝数据链路连接状态,使用callback方式作为异步方法。 + +>**说明:** +> +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 蜂窝数据链路连接状态事件 | +| callback | Callback\<{ state: [DataConnectState](js-apis-telephony-data.md#DataConnectState), network: [RadioTechnology](js-apis-radio.md#RadioTechnology) }\> | 否 | 回调函数,参考data的[DataConnectState](js-apis-telephony-data.md#DataConnectState),radio的[RadioTechnology](js-apis-radio.md#RadioTechnology)。 | + +**示例:** + +``` +let callback = value => { + console.log("on cellularDataConnectionStateChange, state:" + value.state + ", network:" + value.network); +} +observer.on('cellularDataConnectionStateChange', callback); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +observer.off('cellularDataConnectionStateChange', callback); +observer.off('cellularDataConnectionStateChange'); +``` + + +## observer.on('cellularDataFlowChange')7+ + +on\(type: 'cellularDataFlowChange', callback: Callback\\): void; + +订阅蜂窝数据业务的上下行数据流状态,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 蜂窝数据业务的上下行数据流状态状态事件 | +| callback | Callback\<[DataFlowType](js-apis-telephony-data.md#DataFlowType)\> | 是 | 回调函数,参考data的[DataFlowType](js-apis-telephony-data.md#DataFlowType)。 | + +**示例:** + +``` +observer.on('cellularDataFlowChange', data =>{ + console.log("on networkStateChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.on('cellularDataFlowChange')7+ + +on\(type: 'cellularDataFlowChange', options: { slotId: number }, callback: Callback\\): void; + +订阅指定卡槽位的蜂窝数据业务的上下行数据流状态,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 蜂窝数据业务的上下行数据流状态事件 | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | +| callback | Callback\<[DataFlowType](js-apis-telephony-data.md#DataFlowType)\> | 是 | 回调函数,参考data的[DataFlowType](js-apis-telephony-data.md#DataFlowType)。 | + +**示例:** + +``` +observer.on('cellularDataFlowChange', {slotId: 0}, data =>{ + console.log("on cellularDataFlowChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.off('cellularDataFlowChange')7+ + +off\(type: 'cellularDataFlowChange', callback?: Callback\\): void; + +移除订阅蜂窝数据业务的上下行数据流状态,使用callback方式作为异步方法。 + +>**说明:** +> +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 蜂窝数据业务的上下行数据流状态事件 | +| callback | Callback\<[DataFlowType](js-apis-telephony-data.md#DataFlowType)\> | 否 | 回调函数,参考data的[DataFlowType](js-apis-telephony-data.md#DataFlowType)。 | + +**示例:** + +``` +let callback = data => { + console.log("on cellularDataFlowChange, data:" + JSON.stringify(data)); +} +observer.on('cellularDataFlowChange', callback); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +observer.off('cellularDataFlowChange', callback); +observer.off('cellularDataFlowChange'); +``` + + +## observer.on('simStateChange')7+ + +on\(type: 'simStateChange', callback: Callback\\): void; + +订阅sim状态更改事件,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | sim状态更改事件 | +| callback | Callback\<[SimStateData](#simstatedata7)\> | 是 | 回调函数。 | + +**示例:** + +``` +observer.on('simStateChange', data =>{ + console.log("on simStateChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.on('simStateChange')7+ + +on\(type: 'simStateChange', options: { slotId: number }, callback: Callback\\): void; + +订阅指定卡槽位的sim状态更改事件,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | sim状态更改事件 | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | +| callback | Callback\<[SimStateData](#simstatedata7)\> | 是 | 回调函数。 | + +**示例:** + +``` +observer.on('simStateChange', {slotId: 0}, data =>{ + console.log("on simStateChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.off('simStateChange')7+ + +off\(type: 'simStateChange', callback?: Callback\\): void; + +移除订阅sim状态更改事件,使用callback方式作为异步方法。 + +>**说明:** +> +>可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 + +**系统能力**:SystemCapability.Telephony.StateRegistry + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | sim状态更改事件 | +| callback | Callback\<[SimStateData](#simstatedata7)\> | 否 | 回调函数。 | + +**示例:** + +``` +let callback = data => { + console.log("on simStateChange, data:" + JSON.stringify(data)); +} +observer.on('simStateChange', callback); +// 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 +observer.off('simStateChange', callback); +observer.off('simStateChange'); +``` + + +## LockReason8+ + +SIM卡锁类型。 + +| 变量 | 值 | 说明 | +| ----------- | ---- | ------------------------------------------------------------ | +| SIM_NONE | 0 | 无锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PIN | 1 | PIN锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PUK | 2 | PUK锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PN_PIN | 3 | 网络PIN锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PN_PUK | 4 | 网络PUK锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PU_PIN | 5 | 子网PIN锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PU_PUK | 6 | 子网PUK锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PP_PIN | 7 | 服务提供商PIN锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PP_PUK | 8 | 服务提供商PUK锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PC_PIN | 9 | 组织PIN锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_PC_PUK | 10 | 组织PUK锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_SIM_PIN | 11 | SIM PIN锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| SIM_SIM_PUK | 12 | SIM PUK锁。
**系统能力**:SystemCapability.Telephony.StateRegistry | + + +## SimStateData7+ + +SIM卡类型和状态。 + +| 变量 | 类型 | 说明 | +| ----------------- | --------------------- | ------------------------------------------------------------ | +| type | [CardType](js-apis-sim.md#CardType) | SIM卡类型,参考sim的[CardType](js-apis-sim.md#CardType)。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| state | [SimState](js-apis-sim.md#SimState) | SIM卡状态,参考sim的[SimState](js-apis-sim.md#SimState)。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| reason8+ | [LockReason](#lockreason8) | SIM卡锁类型。
**系统能力**:SystemCapability.Telephony.StateRegistry | + diff --git a/zh-cn/application-dev/reference/apis/js-apis-radio.md b/zh-cn/application-dev/reference/apis/js-apis-radio.md index 1d7b120625b..e42486a4914 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-radio.md +++ b/zh-cn/application-dev/reference/apis/js-apis-radio.md @@ -276,7 +276,56 @@ promise.then(data => { ``` -## radio.getSignalInformation +## radio.getPrimarySlotId7+ + +getPrimarySlotId\(callback: AsyncCallback\\): void + +获取主卡所在卡槽的索引号,使用callback方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.CoreService + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback\ | 是 | 回调函数 | + +**示例:** + +``` +radio.getPrimarySlotId((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + + +## radio.getPrimarySlotId7+ + +getPrimarySlotId\(\): Promise\ + +获取主卡所在卡槽的索引号,使用Promise方式作为异步方法。 + +**系统能力**:SystemCapability.Telephony.CoreService + +**返回值:** + +| 类型 | 说明 | +| ----------------------------------------------------------- | ------------------------------------------------------------ | +| Promise\ | 以Promise形式返回获取设备主卡所在卡槽的索引号的结果。 | + +**示例:** + +``` +let promise = radio.getPrimarySlotId(); +promise.then(data => { + console.log(`getPrimarySlotId success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.error(`getPrimarySlotId fail, promise: err->${JSON.stringify(err)}`); +}); +``` + + +## radio.getSignalInformation7+ getSignalInformation\(slotId: number, callback: AsyncCallback\>\): void @@ -301,7 +350,7 @@ radio.getSignalInformation(slotId, (err, data) => { ``` -## radio.getSignalInformation +## radio.getSignalInformation7+ getSignalInformation\(slotId: number\): Promise\> @@ -334,6 +383,35 @@ promise.then(data => { ``` +## radio.isNrSupported8+ + +isNrSupported\(slotId: number\): boolean + +判断当前设备是否支持5G\(NR\)。 + +**系统能力**:SystemCapability.Telephony.CoreService + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +**返回值:** + +| 类型 | 说明 | +| ------------------ | ------------------------------------------------------------ | +| boolean | - true:支持
- false:不支持 | + +**示例:** + +``` +let slotId = 0; +let result = radio.isNrSupported(slotId); +console.log(result); +``` + + ## radio.isRadioOn7+ isRadioOn\(callback: AsyncCallback\): void -- Gitee From 60d2951702aaedbeabf8eb969c2d9a20cd0506eb Mon Sep 17 00:00:00 2001 From: maosiping Date: Mon, 7 Mar 2022 17:31:04 +0800 Subject: [PATCH 174/282] =?UTF-8?q?SIM=E5=8D=A1=E7=AE=A1=E7=90=86=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: maosiping --- .../reference/apis/js-apis-sim.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-sim.md b/zh-cn/application-dev/reference/apis/js-apis-sim.md index e0b6edcb493..4315d2ecd6f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-sim.md +++ b/zh-cn/application-dev/reference/apis/js-apis-sim.md @@ -14,7 +14,7 @@ import sim from '@ohos.telephony.sim'; isSimActive\(slotId: number, callback: AsyncCallback\): void -获取指定卡槽SIM卡的是否激活,使用callback方式作为异步方法。 +获取指定卡槽SIM卡是否激活,使用callback方式作为异步方法。 **需要权限**:ohos.permission.GET_TELEPHONY_STATE @@ -38,7 +38,7 @@ sim.isSimActive(0, (err, data) => { isSimActive\(slotId: number\): Promise -获取指定卡槽SIM卡的是否激活,使用Promise方式作为异步方法。 +获取指定卡槽SIM卡是否激活,使用Promise方式作为异步方法。 **需要权限**:ohos.permission.GET_TELEPHONY_STATE @@ -52,7 +52,7 @@ isSimActive\(slotId: number\): Promise | 类型 | 说明 | | --------------------- | ---------------------------------- | -| Promise<boolean> | 以Promise形式返回指定卡槽的是否激活,如果激活返回true。 | +| Promise<boolean> | 以Promise形式返回指定卡槽是否激活,如果激活返回true。 | **示例:** @@ -115,7 +115,7 @@ promise.then(data => { hasOperatorPrivileges\(slotId: number, callback: AsyncCallback\): void -检查应用是否操作电话服务的权限,使用callback方式作为异步方法。 +检查应用是否已经被赋予权限,使用callback方式作为异步方法。 **需要权限**:ohos.permission.GET_TELEPHONY_STATE @@ -139,7 +139,7 @@ sim.hasOperatorPrivileges(0, (err, data) => { hasOperatorPrivileges\(slotId: number\): Promise -检查应用是否操作电话服务的权限,使用Promise方式作为异步方法。 +检查应用是否已经被赋予权限,使用Promise方式作为异步方法。 **需要权限**:ohos.permission.GET_TELEPHONY_STATE @@ -434,7 +434,7 @@ promise.then(data => { hasSimCard\(slotId: number, callback: AsyncCallback\): void -获取指定卡槽SIM卡的是否插卡,使用callback方式作为异步方法。 +获取指定卡槽SIM卡是否插卡,使用callback方式作为异步方法。 **需要权限**:ohos.permission.GET_TELEPHONY_STATE @@ -458,7 +458,7 @@ sim.hasSimCard(0, (err, data) => { hasSimCard\(slotId: number\): Promise -获取指定卡槽SIM卡的是否插卡,使用Promise方式作为异步方法。 +获取指定卡槽SIM卡是否插卡,使用Promise方式作为异步方法。 **需要权限**:ohos.permission.GET_TELEPHONY_STATE @@ -472,7 +472,7 @@ hasSimCard\(slotId: number\): Promise | 类型 | 说明 | | --------------------- | ---------------------------------- | -| Promise<boolean> | 以Promise形式返回指定卡槽的是否插卡,如果插卡返回true。 | +| Promise<boolean> | 以Promise形式返回指定卡槽是否插卡,如果插卡返回true。 | **示例:** -- Gitee From ec5db192445ec94fa0615a4ba4dfeeff3f267785 Mon Sep 17 00:00:00 2001 From: liujinwei Date: Fri, 4 Mar 2022 10:29:25 +0800 Subject: [PATCH 175/282] add menu Signed-off-by: liujinwei Change-Id: I246683152efaf8638ed0e4dd688c08220fe7720f --- .../arkui-ts/ts-universal-attributes-menu.md | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md index ac768804a52..ba903b5b767 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md @@ -14,15 +14,21 @@ | 名称 | 参数类型 | 默认值 | 描述 | | -------- | -------- | -------- | -------- | -| bindMenu | Array8+ | - | 给组件绑定菜单,点击后弹出菜单。弹出菜单项支持文本和自定义两种功能。 | +| bindMenu | Array8+ | - | 给组件绑定菜单,点击后弹出菜单。弹出菜单项支持文本和自定义两种功能。 | +| bindContextMenu | content: [CustomBuilder](../../ui/ts-types.md)8+
responseType: ResponseType8+ | - | 给组件绑定菜单,触发方式为长按或者右键点击,弹出菜单项需要自定义。 | - MenuItem - | 名称 | 类型 | 描述 | + | 名称 | 类型 | 描述 | | -------- | -------- | -------- | - | value | string | 菜单项文本。 | - | action | () => void | 点击菜单项的事件回调。 | + | value | string | 菜单项文本。 | + | action | () => void | 点击菜单项的事件回调。 | +- ResponseType8+ + | 参数值 | 描述 | + | -------- | -------- | + | LongPress | 通过长按触发菜单弹出 | + | RightClick | 通过鼠标右键触发菜单弹出 | ## 示例 @@ -103,3 +109,33 @@ struct MenuExample { ``` ![zh-cn_image_0000001186807708](figures/zh-cn_image_0000001186807708.gif) + +``` +@Entry +@Component +struct MenuExample { + @Builder MenuBuilder() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text('Test menu item 1') + .fontSize(20) + .width(100) + .height(50) + .textAlign(TextAlign.Center) + Divider().height(10) + Text('Test menu item 2') + .fontSize(20) + .width(100) + .height(50) + .textAlign(TextAlign.Center) + }.width(100) + } + build() { + Column() { + Text('rightclick for menu') + } + .width('100%') + .margin({ top: 5 }) + .bindContextMenu(this.MenuBuilder, ResponseType.RightClick) + } +} +``` \ No newline at end of file -- Gitee From f2f74eb9f8a78bbab2c4ba0f7cac1cd7d3cfb946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cwangyipeng=E2=80=9D?= Date: Mon, 7 Mar 2022 17:46:26 +0800 Subject: [PATCH 176/282] Fix:Delete unnecessary parts in the .Md file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: “wangyipeng” --- zh-cn/application-dev/reference/apis/js-apis-usb.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-usb.md b/zh-cn/application-dev/reference/apis/js-apis-usb.md index 868cbf4c446..7a5667f118a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-usb.md +++ b/zh-cn/application-dev/reference/apis/js-apis-usb.md @@ -538,10 +538,3 @@ USB设备消息传输通道,用于确定设备。 | -------- | -------- | -------- | | USB_REQUEST_DIR_TO_DEVICE | 0 | 写数据,主设备往从设备。
**系统能力**: SystemCapability.USB.USBManager | | USB_REQUEST_DIR_FROM_DEVICE | 0x80 | 读数据,从设备往主设备。
**系统能力**: SystemCapability.USB.USBManager | - -| 名称 | 默认值 | 说明 | -| -------- | -------- | -------- | -| NONE | 0 | 无。
**系统能力**: SystemCapability.USB.USBManager | -| ACM | 1 | 串口设备。
**系统能力**: SystemCapability.USB.USBManager | -| ECM | 2 | 网口设备。
**系统能力**: SystemCapability.USB.USBManager | -| HDC | 4 | HDC设备。
**系统能力**: SystemCapability.USB.USBManager | -- Gitee From cfe593aa4e3b43413f9f75b34868dfa609263624 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Mon, 7 Mar 2022 18:01:16 +0800 Subject: [PATCH 177/282] update docs Signed-off-by: shawn_he --- .../reference/apis/js-apis-usb.md | 1867 +++++------------ 1 file changed, 491 insertions(+), 1376 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-usb.md b/en/application-dev/reference/apis/js-apis-usb.md index 94c9f4a7a53..f51e459ac36 100644 --- a/en/application-dev/reference/apis/js-apis-usb.md +++ b/en/application-dev/reference/apis/js-apis-usb.md @@ -1,1432 +1,547 @@ -# USB +# USB ->**NOTE:** ->The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## Modules to Import +## Modules to Import ``` import usb from "@ohos.usb"; ``` -## Required Permissions +## usb.getDevices -None. - -## usb.getDevices - -usb.getDevices\(\): Array\> +usb.getDevices(): Array<Readonly<USBDevice>> Obtains the USB device list. -- Return values - - - - - - - - - - -

Type

-

Description

-

Array<Readonly<USBDevice>>

-

USB device list.

-
- -- Example - - ``` - let devicesList = usb.getDevices(); - console.log(`devicesList = ${JSON.stringify(devicesList)}`); - // devicesList is a list of USB devices. - // A simple example of devicesList is provided as follows: - [ - { - name: "1-1", - serial: "", - manufacturerName: "", - productName: "", - version: "", - vendorId: 7531, - productId: 2, - clazz: 9, - subclass: 0, - protocol: 1, - devAddress: 1, - busNum: 1, - configs: [ - { - id: 1, - attributes: 224, - isRemoteWakeup: true, - isSelfPowered: true, - maxPower: 0, - name: "1-1", - interfaces: [ - { - id: 0, - protocol: 0, - clazz: 9, - subclass: 0, - alternateSetting: 0, - name: "1-1", - endpoints: [ - { - address: 129, - attributes: 3, - interval: 12, - maxPacketSize: 4, - direction: 128, - number: 1, - type: 3, - interfaceId: 0, - }, - ], - }, - ], - }, - ], - }, - ] - ``` - - -## usb.connectDevice - -usb.connectDevice\(device: USBDevice\): Readonly +**System capability**: SystemCapability.USB.USBManager + +- Return value + | Type| Description| + | -------- | -------- | + | Array<Readonly<[USBDevice](#usbdevice)>> | Device information list.| + +- Example + ``` + let devicesList = usb.getDevices(); + console.log(`devicesList = ${JSON.stringify(devicesList)}`); + // devicesList is a list of USB devices. + // A simple example of devicesList is provided as follows: + [ + { + name: "1-1", + serial: "", + manufacturerName: "", + productName: "", + version: "", + vendorId: 7531, + productId: 2, + clazz: 9, + subclass: 0, + protocol: 1, + devAddress: 1, + busNum: 1, + configs: [ + { + id: 1, + attributes: 224, + isRemoteWakeup: true, + isSelfPowered: true, + maxPower: 0, + name: "1-1", + interfaces: [ + { + id: 0, + protocol: 0, + clazz: 9, + subclass: 0, + alternateSetting: 0, + name: "1-1", + endpoints: [ + { + address: 129, + attributes: 3, + interval: 12, + maxPacketSize: 4, + direction: 128, + number: 1, + type: 3, + interfaceId: 0, + }, + ], + }, + ], + }, + ], + }, + ] + ``` + + +## usb.connectDevice + +usb.connectDevice(device: USBDevice): Readonly<USBDevicePipe> Connects to a USB device. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list, and then call [usb.requestRight](#section1865915394353) to request the device access permission. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

device

-

USBDevice

-

Yes

-

USB device information.

-
- - -- Return values - - - - - - - - - - -

Type

-

Description

-

Readonly<USBDevicePipe>

-

USB device pipe for data transfer.

-
- -- Example - - ``` - let devicepipe= usb.connectDevice(device); - console.log(`devicepipe = ${JSON.stringify(devicepipe)}`); - ``` - - -## usb.hasRight - -usb.hasRight\(deviceName: string\): boolean - -Checks whether the user has the permission to access the device. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceName

-

string

-

Yes

-

Device name.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

Returns true if the user has the permission to access the device; returns false otherwise.

-
- -- Example - - ``` - let divicesName="1-1"; - let bool = usb.hasRight(divicesName); - console.log(bool); - ``` - - -## usb.requestRight - -usb.requestRight\(deviceName: string\): Promise +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list, and then call [usb.requestRight](#usbrequestright) to request the device access permission. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | device | [USBDevice](#usbdevice) | Yes| USB device information.| + +- Return value + | Type| Description| + | -------- | -------- | + | Readonly<[USBDevicePipe](#usbdevicepipe)> | USB device pipe for data transfer.| + +- Example + ``` + let devicepipe= usb.connectDevice(device); + console.log(`devicepipe = ${JSON.stringify(devicepipe)}`); + ``` + + +## usb.hasRight + +usb.hasRight(deviceName: string): boolean + +Checks whether the application has the permission to access the device. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | deviceName | string | Yes| Device name.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | Returns **true** if the application has the permission to access the device; returns **false** otherwise.| + +- Example + ``` + let divicesName="1-1"; + let bool = usb.hasRight(divicesName); + console.log(bool); + ``` + + +## usb.requestRight + +usb.requestRight(deviceName: string): Promise<boolean> Requests the temporary permission for the application to access the USB device. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceName

-

string

-

Yes

-

Device name.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Returns true if the temporary device access permissions are granted; returns false otherwise.

-
- -- Example - - ``` - let divicesName="1-1"; - usb.requestRight(divicesName).then((ret) => { - console.log(`requestRight = ${JSON.stringify(ret)}`); - }); - ``` - - -## usb.claimInterface - -usb.claimInterface\(pipe: USBDevicePipe, iface: USBInterface, force?: boolean\): number +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | deviceName | string | Yes| Device name.| + +- Return value + | Type| Description| + | -------- | -------- | + | Promise<boolean> | Returns **true** if the temporary device access permissions are granted; returns **false** otherwise.| + +- Example + ``` + let divicesName="1-1"; + usb.requestRight(divicesName).then((ret) => { + console.log(`requestRight = ${JSON.stringify(ret)}`); + }); + ``` + + +## usb.claimInterface + +usb.claimInterface(pipe: USBDevicePipe, iface: USBInterface, force?: boolean): number Claims a USB interface. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list and USB interfaces, call [usb.requestRight](#section1865915394353) to request the device access permission, and call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter. - -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

Device pipe, which is used to determine the bus number and device address.

-

iface

-

USBInterface

-

Yes

-

USB interface, which is used to determine the index of the interface to claim.

-

force

-

boolean

-

No

-

Optional parameter that determines whether to forcibly claim the USB interface. The default value is false, indicating not to forcibly claim the USB interface.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Returns 0 if the USB interface is successfully claimed; returns an error code otherwise.

-
- -- Example - - ``` - let ret = usb.claimInterface(devicepipe, interfaces); - console.log(`claimInterface = ${ret}`); - ``` - - -## usb.releaseInterface - -usb.releaseInterface\(pipe: USBDevicePipe, iface: USBInterface\): number +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list and USB interfaces, call [usb.requestRight](#usbrequestright) to request the device access permission, and call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| Device pipe, which is used to determine the bus number and device address.| + | iface | [USBInterface](#usbinterface) | Yes| USB interface, which is used to determine the index of the interface to claim.| + | force | boolean | No| Whether to forcibly claim the USB interface. The default value is **false**, indicating not to forcibly claim the USB interface.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Returns **0** if the USB interface is successfully claimed; returns an error code otherwise.| + +- Example + ``` + let ret = usb.claimInterface(devicepipe, interfaces); + console.log(`claimInterface = ${ret}`); + ``` + + +## usb.releaseInterface + +usb.releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number Releases a USB interface. -Before you do this, ensure that you have claimed the interface by calling [usb.claimInterface](#section41056254494). - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

Device pipe, which is used to determine the bus number and device address.

-

iface

-

USBInterface

-

Yes

-

USB interface, which is used to determine the index of the interface to release.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Returns 0 if the USB interface is successfully released; returns an error code otherwise.

-
- -- Example - - ``` - let ret = usb.releaseInterface(devicepipe, interfaces); - console.log(`releaseInterface = ${ret}`); - ``` - - -## usb.setConfiguration - -usb.setConfiguration\(pipe: USBDevicePipe, config: USBConfig\): number +Before you do this, ensure that you have claimed the interface by calling [usb.claimInterface](#usbclaiminterface). + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| Device pipe, which is used to determine the bus number and device address.| + | iface | [USBInterface](#usbinterface) | Yes| USB interface, which is used to determine the index of the interface to release.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Returns **0** if the USB interface is successfully released; returns an error code otherwise.| + +- Example + ``` + let ret = usb.releaseInterface(devicepipe, interfaces); + console.log(`releaseInterface = ${ret}`); + ``` + + +## usb.setConfiguration + +usb.setConfiguration(pipe: USBDevicePipe, config: USBConfig): number Sets the device configuration. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list and device configuration, call [usb.requestRight](#section1865915394353) to request the device access permission, and call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

Device pipe, which is used to determine the bus number and device address.

-

config

-

USBConfig

-

Yes

-

USB configuration to set.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Returns 0 if the USB configuration is successfully set; returns an error code otherwise.

-
- -- Example - - ``` - let ret = usb.setConfiguration(devicepipe, config); - console.log(`setConfiguration = ${ret}`); - ``` - - -## usb.setInterface - -usb.setInterface\(pipe: USBDevicePipe, iface: USBInterface\): number +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list and device configuration, call [usb.requestRight](#usbrequestright) to request the device access permission, and call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| Device pipe, which is used to determine the bus number and device address.| + | config | [USBConfig](#usbconfig) | Yes| USB configuration to set.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Returns **0** if the USB configuration is successfully set; returns an error code otherwise.| + +- Example + ``` + let ret = usb.setConfiguration(devicepipe, config); + console.log(`setConfiguration = ${ret}`); + ``` + + +## usb.setInterface + +usb.setInterface(pipe: USBDevicePipe, iface: USBInterface): number Sets a USB interface. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list and interfaces, call [usb.requestRight](#section1865915394353) to request the device access permission, and call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

Device pipe, which is used to determine the bus number and device address.

-

iface

-

USBInterface

-

Yes

-

USB interface to set.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Returns 0 if the USB interface is successfully set; returns an error code otherwise.

-
- -- Example - - ``` - let ret = usb.setInterface(devicepipe, interfaces); - console.log(`setInterface = ${ret}`); - ``` - - -## usb.getRawDescriptor - -usb.getRawDescriptor\(pipe: USBDevicePipe\): Uint8Array +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list and interfaces, call [usb.requestRight](#usbrequestright) to request the device access permission, and call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| Device pipe, which is used to determine the bus number and device address.| + | iface | [USBInterface](#usbinterface) | Yes| USB interface to set.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Returns **0** if the USB interface is successfully set; returns an error code otherwise.| + +- Example + ``` + let ret = usb.setInterface(devicepipe, interfaces); + console.log(`setInterface = ${ret}`); + ``` + + +## usb.getRawDescriptor + +usb.getRawDescriptor(pipe: USBDevicePipe): Uint8Array Obtains the raw USB descriptor. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list, call [usb.requestRight](#section1865915394353) to request the device access permission, and call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

Device pipe, which is used to determine the bus number and device address.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Uint8Array

-

Raw descriptor data.

-
- -- Example - - ``` - let ret = usb.getRawDescriptor(devicepipe); - ``` - - -## usb.getFileDescriptor - -usb.getFileDescriptor\(pipe: USBDevicePipe\): number +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list, call [usb.requestRight](#usbrequestright) to request the device access permission, and call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| Device pipe, which is used to determine the bus number and device address.| + +- Return value + | Type| Description| + | -------- | -------- | + | Uint8Array | Raw descriptor data.| + +- Example + ``` + let ret = usb.getRawDescriptor(devicepipe); + ``` + + +## usb.getFileDescriptor + +usb.getFileDescriptor(pipe: USBDevicePipe): number Obtains the file descriptor. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list, call [usb.requestRight](#section1865915394353) to request the device access permission, and call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

Device pipe, which is used to determine the bus number and device address.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

File descriptor of the USB device.

-
- -- Example - - ``` - let ret = usb.getFileDescriptor(devicepipe); - ``` - - -## usb.controlTransfer - -usb.controlTransfer\(pipe: USBDevicePipe, contrlparam: USBControlParams, timeout?: number\): Promise +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list, call [usb.requestRight](#usbrequestright) to request the device access permission, and call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| Device pipe, which is used to determine the bus number and device address.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | File descriptor of the USB device.| + +- Example + ``` + let ret = usb.getFileDescriptor(devicepipe); + ``` + + +## usb.controlTransfer + +usb.controlTransfer(pipe: USBDevicePipe, contrlparam: USBControlParams, timeout?: number): Promise<number> Performs control transfer. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list, call [usb.requestRight](#section1865915394353) to request the device access permission, and call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter. - -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

USB device pipe, which is used to determine the USB device.

-

contrlparam

-

USBControlParams

-

Yes

-

Control transfer parameters.

-

timeout

-

number

-

No

-

Timeout duration. This parameter is optional. The default value is 0, indicating no timeout.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<number>

-

Returns the size of the transmitted or received data block if the control transfer is successful; returns -1 if an exception occurs.

-
- -- Example - - ``` - usb.controlTransfer(devicepipe, USBControlParams).then((ret) => { - console.log(`controlTransfer = ${JSON.stringify(ret)}`); - }) - ``` - - -## usb.bulkTransfer - -usb.bulkTransfer\(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout?: number\): Promise +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list, call [usb.requestRight](#usbrequestright) to request the device access permission, and call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| USB device pipe, which is used to determine the USB device.| + | contrlparam | [USBControlParams](#usbcontrolparams) | Yes| Control transfer parameters.| + | timeout | number | No| Timeout duration. The default value is **0**, indicating no timeout.| + +- Return value + | Type| Description| + | -------- | -------- | + | Promise<number> | Returns the size of the transmitted or received data block if the control transfer is successful; returns **-1** if an exception occurs.| + +- Example + ``` + usb.controlTransfer(devicepipe, USBControlParams).then((ret) => { + console.log(`controlTransfer = ${JSON.stringify(ret)}`); + }) + ``` + + +## usb.bulkTransfer + +usb.bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout?: number): Promise<number> Performs bulk transfer. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list and endpoints, call [usb.requestRight](#section1865915394353) to request the device access permission, call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter, and call [usb.claimInterface](#section41056254494) to claim the USB interface. - -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

USB device pipe, which is used to determine the USB device.

-

endpoint

-

USBEndpoint

-

Yes

-

USB endpoint, which is used to determine the USB port for data transfer.

-

buffer

-

Uint8Array

-

Yes

-

Buffer for writing or reading data.

-

timeout

-

number

-

No

-

Timeout duration. This parameter is optional. The default value is 0, indicating no timeout.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Promise<number>

-

Returns the size of the transmitted or received data block if the control transfer is successful; returns -1 if an exception occurs.

-
- -- Example - - ``` - // Call usb.getDevices to obtain a data set. Then, obtain a USB device and its access permission. - // Pass the obtained USB device as a parameter to usb.connectDevice. Then, call usb.connectDevice to connect the USB device. - // Call usb.claimInterface to claim the USB interface. After that, call usb.bulkTransfer to start bulk transfer. - usb.bulkTransfer(devicepipe, endpoint, buffer).then((ret) => { - console.log(`bulkTransfer = ${JSON.stringify(ret)}`); - }); - ``` - - -## usb.closePipe - -usb.closePipe\(pipe: USBDevicePipe\): number +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list and endpoints, call [usb.requestRight](#usbrequestright) to request the device access permission, call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter, and call [usb.claimInterface](#usbclaiminterface) to claim the USB interface. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| USB device pipe, which is used to determine the USB device.| + | endpoint | [USBEndpoint](#usbendpoint) | Yes| USB endpoint, which is used to determine the USB port for data transfer.| + | buffer | Uint8Array | Yes| Buffer for writing or reading data.| + | timeout | number | No| Timeout duration. The default value is **0**, indicating no timeout.| + +- Return value + | Type| Description| + | -------- | -------- | + | Promise<number> | Returns the size of the transmitted or received data block if the control transfer is successful; returns **-1** if an exception occurs.| + +- Example + ``` + // Call usb.getDevices to obtain a data set. Then, obtain a USB device and its access permission. + // Pass the obtained USB device as a parameter to usb.connectDevice. Then, call usb.connectDevice to connect the USB device. + // Call usb.claimInterface to claim the USB interface. After that, call usb.bulkTransfer to start bulk transfer. + usb.bulkTransfer(devicepipe, endpoint, buffer).then((ret) => { + console.log(`bulkTransfer = ${JSON.stringify(ret)}`); + }); + ``` + + +## usb.closePipe + +usb.closePipe(pipe: USBDevicePipe): number Closes a USB device pipe. -Before you do this, call [usb.getDevices](#section1885592111287) to obtain the USB device list, call [usb.requestRight](#section1865915394353) to request the device access permission, and call [usb.connectDevice](#section910254722918) to obtain **devicepipe** as an input parameter. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

pipe

-

USBDevicePipe

-

Yes

-

USB device pipe.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Returns 0 if the USB device pipe is closed successfully; returns an error code otherwise.

-
- -- Example - - ``` - let ret = usb.closePipe(devicepipe); - console.log(`closePipe = ${ret}`); - ``` - - -## USBEndpoint - -Represents the USB endpoint from which data is sent or received. You can obtain the USB endpoint through [USBInterface](#section1564414611311). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

address

-

number

-

Endpoint address.

-

attributes

-

number

-

Endpoint attributes.

-

interval

-

number

-

Endpoint interval.

-

maxPacketSize

-

number

-

Maximum size of data packets on the endpoint.

-

direction

-

USBRequestDirection

-

Endpoint direction.

-

number

-

number

-

Endpoint number.

-

type

-

number

-

Endpoint type.

-

interfaceId

-

number

-

Unique ID of the interface to which the endpoint belongs.

-
- -## USBInterface - -Represents a USB interface. One [USBConfig](#section1172111051715) can contain multiple **USBInterface** instances, each providing a specific function. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

id

-

number

-

Unique ID of the USB interface.

-

protocol

-

number

-

Interface protocol.

-

clazz

-

number

-

Device type.

-

subClass

-

number

-

Device subclass.

-

alternateSetting

-

number

-

Settings for alternating between descriptors of the same USB interface.

-

name

-

string

-

Interface name.

-

endpoints

-

Array<USBEndpoint>

-

Endpoints that belong to the USB interface.

-
- -## USBConfig - -Represents the USB configuration. One [USBDevice](#section14936845182012) can contain multiple **USBConfig** instances. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

id

-

number

-

Unique ID of the USB configuration.

-

attributes

-

number

-

Configuration attributes.

-

maxPower

-

number

-

Maximum power consumption, in mA.

-

name

-

string

-

Configuration name, which can be left empty.

-

isRemoteWakeup

-

boolean

-

Support for remote wakeup.

-

isSelfPowered

-

boolean

-

Support for independent power supplies.

-

interfaces

-

Array <USBInterface>

-

Supported interface attributes.

-
- -## USBDevice - -Represents a USB device. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

busNum

-

number

-

Bus address.

-

devAddress

-

number

-

Device address.

-

serial

-

string

-

Device SN.

-

name

-

string

-

Device name.

-

manufacturerName

-

string

-

Device manufacturer.

-

productName

-

string

-

Product name.

-

version

-

string

-

Product version.

-

vendorId

-

number

-

Vendor ID.

-

productId

-

number

-

Product ID.

-

clazz

-

number

-

Device class.

-

subClass

-

number

-

Device subclass.

-

protocol

-

number

-

Device protocol code.

-

configs

-

Array<USBConfig>

-

Device configuration descriptor information.

-
- -## USBDevicePipe +Before you do this, call [usb.getDevices](#usbgetdevices) to obtain the USB device list, call [usb.requestRight](#usbrequestright) to request the device access permission, and call [usb.connectDevice](#usbconnectdevice) to obtain **devicepipe** as an input parameter. + +**System capability**: SystemCapability.USB.USBManager + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | pipe | [USBDevicePipe](#usbdevicepipe) | Yes| USB device pipe.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Returns **0** if the USB device pipe is closed successfully; returns an error code otherwise.| + +- Example + ``` + let ret = usb.closePipe(devicepipe); + console.log(`closePipe = ${ret}`); + ``` + + +## USBEndpoint + +Represents the USB endpoint from which data is sent or received. You can obtain the USB endpoint through [USBInterface](#usbinterface). + +| Name| Type| Description| +| -------- | -------- | -------- | +| address | number | Endpoint address.
**System capability**: SystemCapability.USB.USBManager| +| attributes | number | Endpoint attributes.
**System capability**: SystemCapability.USB.USBManager| +| interval | number | Endpoint interval.
**System capability**: SystemCapability.USB.USBManager| +| maxPacketSize | number | Maximum size of data packets on the endpoint.
**System capability**: SystemCapability.USB.USBManager| +| direction | [USBRequestDirection](#usbrequestdirection) | Endpoint direction.
**System capability**: SystemCapability.USB.USBManager| +| number | number | Endpoint number.
**System capability**: SystemCapability.USB.USBManager| +| type | number | Endpoint type.
**System capability**: SystemCapability.USB.USBManager| +| interfaceId | number | Unique ID of the interface to which the endpoint belongs.
**System capability**: SystemCapability.USB.USBManager| + + +## USBInterface + +Represents a USB interface. One [USBConfig](#usbconfig) can contain multiple **USBInterface** instances, each providing a specific function. + +| Name| Type| Description| +| -------- | -------- | -------- | +| id | number | Unique ID of the USB interface.
**System capability**: SystemCapability.USB.USBManager| +| protocol | number | Interface protocol.
**System capability**: SystemCapability.USB.USBManager| +| clazz | number | Device type.
**System capability**: SystemCapability.USB.USBManager| +| subClass | number | Device subclass.
**System capability**: SystemCapability.USB.USBManager| +| alternateSetting | number | Settings for alternating between descriptors of the same USB interface.
**System capability**: SystemCapability.USB.USBManager| +| name | string | Interface name.
**System capability**: SystemCapability.USB.USBManager| +| endpoints | Array<[USBEndpoint](#usbendpoint)> | Endpoints that belong to the USB interface.
**System capability**: SystemCapability.USB.USBManager| + + +## USBConfig + +Represents the USB configuration. One [USBDevice](#usbdevice) can contain multiple **USBConfig** instances. + +| Name| Type| Description| +| -------- | -------- | -------- | +| id | number | Unique ID of the USB configuration.
**System capability**: SystemCapability.USB.USBManager| +| attributes | number | Configuration attributes.
**System capability**: SystemCapability.USB.USBManager| +| maxPower | number | Maximum power consumption, in mA.
**System capability**: SystemCapability.USB.USBManager| +| name | string | Configuration name, which can be left empty.
**System capability**: SystemCapability.USB.USBManager| +| isRemoteWakeup | boolean | Support for remote wakeup.
**System capability**: SystemCapability.USB.USBManager| +| isSelfPowered | boolean | Support for independent power supplies.
**System capability**: SystemCapability.USB.USBManager| +| interfaces | Array <[USBInterface](#usbinterface)> | Supported interface attributes.
**System capability**: SystemCapability.USB.USBManager| + + +## USBDevice + +Represents the USB device information. + +| Name| Type| Description| +| -------- | -------- | -------- | +| busNum | number | Bus address.
**System capability**: SystemCapability.USB.USBManager| +| devAddress | number | Device address.
**System capability**: SystemCapability.USB.USBManager| +| serial | string | Device SN.
**System capability**: SystemCapability.USB.USBManager| +| name | string | Device name.
**System capability**: SystemCapability.USB.USBManager| +| manufacturerName | string | Device manufacturer.
**System capability**: SystemCapability.USB.USBManager| +| productName | string | Product information.
**System capability**: SystemCapability.USB.USBManager| +| version | string | Version.
**System capability**: SystemCapability.USB.USBManager| +| vendorId | number | Vendor ID.
**System capability**: SystemCapability.USB.USBManager| +| productId | number | Product ID.
**System capability**: SystemCapability.USB.USBManager| +| clazz | number | Device class.
**System capability**: SystemCapability.USB.USBManager| +| subClass | number | Device subclass.
**System capability**: SystemCapability.USB.USBManager| +| protocol | number | Device protocol code.
**System capability**: SystemCapability.USB.USBManager| +| configs | Array<[USBConfig](#usbconfig)> | Device configuration descriptor information.
**System capability**: SystemCapability.USB.USBManager| + + +## USBDevicePipe Represents a USB device pipe, which is used to determine a USB device. - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

busNum

-

number

-

Bus address.

-

devAddress

-

number

-

Device address.

-
- -## USBControlParams +| Name| Type| Description| +| -------- | -------- | -------- | +| busNum | number | Bus address.
**System capability**: SystemCapability.USB.USBManager| +| devAddress | number | Device address.
**System capability**: SystemCapability.USB.USBManager| + + +## USBControlParams Represents control transfer parameters. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Description

-

request

-

number

-

Request type.

-

target

-

USBRequestTargetType

-

Request target type.

-

reqType

-

USBControlRequestType

-

Request control type.

-

value

-

number

-

Request parameter value.

-

index

-

number

-

Index of the request parameter value.

-

data

-

Uint8Array

-

Data written to or read from the buffer.

-
- -## USBRequestTargetType - -Enumerates USB request target types. - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

USB_REQUEST_TARGET_DEVICE

-

0

-

Device

-

USB_REQUEST_TARGET_INTERFACE

-

1

-

Interface

-

USB_REQUEST_TARGET_ENDPOINT

-

2

-

Endpoint

-

USB_REQUEST_TARGET_OTHER

-

3

-

Others

-
- -## USBControlRequestType +| Name| Type| Description| +| -------- | -------- | -------- | +| request | number | Request type.| +| target | [USBRequestTargetType](#usbrequesttargettype) | Request target type.
**System capability**: SystemCapability.USB.USBManager| +| reqType | [USBControlRequestType](#usbcontrolrequesttype) | Request control type.
**System capability**: SystemCapability.USB.USBManager| +| value | number | Request parameters
**System capability**: SystemCapability.USB.USBManager| +| index | number | Index of the request parameter value.
**System capability**: SystemCapability.USB.USBManager| +| data | Uint8Array | Buffer for writing or reading data.
**System capability**: SystemCapability.USB.USBManager| + + +## USBRequestTargetType + +Represents the request target type. + + +| Name| Default Value| Description| +| -------- | -------- | -------- | +| USB\_REQUEST\_TARGET\_DEVICE | 0 | Device.
**System capability**: SystemCapability.USB.USBManager| +| USB\_REQUEST\_TARGET\_INTERFACE | 1 | Interface.
**System capability**: SystemCapability.USB.USBManager| +| USB\_REQUEST\_TARGET\_ENDPOINT | 2 | Endpoint
**System capability**: SystemCapability.USB.USBManager| +| USB_REQUEST_TARGET_OTHER | 3 | Others
**System capability**: SystemCapability.USB.USBManager| + + +## USBControlRequestType Enumerates control request types. - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

USB_REQUEST_TYPE_STANDARD

-

0

-

Standard

-

USB_REQUEST_TYPE_CLASS

-

1

-

Class

-

USB_REQUEST_TYPE_VENDOR

-

2

-

Vendor

-
- -## USBRequestDirection +| Name| Default Value| Description| +| -------- | -------- | -------- | +| USB\_REQUEST\_TYPE\_STANDARD | 0 | Standard
**System capability**: SystemCapability.USB.USBManager| +| USB\_REQUEST\_TYPE\_CLASS | 1 | Class
**System capability**: SystemCapability.USB.USBManager| +| USB\_REQUEST\_TYPE\_VENDOR | 2 | Vendor
**System capability**: SystemCapability.USB.USBManager| + + +## USBRequestDirection Enumerates request directions. - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

USB_REQUEST_TYPE_STANDARD

-

0

-

Request for writing data from the host to the device.

-

USB_REQUEST_TYPE_CLASS

-

0x80

-

Request for reading data from the device to the host.

-
- - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

NONE

-

0

-

None.

-

ACM

-

1

-

Serial port device

-

ECM

-

2

-

Ethernet port device

-

HDC

-

4

-

HDC device

-
+| Name| Default Value| Description| +| -------- | -------- | -------- | +| USB\_REQUEST\_TYPE\_STANDARD | 0 | Request for writing data from the host to the device.
**System capability**: SystemCapability.USB.USBManager| +| USB\_REQUEST\_TYPE\_CLASS | 0x80 | Request for reading data from the device to the host.
**System capability**: SystemCapability.USB.USBManager| + +| Name| Default Value| Description| +| -------- | -------- | -------- | +| NONE | 0 | None
**System capability**: SystemCapability.USB.USBManager| +| ACM | 1 | Serial port device
**System capability**: SystemCapability.USB.USBManager| +| ECM | 2 | Ethernet port device
**System capability**: SystemCapability.USB.USBManager| +| HDC | 4 | HDC device
**System capability**: SystemCapability.USB.USBManager| -- Gitee From b8004349daa44dfec1a27cd5743536abcf8ccb3f Mon Sep 17 00:00:00 2001 From: shawn_he Date: Mon, 7 Mar 2022 18:06:18 +0800 Subject: [PATCH 178/282] update docs Signed-off-by: shawn_he --- en/application-dev/reference/apis/js-apis-usb.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-usb.md b/en/application-dev/reference/apis/js-apis-usb.md index f51e459ac36..5ec4d9e3364 100644 --- a/en/application-dev/reference/apis/js-apis-usb.md +++ b/en/application-dev/reference/apis/js-apis-usb.md @@ -538,10 +538,3 @@ Enumerates request directions. | -------- | -------- | -------- | | USB\_REQUEST\_TYPE\_STANDARD | 0 | Request for writing data from the host to the device.
**System capability**: SystemCapability.USB.USBManager| | USB\_REQUEST\_TYPE\_CLASS | 0x80 | Request for reading data from the device to the host.
**System capability**: SystemCapability.USB.USBManager| - -| Name| Default Value| Description| -| -------- | -------- | -------- | -| NONE | 0 | None
**System capability**: SystemCapability.USB.USBManager| -| ACM | 1 | Serial port device
**System capability**: SystemCapability.USB.USBManager| -| ECM | 2 | Ethernet port device
**System capability**: SystemCapability.USB.USBManager| -| HDC | 4 | HDC device
**System capability**: SystemCapability.USB.USBManager| -- Gitee From 17e637a04b43b55365e0f819543a86de0853ed15 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Mon, 7 Mar 2022 18:47:16 +0800 Subject: [PATCH 179/282] update doc Signed-off-by: ester.zhou --- en/application-dev/ui/ts-types.md | 54 +++++++++++++++---------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/en/application-dev/ui/ts-types.md b/en/application-dev/ui/ts-types.md index b9882c03421..3e428539f04 100644 --- a/en/application-dev/ui/ts-types.md +++ b/en/application-dev/ui/ts-types.md @@ -2,58 +2,58 @@ ## Length Type -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| Length | string \| number | Length unit. If the input is a number, use **vp**. If the input is a string, explicitly specify the unit, for example, **'10px'**, or specify the length in percentage, for example, **'100%'**.| +| Length | string \| number | Length unit. If the input is a number, use **vp**. If the input is a string, explicitly specify the unit, for example, **'10px'**, or specify the length in percentage, for example, **'100%'**.| ## Angle Type -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| Angle | string \| number | Angle unit. If the input is a number, use **deg**. If the input is a string, explicitly specify the unit, which can be either of the following:
- deg, as in **'100deg'**
- rad, as in **'3.14rad'** | +| Angle | string \| number | Angle unit. If the input is a number, use **deg**. If the input is a string, explicitly specify the unit, which can be either of the following:
- deg, as in **'100deg'**
- rad, as in **'3.14rad'** | ## Point Type -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| Point | [Length, Length] | Coordinates of a point. The first value is the x-axis coordinate, and the second value is the y-axis coordinate.| +| Point | [Length, Length] | Coordinates of a point. The first value is the x-axis coordinate, and the second value is the y-axis coordinate.| ## Color Type The **Color** used by the component attribute method is described as follows: -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| Color | string \| number \| Color | Color information. If the input is a string, use **rgb** or **rgba** to specify the color. If the input is a number, use Hex format to specify the color. If the input is a **Color" enum, use a color value to specify the color.
- 'rgb(255, 255, 255)'
- 'rgba(255, 255, 255, 1.0)'
- Hex format: 0xrrggbb, 0xaarrggbb, '\#FFFFFF'
- Enum: Color.Black, Color.White| +| Color | string \| number \| Color | Color information. If the input is a string, use **rgb** or **rgba** to specify the color. If the input is a number, use Hex format to specify the color. If the input is a **Color" enum, use a color value to specify the color.
- 'rgb(255, 255, 255)'
- 'rgba(255, 255, 255, 1.0)'
- Hex format: 0xrrggbb, 0xaarrggbb, '\#FFFFFF'
- Enum: Color.Black, Color.White| The supported **Color** enums are described as follows: -| Color| Value| Illustration| +| Color| Value| Illustration| | -------- | -------- | -------- | -| Black | 0x000000 | ![en-us_image_0000001219864153](figures/en-us_image_0000001219864153.png) | -| Blue | 0x0000ff | ![en-us_image_0000001174104404](figures/en-us_image_0000001174104404.png) | -| Brown | 0xa52a2a | ![en-us_image_0000001219744201](figures/en-us_image_0000001219744201.png) | -| Gray | 0x808080 | ![en-us_image_0000001174264376](figures/en-us_image_0000001174264376.png) | -| Green | 0x008000 | ![en-us_image_0000001174422914](figures/en-us_image_0000001174422914.png) | -| Orange | 0xffa500 | ![en-us_image_0000001219662661](figures/en-us_image_0000001219662661.png) | -| Pink | 0xffc0cb | ![en-us_image_0000001219662663](figures/en-us_image_0000001219662663.png) | -| Red | 0xff0000 | ![en-us_image_0000001219662665](figures/en-us_image_0000001219662665.png) | -| White | 0xffffff | ![en-us_image_0000001174582866](figures/en-us_image_0000001174582866.png) | -| Yellow | 0xffff00 | ![en-us_image_0000001174582864](figures/en-us_image_0000001174582864.png) | +| Black | 0x000000 | ![en-us_image_0000001219864153](figures/en-us_image_0000001219864153.png) | +| Blue | 0x0000ff | ![en-us_image_0000001174104404](figures/en-us_image_0000001174104404.png) | +| Brown | 0xa52a2a | ![en-us_image_0000001219744201](figures/en-us_image_0000001219744201.png) | +| Gray | 0x808080 | ![en-us_image_0000001174264376](figures/en-us_image_0000001174264376.png) | +| Green | 0x008000 | ![en-us_image_0000001174422914](figures/en-us_image_0000001174422914.png) | +| Orange | 0xffa500 | ![en-us_image_0000001219662661](figures/en-us_image_0000001219662661.png) | +| Pink | 0xffc0cb | ![en-us_image_0000001219662663](figures/en-us_image_0000001219662663.png) | +| Red | 0xff0000 | ![en-us_image_0000001219662665](figures/en-us_image_0000001219662665.png) | +| White | 0xffffff | ![en-us_image_0000001174582866](figures/en-us_image_0000001174582866.png) | +| Yellow | 0xffff00 | ![en-us_image_0000001174582864](figures/en-us_image_0000001174582864.png) | ## ColorStop Type **ColorStop** is used to describe the progressive color stop. -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| ColorStop | [Color, number] | Type of the progressive color stop. The first parameter specifies the color value, and the second parameter specifies the ratio of 0 to 1.| +| ColorStop | [Color, number] | Type of the progressive color stop. The first parameter specifies the color value, and the second parameter specifies the ratio of 0 to 1.| ## Resource Type @@ -72,23 +72,23 @@ You can use **$r** or **$rawfile** to create a **Resource** object. For details, - $rawfile('filename') **filename**: name of the file in **resources/rawfile** of the project. -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| Resource | {
readonly id: [number];
readonly type: [number];
readonly params?: any[];
} | **id**: resource ID.
**type**: resource type (enumerated value).
**params**: optional parameters.
After a **Resource** object is created using **$r** or **$rawfile**, modifying attribute values of the object is prohibited.| +| Resource | {
readonly id: [number];
readonly type: [number];
readonly params?: any[];
} | **id**: resource ID.
**type**: resource type (enumerated value).
**params**: optional parameters.
After a **Resource** object is created using **$r** or **$rawfile**, modifying attribute values of the object is prohibited.| ## ResourceStr8+ -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| ResourceStr | string \| [Resource](#resource type)| Resource string.| +| ResourceStr | string \| [Resource](#ResourceType) | Resource string.| ## Resource Color8+ -| Name| Type| Description| +| Name| Type| Description| | -------- | -------- | -------- | -| ResourceColor | Color \| number \| string \| [Resource](#resource type)| Resource color.| +| ResourceColor | Color \| number \| string \| [Resource](#ResourceType) | Resource color.| ## Custom Builder8+ -- Gitee From d0546649bbe017256f9e213e210c22d1b1de0a6b Mon Sep 17 00:00:00 2001 From: clevercong Date: Mon, 7 Mar 2022 18:57:13 +0800 Subject: [PATCH 180/282] format files. Signed-off-by: clevercong --- .../reference/apis/js-apis-http.md | 126 +++----- .../reference/apis/js-apis-socket.md | 287 +++++++++--------- .../reference/apis/js-apis-webSocket.md | 110 +++---- 3 files changed, 236 insertions(+), 287 deletions(-) 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 d330766001b..23b7eb543c2 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-http.md +++ b/zh-cn/application-dev/reference/apis/js-apis-http.md @@ -1,23 +1,4 @@ -# 数据请求 - -- [导入模块](#s56d19203690d4782bfc74069abb6bd71) -- [权限列表](#section11257113618419) -- [完整示例](#section119676440437) -- [http.createHttp](#section375081875219) -- [HttpRequest](#section775213486457) - - [request](#section08941433184616) - - [request](#section1361727114718) - - [request](#section47538114482) - - [destroy](#section613614500483) - - [on\('headerReceive'\)](#section617831813498) - - [off\('headerReceive'\)](#section017612118508) - - [on\('headersReceive'\)8+](#section6178318134982) - - [off\('headersReceive'\)8+](#section0176121185082) - - [once\('headersReceive'\)8+](#section68221041134718) -- [HttpRequestOptions](#section12262183471518) -- [RequestMethod](#section63024410264) -- [ResponseCode](#section769218832018) -- [HttpResponse](#section15920192914312) +# 数据请求 >![](public_sys-resources/icon-note.gif) **说明:** > @@ -25,17 +6,13 @@ > >本模块所有接口需要设备具有系统能力:SystemCapability.Communication.NetStack -## 导入模块 +## 导入模块 ``` import http from '@ohos.net.http'; ``` -## 权限列表 - -ohos.permission.INTERNET - -## 完整示例 +## 完整示例 ``` import http from '@ohos.net.http'; @@ -80,7 +57,7 @@ httpRequest.request( ); ``` -## http.createHttp +## http.createHttp createHttp\(\): HttpRequest @@ -100,22 +77,24 @@ let httpRequest = http.createHttp(); ``` -## HttpRequest +## HttpRequest -http请求任务。在调用HttpRequest的方法前,需要先通过[createHttp\(\)](#section375081875219)创建一个任务。 +http请求任务。在调用HttpRequest的方法前,需要先通过[createHttp\(\)](#httpcreatehttp)创建一个任务。 -### request +### request request\(url: string, callback: AsyncCallback\\):void 根据URL地址,发起HTTP网络请求,使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------- | ---- | ----------------------- | | url | string | 是 | 发起网络请求的URL地址。 | -| callback | AsyncCallback\<[HttpResponse](#section12262183471518)\> | 是 | 回调函数。 | +| callback | AsyncCallback\<[HttpResponse](#httpresponse)\> | 是 | 回调函数。 | **示例:** @@ -133,19 +112,21 @@ httpRequest.request("EXAMPLE_URL", (err, data) => { }); ``` -### request +### request request\(url: string, options: HttpRequestOptions, callback: AsyncCallback\):void 根据URL地址和相关配置项,发起HTTP网络请求,使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------------------------------- | ---- | -------------------------------------------------- | -| url | string | 是 | 发起网络请求的URL地址。 | -| options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#section12262183471518)。 | -| callback | AsyncCallback\<[HttpResponse](#section12262183471518)\> | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------------- | ---- | ----------------------------------------------- | +| url | string | 是 | 发起网络请求的URL地址。 | +| options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#httprequestoptions)。 | +| callback | AsyncCallback\<[HttpResponse](#httpresponse)\> | 是 | 回调函数。 | **示例:** @@ -176,24 +157,26 @@ httpRequest.request("EXAMPLE_URL", ``` -### request +### request request\(url: string, options? : HttpRequestOptions\): Promise 根据URL地址,发起HTTP网络请求,使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------------------ | ---- | -------------------------------------------------- | | url | string | 是 | 发起网络请求的URL地址。 | -| options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#section12262183471518)。 | +| options | HttpRequestOptions | 是 | 参考[HttpRequestOptions](#httprequestoptions)。 | **返回值:** | 类型 | 说明 | | :-------------------- | :-------------------------------- | -| Promise<[HttpResponse](#section12262183471518)> | 以Promise形式返回发起请求的结果。 | +| Promise<[HttpResponse](#httpresponse)> | 以Promise形式返回发起请求的结果。 | **示例:** @@ -222,7 +205,7 @@ promise.then((value) => { }); ``` -### destroy +### destroy destroy\(\): void @@ -235,21 +218,21 @@ let httpRequest= http.createHttp(); httpRequest.destroy(); ``` -### on\('headerReceive'\) +### on\('headerReceive'\) on\(type: 'headerReceive', callback: AsyncCallback\):void 订阅HTTP Response Header 事件。 >![](public_sys-resources/icon-note.gif) **说明:** -> 此接口已废弃,建议使用on\('headersReceive'\)替代。 +> 此接口已废弃,建议使用[on\('headersReceive'\)8+](#onheadersreceive8)替代。 **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ----------------------- | ---- | ------------------------------------- | -| type | string | 是 | 订阅的事件类型,如:'headerReceive'。 | -| callback | AsyncCallback\ | 是 | 回调函数。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | --------------------------------- | +| type | string | 是 | 订阅的事件类型,'headerReceive'。 | +| callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -265,7 +248,7 @@ httpRequest.on('headerReceive', (err, data) => { ``` -### off\('headerReceive'\) +### off\('headerReceive'\) off\(type: 'headerReceive', callback?: AsyncCallback\):void @@ -273,7 +256,7 @@ off\(type: 'headerReceive', callback?: AsyncCallback\):void >![](public_sys-resources/icon-note.gif) **说明:** > ->1. 此接口已废弃,建议使用off\('headersReceive'\)替代。 +>1. 此接口已废弃,建议使用[off\('headersReceive'\)8+](#offheadersreceive8)替代。 > >2. 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 @@ -298,7 +281,7 @@ httpRequest.on('headerReceive', (err, data) => { httpRequest.off('headerReceive'); ``` -### on\('headersReceive'\)8+ +### on\('headersReceive'\)8+ on\(type: 'headersReceive', callback: Callback\):void @@ -321,7 +304,7 @@ httpRequest.on('headersReceive', (data) => { ``` -### off\('headersReceive'\)8+ +### off\('headersReceive'\)8+ off\(type: 'headersReceive', callback?: Callback\):void @@ -344,7 +327,7 @@ let httpRequest= http.createHttp(); httpRequest.off('headersReceive'); ``` -### once\('headersReceive'\)8+ +### once\('headersReceive'\)8+ once\(type: "headersReceive", callback: Callback\): void @@ -366,27 +349,19 @@ httpRequest.once('headersReceive', (data) => { }); ``` -## HttpRequestOptions +## HttpRequestOptions 发起请求可选参数的类型和取值范围。 | 参数 | 类型 | 必填 | 说明 | | -------------- | ------------------------------------ | ---- | ---------------------------------------------------------- | -| method | [RequestMethod](#section63024410264) | 否 | 请求方式。 | -| extraData | string \| Object \| ArrayBuffer8+ | 否 | 发送请求的额外数据。详见下方说明。 | +| method | [RequestMethod](#requestmethod) | 否 | 请求方式。 | +| extraData | string \| Object \| ArrayBuffer8+ | 否 | 发送请求的额外数据。
- 当HTTP请求为POST、PUT等方法时,此字段为HTTP请求的content。
- 当HTTP请求为GET、OPTIONS、DELETE、TRACE、CONNECT等方法时,此字段为HTTP请求的参数补充,参数内容会拼接到URL中进行发送。8+
- 开发者传入string对象,开发者需要自行编码,将编码后的string传入。8+ | | header | Object | 否 | HTTP请求头字段。默认{'Content-Type': 'application/json'}。 | | readTimeout | number | 否 | 读取超时时间。单位为毫秒(ms),默认为60000ms。 | | connectTimeout | number | 否 | 连接超时时间。单位为毫秒(ms),默认为60000ms。 | -> ![](public_sys-resources/icon-note.gif) **说明:** -> -> 1. 当HTTP请求为POST、PUT等方法时,此字段为HTTP请求的content。 -> -> 2. 当HTTP请求为GET、OPTIONS、DELETE、TRACE、CONNECT等方法时,此字段为HTTP请求的参数补充,参数内容会拼接到URL中进行发送。8+ -> -> 3. 开发者传入string对象,开发者需要自行编码,将编码后的string传入。8+ - -## RequestMethod +## RequestMethod HTTP 请求方法。 @@ -401,7 +376,7 @@ HTTP 请求方法。 | TRACE | HTTP 请求 TRACE。 | | CONNECT | HTTP 请求 CONNECT。 | -## ResponseCode +## ResponseCode 发起请求返回的响应码。 @@ -443,21 +418,14 @@ HTTP 请求方法。 | GATEWAY_TIMEOUT | 504 | 充当网关或代理的服务器,未及时从远端服务器获取请求。 | | VERSION | 505 | 服务器请求的HTTP协议的版本。 | -## HttpResponse +## HttpResponse request方法回调函数的返回值类型。 -| 参数名 | 类型 | 必填 | 说明 | -| ------------ | ---------------------------------------------- | ---- | ------------------------------------------------------------ | -| result | string \| Object \| ArrayBuffer8+ | 是 | Http请求根据响应头中Content-type类型返回对应的响应格式内容。详见下方说明。 | -| responseCode | [ResponseCode](#section769218832018) \| number | 是 | 回调函数执行成功时,此字段为[ResponseCode](#section769218832018)。若执行失败,错误码将会从AsyncCallback中的err字段返回。错误码如下:
- 200:通用错误
- 202:参数错误
- 300:I/O错误 | -| header | Object | 是 | 发起http请求返回来的响应头。当前返回的是JSON格式字符串,如需具体字段内容,需开发者自行解析。常见字段及解析方式如下:
- Content-Type:header['Content-Type'];
- Status-Line:header['Status-Line'];
- Date:header.Date/header['Date'];
- Server:header.Server/header['Server']; | -| cookies8+ | Array\ | 是 | 服务器返回的 cookies。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------------------- | -------------------------------------------- | ---- | ------------------------------------------------------------ | +| result | string \| Object \| ArrayBuffer8+ | 是 | Http请求根据响应头中Content-type类型返回对应的响应格式内容:
- application/json:返回JSON格式的字符串,如需Http响应具体内容,需开发者自行解析
- application/octet-stream:ArrayBuffer
- 其他:string | +| responseCode | [ResponseCode](#responsecode) \| number | 是 | 回调函数执行成功时,此字段为[ResponseCode](#responsecode)。若执行失败,错误码将会从AsyncCallback中的err字段返回。错误码如下:
- 200:通用错误
- 202:参数错误
- 300:I/O错误 | +| header | Object | 是 | 发起http请求返回来的响应头。当前返回的是JSON格式字符串,如需具体字段内容,需开发者自行解析。常见字段及解析方式如下:
- Content-Type:header['Content-Type'];
- Status-Line:header['Status-Line'];
- Date:header.Date/header['Date'];
- Server:header.Server/header['Server']; | +| cookies8+ | Array\ | 是 | 服务器返回的 cookies。 | -> ![](public_sys-resources/icon-note.gif) **说明:** -> -> 根据响应头中Content-type类型的不同,返回的类型不同: -> -> - application/json:返回JSON格式的字符串,如需Http响应具体内容,需开发者自行解析 -> - application/octet-stream:ArrayBuffer -> - 其他:string diff --git a/zh-cn/application-dev/reference/apis/js-apis-socket.md b/zh-cn/application-dev/reference/apis/js-apis-socket.md index 81a20ed2ddf..701c53fd9c4 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-socket.md +++ b/zh-cn/application-dev/reference/apis/js-apis-socket.md @@ -1,57 +1,4 @@ -# Socket连接 - -- [导入模块](#s56d19203690d4782bfc74069abb6bd71) -- [权限列表](#section11257113618419) -- [socket.constructUDPSocketInstance](#section375081875219) -- [UDPSocket](#section1957294511568) - - [bind](#section7382103811272) - - [bind](#section12433131831219) - - [send](#section1859172655111) - - [send](#section61591275527) - - [close](#section068563155214) - - [close](#section1788163335319) - - [getState](#section1028719549533) - - [getState](#section1333814412551) - - [setExtraOptions](#section16890953175514) - - [setExtraOptions](#section5493159165611) - - [on\('message'\)](#section1632573015551) - - [off\('message'\)](#section789519374558) - - [on\('listening' | 'close'\)](#section20461174410557) - - [off\('listening' | 'close'\)](#section649105218559) - - [on\('error'\)](#section16745135855515) - - [off\('error'\)](#section49111157568) - -- [NetAddress](#section159132241295) -- [UDPSendOptions](#section13297558184010) -- [UDPExtraOptions](#section1650575184117) -- [SocketStateBase](#section164609984111) -- [SocketRemoteInfo](#section46021613174115) -- [socket.constructTCPSocketInstance](#section283119484161) -- [TCPSocket](#section1180211014548) - - [bind](#section8465924145710) - - [bind](#section27150134582) - - [connect](#section82761299586) - - [connect](#section374992304) - - [send](#section74991317709) - - [send](#section2841321507) - - [close](#section71701043701) - - [close](#section13523755306) - - [getRemoteAddress](#section1268431414115) - - [getRemoteAddress](#section89019337116) - - [getState](#section830554511115) - - [getState](#section3460522026) - - [setExtraOptions](#section738911419219) - - [setExtraOptions](#section1847278215) - - [on\('message'\)](#section642292019182) - - [off\('message'\)](#section8426920151811) - - [on\('connect' | 'close'\)](#section6429202001812) - - [off\('connect' | 'close'\)](#section54325209187) - - [on\('error'\)](#section19436172061817) - - [off\('error'\)](#section6438202013182) - -- [TCPConnectOptions](#section13821005712) -- [TCPSendOptions](#section1689232415715) -- [TCPExtraOptions](#section13892555115718) +# Socket连接 >![](public_sys-resources/icon-note.gif) **说明:** > @@ -59,17 +6,17 @@ > >本模块所有接口需要设备具有系统能力:SystemCapability.Communication.NetStack -## 导入模块 +## 导入模块 ``` import socket from '@ohos.net.socket'; ``` -## 权限列表 +## 权限列表 ohos.permission.INTERNET -## socket.constructUDPSocketInstance +## socket.constructUDPSocketInstance constructUDPSocketInstance\(\): UDPSocket @@ -79,7 +26,7 @@ constructUDPSocketInstance\(\): UDPSocket | 类型 | 说明 | | :--------------------------------- | :---------------------- | -| [UDPSocket](#section1957294511568) | 返回一个UDPSocket对象。 | +| [UDPSocket](#udpsocket) | 返回一个UDPSocket对象。 | **示例:** @@ -89,21 +36,23 @@ let udp = socket.constructUDPSocketInstance(); ``` -## UDPSocket +## UDPSocket -UDPSocket连接。在调用UDPSocket的方法前,需要先通过[socket.constructUDPSocketInstance](#section375081875219)创建UDPSocket对象。 +UDPSocket连接。在调用UDPSocket的方法前,需要先通过[socket.constructUDPSocketInstance](#socketconstructudpsocketinstance)创建UDPSocket对象。 -### bind +### bind bind\(address: NetAddress, callback: AsyncCallback\): void 绑定IP地址和端口,端口可以指定或由系统随机分配。使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | -| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| address | [NetAddress](#netaddress) | 是 | 目标地址信息,参考[NetAddress](#netaddress)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -120,17 +69,19 @@ udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { ``` -### bind +### bind bind\(address: NetAddress\): Promise 绑定IP地址和端口,端口可以指定或由系统随机分配。使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------- | ---- | ------------------------------------------------------ | -| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| address | [NetAddress](#netaddress) | 是 | 目标地址信息,参考[NetAddress](#netaddress)。 | **返回值:** @@ -152,17 +103,19 @@ promise .then(() => { ``` -### send +### send send\(options: UDPSendOptions, callback: AsyncCallback\): void 通过UDPSocket连接发送数据。使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | +| options | [UDPSendOptions](#udpsendoptions) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#udpsendoptions)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -186,17 +139,19 @@ udp.send({ ``` -### send +### send send\(options: UDPSendOptions\): Promise 通过UDPSocket连接发送数据。使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [UDPSendOptions](#section13297558184010) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#section13297558184010)。 | +| options | [UDPSendOptions](#udpsendoptions) | 是 | UDPSocket发送参数,参考[UDPSendOptions](#udpsendoptions)。 | **返回值:** @@ -224,12 +179,14 @@ promise.then(() => { ``` -### close +### close close\(callback: AsyncCallback\): void 关闭UDPSocket连接。使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -250,12 +207,14 @@ udp.close(err => { ``` -### close +### close close\(\): Promise 关闭UDPSocket连接。使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **返回值:** | 类型 | 说明 | @@ -275,20 +234,22 @@ promise.then(() => { ``` -### getState +### getState getState\(callback: AsyncCallback\): void 获取UDPSocket状态。使用callback方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section7382103811272)方法调用成功后,才可调用此方法。 +>[bind](#bind)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------ | ---- | ---------- | -| callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | +| callback | AsyncCallback<[SocketStateBase](#socketstatebase)> | 是 | 回调函数。 | **示例:** @@ -311,20 +272,22 @@ udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { ``` -### getState +### getState getState\(\): Promise 获取UDPSocket状态。使用Promise方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section7382103811272)方法调用成功后,才可调用此方法。 +>[bind](#bind)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **返回值:** | 类型 | 说明 | | :----------------------------------------------- | :----------------------------------------- | -| Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取UDPSocket状态的结果。 | +| Promise<[SocketStateBase](#socketstatebase)> | 以Promise形式返回获取UDPSocket状态的结果。 | **示例:** @@ -346,20 +309,22 @@ udp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { ``` -### setExtraOptions +### setExtraOptions setExtraOptions\(options: UDPExtraOptions, callback: AsyncCallback\): void 设置UDPSocket连接的其他属性。使用callback方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section7382103811272)方法调用成功后,才可调用此方法。 +>[bind](#bind)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | +| options | [UDPExtraOptions](#udpextraoptions) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#udpextraoptions)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | @@ -390,20 +355,22 @@ udp.bind({address:'192.168.xx.xxx', port:xxxx, family:1}, err=> { ``` -### setExtraOptions +### setExtraOptions setExtraOptions\(options: UDPExtraOptions\): Promise 设置UDPSocket连接的其他属性。使用Promise方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section7382103811272)方法调用成功后,才可调用此方法。 +>[bind](#bind)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [UDPExtraOptions](#section1650575184117) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#section1650575184117)。 | +| options | [UDPExtraOptions](#udpextraoptions) | 是 | UDPSocket连接的其他属性,参考[UDPExtraOptions](#udpextraoptions)。 | **返回值:** @@ -436,7 +403,7 @@ promise.then(() => { ``` -### on\('message'\) +### on\('message'\) on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void @@ -447,7 +414,7 @@ on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: Sock | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | -| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#socketremoteinfo)}> | 是 | 回调函数。 | **示例:** @@ -459,7 +426,7 @@ udp.on('message', value => { ``` -### off\('message'\) +### off\('message'\) off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void @@ -473,7 +440,7 @@ off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: So | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | -| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#socketremoteinfo)}> | 否 | 回调函数。 | **示例:** @@ -489,7 +456,7 @@ udp.off('message'); ``` -### on\('listening' | 'close'\) +### on\('listening' | 'close'\) on\(type: 'listening' | 'close', callback: Callback\): void @@ -515,7 +482,7 @@ udp.on('close', () => { ``` -### off\('listening' | 'close'\) +### off\('listening' | 'close'\) off\(type: 'listening' | 'close', callback?: Callback\): void @@ -552,7 +519,7 @@ udp.off('close'); ``` -### on\('error'\) +### on\('error'\) on\(type: 'error', callback: ErrorCallback\): void @@ -576,7 +543,7 @@ udp.on('error', err => { ``` -### off\('error'\) +### off\('error'\) off\(type: 'error', callback?: ErrorCallback\): void @@ -606,7 +573,7 @@ udp.off('error'); ``` -## NetAddress +## NetAddress 目标地址信息。 @@ -616,16 +583,16 @@ udp.off('error'); | port | number | 否 | 端口号 ,范围0~65535。如果不指定系统随机分配端口。 | | family | number | 否 | 网络协议类型,可选类型:
- 1:IPv4
- 2:IPv6
默认为1。 | -## UDPSendOptions +## UDPSendOptions UDPSocket发送参数。 | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------- | ---- | -------------- | | data | string | 是 | 发送的数据。 | -| address | [NetAddress](#section159132241295) | 是 | 目标地址信息。 | +| address | [NetAddress](#netaddress) | 是 | 目标地址信息。 | -## UDPExtraOptions +## UDPExtraOptions UDPSocket连接的其他属性。 @@ -637,7 +604,7 @@ UDPSocket连接的其他属性。 | reuseAddress | boolean | 否 | 是否重用地址。默认为false。 | | socketTimeout | number | 否 | 套接字超时时间,单位毫秒(ms)。 | -## SocketStateBase +## SocketStateBase Socket的状态信息。 @@ -647,7 +614,7 @@ Socket的状态信息。 | isClose | boolean | 是 | 是否关闭。 | | isConnected | boolean | 是 | 是否连接。 | -## SocketRemoteInfo +## SocketRemoteInfo Socket的连接信息。 @@ -658,7 +625,7 @@ Socket的连接信息。 | port | number | 是 | 端口号,范围0~65535。 | | size | number | 是 | 服务器响应信息的字节长度。 | -## socket.constructTCPSocketInstance +## socket.constructTCPSocketInstance constructTCPSocketInstance\(\): TCPSocket @@ -668,7 +635,7 @@ constructTCPSocketInstance\(\): TCPSocket | 类型 | 说明 | | :--------------------------------- | :---------------------- | - | [TCPSocket](#section1180211014548) | 返回一个TCPSocket对象。 | + | [TCPSocket](#tcpsocket) | 返回一个TCPSocket对象。 | **示例:** @@ -677,21 +644,23 @@ let tcp = socket.constructTCPSocketInstance(); ``` -## TCPSocket +## TCPSocket -TCPSocket连接。在调用TCPSocket的方法前,需要先通过[socket.constructTCPSocketInstance](#section283119484161)创建TCPSocket对象。 +TCPSocket连接。在调用TCPSocket的方法前,需要先通过[socket.constructTCPSocketInstance](#socketconstructtcpsocketinstance)创建TCPSocket对象。 -### bind +### bind bind\(address: NetAddress, callback: AsyncCallback\): void 绑定IP地址和端口,端口可以指定或由系统随机分配。使用callback方法作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------------- | ---- | ------------------------------------------------------ | -| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| address | [NetAddress](#netaddress) | 是 | 目标地址信息,参考[NetAddress](#netaddress)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | @@ -709,17 +678,19 @@ tcp.bind({address: '192.168.xx.xxx', port: xxxx, family: 1}, err => { ``` -### bind +### bind bind\(address NetAddress\): Promise 绑定IP地址和端口,端口可以指定或由系统随机分配。使用Promise方法作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------- | ---- | ------------------------------------------------------ | -| address | [NetAddress](#section159132241295) | 是 | 目标地址信息,参考[NetAddress](#section159132241295)。 | +| address | [NetAddress](#netaddress) | 是 | 目标地址信息,参考[NetAddress](#netaddress)。 | **返回值:** @@ -740,17 +711,19 @@ promise.then(() => { ``` -### connect +### connect connect\(options: TCPConnectOptions, callback: AsyncCallback\): void 连接到指定的IP地址和端口。使用callback方法作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | +| options | [TCPConnectOptions](#tcpconnectoptions) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#tcpconnectoptions)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -767,17 +740,19 @@ tcp.connect({ address: {address: '192.168.xx.xxx', port: xxxx, family: 1} , time ``` -### connect +### connect connect\(options: TCPConnectOptions\): Promise 连接到指定的IP地址和端口。使用promise方法作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [TCPConnectOptions](#section13821005712) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#section13821005712)。 | +| options | [TCPConnectOptions](#tcpconnectoptions) | 是 | TCPSocket连接的参数,参考[TCPConnectOptions](#tcpconnectoptions)。 | **返回值:** @@ -798,20 +773,22 @@ promise.then(() => { ``` -### send +### send send\(options: TCPSendOptions, callback: AsyncCallback\): void 通过TCPSocket连接发送数据。使用callback方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | +| options | [TCPSendOptions](#tcpsendoptions) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#tcpsendoptions)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -836,20 +813,22 @@ promise.then(() => { ``` -### send +### send send\(options: TCPSendOptions\): Promise 通过TCPSocket连接发送数据。使用Promise方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | --------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [TCPSendOptions](#section1689232415715) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#section1689232415715)。 | +| options | [TCPSendOptions](#tcpsendoptions) | 是 | TCPSocket发送请求的参数,参考[TCPSendOptions](#tcpsendoptions)。 | **返回值:** @@ -878,12 +857,14 @@ promise1.then(() => { ``` -### close +### close close\(callback: AsyncCallback\): void 关闭TCPSocket连接。使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -905,12 +886,14 @@ tcp.close(err => { ``` -### close +### close close\(\): Promise 关闭TCPSocket连接。使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **返回值:** | 类型 | 说明 | @@ -930,20 +913,22 @@ promise.then(() => { ``` -### getRemoteAddress +### getRemoteAddress getRemoteAddress\(callback: AsyncCallback\): void 获取对端Socket地址。使用callback方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------- | ---- | ---------- | -| callback | AsyncCallback<[NetAddress](#section159132241295)> | 是 | 回调函数。 | +| callback | AsyncCallback<[NetAddress](#netaddress)> | 是 | 回调函数。 | **示例:** @@ -965,20 +950,22 @@ promise.then(() => { ``` -### getRemoteAddress +### getRemoteAddress getRemoteAddress\(\): Promise 获取对端Socket地址。使用Promise方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **返回值:** | 类型 | 说明 | | :------------------------------------------ | :------------------------------------------ | -| Promise<[NetAddress](#section159132241295)> | 以Promise形式返回获取对端socket地址的结果。 | +| Promise<[NetAddress](#netaddress)> | 以Promise形式返回获取对端socket地址的结果。 | **示例:** @@ -999,20 +986,22 @@ promise1.then(() => { ``` -### getState +### getState getState\(callback: AsyncCallback\): void 获取TCPSocket状态。使用callback方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[bind](#bind)或[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------ | ---- | ---------- | -| callback | AsyncCallback<[SocketStateBase](#section164609984111)> | 是 | 回调函数。 | +| callback | AsyncCallback<[SocketStateBase](#socketstatebase)> | 是 | 回调函数。 | **示例:** @@ -1035,20 +1024,22 @@ promise.then(() => { ``` -### getState +### getState getState\(\): Promise 获取TCPSocket状态。使用Promise方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[bind](#bind)或[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **返回值:** | 类型 | 说明 | | :----------------------------------------------- | :----------------------------------------- | -| Promise<[SocketStateBase](#section164609984111)> | 以Promise形式返回获取TCPSocket状态的结果。 | +| Promise<[SocketStateBase](#socketstatebase)> | 以Promise形式返回获取TCPSocket状态的结果。 | **示例:** @@ -1070,20 +1061,22 @@ promise.then(() => { ``` -### setExtraOptions +### setExtraOptions setExtraOptions\(options: TCPExtraOptions, callback: AsyncCallback\): void 设置TCPSocket连接的其他属性。使用callback方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[bind](#bind)或[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | +| options | [TCPExtraOptions](#tcpextraoptions) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#tcpextraoptions)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -1115,20 +1108,22 @@ promise.then(() => { ``` -### setExtraOptions +### setExtraOptions setExtraOptions\(options: TCPExtraOptions\): Promise 设置TCPSocket连接的其他属性,使用Promise方式作为异步方法。 >![](public_sys-resources/icon-note.gif) **说明:** ->[bind](#section8465924145710)或[connect](#section82761299586)方法调用成功后,才可调用此方法。 +>[bind](#bind)或[connect](#connect)方法调用成功后,才可调用此方法。 + +**需要权限**:ohos.permission.INTERNET **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | -| options | [TCPExtraOptions](#section13892555115718) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#section13892555115718)。 | +| options | [TCPExtraOptions](#tcpextraoptions) | 是 | TCPSocket连接的其他属性,参考[TCPExtraOptions](#tcpextraoptions)。 | **返回值:** @@ -1165,7 +1160,7 @@ promise.then(() => { ``` -### on\('message'\) +### on\('message'\) on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void @@ -1176,7 +1171,7 @@ on\(type: 'message', callback: Callback<\{message: ArrayBuffer, remoteInfo: Sock | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | -| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 是 | 回调函数。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#socketremoteinfo)}> | 是 | 回调函数。 | **示例:** @@ -1188,7 +1183,7 @@ tcp.on('message', value => { ``` -### off\('message'\) +### off\('message'\) off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: SocketRemoteInfo\}\>\): void @@ -1202,7 +1197,7 @@ off\(type: 'message', callback?: Callback<\{message: ArrayBuffer, remoteInfo: So | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ----------------------------------------- | | type | string | 是 | 订阅的事件类型。'message':接收消息事件。 | -| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#section46021613174115)}> | 否 | 回调函数。 | +| callback | Callback<{message: ArrayBuffer, remoteInfo: [SocketRemoteInfo](#socketremoteinfo)}> | 否 | 回调函数。 | **示例:** @@ -1218,7 +1213,7 @@ tcp.off('message'); ``` -### on\('connect' | 'close'\) +### on\('connect' | 'close'\) on\(type: 'connect' | 'close', callback: Callback\): void @@ -1245,7 +1240,7 @@ tcp.on('close', data => { ``` -### off\('connect' | 'close'\) +### off\('connect' | 'close'\) off\(type: 'connect' | 'close', callback: Callback\): void @@ -1282,7 +1277,7 @@ tcp.off('close'); ``` -### on\('error'\) +### on\('error'\) on\(type: 'error', callback: ErrorCallback\): void @@ -1305,7 +1300,7 @@ tcp.on('error', err => { ``` -### off\('error'\) +### off\('error'\) off\(type: 'error', callback?: ErrorCallback\): void @@ -1335,16 +1330,16 @@ tcp.off('error'); ``` -## TCPConnectOptions +## TCPConnectOptions TCPSocket连接的参数。 | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------- | ---- | -------------------------- | -| address | [NetAddress](#section159132241295) | 是 | 绑定的地址以及端口。 | +| address | [NetAddress](#netaddress) | 是 | 绑定的地址以及端口。 | | timeout | number | 否 | 超时时间,单位毫秒(ms)。 | -## TCPSendOptions +## TCPSendOptions TCPSocket发送请求的参数。 @@ -1353,7 +1348,7 @@ TCPSocket发送请求的参数。 | data | string | 是 | 发送的数据。 | | encoding | string | 否 | 字符编码(UTF-8,UTF-16BE,UTF-16LE,UTF-16,US-AECII,ISO-8859-1),默认为UTF-8。 | -## TCPExtraOptions +## TCPExtraOptions TCPSocket连接的其他属性。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-webSocket.md b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md index 9a797ae52c0..11e4a64a281 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-webSocket.md +++ b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md @@ -1,52 +1,22 @@ -# WebSocket连接 - -- [导入模块](#s56d19203690d4782bfc74069abb6bd71) -- [权限列表](#section11257113618419) -- [完整示例](#section20761171275912) -- [webSocket.createWebSocket](#section375081875219) -- [WebSocket](#section16411174314593) - - [connect](#section1377525513113) - - [connect](#section18952991528) - - [connect](#section10573126422) - - [send](#section156451414213) - - [send](#section137609541324) - - [close](#section202411451433) - - [close](#section10491513437) - - [close](#section118451219536) - - [on\('open'\)](#section923017271834) - - [off\('open'\)](#section207051331730) - - [on\('message'\)](#section1066819418488) - - [off\('message'\)](#section1467019413484) - - [on\('close'\)](#section169378107484) - - [off\('close'\)](#section993911074812) - - [on\('error'\)](#section2997161484815) - - [off\('error'\)](#section13999114164815) - -- [WebSocketRequestOptions](#section11251233123910) -- [WebSocketCloseOptions](#section12262183471518) -- [close错误码说明](#section1635681416477) +# WebSocket连接 >![](public_sys-resources/icon-note.gif) **说明:** >本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 > >当前暂时不支持WebSocket,预计在MR版本支持。 -使用WebSocket建立服务器与客户端的双向连接,需要先通过[createWebSocket](#section375081875219)方法创建[WebSocket](#section16411174314593)对象,然后通过[connect](WebSocket连接.md)方法连接到服务器。当连接成功后,客户端会收到[open](#section923017271834)事件的回调,之后客户端就可以通过[send](#section156451414213)方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到[message](#section1066819418488)事件的回调。当客户端不要此连接时,可以通过调用[close](#section202411451433)方法主动断开连接,之后客户端会收到[close](#section169378107484)事件的回调。 +使用WebSocket建立服务器与客户端的双向连接,需要先通过[createWebSocket](#webSocketcreatewebsocket)方法创建[WebSocket](#websocket)对象,然后通过[connect](#connect)方法连接到服务器。当连接成功后,客户端会收到[open](#onopen)事件的回调,之后客户端就可以通过[send](#send)方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到[message](#onmessage)事件的回调。当客户端不要此连接时,可以通过调用[close](#close)方法主动断开连接,之后客户端会收到[close](#onclose)事件的回调。 -若在上述任一过程中发生错误,客户端会收到[error](#section2997161484815)事件的回调。 +若在上述任一过程中发生错误,客户端会收到[error](#onerror)事件的回调。 -## 导入模块 +## 导入模块 ``` import webSocket from '@ohos.net.webSocket'; ``` -## 权限列表 - -需要ohos.permission.INTERNET权限。 - -## 完整示例 +## 完整示例 ``` import webSocket from '@ohos.net.webSocket'; @@ -92,7 +62,7 @@ ws.connect(defaultIpAddress, (err, value) => { }); ``` -## webSocket.createWebSocket +## webSocket.createWebSocket createWebSocket\(\): WebSocket @@ -102,7 +72,7 @@ createWebSocket\(\): WebSocket | 类型 | 说明 | | :---------------------------------- | :----------------------------------------------------------- | -| [WebSocket](#section16411174314593) | 返回一个WebSocket对象,里面包括connect、send、close、on和off方法。 | +| [WebSocket](#websocket) | 返回一个WebSocket对象,里面包括connect、send、close、on和off方法。 | **示例:** @@ -111,16 +81,18 @@ let ws = webSocket.createWebSocket(); ``` -## WebSocket +## WebSocket -在调用WebSocket的方法前,需要先通过[webSocket.createWebSocket](#section375081875219)创建一个WebSocket。 +在调用WebSocket的方法前,需要先通过[webSocket.createWebSocket](#webSocketcreatewebsocket)创建一个WebSocket。 -### connect +### connect connect\(url: string, callback: AsyncCallback\): void 根据URL地址,建立一个WebSocket连接,使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -144,18 +116,20 @@ ws.connect(url, (err, value) => { ``` -### connect +### connect connect\(url: string, options: WebSocketRequestOptions, callback: AsyncCallback\): void 根据URL地址和header,建立一个WebSocket连接,使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------ | ---- | ------------------------------------------------------- | | url | string | 是 | 建立WebSocket连接的URL地址。 | -| options | WebSocketRequestOptions | 是 | 参考[WebSocketRequestOptions](#section11251233123910)。 | +| options | WebSocketRequestOptions | 是 | 参考[WebSocketRequestOptions](#websocketrequestoptions)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | @@ -179,18 +153,20 @@ ws.connect(url, { ``` -### connect +### connect connect\(url: string, options?: WebSocketRequestOptions\): Promise 根据URL地址和header,建立一个WebSocket连接,使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ----------------------- | ---- | ------------------------------------------------------- | | url | string | 是 | 建立WebSocket连接的URL地址。 | -| options | WebSocketRequestOptions | 否 | 参考[WebSocketRequestOptions](#section11251233123910)。 | +| options | WebSocketRequestOptions | 否 | 参考[WebSocketRequestOptions](#websocketrequestoptions)。 | **返回值:** @@ -212,12 +188,14 @@ promise.then((value) => { ``` -### send +### send send\(data: string | ArrayBuffer, callback: AsyncCallback\): void 通过WebSocket连接发送数据,使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -242,12 +220,14 @@ ws.connect(url, (err, value) => { ``` -### send +### send send\(data: string | ArrayBuffer\): Promise 通过WebSocket连接发送数据,使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -276,12 +256,14 @@ ws.connect(url, (err, value) => { ``` -### close +### close close\(callback: AsyncCallback\): void 关闭WebSocket连接,使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -303,17 +285,19 @@ ws.close((err, value) => { ``` -### close +### close close\(options: WebSocketCloseOptions, callback: AsyncCallback\): void 根据可选参数code和reason,关闭WebSocket连接,使用callback方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------ | ---- | ----------------------------------------------------- | -| options | WebSocketCloseOptions | 是 | 参考[WebSocketCloseOptions](#section12262183471518)。 | +| options | WebSocketCloseOptions | 是 | 参考[WebSocketCloseOptions](#websocketcloseoptions)。 | | callback | AsyncCallback\ | 是 | 回调函数。 | **示例:** @@ -334,17 +318,19 @@ ws.close({ ``` -### close +### close close\(options?: WebSocketCloseOptions\): Promise 根据可选参数code和reason,关闭WebSocket连接,使用Promise方式作为异步方法。 +**需要权限**:ohos.permission.INTERNET + **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | --------------------- | ---- | ----------------------------------------------------- | -| options | WebSocketCloseOptions | 否 | 参考[WebSocketCloseOptions](#section12262183471518)。 | +| options | WebSocketCloseOptions | 否 | 参考[WebSocketCloseOptions](#websocketcloseoptions)。 | **返回值:** @@ -369,7 +355,7 @@ promise.then((value) => { ``` -### on\('open'\) +### on\('open'\) on\(type: 'open', callback: AsyncCallback\): void @@ -393,7 +379,7 @@ ws.on('open', (err, value) => { ``` -### off\('open'\) +### off\('open'\) off\(type: 'open', callback?: AsyncCallback\): void @@ -422,7 +408,7 @@ ws.off('open', callback1); ``` -### on\('message'\) +### on\('message'\) on\(type: 'message', callback: AsyncCallback\): void @@ -449,7 +435,7 @@ ws.on('message', (err, value) => { ``` -### off\('message'\) +### off\('message'\) off\(type: 'message', callback?: AsyncCallback\): void @@ -474,7 +460,7 @@ ws.off('message'); ``` -### on\('close'\) +### on\('close'\) on\(type: 'close', callback: AsyncCallback<\{ code: number, reason: string \}\>\): void @@ -497,7 +483,7 @@ ws.on('close', (err, value) => { ``` -### off\('close'\) +### off\('close'\) off\(type: 'close', callback?: AsyncCallback<\{ code: number, reason: string \}\>\): void @@ -522,7 +508,7 @@ ws.off('close'); ``` -### on\('error'\) +### on\('error'\) on\(type: 'error', callback: ErrorCallback\): void @@ -546,7 +532,7 @@ ws.on('error', (err) => { ``` -### off\('error'\) +### off\('error'\) off\(type: 'error', callback?: ErrorCallback\): void @@ -570,7 +556,7 @@ ws.off('error'); ``` -## WebSocketRequestOptions +## WebSocketRequestOptions 建立WebSocket连接时,可选参数的类型和说明。 @@ -579,7 +565,7 @@ ws.off('error'); | header | Object | 否 | 建立WebSocket连接可选参数,代表建立连接时携带的HTTP头信息。参数内容自定义,也可以不指定。 | -## WebSocketCloseOptions +## WebSocketCloseOptions 关闭WebSocket连接时,可选参数的类型和说明。 @@ -588,7 +574,7 @@ ws.off('error'); | code | number | 否 | 错误码,关闭WebSocket连接时的可选参数,可根据实际情况来填。默认值为1000。 | | reason | string | 否 | 原因值,关闭WebSocket连接时的可选参数,可根据实际情况来填。默认值为空字符串("")。 | -## close错误码说明 +## close错误码说明 发送给服务端的错误码可以自行定义,下面的列表仅供参考。 -- Gitee From d5cf807d79730684851aaf01328c4c3733fd89d3 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Mon, 7 Mar 2022 19:03:41 +0800 Subject: [PATCH 181/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 309 ++++++++---------- 1 file changed, 137 insertions(+), 172 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index cfe4281493d..fe9cfe9d63d 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -10,28 +10,25 @@ import mediaLibrary from '@ohos.multimedia.medialibrary'; ``` - ## getMediaLibrary function getMediaLibrary(context: Context): MediaLibrary 获取媒体库的实例,用于访问和修改用户的个人数据信息。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------- | ---- | -------------------- | -| context | Context | 是 | API 8接口此参数是必填参数,传入Ability实例的context,获取媒体库 | +| context | Context | 是 | API7以下接口可不传此参数,API 8以上接口此参数是必填参数,传入Ability实例的context,获取媒体库 | **返回值:** | 类型 | 说明 | | ------------ | :----- | -| MediaLibrary | 媒体库实例 | +| [MediaLibrary](#MediaLibrary) | 媒体库实例 | **示例:** @@ -56,10 +53,10 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------------------- | ---- | --------------------------------- | -| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体获取选项 | -| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步获取FetchFileResult之后的回调 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | --------------------------------- | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体获取选项 | +| callback | AsyncCallback<[FetchFileResult](#fetchfileresult8)> | 是 | 异步获取FetchFileResult之后的回调 | **示例:** @@ -93,15 +90,15 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult> **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------- | --------------------------------------- | ---- | ------------ | -| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------- | ---- | ------------ | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体检索选项 | **返回值** -| 类型 | 说明 | -| -------------------------------------------- | -------------- | -| [FetchFileResult](#FetchFileResult.getCount) | 媒体数据结果集 | +| 类型 | 说明 | +| ----------------------------- | -------------- | +| [FetchFileResult](#fetchfileresult8) | 媒体数据结果集 | **示例:** @@ -125,8 +122,6 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| 打开媒体媒体库变更通知,使用callback方式返回异步结果。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** @@ -149,17 +144,13 @@ off(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange' 关闭媒体媒体库变更通知,使用callback方式返回异步结果。 -变更通知类型包括:注册设备变更,相册变更,图片文件变更,音频文件变更,视频文件变更,文件变更,远端文件变更。 - -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
'audioChange':  音频文件变更
'videoChange':  视频文件变更
'fileChange':  文件变更
'remoteFileChange': 注册设备上文件变更 | +| type | string | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
'audioChange':  音频文件变更
'videoChange':  视频文件变更
'fileChange':  文件变更
'remoteFileChange': 注册设备上文件变更 | | callback | callback<void> | 否 | 回调返回空 | **示例:** @@ -182,12 +173,12 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------------ | -------------------------------------- | ---- | ------------------------------------------------------------ | -| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | -| displayName | string | 是 | 展示文件名 | -| relativePath | string | 是 | 相对公共目录路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取媒体数据FileAsset之后的回调 | +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | --------------------------------------- | ---- | ------------------------------------------------------------ | +| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | +| displayName | string | 是 | 展示文件名 | +| relativePath | string | 是 | 相对公共目录路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | +| callback | AsyncCallback<[FileAsset](#fileasset8)> | 是 | 异步获取媒体数据FileAsset之后的回调 | **示例:** @@ -224,9 +215,9 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr **返回值** -| 类型 | 说明 | -| ----------------------- | ----------------- | -| [FileAsset](#FileAsset) | 媒体数据FileAsset | +| 类型 | 说明 | +| ------------------------ | ----------------- | +| [FileAsset](#fileasset8) | 媒体数据FileAsset | **示例:** @@ -245,9 +236,7 @@ mediaLibrary.createAsset(mediaType, "image01.jpg", path).then (function (asset) getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): void -获取公共目录路径 - -**需要权限**:无 +获取公共目录路径,使用callback方式返回结果。 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -255,10 +244,9 @@ getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): | 参数名 | 类型 | 必填 | 说明 | | ------ | ------------------------------- | ---- | ------------ | -| type | [DirectoryType](#DirectoryType) | 是 | 公共目录类型 | +| type | [DirectoryType](#directorytype) | 是 | 公共目录类型 | | callback |AsyncCallback<string> | 是 | callback 返回公共目录路径 | - **示例:** ``` @@ -276,9 +264,7 @@ media.getPublicDirectory(DIR_CAMERA, (err, dicResult) => { getPublicDirectory(type: DirectoryType): Promise<string> -获取公共目录路径 - -**需要权限**:无 +获取公共目录路径,使用Promise方式返回结果。 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -286,7 +272,7 @@ getPublicDirectory(type: DirectoryType): Promise<string> | 参数名 | 类型 | 必填 | 说明 | | ------ | ------------------------------- | ---- | ------------ | -| type | [DirectoryType](#DirectoryType) | 是 | 公共目录类型 | +| type | [DirectoryType](#directorytype) | 是 | 公共目录类型 | **返回值:** @@ -308,7 +294,7 @@ async function example() { } ``` -### getAlbums6+ +### getAlbums8+ getAlbums(options: MediaFetchOptions, callback: AsyncCallback): void @@ -320,10 +306,10 @@ getAlbums(options: MediaFetchOptions, callback: AsyncCallback> | 是 | 异步获取Album列表之后的回调 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | --------------------------- | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体文件获取条件 | +| callback | AsyncCallback<Array<[Album](#album8)>> | 是 | 异步获取Album列表之后的回调 | **示例:** @@ -343,7 +329,7 @@ mediaLibrary.getAlbums(AlbumNoArgsfetchOp, (err, albumList) => { }) ``` -### getAlbums6+ +### getAlbums8+ getAlbums(options: MediaFetchOptions): Promise @@ -355,15 +341,15 @@ getAlbums(options: MediaFetchOptions): Promise **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------- | --------------------------------------- | ---- | ---------------- | -| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体文件获取条件 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------- | ---- | ---------------- | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体文件获取条件 | **返回值:** -| 类型 | 说明 | -| ------------------------------- | ------------- | -| Promise> | 返回Album列表 | +| 类型 | 说明 | +| -------------------------------- | ------------- | +| Promise> | 返回Album列表 | **示例:** @@ -383,9 +369,8 @@ mediaLibrary.getAlbums(AlbumNoArgsfetchOp).then(function(albumList){ release(callback: AsyncCallback<void>): void -释放mediaLibrary实例,当用户确认后续不再使用mediaLibrary实例中的方法后调用release方法释放mediaLibrary实例。 - -**需要权限**:无 +释放MediaLibrary实例。 +当后续不需要使用MediaLibrary实例中的方法时调用。 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -408,9 +393,8 @@ media.release((err, data) => { release(): Promise<void> -释放mediaLibrary实例,当用户确认后续不再使用mediaLibrary实例中的方法后调用release方法释放mediaLibrary实例。 - -**需要权限**:无 +释放MediaLibrary实例。 +当后续不需要使用MediaLibrary实例中的方法时调用。 **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -433,34 +417,34 @@ media.release() ### **属性** -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------------ | --------- | ---- | ---- | ------------------------------------------------------ | -| id | number | 是 | 否 | 文件资源编号 | -| uri | string | 是 | 否 | 文件资源uri(如:dataability:///media/image/2) | -| mimeType | string | 是 | 否 | 文件扩展属性 | -| mediaType | MediaType | 是 | 否 | 媒体类型 | -| displayName | string | 是 | 是 | 显示文件名 | -| title | string | 是 | 是 | 文件标题 | -| relativePath | string | 是 | 是 | 相对公共目录路径 | -| parent | number | 是 | 否 | 父目录id | -| size | number | 是 | 否 | 文件大小(单位:字节) | -| dateAdded | number | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | -| dateModified | number | 是 | 否 | 修改日期(修改文件时间到1970年1月1日的秒数值) | -| dateTaken | number | 是 | 否 | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | -| artist | string | 是 | 否 | 作者 | -| audioAlbum | string | 是 | 否 | 专辑 | -| width | number | 是 | 否 | 图片宽度(单位:像素) | -| height | number | 是 | 否 | 图片高度(单位:像素) | -| orientation | number | 是 | 是 | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | -| duration | number | 是 | 否 | 持续时间(单位:秒) | -| albumId | number | 是 | 否 | 文件所归属的相册编号 | -| albumUri | string | 是 | 否 | 文件所归属相册uri | -| albumName | string | 是 | 否 | 文件所归属相册名称 | +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------ | ----------------------- | ---- | ---- | ------------------------------------------------------ | +| id | number | 是 | 否 | 文件资源编号 | +| uri | string | 是 | 否 | 文件资源uri(如:dataability:///media/image/2) | +| mimeType | string | 是 | 否 | 文件扩展属性 | +| mediaType | [MediaType](#mediaType) | 是 | 否 | 媒体类型 | +| displayName | string | 是 | 是 | 显示文件名 | +| title | string | 是 | 是 | 文件标题 | +| relativePath | string | 是 | 是 | 相对公共目录路径 | +| parent | number | 是 | 否 | 父目录id | +| size | number | 是 | 否 | 文件大小(单位:字节) | +| dateAdded | number | 是 | 否 | 添加日期(添加文件时间到1970年1月1日的秒数值) | +| dateModified | number | 是 | 否 | 修改日期(修改文件时间到1970年1月1日的秒数值) | +| dateTaken | number | 是 | 否 | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | +| artist | string | 是 | 否 | 作者 | +| audioAlbum | string | 是 | 否 | 专辑 | +| width | number | 是 | 否 | 图片宽度(单位:像素) | +| height | number | 是 | 否 | 图片高度(单位:像素) | +| orientation | number | 是 | 是 | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | +| duration | number | 是 | 否 | 持续时间(单位:秒) | +| albumId | number | 是 | 否 | 文件所归属的相册编号 | +| albumUri | string | 是 | 否 | 文件所归属相册uri | +| albumName | string | 是 | 否 | 文件所归属相册名称 | ### isDirectory8+ -isDirectory(callback: AsyncCallback<boolean>): void; +isDirectory(callback: AsyncCallback<boolean>): void 判断fileAsset是否为目录,使用callback方式返回异步结果。 @@ -614,7 +598,7 @@ open(mode: string, callback: AsyncCallback<number>): void | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| mode | string | 是 | 打开文件方式,如:'r', 'w', 'rw' | +| mode | string | 是 | 打开文件方式,如:'r'(只读), 'w'(只写), 'rw'(读写) | | callback | AsyncCallback<number> | 是 | 回调返回文件句柄 | **示例:** @@ -646,9 +630,9 @@ open(mode: string): Promise<number> **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | -------------------------------- | -| mode | string | 是 | 打开文件方式,如:'r', 'w', 'rw' | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | -------------------------------------------------------- | +| mode | string | 是 | 打开文件方式,如:'r'(只读), 'w'(只写), 'rw'(读写) | **返回值:** @@ -810,7 +794,7 @@ getThumbnail(size: Size, callback: AsyncCallback<image.PixelMap>): void | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------- | ---- | -------------------- | -| size | [Size](#Size) | 是 | 缩略图尺寸 | +| size | [Size](#size8) | 是 | 缩略图尺寸 | | callback | AsyncCallback<image.PixelMap> | 是 | 回调返回缩略图的PixelMap | **示例:** @@ -844,9 +828,9 @@ getThumbnail(size?: Size): Promise<image.PixelMap> **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------------- | ---- | ---------- | -| size | [Size](#Size) | 否 | 缩略图尺寸 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | -------------- | ---- | ---------- | +| size | [Size](#size8) | 否 | 缩略图尺寸 | **返回值:** @@ -887,7 +871,7 @@ favorite(isFavorite: boolean, callback: AsyncCallback<void>): void | 参数名 | 类型 | 必填 | 说明 | | ---------- | ------------------- | ---- | -------------- | -| isFavorite | boolean | 是 | 是否设置为收藏文件, true:设置为收藏文件,false:取消收藏 | +| isFavorite | boolean | 是 | 是否设置为收藏文件, true:设置为收藏文件,false:取消收藏 | | callback | AsyncCallback<void> | 是 | 回调返回空 | **示例:** @@ -921,9 +905,9 @@ favorite(isFavorite: boolean): Promise<void> **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ---------- | ------- | ---- | --------------------------------------------------------- | -| isFavorite | boolean | 是 | 是否设置为收藏文件, true:设置为收藏文件,false:取消收藏 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------- | ---- | ---------------------------------------------------------- | +| isFavorite | boolean | 是 | 是否设置为收藏文件, true:设置为收藏文件,false:取消收藏 | **返回值:** @@ -1160,7 +1144,7 @@ async function example() { isTrash():Promise<boolean> -当文件被定位,设置文件为垃圾文件,使用promise方式返回异步结果。 +当文件被定位,判断文件是否为垃圾文件,使用promise方式返回异步结果。 **需要权限**:ohos.permission.READ_MEDIA @@ -1193,7 +1177,7 @@ async function example() { } ``` -## **FetchFileResult**8+ +## FetchFileResult8+ 文件检索结果集。 @@ -1203,8 +1187,6 @@ getCount(): number 获取文件检索结果中的文件总数。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: @@ -1234,15 +1216,13 @@ isAfterLast(): boolean 检查结果集是否指向最后一行。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: -| 类型 | 说明 | -| ------- | ------------------------------------------------------------ | -| boolean | 当读到最后一条记录后,再继续读就到结果集尾了,没有记录了,执行isAfterLast()方法就返回true,否则返回false | +| 类型 | 说明 | +| ------- | ----------------------------------------------------------- | +| boolean | 当读到最后一条记录后,后续没有记录返回true,否则返回false。 | **示例**: @@ -1279,8 +1259,6 @@ close(): void 释放 FetchFileResult 实例并使其失效。无法调用其他方法。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **示例**: @@ -1305,15 +1283,13 @@ getFirstObject(callback: AsyncCallback<FileAsset>): void 获取文件检索结果中的第一个文件资产。此方法使用回调返回FileAsset。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------------- | ---- | ------------------------------------------- | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步获取结果集中第一个FileAsset完成后的回调 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------- | ---- | ------------------------------------------- | +| callback | AsyncCallback<[FileAsset](#fileasset8)> | 是 | 异步获取结果集中第一个FileAsset完成后的回调 | **示例**: @@ -1343,16 +1319,13 @@ getFirstObject(): Promise<FileAsset> 获取文件检索结果中的第一个文件资产。此方法使用返回FileAsset。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: | 类型 | 说明 | | ------------------ | -------------------------------------- | -| Promise<[FileAsset](#FileAsset)> | Promise方式返回FileAsset | - +| Promise<[FileAsset](#fileasset8)> | Promise方式返回FileAsset | **示例**: @@ -1386,9 +1359,9 @@ async function example() { **参数**: -| 参数名 | 类型 | 必填 | 说明 | -| --------- | -------------------------------------------- | ---- | ----------------------------------------- | -| callbacke | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回结果集中下一个FileAsset之后的回调 | +| 参数名 | 类型 | 必填 | 说明 | +| --------- | --------------------------------------------- | ---- | ----------------------------------------- | +| callbacke | AsyncCallback<[FileAsset](#fileasset8)> | 是 | 异步返回结果集中下一个FileAsset之后的回调 | **示例**: @@ -1426,7 +1399,7 @@ async function example() { | 类型 | 说明 | | -------------------------------- | ------------------- | -| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象 | +| Promise<[FileAsset](#fileasset8)> | 返回FileAsset对象 | **示例**: @@ -1452,15 +1425,13 @@ getLastObject(callback: AsyncCallback<FileAsset>): void 获取文件检索结果中的最后一个文件资产。此方法使用callback回调来返回FileAsset。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------------- | ---- | --------------------------- | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------- | ---- | --------------------------- | +| callback | AsyncCallback<[FileAsset](#fileasset8)> | 是 | 异步返回FileAsset之后的回调 | **示例**: @@ -1490,15 +1461,13 @@ getLastObject(): Promise<FileAsset> 获取文件检索结果中的最后一个文件资产。此方法使用Promise方式来返回FileAsset。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: | 类型 | 说明 | | -------------------------------- | ------------------- | -| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象 | +| Promise<[FileAsset](#fileasset8)> | 返回FileAsset对象 | **示例**: @@ -1522,16 +1491,14 @@ getPositionObject(index: number, callback: AsyncCallback<FileAsset>): void 获取文件检索结果中具有指定索引的文件资产。此方法使用回调来返回FileAsset。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------------- | ---- | --------------------------- | -| index | number | 是 | 要获取的文件的索引,从0开始 | -| callback | AsyncCallback<[FileAsset](#FileAsset)> | 是 | 异步返回FileAsset之后的回调 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------- | ---- | --------------------------- | +| index | number | 是 | 要获取的文件的索引,从0开始 | +| callback | AsyncCallback<[FileAsset](#fileasset8)> | 是 | 异步返回FileAsset之后的回调 | **示例**: @@ -1575,7 +1542,7 @@ getPositionObject(index: number): Promise<FileAsset> | 类型 | 说明 | | -------------------------------- | ------------------- | -| Promise<[FileAsset](#FileAsset)> | 返回FileAsset对象 | +| Promise<[FileAsset](#fileasset8)> | 返回FileAsset对象 | **示例**: @@ -1611,9 +1578,9 @@ getAllObject(callback: AsyncCallback<Array<FileAsset>>): void **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | --------------------------------------------- | ---- | ------------------------------- | -| callback | AsyncCallback> | 是 | 异步返回FileAsset列表之后的回调 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------------- | ---- | ------------------------------- | +| callback | AsyncCallback> | 是 | 异步返回FileAsset列表之后的回调 | **示例**: @@ -1643,15 +1610,13 @@ getAllObject(): Promise<Array<FileAsset>> 获取文件检索结果中的所有文件资产。此方法使用Promise来返回FileAsset结果集。 -**需要权限**:无 - **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core **返回值**: -| 类型 | 说明 | -| --------------------------------------- | --------------------- | -| Promise> | 返回FileAsset对象列表 | +| 类型 | 说明 | +| ---------------------------------------- | --------------------- | +| Promise> | 返回FileAsset对象列表 | **示例**: @@ -1769,10 +1734,10 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe **参数**: -| 参数 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------------------- | ---- | --------------------------------- | -| options | [MediaFetchOptions](#MediaFetchOptions) | 是 | 媒体检索选项 | -| callback | AsyncCallback<[FetchFileResult](#FetchFileResult.getCount)> | 是 | 异步返回FetchFileResult之后的回调 | +| 参数 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | --------------------------------- | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体检索选项 | +| callback | AsyncCallback<[FetchFileResult](#fetchfileresult8)> | 是 | 异步返回FetchFileResult之后的回调 | **示例**: @@ -1803,15 +1768,15 @@ async function example() { **参数**: -| 参数 | 类型 | 必填 | 说明 | -| ------- | --------------------------------------- | ---- | ------------ | -| options | [MediaFetchOptions](#MediaFetchOptions) | 否 | 媒体检索选项 | +| 参数 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------- | ---- | ------------ | +| options | [MediaFetchOptions](#mediafetchoptions8) | 否 | 媒体检索选项 | **返回值**: -| 类型 | 说明 | -| ----------------------------------------------------- | ----------------------- | -| Promise<[FetchFileResult](#FetchFileResult.getCount)> | 返回FetchFileResult对象 | +| 类型 | 说明 | +| --------------------------------------------- | ----------------------- | +| Promise<[FetchFileResult](#fetchfileresult8)> | 返回FetchFileResult对象 | **示例**: @@ -1861,27 +1826,27 @@ FileKey 枚举,文件关键信息。 -| 名称 | 默认值 | 描述 | -| ------------- | ------------------- | ------------------------------------------------------ | -| ID | file_id | 文件编号 | -| RELATIVE_PATH | relative_path | 相对公共目录路径 | -| DISPLAY_NAME | display_name | 显示名字 | -| PARENT | parent | 父目录id | -| MIME_TYPE | mime_type | 文件扩展属性 | -| MEDIA_TYPE | media_type | 媒体类型 | -| SIZE | size | 文件大小 | -| DATE_ADDED | date_added | 添加日期(添加文件时间到1970年1月1日的秒数值) | -| DATE_MODIFIED | date_modified | 修改日期(修改文件时间到1970年1月1日的秒数值) | -| DATE_TAKEN | date_taken | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | -| TITLE | title | 文件标题 | -| ARTIST | artist | 作者 | -| AUDIOALBUM | audio_album | 专辑 | -| DURATION | duration | 持续时间(单位:秒) | -| WIDTH | width | 图片宽度(单位:像素) | -| HEIGHT | height | 图片高度(单位:像素) | -| ORIENTATION | orientation | 图片显示方向(顺时针旋转角度,如0,90,180 单位:度) | -| ALBUM_ID | bucket_id | 文件所归属的相册编号 | -| ALBUM_NAME | bucket_display_name | 文件所归属相册名称 | +| 名称 | 默认值 | 描述 | +| ------------- | ------------------- | ---------------------------------------------------------- | +| ID | file_id | 文件编号 | +| RELATIVE_PATH | relative_path | 相对公共目录路径 | +| DISPLAY_NAME | display_name | 显示名字 | +| PARENT | parent | 父目录id | +| MIME_TYPE | mime_type | 文件扩展属性 | +| MEDIA_TYPE | media_type | 媒体类型 | +| SIZE | size | 文件大小(单位:字节) | +| DATE_ADDED | date_added | 添加日期(添加文件时间到1970年1月1日的秒数值) | +| DATE_MODIFIED | date_modified | 修改日期(修改文件时间到1970年1月1日的秒数值) | +| DATE_TAKEN | date_taken | 拍摄日期(文件拍照时间到1970年1月1日的秒数值) | +| TITLE | title | 文件标题 | +| ARTIST | artist | 作者 | +| AUDIOALBUM | audio_album | 专辑 | +| DURATION | duration | 持续时间(单位:秒) | +| WIDTH | width | 图片宽度(单位:像素) | +| HEIGHT | height | 图片高度(单位:像素) | +| ORIENTATION | orientation | 图片显示方向,即顺时针旋转角度,如0,90,180。(单位:度) | +| ALBUM_ID | bucket_id | 文件所归属的相册编号 | +| ALBUM_NAME | bucket_display_name | 文件所归属相册名称 | DirectoryType ------------- -- Gitee From 123e2f077f13830f75be8c53e8d813ebdfbccd72 Mon Sep 17 00:00:00 2001 From: clevercong Date: Mon, 7 Mar 2022 19:10:56 +0800 Subject: [PATCH 182/282] format file. Signed-off-by: clevercong --- zh-cn/application-dev/reference/apis/js-apis-webSocket.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-webSocket.md b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md index 11e4a64a281..05d58dddb67 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-webSocket.md +++ b/zh-cn/application-dev/reference/apis/js-apis-webSocket.md @@ -5,7 +5,7 @@ > >当前暂时不支持WebSocket,预计在MR版本支持。 -使用WebSocket建立服务器与客户端的双向连接,需要先通过[createWebSocket](#webSocketcreatewebsocket)方法创建[WebSocket](#websocket)对象,然后通过[connect](#connect)方法连接到服务器。当连接成功后,客户端会收到[open](#onopen)事件的回调,之后客户端就可以通过[send](#send)方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到[message](#onmessage)事件的回调。当客户端不要此连接时,可以通过调用[close](#close)方法主动断开连接,之后客户端会收到[close](#onclose)事件的回调。 +使用WebSocket建立服务器与客户端的双向连接,需要先通过[createWebSocket](#websocketcreatewebsocket)方法创建[WebSocket](#websocket)对象,然后通过[connect](#connect)方法连接到服务器。当连接成功后,客户端会收到[open](#onopen)事件的回调,之后客户端就可以通过[send](#send)方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到[message](#onmessage)事件的回调。当客户端不要此连接时,可以通过调用[close](#close)方法主动断开连接,之后客户端会收到[close](#onclose)事件的回调。 若在上述任一过程中发生错误,客户端会收到[error](#onerror)事件的回调。 -- Gitee From 5ddf19822795b9935f831c7ae35d19136e6b39f7 Mon Sep 17 00:00:00 2001 From: sunyaozu Date: Fri, 4 Mar 2022 10:39:39 +0800 Subject: [PATCH 183/282] complement intl and i18n api document Signed-off-by: sunyaozu --- .../reference/apis/js-apis-i18n.md | 125 ++++++++++++++++++ .../reference/apis/js-apis-intl.md | 42 ++++++ 2 files changed, 167 insertions(+) diff --git a/zh-cn/application-dev/reference/apis/js-apis-i18n.md b/zh-cn/application-dev/reference/apis/js-apis-i18n.md index 5dfcf16cf0b..e7d49645e54 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-i18n.md +++ b/zh-cn/application-dev/reference/apis/js-apis-i18n.md @@ -111,6 +111,63 @@ getSystemLanguage(): string ``` +## i18n.setSystemLanguage + +setSystemLanguage(): boolean + +设置系统语言。 + +**系统能力**:SystemCapability.Global.I18n + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 返回true,表示系统语言设置成功;返回false,表示系统语言设置失败。 | + +- 示例: + ``` + i18n.setSystemLanguage(); + ``` + + +## i18n.getSystemLanguages + +getSystemLanguages(): Array + +获取系统支持的语言列表。 + +**系统能力**:SystemCapability.Global.I18n + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Array | 系统支持的语言ID列表。 | + +- 示例: + ``` + i18n.getSystemLanguages(); + ``` + + +## i18n.getSystemCountries + +getSystemCountries(): Array + +获取系统支持的区域列表。 + +**系统能力**:SystemCapability.Global.I18n + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Array | 系统支持的区域ID列表。 | + +- 示例: + ``` + i18n.getSystemCountries(); + ``` + + ## i18n.getSystemRegion getSystemRegion(): string @@ -130,6 +187,25 @@ getSystemRegion(): string ``` +## i18n.setSystemRegion + +setSystemRegion(): boolean + +设置系统区域。 + +**系统能力**:SystemCapability.Global.I18n + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 返回true,表示系统区域设置成功;返回false,表示系统区域设置失败。 | + +- 示例: + ``` + i18n.setSystemRegion(); + ``` + + ## i18n.getSystemLocale getSystemLocale(): string @@ -149,6 +225,55 @@ getSystemLocale(): string ``` +## i18n.setSystemLocale + +setSystemLocale(locale: string): boolean + +设置系统Locale。 + +**系统能力**:SystemCapability.Global.I18n + +- 参数: + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | locale | string | 指定区域ID,例如zh-CN。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 返回true,表示系统Locale设置成功;返回false,表示系统Locale设置失败。 | + +- 示例: + ``` + i18n.setSystemLocale('zh-CN'); + ``` + + +## i18n.isSuggested + +isSuggested(language: string, region?: string): boolean + +判断当前语言和区域是否匹配。 + +**系统能力**:SystemCapability.Global.I18n + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | language | string | 是 | 合法的语言ID,例如zh。 | + | region | string | 否 | 合法的地区ID,例如CN | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 返回true,表示当前语言和地区匹配;返回false,表示当前语言和地区不匹配。 | + +- 示例: + ``` + i18n.isSuggested('zh', 'CN'); + ``` + + ## i18n.getCalendar8+ getCalendar(locale: string, type? : string): Calendar diff --git a/zh-cn/application-dev/reference/apis/js-apis-intl.md b/zh-cn/application-dev/reference/apis/js-apis-intl.md index eb6a9804cff..9d847a9f131 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-intl.md +++ b/zh-cn/application-dev/reference/apis/js-apis-intl.md @@ -32,6 +32,20 @@ import Intl from '@ohos.intl'; | numeric | boolean | 是 | 否 | 是否对数字字符具有特殊的排序规则处理。
**系统能力**:SystemCapability.Global.I18n | +### constructor + +constructor() + +创建区域对象 + +**系统能力**:SystemCapability.Global.I18n + +- 示例: + ``` + var locale = new Intl.Locale(); + ``` + + ### constructor constructor(locale: string, options?: options) @@ -115,6 +129,20 @@ minimize(): Locale ## DateTimeFormat +### constructor + +constructor() + +创建时间日期格式化对象。 + +**系统能力**:SystemCapability.Global.I18n + +- 示例: + ``` + var datefmt= new Intl.DateTimeFormat(); + ``` + + ### constructor constructor(locale: string, options?: DateTimeOptions) @@ -259,6 +287,20 @@ resolvedOptions(): DateTimeOptions ## NumberFormat +### constructor + +constructor() + +创建数字格式化对象。 + +**系统能力**:SystemCapability.Global.I18n + +- 示例: + ``` + var numfmt = new Intl.NumberFormat(); + ``` + + ### constructor constructor(locale: string, options?: NumberOptions) -- Gitee From 11875f948ede0a583204a3c5a7eec96c24522396 Mon Sep 17 00:00:00 2001 From: xuyong Date: Mon, 7 Mar 2022 19:44:46 +0800 Subject: [PATCH 184/282] =?UTF-8?q?=E5=90=8C=E6=AD=A5hisysevent=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=9A=84=E6=8E=A5=E5=8F=A3=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuyong --- .../subsystems/subsys-dfx-hisysevent-query.md | 12 +++++------- .../subsystems/subsys-dfx-hisysevent-query.md | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md index 32946d0d0ee..aae12719745 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md @@ -17,7 +17,7 @@ HiSysEvent provides an API for you to query system events. You can query concern | API| Description| | -------- | --------- | -| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<struct QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBackBase> queryCallBack) | Queries system events by specifying search criteria such as the time segment, event domain, and event name.

Input arguments:

  • **queryArg**: event query parameter.
  • **queryRules**: event filtering rules.
  • **queryRules**: callback object for query results.
Return value:
  • **true**: The query is successful.
  • **false**: The query has failed.
| +| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBackBase> queryCallBack) | Queries system events by specifying search criteria such as the time segment, event domain, and event name.

Input arguments:
  • **queryArg**: event query parameter.
  • **queryRules**: event filtering rules.
  • **queryRules**: callback object for query results.
Return value:
  • **true**: The query is successful.
  • **false**: The query has failed.
| **Table 2** Description of QueryArg @@ -30,11 +30,9 @@ HiSysEvent provides an API for you to query system events. You can query concern **Table 3** Description of QueryRule -| Attribute| Description| +| API| Description| | -------- | --------- | -| ruleType | Rule type, in the **uint32_t** format. The default value is **0**.| -| domain | Domain to which the event belongs, in the **string** format. By default, an empty string indicates that the domain is successfully matched.| -| eventList | Event name list, in the std::vector<std::string> format. By default, an empty string indicates that the event names on the list are successfully matched.| +| QueryRule(const std::string& domain, const std::vector<std::string>& eventList) | Constructor used to create a **QueryRule** object based on domain and event name list.

Input arguments:
  • domain:Domain to which the event belongs, in the **string** format. By default, an empty string indicates that the domain is successfully matched.
  • eventList:Event name list, in the std::vector<std::string> format. By default, an empty string indicates that the event names on the list are successfully matched.
| **Table 4** Description of HiSysEventQueryCallBackBase @@ -61,7 +59,7 @@ C++ - Invoke the query API in the corresponding service logic. - HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) + HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) ``` @@ -90,7 +88,7 @@ C++ // Invoke the query callback API to obtain system events. auto queryCallBack = std::make_shared(); struct QueryArg args(clientCmdArg.beginTime, clientCmdArg.endTime, clientCmdArg.maxEvents); - std::vector mRules; + std::vector mRules; HiSysEventManager::QueryHiSysEvent(args, mRules, queryCallBack); ``` diff --git a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md index 48867c40c86..60ffefa6e22 100644 --- a/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md +++ b/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-query.md @@ -17,7 +17,7 @@ HiSysEvent提供了查询接口,支持开发者设置条件查询HiSysEvent事 | 接口名称 | 描述 | | -------- | --------- | -| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<struct QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBack> queryCallBack) | 接口功能:
  支持设置查询时间段,事件领域,事件名称等,查询满足条件的HiSysEvent事件。

输入参数:
  • queryArg:查询参数。
  • queryRules:事件过滤规则。
  • queryCallBack:查询接口回调对象。
返回值:
  • true:查询成功。
  • false:查询失败。
| +| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBack> queryCallBack) | 接口功能:
  支持设置查询时间段,事件领域,事件名称等,查询满足条件的HiSysEvent事件。

输入参数:
  • queryArg:查询参数。
  • queryRules:事件过滤规则。
  • queryCallBack:查询接口回调对象。
返回值:
  • true:查询成功。
  • false:查询失败。
| **表 2** QueryArg查询参数对象 @@ -30,11 +30,9 @@ HiSysEvent提供了查询接口,支持开发者设置条件查询HiSysEvent事 **表 3** QueryRule查询规则对象 -| 属性名称 | 描述 | +| 接口名称 | 描述 | | -------- | --------- | -| ruleType | uint32_t类型,用来标识查询规则对象的规则类型,默认是0。 | -| domain | string类型,用来标识查询规则对象的事件所属领域,如果传入的是空字符串,则默认事件领域字段匹配成功。 | -| eventList | std::vector<std::string>类型,事件名称的列表,如果传入的是空字符串,则默认事件名称字段匹配成功。 | +| QueryRule(const std::string& domain, const std::vector<std::string>& eventList) | 接口功能:查询规则构造函数,创建查询规则对象。

输入参数:
  • domain:string类型,用来标识查询规则对象的事件所属领域,如果传入的是空字符串,则默认事件领域字段匹配成功。
  • eventList:std::vector<std::string>类型,事件名称的列表,如果传入的是空字符串,则默认事件名称字段匹配成功。
| **表 4** HiSysEventQueryCallBack查询回调对象 @@ -61,7 +59,7 @@ C++接口实例。 - 在相应的业务逻辑里面调用查询接口: - HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) + HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) ``` @@ -90,7 +88,7 @@ C++接口实例。 // 调用查询接口获取HiSysEvent事件 auto queryCallBack = std::make_shared(); struct QueryArg args(clientCmdArg.beginTime, clientCmdArg.endTime, clientCmdArg.maxEvents); - std::vector mRules; + std::vector mRules; HiSysEventManager::QueryHiSysEvent(args, mRules, queryCallBack); ``` -- Gitee From 261293569a76c0351b776ff45f21b01ba876e5ca Mon Sep 17 00:00:00 2001 From: shawn_he Date: Mon, 7 Mar 2022 20:07:25 +0800 Subject: [PATCH 185/282] update docs Signed-off-by: shawn_he --- .../reference/apis/js-apis-call.md | 60 +++- .../reference/apis/js-apis-observer.md | 265 ++++++++++++++++ .../reference/apis/js-apis-sms.md | 58 +++- .../reference/apis/js-apis-telephony-data.md | 289 ++++++++++++++++++ 4 files changed, 647 insertions(+), 25 deletions(-) create mode 100644 en/application-dev/reference/apis/js-apis-observer.md create mode 100644 en/application-dev/reference/apis/js-apis-telephony-data.md diff --git a/en/application-dev/reference/apis/js-apis-call.md b/en/application-dev/reference/apis/js-apis-call.md index cb892795387..dc54b14b351 100644 --- a/en/application-dev/reference/apis/js-apis-call.md +++ b/en/application-dev/reference/apis/js-apis-call.md @@ -17,7 +17,9 @@ dial\(phoneNumber: string, callback: AsyncCallback\): void Initiates a call. This function uses an asynchronous callback to return the execution result. -Before using this API, you must declare the **ohos.permission.PLACE\_CALL** permission (a system permission). +**Required permission**: ohos.permission.PLACE\_CALL (a system permission) + +**System capability**: SystemCapability.Telephony.CallManager **Parameters** @@ -41,7 +43,9 @@ dial\(phoneNumber: string, options: DialOptions, callback: AsyncCallback Initiates a call. You can set call options as needed. This function uses a promise to return the execution result. -Before using this API, you must declare the **ohos.permission.PLACE\_CALL** permission (a system permission). +**Required permission**: ohos.permission.PLACE\_CALL (a system permission) + +**System capability**: SystemCapability.Telephony.CallManager **Parameters** @@ -102,6 +108,8 @@ hasCall\(callback: AsyncCallback\): void Checks whether a call is in progress. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -123,6 +131,8 @@ hasCall\(\): Promise Checks whether a call is in progress. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Return value** | Type| Description| @@ -147,6 +157,8 @@ getCallState\(callback: AsyncCallback\): void Obtains the call status. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -168,6 +180,8 @@ getCallState\(\): Promise Obtains the call status. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Return value** | Type| Description| @@ -191,6 +205,8 @@ isEmergencyPhoneNumber\(phoneNumber: string, callback: AsyncCallback\) Checks whether the call number of the SIM card in the specified slot is an emergency number. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -213,6 +229,8 @@ isEmergencyPhoneNumber\(phoneNumber: string, options: EmergencyNumberOptions, ca Checks whether the call number of the SIM card in the specified slot is an emergency number. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -236,6 +254,8 @@ isEmergencyPhoneNumber\(phoneNumber: string, options?: EmergencyNumberOptions\): Checks whether the call number of the SIM card in the specified slot is an emergency number. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -266,6 +286,8 @@ formatPhoneNumber\(phoneNumber: string, callback: AsyncCallback\): void Formats a phone number based on the specified ISO country code. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -288,6 +310,8 @@ formatPhoneNumber\(phoneNumber: string, options: NumberFormatOptions, callback: Formats a phone number based on specified formatting options. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -313,6 +337,8 @@ formatPhoneNumber\(phoneNumber: string, options?: NumberFormatOptions\): Promise Formats a phone number based on specified formatting options. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -349,6 +375,8 @@ The phone number must match the specified country code. For example, for a China All country codes are supported. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -378,6 +406,8 @@ The phone number must match the specified country code. For example, for a China All country codes are supported. +**System capability**: SystemCapability.Telephony.CallManager + **Parameters** | Name| Type| Mandatory| Description| @@ -407,30 +437,40 @@ promise.then(data => { ## DialOptions Provides an option for determining whether a call is a video call. -| Parameter| Type| Mandatory| Description| + +**System capability**: SystemCapability.Telephony.CallManager + +| Name| Type| Mandatory| Description| | ------ | ------- | ---- | ------------------------------------------------------------ | | extras | boolean | No| Indication of a video call. The options are as follows:
- **true**: video call
- **false**: voice call| ## CallState Enumerates call states. + | Variable| Value| Description| | ------------------ | ---- | ------------------------------------------------------------ | -| CALL_STATE_UNKNOWN | -1 | The call status fails to be obtained and is unknown.| -| CALL_STATE_IDLE | 0 | No call is in progress.| -| CALL_STATE_RINGING | 1 | The call is in the ringing or waiting state.| -| CALL_STATE_OFFHOOK | 2 | At least one call is in dialing, active, or on hold, and no new incoming call is ringing or waiting.| +| CALL_STATE_UNKNOWN | -1 | The call status fails to be obtained and is unknown.
**System capability**: SystemCapability.Telephony.CallManager| +| CALL_STATE_IDLE | 0 | No call is in progress.
**System capability**: SystemCapability.Telephony.CallManager| +| CALL_STATE_RINGING | 1 | The call is in the ringing or waiting state.
**System capability**: SystemCapability.Telephony.CallManager| +| CALL_STATE_OFFHOOK | 2 | At least one call is in dialing, active, or on hold, and no new incoming call is ringing or waiting.
**System capability**: SystemCapability.Telephony.CallManager| ## EmergencyNumberOptions7+ Provides an option for determining whether a number is an emergency number for the SIM card in the specified slot. -| Parameter| Type| Mandatory| Description| + +**System capability**: SystemCapability.Telephony.CallManager + +| Name| Type| Mandatory| Description| | ------ | ------ | ---- | ------------------------------------------ | | slotId | number | No| SIM card slot ID.
- **0**: slot 1
- **1**: slot 2| ## NumberFormatOptions7+ Provides an option for number formatting. -| Parameter| Type| Mandatory| Description| + +**System capability**: SystemCapability.Telephony.CallManager + +| Name| Type| Mandatory| Description| | ----------- | ------ | ---- | ---------------------------------------------------------- | | countryCode | string | No| Country code, for example, **CN** (China). All country codes are supported. The default value is **CN**.| diff --git a/en/application-dev/reference/apis/js-apis-observer.md b/en/application-dev/reference/apis/js-apis-observer.md new file mode 100644 index 00000000000..bb658c1fbd3 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-observer.md @@ -0,0 +1,265 @@ +# Observer + +>**NOTE** +> +>The initial APIs of this module are supported since API version 6. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import observer from '@ohos.telephony.observer' +``` + +## observer.on('networkStateChange') + +on\(type: \'networkStateChange\', callback: Callback\): void; + +Registers an observer for network status change events. This function uses an asynchronous callback to return the execution result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ----------------------------------------- | ---- | --------------------------------- | +| type | string | Yes| Network status change event.| +| callback | Callback\<[NetworkState](js-apis-radio.md#NetworkState)\> | Yes| Callback used to return the result. For details, see [NetworkState](js-apis-radio.md#NetworkState).| + +**Example** + +``` +observer.on('networkStateChange', data =>{ + console.log("on networkStateChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.on('networkStateChange') + +on\(type: \'networkStateChange\', options: { slotId: number }, callback: Callback\): void; + +Registers an observer for network status change events of the SIM card in the specified slot. This function uses an asynchronous callback to return the execution result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| type | string | Yes| Network status change event.| +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | Callback\<[NetworkState](js-apis-radio.md#NetworkState)\> | Yes| Callback used to return the result. For details, see [NetworkState](js-apis-radio.md#NetworkState).| + +**Example** + +``` +observer.on('networkStateChange', {slotId: 0}, data =>{ + console.log("on networkStateChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.off('networkStateChange') + +off\(type: \'networkStateChange\', callback?: Callback\): void; + +Unregisters the observer for network status change events. This function uses an asynchronous callback to return the execution result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +>**NOTE** +> +>You can pass the callback of the **on** function if you want to cancel listening for a certain type of event. If you do not pass the callback, you will cancel listening for all events. + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------ | ---- | --------------------------------- | +| type | string | Yes| Network status change event.| +| callback | Callback\<[NetworkState](js-apis-radio.md#NetworkState)\> | No| Callback used to return the result. For details, see [NetworkState](js-apis-radio.md#NetworkState).| + +**Example** + +``` +let callback = data => { + console.log("on networkStateChange, data:" + JSON.stringify(data)); +} +observer.on('networkStateChange', callback); +// You can pass the callback of the on method to cancel listening for a certain type of callback. If you do not pass the callback, you will cancel listening for all callbacks. +observer.off('networkStateChange', callback); +observer.off('networkStateChange'); +``` + +## observer.on('signalInfoChange') + +on\(type: \'signalInfoChange\', callback: Callback\>): void; + +Registers an observer for signal status change events. This function uses an asynchronous callback to return the execution result. + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | Yes| Signal status change event.| +| callback | Callback\> | Yes| Callback used to return the result. For details, see [SignalInformation](js-apis-radio.md#SignalInformation).| + +**Example** + +``` +observer.on('signalInfoChange', data =>{ + console.log("on signalInfoChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.on('signalInfoChange') + +on\(type: \'signalInfoChange\', options: { slotId: number }, callback: Callback\>): void; + +Registers an observer for signal status change events of the SIM card in the specified slot. This function uses an asynchronous callback to return the execution result. + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| type | string | Yes| Signal status change event.| +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | Callback\> | Yes| Callback used to return the result. For details, see [SignalInformation](js-apis-radio.md#SignalInformation).| + +**Example** + +``` +observer.on('signalInfoChange', {slotId: 0}, data =>{ + console.log("on signalInfoChange, data:" + JSON.stringify(data)); +}); +``` + + +## observer.off('signalInfoChange') + +off\(type: \'signalInfoChange\', callback?: Callback\>): void; + +Unregisters the observer for signal status change events. This function uses an asynchronous callback to return the execution result. + +>**NOTE** +> +>You can pass the callback of the **on** function if you want to cancel listening for a certain type of event. If you do not pass the callback, you will cancel listening for all events. + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | Yes| Signal status change event.| +| callback | Callback\> | No| Callback used to return the result. For details, see [SignalInformation](js-apis-radio.md#SignalInformation).| + +**Example** + +``` +let callback = data => { + console.log("on signalInfoChange, data:" + JSON.stringify(data)); +} +observer.on('signalInfoChange', callback); +// You can pass the callback of the on method to cancel listening for a certain type of callback. If you do not pass the callback, you will cancel listening for all callbacks. +observer.off('signalInfoChange', callback); +observer.off('signalInfoChange'); +``` + + +## observer.on('callStateChange') + +on(type: 'callStateChange', callback: Callback\<{ state: [CallState](js-apis-call.md#CallState), number: string }\>): void; + +Registers an observer for call status change events. This function uses an asynchronous callback to return the execution result. + +**Required permission**: ohos.permission.READ_CALL_LOG + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | Yes| Call status change event.| +| callback | Callback\<{ state: [CallState](js-apis-call.md#CallState), number: string }\> | Yes| Callback used to return the result. For details, see [CallState](js-apis-call.md#CallState)
**number**: phone number.| + +**Example** + +``` +observer.on('callStateChange', value =>{ + console.log("on callStateChange, state:" + value.state + ", number:" + value.number); +}); +``` + + +## observer.on('callStateChange') + +on(type: 'callStateChange', options: { slotId: number }, callback: Callback<{ state: [CallState](js-apis-call.md#CallState), number: string }>): void; + +Registers an observer for call status change events. This function uses an asynchronous callback to return the execution result. + +**Required permission**: ohos.permission.READ_CALL_LOG + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | Yes| Call status change event.| +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | Callback\<{ state: [CallState](js-apis-call.md#CallState), number: string }\> | Yes| Callback used to return the result. For details, see [CallState](js-apis-call.md#CallState)
**number**: phone number.| + +**Example** + +``` +observer.on('callStateChange', {slotId: 0}, value =>{ + console.log("on callStateChange, state:" + value.state + ", number:" + value.number); +}); +``` + + +## observer.off('callStateChange') + +off(type: 'callStateChange', callback?: Callback<{ state: [CallState](js-apis-call.md#CallState), number: string }>): void; + +Unregisters the observer for call status change events. This function uses an asynchronous callback to return the execution result. + +**Required permission**: ohos.permission.READ_CALL_LOG + +>**NOTE** +> +>You can pass the callback of the **on** function if you want to cancel listening for a certain type of event. If you do not pass the callback, you will cancel listening for all events. + +**System capability**: SystemCapability.Telephony.StateRegistry + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | Yes| Call status change event.| +| callback | Callback\<{ state: [CallState](js-apis-call.md#CallState), number: string }\> | No| Callback used to return the result. For details, see [CallState](js-apis-call.md#CallState)
**number**: phone number.| + +**Example** + +``` +let callback = value => { + console.log("on callStateChange, state:" + value.state + ", number:" + value.number); +} +observer.on('callStateChange', callback); +// You can pass the callback of the on method to cancel listening for a certain type of callback. If you do not pass the callback, you will cancel listening for all callbacks. +observer.off('callStateChange', callback); +observer.off('callStateChange'); +``` diff --git a/en/application-dev/reference/apis/js-apis-sms.md b/en/application-dev/reference/apis/js-apis-sms.md index 65fcef6b4fb..b3cca70e284 100644 --- a/en/application-dev/reference/apis/js-apis-sms.md +++ b/en/application-dev/reference/apis/js-apis-sms.md @@ -16,6 +16,8 @@ createMessage\(pdu: Array, specification: string, callback: AsyncCallba Creates an SMS message instance based on the protocol data unit (PDU) and the specified SMS protocol. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.SmsMms + **Parameters** | Name| Type| Mandatory| Description| @@ -42,6 +44,8 @@ createMessage\(pdu: Array, specification: string\): Promise\): void Obtains the default slot of the SIM card used to send SMS messages. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.SmsMms + **Parameters** | Name| Type| Mandatory| Description| | -------- | --------------------------- | ---- | ---------------------------------------- | -| callback | AsyncCallback<number> | Yes| Callback used to return the result,
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback<number> | Yes| Callback used to return the result.
- **0**: slot 1
- **1**: slot 2| **Example** @@ -129,6 +137,8 @@ getDefaultSmsSlotId\(\): Promise Obtains the default slot of the SIM card used to send SMS messages. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.SmsMms + **Return value** | Type| Description| @@ -153,7 +163,9 @@ setSmscAddr\(slotId: number, smscAddr: string, callback: AsyncCallback\): Sets the short message service center (SMSC) address. This function uses an asynchronous callback to return the result. -Before using this API, you must declare the **ohos.permission.SET\_TELEPHONY\_STATE** permission. +**Required permission**: ohos.permission.SET_TELEPHONY_STATE (a system permission) + +**System capability**: SystemCapability.Telephony.SmsMms **Parameters** @@ -180,7 +192,9 @@ setSmscAddr\(slotId: number, smscAddr: string\): Promise Sets the SMSC address. This function uses a promise to return the result. -Before using this API, you must declare the **ohos.permission.SET\_TELEPHONY\_STATE** permission. +**Required permission**: ohos.permission.SET_TELEPHONY_STATE (a system permission) + +**System capability**: SystemCapability.Telephony.SmsMms **Parameters** @@ -215,7 +229,9 @@ getSmscAddr\(slotId: number, callback: AsyncCallback\): void Obtains the SMSC address. This function uses an asynchronous callback to return the result. -Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. +**Required permission**: ohos.permission.GET_TELEPHONY_STATE (a system permission) + +**System capability**: SystemCapability.Telephony.SmsMms **Parameters** @@ -240,7 +256,9 @@ getSmscAddr\(slotId: number\): Promise Obtains the SMSC address. This function uses a promise to return the result. -Before using this API, you must declare the **ohos.permission.GET\_TELEPHONY\_STATE** permission. +**Required permission**: ohos.permission.GET_TELEPHONY_STATE (a system permission) + +**System capability**: SystemCapability.Telephony.SmsMms **Parameters** @@ -271,6 +289,8 @@ promise.then(data => { Defines an SMS message instance. +**System capability**: SystemCapability.Telephony.SmsMms + | Variable| Type| Description| | ------------------------ | --------------------------------------- | ------------------------------------------------------------ | | emailAddress | string | Email address.| @@ -295,12 +315,12 @@ Defines an SMS message instance. Enumerates SMS message types. | Variable| Value| Description| -| ---------------- | ---- | ---------------------------------------- | -| UNKNOWN | 0 | Unknown type.| -| INSTANT_MESSAGE | 1 | Instant message, which is displayed immediately after being received.| -| OPTIONAL_MESSAGE | 2 | Message stored in the device or SIM card.| -| SIM_MESSAGE | 3 | Message containing SIM card information, which is to be stored in the SIM card.| -| FORWARD_MESSAGE | 4 | Message to be forwarded to another device.| +| ---------------- | ---- | ------------------------------------------------------------ | +| UNKNOWN | 0 | Unknown type.
**System capability**: SystemCapability.Telephony.SmsMms| +| INSTANT_MESSAGE | 1 | Instant message, which is displayed immediately after being received.
**System capability**: SystemCapability.Telephony.SmsMms| +| OPTIONAL_MESSAGE | 2 | Message stored in the device or SIM card.
**System capability**: SystemCapability.Telephony.SmsMms| +| SIM_MESSAGE | 3 | Message containing SIM card information, which is to be stored in the SIM card.
**System capability**: SystemCapability.Telephony.SmsMms| +| FORWARD_MESSAGE | 4 | Message to be forwarded to another device.
**System capability**: SystemCapability.Telephony.SmsMms| ## SendMessageOptions @@ -309,11 +329,13 @@ Provides the options (including callbacks) for sending an SMS message. For example, you can specify the SMS message type by the optional parameter **content**. +**System capability**: SystemCapability.Telephony.SmsMms + | Name| Type| Mandatory| Description| | ---------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | | slotId | number | Yes| Slot ID of the SIM card used for sending SMS messages:
- **0**: slot 1
- **1**: slot 2| | destinationHost | string | Yes| Destination address of the SMS message.| -| content | string \| Array<number> | Yes| SMS message type. If the content is comprised of character strings, the SMS message is a text message. If the content is comprised of byte arrays, the SMS message is a data message.| +| content | string \| Array<number> | Yes| SMS message type. If the content is composed of character strings, the SMS message is a text message. If the content is composed of byte arrays, the SMS message is a data message.| | serviceCenter | string | No| SMSC address. By default, the SMSC address in the SIM card is used.| | destinationPort | number | No| Destination port of the SMS message. This parameter is mandatory only for a data message. Otherwise, it is optional.| | sendCallback | AsyncCallback<[ISendShortMessageCallback](#ISendShortMessageCallback)> | No| Callback used to return the SMS message sending result. For details, see [ISendShortMessageCallback](#ISendShortMessageCallback).| @@ -322,7 +344,9 @@ For example, you can specify the SMS message type by the optional parameter **co ## ISendShortMessageCallback -Provides the callback for the SMS message delivery report. It consists of three parts: SMS message sending result, URI for storing the sent SMS message, and whether the SMS message is the last part of a long SMS message. +Provides the callback for the SMS message sending result. It consists of three parts: SMS message sending result, URI for storing the sent SMS message, and whether the SMS message is the last part of a long SMS message. + +**System capability**: SystemCapability.Telephony.SmsMms | Name| Type| Mandatory| Description| | ---------- | ------------------------------- | ---- | ------------------------------------------------------------ | @@ -333,7 +357,9 @@ Provides the callback for the SMS message delivery report. It consists of three ## IDeliveryShortMessageCallback -Provides the callback for the SMS message delivery report. Return the SMS delivery report. +Provides the callback for the SMS message sending result. Return the SMS delivery report. + +**System capability**: SystemCapability.Telephony.SmsMms | Name| Type| Mandatory| Description| | ------ | ------------------- | ---- | -------------- | @@ -344,6 +370,8 @@ Provides the callback for the SMS message delivery report. Return the SMS delive Enumerates SMS message sending results. +**System capability**: SystemCapability.Telephony.SmsMms + | Name| Value| Description| | ------------------------------------ | ---- | ------------------------------------------------------ | | SEND_SMS_SUCCESS | 0 | SMS message sent successfully.| diff --git a/en/application-dev/reference/apis/js-apis-telephony-data.md b/en/application-dev/reference/apis/js-apis-telephony-data.md new file mode 100644 index 00000000000..8cb2951bda1 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-telephony-data.md @@ -0,0 +1,289 @@ +# Cellular Data + +>**NOTE** +> +>The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. + +## Modules to Import + +``` +import data from '@ohos.telephony.data'; +``` + +## data.getDefaultCellularDataSlotId + +getDefaultCellularDataSlotId(callback: AsyncCallback\): void + +Obtains the default SIM card used for mobile data. This function uses an asynchronous callback to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CellularData + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ----------------------- | ---- | ------------------------------------------ | +| callback | AsyncCallback\ | Yes| Callback used to return the result.
**0**: slot 1
**1**: slot 2| + +**Example** + +``` +data.getDefaultCellularDataSlotId((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + +## data.getDefaultCellularDataSlotId + +getDefaultCellularDataSlotId(): Promise\ + +Obtains the default SIM card used for mobile data. This function uses a promise to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CellularData + +**Return value** + +| Type| Description| +| ----------------- | ------------------------------------------------------------ | +| Promise\ | Promise used to return the result, wherein:
**0**: slot 1
**1**: slot 2| + +**Example** + +``` +let promise = data.getDefaultCellularDataSlotId(); +promise.then((data) => { + console.log(`test success, promise: data->${JSON.stringify(data)}`); +}).catch((err) => { + console.error(`test fail, promise: err->${JSON.stringify(err)}`); +}); +``` + +## data.getCellularDataFlowType + +getCellularDataFlowType(callback: AsyncCallback\): void + +Obtains the cellular data flow type, which can be uplink or downlink. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Telephony.CellularData + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ---------------------------------------------- | ---- | ---------- | +| callback | AsyncCallback\<[DataFlowType](#DataFlowType)\> | Yes| Callback used to return the result.| + +**Example** + +``` +data.getCellularDataFlowType((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + +## data.getCellularDataFlowType + +getCellularDataFlowType(): Promise\ + +Obtains the cellular data flow type, which can be uplink or downlink. This function uses a promise to return the result. + +**System capability**: SystemCapability.Telephony.CellularData + +**Return value** + +| Type| Description| +| ---------------------------------------- | ----------------------------------------------- | +| Promise\<[DataFlowType](#DataFlowType)\> | Promise used to return the result. | + +**Example** + +``` +let promise = data.getCellularDataFlowType(); +promise.then((data) => { + console.log(`test success, promise: data->${JSON.stringify(data)}`); +}).catch((err) => { + console.error(`test fail, promise: err->${JSON.stringify(err)}`); +}); +``` + +## data.getCellularDataState + +getCellularDataState(callback: AsyncCallback\): void + +Obtains the connection status of the packet switched (PS) domain. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Telephony.CellularData + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------------------------------------ | ---- | ---------- | +| callback | AsyncCallback\<[DataConnectState](#DataConnectState)\> | Yes| Callback used to return the result.| + +**Example** + +``` +data.getCellularDataState((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + +## data.getCellularDataState + +getCellularDataState(): Promise\ + +Obtains the connection status of the PS domain. This function uses a promise to return the result. + +**System capability**: SystemCapability.Telephony.CellularData + +**Return value** + +| Type| Description| +| ------------------------------------------------ | ------------------------------------- | +| Promise\<[DataConnectState](#DataConnectState)\> | Promise used to return the result.| + +**Example** + +``` +let promise = data.getCellularDataState(); +promise.then((data) => { + console.log(`test success, promise: data->${JSON.stringify(data)}`); +}).catch((err) => { + console.error(`test fail, promise: err->${JSON.stringify(err)}`); +}); +``` + +## data.isCellularDataEnabled + +isCellularDataEnabled(callback: AsyncCallback\): void + +Checks whether the cellular data service is enabled. This function uses an asynchronous callback to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CellularData + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------ | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback\ | Yes| Callback used to return the result.
**true**: The cellular data service is enabled.
**false**: The cellular data service is disabled.| + +**Example** + +``` +data.isCellularDataEnabled((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + +## data.isCellularDataEnabled + +isCellularDataEnabled(): Promise\ + +Checks whether the cellular data service is enabled. This function uses a promise to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CellularData + +**Return value** + +| Type| Description| +| ------------------ | ------------------------------------------------------------ | +| Promise\ | Promise used to return the result, wherein:
**true**: The cellular data service is enabled.
**false**: The cellular data service is disabled.| + +**Example** + +``` +let promise = data.isCellularDataEnabled(); +promise.then((data) => { + console.log(`test success, promise: data->${JSON.stringify(data)}`); +}).catch((err) => { + console.error(`test fail, promise: err->${JSON.stringify(err)}`); +}); +``` + +## data.isCellularDataRoamingEnabled + +isCellularDataRoamingEnabled(slotId: number, callback: AsyncCallback\): void + +Checks whether roaming is enabled for the cellular data service. This function uses an asynchronous callback to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CellularData + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------ | ---- | ------------------------------------------------------------ | +| slotId | number | Yes| Card slot ID. The options are as follows:
**0**: slot 1
**1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result.
**true**: Roaming is enabled for the cellular data service.
**false**: Roaming is disabled for the cellular data service.| + +**Example** + +``` +data.isCellularDataRoamingEnabled(0,(err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + +## data.isCellularDataRoamingEnabled + +isCellularDataRoamingEnabled(slotId: number): Promise\ + +Checks whether roaming is enabled for the cellular data service. This method uses a promise to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CellularData + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | ---------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
**0**: slot 1
**1**: slot 2| + +**Return value** + +| Type| Description| +| ------------------ | ------------------------------------------------------------ | +| Promise\ | Promise used to return the result, wherein:
**true**: Roaming is enabled for the cellular data service.
**false**: Roaming is disabled for the cellular data service.| + +**Example** + +``` +let promise = data.isCellularDataRoamingEnabled(0); +promise.then((data) => { + console.log(`test success, promise: data->${JSON.stringify(data)}`); +}).catch((err) => { + console.error(`test fail, promise: err->${JSON.stringify(err)}`); +}); +``` + +## DataFlowType + + Defines the cellular data flow type. + +| Name| Value| Description| +| ------ | ---------------------- | ------------------------------------------------------------ | +| 0 | DATA_FLOW_TYPE_NONE | No uplink or downlink data is available.
**System capability**: SystemCapability.Telephony.CellularData| +| 1 | DATA_FLOW_TYPE_DOWN | Only the downlink data is available.
**System capability**: SystemCapability.Telephony.CellularData| +| 2 | DATA_FLOW_TYPE_UP | Only the uplink data is available.
**System capability**: SystemCapability.Telephony.CellularData| +| 3 | DATA_FLOW_TYPE_UP_DOWN | Both uplink data and downlink data are available.
**System capability**: SystemCapability.Telephony.CellularData| +| 4 | DATA_FLOW_TYPE_DORMANT | No uplink or downlink data is available because the lower-layer link is in the dormant state.
**System capability**: SystemCapability.Telephony.CellularData| + +## DataConnectState + + Describes the connection status of a cellular data link. + +| Name| Value| Description| +| ------ | ----------------------- | ------------------------------------------------------------ | +| -1 | DATA_STATE_UNKNOWN| The status of the cellular data link is unknown.
**System capability**: SystemCapability.Telephony.CellularData| +| 0 | DATA_STATE_DISCONNECTED | The cellular data link is disconnected.
**System capability**: SystemCapability.Telephony.CellularData| +| 1 | DATA_STATE_CONNECTING | The cellular data link is being connected.
**System capability**: SystemCapability.Telephony.CellularData| +| 2 | DATA_STATE_CONNECTED | The cellular data link is connected.
**System capability**: SystemCapability.Telephony.CellularData| +| 3 | DATA_STATE_SUSPENDED | The cellular data link is suspended.
**System capability**: SystemCapability.Telephony.CellularData| -- Gitee From 2848ae746dda6a3e63533dc2cda0d1d735b41c42 Mon Sep 17 00:00:00 2001 From: maosiping Date: Mon, 7 Mar 2022 20:08:09 +0800 Subject: [PATCH 186/282] =?UTF-8?q?SIM=E5=8D=A1=E7=AE=A1=E7=90=86=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: maosiping --- .../reference/apis/js-apis-sim.md | 56 ------------------- 1 file changed, 56 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-sim.md b/zh-cn/application-dev/reference/apis/js-apis-sim.md index 4315d2ecd6f..4adc8b442a2 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-sim.md +++ b/zh-cn/application-dev/reference/apis/js-apis-sim.md @@ -111,62 +111,6 @@ promise.then(data => { ``` -## sim.hasOperatorPrivileges - -hasOperatorPrivileges\(slotId: number, callback: AsyncCallback\): void - -检查应用是否已经被赋予权限,使用callback方式作为异步方法。 - -**需要权限**:ohos.permission.GET_TELEPHONY_STATE - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | --------------------------- | ---- | -------------------------------------- | -| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | -| callback | AsyncCallback<boolean> | 是 | 回调函数。 | - -**示例:** - -``` -sim.hasOperatorPrivileges(0, (err, data) => { - console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); -}); -``` - - -## sim.hasOperatorPrivileges - -hasOperatorPrivileges\(slotId: number\): Promise - -检查应用是否已经被赋予权限,使用Promise方式作为异步方法。 - -**需要权限**:ohos.permission.GET_TELEPHONY_STATE - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | -------------------------------------- | -| slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | - -**返回值:** - -| 类型 | 说明 | -| --------------------- | ---------------------------------- | -| Promise<boolean> | 以Promise形式返回指应用是否操作电话服务的权限,如果有返回true。 | - -**示例:** - -``` -let promise = sim.hasOperatorPrivileges(0); -promise.then(data => { - console.log(`hasOperatorPrivileges success, promise: data->${JSON.stringify(data)}`); -}).catch(err => { - console.log(`hasOperatorPrivileges fail, promise: err->${JSON.stringify(err)}`); -}); -``` - - ## sim.getISOCountryCodeForSim getISOCountryCodeForSim\(slotId: number, callback: AsyncCallback\): void -- Gitee From 3ca3c20125720712dd5f76335eae2b594db38d35 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Mon, 7 Mar 2022 20:12:25 +0800 Subject: [PATCH 187/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index fe9cfe9d63d..4e17e265355 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -10,7 +10,7 @@ import mediaLibrary from '@ohos.multimedia.medialibrary'; ``` -## getMediaLibrary +## mediaLibrary.getMediaLibrary function getMediaLibrary(context: Context): MediaLibrary @@ -28,7 +28,7 @@ function getMediaLibrary(context: Context): MediaLibrary | 类型 | 说明 | | ------------ | :----- | -| [MediaLibrary](#MediaLibrary) | 媒体库实例 | +| [MediaLibrary](#medialibrary) | 媒体库实例 | **示例:** @@ -128,7 +128,7 @@ on(type: 'deviceChange'|'albumChange'|'imageChange'|'audioChange'|'videoChange'| | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------- | ---- | ------------------- | -| type | type | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
'audioChange':  音频文件变更
'videoChange':  视频文件变更
'fileChange':  文件变更
'remoteFileChange': 注册设备上文件变更 | +| type | string | 是 | 媒体类型
'deviceChange': 注册设备变更
'albumChange': 相册变更
'imageChange': 图片文件变更
'audioChange':  音频文件变更
'videoChange':  视频文件变更
'fileChange':  文件变更
'remoteFileChange': 注册设备上文件变更 | | callback | callback<void> | 是 | 回调返回空 | **示例:** @@ -175,7 +175,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal | 参数名 | 类型 | 必填 | 说明 | | ------------ | --------------------------------------- | ---- | ------------------------------------------------------------ | -| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | +| mediaType | [MediaType](#mediatype) | 是 | 媒体类型 | | displayName | string | 是 | 展示文件名 | | relativePath | string | 是 | 相对公共目录路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | | callback | AsyncCallback<[FileAsset](#fileasset8)> | 是 | 异步获取媒体数据FileAsset之后的回调 | @@ -209,7 +209,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr | 参数名 | 类型 | 必填 | 说明 | | ------------ | ----------------------- | ---- | ------------------------------------------------------------ | -| mediaType | [MediaType](#MediaType) | 是 | 媒体类型 | +| mediaType | [MediaType](#mediatype) | 是 | 媒体类型 | | displayName | string | 是 | 展示文件名 | | relativePath | string | 是 | 相对路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | @@ -422,7 +422,7 @@ media.release() | id | number | 是 | 否 | 文件资源编号 | | uri | string | 是 | 否 | 文件资源uri(如:dataability:///media/image/2) | | mimeType | string | 是 | 否 | 文件扩展属性 | -| mediaType | [MediaType](#mediaType) | 是 | 否 | 媒体类型 | +| mediaType | [MediaType](#mediatype) | 是 | 否 | 媒体类型 | | displayName | string | 是 | 是 | 显示文件名 | | title | string | 是 | 是 | 文件标题 | | relativePath | string | 是 | 是 | 相对公共目录路径 | -- Gitee From 172b48f8a670e8a703b7a9801116763c0635be7f Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Mon, 7 Mar 2022 20:17:05 +0800 Subject: [PATCH 188/282] add code fix Signed-off-by: panqiangbiao --- zh-cn/application-dev/reference/apis/js-apis-medialibrary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 4e17e265355..13d5e458486 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -12,7 +12,7 @@ import mediaLibrary from '@ohos.multimedia.medialibrary'; ## mediaLibrary.getMediaLibrary -function getMediaLibrary(context: Context): MediaLibrary +getMediaLibrary(context: Context): MediaLibrary 获取媒体库的实例,用于访问和修改用户的个人数据信息。 -- Gitee From 3f581915ad795452d61d6f736f3b4313284c03cc Mon Sep 17 00:00:00 2001 From: shawn_he Date: Mon, 7 Mar 2022 20:22:26 +0800 Subject: [PATCH 189/282] update docs Signed-off-by: shawn_he --- .../reference/apis/js-apis-radio.md | 247 +++++++++++++----- 1 file changed, 183 insertions(+), 64 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-radio.md b/en/application-dev/reference/apis/js-apis-radio.md index a59cb7b5346..2ced6771719 100644 --- a/en/application-dev/reference/apis/js-apis-radio.md +++ b/en/application-dev/reference/apis/js-apis-radio.md @@ -15,9 +15,11 @@ import radio from '@ohos.telephony.radio' getRadioTech\(slotId: number, callback: AsyncCallback<\{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology\}\>\): void -Obtains the radio access technologies (RATs) used by the CS and PS domains. This function uses an asynchronous callback to return the result. +Obtains the radio access technology (RAT) used by the CS and PS domains. This function uses an asynchronous callback to return the result. -Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CoreService **Parameters** @@ -42,7 +44,9 @@ getRadioTech\(slotId: number\): Promise<\{psRadioTech: RadioTechnology, csRadioT Obtains the RAT used by the CS and PS domains. This function uses a promise to return the result. -Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CoreService **Parameters** @@ -73,15 +77,17 @@ promise.then(data => { getNetworkState\(callback: AsyncCallback\): void -Obtains the network status of the SIM card in the specified slot. This function uses an asynchronous callback to return the result. +Obtains the network status. This function uses an asynchronous callback to return the result. -Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CoreService **Parameters** | Name| Type| Mandatory| Description| | -------- | ---------------------------------------------- | ---- | ---------- | -| callback | AsyncCallback\<[NetworkState](#NetworkState)\> | Yes| Callback invoked to traverse the entries in the container.| +| callback | AsyncCallback\<[NetworkState](#NetworkState)\> | Yes| Callback used to return the result.| **Example** @@ -98,7 +104,9 @@ getNetworkState\(slotId: number, callback: AsyncCallback\): void Obtains the network status of the SIM card in the specified slot. This function uses an asynchronous callback to return the result. -Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CoreService **Parameters** @@ -123,7 +131,9 @@ getNetworkState\(slotId?: number\): Promise Obtains the network status of the SIM card in the specified slot. This function uses a promise to return the result. -Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CoreService **Parameters** @@ -156,6 +166,8 @@ getNetworkSelectionMode\(slotId: number, callback: AsyncCallback Obtains the network selection mode of the SIM card in the specified slot. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.CoreService + **Parameters** | Name| Type| Mandatory| Description| @@ -210,12 +224,14 @@ getISOCountryCodeForNetwork\(slotId: number, callback: AsyncCallback\): Obtains the ISO country code of the network with which the SIM card in the specified slot is registered. This function uses an asynchronous callback to return the result. +**System capability**: SystemCapability.Telephony.CoreService + **Parameters** | Name| Type| Mandatory| Description| | -------- | ----------------------- | ---- | ---------------------------------------- | | slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| -| callback | AsyncCallback\ | Yes| Callback used to return the result, which is a country code, for example, **CN** (China).| +| callback | AsyncCallback\ | Yes| Callback used to return the result. which is a country code, for example, **CN** (China).| **Example** @@ -233,6 +249,8 @@ getISOCountryCodeForNetwork\(slotId: number\): Promise Obtains the ISO country code of the network with which the SIM card in the specified slot is registered. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.CoreService + **Parameters** | Name| Type| Mandatory| Description| @@ -264,6 +282,8 @@ getSignalInformation\(slotId: number, callback: AsyncCallback\> Obtains a list of signal strengths of the network with which the SIM card in the specified slot is registered. This function uses a promise to return the result. +**System capability**: SystemCapability.Telephony.CoreService + **Parameters** | Name| Type| Mandatory| Description| @@ -316,9 +338,11 @@ promise.then(data => { isRadioOn\(callback: AsyncCallback\): void -Checks whether the radio service is enabled. This function uses an asynchronous callback to return the result. +Checks whether the radio service is enabled on the primary SIM card. This function uses an asynchronous callback to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO -Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. +**System capability**: SystemCapability.Telephony.CoreService **Parameters** @@ -335,13 +359,48 @@ radio.isRadioOn((err, data) => { ``` -## radio.isRadioOn7+ +## radio.isRadioOn7+ + +isRadioOn\(slotId: number, callback: AsyncCallback\): void + +Checks whether the radio service is enabled on the SIM card in the specified slot. This function uses an asynchronous callback to return the result. + +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CoreService + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ------------------------ | ---- | ------------------------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result.
- **true**: The radio service is enabled.
- **false**: The radio service is disabled.| + +**Example** + +``` +let slotId = 0; +radio.isRadioOn(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + + +## radio.isRadioOn7+ -isRadioOn\(\): Promise +isRadioOn\(slotId?: number\): Promise Checks whether the radio service is enabled. This function uses a promise to return the result. -Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO** permission. +**Required permission**: ohos.permission.GET_NETWORK_INFO + +**System capability**: SystemCapability.Telephony.CoreService + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | No| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2
If the slot ID is not specified, this function is defaulted to check whether the radio service is enabled on the primary SIM card.| **Return value** @@ -352,7 +411,8 @@ Before using this API, you must declare the **ohos.permission.GET\_NETWORK\_INFO **Example** ``` -let promise = radio.isRadioOn(); +let slotId = 0; +let promise = radio.isRadioOn(slotId); promise.then(data => { console.log(`isRadioOn success, promise: data->${JSON.stringify(data)}`); }).catch(err => { @@ -361,25 +421,83 @@ promise.then(data => { ``` +## radio.getOperatorName7+ + +getOperatorName\(slotId: number, callback: AsyncCallback\): void + +Obtains the carrier name. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Telephony.CoreService + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | ----------------------- | ---- | ------------------------------------------ | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| +| callback | AsyncCallback\ | Yes| Callback used to return the result, which is the carrier name, for example, China Mobile.| + +**Example** + +``` +let slotId = 0; +radio.getOperatorName(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); +}); +``` + + +## radio.getOperatorName7+ + +getOperatorName\(slotId: number\): Promise + +Obtains the carrier name. This function uses a promise to return the result. + +**System capability**: SystemCapability.Telephony.CoreService + +**Parameters** + +| Name| Type| Mandatory| Description| +| ------ | ------ | ---- | -------------------------------------- | +| slotId | number | Yes| Card slot ID. The options are as follows:
- **0**: slot 1
- **1**: slot 2| + +**Return value** + +| Type| Description| +| ----------------- | ------------------------------------------------------------ | +| Promise\ | Promise used t return the result, which is the carrier name, for example, China Mobile.| + +**Example** + +``` +let slotId = 0; +let promise = radio.getOperatorName(slotId); +promise.then(data => { + console.log(`getOperatorName success, promise: data->${JSON.stringify(data)}`); +}).catch(err => { + console.log(`getOperatorName fail, promise: err->${JSON.stringify(err)}`); +}); +``` + + ## RadioTechnology Enumerates the RATs. | Variable| Value| Description| | ------------------------- | ---- | ------------------------------------------------------------ | -| RADIO_TECHNOLOGY_UNKNOWN | 0 | Unknown| -| RADIO_TECHNOLOGY_GSM | 1 | Global System for Mobile Communication (GSM)| -| RADIO_TECHNOLOGY_1XRTT | 2 | Single-Carrier Radio Transmission Technology (1XRTT)| -| RADIO_TECHNOLOGY_WCDMA | 3 | Wideband Code Division Multiple Access (WCDMA)| -| RADIO_TECHNOLOGY_HSPA | 4 | High Speed Packet Access (HSPA)| -| RADIO_TECHNOLOGY_HSPAP | 5 | Evolved High Speed Packet Access (HSPA+)| -| RADIO_TECHNOLOGY_TD_SCDMA | 6 | Time Division Synchronous Code Division Multiple Access (TD-SCDMA)| -| RADIO_TECHNOLOGY_EVDO | 7 | Evolution-Data Optimized (EVDO)| -| RADIO_TECHNOLOGY_EHRPD | 8 | Evolved High Rate Package Data (EHRPD)| -| RADIO_TECHNOLOGY_LTE | 9 | Long Term Evolution (LTE)| -| RADIO_TECHNOLOGY_LTE_CA | 10 | Long Term Evolution_Carrier Aggregation (LTE_CA)| -| RADIO_TECHNOLOGY_IWLAN | 11 | Industrial Wireless LAN (IWLAN)| -| RADIO_TECHNOLOGY_NR | 12 | New Radio (NR)| +| RADIO_TECHNOLOGY_UNKNOWN | 0 | Unknown RAT
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_GSM | 1 | Global System for Mobile Communication (GSM)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_1XRTT | 2 | Single-Carrier Radio Transmission Technology (1XRTT)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_WCDMA | 3 | Wideband Code Division Multiple Access (WCDMA)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_HSPA | 4 | High Speed Packet Access (HSPA)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_HSPAP | 5 | Evolved High Speed Packet Access (HSPA+)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_TD_SCDMA | 6 | Time Division Synchronous Code Division Multiple Access (TD-SCDMA)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_EVDO | 7 | Evolution-Data Optimized (EVDO)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_EHRPD | 8 | Evolved High Rate Package Data (EHRPD)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_LTE | 9 | Long Term Evolution (LTE)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_LTE_CA | 10 | Long Term Evolution_Carrier Aggregation (LTE_CA)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_IWLAN | 11 | Industrial Wireless LAN (IWLAN)
**System capability**: SystemCapability.Telephony.CoreService| +| RADIO_TECHNOLOGY_NR | 12 | New Radio (NR)
**System capability**: SystemCapability.Telephony.CoreService| ## SignalInformation @@ -387,39 +505,40 @@ Enumerates the RATs. Defines the signal strength. | Attribute| Type| Description| -| ----------- | --------------------------- | ------------------ | -| signalType | [NetworkType](#NetworkType) | Signal strength type.| -| signalLevel | number | Signal strength level.| +| ----------- | --------------------------- | ------------------------------------------------------------ | +| signalType | [NetworkType](#NetworkType) | Signal strength type.
**System capability**: SystemCapability.Telephony.CoreService| +| signalLevel | number | Signal strength level.
**System capability**: SystemCapability.Telephony.CoreService| ## NetworkType -Network type. +Defines the network type. | Variable| Value| Description| | -------------------- | ---- | ------------------------------------------------------------ | -| NETWORK_TYPE_UNKNOWN | 0 | Unknown| -| NETWORK_TYPE_GSM | 1 | GSM network| -| NETWORK_TYPE_CDMA | 2 | CDMA network| -| NETWORK_TYPE_WCDMA | 3 | WCDMA network| -| NETWORK_TYPE_TDSCDMA | 4 | TD-SCDMA network| -| NETWORK_TYPE_LTE | 5 | LTE network| -| NETWORK_TYPE_NR | 6 | 5G NR network| +| NETWORK_TYPE_UNKNOWN | 0 | Unknown network
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_TYPE_GSM | 1 | GSM network
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_TYPE_CDMA | 2 | CDMA network
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_TYPE_WCDMA | 3 | WCDMA network
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_TYPE_TDSCDMA | 4 | TD-SCDMA network
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_TYPE_LTE | 5 | LTE network
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_TYPE_NR | 6 | 5G NR network
**System capability**: SystemCapability.Telephony.CoreService| ## NetworkState Defines the network registration status. | Variable| Type| Description| -| ----------------- | --------------------- | ------------------------------ | -| longOperatorName | string | Long carrier name of the registered network.| -| shortOperatorName | string | Short carrier name of the registered network.| -| plmnNumeric | string | PLMN code of the registered network.| -| isRoaming | boolean | Whether the user is roaming.| -| regState | [RegState](#RegState) | Network registration status of the device.| -| nsaState | [NsaState](#NsaState) | NSA network registration status of the device.| -| isCaActive | boolean | Whether carrier aggregation (CA) is supported.| -| isEmergency | boolean | Whether only emergency calls are allowed.| +| ----------------- | --------------------- | ------------------------------------------------------------ | +| longOperatorName | string | Long carrier name of the registered network.
**System capability**: SystemCapability.Telephony.CoreService| +| shortOperatorName | string | Short carrier name of the registered network.
**System capability**: SystemCapability.Telephony.CoreService| +| plmnNumeric | string | PLMN code of the registered network.
**System capability**: SystemCapability.Telephony.CoreService| +| isRoaming | boolean | Whether the user is roaming.
**System capability**: SystemCapability.Telephony.CoreService| +| regState | [RegState](#RegState) | Network registration status of the device.
**System capability**: SystemCapability.Telephony.CoreService| +| cfgTech8+ | [RadioTechnology](#RadioTechnology) | RAT of the device.
**System capability**: SystemCapability.Telephony.CoreService| +| nsaState | [NsaState](#NsaState) | NSA network registration status of the device.
**System capability**: SystemCapability.Telephony.CoreService| +| isCaActive | boolean | CA status.
**System capability**: SystemCapability.Telephony.CoreService| +| isEmergency | boolean | Whether only emergency calls are allowed.
**System capability**: SystemCapability.Telephony.CoreService| ## RegState @@ -427,11 +546,11 @@ Defines the network registration status. Defines the network registration status. | Variable| Value| Description| -| ----------------------------- | ---- | -------------------------- | -| REG_STATE_NO_SERVICE | 0 | The device cannot use any service.| -| REG_STATE_IN_SERVICE | 1 | The device can use services normally. | -| REG_STATE_EMERGENCY_CALL_ONLY | 2 | The device can use only the emergency call service.| -| REG_STATE_POWER_OFF | 3 | The cellular radio service is disabled.| +| ----------------------------- | ---- | ------------------------------------------------------------ | +| REG_STATE_NO_SERVICE | 0 | The device cannot use any service.
**System capability**: SystemCapability.Telephony.CoreService| +| REG_STATE_IN_SERVICE | 1 | The device can use services normally.
**System capability**: SystemCapability.Telephony.CoreService| +| REG_STATE_EMERGENCY_CALL_ONLY | 2 | The device can use only the emergency call service.
**System capability**: SystemCapability.Telephony.CoreService| +| REG_STATE_POWER_OFF | 3 | The cellular radio service is disabled.
**System capability**: SystemCapability.Telephony.CoreService| ## NsaState @@ -439,13 +558,13 @@ Defines the network registration status. Enumerates NSA network states. | Variable| Value| Description| -| -------------------------- | ---- | ---------------------------------------------------------- | -| NSA_STATE_NOT_SUPPORT | 1 | The device is in idle or connected state in an LTE cell that does not support NSA.| -| NSA_STATE_NO_DETECT | 2 | The device is in the idle state in an LTE cell that supports NSA but does not support NR coverage detection.| -| NSA_STATE_CONNECTED_DETECT | 3 | The device is connected to the LTE network in an LTE cell that supports NSA and NR coverage detection.| -| NSA_STATE_IDLE_DETECT | 4 | The device is in the idle state in an LTE cell that supports NSA and NR coverage detection.| -| NSA_STATE_DUAL_CONNECTED | 5 | The device is connected to the LTE/NR network in an LTE cell that supports NSA.| -| NSA_STATE_SA_ATTACHED | 6 | The device is idle or connected to the NG-RAN cell when being attached to the 5G Core.| +| -------------------------- | ---- | ------------------------------------------------------------ | +| NSA_STATE_NOT_SUPPORT | 1 | The device is in idle or connected state in an LTE cell that does not support NSA.
**System capability**: SystemCapability.Telephony.CoreService| +| NSA_STATE_NO_DETECT | 2 | The device is in the idle state in an LTE cell that supports NSA but does not support NR coverage detection.
**System capability**: SystemCapability.Telephony.CoreService| +| NSA_STATE_CONNECTED_DETECT | 3 | The device is connected to the LTE network in an LTE cell that supports NSA and NR coverage detection.
**System capability**: SystemCapability.Telephony.CoreService| +| NSA_STATE_IDLE_DETECT | 4 | The device is in the idle state in an LTE cell that supports NSA and NR coverage detection.
**System capability**: SystemCapability.Telephony.CoreService| +| NSA_STATE_DUAL_CONNECTED | 5 | The device is connected to the LTE/NR network in an LTE cell that supports NSA.
**System capability**: SystemCapability.Telephony.CoreService| +| NSA_STATE_SA_ATTACHED | 6 | The device is idle or connected to the NG-RAN cell when being attached to the 5G Core.
**System capability**: SystemCapability.Telephony.CoreService| ## NetworkSelectionMode @@ -453,7 +572,7 @@ Enumerates NSA network states. Enumerates network selection modes. | Variable| Value| Description| -| --------------------------- | ---- | -------------- | -| NETWORK_SELECTION_UNKNOWN | 0 | Unknown network selection mode.| -| NETWORK_SELECTION_AUTOMATIC | 1 | Automatic network selection mode.| -| NETWORK_SELECTION_MANUAL | 2 | Manual network selection mode.| +| --------------------------- | ---- | ------------------------------------------------------------ | +| NETWORK_SELECTION_UNKNOWN | 0 | Unknown network selection mode.
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_SELECTION_AUTOMATIC | 1 | Automatic network selection mode.
**System capability**: SystemCapability.Telephony.CoreService| +| NETWORK_SELECTION_MANUAL | 2 | Manual network selection mode.
**System capability**: SystemCapability.Telephony.CoreService| -- Gitee From 36ec9cd9a23877b327ed0e9ad0a41146a6fa6a4a Mon Sep 17 00:00:00 2001 From: liwenzhen Date: Mon, 7 Mar 2022 16:33:01 +0800 Subject: [PATCH 190/282] add web to readme Signed-off-by: liwenzhen Change-Id: I5c0bff0519936dea6a80884a31b8a5b9ec563c28 --- zh-cn/application-dev/reference/arkui-js/Readme-CN.md | 1 + .../reference/arkui-js/js-components-basic-web.md | 2 +- zh-cn/application-dev/reference/arkui-ts/Readme-CN.md | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-js/Readme-CN.md b/zh-cn/application-dev/reference/arkui-js/Readme-CN.md index 8380ca334b2..5053eff042a 100644 --- a/zh-cn/application-dev/reference/arkui-js/Readme-CN.md +++ b/zh-cn/application-dev/reference/arkui-js/Readme-CN.md @@ -58,6 +58,7 @@ - [toolbar](js-components-basic-toolbar.md) - [toolbar-item](js-components-basic-toolbar-item.md) - [toggle](js-components-basic-toggle.md) + - [web](js-components-basic-web.md) - 媒体组件 - [video](js-components-media-video.md) - 画布组件 diff --git a/zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md b/zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md index 83fb9c4f41a..c7f4bd776a2 100644 --- a/zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md +++ b/zh-cn/application-dev/reference/arkui-js/js-components-basic-web.md @@ -21,7 +21,7 @@ web组件不跟随转场动画。一个页面仅支持一个web组件。 ## 样式 -仅支持通用样式中的width8+、height8+、padding8+、margin8+、border8+。 +不支持通用样式设置。 ## 事件 仅支持如下事件: diff --git a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md index 2c6b3e436ee..d170f720d6d 100644 --- a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md +++ b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md @@ -48,7 +48,6 @@ - [SwipeGesture](ts-basic-gestures-swipegesture.md) - [组合手势](ts-combined-gestures.md) - 基础组件 - - [Web](ts-basic-components-web.md) - [Blank](ts-basic-components-blank.md) - [Button](ts-basic-components-button.md) - [Checkbox](ts-basic-components-checkbox.md) @@ -58,21 +57,22 @@ - [Divider](ts-basic-components-divider.md) - [Image](ts-basic-components-image.md) - [ImageAnimator](ts-basic-components-imageanimator.md) + - [LoadingProgress](ts-basic-components-loadingprogress.md) - [Progress](ts-basic-components-progress.md) - [QRCode](ts-basic-components-qrcode.md) - [Radio](ts-basic-components-radio.md) - [Rating](ts-basic-components-rating.md) - - [Span](ts-basic-components-span.md) + - [Select](ts-basic-components-select.md) - [Slider](ts-basic-components-slider.md) + - [Span](ts-basic-components-span.md) - [Text](ts-basic-components-text.md) - [TextArea](ts-basic-components-textarea.md) - [TextInput](ts-basic-components-textinput.md) - [TextPicker](ts-basic-components-textpicker.md) - [TextTimer](ts-basic-components-texttimer.md) - [Toggle](ts-basic-components-toggle.md) - - [Select](ts-basic-components-select.md) - [TextClock](ts-basic-components-textclock.md) - - [LoadingProgress](ts-basic-components-loadingprogress.md) + - [Web](ts-basic-components-web.md) - 容器组件 - [AlphabetIndexer](ts-container-alphabet-indexer.md) - [Badge](ts-container-badge.md) -- Gitee From 9260a990e53a072abdc70913c5fdd1ad1a80c1fd Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 7 Mar 2022 21:08:14 +0800 Subject: [PATCH 191/282] update api link Signed-off-by: liujiandong --- zh-cn/application-dev/reference/apis/js-apis-observer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-observer.md b/zh-cn/application-dev/reference/apis/js-apis-observer.md index 0a27461129a..46cb6213e1c 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-observer.md +++ b/zh-cn/application-dev/reference/apis/js-apis-observer.md @@ -535,7 +535,7 @@ SIM卡类型和状态。 | 变量 | 类型 | 说明 | | ----------------- | --------------------- | ------------------------------------------------------------ | -| type | [CardType](js-apis-sim.md#CardType) | SIM卡类型,参考sim的[CardType](js-apis-sim.md#CardType)。
**系统能力**:SystemCapability.Telephony.StateRegistry | +| type | [CardType](js-apis-sim.md#cardtype) | SIM卡类型,参考sim的[CardType](js-apis-sim.md#cardtype)。
**系统能力**:SystemCapability.Telephony.StateRegistry | | state | [SimState](js-apis-sim.md#SimState) | SIM卡状态,参考sim的[SimState](js-apis-sim.md#SimState)。
**系统能力**:SystemCapability.Telephony.StateRegistry | | reason8+ | [LockReason](#lockreason8) | SIM卡锁类型。
**系统能力**:SystemCapability.Telephony.StateRegistry | -- Gitee From 57592568f8e7a6937aca7d60764e7f7d6dac0ee8 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 8 Mar 2022 09:04:03 +0800 Subject: [PATCH 192/282] add more detail info Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 130 +++++++++--------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 13d5e458486..0952cbe8247 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -12,7 +12,7 @@ import mediaLibrary from '@ohos.multimedia.medialibrary'; ## mediaLibrary.getMediaLibrary -getMediaLibrary(context: Context): MediaLibrary +function getMediaLibrary(context: Context): MediaLibrary 获取媒体库的实例,用于访问和修改用户的个人数据信息。 @@ -466,8 +466,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -501,8 +501,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -538,8 +538,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -574,8 +574,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -682,8 +682,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -728,8 +728,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -769,8 +769,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -805,8 +805,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -846,8 +846,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -882,8 +882,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -923,8 +923,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -960,8 +960,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -999,8 +999,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -1039,8 +1039,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -1083,8 +1083,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -1120,8 +1120,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -1164,8 +1164,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; const fetchFileResult = await media.getFileAssets(getImageOp); const asset = await fetchFileResult.getFirstObject(); @@ -1202,8 +1202,8 @@ async function example() { let getFileCountOneOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [fileType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,1", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getFileCountOneOp); const fetchCount = fetchFileResult.getCount(); @@ -1232,8 +1232,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); const fetchCount = fetchFileResult.getCount(); @@ -1269,8 +1269,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.close(); @@ -1299,8 +1299,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.getFirstObject((err, value) => { @@ -1335,8 +1335,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.getFirstObject().then(function(fileAsset){ @@ -1371,8 +1371,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.getNextObject((err, value) => { @@ -1409,8 +1409,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); const fetchCount = fetchFileResult.getCount(); @@ -1441,8 +1441,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.getLastObject((err, value) => { @@ -1477,8 +1477,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); let lastObject = await fetchFileResult.getLastObject(); @@ -1508,8 +1508,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.getPositionObject(0, (err, value) => { @@ -1552,8 +1552,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.getPositionObject(1, (err, value) => { @@ -1590,8 +1590,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); fetchFileResult.getAllObject((err, value) => { @@ -1626,8 +1626,8 @@ async function example() { let getImageOp = { selections: fileKeyObj.MEDIA_TYPE + '= ?', selectionArgs: [imageType.toString()], - order: fileKeyObj.DATE_ADDED, - extendArgs: "LIMIT 0,10", + order: fileKeyObj.DATE_ADDED + " DESC", + extendArgs: "", }; let fetchFileResult = await media.getFileAssets(getImageOp); var data = fetchFileResult.getAllObject(); @@ -1883,12 +1883,12 @@ DeviceType | 名称 | 类型 | 可读 | 可写 | 必填 |说明 | | ------------- | ------------- | ---- | ---- | ---- |---------------- | -| selections | string | 是 | 是 |是 | 检索条件 | -| selectionArgs | Array<string> | 是 | 是 |是 | 检索条件的值 | -| order | string | 是 | 是 | 否 |检索结果排序方式 | +| selections | string | 是 | 是 |是 | 检索条件,使用[FileKey](#filekey)中的枚举值作为检索条件的列名。示例:
selections: mediaLibrary.FileKey.MEDIA_TYPE + '= ? OR' +mediaLibrary.FileKey.MEDIA_TYPE + '= ?‘, | +| selectionArgs | Array<string> | 是 | 是 |是 | 检索条件的值,对应selections中检索条件列的值。
示例:
selectionArgs: [mediaLibrary.MediaType.IMAGE.toString(), mediaLibrary.MediaType.VIDEO.toString()], | +| order | string | 是 | 是 | 否 |检索结果排序方式,使用[FileKey](#filekey)中的枚举值作为检索结果排序的列,可以用升序或降序排列。示例:
升序排列:order: mediaLibrary.FileKey.DATE_ADDED + " AESC"
降序排列:order: mediaLibrary.FileKey.DATE_ADDED + " DESC" | | uri | string | 是 | 是 | 否 |文件URI | | networkId | string | 是 | 是 | 否 |注册设备网络ID | -| extendArgs | string | 是 | 是 | 否 |扩展的检索参数 | +| extendArgs | string | 是 | 是 | 否 |扩展的检索参数,目前没有扩展检索参数 | ## Size8+ -- Gitee From 5884ae4eb87560b0c9d00c1ae6845133da41b958 Mon Sep 17 00:00:00 2001 From: zhouyanxu Date: Tue, 8 Mar 2022 10:40:52 +0800 Subject: [PATCH 193/282] =?UTF-8?q?optimization=20light=20=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=8C=87=E5=AF=BC=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyanxu --- zh-cn/device-dev/driver/driver-peripherals-light-des.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/device-dev/driver/driver-peripherals-light-des.md b/zh-cn/device-dev/driver/driver-peripherals-light-des.md index 64a5dc58301..e7cb03ef7df 100644 --- a/zh-cn/device-dev/driver/driver-peripherals-light-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-light-des.md @@ -45,11 +45,11 @@ Light驱动模型以标准系统Hi3516DV300为例,介绍整个驱动加载及 ### 场景介绍 -灯设备的控制,在实际生活中比比皆是,例如短信通知时闪灯、手机电量不足是预警、充电时根据充电进度变换灯的颜色等等。这些动作的实现,都需要使用Light驱动模型提供的接口,动态配置点灯模式、配置灯闪烁效果、点灯、熄灯等。 +灯设备的控制,在实际生活中比比皆是,例如短信通知时闪灯、手机电量不足时预警、充电时根据充电进度变换灯的颜色等等。这些动作的实现,都需要使用Light驱动模型提供的接口,动态配置点灯模式、配置灯闪烁效果、点灯、熄灯等。 ### 接口说明 -Light驱动模型支持获取系统中所有灯的信息,动态配置闪烁模式和闪烁时间的能力。Light硬件服务调用GetLightInfo获取Light设备的基本信息;调用TurnOnLight接口启动配置的闪烁效果。Light驱动模型对HDI开放的API接口能力,参考[表1](#Light驱动模型对外API接口能力介绍)。 +Light驱动模型支持获取系统中所有灯的信息,动态配置闪烁模式和闪烁时间的能力。Light硬件服务调用GetLightInfo获取Light设备的基本信息;调用TurnOnLight接口启动配置的闪烁效果。Light驱动模型对外开放的API接口能力,参考[表1](#Light驱动模型对外API接口能力介绍)。 **表1** Light驱动模型对外API接口能力介绍 -- Gitee From 56295adae5d430a1d78b1abb5ee68b5017328cae Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 02:44:01 +0000 Subject: [PATCH 194/282] update zh-cn/application-dev/ui/ts-custom-component-lifecycle-callbacks.md. Signed-off-by: LiAn --- .../ui/ts-custom-component-lifecycle-callbacks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/zh-cn/application-dev/ui/ts-custom-component-lifecycle-callbacks.md b/zh-cn/application-dev/ui/ts-custom-component-lifecycle-callbacks.md index 48308666b73..52fdd30c233 100644 --- a/zh-cn/application-dev/ui/ts-custom-component-lifecycle-callbacks.md +++ b/zh-cn/application-dev/ui/ts-custom-component-lifecycle-callbacks.md @@ -17,6 +17,7 @@ ## 示例 ``` +@Entry @Component struct CountDownTimerComponent { @State countDownFrom: number = 10 -- Gitee From 3ac5676c010709711bb73dbcc38f7517483fb870 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 02:54:01 +0000 Subject: [PATCH 195/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-events-click.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-events-click.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-click.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-click.md index 25770999ace..ea96a956ce8 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-click.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-click.md @@ -15,7 +15,7 @@ | -------- | -------- | -------- | | onClick(callback: (event?: ClickEvent) => void) | 否 | 点击动作触发该方法调用,event参数见ClickEvent介绍。 | -- ClickEvent对象说明 +### ClickEvent对象说明 | 属性名称 | 类型 | 描述 | | -------- | -------- | -------- | | screenX | number | 点击点相对于设备屏幕左边沿的X坐标。 | -- Gitee From 6583bcf6532c37476e6bc9b4af732222955a6d4f Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 02:54:44 +0000 Subject: [PATCH 196/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-events-touch.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-events-touch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-touch.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-touch.md index 2dd02c00eac..ca49bfc099d 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-touch.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-touch.md @@ -16,7 +16,7 @@ | onTouch(callback: (event?: TouchEvent) => void) | 是 | 触摸动作触发该方法调用,event参数见[TouchEvent](#touchevent对象说明)介绍。 -## TouchEvent对象说明 +### TouchEvent对象说明 - 属性 | 属性名称 | 类型 | 描述 | -- Gitee From ce65068a37890d7f663693832b67d2c83cfdf716 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 02:58:08 +0000 Subject: [PATCH 197/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md. Signed-off-by: LiAn --- .../arkui-ts/ts-universal-events-drag-drop.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md index b8f35086cf4..faf8cb7cc46 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md @@ -3,6 +3,7 @@ > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 +## 事件 | 名称 | 支持冒泡 | 功能描述 | | -------- | -------- | -------- | @@ -12,22 +13,21 @@ | onDragLeave(callback: (event: DragEvent, extraParams?: string) => void) | 否 | 拖拽离开组件范围内时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 当监听了onDrop事件时,此事件才有效。 | | onDrop(callback: (event: DragEvent, extraParams?: string) => void) | 否 | 绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。 | - -- DragEvent对象说明 - | 名称 | 返回值类型 | 功能描述 | - | -------- | -------- | -------- | - | getX() | number | 当前拖拽点x轴坐标,单位为vp。 | - | getY() | number | 当前拖拽点y轴坐标,单位为vp。 | - - extraParam说明 用于返回组件在拖拽中需要用到的额外信息。 - extraParam是Json对象转换的string字符串,可以通过Json.parse转换的Json对象获取如下属性。 | 属性名称 | 属性类型 | 描述 | | -------- | -------- | -------- | | selectedIndex | number | 当拖拽事件设在父容器的子元素时,selectedIndex表示当前被拖拽子元素是父容器第selectedIndex个子元素,selectedIndex从0开始。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 仅在ListItem组件中生效。 | | insertIndex | number | 当前拖拽元素在List组件中放下时,insertIndex表示被拖拽元素插入该组件的第insertIndex个位置,insertIndex从0开始。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 仅在List组件的拖拽事件中生效。 | +### DragEvent对象说明 +- 接口 + | 名称 | 返回值类型 | 功能描述 | + | -------- | -------- | -------- | + | getX() | number | 当前拖拽点x轴坐标,单位为vp。 | + | getY() | number | 当前拖拽点y轴坐标,单位为vp。 | + ## 示例 -- Gitee From ecae6a64dcc3a7ec0d70cedc7b5218b54a10a293 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 02:59:33 +0000 Subject: [PATCH 198/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-events-key.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-events-key.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-key.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-key.md index 63f31446e6c..6c310bc063b 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-key.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-key.md @@ -16,7 +16,7 @@ | onKeyEvent(event: (event?: KeyEvent) => void) | 是 | 按键动作触发该方法调用,event参数见[KeyEvent](#keyevent对象说明)介绍。 | -## KeyEvent对象说明 +### KeyEvent对象说明 - 属性 | 属性名称 | 类型 | 描述 | -- Gitee From 708510af0fc62b65c5cfdc8338b31244be3f6936 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 02:59:39 +0000 Subject: [PATCH 199/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-events-drag-drop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md index faf8cb7cc46..d941e88d8c6 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md @@ -13,7 +13,7 @@ | onDragLeave(callback: (event: DragEvent, extraParams?: string) => void) | 否 | 拖拽离开组件范围内时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 当监听了onDrop事件时,此事件才有效。 | | onDrop(callback: (event: DragEvent, extraParams?: string) => void) | 否 | 绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。 | -- extraParam说明 +- extraParam说明
用于返回组件在拖拽中需要用到的额外信息。 extraParam是Json对象转换的string字符串,可以通过Json.parse转换的Json对象获取如下属性。 | 属性名称 | 属性类型 | 描述 | -- Gitee From e8ec164e9a2cff1690880433201d15c9dbb19743 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:00:10 +0000 Subject: [PATCH 200/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-mouse-key.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-mouse-key.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-mouse-key.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-mouse-key.md index 26d34ecc321..61fd6b4dd9e 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-mouse-key.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-mouse-key.md @@ -17,7 +17,7 @@ | onMouse(callback: (event?: MouseEvent) => void) | 是 | 当前组件被鼠标按键点击时或者鼠标在组件上移动时,触发该回调,event参数包含触发事件时的时间戳、鼠标按键、动作、点击触点在整个屏幕上的坐标和点击触点相对于当前组件的坐标。 | -- MouseEvent对象说明 +### MouseEvent对象说明 | 属性名称 | 属性类型 | 描述 | | -------- | -------- | -------- | | timestamp | number | 触发事件时的时间戳。 | -- Gitee From 2fe58a1a0fc6cc8c8a8e063127eebfaeef4f8c61 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:10:46 +0000 Subject: [PATCH 201/282] update zh-cn/application-dev/reference/arkui-ts/ts-container-scroll.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-container-scroll.md | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-container-scroll.md b/zh-cn/application-dev/reference/arkui-ts/ts-container-scroll.md index 02fcaf26213..d2568f09ba7 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-container-scroll.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-container-scroll.md @@ -38,6 +38,13 @@ Scroll(scroller?: Scroller) | Vertical | 仅支持竖直方向滚动。 | | None | 不可滚动。 | +## 事件 + +| 名称 | 功能描述 | +| -------- | -------- | +| onScroll(xOffset: number, yOffset: number) => void | 滚动事件回调, 返回滚动时水平、竖直方向偏移量。 | +| onScrollEdge(side: Edge) => void | 滚动到边缘事件回调。 | +| onScrollEnd() => void | 滚动停止事件回调。 | ## Scroller @@ -51,7 +58,7 @@ scroller: Scroller = new Scroller() ``` -### scroller.scrollTo +### scrollTo scrollTo(value: { xOffset: number | string, yOffset: number | string, animation?: { duration: number, curve: Curve } }): void @@ -67,7 +74,7 @@ scrollTo(value: { xOffset: number | string, yOffset: number | string, animation? | animation | {
duration: number,
curve: [Curve](ts-animatorproperty.md) \|
CubicBezier \|
SpringCurve
} | 否 | | 动画配置:
- duration: 滚动时长设置。
- curve: 滚动曲线设置。 | -### scroller.scrollEdge +### scrollEdge scrollEdge(value: Edge): void @@ -81,7 +88,7 @@ scrollEdge(value: Edge): void | value | Edge | 是 | - | 滚动到的边缘位置。 | -### scroller.scrollPage +### scrollPage scrollPage(value: { next: boolean, direction?: Axis }): void @@ -93,7 +100,7 @@ scrollPage(value: { next: boolean, direction?: Axis }): void | next | boolean | 是 | - | 是否向下翻页。true表示向下翻页,false表示向上翻页。 | -### scroller.currentOffset +### currentOffset scroller.currentOffset(): Object @@ -107,7 +114,7 @@ scroller.currentOffset(): Object | {
xOffset: number,
yOffset: number
} | xOffset: 水平滑动偏移;
yOffset: 竖直滑动偏移。 | -### scroller.scrollToIndex +### scrollToIndex scroller.scrollToIndex(value: number): void @@ -125,15 +132,6 @@ scroller.scrollToIndex(value: number): void | value | number | 是 | - | 要滑动到的列表项在列表中的索引值。 | -## 事件 - -| 名称 | 功能描述 | -| -------- | -------- | -| onScroll(xOffset: number, yOffset: number) => void | 滚动事件回调, 返回滚动时水平、竖直方向偏移量。 | -| onScrollEdge(side: Edge) => void | 滚动到边缘事件回调。 | -| onScrollEnd() => void | 滚动停止事件回调。 | - - ## 示例 ``` -- Gitee From f79163f22b57092e6b809a54ec2799f95541a4e9 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:12:07 +0000 Subject: [PATCH 202/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-attributes-popup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md index 1f10a1a0a9e..ad1873ea000 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md @@ -26,7 +26,7 @@ | secondaryButton | {
value: string,
action: () => void
} | 否 | - | 第二个按钮。
value: 弹窗里辅助按钮的文本。
action: 点击辅助按钮的回调函数。 | | onStateChange | (isVisible: boolean) => void | 否 | - | 弹窗状态变化事件回调,参数isVisible为弹窗当前的显示状态。 | -- CustomPopupOption类型接口说明8+ +- CustomPopupOption8+类型接口说明 | 名称 | 类型 | 必填 | 默认值 | 描述 | | -------- | -------- | -------- | -------- | -------- | | builder | () => any | 是 | - | 提示气泡内容的构造器。 | @@ -37,7 +37,7 @@ | autoCancel | boolean | 否 | true | 页面有操作时,是否自动关闭气泡 | | onStateChange | (isVisible: boolean) => void | 否 | - | 弹窗状态变化事件回调,参数为弹窗当前的显示状态。 | -- Placement枚举说明8+ +- Placement8+枚举说明 | 名称 | 描述 | | -------- | -------- | | Left | 气泡提示位于组件左侧。 | -- Gitee From b7960af7b461a2ab1c541ad3c0388e314954151a Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:14:34 +0000 Subject: [PATCH 203/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md. Signed-off-by: LiAn --- .../arkui-ts/ts-universal-attributes-gradient-color.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md index 334636f603d..4e94c8db23f 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md @@ -19,7 +19,7 @@ | radialGradient | {
center: Point,
radius: Length,
colors: Array<[ColorStop](../../ui//ts-types.md#colorstop类型)>
repeating: boolean
} | - | 径向渐变。
center:径向渐变的中心点。
radius:径向渐变的半径。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | -- GradientDirection枚举说明 +- GradientDirection枚举说明
GradientDirection用于描述渐变方向。 | 名称 | 描述 | -- Gitee From 0d0bcab85db0a41edb239e953c9c6aba7c3ed252 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:16:45 +0000 Subject: [PATCH 204/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-touch-target.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-attributes-touch-target.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-touch-target.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-touch-target.md index a8259660569..2af9b5be1fb 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-touch-target.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-touch-target.md @@ -20,7 +20,7 @@ | responseRegion | Array<Rectangle> \| Rectangle | {
x:0,
y:0,
width:'100%',
height:'100%'
} | 设置一个或多个触摸热区,包括位置和大小。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> -百分比是相对于组件本身来度量的。
> -x和y可以设置正负值百分比。当x设置为'100%'时表示热区往右偏移组件本身宽度大小,当x设置为'-100%'时表示热区往左偏移组件本身宽度大小。当y设置为'100%'时表示热区往下偏移组件本身高度大小,当y设置为'-100%'时表示热区往上偏移组件本身高度大小。
> -width和height只能设置正值百分比。width:'100%'表示热区宽度设置为该组件本身的宽度。比如组件本身宽度是100vp,那么'100%'表示热区宽度也为100vp。height:'100%'表示热区高度设置为该组件本身的高度。 | -- Rectangle对象说明 +### Rectangle对象说明 | 名称 | 类型 | 必填 | 默认值 | 描述 | | -------- | -------- | -------- | -------- | -------- | | x | Length | 否 | 0vp | 触摸点相对于组件本身左边沿的X坐标。 | -- Gitee From 4ee6e3053b7ca0dbbd838f3c2f19aa61896c65ac Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:19:50 +0000 Subject: [PATCH 205/282] update zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-longpressgesture.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-basic-gestures-longpressgesture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-longpressgesture.md b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-longpressgesture.md index 89205a74d14..ebe9c8c1293 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-longpressgesture.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-longpressgesture.md @@ -29,7 +29,7 @@ LongPressGesture(options?: { fingers?: number, repeat?: boolean, duration?: numb | onActionEnd((event?: LongPressGestureEvent) => void) | LongPress手势识别成功,手指抬起后触发回调。 | | onActionCancel(event: () => void) | LongPress手势识别成功,接收到触摸取消事件触发回调。 | -- LongPressGestureEvent对象说明8+ +- LongPressGestureEvent8+对象说明 | 属性名称 | 属性类型 | 描述 | | -------- | -------- | -------- | | repeat | boolean | 事件是否为重复触发事件。 | -- Gitee From bea1875bee91bedb6063f507671fac8c25c13fef Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:20:37 +0000 Subject: [PATCH 206/282] update zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pangesture.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-basic-gestures-pangesture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pangesture.md b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pangesture.md index b2a9218cb63..d6ef7f4010f 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pangesture.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pangesture.md @@ -59,7 +59,7 @@ PanGestureOption(options?: { fingers?: number, direction?: PanDirection, distanc | onActionEnd(callback: (event?: PanGestureEvent) => void) | Pan手势识别成功,手指抬起后触发回调。 | | onActionCancel(callback: () => void) | Pan手势识别成功,接收到触摸取消事件触发回调。 | -- PanGestureEvent对象说明8+ +- PanGestureEvent8+对象说明 | 属性名称 | 属性类型 | 描述 | | -------- | -------- | -------- | | offsetX | number | 手势事件偏移量,单位为vp。 | -- Gitee From 3e3fa98dedaf08991e035126e4cb402e361e30cb Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:21:03 +0000 Subject: [PATCH 207/282] update zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pinchgesture.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-basic-gestures-pinchgesture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pinchgesture.md b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pinchgesture.md index 95279db007e..4d87009b040 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pinchgesture.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-pinchgesture.md @@ -29,7 +29,7 @@ PinchGesture(options?: { fingers?: number, distance?: number }) | onActionEnd((event?: PinchGestureEvent) => void) | Pinch手势识别成功,手指抬起后触发回调。 | | onActionCancel(event: () => void) | Pinch手势识别成功,接收到触摸取消事件触发回调。 | -- PinchGestureEvent对象说明8+ +- PinchGestureEvent8+对象说明 | 属性名称 | 属性类型 | 描述 | | -------- | -------- | -------- | | scale | number | 缩放比例,用于PinchGesture手势触发场景。 | -- Gitee From aab3a1ddf30258e251032e24ef7c945b901829a7 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:21:26 +0000 Subject: [PATCH 208/282] update zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-rotationgesture.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-basic-gestures-rotationgesture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-rotationgesture.md b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-rotationgesture.md index f9d55455044..5c2a2d1d761 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-rotationgesture.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-basic-gestures-rotationgesture.md @@ -29,7 +29,7 @@ RotationGesture(options?: { fingers?: number, angle?: number }) | onActionEnd((event?: RotationGestureEvent) => void) | Rotation手势识别成功,手指抬起后触发回调。 | | onActionCancel(event: () => void) | Rotation手势识别成功,接收到触摸取消事件触发回调。 | -- RotationGestureEvent对象说明8+ +- RotationGestureEvent8+对象说明 | 属性名称 | 属性类型 | 描述 | | -------- | -------- | -------- | | angle | number | 旋转角度。 | -- Gitee From d24810201627383bb6b305ca38301678cbe44828 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:22:25 +0000 Subject: [PATCH 209/282] update zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-media-components-video.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md index ea36bb58f04..6980482f352 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md @@ -73,7 +73,7 @@ Video(value: VideoOption) | setCurrentTime(value: number) | 指定视频播放的进度位置。 | | setCurrentTime(value: number, seekMode: SeekMode | 指定视频播放的进度位置,并指定跳转模式。 | -- SeekMode类型接口说明8+ +- SeekMode8+类型接口说明 | 名称 | 描述 | | -------- | -------- | | PreviousKeyframe | 跳转到前一个最近的关键帧。 | -- Gitee From 032b4113012e899e2f5c2258f05d4420b7add060 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:22:51 +0000 Subject: [PATCH 210/282] update zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-media-components-video.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md index 6980482f352..fe0e8e92dbb 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md @@ -25,7 +25,7 @@ Video(value: VideoOption) | controller | [VideoController](#videocontroller) | 否 | - | 控制器。 | -- PlaybackSpeed类型接口说明8+ +- PlaybackSpeed8+类型接口说明 | 名称 | 描述 | | -------- | -------- | | Speed_Forward_0_75_X | 0.75倍速播放。 | -- Gitee From d544b18f77d86d3e3ab45db8ad4e2da2600aacbf Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:25:05 +0000 Subject: [PATCH 211/282] update zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-methods-custom-dialog-box.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md b/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md index 0978b45c9e6..566e72f4ac2 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md @@ -37,21 +37,23 @@ CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, aut | BottomEnd8+ | 右下对齐。 | -### CustomDialogController +## CustomDialogController -创建对象 +导入对象 ``` dialogController : CustomDialogController = new CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean}) ``` -open() +### open() +open(): void 显示自定义弹窗内容,若已显示,则不生效。 -close() +### close +close(): void 关闭显示的自定义弹窗,若已关闭,则不生效。 -- Gitee From c5492689df8cbd2ab56f7cd9523632756bbcfda5 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:25:33 +0000 Subject: [PATCH 212/282] update zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-methods-custom-dialog-box.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md b/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md index 566e72f4ac2..494d326a3bc 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md @@ -39,7 +39,7 @@ CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, aut ## CustomDialogController -导入对象 +### 导入对象 ``` dialogController : CustomDialogController = new CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean}) -- Gitee From 5d95ca4e84f1e62c0c523142e9b6f96c65fa2040 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 8 Mar 2022 11:26:47 +0800 Subject: [PATCH 213/282] update docs Signed-off-by: shawn_he --- ...us_architecture-of-telephony-subsystem.png | Bin 30154 -> 55900 bytes en/readme/telephony.md | 103 ++++++++++-------- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/en/readme/figures/en-us_architecture-of-telephony-subsystem.png b/en/readme/figures/en-us_architecture-of-telephony-subsystem.png index a86a2dfe63a87487f3874fe7389a366fcef3c2cb..1ac14c2b557895e673c98cd84aac3d810d1d9b82 100755 GIT binary patch literal 55900 zcmbTdbyQT{8wQF}3P^Vg(v5UViXbW7jdXVjN;gV(cXtjwz>w072o~`hp=;T_X+C}M938?(r>6OP<%gFRKjY&3 zy;PAn!T;T(iKIp`kpAz&8OV(a|9de86TAKQ6pjq`clLinUztwH{Pz^T1V;ORPleMA z-|Y^Ec^qQ>8?H_|cJTlAmA(8VMvbU}y?hv&!Ct(nzT zWVIsa+E=y6`f7?-U{M6ng5%8NzxTdFCUUzD2j2ZO9M}OwULjPKBK*wpM%~X@RmA#t zKxmkT=h36i_IE(eTf;e1n~f%|?T!k@Gm;O`2J$1JU4n;;I}Pw*5<20Fu|#_K<}(Mf z8p={BXurTyl#X9ISaJEsaehsGlMeC~2@BCrOjI zM&<=R2W#I6TgDl5BOgYGZuR+L{Pt+t{>hq#{q}3tQ>bNK3iZoWBQF{K-D0~U(QjDt;_Rsgp3F3pts@*D&Den0vk;K)Si$U#d> z(r)MFMU}XRR>E`yV>qm{#VWnXBC1bU!}LW{3zLRP?KXrwXW6cgo|?@|YgxPCziE0rOGD<^6O)nQN9DgW9>e0%dgU*fZ_ z>(1=RTQZn8fBbuI{NGmKNp@~*;!un=t5>Gkd|SS24lhQ{F7@p^-Y{~xnNzKTnG7u2`N6JBZjJWddkOZhKW@B^x&CFLjG{k6>?j=MdM_H& z${n*DG1?nlBh$l!)*l8Au%I3qL1p6zv=@Hb{-_`EP(~>+6{#~!xS>pz3oD}Dvu-e@ zyO^fx5+d%R@VVv}i?7Stzxp_eZM(KKK`eM+@ovl;tBoaEzj`MnNW|9379{v9E3Lr- zX^12>Y}O$r+E}+q&34>?$7Oz1(CR`s*_(@+KEKp-Ct#5>y<)WrsW9-}Q>2>#rI>WR zR%{$BsDpQ3y7&#=Ms}nd)wTh^Di)@T<&n^)aB^;lwOIx5-(z4bE6(rU$4y>7e@0D(bvkuqUFx>~n zp{1x7*KXas;gGl)Wrdq1x`CujJwg(I$*45-@zJ(B;O#-#xf~wDK7Lz2dA*{&PR)HG z9~QnV5M;gOVDRd5=b#5pZH_?l&y6Gl8&TEWQy=nGRTpekx~V)=TuvM_k*Gqr9%Pi? zeu6R^pwR3R`A(?|Y>OHXEY)i8zp>2LG^p-f)U&{LqWUd^fa6IUe;3$Ib)(K?AVh13 zB3I*;`Cytc&Ym8cU@*W7K~58X^{!KF!%L1HkzHXTZ6 zE6h1TNG;6e!gIOX$<}5UL}c-fCbF@aSWvNWZBI1jwWTrVq4nl&9OubzlT^`XLubc! z3_)Rf(?Y)hx*3mt>icU%PcE^*R9;1towa*jpK<;nqRv&lcNgQ0xt~)aegukN20eNu z%)?Y-xQK%=ix0g|Z(pTdIy$4G9JZuHnE0$~u}g)%qVePU{ZmvQq|~w0 z&brm(aJR=wx_g`4s~s?{*!8(6s|xhf86qFe3j`f685OP#-emcYpUbt^^IxpP#wqM3 z(_^Bapr&rW-o1qfI!(XOjE@u21<$K7DKknv&7u8g(nD*l#bK|0k#0m&QNBKkaGPG% zUkxnBDNW;t^o^9Y9u~aBFYCUT!o3Lc8N$mRe7!4Cjx`Y!af0w!CvFu=NOSxm?V4Gs zGC-Mj-QAP~HBm&x{H9Xm6PG-Bs!)bzmcVJ2y&a z_yj2S#TiRl3th217238YCjNM9w7dKzS= znlVByS~QlH0cw2_^pO@sgIiPfv z9gZ}c{-ci+Z8>8fm=2f{hMEYi)DIl63UK|!8Z}^+>kGqkz@XLcUdOoM*X&^31`Ka4 zz_+;5E~FA853vb-uUF&B9Z1l??C)hM{z1@-mtQH&7RW_7y?D?#hKCj=vvW}+rRTo| zEqbl-rnY{@Vst%Wpmk3Exk!0T75Aq=n)9kj3}^0zCrPNV>{PPxc$A3qx3P$MM2O~2 z^o4-4VYeKWw!Ov`rb43wxi*VxH}7VtnyR3Rtb<%HM0V;YE8aEcAkZ{SJCe9OKSYaW zgozW)G#jOWQEzpJMW&XQz}nS8CNo_V)5;7h5;K3+BT0tWeYz(R;?@?0JhTShS1mW9 z8TOgQm203R!AU~g7cvmqmw%6#s6Kg>JWkI#JvdYOB9l1_Kir)qA&fG-NzBt`K?lhq zlo#a2!~p6vQ$Lrr7Dd~SazB_>yCzwtY0h~9e?pSH1IHLP?`H%Q$2H>4ua!Jy<=J8} z)@AvIucV5KLfBu^M@gYbAjhEBN%I!7w>UZ$Vnk>A1V|8a;HQ(vpjVJ<0MxNbG?vlt72PF!5Yuq$= z)3m$hCQcBlKKRwqTEvNL>f^NBsmtW3Kaq~BFvO}B&->8OE6;BGA22AfKPE6Hn$~1k zzB|;Y9>rVljb%3dioqXAh{<}s$m*Q^JDNXU$O_-Z(vWss2uofaiB8eS*Gf7`Kg^z9gg2|!`27LcYlYe1J-{=2xaHca@K+EAX(}%p zz1H1g#T1ez-Oxj9$EzY%OcD&*pOO}_!_hd}E_?YOoFug3yfUAkh*Fz%2wxt3J7E~_ zzY19y+^2cCD|xkmSZg(@>2^H3dM;|URk=HrQ)@D(Y-PK{GimGjRx=@{{YJpK9@Q)A97WhVGE z`7SD@Q3QKn)6j_p#sZs&$t^cJRYBqQ(!5W*2qZ#R;Nt+5)4}1QQN89*PzBkOl!6KS z!LFJ2->%;K7bex7RP)rG=+gm2T$?o6XWER~M`O{xNny!re5#FTNZ^IoZjOSPbQ$5f zb(6@OgN4U$mpKVCUk=Tt+*?d1=zw_!HR}TB&+}W|QCl$w58L~tu{;(ik={9%Ut~VO105xv+5Ax=XJFm!Tsl0229nvPxs@kLv}_4~kd8cs$D&#aprs4sw=pRgvpm zm}SAHA)ne)P3p~F7d8{$^;isdTszkcjroc5w17o0%w*E144xtUg;=iq^fk%X zecT*L83kk-3hfen`Uwa3_5_Ugogy8OvNUTAGarSl%6j#_c9>-)zC1inwUQ@2l2HDyeFe>Li<^OHWu4}XH_dJ@YbMV%hgfc(YK+dEI=?(6h24^! z|6$s8HU+xI-vqpP@_VLx*r5A9)eJ(u-3k8GTC~&3#*JcVp7|?z9+|*-D>m(G72{WY zuCb15Yx70sOA@v>?G4H?;cIO#bD$C1kB{YwyNTd?hH~`s+eA?l@Oxm$s(N)uKv=Rx z2awGhVX(Y32T^Ch2_b&7;_oicRvokfX0XZ_NKa9I$!u{`Rv)^D@7zqE?$+DQq=xzC z_WY(X|IKM|D!&)`#(UIjAk2lp^san4lk7KkmV7_Sn~dEy(o#;+8mFew z61?3JQ=d8UGfn*A(D(WpV(c4I_l;*H`7lhMaAZvO_@+UEhL7ac_-0jo76gxLti$ zgZ-Au3)@3dW1>^H&9|LpAwQ~{@jJm=Kk9AbSW5X;B*LrnL)1Rk<%)MuESHIUvFHk8 z{UqY=8*XTayzN_!X!X!}Y1mrLpAMFIItGS@%$%R20*ng|Yr)XF9_tzGP>K1VW~=w?*iT218LsQk*()UAV(>BOJpAvL*-GleoJ4f+|^+ ziq`dzAP=J|NO5x)OX5iwQ01$rSuy70CsoCBK-jO{L9orBEmJ;*30#caCAiRKK%EsNdP|V413W?)tzI^z`JC-^*oW6u+ zv^0_UOW!`PBgEx538ip4Ua%^h{EAEY1VLa^ZUTGL*IRmBfn;qe1r08W=C)juoAAG} zp>6~yehyR^o4gl#asAsCbjxh0o)XT?qVt>e9&Uy3J_&j^kfm$L?2u7`J!STWr&Az+ zkzR?V?Yi&!)F2$izk2A=@$uURKho5IA5S8O-sNRB0@@twXKxZYvb|rlbWs{?M}_ITGvaKQ6Yd7Fheyfjhu z`2BFADb}(f6*e0@g?(C!V9QD`2svpID)$g2XJl^M?Ny>JHoc4vb6QtLKLdLM^JPlV z6S$ug9=bi01-psi*~+eb5-(|WvGj=jp!`mOxQ~v}=H{^1+X`O(&wPg}TODu1!}~0T zzsQP8HJoG|i5wc0$(q?!Ii$O9tvh{fWWr7!Qgh3aFBp`+>nRuKW=QMJJ{RN7QTJEq zcFPPOO=ZR*>{ZikAJA!RMxxZ8a`)q|4ur~dUO@=;zNt5Qiy8XtA?gR}8i@`7gkn0j zc34h&O74)g0bfOauhjHcEL_Vx^6iHs9GN|+V^_UMRXwUP=NupTj z*q1ILC7V8FdmklKli+CJzf>^&Q%=8P7O^5Aya`3MoIqX?Nyp6HjLC&W8$Tnw^avia zcm>`}1}tOMyb+T{l6#!$(h_O+jFNh6w%TgKTL(5+%`f1gK57~4EG=!pc7SZ)rrfPHk^Yko zQhL}kwwB~CMY4B6B2yPL&!AHi1z!OYk=tvM)XOY-Kl$LdneV& zgCAjY#0T4RAePC_0Wd!X$SU+^asaa5Jmasf@ve)Lz`9-_R;xn)QN-}cW*jFY#Ep<6 z8exqzebO`2J31xl`cYKWle8wREz`htIRugVJU4>P8 zueJxO{HPt=Fx=^@0I)sQb?x3-qgYdo+VhX)5WD%=@uBYFz{ zJ9#J!MZ=7ED5^r^Y;TF`ME;IM;R^g!G@c1dAMej47Lu{a^f3f?kh-k!&cMAp_HW?#~Xt^Ef z`KqU?w1j`N&;xHtnRI(CW8@nWZS=mmxzwhYD}HIsp{zb`1scfq+j3O+X44(|Q95K@ zJYe|PKYelCbN?A7Z#$r1?w?V>uu(vts2(3;gb4$-Pm@ zZGriEI)y2cYg!g{b_9ubOfa>=iJ30RJ`mLb;a#+|0wpmPMu*I5U=fJbS}iL((}%A< zOw?Wkd=$umR{X|wP1*HS;X^$O?drXO3;vL;s%n{Y0A-O=Ne`y0f`ww+h4gXzb~Ot z$ds=3UP)e<E9whyuGpf1oTJP?rbb`z2gSv=RuQfq|=PlQ%t zfB=*12;!qx^a>ZHHJGhT}(@-kIWd*P28J?1MgU zBieppsouX zX`RJjo-CHVtAVaUD7h*V2KWWUcPJ)v(4yAR4zQTT-FIB#&F&PJkWTq9Zm;v^YL7t3I9@*(>G230-5$~E2KI9#~W2L z)Y^lZrp2H`fp+W7L3Fb?vS4wBz_22ijPl8?Qw%yj+6NipVUCxkojmZg80H&NXuk#(LC;suTBP%oKZ8DI z&i%gJ!3QDeCk`PWaeb+)^+ZAyg-G}@uc?}mXzEez7{`o32D8e9-mG|tj_yRlJUI@v zhD0IM){Bh8(0e38=@I%$2Gdatqc&5_s=zeXQ^9<-v*9^reJ-Q@fOAn#Y3b<${?BP& z)%nl0jwTJ$t?`n_8Z7CF+jQAYm;EMJISej7Y3iJ_rpqPZ=}$F5d{?ssD94Smz8m;n ze>unp)IEi{k+(xdL^y3*vZrz;TJI}f`ng8bLCrq;Me>RRVzd}KV~n)Sx9inX{Lq0f zAPE&s4s;hHt^kn%kCPW;de#a%tz+p`k*`J(I2ZH%DSW~=?VfymF_Uz&sSjvk2frXP zGJo1JA6`17uopDPj{J*UvyxXIi|Kr zKoYJ8!sNW}Xr2elPz-;JJyDrP7bT!2ZCma!>mb(aaG>gUPO%0G_wgFliS@tKrj+3; zG;uuUghH@_R3l#ar40WZ>%t9uX^*3bV!ahNsbBYP-BtQ6*%`N5G8ifqk&9Lh<^G>w zr7byJV~lkK1%?doTnh+ke3OOQQaI6w3x+_4%%btz2_y0Ijz!fiMGF209+;*z-q>lJ z5Vr`2MQ-y6tDolwy*iafbgJbx7#aqj~IPm=JM8XUT^qo?G6n!53Lvs;IIB zLmgy$Dwm;LUD^jJ}<`+3i7G|HIJKG;vsbCkVDlQaQj1z6<>G>Ds zzp`=b={43#4w!JnHj`=AUxN^&dB6!~b~WiFglE?yQ1`4opO~h=7TGh3w?#s#B>&;+ zA;{mWxd(D9#zMHjXw^z7`@SC@+$(=d{Do=p>FK&0=f2`*ztD0+V=qx)SvCmY*n13; z0aVJY;rSM5LD#`c-IRTE7_t$!Za?6lYUu-4NfdK~3yWbmyaPA=hS+CrVR54fF?}|^ z|HimKXJu+D_W93#32J^sI(wg2{$Bz>k~oTidRmg+dEa%;+vD~?r{})8#ZD2bK-Ppc zZaV|x|D6#@GMzTKmP~sYX2vot(@7(C0Oi2YVAvK1;b_> zOle;9-|95J$SDrt{fD!w8V6U*?0yyJV|{p`W4)g{*wt{w`M>o^Vz%#~Ct7v7V}&*z zgf}zj|5$M)qdguI5KaEy3gNw|QT?ieVM>@l_R|9vd8GjvsuD#MGG2{D4&ROC&j0ZK zsm$uf3br;~{y(Dn!6SgDAPOTx)PZZ`|KYzoQpOSsoeS}9P)Ur`Gm80B!>~cBjUaTN zmX}g&|JL#hkHWEnWXkXCfj>Y>A2(c2B<9B?kJx{2|69p$Nl$QfGote|@Uqr@h1}1L z;B12hC07FU)Oxm**3&Cx{O}KJ-eE1BN4K4i8;pl!_eQ^|s0$eSE^rQ}Eqz`_{<^$x zv-&)5_b_H0;ZChUxYW#4 zzR;7wxc62jGaDIB+DJwLg9yAfv(ga0DlR7#n#0+$f{$=oN0RtFobi%hO6%GbkacUwydx9k5H3ewW5GK6n4pCNv%`mL`9w;IYE*4n`{ z9UQvNUnB0XA!hp%S+~A3vJc&7p5y{fAC!^RYg8%x?{6eF0{s6PS^mY~UxrTp=!rqc z`JGix0oXVJ4kM%3uQU$EOGv4lf_+LgtI`k6o#;EVggvRDKz+OA#*tLRQdf0~%)mc) z%qp~S;T++d4ftB5P*hp8s@+iagE2A_Q5gy(9#Ix+oe{eq_7plV*M)EQR%+_3FX?%# zf8&2L^*df}y5|4(9Tn4bZd9W^4(@jR{^~Km^ewtkr9p=hG$KR2$p*aA!ErcO5#|nA z*jhOS48oU79nDSrvlE|85;pO%`z5zOJWb*F;s=Mtvp;6`Ip6Pni)_QTlq5-I!aX;o=_%k*$iQ7x6QqgQ71|Pip-wBpU zg3ENEEUPrXk@2MI-f@3@ToOiVe%@ykF#hoz4oG)iJnG+>rbf5NR_|wH!A11`PsC6X zXs$y{!SNb}_+f&s37^t+rmSa4cbla04&NmvmxBslC-5P>;~ILBorn6m98*irbFGqg z@MG;J^iII(3_+;HF)p+UmM`0|$DE?D7i_=8jp~U-5qS++sL;d;!ypN+s2T1vG8H>s z)`584HE)gQ4GDQwR}{}na8y`X8SN7cQ|@$9!1ZQh_Ls>eyUBH>)!F`FbR=r-5p`zs zq!TMK13s8PFo(WTYCRXo35v?XP@3pN%FGWqU3%+NOZ~liqRs&Oiz1wokY^YyvJE6* z6sjdk$(*BFz!0XQttJhc!Hol6@>_1gs;x|iDoIjdm*o0^{qA08kx5<$LquE*#SL6o z0L@L{h%489^K_3w+}jQntQ($90@miL8gMe;Ww^U#JbZCb;>B==bHGD<`Sz`9w7J%hE-B^X>q&J*B5<7DhT6n)<)`RNt-Y|1Ef5z<{Iu z;53{~w)->nCU522Yb-$mhF=e;`o(Z7DA;)YI8|8I!P`e0hGjOBZXp-=K=Jv0>;2~^ zN4|AG@Jmrm?B3)<>8bfnZ!8f`N3xr4PVKlW`@PxMJ>M$07(K8ja6pu52)tG#egK>? zgXrJj(EABRTAFHYNGE=bGy z9OvlClj??IG0q=$ljmkqzbjtq#^4QCKYl)elu5dd>_^_X&O_6s(S>RiuXkHmQ! z5_lf-s*`j7*{PDwYA8@u!qLD~c`D~9pmY0cCf!SNTCEY{y*O6O#Zpz;OphTIH^}<9 z0T5IU2}zC5ekWGhZ=Nlk=8)2RD>h2E#FcH{Qp( zFWPrjC`}?GrH|lN<3aH4yl6A%dPe5#8bf~KJA7wGfBdy@ChjwC7xQkM-Y}Cs6%xNB zZYxnnqij1ES4}|?hs#e4+LBgH}vUIxv%zeLMCO;)Huec)OA+%b`N4L(0(%g zHQS5U@|lMW?(+vzT8KCL6|7LPIjcY1Na1~3p{(C&f77Q}lS9+}oCLl1K`JOG6O!O% zyy(AfCy^h3-6*W|ixivpv=N$?RQR18Ph+ zB>8oS_!fmuoFZ!!Z@kdWP@Cx{lHYEdpHdZ3OQq@Kv)$8E{=xiUq?CI z@|J&V?nTdP5#$QtS)HO}WulHKrvabo$mNmDCIBxqc`EmZk5#HKX&OYsV7;zrIRnbl>5J4#VIsRa zMH-s&MM?DbW_zH=PHH*I?vyihKJVIn}BEB$eg-9fecW2m}_Z#`U?C`39_~{XI zNG}Jm#9B?r*fD%UdH95cVlh8YZ>MR`nER5A8k~>o)|^iE^{(ORU!)H+zXFnkQq^G@ zR6Ax!s{4?w4eo6_9;x=$Zxj*6L0Eka^^5s{dxJUy>Wm$yeSw2y6oXzP*G#VRj5z%Q zs`KR-xX-G?-$!Ae6}rR3?7(Q#MfQ{EY5+yNl2oqxquTNrKr}Yzg^Git@j4ILpsQwJ z9FW8DvWDD_3HK59+=KcoNNIrDg|I405g4n;Qw%?=Xg#IAjkniE&dJrDJBP*Dh$Ztk z(I|YCSq`L+$boJ8gi_f!0IS(k7YFmc$9fCMLsg7sBk4WkO{8_ewQh2a)5P12>#Es~ zHcrz0TQp2}MB<`=gE~K8+Wtk^5Wl!5B%ol0+AUpOfX|4FFZf)A|p^ z48A-IP%?P2tbkIAAfyc|$Nxfb724DFb%EmSKgx{=kd z4>cG1RVdsuMoscLK~Wi^lm5{lSVDMt`_!Qu z!DBE(dv@$nLCM?8(15QDWWO1gzXuC$JA;;%mg3O&Tg7p-}#QfC)^Rw5Y(4C@_zcFldJqW=KybZ!&2&F1>lGy=LyAsVkoPtd20_+ zt@ijd?0>subgWY0ol^TK2J4>z97NR-3!8GvZt$pG!)PJy*87dH&?)#Y1@6-HDN1^I`pL9T{wNhA=PUmQSfBwj*;H=L^~oR+M&F%Xw;8 zWlyiC92rP4>VJf;)r1NBoawq*ww3$zNdlh2Ua3T)xNMl4n{TfBp3X^SI#bEE7~gDH z;28}jE$9b@#*iN7SwtP6=7UwT55nYLReAk+3asnUL7biG(!3_+8$9WP!Lwi0yM$}0 z*ke~#vD-~V(SfCClJ`?xzMk~+1@Wt4@OZr|R=N3dEw1goi}Pn_Yb}btug7!L8(aQd zW1SbtPu-v0FB-_{f$%aUWGc8??7Qm)EX0DmcUqw)i476Pq6b0>kZ?B`XV{b~}xx}B`*Xv`Wl*(Aw>n{4LL ztg^i=BdW?(?|w#HBcl`MekoD10XS1>e$IwD@0KSmwm4Fyx7ftymE@2nKej?Qy0i^i zQQ-bTCWFsjrK`Q7%p#*7o@MoizFBN{XAv6m_^?(0;ePypPsa@Ja>RdUw|K^6HM(V) zFJG|c`2fRRV}k3Zgxra8s8X|g=&mjzc5vgv~Jp6u5QPtVCYIi($Jbih@3d68*LX?L&K33}hC}M?0k>j2mG11Vv`!7@Ydbh$R zB|wBgW3N4K(IiI$cCS~6Mr|*!I-e0Qo)-((H64$iUi0|S(x9oe;`vD9Q+OONM!=oT zZDs#%+(YcciE|9r;ah3xKX@)vbOgswsGz{?$fJ*6oOf&0SH;aZLJi|1(S1`^XCaZ3 zl>Mzm;%2LXp=M`w22*WWT^&aSO+NDQh`|Z(9}RW$qO1Gk!b|k(cJCaK(uonLr4B0& zQl785FpR%d`^j1dg|Og+d_c?Ev>#YO`VWz=6zL^{@zkAJ9oQHhLj)q;de-?alRFo+ zou?)&-6!#4D3m8WUy4WlN7Cy~o%dD+#&(Hpq6glAb59;+2 zk@r)J`~C+_ z5R9L-@8~qJXBFU4@nm4DWujo=Kdhb_GLT9<;N^DE=Hu6cmXJjJeV|fujY`5MZ3YKS zvsWDDjusF?{_BrWvZRS7jVW%!z;D?P4($SBe)cf^Lf|`^QGR9h_=rwrv3sO2EXtwr zf+ws6Lti%bc4GlGH8=o38&`T>({+=c-F{T+I(X@WJzBQ|6?o0jHufUt=ixF=wi!?U zzK%|Veae~P{)0mabzCd}=yZxZxflyvrgjkQ)#ivBTL}#U z-6;ZJloM}TG(yMK&^h$=A;kXJq4I^3f%s~+>H2MB{ih8$Ni+gP{xm9vMInsw*ZBsc z2Cn9ZIy{@;w`V8C0GM?)i*U7_m*kijL&x;p+>z6Ul`+rzKJBu5?AYN?QbuU6DNi#z zm-sc>uVE5p1_s%1jnBZtdQEm~;M3i{kKB(kGDD2S1Tz3(I6H$FfwQT8qqtqJQ^er# z(qO7+y^X%a-gridZpN?u%o^7^>+Ry(iztrk_|3U;4Lnq=c8K{1^uoaZdam{10z}bK zQQeMa(C#+&>4B^IE~#88MSZ_C^y^eP zh3-(3WD3f)v(qEhtwoHFb4nnH+j+NO?R-7dJ@x$d+=qJVygcQ6wRa^UP0Kr-4od&^Mlz|q!Ab9!^?rR}mGk7dbHD$VA>@|`5xqB&q0&nhhWV70|ngKCI-$~927EyIaUm6w{I-7bakzS~6i)4RYj*}>Hb%?yqYz|xs zz!0K@ot*jv%oSFfk*I+7vI9ARSvl7JS;Bk@oV^$Rljq$vDMP2lRys9$C-%A3A zx;dni6(3==RI&f^E2Q{XCzTdM19;0x0ZL-CP#pvB{s?=xL+0ncknDIaJd&{y(7oIC zi6eKmck=2fp?n}Pr+G`ew4Hh_ut9!vn)o`|Z2WRn1NsRHJvPERT1)`C=-W_ICyxsS z!tS=7iJ_uZ`Y6t<`?|?9t`tZB2zbApF_2$X|9vIIy1MwdyQXaS${X{p?Z(?dVfrpJ z#%TTy$(QY{#SdR|5c7ueej%{M$Kkw?$dQq9y+y~_o-69!UYV6L;FM+XOMsqkr%7D@ z73SL3f-;lXc@lEzxUkZT(2BcDy%D!}ZD0Usp8 zw}W4zldQ)U)&Xpe&fd_N(e1YV>=?_jCPWIbpm1a@S)TXN-EQb@qU!WgvOR6F7jAk; zwsr^jrX8=0PPqC;JUcAj=@!+kGS3hFRac%)Pv$)G)~z6r~``*;=Mb4>MiDb<6E1>*8*)&6u~cjuaP_s%xf ziIu@;AFm4m%&YpPlrOeu|cei;x z1#d)R5mK;<`RzEVWc>|&$Te)!3TjU~=i6;L(YA21(+-z0xk4@z@7}?*Sp$A>e)_dh1TF zSxEVdWXoZf$)G{b-6#KMR2|_+*HcGLk)y7pYHO*3d^&Ilgn~|RwAHee_u=|#^OrEan2DEw9ephJ3oD+)9{oH z9b8#Jo-q+*wYxmmr9XWHw?4iL+jZCfNCe~dbp(M`vx&w@yxRsh{4Qe*ai3jWT{Vcf zT&PxJ1wnPWH-N=3Okm>n-62$;@s9|uJ}_#=c|Yva+M#XfZk_vI>vc~QeQVZw4YJG#b6=9z#loVqd(Uy`Iezds#xJ=ykwrG!CU6{P z9lP&Fy_RU95UEvVxJ#^k2l<-A8Pigr>n3d18qcxHi4Jy~)X%&oO~@*OXgs z;?7ihy%fUDmm?k+>Cty2KeZ=O7(&qqvZ}>%|1Kgk-B(igRY09j&)Jl^W+XT71o5 z^E6rx+gj-)=GxB;LK?F@G`-DBqrKRW45nULGM@YLdWw5wkY zzZtauPdTQsaTK*g_4C}-D|7S0-B!rO0R3B;qa!5I_4d<+VLT?oOtN;P*SCwD6a8K* zL3Ds>0EIBF*-W%)`Ng6$tJ?l|Ayk6}oQ9u+hF!=!RlqxPTYZdZ*V!C3Lyo~EL~o`E zqRWJx8>RQ`qY}Bx{X3#KNmqKRO& zyk{WK$>oi2!}TKbU|qq9YrS@c_nUYFa*;&j&~L@=LM<06F1YzWAf^$f3Gdh!Ep=ra z92c5a;6>zGRFPMXna?QTw*h);0Hea&g@a|W?H5~{{quCJGZ0R7jTGZ*1vn?o<0GN4Mw}JF`1kSJu~YY%zi|ds}dp7d;29dEQj~S;Vhx8Hl^>R z8Ohc$nx#2OYREK4nZhbiXRs{bO(NR`Pp{43jrbc7N~O2B3>H4hdc<=U>;)yvE`)N^ zXuF$#dpm}#)?^K>Qhm+FZaFim1I9o9MV<2S(~q!KCX$n=uO~=_dj}a^tu{X5Rb03> zK~8>>mF&aW(a8;Cc#0_0PsrJL$O-ztuwuqafZdDxyAMCcKW#$5QRjusX7ZYwM4vDF z-f=`8nv%&f@6#An2WR+560%aLRAiX&xm4V0d})sNu*)&ict7_v3@5OA!iG!E6Rbom znwZ99n!TSuWaq@tCJ9mhaiaZDatpNEMJF*VjgvG~jkiYR!b5)yE~byYFz>Oa8Y#Ca za^{7ZcCXbwk;d|Pcbm7l627Fx)Azprlh}d(J?j6mjFs5~u`l^@h6}7aZSWd<19x(8 zm84Ce*q5A?&!#l&NAbzD`*e}5)k6o=h*hUv8(CA>^F;mhPh!>sYuJdh3#nk$gOZzz z5ateIFw#O7i>D;>#Z{eNJFMW+fBk$B?Pk%reew=>s!?fQle$RZC4l|jT*cfsM7 znThsR56gc|E69S0W~BD7J%qQyI~f}RA8zJ6O{B3V>5a&?XQSAG@Q$?`z%hepm*%-f zlu?p`$7T+fO=AJ$x}a=2SM4W5vvWPk;L<8;ou3f1Yr@=5`=#_~@Fx(LSLX?KvlD}Bn3<}PAc`>6Y>KV+YzFHOyd=}uJL zq{?8+YDaRAD!bdsq;e0n0wF!`$sxqAwm)ewt34WUQY7o3fU0RI{?IrWmZvTtx%#^# zP)c(lPWn^3o|3z2R^$eK$2*_A3FNe2<`ErG6w^rQ-;L5$u+gY$+=-c%8zvqMUJZ&_ zT&U+|qA=bm29}vh|GW;eBSfYABc?iAmk=)~^v!JQkI0xJ(Ly$oc`V_ECfhHaC}Pl$ zOjq_yq8e8fm8u}Yope+ldz2yVd1uM;SC&I47eb+McSz8tJaCu7T>Ych+|~MIAfwYz zJ4*4;g3Qd&@!DP9{|0}@2W)@1Y+3%wH#cI4yS>^wem|Af6b#XSuw3TXZin}*QRxoz zifCP{gs5g-+Y2}M=h4b&w>VS@Em-^?e7#jvRPP@ztRf&S-5?+#-5nwz3R2RIq;z+Q zNVh26Aux2;FocxS9YYV@H4HGsyYcrwYn^p2-Wx7h1GD$j&!@i3QUjk{GBTK0U7O6m z8cH~g^~`BFl$q05y&X-9;3dV*}X6(x?JtPH!r9 z8*gF@T|nhEpqbM@_B(CZn@4kyQk@xjKduQ;sUr)`J%(Qbq2$P+`sjuY7UQvx_#S^} zjESU9)(Jrt{JLt!4F!VEYu#%jlE^ZzWr)9zHN*Qu2IQUF0o$I4h1grAi(ATm?^TJI zD}N-9?x~24E{&^X1#Ei6dCML5I#sJuCQb5}g_R-hk!w#%^6iht3i%h%-=Z-q{DWt$ zxHH6NDZb4UF6WSX_6+X|&`IjFw-;CX5q$KlnwoanK8>k@eEML$Ip*9Y_4kdz484+I z@yVpRN(qU~Ml*{(ng7O=cBItxdH$Nc?;G0;whY6%0@`T*P06K&z67!)v$?=nU+k9mdfGJAX0-wC%(Ei1>8(0?oK*@(!`Ro;W8f_BA?PQ) zuqzQ@!Fk6{(_O0&5lcFfXCeg#mr@yGW;`_Ec-#Xv_ix#+PxNn&VuZL~ z9lby^kfLDVl0b=Q)BlZ}iU`_6EQsDXJ8Ca#XRWsqMtj;_jz}b_#JM#ueP*dLKwF<6 zhTqk==o>c=$v;ZW&o_E+F?G8m#dBZb(NgL6r)Z~CyS(!_nFQ8{B-BhOswwHSh*uGw z!ctcB$!!=!RT!4HlqMDtoVxxyP#}ZfRzsis>F+VC>n(>PaLIHBD?@f4-<*%Zb`5?o z8s$l!7tnrtJ%W>}NRS+PNiae2Q!dB4^x1c)0VCa$KM6&uvg+4#RBzafbk1ZKZq3kk zC4YQLvQmCzB#Py}S1;F&Rg{A);BxlNd7P|KB=A4zjwxx-2SY|%DtNW8FZVsnj9Z+8 zQmO*GN~F8^=Qn2n2+=OT6d`I&SeFxE!kv4C3SLcS)XkcA9D4(@Gw-Uhxp zLdKec>b)vLSZRJ4w+z3OoqJV{&q6YH~tc&gaZQ3!J|n5)E~KDT{Hzl?7?svEPTE8zq zDXJGpZ)^~=5S~AYOv4Z6X)}-N@_VQ5Va}-^&023V-NuM1`?&|}=k4qXLU~54!45DN z4D{Y%p;z1;vtok}U2oJ&aRA6NG{Jg{u0&p}GL&Bn>`gMh3l4py?LH~Kr z1QlEP-ePdCH2RnnKY=h`dB$d6zxG9rCz{$h&)$=vbfGw8)e}AhZ22Gf`I$LAHF?1A zctx5@)a{vkER|ZbimYr9CP$I&G|Fc`MSDN^qCeRvefYJ077(NIi<-vULTuV(Y`$G> za@#zEc=-(;Hchq$zFgR6uaAs`inW%*Z#z%hN1N0L`9Dt*wR$?JM?mgwk+4C&kxBKB zb>ESy5EUgs1jlj_(;n;(sh%sX7JC-5I^Z|cY`rU+R)t;!p^7MeQ6`Uuif%y0IG*pt zzBBRGgWPHtq*?k)ls+>0Z_)&S?ftxeDGFYs4S^-1RJLzeLp_^BE}oc+Y0iKavG2X5 zXe;roM&&fdej?=5nNB6Iwh8&|7qG1|y^}y4j&J~?EA2)q2`v_csRI0kDnvt@Y23o8 z$6tpBwT5=a-XLtxu}K;46|M3P`c(iA;0`m4p%5?#O2+OEXSpGBdoLGAhXjjN!&YaU zCjR6K96+w}2ga%8(%Ruly+Sf^ghFd~--P)~ocVWsJUnlT zna}M<4g;P3hVzY<1}IJLFQE6Sq{nRt?9m}ByrWoa z*A-1wP41aopRkMMbfM+csd^+6iaqupP4yZ9L)|j|QeQgrX)Ctl2?+N^f6#?{s_Q{v*z-w}(#}(JG`FFYO3U5d1T@MkA`w!VUp{YmDO#`ps z14&HAv`a6F{aK6yI6`0u#*1Xg{pfJ}N$2d|lchNHSgMYkP89fas~WG|!4Oug#lss4 z`BPcep}gELk8=L-Y8Mb9a@@mI*!AnMwG9G7Xx7rp6vtsr zG~3ge?$Y@fh))~OBW`t)0KMpPfOKmEM~tYUz=C_rU@w1oxB|iaPt!%MZnxpis#!Dc z?KQXP=D_GSq=qYHSkXNj<+DxGY8W`wGg7LM((dF| zl<4%ACzq7#CH;5Ey@%+<;e6BpSGxh;$;D8eqf>FyGZ_`Gd(Wo{LI4F!w}9kH$*5>U zk6VEnd%mz*#if$Oeu=OSuT{2-&bLLs*iRKPl-1A!Nb$m|>)*D{OJ-;8*^d6S*H7j| zNdf*!raSeUjw z`S<1Zw6~~+_xr3}li7`C!!?V-l82u&ri$obpSVKE<>?6-1Y4iphi16Z<q{ryxMOj>DpTO(e z{F^P)gSkL5KGK7(GRD@iMn%JnKn3+W2Rl5-e@#H*22hYOj@CiCSBQOeCY89;Y2vnszvxF(I6&pf%6{4;ax+AHd>mV$j^mlJjD{0eksF3)xz!$a+_gnn zb<}}xzDNP69sm2!9)-ew&(M_*!pt^;bCffkZ$QnLW`wG>a=bJdqZs7bT!Mhe1yE@+ zj1;)ZW-H6XO787DNY5HR%`5>od&gD;b?=YthLWRml4bu>ifLx%ykh{bw3$aUOm^%> zo0_0mR8EcBu+_ke1sT!?I?P(0KPXCmCT!x^ny!;`ob(rRRJm^9M&FunNM1U#-OcG1 z6gfc~TA$GlUdw-|#RZnxKAB{G8PKIe)LTC*9Q+VtK;GeOwG!%{?{s~JC95LeojpS^ z66f=XHb9EJu@Dk8p;Bcv@Sr1?o3Aiz<+hz>zd1hGdbiz#HDWM9p|q>rSDWq7p}*|d zbzP2L?F^MRzpp}7@drPS*`4l4)NbtR81{`vE)v~b!s2Xb0J>8vavCe}H*-5p$iT=h zozL`Yn7m^zb#}RQ7?x3YDIRmap@y=k4_Q5g%G0fYniyYS8u<(c(A ziE6DL_Sm$NR1chkj9klGNYP#+bqd4;SiWBMmiSYwmR

kr)Sdmk;erSMu{;sU~G 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 DJX0$y literal 30154 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⋘^^g?J{}d3zw~1ZMsSqZ{E%>WW%1Zzp-RMoflVx1FtkzdaF$*7~KQl}X zS!>z9RWnD2&EtA_uclFAM{>+Qa1to19pd9I@#0lqTvs*xD-_}K;^*3S8Gz&OrS7H? z8*XINZ#mJM&dI62rf&DUc|S76a^@bE&7Uy-O3#0Gy~~y4w0Rb3o10o{{aBxBJ}KUI z>>Fnbx=y#Zq*MwQx$I4VV{cHOXTEsFUQMuYO*ye1z@C0Pz3aI(H$MwPcOL=t&8P^5 zgsnjlOVi+l~%Bv$QKzrX&`84Ih)%?x<>l{H*0Jl&oxn#e&1f$`*4e}dn+cm27lK`=*J0xfZ4FYRd-<9 z&t&D}f;PW-279T*p@`{jlNNn~4s^C{YzH zi5sgz1z2{nSWq2qSez1V48q$>PeTN9N=}Zu=`FbR3$9zpAJp4 z34@1s-e2z7(&uLI?QY;lTfb;60BLMIcR;(SfSi&-B|5lAR4jAvCR6=~nnr*_`^my2 zHlZ@&G}cpMvZMi^01m!m!w|h``>YM_B(1465rwoj?eS6W0qEH|c&@?*u=!9^w=&ED zqDCdpB*TDUW5Kbaao-V>MliLo2l^0I&o#9ZhQq|1(8c!AGR2GTqu3KKB3kcJD_QDj zK;&fVPO31UcPDZctb!MEM}k?R4uz$Lu0u0yT2xPN^RQH(2I#h%gb#hv9*+ohK) z+a(mgJ)7~I!Jeca*zQOiZB8_xe7lbsVebq4-RkP_A+=s-kXFtNr7iB$U~rB!Jn|8k zjlf5ugb%SJZ1t9WM{3ROOV@eZfT-}HZwc6n_#;?I_2_RJDM-=+_zzZwYp7iCnZ;O2oi!ZTUF`IL-5FQ_L4O>bq!Mhv4!EYI1~cE2zyP3W zgQx=dufrzSif+Jm?0QZR!fO^^<%Jf8=-14q{p4Q4ncRl?{9alK;Eq*e-6Q zbDa_Rsn_A8*S{pQMe^>VPcSxO{wlqy2VQbh*b6NQy$N+)KYIqhR z3kdxH`wjGz`HoPVOu!BVo(CP4MSVWHz0?kdzeLWjUq6e-m4Ma-P$31v5qU5CBx+21 zsu7!JPOgO;LR7~5D9}4<*nTcv4jj|pvh64uJ^vVxD4N{>{^0f(6y#L57s$;5JVyq- zusx&i($_^yk8wiU#>&idoe6xQSiSRlJ6oA6JD{7B!$G-ys{A4An{H4UGjIk?v0B&B z8}{eIbu!vv+<~)VQS_lGVTs}0;VP*A)49#3?CleFCxq!a%*$)5=#{{6zlPmvT%DWC zFNvr{x)Bg`tt4i*wN4*57crpd(Czj1n^z~=9Z@N<{pXtC_9@3+-fQ=i-zfKSI(_7| z#SROK4!^jzdU3-fSA_#BfxbTW8WavvUR57c0i<}9^^M-wZJdR&cB$&dSk>EqopKke zKp9P)dJ=hNC6dq?Mxs-YTd8=g3G9DzL{&M?-b7W`^j+p$w|9H*s#<|G%k8kV^VD|= zhpH-L<~6<-V&v`HV=8o&K*Is`)!LnpbrujZPR~IuNaBl{N)mWJH>(=vnKCxAt` zcE0Kj0`=&ufwkaL)3EhR?ca(EWu^Oryq8~#eaQ45a26Yg{uA1tb7>EB9AYs7y6WC_ zzr#l%wC49N0(fwBTwZE(r2pI#K*F1T;K*fW6_q zM#3q5J5ca2ujCKZE?V&t4jS`ach6BrA1d7kb(-=kvro(a`;{1SzemDCzLSTiMQy(% zo}>EjCOdH4iobmjhe@;i&`B{>Aq1k0dDFEWq)?zf$IkcP77&&nLYGF>k6+RrLyZGR zcaG%BZoB61+3UcPYB_d>p`HvMl8c<)_$^nMtB#c{=5W3b5UC^uUtkX2Qsu6QF6wpw zB75V$Uc~X=!B>R8t>bp-x9LwYtfN&DStt$opF`@7u=�%@J_c4(K$ez8L(4inVZ6qF!M`QPX9+?DPe$_q^Y-j8kv;%LNwxpWePa9_s!7w^GW9B&V{ggdFSG z$9hCmB+@CeH#M?nUx!MeFo-M($<|^y_H7Vq#x6_7HlrFt2#v9gG2HiO)cKxse!qJk z_uj{STz`(4&*$@cFR%CO^?E*E&kw^~R&eSu^-{S)R6I-5Xw*n_Y9v_hW52zh@ z(zpjAn4E-M`Tj%zHTb$v+qFhJ1O3RAcbqYt`}-rZTHe_Y+*50b8jjJJ$QMAyp=@CH zTpZ$MXGB7a!tiGec;3I1?L#Q5NV0oOWE=5NO4hkXdB~?ae0lJ?b2u8g^ww*@x1ZFC zm@)qdI=(ubYt>ZsQx7@{L{aPZ06&thbC_#b80_4)WwnhEWh2J-?PgNuXVh;%&ZSJw z@#DcO_PY8i*6Yy5Mm@w!JZ ze>i#yMwEh2_f@`?*lA8GOgfZD|8VG#Pwn5dZT{5$@3f9Y!A@UJY2D#nOn(m1W!QWjFcza-1uH|*eplTLq5NZ% zdAM8#Csm0$Nie#Q(tre6%$y-`|9~t5fiPge5F49U8$7j1T?PKhAsqko?tp_;7EXtb z2ciouWD}MyEerSfFW%m1Z8@Qg6DWKu@Q-v$>~0Xb^PXmROP) zP!`3I0tY@OWZXb|-Iy=@8CeXzm2~?bpwnk4&;ZqNZ=8#Y9R@ZDF9xwjF2LHj?m`7J z2{HV}(C?54loj7e0Fi+>2x+ZiXyjkY=3GmSULEwX95mHvk9?s@m128gQjo}*| zJpYOkQX%j z;eoIhbvDty65+^(bJ9ZAt(LBU5Tq!KZF@n<(!BKD$)sd3VPBvbb!DbhdRV}cvV@u&2ycoTz=1g8Tui9nSnOCG zbwWXp3szqWc~VJMx+$)Vs6GW`+G>6US$?BUFy(z+K5>cP9Yev68ldrBJ(_;2eTK3G zcSP;0tLX;YsRu`jE3($2KfTeYO$)0rbr|~jR0g@vUskpgCTEFyT}rtEL}Ng-{t7fT ztUlU0aRdV2pk%V)!EnfAs>6KOVp)$CeWkbR9lO62KU;~d0~WplDcR+U4*UC&;rcdc zAaFP9F8qff6jrMsFpNuy+v(yh%xa-rdy3s=KRV!mJsO_$K18`c(V_C$Rd$VOdyI2{ zkyZd~Z9?4jp@r{q5{Tyg>IZHV|3EOm?Z^8sTm|z#$*Zu@ykBTjlO|o< zDUp~}5kU3Rx;Yuf8EwTGy4kp%IZE=h_Qo&10uuovbbvu1k zzSi4_ILEiJ=C~#^_cW7KUtzcYv3RqsJ|MU!s9}1Zu&`Mh1bCvG#2wZNs@k2akJlHI zx4ws9{9_oLsIOrQ(IT$$mGNjD(08~Jv3cwh>W*QguPkNn``i)11gzyJW+HlX=~Gh} zZqO@Y%~O;$)dyc9Xj>g^F)K#|tct-~RKAO6bv{-n=%?8?wBb`jeV)0&#h}!OXLjx3 zTD#JgCpqb!L>`?**ndltQ+RWoVI&g#4WaEB%Xd^iqh$YkbF8X-9#0z>Mm*OSPT@X9 zVlw`k4l!2@1k?4}_HkudMa{>k*=qZ;jcn|c>ttlxrgL->3$bY{XJa?Y6$bVy*#gf2 zavclfMZ!3>-jz=~gSvcCn~>*v*KF5!aC6oO3k&wOl(U=&Au;)PF4DL=8gR`{2Whi2 zf~KK!hB+TCKDVZI3~J9q-%f z-%tFo<~?Kl+0!P4J0nM`Uc*EdtqzAtK?#JzA+s4Cbk60yv9MCuJ~|Bxxcs)|kb zgxPoqCC0AQd3(FmO(lY0N(n0ZL8X;X2Q27iHKT0ZyMhRXuC_O_PBr-dv-B4v)ofHqcH(`6@|1%~PYQz0Msj!)`zC z<>DnXyw=OAUtu;El;Vpv%R@^qKR$9@8~gC;bFGxyGSqW2vXUw+d6}*X6ZizEQW!g}lLGr6&p>wVK+OLvvMtiSaiy$|Q;&xmo%xyn%?_+^9FY;nS4wi`85a=dr- zRum;x%a75soG~(A^8?Y#`tew3d14h7+6I0uuh@{k@xT9YoO-`E+pSL?W|{s#;(dX= z+HvH=>7(=t^x1`IaYioti{O;odc$8GlwVjZJqSEkJa^>`5k`$VepBFuaCs^&fnlW* zuD*Z=h;^l->`079G&Q#&aGv1rO;e+Um}rOIiqj_gy$hKOEm}?V?RjOmH(;0*L}yO? zkjwbUx1f>MH8O9@XgF`1AnJzL`5gDRet{W5y@Yw6xeQGheoXZNxb?PEIaK1$FX<&ib zrquJXDU4wIat3pfj{GdWKqLZv& zw2rp#!aoeASY)Bre?`p$Kd+rj@NxodkV^@mE^)<)A3B~3c-=E>E;-aFSY}YPM0dDL zr(E}y(@m*3mL|+Dfc!20!7JVLcwK=GpDQfka#b~MtqQ&NRw6N#EjcCQykF!NeDv#9 zyk3SbNenvdCD4v9o>5=gukeh%zeczh8Od<7I*ph{Frt0$tniY~z9Aiav0xg$VS@Y9 zEF|`2THuQw>n&DV7$dH)p`- zUbCAhnYSNQ=O!J7sl^u-S(F7tr1{;^ROf^Z#o%<&DgTY{9MhCCN>)i}VDcDaOC7my<{nK{Rsm!m8=U@q@3!*B>0UsaByyl7=JS z*l&|+{D3A%;L?li)A9!Pp9H!Cp7OLk4{qM8q@)x|hjR7x1y%AX}^T5pf|&a$q( z@k#`cPklpldJ&~Pw%Jbpmx(qFm)oeN5gFz!@U=a?9)*V|WNVB~CbKETq64Xe&(IPM z>AqJ|rfOqK1B4{`Y2isPj#a|GrYjQreYQ)aLHeY6&GewbBV}qUYwx8UzYY_!)?Hko z!QWK`t}@BvKInqTfVKX9EyW?R%2c^0qWv*e%KrjqJT_Xz@s#%R#0U6GgCDrSwE=&+ zs*chh5z%D6S}{^rw5qmoPM{-(e8|5zrARlgBCjmwI9gU0NqttuW$Qa(oK? zpl18*hPs}hhtzZTpJuya5GcRRgRDiA20;po9LUKw4xI?E?6&iB#FX~L4t+P*2D+6q z{AR9UsF`AIeeUHm^mv;XzjDGudEKeQjuiyeDjDgShouqSBGD?0sE`{TV`Q-wh}Hxm z!|ygFq4up5h4kRSHp+I*TJWO$XBt7{{e9Pv-?TDrHTzz5Ti`Lu{1tmJ#U}>85fztm zHYDkpBD$;#_KAmXnlx-_BsO}yQw*!22aiU&m?^iLUF|lsF6VvM>7h)N>OWTa)Jf0U zR3%{O0J(fb2G=I+7$C9FH9@7D-)D;Jrst?NDpHMCd^zU_rl==)Nkd!X-8Wwi858OJ zZIT4U2uyKlFiGwIl1jvfH!YpBXSHw;z$zi_U42@ib3+f7B`QkGfDZS); zVs>!3;0sP3Gj@#^HY?e($7iwy7vr@QEd^+&<2e%yYqGqG%7$pcL)~J6AF02a8eGVp zvl4!dC=mK<#nZW+t1X4k_p!ci;)yYu%a=kAlbb(WHOn}xfcH^O4TK9#?f$so8SROg z4Dm(HqaVzy>7gtLJg=*ubC`*>y^**cz~~w$zX{p<9x+HMUO8 zi`**#ou86oRwZ^0*{$b*HCR^Zf;iun%;rOebqlmqUrI`Kv@z|pGa!8Y^ODR=&!|OW zwotTB%9?TcT^(`RcSdT4nnST(Y-jV?QF|62Gy!o}EzWd<$Uy2^T4nV^zv|fQuzqi*Gt|28s%gY}Q>#utY6tEW70iALI5<_)a8Y=LM42es=DLTL(y6?)V3Oss*@aBrruPp}&4g6#}2AF9;=8S>E& zf1xb|3KVy)h6i=T9@-tVTB>#f18d^Z?Nn&4Mv~42D&Zy`T1?8l=W$|pO>z3w2RAY+ zmutEO1bhN+iO;k)vl}!{?Sh%X@6r2|Tb z3w_Kk8t12jOs>}rb!nduA{^*X2Bn?AD^&#>!Mmk2bN?@-^{CV1GOPFFI zC}RM`fbi8{a)DP6c6>}h3i@f(rTL7dxODp3ARi|`x8i5*?^mqMAzdb^URgbEAB^*U zIUdp8(>q3uUhSJ-;`Zo-NTdFjx zgVyV8T>2-ZYn?6Jq5#o{Qey^64iNYYTH=s=X6X)PjhoZ?3z^p+Qz-%q&Y*j+HEE3z zN_C&#WUL1FGn|uUX6*r#mMlj+(bsRSQ1$yq9TGt^GYy5FLRdFQd$cWUp70cez_W$q z$hSpFPa(MoV)K6w#ef1=dZvv$HYuiRn{3Oh7fF%?duB3DZv=yWxz=0?RQ|CpgxceV zMSj8;*wIwZpY@L@fEfYGtLu&*8UDB|*UsdpRy+PpiT;^IGn>{>JO4q)-SZjS#(!{v z|CJ-u2$!We%$d2-mMIV{9E;ilt#ajzT(14s>0_4(&$iq2;CuhCTk-x6yZSQZel{hN z|33&){H@zjju^VW1vM-Jr0oA?E8<`F&zvGL3_>@s1Z`TT4eH+b`c!en51k37%tH%f zZk#eks3R^H9qFs}WcEo`=>zDMku4lLJ@1?uI5RIEvQGBJ(knuj11%vrd%cN4NZ2B^ zceAOHdVTwC0w-dbA5Cu-O$nDfGA{#~HHV!sz@;aj0@d4)noG=|O20<(FSrLRl+7KL zY?8go6!FKLfw10nHzX!>QyA0N?GMEInXRr>FBdzWFfS%)Lf-BX*1Pf?91E;TPd65) zgewg%KrN5Z@L57ke*)^2{Lo0UWGHF;5fI0>er9>ENSZ6&IX5cI8EUDelH1(!)Q3i* z{ZxiP+iz}^m*IyB(G#A9-X6EXgF(gUj0~$jj!MvjKK*6vkhkl@NGnNe0V}9~80cPU z;OcyFf_Rv-Dp097MD=(TqvTEk_IcN|>4;rK00dUA$yf3?T=;fV@E+x_dhjf*Aj z^f#QW^crOZ;v_wfIoduP-gq&qS*3eA9piP)8eCC%JSs-3nY5?*BjvemsLp4jb~g9m zQx+WGO@=q%nd`jALc5Q?^J#MUjNAO&f@`k5|MpZkYgC-B3KYu%gB?Zr{;4#(!r;KJ|T9lm*N(U$+mz3Fusp>ns1VC3<& zB?Z@!+^?*bD_vRqVs}OEsqDNTI$hFZI}ex6$7zjndAC|_37U88g@5fmpsdmV-Eoe0jD#aCd8P)4ARw#NCye>QzucR*X;^{-nd_Lrj zrlDoyYh4%l0v16e$ofVocKDlW)h*6jvLk4A1X9_La_f+z1 zERcpGhv1bF+B2=*jxKm=(L37vkO8wEhp!qlHF#=UTykkZVy-J#TRp8~{_iA1KO5Mf$!VTNX~)iN?)x)` zT$=ha;_V0{2(5N%|3q#qjCxS#aq5G$WV-=2T~xk?E4h5^D%!vXyk0`JYPYo|eg|Hs z0UH(^W2aZmI=r{?&G6^-i9pgd5)W-gNiblj7%y3J7xB9qZPDcf?uC`KFg|c%4^qdA z(G)kmYvx!{$p!v*d}vcnvZuxRk&;u#Y&#qDF*Dt{{KdZnoG`w6VvzM)Y`sD6!rAPu zuVzcIsfesi{Ls17U^h(czus`TN<9tZf-WG(%KXx=kkO5nz0?=Wflq{*MHcOM3iX`HyN_Z^)Y zAyDvquuEAdd3~Qbdf;j)ldGrJpHj`VHqYJ> z2*a)0;sCxZj3S}XtMOXjwI)KyFd;S0ne6mxPCdetk)w8vXv?KAe3qxqoNeO%MTbY! zM-A8#=NCVGD5BcJ_#O>8NjK2m?9=pc>Gr}%Xe$Oa{L1tKs(L%-TJPQqp2&P^Gb?uN z5YKTV*S$AeTO^mK_;2KJf4ij;8S>7zTli-9x=jbmvcWiKO#HXxAN%vI&q4epF|>h} z5i4FAe<|hb*(hh}mE$wfsJ>aBXB|F1x4Xh0zFF3h(Iv_m@xc2^Kku&%*=v|2BRA5L=w=P3G$xEv8T+~_* z{qSf7$3BHFUpEC^+W=wz!aR-s^s9-v^PMGF^?6I3O~js;;@B@EUw=63J2Ygvihi2P zo|NefItf0|Bo&Zcxox+(cas!kH&=9Cj-LD!&O%}cXq zJ1ab+t|DCNjN($PqsGlX|KSpE3l7ZgTU2WH;bA?Ao^qBisvC;9=I$qG0RM9Os=>T& zA*Uy=P0I(5^a%T6Z^phz9YkJ9QrFzUmgf6j7(V65C15QgV6l2PV!_m}J6?9hD?MVp z2cD3r%0Ja5>6o~`tg~c{b)sQHSs};lVu-fdiS8-HH$RfTdT+9u#=WsglP!7OIcpZC zdov})q}t4$6CLO>qCM@|nrHepyLgr}2lUPQoC&+Fb{)R!U(j`plfIiQH~TF@qKJJ@ z+cj~$@$AkI!Ys=g;0-p+qtlv&;Io^?_jw&{@%u~s4K%M#VO1U43tkDk1lO!m_pQfi zl|-t2QJUhY4cUQ=BEgP-sJPnkI2jc!R?Ovo>ZpEs7^Y@i5ZD#O9bIogfa9qhK0-6v zh%+`L2=&d|K%+Z&;+04GMtr_HXJqY*ar+5LLO{uQjHT9ik-$LDTa&GOS=v0s518lT zOUk6fCu+iZ^DCtTQcAYi9JlA)?T0!{Ag9KylVBJ3@Y55>L>*)C6qeE5B9$TsOL_`+ z2eAF_!d?9$!^kyaV+l5ceLIzUsE>p_$FPpm81TCnRL^yR<7KJs50Cb{pP){Iel^-j zpcQ|kVg4R8hf|*AI!2Msii-y8S+jy?^AB7<*PYz9%$i6t@BDfiZZMRDT9n#RqC9rQ^rCw&t1BXhJK$Y zw^B~%QNf1c@016E1-}19hRhrvbJYqe64`@0&&xVuW`S^)BC(HaXU?IW_g#0fj>38N z?5>fk->tkN(ITnyWbRa&gTl)M4X#K9YxN0{eFnBpjoFR5O|Iw1Yb5kh@EA|iMysRD zXra*gc^#0m7O_vMMmMXHogdFtqr)Iuy---;*^LrGBv-Xf8Jn7SJqshpMLG1zSA+17 ziNNR1#p)3$qJ`w){Lo%j(h=5phMLWj5)E2C8YaHvYje*tXQ43XY^HB=!obD~$Y={k zo8e+HxH-M!vDY-KWlmq}wCE?KWvn#ei0cG@xYdt{$07oO_?>5=;>$W9XfLi9AKi<8G4m-|lE&-Lu7nNb0Pjk27c$%D!QRsNZe+pj zPe2trza6Gk?kP(s89VL9f_x>bG~4My{}3u#beFmKbV%tIp0C)xzwg>uh*RzE>FK}H z9mM|kIMQWr(jL3}8w-PTcPT|3dV}FB*rY70?F|V+Po?pKuKB(@!<2ddy~}bzLd!Qv z^@&XjtblJS3zXO_O1@8M011|W=`SJczMkwHz zViQZuw=r6K+yTOE@F$}K!gay20hn%=a>vCXtYR7AN!qS5^6-7?neN=A3MkWve3k}v zHn#{~6ll6J<>2b|Z20?7=KivA9@mToK`g&Q&#Xka4KvpP-N*7oDN#1B7+x$7pkv2c zI6dz2l~Q8M?vnD)fz!9ehh9K)WrdSc$%FG>XI~T`U4XZUKvLBQn9T)0f(3wRI3e?fvBfE#NL*5eXhh*U@CQZZLCbpe+!|{)Pevx zzxuU<1S&ryoHL<3z47JR9#FUQdqqL(kt@ zxY*Xy7`WOZ+t>%BA;)$xZ2^lxBt2&NIP`m}|B5VNQaChzPOY=0g{fqmB@IEj&Air{ zpKag?*WVIzV`MJqO&s|OjXzi&K{@=lfmYr&mkwz=v5j`9mT(Zx~)r(%ax~)F&X@F4e)eV8(7!ytpuUT zR9?qU&x|(gse}kuWTB%-yFx-bwTuC!lYZ?XqqeB;#@crlCmy1>;x#`&s|(Ura*1>) zXcvu^wBBtJo8^WGNd;me5@km$4IVY6;H-xR;4Nm5o05!vna&_&a zwxOp(482)ofXL$ORAdr-VQR_cahOXu;6lW8dD$pGeu(36!kn4lV=i=X3WhG>+{d&t z>z>Z~=c(u%ZPg_{bJ)Lq0lCVLMh>28qdqZ8hPu~X{gv96c}4@K&z=F+;?F{M&pfA0 zT8!!^O36hRWZN(F0y2_S zv(qbQN_e1cGzS!ACPtVO51wa(U4vC!nEo&`gr)_Cz*s9pQG9B27qq}#p1`sELt;XE zeOLuV1RW_$kJtB{>kR4+J1!2Cd`U6!;ulfuS&^+tKW(E(CenEHF;6{^b!=~GLr1=X zZ7?ySdLyL8h*KvpL=BMJE0|ka?G~nSmbNz*$SKu;cYy^?1@kPp2d}5%(5`pg-u}%q zfCnroxL+|=Fo(Tg)=(D`|Cp4r6zsw@7HrU}b3aA}o&VIXfu+GHmHJM~U$bG)KXw;T z;9{BNH|z3zJfBKvT<)>0+w#1bzGs|i*)=?%=P(LeUR7{7Z`g4~;~qo)vUfbIpK z+%6Nf3Ngp-f;^FS^*7osQA6V${erlv>IVLQ-&LVsu<_Dx;pa&nRsm}L`_zSh+t%sg z7t2}j=kE6q@gF?NUn5D7z3RKh!c<2s^MN-`Z>)Ma4C+n(mK z#N7$$pHmbF(5EM2&6I#>uX)I>Z9&yYjB8N>T7Fx+Oy2l^PlW8R%HRJ=&+H@jkJpY$ mRABy3HFjre>*!lM=>mm!lz6Y1g7>fPICsWaujsVhz5f9NmL%Z- diff --git a/en/readme/telephony.md b/en/readme/telephony.md index fc9c61caf18..9cc9a0d8d84 100755 --- a/en/readme/telephony.md +++ b/en/readme/telephony.md @@ -1,18 +1,30 @@ # Telephony +- [Introduction](#section104mcpsimp) +- [Directory Structure](#section119mcpsimp) +- [Constraints](#section123mcpsimp) +- [Usage](#section128mcpsimp) + - [Obtaining the Current Cellular Network Signal Information](#section1458213210369) + - [Observing Changes to the Cellular Network Status](#section750135512369) + +- [Repositories Involved](#section152mcpsimp) + ## Introduction The Telephony subsystem provides APIs for obtaining information about the wireless cellular network and SIM card. Applications can call these APIs to obtain information such as the name of the currently registered network, network service status, signal strength, and SIM card information. The Telephony subsystem consists of the following modules: -- Telephony core service: initializes the RIL Manager, SIM card module, and network search module. +- Telephony core service: initializes the Radio Interface Layer (RIL) Manager, SIM card module, and radio module. - Call Manager module: manages three types of calls – circuit switched \(CS\), IP multimedia subsystem \(IMS\), and over the top \(OTT\) calls. It is responsible for applying for the audio and video resources required for a call and resolving conflicts in a multi-channel call. - Cellular call module: implements basic calls over carrier networks. +- Cellular data module: implements cellular data services over carrier networks. - SMS & MMS module: provides the capabilities of sending and receiving short message service \(SMS\) messages and encoding and decoding multimedia messaging service \(MMS\) messages. - State registry module: provides APIs to register and deregister an observer that listens for various callback events of the telephony subsystem. +- Data storage module: stores persistent data and provides **DataAbility** access APIs. +- RIL Adapter module: implements adaptation of the modem communication interfaces. -**Figure 1** Telephony subsystem architecture +**Figure 1** Telephony subsystem architecture ![](figures/en-us_architecture-of-telephony-subsystem.png) @@ -20,55 +32,61 @@ The Telephony subsystem consists of the following modules: ``` base/telephony/ -├── core_service # Core service +├── core_service # Telephony core service ├── call_manager # Call Manager module ├── cellular_call # Cellular call module +├── cellular_data # Cellular data module ├── sms_mms # SMS & MMS module -└── state_registry # State registry module +├── state_registry # State registry module +├── data_storage # Data storage module +└── ril_adapter # RIL Adapter module ``` ## Constraints -1. The open-source version currently supports only the CS call and SMS services. Cellular data and dual-SIM card are not supported. +1. The open-source version currently provides the cellular call (CS call only), SMS & MMS, and cellular data services and supports the dual-SIM framework. +2. The Hardware Device Interface (HDI) support is subject to the chip vendors' adaptation capability. For details, see [Telephony Service Development](https://gitee.com/openharmony/docs/blob/master/en/device-dev/subsystems/subsys-tel.md). ## Usage Guidelines -### Obtaining Current Cellular Network Signal Information +To learn more about the usage of each subsystem module, refer to the respective README. The following illustrates API usage by exemplifying how to obtain the current cellular network signal information and observe the cellular network status changes. + +### Obtaining the Current Cellular Network Signal Information -1. Import the **radio** namespace from **@ohos.telephony.radio.d.ts**. -2. Call the **getSignalInformation\(slotId: number\)** method in callback or Promise mode. This method works in asynchronous mode. -3. Obtain the result from the **SignalInformation** array in the callback. -4. Traverse the **SignalInformation** array to obtain the **signalLevel** \(signal strength\) for each **signalType** \(radio access technology\). +1. Import the **radio** namespace from **@ohos.telephony.radio.d.ts**. +2. Call the **getSignalInformation\(slotId: number\)** function via callback or promise. This function works in asynchronous mode. +3. Obtain the result from the **SignalInformation** array in the callback. +4. Traverse the **SignalInformation** array to obtain the **signalLevel** (signal strength) for each **signalType** (radio access technology). ``` // Import the radio package. import radio from "@ohos.telephony.radio"; // Set the value of slotId. - let slotId = 1; + let slotId = 0; // Call the API in callback mode. radio.getSignalInformation(slotId, (err, value) => { if (err) { - // If the API call failed, err is not empty. + // If the API call fails, err is not empty. console.error(`failed to getSignalInformation because ${err.message}`); return; } - // If the API call succeeded, err is empty. + // If the API call is successful, err is empty. for (let i = 0; i < value.length; i++) { console.log(`success to getSignalInformation: type is ${value[i].signalType}, level is ${value[i].signalLevel}`); } }); - // Call the API in Promise mode. + // Call the API in promise mode. let promise = radio.getSignalInformation(slotId); promise.then((value) => { - // The API call succeeded. + // The API call is successful. for (let i = 0; i < value.length; i++) { console.log(`success to getSignalInformation: type is ${value[i].signalType}, level is ${value[i].signalLevel}`); } }).catch((err) => { - // The API call failed. + // The API call fails. console.error(`failed to getSignalInformation because ${err.message}`); }); ``` @@ -76,62 +94,53 @@ base/telephony/ ### Observing Cellular Network Status Changes -**Adding an Observer** +Adding an Observer -1. Import the **observer** namespace from **@ohos.telephony.observer.d.ts**. -2. Call the **on\(type: 'networkStateChange'\)** method with **slotId** \(slot ID, optional\) and **callback** \(callback processing function\) passed in. -3. Register an **observer** instance for callback events of network status changes. +1. Import the **observer** namespace from **@ohos.telephony.observer.d.ts**. +2. Call the **on\(type:'networkStateChange'\)** function with **slotId** (slot ID, optional) and **callback** (callback processing function) passed in. +3. Register an **observer** instance for callback events of network status changes. ``` // Import the observer package. import observer from '@ohos.telephony.observer'; // Registers an observer. - observer.on('networkStateChange', {slotId: 1}, (err, value) => { - if (err) { - // If the API call failed, err is not empty. - console.error(`failed, because ${err.message}`); - return; - } - // If the API call succeeded, err is empty. - console.log(`success on. network state is ` + value); + observer.on('networkStateChange', {slotId: 0}, (value) => { + console.log(`network state is ` + value); }); ``` -**Removing the Observer** +Removing the Observer -1. Import the **observer** namespace from **@ohos.telephony.observer.d.ts**. -2. Call the **off\(type: 'networkStateChange'\)** method with the **callback** object passed to the **observer**. +1. Import the **observer** namespace from **@ohos.telephony.observer.d.ts**. +2. Call the **off\(type: 'networkStateChange'\)** function with the **callback** object passed to **observer**. ``` // Import the observer package. import observer from '@ohos.telephony.observer'; - // Deregister the observer. - observer.off('networkStateChange', (err, value) => { - if (err) { - // If the API call failed, err is not empty. - console.error(`failed, because ${err.message}`); - return; - } - // If the API call succeeded, err is empty. - console.log(`success off`); - }); + // Unregister the observer. + observer.off('networkStateChange'); ``` ## Repositories Involved -**Telephony subsystem** +**Telephony Subsystem** + +[telephony\_core\_service](https://gitee.com/openharmony/telephony_core_service/blob/master/README.md) + +[telephony\_call\_manager](https://gitee.com/openharmony/telephony_call_manager/blob/master/README.md) -[telephony_core_service](https://gitee.com/openharmony/telephony_core_service/blob/master/README.md) +[telephony\_cellular\_call](https://gitee.com/openharmony/telephony_cellular_call/blob/master/README.md) -[telephony_call_manager](https://gitee.com/openharmony/telephony_call_manager/blob/master/README.md) +[telephony\_cellular\_data](https://gitee.com/openharmony/telephony_cellular_data/blob/master/README.md) -[telephony_cellular_call](https://gitee.com/openharmony/telephony_cellular_call/blob/master/README.md) +[telephony\_sms\_mms](https://gitee.com/openharmony/telephony_sms_mms/blob/master/README.md) -[telephony_sms_mms](https://gitee.com/openharmony/telephony_sms_mms/blob/master/README.md) +[telephony\_state\_registry](https://gitee.com/openharmony/telephony_state_registry/blob/master/README.md) -[telephony_state_registry](https://gitee.com/openharmony/telephony_state_registry/blob/master/README.md) +[telephony\_data\_storage](https://gitee.com/openharmony/telephony_data_storage/blob/master/README.md) +[telephony\_ril\_adapter](https://gitee.com/openharmony/telephony_ril_adapter/blob/master/README.md) -- Gitee From 41dda5bf5e9159ea2fb02339f98a92ef5b7fdeaf Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:27:34 +0000 Subject: [PATCH 214/282] update zh-cn/application-dev/reference/arkui-ts/ts-basic-components-span.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-basic-components-span.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-span.md b/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-span.md index fc850b8b669..ca29204c7a1 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-span.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-span.md @@ -33,7 +33,7 @@ Span(content: string) | 名称 | 参数类型 | 默认值 | 描述 | | -------- | -------- | -------- | -------- | -| decoration | {
type: [TextDecorationType](ts-appendix-enums.md#textdecorationtype枚举说明),
color?: Color
} | {
type: TextDecorationType.None
} | 设置文本装饰线样式及其颜色。 | +| decoration | {
type: [TextDecorationType](ts-appendix-enums.md#textdecorationtype枚举说明),
color?: Color
} | {
type: TextDecorationType.None
color:Color.Black
} | 设置文本装饰线样式及其颜色。 | | textCase | [TextCase](ts-appendix-enums.md#textcase枚举说明) | Normal | 设置文本大小写。 | -- Gitee From 6ff47870872b7ca0d5638564bd185d3ec9eedc03 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 8 Mar 2022 11:36:16 +0800 Subject: [PATCH 215/282] update docs Signed-off-by: shawn_he --- ...us_architecture-of-telephony-subsystem.png | Bin 55900 -> 229658 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/readme/figures/en-us_architecture-of-telephony-subsystem.png b/en/readme/figures/en-us_architecture-of-telephony-subsystem.png index 1ac14c2b557895e673c98cd84aac3d810d1d9b82..5a79ea900765c63116a2bcecfe33ac7eb7d9c24a 100755 GIT binary patch literal 229658 zcmdqIWn7c*`#+4LbR(@GARwL6At0S9B1khz>CVxeBGM%wNH?QFa!MltgV9}M)HYxY z?tT9EFFxPb|LOhcez5IzUAwO1tfS8N@jm19b=63T7>RIja7Z=OU%kP>dH5Cw2X~MF z4|}J?rRo{>=bq;qH6@(diO2iciwE|KI*K?r4JpJoRu8e)gl_7_o;Wykl>dD0jc}eT z;NaYqYP?c3@H0Qc;9I8e`|l*JDtQqW354;eD_yJ{>PPR715#iRU2&hrxTb|?P&DVt z-TO0Grt6HjuJ?xd4~a7JZj?Dk*n@I91DxsGNw~bUQA8M}(bIeLDgL{U^Un)f<>7B@ zcLjvs-{*{^P$FRcudj{h!3Wn~U3C9@M~T3l`dJy#e?Nfz;}zZKES`VAWcJd!@?SEP zyza$S{9C~E!~Y)$u&#X|y|Nl9P|f!5p`#uNKdCF!B?+p`3fO*QB;a%NuZfDJK;07t z_W#M0NbOaK5{Ru>uNtN6_mDp`|DXBBPSY_y#TzsUL0!WWmZdy__zD=++o*rdCW=m= zjI4`8_#I*SzZ)(lR@bKa*CfXZJQaTTZ?PSrg9iWZ%ijI}l>7gIfI(A2udZG)?5JQ? zQY`)<)R)MOs01J6lCh)wjMMH!e(Pwapatr^u+{#2T^%X2EF_vtr~V!;-m9K}4Nxhz zQ&HQZNgj8=(Fu$%!G+hMrQPjy)%fDC1f=1M2(&w}E?*kBxCj-5AjDU>Kq(xgI?et4 zsp6i)Voc(EC7VqD9%dWy#n-I(ho2lxa-E?a1BP{Gu3RH}9|F<-hx2v4h`2s7MB3A` zvS(b-Ea4&KRR2{*TH5Ss(!cw&^e{kEyW4F&{GH)DXo6t39q)?&D!2 zDZV$UF!0(aC@9a?p0xFJ6a3-BCrz-#zgC05oomLtsC?X!ebZTK|ch;U~e~o1AXsFm&$E z;(_QcN&^xgQI_|`QUQNF5g>d4XAbkdA#h3 zCV%XqHJeMx1O-!3QSm7#%ya7HI56yg{J+}$F=!wj=BS`ix(H>DE2S`)ERfkPJT-%) zBjBs6c%+XVa0kM@dEDQk5r^=N|L}H8FR<#86z&k8wYao&L|CC)AnTl@qf_v$($$GY zOIH`PJ`iI(ce0-GnF1bHL1FxFS^-A^y<_2MdwN)6w=gQf(ZeW@{P?JEenp)|RfQW~9@ zXuQR+yWAW_Ln`pen0@+MYHL@Bh>4e!S}bjP>Sn6iJh<~v?I!_6o4Eh2a~r{|!_|6s z^&|xFPEl?#>HaGL23tZ_W`pt&rR7b89yxL4e;Lsp7d=T@%`qLYu zH|*9*zG0yO4J$`VW?S79N~Q@372I~fv`#+j6=4@;Z5XY|Z4VF~&{&}ufw$Q1xqGzN z@J1$}d61DQSM~u;_U&Y$f-8bF$>-*hFeNuY;3hvK<5L7)G%oGGRzB8Tw>7q6P=zDz zZ~Yia0*uKqSKPS;wQ@IwJX*Hr8sR8i`!zLP%5 znL<~;`46RJ?BLH;pe@JRU!(V-_+qkIV0A;oG}ex7PEXxk+BMHA<}$=Pz4pIwaFVu2 zHQ7VD+MAp&>$RC6Of_$}cLe{-HEr~$xZEnmGH)>Zp2Nk3)5n`z@>@2+qp;0%M-3ecKfZ+uaC!au6l^nbS(1vAFZ1&FJX3ch#Kv$84Veoljr_HX^geu=__g#gM<1YK_UaaYbDA=fXaplGD zQv(_r8pPdx;v}S`_#XZ>kNIDzDE@zfv)o_=Pg#MC?+PO$BkW>dQ)WJR;!E0>Wg^67 zoJUIG$bl216+-ip&c_yLeckqXIdB|X6VQX{LcpN& zBBCOE^76HtP`wxol`2jjNY9BSf$8z?hEprM@Vg}u;nbLV2~GoQ-wfVN8R_`$@3pZ- zy5IR!Zy%8pnBOQ#9leO4Js6x~Jw1EQ{Cw|2fE0;0pzfvZX;|rd(BxN@7gOYqx@&>Q z+RxMePxtz;D{v-i(H}^qliGbZ7)RtN1GU>6P6Q<;CLSWGV_QC$y#)lKj$1|TbDUSY z7BVt(H?5C;^xaat=52_T^Ma(k*U1;z&lrRV{L?)iAYNqrQ(;+SjEp=5Io{ti=b{0~ zqZMTIgmt+V06(TNi(={FR*B{sUQ+5^|jCFI{s533!i}6;*M5PlIj}#-9MS(1qFF! zR=i`#JMR{*qWEXUm5n7}&Fa#Y*)pAMn}r4Ac^dV}0=dKWdt{Ggof?4FN5qA9)jISF zAT4Vi!wS+Q9Uq|^pYcURMn;C+q&%jr^m}B&>M~YxD^a-OUE&D^*}>&YS^CK9u&@t- z-hNOmJjYl(%>E;bRppmUKTO-{8JbNU2tqEx`xx`T1b?(*V7&dDb^S6dRx^JOSZD>xC(;b zyOS36O}i5@^T-nvS4zcQXt21KdL9BEvOAQPKqt6xh4hi}Jq|}4GC8`tM;vRHM+K77 zy%il$elCpYW0OrVvP4J=zu@ocMqBg1aJ^r|5yaK#EPJQx-yz}ilX&FJPPlj%D1E`7 z(y$`kk1iicL(CemxuJhs)*fn}Y8f92hFY!t40}H?st-PwvvSC~0Nk(h6a}L&XjE?i zNwbRCc7IfYRmiTAT+qb8_*BkGAd-bn;xZZ>IPWIhBF@*XqfNTq5Hn;j@-s@GlR(95 zSwz_K<#Xx?r z-Fojwp3J-ptY~u7pPX52t#*%CBI4Y|x%3VwpLdRKs+z%71!UOI;k+a7LgVi$x6#YXOHQ}%}&d=rRGd**?;@P zNL4ie{6Qi{+1XLXF@}t#fzBdeTx9_pxs3XLQTD(NW2spga8v+wWXZ z7`Vrglqd8>Sh=+xAdIs z&Ja2>>*$O|ngwgWwnh(sc-^O-E9IF(Lqq%F&7UcO+3df-$gG7X-(J{K3z&yTH~M@Z zQ1Sb>xX+P8u7WGb)-L*7v^}uxVkIytv;94wFfqE4g3+ z!{V7+a_dWt1@6GZWrV=j@!S`EjZJ?Bka*WN0eU~%CB(#_*W-alQ>oPAz!8UBA<)k+ zX;fW;Gf)1`N-QKVt5x6Fq?0mA{Ldh@)*yBAw5`&W3~;^wnt>zIb7X5+@|C~@mo=JZ}R*FPg3hS5wn)w_MC zi4Hr8JlzZu8ozF}9v=t=fofNA z#W(&l4AZ@#EMzHO(P^c+>t$7aWh(9aH@*|f7Ds7Ly)Tx~%XD0bm zE*PNFn0~S}Loqn)-7dUG#`Yw^)8}mKBec=ElehwnWFhf>m(~ITMbC?-YP3efH}0rWs)sz8~nY zr&xH8*iP0#+-1d%N!$s5sFw_S7rS=bWH8( z!m_xlAL3`x5QCqzAwa!ovw>>7h(=yfM|v>GJm<6Go3GKhJ|2^rnXHmDwq+8Bw@9oS z+jD^Ryf0=Zt|4vbf0q8(?G6~xl(0mWn7p{Py20eL^lV4Jiehi#=eI2n%(yTRO!2HE z1UGI(Bq3M8CVc!arac-(`B>#^p@V-9a`3P=kV!oI!aK=Ohz%NTZ@${L?h$H&ElF-^Ek4y3-z`Rq!yhx{ zxE-cdTm9NJ|Acj;tt_`kKwbr7XO*I$?>{)&Ib8M3t8!oa6#uCMEX2)-KQ-;GUjMj$ z1Alp3WYPyFDmw0?uQ53+goa{fERHtZgV;~B;wmEWNE@vNM4Sz*!f05(?QAb(O%H)= zezWDu*k|Yzi1l&mK6XvxjI!bmb z#<+DlO`o+aBZIjW7oYsf@@Da2SbCU52Itk4znO2%A&2!r6mh20Y9Cb~yhKM{>uW)Q zjYZI{Rp7R#SVc<8&3ghi=Txq6FcPAnBC+_WKEzG zSIA&aF~+qkTNnwYmf zH<2}_-4i2v2A8Wr1$lW#ad_bc`MCap1;EE8(l#4%strjD{X!zfr6 zVy=_fB^sk}b?IRO@@g0_lmK(;(jU4&u`MH>#k!wHD0k=B;kvSYZfPxSjgOxJ1&m9Z z^jbBU&<0$&!g^yt_FER=9?!8Tt&`vZVZ z7v-|pz2=3mxU&buz@bp^)o^*Dg-lZJmB^w?(&zbJH_@Bhrc;i^>m

p-wh@+kQ&DJ>0+`t^bSOMA-@i_BYx%d6Qy9CJJw&`_X!?{xdJxV&MT@6cbU z&pDigu8>SYi3`pUNkLba?&o8m{)GHb%UW{w*DQ!_Seh~i-b&mV5tI>cnubdcZ7+d) z_~kpB%qEuHzbVt4n6uvgaD)xa zLXTn;0wPHwq1^!**B_O`kqN`y@th; z1$^FCY_bT35v2!&(z_cEymdYpd@X=zRMAC>h8Bop-bm)+yVyq_w zs741a&hxHfVn&oyOlk4TDd~D4ZbtyM-OelE2ZvaK?w6ZQ{)h5~<5n_{XX4Iy1eHH$ zoO_3>S^YdL7^@br01ZY7%d(NNNZG+dP8yt{Ju}Sa zAV@(VQlqe|qw64pgO2aQZ=MypA80ofctxkb#A2wsG z>ALxznE(K5cHP|N(PN=)d#y|XqKMisX2y-0)>Us-W-Z9aq9DN#zl!l3sqs-mZyg#=MZ{wSnG|hJCiiR*i`-q%R_-|5WuL?~+xy|7G3Oa3VLT zYbnnJQ~>kY+7bLG8TL4*>&6)jYQOR&CQ!%kmpmVMXX1?L$Ol;-+n|#yfFob12AaI7 z>6NK?T*0;M@;k5m0H#k6wS%^g*PD+nKWdR~j*70kE{!OdH!W|v3uKA@ri})&=4{*8 zLbkOsVLwwvOj@m4JBM*s4BDj_tj1*eRcW@2Hl|qD{U&3a4Hx6$N9tD?;Py|Ev$HS! zO;T*1DZ#RYbnQCZ3UL{6SZ|R}o;Pe-1ttEH5qgXtt!=bz{r4hWQ1+9ay!7N*qbQJM zA}in=iE9<|<4D^x_k9>H9`YP6HJ?}QMK|zSFN;F;t15}jQg8*}2FQAmP=8kAD!B

52N-xFC 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

Oo}OBo>T5k?Z7puI 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

cOEEN>w#?JYD+!sIjX^7uYd6TX7N7QxiB4-ZiBJ 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

kr)Sdmk;erSMu{;sU~G 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
  • **queryArg**: event query parameter.
  • **queryRules**: event filtering rules.
  • **queryRules**: callback object for query results.
Return value:
  • **true**: The query is successful.
  • **false**: The query has failed.
| +| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBackBase> queryCallBack) | Queries system events by specifying search criteria such as the time segment, event domain, and event name.

Input arguments:
  • **queryArg**: event query parameter.
  • **queryRules**: event filtering rules.
  • **queryCallBack**: callback object for query results.
Return value:
  • **true**: The query is successful.
  • **false**: The query has failed.
| **Table 2** Description of QueryArg @@ -32,7 +32,7 @@ HiSysEvent provides an API for you to query system events. You can query concern | API| Description| | -------- | --------- | -| QueryRule(const std::string& domain, const std::vector<std::string>& eventList) | Constructor used to create a **QueryRule** object based on domain and event name list.

Input arguments:
  • domain:Domain to which the event belongs, in the **string** format. By default, an empty string indicates that the domain is successfully matched.
  • eventList:Event name list, in the std::vector<std::string> format. By default, an empty string indicates that the event names on the list are successfully matched.
| +| QueryRule(const std::string& domain, const std::vector<std::string>& eventList) | Constructor used to create a **QueryRule** object based on domain and event name list.

Input arguments:
  • **domain**:domain to which the event belongs, in the **string** format. By default, an empty string indicates that the domain is successfully matched.
  • **eventList**:event name list, in the std::vector<std::string> format. By default, an empty string indicates that the event names on the list are successfully matched.
| **Table 4** Description of HiSysEventQueryCallBackBase -- Gitee From e391ed76aff1de6e386237f56013fd5096302a8a Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 8 Mar 2022 17:16:47 +0800 Subject: [PATCH 228/282] update docs Signed-off-by: shawn_he --- .../reference/apis/js-apis-update.md | 506 +++++++++--------- 1 file changed, 264 insertions(+), 242 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-update.md b/en/application-dev/reference/apis/js-apis-update.md index b9f9de86cac..dd47dcca47f 100644 --- a/en/application-dev/reference/apis/js-apis-update.md +++ b/en/application-dev/reference/apis/js-apis-update.md @@ -1,6 +1,6 @@ # Update -The update module applies to updates throughout the entire system, including built-in resources and preset applications, but not third-party applications. +The Update module applies to updates throughout the entire system, including built-in resources and preset applications, but not third-party applications. There are two types of updates: SD card update and over the air (OTA) update. @@ -10,109 +10,212 @@ There are two types of updates: SD card update and over the air (OTA) update. ## Modules to Import ```js -import client from '@ohos.update' +import update from '@ohos.update' ``` ## Required Permissions None +## Obtains an **Updater** object. + +### update.getUpdater + +getUpdater(upgradeFile: string, updateType?: UpdateTypes): Updater + +Obtains the **Updater** object for local update. + +**System capability**: SystemCapability.Updater.update_service + +**Parameters** + +| Name | Type | Mandatory| Description | +| ----------- | --------------------------- | ---- | -------- | +| upgradeFile | string | Yes | Update file.| +| updateType | [UpdateTypes](#updatetypes) | Yes | Update type.| + +**Return value** + +| Type | Description | +| ------------------- | -------- | +| [Updater](#updater) | **Updater** object.| + +**Example** + +``` +try { + let updater = update.getUpdater('/data/updater/updater.zip', 'OTA'); +} catch(error) { + console.error(" Fail to get updater error: " + error); +} +``` + +### update.getUpdaterForOther + +getUpdaterForOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater + +Obtains the **Updater** object for the device to be updated. + +**System capability**: SystemCapability.Updater.update_service + +**Parameters** + +| Name | Type | Mandatory| Description | +| ----------- | --------------------------- | ---- | ---------- | +| upgradeFile | string | Yes | Update file. | +| device | string | Yes | Device to be updated.| +| updateType | [UpdateTypes](#updatetypes) | Yes | Update type. | + +**Return value** + +| Type | Description | +| ------------------- | -------- | +| [Updater](#updater) | **Updater** object.| + +**Example** + +``` +try { + let updater = update.getUpdaterForOther('/data/updater/updater.zip', '1234567890', 'OTA'); +} catch(error) { + console.error(" Fail to get updater error: " + error); +} +``` + +### update.getUpdaterFromOther + +getUpdaterFromOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater + +Obtains the **Updater** object from another device for the device to be updated. + +**System capability**: SystemCapability.Updater.update_service + +**Parameters** + +| Name | Type | Mandatory| Description | +| ----------- | --------------------------- | ---- | ---------- | +| upgradeFile | string | Yes | Update file. | +| device | string | Yes | Device to be updated.| +| updateType | [UpdateTypes](#updatetypes) | Yes | Update type. | + +**Return value** + +| Type | Description | +| ------------------- | -------- | +| [Updater](#updater) | **Updater** object.| + +**Example** + +``` +try { + let updater = update.getUpdaterFromOther('/data/updater/updater.zip', '1234567890', 'OTA'); +} catch(error) { + console.error(" Fail to get updater error: " + error); +} +``` + ## Updater ### getNewVersionInfo getNewVersionInfo(callback: AsyncCallback\): void -Obtains the new version information. This method uses an asynchronous callback to return the result. +Obtains the new version information. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Updater.update_service **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ------------------------------------------------ | ---- | ------------------ | -| callback | AsyncCallback<[NewVersionInfo](#newversioninfo)> | No| Callback used to return the new version information.| +| callback | AsyncCallback<[NewVersionInfo](#newversioninfo)> | No | Callback used to return the new version information.| **Example** ``` -updater.getNewVersionInfo(info => { +update.getNewVersionInfo(info => { console.log("getNewVersionInfo success " + info.status); console.log(`info versionName = ` + info.result[0].versionName); console.log(`info versionCode = ` + info.result[0].versionCode); console.log(`info verifyInfo = ` + info.result[0].verifyInfo); -)}; +}); ``` ### getNewVersionInfo getNewVersionInfo(): Promise\ -Obtains the new version information. This method uses a promise to return the result. +Obtains the new version information. This function uses a promise to return the result. -**Return values** +**System capability**: SystemCapability.Updater.update_service -| Type| Description| +**Return value** + +| Type | Description | | ------------------------------------------- | ------------------------- | | Promise\<[NewVersionInfo](#newversioninfo)> | Promise used to return the new version information.| **Example** ``` -var p = updater.getNewVersionInfo(); -p.then(function (value) { +updater.getNewVersionInfo().then(value => { console.log(`info versionName = ` + value.result[0].versionName); console.log(`info versionCode = ` + value.result[0].versionCode); console.log(`info verifyInfo = ` + value.result[0].verifyInfo); -}).catch(function (err) { +}).catch(err => { console.log("getNewVersionInfo promise error: " + err.code); -)}; +}); ``` ### checkNewVersion checkNewVersion(callback: AsyncCallback\): void -Checks whether the current version is the latest. This method uses an asynchronous callback to return the result. +Checks whether the current version is the latest. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Updater.update_service **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ------------------------------------------------- | ---- | ------------------ | -| callback | AsyncCallback\<[NewVersionInfo](#newversioninfo)> | No| Callback used to return the new version information.| +| callback | AsyncCallback\<[NewVersionInfo](#newversioninfo)> | No | Callback used to return the new version information.| **Example** ``` -updater.checkNewVersion(info => { +update.checkNewVersion(info => { console.log("checkNewVersion success " + info.status); console.log(`info versionName = ` + info.result[0].versionName); console.log(`info versionCode = ` + info.result[0].versionCode); console.log(`info verifyInfo = ` + info.result[0].verifyInfo); -)}; +}); ``` ### checkNewVersion checkNewVersion(): Promise\ -Checks whether the current version is the latest. This method uses a promise to return the result. +Checks whether the current version is the latest. This function uses a promise to return the result. + +**System capability**: SystemCapability.Updater.update_service -**Return values** +**Return value** -| Type| Description| +| Type | Description | | ------------------------------------------- | ------------------------- | | Promise\<[NewVersionInfo](#newversioninfo)> | Promise used to return the new version information.| **Example** ``` -var p = updater.checkNewVersion(); -p.then(function (value) { +update.checkNewVersion().then(value => { console.log(`info versionName = ` + value.result[0].versionName); console.log(`info versionCode = ` + value.result[0].versionCode); console.log(`info verifyInfo = ` + value.result[0].verifyInfo); -}).catch(function (err) { +}).catch(err => { console.log("checkNewVersion promise error: " + err.code); -)}; +}); ``` ### verifyUpdatePackage @@ -121,45 +224,45 @@ verifyUpdatePackage(upgradeFile: string, certsFile: string): void Verifies whether the update package is valid. +**System capability**: SystemCapability.Updater.update_service + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | ------ | ---- | ------------------ | -| upgradeFile | string | Yes| Path of the update package to be verified.| -| certsFile | string | Yes| Certificate path.| +| upgradeFile | string | Yes | Path of the update package to be verified.| +| certsFile | string | Yes | Certificate path. | **Example** ``` -var getVar = update.getUpdater(); -getVar.on("verifyProgress", function (callback){ - console.info('on verifyProgress ' + callback.percent); +update.on("verifyProgress", callback => { + console.info('on verifyProgress ' + callback.percent); }); -getVar.verifyUpdatePackage("XXX", "XXX"); -getVar.off("verifyProgress"); +update.verifyUpdatePackage("XXX", "XXX"); ``` ### rebootAndCleanUserData rebootAndCleanUserData(): Promise\ -Reboots the device and clears the user partition data. This method uses a promise to return the result. +Reboots the device and clears the user partition data. This function uses a promise to return the result. -**Return values** +**System capability**: SystemCapability.Updater.update_service -| Type| Description| +**Return value** + +| Type | Description | | ---------------- | ------------------------------- | | Promise\ | Promise used to return the execution result.| **Example** ``` -var getVar = update.getUpdater(); -p = getVar.rebootAndCleanUserData(); -p.then(function (value) { - console.info("rebootAndCleanUserData promise success: " + value); -}).catch(function (err) { - console.info("rebootAndCleanUserData promise error: " + err.code); +update.rebootAndCleanUserData().then(result => { + console.log("rebootAndCleanUserData " + result); +}).catch(err => { + console.info("rebootAndCleanUserData promise error: " + err.code); }); ``` @@ -167,24 +270,21 @@ p.then(function (value) { rebootAndCleanUserData(callback: AsyncCallback\): void -Reboots the device and clears the user partition data. This method uses an asynchronous callback to return the result. +Reboots the device and clears the user partition data. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Updater.update_service **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | -------- | ---- | ---------------------- | -| callback | Function | Yes| AsyncCallback\ | +| callback | AsyncCallback\| Yes | Callback used to return the execution result.| **Example** ``` -var getVar = update.getUpdater(); -getVar.rebootAndCleanUserData(function (err, data) { - if (err.code == 0) { - console.info("rebootAndCleanUserData callback success:" + data) - } else { - console.info("rebootAndCleanUserData callback err:" + err.code) - } +update.rebootAndCleanUserData(result => { + console.log("rebootAndCleanUserData ", result) }); ``` @@ -192,21 +292,22 @@ getVar.rebootAndCleanUserData(function (err, data) { applyNewVersion(): Promise\ -Installs the update package. This method uses a promise to return the result. +Installs the update package. This function uses a promise to return the result. -**Return values** +**System capability**: SystemCapability.Updater.update_service -| Type| Description| +**Return value** + +| Type | Description | | ---------------- | ------------------------------- | | Promise\ | Promise used to return the execution result.| **Example** ``` -var getVar = update.getUpdater(); -p.then(function (value) { - console.info("applyNewVersion promise success: " + value); -}).catch(function (err) { +update.applyNewVersion().then(result => { + console.log("appVewVersion ", result) +}).catch(err => { console.info("applyNewVersion promise error: " + err.code); }); ``` @@ -215,24 +316,21 @@ p.then(function (value) { applyNewVersion(callback: AsyncCallback\): void -Installs the update package. This method uses an asynchronous callback to return the result. +Installs the update package. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Updater.update_service **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | -------- | ---- | ---------------------- | -| callback | Function | Yes| AsyncCallback\ | +| callback| AsyncCallback\| Yes | Callback used to return the execution result.| **Example** ``` -var getVar = update.getUpdater(); -getVar.applyNewVersion(function (err, data) { - if (err.code == 0) { - console.info("applyNewVersion callback success:" + data) - } else { - console.info("applyNewVersion callback err:" + err.code) - } +update.applyNewVersion(result => { + console.log("applyNewVersion ", result) }); ``` @@ -242,6 +340,8 @@ download(): void Downloads the new version and displays the download process. +**System capability**: SystemCapability.Updater.update_service + **Example** ``` @@ -249,7 +349,7 @@ updater.on("downloadProgress", progress => { console.log("downloadProgress on" + progress); console.log(`downloadProgress status: ` + progress.status); console.log(`downloadProgress percent: ` + progress.percent); -)}; +}); updater.download(); ``` @@ -259,6 +359,8 @@ updater.upgrade():void Starts an update. +**System capability**: SystemCapability.Updater.update_service + **Example** ``` @@ -266,7 +368,7 @@ updater.on("upgradeProgress", progress => { console.log("upgradeProgress on" + progress); console.log(`upgradeProgress status: ` + progress.status); console.log(`upgradeProgress percent: ` + progress.percent); -)}; +}); updater.upgrade(); ``` @@ -274,45 +376,50 @@ updater.upgrade(); setUpdatePolicy(policy: UpdatePolicy, callback: AsyncCallback\): void -Sets the update policy. This method uses an asynchronous callback to return the result. +Sets the update policy. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Updater.update_service **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ----------------------------- | ---- | ------------ | -| policy | [UpdatePolicy](#updatepolicy) | Yes| Update policy to set.| -| callback | AsyncCallback\ | Yes| Callback used to return the execution result.| +| policy | [UpdatePolicy](#updatepolicy) | Yes | Update policy to set.| +| callback | AsyncCallback\ | Yes | Callback used to return the execution result.| **Example** ``` // Set the update policy. let policy = { -autoDownload: false, -autoDownloadNet: true, -mode: 2, -autoUpgradeInterval: [ 2, 3 ], -autoUpgradeCondition: 2 + autoDownload: false, + autoDownloadNet: true, + mode: 2, + autoUpgradeInterval: [ 2, 3 ], + autoUpgradeCondition: 2 } -updater.setUpdatePolicy(policy, function(result) { -console.log("setUpdatePolicy ", result)}); +update.setUpdatePolicy(policy, result => { + console.log("setUpdatePolicy ", result) +}); ``` ### setUpdatePolicy setUpdatePolicy(policy: UpdatePolicy): Promise\ -Sets the update policy. This method uses a promise to return the result. +Sets the update policy. This function uses a promise to return the result. + +**System capability**: SystemCapability.Updater.update_service **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | ------ | ----------------------------- | ---- | ------------ | -| policy | [UpdatePolicy](#updatepolicy) | Yes| Update policy to set.| +| policy | [UpdatePolicy](#updatepolicy) | Yes | Update policy to set.| -**Return values** +**Return value** -| Type| Description| +| Type | Description | | ---------------- | ----------------------- | | Promise\ | Promise used to return the execution result.| @@ -320,238 +427,153 @@ Sets the update policy. This method uses a promise to return the result. ``` let policy = { -autoDownload: false, -autoDownloadNet: true, -mode: 2, -autoUpgradeInterval: [ 2, 3 ], -autoUpgradeCondition: 2 + autoDownload: false, + autoDownloadNet: true, + mode: 2, + autoUpgradeInterval: [ 2, 3 ], + autoUpgradeCondition: 2 } -updater.setUpdatePolicy(policy) -.then(data=> -console.log('Policy set successfully') -) +update.setUpdatePolicy(policy).then(result => + console.log("setUpdatePolicy ", result) +).catch(err => { + console.log("setUpdatePolicy promise error: " + err.code); +}); ``` ### getUpdatePolicy getUpdatePolicy(callback: AsyncCallback\): void -Obtains the update policy. This method uses an asynchronous callback to return the result. +Obtains the update policy. This function uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Updater.update_service **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | --------------------------------------------- | ---- | -------------------- | -| callback | AsyncCallback\<[UpdatePolicy](#updatepolicy)> | No| Callback used to return the update policy.| +| callback | AsyncCallback\<[UpdatePolicy](#updatepolicy)> | No | Callback used to return the update policy.| **Example** ``` -updater.getUpdatePolicy(policy => { +update.getUpdatePolicy(policy => { console.log("getUpdatePolicy success"); console.log(`policy autoDownload = ` + policy.autoDownload); console.log(`policy autoDownloadNet = ` + policy.autoDownloadNet); console.log(`policy mode = ` + policy.mode); -)}; +}); ``` ### getUpdatePolicy getUpdatePolicy(): Promise\ -Obtains the update policy. This method uses a promise to return the result. +Obtains the update policy. This function uses a promise to return the result. -**Return values** +**System capability**: SystemCapability.Updater.update_service -| Type| Description| +**Return value** + +| Type | Description | | --------------------------------------- | --------------------------- | | Promise\<[UpdatePolicy](#updatepolicy)> | Promise used to return the update policy.| **Example** ``` -p = updater.getUpdatePolicy(); -p.then(function (value) { +update.getUpdatePolicy().then(value => { console.log(`info autoDownload = ` + value.autoDownload); console.log(`info autoDownloadNet = ` + value.autoDownloadNet); console.log(`info mode = ` + value.mode); -}).catch(function (err) { +}).catch(err => { console.log("getUpdatePolicy promise error: " + err.code); -)}; -``` - -## update.getUpdater - -getUpdater(upgradeFile: string, updateType?: UpdateTypes): Updater - -Obtains the updater for the local update. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ----------- | --------------------------- | ---- | -------- | -| upgradeFile | string | Yes| Update file.| -| updateType | [UpdateTypes](#updatetypes) | Yes| Update type.| - -**Return values** - -| Type| Description| -| ------------------- | -------- | -| [Updater](#updater) | Updater object.| - -**Example** - -``` -try { - page.data.updater = update.getUpdater('/data/updater/updater.zip', 'OTA'); -} catch(error) { - console.error("Failed to get updater. Error: " + error); -} -``` - -## update.getUpdaterForOther - -getUpdaterForOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater - -Obtains the updater for the device to be updated. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ----------- | --------------------------- | ---- | ---------- | -| upgradeFile | string | Yes| Update file.| -| device | string | Yes| Device to be updated.| -| updateType | [UpdateTypes](#updatetypes) | Yes| Update type.| - -**Return values** - -| Type| Description| -| ------------------- | -------- | -| [Updater](#updater) | Updater object.| - -**Example** - -``` -try { - page.data.updater = update.getUpdaterForOther('/data/updater/updater.zip', '1234567890', 'OTA'); -} catch(error) { - console.error("Failed to get updater. Error: " + error); -} -``` - -## update.getUpdaterFromOther - -getUpdaterFromOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater - -Obtains the updater from another device for the device to be updated. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ----------- | --------------------------- | ---- | ---------- | -| upgradeFile | string | Yes| Update file.| -| device | string | Yes| Device to be updated.| -| updateType | [UpdateTypes](#updatetypes) | Yes| Update type.| - -**Return values** - -| Type| Description| -| ------------------- | -------- | -| [Updater](#updater) | Updater object.| - -**Example** - -``` -try { - page.data.updater = update.getUpdaterFromOther('/data/updater/updater.zip', '1234567890', 'OTA'); -} catch(error) { - console.error("Failed to get updater. Error: " + error); -} +}); ``` ## UpdateTypes -Describes the update type. +Enumerates update types. -| Name| Description| +| Name| Description | | ------ | -------- | -| OTA | OTA update.| -| patch | Patch update.| +| OTA | OTA update.
**System capability**: SystemCapability.Updater.update_service| +| patch | Patch update.
**System capability**: SystemCapability.Updater.update_service| ## PackageTypes -Enumerates the update package types. +Enumerates update package types. -| Name| Default Value| Description| +| Name | Default Value| Description | | -------------------- | ------ | -------------- | -| PACKAGE_TYPE_NORMAL | 1 | Common update package.| -| PACKAGE_TYPE_BASE | 2 | Basic update package.| -| PACKAGE_TYPE_CUST | 3 | Custom update package.| -| PACKAGE_TYPE_PRELOAD | 4 | Preinstalled update package.| -| PACKAGE_TYPE_COTA | 5 | Parameter configuration update package.| -| PACKAGE_TYPE_VERSION | 6 | Version update package.| -| PACKAGE_TYPE_PATCH | 7 | Patch package.| +| PACKAGE_TYPE_NORMAL | 1 | Common update package.
**System capability**: SystemCapability.Updater.update_service| +| PACKAGE_TYPE_BASE | 2 | Basic update package.
**System capability**: SystemCapability.Updater.update_service| +| PACKAGE_TYPE_CUST | 3 | Custom update package.
**System capability**: SystemCapability.Updater.update_service| +| PACKAGE_TYPE_PRELOAD | 4 | Preinstalled update package.
**System capability**: SystemCapability.Updater.update_service| +| PACKAGE_TYPE_COTA | 5 | Parameter configuration update package.
**System capability**: SystemCapability.Updater.update_service| +| PACKAGE_TYPE_VERSION | 6 | Version update package.
**System capability**: SystemCapability.Updater.update_service| +| PACKAGE_TYPE_PATCH | 7 | Patch package.
**System capability**: SystemCapability.Updater.update_service| ## InstallMode -Enumerates the update modes. +Enumerates update modes. -| Name| Default Value| Description| +| Name | Default Value| Description | | ------------------- | ------ | -------- | -| INSTALL_MODE_NORMAL | 0 | Normal update.| -| INSTALL_MODE_NIGHT | 1 | Update at night.| -| INSTALL_MODE_AUTO | 2 | Automatic update.| +| INSTALL_MODE_NORMAL | 0 | Normal update.
**System capability**: SystemCapability.Updater.update_service| +| INSTALL_MODE_NIGHT | 1 | Update at night.
**System capability**: SystemCapability.Updater.update_service| +| INSTALL_MODE_AUTO | 2 | Automatic update.
**System capability**: SystemCapability.Updater.update_service| ## NewVersionStatus -Enumerates the new version check results. +Enumerates new version check results. -| Name| Default Value| Description| +| Name | Default Value| Description | | ------------------- | ------ | ---------------- | -| VERSION_STATUS_ERR | -1 | System error while checking for the new version.| -| VERSION_STATUS_NEW | 0 | New version detected.| -| VERSION_STATUS_NONE | 1 | No new version detected.| -| VERSION_STATUS_BUSY | 2 | System busy while checking for the new version.| +| VERSION_STATUS_ERR | -1 | System error while checking for the new version.
**System capability**: SystemCapability.Updater.update_service| +| VERSION_STATUS_NEW | 0 | New version detected.
**System capability**: SystemCapability.Updater.update_service| +| VERSION_STATUS_NONE | 1 | No new version detected.
**System capability**: SystemCapability.Updater.update_service| +| VERSION_STATUS_BUSY | 2 | System busy while checking for the new version.
**System capability**: SystemCapability.Updater.update_service| ## UpdatePolicy Defines the update policy. -| Name| Parameter type.| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------------------- | --------------------------- | ---- | -------------- | -| autoDownload | bool | Yes| Automatic update switch.| -| installMode | [InstallMode](#installmode) | Yes| Update mode.| -| autoUpgradeInterval | Array\ | Yes| Period of time for automatic update.| +| autoDownload | bool | Yes | Automatic update switch.
**System capability**: SystemCapability.Updater.update_service| +| installMode | [InstallMode](#installmode) | Yes | Update mode.
**System capability**: SystemCapability.Updater.update_service| +| autoUpgradeInterval | Array\ | Yes | Period of time for automatic update.
**System capability**: SystemCapability.Updater.update_service| ## NewVersionInfo Defines the new version information. -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------------- | ------------------------------------------- | ---- | -------- | -| status | [NewVersionStatus](#newversionstatus) | Yes| Update status.| -| errMsg | string | Yes| Error message.| -| checkResults | Array<[CheckResult](#checkresult)> | Yes| Check result.| -| descriptionInfo | Array\<[DescriptionInfo](#descriptioninfo)> | Yes| Description.| +| status | [NewVersionStatus](#newversionstatus) | Yes | Update status.
**System capability**: SystemCapability.Updater.update_service| +| errMsg | string | Yes | Error message.
**System capability**: SystemCapability.Updater.update_service| +| checkResults | Array<[CheckResult](#checkresult)> | Yes | Version check result.
**System capability**: SystemCapability.Updater.update_service| +| descriptionInfo | Array\<[DescriptionInfo](#descriptioninfo)> | Yes | Version description information.
**System capability**: SystemCapability.Updater.update_service| ## CheckResult -Defines the check result. +Defines the version check result. -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------------- | ----------------------------- | ---- | ------------ | -| versionName | string | Yes| Version name.| -| versionCode | number | Yes| Version code.| -| size | number | Yes| Version size.| -| verifyInfo | string | Yes| Version verification information.| -| packageType | [PackageTypes](#packagetypes) | Yes| Version type.| -| descriptionId | string | Yes| Version description.| +| versionName | string | Yes | Version name.
**System capability**: SystemCapability.Updater.update_service| +| versionCode | number | Yes | Version code.
**System capability**: SystemCapability.Updater.update_service| +| size | number | Yes | Version size.
**System capability**: SystemCapability.Updater.update_service| +| verifyInfo | string | Yes | Version verification information.
**System capability**: SystemCapability.Updater.update_service| +| packageType | [PackageTypes](#packagetypes) | Yes | Version type.
**System capability**: SystemCapability.Updater.update_service| +| descriptionId | string | Yes | Version description information.
**System capability**: SystemCapability.Updater.update_service| ## DescriptionInfo Defines the version description information. -| Name| Type| Mandatory| Description| +| Name | Type| Mandatory| Description | | ------------- | -------- | ---- | ----------------- | -| descriptionId | string | Yes| Version ID information.| -| content | string | Yes| Version changelog information.| +| descriptionId | string | Yes | Version ID information.
**System capability**: SystemCapability.Updater.update_service| +| content | string | Yes | Version changelog information.
**System capability**: SystemCapability.Updater.update_service| -- Gitee From aac8c841ccfa3f9c9f0d6c2e0cd1b23f31714acf Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 8 Mar 2022 17:20:06 +0800 Subject: [PATCH 229/282] update docs Signed-off-by: shawn_he --- en/application-dev/reference/apis/js-apis-update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/application-dev/reference/apis/js-apis-update.md b/en/application-dev/reference/apis/js-apis-update.md index dd47dcca47f..3dbd1691e8d 100644 --- a/en/application-dev/reference/apis/js-apis-update.md +++ b/en/application-dev/reference/apis/js-apis-update.md @@ -17,7 +17,7 @@ import update from '@ohos.update' None -## Obtains an **Updater** object. +## Obtaining an Updater Object ### update.getUpdater -- Gitee From 68eac65fc70e56b86a567fcd0a2244bed5e74a44 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Wed, 9 Mar 2022 09:30:22 +0800 Subject: [PATCH 230/282] update docs Signed-off-by: shawn_he --- en/readme/telephony.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/readme/telephony.md b/en/readme/telephony.md index 9cc9a0d8d84..6c53664a7ca 100755 --- a/en/readme/telephony.md +++ b/en/readme/telephony.md @@ -141,6 +141,6 @@ Removing the Observer [telephony\_state\_registry](https://gitee.com/openharmony/telephony_state_registry/blob/master/README.md) -[telephony\_data\_storage](https://gitee.com/openharmony/telephony_data_storage/blob/master/README.md) +telephony\_data\_storage [telephony\_ril\_adapter](https://gitee.com/openharmony/telephony_ril_adapter/blob/master/README.md) -- Gitee From c571227175b143a2ea5cab0e3a0b52cfa009a2c6 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 10:26:28 +0800 Subject: [PATCH 231/282] updated docs Signed-off-by: wusongqing --- en/application-dev/ui/Readme-EN.md | 245 +++++++++++++---------------- 1 file changed, 107 insertions(+), 138 deletions(-) diff --git a/en/application-dev/ui/Readme-EN.md b/en/application-dev/ui/Readme-EN.md index 8f16c2a59a7..40067e6674e 100755 --- a/en/application-dev/ui/Readme-EN.md +++ b/en/application-dev/ui/Readme-EN.md @@ -1,142 +1,111 @@ # UI -- [ ArkUI](ui-arkui.md) - - [JavaScript-based Web-Like Development Paradigm](ui-arkui-js.md) - - [Overview](ui-js-overview.md) - - [Framework](js-framework.md) - - [File Organization](js-framework-file.md) - - ["js" Tag](js-framework-js-tag.md) - - [app.js](js-framework-js-file.md) - - [Syntax](js-framework-syntax.md) - - [HML](js-framework-syntax-hml.md) - - [CSS](js-framework-syntax-css.md) - - [JavaScript](js-framework-syntax-js.md) - - - [Lifecycle](js-framework-lifecycle.md) - - [Resource Limitations and Access](js-framework-resource-restriction.md) - - [Multi-Language Capability](js-framework-multiple-languages.md) - - - [Building the UI](ui-js-building-ui.md) - - [Component Overview](ui-js-building-ui-component.md) - - [Building the Layout](ui-js-building-ui-layout.md) - - [Layout Description](ui-js-building-ui-layout-intro.md) - - [Adding Title and Paragraph Text](ui-js-building-ui-layout-text.md) - - [Adding an Image](ui-js-building-ui-layout-image.md) - - [Adding a Comment](ui-js-building-ui-layout-comment.md) - - [Adding a Container](ui-js-building-ui-layout-external-container.md) - - - [Adding Interactions](ui-js-building-ui-interactions.md) - - [Developing Animations](ui-js-building-ui-animation.md) - - [Defining Events](ui-js-building-ui-event.md) - - [Defining Page Routes](ui-js-building-ui-routes.md) - - - [Common Component Development Guidelines](ui-js-common-components.md) - - [Text](ui-js-components-text.md) - - [Input](ui-js-components-input.md) - - [Button](ui-js-components-button.md) - - [List](ui-js-components-list.md) - - [Picker](ui-js-components-picker.md) - - [Dialog](ui-js-components-dialog.md) - - [Form](ui-js-components-form.md) - - [Stepper](ui-js-components-stepper.md) - - [Tabs](ui-js-component-tabs.md) - - [Image](ui-js-components-images.md) - - - [Animation Development Guidelines](ui-js-animate.md) - - [CSS Animation](ui-js-animate-css.md) - - [Defining Attribute Style Animations](ui-js-animate-attribute-style.md) - - [Defining Animations with the transform Attribute](ui-js-animate-transform.md) - - [Defining Animations with the background-position Attribute](ui-js-animate-background-position-style.md) - - - [JS Animation](ui-js-animate-javascript.md) - - [Component Animation](ui-js-animate-component.md) - - [Interpolator Animation](ui-js-animate-interpolator.md) - - [Animation Effect](ui-js-animate-dynamic-effects.md) - - [Animation Frame](ui-js-animate-frame.md) - - - [Custom Components](ui-js-custom-components.md) - - - [TypeScript-based Declarative Development Paradigm](ui-arkui-ts.md) - - [Overview](ui-ts-overview.md) - - [Framework Overview](ts-framework.md) - - [File Organization](ts-framework-file.md) - - [Directory Structure](ts-framework-directory.md) - - [Rules for Accessing Application Code Files](ts-framework-file-access-rules.md) - - - ["js" Tag](ts-framework-js-tag.md) - - [Resource Access](ts-resource-access.md) - - [Accessing Application Resources](ts-application-resource-access.md) +- JavaScript-based Web-Like Development Paradigm + - [Overview](ui-js-overview.md) + - Framework + - [File Organization](js-framework-file.md) + - ["js" Tag](js-framework-js-tag.md) + - [app.js](js-framework-js-file.md) + - Syntax + - [HML](js-framework-syntax-hml.md) + - [CSS](js-framework-syntax-css.md) + - [JavaScript](js-framework-syntax-js.md) + - [Lifecycle](js-framework-lifecycle.md) + - [Resource Limitations and Access](js-framework-resource-restriction.md) + - [Multi-Language Capability](js-framework-multiple-languages.md) + - Building the UI + - [Component Overview](ui-js-building-ui-component.md) + - Building the Layout + - [Layout Description](ui-js-building-ui-layout-intro.md) + - [Adding Title and Paragraph Text](ui-js-building-ui-layout-text.md) + - [Adding an Image](ui-js-building-ui-layout-image.md) + - [Adding a Comment](ui-js-building-ui-layout-comment.md) + - [Adding a Container](ui-js-building-ui-layout-external-container.md) + - [Adding Interactions](ui-js-building-ui-interactions.md) + - [Developing Animations](ui-js-building-ui-animation.md) + - [Defining Events](ui-js-building-ui-event.md) + - [Defining Page Routes](ui-js-building-ui-routes.md) + - Common Component Development Guidelines + - [Text](ui-js-components-text.md) + - [Input](ui-js-components-input.md) + - [Button](ui-js-components-button.md) + - [List](ui-js-components-list.md) + - [Picker](ui-js-components-picker.md) + - [Dialog](ui-js-components-dialog.md) + - [Form](ui-js-components-form.md) + - [Stepper](ui-js-components-stepper.md) + - [Tabs](ui-js-component-tabs.md) + - [Image](ui-js-components-images.md) + - Animation Development Guidelines + - CSS Animation + - [Defining Attribute Style Animations](ui-js-animate-attribute-style.md) + - [Defining Animations with the transform Attribute](ui-js-animate-transform.md) + - [Defining Animations with the background-position Attribute](ui-js-animate-background-position-style.md) + - JS Animation + - [Component Animation](ui-js-animate-component.md) + - Interpolator Animation + - [Animation Effect](ui-js-animate-dynamic-effects.md) + - [Animation Frame](ui-js-animate-frame.md) + - [Custom Components](ui-js-custom-components.md) +- TypeScript-based Declarative Development Paradigm + - [Overview](ui-ts-overview.md) + - Framework Overview + - File Organization + - [Directory Structure](ts-framework-directory.md) + - [Rules for Accessing Application Code Files](ts-framework-file-access-rules.md) + - ["js" Tag](ts-framework-js-tag.md) + - Resource Access - [Media Resource Types](ts-media-resource-type.md) - - - [Pixel Units](ts-pixel-units.md) - - [Types](ts-types.md) - - - [Declarative Syntax](ts-declarative-syntax.md) - - [Overview](ts-syntax-intro.md) - - [General UI Description Specifications](ts-general-ui-description-specifications.md) - - [Basic Concepts](ts-general-ui-concepts.md) - - [Declarative UI Description Specifications](ts-declarative-ui-description-specifications.md) - - [Parameterless Configuration](ts-parameterless-configuration.md) - - [Configuration with Mandatory Parameters](ts-configuration-with-mandatory-parameters.md) - - [Attribution Configuration](ts-attribution-configuration.md) - - [Event Configuration](ts-event-configuration.md) - - [Child Component Configuration](ts-child-component-configuration.md) - - - [Componentization](ts-component-based.md) - - [@Component](ts-component-based-component.md) - - [@Entry](ts-component-based-entry.md) - - [@Preview](ts-component-based-preview.md) - - [@Builder](ts-component-based-builder.md) - - [@Extend](ts-component-based-extend.md) - - [@CustomDialog](ts-component-based-customdialog.md) - - - [About UI State Management](ts-ui-state-management.md) - - [Basic Concepts](ts-ui-state-mgmt-concepts.md) - - [Managing Component States](ts-managing-component-states.md) - - [@State](ts-component-states-state.md) - - [@Prop](ts-component-states-prop.md) - - [@Link](ts-component-states-link.md) - - - [Managing Application States](ts-managing-application-states.md) - - [APIs](ts-managing-application-states-apis.md) - - [AppStorage](ts-application-states-appstorage.md) - - [PersistentStorage](ts-application-states-apis-persistentstorage.md) - - [Environment](ts-application-states-apis-environment.md) - - - [Synchronization Between AppStorage and Components](ts-application-states-storagelink-storageprop.md) - - - [Managing Other States](ts-managing-other-states.md) - - [@observed and @objectLink](ts-other-states-observed-objectlink.md) - - [@Consume and @Provide](ts-other-states-consume-provide.md) - - [@Watch](ts-other-states-watch.md) - - - [About Rendering Control Syntax](ts-rending-control-syntax.md) - - [if/else](ts-rending-control-syntax-if-else.md) - - [ForEach](ts-rending-control-syntax-foreach.md) - - [LazyForEach](ts-rending-control-syntax-lazyforeach.md) - - - [About @Component](ts-a-deep-dive-into-component.md) - - [build Function](ts-function-build.md) - - [Custom Component Initialization](ts-custom-component-initialization.md) - - [Custom Component Lifecycle Callbacks](ts-custom-component-lifecycle-callbacks.md) - - [Example: Component Creation and Re-Initialization](ts-component-creation-re-initialization.md) - - - [About Syntactic Sugar](ts-syntactic-sugar.md) - - [@Decorator](ts-syntactic-sugar-decorator.md) - - [Chain Call](ts-syntactic-sugar-chaining.md) - - [struct](ts-syntactic-sugar-struct.md) - - [Instantiating a struct Without the new Keyword](ts-instantiating-a-struct-without-new-keyword.md) - - [Using a Separate Line for New Component](ts-using-a-separate-line-for-new-component.md) - - [Restrictions on Using TypeScript for Generators](ts-restrictions-for-generators.md) - - - [Experiencing the Declarative UI](ui-ts-experiencing-declarative-ui.md) - - [Creating a Declarative UI Project](ui-ts-creating-project.md) - - [Getting to Know Components](ui-ts-components.md) - - [Creating a Simple Page](ui-ts-creating-simple-page.md) - - - [Defining Page Layout and Connection](ui-ts-page-layout-connections.md) - - [Building a Food Data Model](ui-ts-building-data-model.md) - - [Building a Food Category List Layout](ui-ts-building-category-list-layout.md) - - [Building a Food Category Grid Layout](ui-ts-building-category-grid-layout.md) - - [Implementing Page Redirection and Data Transmission](ui-ts-page-redirection-data-transmission.md) + - [Pixel Units](ts-pixel-units.md) + - [Types](ts-types.md) + - Declarative Syntax + - [Overview](ts-syntax-intro.md) + - General UI Description Specifications + - [Basic Concepts](ts-general-ui-concepts.md) + - Declarative UI Description Specifications + - [Parameterless Configuration](ts-parameterless-configuration.md) + - [Configuration with Mandatory Parameters](ts-configuration-with-mandatory-parameters.md) + - [Attribution Configuration](ts-attribution-configuration.md) + - [Event Configuration](ts-event-configuration.md) + - [Child Component Configuration](ts-child-component-configuration.md) + - Componentization + - [@Component](ts-component-based-component.md) + - [@Entry](ts-component-based-entry.md) + - [@Preview](ts-component-based-preview.md) + - [@Builder](ts-component-based-builder.md) + - [@Extend](ts-component-based-extend.md) + - [@CustomDialog](ts-component-based-customdialog.md) + - About UI State Management + - [Basic Concepts](ts-ui-state-mgmt-concepts.md) + -[Managing Component States + - [@State](ts-component-states-state.md) + - [@Prop](ts-component-states-prop.md) + - [@Link](ts-component-states-link.md) + - Managing Application States + - [AppStorage](ts-application-states-appstorage.md) + - [PersistentStorage](ts-application-states-apis-persistentstorage.md) + - [Environment](ts-application-states-apis-environment.md) + - Managing Other States + - [@observed and @objectLink](ts-other-states-observed-objectlink.md) + - [@Consume and @Provide](ts-other-states-consume-provide.md) + - [@Watch](ts-other-states-watch.md) + - About Rendering Control Syntax + - [if/else](ts-rending-control-syntax-if-else.md) + - [ForEach](ts-rending-control-syntax-foreach.md) + - [LazyForEach](ts-rending-control-syntax-lazyforeach.md) + - About @Component + - [build Function](ts-function-build.md) + - [Custom Component Initialization](ts-custom-component-initialization.md) + - [Custom Component Lifecycle Callbacks](ts-custom-component-lifecycle-callbacks.md) + - [Example: Component Creation and Re-Initialization](ts-component-creation-re-initialization.md) + - [Syntactic Sugar](ts-syntactic-sugar.md) + - Experiencing the Declarative UI + - [Creating a Declarative UI Project](ui-ts-creating-project.md) + - [Getting to Know Components](ui-ts-components.md) + - [Creating a Simple Page](ui-ts-creating-simple-page.md) + - Defining Page Layout and Connection + - [Building a Food Data Model](ui-ts-building-data-model.md) + - [Building a Food Category List Layout](ui-ts-building-category-list-layout.md) + - [Building a Food Category Grid Layout](ui-ts-building-category-grid-layout.md) + - [Implementing Page Redirection and Data Transmission](ui-ts-page-redirection-data-transmission.md) -- Gitee From 7bf02cc9bda842f1cc2092c663e25a1c87682456 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 10:28:49 +0800 Subject: [PATCH 232/282] updated docs Signed-off-by: wusongqing --- en/application-dev/ui/Readme-EN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/application-dev/ui/Readme-EN.md b/en/application-dev/ui/Readme-EN.md index 40067e6674e..2a353af88ae 100755 --- a/en/application-dev/ui/Readme-EN.md +++ b/en/application-dev/ui/Readme-EN.md @@ -68,7 +68,7 @@ - [Attribution Configuration](ts-attribution-configuration.md) - [Event Configuration](ts-event-configuration.md) - [Child Component Configuration](ts-child-component-configuration.md) - - Componentization + - Componentization - [@Component](ts-component-based-component.md) - [@Entry](ts-component-based-entry.md) - [@Preview](ts-component-based-preview.md) @@ -77,7 +77,7 @@ - [@CustomDialog](ts-component-based-customdialog.md) - About UI State Management - [Basic Concepts](ts-ui-state-mgmt-concepts.md) - -[Managing Component States + - Managing Component States - [@State](ts-component-states-state.md) - [@Prop](ts-component-states-prop.md) - [@Link](ts-component-states-link.md) -- Gitee From 34fe807f96e9ac894129516730f71c3a296c3453 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 10:32:58 +0800 Subject: [PATCH 233/282] updated docs Signed-off-by: wusongqing --- en/application-dev/media/audio-overview.md | 4 +- .../reference/apis/js-apis-sensor.md | 521 +++++++++++++++++- .../reference/apis/js-apis-sensor.md | 2 +- 3 files changed, 520 insertions(+), 7 deletions(-) diff --git a/en/application-dev/media/audio-overview.md b/en/application-dev/media/audio-overview.md index 5aac5895bc5..c313e9315eb 100755 --- a/en/application-dev/media/audio-overview.md +++ b/en/application-dev/media/audio-overview.md @@ -1,8 +1,8 @@ # Audio Overview -OpenHarmony provides the audio module for your application to implement audio-related features, including audio playback and volume management. +You can use APIs provided by the audio module to implement audio-related features, including audio playback and volume management. ->![](../public_sys-resources/icon-note.gif) **NOTE:** +>![](../public_sys-resources/icon-note.gif) **NOTE** >Due to permission issues, the above features are temporarily unavailable for the standard system. ## Basic Concepts diff --git a/en/application-dev/reference/apis/js-apis-sensor.md b/en/application-dev/reference/apis/js-apis-sensor.md index 440a79eab19..8b9cf97f184 100644 --- a/en/application-dev/reference/apis/js-apis-sensor.md +++ b/en/application-dev/reference/apis/js-apis-sensor.md @@ -1,6 +1,6 @@ # Sensor -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. @@ -1172,9 +1172,72 @@ Unsubscribes from sensor data changes. console.info("Succeeded in unsubscribing from acceleration sensor data."); } ); - ``` +## sensor.transformCoordinateSystem + +transformCoordinateSystem(inRotationVector: Array<number>, coordinates: CoordinatesOptions, callback: AsyncCallback<Array<number>>): void + +Rotates a rotation vector so that it can represent the coordinate system in different ways. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------------- | ----------------------------------------- | ---- | ---------------------- | + | inRotationVector | Array<number> | Yes| Rotation vector to rotate.| + | coordinates | [CoordinatesOptions](#coordinatesoptions) | Yes| Direction of the coordinate system.| + | callback | AsyncCallback<Array<number>> | Yes| Callback used to return the rotation vector after being rotated.| + +- Example + + ``` + sensor.transformCoordinateSystem([1, 0, 0, 0, 1, 0, 0, 0, 1], {'axisX':2, 'axisY':3}, function(err, data) { + if (err) { + console.error("Operation failed. Error code: " + err.code + ", message: " + err.message); + return; + } + console.info("Operation successed. Data obtained: " + data.x); + for (var i=0; i < data.length; i++) { + console.info("transformCoordinateSystem data[ " + i + "] = " + data[i]); + } + }) + ``` + +## sensor.transformCoordinateSystem + +transformCoordinateSystem(inRotationVector: Array<number>, coordinates: CoordinatesOptions): Promise<Array<number>> + +Rotates a rotation vector so that it can represent the coordinate system in different ways. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ---------------- | ----------------------------------------- | ---- | ---------------- | + | inRotationVector | Array<number> | Yes| Rotation vector to rotate.| + | coordinates | [CoordinatesOptions](#coordinatesoptions) | Yes| Direction of the coordinate system.| + +- Return value + + | Type| Description| + | ---------------------------------- | ---------------------- | + | Promise<Array<number>> | Promise used to return the rotation vector after being converted.| + +- Example + + ``` + const promise = sensor.transformCoordinateSystem([1, 0, 0, 0, 1, 0, 0, 0, 1], {'axisX':2, 'axisY':3}); + promise.then((data) => { + console.info("Operation successed."); + for (var i=0; i < data.length; i++) { + console.info("transformCoordinateSystem data[ " + i + "] = " + data[i]); + } + }).catch((err) => { + console.info("Operation failed"); + }) + ``` + + + ## sensor.getGeomagneticField @@ -1207,7 +1270,7 @@ Obtains the geomagnetic field of a geographic location. This method uses a callb getGeomagneticField(locationOptions: LocationOptions, timeMillis: number): Promise<GeomagneticResponse> -Obtains the geomagnetic field of a geographic location. This method uses a callback to return the result. +Obtains the geomagnetic field of a geographic location. This method uses a promise to return the result. - Parameters | Name| Type| Mandatory| Description| @@ -1218,7 +1281,7 @@ Obtains the geomagnetic field of a geographic location. This method uses a callb - Return value | Type| Description| | -------- | -------- | - | Promise<[GeomagneticResponse](#geomagneticresponse)> | Callback used to return the geomagnetic field.| + | Promise<[GeomagneticResponse](#geomagneticresponse)> | Promise used to return the geomagnetic field.| - Example ``` @@ -1232,6 +1295,437 @@ Obtains the geomagnetic field of a geographic location. This method uses a callb }) ``` +## sensor.getAltitude + +getAltitude(seaPressure: number, currentPressure: number, callback: AsyncCallback<number>): void + +Obtains the altitude at which the device is located based on the sea-level atmospheric pressure and the current atmospheric pressure. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | --------------- | --------------------------- | ---- | ------------------------------------- | + | seaPressure | number | Yes| Sea-level atmospheric pressure, in hPa.| + | currentPressure | number | Yes| Current atmospheric pressure at the altitude where the device is located, in hPa.| + | callback | AsyncCallback<number> | Yes| Callback used to return the altitude, in meters.| + +- Example + + ``` + sensor.getAltitude(0, 200, function(err, data) { + if (err) { + console.error( + "Operation failed. Error code: " + err.code + ", message: " + err.message); + return; + } + console.info("Successed to get getAltitude interface get data: " + data); + }); + ``` + +## sensor.getAltitude + +getAltitude(seaPressure: number, currentPressure: number): Promise<number> + +Obtains the altitude at which the device is located based on the sea-level atmospheric pressure and the current atmospheric pressure. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | --------------- | ------ | ---- | ------------------------------------- | + | seaPressure | number | Yes| Sea-level atmospheric pressure, in hPa.| + | currentPressure | number | Yes| Atmospheric pressure at the altitude where the device is located, in hPa.| + +- Return value + + | Type| Description| + | --------------------- | ------------------------------------ | + | Promise<number> | Promise used to return the altitude, in meters.| + +- Example + + ``` + const promise = sensor.getAltitude(0, 200); + promise.then((data) => { + console.info(' sensor_getAltitude_Promise success', data); + }).catch((err) => { + console.error("Operation failed"); + }) + ``` + + +## sensor.getGeomagneticDip + +getGeomagneticDip(inclinationMatrix: Array<number>, callback: AsyncCallback<number>): void + +Obtains the magnetic dip based on the inclination matrix. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ----------------- | --------------------------- | ---- | ---------------------------- | + | inclinationMatrix | Array<number> | Yes| Inclination matrix.| + | callback | AsyncCallback<number> | Yes| Callback used to return the magnetic dip, in radians.| + +- Example + + ``` + sensor.getGeomagneticDip([1, 0, 0, 0, 1, 0, 0, 0, 1], function(err, data) { + if (err) { + console.error(LABEL + 'SensorJsAPI--->Failed to register data, error code is: ' + err.code + ', message: ' + + err.message); + return; + } + console.info(Successed to get getGeomagneticDip interface get data: " + data); + }) + ``` + +## sensor.getGeomagneticDip + +getGeomagneticDip(inclinationMatrix: Array<number>): Promise<number> + +Obtains the magnetic dip based on the inclination matrix. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ----------------- | ------------------- | ---- | -------------- | + | inclinationMatrix | Array<number> | Yes| Inclination matrix.| + +- Return value + + | Type| Description| + | --------------------- | ---------------------------- | + | Promise<number> | Promise used to return the magnetic dip, in radians.| + +- Example + + ``` + const promise = sensor.getGeomagneticDip([1, 0, 0, 0, 1, 0, 0, 0, 1]); + promise.then((data) => { + console.info(' getGeomagneticDip_promise successed', data); + }).catch((err) => { + console.error("Operation failed"); + }) + ``` + +## sensor. getAngleModify + +getAngleModify(currentRotationMatrix: Array<number>, preRotationMatrix: Array<number>, callback: AsyncCallback<Array<number>>): void + +Obtains the angle change between two rotation matrices. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | --------------------- | ---------------------------------------- | ---- | --------------------------------- | + | currentRotationMatrix | Array<number> | Yes| Current rotation matrix.| + | preRotationMatrix | Array<number> | Yes| The other rotation matrix.| + | callback | AsyncCallback<Array<number>> | Yes| Callback used to return the angle change around the z, x, and y axes.| + +- Example + + ``` + sensor. getAngleModify([1,0,0,0,1,0,0,0,1], [1, 0, 0, 0, 0.87, -0.50, 0, 0.50, 0.87], function(err, data) { + if (err) { + console.error(LABEL + 'Failed to register data, error code is: ' + err.code + ', message: ' + + err.message); + return; + } + console.info("SensorJsAPI--->Successed to get getAngleModifiy interface get data: " + data.x); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }) + ``` + + +## sensor. getAngleModify + +getAngleModify(currentRotationMatrix: Array<number>, preRotationMatrix: Array<number>): Promise<Array<number>> + +Obtains the angle change between two rotation matrices. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | --------------------- | ------------------- | ---- | ------------------ | + | currentRotationMatrix | Array<number> | Yes| Current rotation matrix.| + | preRotationMatrix | Array<number> | Yes| The other rotation matrix.| + +- Return value + + | Type| Description| + | ---------------------------------- | --------------------------------- | + | Promise<Array<number>> | Promise used to return the angle change around the z, x, and y axes.| + +- Example + + ``` + const promise = sensor.getAngleModify([1,0,0,0,1,0,0,0,1], [1,0,0,0,0.87,-0.50,0,0.50,0.87]); + promise.then((data) => { + console.info(LABEL + 'getAngleModifiy_promise success'); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }).catch((reason) => { + console.info(LABEL + "promise::catch", reason); + }) + ``` + + +## sensor.createRotationMatrix + +createRotationMatrix(rotationVector: Array<number>, callback: AsyncCallback<Array<number>>): void + +Converts a rotation vector into a rotation matrix. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------------- | ---------------------------------------- | ---- | -------------- | + | rotationVector | Array<number> | Yes| Rotation vector to convert.| + | callback | AsyncCallback<Array<number>> | Yes| Callback used to return the rotation matrix.| + +- Example + + ``` + sensor.createRotationMatrix([0.20046076, 0.21907, 0.73978853, 0.60376877], function(err, data) { + if (err) { + console.error(LABEL + 'SensorJsAPI--->Failed to register data, error code is: ' + err.code + ', message: ' + + err.message); + return; + } + console.info("SensorJsAPI--->Successed to get createRotationMatrix interface get data: " + data.x); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }) + ``` + + +## sensor.createRotationMatrix + +createRotationMatrix(rotationVector: Array<number>): Promise<Array<number>> + +Converts a rotation vector into a rotation matrix. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------------- | ------------------- | ---- | -------------- | + | rotationVector | Array<number> | Yes| Rotation vector to convert.| + +- Return value + + | Type| Description| + | ---------------------------------- | -------------- | + | Promise<Array<number>> | Promise used to return the rotation matrix.| + +- Example + + ``` + const promise = sensor.createRotationMatrix([0.20046076, 0.21907, 0.73978853, 0.60376877]); + promise.then((data) => { + console.info(LABEL + 'createRotationMatrix_promise success'); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }).catch((reason) => { + console.info(LABEL + "promise::catch", reason); + }) + ``` + + +## sensor.createQuaternion + +createQuaternion(rotationVector: Array<number>, callback: AsyncCallback<Array<number>>): void + +Converts a rotation vector into a quaternion. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------------- | ---------------------------------------- | ---- | -------------- | + | rotationVector | Array<number> | Yes| Rotation vector to convert.| + | callback | AsyncCallback<Array<number>> | Yes| Callback used to return the quaternion.| + +- Example + + ``` + sensor.createQuaternion([0.20046076, 0.21907, 0.73978853, 0.60376877], function(err, data) { + if (err) { + console.error(LABEL + 'SensorJsAPI--->Failed to register data, error code is: ' + err.code + ', message: ' + + err.message); + return; + } + console.info("SensorJsAPI--->Successed to get createQuaternion interface get data: " + data.x); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }) + ``` + + +## sensor.createQuaternion + +createQuaternion(rotationVector: Array<number>): Promise<Array<number>> + +Converts a rotation vector into a quaternion. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------------- | ------------------- | ---- | -------------- | + | rotationVector | Array<number> | Yes| Rotation vector to convert.| + +- Return value + + | Type| Description| + | ---------------------------------- | ------------ | + | Promise<Array<number>> | Promise used to return the quaternion.| + +- Example + + ``` + const promise = sensor.createQuaternion([0.20046076, 0.21907, 0.73978853, 0.60376877]); + promise.then((data) => { + console.info('createQuaternion_promise successed'); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }).catch((err) => { + console.info('promise failed'); + }) + ``` + + +## sensor.getDirection + +getDirection(rotationMatrix: Array<number>, callback: AsyncCallback<Array<number>>): void + +Obtains the device direction based on the rotation matrix. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------------- | ---------------------------------------- | ---- | --------------------------------- | + | rotationMatrix | Array<number> | Yes| Rotation matrix.| + | callback | AsyncCallback<Array<number>> | Yes| Callback used to return the rotation angle around the z, x, and y axes.| + +- Example + + ``` + sensor.getDirection([1, 0, 0, 0, 1, 0, 0, 0, 1], function(err, data) { + if (err) { + console.error(LABEL + 'SensorJsAPI--->Failed to register data, error code is: ' + err.code + ', message: ' + + err.message); + return; + } + console.info(LABEL + "SensorJsAPI--->Successed to get getDirection interface get data: " + data.x); + for (var i = 1; i < data.length; i++) { + console.info(TAG +"sensor_getDirection_callback" + data[i]); + } + }) + ``` + + +## sensor.getDirection + +getDirection(rotationMatrix: Array<number>): Promise<Array<number>> + +Obtains the device direction based on the rotation matrix. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | -------------- | ------------------- | ---- | -------------- | + | rotationMatrix | Array<number> | Yes| Rotation matrix.| + +- Return value + + | Type| Description| + | ---------------------------------- | --------------------------------- | + | Promise<Array<number>> | Promise used to return the rotation angle around the z, x, and y axes.| + +- Example + + ``` + const promise = sensor.getDirection([1, 0, 0, 0, 1, 0, 0, 0, 1]); + promise.then((data) => { + console.info(' sensor_getAltitude_Promise success', data.x); + for (var i = 1; i < data.length; i++) { + console.info(TAG +"sensor_getDirection_promise" + data[i]); + } + }).catch((err) => { + console.info('promise failed'); + }) + ``` + + +## sensor.createRotationMatrix + +createRotationMatrix(gravity: Array<number>, geomagnetic: Array<number>, callback: AsyncCallback<RotationMatrixResponse>): void + +Creates a rotation matrix based on the gravity vector and geomagnetic vector. This method uses a callback to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ----------- | ------------------------------------------------------------ | ---- | -------------- | + | gravity | Array<number> | Yes| Gravity vector.| + | geomagnetic | Array<number> | Yes| Geomagnetic vector.| + | callback | AsyncCallback<[RotationMatrixResponse](#rotationmatrixresponse)> | Yes| Callback used to return the rotation matrix.| + +- Example + + ``` + sensor.createRotationMatrix([-0.27775216, 0.5351276, 9.788099], [210.87253, -78.6096, -111.44444], function(err, data) { + if (err) { + console.error(LABEL + 'SensorJsAPI--->Failed to register data, error code is: ' + err.code + ', message: ' + + err.message); + return; + } + console.info("SensorJsAPI--->Successed to get createRotationMatrix interface get data: " + data.x); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]) + } + }) + ``` + + +## sensor.createRotationMatrix + +createRotationMatrix(gravity: Array<number>, geomagnetic: Array<number>,): Promise<RotationMatrixResponse> + +Creates a rotation matrix based on the gravity vector and geomagnetic vector. This method uses a promise to return the result. + +- Parameters + + | Name| Type| Mandatory| Description| + | ----------- | ------------------- | ---- | -------------- | + | gravity | Array<number> | Yes| Gravity vector.| + | geomagnetic | Array<number> | Yes| Geomagnetic vector.| + +- Return value + + | Type| Description| + | ------------------------------------------------------------ | -------------- | + | Promise<[RotationMatrixResponse](#rotationmatrixresponse)> | Promise used to return the rotation matrix.| + +- Example + + ``` + const promise = sensor.createRotationMatrix([-0.27775216, 0.5351276, 9.788099], [210.87253, -78.6096, -111.44444]); + promise.then((data) => { + console.info(LABEL + 'createRotationMatrix_promise successed'); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }).catch((err) => { + console.info(LABEL + 'promise failed'); + }) + ``` + ## SensorType @@ -1519,6 +2013,25 @@ Describes the sensor data reporting frequency. | -------- | -------- | -------- | | interval | number | Frequency at which a sensor reports data. The default value is 200,000,000 ns.| +## RotationMatrixResponse + +Describes the response for setting the rotation matrix. + +| Name| Type| Readable| Writable| Description| +| ----------- | ------------------- | ---- | ---- | ---------- | +| rotation | Array<number> | Yes| Yes| Rotation matrix.| +| inclination | Array<number> | Yes| Yes| Inclination matrix.| + + +## CoordinatesOptions + +Describes the coordinate options. + +| Name| Type| Readable| Writable| Description| +| ---- | -------- | ---- | ---- | ----------- | +| x | number | Yes| Yes| X coordinate direction.| +| y | number | Yes| Yes| Y coordinate direction.| + ## GeomagneticResponse diff --git a/zh-cn/application-dev/reference/apis/js-apis-sensor.md b/zh-cn/application-dev/reference/apis/js-apis-sensor.md index 660c64edcd2..315cf74f9f2 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-sensor.md +++ b/zh-cn/application-dev/reference/apis/js-apis-sensor.md @@ -1450,7 +1450,7 @@ getAngleModify(currentRotationMatrix: Array<number>, preRotationMatrix: Ar | 参数名 | 类型 | 必填 | 说明 | | --------------------- | ------------------- | ---- | ------------------ | | currentRotationMatrix | Array<number> | 是 | 表示当前旋转矩阵。 | - | preRotationMatrix | Array<number> | 是 | 表示当前旋转矩阵。 | + | preRotationMatrix | Array<number> | 是 | 表示旋转矩阵。 | - 返回值 -- Gitee From 119699a67badfded0c55cd3cacea6071459d573a Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 10:40:27 +0800 Subject: [PATCH 234/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-Context.md | 154 ++++++--- .../reference/apis/js-apis-ability-context.md | 304 +++++++++++++++++- .../apis/js-apis-dataAbilityHelper.md | 280 ++++++++++------ .../apis/js-apis-extension-context.md | 2 +- .../reference/apis/js-apis-particleAbility.md | 148 +++++---- .../apis/js-apis-service-extension-context.md | 42 ++- .../apis/js-apis-service-extension.md | 20 ++ .../reference/apis/js-apis-ability-context.md | 21 +- .../apis/js-apis-dataAbilityHelper.md | 2 +- 9 files changed, 742 insertions(+), 231 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-Context.md b/en/application-dev/reference/apis/js-apis-Context.md index 57a9f803f3f..ea7efb523f2 100644 --- a/en/application-dev/reference/apis/js-apis-Context.md +++ b/en/application-dev/reference/apis/js-apis-Context.md @@ -25,12 +25,16 @@ Obtains the local root directory of the application. This method uses a callback If this method is called for the first time, a root directory is created. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | -------------------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the local root directory of the application.| +| callback | AsyncCallback\ | Yes | Callback used to return the local root directory of the application.| **Example** @@ -52,9 +56,13 @@ Obtains the local root directory of the application. This method uses a promise If this method is called for the first time, a root directory is created. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Return value** -| Type| Description| +| Type | Description | | ---------------- | ---------------------- | | Promise\ | Promise used to return the local root directory of the application.| @@ -76,14 +84,18 @@ verifyPermission(permission: string, options: PermissionOptions, callback: Async Verifies whether a specific PID and UID have the given permission. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | --------------------------------------- | ---- | ------------------------------------- | -| permission | string | Yes| Name of the permission to verify.| -| options | [PermissionOptions](#permissionoptions) | Yes| Permission options.| -| callback | AsyncCallback\ | Yes| Callback used to return the permission verification result. The value **0** indicates that the PID and UID have the given permission, and the value **-1** indicates that the PID and UID do not have the given permission.| +| permission | string | Yes | Name of the permission to verify. | +| options | [PermissionOptions](#permissionoptions) | Yes | Permission options. | +| callback | AsyncCallback\ | Yes | Callback used to return the permission verification result. The value **0** indicates that the PID and UID have the given permission, and the value **-1** indicates that the PID and UID do not have the given permission.| **Example** @@ -107,10 +119,10 @@ Verifies whether the current PID and UID have the given permission. This method **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | ---------------------- | ---- | ------------------------------------- | -| permission | string | Yes| Name of the permission to verify.| -| callback | AsyncCallback\ | Yes| Callback used to return the permission verification result. The value **0** indicates that the PID and UID have the given permission, and the value **-1** indicates that the PID and UID do not have the given permission.| +| permission | string | Yes | Name of the permission to verify. | +| callback | AsyncCallback\ | Yes | Callback used to return the permission verification result. The value **0** indicates that the PID and UID have the given permission, and the value **-1** indicates that the PID and UID do not have the given permission.| **Example** @@ -126,17 +138,21 @@ verifyPermission(permission: string, options?: PermissionOptions): Promise\ | Promise used to return the permission verification result. The value **0** indicates that the PID and UID have the given permission, and the value **-1** indicates that the PID and UID do not have the given permission.| @@ -160,14 +176,18 @@ requestPermissionsFromUser(permissions: Array\, requestCode: number, res Requests certain permissions from the system. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------------- | ------------------------------------------------------------ | ---- | ----------------------------------------------- | -| permissions | Array\ | Yes| Permissions to request. This parameter cannot be **null**.| -| requestCode | number | Yes| Request code to be passed to **PermissionRequestResult**.| -| resultCallback | AsyncCallback<[PermissionRequestResult](#permissionrequestresult)> | Yes| Permission request result.| +| permissions | Array\ | Yes | Permissions to request. This parameter cannot be **null**. | +| requestCode | number | Yes | Request code to be passed to **PermissionRequestResult**.| +| resultCallback | AsyncCallback<[PermissionRequestResult](#permissionrequestresult)> | Yes | Permission request result. | **Example** ```js @@ -194,11 +214,15 @@ getApplicationInfo(callback: AsyncCallback\) Obtains information about the current application. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ------------------------------- | ---- | ------------------------ | -| callback | AsyncCallback\ | Yes| Callback used to return the application information.| +| callback | AsyncCallback\ | Yes | Callback used to return the application information.| **Example** @@ -216,9 +240,13 @@ getApplicationInfo(): Promise\ Obtains information about the current application. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Return value** -| Type| Description| +| Type | Description | | ------------------------- | ------------------ | | Promise\ | Promise used to return the application information.| @@ -241,11 +269,15 @@ getBundleName(callback: AsyncCallback\): void Obtains the bundle name of the current ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | ----------------------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the bundle name.| +| callback | AsyncCallback\ | Yes | Callback used to return the bundle name.| **Example** @@ -263,9 +295,13 @@ getBundleName(): Promise\ Obtains the bundle name of the current ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Return value** -| Type| Description| +| Type | Description | | ---------------- | ------------------------- | | Promise\ | Promise used to return the bundle name.| @@ -288,11 +324,15 @@ getProcessInfo(callback: AsyncCallback\) Obtains information about the current process, including the PID and process name. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | --------------------------- | ---- | -------------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the process information.| +| callback | AsyncCallback\ | Yes | Callback used to return the process information.| **Example** @@ -310,9 +350,13 @@ getProcessInfo(): Promise\ Obtains information about the current process, including the PID and process name. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Return value** -| Type| Description| +| Type | Description | | --------------------- | -------------- | | Promise\ | Promise used to return the process information.| @@ -337,11 +381,15 @@ Obtains the **ohos.bundle.ElementName** object of the current ability. This meth This method is available only to Page abilities. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | --------------------------- | ---- | ---------------------------------------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the **ohos.bundle.ElementName** object.| +| callback | AsyncCallback\ | Yes | Callback used to return the **ohos.bundle.ElementName** object.| **Example** @@ -361,9 +409,13 @@ Obtains the **ohos.bundle.ElementName** object of the current ability. This meth This method is available only to Page abilities. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Return value** -| Type| Description| +| Type | Description | | --------------------- | ------------------------------------------ | | Promise\ | Promise used to return the **ohos.bundle.ElementName** object.| @@ -384,9 +436,13 @@ getProcessName(callback: AsyncCallback\): void Obtains the name of the current process. This method uses a callback to return the result. -| Name| Type| Mandatory| Description| +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | -------------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the process name.| +| callback | AsyncCallback\ | Yes | Callback used to return the process name.| **Example** @@ -404,9 +460,13 @@ getProcessName(): Promise\ Obtains the name of the current process. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Return value** -| Type| Description| +| Type | Description | | ---------------- | -------------------- | | Promise\ | Promise used to return the process name.| @@ -429,11 +489,15 @@ getCallingBundle(callback: AsyncCallback\): void Obtains the bundle name of the calling ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | ------------------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the bundle name.| +| callback | AsyncCallback\ | Yes | Callback used to return the bundle name.| **Example** @@ -451,9 +515,13 @@ getCallingBundle(): Promise\ Obtains the bundle name of the calling ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + **Return value** -| Type| Description| +| Type | Description | | --------------- | ------------------------- | | Promise\ | Promise used to return the bundle name.| @@ -470,15 +538,15 @@ context.getCallingBundle().then((data) => { ## PermissionOptions -| Name| Readable/Writable| Type| Mandatory| Description| +| Name| Readable/Writable| Type | Mandatory| Description | | ---- | -------- | ------ | ---- | ------ | -| pid | Read-only| number | No| PID.| -| uid | Read-only| number | No| UID.| +| pid | Read-only | number | No | PID.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| +| uid | Read-only | number | No | UID.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| ## PermissionRequestResult -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ----------- | -------- | -------------- | ---- | ------------------ | -| requestCode | Read-only| number | Yes| Request code passed.| -| permissions | Read-only| Array\ | Yes| Permissions passed.| -| authResults | Read-only| Array\ | Yes| Permission request result.| +| requestCode | Read-only | number | Yes | Request code passed.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| +| permissions | Read-only | Array\ | Yes | Permissions passed.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core | +| authResults | Read-only | Array\ | Yes | Permission request result.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core | diff --git a/en/application-dev/reference/apis/js-apis-ability-context.md b/en/application-dev/reference/apis/js-apis-ability-context.md index 5d85731dc2e..7652774178a 100644 --- a/en/application-dev/reference/apis/js-apis-ability-context.md +++ b/en/application-dev/reference/apis/js-apis-ability-context.md @@ -1,12 +1,29 @@ # AbilityContext -> ![icon-note.gif](public_sys-resources/icon-note.gif) **Note:** -> The initial APIs of this module are supported since API 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API 9. Newly added APIs will be marked with a superscript to indicate their earliest API version. Implements the ability context. This module is inherited from **Context**. +## Usage + + +Before using the **AbilityContext** module, you must define a child class that inherits from **Ability**. + + + +``` +import Ability from '@ohos.application.Ability' +class MainAbility extends Ability { + onWindowStageCreate(windowStage) { + let context = this.context; + } +} +``` + + ## Attributes | Name| Type| Readable| Writable| Description| @@ -21,6 +38,10 @@ startAbility(want: Want, callback: AsyncCallback<void>): void Starts an ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -42,14 +63,53 @@ Starts an ability. This method uses a callback to return the result. ## startAbility -startAbility(want: Want): Promise<void>; +startAbility(want: Want, options: StartOptions, callback: AsyncCallback<void>): void + +Starts an ability. This method uses a callback to return the result. + +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | want | [Want](js-apis-featureAbility.md#Want) | Yes| Information about the **Want** used for starting an ability.| + | options | StartOptions | Yes| Parameters used for starting the ability.| + | callback | AsyncCallback<void> | Yes| Callback used to return the result.| + +- Example + + ``` + var want = { + "deviceId": "", + "bundleName": "com.extreme.test", + "abilityName": "com.extreme.test.MainAbility" + }; + var options = { + windowMode: 0, + }; + this.context.startAbility(want, options, (error) => { + console.log("error.code = " + error.code) + }) + ``` + + +## startAbility + +startAbility(want: Want, options: StartOptions): Promise<void>; Starts an ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | | want | [Want](js-apis-featureAbility.md#Want)| Yes| Information about the **Want** used for starting an ability.| + | options | StartOptions | Yes| Parameters used for starting the ability.| - Return value | Type| Description| @@ -63,7 +123,10 @@ Starts an ability. This method uses a promise to return the result. "bundleName": "com.extreme.test", "abilityName": "com.extreme.test.MainAbility" }; - this.context.startAbility(want) + var options = { + windowMode: 0, + }; + this.context.startAbility(want, options) .then((data) => { console.log('Operation successful.') }).catch((error) => { @@ -78,11 +141,15 @@ startAbilityForResult(want: Want, callback: AsyncCallback<AbilityResult>): Starts an ability. This method uses a callback to return the execution result when the ability is terminated. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | | want |[Want](js-apis-featureAbility.md#Want)| Yes| Information about the **Want** used for starting an ability.| - | callback | Callback<[AbilityResult](js-apis-featureAbility.md#abilityresult)> | Yes| Callback used to return the result.| + | callback | AsyncCallback<[AbilityResult](js-apis-featureAbility.md#abilityresult)> | Yes| Callback used to return the result.| - Example @@ -96,17 +163,55 @@ Starts an ability. This method uses a callback to return the execution result wh ); ``` +## startAbilityForResult + +startAbilityForResult(want: Want, options: StartOptions, callback: AsyncCallback<AbilityResult>): void; + +Starts an ability. This method uses a callback to return the execution result when the ability is terminated. + +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | want |[Want](js-apis-featureAbility.md#Want)| Yes| Information about the **Want** used for starting an ability.| + | options | StartOptions | Yes| Parameters used for starting the ability.| + | callback | AsyncCallback<[AbilityResult](js-apis-featureAbility.md#abilityresult)> | Yes| Callback used to return the result.| + + +- Example + ``` + var options = { + windowMode: 0, + }; + this.context.startAbilityForResult( + {bundleName: "com.extreme.myapplication", abilityName: "MainAbilityDemo2"}, options, + (error, result) => { + console.log("startAbilityForResult AsyncCallback is called, error.code = " + error.code) + console.log("startAbilityForResult AsyncCallback is called, result.resultCode = " + result.resultCode) + } + ); + ``` + ## startAbilityForResult -startAbilityForResult(want: Want): Promise<AbilityResult>; +startAbilityForResult(want: Want, options: StartOptions): Promise<AbilityResult>; Starts an ability. This method uses a promise to return the execution result when the ability is terminated. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | - | want | [Want](js-apis-featureAbility.md#Want)| Yes| Information about the **Want** used for starting an ability.| + | want | [Want](js-apis-featureAbility.md#Want)| Yes| Information about the **Want** used for starting an ability.| + | options | StartOptions | Yes| Parameters used for starting the ability.| + - Return value | Type| Description| @@ -115,7 +220,10 @@ Starts an ability. This method uses a promise to return the execution result whe - Example ``` - this.context.startAbilityForResult({bundleName: "com.extreme.myapplication", abilityName: "MainAbilityDemo2"}).then((result) => { + var options = { + windowMode: 0, + }; + this.context.startAbilityForResult({bundleName: "com.extreme.myapplication", abilityName: "MainAbilityDemo2"}, options).then((result) => { console.log("startAbilityForResult Promise.resolve is called, result.resultCode = " + result.resultCode) }, (error) => { console.log("startAbilityForResult Promise.Reject is called, error.code = " + error.code) @@ -129,16 +237,20 @@ terminateSelf(callback: AsyncCallback<void>): void; Terminates this ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | - | callback | AsyncCallback<void> | No| Callback used to return the result indicating whether the method is successfully called.| + | callback | AsyncCallback<void> | Yes| Callback used to return the result indicating whether the method is successfully called.| - Example ``` this.context.terminateSelf((err) => { - console.log('terminateSelf result:' + JSON.stringfy(err); - } + console.log('terminateSelf result:' + JSON.stringfy(err)); + }); ``` @@ -148,6 +260,10 @@ terminateSelf(): Promise<void>; Terminates this ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Return value | Type| Description| | -------- | -------- | @@ -157,7 +273,7 @@ Terminates this ability. This method uses a promise to return the result. ``` this.context.terminateSelf(want).then((data) => { console.log('success:' + JSON.stringfy(data)); - )).catch((error) => { + }).catch((error) => { console.log('failed:' + JSON.stringfy(error)); }); ``` @@ -169,11 +285,15 @@ terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback<voi Terminates this ability. This method uses a callback to return the information to the caller of **startAbilityForResult**. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | | parameter | [AbilityResult](js-apis-featureAbility.md#abilityresult) | Yes| Information returned to the caller.| - | callback | Callback<void> | No| Callback used to return the information.| + | callback | AsyncCallback<void> | Yes| Callback used to return the result.| - Example ``` @@ -194,6 +314,10 @@ terminateSelfWithResult(parameter: AbilityResult): Promise<void>; Terminates this ability. This method uses a promise to return information to the caller of **startAbilityForResult**. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -215,3 +339,157 @@ Terminates this ability. This method uses a promise to return information to the } ) ``` + + +## startAbilityByCall + +startAbilityByCall(want: Want): Promise<Caller>; + +Obtains the caller interface of the specified ability, and if the specified ability is not started, starts the ability in the background. + +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | want | [Want](js-apis-featureAbility.md#Want)| Yes| Information about the ability to start, including the ability name, bundle name, and device ID. If the device ID is left blank or the default value is used, the local ability will be started.| + +- Return value + | Type| Description| + | -------- | -------- | + | Promise<> | Promise used to return the caller object to communicate with.| + +- Example + + ``` + import Ability from '@ohos.application.Ability'; + var caller; + export default class MainAbility extends Ability { + onWindowStageCreate(windowStage) { + this.context.startAbilityByCall({ + bundleName: "com.example.myservice", + abilityName: "com.example.myservice.MainAbility", + deviceId: "" + }).then((obj) => { + caller = obj; + console.log('Caller GetCaller Get ' + call); + }).catch((e) => { + console.log('Caller GetCaller error ' + e); + }); + } + } + ``` + + +## requestPermissionsFromUser + +requestPermissionsFromUser(permissions: Array<string>, requestCallback: AsyncCallback<PermissionRequestResult>) : void; + +Requests permissions from the user by displaying a pop-up window. This method uses a callback to return the result. + +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | permissions | Array<string> | Yes| Permissions to request.| + | callback | AsyncCallback<[PermissionRequestResult](js-apis-permissionrequestresult.md)> | Yes| Callback used to return the result indicating whether the method is successfully called.| + +- Example + + ``` + this.context.requestPermissionsFromUser(permissions,(result) => { + console.log('requestPermissionsFromUserresult:' + JSON.stringfy(result)); + }); + ``` + + +## requestPermissionsFromUser + +requestPermissionsFromUser(permissions: Array<string>) : Promise<PermissionRequestResult>; + +Requests permissions from the user by displaying a pop-up window. This method uses a promise to return the result. + +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | permissions | Array<string> | Yes| Permissions to request.| + +- Return value + | Type| Description| + | -------- | -------- | + | Promise<[PermissionRequestResult](js-apis-permissionrequestresult.md)> | Promise used to return the result indicating whether the method is successfully called.| + +- Example + + ``` + this.context.requestPermissionsFromUser(permissions).then((data) => { + console.log('success:' + JSON.stringfy(data)); + }).catch((error) => { + console.log('failed:' + JSON.stringfy(error)); + }); + ``` + + +## setMissionLabel + +setMissionLabel(label: string, callback:AsyncCallback<void>): void; + +Sets the label of the ability displayed in the task. This method uses a callback to return the result. + +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | label | string | Yes| Label of the ability to set.| + | callback | AsyncCallback<void> | Yes| Callback used to return the result indicating whether the method is successfully called.| + +- Example + + ``` + this.context.setMissionLabel("test",(result) => { + console.log('requestPermissionsFromUserresult:' + JSON.stringfy(result)); + }); + ``` + + +## setMissionLabel + +setMissionLabel(label: string): Promise<void> + +Sets the label of the ability displayed in the task. This method uses a promise to return the result. + +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | label | string | Yes| Label of the ability to set.| + +- Return value + | Type| Description| + | -------- | -------- | + | Promise<void> | Promise used to return the result indicating whether the method is successfully called.| + +- Example + + ``` + this.context.setMissionLabel("test").then((data) => { + console.log('success:' + JSON.stringfy(data)); + }).catch((error) => { + console.log('failed:' + JSON.stringfy(error)); + }); + ``` diff --git a/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md b/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md index 75adfb3f60a..49e61156a49 100644 --- a/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md +++ b/en/application-dev/reference/apis/js-apis-dataAbilityHelper.md @@ -16,13 +16,17 @@ openFile(uri: string, mode: string, callback: AsyncCallback\): void Opens a file with a specified URI. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | ---------------------------------- | -| uri | string | Yes| URI of the file to open.| -| mode | string | Yes| Mode for opening the file. The value can be **rwt**.| -| callback | AsyncCallback\ | Yes| Callback used to return the file descriptor.| +| uri | string | Yes | URI of the file to open. | +| mode | string | Yes | Mode for opening the file. The value can be **rwt**. | +| callback | AsyncCallback\ | Yes | Callback used to return the file descriptor.| **Example** @@ -46,15 +50,19 @@ openFile(uri: string, mode: string): Promise\ Opens a file with a specified URI. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | ---- | ------ | ---- | ------------------------ | -| uri | string | Yes| URI of the file to open.| -| mode | string | Yes| Mode for opening the file. The value can be **rwt**.| +| uri | string | Yes | URI of the file to open.| +| mode | string | Yes | Mode for opening the file. The value can be **rwt**. | **Return value** -| Type| Description| +| Type | Description | | ---------------- | ---------------- | | Promise\ | Promise used to return the file descriptor.| @@ -79,13 +87,17 @@ on(type: 'dataChange', uri: string, callback: AsyncCallback\): void Registers an observer to observe data specified by a given URI. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | -------------------- | ---- | ------------------------ | -| type | string | Yes| Type of the event to observe. The value is **dataChange**.| -| uri | string | Yes| URI of the data.| -| callback | AsyncCallback\ | Yes| Callback invoked when the data is changed.| +| type | string | Yes | Type of the event to observe. The value is **dataChange**. | +| uri | string | Yes | URI of the data.| +| callback | AsyncCallback\ | Yes | Callback invoked when the data is changed. | **Example** @@ -110,13 +122,17 @@ off(type: 'dataChange', uri: string, callback?: AsyncCallback\): void Unregisters the observer used to observe data specified by a given URI. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | -------------------- | ---- | ------------------------ | -| type | string | Yes| Type of the event to observe. The value is **dataChange**.| -| uri | string | Yes| URI of the data.| -| callback | AsyncCallback\ | No| Callback used to return the result.| +| type | string | Yes | Type of the event to observe. The value is **dataChange**. | +| uri | string | Yes | URI of the data.| +| callback | AsyncCallback\ | No | Callback used to return the result. | **Example** @@ -145,12 +161,16 @@ getType(uri: string, callback: AsyncCallback\): void Obtains the MIME type of the data specified by a given URI. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | --------------------------------------------- | -| uri | string | Yes| URI of the data.| -| callback | AsyncCallback\ | Yes| Callback used to return the MIME type.| +| uri | string | Yes | URI of the data. | +| callback | AsyncCallback\ | Yes | Callback used to return the MIME type.| **Example** @@ -172,14 +192,18 @@ getType(uri: string): Promise\ Obtains the MIME type of the data specified by a given URI. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | ---- | ------ | ---- | ------------------------ | -| uri | string | Yes| URI of the data.| +| uri | string | Yes | URI of the data.| **Return value** -| Type| Description| +| Type | Description | | ---------------- | ----------------------------------- | | Promise\ | Promise used to return the MIME type.| @@ -203,13 +227,17 @@ getFileTypes(uri: string, mimeTypeFilter: string, callback: AsyncCallback> | Yes| Callback used to return the supported MIME types.| +| uri | string | Yes | URI of the file. | +| mimeTypeFilter | string | Yes | MIME type of the file. | +| callback | AsyncCallback\> | Yes | Callback used to return the supported MIME types.| **Example** @@ -234,15 +262,19 @@ getFileTypes(uri: string, mimeTypeFilter: string): Promise\> Obtains the supported MIME types of a specified file. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------------- | ------ | ---- | ---------------------------- | -| uri | string | Yes| URI of the file.| -| mimeTypeFilter | string | Yes| MIME type of the file.| +| uri | string | Yes | URI of the file. | +| mimeTypeFilter | string | Yes | MIME type of the file.| **Return value** -| Type| Description| +| Type | Description | | ------------------------ | ------------------------ | | Promise\> | Promise used to return the supported MIME types.| @@ -267,12 +299,16 @@ normalizeUri(uri: string, callback: AsyncCallback\): void Converts the URI that refers to a Data ability into a normalized URI. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | ------------------------------------------------------------ | -| uri | string | Yes| URI object to normalize.| -| callback | AsyncCallback\ | Yes| Callback used to return the normalized URI object if the Data ability supports URI normalization. If the Data ability does not support URI normalization, **null** is returned.| +| uri | string | Yes | URI object to normalize. | +| callback | AsyncCallback\ | Yes | Callback used to return the normalized URI object if the Data ability supports URI normalization. If the Data ability does not support URI normalization, **null** is returned.| **Example** @@ -294,14 +330,18 @@ normalizeUri(uri: string): Promise\ Converts the URI that refers to a Data ability into a normalized URI. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | ---- | ------ | ---- | ----------------------- | -| uri | string | Yes| URI object to normalize.| +| uri | string | Yes | URI object to normalize.| **Return value** -| Type| Description| +| Type | Description | | ---------------- | ------------------------------------------------------ | | Promise\ | Promise used to return the normalized URI object if the Data ability supports URI normalization. If the Data ability does not support URI normalization, **null** is returned.| @@ -325,12 +365,16 @@ denormalizeUri(uri: string, callback: AsyncCallback\): void Converts a normalized URI generated by **DataAbilityHelper.normalizeUri(uri: string, callback: AsyncCallback\)** to a denormalized one. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ---------------------- | ---- | --------------------------------------------------- | -| uri | string | Yes| URI object to normalize.| -| callback | AsyncCallback\ | Yes| Callback used to return the denormalized URI object.| +| uri | string | Yes | URI object to normalize. | +| callback | AsyncCallback\ | Yes | Callback used to return the denormalized URI object.| **Example** @@ -354,14 +398,18 @@ denormalizeUri(uri: string): Promise\ Converts a normalized URI generated by **DataAbilityHelper.normalizeUri(uri: string)** to a denormalized one. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | ---- | ------ | ---- | ----------------------- | -| uri | string | Yes| URI object to normalize.| +| uri | string | Yes | URI object to normalize.| **Return value** -| Type| Description| +| Type | Description | | ---------------- | ----------------------------------------- | | Promise\ | Promise used to return the denormalized URI object.| @@ -385,12 +433,16 @@ notifyChange(uri: string, callback: AsyncCallback\): void Notifies the registered observer of a change to the data specified by the URI. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | -------------------- | ---- | ------------------------ | -| uri | string | Yes| URI of the data.| -| callback | AsyncCallback\ | Yes| Callback used to return the result.| +| uri | string | Yes | URI of the data.| +| callback | AsyncCallback\ | Yes | Callback used to return the result. | **Example** @@ -412,14 +464,18 @@ notifyChange(uri: string): Promise\ Notifies the registered observer of a change to the data specified by the URI. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | ---- | ------ | ---- | ------------------------ | -| uri | string | Yes| URI of the data.| +| uri | string | Yes | URI of the data.| **Return value** -| Type| Description| +| Type | Description | | -------------- | --------------------- | | Promise\ | Promise used to return the result.| @@ -443,13 +499,17 @@ insert(uri: string, valuesBucket: rdb.ValuesBucket, callback: AsyncCallback\ | Yes| Callback used to return the index of the inserted data record.| +| uri | string | Yes | URI of the data to insert. | +| valuesBucket | rdb.ValuesBucket | Yes | Data record to insert. If this parameter is **null**, a blank row will be inserted.| +| callback | AsyncCallback\ | Yes | Callback used to return the index of the inserted data record. | **Example** @@ -478,15 +538,19 @@ insert(uri: string, valuesBucket: rdb.ValuesBucket): Promise\ Inserts a single data record into the database. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------------ | ---------------- | ---- | ------------------------------------------------------ | -| uri | string | Yes| URI of the data to insert.| -| valuesBucket | rdb.ValuesBucket | Yes| Data record to insert. If this parameter is **null**, a blank row will be inserted.| +| uri | string | Yes | URI of the data to insert. | +| valuesBucket | rdb.ValuesBucket | Yes | Data record to insert. If this parameter is **null**, a blank row will be inserted.| **Return value** -| Type| Description| +| Type | Description | | ---------------- | ------------------------ | | Promise\ | Promise used to return the index of the inserted data record.| @@ -517,13 +581,17 @@ batchInsert(uri: string, valuesBuckets: Array, callback: Async Inserts multiple data records into the database. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------------ | ----------------------- | ---- | -------------------------------- | -| uri | string | Yes| URI of the data to insert.| -| valuesBucket | Array | Yes| Data records to insert.| -| callback | AsyncCallback\ | Yes| Callback used to return the number of inserted data records.| +| uri | string | Yes | URI of the data to insert. | +| valuesBucket | Array | Yes | Data records to insert. | +| callback | AsyncCallback\ | Yes | Callback used to return the number of inserted data records.| **Example** @@ -549,15 +617,19 @@ batchInsert(uri: string, valuesBuckets: Array): Promise\ | Yes| Data record to insert.| +| uri | string | Yes | URI of the data to insert.| +| valuesBucket | Array | Yes | Data record to insert. | **Return value** -| Type| Description| +| Type | Description | | ---------------- | ---------------------- | | Promise\ | Promise used to return the number of inserted data records.| @@ -585,13 +657,17 @@ delete(uri: string, predicates: dataAbility.DataAbilityPredicates, callback: Asy Deletes one or more data records from the database. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------------ | --------------------------------- | ---- | ------------------------------------------------ | -| uri | string | Yes| URI of the data to delete.| -| valuesBucket | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| -| callback | AsyncCallback\ | Yes| Callback used to return the number of deleted data records.| +| uri | string | Yes | URI of the data to delete. | +| valuesBucket | dataAbility.DataAbilityPredicates | Yes | Filter criteria. You should define the processing logic when this parameter is **null**.| +| callback | AsyncCallback\ | Yes | Callback used to return the number of deleted data records. | **Example** @@ -616,15 +692,19 @@ delete(uri: string, predicates: dataAbility.DataAbilityPredicates): Promise\ | Promise used to return the number of deleted data records.| @@ -650,14 +730,18 @@ update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.Data Updates data records in the database. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------------ | --------------------------------- | ---- | ------------------------------------------------ | -| uri | string | Yes| URI of the data to update.| -| valuesBucket | rdb.ValuesBucket | Yes| New values.| -| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| -| callback | AsyncCallback\ | Yes| Callback used to return the number of updated data records.| +| uri | string | Yes | URI of the data to update. | +| valuesBucket | rdb.ValuesBucket | Yes | New values. | +| predicates | dataAbility.DataAbilityPredicates | Yes | Filter criteria. You should define the processing logic when this parameter is **null**.| +| callback | AsyncCallback\ | Yes | Callback used to return the number of updated data records. | **Example** @@ -689,16 +773,20 @@ update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.Data Updates data records in the database. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------------ | --------------------------------- | ---- | ------------------------------------------------ | -| uri | string | Yes| URI of the data to update.| -| valuesBucket | rdb.ValuesBucket | Yes| New values.| -| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +| uri | string | Yes | URI of the data to update. | +| valuesBucket | rdb.ValuesBucket | Yes | New values. | +| predicates | dataAbility.DataAbilityPredicates | Yes | Filter criteria. You should define the processing logic when this parameter is **null**.| **Return value** -| Type| Description| +| Type | Description | | ---------------- | -------------------------------------------- | | Promise\ | Promise used to return the number of updated data records.| @@ -732,14 +820,18 @@ query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityP Queries data in the database. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | --------------------------------- | ---- | ------------------------------------------------ | -| uri | string | Yes| URI of the data to query.| -| columns | rdb.ValuesBucket | Yes| Columns to query. If this parameter is **null**, all columns will be queried.| -| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| -| callback | AsyncCallback\ | Yes| Callback used to return the data queried.| +| uri | string | Yes | URI of the data to query. | +| columns | rdb.ValuesBucket | Yes | Columns to query. If this parameter is **null**, all columns will be queried. | +| predicates | dataAbility.DataAbilityPredicates | Yes | Filter criteria. You should define the processing logic when this parameter is **null**.| +| callback | AsyncCallback\ | Yes | Callback used to return the data queried. | **Example** @@ -768,16 +860,20 @@ query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityP Queries data in the database. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | --------------------------------- | ---- | ------------------------------------------------ | -| uri | string | Yes| URI of the data to query.| -| columns | rdb.ValuesBucket | Yes| Columns to query. If this parameter is **null**, all columns will be queried.| -| predicates | dataAbility.DataAbilityPredicates | Yes| Filter criteria. You should define the processing logic when this parameter is **null**.| +| uri | string | Yes | URI of the data to query. | +| columns | rdb.ValuesBucket | Yes | Columns to query. If this parameter is **null**, all columns will be queried. | +| predicates | dataAbility.DataAbilityPredicates | Yes | Filter criteria. You should define the processing logic when this parameter is **null**.| **Return value** -| Type| Description| +| Type | Description | | ------------------- | -------------- | | Promise\ | Promise used to return the data queried.| diff --git a/en/application-dev/reference/apis/js-apis-extension-context.md b/en/application-dev/reference/apis/js-apis-extension-context.md index be430dce1a7..08f53266f7a 100644 --- a/en/application-dev/reference/apis/js-apis-extension-context.md +++ b/en/application-dev/reference/apis/js-apis-extension-context.md @@ -11,4 +11,4 @@ Implements the extension context. This module is inherited from **Context**. | Name| Type| Readable| Writable| Description| | -------- | -------- | -------- | -------- | -------- | -| currentHapModuleInfo | HapModuleInfo | Yes| No| Information about the current HAP.| +| currentHapModuleInfo | HapModuleInfo | Yes| No| Information about the current HAP.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| diff --git a/en/application-dev/reference/apis/js-apis-particleAbility.md b/en/application-dev/reference/apis/js-apis-particleAbility.md index fa68ababf9d..84d4281dd8e 100644 --- a/en/application-dev/reference/apis/js-apis-particleAbility.md +++ b/en/application-dev/reference/apis/js-apis-particleAbility.md @@ -16,13 +16,17 @@ startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\: v Starts a particle ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | ----------------------------------------------- | ---- | ----------------- | -| parameter | [StartAbilityParameter](#startabilityparameter) | Yes| Ability to start.| -| callback | AsyncCallback\ | Yes| Callback used to return the result.| +| parameter | [StartAbilityParameter](#startabilityparameter) | Yes | Ability to start.| +| callback | AsyncCallback\ | Yes | Callback used to return the result. | **Example** @@ -53,17 +57,25 @@ particleAbility.startAbility( ## particleAbility.startAbility +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + startAbility(parameter: StartAbilityParameter): Promise\ Starts a particle ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | ----------------------------------------------- | ---- | ----------------- | -| parameter | [StartAbilityParameter](#startabilityparameter) | Yes| Ability to start.| +| parameter | [StartAbilityParameter](#startabilityparameter) | Yes | Ability to start.| **Return value** -| Type| Description| +| Type | Description | | -------------- | ------------------------- | | Promise\ | Promise used to return the result.| @@ -99,11 +111,15 @@ terminateSelf(callback: AsyncCallback\): void Terminates this particle ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | -------------------- | ---- | -------------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the result.| +| callback | AsyncCallback\ | Yes | Callback used to return the result.| **Example** @@ -124,8 +140,12 @@ terminateSelf(): Promise\ Terminates this particle ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Return value** -| Type| Description| +| Type | Description | | -------------- | ------------------------- | | Promise\ | Promise used to return the result.| @@ -146,15 +166,19 @@ acquireDataAbilityHelper(uri: string): DataAbilityHelper Obtains a **dataAbilityHelper** object. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | :--- | ------ | ---- | ------------------------ | -| uri | string | Yes| URI of the file to open.| +| uri | string | Yes | URI of the file to open.| **Return value** -| Type| Description| +| Type | Description | | ----------------- | -------------------------------------------- | | DataAbilityHelper | A utility class used to help other abilities access a Data ability.| @@ -168,45 +192,45 @@ particleAbility.acquireDataAbilityHelper(uri) ## StartAbilityParameter -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ------------------- | -------- | --------------------- | ---- | ------------------------------------------------------------ | -| want | Read-only| [Want](#want) | Yes| Information about the ability to start.| -| abilityStartSetting | Read-only| {[key: string]: any} | No| Special attribute of the ability to start. This attribute can be passed in the method call.| +| want | Read-only | [Want](#want) | Yes | Information about the ability to start.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel | +| abilityStartSetting | Read-only | {[key: string]: any} | No | Special attribute of the ability to start. This attribute can be passed in the method call.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel| ## Want -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| deviceId | Read-only| string | No| ID of the device running the ability to start.| -| bundleName | Read-only| string | No| Bundle name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.| -| abilityName | Read-only| string | No| Name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.| -| uri | Read-only| string | No| URI information to match. If **uri** is specified in a **Want** object, the **Want** object will match the specified URI information, including **scheme**, **schemeSpecificPart**, **authority**, and **path**.| -| type | Read-only| string | No| MIME type, for example, **text/plain** or **image/***.| -| flags | Read-only| number | No| How the **Want** object will be handled. By default, numbers are passed in. For details, see [flags](#flags).| -| action | Read-only| string | No| Action option.| -| parameters | Read-only| {[key: string]: any} | No| List of parameters in the **Want** object.| -| entities | Read-only| Array\ | No| List of entities.| +| deviceId | Read-only | string | No | ID of the device running the ability to start.
System capabilities: SystemCapability.Ability.AbilityBase | +| bundleName | Read-only | string | No | Bundle name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.
System capabilities: SystemCapability.Ability.AbilityBase| +| abilityName | Read-only | string | No | Name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.
System capabilities: SystemCapability.Ability.AbilityBase| +| uri | Read-only | string | No | URI information to match. If **uri** is specified in a **Want** object, the **Want** object will match the specified URI information, including **scheme**, **schemeSpecificPart**, **authority**, and **path**.
System capabilities: SystemCapability.Ability.AbilityBase| +| type | Read-only | string | No | MIME type, for example, **text/plain** or **image/***.
System capabilities: SystemCapability.Ability.AbilityBase | +| flags | Read-only | number | No | How the **Want** object will be handled. By default, numbers are passed in. For details, see [flags](#flags).
System capabilities: SystemCapability.Ability.AbilityBase| +| action | Read-only | string | No | Action option.
System capabilities: SystemCapability.Ability.AbilityBase | +| parameters | Read-only | {[key: string]: any} | No | List of parameters in the **Want** object.
System capabilities: SystemCapability.Ability.AbilityBase | +| entities | Read-only | Array\ | No | List of entities.
System capabilities: SystemCapability.Ability.AbilityBase | ## flags -| Name| Value| Description| +| Name | Value | Description | | ------------------------------------ | ---------- | ------------------------------------------------------------ | -| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | Indicates the permission to read the URI.| -| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | Indicates the permission to write the URI.| -| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | Returns the result to the ability.| -| FLAG_ABILITY_CONTINUATION | 0x00000008 | Indicates whether the ability on the local device can be migrated to a remote device.| -| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | Indicates that a component does not belong to OHOS.| -| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | Indicates whether to enable an ability.| -| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | Indicates the permission to make the URI persistent.| -| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | Indicates the permission to verify URIs by prefix matching.| -| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | Supports cross-device startup in a distributed scheduler.| -| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | Indicates that the Service ability is started regardless of whether the host application has been started.| -| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | Indicates that the migration is reversible.| -| FLAG_INSTALL_ON_DEMAND | 0x00000800 | Indicates that the specific ability will be installed if it has not been installed.| -| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | Indicates that the specific ability will be installed in the background if it has not been installed.| -| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | Clears other operation missions. This flag can be set for the **Want** object passed to **ohos.app.Context#startAbility** and must be used together with **flag_ABILITY_NEW_MISSION**.| -| FLAG_ABILITY_NEW_MISSION | 0x10000000 | Creates a mission on the historical mission stack.| -| FLAG_ABILITY_MISSION_TOP | 0x20000000 | Starts the mission on the top of the existing mission stack; creates an ability instance if no mission exists.| +| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | Indicates the permission to read the URI.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | Indicates the permission to write the URI.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | Returns the result to the ability.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION | 0x00000008 | Indicates whether the ability on the local device can be migrated to a remote device.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | Indicates that a component does not belong to OHOS.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | Indicates whether to enable an ability.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | Indicates the permission to make the URI persistent.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | Indicates the permission to verify URIs by prefix matching.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | Supports cross-device startup in a distributed scheduler.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | Indicates that the Service ability is started regardless of whether the host application has been started.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | Indicates that the migration is reversible.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_ON_DEMAND | 0x00000800 | Indicates that the specific ability will be installed if it has not been installed.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | Indicates that the specific ability will be installed in the background if it has not been installed.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | Clears other operation missions. This flag can be set for the **Want** object passed to **ohos.app.Context#startAbility** and must be used together with **flag_ABILITY_NEW_MISSION**.
System capabilities: SystemCapability.Ability.AbilityBase| +| FLAG_ABILITY_NEW_MISSION | 0x10000000 | Creates a mission on the historical mission stack.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_MISSION_TOP | 0x20000000 | Starts the mission on the top of the existing mission stack; creates an ability instance if no mission exists.
System capabilities: SystemCapability.Ability.AbilityBase| ## AbilityStartSetting @@ -214,23 +238,23 @@ The **AbilityStartSetting** attribute is an object defined as [key: string]: any Defines special attributes of an ability, for example, **featureAbility.AbilityStartSetting.BOUNDS_KEY**. -| Name| Value| Description| +| Name | Value | Description | | --------------- | --------------- | -------------------------- | -| BOUNDS_KEY | "abilityBounds" | Ability window size.| -| WINDOW_MODE_KEY | "windowMode" | Ability window display mode.| -| DISPLAY_ID_KEY | "displayId" | Display device ID.| +| BOUNDS_KEY | "abilityBounds" | Ability window size.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_KEY | "windowMode" | Ability window display mode.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel | +| DISPLAY_ID_KEY | "displayId" | Display device ID.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel| ## AbilityWindowConfiguration Defines the window display modes of a Page ability, for example, **featureAbility.AbilityWindowConfiguration.WINDOW_MODE_UNDEFINED**. -| Name| Value| Description| +| Name | Value| Description | | --------------------------- | ---- | ---------- | -| WINDOW_MODE_UNDEFINED | 0 | The Page ability is in an undefined window display mode.| -| WINDOW_MODE_FULLSCREEN | 1 | The Page ability is in full screen mode.| -| WINDOW_MODE_SPLIT_PRIMARY | 100 | The Page ability is displayed in the primary window when it is in split-screen mode.| -| WINDOW_MODE_SPLIT_SECONDARY | 101 | The Page ability is displayed in the secondary window when it is in split-screen mode.| -| WINDOW_MODE_FLOATING | 102 | The Page ability is displayed in floating window mode.| +| WINDOW_MODE_UNDEFINED | 0 | The Page ability is in an undefined window display mode.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_FULLSCREEN | 1 | The Page ability is in full screen mode.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel | +| WINDOW_MODE_SPLIT_PRIMARY | 100 | The Page ability is displayed in the primary window when it is in split-screen mode.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel| +| WINDOW_MODE_SPLIT_SECONDARY | 101 | The Page ability is displayed in the secondary window when it is in split-screen mode.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel| +| WINDOW_MODE_FLOATING | 102 | The Page ability is displayed in floating window mode.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel | ## particleAbility.startBackgroundRunning @@ -239,6 +263,10 @@ startBackgroundRunning(id: number, request: NotificationRequest, callback: Async Requests a continuous task from the system. This method uses an asynchronous callback to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) +**System capabilities** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **Parameters** | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -295,6 +323,10 @@ wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { startBackgroundRunning(id: number, request: NotificationRequest): Promise<void> +**System capabilities** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + Requests a continuous task from the system. This method uses a promise to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) **Parameters** @@ -304,7 +336,7 @@ Requests a continuous task from the system. This method uses a promise to return | request | NotificationRequest | Yes| Notification parameter, which is used to display information in the notification bar.| **Return value** -| Type| Description| +| Type | Description | | -------------- | ------------------------- | | Promise\ | Promise used to return the result.| @@ -355,6 +387,10 @@ cancelBackgroundRunning(callback: AsyncCallback<void>): void; Requests to cancel a continuous task from the system. This method uses an asynchronous callback to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) +**System capabilities** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **Parameters** | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -382,8 +418,12 @@ cancelBackgroundRunning(): Promise<void>; Requests to cancel a continuous task from the system. This method uses a promise to return the result. (This method is of API 7 and will be deprecated. Use the counterpart in API 8.) +**System capabilities** + +SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + **Return value** -| Type| Description| +| Type | Description | | -------------- | ------------------------- | | Promise\ | Promise used to return the result.| diff --git a/en/application-dev/reference/apis/js-apis-service-extension-context.md b/en/application-dev/reference/apis/js-apis-service-extension-context.md index de067acf57d..1c1d2b615a5 100644 --- a/en/application-dev/reference/apis/js-apis-service-extension-context.md +++ b/en/application-dev/reference/apis/js-apis-service-extension-context.md @@ -16,10 +16,14 @@ startAbility(want: Want, callback: AsyncCallback<void>): void; Starts an ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | - | want | [Want](js-apis-featureAbility.md#Want)| Yes| Information about the ability to start, such as the ability name and bundle name.| + | want | [Want](js-apis-featureAbility.md#Want) | Yes| Information about the ability to start, such as the ability name and bundle name.| | callback | AsyncCallback<void> | No| Callback used to return the result indicating whether the method is successfully called.| - Example @@ -40,10 +44,14 @@ startAbility(want: Want): Promise<void>; Starts an ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | - | want | [Want](js-apis-featureAbility.md#Want)| Yes| Information about the ability to start, such as the ability name and bundle name.| + | want | [Want](js-apis-featureAbility.md#Want) | Yes| Information about the ability to start, such as the ability name and bundle name.| - Return value | Type| Description| @@ -70,6 +78,10 @@ terminateSelf(callback: AsyncCallback<void>): void; Terminates this ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -89,6 +101,10 @@ terminateSelf(): Promise<void>; Terminates this ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Return value | Type| Description| | -------- | -------- | @@ -110,10 +126,14 @@ connectAbility(want: Want, options: ConnectOptions): number; Connects this ability to a Service ability. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | - | want | [Want](js-apis-featureAbility.md#Want)| Yes| Information about the ability to connect to, such as the ability name and bundle name.| + | want | [Want](js-apis-featureAbility.md#Want) | Yes| Information about the ability to connect to, such as the ability name and bundle name.| | options | [ConnectOptions](#connectoptions) | Yes| Callback used to return the information indicating that the connection is successful, interrupted, or failed.| - Return value @@ -142,6 +162,10 @@ disconnectAbility(connection: number, callback:AsyncCallback<void>): void; Disconnects this ability from the Service ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -162,6 +186,10 @@ disconnectAbility(connection: number): Promise<void>; Disconnects this ability from the Service ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -171,7 +199,7 @@ Disconnects this ability from the Service ability. This method uses a promise to | Type| Description| | -------- | -------- | | Promise<void> | Promise used to return the result indicating whether the method is successfully called.| - + - Example ``` this.context.disconnectAbility(connection).then((data) => { // connection is the return value of connectAbility. @@ -188,6 +216,6 @@ Defines the **ConnectOptions** data structure. | Name| Description| | -------- | -------- | -| onConnect(elementName:ElementName, remote:IRemoteObject) | Called when this ability is connected to a Service ability.| -| onDisconnect(elementName:ElementName) | Called when the peer service is abnormal or killed.| -| onFailed(code: number) | Called when the connection fails.| +| onConnect(elementName:ElementName, remote:IRemoteObject) | Called when this ability is connected to a Service ability.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| +| onDisconnect(elementName:ElementName) | Called when the peer service is abnormal or killed.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| +| onFailed(code: number) | Called when the connection fails.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| diff --git a/en/application-dev/reference/apis/js-apis-service-extension.md b/en/application-dev/reference/apis/js-apis-service-extension.md index 3696ec05ec8..0a6b357e97f 100644 --- a/en/application-dev/reference/apis/js-apis-service-extension.md +++ b/en/application-dev/reference/apis/js-apis-service-extension.md @@ -32,6 +32,10 @@ onCreate(want: Want): void; Called when an extension is created to initialize the service logic. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -53,6 +57,10 @@ onDestroy(): void; Called when this extension is destroyed to clear resources. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Example ``` class ServiceExt extends ServiceExtension { @@ -69,6 +77,10 @@ onRequest(want: Want, startId: number): void; Called after **onCreate** is invoked when an ability is started by calling **startAbility**. The value of **startId** is incremented for each ability that is started. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -91,6 +103,10 @@ onConnect(want: Want): rpc.RemoteObject; Called after **onCreate** is invoked when an ability is started by calling **connectAbility**. A **RemoteObject** object is returned for communication with the client. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | @@ -126,6 +142,10 @@ onDisconnect(want: Want): void; Called when the ability is disconnected. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.Core + - Parameters | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | diff --git a/zh-cn/application-dev/reference/apis/js-apis-ability-context.md b/zh-cn/application-dev/reference/apis/js-apis-ability-context.md index fe0cc01c023..4f4ad5eda2f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-ability-context.md +++ b/zh-cn/application-dev/reference/apis/js-apis-ability-context.md @@ -1,24 +1,5 @@ # AbilityContext -- [使用说明](#使用说明) -- [属性](#属性) -- [startAbility](#startAbility) -- [startAbility](#startAbility) -- [startAbility](#startAbility) -- [startAbilityForResult](#startAbilityForResult) -- [startAbilityForResult](#startAbilityForResult) -- [startAbilityForResult](#startAbilityForResult) -- [terminateSelf](#terminateSelf) -- [terminateSelf](#terminateSelf) -- [terminateSelfWithResult](#terminateSelfWithResult) -- [terminateSelfWithResult](#terminateSelfWithResult) -- [startAbilityByCall](#startAbilityByCall) -- [requestPermissionsFromUser](#requestPermissionsFromUser) -- [requestPermissionsFromUser](#requestPermissionsFromUser) -- [setMissionLabel](#setMissionLabel) -- [setMissionLabel](#setMissionLabel) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > 本模块首批接口从API 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 @@ -485,7 +466,7 @@ SystemCapability.Ability.AbilityRuntime.Core ## setMissionLabel -setMissionLabel(label: string, callback:AsyncCallback<void>): void; +setMissionLabel(label: string): Promise<void> 设置ability在任务中显示的名称。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md index 7eb8db1ada1..b8137840e02 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md +++ b/zh-cn/application-dev/reference/apis/js-apis-dataAbilityHelper.md @@ -788,7 +788,7 @@ SystemCapability.Ability.AbilityRuntime.FAModel **返回值:** | 类型 | 说明 | | ---------------- | -------------------------------------------- | -| Promise\ | 返回值为Promise对象,Promise中包含应用信息。 | +| Promise\ | Promise中包含更新的数据记录数。 。 | **示例:** -- Gitee From 347f2564ed1fba4899328048492d3a60e2d38f9f Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 10:46:00 +0800 Subject: [PATCH 235/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-audio.md | 4328 ++++++++++++++--- .../reference/apis/js-apis-camera.md | 2575 ++++++---- 2 files changed, 5263 insertions(+), 1640 deletions(-) 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 607758131ea..85d2dc6b01e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-audio.md +++ b/zh-cn/application-dev/reference/apis/js-apis-audio.md @@ -1,1029 +1,4151 @@ -# 音频管理 +# Audio -> **说明:** -> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## 导入模块 +## Modules to Import ``` import audio from '@ohos.multimedia.audio'; ``` +## Required Permissions -## getAudioManager +None -getAudioManager(): AudioManager +## audioManager -获取音频管理器。 +getAudioManager\(\): AudioManager -**系统能力:** SystemCapability.Multimedia.Audio.Core +Obtains an **AudioManager** instance. -**返回值:** -| 类型 | 说明 | -| -------- | -------- | -| [AudioManager](#audiomanager) | 音频管理类。 | +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +**Return value** + + + + + + + + + + +

Type

+

Description

+

AudioManager

+

AudioManager object.

+
+ +**Example** -**示例:** ``` var audioManager = audio.getAudioManager(); ``` -## AudioVolumeType +## audioRenderer + +createAudioRenderer(options: AudioRendererOptions): AudioRenderer + +Obtains an **AudioRenderer** instance. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** +| Name | Type | Mandatory | Description | +| :--------- | :------------------- | :-------- | :---------------------- | +| options | AudioRendererOptions | Yes | Renderer configurations | + +**Return value** + +| Type | Description | +| ------------- | --------------------- | +| AudioRenderer | AudioRenderer object. | + +**Example** + +``` +var audioStreamInfo = { + samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, + channels: audio.AudioChannel.CHANNEL_1, + sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, + encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW +} + +var audioRendererInfo = { + content: audio.ContentType.CONTENT_TYPE_SPEECH, + usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, + rendererFlags: 1 +} + +var audioRendererOptions = { + streamInfo: audioStreamInfo, + rendererInfo: audioRendererInfo +} + +let audioRenderer = await audio.createAudioRenderer(audioRendererOptions); +``` + + +## systemSoundManager + +getSystemSoundManager(): SystemSoundManager + +Obtains a **SystemSoundManager** instance. + +**Parameters** + +None + +**Return value** + +| Type | Description | +| ------------------ | -------------------------- | +| SystemSoundManager | SystemSoundManager object. | + +**Example** + +``` +const systemSoundManager = audio.getSystemSoundManager(); +``` + + +## AudioVolumeType + +Enumerates audio stream types. + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Default Value

+

Description

+

VOICE_CALL

+

0

+

Audio stream for voice calls.
System capabilities: SystemCapability.Multimedia.Audio.Volume

+

RINGTONE

+

2

+

Audio stream for ringtones.
System capabilities: SystemCapability.Multimedia.Audio.Volume

+

MEDIA

+

3

+

Audio stream for media purpose.
System capabilities: SystemCapability.Multimedia.Audio.Volume

+

VOICE_ASSISTANT

+

9

+

Audio stream for voice assistant.
System capabilities: SystemCapability.Multimedia.Audio.Volume

+
+ + +## DeviceFlag + +Enumerates audio device flags. + + + + + + + + + + + + + + + + + + + + +

Name

+

Default Value

+

Description

+

OUTPUT_DEVICES_FLAG

+

1

+

Output device.
System capabilities: SystemCapability.Multimedia.Audio.Device

+

INPUT_DEVICES_FLAG

+

2

+

Input device.
System capabilities: SystemCapability.Multimedia.Audio.Device

+

ALL_DEVICES_FLAG

+

3

+

All devices.
System capabilities: SystemCapability.Multimedia.Audio.Device

+
+ + +## DeviceRole + +Enumerates audio device roles. + + + + + + + + + + + + + + + + +

Name

+

Default Value

+

Description

+

INPUT_DEVICE

+

1

+

Input role.
System capabilities: SystemCapability.Multimedia.Audio.Device

+

OUTPUT_DEVICE

+

2

+

Output role.
System capabilities: SystemCapability.Multimedia.Audio.Device

+
+ + +## DeviceType + +Enumerates audio device types. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Default Value

+

Description

+

INVALID

+

0

+

Invalid device.
System capabilities: SystemCapability.Multimedia.Audio.Device

+

SPEAKER

+

2

+

Speaker.
System capabilities: SystemCapability.Multimedia.Audio.Device

+

WIRED_HEADSET

+

3

+

Wired headset.
System capabilities: SystemCapability.Multimedia.Audio.Device

+

BLUETOOTH_SCO

+

7

+

Bluetooth device using the synchronous connection oriented (SCO) link.
System capabilities: SystemCapability.Multimedia.Audio.Device

+

BLUETOOTH_A2DP

+

8

+

Bluetooth device using the advanced audio distribution profile (A2DP).
System capabilities: SystemCapability.Multimedia.Audio.Device

+

MIC

+

15

+

Microphone.
System capabilities: SystemCapability.Multimedia.Audio.Device

+
+ +## ActiveDeviceType + +Enumerates the active device types. + +| Name | Default Value | Default Value | +| ------------- | ------ | ------------------------------------------------------------ | +| SPEAKER | 2 | Speaker.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_SCO | 7 | Bluetooth device using the SCO link.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | + + + +## AudioRingMode + +Enumerates ringer modes. + + + + + + + + + + + + + + + + + + + + +

Name

+

Default Value

+

Description

+

RINGER_MODE_SILENT

+

0

+

Silence mode.
System capabilities: SystemCapability.Multimedia.Audio.Communication

+

RINGER_MODE_VIBRATE

+

1

+

Vibration mode.
System capabilities: SystemCapability.Multimedia.Audio.Communication

+

RINGER_MODE_NORMAL

+

2

+

Normal mode.
System capabilities: SystemCapability.Multimedia.Audio.Communication

+
+ + +## AudioSampleFormat8+ +Enumerates the audio sample formats. + +| Name | Default Value | Description | +| :-------------------- | :------------ | :----------------------------------------------------------------------------------------------------- | +| SAMPLE_FORMAT_INVALID | -1 | Invalid format.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_FORMAT_U8 | 0 | Unsigned 8 bit integer.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_FORMAT_S16LE | 1 | Signed 16 bit integer, little endian.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_FORMAT_S24LE | 2 | Signed 24 bit integer, little endian.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_FORMAT_S32LE | 3 | Signed 32 bit integer, little endian.
System capabilities: SystemCapability.Multimedia.Audio.Core | + +## AudioChannel8+ +Enumerates the audio channels. + +| Name | Default Value | Description | +| :----- | :------------ | :-------------------------------------------------------------------------------- | +| CHANNEL_1 | 0x1 << 0 | Channel count 1.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| CHANNEL_2 | 0x1 << 1 | Channel count 2.
System capabilities: SystemCapability.Multimedia.Audio.Core | + +## AudioSamplingRate8+ +Enumerates the audio sampling rates. + +| Name | Default Value | Description | +| :---------------- | :------------ | :------------------------------------------------------------------------------------ | +| SAMPLE_RATE_8000 | 8000 | Sampling rate 8000.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_11025 | 11025 | Sampling rate 11025.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_12000 | 12000 | Sampling rate 12000.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_16000 | 16000 | Sampling rate 16000.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_22050 | 22050 | Sampling rate 22050.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_24000 | 24000 | Sampling rate 24000.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_32000 | 32000 | Sampling rate 32000.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_44100 | 44100 | Sampling rate 44100.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_48000 | 48000 | Sampling rate 48000.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_64000 | 64000 | Sampling rate 64000.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| SAMPLE_RATE_96000 | 96000 | Sampling rate 96000.
System capabilities: SystemCapability.Multimedia.Audio.Core | + + +## AudioEncodingType8+ +Enumerates the audio encoding types. + +| Name | Default Value | Description | +| :-------------------- | :------------- | :------------------------------------------------------------------------------- | +| ENCODING_TYPE_INVALID | -1 | Invalid.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| ENCODING_TYPE_RAW | 0 | PCM encoding.
System capabilities: SystemCapability.Multimedia.Audio.Core | + + +## ContentType8+ +Enumerates the content types. + +| Name | Default Value | Description | +| :------------------------ | :------------ | :------------------------------------------------------------------------------------- | +| CONTENT_TYPE_UNKNOWN | 0 | Unknown content.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| CONTENT_TYPE_SPEECH | 1 | Speech content.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| CONTENT_TYPE_MUSIC | 2 | Music content.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| CONTENT_TYPE_MOVIE | 3 | Movie content.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| CONTENT_TYPE_SONIFICATION | 4 | Notification content.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| CONTENT_TYPE_RINGTONE | 5 | Ringtone content.
System capabilities: SystemCapability.Multimedia.Audio.Core | + + +## StreamUsage8+ +Enumerates the stream usage. + +| Name | Default Value | Description | +| :--------------------------------- | :------------ | :----------------------------------------------------------------------------------------------- | +| STREAM_USAGE_UNKNOWN | 0 | Unknown usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STREAM_USAGE_MEDIA | 1 | Media usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STREAM_USAGE_VOICE_COMMUNICATION | 2 | Voice communication usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STREAM_USAGE_NOTIFICATION_RINGTONE | 3 | Notification or ringtone usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | + + +## AudioState8+ +Enumerates the audio states. + +| Name | Default Value | Description | +| :------------- | :------------ | :------------------------- | +| STATE_INVALID | -1 | Invalid state.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STATE_NEW | 0 | Create New instance state.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STATE_PREPARED | 1 | Prepared state.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STATE_RUNNING | 2 | Running state.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STATE_STOPPED | 3 | Stopped state.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STATE_RELEASED | 4 | Released state.
System capabilities: SystemCapability.Multimedia.Audio.Core | +| STATE_PAUSED | 5 | Paused state.
System capabilities: SystemCapability.Multimedia.Audio.Core | + + +## AudioRendererRate8+ +Enumerates the audio renderer rates. + +| Name | Default Value | Description | +| :----------------- | :------------ | :-------------------------------------------------------------------------------- | +| RENDER_RATE_NORMAL | 0 | Normal rate.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| RENDER_RATE_DOUBLE | 1 | Double rate.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| RENDER_RATE_HALF | 2 | Half rate.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | + + +## InterruptType8+ +Enumerates the interrupt types. + +| Name | Default Value | Description | +| :------------------- | :------------ | :-------------------------------------------------------------------------------------------------------- | +| INTERRUPT_TYPE_BEGIN | 1 | Audio playback interruption started.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| INTERRUPT_TYPE_END | 2 | Audio playback interruption ended.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | + + +## InterruptForceType8+ +Enumerates the interrupt force types. + +| Name | Default Value | Description | +| :-------------- | :------------ | :------------------------------------------------------------------------------------------------------------ | +| INTERRUPT_FORCE | 0 | Forced action taken by system.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| INTERRUPT_SHARE | 1 | App can choose to take action or ignore.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | + + +## InterruptHint8+ +Enumerates the interrupt hints. + +| Name | Default Value | Description | +| :-------------------- | :------------ | :---------------------------------------------------------------------------------------------- | +| INTERRUPT_HINT_NONE | 0 | None.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| INTERRUPT_HINT_RESUME | 1 | Resume the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| INTERRUPT_HINT_PAUSE | 2 | Paused/Pause the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| INTERRUPT_HINT_STOP | 3 | Stopped/Stop the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| INTERRUPT_HINT_DUCK | 4 | Ducked the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | +| INTERRUPT_HINT_UNDUCK | 5 | Unducked the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | + + +## RingtoneType8+ +Enumerates the ringtone types. + +| Name | Default Value | Description | +| :--------------------- | :------------ | :-------------- | +| RINGTONE_TYPE_DEFAULT | 0 | Default type. | +| RINGTONE_TYPE_MULTISIM | 1 | Multi-SIM type. | + +## AudioStreamInfo8+ +Describes audio stream information. + +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------------ | :-------------------- | :-------- | :-------------------- | +| samplingRate | AudioSamplingRate | Yes | Sampling rate. | +| channels | AudioChannel | Yes | Audio channels. | +| sampleFormat | AudioSampleFormat | Yes | Audio sample format. | +| encodingType | AudioEncodingType | Yes | Audio encoding type. | + +## AudioRendererInfo8+ +Describes audio renderer information. + +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------------ | :---------- | :-------- | :-------------------- | +| contentType | ContentType | Yes | Content type. | +| usage | StreamUsage | Yes | Stream usage. | +| rendererFlags | number | Yes | Audio renderer flags. | + +## AudioRendererOptions8+ +Describes audio renderer configuration options. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------------ | :---------------- | :-------- | :-------------------- | +| streamInfo | AudioStreamInfo | Yes | Stream information. | +| rendererInfo | AudioRendererInfo | Yes | Renderer information. | + +## InterruptEvent8+ +Describes the interrupt event received by the app when playback is interrupted. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :-------- | :----------------- | :-------- | :-------------------------------------------------------------------------- | +| eventType | InterruptType | Yes | Indicates whether the interruption has started or finished. | +| forceType | InterruptForceType | Yes | Indicates whether the action is taken by system or to be taken by the app. | +| hintType | InterruptHint | Yes | Indicates the kind of action. | + + +## VolumeEvent8+ +Describes the volume event received by the app when the volume is changed. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + +| Name | Type | Mandatory | Description | +| :--------- | :-------------- | :-------- | :--------------------------------------- | +| volumeType | AudioVolumeType | Yes | Volume type of the current stream. | +| volume | number | Yes | Volume level. | +| updateUi | boolean | Yes | Whether to show the volume change in UI. | + + +## RingtoneOptions8+ +Describes ringtone options. + +**Parameters** + +| Name | Type | Mandatory | Description | +| :----- | :------ | :-------- | :--------------- | +| volume | number | Yes | Ringtone volume. | +| loop | boolean | Yes | Loop value. | + + +# AudioManager + +Implements audio volume and audio device management. + +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +## audioManager.setVolume + +setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void + +Sets the volume for a stream. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

volume

+

number

+

Yes

+

Volume to set. The value range can be obtained by calling getMinVolume and getMaxVolume.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the result.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ + if (err) { + console.error('Failed to set the volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful volume setting.'); +}) +``` +## audioManager.setVolume + +setVolume\(volumeType: AudioVolumeType, volume: number\): Promise + +Sets the volume for a stream. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

volume

+

number

+

Yes

+

Volume to set. The value range can be obtained by calling getMinVolume and getMaxVolume.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the result.

+
+ +**Example** + +``` +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> + console.log('Promise returned to indicate a successful volume setting.'); +) +``` + +## audioManager.getVolume + +getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void + +Obtains the volume of a stream. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

callback

+

AsyncCallback<number>

+

Yes

+

Callback used to return the volume.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the volume is obtained.'); +}) +``` + + +## audioManager.getVolume + +getVolume\(volumeType: AudioVolumeType\): Promise + +Obtains the volume of a stream. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<number>

+

Promise used to return the volume.

+
+ +**Example** + +``` +audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the volume is obtained.' + value); +) +``` + + +## audioManager.getMinVolume + +getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void + +Obtains the minimum volume allowed for a stream. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

callback

+

AsyncCallback<number>

+

Yes

+

Callback used to return the minimum volume.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the minimum volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); +}) +``` + + +## audioManager.getMinVolume + +getMinVolume\(volumeType: AudioVolumeType\): Promise + +Obtains the minimum volume allowed for a stream. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<number>

+

Promise used to return the minimum volume.

+
+ +**Example** + +``` +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promised returned to indicate that the minimum volume is obtained.' + value); +) +``` + + +## audioManager.getMaxVolume + +getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void + +Obtains the maximum volume allowed for a stream. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

callback

+

AsyncCallback<number>

+

Yes

+

Callback used to return the maximum volume.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the maximum volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); +}) +``` + + +## audioManager.getMaxVolume + +getMaxVolume\(volumeType: AudioVolumeType\): Promise + +Obtains the maximum volume allowed for a stream. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<number>

+

Promise used to return the maximum volume.

+
+ +**Example** + +``` +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> + console.log('Promised returned to indicate that the maximum volume is obtained.'); +) +``` + +## audioManager.mute + +mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void + +Mutes a stream. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

mute

+

boolean

+

Yes

+

Mute status to set. The value true means to mute the stream, and false means the opposite.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the result.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { + if (err) { + console.error('Failed to mute the stream. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the stream is muted.'); +}) +``` + + +## audioManager.mute + +mute\(volumeType: AudioVolumeType, mute: boolean\): Promise + +Mutes a stream. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

mute

+

boolean

+

Yes

+

Mute status to set. The value true means to mute the stream, and false means the opposite.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the result.

+
+ +**Example** + +``` +audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => + console.log('Promise returned to indicate that the stream is muted.'); +) +``` + + +## audioManager.isMute + +isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void + +Checks whether a stream is muted. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the mute status of the stream. The value true means that the stream is muted, and false means the opposite.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the mute status. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); +}) +``` + + +## audioManager.isMute + +isMute\(volumeType: AudioVolumeType\): Promise + +Checks whether a stream is muted. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<boolean>

+

Promise used to return the mute status of the stream. The value true means that the stream is muted, and false means the opposite.

+
+ +**Example** + +``` +audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); +) +``` + + +## audioManager.isActive + +isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\) + +Checks whether a stream is active. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the active status of the stream. The value true means that the stream is active, and false means the opposite.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the active status of the stream. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); +}) +``` + + +## audioManager.isActive + +isActive\(volumeType: AudioVolumeType\): Promise + +Checks whether a stream is active. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<boolean>

+

Promise used to return the active status of the stream. The value true means that the stream is active, and false means the opposite.

+
+ +**Example** + +``` +audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); +) +``` + + +## audioManager.setRingerMode + +setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void + +Sets the ringer mode. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Communication + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

mode

+

AudioRingMode

+

Yes

+

Ringer mode.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the result.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { + if (err) { + console.error('Failed to set the ringer mode.​ ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful setting of the ringer mode.'); +}) +``` + + +## audioManager.setRingerMode + +setRingerMode\(mode: AudioRingMode\): Promise + +Sets the ringer mode. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Communication + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

mode

+

AudioRingMode

+

Yes

+

Ringer mode.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the result.

+
+ +**Example** + +``` +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => + console.log('Promise returned to indicate a successful setting of the ringer mode.'); +) +``` + + +## audioManager.getRingerMode + +getRingerMode\(callback: AsyncCallback\): void + +Obtains the ringer mode. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Communication + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

callback

+

AsyncCallback<AudioRingMode>

+

Yes

+

Callback used to return the ringer mode.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.getRingerMode((err, value) => { + if (err) { + console.error('Failed to obtain the ringer mode.​ ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); +}) +``` + + +## audioManager.getRingerMode + +getRingerMode\(\): Promise + +Obtains the ringer mode. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Communication + +**Parameters** + +None + +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<AudioRingMode>

+

Promise used to return the ringer mode.

+
+ +**Example** + +``` +audioManager.getRingerMode().then((value) => + console.log('Promise returned to indicate that the ringer mode is obtained.' + value); +) +``` + + +## audioManager.setAudioParameter + +setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void + +Sets an audio parameter. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +**Parameters** + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter to set.

+

value

+

string

+

Yes

+

Value of the audio parameter to set.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the result.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { + if (err) { + console.error('Failed to set the audio parameter. ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful setting of the audio parameter.'); +}) +``` + + +## audioManager.setAudioParameter + +setAudioParameter\(key: string, value: string\): Promise + +Sets an audio parameter. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter to set.

+

value

+

string

+

Yes

+

Value of the audio parameter to set.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the result.

+
+ +**Example** + +``` +audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => + console.log('Promise returned to indicate a successful setting of the audio parameter.'); +) +``` + + +## audioManager.getAudioParameter + +getAudioParameter\(key: string, callback: AsyncCallback\) + +Obtains the value of an audio parameter. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter whose value is to be obtained.

+

callback

+

AsyncCallback<string>

+

Yes

+

Callback used to return the value of the audio parameter.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.getAudioParameter('PBits per sample', (err, value) => { + if (err) { + console.error('Failed to obtain the value of the audio parameter. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); +}) +``` + + +## audioManager.getAudioParameter + +getAudioParameter\(key: string\): Promise + +Obtains the value of an audio parameter. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Core + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter whose value is to be obtained.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<string>

+

Promise used to return the value of the audio parameter.

+
+ +**Example** + +``` +audioManager.getAudioParameter('PBits per sample').then((value) => + console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); +) +``` + + +## audioManager.getDevices + +getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void + +Obtains the audio devices with a specific flag. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceFlag

+

DeviceFlag

+

Yes

+

Audio device flag.

+

callback

+

AsyncCallback<AudioDeviceDescriptors>

+

Yes

+

Callback used to return the device list.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ + if (err) { + console.error('Failed to obtain the device list. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the device list is obtained.'); +}) +``` + + + +## audioManager.getDevices + +getDevices\(deviceFlag: DeviceFlag\): Promise + +Obtains the audio devices with a specific flag. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceFlag

+

DeviceFlag

+

Yes

+

Audio device flag.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<AudioDeviceDescriptors>

+

Promise used to return the device list.

+
+ +**Example** + +``` +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> + console.log('Promise returned to indicate that the device list is obtained.'); +) +``` + + +## audioManager.setDeviceActive + +setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void + +Sets a device to the active state. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type.

+

active

+

boolean

+

Yes

+

Active status to set. The value true means to set the device to the active status, and false means the opposite.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the result.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { + if (err) { + console.error('Failed to set the active status of the device. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the device is set to the active status.'); +}) +``` + + + +## audioManager.setDeviceActive + +setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise + +Sets a device to the active state. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type.

+

active

+

boolean

+

Yes

+

Active status to set. The value true means to set the device to the active status, and false means the opposite.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the result.

+
+ +**Example** + +``` +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> + console.log('Promise returned to indicate that the device is set to the active status.'); +) +``` + + +## audioManager.isDeviceActive + +isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void + +Checks whether a device is active. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type.

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the active status of the device.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { + if (err) { + console.error('Failed to obtain the active status of the device. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the active status of the device is obtained.'); +}) +``` + + +## audioManager.isDeviceActive + +isDeviceActive\(deviceType: DeviceType\): Promise + +Checks whether a device is active. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<boolean>

+

Promise used to return the active status of the device.

+
+ +**Example** + +``` +audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => + console.log('Promise returned to indicate that the active status of the device is obtained.' + value); +) +``` + + +## audioManager.setMicrophoneMute + +setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void + +Mutes or unmutes the microphone. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

mute

+

boolean

+

Yes

+

Mute status to set. The value true means to mute the microphone, and false means the opposite.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the result.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.setMicrophoneMute(true, (err) => { + if (err) { + console.error('Failed to mute the microphone. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the microphone is muted.'); +}) +``` + + +## audioManager.setMicrophoneMute + +setMicrophoneMute\(mute: boolean\): Promise + +Mutes or unmutes the microphone. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

mute

+

boolean

+

Yes

+

Mute status to set. The value true means to mute the microphone, and false means the opposite.

+
+ +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the result.

+
+ +**Example** + +``` +audioManager.setMicrophoneMute(true).then(() => + console.log('Promise returned to indicate that the microphone is muted.'); +) +``` + + +## audioManager.isMicrophoneMute + +isMicrophoneMute\(callback: AsyncCallback\): void + +Checks whether the microphone is muted. This method uses an asynchronous callback to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the mute status of the microphone. The value true means that the microphone is muted, and false means the opposite.

+
+ +**Return value** + +None + +**Example** + +``` +audioManager.isMicrophoneMute((err, value) => { + if (err) { + console.error('Failed to obtain the mute status of the microphone. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); +}) +``` + + +## audioManager.isMicrophoneMute + +isMicrophoneMute\(\): Promise + +Checks whether the microphone is muted. This method uses a promise to return the query result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +**Parameters** + +None + +**Return value** + + + + + + + + + + +

Type

+

Description

+

Promise<boolean>

+

Promise used to return the mute status of the microphone. The value true means that the microphone is muted, and false means the opposite.

+
+ +**Example** + +``` +audioManager.isMicrophoneMute().then((value) => + console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); +) +``` + + +## audioManager.on + +on(type: 'volumeChange', callback: Callback): void8+ + +Listens for system volume change events. This method uses a callback to get volume change events. + +**System capabilities**: SystemCapability.Multimedia.Audio.Volume + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :--------------------------------------------------- | +| type | string | Yes | Type of the playback event to listen for. | +| callback | Callback | Yes | Callback used to get the system volume change event. | + +**Return value** + +None + +**Example** + +``` +audioManager.on('volumeChange', (volumeEvent) => { + console.log('VolumeType of stream: ' + volumeEvent.volumeType); + console.log('Volume level: ' + volumeEvent.volume); + console.log('Whether to updateUI: ' + volumeEvent.updateUi); +}) +``` + + +## audioManager.on + +on(type: 'ringerModeChange', callback: Callback): void8+ + +Listens for ringer mode change events. This method uses a callback to get ringer mode changes. + +**System capabilities**: SystemCapability.Multimedia.Audio.Communication + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :----------------------- | :-------- | :-------------------------------------------- | +| type | string | Yes | Type of the playback event to listen for. | +| callback | Callback | Yes | Callback used to get the updated ringer mode. | + +**Return value** + +None + +**Example** + +``` +audioManager.on('ringerModeChange', (ringerMode) => { + console.log('Updated ringermode: ' + ringerMode); +}) +``` + +# AudioDeviceDescriptor +Describes an audio device. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +## AudioDeviceDescriptors + +type AudioDeviceDescriptors = Array\> : void\ +
+Array of AudioDeviceDescriptors, which is read-only. + +**System capabilities**: SystemCapability.Multimedia.Audio.Device + +## audioDeviceDescriptor.deviceRole + +readonly deviceRole: DeviceRole + +Defines the role of the device. + +| Name | Type | Readable | Writable | Description | +| :--------- | :--------- | :------- | :------- | ------------------ | +| deviceRole | DeviceRole | Yes | No | Audio device role. | + +## audioDeviceDescriptor.deviceType + +readonly deviceType: DeviceType + +Defines the type of the device. + +| Name | Type | Readable | Writable | Description | +| :--------- | :--------- | :------- | :------- | ------------------ | +| deviceType | DeviceType | Yes | No | Audio device type. | + +``` +function deviceProp(audioDeviceDescriptor, index, array) { + deviceRoleValue = audioDeviceDescriptor.deviceRole; + deviceTypeValue = audioDeviceDescriptor.deviceType; +} + +deviceRoleValue = null; +deviceTypeValue = null; +const promise = audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG); +promise.then(async function (audioDeviceDescriptors) { + console.info('getDevices OUTPUT_DEVICES_FLAG'); + audioDeviceDescriptors.forEach(deviceProp); + if (deviceTypeValue != null && deviceRoleValue != null){ + console.info('OUTPUT_DEVICES_FLAG : Pass'); + expect(true).assertTrue(); + } + else{ + console.error('OUTPUT_DEVICES_FLAG : fail'); + expect(false).assertTrue(); + } + }); + await promise; + done(); +}) +``` +# AudioRenderer +Provides audio playback APIs. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +## audioRenderer.state + +readonly state: AudioState 8+ + +Defines the current render state. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +| Name | Type | Readable | Writable | Description | +| :---- | :--------- | :------- | :------- | :------------------ | +| state | AudioState | Yes | No | Audio render state. | + +**Example** + +``` + var state = audioRenderer.state; +``` + +## audioRenderer.getRendererInfo + +getRendererInfo(callback: AsyncCallback): void8+ + +Gets the renderer information provided while creating a renderer instance. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :--------------------------------- | :-------- | :------------------------------------------------ | +| callback | AsyncCallback | Yes | Callback used to return the renderer information. | + +**Return value** + +None + +**Example** + +``` +audioRenderer.getRendererInfo((err, rendererInfo)=>{ + console.log('Renderer GetRendererInfo:'); + console.log('Renderer content:' + rendererInfo.content); + console.log('Renderer usage:' + rendererInfo.usage); + console.log('Renderer flags:' + rendererInfo.rendererFlags); +}) +``` + + +## audioRenderer.getRendererInfo + +getParams(): Promise8+ + +Gets the renderer information provided while creating a renderer instance. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :---------------------------- | :----------------------------------------------- | +| Promise | Promise used to return the renderer information. | + +**Example** + +``` +let rendererInfo = await audioRenderer.getRendererInfo(); +console.log('Renderer GetRendererInfo:'); +console.log('Renderer content:' + rendererInfo.content); +console.log('Renderer usage:' + rendererInfo.usage); +console.log('Renderer flags:' + rendererInfo.rendererFlags); +``` + +## audioRenderer.getStreamInfo + +getStreamInfo(callback: AsyncCallback): void8+ + +Gets the renderer stream information. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :--------------------------------- | :-------- | :---------------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the stream information. | + +**Return value** + +None + +**Example** + +``` +audioRenderer.getStreamInfo((err, streamInfo)=>{ + console.log('Renderer GetStreamInfo:'); + console.log('Renderer sampling rate:' + streamInfo.samplingRate); + console.log('Renderer channel:' + streamInfo.AudioChannel); + console.log('Renderer format:' + streamInfo.AudioSampleFormat); + console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); +}) +``` + +## audioRenderer.getStreamInfo + +getStreamInfo(): Promise8+ + +Gets the renderer stream information. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :---------------------------- | :--------------------------------------------- | +| Promise | Promise used to return the stream information. | + +**Example** + +``` +let streamInfo = await audioRenderer.getStreamInfo(); +console.log('Renderer GetStreamInfo:'); +console.log('Renderer sampling rate:' + streamInfo.samplingRate); +console.log('Renderer channel:' + streamInfo.AudioChannel); +console.log('Renderer format:' + streamInfo.AudioSampleFormat); +console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); +``` + +## audioRenderer.start + +start(callback: AsyncCallback): void8+ + +Starts the renderer. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :---------------------- | :-------- | :-------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | + +**Return value** + +None + +**Example** + +``` +audioRenderer.start((err)=>{ + if (err) { + console.error('Renderer start failed.'); + } else { + console.info('Renderer start success.'); + } +}) +``` + + +## audioRenderer.start + +start(): Promise8+ + +Starts the renderer. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | + +**Example** + +``` +await audioRenderer.start(); +``` + + +## audioRenderer.pause + +pause(callback: AsyncCallback): void8+ + +Pauses rendering. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :---------------------- | :-------- | :------------------------------------ | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | + +**Return value** + +None + +**Example** + +``` +audioRenderer.pause((err)=>{ + if (err) { + console.error('Renderer pause failed'); + } else { + console.log('Renderer paused.'); + } +}) +``` + + + +## audioRenderer.pause + +pause(): Promise8+ + +Pauses rendering. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | + +**Example** + +``` +await audioRenderer.pause(); +``` + + + +## audioRenderer.drain + +drain(callback: AsyncCallback): void8+ + +Drains the playback buffer. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :---------------------- | :-------- | :---------------------------------------| +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | + +**Return value** + +None + +**Example** + +``` +audioRenderer.drain((err)=>{ + if (err) { + console.error('Renderer drain failed'); + } else { + console.log('Renderer drained.'); + } +}) +``` + + +## audioRenderer.drain + +drain(): Promise8+ + +Drains the playback buffer. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | + +**Example** + +``` +await audioRenderer.drain(); +``` + + +## audioRenderer.stop + +stop(callback: AsyncCallback): void8+ + +Stops rendering. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :---------------------- | :-------- | :------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | + +**Return value** + +None + +**Example** + +``` +audioRenderer.stop((err)=>{ + if (err) { + console.error('Renderer stop failed'); + } else { + console.log('Renderer stopped.'); + } +}) +``` + + +## audioRenderer.stop + +stop(): Promise8+ + +Stops rendering. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | + +**Example** + +``` +await audioRenderer.stop(); +``` + + +## audioRenderer.release + +release(callback: AsyncCallback): void8+ + +Releases the renderer. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :---------------------- | :-------- | :------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | + +**Return value** + +None + +**Example** + +``` +audioRenderer.release((err)=>{ + if (err) { + console.error('Renderer release failed'); + } else { + console.log('Renderer released.'); + } +}) +``` + + + +## audioRenderer.release + +release(): Promise8+ + +Releases the renderer. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | + +**Example** + +``` +await audioRenderer.release(); +``` + + + +## audioRenderer.write + +write(buffer: ArrayBuffer, callback: AsyncCallback): void8+ + +Writes the buffer. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :---------------------- | :-------- | :--------------------------------------------------------------------------------------------------- | +| buffer | ArrayBuffer | Yes | Buffer to be written. | +| callback | AsyncCallback | Yes | Returns the number of bytes written if the operation is successful; returns an error code otherwise. | +| | | | | + +**Return value** + +None + +**Example** + +``` +let ss = fileio.createStreamSync(filePath, 'r'); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +audioRenderer.write(buf, (err, writtenbytes)=>{ + if (writtenbytes < 0) { + console.error('write failed.'); + } else { + console.log('Actual written bytes: ' + writtenbytes); + } +}) +``` + + +## audioRenderer.write + +write(buffer: ArrayBuffer): Promise8+ + +Writes the buffer. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :--------------- | :--------------------------------------------------------------------------------------------------- | +| Promise | Returns the number of bytes written if the operation is successful; returns an error code otherwise. | + +**Example** + +``` +let ss = fileio.createStreamSync(filePath, 'r'); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +let writtenbytes = await audioRenderer.write(buf); +if (writtenbytes < 0) { + console.error('write failed.'); +} else { + console.log('Actual written bytes: ' + writtenbytes); +} +``` + + + +## audioRenderer.getAudioTime + +getAudioTime(callback: AsyncCallback): void8+ + +Obtains the timestamp. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the timestamp. | +| | | | | + +**Return value** + +None + +**Example** + +``` +audioRenderer.getAudioTime((err, timestamp)=>{ + console.log('Current timestamp: ' + timestamp); +}) +``` + + +## audioRenderer.getAudioTime + +getAudioTime(): Promise8+ + +Obtains the timestamp. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +None + +**Return value** + +| Type | Description | +| :--------------- | :------------------------------------ | +| Promise | Promise used to return the timestamp. | + +**Example** + +``` +let timestamp = await audioRenderer.getAudioTime(); +console.log('Current timestamp: ' + timestamp); +``` + + +## audioRenderer.getBufferSize + +getBufferSize(callback: AsyncCallback): void8+ + +Obtains a reasonable minimum buffer size for rendering. This method uses an asynchronous callback to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer + +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :--------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the buffer size. | +| | | | | + +**Return value** + +None + +**Example** + +``` +audioRenderer.getBufferSize((err, bufferSize)=>{ + if (err) { + console.error('getBufferSize error'); + } +}) +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +``` + + +## audioRenderer.getBufferSize -枚举,音频流类型。 +getBufferSize(): Promise8+ -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| RINGTONE | 2 | 表示铃声。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | -| MEDIA | 3 | 表示媒体。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | +Obtains a reasonable minimum buffer size for rendering. This method uses a promise to return the result. +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer -## DeviceFlag +**Parameters** -枚举,可获取的设备种类。 +None -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| OUTPUT_DEVICES_FLAG | 1 | 表示输出设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| INPUT_DEVICES_FLAG | 2 | 表示输入设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| ALL_DEVICES_FLAG | 3 | 表示所有设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**Return value** +| Type | Description | +| :--------------- | :-------------------------------------- | +| Promise | Promise used to return the buffer size. | -## DeviceRole +**Example** -枚举,设备角色。 +``` +var bufferSize = await audioRenderer.getBufferSize(); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +``` -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| INPUT_DEVICE | 1 | 输入设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| OUTPUT_DEVICE | 2 | 输出设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +## audioRenderer.setRenderRate -## DeviceType +setRenderRate(rate: AudioRendererRate, callback: AsyncCallback): void8+ -枚举,设备类型。 +Sets the render rate. This method uses an asynchronous callback to return the result. -| 名称 | 默认值 | 描述 | -| -------------- | ------ | ------------------------------------------------------------ | -| INVALID | 0 | 无效设备。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| EARPIECE | 1 | 听筒。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| WIRED_HEADSET | 3 | 有线耳机。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP连接(Advanced Audio Distribution Profile)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| MIC | 15 | 麦克风。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer -## ActiveDeviceType +**Parameters** -枚举,活跃设备类型。 +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :------------------------------------ | +| rate | AudioRendererRate | Yes | Audio render rate. | +| callback | AsyncCallback | Yes | Callback used to return the result. | -| 名称 | 默认值 | 描述 | -| ------------- | ------ | ------------------------------------------------------------ | -| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**Return value** -## AudioRingMode +None -枚举,铃声模式。 +**Example** -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| RINGER_MODE_SILENT | 0 | 静音模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | -| RINGER_MODE_VIBRATE | 1 | 震动模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | -| RINGER_MODE_NORMAL | 2 | 响铃模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | +``` +audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL, (err)=> { + if (err) { + console.error('Failed to set params'); + } else { + console.log('Callback invoked to indicate a successful render rate setting.'); + } +}) +``` -## AudioManager +## audioRenderer.setRenderRate -管理音频音量和音频设备。 +setRenderRate(rate: AudioRendererRate): Promise8+ -### setVolume +Sets the render rate. This method uses a promise to return the result. -setVolume(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback<void>): void +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer -设置指定流的音量,使用callback方式返回异步结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Volume +| Name | Type | Mandatory | Description | +| :--- | :---------------- | :-------- | :----------------- | +| rate | AudioRendererRate | Yes | Audio render rate. | -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | -| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ - if (err) { - console.error('Failed to set the volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful volume setting.'); -}) +await audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL); ``` -### setVolume -setVolume(volumeType: AudioVolumeType, volume: number): Promise<void> +## audioRenderer.getRenderRate -设置指定流的音量,使用promise方式返回异步结果。 +getRenderRate(callback: AsyncCallback): void8+ -**系统能力:** SystemCapability.Multimedia.Audio.Volume +Obtains the current render rate. This method uses an asynchronous callback to return the result. -**参数:** +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | +**Parameters** +| Name | Type | Mandatory | Description | +| :------- | :-------------------------------- | :-------- | :--------------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the audio render rate. | -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<void> | Promise回调表示成功还是失败。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> - console.log('Promise returned to indicate a successful volume setting.'); -) +audioRenderer.getRenderRate((err, renderrate)=>{ + console.log('getRenderRate: ' + renderrate); +}) ``` -### getVolume -getVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void +## audioRenderer.getRenderRate + +getRenderRate(): Promise8+ + +Obtains the current render rate. This method uses a promise to return the result. + +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer -获取指定流的音量,使用callback方式返回异步结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Volume +None -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<number> | 是 | 回调返回音量大小。 | +| Type | Description | +| :-------------------------- | :-------------------------------------------- | +| Promise | Promise used to return the audio render rate. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the volume is obtained.'); -}) +let renderRate = await audioRenderer.getRenderRate(); +console.log('getRenderRate: ' + renderrate); ``` -### getVolume -getVolume(volumeType: AudioVolumeType): Promise<number> +## audioRenderer.on -获取指定流的音量,使用promise方式返回异步结果。 +on(type: 'interrupt', callback: Callback): void8+ -**系统能力:** SystemCapability.Multimedia.Audio.Volume +Listens for audio interrupt events. This method uses a callback to get interrupt events. The interrupt event is triggered when audio playback is interrupted. -**参数:** +**System capabilities**: SystemCapability.Multimedia.Audio.Renderer -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +**Parameters** +| Name | Type | Mandatory | Description | +| :------- | :------------------------ | :-------- | :---------------------------------------------- | +| type | string | Yes | Type of the playback event to listen for. | +| callback | Callback | Yes | Callback used to listen for interrupt callback. | -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<number> | Promise回调返回音量大小。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the volume is obtained.' + value); -) +audioRenderer.on('interrupt', (interruptEvent) => { + if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) { + switch (interruptEvent.hintType) { + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + console.log('Force paused. Stop writing'); + isPlay = false; + break; + case audio.InterruptHint.INTERRUPT_HINT_STOP: + console.log('Force stopped. Stop writing'); + isPlay = false; + break; + } + } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) { + switch (interruptEvent.hintType) { + case audio.InterruptHint.INTERRUPT_HINT_RESUME: + console.log('Resume force paused renderer or ignore'); + startRenderer(); + break; + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + console.log('Choose to pause or ignore'); + pauseRenderer(); + break; + } + } +}) ``` -### getMinVolume -getMinVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void -获取指定流的最小音量,使用callback方式返回异步结果。 +## SystemSoundManager + + +## systemSoundManager.setSystemRingtoneUri + +setSystemRingtoneUri(context: Context, uri: string, type: RingtoneType, callback: AsyncCallback): void8+ + +Sets the system ringtone URI. This method uses an asynchronous callback to return the result. + +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Volume +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :---------------------------------- | +| context | Context | Yes | Current application context. | +| uri | string | Yes | Ringtone URI to be set. | +| type | RingtoneType | Yes | Ringtone type to be set. | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<number> | 是 | 回调返回最小音量。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { +systemSoundManager.setSystemRingtoneUri(null, '/data/media/Ringtonetone.wav', + audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err)=> { if (err) { - console.error('Failed to obtain the minimum volume. ${err.message}'); - return; + console.error('Failed to setSystemRingtoneUri'); + } else { + console.log('Callback invoked to indicate a successful system ringtone URI setting.'); } - console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); }) ``` -### getMinVolume -getMinVolume(volumeType: AudioVolumeType): Promise<number> +## systemSoundManager.setSystemRingtoneUri -获取指定流的最小音量,使用promise方式返回异步结果。 +setSystemRingtoneUri(context: Context, uri: string, type: RingtoneType): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Volume +Sets the system ringtone URI. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| Name | Type | Mandatory | Description | +| :------ | :----------- | :-------- | :--------------------------- | +| context | Context | Yes | Current application context. | +| uri | string | Yes | Ringtone URI to be set. | +| type | RingtoneType | Yes | Ringtone type to be set. | +| | | | | -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<number> | Promise回调返回最小音量。 | +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promised returned to indicate that the minimum volume is obtained.' + value); -) +await systemSoundManager.setSystemRingtoneUri(null, '/data/media/Ringtone.wav', audio.RingtoneType.RINGTONE_TYPE_DEFAULT); ``` -### getMaxVolume -getMaxVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void +## systemSoundManager.getSystemRingtoneUri + +getSystemRingtoneUri(context: Context, type: RingtoneType, callback: AsyncCallback): void8+ + +Obtains the system ringtone URI. This method uses an asynchronous callback to return the result. -获取指定流的最大音量,使用callback方式返回异步结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Volume +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :---------------------------------- | +| context | Context | Yes | Current application context. | +| type | RingtoneType | Yes | Ringtone type to be obtained. | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<number> | 是 | 回调返回最大音量大小。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { +systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtoneUri)=>{ if (err) { - console.error('Failed to obtain the maximum volume. ${err.message}'); - return; + console.err('getSystemRingtoneUri failed'); + } else { + console.log('getSystemRingtoneUri success: ' + ringtoneUri); } - console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); }) ``` -### getMaxVolume -getMaxVolume(volumeType: AudioVolumeType): Promise<number> +## systemSoundManager.getSystemRingtoneUri -获取指定流的最大音量,使用promise方式返回异步结果。 +getSystemRingtoneUri(context: Context, type: RingtoneType): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Volume +Obtains the system ringtone URI. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +None -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<number> | Promise回调返回最大音量大小。 | +| Type | Description | +| :--------------- | :-------------------------------- | +| Promise | Promise used to the ringtone URI. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log('Promised returned to indicate that the maximum volume is obtained.'); -) +let ringtoneUri = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); +if (ringtoneUri == '/data/media/Believer60s.wav') { + console.log('getSystemRingtoneUri success: ' + uri); +} else { + console.log('getSystemRingtoneUri fail: ' + uri); +} ``` -### mute -mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback<void>): void +## systemSoundManager.getSystemRingtonePlayer + +getSystemRingtonePlayer(context: Context, type: RingtoneType, callback: AsyncCallback): void8+ + +Obtains the ringtone player. This method uses an asynchronous callback to return the result. -设置指定音量流静音,使用callback方式返回异步结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Volume +| Name | Type | Mandatory | Description | +| :------- | :------------------------------ | :-------- | :---------------------------------------- | +| context | Context | Yes | Current application context. | +| type | RingtoneType | Yes | Ringtone type to be obtained. | +| callback | AsyncCallback) | Yes | Ringtone player maintained in the system. | +| | | | | -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | -| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { +systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ if (err) { - console.error('Failed to mute the stream. ${err.message}'); - return; + console.err('getSystemRingtonePlayer failed'); + } else { + console.log('getSystemRingtonePlayer success: '); } - console.log('Callback invoked to indicate that the stream is muted.'); }) ``` -### mute - -mute(volumeType: AudioVolumeType, mute: boolean): Promise<void> -设置指定音量流静音,使用promise方式返回异步结果。 +## systemSoundManager.getSystemRingtonePlayer -**系统能力:** SystemCapability.Multimedia.Audio.Volume +getSystemRingtonePlayer(context: Context, type: RingtoneType): Promise8+ -**参数:** +Obtains the ringtone player. This method uses a promise to return the result. -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | +**Parameters** -**返回值:** +None -| 类型 | 说明 | -| -------- | -------- | -| Promise<void> | Promise回调表示成功还是失败。 | +**Return value** -**示例:** +| Type | Description | +| :----------------------- | :--------------------------------------- | +| Promise | Promise used return the ringtone player. | +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => - console.log('Promise returned to indicate that the stream is muted.'); -) +let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); ``` -### isMute +## systemSoundManager.setSystemNotificationUri + +setSystemNotificationUri(context: Context, uri: string, callback: AsyncCallback): void8+ -isMute(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void +Sets the system notification URI. This method uses an asynchronous callback to return the result. -获取指定音量流是否被静音,使用callback方式返回异步结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Volume +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :---------------------------------- | +| context | Context | Yes | Current application context. | +| uri | string | Yes | System notification URI to be set. | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<boolean> | 是 | 回调返回流静音状态,true为静音,false为非静音。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the mute status. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); +systemSoundManager.setSystemNotificationUri(null, '/data/media/Notification.wav'), (err)=> { + if (err) { + console.error('Failed to setSystemNotificationUri'); + } else { + console.log('Callback invoked to indicate a successful system notification URI setting.'); + } }) ``` -### isMute - -isMute(volumeType: AudioVolumeType): Promise<boolean> +## systemSoundManager.setSystemNotificationUri -获取指定音量流是否被静音,使用promise方式返回异步结果。 +setSystemNotificationUri(context: Context, uri: string): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Volume +Sets the system notification URI. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| Name | Type | Mandatory | Description | +| :------ | :------ | :-------- | :--------------------------------- | +| context | Context | Yes | Current application context. | +| uri | string | Yes | System notification URI to be set. | +| | | | | -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<boolean> | Promise回调返回流静音状态,true为静音,false为非静音。 | +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); -) +await systemSoundManager.setSystemNotificationUri(null, '/data/media/Notification.wav'); ``` -### isActive -isActive(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void +## systemSoundManager.getSystemNotificationUri + +getSystemNotificationUri(context: Context, callback: AsyncCallback): void8+ -获取指定音量流是否为活跃状态,使用callback方式返回异步结果。 +Obtains the system notification URI. This method uses an asynchronous callback to return the result. -**系统能力:** SystemCapability.Multimedia.Audio.Volume +**Parameters** -**参数:** +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :--------------------------------------------------- | +| context | Context | Yes | Current application context. | +| callback | AsyncCallback | Yes | Callback used to return the system notification URI. | +| | | | | -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<boolean> | 是 | 回调返回流的活跃状态,true为活跃,false为不活跃。 | +**Return value** -**示例:** +None + +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { +systemSoundManager.getSystemNotificationUri(null, (err, notificationUri)=>{ if (err) { - console.error('Failed to obtain the active status of the stream. ${err.message}'); - return; + console.err('getSystemNotificationUri failed'); + } else { + console.log('getSystemNotificationUri success: ' + notificationUri); } - console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); }) ``` -### isActive -isActive(volumeType: AudioVolumeType): Promise<boolean> +## systemSoundManager.getSystemNotificationUri -获取指定音量流是否为活跃状态,使用promise方式返回异步结果。 +getSystemNotificationUri(context: Context): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Volume +Obtains the system notification URI. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +None -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<boolean> | Promise回调返回流的活跃状态,true为活跃,false为不活跃。 | +| Type | Description | +| :--------------- | :-------------------------------------------------- | +| Promise | Promise used to return the system notification URI. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); -) +let notificationUri = await systemSoundManager.getSystemNotificationUri(null); +console.log('getSystemNotificationUri : ' + uri); ``` -### setRingerMode -setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void +## systemSoundManager.setSystemAlarmUri + +setSystemAlarmUri(context: Context, uri: string, callback: AsyncCallback): void8+ -设置铃声模式,使用callback方式返回异步结果。 +Sets the system alarm URI. This method uses an asynchronous callback to return the result. -**系统能力:** SystemCapability.Multimedia.Audio.Communication +**Parameters** -**参数:** +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :---------------------------------- | +| context | Context | Yes | Current application context. | +| uri | string | Yes | System alarm URI to be set. | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +**Return value** -**示例:** +None + +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { - if (err) { - console.error('Failed to set the ringer mode.​ ${err.message}'); - return; +systemSoundManager.setSystemAlarmUri(null, '/data/media/Alarm.wav'), (err)=> { + if (err) { + console.error('Failed to setSystemAlarmUri'); + } else { + console.log('Callback invoked to indicate a successful system alarm URI setting.'); } - console.log('Callback invoked to indicate a successful setting of the ringer mode.'); }) ``` -### setRingerMode -setRingerMode(mode: AudioRingMode): Promise<void> +## systemSoundManager.setSystemAlarmUri -设置铃声模式,使用promise方式返回异步结果。 +setSystemAlarmUri(context: Context, uri: string): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Communication +Sets the system alarm URI. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | +| Name | Type | Mandatory | Description | +| :------ | :------ | :-------- | :--------------------------- | +| context | Context | Yes | Current application context. | +| uri | string | Yes | System alarm URI to be set. | +| | | | | -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<void> | Promise回调返回设置成功或失败。 | +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => - console.log('Promise returned to indicate a successful setting of the ringer mode.'); -) +await systemSoundManager.setSystemAlarmUri(null, '/data/media/Alarm.wav'); ``` -### getRingerMode +## systemSoundManager.getSystemAlarmUri + +getSystemAlarmUri(context: Context, callback: AsyncCallback): void8+ -getRingerMode(callback: AsyncCallback<AudioRingMode>): void +Obtains the system alarm URI. This method uses an asynchronous callback to return the result. -获取铃声模式,使用callback方式返回异步结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Communication +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :-------------------------------------------- | +| context | Context | Yes | Current application context. | +| callback | AsyncCallback | Yes | Callback used to return the system alarm URI. | +| | | | | -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| callback | AsyncCallback<[AudioRingMode](#audioringmode)> | 是 | 回调返回系统的铃声模式。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getRingerMode((err, value) => { - if (err) { - console.error('Failed to obtain the ringer mode.​ ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); +systemSoundManager.getSystemAlarmUri(null, (err, alarmUri)=>{ + if (err) { + console.err('getSystemAlarmUri failed'); + } else { + console.log('getSystemAlarmUri success: ' + alarmUri); + } }) ``` -### getRingerMode +## systemSoundManager.getSystemAlarmUri -getRingerMode(): Promise<AudioRingMode> +getSystemAlarmUri(context: Context): Promise8+ -获取铃声模式,使用promise方式返回异步结果。 +Obtains the system alarm URI. This method uses a promise to return the result. -**系统能力:** SystemCapability.Multimedia.Audio.Communication +**Parameters** -**返回值:** +None -| 类型 | 说明 | -| -------- | -------- | -| Promise<[AudioRingMode](#audioringmode)> | Promise回调返回系统的铃声模式。 | +**Return value** -**示例:** +| Type | Description | +| :--------------- | :------------------------------------------- | +| Promise | Promise used to return the system alarm URI. | + +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getRingerMode().then((value) => - console.log('Promise returned to indicate that the ringer mode is obtained.' + value); -) +let alarmUri = await systemSoundManager.getSystemAlarmUri(null); +console.log('getSystemAlarmUri success: ' + alarmUri); ``` -### setAudioParameter -setAudioParameter(key: string, value: string, callback: AsyncCallback<void>): void +# RingtonePlayer -音频参数设置,使用callback方式返回异步结果。 +## ringtonePlayer.state -**系统能力:** SystemCapability.Multimedia.Audio.Core +readonly state: AudioState 8+ -**参数:** +Defines the current ringtone player state. -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 被设置的音频参数的键。 | -| value | string | 是 | 被设置的音频参数的值。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +| Name | Type | Readable | Writable | Description | +| :---- | :--------- | :------- | :------- | :--------------------- | +| state | AudioState | Yes | No | Ringtone player state. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { +systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ if (err) { - console.error('Failed to set the audio parameter. ${err.message}'); - return; + console.err('getSystemRingtonePlayer failed'); + return; + } else { + console.log('getSystemRingtonePlayer success'); } - console.log('Callback invoked to indicate a successful setting of the audio parameter.'); -}) -``` +}); -### setAudioParameter +var state = ringtonePlayer.state; +``` -setAudioParameter(key: string, value: string): Promise<void> -音频参数设置,使用promise方式返回异步结果。 +## ringtonePlayer.getTitle -**系统能力:** SystemCapability.Multimedia.Audio.Core +getTitle(callback: AsyncCallback): void8+ -**参数:** +Obtains the title of the ringtone. This method uses an asynchronous callback to return the result. -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 被设置的音频参数的键。 | -| value | string | 是 | 被设置的音频参数的值。 | +**Parameters** +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :------------------------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the title of the ringtone. | +| | | | | -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<void> | Promise回调返回设置成功或失败。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => - console.log('Promise returned to indicate a successful setting of the audio parameter.'); -) -``` - -### getAudioParameter - -getAudioParameter(key: string, callback: AsyncCallback<string>): void - -获取指定音频参数值,使用callback方式返回异步结果。 - -**系统能力:** SystemCapability.Multimedia.Audio.Core - -**参数:** - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 待获取的音频参数的键。 | -| callback | AsyncCallback<string> | 是 | 回调返回获取的音频参数的值。 | - -**示例:** +systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ + if (err) { + console.err('getSystemRingtonePlayer failed'); + return; + } else { + console.log('getSystemRingtonePlayer success'); + } +}); -``` -var audioManager = audio.getAudioManager(); -audioManager.getAudioParameter('PBits per sample', (err, value) => { +ringtonePlayer.getTitle((err, title)=>{ if (err) { - console.error('Failed to obtain the value of the audio parameter. ${err.message}'); - return; + console.err('getTitle failed'); + } else { + console.log('getTitle success: ' + title); } - console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); }) ``` -### getAudioParameter -getAudioParameter(key: string): Promise<string> +## ringtonePlayer.getTitle -获取指定音频参数值,使用promise方式返回异步结果。 +getTitle(): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Core +Obtains the title of the ringtone. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 待获取的音频参数的键。 | +None -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<string> | Promise回调返回获取的音频参数的值。 | +| Type | Description | +| :--------------- | :------------------------------------------------ | +| Promise | Promise used to return the title of the ringtone. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getAudioParameter('PBits per sample').then((value) => - console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); -) +let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); +let title = await ringtonePlayer.getTitle(); ``` -### getDevices -getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void +## ringtonePlayer.getAudioRendererInfo + +getAudioRendererInfo(callback: AsyncCallback): void8+ + +Obtains the audio renderer information. This method uses an asynchronous callback to return the result. + +**Parameters** -获取音频设备列表,使用callback方式返回异步结果。 +| Name | Type | Mandatory | Description | +| :------- | :-------------------------------- | :-------- | :------------------------------------------------------ | +| callback | AsyncCallback | Yes | Callback used to return the audio renderer information. | +| | | | | -**系统能力:** SystemCapability.Multimedia.Audio.Device +**Return value** -**参数:** +None -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | -| callback | AsyncCallback<[AudioDeviceDescriptors](#audiodevicedescriptors)> | 是 | 回调,返回设备列表。 | +**Example** -**示例:** ``` -var audioManager = audio.getAudioManager(); -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ - if (err) { - console.error('Failed to obtain the device list. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the device list is obtained.'); -}) +systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ + if (err) { + console.err('getSystemRingtonePlayer failed'); + return; + } else { + console.log('getSystemRingtonePlayer success: '); + } +}); + +ringtonePlayer.getAudioRendererInfo((err, rendererInfo)=>{ + if (err) { + console.err('getAudioRendererInfo failed'); + } else { + console.log('getAudioRendererInfo success'); + } +}); ``` -### getDevices -(deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors> +## ringtonePlayer.getAudioRendererInfo -获取音频设备列表,使用promise方式返回异步结果。 +getAudioRendererInfo(): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Device +Obtains the audio renderer information. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | +None -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<[AudioDeviceDescriptors](#audiodevicedescriptors)> | Promise回调返回设备列表。 | +| Type | Description | +| :-------------------------- | :----------------------------------------------------- | +| Promise | Promise used to return the audio renderer information. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> - console.log('Promise returned to indicate that the device list is obtained.'); -) +let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); +let rendererInfo = await ringtonePlayer.getAudioRendererInfo(); ``` -### setDeviceActive -setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback<void>): void +## ringtonePlayer.configure + +configure(options: RingtoneOptions, callback: AsyncCallback): void8+ -设置设备激活状态,使用callback方式返回异步结果。 +Configures ringtone options. This method uses an asynchronous callback to return the result. -**系统能力:** SystemCapability.Multimedia.Audio.Device +**Parameters** -**参数:** +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :---------------------------------- | +| options | RingtoneOptions | Yes | Ringtone options. | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | -| active | boolean | 是 | 设备激活状态。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +**Return value** -**示例:** +None + +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { +systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ if (err) { - console.error('Failed to set the active status of the device. ${err.message}'); - return; + console.err('getSystemRingtonePlayer failed'); + return; + } else { + console.log('getSystemRingtonePlayer success: '); + } +}); + +let ringtoneOptions = { + volume: 1, + loop: false +}; + +ringtonePlayer.configure(ringtoneOptions, (err)=> { + if (err) { + console.error('Failed to configure ringtone options'); + } else { + console.log('Callback invoked to indicate a successful ringtone options configuration.'); } - console.log('Callback invoked to indicate that the device is set to the active status.'); }) ``` -### setDeviceActive - -setDeviceActive(deviceType: DeviceType, active: boolean): Promise<void> -设置设备激活状态,使用promise方式返回异步结果。 +## ringtonePlayer.configure -**系统能力:** SystemCapability.Multimedia.Audio.Device +configure(options: RingtoneOptions): Promise8+ -**参数:** +Configures ringtone options. This method uses a promise to return the result. -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | -| active | boolean | 是 | 设备激活状态。 | +**Parameters** -**返回值:** +| Name | Type | Mandatory | Description | +| :------ | :-------------- | :-------- | :---------------- | +| options | RingtoneOptions | Yes | Ringtone options. | +| | | | | -| 类型 | 说明 | -| -------- | -------- | -| Promise<void> | Promise回调返回设置成功或失败。 | +**Return value** -**示例:** +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> - console.log('Promise returned to indicate that the device is set to the active status.'); -) +let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); +let ringtoneOptions = { + volume: 1, + loop: false +}; + +await ringtonePlayer.configure(ringtoneOptions); ``` -### isDeviceActive -isDeviceActive(deviceType: DeviceType, callback: AsyncCallback<boolean>): void +## ringtonePlayer.start + +start(callback: AsyncCallback): void8+ + +Starts playing ringtone. This method uses a callback to return the result. -获取指定设备的激活状态,使用callback方式返回异步结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Audio.Device +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :---------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -**参数:** +**Return value** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | -| callback | AsyncCallback<boolean> | 是 | 回调返回设备的激活状态。 | +None -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { +ringtonePlayer.start((err)=> { if (err) { - console.error('Failed to obtain the active status of the device. ${err.message}'); - return; + console.error('Failed to start playing ringtone'); + } else { + console.log('Ringtone start playing successfully.'); } - console.log('Callback invoked to indicate that the active status of the device is obtained.'); }) ``` -### isDeviceActive - -isDeviceActive(deviceType: DeviceType): Promise<boolean> +## ringtonePlayer.start -获取指定设备的激活状态,使用promise方式返回异步结果。 +start(): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Device +Starts playing ringtone. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +None -**返回值:** +**Return value** -| Type | Description | -| -------- | -------- | -| Promise<boolean> | Promise回调返回设备的激活状态。 | +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => - console.log('Promise returned to indicate that the active status of the device is obtained.' + value); -) +await ringtonePlayer.start(); ``` -### setMicrophoneMute -setMicrophoneMute(mute: boolean, callback: AsyncCallback<void>): void +## ringtonePlayer.stop + +stop(callback: AsyncCallback): void8+ -设置麦克风静音状态,使用callback方式返回异步结果。 +Stops playing ringtone. This method uses a callback to return the result. -**系统能力:** SystemCapability.Multimedia.Audio.Device +**Parameters** -**参数:** +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :---------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +**Return value** -**示例:** +None + +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setMicrophoneMute(true, (err) => { +ringtonePlayer.stop((err)=> { if (err) { - console.error('Failed to mute the microphone. ${err.message}'); - return; + console.error('Failed to stop playing ringtone'); + } else { + console.log('Ringtone stop playing successfully.'); } - console.log('Callback invoked to indicate that the microphone is muted.'); }) ``` -### setMicrophoneMute -setMicrophoneMute(mute: boolean): Promise<void> +## ringtonePlayer.stop -设置麦克风静音状态,使用promise方式返回异步结果。 +stop(): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Device +Stops playing ringtone. This method uses a promise to return the result. -**参数:** +**Parameters** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | +None -**返回值:** +**Return value** -| 类型 | 说明 | -| -------- | -------- | -| Promise<void> | Promise回调返回设置成功或失败。 | +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | -**示例:** +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.setMicrophoneMute(true).then(() => - console.log('Promise returned to indicate that the microphone is muted.'); -) +await ringtonePlayer.stop(); ``` -### isMicrophoneMute -isMicrophoneMute(callback: AsyncCallback<boolean>): void +## ringtonePlayer.release + +release(callback: AsyncCallback): void8+ -获取麦克风静音状态,使用callback方式返回异步结果。 +Releases ringtone player resources. This method uses a callback to return the result. -**系统能力:** SystemCapability.Multimedia.Audio.Device +**Parameters** -**参数:** +| Name | Type | Mandatory | Description | +| :------- | :------------------- | :-------- | :---------------------------------- | +| callback | AsyncCallback | Yes | Callback used to return the result. | +| | | | | -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| callback | AsyncCallback<boolean> | 是 | 回调返回系统麦克风静音状态,true为静音,false为非静音。 | +**Return value** -**示例:** +None + +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isMicrophoneMute((err, value) => { +ringtonePlayer.release((err)=> { if (err) { - console.error('Failed to obtain the mute status of the microphone. ${err.message}'); - return; + console.error('Failed to release ringtone player resource'); + } else { + console.log('Release ringtone player resource successfully.'); } - console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); }) ``` -### isMicrophoneMute -isMicrophoneMute(): Promise<boolean> +## ringtonePlayer.release -获取麦克风静音状态,使用promise方式返回异步结果。 +release(): Promise8+ -**系统能力:** SystemCapability.Multimedia.Audio.Device +Releases ringtone player resource. This method uses a promise to return the result. -**返回值:** +**Parameters** -| 类型 | 说明 | -| -------- | -------- | -| Promise<boolean> | Promise回调返回系统麦克风静音状态,true为静音,false为非静音。 | +None + +**Return value** -**示例:** +| Type | Description | +| :------------- | :--------------------------------- | +| Promise | Promise used to return the result. | +**Example** ``` -var audioManager = audio.getAudioManager(); -audioManager.isMicrophoneMute().then((value) => - console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); -) +await ringtonePlayer.release(); ``` ## AudioDeviceDescriptor -描述音频设备。 +Describes an audio device. -| 名称 | 参数型 | 可读 | 可写 | 说明 | +| Name | Type | Readable | Writable | Description | | -------- | -------- | -------- | -------- | -------- | -| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| deviceRole | [DeviceRole](#devicerole) | Yes | No | Device role.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | +| deviceType | [DeviceType](#devicetype) | Yes | No | Device type.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | ## AudioDeviceDescriptors -| 名称 | 描述 | +| Name | Description | | -------- | -------- | -| 设备属性数组 | AudioDeviceDescriptor的数组,只读。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| AudioDeviceDescriptors | Array of **AudioDeviceDescriptor** objects. It is read-only.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/js-apis-camera.md b/zh-cn/application-dev/reference/apis/js-apis-camera.md index ed5e53a56ef..c076a882942 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-camera.md +++ b/zh-cn/application-dev/reference/apis/js-apis-camera.md @@ -1,34 +1,42 @@ -# 相机管理 +# Camera -> **说明:** -> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. -## 导入模块 +## Modules to Import ``` import camera from '@ohos.multimedia.camera'; ``` -## 权限 +## Required Permissions +``` ohos.permission.CAMERA +``` +## getCameraManager(context: Context, callback: AsyncCallback): void; -## camera.getCameraManager +**System Capabilities:** -getCameraManager(context: Context, callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -获取相机管理器实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets a **CameraManager** instance. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|-------------------------------|-----------|-----------------------------------------------------| -| context | Context | 是 | 应用上下文。 | -| callback | AsyncCallback<[CameraManager](#cameramanager)\> | 是 | 回调函数,用于获取相机管理器实例。 | +| context | Context | Yes | Application context | +| callback | AsyncCallback | Yes | Callback used to return the CameraManager instance | + + +**Return values** + +none -**示例:** +**Example** ``` camera.getCameraManager(context, (err, cameraManager) => { @@ -40,27 +48,29 @@ camera.getCameraManager(context, (err, cameraManager) => { }); ``` -## camera.getCameraManager +## getCameraManager(context: Context): Promise; -getCameraManager(context: Context): Promise +**System Capabilities:** -获取相机管理器实例,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Gets a **CameraManager** instance. This method uses a promise to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------| -| context | Context | 是 | 应用上下文。 | +| context | Context | Yes | Application context | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-------------------------|--------------------------------------------------------| -| Promise<[CameraManager](#cameramanager)\> | 使用Promise的方式获取一个相机管理器实例。 | +| Promise | Promise used to return the **CameraManager** instance | -**示例:** +**Example** ``` camera.getCameraManager(context).then((cameraManger) => { @@ -68,83 +78,89 @@ camera.getCameraManager(context).then((cameraManger) => { }) ``` -## CameraStatus +## CameraStatus -枚举,相机状态。 +Enumerates camera status types. -| 名称 | 默认值 | 说明 | +| Name | Default Value | Description | |---------------------------|---------------|--------------------| -| CAMERA_STATUS_APPEAR | 0 | 相机存在。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_DISAPPEAR | 1 | 相机不存在。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_AVAILABLE | 2 | 相机就绪。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_UNAVAILABLE | 3 | 相机未就绪。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_APPEAR | 0 | Camera appear
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_DISAPPEAR | 1 | Camera disappear
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_AVAILABLE | 2 | Camera available
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_UNAVAILABLE | 3 | Camera unavailable
System Capabilities: SystemCapability.Multimedia.Camera.Core| -## CameraPosition +## CameraPosition -枚举,相机方向。 +Enumerates the camera positions. -| 名称 | 默认值 | 说明 | +| Name | Default value | Description | |-----------------------------|---------------|-----------------------| -| CAMERA_POSITION_UNSPECIFIED | 0 | 未指定方向相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_POSITION_BACK | 1 | 后置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_POSITION_FRONT | 2 | 前置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_UNSPECIFIED | 0 | Unspecified position
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_BACK | 1 | Rear camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_FRONT | 2 | Front camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -## CameraType +## CameraType -枚举,相机类型。 +Enumerates the camera types. -| 名称 | 默认值 | 说明 | +| Name | Default value | Description | |-------------------------|---------------|-------------------------| -| CAMERA_TYPE_UNSPECIFIED | 0 | 未指定相机类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_WIDE_ANGLE | 1 | 广角相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_ULTRA_WIDE | 2 | 超级广角相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_TELEPHOTO | 3 | 长焦相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_TRUE_DEPTH | 4 | 深度相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_UNSPECIFIED | 0 | Unspecified camera type
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_WIDE_ANGLE | 1 | Wide camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_ULTRA_WIDE | 2 | Ultra wide camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_TELEPHOTO | 3 | Telephoto camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_TRUE_DEPTH | 4 | True depth camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -## ConnectionType +## ConnectionType -枚举,相机连接类型。 +Enumerates camera connection types. -| 名称 | 默认值 | 说明 | +| Name | Default value | Description | |------------------------------|---------------|----------------------------| -| CAMERA_CONNECTION_BUILT_IN | 0 | 内置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_CONNECTION_USB_PLUGIN | 1 | 外置USB相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_CONNECTION_REMOTE | 2 | 分布式相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_BUILT_IN | 0 | Built-in camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_USB_PLUGIN | 1 | Camera connected using USB
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_REMOTE | 2 | Remote camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -## CameraFormat +## CameraFormat -枚举,照片格式。 +Enumerates the camera formats. -| 名称 | 默认值 | 说明 | +| Name | Default value | Description | |----------------------------|---------------|---------------------| -| CAMERA_FORMAT_YCRCb_420_SP | 1003 | YCRCb格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_JPEG | 2000 | JPEG格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_AVC | 3000 | AVC格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_HEVC | 3001 | HEVC格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_YCRCb_420_SP | 1003 | Camera YCRCb
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_JPEG | 2000 | Camera format jpeg
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_AVC | 3000 | Camera format avc
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_HEVC | 3001 | Camera format hevc
System Capabilities: SystemCapability.Multimedia.Camera.Core | + +## CameraManager -## CameraManager +Implements camera management, including getting supported cameras and creating **CameraInput** instances. -相机管理器类,使用前需要通过getCameraManager获取相机管理实例。 +### getCameras(callback: AsyncCallback\>): void; -### getCameras +**System Capabilities:** -getCameras(callback: AsyncCallback\>): void +SystemCapability.Multimedia.Camera.Core -异步获取设备支持的相机列表,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets all cameras supported by the device. This method uses an asynchronous callback to return the array of supported cameras. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|--------------------------------|-----------|---------------------------------------------------------| -| callback | AsyncCallback\> | 是 | 使用callback方式获取支持的相机列表。 | +| callback | AsyncCallback\> | Yes | Callback used to return the array of supported cameras. | + +**Return values** + +none -**示例:** +**Example** ``` cameraManager.getCameras((err, cameras) => { @@ -156,22 +172,28 @@ cameraManager.getCameras((err, cameras) => { }) ``` -### getCameras +### getCameras(): Promise\>; -getCameras(): Promise\> +**System Capabilities:** -异步获取设备支持的相机列表,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**返回值:** +Gets all cameras supported by the device. This method uses a promise to return the array of supported cameras. -| 类型 | 说明 | +**Parameters** + +none + +**Return values** + +| Type | Description | |------------------------|--------------------------------------------------------| -| Promise\> | 使用promise获取支持相机列表。 | +| Promise\> | Promise used to return an array of supported cameras | -**示例:** +**Example** ``` cameraManager.getCameras().then((cameraArray) => { @@ -179,22 +201,28 @@ cameraManager.getCameras().then((cameraArray) => { }) ``` -### createCameraInput +### createCameraInput(cameraId: string, callback: AsyncCallback): void; -createCameraInput(cameraId: string, callback: AsyncCallback): void +**System Capabilities:** -使用相机ID异步创建CameraInput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Creates a **CameraInput** instance with the specified camera ID. This method uses an asynchronous callback to return the instance. -| 名称 | 默认值 | 必填 | 说明 | +**Parameters** + +| Name | Default value | Mandatory | Description | |----------|------------------------------|-----------|--------------------------------------------------| -| cameraId | string | 是 | 指定相机ID。 | -| callback | AsyncCallback<[CameraInput](#camerainput)\> | 是 | 回调函数,用于获取CameraInput实例。 | +| cameraId | string | Yes | Camera ID used to create the instance | +| callback | AsyncCallback | Yes | Callback used to return the CameraInput instance | + +**Return values** -**示例:** +none + +**Example** ``` cameraManager.createCameraInput(cameraId, (err, cameraInput) => { @@ -206,27 +234,29 @@ cameraManager.createCameraInput(cameraId, (err, cameraInput) => { }) ``` -### createCameraInput +### createCameraInput(cameraId: string): Promise; + +**System Capabilities:** -createCameraInput(cameraId: string): Promise +SystemCapability.Multimedia.Camera.Core -使用相机ID异步创建CameraInput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **CameraInput** instance with the specified camera ID. This method uses a promise to return the instance. -**参数:** +**Parameters** -| 名称 | 默认值 | 必填 | 说明 | +| Name | Default value | Mandatory | Description | |----------|-----------------------------|-----------|------------------------------------------| -| cameraId | string | 是 | 指定相机ID。 | +| cameraId | string | Yes | Camera ID used to create the instance | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-------------------------|-------------------------------------------------| -| Promise<[CameraInput](#camerainput)\> | 使用Promise的方式获取CameraInput的实例。 | +| Promise | Promise used to return the CameraInput instance | -**示例:** +**Example** ``` cameraManager.createCameraInput(cameraId).then((cameraInput) => { @@ -234,23 +264,29 @@ cameraManager.createCameraInput(cameraId).then((cameraInput) => { }) ``` -### createCameraInput +### createCameraInput(position: CameraPosition, type: CameraType, callback: AsyncCallback): void; -createCameraInput(position: CameraPosition, type: CameraType, callback: AsyncCallback): void +**System Capabilities:** -使用相机位置和相机类型异步创建CameraInput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Creates a **CameraInput** instance with the specified camera position and camera type. This method uses an asynchronous callback to return the instance. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------------|----------------------------|-----------|---------------------------------------------------| -| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。 | -| cameraType | [CameraType](#cameratype) | 是 | 相机类型。 | -| callback | AsyncCallback<[CameraInput](#camerainput)\> | 是 | 回调函数,用于获取CameraInput实例。 | +| cameraPosition | CameraPosition | Yes | Camera position | +| cameraType | CameraType | Yes | Camera type | +| callback | AsyncCallback | Yes | Callback used to return the CameraInput instance | + +**Return values** -**示例:** +none + +**Example** ``` cameraManager.createCameraInput(cameraPosition, cameraType, (err, cameraInput) => { @@ -262,28 +298,30 @@ cameraManager.createCameraInput(cameraPosition, cameraType, (err, cameraInput) = }) ``` -### createCameraInput +### createCameraInput(position: CameraPosition, type: CameraType): Promise; + +**System Capabilities:** -createCameraInput(position: CameraPosition, type: CameraType): Promise +SystemCapability.Multimedia.Camera.Core -使用相机位置和相机类型异步创建CameraInput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **CameraInput** instance with the specified camera position and camera type. This method uses a promise to return the instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------------|----------------------------|-----------|----------------------------------------| -| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。 | -| cameraType | [CameraType](#cameratype) | 是 | 相机类型。 | +| cameraPosition | CameraPosition | Yes | Camera position | +| cameraType | CameraType | Yes | Camera type | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-------------------------|-------------------------------------------------| -| Promise<[CameraInput](#camerainput)\> | 使用Promise的方式获取CameraInput的实例。 | +| Promise | Promise used to return the CameraInput instance | -**示例:** +**Example** ``` cameraManager.createCameraInput(cameraPosition, cameraType).then((cameraInput) => { @@ -291,22 +329,28 @@ cameraManager.createCameraInput(cameraPosition, cameraType).then((cameraInput) = }) ``` -### on('cameraStatus') +### on(type: 'cameraStatus', callback: Callback): void; + +**System Capabilities:** -on(type: 'cameraStatus', callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -监听相机的状态变化,通过注册回调函数获取相机的状态变化。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for camera status changes. This method uses a callback to get camera status changes. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :--------------------------------------------------- | -| type | string | 是 | 监听事件。 | -| callback | AsyncCallback<[CameraStatusInfo](#camerastatusinfo)\> | 是 | 回调函数,用于获取相机状态变化信息。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the camera status change. | + +**Return value** + +None -**示例:** +**Example** ``` cameraManager.on('cameraStatus', (cameraStatusInfo) => { @@ -315,18 +359,18 @@ cameraManager.on('cameraStatus', (cameraStatusInfo) => { }) ``` -## Camera +## Camera -相机实例。 +Camera class. -| 名称 | 类型 | 只读 | 说明 | -|----------------|----------------|----------|------------------------| -| cameraId | string | 是 | 相机ID。
**系统能力:** SystemCapability.Multimedia.Camera.Core| -| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| cameraType | [CameraType](#cameratype) | 是 | 相机类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| connectionType | [ConnectionType](#connectiontype) | 是 | 相机连接类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +**Fields** -**示例:** +| Name | Type | Access | Description | +|----------------|----------------|----------|------------------------| +| cameraId | string | readonly | Camera ID
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| cameraPosition | cameraPosition | readonly | Camera position
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| cameraType | cameraType | readonly | Camera type
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| connectionType | connectionType | readonly | Camera connection type
System Capabilities: SystemCapability.Multimedia.Camera.Core| ``` var cameraManager = await camera.getCameraManager(); @@ -339,35 +383,41 @@ var cameraId = cameraObj.connectionType; ``` -## CameraStatusInfo +## CameraStatusInfo -相机状态信息。 +CameraStatusInfo class. -| 名称 | 类型 | 说明 | +**Fields** + +| Name | Type | Description | |----------------|----------------|------------------| -| camera | [Camera](#camera) | 相机信息。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| status | [CameraStatus](#camerastatus) | 相机状态。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| camera | Camera | Camera object
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| status | CameraStatus | Camera status
System Capabilities: SystemCapability.Multimedia.Camera.Core | + +## CameraInput -## CameraInput +Implements a **CameraInput** instance. -相机输入类。在使用该类的方法前,需要先构建一个CameraInput实例。 +### getCameraId(callback: AsyncCallback\): void; -### getCameraId +**System Capabilities:** -getCameraId(callback: AsyncCallback\): void +SystemCapability.Multimedia.Camera.Core -异步获取该CameraInput实例的相机ID,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets the camera ID based on which this **CameraInput** instance is created. This method uses an asynchronous callback to return the camera ID. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|------------------------|-----------|---------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取相机ID。 | +| callback | AsyncCallback | Yes | Callback used to return the camera ID | -**示例:** +**Return values** + +none ``` cameraInput.getCameraId((err, cameraId) => { @@ -379,21 +429,27 @@ cameraInput.getCameraId((err, cameraId) => { }) ``` -### getCameraId +### getCameraId(): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core + +**Description** -getCameraId(): Promise +Gets the camera ID based on which this **CameraInput** instance is created. This method uses a promise to return the camera ID. -异步获取该CameraInput实例的相机ID,通过Promise获取结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Camera.Core +none -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |------------------------|--------------------------------------| -| Promise | 使用Promise的方式获取相机ID。 | +| Promise | Promise used to return the camera ID | -**示例:** +**Example** ``` cameraInput.getCameraId().then((cameraId) => { @@ -401,22 +457,29 @@ cameraInput.getCameraId().then((cameraId) => { }) ``` -### getSupportedSizes +### getSupportedSizes\(format: CameraFormat, callback: AsyncCallback\>\): void; -getSupportedSizes\(format: CameraFormat, callback: AsyncCallback\>\): void +**System Capabilities:** -根据指定格式,获取相机支持的分辨率,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Gets supported sizes for a given format. This method uses an asynchronous callback to return the supported sizes. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|------------------------------|-----------|---------------------------------------------| -| format | [CameraFormat](#cameraformat) | 是 | 指定照片格式。 | -| callback | AsyncCallback\> | 是 | 回调函数,用于获取相机支持分辨率。 | +| format | CameraFormat | Yes | Camera format used to get supported sizes | +| callback | AsyncCallback\> | Yes | Callback used to return the supported sizes | + + +**Return values** + +none -**示例:** +**Example** ``` cameraInput.getSupportedSizes(format, (err, sizes) => { @@ -428,27 +491,29 @@ cameraInput.getSupportedSizes(format, (err, sizes) => { }) ``` -### getSupportedSizes +### getSupportedSizes\(format: CameraFormat\): Promise\>; -getSupportedSizes\(format: CameraFormat\): Promise\> +**System Capabilities:** -根据指定格式,获取相机支持的分辨率,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Gets supported sizes for a given format. This method uses a promise to return the supported sizes. -| 名称 | 类型 | 必填 | 说明 | -| ------ | ----------------------------- | ---- | -------------- | -| format | [CameraFormat](#cameraformat) | 是 | 指定照片格式。 | +**Parameters** -**返回值:** +| Name | Type | Mandatory | Description | +|----------|----------------------------|-----------|-----------------------------------------------| +| format | CameraFormat | Yes | Camera format used to get the supported sizes | -| 类型 | 说明 | +**Return values** + +| Type | Description | |------------------------|---------------------------------------------| -| Promise\> | 使用Promise的方式获取相机支持的分辨率。 | +| Promise\> | Promise used to return the supported sizes. | -**示例:** +**Example** ``` cameraInput.getSupportedSizes(format).then((sizes) => { @@ -456,21 +521,28 @@ cameraInput.getSupportedSizes(format).then((sizes) => { }) ``` -### getSupportedPreviewFormats +### getSupportedPreviewFormats\(callback: AsyncCallback\>\): void; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core + +**Description** + +Gets supported formats for preview. This method uses an asynchronous callback to return the supported formats. -getSupportedPreviewFormats\(callback: AsyncCallback\>\): void +**Parameters** -获取相机预览图片的支持格式,通过注册回调函数获取结果。 +| Name | Type | Mandatory | Description | +|----------|--------------------------------------|-----------|---------------------------------------------------| +| callback | AsyncCallback\> | Yes | Callback used to return the supported preview formats. | -**系统能力:** SystemCapability.Multimedia.Camera.Core -**参数:** +**Return values** -| 名称 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------------- | ---- | -------------------------------------- | -| callback | AsyncCallback\> | 是 | 回调函数,用于获取预览图片的支持格式。 | +none -**示例:** +**Example** ``` cameraInput.getSupportedPreviewFormats((err, previewFormats) => { @@ -482,21 +554,27 @@ cameraInput.getSupportedPreviewFormats((err, previewFormats) => { }) ``` -### getSupportedPreviewFormats +### getSupportedPreviewFormats\(\): Promise\>; -getSupportedPreviewFormats\(\): Promise\> +**System Capabilities:** -获取相机预览图片的支持格式,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**返回值:** +Gets supported formats for preview. This method uses a promise to return the supported formats. -| 类型 | 说明 | +**Parameters** + +none + +**Return values** + +| Type | Description | |--------------------------------|-------------------------------------------------------| -| Promise\> | 使用Promise的方式获取预览图片的支持格式。 | +| Promise\> | Promise used to return the supported preview formats | -**示例:** +**Example** ``` cameraInput.getSupportedPreviewFormats().then((previewFormats) => { @@ -504,21 +582,27 @@ cameraInput.getSupportedPreviewFormats().then((previewFormats) => { }) ``` -### getSupportedPhotoFormats +### getSupportedPhotoFormats\(callback: AsyncCallback\>\): void; + +**System Capabilities:** -getSupportedPhotoFormats\(callback: AsyncCallback\>\): void +SystemCapability.Multimedia.Camera.Core -获取照片的支持格式,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets supported formats for photographing. This method uses an asynchronous callback to return the supported formats. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|--------------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | 是 | 回调函数,用于获取支持的照片格式。 | +| callback | AsyncCallback\> | Yes | Callback used to return the supported photo formats. | -**示例:** +**Return values** + +none + +**Example** ``` cameraInput.getSupportedPhotoFormats((err, photoFormats) => { @@ -530,21 +614,27 @@ cameraInput.getSupportedPhotoFormats((err, photoFormats) => { }) ``` -### getSupportedPhotoFormats +### getSupportedPhotoFormats\(\): Promise\>; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core -getSupportedPhotoFormats\(\): Promise\> +**Description** -获取照片的支持格式,通过Promise获取结果。 +Gets supported formats for photographing. This method uses a promise to return the supported formats. -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Parameters** -**返回值:** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |--------------------------------|---------------------------------------------------| -| Promise\> | 使用Promise的方式获取支持的照片格式。 | +| Promise\> | Promise used to return supported photo formats. | -**示例:** +**Example** ``` cameraInput.getSupportedPhotoFormats().then((photoFormats) => { @@ -552,21 +642,27 @@ cameraInput.getSupportedPhotoFormats().then((photoFormats) => { }) ``` -### getSupportedVideoFormats +### getSupportedVideoFormats\(callback: AsyncCallback\>\): void; + +**System Capabilities:** -getSupportedVideoFormats\(callback: AsyncCallback\>\): void +SystemCapability.Multimedia.Camera.Core -获取录制视频的支持格式,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets supported formats for video recording. This method uses an asynchronous callback to return the supported video formats. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|--------------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | 是 | 回调函数,用于获取支持的视频格式。 | +| callback | AsyncCallback\> | Yes | Callback used to return the supported video formats. | + +**Return values** + +none -**示例:** +**Example** ``` cameraInput.getSupportedVideoFormats((err, videoFormats) => { @@ -578,21 +674,27 @@ cameraInput.getSupportedVideoFormats((err, videoFormats) => { }) ``` -### getSupportedVideoFormats +### getSupportedVideoFormats\(\): Promise\>; -getSupportedVideoFormats\(\): Promise\> +**System Capabilities:** -获取录制视频的支持格式,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**返回值:** +Gets supported formats for video recording. This method uses a promise to return the supported video format. -| 类型 | 说明 | +**Parameters** + +none + +**Return values** + +| Type | Description | |--------------------------------|---------------------------------------------------| -| Promise\> | 使用Promise的方式获取支持的视频格式。 | +| Promise\> | Promise used to return supported video formats. | -**示例:** +**Example** ``` cameraInput.getSupportedVideoFormats().then((videoFormats) => { @@ -600,21 +702,27 @@ cameraInput.getSupportedVideoFormats().then((videoFormats) => { }) ``` -### hasFlash +### hasFlash(callback: AsyncCallback): void; -hasFlash(callback: AsyncCallback): void +**System Capabilities:** -判断设备是否支持闪光灯,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Checks whether the device has flash light. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|-------------------------|-----------|----------------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,返回true表示设备支持闪光灯。 | +| callback | AsyncCallback | Yes | Callback used to return the flash light support status | + +**Return values** -**示例:** +none + +**Example** ``` cameraInput.hasFlash((err, status) => { @@ -626,21 +734,27 @@ cameraInput.hasFlash((err, status) => { }) ``` -### hasFlash +### hasFlash(): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core + +**Description** -hasFlash(): Promise +Checks whether the device has flash light. This method uses a promise to return the result. -判断设备是否支持闪光灯,通过Promise获取结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Camera.Core +none -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-----------------------|--------------------------------------------------------| -| Promise | 使用Promise的方式获取结果,返回true表示设备支持闪光灯。 | +| Promise | Promise used to return the flash light support status | -**示例:** +**Example** ``` cameraInput.hasFlash().then((status) => { @@ -648,22 +762,28 @@ cameraInput.hasFlash().then((status) => { }) ``` -### isFlashModeSupported +### isFlashModeSupported(flashMode: FlashMode, callback: AsyncCallback): void; -isFlashModeSupported(flashMode: FlashMode, callback: AsyncCallback): void +**System Capabilities:** -判断设备是否支持指定闪光灯模式,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Checks whether a specified flash mode is supported. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | -| callback | AsyncCallback | 是 | 回调函数,返回true表示支持该闪光灯模式。 | +| flashMode | FlashMode | Yes | Flash mode | +| callback | AsyncCallback | Yes | Callback used to return the device flash support status | + +**Return values** -**示例:** +none + +**Example** ``` cameraInput.isFlashModeSupported(flashMode, (err, status) => { @@ -675,27 +795,29 @@ cameraInput.isFlashModeSupported(flashMode, (err, status) => { }) ``` -### isFlashModeSupported +### isFlashModeSupported(flashMode: FlashMode): Promise; + +**System Capabilities:** -isFlashModeSupported(flashMode: FlashMode): Promise +SystemCapability.Multimedia.Camera.Core -判断设备是否支持指定闪光灯模式,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Checks whether a specified flash mode is supported. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | +| flashMode | FlashMode | Yes | Flash mode | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-----------------------|---------------------------------------------------| -| Promise | 使用Promise的方式获取结果,返回true表示设备支持该闪光灯模式。 | +| Promise | Promise used to return flash mode support status. | -**示例:** +**Example** ``` cameraInput.isFlashModeSupported(flashMode).then((status) => { @@ -703,27 +825,30 @@ cameraInput.isFlashModeSupported(flashMode).then((status) => { }) ``` -### setFlashMode +### setFlashMode(flashMode: FlashMode, callback: AsyncCallback): void; -setFlashMode(flashMode: FlashMode, callback: AsyncCallback): void +**System Capabilities:** -设置闪光灯模式,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -进行设置之前,需要先检查: +**Description** -1. 设备是否支持闪光灯,可使用方法[hasFlash](#hasflash)。 -2. 设备是否支持指定的闪光灯模式,可使用方法[isFlashModeSupported](#isflashmodesupported)。 +Sets flash mode. This method uses an asynchronous callback to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +Note: Before setting the flash mode, check the support for the flash light (hasFlash method) and flash mode support (isFlashModeSupported method); -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| flashMode | FlashMode | Yes | Flash mode | +| callback | AsyncCallback | Yes | Callback used to return the result | -**示例:** +**Return values** + +none + +**Example** ``` cameraInput.setFlashMode(flashMode, (err) => { @@ -735,32 +860,31 @@ cameraInput.setFlashMode(flashMode, (err) => { }) ``` -### setFlashMode +### setFlashMode(flashMode: FlashMode): Promise; -setFlashMode(flashMode: FlashMode): Promise +**System Capabilities:** -设置闪光灯模式,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -进行设置之前,需要先检查: +**Description** -1. 设备是否支持闪光灯,可使用方法[hasFlash](#hasflash)。 -2. 设备是否支持指定的闪光灯模式,可使用方法[isFlashModeSupported](#isflashmodesupported)。 +Sets flash mode. This method uses a promise to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +Note: Before setting the flash mode, check the support for the flash light (hasFlash method) and flash mode support (isFlashModeSupported method); -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | +| flashMode | FlashMode | Yes | Flash mode | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-----------------------|-----------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` cameraInput.setFlashMode(flashMode).then() => { @@ -768,21 +892,27 @@ cameraInput.setFlashMode(flashMode).then() => { }) ``` -### getFlashMode +### getFlashMode(callback: AsyncCallback): void; -getFlashMode(callback: AsyncCallback): void +**System Capabilities:** -获取当前设备的闪光灯模式,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Gets current flash mode. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-----------|---------------------------|-----------|------------------------------------------------| -| callback | AsyncCallback<[FlashMode](#flashmode)\> | 是 | 回调函数,用于获取当前设备的闪光灯模式。 | +| callback | AsyncCallback | Yes | Callback used to return the current flash mode | + +**Return values** -**示例:** +none + +**Example** ``` cameraInput.getFlashMode((err, flashMode) => { @@ -794,21 +924,27 @@ cameraInput.getFlashMode((err, flashMode) => { }) ``` -### getFlashMode +### getFlashMode(): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core -getFlashMode(): Promise +**Description** -获取当前设备的闪光灯模式,通过Promise获取结果。 +Gets current flash mode. This method uses a promise to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Parameters** -**返回值:** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |-----------------------|---------------------------------------------------| -| Promise<[FlashMode](#flashmode)\> | 使用Promise的方式获取当前的闪光灯模式。 | +| Promise | Promise used to return the flash mode | -**示例:** +**Example** ``` cameraInput.getFlashMode().then(flashMode) => { @@ -816,22 +952,28 @@ cameraInput.getFlashMode().then(flashMode) => { }) ``` -### isFocusModeSupported +### isFocusModeSupported(afMode: FocusMode, callback: AsyncCallback): void; + +**System Capabilities:** -isFocusModeSupported(afMode: FocusMode, callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -判断设备是否支持指定的焦距模式,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Checks whether a specified focus mode is supported. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-----------|------------------------|-----------|----------------------------------------------------| -| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | -| callback | AsyncCallback | 是 | 回调函数,返回true表示支持该焦距模式。 | +| afMode | FocusMode | Yes | Focus mode | +| callback | AsyncCallback | Yes | Callback used to return the device focus support status | -**示例:** +**Return values** + +none + +**Example** ``` cameraInput.isFocusModeSupported(afMode, (err, status) => { @@ -843,27 +985,29 @@ cameraInput.isFocusModeSupported(afMode, (err, status) => { }) ``` -### isFocusModeSupported +### isFocusModeSupported(afMode: FocusMode): Promise; -isFocusModeSupported(afMode: FocusMode): Promise +**System Capabilities:** -判断设备是否支持指定的焦距模式,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Checks whether a specified focus mode is supported. This method uses a promise to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-----------|----------------------------------------|-----------|-------------| -| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | +| afMode | FocusMode | Yes | Focus mode | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-----------------------|---------------------------------------------------| -| Promise | 使用Promise的方式获取结果,返回true表示设备支持该焦距模式。 | +| Promise | Promise used to return the focus mode support status. | -**示例:** +**Example** ``` cameraInput.isFocusModeSupported(afMode).then((status) => { @@ -871,24 +1015,30 @@ cameraInput.isFocusModeSupported(afMode).then((status) => { }) ``` -### setFocusMode +### setFocusMode(afMode: FocusMode, callback: AsyncCallback): void; + +**System Capabilities:** -setFocusMode(afMode: FocusMode, callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -设置焦距模式,通过注册回调函数获取结果。 +**Description** -进行设置之前,需要先检查设备是否支持指定的焦距模式,可使用方法[isFocusModeSupported](#isfocusmodesupported)。 +Sets focus mode. This method uses an asynchronous callback to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +Note: Before setting the focus mode, check focus mode support (isFocusModeSupported method); -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-----------|------------------------|-----------|------------------------------------| -| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| afMode | FocusMode | Yes | Focus mode | +| callback | AsyncCallback | Yes | Callback used to return the result | -**示例:** +**Return values** + +none + +**Example** ``` cameraInput.setFocusMode(afMode, (err) => { @@ -900,29 +1050,31 @@ cameraInput.setFocusMode(afMode, (err) => { }) ``` -### setFocusMode +### setFocusMode(afMode: FocusMode): Promise; -setFocusMode(afMode: FocusMode): Promise +**System Capabilities:** -设置焦距模式,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -进行设置之前,需要先检查设备是否支持指定的焦距模式,可使用方法[isFocusModeSupported](#isfocusmodesupported)。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Sets focus mode. This method uses a promise to return the result. -**参数:** +Note: Before setting the focus mode, check focus mode support (isFocusModeSupported method); -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-----------|-----------------------------------------|-----------|-------------| -| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | +| afMode | FocusMode | Yes | Focus mode | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-----------------------|-----------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` cameraInput.setFocusMode(afMode).then() => { @@ -930,21 +1082,27 @@ cameraInput.setFocusMode(afMode).then() => { }) ``` -### getFocusMode +### getFocusMode(callback: AsyncCallback): void; + +**System Capabilities:** -getFocusMode(callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -获取当前设备的焦距模式,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets the current focus mode. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-----------|---------------------------|-----------|------------------------------------------------| -| callback | AsyncCallback<[FocusMode](#focusmode)\> | 是 | 回调函数,用于获取当前设备的焦距模式。 | +| callback | AsyncCallback | Yes | Callback used to return the current focus mode | -**示例:** +**Return values** + +none + +**Example** ``` cameraInput.getFocusMode((err, afMode) => { @@ -956,21 +1114,27 @@ cameraInput.getFocusMode((err, afMode) => { }) ``` -### getFocusMode +### getFocusMode(): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core -getFocusMode(): Promise +**Description** -获取当前设备的焦距模式,通过Promise获取结果。 +Gets the current focus mode. This method uses a promise to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Parameters** -**返回值:** +none -| 类型 | 说明 | -| ------------------- | ------------------------------------- | -| Promise | 使用Promise的方式获取当前的焦距模式。 | +**Return values** -**示例:** +| Type | Description | +|-----------------------|---------------------------------------------------| +| Promise | Promise used to return the focus mode | + +**Example** ``` cameraInput.getFocusMode().then(afMode) => { @@ -978,21 +1142,28 @@ cameraInput.getFocusMode().then(afMode) => { }) ``` -### getZoomRatioRange +### getZoomRatioRange\(callback: AsyncCallback\>\): void; + +**System Capabilities:** -getZoomRatioRange\(callback: AsyncCallback\>\): void +SystemCapability.Multimedia.Camera.Core -获取可变焦距比范围,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets the zoom ratios of all zoom values. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|--------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback\> | Yes | Callback used to return the zoom ratio range | + + +**Return values** -**示例:** +none + +**Example** ``` cameraInput.getZoomRatioRange(err, zoomRatioRange) => { @@ -1004,21 +1175,27 @@ cameraInput.getZoomRatioRange(err, zoomRatioRange) => { }) ``` -### getZoomRatioRange +### getZoomRatioRange\(\): Promise\>; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core + +**Description** -getZoomRatioRange\(\): Promise\> +Gets the zoom ratios of all zoom values. This method uses a promise to return the result. -获取可变焦距比范围,通过Promise获取结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Camera.Core +none -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |------------------------|---------------------------------------------| -| Promise\> | 使用Promise的方式获取当前的可变焦距比范围。 | +| Promise\> | Promise used to return the zoom ratio range | -**示例:** +**Example** ``` cameraInput.getZoomRatioRange().then((zoomRatioRange) => { @@ -1026,22 +1203,28 @@ cameraInput.getZoomRatioRange().then((zoomRatioRange) => { }) ``` -### setZoomRatio +### setZoomRatio(zoomRatio: number, callback: AsyncCallback): void; -setZoomRatio(zoomRatio: number, callback: AsyncCallback): void +**System Capabilities:** -设置可变焦距比,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Sets a zoom ratio. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-----------|------------------------|-----------|------------------------------------| -| zoomRatio | number | 是 | 可变焦距比。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| zoomRatio | number | Yes | Zoom ratio | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` cameraInput.setZoomRatio(zoomRatio, (err) => { @@ -1053,27 +1236,29 @@ cameraInput.setZoomRatio(zoomRatio, (err) => { }) ``` -### setZoomRatio +### setZoomRatio(zoomRatio: number): Promise; + +**System Capabilities:** -setZoomRatio(zoomRatio: number): Promise +SystemCapability.Multimedia.Camera.Core -设置可变焦距比,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Sets a zoom ratio. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-----------|----------|-----------|-------------| -| zoomRatio | number | 是 | 可变焦距比。 | +| zoomRatio | number | Yes | zoom ratio | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-----------------------|-----------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` cameraInput.setZoomRatio(zoomRatio).then() => { @@ -1081,21 +1266,27 @@ cameraInput.setZoomRatio(zoomRatio).then() => { }) ``` -### getZoomRatio +### getZoomRatio(callback: AsyncCallback): void; -getZoomRatio(callback: AsyncCallback): void +**System Capabilities:** -获取当前的可变焦距比,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Gets current zoom ratio value. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-----------|---------------------------|-----------|------------------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the current zoom ratio value | + +**Return values** -**示例:** +none + +**Example** ``` cameraInput.getZoomRatio((err, zoomRatio) => { @@ -1107,21 +1298,27 @@ cameraInput.getZoomRatio((err, zoomRatio) => { }) ``` -### getZoomRatio +### getZoomRatio(): Promise; + +**System Capabilities:** -getZoomRatio(): Promise +SystemCapability.Multimedia.Camera.Core -获取当前的可变焦距比,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Gets current zoom ratio value. This method uses a promise to return the result. -**返回值:** +**Parameters** -| 类型 | 说明 | -| ---------------- | --------------------------- | -| Promise | 使用Promise的方式获取结果。 | +none -**示例:** +**Return values** + +| Type | Description | +|-----------------------|---------------------------------------------------| +| Promise | Promise used to return the zoom ratio vaule | + +**Example** ``` cameraInput.getZoomRatio().then(zoomRatio) => { @@ -1129,24 +1326,30 @@ cameraInput.getZoomRatio().then(zoomRatio) => { }) ``` -### release +### release\(callback: AsyncCallback\): void; -release\(callback: AsyncCallback\): void +**System Capabilities:** -释放相机实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Releases this **CameraInput** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` -camera.release((err) => { +cameraInput.release((err) => { if (err) { console.error('Failed to release the CameraInput instance ${err.message}'); return; @@ -1155,21 +1358,27 @@ camera.release((err) => { }); ``` -### release +### release(): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core + +**Description** -release(): Promise +Releases this **CameraInput** instance. This method uses a promise to return the result. -释放相机实例,通过Promise获取结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Camera.Core +none -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` cameraInput.release().then(() => { @@ -1177,22 +1386,28 @@ cameraInput.release().then(() => { }) ``` -### on('focusStateChange') +### on(type: 'focusStateChange', callback: Callback): void; -on(type: 'focusStateChange', callback: AsyncCallback): void +**System Capabilities:** -监听焦距的状态变化,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Listens for focus state changes. This method uses a callback to get focus state changes. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'focusStateChange',即焦距状态变化事件。 | -| callback | AsyncCallback<[FocusState](#focusstate)\> | 是 | 回调函数,用于获取焦距状态。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the focus state change. | + +**Return value** -**示例:** +None + +**Example** ``` cameraInput.on('focusStateChange', (focusState) => { @@ -1200,22 +1415,28 @@ cameraInput.on('focusStateChange', (focusState) => { }) ``` -### on('error') +### on(type: 'error', callback: Callback): void; + +**System Capabilities:** -on('error', callback: ErrorCallback): void +SystemCapability.Multimedia.Camera.Core -监听CameraInput的错误事件,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for **CameraInput** errors. This method uses a callback to get errors. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'error'。 | -| callback | ErrorCallback | 是 | 回调函数,用于获取结果。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the camera input errors. | -**示例:** +**Return value** + +None + +**Example** ``` cameraInput.on('error', (cameraInputError) => { @@ -1223,58 +1444,54 @@ cameraInput.on('error', (cameraInputError) => { }) ``` +## FlashMode -## FlashMode +Enumerates the flash modes. -枚举,闪光灯模式。 - -| 名称 | 默认值 | 说明 | +| Name | Default value | Description | |------------------------|---------------|------------------------| -| FLASH_MODE_CLOSE | 0 | 闪光灯关闭。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_OPEN | 1 | 闪光灯开启。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_AUTO | 2 | 自动闪光灯。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_ALWAYS_OPEN | 3 | 闪光灯常亮。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_CLOSE | 0 | Flash mode close
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_OPEN | 1 | Flash mode open
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_AUTO | 2 | Flash mode auto
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_ALWAYS_OPEN | 3 | Flash mode always open
System Capabilities: SystemCapability.Multimedia.Camera.Core | -## FocusMode +## FocusMode -枚举,焦距模式。 +Enumerates the focus modes. -| 名称 | 默认值 | 说明 | +| Name | Default value | Description | |----------------------------|---------------|----------------------------| -| FOCUS_MODE_MANUAL | 0 | 手动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_CONTINUOUS_AUTO | 1 | 连续自动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_AUTO | 2 | 自动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_LOCKED | 3 | 定焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | - -## FocusState +| FOCUS_MODE_MANUAL | 0 | Focus mode manual
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_CONTINUOUS_AUTO | 1 | Focus mode continuous auto
System Capabilities: SystemCapability.Multimedia.Camera.Core| +| FOCUS_MODE_AUTO | 2 | Focus mode auto
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_LOCKED | 3 | Focus mode locked
System Capabilities: SystemCapability.Multimedia.Camera.Core | -枚举,焦距状态。 -| 名称 | 默认值 | 说明 | -| --------------------- | ------ | ------------------------------------------------------------ | -| FOCUS_STATE_SCAN | 0 | 扫描状态。
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FOCUS_STATE_FOCUSED | 1 | 相机已对焦。
系统能力 : SystemCapability.Multimedia.Camera.Core | -| FOCUS_STATE_UNFOCUSED | 2 | 相机未对焦。
系统能力 : SystemCapability.Multimedia.Camera.Core | +## createCaptureSession\(context: Context, callback: AsyncCallback\): void; -## camera.createCaptureSession +**System Capabilities:** -createCaptureSession\(context: Context, callback: AsyncCallback\): void +SystemCapability.Multimedia.Camera.Core -获取CaptureSession实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **CaptureSession** instance. This method uses an asynchronous callback to return the instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|--------------------------------|-----------|-----------------------------------------------------| -| context | Context | 是 | 应用上下文。 | -| callback | AsyncCallback<[CaptureSession](#capturesession)\> | 是 | 回调函数,用于获取CaptureSession实例。 | +| context | Context | Yes | Application context | +| callback | AsyncCallback | Yes | Callback used to return the CaptureSession instance | -**示例:** +**Return values** + +none + +**Example** ``` -camera.createCaptureSession(context), (err, captureSession) => { +captureSession.createCaptureSession(context), (err, captureSession) => { if (err) { console.error('Failed to create the CaptureSession instance. ${err.message}'); return; @@ -1283,53 +1500,61 @@ camera.createCaptureSession(context), (err, captureSession) => { }); ``` -## camera.createCaptureSession +## createCaptureSession(context: Context\): Promise; + +**System Capabilities:** -createCaptureSession(context: Context\): Promise; +SystemCapability.Multimedia.Camera.Core -获取CaptureSession实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **CaptureSession** instance. This method uses a promise to return the instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|-------------------------------|-----------|-----------------------------------------------------| -| context | Context | 是 | 应用上下文。 | +| context | Context | Yes | Application context | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |---------------------------|---------------------------------------------------| -| Promise<[CaptureSession](#capturesession)\> | 使用Promise的方式获取CaptureSession实例。 | +| Promise | Promise used to return the CaptureSession instance. | -**示例:** +**Example** ``` -camera.createCaptureSession(context).then((captureSession) => { +captureSession.createCaptureSession(context).then((captureSession) => { console.log('Promise returned with the CaptureSession instance'); }) ``` -## CaptureSession +## CaptureSession -拍照会话类。 +Implements session capture. -### beginConfig +### beginConfig\(callback: AsyncCallback\): void; -beginConfig\(callback: AsyncCallback\): void +**System Capabilities:** -开始配置会话,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Starts configuration for this CaptureSession instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.beginConfig((err) => { @@ -1341,22 +1566,28 @@ captureSession.beginConfig((err) => { }); ``` -### beginConfig +### beginConfig\(\): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core + +**Description** -beginConfig\(\): Promise +Starts configuration for this CaptureSession instance. This method uses a promise to return the result. -开始配置会话,通过Promise获取结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Camera.Core +none -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |---------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.beginConfig().then(() => { @@ -1364,21 +1595,27 @@ captureSession.beginConfig().then(() => { }) ``` -### commitConfig +### commitConfig\(callback: AsyncCallback\): void; -commitConfig\(callback: AsyncCallback\): void +**System Capabilities:** -提交会话配置,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Commits the configuration for this CaptureSession instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|---------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.commitConfig((err) => { @@ -1390,21 +1627,27 @@ captureSession.commitConfig((err) => { }); ``` -### commitConfig +### commitConfig\(\): Promise; + +**System Capabilities:** -commitConfig\(\): Promise +SystemCapability.Multimedia.Camera.Core -提交会话配置,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Commits the configuration for this CaptureSession instance. This method uses a promise to return the result. -**返回值:** +**Parameters** -| 类型 | 说明 | +none + +**Return values** + +| Type | Description | |---------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.commitConfig().then(() => { @@ -1412,22 +1655,28 @@ captureSession.commitConfig().then(() => { }) ``` -### addInput +### addInput\(cameraInput: CameraInput, callback: AsyncCallback\): void; -addInput\(cameraInput: CameraInput, callback: AsyncCallback\): void +**System Capabilities:** -在当前会话中,添加一个CameraInput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Add a CameraInput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-------------|----------------------|-----------|---------------------------------------------| -| cameraInput | [CameraInput](#camerainput) | 是 | 需要添加的CameraInput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| cameraInput | CameraInput | Yes | CameraInput instance to add | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.addInput(cameraInput, (err) => { @@ -1439,27 +1688,29 @@ captureSession.addInput(cameraInput, (err) => { }); ``` -### addInput +### addInput\(cameraInput: CameraInput\): Promise; + +**System Capabilities:** -addInput\(cameraInput: CameraInput\): Promise +SystemCapability.Multimedia.Camera.Core -在当前会话中,添加一个CameraInput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Add a CameraInput instance to this CaptureSession instance. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-------------|---------------------|-----------|-------------------------------| -| cameraInput | [CameraInput](#camerainput) | 是 | 需要添加的CameraInput实例。 | +| cameraInput | CameraInput | Yes | CameraInput instance to add | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |----------------|------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.addInput(cameraInput).then(() => { @@ -1467,22 +1718,28 @@ captureSession.addInput(cameraInput).then(() => { }) ``` -### addOutput +### addOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void; + +**System Capabilities:** -addOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void +SystemCapability.Multimedia.Camera.Core -在当前会话中,添加一个PreviewOutput实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Add a PreviewOutput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |---------------|----------------------|-----------|-------------------------------------| -| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要添加的PreviewOutput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| previewOutput | PreviewOutput | Yes | PreviewOutput instance to add | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** + +none -**示例:** +**Example** ``` captureSession.addOutput(previewOutput, (err) => { @@ -1494,27 +1751,29 @@ captureSession.addOutput(previewOutput, (err) => { }); ``` -### addOutput +### addOutput\(previewOutput: PreviewOutput\): Promise; -addOutput\(previewOutput: PreviewOutput\): Promise +**System Capabilities:** -在当前会话中,添加一个PreviewOutput实例,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Add a PreviewOutput instance to this CaptureSession instance. This method uses a promise to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |---------------|---------------------|-----------|--------------------------------| -| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要添加的PreviewOutput实例。 | +| previewOutput | PreviewOutput | Yes | PreviewOutput instance to add | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |----------------|-----------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.addOutput(previewOutput).then(() => { @@ -1522,22 +1781,28 @@ captureSession.addOutput(previewOutput).then(() => { }) ``` -### addOutput +### addOutput\(photoOutput: PhotoOutput, callback: AsyncCallback\): void; + +**System Capabilities:** -addOutput\(photoOutput: PhotoOutput, callback: AsyncCallback\): void +SystemCapability.Multimedia.Camera.Core -在当前会话中,添加一个PhotoOutput实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Add a PhotoOutput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |---------------|---------------------|-----------|-------------------------------------| -| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| photoOutput | PhotoOutput | Yes | PhotoOutput instance to add | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** + +none -**示例:** +**Example** ``` captureSession.addOutput(photoOutput, (err) => { @@ -1549,27 +1814,29 @@ captureSession.addOutput(photoOutput, (err) => { }); ``` -### addOutput +### addOutput\(photoOutput: PhotoOutput\): Promise; -addOutput\(photoOutput: PhotoOutput\): Promise +**System Capabilities:** -在当前会话中,添加一个PreviewOutput实例,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Add a PhotoOutput instance to this CaptureSession instance. This method uses a promise to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |---------------|---------------------|-----------|--------------------------------| -| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | +| photoOutput | PhotoOutput | Yes | PhotoOutput instance to add | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |---------------|-----------------------------------| -| Promise\ | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.addOutput(photoOutput).then(() => { @@ -1577,22 +1844,28 @@ captureSession.addOutput(photoOutput).then(() => { }) ``` -### addOutput +### addOutput\(videoOutput: VideoOutput, callback: AsyncCallback\): void; + +**System Capabilities:** -addOutput\(videoOutput: VideoOutput, callback: AsyncCallback\): void +SystemCapability.Multimedia.Camera.Core -在当前会话中,添加一个VideoOutput实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Add a VideoOutput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |---------------|---------------------|-----------|-------------------------------------| -| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| videoOutput | VideoOutput | Yes | VideoOutput instance to add | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.addOutput(videoOutput, (err) => { @@ -1604,27 +1877,29 @@ captureSession.addOutput(videoOutput, (err) => { }); ``` -### addOutput +### addOutput\(videoOutput: VideoOutput\): Promise; -addOutput\(videoOutput: VideoOutput\): Promise +**System Capabilities:** -在当前会话中,添加一个VideoOutput实例,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Add a VideoOutput instance to this CaptureSession instance. This method uses a promise to return the result. -| 名称 | 类型 | 必填 | 说明 | -| ----------- | --------------------------- | ---- | --------------------------- | -| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | +**Parameters** -**返回值:** +| Name | Type | Mandatory | Description | +|---------------|---------------------|-----------|--------------------------------| +| videoOutput | VideoOutput | Yes | VideoOutput instance to add | -| 类型 | 说明 | -| -------------- | --------------------------- | -| Promise\ | 使用Promise的方式获取结果。 | +**Return values** -**示例:** +| Type | Description | +|----------------|-----------------------------------| +| Promise | Promise used to return the result | + +**Example** ``` captureSession.addOutput(videoOutput).then(() => { @@ -1632,22 +1907,29 @@ captureSession.addOutput(videoOutput).then(() => { }) ``` -### removeInput +### removeInput\(cameraInput: CameraInput, callback: AsyncCallback\): void; -removeInput\(cameraInput: CameraInput, callback: AsyncCallback\): void +**System Capabilities:** -在当前会话中,移除一个CameraInput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Removes a **CameraInput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |-------------|----------------------|-----------|------------------------------------| -| cameraInput | [CameraInput](#camerainput) | 是 | 需要移除的CameraInput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| cameraInput | CameraInput | Yes | CameraInput instance to remove | +| callback | AsyncCallback | Yes | Callback used to return the result | + -**示例:** +**Return values** + +none + +**Example** ``` captureSession.removeInput(cameraInput, (err) => { @@ -1659,27 +1941,29 @@ captureSession.removeInput(cameraInput, (err) => { }); ``` -### removeInput +### removeInput\(cameraInput: CameraInput\): Promise; + +**System Capabilities:** -removeInput\(cameraInput: CameraInput\): Promise +SystemCapability.Multimedia.Camera.Core -在当前会话中,移除一个CameraInput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Removes a **CameraInput** instance from this **CaptureSession** instance. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |-------------|---------------------|-----------|---------------------------------| -| cameraInput | [CameraInput](#camerainput) | 是 | 需要移除的CameraInput实例。 | +| cameraInput | CameraInput | Yes | CameraInput instance to remove | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |----------------|-----------------------------------| -| Promise\ | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.removeInput(cameraInput).then(() => { @@ -1687,22 +1971,28 @@ captureSession.removeInput(cameraInput).then(() => { }) ``` -### removeOutput +### removeOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void; -removeOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void +**System Capabilities:** -在当前会话中,移除一个PreviewOutput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Removes a **PreviewOutput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |---------------|----------------------|-----------|------------------------------------| -| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要移除的PreviewOutput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| previewOutput | PreviewOutput | Yes | PreviewOutput instance to remove | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.removeOutput(previewOutput, (err) => { @@ -1714,29 +2004,31 @@ captureSession.removeOutput(previewOutput, (err) => { }); ``` -### removeOutput +### removeOutput(previewOutput: PreviewOutput): Promise; + +**System Capabilities:** -removeOutput(previewOutput: PreviewOutput): Promise +SystemCapability.Multimedia.Camera.Core -在当前会话中,移除一个PreviewOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Removes a **PreviewOutput** instance from this **CaptureSession** instance. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |---------------|---------------------|-----------|-----------------------------------| -| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要移除的PreviewOutput实例。 | +| previewOutput | PreviewOutput | Yes | PreviewOutput instance to remove | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |---------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.removeOutput(previewOutput).then(() => { @@ -1744,22 +2036,28 @@ captureSession.removeOutput(previewOutput).then(() => { }) ``` -### removeOutput +### removeOutput(photoOutput: PhotoOutput, callback: AsyncCallback): void; -removeOutput(photoOutput: PhotoOutput, callback: AsyncCallback): void +**System Capabilities:** -在当前会话中,移除一个PhotoOutput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Removes a **PhotoOutput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |---------------|----------------------|-----------|------------------------------------| -| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| photoOutput | PhotoOutput | Yes | PhotoOutput instance to remove | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.removeOutput(photoOutput, (err) => { @@ -1771,29 +2069,31 @@ captureSession.removeOutput(photoOutput, (err) => { }); ``` -### removeOutput +### removeOutput(photoOutput: PhotoOutput): Promise; + +**System Capabilities:** -removeOutput(photoOutput: PhotoOutput): Promise +SystemCapability.Multimedia.Camera.Core -在当前会话中,移除一个PhotoOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Removes a **PhotoOutput** instance from this **CaptureSession** instance. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |---------------|---------------------|-----------|---------------------------------| -| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | +| photoOutput | PhotoOutput | Yes | PhotoOutput instance to remove | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |---------------|------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.removeOutput(photoOutput).then(() => { @@ -1801,22 +2101,28 @@ captureSession.removeOutput(photoOutput).then(() => { }) ``` -### removeOutput +### removeOutput(videoOutput: VideoOutput, callback: AsyncCallback): void; -removeOutput(videoOutput: VideoOutput, callback: AsyncCallback): void +**System Capabilities:** -在当前会话中,移除一个VideoOutput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Removes a **VideoOutput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |---------------|----------------------|-----------|------------------------------------| -| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| videoOutput | VideoOutput | Yes | VideoOutput instance to remove | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.removeOutput(videoOutput, (err) => { @@ -1828,29 +2134,31 @@ captureSession.removeOutput(videoOutput, (err) => { }); ``` -### removeOutput +### removeOutput(videoOutput: VideoOutput): Promise; + +**System Capabilities:** -removeOutput(videoOutput: VideoOutput): Promise +SystemCapability.Multimedia.Camera.Core -在当前会话中,移除一个VideoOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Removes a **VideoOutput** instance from this **CaptureSession** instance. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |---------------|---------------------|-----------|---------------------------------| -| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | +| videoOutput | VideoOutput | Yes | VideoOutput instance to remove | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.removeOutput(videoOutput).then(() => { @@ -1858,21 +2166,27 @@ captureSession.removeOutput(videoOutput).then(() => { }) ``` -### start +### start\(callback: AsyncCallback\): void; -start\(callback: AsyncCallback\): void +**System Capabilities:** -启动拍照会话,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Starts this **CaptureSession** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` captureSession.start((err) => { @@ -1884,21 +2198,27 @@ captureSession.start((err) => { }); ``` -### start +### start\(\): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core -start\(\): Promise +**Description** -启动拍照会话,通过Promise获取结果。 +Starts this **CaptureSession** instance. This method uses a promise to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Parameters** -**返回值:** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |----------------|-----------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.start().then(() => { @@ -1906,22 +2226,28 @@ captureSession.start().then(() => { }) ``` -### stop +### stop\(callback: AsyncCallback\): void; + +**System Capabilities:** -stop\(callback: AsyncCallback\): void +SystemCapability.Multimedia.Camera.Core -停止拍照会话,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Stops this **CaptureSession** instance. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | -**示例:** +**Return values** + +none + +**Example** ``` captureSession.stop((err) => { @@ -1933,21 +2259,27 @@ captureSession.stop((err) => { }); ``` -### stop +### stop(): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core -stop(): Promise +**Description** -停止拍照会话,通过Promise获取结果。 +Stops this **CaptureSession** instance. This method uses a promise to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Parameters** -**返回值:** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |----------------|-----------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.stop().then(() => { @@ -1955,21 +2287,27 @@ captureSession.stop().then(() => { }) ``` -### release +### release\(callback: AsyncCallback\): void; + +**System Capabilities:** -release\(callback: AsyncCallback\): void +SystemCapability.Multimedia.Camera.Core -释放CaptureSession实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Releases this **CaptureSession** instance. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** + +none -**示例:** +**Example** ``` captureSession.release((err) => { @@ -1981,21 +2319,27 @@ captureSession.release((err) => { }); ``` -### release +### release(): Promise; -release(): Promise +**System Capabilities:** -释放CaptureSession实例,通过Promise获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**返回值:** +Releases this **CaptureSession** instance. This method uses a promise to return the result. -| 类型 | 说明 | +**Parameters** + +none + +**Return values** + +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` captureSession.release().then(() => { @@ -2003,22 +2347,28 @@ captureSession.release().then(() => { }) ``` -### on('error') +### on(type: 'error', callback: Callback): void; + +**System Capabilities:** -on(type: 'error', callback: ErrorCallback): void +SystemCapability.Multimedia.Camera.Core -监听拍照会话的错误事件,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for **CaptureSession** errors. This method uses a callback to get errors. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'error'。 | -| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the capture session errors. | -**示例:** +**Return value** + +None + +**Example** ``` captureSession.on('error', (captureSessionError) => { @@ -2026,22 +2376,28 @@ captureSession.on('error', (captureSessionError) => { }) ``` -## camera.createPreviewOutput +## createPreviewOutput(surfaceId: string, callback: AsyncCallback): void; + +**System Capabilities:** -createPreviewOutput(surfaceId: string, callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -获取PreviewOutput实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **PreviewOutput** instance. This method uses an asynchronous callback to return the instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | 是 | 从XComponent组件获取的Surface ID。 | -| callback | AsyncCallback<[PreviewOutput](#previewoutput)\> | 是 | 回调函数,用于获取PreviewOutput实例。 | +| surfaceId | string | Yes | Surface ID received from XComponent view | +| callback | AsyncCallback | Yes | Callback used to return the PreviewOutput instance | + +**Return values** + +none -**示例:** +**Example** ``` camera.createPreviewOutput(surfaceId), (err, previewOutput) => { @@ -2051,29 +2407,31 @@ camera.createPreviewOutput(surfaceId), (err, previewOutput) => { } console.log('Callback returned with previewOutput instance'); }); -``` +``` + +## createPreviewOutput(surfaceId: string): Promise; -## camera.createPreviewOutput +**System Capabilities:** -createPreviewOutput(surfaceId: string): Promise\ +SystemCapability.Multimedia.Camera.Core -获取PreviewOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **PreviewOutput** instance. This method uses a promise to return the instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | 是 | 从XComponent组件获取的Surface ID。 | +| surfaceId | string | Yes | Surface ID received from XComponent view | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-------------------------|---------------------------------------------------| -| Promise<[PreviewOutput](#previewoutput)\> | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the PreviewOutput instance | -**示例:** +**Example** ``` camera.createPreviewOutput(surfaceId).then((previewOutput) => { @@ -2083,23 +2441,29 @@ camera.createPreviewOutput(surfaceId).then((previewOutput) => { ## PreviewOutput -预览输出类。 +Implements preview output. -### release +### release(callback: AsyncCallback): void; -release(callback: AsyncCallback): void +**System Capabilities:** -释放PreviewOutput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Releases this **PreviewOutput** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` previewOutput.release((err) => { @@ -2111,22 +2475,27 @@ previewOutput.release((err) => { }); ``` -### release +### release(): Promise; + +**System Capabilities:** -release(): Promise +SystemCapability.Multimedia.Camera.Core -释放PreviewOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Releases this **PreviewOutput** instance. This method uses a promise to return the result. -**返回值:** +**Parameters** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |----------------|-----------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` previewOutput.release().then(() => { @@ -2134,22 +2503,28 @@ previewOutput.release().then(() => { }) ``` -### on('frameStart') +### on(type: 'frameStart', callback: Callback): void; + +**System Capabilities:** -on(type: 'frameStart', callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -监听预览帧启动,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for preview frame start events. This method uses a callback to get the event information. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | 是 | 监听事件,固定为'frameStart',即帧启动事件。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to return the result | -**示例:** +**Return value** + +None + +**Example** ``` previewOutput.on('frameStart', () => { @@ -2157,22 +2532,28 @@ previewOutput.on('frameStart', () => { }) ``` -### on('frameEnd') +### on(type: 'frameEnd', callback: Callback): void; -on(type: 'frameEnd', callback: AsyncCallback): void +**System Capabilities:** -监听预览帧结束,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Listens for preview frame end event. This method uses a callback to get the event information. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | 是 | 监听事件,固定为'frameEnd',即帧结束事件。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to return the result | + +**Return value** -**示例:** +None + +**Example** ``` previewOutput.on('frameEnd', () => { @@ -2180,22 +2561,28 @@ previewOutput.on('frameEnd', () => { }) ``` -### on('error') +### on(type: 'error', callback: Callback): void; + +**System Capabilities:** -on(type: 'error', callback: ErrorCallback): void +SystemCapability.Multimedia.Camera.Core -监听预览输出的错误事件,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for **PreviewOutput** errors. This method uses a callback to get errors. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'error'。 | -| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the preview output errors. | + +**Return value** -**示例:** +None + +**Example** ``` previewOutput.on('error', (previewOutputError) => { @@ -2203,22 +2590,28 @@ previewOutput.on('error', (previewOutputError) => { }) ``` -## camera.createPhotoOutput +## createPhotoOutput(surfaceId: string, callback: AsyncCallback): void; + +**System Capabilities:** -createPhotoOutput(surfaceId: string, callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -获取PhotoOutput实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **PhotoOutput** instance. This method uses an asynchronous callback to return the instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | 是 | 从ImageReceiver获取的Surface ID。 | -| callback | AsyncCallback<[PhotoOutput](#photooutput)\> | 是 | 回调函数,用于获取PhotoOutput实例。 | +| surfaceId | string | Yes | Surface ID received from ImageReceiver | +| callback | AsyncCallback | Yes | Callback used to return the PhotoOutput instance | -**示例:** +**Return values** + +none + +**Example** ``` camera.createPhotoOutput(surfaceId), (err, photoOutput) => { @@ -2228,29 +2621,31 @@ camera.createPhotoOutput(surfaceId), (err, photoOutput) => { } console.log('Callback returned with the PhotoOutput instance.'); }); -``` +``` + +## createPhotoOutput(surfaceId: string): Promise; -## camera.createPhotoOutput +**System Capabilities:** -createPhotoOutput(surfaceId: string): Promise +SystemCapability.Multimedia.Camera.Core -获取PhotoOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **PhotoOutput** instance. This method uses a promise to return the PhotoOutput instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | 是 | 从ImageReceiver获取的Surface ID。 | +| surfaceId | string | Yes | Surface ID received from ImageReceiver | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |-------------------------|--------------------------------------------------| -| Promise<[PhotoOutput](#photooutput)\> | 使用Promise的方式获取PhotoOutput实例。 | +| Promise | Promise used to return the PhotoOutput instance | -**示例:** +**Example** ``` camera.createPhotoOutput(surfaceId).then((photoOutput) => { @@ -2259,55 +2654,71 @@ camera.createPhotoOutput(surfaceId).then((photoOutput) => { ``` ## ImageRotation -枚举,图片旋转角度。 +Enumerates the image rotation angles. -| 名称 | 默认值 | 说明 | +| Name | Default Value | Description | |--------------|---------------|----------------------------------------| -| ROTATION_0 | 0 | 图片旋转0度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| ROTATION_90 | 90 | 图片旋转90度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| ROTATION_180 | 180 | 图片旋转180度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| ROTATION_270 | 270 | 图片旋转270度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| ROTATION_0 | 0 | The capture image rotates 0 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| ROTATION_90 | 90 | The capture image rotates 90 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| ROTATION_180 | 180 | The capture image rotates 180 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| ROTATION_270 | 270 | The capture image rotates 270 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core| + + +## Location + +Defines the location of a captured image. + +| Name | Type | Access | Description | +|-----------|--------|--------------|-------------| +| latitude | number | read / write | Latitude
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| longitude | number | read / write | Longitude
System Capabilities: SystemCapability.Multimedia.Camera.Core | ## QualityLevel -枚举,图片质量。 +Enumerates the image quality levels. -| 名称 | 默认值 | 说明 | +| Name | Default value | Description | |----------------------|---------------|----------------------| -| QUALITY_LEVEL_HIGH | 0 | 图片质量高。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| QUALITY_LEVEL_MEDIUM | 1 | 图片质量中等。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| QUALITY_LEVEL_LOW | 2 | 图片质量差。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_HIGH | 0 | High image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_MEDIUM | 1 | Medium image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_LOW | 2 | Low image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core | ## PhotoCaptureSetting -拍摄照片的设置。 +Defines the settings for image capture. -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|---------------|-----------|---------------------| -| quality | [QualityLevel](#qualitylevel) | 否 | 图片质量。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -| rotation | [ImageRotation](#imagerotation) | 否 | 图片旋转角度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| quality | QualityLevel | Optional | Photo image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core| +| rotation | ImageRotation | Optional | Photo rotation
System Capabilities: SystemCapability.Multimedia.Camera.Core | ## PhotoOutput -照片输出类。 +Implements photo output. -### capture +### capture(callback: AsyncCallback): void; -capture(callback: AsyncCallback): void +**System Capabilities:** -拍照,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Captures a photo. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|---------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` photoOutput.capture((err) => { @@ -2319,22 +2730,28 @@ photoOutput.capture((err) => { }); ``` -### capture +### capture(setting: PhotoCaptureSetting, callback: AsyncCallback): void; + +**System Capabilities:** -capture(setting: PhotoCaptureSetting, callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -根据拍照设置拍照,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Captures a photo with the specified capture settings. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| setting | [PhotoCaptureSetting](#photocapturesetting) | 是 | 拍照设置。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| setting | PhotoCaptureSetting | Yes | Photo capture settings | +| callback | AsyncCallback | Yes | Callback used to return the result | -**示例:** +**Return values** + +none + +**Example** ``` photoOutput.capture(settings, (err) => { @@ -2346,28 +2763,30 @@ photoOutput.capture(settings, (err) => { }); ``` -### capture +### capture(setting?: PhotoCaptureSetting): Promise; + +**System Capabilities:** -capture(setting?: PhotoCaptureSetting): Promise +SystemCapability.Multimedia.Camera.Core -根据拍照设置拍照,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Captures a photo with the specified capture settings. This method uses a promise to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|---------------------|-----------|----------------------------------------------| -| setting | [PhotoCaptureSetting](#photocapturesetting) | 否 | 拍照设置。 | +| setting | PhotoCaptureSetting | No | Photo capture settings | -**返回值:** +**Return values** -| 类型 | 说明 | +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` photoOutput.capture().then(() => { @@ -2375,21 +2794,27 @@ photoOutput.capture().then(() => { }) ``` -### release +### release(callback: AsyncCallback): void; -release(callback: AsyncCallback): void +**System Capabilities:** -释放PhotoOutput实例,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Releases this **PhotoOutput** instance. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` photoOutput.release((err) => { @@ -2401,22 +2826,27 @@ photoOutput.release((err) => { }); ``` -### release +### release(): Promise; + +**System Capabilities:** -release(): Promise +SystemCapability.Multimedia.Camera.Core -释放PhotoOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Releases this **PhotoOutput** instance. This method uses a promise to return the result. -**返回值:** +**Parameters** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` photoOutput.release().then(() => { @@ -2424,22 +2854,28 @@ photoOutput.release().then(() => { }) ``` -### on('captureStart') +### on(type: 'captureStart', callback: Callback): void; + +**System Capabilities:** -on(type: 'captureStart', callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -监听拍照启动,通过注册回调函数获取Capture ID。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for photo capture start events. This method uses a callback to get the event information. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'captureStart',即拍照启动事件。 | -| callback | AsyncCallback | 是 | 使用callback的方式获取Capture ID。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the capture ID. | -**示例:** +**Return value** + +None + +**Example** ``` photoOutput.on('captureStart', (captureId) => { @@ -2447,22 +2883,28 @@ photoOutput.on('captureStart', (captureId) => { }) ``` -### on('frameShutter') +### on(type: 'frameShutter', callback: Callback): void; -on(type: 'frameShutter', callback: AsyncCallback): void +**System Capabilities:** -监听帧刷新,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Listens for frame shutter events. This method uses a callback to get the event information. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'frameShutter',即帧刷新事件。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取相关信息。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the frame shutter information.| + +**Return value** -**示例:** +None + +**Example** ``` photoOutput.on('frameShutter', (frameShutterInfo) => { @@ -2471,22 +2913,28 @@ photoOutput.on('frameShutter', (frameShutterInfo) => { }) ``` -### on('captureEnd') +### on(type: 'captureEnd', callback: Callback): void; -on(type: 'captureEnd', callback: AsyncCallback): void +**System Capabilities:** -监听拍照停止,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Listens for photo capture end events. This method uses a callback to get the event information. -| 名称 | 类型 | 必填 | 说明 | -| :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'captureEnd',即拍照停止事件。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取相关信息。 | +**Parameters** + +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :------------------------------------------------| +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the capture end information | + +**Return value** -**示例:** +None + +**Example** ``` photoOutput.on('captureEnd', (captureEndInfo) => { @@ -2495,22 +2943,28 @@ photoOutput.on('captureEnd', (captureEndInfo) => { }) ``` -### on('error') +### on(type: 'error', callback: Callback): void; + +**System Capabilities:** -on(type: 'error', callback: ErrorCallback): void +SystemCapability.Multimedia.Camera.Core -监听拍照的错误事件,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for **PhotoOutput** errors. This method uses a callback to get errors. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'error'。 | -| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the photo output errors. | + +**Return value** -**示例:** +None + +**Example** ``` photoOutput.on('error', (photoOutputError) => { @@ -2518,22 +2972,28 @@ photoOutput.on('error', (photoOutputError) => { }) ``` -## camera.createVideoOutput +## createVideoOutput(surfaceId: string, callback: AsyncCallback): void; + +**System Capabilities:** -createVideoOutput(surfaceId: string, callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -获取VideoOutput实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **VideoOutput** instance. This method uses an asynchronous callback to return the instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | 是 | 从VideoRecorder获取的Surface ID。 | -| callback | AsyncCallback<[VideoOutput](#videootput)\> | 是 | 回调函数,用于获取VideoOutput实例。 | +| surfaceId | string | Yes | Surface ID received from VideoRecorder | +| callback | AsyncCallback | Yes | Callback used to return the VideoOutput instance | -**示例:** +**Return values** + +none + +**Example** ``` camera.createVideoOutput(surfaceId), (err, videoOutput) => { @@ -2543,55 +3003,62 @@ camera.createVideoOutput(surfaceId), (err, videoOutput) => { } console.log('Callback returned with the VideoOutput instance'); }); -``` +``` + +## createVideoOutput(surfaceId: string): Promise; -## camera.createVideoOutput +**System Capabilities:** -createVideoOutput(surfaceId: string): Promise +SystemCapability.Multimedia.Camera.Core -获取VideoOutput实例,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Creates a **VideoOutput** instance. This method uses a promise to return the VideoOutput instance. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | 是 | 从VideoRecorder获取的Surface ID。 | +| surfaceId | string | Yes | Surface ID received from VideoRecorder | -**返回值:** +**Return values** -| 类型 | 说明 | -| --------------------- | -------------------------------------- | -| Promise | 使用Promise的方式获取VideoOutput实例。 | +| Type | Description | +|-------------------------|-------------------------------------------------| +| Promise | Promise used to return the VideoOutput instance | -**示例:** +**Example** ``` camera.createVideoOutput(surfaceId).then((videoOutput) => { console.log('Promise returned with the VideoOutput instance'); }) ``` - ## VideoOutput -视频输出类。 +Implements video output. -### start +### start(callback: AsyncCallback): void; -start(callback: AsyncCallback): void +**System Capabilities:** -开始拍摄视频,通过注册回调函数获取结果。 +SystemCapability.Multimedia.Camera.Core -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Description** -**参数:** +Starts the video output. This method uses an asynchronous callback to return the result. -| 名称 | 类型 | 必填 | 说明 | +**Parameters** + +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | + +**Return values** -**示例:** +none + +**Example** ``` videoOutput.start((err) => { @@ -2603,22 +3070,27 @@ videoOutput.start((err) => { }); ``` -### start +### start(): Promise; + +**System Capabilities:** -start(): Promise +SystemCapability.Multimedia.Camera.Core -开始拍摄视频,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Starts the video output. This method uses a promise to return the result. -**返回值:** +**Parameters** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` videoOutput.start().then(() => { @@ -2626,21 +3098,27 @@ videoOutput.start().then(() => { }) ``` -### stop +### stop(callback: AsyncCallback): void; + +**System Capabilities:** -stop(callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -停止拍摄视频,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Stops the video output. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | -**示例:** +**Return values** + +none + +**Example** ``` videoOutput.stop((err) => { @@ -2652,21 +3130,26 @@ videoOutput.stop((err) => { }); ``` -### stop +### stop(): Promise; + +**System Capabilities:** -stop(): Promise +SystemCapability.Multimedia.Camera.Core -停止拍摄视频,通过Promise获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Stops the video output. This method uses a promise to return the result. -**返回值:** +**Parameters** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` videoOutput.start().then(() => { @@ -2674,21 +3157,27 @@ videoOutput.start().then(() => { }) ``` -### release +### release(callback: AsyncCallback): void; + +**System Capabilities:** -release(callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -释放VideoOutput实例,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Releases this VideoOutput instance. This method uses an asynchronous callback to return the result. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| callback | AsyncCallback | Yes | Callback used to return the result | -**示例:** +**Return values** + +none + +**Example** ``` videoOutput.release((err) => { @@ -2700,22 +3189,28 @@ videoOutput.release((err) => { }); ``` -### release +### release(): Promise; + +**System Capabilities:** + +SystemCapability.Multimedia.Camera.Core -release(): Promise +**Description** -释放VideoOutput实例,通过Promise获取结果。 +Releases this VideoOutput instance. This method uses a promise to return the result. -**系统能力:** SystemCapability.Multimedia.Camera.Core +**Parameters** -**返回值:** +none -| 类型 | 说明 | +**Return values** + +| Type | Description | |----------------|---------------------------------------------| -| Promise | 使用Promise的方式获取结果。 | +| Promise | Promise used to return the result | -**示例:** +**Example** ``` videoOutput.release().then(() => { @@ -2723,22 +3218,28 @@ videoOutput.release().then(() => { }) ``` -### on('frameStart') +### on(type: 'frameStart', callback: Callback): void; + +**System Capabilities:** -on(type: 'frameStart', callback: AsyncCallback): void +SystemCapability.Multimedia.Camera.Core -监听视频帧开启,通过注册回调函数获取结果。 +**Description** -**系统能力:** SystemCapability.Multimedia.Camera.Core +Listens for video frame start events. This method uses a callback to get the event information. -**参数:** +**Parameters** -| 名称 | 类型 | 必填 | 说明 | +| Name | Type | Mandatory | Description | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | 是 | 监听事件,固定为'frameStart',即视频帧开启事件。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to return the result | + +**Return value** + +None -**示例:** +**Example** ``` videoOutput.on('frameStart', () => { @@ -2746,22 +3247,22 @@ videoOutput.on('frameStart', () => { }) ``` -### on('frameEnd') +### on(type: 'frameEnd', callback: Callback): void; -on(type: 'frameEnd', callback: AsyncCallback): void +Listens for video frame end events. This method uses a callback to get the event information. -监听视频帧结束,通过注册回调函数获取结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Camera.Core +| Name | Type | Mandatory | Description | +| :------- | :---------------- | :-------- | :----------------------------------| +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to return the result | -**参数:** +**Return value** -| 名称 | 类型 | 必填 | 说明 | -| :------- | :---------------- | :-------- | :----------------------------------| -| type | string | 是 | 监听事件,固定为'frameEnd',即视频帧结束事件。 | -| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | +None -**示例:** +**Example** ``` videoOutput.on('frameEnd', () => { @@ -2769,22 +3270,22 @@ videoOutput.on('frameEnd', () => { }) ``` -### on('error') +### on(type: 'error', callback: Callback): void; -on(type: 'error', callback: ErrorCallback): void +Listens for **VideoOutput** errors. This method uses a callback to get errors. -监听视频输出的错误事件,通过注册回调函数获取结果。 +**Parameters** -**系统能力:** SystemCapability.Multimedia.Camera.Core +| Name | Type | Mandatory | Description | +| :------- | :--------------------- | :-------- | :-----------------------------------------------| +| type | string | Yes | Name of the event to listen for. | +| callback | Callback | Yes | Callback used to get the video output errors. | -**参数:** +**Return value** -| 名称 | 类型 | 必填 | 说明 | -| :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | 是 | 监听事件,固定为'error'。 | -| callback | Callback | 是 | 回调函数,用于获取错误信息。 | +None -**示例:** +**Example** ``` videoOutput.on('error', (VideoOutputError) => { -- Gitee From d1f17410b790ed652cb49213ae1505ccac89c9a5 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 10:47:04 +0800 Subject: [PATCH 236/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-audio.md | 76 +- .../reference/apis/js-apis-camera.md | 3 + .../reference/apis/js-apis-audio.md | 4332 +++-------------- .../reference/apis/js-apis-camera.md | 2575 ++++------ 4 files changed, 1697 insertions(+), 5289 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-audio.md b/en/application-dev/reference/apis/js-apis-audio.md index 80ac13c0193..85d2dc6b01e 100644 --- a/en/application-dev/reference/apis/js-apis-audio.md +++ b/en/application-dev/reference/apis/js-apis-audio.md @@ -1,6 +1,7 @@ # Audio -This module provides the following functions: audio management, audio rendering and system sound management. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import @@ -284,8 +285,18 @@ Enumerates audio device types. +## ActiveDeviceType -## AudioRingMode7+ +Enumerates the active device types. + +| Name | Default Value | Default Value | +| ------------- | ------ | ------------------------------------------------------------ | +| SPEAKER | 2 | Speaker.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_SCO | 7 | Bluetooth device using the SCO link.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | + + + +## AudioRingMode Enumerates ringer modes. @@ -1028,7 +1039,7 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> ## audioManager.mute -mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+ +mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void Mutes a stream. This method uses an asynchronous callback to return the result. @@ -1096,7 +1107,7 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { ## audioManager.mute -mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+ +mute\(volumeType: AudioVolumeType, mute: boolean\): Promise Mutes a stream. This method uses a promise to return the result. @@ -1164,7 +1175,7 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => ## audioManager.isMute -isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ +isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void Checks whether a stream is muted. This method uses an asynchronous callback to return the query result. @@ -1223,7 +1234,7 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { ## audioManager.isMute -isMute\(volumeType: AudioVolumeType\): Promise7+ +isMute\(volumeType: AudioVolumeType\): Promise Checks whether a stream is muted. This method uses a promise to return the result. @@ -1282,7 +1293,7 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => ## audioManager.isActive -isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ +isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\) Checks whether a stream is active. This method uses an asynchronous callback to return the query result. @@ -1341,7 +1352,7 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { ## audioManager.isActive -isActive\(volumeType: AudioVolumeType\): Promise7+ +isActive\(volumeType: AudioVolumeType\): Promise Checks whether a stream is active. This method uses a promise to return the query result. @@ -1400,7 +1411,7 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => ## audioManager.setRingerMode -setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+ +setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void Sets the ringer mode. This method uses an asynchronous callback to return the result. @@ -1459,7 +1470,7 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { ## audioManager.setRingerMode -setRingerMode\(mode: AudioRingMode\): Promise7+ +setRingerMode\(mode: AudioRingMode\): Promise Sets the ringer mode. This method uses a promise to return the result. @@ -1518,7 +1529,7 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => ## audioManager.getRingerMode -getRingerMode\(callback: AsyncCallback\): void7+ +getRingerMode\(callback: AsyncCallback\): void Obtains the ringer mode. This method uses an asynchronous callback to return the query result. @@ -1568,7 +1579,7 @@ audioManager.getRingerMode((err, value) => { ## audioManager.getRingerMode -getRingerMode\(\): Promise7+ +getRingerMode\(\): Promise Obtains the ringer mode. This method uses a promise to return the query result. @@ -1606,7 +1617,7 @@ audioManager.getRingerMode().then((value) => ## audioManager.setAudioParameter -setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+ +setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void Sets an audio parameter. This method uses an asynchronous callback to return the result. @@ -1674,7 +1685,7 @@ audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { ## audioManager.setAudioParameter -setAudioParameter\(key: string, value: string\): Promise7+ +setAudioParameter\(key: string, value: string\): Promise Sets an audio parameter. This method uses a promise to return the result. @@ -1742,7 +1753,7 @@ audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => ## audioManager.getAudioParameter -getAudioParameter\(key: string, callback: AsyncCallback\): void7+ +getAudioParameter\(key: string, callback: AsyncCallback\) Obtains the value of an audio parameter. This method uses an asynchronous callback to return the query result. @@ -1801,7 +1812,7 @@ audioManager.getAudioParameter('PBits per sample', (err, value) => { ## audioManager.getAudioParameter -getAudioParameter\(key: string\): Promise7+ +getAudioParameter\(key: string\): Promise Obtains the value of an audio parameter. This method uses a promise to return the query result. @@ -1979,7 +1990,7 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> ## audioManager.setDeviceActive -setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+ +setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void Sets a device to the active state. This method uses an asynchronous callback to return the result. @@ -2048,7 +2059,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { ## audioManager.setDeviceActive -setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+ +setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise Sets a device to the active state. This method uses a promise to return the result. @@ -2116,7 +2127,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> ## audioManager.isDeviceActive -isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+ +isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void Checks whether a device is active. This method uses an asynchronous callback to return the query result. @@ -2175,7 +2186,7 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { ## audioManager.isDeviceActive -isDeviceActive\(deviceType: DeviceType\): Promise7+ +isDeviceActive\(deviceType: DeviceType\): Promise Checks whether a device is active. This method uses a promise to return the query result. @@ -2234,7 +2245,7 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => ## audioManager.setMicrophoneMute -setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+ +setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void Mutes or unmutes the microphone. This method uses an asynchronous callback to return the result. @@ -2293,7 +2304,7 @@ audioManager.setMicrophoneMute(true, (err) => { ## audioManager.setMicrophoneMute -setMicrophoneMute\(mute: boolean\): Promise7+ +setMicrophoneMute\(mute: boolean\): Promise Mutes or unmutes the microphone. This method uses a promise to return the result. @@ -2352,7 +2363,7 @@ audioManager.setMicrophoneMute(true).then(() => ## audioManager.isMicrophoneMute -isMicrophoneMute\(callback: AsyncCallback\): void7+ +isMicrophoneMute\(callback: AsyncCallback\): void Checks whether the microphone is muted. This method uses an asynchronous callback to return the query result. @@ -2402,7 +2413,7 @@ audioManager.isMicrophoneMute((err, value) => { ## audioManager.isMicrophoneMute -isMicrophoneMute\(\): Promise7+ +isMicrophoneMute\(\): Promise Checks whether the microphone is muted. This method uses a promise to return the query result. @@ -4121,3 +4132,20 @@ None ``` await ringtonePlayer.release(); ``` + + +## AudioDeviceDescriptor + +Describes an audio device. + +| Name | Type | Readable | Writable | Description | +| -------- | -------- | -------- | -------- | -------- | +| deviceRole | [DeviceRole](#devicerole) | Yes | No | Device role.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | +| deviceType | [DeviceType](#devicetype) | Yes | No | Device type.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | + + +## AudioDeviceDescriptors + +| Name | Description | +| -------- | -------- | +| AudioDeviceDescriptors | Array of **AudioDeviceDescriptor** objects. It is read-only.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | \ No newline at end of file diff --git a/en/application-dev/reference/apis/js-apis-camera.md b/en/application-dev/reference/apis/js-apis-camera.md index 92aef3bc743..c076a882942 100644 --- a/en/application-dev/reference/apis/js-apis-camera.md +++ b/en/application-dev/reference/apis/js-apis-camera.md @@ -1,5 +1,8 @@ # Camera +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + ## Modules to Import ``` 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 85d2dc6b01e..607758131ea 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-audio.md +++ b/zh-cn/application-dev/reference/apis/js-apis-audio.md @@ -1,4151 +1,1029 @@ -# Audio +# 音频管理 -> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** -> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -## Modules to Import +## 导入模块 ``` import audio from '@ohos.multimedia.audio'; ``` -## Required Permissions -None +## getAudioManager -## audioManager +getAudioManager(): AudioManager -getAudioManager\(\): AudioManager +获取音频管理器。 -Obtains an **AudioManager** instance. +**系统能力:** SystemCapability.Multimedia.Audio.Core -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -**Return value** - - - - - - - - - - -

Type

-

Description

-

AudioManager

-

AudioManager object.

-
- -**Example** - -``` -var audioManager = audio.getAudioManager(); -``` - - -## audioRenderer - -createAudioRenderer(options: AudioRendererOptions): AudioRenderer - -Obtains an **AudioRenderer** instance. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** -| Name | Type | Mandatory | Description | -| :--------- | :------------------- | :-------- | :---------------------- | -| options | AudioRendererOptions | Yes | Renderer configurations | - -**Return value** - -| Type | Description | -| ------------- | --------------------- | -| AudioRenderer | AudioRenderer object. | - -**Example** - -``` -var audioStreamInfo = { - samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, - channels: audio.AudioChannel.CHANNEL_1, - sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, - encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW -} - -var audioRendererInfo = { - content: audio.ContentType.CONTENT_TYPE_SPEECH, - usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, - rendererFlags: 1 -} - -var audioRendererOptions = { - streamInfo: audioStreamInfo, - rendererInfo: audioRendererInfo -} - -let audioRenderer = await audio.createAudioRenderer(audioRendererOptions); -``` - - -## systemSoundManager - -getSystemSoundManager(): SystemSoundManager - -Obtains a **SystemSoundManager** instance. - -**Parameters** - -None - -**Return value** - -| Type | Description | -| ------------------ | -------------------------- | -| SystemSoundManager | SystemSoundManager object. | - -**Example** - -``` -const systemSoundManager = audio.getSystemSoundManager(); -``` - - -## AudioVolumeType - -Enumerates audio stream types. - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

VOICE_CALL

-

0

-

Audio stream for voice calls.
System capabilities: SystemCapability.Multimedia.Audio.Volume

-

RINGTONE

-

2

-

Audio stream for ringtones.
System capabilities: SystemCapability.Multimedia.Audio.Volume

-

MEDIA

-

3

-

Audio stream for media purpose.
System capabilities: SystemCapability.Multimedia.Audio.Volume

-

VOICE_ASSISTANT

-

9

-

Audio stream for voice assistant.
System capabilities: SystemCapability.Multimedia.Audio.Volume

-
- - -## DeviceFlag - -Enumerates audio device flags. - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

OUTPUT_DEVICES_FLAG

-

1

-

Output device.
System capabilities: SystemCapability.Multimedia.Audio.Device

-

INPUT_DEVICES_FLAG

-

2

-

Input device.
System capabilities: SystemCapability.Multimedia.Audio.Device

-

ALL_DEVICES_FLAG

-

3

-

All devices.
System capabilities: SystemCapability.Multimedia.Audio.Device

-
- - -## DeviceRole - -Enumerates audio device roles. - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

INPUT_DEVICE

-

1

-

Input role.
System capabilities: SystemCapability.Multimedia.Audio.Device

-

OUTPUT_DEVICE

-

2

-

Output role.
System capabilities: SystemCapability.Multimedia.Audio.Device

-
- - -## DeviceType - -Enumerates audio device types. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

INVALID

-

0

-

Invalid device.
System capabilities: SystemCapability.Multimedia.Audio.Device

-

SPEAKER

-

2

-

Speaker.
System capabilities: SystemCapability.Multimedia.Audio.Device

-

WIRED_HEADSET

-

3

-

Wired headset.
System capabilities: SystemCapability.Multimedia.Audio.Device

-

BLUETOOTH_SCO

-

7

-

Bluetooth device using the synchronous connection oriented (SCO) link.
System capabilities: SystemCapability.Multimedia.Audio.Device

-

BLUETOOTH_A2DP

-

8

-

Bluetooth device using the advanced audio distribution profile (A2DP).
System capabilities: SystemCapability.Multimedia.Audio.Device

-

MIC

-

15

-

Microphone.
System capabilities: SystemCapability.Multimedia.Audio.Device

-
- -## ActiveDeviceType - -Enumerates the active device types. - -| Name | Default Value | Default Value | -| ------------- | ------ | ------------------------------------------------------------ | -| SPEAKER | 2 | Speaker.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | -| BLUETOOTH_SCO | 7 | Bluetooth device using the SCO link.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | - - - -## AudioRingMode - -Enumerates ringer modes. - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

RINGER_MODE_SILENT

-

0

-

Silence mode.
System capabilities: SystemCapability.Multimedia.Audio.Communication

-

RINGER_MODE_VIBRATE

-

1

-

Vibration mode.
System capabilities: SystemCapability.Multimedia.Audio.Communication

-

RINGER_MODE_NORMAL

-

2

-

Normal mode.
System capabilities: SystemCapability.Multimedia.Audio.Communication

-
- - -## AudioSampleFormat8+ -Enumerates the audio sample formats. - -| Name | Default Value | Description | -| :-------------------- | :------------ | :----------------------------------------------------------------------------------------------------- | -| SAMPLE_FORMAT_INVALID | -1 | Invalid format.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_FORMAT_U8 | 0 | Unsigned 8 bit integer.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_FORMAT_S16LE | 1 | Signed 16 bit integer, little endian.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_FORMAT_S24LE | 2 | Signed 24 bit integer, little endian.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_FORMAT_S32LE | 3 | Signed 32 bit integer, little endian.
System capabilities: SystemCapability.Multimedia.Audio.Core | - -## AudioChannel8+ -Enumerates the audio channels. - -| Name | Default Value | Description | -| :----- | :------------ | :-------------------------------------------------------------------------------- | -| CHANNEL_1 | 0x1 << 0 | Channel count 1.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| CHANNEL_2 | 0x1 << 1 | Channel count 2.
System capabilities: SystemCapability.Multimedia.Audio.Core | - -## AudioSamplingRate8+ -Enumerates the audio sampling rates. - -| Name | Default Value | Description | -| :---------------- | :------------ | :------------------------------------------------------------------------------------ | -| SAMPLE_RATE_8000 | 8000 | Sampling rate 8000.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_11025 | 11025 | Sampling rate 11025.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_12000 | 12000 | Sampling rate 12000.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_16000 | 16000 | Sampling rate 16000.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_22050 | 22050 | Sampling rate 22050.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_24000 | 24000 | Sampling rate 24000.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_32000 | 32000 | Sampling rate 32000.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_44100 | 44100 | Sampling rate 44100.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_48000 | 48000 | Sampling rate 48000.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_64000 | 64000 | Sampling rate 64000.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| SAMPLE_RATE_96000 | 96000 | Sampling rate 96000.
System capabilities: SystemCapability.Multimedia.Audio.Core | - - -## AudioEncodingType8+ -Enumerates the audio encoding types. - -| Name | Default Value | Description | -| :-------------------- | :------------- | :------------------------------------------------------------------------------- | -| ENCODING_TYPE_INVALID | -1 | Invalid.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| ENCODING_TYPE_RAW | 0 | PCM encoding.
System capabilities: SystemCapability.Multimedia.Audio.Core | - - -## ContentType8+ -Enumerates the content types. - -| Name | Default Value | Description | -| :------------------------ | :------------ | :------------------------------------------------------------------------------------- | -| CONTENT_TYPE_UNKNOWN | 0 | Unknown content.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| CONTENT_TYPE_SPEECH | 1 | Speech content.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| CONTENT_TYPE_MUSIC | 2 | Music content.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| CONTENT_TYPE_MOVIE | 3 | Movie content.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| CONTENT_TYPE_SONIFICATION | 4 | Notification content.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| CONTENT_TYPE_RINGTONE | 5 | Ringtone content.
System capabilities: SystemCapability.Multimedia.Audio.Core | - - -## StreamUsage8+ -Enumerates the stream usage. - -| Name | Default Value | Description | -| :--------------------------------- | :------------ | :----------------------------------------------------------------------------------------------- | -| STREAM_USAGE_UNKNOWN | 0 | Unknown usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STREAM_USAGE_MEDIA | 1 | Media usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STREAM_USAGE_VOICE_COMMUNICATION | 2 | Voice communication usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STREAM_USAGE_NOTIFICATION_RINGTONE | 3 | Notification or ringtone usage.
System capabilities: SystemCapability.Multimedia.Audio.Core | - - -## AudioState8+ -Enumerates the audio states. - -| Name | Default Value | Description | -| :------------- | :------------ | :------------------------- | -| STATE_INVALID | -1 | Invalid state.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STATE_NEW | 0 | Create New instance state.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STATE_PREPARED | 1 | Prepared state.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STATE_RUNNING | 2 | Running state.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STATE_STOPPED | 3 | Stopped state.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STATE_RELEASED | 4 | Released state.
System capabilities: SystemCapability.Multimedia.Audio.Core | -| STATE_PAUSED | 5 | Paused state.
System capabilities: SystemCapability.Multimedia.Audio.Core | - - -## AudioRendererRate8+ -Enumerates the audio renderer rates. - -| Name | Default Value | Description | -| :----------------- | :------------ | :-------------------------------------------------------------------------------- | -| RENDER_RATE_NORMAL | 0 | Normal rate.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| RENDER_RATE_DOUBLE | 1 | Double rate.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| RENDER_RATE_HALF | 2 | Half rate.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | - - -## InterruptType8+ -Enumerates the interrupt types. - -| Name | Default Value | Description | -| :------------------- | :------------ | :-------------------------------------------------------------------------------------------------------- | -| INTERRUPT_TYPE_BEGIN | 1 | Audio playback interruption started.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| INTERRUPT_TYPE_END | 2 | Audio playback interruption ended.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | - - -## InterruptForceType8+ -Enumerates the interrupt force types. - -| Name | Default Value | Description | -| :-------------- | :------------ | :------------------------------------------------------------------------------------------------------------ | -| INTERRUPT_FORCE | 0 | Forced action taken by system.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| INTERRUPT_SHARE | 1 | App can choose to take action or ignore.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | - - -## InterruptHint8+ -Enumerates the interrupt hints. - -| Name | Default Value | Description | -| :-------------------- | :------------ | :---------------------------------------------------------------------------------------------- | -| INTERRUPT_HINT_NONE | 0 | None.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| INTERRUPT_HINT_RESUME | 1 | Resume the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| INTERRUPT_HINT_PAUSE | 2 | Paused/Pause the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| INTERRUPT_HINT_STOP | 3 | Stopped/Stop the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| INTERRUPT_HINT_DUCK | 4 | Ducked the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | -| INTERRUPT_HINT_UNDUCK | 5 | Unducked the playback.
System capabilities: SystemCapability.Multimedia.Audio.Renderer | - - -## RingtoneType8+ -Enumerates the ringtone types. - -| Name | Default Value | Description | -| :--------------------- | :------------ | :-------------- | -| RINGTONE_TYPE_DEFAULT | 0 | Default type. | -| RINGTONE_TYPE_MULTISIM | 1 | Multi-SIM type. | - -## AudioStreamInfo8+ -Describes audio stream information. - -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------------ | :-------------------- | :-------- | :-------------------- | -| samplingRate | AudioSamplingRate | Yes | Sampling rate. | -| channels | AudioChannel | Yes | Audio channels. | -| sampleFormat | AudioSampleFormat | Yes | Audio sample format. | -| encodingType | AudioEncodingType | Yes | Audio encoding type. | - -## AudioRendererInfo8+ -Describes audio renderer information. - -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------------ | :---------- | :-------- | :-------------------- | -| contentType | ContentType | Yes | Content type. | -| usage | StreamUsage | Yes | Stream usage. | -| rendererFlags | number | Yes | Audio renderer flags. | - -## AudioRendererOptions8+ -Describes audio renderer configuration options. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------------ | :---------------- | :-------- | :-------------------- | -| streamInfo | AudioStreamInfo | Yes | Stream information. | -| rendererInfo | AudioRendererInfo | Yes | Renderer information. | - -## InterruptEvent8+ -Describes the interrupt event received by the app when playback is interrupted. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :-------- | :----------------- | :-------- | :-------------------------------------------------------------------------- | -| eventType | InterruptType | Yes | Indicates whether the interruption has started or finished. | -| forceType | InterruptForceType | Yes | Indicates whether the action is taken by system or to be taken by the app. | -| hintType | InterruptHint | Yes | Indicates the kind of action. | - - -## VolumeEvent8+ -Describes the volume event received by the app when the volume is changed. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - -| Name | Type | Mandatory | Description | -| :--------- | :-------------- | :-------- | :--------------------------------------- | -| volumeType | AudioVolumeType | Yes | Volume type of the current stream. | -| volume | number | Yes | Volume level. | -| updateUi | boolean | Yes | Whether to show the volume change in UI. | - - -## RingtoneOptions8+ -Describes ringtone options. - -**Parameters** - -| Name | Type | Mandatory | Description | -| :----- | :------ | :-------- | :--------------- | -| volume | number | Yes | Ringtone volume. | -| loop | boolean | Yes | Loop value. | - - -# AudioManager - -Implements audio volume and audio device management. - -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -## audioManager.setVolume - -setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void - -Sets the volume for a stream. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

volume

-

number

-

Yes

-

Volume to set. The value range can be obtained by calling getMinVolume and getMaxVolume.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback used to return the result.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ - if (err) { - console.error('Failed to set the volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful volume setting.'); -}) -``` -## audioManager.setVolume - -setVolume\(volumeType: AudioVolumeType, volume: number\): Promise - -Sets the volume for a stream. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

volume

-

number

-

Yes

-

Volume to set. The value range can be obtained by calling getMinVolume and getMaxVolume.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
- -**Example** - -``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> - console.log('Promise returned to indicate a successful volume setting.'); -) -``` - -## audioManager.getVolume - -getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void - -Obtains the volume of a stream. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

callback

-

AsyncCallback<number>

-

Yes

-

Callback used to return the volume.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the volume is obtained.'); -}) -``` - - -## audioManager.getVolume - -getVolume\(volumeType: AudioVolumeType\): Promise - -Obtains the volume of a stream. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<number>

-

Promise used to return the volume.

-
- -**Example** - -``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the volume is obtained.' + value); -) -``` - - -## audioManager.getMinVolume - -getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void - -Obtains the minimum volume allowed for a stream. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

callback

-

AsyncCallback<number>

-

Yes

-

Callback used to return the minimum volume.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the minimum volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); -}) -``` - - -## audioManager.getMinVolume - -getMinVolume\(volumeType: AudioVolumeType\): Promise - -Obtains the minimum volume allowed for a stream. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<number>

-

Promise used to return the minimum volume.

-
- -**Example** - -``` -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promised returned to indicate that the minimum volume is obtained.' + value); -) -``` - - -## audioManager.getMaxVolume - -getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void - -Obtains the maximum volume allowed for a stream. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

callback

-

AsyncCallback<number>

-

Yes

-

Callback used to return the maximum volume.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the maximum volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); -}) -``` - - -## audioManager.getMaxVolume - -getMaxVolume\(volumeType: AudioVolumeType\): Promise - -Obtains the maximum volume allowed for a stream. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<number>

-

Promise used to return the maximum volume.

-
- -**Example** - -``` -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log('Promised returned to indicate that the maximum volume is obtained.'); -) -``` - -## audioManager.mute - -mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void - -Mutes a stream. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

mute

-

boolean

-

Yes

-

Mute status to set. The value true means to mute the stream, and false means the opposite.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback used to return the result.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { - if (err) { - console.error('Failed to mute the stream. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the stream is muted.'); -}) -``` - - -## audioManager.mute - -mute\(volumeType: AudioVolumeType, mute: boolean\): Promise - -Mutes a stream. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

mute

-

boolean

-

Yes

-

Mute status to set. The value true means to mute the stream, and false means the opposite.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
- -**Example** - -``` -audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => - console.log('Promise returned to indicate that the stream is muted.'); -) -``` - - -## audioManager.isMute - -isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void - -Checks whether a stream is muted. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

callback

-

AsyncCallback<boolean>

-

Yes

-

Callback used to return the mute status of the stream. The value true means that the stream is muted, and false means the opposite.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the mute status. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); -}) -``` - - -## audioManager.isMute - -isMute\(volumeType: AudioVolumeType\): Promise - -Checks whether a stream is muted. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise used to return the mute status of the stream. The value true means that the stream is muted, and false means the opposite.

-
- -**Example** - -``` -audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); -) -``` - - -## audioManager.isActive - -isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\) - -Checks whether a stream is active. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-

callback

-

AsyncCallback<boolean>

-

Yes

-

Callback used to return the active status of the stream. The value true means that the stream is active, and false means the opposite.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the active status of the stream. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); -}) -``` - - -## audioManager.isActive - -isActive\(volumeType: AudioVolumeType\): Promise - -Checks whether a stream is active. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

volumeType

-

AudioVolumeType

-

Yes

-

Audio stream type.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise used to return the active status of the stream. The value true means that the stream is active, and false means the opposite.

-
- -**Example** - -``` -audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); -) -``` - - -## audioManager.setRingerMode - -setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void - -Sets the ringer mode. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Communication - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

mode

-

AudioRingMode

-

Yes

-

Ringer mode.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback used to return the result.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { - if (err) { - console.error('Failed to set the ringer mode.​ ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful setting of the ringer mode.'); -}) -``` - - -## audioManager.setRingerMode - -setRingerMode\(mode: AudioRingMode\): Promise - -Sets the ringer mode. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Communication - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

mode

-

AudioRingMode

-

Yes

-

Ringer mode.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
- -**Example** - -``` -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => - console.log('Promise returned to indicate a successful setting of the ringer mode.'); -) -``` - - -## audioManager.getRingerMode - -getRingerMode\(callback: AsyncCallback\): void - -Obtains the ringer mode. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Communication - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

callback

-

AsyncCallback<AudioRingMode>

-

Yes

-

Callback used to return the ringer mode.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.getRingerMode((err, value) => { - if (err) { - console.error('Failed to obtain the ringer mode.​ ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); -}) -``` - - -## audioManager.getRingerMode - -getRingerMode\(\): Promise - -Obtains the ringer mode. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Communication - -**Parameters** - -None - -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<AudioRingMode>

-

Promise used to return the ringer mode.

-
- -**Example** - -``` -audioManager.getRingerMode().then((value) => - console.log('Promise returned to indicate that the ringer mode is obtained.' + value); -) -``` - - -## audioManager.setAudioParameter - -setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void - -Sets an audio parameter. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -**Parameters** - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the audio parameter to set.

-

value

-

string

-

Yes

-

Value of the audio parameter to set.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback used to return the result.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { - if (err) { - console.error('Failed to set the audio parameter. ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful setting of the audio parameter.'); -}) -``` - - -## audioManager.setAudioParameter - -setAudioParameter\(key: string, value: string\): Promise - -Sets an audio parameter. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the audio parameter to set.

-

value

-

string

-

Yes

-

Value of the audio parameter to set.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
- -**Example** - -``` -audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => - console.log('Promise returned to indicate a successful setting of the audio parameter.'); -) -``` - - -## audioManager.getAudioParameter - -getAudioParameter\(key: string, callback: AsyncCallback\) - -Obtains the value of an audio parameter. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the audio parameter whose value is to be obtained.

-

callback

-

AsyncCallback<string>

-

Yes

-

Callback used to return the value of the audio parameter.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.getAudioParameter('PBits per sample', (err, value) => { - if (err) { - console.error('Failed to obtain the value of the audio parameter. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); -}) -``` - - -## audioManager.getAudioParameter - -getAudioParameter\(key: string\): Promise - -Obtains the value of an audio parameter. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Core - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

key

-

string

-

Yes

-

Key of the audio parameter whose value is to be obtained.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<string>

-

Promise used to return the value of the audio parameter.

-
- -**Example** - -``` -audioManager.getAudioParameter('PBits per sample').then((value) => - console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); -) -``` - - -## audioManager.getDevices - -getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void - -Obtains the audio devices with a specific flag. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceFlag

-

DeviceFlag

-

Yes

-

Audio device flag.

-

callback

-

AsyncCallback<AudioDeviceDescriptors>

-

Yes

-

Callback used to return the device list.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ - if (err) { - console.error('Failed to obtain the device list. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the device list is obtained.'); -}) -``` - - - -## audioManager.getDevices - -getDevices\(deviceFlag: DeviceFlag\): Promise - -Obtains the audio devices with a specific flag. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceFlag

-

DeviceFlag

-

Yes

-

Audio device flag.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<AudioDeviceDescriptors>

-

Promise used to return the device list.

-
- -**Example** - -``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> - console.log('Promise returned to indicate that the device list is obtained.'); -) -``` - - -## audioManager.setDeviceActive - -setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void - -Sets a device to the active state. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceType

-

DeviceType

-

Yes

-

Audio device type.

-

active

-

boolean

-

Yes

-

Active status to set. The value true means to set the device to the active status, and false means the opposite.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback used to return the result.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { - if (err) { - console.error('Failed to set the active status of the device. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the device is set to the active status.'); -}) -``` - - - -## audioManager.setDeviceActive - -setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise - -Sets a device to the active state. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceType

-

DeviceType

-

Yes

-

Audio device type.

-

active

-

boolean

-

Yes

-

Active status to set. The value true means to set the device to the active status, and false means the opposite.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
- -**Example** - -``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> - console.log('Promise returned to indicate that the device is set to the active status.'); -) -``` - - -## audioManager.isDeviceActive - -isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void - -Checks whether a device is active. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceType

-

DeviceType

-

Yes

-

Audio device type.

-

callback

-

AsyncCallback<boolean>

-

Yes

-

Callback used to return the active status of the device.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { - if (err) { - console.error('Failed to obtain the active status of the device. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the active status of the device is obtained.'); -}) -``` - - -## audioManager.isDeviceActive - -isDeviceActive\(deviceType: DeviceType\): Promise - -Checks whether a device is active. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

deviceType

-

DeviceType

-

Yes

-

Audio device type.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise used to return the active status of the device.

-
- -**Example** - -``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => - console.log('Promise returned to indicate that the active status of the device is obtained.' + value); -) -``` - - -## audioManager.setMicrophoneMute - -setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void - -Mutes or unmutes the microphone. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

mute

-

boolean

-

Yes

-

Mute status to set. The value true means to mute the microphone, and false means the opposite.

-

callback

-

AsyncCallback<void>

-

Yes

-

Callback used to return the result.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.setMicrophoneMute(true, (err) => { - if (err) { - console.error('Failed to mute the microphone. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the microphone is muted.'); -}) -``` - - -## audioManager.setMicrophoneMute - -setMicrophoneMute\(mute: boolean\): Promise - -Mutes or unmutes the microphone. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

mute

-

boolean

-

Yes

-

Mute status to set. The value true means to mute the microphone, and false means the opposite.

-
- -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<void>

-

Promise used to return the result.

-
- -**Example** - -``` -audioManager.setMicrophoneMute(true).then(() => - console.log('Promise returned to indicate that the microphone is muted.'); -) -``` - - -## audioManager.isMicrophoneMute - -isMicrophoneMute\(callback: AsyncCallback\): void - -Checks whether the microphone is muted. This method uses an asynchronous callback to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

callback

-

AsyncCallback<boolean>

-

Yes

-

Callback used to return the mute status of the microphone. The value true means that the microphone is muted, and false means the opposite.

-
- -**Return value** - -None - -**Example** - -``` -audioManager.isMicrophoneMute((err, value) => { - if (err) { - console.error('Failed to obtain the mute status of the microphone. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); -}) -``` - - -## audioManager.isMicrophoneMute - -isMicrophoneMute\(\): Promise - -Checks whether the microphone is muted. This method uses a promise to return the query result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -**Parameters** - -None - -**Return value** - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise used to return the mute status of the microphone. The value true means that the microphone is muted, and false means the opposite.

-
- -**Example** - -``` -audioManager.isMicrophoneMute().then((value) => - console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); -) -``` - - -## audioManager.on - -on(type: 'volumeChange', callback: Callback): void8+ - -Listens for system volume change events. This method uses a callback to get volume change events. - -**System capabilities**: SystemCapability.Multimedia.Audio.Volume - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :--------------------------------------------------- | -| type | string | Yes | Type of the playback event to listen for. | -| callback | Callback | Yes | Callback used to get the system volume change event. | - -**Return value** - -None - -**Example** - -``` -audioManager.on('volumeChange', (volumeEvent) => { - console.log('VolumeType of stream: ' + volumeEvent.volumeType); - console.log('Volume level: ' + volumeEvent.volume); - console.log('Whether to updateUI: ' + volumeEvent.updateUi); -}) -``` - - -## audioManager.on - -on(type: 'ringerModeChange', callback: Callback): void8+ - -Listens for ringer mode change events. This method uses a callback to get ringer mode changes. - -**System capabilities**: SystemCapability.Multimedia.Audio.Communication - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :----------------------- | :-------- | :-------------------------------------------- | -| type | string | Yes | Type of the playback event to listen for. | -| callback | Callback | Yes | Callback used to get the updated ringer mode. | - -**Return value** - -None - -**Example** - -``` -audioManager.on('ringerModeChange', (ringerMode) => { - console.log('Updated ringermode: ' + ringerMode); -}) -``` - -# AudioDeviceDescriptor -Describes an audio device. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -## AudioDeviceDescriptors - -type AudioDeviceDescriptors = Array\> : void\ -
-Array of AudioDeviceDescriptors, which is read-only. - -**System capabilities**: SystemCapability.Multimedia.Audio.Device - -## audioDeviceDescriptor.deviceRole - -readonly deviceRole: DeviceRole - -Defines the role of the device. - -| Name | Type | Readable | Writable | Description | -| :--------- | :--------- | :------- | :------- | ------------------ | -| deviceRole | DeviceRole | Yes | No | Audio device role. | - -## audioDeviceDescriptor.deviceType - -readonly deviceType: DeviceType - -Defines the type of the device. - -| Name | Type | Readable | Writable | Description | -| :--------- | :--------- | :------- | :------- | ------------------ | -| deviceType | DeviceType | Yes | No | Audio device type. | - -``` -function deviceProp(audioDeviceDescriptor, index, array) { - deviceRoleValue = audioDeviceDescriptor.deviceRole; - deviceTypeValue = audioDeviceDescriptor.deviceType; -} - -deviceRoleValue = null; -deviceTypeValue = null; -const promise = audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG); -promise.then(async function (audioDeviceDescriptors) { - console.info('getDevices OUTPUT_DEVICES_FLAG'); - audioDeviceDescriptors.forEach(deviceProp); - if (deviceTypeValue != null && deviceRoleValue != null){ - console.info('OUTPUT_DEVICES_FLAG : Pass'); - expect(true).assertTrue(); - } - else{ - console.error('OUTPUT_DEVICES_FLAG : fail'); - expect(false).assertTrue(); - } - }); - await promise; - done(); -}) -``` -# AudioRenderer -Provides audio playback APIs. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -## audioRenderer.state - -readonly state: AudioState 8+ - -Defines the current render state. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -| Name | Type | Readable | Writable | Description | -| :---- | :--------- | :------- | :------- | :------------------ | -| state | AudioState | Yes | No | Audio render state. | - -**Example** - -``` - var state = audioRenderer.state; -``` - -## audioRenderer.getRendererInfo - -getRendererInfo(callback: AsyncCallback): void8+ - -Gets the renderer information provided while creating a renderer instance. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :--------------------------------- | :-------- | :------------------------------------------------ | -| callback | AsyncCallback | Yes | Callback used to return the renderer information. | - -**Return value** - -None - -**Example** - -``` -audioRenderer.getRendererInfo((err, rendererInfo)=>{ - console.log('Renderer GetRendererInfo:'); - console.log('Renderer content:' + rendererInfo.content); - console.log('Renderer usage:' + rendererInfo.usage); - console.log('Renderer flags:' + rendererInfo.rendererFlags); -}) -``` - - -## audioRenderer.getRendererInfo - -getParams(): Promise8+ - -Gets the renderer information provided while creating a renderer instance. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :---------------------------- | :----------------------------------------------- | -| Promise | Promise used to return the renderer information. | - -**Example** - -``` -let rendererInfo = await audioRenderer.getRendererInfo(); -console.log('Renderer GetRendererInfo:'); -console.log('Renderer content:' + rendererInfo.content); -console.log('Renderer usage:' + rendererInfo.usage); -console.log('Renderer flags:' + rendererInfo.rendererFlags); -``` - -## audioRenderer.getStreamInfo - -getStreamInfo(callback: AsyncCallback): void8+ - -Gets the renderer stream information. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :--------------------------------- | :-------- | :---------------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the stream information. | - -**Return value** - -None - -**Example** - -``` -audioRenderer.getStreamInfo((err, streamInfo)=>{ - console.log('Renderer GetStreamInfo:'); - console.log('Renderer sampling rate:' + streamInfo.samplingRate); - console.log('Renderer channel:' + streamInfo.AudioChannel); - console.log('Renderer format:' + streamInfo.AudioSampleFormat); - console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); -}) -``` - -## audioRenderer.getStreamInfo - -getStreamInfo(): Promise8+ - -Gets the renderer stream information. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :---------------------------- | :--------------------------------------------- | -| Promise | Promise used to return the stream information. | - -**Example** - -``` -let streamInfo = await audioRenderer.getStreamInfo(); -console.log('Renderer GetStreamInfo:'); -console.log('Renderer sampling rate:' + streamInfo.samplingRate); -console.log('Renderer channel:' + streamInfo.AudioChannel); -console.log('Renderer format:' + streamInfo.AudioSampleFormat); -console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); -``` - -## audioRenderer.start - -start(callback: AsyncCallback): void8+ - -Starts the renderer. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :---------------------- | :-------- | :-------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | - -**Return value** - -None - -**Example** - -``` -audioRenderer.start((err)=>{ - if (err) { - console.error('Renderer start failed.'); - } else { - console.info('Renderer start success.'); - } -}) -``` - - -## audioRenderer.start - -start(): Promise8+ - -Starts the renderer. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | - -**Example** - -``` -await audioRenderer.start(); -``` - - -## audioRenderer.pause - -pause(callback: AsyncCallback): void8+ - -Pauses rendering. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :---------------------- | :-------- | :------------------------------------ | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | - -**Return value** - -None - -**Example** - -``` -audioRenderer.pause((err)=>{ - if (err) { - console.error('Renderer pause failed'); - } else { - console.log('Renderer paused.'); - } -}) -``` - - - -## audioRenderer.pause - -pause(): Promise8+ - -Pauses rendering. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | - -**Example** - -``` -await audioRenderer.pause(); -``` - - - -## audioRenderer.drain - -drain(callback: AsyncCallback): void8+ - -Drains the playback buffer. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :---------------------- | :-------- | :---------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | - -**Return value** - -None - -**Example** - -``` -audioRenderer.drain((err)=>{ - if (err) { - console.error('Renderer drain failed'); - } else { - console.log('Renderer drained.'); - } -}) -``` - - -## audioRenderer.drain - -drain(): Promise8+ - -Drains the playback buffer. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | - -**Example** - -``` -await audioRenderer.drain(); -``` - - -## audioRenderer.stop - -stop(callback: AsyncCallback): void8+ - -Stops rendering. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :---------------------- | :-------- | :------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | - -**Return value** - -None - -**Example** - -``` -audioRenderer.stop((err)=>{ - if (err) { - console.error('Renderer stop failed'); - } else { - console.log('Renderer stopped.'); - } -}) -``` - - -## audioRenderer.stop - -stop(): Promise8+ - -Stops rendering. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | - -**Example** - -``` -await audioRenderer.stop(); -``` - - -## audioRenderer.release - -release(callback: AsyncCallback): void8+ - -Releases the renderer. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :---------------------- | :-------- | :------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | - -**Return value** - -None - -**Example** - -``` -audioRenderer.release((err)=>{ - if (err) { - console.error('Renderer release failed'); - } else { - console.log('Renderer released.'); - } -}) -``` - - - -## audioRenderer.release - -release(): Promise8+ - -Releases the renderer. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | - -**Example** - -``` -await audioRenderer.release(); -``` - - - -## audioRenderer.write - -write(buffer: ArrayBuffer, callback: AsyncCallback): void8+ - -Writes the buffer. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :---------------------- | :-------- | :--------------------------------------------------------------------------------------------------- | -| buffer | ArrayBuffer | Yes | Buffer to be written. | -| callback | AsyncCallback | Yes | Returns the number of bytes written if the operation is successful; returns an error code otherwise. | -| | | | | - -**Return value** - -None - -**Example** - -``` -let ss = fileio.createStreamSync(filePath, 'r'); -let buf = new ArrayBuffer(bufferSize); -ss.readSync(buf); -audioRenderer.write(buf, (err, writtenbytes)=>{ - if (writtenbytes < 0) { - console.error('write failed.'); - } else { - console.log('Actual written bytes: ' + writtenbytes); - } -}) -``` - - -## audioRenderer.write - -write(buffer: ArrayBuffer): Promise8+ - -Writes the buffer. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :--------------- | :--------------------------------------------------------------------------------------------------- | -| Promise | Returns the number of bytes written if the operation is successful; returns an error code otherwise. | - -**Example** - -``` -let ss = fileio.createStreamSync(filePath, 'r'); -let buf = new ArrayBuffer(bufferSize); -ss.readSync(buf); -let writtenbytes = await audioRenderer.write(buf); -if (writtenbytes < 0) { - console.error('write failed.'); -} else { - console.log('Actual written bytes: ' + writtenbytes); -} -``` - - - -## audioRenderer.getAudioTime - -getAudioTime(callback: AsyncCallback): void8+ - -Obtains the timestamp. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the timestamp. | -| | | | | - -**Return value** - -None - -**Example** - -``` -audioRenderer.getAudioTime((err, timestamp)=>{ - console.log('Current timestamp: ' + timestamp); -}) -``` - - -## audioRenderer.getAudioTime - -getAudioTime(): Promise8+ - -Obtains the timestamp. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -None - -**Return value** - -| Type | Description | -| :--------------- | :------------------------------------ | -| Promise | Promise used to return the timestamp. | - -**Example** - -``` -let timestamp = await audioRenderer.getAudioTime(); -console.log('Current timestamp: ' + timestamp); -``` - - -## audioRenderer.getBufferSize - -getBufferSize(callback: AsyncCallback): void8+ - -Obtains a reasonable minimum buffer size for rendering. This method uses an asynchronous callback to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer - -**Parameters** - -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :--------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the buffer size. | -| | | | | - -**Return value** - -None - -**Example** +**返回值:** +| 类型 | 说明 | +| -------- | -------- | +| [AudioManager](#audiomanager) | 音频管理类。 | +**示例:** +``` +var audioManager = audio.getAudioManager(); ``` -audioRenderer.getBufferSize((err, bufferSize)=>{ - if (err) { - console.error('getBufferSize error'); - } -}) -let buf = new ArrayBuffer(bufferSize); -ss.readSync(buf); -``` -## audioRenderer.getBufferSize +## AudioVolumeType -getBufferSize(): Promise8+ +枚举,音频流类型。 -Obtains a reasonable minimum buffer size for rendering. This method uses a promise to return the result. +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| RINGTONE | 2 | 表示铃声。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | +| MEDIA | 3 | 表示媒体。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer -**Parameters** +## DeviceFlag -None +枚举,可获取的设备种类。 -**Return value** +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| OUTPUT_DEVICES_FLAG | 1 | 表示输出设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| INPUT_DEVICES_FLAG | 2 | 表示输入设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| ALL_DEVICES_FLAG | 3 | 表示所有设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| Type | Description | -| :--------------- | :-------------------------------------- | -| Promise | Promise used to return the buffer size. | -**Example** +## DeviceRole -``` -var bufferSize = await audioRenderer.getBufferSize(); -let buf = new ArrayBuffer(bufferSize); -ss.readSync(buf); -``` +枚举,设备角色。 +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| INPUT_DEVICE | 1 | 输入设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| OUTPUT_DEVICE | 2 | 输出设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -## audioRenderer.setRenderRate -setRenderRate(rate: AudioRendererRate, callback: AsyncCallback): void8+ +## DeviceType -Sets the render rate. This method uses an asynchronous callback to return the result. +枚举,设备类型。 -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer +| 名称 | 默认值 | 描述 | +| -------------- | ------ | ------------------------------------------------------------ | +| INVALID | 0 | 无效设备。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| EARPIECE | 1 | 听筒。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| WIRED_HEADSET | 3 | 有线耳机。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP连接(Advanced Audio Distribution Profile)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| MIC | 15 | 麦克风。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -**Parameters** +## ActiveDeviceType -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :------------------------------------ | -| rate | AudioRendererRate | Yes | Audio render rate. | -| callback | AsyncCallback | Yes | Callback used to return the result. | +枚举,活跃设备类型。 -**Return value** +| 名称 | 默认值 | 描述 | +| ------------- | ------ | ------------------------------------------------------------ | +| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -None +## AudioRingMode -**Example** +枚举,铃声模式。 -``` -audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL, (err)=> { - if (err) { - console.error('Failed to set params'); - } else { - console.log('Callback invoked to indicate a successful render rate setting.'); - } -}) -``` +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| RINGER_MODE_SILENT | 0 | 静音模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | +| RINGER_MODE_VIBRATE | 1 | 震动模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | +| RINGER_MODE_NORMAL | 2 | 响铃模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | -## audioRenderer.setRenderRate +## AudioManager -setRenderRate(rate: AudioRendererRate): Promise8+ +管理音频音量和音频设备。 -Sets the render rate. This method uses a promise to return the result. +### setVolume -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer +setVolume(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback<void>): void -**Parameters** +设置指定流的音量,使用callback方式返回异步结果。 -| Name | Type | Mandatory | Description | -| :--- | :---------------- | :-------- | :----------------- | -| rate | AudioRendererRate | Yes | Audio render rate. | +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Return value** +**参数:** -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | -**Example** +**示例:** ``` -await audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL); +var audioManager = audio.getAudioManager(); +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ + if (err) { + console.error('Failed to set the volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful volume setting.'); +}) ``` +### setVolume -## audioRenderer.getRenderRate +setVolume(volumeType: AudioVolumeType, volume: number): Promise<void> -getRenderRate(callback: AsyncCallback): void8+ +设置指定流的音量,使用promise方式返回异步结果。 -Obtains the current render rate. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer +**参数:** -**Parameters** -| Name | Type | Mandatory | Description | -| :------- | :-------------------------------- | :-------- | :--------------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the audio render rate. | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | -**Return value** +**返回值:** -None +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调表示成功还是失败。 | -**Example** +**示例:** ``` -audioRenderer.getRenderRate((err, renderrate)=>{ - console.log('getRenderRate: ' + renderrate); -}) +var audioManager = audio.getAudioManager(); +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> + console.log('Promise returned to indicate a successful volume setting.'); +) ``` +### getVolume -## audioRenderer.getRenderRate - -getRenderRate(): Promise8+ - -Obtains the current render rate. This method uses a promise to return the result. - -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer +getVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void -**Parameters** +获取指定流的音量,使用callback方式返回异步结果。 -None +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Return value** +**参数:** -| Type | Description | -| :-------------------------- | :-------------------------------------------- | -| Promise | Promise used to return the audio render rate. | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回音量大小。 | -**Example** +**示例:** ``` -let renderRate = await audioRenderer.getRenderRate(); -console.log('getRenderRate: ' + renderrate); +var audioManager = audio.getAudioManager(); +audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the volume is obtained.'); +}) ``` +### getVolume -## audioRenderer.on +getVolume(volumeType: AudioVolumeType): Promise<number> -on(type: 'interrupt', callback: Callback): void8+ +获取指定流的音量,使用promise方式返回异步结果。 -Listens for audio interrupt events. This method uses a callback to get interrupt events. The interrupt event is triggered when audio playback is interrupted. +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**System capabilities**: SystemCapability.Multimedia.Audio.Renderer +**参数:** -**Parameters** -| Name | Type | Mandatory | Description | -| :------- | :------------------------ | :-------- | :---------------------------------------------- | -| type | string | Yes | Type of the playback event to listen for. | -| callback | Callback | Yes | Callback used to listen for interrupt callback. | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -**Return value** +**返回值:** -None +| 类型 | 说明 | +| -------- | -------- | +| Promise<number> | Promise回调返回音量大小。 | -**Example** +**示例:** ``` -audioRenderer.on('interrupt', (interruptEvent) => { - if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) { - switch (interruptEvent.hintType) { - case audio.InterruptHint.INTERRUPT_HINT_PAUSE: - console.log('Force paused. Stop writing'); - isPlay = false; - break; - case audio.InterruptHint.INTERRUPT_HINT_STOP: - console.log('Force stopped. Stop writing'); - isPlay = false; - break; - } - } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) { - switch (interruptEvent.hintType) { - case audio.InterruptHint.INTERRUPT_HINT_RESUME: - console.log('Resume force paused renderer or ignore'); - startRenderer(); - break; - case audio.InterruptHint.INTERRUPT_HINT_PAUSE: - console.log('Choose to pause or ignore'); - pauseRenderer(); - break; - } - } -}) +var audioManager = audio.getAudioManager(); +audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the volume is obtained.' + value); +) ``` +### getMinVolume +getMinVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void -## SystemSoundManager - - -## systemSoundManager.setSystemRingtoneUri - -setSystemRingtoneUri(context: Context, uri: string, type: RingtoneType, callback: AsyncCallback): void8+ - -Sets the system ringtone URI. This method uses an asynchronous callback to return the result. - -**Parameters** +获取指定流的最小音量,使用callback方式返回异步结果。 -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :---------------------------------- | -| context | Context | Yes | Current application context. | -| uri | string | Yes | Ringtone URI to be set. | -| type | RingtoneType | Yes | Ringtone type to be set. | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Return value** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回最小音量。 | -**Example** +**示例:** ``` -systemSoundManager.setSystemRingtoneUri(null, '/data/media/Ringtonetone.wav', - audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err)=> { +var audioManager = audio.getAudioManager(); +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { - console.error('Failed to setSystemRingtoneUri'); - } else { - console.log('Callback invoked to indicate a successful system ringtone URI setting.'); + console.error('Failed to obtain the minimum volume. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); }) ``` +### getMinVolume -## systemSoundManager.setSystemRingtoneUri +getMinVolume(volumeType: AudioVolumeType): Promise<number> -setSystemRingtoneUri(context: Context, uri: string, type: RingtoneType): Promise8+ +获取指定流的最小音量,使用promise方式返回异步结果。 -Sets the system ringtone URI. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | -| :------ | :----------- | :-------- | :--------------------------- | -| context | Context | Yes | Current application context. | -| uri | string | Yes | Ringtone URI to be set. | -| type | RingtoneType | Yes | Ringtone type to be set. | -| | | | | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -**Return value** +**返回值:** -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<number> | Promise回调返回最小音量。 | -**Example** +**示例:** ``` -await systemSoundManager.setSystemRingtoneUri(null, '/data/media/Ringtone.wav', audio.RingtoneType.RINGTONE_TYPE_DEFAULT); +var audioManager = audio.getAudioManager(); +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promised returned to indicate that the minimum volume is obtained.' + value); +) ``` +### getMaxVolume -## systemSoundManager.getSystemRingtoneUri - -getSystemRingtoneUri(context: Context, type: RingtoneType, callback: AsyncCallback): void8+ - -Obtains the system ringtone URI. This method uses an asynchronous callback to return the result. +getMaxVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void -**Parameters** +获取指定流的最大音量,使用callback方式返回异步结果。 -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :---------------------------------- | -| context | Context | Yes | Current application context. | -| type | RingtoneType | Yes | Ringtone type to be obtained. | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Return value** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回最大音量大小。 | -**Example** +**示例:** ``` -systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtoneUri)=>{ +var audioManager = audio.getAudioManager(); +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { - console.err('getSystemRingtoneUri failed'); - } else { - console.log('getSystemRingtoneUri success: ' + ringtoneUri); + console.error('Failed to obtain the maximum volume. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); }) ``` +### getMaxVolume -## systemSoundManager.getSystemRingtoneUri +getMaxVolume(volumeType: AudioVolumeType): Promise<number> -getSystemRingtoneUri(context: Context, type: RingtoneType): Promise8+ +获取指定流的最大音量,使用promise方式返回异步结果。 -Obtains the system ringtone URI. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Parameters** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -**Return value** +**返回值:** -| Type | Description | -| :--------------- | :-------------------------------- | -| Promise | Promise used to the ringtone URI. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<number> | Promise回调返回最大音量大小。 | -**Example** +**示例:** ``` -let ringtoneUri = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); -if (ringtoneUri == '/data/media/Believer60s.wav') { - console.log('getSystemRingtoneUri success: ' + uri); -} else { - console.log('getSystemRingtoneUri fail: ' + uri); -} +var audioManager = audio.getAudioManager(); +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> + console.log('Promised returned to indicate that the maximum volume is obtained.'); +) ``` +### mute -## systemSoundManager.getSystemRingtonePlayer - -getSystemRingtonePlayer(context: Context, type: RingtoneType, callback: AsyncCallback): void8+ - -Obtains the ringtone player. This method uses an asynchronous callback to return the result. +mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback<void>): void -**Parameters** +设置指定音量流静音,使用callback方式返回异步结果。 -| Name | Type | Mandatory | Description | -| :------- | :------------------------------ | :-------- | :---------------------------------------- | -| context | Context | Yes | Current application context. | -| type | RingtoneType | Yes | Ringtone type to be obtained. | -| callback | AsyncCallback) | Yes | Ringtone player maintained in the system. | -| | | | | +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Return value** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | -**Example** +**示例:** ``` -systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ +var audioManager = audio.getAudioManager(); +audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { if (err) { - console.err('getSystemRingtonePlayer failed'); - } else { - console.log('getSystemRingtonePlayer success: '); + console.error('Failed to mute the stream. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the stream is muted.'); }) ``` +### mute + +mute(volumeType: AudioVolumeType, mute: boolean): Promise<void> -## systemSoundManager.getSystemRingtonePlayer +设置指定音量流静音,使用promise方式返回异步结果。 -getSystemRingtonePlayer(context: Context, type: RingtoneType): Promise8+ +**系统能力:** SystemCapability.Multimedia.Audio.Volume -Obtains the ringtone player. This method uses a promise to return the result. +**参数:** -**Parameters** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | -None +**返回值:** -**Return value** +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调表示成功还是失败。 | -| Type | Description | -| :----------------------- | :--------------------------------------- | -| Promise | Promise used return the ringtone player. | +**示例:** -**Example** ``` -let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); +var audioManager = audio.getAudioManager(); +audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => + console.log('Promise returned to indicate that the stream is muted.'); +) ``` -## systemSoundManager.setSystemNotificationUri - -setSystemNotificationUri(context: Context, uri: string, callback: AsyncCallback): void8+ +### isMute -Sets the system notification URI. This method uses an asynchronous callback to return the result. +isMute(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void -**Parameters** +获取指定音量流是否被静音,使用callback方式返回异步结果。 -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :---------------------------------- | -| context | Context | Yes | Current application context. | -| uri | string | Yes | System notification URI to be set. | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Return value** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回流静音状态,true为静音,false为非静音。 | -**Example** +**示例:** ``` -systemSoundManager.setSystemNotificationUri(null, '/data/media/Notification.wav'), (err)=> { - if (err) { - console.error('Failed to setSystemNotificationUri'); - } else { - console.log('Callback invoked to indicate a successful system notification URI setting.'); - } +var audioManager = audio.getAudioManager(); +audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the mute status. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); }) ``` -## systemSoundManager.setSystemNotificationUri +### isMute + +isMute(volumeType: AudioVolumeType): Promise<boolean> -setSystemNotificationUri(context: Context, uri: string): Promise8+ +获取指定音量流是否被静音,使用promise方式返回异步结果。 -Sets the system notification URI. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | -| :------ | :------ | :-------- | :--------------------------------- | -| context | Context | Yes | Current application context. | -| uri | string | Yes | System notification URI to be set. | -| | | | | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -**Return value** +**返回值:** -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<boolean> | Promise回调返回流静音状态,true为静音,false为非静音。 | -**Example** +**示例:** ``` -await systemSoundManager.setSystemNotificationUri(null, '/data/media/Notification.wav'); +var audioManager = audio.getAudioManager(); +audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); +) ``` +### isActive -## systemSoundManager.getSystemNotificationUri - -getSystemNotificationUri(context: Context, callback: AsyncCallback): void8+ +isActive(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void -Obtains the system notification URI. This method uses an asynchronous callback to return the result. +获取指定音量流是否为活跃状态,使用callback方式返回异步结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Audio.Volume -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :--------------------------------------------------- | -| context | Context | Yes | Current application context. | -| callback | AsyncCallback | Yes | Callback used to return the system notification URI. | -| | | | | +**参数:** -**Return value** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回流的活跃状态,true为活跃,false为不活跃。 | -None - -**Example** +**示例:** ``` -systemSoundManager.getSystemNotificationUri(null, (err, notificationUri)=>{ +var audioManager = audio.getAudioManager(); +audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { - console.err('getSystemNotificationUri failed'); - } else { - console.log('getSystemNotificationUri success: ' + notificationUri); + console.error('Failed to obtain the active status of the stream. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); }) ``` +### isActive -## systemSoundManager.getSystemNotificationUri +isActive(volumeType: AudioVolumeType): Promise<boolean> -getSystemNotificationUri(context: Context): Promise8+ +获取指定音量流是否为活跃状态,使用promise方式返回异步结果。 -Obtains the system notification URI. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Volume -**Parameters** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -**Return value** +**返回值:** -| Type | Description | -| :--------------- | :-------------------------------------------------- | -| Promise | Promise used to return the system notification URI. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<boolean> | Promise回调返回流的活跃状态,true为活跃,false为不活跃。 | -**Example** +**示例:** ``` -let notificationUri = await systemSoundManager.getSystemNotificationUri(null); -console.log('getSystemNotificationUri : ' + uri); +var audioManager = audio.getAudioManager(); +audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); +) ``` +### setRingerMode -## systemSoundManager.setSystemAlarmUri - -setSystemAlarmUri(context: Context, uri: string, callback: AsyncCallback): void8+ +setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void -Sets the system alarm URI. This method uses an asynchronous callback to return the result. +设置铃声模式,使用callback方式返回异步结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Audio.Communication -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :---------------------------------- | -| context | Context | Yes | Current application context. | -| uri | string | Yes | System alarm URI to be set. | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**参数:** -**Return value** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | -None - -**Example** +**示例:** ``` -systemSoundManager.setSystemAlarmUri(null, '/data/media/Alarm.wav'), (err)=> { - if (err) { - console.error('Failed to setSystemAlarmUri'); - } else { - console.log('Callback invoked to indicate a successful system alarm URI setting.'); +var audioManager = audio.getAudioManager(); +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { + if (err) { + console.error('Failed to set the ringer mode.​ ${err.message}'); + return; } + console.log('Callback invoked to indicate a successful setting of the ringer mode.'); }) ``` +### setRingerMode -## systemSoundManager.setSystemAlarmUri +setRingerMode(mode: AudioRingMode): Promise<void> -setSystemAlarmUri(context: Context, uri: string): Promise8+ +设置铃声模式,使用promise方式返回异步结果。 -Sets the system alarm URI. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Communication -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | -| :------ | :------ | :-------- | :--------------------------- | -| context | Context | Yes | Current application context. | -| uri | string | Yes | System alarm URI to be set. | -| | | | | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | -**Return value** +**返回值:** -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | -**Example** +**示例:** ``` -await systemSoundManager.setSystemAlarmUri(null, '/data/media/Alarm.wav'); +var audioManager = audio.getAudioManager(); +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => + console.log('Promise returned to indicate a successful setting of the ringer mode.'); +) ``` -## systemSoundManager.getSystemAlarmUri - -getSystemAlarmUri(context: Context, callback: AsyncCallback): void8+ +### getRingerMode -Obtains the system alarm URI. This method uses an asynchronous callback to return the result. +getRingerMode(callback: AsyncCallback<AudioRingMode>): void -**Parameters** +获取铃声模式,使用callback方式返回异步结果。 -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :-------------------------------------------- | -| context | Context | Yes | Current application context. | -| callback | AsyncCallback | Yes | Callback used to return the system alarm URI. | -| | | | | +**系统能力:** SystemCapability.Multimedia.Audio.Communication -**Return value** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<[AudioRingMode](#audioringmode)> | 是 | 回调返回系统的铃声模式。 | -**Example** +**示例:** ``` -systemSoundManager.getSystemAlarmUri(null, (err, alarmUri)=>{ - if (err) { - console.err('getSystemAlarmUri failed'); - } else { - console.log('getSystemAlarmUri success: ' + alarmUri); - } +var audioManager = audio.getAudioManager(); +audioManager.getRingerMode((err, value) => { + if (err) { + console.error('Failed to obtain the ringer mode.​ ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); }) ``` -## systemSoundManager.getSystemAlarmUri - -getSystemAlarmUri(context: Context): Promise8+ +### getRingerMode -Obtains the system alarm URI. This method uses a promise to return the result. +getRingerMode(): Promise<AudioRingMode> -**Parameters** +获取铃声模式,使用promise方式返回异步结果。 -None +**系统能力:** SystemCapability.Multimedia.Audio.Communication -**Return value** +**返回值:** -| Type | Description | -| :--------------- | :------------------------------------------- | -| Promise | Promise used to return the system alarm URI. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<[AudioRingMode](#audioringmode)> | Promise回调返回系统的铃声模式。 | -**Example** +**示例:** ``` -let alarmUri = await systemSoundManager.getSystemAlarmUri(null); -console.log('getSystemAlarmUri success: ' + alarmUri); +var audioManager = audio.getAudioManager(); +audioManager.getRingerMode().then((value) => + console.log('Promise returned to indicate that the ringer mode is obtained.' + value); +) ``` +### setAudioParameter -# RingtonePlayer +setAudioParameter(key: string, value: string, callback: AsyncCallback<void>): void -## ringtonePlayer.state +音频参数设置,使用callback方式返回异步结果。 -readonly state: AudioState 8+ +**系统能力:** SystemCapability.Multimedia.Audio.Core -Defines the current ringtone player state. +**参数:** -| Name | Type | Readable | Writable | Description | -| :---- | :--------- | :------- | :------- | :--------------------- | -| state | AudioState | Yes | No | Ringtone player state. | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 被设置的音频参数的键。 | +| value | string | 是 | 被设置的音频参数的值。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | -**Example** +**示例:** ``` -systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ +var audioManager = audio.getAudioManager(); +audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { if (err) { - console.err('getSystemRingtonePlayer failed'); - return; - } else { - console.log('getSystemRingtonePlayer success'); + console.error('Failed to set the audio parameter. ${err.message}'); + return; } -}); - -var state = ringtonePlayer.state; + console.log('Callback invoked to indicate a successful setting of the audio parameter.'); +}) ``` +### setAudioParameter + +setAudioParameter(key: string, value: string): Promise<void> -## ringtonePlayer.getTitle +音频参数设置,使用promise方式返回异步结果。 -getTitle(callback: AsyncCallback): void8+ +**系统能力:** SystemCapability.Multimedia.Audio.Core -Obtains the title of the ringtone. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :------------------------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the title of the ringtone. | -| | | | | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 被设置的音频参数的键。 | +| value | string | 是 | 被设置的音频参数的值。 | -**Return value** +**返回值:** -None +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | -**Example** +**示例:** ``` -systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ - if (err) { - console.err('getSystemRingtonePlayer failed'); - return; - } else { - console.log('getSystemRingtonePlayer success'); - } -}); +var audioManager = audio.getAudioManager(); +audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => + console.log('Promise returned to indicate a successful setting of the audio parameter.'); +) +``` + +### getAudioParameter -ringtonePlayer.getTitle((err, title)=>{ +getAudioParameter(key: string, callback: AsyncCallback<string>): void + +获取指定音频参数值,使用callback方式返回异步结果。 + +**系统能力:** SystemCapability.Multimedia.Audio.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待获取的音频参数的键。 | +| callback | AsyncCallback<string> | 是 | 回调返回获取的音频参数的值。 | + +**示例:** + +``` +var audioManager = audio.getAudioManager(); +audioManager.getAudioParameter('PBits per sample', (err, value) => { if (err) { - console.err('getTitle failed'); - } else { - console.log('getTitle success: ' + title); + console.error('Failed to obtain the value of the audio parameter. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); }) ``` +### getAudioParameter -## ringtonePlayer.getTitle +getAudioParameter(key: string): Promise<string> -getTitle(): Promise8+ +获取指定音频参数值,使用promise方式返回异步结果。 -Obtains the title of the ringtone. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Core -**Parameters** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待获取的音频参数的键。 | -**Return value** +**返回值:** -| Type | Description | -| :--------------- | :------------------------------------------------ | -| Promise | Promise used to return the title of the ringtone. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<string> | Promise回调返回获取的音频参数的值。 | -**Example** +**示例:** ``` -let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); -let title = await ringtonePlayer.getTitle(); +var audioManager = audio.getAudioManager(); +audioManager.getAudioParameter('PBits per sample').then((value) => + console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); +) ``` +### getDevices -## ringtonePlayer.getAudioRendererInfo - -getAudioRendererInfo(callback: AsyncCallback): void8+ - -Obtains the audio renderer information. This method uses an asynchronous callback to return the result. - -**Parameters** +getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void -| Name | Type | Mandatory | Description | -| :------- | :-------------------------------- | :-------- | :------------------------------------------------------ | -| callback | AsyncCallback | Yes | Callback used to return the audio renderer information. | -| | | | | +获取音频设备列表,使用callback方式返回异步结果。 -**Return value** +**系统能力:** SystemCapability.Multimedia.Audio.Device -None +**参数:** -**Example** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | +| callback | AsyncCallback<[AudioDeviceDescriptors](#audiodevicedescriptors)> | 是 | 回调,返回设备列表。 | +**示例:** ``` -systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ - if (err) { - console.err('getSystemRingtonePlayer failed'); - return; - } else { - console.log('getSystemRingtonePlayer success: '); - } -}); - -ringtonePlayer.getAudioRendererInfo((err, rendererInfo)=>{ - if (err) { - console.err('getAudioRendererInfo failed'); - } else { - console.log('getAudioRendererInfo success'); - } -}); +var audioManager = audio.getAudioManager(); +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ + if (err) { + console.error('Failed to obtain the device list. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the device list is obtained.'); +}) ``` +### getDevices -## ringtonePlayer.getAudioRendererInfo +(deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors> -getAudioRendererInfo(): Promise8+ +获取音频设备列表,使用promise方式返回异步结果。 -Obtains the audio renderer information. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Device -**Parameters** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | -**Return value** +**返回值:** -| Type | Description | -| :-------------------------- | :----------------------------------------------------- | -| Promise | Promise used to return the audio renderer information. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<[AudioDeviceDescriptors](#audiodevicedescriptors)> | Promise回调返回设备列表。 | -**Example** +**示例:** ``` -let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); -let rendererInfo = await ringtonePlayer.getAudioRendererInfo(); +var audioManager = audio.getAudioManager(); +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> + console.log('Promise returned to indicate that the device list is obtained.'); +) ``` +### setDeviceActive -## ringtonePlayer.configure - -configure(options: RingtoneOptions, callback: AsyncCallback): void8+ +setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback<void>): void -Configures ringtone options. This method uses an asynchronous callback to return the result. +设置设备激活状态,使用callback方式返回异步结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Audio.Device -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :---------------------------------- | -| options | RingtoneOptions | Yes | Ringtone options. | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**参数:** -**Return value** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| active | boolean | 是 | 设备激活状态。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | -None - -**Example** +**示例:** ``` -systemSoundManager.getSystemRingtonePlayer(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT, (err, ringtonePlayer)=>{ - if (err) { - console.err('getSystemRingtonePlayer failed'); - return; - } else { - console.log('getSystemRingtonePlayer success: '); - } -}); - -let ringtoneOptions = { - volume: 1, - loop: false -}; - -ringtonePlayer.configure(ringtoneOptions, (err)=> { +var audioManager = audio.getAudioManager(); +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { if (err) { - console.error('Failed to configure ringtone options'); - } else { - console.log('Callback invoked to indicate a successful ringtone options configuration.'); + console.error('Failed to set the active status of the device. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the device is set to the active status.'); }) ``` +### setDeviceActive -## ringtonePlayer.configure +setDeviceActive(deviceType: DeviceType, active: boolean): Promise<void> -configure(options: RingtoneOptions): Promise8+ +设置设备激活状态,使用promise方式返回异步结果。 -Configures ringtone options. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Device -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | -| :------ | :-------------- | :-------- | :---------------- | -| options | RingtoneOptions | Yes | Ringtone options. | -| | | | | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| active | boolean | 是 | 设备激活状态。 | -**Return value** +**返回值:** -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | -**Example** +**示例:** -``` -let ringtonePlayer = await systemSoundManager.getSystemRingtoneUri(null, audio.RingtoneType.RINGTONE_TYPE_DEFAULT); -let ringtoneOptions = { - volume: 1, - loop: false -}; -await ringtonePlayer.configure(ringtoneOptions); +``` +var audioManager = audio.getAudioManager(); +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> + console.log('Promise returned to indicate that the device is set to the active status.'); +) ``` +### isDeviceActive -## ringtonePlayer.start - -start(callback: AsyncCallback): void8+ - -Starts playing ringtone. This method uses a callback to return the result. +isDeviceActive(deviceType: DeviceType, callback: AsyncCallback<boolean>): void -**Parameters** +获取指定设备的激活状态,使用callback方式返回异步结果。 -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :---------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**系统能力:** SystemCapability.Multimedia.Audio.Device -**Return value** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回设备的激活状态。 | -**Example** +**示例:** ``` -ringtonePlayer.start((err)=> { +var audioManager = audio.getAudioManager(); +audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { if (err) { - console.error('Failed to start playing ringtone'); - } else { - console.log('Ringtone start playing successfully.'); + console.error('Failed to obtain the active status of the device. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the active status of the device is obtained.'); }) ``` -## ringtonePlayer.start +### isDeviceActive + +isDeviceActive(deviceType: DeviceType): Promise<boolean> -start(): Promise8+ +获取指定设备的激活状态,使用promise方式返回异步结果。 -Starts playing ringtone. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Device -**Parameters** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | -**Return value** +**返回值:** -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +| Type | Description | +| -------- | -------- | +| Promise<boolean> | Promise回调返回设备的激活状态。 | -**Example** +**示例:** ``` -await ringtonePlayer.start(); +var audioManager = audio.getAudioManager(); +audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => + console.log('Promise returned to indicate that the active status of the device is obtained.' + value); +) ``` +### setMicrophoneMute -## ringtonePlayer.stop - -stop(callback: AsyncCallback): void8+ +setMicrophoneMute(mute: boolean, callback: AsyncCallback<void>): void -Stops playing ringtone. This method uses a callback to return the result. +设置麦克风静音状态,使用callback方式返回异步结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Audio.Device -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :---------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**参数:** -**Return value** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | -None - -**Example** +**示例:** ``` -ringtonePlayer.stop((err)=> { +var audioManager = audio.getAudioManager(); +audioManager.setMicrophoneMute(true, (err) => { if (err) { - console.error('Failed to stop playing ringtone'); - } else { - console.log('Ringtone stop playing successfully.'); + console.error('Failed to mute the microphone. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the microphone is muted.'); }) ``` +### setMicrophoneMute -## ringtonePlayer.stop +setMicrophoneMute(mute: boolean): Promise<void> -stop(): Promise8+ +设置麦克风静音状态,使用promise方式返回异步结果。 -Stops playing ringtone. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Device -**Parameters** +**参数:** -None +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | -**Return value** +**返回值:** -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | -**Example** +**示例:** ``` -await ringtonePlayer.stop(); +var audioManager = audio.getAudioManager(); +audioManager.setMicrophoneMute(true).then(() => + console.log('Promise returned to indicate that the microphone is muted.'); +) ``` +### isMicrophoneMute -## ringtonePlayer.release - -release(callback: AsyncCallback): void8+ +isMicrophoneMute(callback: AsyncCallback<boolean>): void -Releases ringtone player resources. This method uses a callback to return the result. +获取麦克风静音状态,使用callback方式返回异步结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Audio.Device -| Name | Type | Mandatory | Description | -| :------- | :------------------- | :-------- | :---------------------------------- | -| callback | AsyncCallback | Yes | Callback used to return the result. | -| | | | | +**参数:** -**Return value** +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<boolean> | 是 | 回调返回系统麦克风静音状态,true为静音,false为非静音。 | -None - -**Example** +**示例:** ``` -ringtonePlayer.release((err)=> { +var audioManager = audio.getAudioManager(); +audioManager.isMicrophoneMute((err, value) => { if (err) { - console.error('Failed to release ringtone player resource'); - } else { - console.log('Release ringtone player resource successfully.'); + console.error('Failed to obtain the mute status of the microphone. ${err.message}'); + return; } + console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); }) ``` +### isMicrophoneMute -## ringtonePlayer.release +isMicrophoneMute(): Promise<boolean> -release(): Promise8+ +获取麦克风静音状态,使用promise方式返回异步结果。 -Releases ringtone player resource. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Audio.Device -**Parameters** +**返回值:** -None - -**Return value** +| 类型 | 说明 | +| -------- | -------- | +| Promise<boolean> | Promise回调返回系统麦克风静音状态,true为静音,false为非静音。 | -| Type | Description | -| :------------- | :--------------------------------- | -| Promise | Promise used to return the result. | +**示例:** -**Example** ``` -await ringtonePlayer.release(); +var audioManager = audio.getAudioManager(); +audioManager.isMicrophoneMute().then((value) => + console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); +) ``` ## AudioDeviceDescriptor -Describes an audio device. +描述音频设备。 -| Name | Type | Readable | Writable | Description | +| 名称 | 参数型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| deviceRole | [DeviceRole](#devicerole) | Yes | No | Device role.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | -| deviceType | [DeviceType](#devicetype) | Yes | No | Device type.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | +| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。
**系统能力:** SystemCapability.Multimedia.Audio.Device | ## AudioDeviceDescriptors -| Name | Description | +| 名称 | 描述 | | -------- | -------- | -| AudioDeviceDescriptors | Array of **AudioDeviceDescriptor** objects. It is read-only.
**System capabilities:** SystemCapability.Multimedia.Audio.Device | \ No newline at end of file +| 设备属性数组 | AudioDeviceDescriptor的数组,只读。
**系统能力:** SystemCapability.Multimedia.Audio.Device | diff --git a/zh-cn/application-dev/reference/apis/js-apis-camera.md b/zh-cn/application-dev/reference/apis/js-apis-camera.md index c076a882942..ed5e53a56ef 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-camera.md +++ b/zh-cn/application-dev/reference/apis/js-apis-camera.md @@ -1,42 +1,34 @@ -# Camera +# 相机管理 -> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** -> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> **说明:** +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -## Modules to Import +## 导入模块 ``` import camera from '@ohos.multimedia.camera'; ``` -## Required Permissions +## 权限 -``` ohos.permission.CAMERA -``` -## getCameraManager(context: Context, callback: AsyncCallback): void; -**System Capabilities:** +## camera.getCameraManager -SystemCapability.Multimedia.Camera.Core +getCameraManager(context: Context, callback: AsyncCallback): void -**Description** +获取相机管理器实例,通过注册回调函数获取结果。 -Gets a **CameraManager** instance. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|-------------------------------|-----------|-----------------------------------------------------| -| context | Context | Yes | Application context | -| callback | AsyncCallback | Yes | Callback used to return the CameraManager instance | - - -**Return values** - -none +| context | Context | 是 | 应用上下文。 | +| callback | AsyncCallback<[CameraManager](#cameramanager)\> | 是 | 回调函数,用于获取相机管理器实例。 | -**Example** +**示例:** ``` camera.getCameraManager(context, (err, cameraManager) => { @@ -48,29 +40,27 @@ camera.getCameraManager(context, (err, cameraManager) => { }); ``` -## getCameraManager(context: Context): Promise; +## camera.getCameraManager -**System Capabilities:** +getCameraManager(context: Context): Promise -SystemCapability.Multimedia.Camera.Core +获取相机管理器实例,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets a **CameraManager** instance. This method uses a promise to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------| -| context | Context | Yes | Application context | +| context | Context | 是 | 应用上下文。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-------------------------|--------------------------------------------------------| -| Promise | Promise used to return the **CameraManager** instance | +| Promise<[CameraManager](#cameramanager)\> | 使用Promise的方式获取一个相机管理器实例。 | -**Example** +**示例:** ``` camera.getCameraManager(context).then((cameraManger) => { @@ -78,89 +68,83 @@ camera.getCameraManager(context).then((cameraManger) => { }) ``` -## CameraStatus +## CameraStatus -Enumerates camera status types. +枚举,相机状态。 -| Name | Default Value | Description | +| 名称 | 默认值 | 说明 | |---------------------------|---------------|--------------------| -| CAMERA_STATUS_APPEAR | 0 | Camera appear
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_DISAPPEAR | 1 | Camera disappear
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_AVAILABLE | 2 | Camera available
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_STATUS_UNAVAILABLE | 3 | Camera unavailable
System Capabilities: SystemCapability.Multimedia.Camera.Core| +| CAMERA_STATUS_APPEAR | 0 | 相机存在。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_DISAPPEAR | 1 | 相机不存在。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_AVAILABLE | 2 | 相机就绪。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_STATUS_UNAVAILABLE | 3 | 相机未就绪。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraPosition +## CameraPosition -Enumerates the camera positions. +枚举,相机方向。 -| Name | Default value | Description | +| 名称 | 默认值 | 说明 | |-----------------------------|---------------|-----------------------| -| CAMERA_POSITION_UNSPECIFIED | 0 | Unspecified position
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_POSITION_BACK | 1 | Rear camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_POSITION_FRONT | 2 | Front camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_UNSPECIFIED | 0 | 未指定方向相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_BACK | 1 | 后置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_POSITION_FRONT | 2 | 前置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraType +## CameraType -Enumerates the camera types. +枚举,相机类型。 -| Name | Default value | Description | +| 名称 | 默认值 | 说明 | |-------------------------|---------------|-------------------------| -| CAMERA_TYPE_UNSPECIFIED | 0 | Unspecified camera type
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_WIDE_ANGLE | 1 | Wide camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_ULTRA_WIDE | 2 | Ultra wide camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_TELEPHOTO | 3 | Telephoto camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_TYPE_TRUE_DEPTH | 4 | True depth camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_UNSPECIFIED | 0 | 未指定相机类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_WIDE_ANGLE | 1 | 广角相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_ULTRA_WIDE | 2 | 超级广角相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_TELEPHOTO | 3 | 长焦相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_TYPE_TRUE_DEPTH | 4 | 深度相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## ConnectionType +## ConnectionType -Enumerates camera connection types. +枚举,相机连接类型。 -| Name | Default value | Description | +| 名称 | 默认值 | 说明 | |------------------------------|---------------|----------------------------| -| CAMERA_CONNECTION_BUILT_IN | 0 | Built-in camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_CONNECTION_USB_PLUGIN | 1 | Camera connected using USB
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_CONNECTION_REMOTE | 2 | Remote camera
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_BUILT_IN | 0 | 内置相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_USB_PLUGIN | 1 | 外置USB相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_CONNECTION_REMOTE | 2 | 分布式相机。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraFormat +## CameraFormat -Enumerates the camera formats. +枚举,照片格式。 -| Name | Default value | Description | +| 名称 | 默认值 | 说明 | |----------------------------|---------------|---------------------| -| CAMERA_FORMAT_YCRCb_420_SP | 1003 | Camera YCRCb
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_JPEG | 2000 | Camera format jpeg
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_AVC | 3000 | Camera format avc
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| CAMERA_FORMAT_HEVC | 3001 | Camera format hevc
System Capabilities: SystemCapability.Multimedia.Camera.Core | - +| CAMERA_FORMAT_YCRCb_420_SP | 1003 | YCRCb格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_JPEG | 2000 | JPEG格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_AVC | 3000 | AVC格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| CAMERA_FORMAT_HEVC | 3001 | HEVC格式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraManager -Implements camera management, including getting supported cameras and creating **CameraInput** instances. +## CameraManager -### getCameras(callback: AsyncCallback\>): void; +相机管理器类,使用前需要通过getCameraManager获取相机管理实例。 -**System Capabilities:** +### getCameras -SystemCapability.Multimedia.Camera.Core +getCameras(callback: AsyncCallback\>): void -**Description** +异步获取设备支持的相机列表,通过注册回调函数获取结果。 -Gets all cameras supported by the device. This method uses an asynchronous callback to return the array of supported cameras. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------|-----------|---------------------------------------------------------| -| callback | AsyncCallback\> | Yes | Callback used to return the array of supported cameras. | - -**Return values** - -none +| callback | AsyncCallback\> | 是 | 使用callback方式获取支持的相机列表。 | -**Example** +**示例:** ``` cameraManager.getCameras((err, cameras) => { @@ -172,28 +156,22 @@ cameraManager.getCameras((err, cameras) => { }) ``` -### getCameras(): Promise\>; +### getCameras -**System Capabilities:** +getCameras(): Promise\> -SystemCapability.Multimedia.Camera.Core +异步获取设备支持的相机列表,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets all cameras supported by the device. This method uses a promise to return the array of supported cameras. +**返回值:** -**Parameters** - -none - -**Return values** - -| Type | Description | +| 类型 | 说明 | |------------------------|--------------------------------------------------------| -| Promise\> | Promise used to return an array of supported cameras | +| Promise\> | 使用promise获取支持相机列表。 | -**Example** +**示例:** ``` cameraManager.getCameras().then((cameraArray) => { @@ -201,28 +179,22 @@ cameraManager.getCameras().then((cameraArray) => { }) ``` -### createCameraInput(cameraId: string, callback: AsyncCallback): void; +### createCameraInput -**System Capabilities:** +createCameraInput(cameraId: string, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +使用相机ID异步创建CameraInput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Creates a **CameraInput** instance with the specified camera ID. This method uses an asynchronous callback to return the instance. +**参数:** -**Parameters** - -| Name | Default value | Mandatory | Description | +| 名称 | 默认值 | 必填 | 说明 | |----------|------------------------------|-----------|--------------------------------------------------| -| cameraId | string | Yes | Camera ID used to create the instance | -| callback | AsyncCallback | Yes | Callback used to return the CameraInput instance | - -**Return values** +| cameraId | string | 是 | 指定相机ID。 | +| callback | AsyncCallback<[CameraInput](#camerainput)\> | 是 | 回调函数,用于获取CameraInput实例。 | -none - -**Example** +**示例:** ``` cameraManager.createCameraInput(cameraId, (err, cameraInput) => { @@ -234,29 +206,27 @@ cameraManager.createCameraInput(cameraId, (err, cameraInput) => { }) ``` -### createCameraInput(cameraId: string): Promise; - -**System Capabilities:** +### createCameraInput -SystemCapability.Multimedia.Camera.Core +createCameraInput(cameraId: string): Promise -**Description** +使用相机ID异步创建CameraInput实例,通过Promise获取结果。 -Creates a **CameraInput** instance with the specified camera ID. This method uses a promise to return the instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Default value | Mandatory | Description | +| 名称 | 默认值 | 必填 | 说明 | |----------|-----------------------------|-----------|------------------------------------------| -| cameraId | string | Yes | Camera ID used to create the instance | +| cameraId | string | 是 | 指定相机ID。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-------------------------|-------------------------------------------------| -| Promise | Promise used to return the CameraInput instance | +| Promise<[CameraInput](#camerainput)\> | 使用Promise的方式获取CameraInput的实例。 | -**Example** +**示例:** ``` cameraManager.createCameraInput(cameraId).then((cameraInput) => { @@ -264,29 +234,23 @@ cameraManager.createCameraInput(cameraId).then((cameraInput) => { }) ``` -### createCameraInput(position: CameraPosition, type: CameraType, callback: AsyncCallback): void; +### createCameraInput -**System Capabilities:** +createCameraInput(position: CameraPosition, type: CameraType, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +使用相机位置和相机类型异步创建CameraInput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Creates a **CameraInput** instance with the specified camera position and camera type. This method uses an asynchronous callback to return the instance. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------------|----------------------------|-----------|---------------------------------------------------| -| cameraPosition | CameraPosition | Yes | Camera position | -| cameraType | CameraType | Yes | Camera type | -| callback | AsyncCallback | Yes | Callback used to return the CameraInput instance | - -**Return values** +| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。 | +| cameraType | [CameraType](#cameratype) | 是 | 相机类型。 | +| callback | AsyncCallback<[CameraInput](#camerainput)\> | 是 | 回调函数,用于获取CameraInput实例。 | -none - -**Example** +**示例:** ``` cameraManager.createCameraInput(cameraPosition, cameraType, (err, cameraInput) => { @@ -298,30 +262,28 @@ cameraManager.createCameraInput(cameraPosition, cameraType, (err, cameraInput) = }) ``` -### createCameraInput(position: CameraPosition, type: CameraType): Promise; - -**System Capabilities:** +### createCameraInput -SystemCapability.Multimedia.Camera.Core +createCameraInput(position: CameraPosition, type: CameraType): Promise -**Description** +使用相机位置和相机类型异步创建CameraInput实例,通过Promise获取结果。 -Creates a **CameraInput** instance with the specified camera position and camera type. This method uses a promise to return the instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------------|----------------------------|-----------|----------------------------------------| -| cameraPosition | CameraPosition | Yes | Camera position | -| cameraType | CameraType | Yes | Camera type | +| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。 | +| cameraType | [CameraType](#cameratype) | 是 | 相机类型。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-------------------------|-------------------------------------------------| -| Promise | Promise used to return the CameraInput instance | +| Promise<[CameraInput](#camerainput)\> | 使用Promise的方式获取CameraInput的实例。 | -**Example** +**示例:** ``` cameraManager.createCameraInput(cameraPosition, cameraType).then((cameraInput) => { @@ -329,28 +291,22 @@ cameraManager.createCameraInput(cameraPosition, cameraType).then((cameraInput) = }) ``` -### on(type: 'cameraStatus', callback: Callback): void; - -**System Capabilities:** +### on('cameraStatus') -SystemCapability.Multimedia.Camera.Core +on(type: 'cameraStatus', callback: AsyncCallback): void -**Description** +监听相机的状态变化,通过注册回调函数获取相机的状态变化。 -Listens for camera status changes. This method uses a callback to get camera status changes. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :--------------------------------------------------- | -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the camera status change. | - -**Return value** - -None +| type | string | 是 | 监听事件。 | +| callback | AsyncCallback<[CameraStatusInfo](#camerastatusinfo)\> | 是 | 回调函数,用于获取相机状态变化信息。 | -**Example** +**示例:** ``` cameraManager.on('cameraStatus', (cameraStatusInfo) => { @@ -359,18 +315,18 @@ cameraManager.on('cameraStatus', (cameraStatusInfo) => { }) ``` -## Camera +## Camera -Camera class. +相机实例。 -**Fields** - -| Name | Type | Access | Description | +| 名称 | 类型 | 只读 | 说明 | |----------------|----------------|----------|------------------------| -| cameraId | string | readonly | Camera ID
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| cameraPosition | cameraPosition | readonly | Camera position
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| cameraType | cameraType | readonly | Camera type
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| connectionType | connectionType | readonly | Camera connection type
System Capabilities: SystemCapability.Multimedia.Camera.Core| +| cameraId | string | 是 | 相机ID。
**系统能力:** SystemCapability.Multimedia.Camera.Core| +| cameraPosition | [CameraPosition](#cameraposition) | 是 | 相机位置。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| cameraType | [CameraType](#cameratype) | 是 | 相机类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| connectionType | [ConnectionType](#connectiontype) | 是 | 相机连接类型。
**系统能力:** SystemCapability.Multimedia.Camera.Core | + +**示例:** ``` var cameraManager = await camera.getCameraManager(); @@ -383,41 +339,35 @@ var cameraId = cameraObj.connectionType; ``` -## CameraStatusInfo +## CameraStatusInfo -CameraStatusInfo class. +相机状态信息。 -**Fields** - -| Name | Type | Description | +| 名称 | 类型 | 说明 | |----------------|----------------|------------------| -| camera | Camera | Camera object
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| status | CameraStatus | Camera status
System Capabilities: SystemCapability.Multimedia.Camera.Core | - +| camera | [Camera](#camera) | 相机信息。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| status | [CameraStatus](#camerastatus) | 相机状态。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## CameraInput -Implements a **CameraInput** instance. +## CameraInput -### getCameraId(callback: AsyncCallback\): void; +相机输入类。在使用该类的方法前,需要先构建一个CameraInput实例。 -**System Capabilities:** +### getCameraId -SystemCapability.Multimedia.Camera.Core +getCameraId(callback: AsyncCallback\): void -**Description** +异步获取该CameraInput实例的相机ID,通过注册回调函数获取结果。 -Gets the camera ID based on which this **CameraInput** instance is created. This method uses an asynchronous callback to return the camera ID. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|------------------------|-----------|---------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the camera ID | +| callback | AsyncCallback | 是 | 回调函数,用于获取相机ID。 | -**Return values** - -none +**示例:** ``` cameraInput.getCameraId((err, cameraId) => { @@ -429,27 +379,21 @@ cameraInput.getCameraId((err, cameraId) => { }) ``` -### getCameraId(): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core - -**Description** +### getCameraId -Gets the camera ID based on which this **CameraInput** instance is created. This method uses a promise to return the camera ID. +getCameraId(): Promise -**Parameters** +异步获取该CameraInput实例的相机ID,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |------------------------|--------------------------------------| -| Promise | Promise used to return the camera ID | +| Promise | 使用Promise的方式获取相机ID。 | -**Example** +**示例:** ``` cameraInput.getCameraId().then((cameraId) => { @@ -457,29 +401,22 @@ cameraInput.getCameraId().then((cameraId) => { }) ``` -### getSupportedSizes\(format: CameraFormat, callback: AsyncCallback\>\): void; +### getSupportedSizes -**System Capabilities:** +getSupportedSizes\(format: CameraFormat, callback: AsyncCallback\>\): void -SystemCapability.Multimedia.Camera.Core +根据指定格式,获取相机支持的分辨率,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets supported sizes for a given format. This method uses an asynchronous callback to return the supported sizes. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|------------------------------|-----------|---------------------------------------------| -| format | CameraFormat | Yes | Camera format used to get supported sizes | -| callback | AsyncCallback\> | Yes | Callback used to return the supported sizes | - - -**Return values** - -none +| format | [CameraFormat](#cameraformat) | 是 | 指定照片格式。 | +| callback | AsyncCallback\> | 是 | 回调函数,用于获取相机支持分辨率。 | -**Example** +**示例:** ``` cameraInput.getSupportedSizes(format, (err, sizes) => { @@ -491,29 +428,27 @@ cameraInput.getSupportedSizes(format, (err, sizes) => { }) ``` -### getSupportedSizes\(format: CameraFormat\): Promise\>; +### getSupportedSizes -**System Capabilities:** +getSupportedSizes\(format: CameraFormat\): Promise\> -SystemCapability.Multimedia.Camera.Core +根据指定格式,获取相机支持的分辨率,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets supported sizes for a given format. This method uses a promise to return the supported sizes. +**参数:** -**Parameters** +| 名称 | 类型 | 必填 | 说明 | +| ------ | ----------------------------- | ---- | -------------- | +| format | [CameraFormat](#cameraformat) | 是 | 指定照片格式。 | -| Name | Type | Mandatory | Description | -|----------|----------------------------|-----------|-----------------------------------------------| -| format | CameraFormat | Yes | Camera format used to get the supported sizes | +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |------------------------|---------------------------------------------| -| Promise\> | Promise used to return the supported sizes. | +| Promise\> | 使用Promise的方式获取相机支持的分辨率。 | -**Example** +**示例:** ``` cameraInput.getSupportedSizes(format).then((sizes) => { @@ -521,28 +456,21 @@ cameraInput.getSupportedSizes(format).then((sizes) => { }) ``` -### getSupportedPreviewFormats\(callback: AsyncCallback\>\): void; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core - -**Description** - -Gets supported formats for preview. This method uses an asynchronous callback to return the supported formats. +### getSupportedPreviewFormats -**Parameters** +getSupportedPreviewFormats\(callback: AsyncCallback\>\): void -| Name | Type | Mandatory | Description | -|----------|--------------------------------------|-----------|---------------------------------------------------| -| callback | AsyncCallback\> | Yes | Callback used to return the supported preview formats. | +获取相机预览图片的支持格式,通过注册回调函数获取结果。 +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return values** +**参数:** -none +| 名称 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------- | ---- | -------------------------------------- | +| callback | AsyncCallback\> | 是 | 回调函数,用于获取预览图片的支持格式。 | -**Example** +**示例:** ``` cameraInput.getSupportedPreviewFormats((err, previewFormats) => { @@ -554,27 +482,21 @@ cameraInput.getSupportedPreviewFormats((err, previewFormats) => { }) ``` -### getSupportedPreviewFormats\(\): Promise\>; +### getSupportedPreviewFormats -**System Capabilities:** +getSupportedPreviewFormats\(\): Promise\> -SystemCapability.Multimedia.Camera.Core +获取相机预览图片的支持格式,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets supported formats for preview. This method uses a promise to return the supported formats. +**返回值:** -**Parameters** - -none - -**Return values** - -| Type | Description | +| 类型 | 说明 | |--------------------------------|-------------------------------------------------------| -| Promise\> | Promise used to return the supported preview formats | +| Promise\> | 使用Promise的方式获取预览图片的支持格式。 | -**Example** +**示例:** ``` cameraInput.getSupportedPreviewFormats().then((previewFormats) => { @@ -582,27 +504,21 @@ cameraInput.getSupportedPreviewFormats().then((previewFormats) => { }) ``` -### getSupportedPhotoFormats\(callback: AsyncCallback\>\): void; - -**System Capabilities:** +### getSupportedPhotoFormats -SystemCapability.Multimedia.Camera.Core +getSupportedPhotoFormats\(callback: AsyncCallback\>\): void -**Description** +获取照片的支持格式,通过注册回调函数获取结果。 -Gets supported formats for photographing. This method uses an asynchronous callback to return the supported formats. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | Yes | Callback used to return the supported photo formats. | +| callback | AsyncCallback\> | 是 | 回调函数,用于获取支持的照片格式。 | -**Return values** - -none - -**Example** +**示例:** ``` cameraInput.getSupportedPhotoFormats((err, photoFormats) => { @@ -614,27 +530,21 @@ cameraInput.getSupportedPhotoFormats((err, photoFormats) => { }) ``` -### getSupportedPhotoFormats\(\): Promise\>; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core +### getSupportedPhotoFormats -**Description** +getSupportedPhotoFormats\(\): Promise\> -Gets supported formats for photographing. This method uses a promise to return the supported formats. +获取照片的支持格式,通过Promise获取结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Camera.Core -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |--------------------------------|---------------------------------------------------| -| Promise\> | Promise used to return supported photo formats. | +| Promise\> | 使用Promise的方式获取支持的照片格式。 | -**Example** +**示例:** ``` cameraInput.getSupportedPhotoFormats().then((photoFormats) => { @@ -642,27 +552,21 @@ cameraInput.getSupportedPhotoFormats().then((photoFormats) => { }) ``` -### getSupportedVideoFormats\(callback: AsyncCallback\>\): void; - -**System Capabilities:** +### getSupportedVideoFormats -SystemCapability.Multimedia.Camera.Core +getSupportedVideoFormats\(callback: AsyncCallback\>\): void -**Description** +获取录制视频的支持格式,通过注册回调函数获取结果。 -Gets supported formats for video recording. This method uses an asynchronous callback to return the supported video formats. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | Yes | Callback used to return the supported video formats. | - -**Return values** - -none +| callback | AsyncCallback\> | 是 | 回调函数,用于获取支持的视频格式。 | -**Example** +**示例:** ``` cameraInput.getSupportedVideoFormats((err, videoFormats) => { @@ -674,27 +578,21 @@ cameraInput.getSupportedVideoFormats((err, videoFormats) => { }) ``` -### getSupportedVideoFormats\(\): Promise\>; +### getSupportedVideoFormats -**System Capabilities:** +getSupportedVideoFormats\(\): Promise\> -SystemCapability.Multimedia.Camera.Core +获取录制视频的支持格式,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets supported formats for video recording. This method uses a promise to return the supported video format. +**返回值:** -**Parameters** - -none - -**Return values** - -| Type | Description | +| 类型 | 说明 | |--------------------------------|---------------------------------------------------| -| Promise\> | Promise used to return supported video formats. | +| Promise\> | 使用Promise的方式获取支持的视频格式。 | -**Example** +**示例:** ``` cameraInput.getSupportedVideoFormats().then((videoFormats) => { @@ -702,27 +600,21 @@ cameraInput.getSupportedVideoFormats().then((videoFormats) => { }) ``` -### hasFlash(callback: AsyncCallback): void; +### hasFlash -**System Capabilities:** +hasFlash(callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +判断设备是否支持闪光灯,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Checks whether the device has flash light. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|-------------------------|-----------|----------------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the flash light support status | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,返回true表示设备支持闪光灯。 | -none - -**Example** +**示例:** ``` cameraInput.hasFlash((err, status) => { @@ -734,27 +626,21 @@ cameraInput.hasFlash((err, status) => { }) ``` -### hasFlash(): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core - -**Description** +### hasFlash -Checks whether the device has flash light. This method uses a promise to return the result. +hasFlash(): Promise -**Parameters** +判断设备是否支持闪光灯,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-----------------------|--------------------------------------------------------| -| Promise | Promise used to return the flash light support status | +| Promise | 使用Promise的方式获取结果,返回true表示设备支持闪光灯。 | -**Example** +**示例:** ``` cameraInput.hasFlash().then((status) => { @@ -762,28 +648,22 @@ cameraInput.hasFlash().then((status) => { }) ``` -### isFlashModeSupported(flashMode: FlashMode, callback: AsyncCallback): void; +### isFlashModeSupported -**System Capabilities:** +isFlashModeSupported(flashMode: FlashMode, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +判断设备是否支持指定闪光灯模式,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Checks whether a specified flash mode is supported. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | Flash mode | -| callback | AsyncCallback | Yes | Callback used to return the device flash support status | - -**Return values** +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | +| callback | AsyncCallback | 是 | 回调函数,返回true表示支持该闪光灯模式。 | -none - -**Example** +**示例:** ``` cameraInput.isFlashModeSupported(flashMode, (err, status) => { @@ -795,29 +675,27 @@ cameraInput.isFlashModeSupported(flashMode, (err, status) => { }) ``` -### isFlashModeSupported(flashMode: FlashMode): Promise; - -**System Capabilities:** +### isFlashModeSupported -SystemCapability.Multimedia.Camera.Core +isFlashModeSupported(flashMode: FlashMode): Promise -**Description** +判断设备是否支持指定闪光灯模式,通过Promise获取结果。 -Checks whether a specified flash mode is supported. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | Flash mode | +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-----------------------|---------------------------------------------------| -| Promise | Promise used to return flash mode support status. | +| Promise | 使用Promise的方式获取结果,返回true表示设备支持该闪光灯模式。 | -**Example** +**示例:** ``` cameraInput.isFlashModeSupported(flashMode).then((status) => { @@ -825,30 +703,27 @@ cameraInput.isFlashModeSupported(flashMode).then((status) => { }) ``` -### setFlashMode(flashMode: FlashMode, callback: AsyncCallback): void; +### setFlashMode -**System Capabilities:** +setFlashMode(flashMode: FlashMode, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +设置闪光灯模式,通过注册回调函数获取结果。 -**Description** +进行设置之前,需要先检查: -Sets flash mode. This method uses an asynchronous callback to return the result. +1. 设备是否支持闪光灯,可使用方法[hasFlash](#hasflash)。 +2. 设备是否支持指定的闪光灯模式,可使用方法[isFlashModeSupported](#isflashmodesupported)。 -Note: Before setting the flash mode, check the support for the flash light (hasFlash method) and flash mode support (isFlashModeSupported method); +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | Flash mode | -| callback | AsyncCallback | Yes | Callback used to return the result | +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return values** - -none - -**Example** +**示例:** ``` cameraInput.setFlashMode(flashMode, (err) => { @@ -860,31 +735,32 @@ cameraInput.setFlashMode(flashMode, (err) => { }) ``` -### setFlashMode(flashMode: FlashMode): Promise; +### setFlashMode -**System Capabilities:** +setFlashMode(flashMode: FlashMode): Promise -SystemCapability.Multimedia.Camera.Core +设置闪光灯模式,通过Promise获取结果。 -**Description** +进行设置之前,需要先检查: -Sets flash mode. This method uses a promise to return the result. +1. 设备是否支持闪光灯,可使用方法[hasFlash](#hasflash)。 +2. 设备是否支持指定的闪光灯模式,可使用方法[isFlashModeSupported](#isflashmodesupported)。 -Note: Before setting the flash mode, check the support for the flash light (hasFlash method) and flash mode support (isFlashModeSupported method); +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| flashMode | FlashMode | Yes | Flash mode | +| flashMode | [FlashMode](#flashmode) | 是 | 指定闪光灯模式。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-----------------------|-----------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` cameraInput.setFlashMode(flashMode).then() => { @@ -892,27 +768,21 @@ cameraInput.setFlashMode(flashMode).then() => { }) ``` -### getFlashMode(callback: AsyncCallback): void; +### getFlashMode -**System Capabilities:** +getFlashMode(callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +获取当前设备的闪光灯模式,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets current flash mode. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|---------------------------|-----------|------------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the current flash mode | - -**Return values** +| callback | AsyncCallback<[FlashMode](#flashmode)\> | 是 | 回调函数,用于获取当前设备的闪光灯模式。 | -none - -**Example** +**示例:** ``` cameraInput.getFlashMode((err, flashMode) => { @@ -924,27 +794,21 @@ cameraInput.getFlashMode((err, flashMode) => { }) ``` -### getFlashMode(): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core +### getFlashMode -**Description** +getFlashMode(): Promise -Gets current flash mode. This method uses a promise to return the result. +获取当前设备的闪光灯模式,通过Promise获取结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Camera.Core -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |-----------------------|---------------------------------------------------| -| Promise | Promise used to return the flash mode | +| Promise<[FlashMode](#flashmode)\> | 使用Promise的方式获取当前的闪光灯模式。 | -**Example** +**示例:** ``` cameraInput.getFlashMode().then(flashMode) => { @@ -952,28 +816,22 @@ cameraInput.getFlashMode().then(flashMode) => { }) ``` -### isFocusModeSupported(afMode: FocusMode, callback: AsyncCallback): void; - -**System Capabilities:** +### isFocusModeSupported -SystemCapability.Multimedia.Camera.Core +isFocusModeSupported(afMode: FocusMode, callback: AsyncCallback): void -**Description** +判断设备是否支持指定的焦距模式,通过注册回调函数获取结果。 -Checks whether a specified focus mode is supported. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|----------------------------------------------------| -| afMode | FocusMode | Yes | Focus mode | -| callback | AsyncCallback | Yes | Callback used to return the device focus support status | +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | +| callback | AsyncCallback | 是 | 回调函数,返回true表示支持该焦距模式。 | -**Return values** - -none - -**Example** +**示例:** ``` cameraInput.isFocusModeSupported(afMode, (err, status) => { @@ -985,29 +843,27 @@ cameraInput.isFocusModeSupported(afMode, (err, status) => { }) ``` -### isFocusModeSupported(afMode: FocusMode): Promise; +### isFocusModeSupported -**System Capabilities:** +isFocusModeSupported(afMode: FocusMode): Promise -SystemCapability.Multimedia.Camera.Core +判断设备是否支持指定的焦距模式,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Checks whether a specified focus mode is supported. This method uses a promise to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|----------------------------------------|-----------|-------------| -| afMode | FocusMode | Yes | Focus mode | +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-----------------------|---------------------------------------------------| -| Promise | Promise used to return the focus mode support status. | +| Promise | 使用Promise的方式获取结果,返回true表示设备支持该焦距模式。 | -**Example** +**示例:** ``` cameraInput.isFocusModeSupported(afMode).then((status) => { @@ -1015,30 +871,24 @@ cameraInput.isFocusModeSupported(afMode).then((status) => { }) ``` -### setFocusMode(afMode: FocusMode, callback: AsyncCallback): void; - -**System Capabilities:** +### setFocusMode -SystemCapability.Multimedia.Camera.Core +setFocusMode(afMode: FocusMode, callback: AsyncCallback): void -**Description** +设置焦距模式,通过注册回调函数获取结果。 -Sets focus mode. This method uses an asynchronous callback to return the result. +进行设置之前,需要先检查设备是否支持指定的焦距模式,可使用方法[isFocusModeSupported](#isfocusmodesupported)。 -Note: Before setting the focus mode, check focus mode support (isFocusModeSupported method); +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|------------------------------------| -| afMode | FocusMode | Yes | Focus mode | -| callback | AsyncCallback | Yes | Callback used to return the result | +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return values** - -none - -**Example** +**示例:** ``` cameraInput.setFocusMode(afMode, (err) => { @@ -1050,31 +900,29 @@ cameraInput.setFocusMode(afMode, (err) => { }) ``` -### setFocusMode(afMode: FocusMode): Promise; +### setFocusMode -**System Capabilities:** +setFocusMode(afMode: FocusMode): Promise -SystemCapability.Multimedia.Camera.Core +设置焦距模式,通过Promise获取结果。 -**Description** +进行设置之前,需要先检查设备是否支持指定的焦距模式,可使用方法[isFocusModeSupported](#isfocusmodesupported)。 -Sets focus mode. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -Note: Before setting the focus mode, check focus mode support (isFocusModeSupported method); +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|-----------------------------------------|-----------|-------------| -| afMode | FocusMode | Yes | Focus mode | +| afMode | [FocusMode](#focusmode) | 是 | 指定的焦距模式。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-----------------------|-----------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` cameraInput.setFocusMode(afMode).then() => { @@ -1082,27 +930,21 @@ cameraInput.setFocusMode(afMode).then() => { }) ``` -### getFocusMode(callback: AsyncCallback): void; - -**System Capabilities:** +### getFocusMode -SystemCapability.Multimedia.Camera.Core +getFocusMode(callback: AsyncCallback): void -**Description** +获取当前设备的焦距模式,通过注册回调函数获取结果。 -Gets the current focus mode. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|---------------------------|-----------|------------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the current focus mode | +| callback | AsyncCallback<[FocusMode](#focusmode)\> | 是 | 回调函数,用于获取当前设备的焦距模式。 | -**Return values** - -none - -**Example** +**示例:** ``` cameraInput.getFocusMode((err, afMode) => { @@ -1114,27 +956,21 @@ cameraInput.getFocusMode((err, afMode) => { }) ``` -### getFocusMode(): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core +### getFocusMode -**Description** +getFocusMode(): Promise -Gets the current focus mode. This method uses a promise to return the result. +获取当前设备的焦距模式,通过Promise获取结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Camera.Core -none +**返回值:** -**Return values** +| 类型 | 说明 | +| ------------------- | ------------------------------------- | +| Promise | 使用Promise的方式获取当前的焦距模式。 | -| Type | Description | -|-----------------------|---------------------------------------------------| -| Promise | Promise used to return the focus mode | - -**Example** +**示例:** ``` cameraInput.getFocusMode().then(afMode) => { @@ -1142,28 +978,21 @@ cameraInput.getFocusMode().then(afMode) => { }) ``` -### getZoomRatioRange\(callback: AsyncCallback\>\): void; - -**System Capabilities:** +### getZoomRatioRange -SystemCapability.Multimedia.Camera.Core +getZoomRatioRange\(callback: AsyncCallback\>\): void -**Description** +获取可变焦距比范围,通过注册回调函数获取结果。 -Gets the zoom ratios of all zoom values. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|--------------------------------|-----------|-------------------------------------------------| -| callback | AsyncCallback\> | Yes | Callback used to return the zoom ratio range | - - -**Return values** +| callback | AsyncCallback\> | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` cameraInput.getZoomRatioRange(err, zoomRatioRange) => { @@ -1175,27 +1004,21 @@ cameraInput.getZoomRatioRange(err, zoomRatioRange) => { }) ``` -### getZoomRatioRange\(\): Promise\>; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core - -**Description** +### getZoomRatioRange -Gets the zoom ratios of all zoom values. This method uses a promise to return the result. +getZoomRatioRange\(\): Promise\> -**Parameters** +获取可变焦距比范围,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |------------------------|---------------------------------------------| -| Promise\> | Promise used to return the zoom ratio range | +| Promise\> | 使用Promise的方式获取当前的可变焦距比范围。 | -**Example** +**示例:** ``` cameraInput.getZoomRatioRange().then((zoomRatioRange) => { @@ -1203,28 +1026,22 @@ cameraInput.getZoomRatioRange().then((zoomRatioRange) => { }) ``` -### setZoomRatio(zoomRatio: number, callback: AsyncCallback): void; +### setZoomRatio -**System Capabilities:** +setZoomRatio(zoomRatio: number, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +设置可变焦距比,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Sets a zoom ratio. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|------------------------|-----------|------------------------------------| -| zoomRatio | number | Yes | Zoom ratio | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| zoomRatio | number | 是 | 可变焦距比。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` cameraInput.setZoomRatio(zoomRatio, (err) => { @@ -1236,29 +1053,27 @@ cameraInput.setZoomRatio(zoomRatio, (err) => { }) ``` -### setZoomRatio(zoomRatio: number): Promise; - -**System Capabilities:** +### setZoomRatio -SystemCapability.Multimedia.Camera.Core +setZoomRatio(zoomRatio: number): Promise -**Description** +设置可变焦距比,通过Promise获取结果。 -Sets a zoom ratio. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|----------|-----------|-------------| -| zoomRatio | number | Yes | zoom ratio | +| zoomRatio | number | 是 | 可变焦距比。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-----------------------|-----------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` cameraInput.setZoomRatio(zoomRatio).then() => { @@ -1266,27 +1081,21 @@ cameraInput.setZoomRatio(zoomRatio).then() => { }) ``` -### getZoomRatio(callback: AsyncCallback): void; +### getZoomRatio -**System Capabilities:** +getZoomRatio(callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +获取当前的可变焦距比,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Gets current zoom ratio value. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-----------|---------------------------|-----------|------------------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the current zoom ratio value | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` cameraInput.getZoomRatio((err, zoomRatio) => { @@ -1298,27 +1107,21 @@ cameraInput.getZoomRatio((err, zoomRatio) => { }) ``` -### getZoomRatio(): Promise; - -**System Capabilities:** +### getZoomRatio -SystemCapability.Multimedia.Camera.Core +getZoomRatio(): Promise -**Description** +获取当前的可变焦距比,通过Promise获取结果。 -Gets current zoom ratio value. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**返回值:** -none +| 类型 | 说明 | +| ---------------- | --------------------------- | +| Promise | 使用Promise的方式获取结果。 | -**Return values** - -| Type | Description | -|-----------------------|---------------------------------------------------| -| Promise | Promise used to return the zoom ratio vaule | - -**Example** +**示例:** ``` cameraInput.getZoomRatio().then(zoomRatio) => { @@ -1326,30 +1129,24 @@ cameraInput.getZoomRatio().then(zoomRatio) => { }) ``` -### release\(callback: AsyncCallback\): void; +### release -**System Capabilities:** +release\(callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +释放相机实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Releases this **CameraInput** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` -cameraInput.release((err) => { +camera.release((err) => { if (err) { console.error('Failed to release the CameraInput instance ${err.message}'); return; @@ -1358,27 +1155,21 @@ cameraInput.release((err) => { }); ``` -### release(): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core - -**Description** +### release -Releases this **CameraInput** instance. This method uses a promise to return the result. +release(): Promise -**Parameters** +释放相机实例,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` cameraInput.release().then(() => { @@ -1386,28 +1177,22 @@ cameraInput.release().then(() => { }) ``` -### on(type: 'focusStateChange', callback: Callback): void; +### on('focusStateChange') -**System Capabilities:** +on(type: 'focusStateChange', callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +监听焦距的状态变化,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Listens for focus state changes. This method uses a callback to get focus state changes. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the focus state change. | - -**Return value** +| type | string | 是 | 监听事件,固定为'focusStateChange',即焦距状态变化事件。 | +| callback | AsyncCallback<[FocusState](#focusstate)\> | 是 | 回调函数,用于获取焦距状态。 | -None - -**Example** +**示例:** ``` cameraInput.on('focusStateChange', (focusState) => { @@ -1415,28 +1200,22 @@ cameraInput.on('focusStateChange', (focusState) => { }) ``` -### on(type: 'error', callback: Callback): void; - -**System Capabilities:** +### on('error') -SystemCapability.Multimedia.Camera.Core +on('error', callback: ErrorCallback): void -**Description** +监听CameraInput的错误事件,通过注册回调函数获取结果。 -Listens for **CameraInput** errors. This method uses a callback to get errors. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the camera input errors. | +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取结果。 | -**Return value** - -None - -**Example** +**示例:** ``` cameraInput.on('error', (cameraInputError) => { @@ -1444,54 +1223,58 @@ cameraInput.on('error', (cameraInputError) => { }) ``` -## FlashMode -Enumerates the flash modes. +## FlashMode -| Name | Default value | Description | +枚举,闪光灯模式。 + +| 名称 | 默认值 | 说明 | |------------------------|---------------|------------------------| -| FLASH_MODE_CLOSE | 0 | Flash mode close
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_OPEN | 1 | Flash mode open
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_AUTO | 2 | Flash mode auto
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| FLASH_MODE_ALWAYS_OPEN | 3 | Flash mode always open
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_CLOSE | 0 | 闪光灯关闭。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_OPEN | 1 | 闪光灯开启。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_AUTO | 2 | 自动闪光灯。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FLASH_MODE_ALWAYS_OPEN | 3 | 闪光灯常亮。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## FocusMode +## FocusMode -Enumerates the focus modes. +枚举,焦距模式。 -| Name | Default value | Description | +| 名称 | 默认值 | 说明 | |----------------------------|---------------|----------------------------| -| FOCUS_MODE_MANUAL | 0 | Focus mode manual
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_CONTINUOUS_AUTO | 1 | Focus mode continuous auto
System Capabilities: SystemCapability.Multimedia.Camera.Core| -| FOCUS_MODE_AUTO | 2 | Focus mode auto
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| FOCUS_MODE_LOCKED | 3 | Focus mode locked
System Capabilities: SystemCapability.Multimedia.Camera.Core | - +| FOCUS_MODE_MANUAL | 0 | 手动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_CONTINUOUS_AUTO | 1 | 连续自动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_AUTO | 2 | 自动变焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| FOCUS_MODE_LOCKED | 3 | 定焦模式。
**系统能力:** SystemCapability.Multimedia.Camera.Core | -## createCaptureSession\(context: Context, callback: AsyncCallback\): void; +## FocusState -**System Capabilities:** +枚举,焦距状态。 -SystemCapability.Multimedia.Camera.Core +| 名称 | 默认值 | 说明 | +| --------------------- | ------ | ------------------------------------------------------------ | +| FOCUS_STATE_SCAN | 0 | 扫描状态。
系统能力 : SystemCapability.Multimedia.Camera.Core | +| FOCUS_STATE_FOCUSED | 1 | 相机已对焦。
系统能力 : SystemCapability.Multimedia.Camera.Core | +| FOCUS_STATE_UNFOCUSED | 2 | 相机未对焦。
系统能力 : SystemCapability.Multimedia.Camera.Core | -**Description** +## camera.createCaptureSession -Creates a **CaptureSession** instance. This method uses an asynchronous callback to return the instance. +createCaptureSession\(context: Context, callback: AsyncCallback\): void -**Parameters** +获取CaptureSession实例,通过注册回调函数获取结果。 -| Name | Type | Mandatory | Description | -|----------|--------------------------------|-----------|-----------------------------------------------------| -| context | Context | Yes | Application context | -| callback | AsyncCallback | Yes | Callback used to return the CaptureSession instance | +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return values** +**参数:** -none +| 名称 | 类型 | 必填 | 说明 | +|----------|--------------------------------|-----------|-----------------------------------------------------| +| context | Context | 是 | 应用上下文。 | +| callback | AsyncCallback<[CaptureSession](#capturesession)\> | 是 | 回调函数,用于获取CaptureSession实例。 | -**Example** +**示例:** ``` -captureSession.createCaptureSession(context), (err, captureSession) => { +camera.createCaptureSession(context), (err, captureSession) => { if (err) { console.error('Failed to create the CaptureSession instance. ${err.message}'); return; @@ -1500,61 +1283,53 @@ captureSession.createCaptureSession(context), (err, captureSession) => { }); ``` -## createCaptureSession(context: Context\): Promise; - -**System Capabilities:** +## camera.createCaptureSession -SystemCapability.Multimedia.Camera.Core +createCaptureSession(context: Context\): Promise; -**Description** +获取CaptureSession实例,通过Promise获取结果。 -Creates a **CaptureSession** instance. This method uses a promise to return the instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|-------------------------------|-----------|-----------------------------------------------------| -| context | Context | Yes | Application context | +| context | Context | 是 | 应用上下文。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |---------------------------|---------------------------------------------------| -| Promise | Promise used to return the CaptureSession instance. | +| Promise<[CaptureSession](#capturesession)\> | 使用Promise的方式获取CaptureSession实例。 | -**Example** +**示例:** ``` -captureSession.createCaptureSession(context).then((captureSession) => { +camera.createCaptureSession(context).then((captureSession) => { console.log('Promise returned with the CaptureSession instance'); }) ``` -## CaptureSession +## CaptureSession -Implements session capture. +拍照会话类。 -### beginConfig\(callback: AsyncCallback\): void; +### beginConfig -**System Capabilities:** +beginConfig\(callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +开始配置会话,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Starts configuration for this CaptureSession instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.beginConfig((err) => { @@ -1566,28 +1341,22 @@ captureSession.beginConfig((err) => { }); ``` -### beginConfig\(\): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core - -**Description** +### beginConfig -Starts configuration for this CaptureSession instance. This method uses a promise to return the result. +beginConfig\(\): Promise -**Parameters** +开始配置会话,通过Promise获取结果。 -none +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |---------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.beginConfig().then(() => { @@ -1595,27 +1364,21 @@ captureSession.beginConfig().then(() => { }) ``` -### commitConfig\(callback: AsyncCallback\): void; +### commitConfig -**System Capabilities:** +commitConfig\(callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +提交会话配置,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Commits the configuration for this CaptureSession instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|---------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.commitConfig((err) => { @@ -1627,27 +1390,21 @@ captureSession.commitConfig((err) => { }); ``` -### commitConfig\(\): Promise; - -**System Capabilities:** +### commitConfig -SystemCapability.Multimedia.Camera.Core +commitConfig\(\): Promise -**Description** +提交会话配置,通过Promise获取结果。 -Commits the configuration for this CaptureSession instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**返回值:** -none - -**Return values** - -| Type | Description | +| 类型 | 说明 | |---------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.commitConfig().then(() => { @@ -1655,28 +1412,22 @@ captureSession.commitConfig().then(() => { }) ``` -### addInput\(cameraInput: CameraInput, callback: AsyncCallback\): void; +### addInput -**System Capabilities:** +addInput\(cameraInput: CameraInput, callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,添加一个CameraInput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Add a CameraInput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-------------|----------------------|-----------|---------------------------------------------| -| cameraInput | CameraInput | Yes | CameraInput instance to add | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| cameraInput | [CameraInput](#camerainput) | 是 | 需要添加的CameraInput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.addInput(cameraInput, (err) => { @@ -1688,29 +1439,27 @@ captureSession.addInput(cameraInput, (err) => { }); ``` -### addInput\(cameraInput: CameraInput\): Promise; - -**System Capabilities:** +### addInput -SystemCapability.Multimedia.Camera.Core +addInput\(cameraInput: CameraInput\): Promise -**Description** +在当前会话中,添加一个CameraInput实例,通过Promise获取结果。 -Add a CameraInput instance to this CaptureSession instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-------------|---------------------|-----------|-------------------------------| -| cameraInput | CameraInput | Yes | CameraInput instance to add | +| cameraInput | [CameraInput](#camerainput) | 是 | 需要添加的CameraInput实例。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |----------------|------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.addInput(cameraInput).then(() => { @@ -1718,28 +1467,22 @@ captureSession.addInput(cameraInput).then(() => { }) ``` -### addOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void; - -**System Capabilities:** +### addOutput -SystemCapability.Multimedia.Camera.Core +addOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void -**Description** +在当前会话中,添加一个PreviewOutput实例,通过注册回调函数获取结果。 -Add a PreviewOutput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|-------------------------------------| -| previewOutput | PreviewOutput | Yes | PreviewOutput instance to add | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** - -none +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要添加的PreviewOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Example** +**示例:** ``` captureSession.addOutput(previewOutput, (err) => { @@ -1751,29 +1494,27 @@ captureSession.addOutput(previewOutput, (err) => { }); ``` -### addOutput\(previewOutput: PreviewOutput\): Promise; +### addOutput -**System Capabilities:** +addOutput\(previewOutput: PreviewOutput\): Promise -SystemCapability.Multimedia.Camera.Core +在当前会话中,添加一个PreviewOutput实例,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Add a PreviewOutput instance to this CaptureSession instance. This method uses a promise to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|--------------------------------| -| previewOutput | PreviewOutput | Yes | PreviewOutput instance to add | +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要添加的PreviewOutput实例。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |----------------|-----------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.addOutput(previewOutput).then(() => { @@ -1781,28 +1522,22 @@ captureSession.addOutput(previewOutput).then(() => { }) ``` -### addOutput\(photoOutput: PhotoOutput, callback: AsyncCallback\): void; - -**System Capabilities:** +### addOutput -SystemCapability.Multimedia.Camera.Core +addOutput\(photoOutput: PhotoOutput, callback: AsyncCallback\): void -**Description** +在当前会话中,添加一个PhotoOutput实例,通过注册回调函数获取结果。 -Add a PhotoOutput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|-------------------------------------| -| photoOutput | PhotoOutput | Yes | PhotoOutput instance to add | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** - -none +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Example** +**示例:** ``` captureSession.addOutput(photoOutput, (err) => { @@ -1814,29 +1549,27 @@ captureSession.addOutput(photoOutput, (err) => { }); ``` -### addOutput\(photoOutput: PhotoOutput\): Promise; +### addOutput -**System Capabilities:** +addOutput\(photoOutput: PhotoOutput\): Promise -SystemCapability.Multimedia.Camera.Core +在当前会话中,添加一个PreviewOutput实例,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Add a PhotoOutput instance to this CaptureSession instance. This method uses a promise to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|--------------------------------| -| photoOutput | PhotoOutput | Yes | PhotoOutput instance to add | +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |---------------|-----------------------------------| -| Promise | Promise used to return the result | +| Promise\ | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.addOutput(photoOutput).then(() => { @@ -1844,28 +1577,22 @@ captureSession.addOutput(photoOutput).then(() => { }) ``` -### addOutput\(videoOutput: VideoOutput, callback: AsyncCallback\): void; - -**System Capabilities:** +### addOutput -SystemCapability.Multimedia.Camera.Core +addOutput\(videoOutput: VideoOutput, callback: AsyncCallback\): void -**Description** +在当前会话中,添加一个VideoOutput实例,通过注册回调函数获取结果。 -Add a VideoOutput instance to this CaptureSession instance. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|-------------------------------------| -| videoOutput | VideoOutput | Yes | VideoOutput instance to add | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.addOutput(videoOutput, (err) => { @@ -1877,29 +1604,27 @@ captureSession.addOutput(videoOutput, (err) => { }); ``` -### addOutput\(videoOutput: VideoOutput\): Promise; +### addOutput -**System Capabilities:** +addOutput\(videoOutput: VideoOutput\): Promise -SystemCapability.Multimedia.Camera.Core +在当前会话中,添加一个VideoOutput实例,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Add a VideoOutput instance to this CaptureSession instance. This method uses a promise to return the result. +**参数:** -**Parameters** +| 名称 | 类型 | 必填 | 说明 | +| ----------- | --------------------------- | ---- | --------------------------- | +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | -| Name | Type | Mandatory | Description | -|---------------|---------------------|-----------|--------------------------------| -| videoOutput | VideoOutput | Yes | VideoOutput instance to add | +**返回值:** -**Return values** +| 类型 | 说明 | +| -------------- | --------------------------- | +| Promise\ | 使用Promise的方式获取结果。 | -| Type | Description | -|----------------|-----------------------------------| -| Promise | Promise used to return the result | - -**Example** +**示例:** ``` captureSession.addOutput(videoOutput).then(() => { @@ -1907,29 +1632,22 @@ captureSession.addOutput(videoOutput).then(() => { }) ``` -### removeInput\(cameraInput: CameraInput, callback: AsyncCallback\): void; +### removeInput -**System Capabilities:** +removeInput\(cameraInput: CameraInput, callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,移除一个CameraInput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Removes a **CameraInput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-------------|----------------------|-----------|------------------------------------| -| cameraInput | CameraInput | Yes | CameraInput instance to remove | -| callback | AsyncCallback | Yes | Callback used to return the result | - +| cameraInput | [CameraInput](#camerainput) | 是 | 需要移除的CameraInput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return values** - -none - -**Example** +**示例:** ``` captureSession.removeInput(cameraInput, (err) => { @@ -1941,29 +1659,27 @@ captureSession.removeInput(cameraInput, (err) => { }); ``` -### removeInput\(cameraInput: CameraInput\): Promise; - -**System Capabilities:** +### removeInput -SystemCapability.Multimedia.Camera.Core +removeInput\(cameraInput: CameraInput\): Promise -**Description** +在当前会话中,移除一个CameraInput实例,通过Promise获取结果。 -Removes a **CameraInput** instance from this **CaptureSession** instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |-------------|---------------------|-----------|---------------------------------| -| cameraInput | CameraInput | Yes | CameraInput instance to remove | +| cameraInput | [CameraInput](#camerainput) | 是 | 需要移除的CameraInput实例。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |----------------|-----------------------------------| -| Promise | Promise used to return the result | +| Promise\ | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.removeInput(cameraInput).then(() => { @@ -1971,28 +1687,22 @@ captureSession.removeInput(cameraInput).then(() => { }) ``` -### removeOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void; +### removeOutput -**System Capabilities:** +removeOutput\(previewOutput: PreviewOutput, callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,移除一个PreviewOutput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Removes a **PreviewOutput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|------------------------------------| -| previewOutput | PreviewOutput | Yes | PreviewOutput instance to remove | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要移除的PreviewOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.removeOutput(previewOutput, (err) => { @@ -2004,31 +1714,29 @@ captureSession.removeOutput(previewOutput, (err) => { }); ``` -### removeOutput(previewOutput: PreviewOutput): Promise; - -**System Capabilities:** +### removeOutput -SystemCapability.Multimedia.Camera.Core +removeOutput(previewOutput: PreviewOutput): Promise -**Description** +在当前会话中,移除一个PreviewOutput实例,通过Promise获取结果。 -Removes a **PreviewOutput** instance from this **CaptureSession** instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|-----------------------------------| -| previewOutput | PreviewOutput | Yes | PreviewOutput instance to remove | +| previewOutput | [PreviewOutput](#previewoutput) | 是 | 需要移除的PreviewOutput实例。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |---------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.removeOutput(previewOutput).then(() => { @@ -2036,28 +1744,22 @@ captureSession.removeOutput(previewOutput).then(() => { }) ``` -### removeOutput(photoOutput: PhotoOutput, callback: AsyncCallback): void; +### removeOutput -**System Capabilities:** +removeOutput(photoOutput: PhotoOutput, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,移除一个PhotoOutput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Removes a **PhotoOutput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|------------------------------------| -| photoOutput | PhotoOutput | Yes | PhotoOutput instance to remove | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.removeOutput(photoOutput, (err) => { @@ -2069,31 +1771,29 @@ captureSession.removeOutput(photoOutput, (err) => { }); ``` -### removeOutput(photoOutput: PhotoOutput): Promise; - -**System Capabilities:** +### removeOutput -SystemCapability.Multimedia.Camera.Core +removeOutput(photoOutput: PhotoOutput): Promise -**Description** +在当前会话中,移除一个PhotoOutput实例,通过Promise获取结果。 -Removes a **PhotoOutput** instance from this **CaptureSession** instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|---------------------------------| -| photoOutput | PhotoOutput | Yes | PhotoOutput instance to remove | +| photoOutput | [PhotoOutput](#photooutput) | 是 | 需要添加的PhotoOutput实例。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |---------------|------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.removeOutput(photoOutput).then(() => { @@ -2101,28 +1801,22 @@ captureSession.removeOutput(photoOutput).then(() => { }) ``` -### removeOutput(videoOutput: VideoOutput, callback: AsyncCallback): void; +### removeOutput -**System Capabilities:** +removeOutput(videoOutput: VideoOutput, callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +在当前会话中,移除一个VideoOutput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Removes a **VideoOutput** instance from this **CaptureSession** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|----------------------|-----------|------------------------------------| -| videoOutput | VideoOutput | Yes | VideoOutput instance to remove | -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.removeOutput(videoOutput, (err) => { @@ -2134,31 +1828,29 @@ captureSession.removeOutput(videoOutput, (err) => { }); ``` -### removeOutput(videoOutput: VideoOutput): Promise; - -**System Capabilities:** +### removeOutput -SystemCapability.Multimedia.Camera.Core +removeOutput(videoOutput: VideoOutput): Promise -**Description** +在当前会话中,移除一个VideoOutput实例,通过Promise获取结果。 -Removes a **VideoOutput** instance from this **CaptureSession** instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |---------------|---------------------|-----------|---------------------------------| -| videoOutput | VideoOutput | Yes | VideoOutput instance to remove | +| videoOutput | [VideoOutput](#videooutput) | 是 | 需要添加的VideoOutput实例。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.removeOutput(videoOutput).then(() => { @@ -2166,27 +1858,21 @@ captureSession.removeOutput(videoOutput).then(() => { }) ``` -### start\(callback: AsyncCallback\): void; +### start -**System Capabilities:** +start\(callback: AsyncCallback\): void -SystemCapability.Multimedia.Camera.Core +启动拍照会话,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Starts this **CaptureSession** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` captureSession.start((err) => { @@ -2198,27 +1884,21 @@ captureSession.start((err) => { }); ``` -### start\(\): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core +### start -**Description** +start\(\): Promise -Starts this **CaptureSession** instance. This method uses a promise to return the result. +启动拍照会话,通过Promise获取结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Camera.Core -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|-----------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.start().then(() => { @@ -2226,28 +1906,22 @@ captureSession.start().then(() => { }) ``` -### stop\(callback: AsyncCallback\): void; - -**System Capabilities:** +### stop -SystemCapability.Multimedia.Camera.Core +stop\(callback: AsyncCallback\): void -**Description** +停止拍照会话,通过注册回调函数获取结果。 -Stops this **CaptureSession** instance. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return values** - -none - -**Example** +**示例:** ``` captureSession.stop((err) => { @@ -2259,27 +1933,21 @@ captureSession.stop((err) => { }); ``` -### stop(): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core +### stop -**Description** +stop(): Promise -Stops this **CaptureSession** instance. This method uses a promise to return the result. +停止拍照会话,通过Promise获取结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Camera.Core -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|-----------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.stop().then(() => { @@ -2287,27 +1955,21 @@ captureSession.stop().then(() => { }) ``` -### release\(callback: AsyncCallback\): void; - -**System Capabilities:** +### release -SystemCapability.Multimedia.Camera.Core +release\(callback: AsyncCallback\): void -**Description** +释放CaptureSession实例,通过注册回调函数获取结果。 -Releases this **CaptureSession** instance. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** - -none +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Example** +**示例:** ``` captureSession.release((err) => { @@ -2319,27 +1981,21 @@ captureSession.release((err) => { }); ``` -### release(): Promise; +### release -**System Capabilities:** +release(): Promise -SystemCapability.Multimedia.Camera.Core +释放CaptureSession实例,通过Promise获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Releases this **CaptureSession** instance. This method uses a promise to return the result. +**返回值:** -**Parameters** - -none - -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` captureSession.release().then(() => { @@ -2347,28 +2003,22 @@ captureSession.release().then(() => { }) ``` -### on(type: 'error', callback: Callback): void; - -**System Capabilities:** +### on('error') -SystemCapability.Multimedia.Camera.Core +on(type: 'error', callback: ErrorCallback): void -**Description** +监听拍照会话的错误事件,通过注册回调函数获取结果。 -Listens for **CaptureSession** errors. This method uses a callback to get errors. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the capture session errors. | +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | -**Return value** - -None - -**Example** +**示例:** ``` captureSession.on('error', (captureSessionError) => { @@ -2376,28 +2026,22 @@ captureSession.on('error', (captureSessionError) => { }) ``` -## createPreviewOutput(surfaceId: string, callback: AsyncCallback): void; - -**System Capabilities:** +## camera.createPreviewOutput -SystemCapability.Multimedia.Camera.Core +createPreviewOutput(surfaceId: string, callback: AsyncCallback): void -**Description** +获取PreviewOutput实例,通过注册回调函数获取结果。 -Creates a **PreviewOutput** instance. This method uses an asynchronous callback to return the instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | Surface ID received from XComponent view | -| callback | AsyncCallback | Yes | Callback used to return the PreviewOutput instance | - -**Return values** - -none +| surfaceId | string | 是 | 从XComponent组件获取的Surface ID。 | +| callback | AsyncCallback<[PreviewOutput](#previewoutput)\> | 是 | 回调函数,用于获取PreviewOutput实例。 | -**Example** +**示例:** ``` camera.createPreviewOutput(surfaceId), (err, previewOutput) => { @@ -2407,31 +2051,29 @@ camera.createPreviewOutput(surfaceId), (err, previewOutput) => { } console.log('Callback returned with previewOutput instance'); }); -``` - -## createPreviewOutput(surfaceId: string): Promise; +``` -**System Capabilities:** +## camera.createPreviewOutput -SystemCapability.Multimedia.Camera.Core +createPreviewOutput(surfaceId: string): Promise\ -**Description** +获取PreviewOutput实例,通过Promise获取结果。 -Creates a **PreviewOutput** instance. This method uses a promise to return the instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | Surface ID received from XComponent view | +| surfaceId | string | 是 | 从XComponent组件获取的Surface ID。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-------------------------|---------------------------------------------------| -| Promise | Promise used to return the PreviewOutput instance | +| Promise<[PreviewOutput](#previewoutput)\> | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` camera.createPreviewOutput(surfaceId).then((previewOutput) => { @@ -2441,29 +2083,23 @@ camera.createPreviewOutput(surfaceId).then((previewOutput) => { ## PreviewOutput -Implements preview output. +预览输出类。 -### release(callback: AsyncCallback): void; +### release -**System Capabilities:** +release(callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +释放PreviewOutput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Releases this **PreviewOutput** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` previewOutput.release((err) => { @@ -2475,27 +2111,22 @@ previewOutput.release((err) => { }); ``` -### release(): Promise; - -**System Capabilities:** +### release -SystemCapability.Multimedia.Camera.Core +release(): Promise -**Description** +释放PreviewOutput实例,通过Promise获取结果。 -Releases this **PreviewOutput** instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|-----------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` previewOutput.release().then(() => { @@ -2503,28 +2134,22 @@ previewOutput.release().then(() => { }) ``` -### on(type: 'frameStart', callback: Callback): void; - -**System Capabilities:** +### on('frameStart') -SystemCapability.Multimedia.Camera.Core +on(type: 'frameStart', callback: AsyncCallback): void -**Description** +监听预览帧启动,通过注册回调函数获取结果。 -Listens for preview frame start events. This method uses a callback to get the event information. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to return the result | +| type | string | 是 | 监听事件,固定为'frameStart',即帧启动事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return value** - -None - -**Example** +**示例:** ``` previewOutput.on('frameStart', () => { @@ -2532,28 +2157,22 @@ previewOutput.on('frameStart', () => { }) ``` -### on(type: 'frameEnd', callback: Callback): void; +### on('frameEnd') -**System Capabilities:** +on(type: 'frameEnd', callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +监听预览帧结束,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Listens for preview frame end event. This method uses a callback to get the event information. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to return the result | - -**Return value** +| type | string | 是 | 监听事件,固定为'frameEnd',即帧结束事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -None - -**Example** +**示例:** ``` previewOutput.on('frameEnd', () => { @@ -2561,28 +2180,22 @@ previewOutput.on('frameEnd', () => { }) ``` -### on(type: 'error', callback: Callback): void; - -**System Capabilities:** +### on('error') -SystemCapability.Multimedia.Camera.Core +on(type: 'error', callback: ErrorCallback): void -**Description** +监听预览输出的错误事件,通过注册回调函数获取结果。 -Listens for **PreviewOutput** errors. This method uses a callback to get errors. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the preview output errors. | - -**Return value** +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | -None - -**Example** +**示例:** ``` previewOutput.on('error', (previewOutputError) => { @@ -2590,28 +2203,22 @@ previewOutput.on('error', (previewOutputError) => { }) ``` -## createPhotoOutput(surfaceId: string, callback: AsyncCallback): void; - -**System Capabilities:** +## camera.createPhotoOutput -SystemCapability.Multimedia.Camera.Core +createPhotoOutput(surfaceId: string, callback: AsyncCallback): void -**Description** +获取PhotoOutput实例,通过注册回调函数获取结果。 -Creates a **PhotoOutput** instance. This method uses an asynchronous callback to return the instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | Surface ID received from ImageReceiver | -| callback | AsyncCallback | Yes | Callback used to return the PhotoOutput instance | +| surfaceId | string | 是 | 从ImageReceiver获取的Surface ID。 | +| callback | AsyncCallback<[PhotoOutput](#photooutput)\> | 是 | 回调函数,用于获取PhotoOutput实例。 | -**Return values** - -none - -**Example** +**示例:** ``` camera.createPhotoOutput(surfaceId), (err, photoOutput) => { @@ -2621,31 +2228,29 @@ camera.createPhotoOutput(surfaceId), (err, photoOutput) => { } console.log('Callback returned with the PhotoOutput instance.'); }); -``` - -## createPhotoOutput(surfaceId: string): Promise; +``` -**System Capabilities:** +## camera.createPhotoOutput -SystemCapability.Multimedia.Camera.Core +createPhotoOutput(surfaceId: string): Promise -**Description** +获取PhotoOutput实例,通过Promise获取结果。 -Creates a **PhotoOutput** instance. This method uses a promise to return the PhotoOutput instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | Surface ID received from ImageReceiver | +| surfaceId | string | 是 | 从ImageReceiver获取的Surface ID。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |-------------------------|--------------------------------------------------| -| Promise | Promise used to return the PhotoOutput instance | +| Promise<[PhotoOutput](#photooutput)\> | 使用Promise的方式获取PhotoOutput实例。 | -**Example** +**示例:** ``` camera.createPhotoOutput(surfaceId).then((photoOutput) => { @@ -2654,71 +2259,55 @@ camera.createPhotoOutput(surfaceId).then((photoOutput) => { ``` ## ImageRotation -Enumerates the image rotation angles. +枚举,图片旋转角度。 -| Name | Default Value | Description | +| 名称 | 默认值 | 说明 | |--------------|---------------|----------------------------------------| -| ROTATION_0 | 0 | The capture image rotates 0 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| ROTATION_90 | 90 | The capture image rotates 90 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| ROTATION_180 | 180 | The capture image rotates 180 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| ROTATION_270 | 270 | The capture image rotates 270 degrees
System Capabilities: SystemCapability.Multimedia.Camera.Core| - - -## Location - -Defines the location of a captured image. - -| Name | Type | Access | Description | -|-----------|--------|--------------|-------------| -| latitude | number | read / write | Latitude
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| longitude | number | read / write | Longitude
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| ROTATION_0 | 0 | 图片旋转0度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| ROTATION_90 | 90 | 图片旋转90度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| ROTATION_180 | 180 | 图片旋转180度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| ROTATION_270 | 270 | 图片旋转270度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | ## QualityLevel -Enumerates the image quality levels. +枚举,图片质量。 -| Name | Default value | Description | +| 名称 | 默认值 | 说明 | |----------------------|---------------|----------------------| -| QUALITY_LEVEL_HIGH | 0 | High image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| QUALITY_LEVEL_MEDIUM | 1 | Medium image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core | -| QUALITY_LEVEL_LOW | 2 | Low image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_HIGH | 0 | 图片质量高。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_MEDIUM | 1 | 图片质量中等。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| QUALITY_LEVEL_LOW | 2 | 图片质量差。
**系统能力:** SystemCapability.Multimedia.Camera.Core | ## PhotoCaptureSetting -Defines the settings for image capture. +拍摄照片的设置。 -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|---------------|-----------|---------------------| -| quality | QualityLevel | Optional | Photo image quality
System Capabilities: SystemCapability.Multimedia.Camera.Core| -| rotation | ImageRotation | Optional | Photo rotation
System Capabilities: SystemCapability.Multimedia.Camera.Core | +| quality | [QualityLevel](#qualitylevel) | 否 | 图片质量。
**系统能力:** SystemCapability.Multimedia.Camera.Core | +| rotation | [ImageRotation](#imagerotation) | 否 | 图片旋转角度。
**系统能力:** SystemCapability.Multimedia.Camera.Core | ## PhotoOutput -Implements photo output. +照片输出类。 -### capture(callback: AsyncCallback): void; +### capture -**System Capabilities:** +capture(callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +拍照,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Captures a photo. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|---------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` photoOutput.capture((err) => { @@ -2730,28 +2319,22 @@ photoOutput.capture((err) => { }); ``` -### capture(setting: PhotoCaptureSetting, callback: AsyncCallback): void; - -**System Capabilities:** +### capture -SystemCapability.Multimedia.Camera.Core +capture(setting: PhotoCaptureSetting, callback: AsyncCallback): void -**Description** +根据拍照设置拍照,通过注册回调函数获取结果。 -Captures a photo with the specified capture settings. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| setting | PhotoCaptureSetting | Yes | Photo capture settings | -| callback | AsyncCallback | Yes | Callback used to return the result | +| setting | [PhotoCaptureSetting](#photocapturesetting) | 是 | 拍照设置。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return values** - -none - -**Example** +**示例:** ``` photoOutput.capture(settings, (err) => { @@ -2763,30 +2346,28 @@ photoOutput.capture(settings, (err) => { }); ``` -### capture(setting?: PhotoCaptureSetting): Promise; - -**System Capabilities:** +### capture -SystemCapability.Multimedia.Camera.Core +capture(setting?: PhotoCaptureSetting): Promise -**Description** +根据拍照设置拍照,通过Promise获取结果。 -Captures a photo with the specified capture settings. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|---------------------|-----------|----------------------------------------------| -| setting | PhotoCaptureSetting | No | Photo capture settings | +| setting | [PhotoCaptureSetting](#photocapturesetting) | 否 | 拍照设置。 | -**Return values** +**返回值:** -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` photoOutput.capture().then(() => { @@ -2794,27 +2375,21 @@ photoOutput.capture().then(() => { }) ``` -### release(callback: AsyncCallback): void; +### release -**System Capabilities:** +release(callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +释放PhotoOutput实例,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Releases this **PhotoOutput** instance. This method uses an asynchronous callback to return the result. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` photoOutput.release((err) => { @@ -2826,27 +2401,22 @@ photoOutput.release((err) => { }); ``` -### release(): Promise; - -**System Capabilities:** +### release -SystemCapability.Multimedia.Camera.Core +release(): Promise -**Description** +释放PhotoOutput实例,通过Promise获取结果。 -Releases this **PhotoOutput** instance. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` photoOutput.release().then(() => { @@ -2854,28 +2424,22 @@ photoOutput.release().then(() => { }) ``` -### on(type: 'captureStart', callback: Callback): void; - -**System Capabilities:** +### on('captureStart') -SystemCapability.Multimedia.Camera.Core +on(type: 'captureStart', callback: AsyncCallback): void -**Description** +监听拍照启动,通过注册回调函数获取Capture ID。 -Listens for photo capture start events. This method uses a callback to get the event information. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the capture ID. | +| type | string | 是 | 监听事件,固定为'captureStart',即拍照启动事件。 | +| callback | AsyncCallback | 是 | 使用callback的方式获取Capture ID。 | -**Return value** - -None - -**Example** +**示例:** ``` photoOutput.on('captureStart', (captureId) => { @@ -2883,28 +2447,22 @@ photoOutput.on('captureStart', (captureId) => { }) ``` -### on(type: 'frameShutter', callback: Callback): void; +### on('frameShutter') -**System Capabilities:** +on(type: 'frameShutter', callback: AsyncCallback): void -SystemCapability.Multimedia.Camera.Core +监听帧刷新,通过注册回调函数获取结果。 -**Description** +**系统能力:** SystemCapability.Multimedia.Camera.Core -Listens for frame shutter events. This method uses a callback to get the event information. +**参数:** -**Parameters** - -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the frame shutter information.| - -**Return value** +| type | string | 是 | 监听事件,固定为'frameShutter',即帧刷新事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取相关信息。 | -None - -**Example** +**示例:** ``` photoOutput.on('frameShutter', (frameShutterInfo) => { @@ -2913,28 +2471,22 @@ photoOutput.on('frameShutter', (frameShutterInfo) => { }) ``` -### on(type: 'captureEnd', callback: Callback): void; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core - -**Description** +### on('captureEnd') -Listens for photo capture end events. This method uses a callback to get the event information. +on(type: 'captureEnd', callback: AsyncCallback): void -**Parameters** +监听拍照停止,通过注册回调函数获取结果。 -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :------------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the capture end information | +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return value** +**参数:** -None +| 名称 | 类型 | 必填 | 说明 | +| :------- | :--------------------- | :-------- | :-----------------------------------------------| +| type | string | 是 | 监听事件,固定为'captureEnd',即拍照停止事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取相关信息。 | -**Example** +**示例:** ``` photoOutput.on('captureEnd', (captureEndInfo) => { @@ -2943,28 +2495,22 @@ photoOutput.on('captureEnd', (captureEndInfo) => { }) ``` -### on(type: 'error', callback: Callback): void; - -**System Capabilities:** +### on('error') -SystemCapability.Multimedia.Camera.Core +on(type: 'error', callback: ErrorCallback): void -**Description** +监听拍照的错误事件,通过注册回调函数获取结果。 -Listens for **PhotoOutput** errors. This method uses a callback to get errors. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the photo output errors. | - -**Return value** +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | ErrorCallback | 是 | 回调函数,用于获取错误信息。 | -None - -**Example** +**示例:** ``` photoOutput.on('error', (photoOutputError) => { @@ -2972,28 +2518,22 @@ photoOutput.on('error', (photoOutputError) => { }) ``` -## createVideoOutput(surfaceId: string, callback: AsyncCallback): void; - -**System Capabilities:** +## camera.createVideoOutput -SystemCapability.Multimedia.Camera.Core +createVideoOutput(surfaceId: string, callback: AsyncCallback): void -**Description** +获取VideoOutput实例,通过注册回调函数获取结果。 -Creates a **VideoOutput** instance. This method uses an asynchronous callback to return the instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |------------|-------------------------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | Surface ID received from VideoRecorder | -| callback | AsyncCallback | Yes | Callback used to return the VideoOutput instance | +| surfaceId | string | 是 | 从VideoRecorder获取的Surface ID。 | +| callback | AsyncCallback<[VideoOutput](#videootput)\> | 是 | 回调函数,用于获取VideoOutput实例。 | -**Return values** - -none - -**Example** +**示例:** ``` camera.createVideoOutput(surfaceId), (err, videoOutput) => { @@ -3003,62 +2543,55 @@ camera.createVideoOutput(surfaceId), (err, videoOutput) => { } console.log('Callback returned with the VideoOutput instance'); }); -``` - -## createVideoOutput(surfaceId: string): Promise; +``` -**System Capabilities:** +## camera.createVideoOutput -SystemCapability.Multimedia.Camera.Core +createVideoOutput(surfaceId: string): Promise -**Description** +获取VideoOutput实例,通过Promise获取结果。 -Creates a **VideoOutput** instance. This method uses a promise to return the VideoOutput instance. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |------------|-----------------|-----------|----------------------------------------------------| -| surfaceId | string | Yes | Surface ID received from VideoRecorder | +| surfaceId | string | 是 | 从VideoRecorder获取的Surface ID。 | -**Return values** +**返回值:** -| Type | Description | -|-------------------------|-------------------------------------------------| -| Promise | Promise used to return the VideoOutput instance | +| 类型 | 说明 | +| --------------------- | -------------------------------------- | +| Promise | 使用Promise的方式获取VideoOutput实例。 | -**Example** +**示例:** ``` camera.createVideoOutput(surfaceId).then((videoOutput) => { console.log('Promise returned with the VideoOutput instance'); }) ``` -## VideoOutput -Implements video output. +## VideoOutput -### start(callback: AsyncCallback): void; +视频输出类。 -**System Capabilities:** +### start -SystemCapability.Multimedia.Camera.Core +start(callback: AsyncCallback): void -**Description** +开始拍摄视频,通过注册回调函数获取结果。 -Starts the video output. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | - -**Return values** +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -none - -**Example** +**示例:** ``` videoOutput.start((err) => { @@ -3070,27 +2603,22 @@ videoOutput.start((err) => { }); ``` -### start(): Promise; - -**System Capabilities:** +### start -SystemCapability.Multimedia.Camera.Core +start(): Promise -**Description** +开始拍摄视频,通过Promise获取结果。 -Starts the video output. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` videoOutput.start().then(() => { @@ -3098,27 +2626,21 @@ videoOutput.start().then(() => { }) ``` -### stop(callback: AsyncCallback): void; - -**System Capabilities:** +### stop -SystemCapability.Multimedia.Camera.Core +stop(callback: AsyncCallback): void -**Description** +停止拍摄视频,通过注册回调函数获取结果。 -Stops the video output. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return values** - -none - -**Example** +**示例:** ``` videoOutput.stop((err) => { @@ -3130,26 +2652,21 @@ videoOutput.stop((err) => { }); ``` -### stop(): Promise; - -**System Capabilities:** +### stop -SystemCapability.Multimedia.Camera.Core +stop(): Promise -**Description** +停止拍摄视频,通过Promise获取结果。 -Stops the video output. This method uses a promise to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` videoOutput.start().then(() => { @@ -3157,27 +2674,21 @@ videoOutput.start().then(() => { }) ``` -### release(callback: AsyncCallback): void; - -**System Capabilities:** +### release -SystemCapability.Multimedia.Camera.Core +release(callback: AsyncCallback): void -**Description** +释放VideoOutput实例,通过注册回调函数获取结果。 -Releases this VideoOutput instance. This method uses an asynchronous callback to return the result. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | |----------|----------------------|-----------|----------------------------------------------| -| callback | AsyncCallback | Yes | Callback used to return the result | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Return values** - -none - -**Example** +**示例:** ``` videoOutput.release((err) => { @@ -3189,28 +2700,22 @@ videoOutput.release((err) => { }); ``` -### release(): Promise; - -**System Capabilities:** - -SystemCapability.Multimedia.Camera.Core +### release -**Description** +release(): Promise -Releases this VideoOutput instance. This method uses a promise to return the result. +释放VideoOutput实例,通过Promise获取结果。 -**Parameters** +**系统能力:** SystemCapability.Multimedia.Camera.Core -none +**返回值:** -**Return values** - -| Type | Description | +| 类型 | 说明 | |----------------|---------------------------------------------| -| Promise | Promise used to return the result | +| Promise | 使用Promise的方式获取结果。 | -**Example** +**示例:** ``` videoOutput.release().then(() => { @@ -3218,28 +2723,22 @@ videoOutput.release().then(() => { }) ``` -### on(type: 'frameStart', callback: Callback): void; - -**System Capabilities:** +### on('frameStart') -SystemCapability.Multimedia.Camera.Core +on(type: 'frameStart', callback: AsyncCallback): void -**Description** +监听视频帧开启,通过注册回调函数获取结果。 -Listens for video frame start events. This method uses a callback to get the event information. +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Parameters** +**参数:** -| Name | Type | Mandatory | Description | +| 名称 | 类型 | 必填 | 说明 | | :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to return the result | - -**Return value** - -None +| type | string | 是 | 监听事件,固定为'frameStart',即视频帧开启事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Example** +**示例:** ``` videoOutput.on('frameStart', () => { @@ -3247,22 +2746,22 @@ videoOutput.on('frameStart', () => { }) ``` -### on(type: 'frameEnd', callback: Callback): void; +### on('frameEnd') -Listens for video frame end events. This method uses a callback to get the event information. +on(type: 'frameEnd', callback: AsyncCallback): void -**Parameters** +监听视频帧结束,通过注册回调函数获取结果。 -| Name | Type | Mandatory | Description | -| :------- | :---------------- | :-------- | :----------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to return the result | +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return value** +**参数:** -None +| 名称 | 类型 | 必填 | 说明 | +| :------- | :---------------- | :-------- | :----------------------------------| +| type | string | 是 | 监听事件,固定为'frameEnd',即视频帧结束事件。 | +| callback | AsyncCallback | 是 | 回调函数,用于获取结果。 | -**Example** +**示例:** ``` videoOutput.on('frameEnd', () => { @@ -3270,22 +2769,22 @@ videoOutput.on('frameEnd', () => { }) ``` -### on(type: 'error', callback: Callback): void; +### on('error') -Listens for **VideoOutput** errors. This method uses a callback to get errors. +on(type: 'error', callback: ErrorCallback): void -**Parameters** +监听视频输出的错误事件,通过注册回调函数获取结果。 -| Name | Type | Mandatory | Description | -| :------- | :--------------------- | :-------- | :-----------------------------------------------| -| type | string | Yes | Name of the event to listen for. | -| callback | Callback | Yes | Callback used to get the video output errors. | +**系统能力:** SystemCapability.Multimedia.Camera.Core -**Return value** +**参数:** -None +| 名称 | 类型 | 必填 | 说明 | +| :------- | :--------------------- | :-------- | :-----------------------------------------------| +| type | string | 是 | 监听事件,固定为'error'。 | +| callback | Callback | 是 | 回调函数,用于获取错误信息。 | -**Example** +**示例:** ``` videoOutput.on('error', (VideoOutputError) => { -- Gitee From 87911744b728f772ca4b3cd97bc90231a11c1880 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 11:03:15 +0800 Subject: [PATCH 237/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-Bundle.md | 1528 +++++++---------- 1 file changed, 589 insertions(+), 939 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-Bundle.md b/en/application-dev/reference/apis/js-apis-Bundle.md index c3fa3085f88..8fc52e97652 100644 --- a/en/application-dev/reference/apis/js-apis-Bundle.md +++ b/en/application-dev/reference/apis/js-apis-Bundle.md @@ -12,7 +12,11 @@ SystemCapability.BundleManager.BundleFramework ## Required Permissions -None +| Required Permissions| Permission Level| Description| +|-------| --------- | ---- | +| ohos.permission.GET_BUNDLE_INFO | normal | Permission to query information about the current application.| +| ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED| system_basic | Permission to query information about all applications.| +| ohos.permission.INSTALL_BUNDLE | system_core | Permission to install or uninstall applications.| ## bundle.getApplicationInfo @@ -20,62 +24,35 @@ getApplicationInfo(bundleName: string, bundleFlags: number, userId: number): Pro Obtains the application information of the specified user based on a given bundle name in asynchronous mode. This method uses a promise to return the result. -**Permission required** +**Required permissions** ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED or ohos.permission.GET\_BUNDLE\_INFO **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | ------ | ---- | ------------------------------------------------------------ | -| bundleName | string | Yes| Bundle name of the application.| -| bundleFlags | number | Yes| Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| -| userId | number | Yes| User ID.| +| bundleName | string | Yes | Bundle name of the application. | +| bundleFlags | number | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | Yes | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | **Return value** -| Type| Description| +| Type | Description| | ----------- | -------- | | Promise\ | Promise used to return the application information.| **Example** ```js -bundle.getApplicationInfo('com.example.myapplicationInstall', 8, 0).then((data) => { - console.info("name: for begin"); - console.info("name:" + data.name); - console.info("bundleName:" + data.bundleName); - console.info("description:" + data.description); - console.info("descriptionId:" + data.descriptionId); - console.info("iconPath:" + data.iconPath); - console.info("iconId:" + data.iconId); - console.info("label:" + data.label); - console.info("labelId:" + data.labelId); - console.info("deviceId:" + data.deviceId); - console.info("signatureKey:" + data.signatureKey); - console.info("process:" + data.process); - console.info("isSystemApp:" + data.isSystemApp); - console.info("isLauncherApp:" + data.isLauncherApp); - console.info("supportedModes:" + data.supportedModes); - - console.info('getApplicationInfo permissions length [' + data.permissions.length + ']'); - for (var j = 0; j < data.permissions.length; j++) { - console.info("permissions[" + j + "]:" + data.permissions[j]); - } - console.info('getApplicationInfo moduleSourceDirs length [' + data.moduleSourceDirs.length + ']'); - for (var j = 0; j < data.moduleSourceDirs.length; j++) { - console.info("moduleSourceDirs[" + j + "]:" + data.moduleSourceDirs[j]); - } - console.info('getApplicationInfo moduleInfos length [' + data.moduleInfos.length + ']'); - for (var j = 0; j < data.moduleInfos.length; j++) { - console.info("moduleInfos[" + j + "]moduleName:" + data.moduleInfos[j].moduleName); - console.info("moduleInfos[" + j + "]moduleSourceDir:" + data.moduleInfos[j].moduleSourceDir); - } - console.info("entryDir:" + data.entryDir); - console.info("codePath:" + data.codePath); - console.info("dataDir:" + data.dataDir); - console.info("dataBaseDir:" + data.dataBaseDir); - console.info("cacheDir:" + data.cacheDir); +let bundleName = "com.example.myapplication"; +let bundleFlags = 0; +let userId = 100; +bundle.getApplicationInfo(bundleName, bundleFlags, userId) +.then((data) => { + console.info('Operation successful. Data: ' + JSON.stringify(data)); +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); }) ``` @@ -87,152 +64,69 @@ getApplicationInfo(bundleName: string, bundleFlags: number, userId: number, call Obtains the application information of the specified user based on a given bundle name in asynchronous mode. This method uses a callback to return the result. -**Permission required** +**Required permissions** ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED or ohos.permission.GET\_BUNDLE\_INFO **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | ------------------------------- | ---- | ------------------------------------------------------------ | -| bundleName | string | Yes| Bundle name of the application.| -| bundleFlags | number | Yes| Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| -| userId | number | Yes| User ID.| -| callback | AsyncCallback\ | Yes| Callback used to return the application information.| +| bundleName | string | Yes | Bundle name of the application. | +| bundleFlags | number | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | Yes | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | +| callback | AsyncCallback\ | Yes | Callback used to return the application information. | **Example** ```js -bundle.getApplicationInfo('com.example.myapplicationInstall', 8, 0, OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.info("name: for begin"); - console.info("name:" + data.name); - console.info("bundleName:" + data.bundleName); - console.info("description:" + data.description); - console.info("descriptionId:" + data.descriptionId); - console.info("iconPath:" + data.iconPath); - console.info("iconId:" + data.iconId); - console.info("label:" + data.label); - console.info("labelId:" + data.labelId); - console.info("deviceId:" + data.deviceId); - console.info("signatureKey:" + data.signatureKey); - console.info("process:" + data.process); - console.info("isSystemApp:" + data.isSystemApp); - console.info("isLauncherApp:" + data.isLauncherApp); - console.info("supportedModes:" + data.supportedModes); - - console.info('getApplicationInfo permissions length [' + data.permissions.length + ']'); - for (var j = 0; j < data.permissions.length; j++) { - console.info("permissions[" + j + "]:" + data.permissions[j]); - } - console.info('getApplicationInfo moduleSourceDirs length [' + data.moduleSourceDirs.length + ']'); - for (var j = 0; j < data.moduleSourceDirs.length; j++) { - console.info("moduleSourceDirs[" + j + "]:" + data.moduleSourceDirs[j]); - } - console.info('getApplicationInfo moduleInfos length [' + data.moduleInfos.length + ']'); - for (var j = 0; j < data.moduleInfos.length; j++) { - console.info("moduleInfos[" + j + "]moduleName:" + data.moduleInfos[j].moduleName); - console.info("moduleInfos[" + j + "]moduleSourceDir:" + data.moduleInfos[j].moduleSourceDir); - } - console.info("entryDir:" + data.entryDir); - console.info("codePath:" + data.codePath); - console.info("dataDir:" + data.dataDir); - console.info("dataBaseDir:" + data.dataBaseDir); - console.info("cacheDir:" + data.cacheDir); -} +let bundleName = "com.example.myapplication"; +let bundleFlags = 0; +let userId = 100; +bundle.getApplicationInfo(bundleName, bundleFlags, userId, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); + }) ``` ## bundle.getAllBundleInfo -getAllBundleInfo(bundleFlag: BundleFlag): Promise> +getAllBundleInfo(bundleFlag: BundleFlag, userId?: number): Promise> Obtains the information of all available bundles in the system in asynchronous mode. This method uses a promise to return the result. -**Permission required** +**Required permissions** ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | ---------- | ---- | ----------------------------------------------------------- | -| bundleFlag | BundleFlag | Yes| Type of information that will be returned.
**0**: The default bundle information will be returned.
**1**: The bundle information containing the ability information will be returned.| +| bundleFlag | BundleFlag | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | No | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | **Return value** -| Type| Description| +| Type | Description | | --------------------------- | ----------------------------------- | | Promise> | Promise used to return the information of all available bundles.| **Example** ```js -bundle.getAllBundleInfo(0).then((data) => { - for (var i = 0; i < data.length; i++) { - console.info("index[" + i + "].name: for begin"); - console.info("index[" + i + "].name:" + data[i].name); - console.info("index[" + i + "].label:" + data[i].label); - console.info("index[" + i + "].description:" + data[i].description); - console.info("index[" + i + "].vendor:" + data[i].vendor); - console.info("index[" + i + "].versionCode:" + data[i].versionCode); - console.info("index[" + i + "].versionName:" + data[i].versionName); - console.info("index[" + i + "].jointUserId:" + data[i].jointUserId); - console.info("index[" + i + "].minSdkVersion:" + data[i].minSdkVersion); - console.info("index[" + i + "].maxSdkVersion:" + data[i].maxSdkVersion); - console.info("index[" + i + "].mainEntry:" + data[i].mainEntry); - console.info("index[" + i + "].cpuAbi:" + data[i].cpuAbi); - console.info("index[" + i + "].appId:" + data[i].appId); - console.info("index[" + i + "].compatibleVersion:" + data[i].compatibleVersion); - console.info("index[" + i + "].targetVersion:" + data[i].targetVersion); - console.info("index[" + i + "].releaseType:" + data[i].releaseType); - console.info("index[" + i + "].uid:" + data[i].uid); - console.info("index[" + i + "].gid:" + data[i].gid); - console.info("index[" + i + "].seInfo:" + data[i].seInfo); - console.info("index[" + i + "].entryModuleName:" + data[i].entryModuleName); - console.info("index[" + i + "].isKeepAlive:" + data[i].isKeepAlive); - console.info("index[" + i + "].isNativeApp:" + data[i].isNativeApp); - console.info("index[" + i + "].installTime:" + data[i].installTime); - console.info("index[" + i + "].updateTime:" + data[i].updateTime); - console.info("index[" + i + "].appInfo.name:" + data[i].applicationInfo.name); - console.info("index[" + i + "].appInfo.bundleName:" + data[i].applicationInfo.bundleName); - console.info('getAllBundleInfo reqPermissions length [' + data[i].reqPermissions.length + ']'); - for (var j = 0; j < data[i].reqPermissions.length; j++) { - console.info("index[" + i + "]reqPermissions[" + j + "]:" + data[i].reqPermissions[j]); - } - console.info('getAllBundleInfo defPermissions length [' + data[i].defPermissions.length + ']'); - for (var j = 0; j < data[i].defPermissions.length; j++) { - console.info("index[" + i + "]defPermissions[" + j + "]:" + data[i].defPermissions[j]); - } - - console.info('getAllBundleInfo hapModuleNames length [' + data[i].hapModuleNames.length + ']'); - for (var j = 0; j < data[i].hapModuleNames.length; j++) { - console.info("index[" + i + "]hapModuleNames[" + j + "]:" + data[i].hapModuleNames[j]); - } - console.info('getAllBundleInfo moduleNames length [' + data[i].moduleNames.length + ']'); - for (var j = 0; j < data[i].moduleNames.length; j++) { - console.info("index[" + i + "]moduleNames[" + j + "]:" + data[i].moduleNames[j]); - } - console.info('getAllBundleInfo modulePublicDirs length [' + data[i].modulePublicDirs.length + ']'); - for (var j = 0; j < data[i].modulePublicDirs.length; j++) { - console.info("index[" + i + "]modulePublicDirs[" + j + "]:" + data[i].modulePublicDirs[j]); - } - console.info('getAllBundleInfo moduleDirs length [' + data[i].moduleDirs.length + ']'); - for (var j = 0; j < data[i].moduleDirs.length; j++) { - console.info("index[" + i + "]moduleDirs[" + j + "]:" + data[i].moduleDirs[j]); - } - console.info('getAllBundleInfo moduleResPaths length [' + data[i].moduleResPaths.length + ']'); - for (var j = 0; j < data[i].moduleResPaths.length; j++) { - console.info("index[" + i + "]moduleResPaths[" + j + "]:" + data[i].moduleResPaths[j]); - } - console.info('getAllBundleInfo abilityInfo length [' + data[i].abilityInfos.length + ']'); - for (var j = 0; j < data[i].abilityInfos.length; j++) { - console.info("index[" + i + "]abilityInfos[" + j + "]name:" + data[i].abilityInfos[j].name); - console.info("index[" + i + "]abilityInfos[" + j + "]package:" + data[i].abilityInfos[j].package); - } - } +let bundleFlag = 0; +let userId = 100; +bundle.getAllBundleInfo(bundleFlag, userId) +.then((data) => { + console.info('Operation successful. Data: ' + JSON.stringify(data)); +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); }) ``` @@ -244,177 +138,103 @@ getAllBundleInfo(bundleFlag: BundleFlag, callback: AsyncCallback**0**: The default bundle information will be returned.
**1**: The bundle information containing the ability information will be returned.| -| callback | AsyncCallback> | Yes| Callback used to return the information of all available bundles.| +| bundleFlag | BundleFlag | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| callback | AsyncCallback> | Yes | Callback used to return the information of all available bundles. | **Example** ```js -bundle.getAllBundleInfo(0, OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.info('xxx getAllBundleInfo data length [' + data.length + ']'); - for (var i = 0; i < data.length; i++) { - console.info("index[" + i + "].name: for begin"); - console.info("index[" + i + "].name:" + data[i].name); - console.info("index[" + i + "].label:" + data[i].label); - console.info("index[" + i + "].description:" + data[i].description); - console.info("index[" + i + "].vendor:" + data[i].vendor); - console.info("index[" + i + "].versionCode:" + data[i].versionCode); - console.info("index[" + i + "].versionName:" + data[i].versionName); - console.info("index[" + i + "].jointUserId:" + data[i].jointUserId); - console.info("index[" + i + "].minSdkVersion:" + data[i].minSdkVersion); - console.info("index[" + i + "].maxSdkVersion:" + data[i].maxSdkVersion); - console.info("index[" + i + "].mainEntry:" + data[i].mainEntry); - console.info("index[" + i + "].cpuAbi:" + data[i].cpuAbi); - console.info("index[" + i + "].appId:" + data[i].appId); - console.info("index[" + i + "].compatibleVersion:" + data[i].compatibleVersion); - console.info("index[" + i + "].targetVersion:" + data[i].targetVersion); - console.info("index[" + i + "].releaseType:" + data[i].releaseType); - console.info("index[" + i + "].uid:" + data[i].uid); - console.info("index[" + i + "].gid:" + data[i].gid); - console.info("index[" + i + "].seInfo:" + data[i].seInfo); - console.info("index[" + i + "].entryModuleName:" + data[i].entryModuleName); - console.info("index[" + i + "].isKeepAlive:" + data[i].isKeepAlive); - console.info("index[" + i + "].isNativeApp:" + data[i].isNativeApp); - console.info("index[" + i + "].installTime:" + data[i].installTime); - console.info("index[" + i + "].updateTime:" + data[i].updateTime); - console.info("index[" + i + "].appInfo.name:" + data[i].applicationInfo.name); - console.info("index[" + i + "].appInfo.bundleName:" + data[i].applicationInfo.bundleName); - console.info('getAllBundleInfo reqPermissions length [' + data[i].reqPermissions.length + ']'); - for (var j = 0; j < data[i].reqPermissions.length; j++) { - console.info("index[" + i + "]reqPermissions[" + j + "]:" + data[i].reqPermissions[j]); - } - console.info('getAllBundleInfo defPermissions length [' + data[i].defPermissions.length + ']'); - for (var j = 0; j < data[i].defPermissions.length; j++) { - console.info("index[" + i + "]defPermissions[" + j + "]:" + data[i].defPermissions[j]); - } +let bundleFlag = 0; +bundle.getAllBundleInfo(bundleFlag, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); + }) +``` - console.info('getAllBundleInfo hapModuleNames length [' + data[i].hapModuleNames.length + ']'); - for (var j = 0; j < data[i].hapModuleNames.length; j++) { - console.info("index[" + i + "]hapModuleNames[" + j + "]:" + data[i].hapModuleNames[j]); - } - console.info('getAllBundleInfo moduleNames length [' + data[i].moduleNames.length + ']'); - for (var j = 0; j < data[i].moduleNames.length; j++) { - console.info("index[" + i + "]moduleNames[" + j + "]:" + data[i].moduleNames[j]); - } - console.info('getAllBundleInfo modulePublicDirs length [' + data[i].modulePublicDirs.length + ']'); - for (var j = 0; j < data[i].modulePublicDirs.length; j++) { - console.info("index[" + i + "]modulePublicDirs[" + j + "]:" + data[i].modulePublicDirs[j]); - } - console.info('getAllBundleInfo moduleDirs length [' + data[i].moduleDirs.length + ']'); - for (var j = 0; j < data[i].moduleDirs.length; j++) { - console.info("index[" + i + "]moduleDirs[" + j + "]:" + data[i].moduleDirs[j]); - } - console.info('getAllBundleInfo moduleResPaths length [' + data[i].moduleResPaths.length + ']'); - for (var j = 0; j < data[i].moduleResPaths.length; j++) { - console.info("index[" + i + "]moduleResPaths[" + j + "]:" + data[i].moduleResPaths[j]); - } - console.info('getAllBundleInfo abilityInfo length [' + data[i].abilityInfos.length + ']'); - for (var j = 0; j < data[i].abilityInfos.length; j++) { - console.info("index[" + i + "]abilityInfos[" + j + "]name:" + data[i].abilityInfos[j].name); - console.info("index[" + i + "]abilityInfos[" + j + "]package:" + data[i].abilityInfos[j].package); - } - } -} + +## bundle.getAllBundleInfo + +getAllBundleInfo(bundleFlag: BundleFlag, userId: number, callback: AsyncCallback>): void + +Obtains the information of all available bundles in the system in asynchronous mode. This method uses a callback to return the result. + +**Required permissions** + +ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED + +**Parameters** + +| Name | Type | Mandatory| Description | +| ---------- | --------------------------------- | ---- | ------------------------------------------------------------ | +| bundleFlag | BundleFlag | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | Yes | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | +| callback | AsyncCallback> | Yes | Callback used to return the information of all available bundles. | + +**Example** + +```js +let bundleFlag = 0; +let userId = 100; +bundle.getAllBundleInfo(bundleFlag, userId, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); + }) ``` ## bundle.getBundleInfo -getBundleInfo(bundleName: string, bundleFlags: number): Promise\ +getBundleInfo(bundleName: string, bundleFlags: number, options?: BundleOptions): Promise\ Obtains the bundle information based on a given bundle name in asynchronous mode. This method uses a promise to return the result. -**Permission required** +**Required permissions** ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED or ohos.permission.GET\_BUNDLE\_INFO **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | ------ | ---- | ------------------------------------------------------------ | -| bundleName | string | Yes| Bundle name.| -| bundleFlags | number | Yes| Type of information that will be returned.
**0**: The default bundle information will be returned.
**1**: The bundle information containing the ability information will be returned.| +| bundleName | string | Yes | Bundle name. | +| bundleFlags | number | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| options | BundleOptions | No | Includes **userId** and **networkId**. | **Return value** -| Type| Description| +| Type | Description | | -------------------- | ------------------------------------------ | | Promise\ | Promise used to return the bundle information.| **Example** ```js -bundle.getBundleInfo('com.example.myapplicationInstall', 1).then((data) => { - console.info("name:" + data.name); - console.info("label:" + data.label); - console.info("description:" + data.description); - console.info("vendor:" + data.vendor); - console.info("versionCode:" + data.versionCode); - console.info("versionName:" + data.versionName); - console.info("jointUserId:" + data.jointUserId); - console.info("minSdkVersion:" + data.minSdkVersion); - console.info("maxSdkVersion:" + data.maxSdkVersion); - console.info("mainEntry:" + data.mainEntry); - console.info("cpuAbi:" + data.cpuAbi); - console.info("appId:" + data.appId); - console.info("compatibleVersion:" + data.compatibleVersion); - console.info("targetVersion:" + data.targetVersion); - console.info("releaseType:" + data.releaseType); - console.info("uid:" + data.uid); - console.info("gid:" + data.gid); - console.info("seInfo:" + data.seInfo); - console.info("entryModuleName:" + data.entryModuleName); - console.info("isKeepAlive:" + data.isKeepAlive); - console.info("isNativeApp:" + data.isNativeApp); - console.info("installTime:" + data.installTime); - console.info("updateTime:" + data.updateTime); - console.info("appInfo.name:" + data.applicationInfo.name); - console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); - console.info('getBundleInfo reqPermissions length [' + data.reqPermissions.length + ']'); - for (var j = 0; j < data.reqPermissions.length; j++) { - console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); - } - console.info('getBundleInfo defPermissions length [' + data.defPermissions.length + ']'); - for (var j = 0; j < data.defPermissions.length; j++) { - console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); - } - - console.info('getBundleInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); - for (var j = 0; j < data.hapModuleNames.length; j++) { - console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); - } - console.info('getBundleInfo moduleNames length [' + data.moduleNames.length + ']'); - for (var j = 0; j < data.moduleNames.length; j++) { - console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); - } - console.info('getBundleInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); - for (var j = 0; j < data.modulePublicDirs.length; j++) { - console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); - } - console.info('getBundleInfo moduleDirs length [' + data.moduleDirs.length + ']'); - for (var j = 0; j < data.moduleDirs.length; j++) { - console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); - } - console.info('getBundleInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); - for (var j = 0; j < data.moduleResPaths.length; j++) { - console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); - } - console.info('getBundleInfo abilityInfo length [' + data.abilityInfos.length + ']'); - for (var j = 0; j < data.abilityInfos.length; j++) { - console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); - console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); - } +let bundleName = "com.example.myapplication"; +let bundleFlags = 1; +let options = { + "userId" : 100, + "networkId" : null +}; +bundle.getBundleInfo(bundleName, bundleFlags, options) +.then((data) => { + console.info('Operation successful. Data: ' + JSON.stringify(data)); +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); }) ``` @@ -426,87 +246,70 @@ getBundleInfo(bundleName: string, bundleFlags: number, callback: AsyncCallback\< Obtains the bundle information based on a given bundle name in asynchronous mode. This method uses a callback to return the result. -**Permission required** +**Required permissions** ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED or ohos.permission.GET\_BUNDLE\_INFO **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | -------------------------- | ---- | ------------------------------------------------------------ | -| bundleName | string | Yes| Bundle name.| -| bundleFlags | number | Yes| Type of information that will be returned.
**0**: The default bundle information will be returned.
**1**: The bundle information containing the ability information will be returned.| -| callback | AsyncCallback\ | Yes| Callback used to return the bundle information.| +| bundleName | string | Yes | Bundle name. | +| bundleFlags | number | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| callback | AsyncCallback\ | Yes | Callback used to return the bundle information. | **Example** ```js -bundle.getBundleInfo('com.example.myapplicationInstall', 1, OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.info("name:" + data.name); - console.info("label:" + data.label); - console.info("description:" + data.description); - console.info("vendor:" + data.vendor); - console.info("versionCode:" + data.versionCode); - console.info("versionName:" + data.versionName); - console.info("jointUserId:" + data.jointUserId); - console.info("minSdkVersion:" + data.minSdkVersion); - console.info("maxSdkVersion:" + data.maxSdkVersion); - console.info("mainEntry:" + data.mainEntry); - console.info("cpuAbi:" + data.cpuAbi); - console.info("appId:" + data.appId); - console.info("compatibleVersion:" + data.compatibleVersion); - console.info("targetVersion:" + data.targetVersion); - console.info("releaseType:" + data.releaseType); - console.info("uid:" + data.uid); - console.info("gid:" + data.gid); - console.info("seInfo:" + data.seInfo); - console.info("entryModuleName:" + data.entryModuleName); - console.info("isKeepAlive:" + data.isKeepAlive); - console.info("isNativeApp:" + data.isNativeApp); - console.info("installTime:" + data.installTime); - console.info("updateTime:" + data.updateTime); - console.info("appInfo.name:" + data.applicationInfo.name); - console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); - console.info('getBundleInfo reqPermissions length [' + data.reqPermissions.length + ']'); - for (var j = 0; j < data.reqPermissions.length; j++) { - console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); - } - console.info('getBundleInfo defPermissions length [' + data.defPermissions.length + ']'); - for (var j = 0; j < data.defPermissions.length; j++) { - console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); - } - - console.info('getBundleInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); - for (var j = 0; j < data.hapModuleNames.length; j++) { - console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); - } - console.info('getBundleInfo moduleNames length [' + data.moduleNames.length + ']'); - for (var j = 0; j < data.moduleNames.length; j++) { - console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); - } - console.info('getBundleInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); - for (var j = 0; j < data.modulePublicDirs.length; j++) { - console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); - } - console.info('getBundleInfo moduleDirs length [' + data.moduleDirs.length + ']'); - for (var j = 0; j < data.moduleDirs.length; j++) { - console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); - } - console.info('getBundleInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); - for (var j = 0; j < data.moduleResPaths.length; j++) { - console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); - } - console.info('getBundleInfo abilityInfo length [' + data.abilityInfos.length + ']'); - for (var j = 0; j < data.abilityInfos.length; j++) { - console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); - console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); - } -} +let bundleName = "com.example.myapplication"; +let bundleFlags = 1; +bundle.getBundleInfo(bundleName, bundleFlags, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); +}) ``` +## bundle.getBundleInfo + +getBundleInfo(bundleName: string, bundleFlags: number, options: BundleOptions, callback: AsyncCallback\): void + +Obtains the bundle information based on a given bundle name in asynchronous mode. This method uses a callback to return the result. + +**Required permissions** + +ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED or ohos.permission.GET\_BUNDLE\_INFO + +**Parameters** + +| Name | Type | Mandatory| Description | +| ----------- | -------------------------- | ---- | ------------------------------------------------------------ | +| bundleName | string | Yes | Bundle name. | +| bundleFlags | number | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| options | BundleOptions | Yes | Includes **userId** and **networkId**. | +| callback | AsyncCallback\ | Yes | Callback used to return the bundle information. | + +**Example** + +```js +let bundleName = "com.example.myapplication"; +let bundleFlags = 1; +let options = { + "userId" : 100, + "networkId" : null +}; +bundle.getBundleInfo(bundleName, bundleFlags, options, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); +}) +``` + ## bundle.getAllApplicationInfo @@ -514,64 +317,33 @@ getAllApplicationInfo(bundleFlags: number, userId: number): Promise**0**: The default application information will be returned.
**8**: The application information containing the permission information will be returned.| -| userId | number | Yes| User ID.| +| bundleFlags | number | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | Yes | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | **Return value** -| Type| Description| +| Type | Description | | -------------------------------- | ------------------------------------------------ | | Promise> | Promise used to return the application information.| **Example** ```js -bundle.getAllApplicationInfo(8, 0).then((data) => { - console.info('xxx getAllApplicationInfo data length [' + data.length + ']'); - for (var i = 0; i < data.length; i++) { - console.info("index[" + i + "].name: for begin"); - console.info("index[" + i + "].name:" + data[i].name); - console.info("index[" + i + "].bundleName:" + data[i].bundleName); - console.info("index[" + i + "].description:" + data[i].description); - console.info("index[" + i + "].descriptionId:" + data[i].descriptionId); - console.info("index[" + i + "].iconPath:" + data[i].iconPath); - console.info("index[" + i + "].iconId:" + data[i].iconId); - console.info("index[" + i + "].label:" + data[i].label); - console.info("index[" + i + "].labelId:" + data[i].labelId); - console.info("index[" + i + "].deviceId:" + data[i].deviceId); - console.info("index[" + i + "].signatureKey:" + data[i].signatureKey); - console.info("index[" + i + "].process:" + data[i].process); - console.info("index[" + i + "].isSystemApp:" + data[i].isSystemApp); - console.info("index[" + i + "].isLauncherApp:" + data[i].isLauncherApp); - console.info("index[" + i + "].supportedModes:" + data[i].supportedModes); - - console.info('getAllApplicationInfo Async permissions length [' + data[i].permissions.length + ']'); - for (var j = 0; j < data[i].permissions.length; j++) { - console.info("index[" + i + "]permissions[" + j + "]:" + data[i].permissions[j]); - } - console.info('getAllApplicationInfo Async moduleSourceDirs length [' + data[i].moduleSourceDirs.length + ']'); - for (var j = 0; j < data[i].moduleSourceDirs.length; j++) { - console.info("index[" + i + "]moduleSourceDirs[" + j + "]:" + data[i].moduleSourceDirs[j]); - } - console.info('getAllApplicationInfo Async moduleInfos length [' + data[i].moduleInfos.length + ']'); - for (var j = 0; j < data[i].moduleInfos.length; j++) { - console.info("index[" + i + "]moduleInfos[" + j + "]moduleName:" + data[i].moduleInfos[j].moduleName); - console.info("index[" + i + "]moduleInfos[" + j + "]moduleSourceDir:" + data[i].moduleInfos[j].moduleSourceDir); - } - console.info("index[" + i + "].entryDir:" + data[i].entryDir); - console.info("index[" + i + "].codePath:" + data[i].codePath); - console.info("index[" + i + "].dataDir:" + data[i].dataDir); - console.info("index[" + i + "].dataBaseDir:" + data[i].dataBaseDir); - console.info("index[" + i + "].cacheDir:" + data[i].cacheDir); - } +let bundleFlags = 8; +let userId = 100; +bundle.getAllApplicationInfo(bundleFlags, userId) +.then((data) => { + console.info('Operation successful. Data: ' + JSON.stringify(data)); +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); }) ``` @@ -583,62 +355,30 @@ getAllApplicationInfo(bundleFlags: number, userId: number, callback: AsyncCallba Obtains the information about all installed applications of the specified user. This method uses a callback to return the result. -**Permission required** +**Required permissions** -ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED or ohos.permission.GET\_BUNDLE\_INFO +ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | -------------------------------------- | ---- | ------------------------------------------------------ | -| bundleFlags | number | Yes| Type of information that will be returned.
**0**: The default application information will be returned.
**8**: The application information containing the permission information will be returned.| -| userId | number | Yes| User ID.| -| callback | AsyncCallback> | Yes| Callback used to return the application information.| +| bundleFlags | number | Yes | Type of information that will be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | Yes | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | +| callback | AsyncCallback> | Yes | Callback used to return the application information. | **Example** ```js -bundle.getAllApplicationInfo(8, 0, OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.info('xxx getAllApplicationInfo data length [' + data.length + ']'); - for (var i = 0; i < data.length; i++) { - console.info("index[" + i + "].name: for begin"); - console.info("index[" + i + "].name:" + data[i].name); - console.info("index[" + i + "].bundleName:" + data[i].bundleName); - console.info("index[" + i + "].description:" + data[i].description); - console.info("index[" + i + "].descriptionId:" + data[i].descriptionId); - console.info("index[" + i + "].iconPath:" + data[i].iconPath); - console.info("index[" + i + "].iconId:" + data[i].iconId); - console.info("index[" + i + "].label:" + data[i].label); - console.info("index[" + i + "].labelId:" + data[i].labelId); - console.info("index[" + i + "].deviceId:" + data[i].deviceId); - console.info("index[" + i + "].signatureKey:" + data[i].signatureKey); - console.info("index[" + i + "].process:" + data[i].process); - console.info("index[" + i + "].isSystemApp:" + data[i].isSystemApp); - console.info("index[" + i + "].isLauncherApp:" + data[i].isLauncherApp); - console.info("index[" + i + "].supportedModes:" + data[i].supportedModes); - - console.info('getAllApplicationInfo Async permissions length [' + data[i].permissions.length + ']'); - for (var j = 0; j < data[i].permissions.length; j++) { - console.info("index[" + i + "]permissions[" + j + "]:" + data[i].permissions[j]); - } - console.info('getAllApplicationInfo Async moduleSourceDirs length [' + data[i].moduleSourceDirs.length + ']'); - for (var j = 0; j < data[i].moduleSourceDirs.length; j++) { - console.info("index[" + i + "]moduleSourceDirs[" + j + "]:" + data[i].moduleSourceDirs[j]); - } - console.info('getAllApplicationInfo Async moduleInfos length [' + data[i].moduleInfos.length + ']'); - for (var j = 0; j < data[i].moduleInfos.length; j++) { - console.info("index[" + i + "]moduleInfos[" + j + "]moduleName:" + data[i].moduleInfos[j].moduleName); - console.info("index[" + i + "]moduleInfos[" + j + "]moduleSourceDir:" + data[i].moduleInfos[j].moduleSourceDir); - } - console.info("index[" + i + "].entryDir:" + data[i].entryDir); - console.info("index[" + i + "].codePath:" + data[i].codePath); - console.info("index[" + i + "].dataDir:" + data[i].dataDir); - console.info("index[" + i + "].dataBaseDir:" + data[i].dataBaseDir); - console.info("index[" + i + "].cacheDir:" + data[i].cacheDir); - } -} +let bundleFlags = 8; +let userId = 100; +bundle.getAllApplicationInfo(bundleFlags, userId, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); +}) ``` @@ -649,101 +389,38 @@ queryAbilityByWant(want: Want, bundleFlags: number, userId?: number): Promise**0**: The default ability information will be returned.
**2**: The ability information containing the permission information will be returned.
**4**: The ability information containing the application information will be returned.| -| userId | number | No| User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0.| +| want | Want | Yes | Want that contains the bundle name. | +| bundleFlags | number | Yes | Ability information to be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | No | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | **Return value** -| Type| Description| +| Type | Description | | ---------------------------- | ---------------------------- | | Promise\>| Promise used to return the ability information.| **Example** ```js -bundle.queryAbilityByWant({ - want: { - action: "action.system.home", - entities: ["entity.system.home"], - elementName: { - deviceId: "0", - bundleName: "com.example.myapplicationInstall", - abilityName: "com.example.myapplication.MainAbility", - }, - } -}, 1, 0, -}).then((data) => { - console.info("name:" + data.name); - console.info("label:" + data.label); - console.info("description:" + data.description); - console.info("iconPath:" + data.iconPath); - console.info("visible:" + data.visible); - console.info("kind:" + data.kind); - console.info("uri:" + data.uri); - console.info("process:" + data.process); - console.info("package:" + data.package); - console.info("bundleName:" + data.bundleName); - console.info("moduleName:" + data.moduleName); - console.info("applicationName:" + data.applicationName); - console.info("deviceId:" + data.deviceId); - console.info("codePath:" + data.codePath); - console.info("resourcePath:" + data.resourcePath); - console.info("libPath:" + data.libPath); - - console.info('queryAbilityInfo permissions length [' + data.permissions.length + ']'); - for (var j = 0; j < data.permissions.length; j++) { - console.info("permissions[" + j + "]:" + data.permissions[j]); - } - console.info('queryAbilityInfo deviceTypes length [' + data.deviceTypes.length + ']'); - for (var j = 0; j < data.deviceTypes.length; j++) { - console.info("deviceTypes[" + j + "]:" + data.deviceTypes[j]); - } - console.info('queryAbilityInfo deviceCapabilities length [' + data.deviceCapabilities.length + ']'); - for (var j = 0; j < data.deviceCapabilities.length; j++) { - console.info("deviceCapabilities[" + j + "]:" + data.deviceCapabilities[j]); - } - console.info("appInfo.name:" + data.applicationInfo.name); - console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); - // ability type: 0:UNKNOWN, 1:PAGE, 2:SERVICE, 3:DATA - console.info("type:" + data.type); - // orientation: 0:UNSPECIFIED, 1:LANDSCAPE, 2:PORTRAIT, 3:FOLLOWRECENT, - console.info("orientation:" + data.orientation); - // launchMode: 0:SINGLETON, 1:SINGLETOP, 2:STANDARD - console.info("launchMode:" + data.launchMode); - - // the enum of AbilityType - console.info("AbilityType:" + bundle.AbilityType.UNKNOWN); - console.info("AbilityType:" + bundle.AbilityType.PAGE); - console.info("AbilityType:" + bundle.AbilityType.SERVICE); - console.info("AbilityType:" + bundle.AbilityType.DATA); - if (data.type == bundle.AbilityType.PAGE) { - console.info("this AbilityType is PAGE"); - } - // the enum of DisplayOrientation - console.info("DisplayOrientation:" + bundle.DisplayOrientation.UNSPECIFIED); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.LANDSCAPE); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.PORTRAIT); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.FOLLOWRECENT); - if (data.orientation == bundle.DisplayOrientation.UNSPECIFIED) { - console.info("this DisplayOrientation is UNSPECIFIED"); - } - // the enum of LaunchMode - console.info("LaunchMode:" + bundle.LaunchMode.SINGLETON); - console.info("LaunchMode:" + bundle.LaunchMode.SINGLETOP); - console.info("LaunchMode:" + bundle.LaunchMode.STANDARD); - if (data.launchMode == bundle.LaunchMode.STANDARD) { - console.info("this LaunchMode is STANDARD"); - } - +let bundleFlags = 0; +let userId = 100; +let want = { + bundleName : "com.example.myapplication", + abilityName : "com.example.myapplication.MainAbility" +}; +bundle.queryAbilityByWant(want, bundleFlags, userId) +.then((data) => { + console.info('Operation successful. Data: ' + JSON.stringify(data)); +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); }) ``` @@ -757,93 +434,29 @@ Obtains the ability information of the specified user based on a given want. Thi **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | ---------------------------------- | ---- | ------------------------------------------------------------ | -| want | Want | Yes| Want that contains the bundle name.| -| bundleFlags | number | Yes| Type of information that will be returned.
**0**: The default ability information will be returned.
**2**: The ability information containing the permission information will be returned.
**4**: The ability information containing the application information will be returned.| -| userId | number | Yes| User ID.| -| callback | AsyncCallback> | Yes| Callback used to return the ability information.| +| want | Want | Yes | Want that contains the bundle name. | +| bundleFlags | number | Yes | Ability information to be returned. The default value is **0**. The value must be greater than or equal to 0.| +| userId | number | Yes | User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0. | +| callback | AsyncCallback> | Yes | Callback used to return the ability information. | **Example** ```js -bundle.queryAbilityByWant( - { - want: { - action: "action.system.home", - entities: ["entity.system.home"], - elementName: { - deviceId: "0", - bundleName: "com.example.myapplicationInstall", - abilityName: "com.example.myapplication.MainAbility", - }, - } - }, 1, 0, - }, OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.info("name:" + data.name); - console.info("label:" + data.label); - console.info("description:" + data.description); - console.info("iconPath:" + data.iconPath); - console.info("visible:" + data.visible); - console.info("kind:" + data.kind); - console.info("uri:" + data.uri); - console.info("process:" + data.process); - console.info("package:" + data.package); - console.info("bundleName:" + data.bundleName); - console.info("moduleName:" + data.moduleName); - console.info("applicationName:" + data.applicationName); - console.info("deviceId:" + data.deviceId); - console.info("codePath:" + data.codePath); - console.info("resourcePath:" + data.resourcePath); - console.info("libPath:" + data.libPath); - - console.info('queryAbilityInfo permissions length [' + data.permissions.length + ']'); - for (var j = 0; j < data.permissions.length; j++) { - console.info("permissions[" + j + "]:" + data.permissions[j]); - } - console.info('queryAbilityInfo deviceTypes length [' + data.deviceTypes.length + ']'); - for (var j = 0; j < data.deviceTypes.length; j++) { - console.info("deviceTypes[" + j + "]:" + data.deviceTypes[j]); - } - console.info('queryAbilityInfo deviceCapabilities length [' + data.deviceCapabilities.length + ']'); - for (var j = 0; j < data.deviceCapabilities.length; j++) { - console.info("deviceCapabilities[" + j + "]:" + data.deviceCapabilities[j]); - } - console.info("appInfo.name:" + data.applicationInfo.name); - console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); - // ability type: 0:UNKNOWN, 1:PAGE, 2:SERVICE, 3:DATA - console.info("type:" + data.type); - // orientation: 0:UNSPECIFIED, 1:LANDSCAPE, 2:PORTRAIT, 3:FOLLOWRECENT, - console.info("orientation:" + data.orientation); - // launchMode: 0:SINGLETON, 1:SINGLETOP, 2:STANDARD - console.info("launchMode:" + data.launchMode); - - // the enum of AbilityType - console.info("AbilityType:" + bundle.AbilityType.UNKNOWN); - console.info("AbilityType:" + bundle.AbilityType.PAGE); - console.info("AbilityType:" + bundle.AbilityType.SERVICE); - console.info("AbilityType:" + bundle.AbilityType.DATA); - if (data.type == bundle.AbilityType.PAGE) { - console.info("this AbilityType is PAGE"); - } - // the enum of DisplayOrientation - console.info("DisplayOrientation:" + bundle.DisplayOrientation.UNSPECIFIED); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.LANDSCAPE); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.PORTRAIT); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.FOLLOWRECENT); - if (data.orientation == bundle.DisplayOrientation.UNSPECIFIED) { - console.info("this DisplayOrientation is UNSPECIFIED"); - } - // the enum of LaunchMode - console.info("LaunchMode:" + bundle.LaunchMode.SINGLETON); - console.info("LaunchMode:" + bundle.LaunchMode.SINGLETOP); - console.info("LaunchMode:" + bundle.LaunchMode.STANDARD); - if (data.launchMode == bundle.LaunchMode.STANDARD) { - console.info("this LaunchMode is STANDARD"); - } -} +let bundleFlags = 0; +let userId = 100; +let want = { + bundleName : "com.example.myapplication", + abilityName : "com.example.myapplication.MainAbility" +}; +bundle.queryAbilityByWant(want, bundleFlags, userId, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); +}) ``` ## bundle.queryAbilityByWant @@ -854,288 +467,65 @@ Obtains the ability information based on a given want. This method uses an async **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ----------- | ---------------------------------- | ---- | ------------------------------------------------------------ | -| want | Want | Yes| Want that contains the bundle name.| -| bundleFlags | number | Yes| Type of information that will be returned.
**0**: The default ability information will be returned.
**2**: The ability information containing the permission information will be returned.
**4**: The ability information containing the application information will be returned.| -| callback | AsyncCallback> | Yes| Callback used to return the ability information.| - -**Example** - -```js -bundle.queryAbilityByWant( - { - want: { - action: "action.system.home", - entities: ["entity.system.home"], - elementName: { - deviceId: "0", - bundleName: "com.example.myapplicationInstall", - abilityName: "com.example.myapplication.MainAbility", - }, - } - }, 1, - }, OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.info("name:" + data.name); - console.info("label:" + data.label); - console.info("description:" + data.description); - console.info("iconPath:" + data.iconPath); - console.info("visible:" + data.visible); - console.info("kind:" + data.kind); - console.info("uri:" + data.uri); - console.info("process:" + data.process); - console.info("package:" + data.package); - console.info("bundleName:" + data.bundleName); - console.info("moduleName:" + data.moduleName); - console.info("applicationName:" + data.applicationName); - console.info("deviceId:" + data.deviceId); - console.info("codePath:" + data.codePath); - console.info("resourcePath:" + data.resourcePath); - console.info("libPath:" + data.libPath); - - console.info('queryAbilityInfo permissions length [' + data.permissions.length + ']'); - for (var j = 0; j < data.permissions.length; j++) { - console.info("permissions[" + j + "]:" + data.permissions[j]); - } - console.info('queryAbilityInfo deviceTypes length [' + data.deviceTypes.length + ']'); - for (var j = 0; j < data.deviceTypes.length; j++) { - console.info("deviceTypes[" + j + "]:" + data.deviceTypes[j]); - } - console.info('queryAbilityInfo deviceCapabilities length [' + data.deviceCapabilities.length + ']'); - for (var j = 0; j < data.deviceCapabilities.length; j++) { - console.info("deviceCapabilities[" + j + "]:" + data.deviceCapabilities[j]); - } - console.info("appInfo.name:" + data.applicationInfo.name); - console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); - // ability type: 0:UNKNOWN, 1:PAGE, 2:SERVICE, 3:DATA - console.info("type:" + data.type); - // orientation: 0:UNSPECIFIED, 1:LANDSCAPE, 2:PORTRAIT, 3:FOLLOWRECENT, - console.info("orientation:" + data.orientation); - // launchMode: 0:SINGLETON, 1:SINGLETOP, 2:STANDARD - console.info("launchMode:" + data.launchMode); - - // the enum of AbilityType - console.info("AbilityType:" + bundle.AbilityType.UNKNOWN); - console.info("AbilityType:" + bundle.AbilityType.PAGE); - console.info("AbilityType:" + bundle.AbilityType.SERVICE); - console.info("AbilityType:" + bundle.AbilityType.DATA); - if (data.type == bundle.AbilityType.PAGE) { - console.info("this AbilityType is PAGE"); - } - // the enum of DisplayOrientation - console.info("DisplayOrientation:" + bundle.DisplayOrientation.UNSPECIFIED); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.LANDSCAPE); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.PORTRAIT); - console.info("DisplayOrientation:" + bundle.DisplayOrientation.FOLLOWRECENT); - if (data.orientation == bundle.DisplayOrientation.UNSPECIFIED) { - console.info("this DisplayOrientation is UNSPECIFIED"); - } - // the enum of LaunchMode - console.info("LaunchMode:" + bundle.LaunchMode.SINGLETON); - console.info("LaunchMode:" + bundle.LaunchMode.SINGLETOP); - console.info("LaunchMode:" + bundle.LaunchMode.STANDARD); - if (data.launchMode == bundle.LaunchMode.STANDARD) { - console.info("this LaunchMode is STANDARD"); - } -} -``` - -## bundle.getBundleArchiveInfo - -getBundleArchiveInfo(hapFilePath: string, bundleFlags: number): Promise\ - -Obtains the bundle information from a given HAP file in asynchronous mode. This method uses a promise to return the result. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ----------- | ------ | ---- | ------------------------------------------------------------ | -| hapFilePath | string | Yes| Path of the HAP file.| -| bundleFlags | number | Yes| Type of information that will be returned.
**0**: The default bundle information will be returned.
**1**: The bundle information containing the ability information will be returned.| - -**Return value** - -| Type| Description| -| -------------------- | ------------------------------------------ | -| Promise\ | Promise used to return the bundle information.| +| want | Want | Yes | Want that contains the bundle name. | +| bundleFlags | number | Yes | Ability information to be returned. The default value is **0**. The value must be greater than or equal to 0.| +| callback | AsyncCallback> | Yes | Callback used to return the ability information. | **Example** ```js -bundle.getBundleArchiveInfo('/data/test.hap', 1).then((data) => { - console.info("name:" + data.name); - console.info("label:" + data.label); - console.info("description:" + data.description); - console.info("vendor:" + data.vendor); - console.info("versionCode:" + data.versionCode); - console.info("versionName:" + data.versionName); - console.info("jointUserId:" + data.jointUserId); - console.info("minSdkVersion:" + data.minSdkVersion); - console.info("maxSdkVersion:" + data.maxSdkVersion); - console.info("mainEntry:" + data.mainEntry); - console.info("cpuAbi:" + data.cpuAbi); - console.info("appId:" + data.appId); - console.info("compatibleVersion:" + data.compatibleVersion); - console.info("targetVersion:" + data.targetVersion); - console.info("releaseType:" + data.releaseType); - console.info("uid:" + data.uid); - console.info("gid:" + data.gid); - console.info("seInfo:" + data.seInfo); - console.info("entryModuleName:" + data.entryModuleName); - console.info("isKeepAlive:" + data.isKeepAlive); - console.info("isNativeApp:" + data.isNativeApp); - console.info("installTime:" + data.installTime); - console.info("updateTime:" + data.updateTime); - console.info("appInfo.name:" + data.applicationInfo.name); - console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); - console.info('getBundleArchiveInfo reqPermissions length [' + data.reqPermissions.length + ']'); - for (var j = 0; j < data.reqPermissions.length; j++) { - console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); - } - console.info('getBundleArchiveInfo defPermissions length [' + data.defPermissions.length + ']'); - for (var j = 0; j < data.defPermissions.length; j++) { - console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); - } - console.info('getBundleArchiveInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); - for (var j = 0; j < data.hapModuleNames.length; j++) { - console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); - } - console.info('getBundleArchiveInfo moduleNames length [' + data.moduleNames.length + ']'); - for (var j = 0; j < data.moduleNames.length; j++) { - console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); - } - console.info('getBundleArchiveInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); - for (var j = 0; j < data.modulePublicDirs.length; j++) { - console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); - } - console.info('getBundleArchiveInfo moduleDirs length [' + data.moduleDirs.length + ']'); - for (var j = 0; j < data.moduleDirs.length; j++) { - console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); - } - console.info('getBundleArchiveInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); - for (var j = 0; j < data.moduleResPaths.length; j++) { - console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); - } - console.info('getBundleArchiveInfo abilityInfo length [' + data.abilityInfos.length + ']'); - for (var j = 0; j < data.abilityInfos.length; j++) { - console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); - console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); - } +let bundleFlags = 0; +let want = { + bundleName : "com.example.myapplication", + abilityName : "com.example.myapplication.MainAbility" +}; +bundle.queryAbilityByWant(want, bundleFlags, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); }) ``` -## bundle.getBundleArchiveInfo - -getBundleArchiveInfo(hapFilePath: string, bundleFlags: number, callback: AsyncCallback\): void - -Obtains the bundle information from a given HAP file in asynchronous mode. This method uses a callback to return the result. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ----------- | ------------------------- | ---- | ------------------------------------------------------------ | -| hapFilePath | string | Yes| Path of the HAP file.| -| bundleFlags | number | Yes| Type of information that will be returned.
**0**: The default bundle information will be returned.
**1**: The bundle information containing the ability information will be returned.| -| callback | AsyncCallback | Yes| Callback used to return the bundle information.| - -**Example** - -```js -bundle.getBundleArchiveInfo('/data/test.hap', 1, OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.info("name:" + data.name); - console.info("label:" + data.label); - console.info("description:" + data.description); - console.info("vendor:" + data.vendor); - console.info("versionCode:" + data.versionCode); - console.info("versionName:" + data.versionName); - console.info("jointUserId:" + data.jointUserId); - console.info("minSdkVersion:" + data.minSdkVersion); - console.info("maxSdkVersion:" + data.maxSdkVersion); - console.info("mainEntry:" + data.mainEntry); - console.info("cpuAbi:" + data.cpuAbi); - console.info("appId:" + data.appId); - console.info("compatibleVersion:" + data.compatibleVersion); - console.info("targetVersion:" + data.targetVersion); - console.info("releaseType:" + data.releaseType); - console.info("uid:" + data.uid); - console.info("gid:" + data.gid); - console.info("seInfo:" + data.seInfo); - console.info("entryModuleName:" + data.entryModuleName); - console.info("isKeepAlive:" + data.isKeepAlive); - console.info("isNativeApp:" + data.isNativeApp); - console.info("installTime:" + data.installTime); - console.info("updateTime:" + data.updateTime); - console.info("appInfo.name:" + data.applicationInfo.name); - console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); - console.info('getBundleArchiveInfo reqPermissions length [' + data.reqPermissions.length + ']'); - for (var j = 0; j < data.reqPermissions.length; j++) { - console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); - } - console.info('getBundleArchiveInfo defPermissions length [' + data.defPermissions.length + ']'); - for (var j = 0; j < data.defPermissions.length; j++) { - console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); - } - console.info('getBundleArchiveInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); - for (var j = 0; j < data.hapModuleNames.length; j++) { - console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); - } - console.info('getBundleArchiveInfo moduleNames length [' + data.moduleNames.length + ']'); - for (var j = 0; j < data.moduleNames.length; j++) { - console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); - } - console.info('getBundleArchiveInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); - for (var j = 0; j < data.modulePublicDirs.length; j++) { - console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); - } - console.info('getBundleArchiveInfo moduleDirs length [' + data.moduleDirs.length + ']'); - for (var j = 0; j < data.moduleDirs.length; j++) { - console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); - } - console.info('getBundleArchiveInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); - for (var j = 0; j < data.moduleResPaths.length; j++) { - console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); - } - console.info('getBundleArchiveInfo abilityInfo length [' + data.abilityInfos.length + ']'); - for (var j = 0; j < data.abilityInfos.length; j++) { - console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); - console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); - } -} -``` - ## bundle.getBundleInstaller getBundleInstaller(): Promise Obtains the bundle installer in asynchronous mode. This method uses a promise to return the result. +**Required permissions** + +ohos.permission.INSTALL_BUNDLE + **Return value** -| Type| Description| +| Type | Description | | ------------------------ | --------------------------------------------------- | | Promise | Promise used to return the bundle installer.| **Example** ```js -bundle.getBundleInstaller().then((data) => { - data.install(['/data/test.hap'], { - param: { - userId: 0, - installFlag: 1, - isKeepData: false - } - }, OnReceiveinstallEvent); - - function OnReceiveinstallEvent(err, data) { - console.info("name: for begin"); - console.info("install result code:" + data.status); - console.info("install result msg:" + data.statusMessage); - } +let bundleFilePaths = ['/data/test.hap']; +let param = { + userId : 100, + installFlag : 1, + isKeepData : false +}; +bundle.getBundleInstaller() +.then((installerObject) => { + console.info('Operation successful. '); + installerObject.install(bundleFilePaths, param) + .then((data) => { + console.info('Operation successful. Data:' + JSON.stringify(data)); + }).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); + }) +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); }) ``` @@ -1145,141 +535,401 @@ getBundleInstaller(callback: AsyncCallback): void; Obtains the bundle installer in asynchronous mode. This method uses a callback to return the result. +**Required permissions** + +ohos.permission.INSTALL_BUNDLE + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ------------------------------ | ---- | ------------------------------------------------- | -| callback | AsyncCallback | Yes| Callback used to return the bundle installer.| +| callback | AsyncCallback | Yes | Callback used to return the bundle installer.| **Example** ```js -bundle.getBundleInstaller((err, data)=>{ - data.uninstall('com.example.myapplication', { - userId: 0, - installFlag: 1, - isKeepData: false - }, OnReceiveinstallEvent); - - function OnReceiveinstallEvent(err, data) { - console.info("name: for begin"); - console.info("uninstall result code:" + data.status); - console.info("uninstall result msg:" + data.statusMessage); - } +let bundleFilePaths = ['/data/test.hap']; +let param = { + userId : 100, + installFlag : 1, + isKeepData : false +}; +bundle.getBundleInstaller((err, installerObject) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + } + console.info('Operation successful. Data:' + JSON.stringify(installerObject)); + installerObject.install(bundleFilePaths, param, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + } + console.info('Operation successful. Data:' + JSON.stringify(data)); + }) }) ``` -## bundle.getAllShortcutInfo -getAllShortcutInfo(bundleName: string): Promise> +## bundle.getLaunchWantForBundle + +getLaunchWantForBundle(bundleName: string): Promise\ + +Obtains the **Want** object that launches the specified application in asynchronous mode. This method uses a promise to return the result. -Obtains the shortcut information of the specified bundle in asynchronous mode. This method uses a promise to return the result. +**Required permissions** + +ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | ------ | ---- | -------- | -| bundleName | string | Yes| Bundle name.| +| bundleName | string | Yes | Bundle name of the application.| **Return value** -| Type| Description| -| ----------------------------- | ---------------------------------------------------- | -| Promise\> | Promise used to return the shortcut information.| +| Type | Description | +| --------------------- | ------------------------------------------------------------ | +| Promise\ | Promise used to return the **Want** object.| **Example** ```js -bundle.getAllShortcutInfo('com.example.third1').then((data) => { - console.log("getAllShortcutInfo data:" + data); -}); +let bundleName = "com.example.myapplication"; +bundle.getLaunchWantForBundle(bundleName) +.then((data) => { + console.info('Operation successful. Data: ' + JSON.stringify(data)); +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); +}) ``` +## bundle.getLaunchWantForBundle +getLaunchWantForBundle(bundleName: string, callback: AsyncCallback): void; -## bundle.getAllShortcutInfo +Obtains the **Want** object that launches the specified application in asynchronous mode. This method uses a callback to return the result. -getAllShortcutInfo(bundleName: string, callback: AsyncCallback>): void +**Required permissions** -Obtains the shortcut information of the specified bundle in asynchronous mode. This method uses a callback to return the result. +ohos.permission.GET\_BUNDLE\_INFO\_PRIVILEGED **Parameters** -| Name| Type| Mandatory| Description| -| ---------- | ------------------------------------ | ---- | -------------------------------------------------- | -| bundleName | string | Yes| Bundle name.| -| callback | AsyncCallback<> | Yes| Callback used to return the shortcut information.| +| Name | Type | Mandatory| Description | +| ---------- | ------ | ---- | -------- | +| bundleName | string | Yes | Bundle name of the application.| +| callback | AsyncCallback\ | Yes | Callback used to return the **Want** object.| **Example** ```js -bundle.getAllShortcutInfo('com.example.third1', OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.log("getAllShortcutInfo data:" + data); -} +let bundleName = "com.example.myapplication"; +bundle.getLaunchWantForBundle(bundleName, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); +}) ``` -## bundle.checkPermission -checkPermission(bundleName: string, permission: string): Promise\ +## bundle.getNameForUid + +getNameForUid(uid: number): Promise\ -Checks whether a bundle has the specified permission in asynchronous mode. This method uses a promise to return the result. +Obtains the bundle name based on a UID in asynchronous mode. This method uses a promise to return the result. **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | ------ | ---- | -------- | -| bundleName | string | Yes| Bundle name.| -| permission | string | Yes| Permission name.| +| uid | number | Yes | UID based on which the bundle name is to obtain.| **Return value** -| Type| Description| +| Type | Description | | --------------------- | ------------------------------------------------------------ | -| Promise\ | Promise used to return the verification result.
**-1**: The bundle does not have the specified permission.
**0**: The bundle has the specified permission.| +| Promise\ | Promise used to return the bundle name.| **Example** ```js -bundle.checkPermission('com.example.actsbmscheckpermissiontest', 'com.permission.CAMERA').then((data) => { - console.log("checkPermission data:" + data); -}); +let uid = 20010005; +bundle.getNameForUid(uid) +.then((data) => { + console.info('Operation successful. Data: ' + JSON.stringify(data)); +}).catch((error) => { + console.error('Operation failed. Cause: ' + JSON.stringify(error)); +}) ``` -## bundle.checkPermission +## bundle.getNameForUid -checkPermission(bundleName: string, permission: string, callback: AsyncCallback\): void +getNameForUid(uid: number, callback: AsyncCallback): void; -Checks whether a bundle has the specified permission in asynchronous mode. This method uses a callback to return the result. +Obtains the bundle name based on a UID in asynchronous mode. This method uses a callback to return the result. **Parameters** -| Name| Type| Mandatory| Description| -| ---------- | --------------------------- | ---- | ------------------------------------------------------------ | -| bundleName | string | Yes| Bundle name.| -| permission | string | Yes| Permission name.| -| callback | AsyncCallback\ | Yes| Callback used to return the verification result.
**-1**: The bundle does not have the specified permission.
**0**: The bundle has the specified permission.| +| Name | Type | Mandatory| Description | +| ---------- | ------ | ---- | -------- | +| uid | number | Yes | UID based on which the bundle name is to obtain.| +| callback | AsyncCallback\ | Yes | Callback used to return the bundle name.| **Example** ```js -bundle.checkPermission('com.example.actsbmscheckpermissiontest', 'com.permission.CAMERA', OnReceiveEvent); - -function OnReceiveEvent(err, data) { - console.log("checkPermission data:" + data); -} +let uid = 20010005; +bundle.getNameForUid(uid, (err, data) => { + if (err) { + console.error('Operation failed. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Operation successful. Data:' + JSON.stringify(data)); +}) ``` + ## ElementName -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ----------- | -------- | ------ | ---- | ------------------------------------------------------------ | -| deviceId | Read-only| string | No| ID of the device that runs the ability.| -| bundleName | Read-only| string | Yes| Bundle name of the ability. If both **bundleName** and **abilityName** are specified in a **Want**, the **Want** can directly match the specified ability.| -| abilityName | Read-only| string | Yes| Name of the ability. If both **bundleName** and **abilityName** are specified in a **Want**, the **Want** can directly match the specified ability.| +| deviceId | Read-only | string | No | ID of the device that runs the ability. | +| bundleName | Read-only | string | Yes | Bundle name of the ability. If both **bundleName** and **abilityName** are specified in a **Want**, the **Want** can directly match the specified ability.| +| abilityName | Read-only | string | Yes | Name of the ability. If both **bundleName** and **abilityName** are specified in a **Want**, the **Want** can directly match the specified ability.| +| uri | Read-only | string | No | Resource ID.| +| shortName | Read-only | string | No | Short name of the **ElementName**.| ## InstallStatus -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ------------- | -------- | ---------------- | ---- | ------------------------------------------------------------ | -| status | Read-only| InstallErrorCode | Yes| Installation result code.
SUCCESS = 0
STATUS_INSTALL_FAILURE = 1
STATUS_INSTALL_FAILURE_ABORTED = 2
STATUS_INSTALL_FAILURE_INVALID = 3
STATUS_INSTALL_FAILURE_CONFLICT = 4
STATUS_INSTALL_FAILURE_STORAGE = 5
STATUS_INSTALL_FAILURE_INCOMPATIBLE = 6
STATUS_INSTALL_FAILURE_DOWNLOAD_TIMEOUT = 0x0B
STATUS_INSTALL_FAILURE_DOWNLOAD_FAILED = 0x0C
STATUS_ABILITY_NOT_FOUND = 0x40
STATUS_BMS_SERVICE_ERROR = 0x41 | -| statusMessage | Read-only| string | Yes| Message indicating the installation result.| +| status | Read-only | InstallErrorCode | Yes | Installation result code.
SUCCESS = 0
STATUS_INSTALL_FAILURE = 1
STATUS_INSTALL_FAILURE_ABORTED = 2,
STATUS_INSTALL_FAILURE_INVALID = 3
STATUS_INSTALL_FAILURE_CONFLICT = 4
STATUS_INSTALL_FAILURE_STORAGE = 5
STATUS_INSTALL_FAILURE_INCOMPATIBLE = 6
STATUS_UNINSTALL_FAILURE = 7
STATUS_UNINSTALL_FAILURE_BLOCKED = 8
STATUS_UNINSTALL_FAILURE_ABORTED = 9
STATUS_UNINSTALL_FAILURE_CONFLICT = 10
STATUS_INSTALL_FAILURE_DOWNLOAD_TIMEOUT = 0x0B
STATUS_INSTALL_FAILURE_DOWNLOAD_FAILED = 0x0C
STATUS_RECOVER_FAILURE_INVALID = 0x0D
STATUS_ABILITY_NOT_FOUND = 0x40
STATUS_BMS_SERVICE_ERROR = 0x41
STATUS_FAILED_NO_SPACE_LEFT = 0x42
STATUS_GRANT_REQUEST_PERMISSIONS_FAILED = 0x43
STATUS_INSTALL_PERMISSION_DENIED = 0x44
STATUS_UNINSTALL_PERMISSION_DENIED = 0x45 | + +## BundleFlag + +Enumerates the bundle flags. + +| Name | Default Value| Description | +| ------ | ------ | ------ | +| GET_BUNDLE_DEFAULT | 0x00000000 | Obtains the default application information.| +| GET_BUNDLE_WITH_ABILITIES | 0x00000001 | Obtains the bundle information with the ability information.| +| GET_ABILITY_INFO_WITH_PERMISSION | 0x00000002 | Obtains the ability information with the permission information.| +| GET_ABILITY_INFO_WITH_APPLICATION | 0x00000004 | Obtains the ability information with the application information.| +| GET_APPLICATION_INFO_WITH_PERMISSION | 0x00000008 | Obtains the application information with the permission information.| +| GET_BUNDLE_WITH_REQUESTED_PERMISSION | 0x00000010 | Obtains the bundle information with the information about the required permissions.| +| GET_ABILITY_INFO_WITH_METADATA | 0x00000020 | Obtains the ability metadata information.| +| GET_APPLICATION_INFO_WITH_METADATA | 0x00000040 | Obtains the application metadata information.| +| GET_ABILITY_INFO_SYSTEMAPP_ONLY | 0x00000080 | Obtains only the ability information with information about system applications.| +| GET_ABILITY_INFO_WITH_DISABLE | 0x00000100 | Obtains information about disabled abilities.| +| GET_APPLICATION_INFO_WITH_DISABLE | 0x00000200 | Obtains information about disabled applications.| +| GET_ALL_APPLICATION_INFO | 0xFFFF0000 | Obtains all application information.| + +## BundleOptions + +Describes the bundle options. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| userId | number | Yes| Yes| User ID. The default value is the user ID of the caller. The value must be greater than or equal to 0.| +| networkId | string | Yes| Yes| Network ID. The default value is **null**.| + +## BundleInfo + +Describes the application bundle information. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| name | string | Yes | No | Bundle name. | +| type | string | Yes | No | Bundle type. | +| appId | string | Yes | No | ID of the application to which the bundle belongs. | +| uid | number | Yes | No | UID of the application to which the bundle belongs. | +| installTime | number | Yes | No | Time when the HAP file is installed. | +| updateTime | number | Yes | No | Time when the HAP file is updated. | +| appInfo | ApplicationInfo | Yes | No | Application configuration information. | +| abilityInfo | Array | Yes | No | Ability configuration information. | +| reqPermissions | Array | Yes | No | Array of the permissions to request from the system. | +| reqPermissionDetails | Array | Yes | No | Detailed information of the permissions to request from the system.| +| vendor | string | Yes | No | Vendor of the bundle. | +| versionCode | number | Yes | No | Version number of the bundle. | +| versionName | string | Yes | No | Version description of the bundle. | +| compatibleVersion | number | Yes | No | Earliest SDK version required for running the bundle. | +| targetVersion | number | Yes | No | Latest SDK version required for running the bundle. | +| isCompressNativeLibs | boolean | Yes | No | Whether to compress the native library of the bundle. The default value is **true**. | +| hapModuleInfo | Array | Yes | No | Module configuration information. | +| entryModuleName | string | Yes | No | Name of the entry module. | +| cpuAbi | string | Yes | No | cpuAbi information of the bundle. | +| isSilentInstallation | string | Yes | No | Whether to install the bundle in silent mode. | +| minCompatibleVersionCode | number | Yes | No | Earliest version compatible with the bundle in the distributed scenario. | +| entryInstallationFree | boolean | Yes| No| Whether installation-free is supported for the entry.| +| reqPermissionStates | Array | Yes| No| Permission grant state.| + +## ApplicationInfo + +Describes the application information. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| name | string | Yes | No | Application name. | +| description | string | Yes | No | Application description. | +| descriptionId | number | Yes | No | Application description ID. | +| systemApp | boolean | Yes | No | Whether the application is a system application. The default value is **false**. | +| enabled | boolean | Yes | No | Whether the application is enabled. The default value is **true**. | +| label | string | Yes | No | Application label. | +| labelId | string | Yes | No | Application label ID. | +| icon | string | Yes | No | Application icon. | +| iconId | string | Yes | No | Application icon ID. | +| process | string | Yes | No | Process in which this application runs. If this parameter is not set, the bundle name is used by default.| +| supportedModes | number | Yes | No | Running modes supported by the application. | +| moduleSourceDirs | Array | Yes | No | Relative paths for storing application resources. | +| permissions | Array | Yes | No | Permissions required for accessing the application. | +| moduleInfos | Array | Yes | No | Application module information. | +| entryDir | string | Yes | No | Path for storing application files. | +| customizeData | Map> | Yes | Yes | Custom data of the application. | +| codePath | string | Yes| No| Installation directory of the application.| +| metaData | Map> | Yes| No| Custom metadata of the application.| +| removable | boolean | Yes| No| Whether the application is removable.| +| accessTokenId | number | Yes| No| Access token ID of the application.| +| uid | number | Yes| No| UID of the application.| + +## ModuleInfo + +Describes the application module information. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| moduleName | string | Yes | No | Module name.| +| moduleSourceDir | string | Yes | No | Installation directory.| + +## CustomizeData + +Describes the custom metadata. + +| Name | Type | Readable| Writable| Description | +| ----- | ------ | ---- | ---- | ---------------- | +| name | string | Yes | Yes | Custom metadata name.| +| value | string | Yes | Yes | Custom metadata value. | +| extra | string | Yes | Yes | Custom resources. | + + +## HapModuleInfo + +Describes the HAP module information. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| name | string | Yes | No | Module name. | +| description | string | Yes | No | Module description. | +| descriptionId | number | Yes | No | Module description ID. | +| icon | string | Yes | No | Module icon. | +| label | string | Yes | No | Module label. | +| labelId | number | Yes | No | Module label ID. | +| iconId | number | Yes | No | Module icon ID. | +| backgroundImg | string | Yes | No | Module background image. | +| supportedModes | number | Yes | No | Modes supported by the module. | +| reqCapabilities | Array | Yes | No | Capabilities required for module running.| +| deviceTypes | Array | Yes | No | An array of supported device types.| +| abilityInfo | Array | Yes | No | Ability information. | +| moduleName | string | Yes | No | Module name. | +| mainAbilityName | string | Yes | No | Name of the entry ability. | +| installationFree | boolean | Yes | No | Whether installation-free is supported. | +| mainElementName | string | Yes| No| Information about the entry ability.| + +## ReqPermissionDetail + +Describes the detailed information of the permissions to request from the system. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| name | string | Yes | Yes | Name of the permission to request. | +| reason | string | Yes | Yes | Reason for requesting the permission. | +| usedScene | UsedScene | Yes| Yes| Application scenario and timing for using the permission.| + +## UsedScene + +Describes the application scenario and timing for using the permission. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| abilities | Array | Yes | Yes | Abilities that use the permission.| +| when | string | Yes | Yes | Time when the permission is used. | + + +## AbilityInfo + +Describes ability information. + +| Name | Type| Readable| Writable| Description| +| ------ | ------ | ------ | ------ | ------ | +| bundleName | string | Yes | No | Application bundle name. | +| name | string | Yes | No | Ability name. | +| label | string | Yes | No | Ability name visible to users. | +| description | string | Yes | No | Ability description. | +| icon | string | Yes | No | Index of the ability icon resource file. | +| descriptionId | number | Yes | No | Ability description ID. | +| iconId | number | Yes | No | Ability icon ID. | +| moduleName | string | Yes | No | Name of the HAP file to which the ability belongs. | +| process | string | Yes | No | Process in which this ability runs. If this parameter is not set, the bundle name is used by default.| +| targetAbility | string | Yes | No | Target ability that this ability alias points to. | +| backgroundModes | number | Yes | No | Background service mode of the ability. | +| isVisible | boolean | Yes | No | Whether the ability can be called by other applications. | +| formEnabled | boolean | Yes | No | Whether the ability provides the service widget capability. | +| type | AbilityType | Yes | No | Ability type. | +| orientation | DisplayOrientation | Yes | No | Ability display orientation. | +| launchMode | LaunchMode | Yes | No | Ability launch mode. | +| permissions | Array | Yes | No | Permissions required for other applications to call the ability.| +| deviceTypes | Array | Yes | No | Device types supported by the ability. | +| deviceCapabilities | Array | Yes | No | Device capabilities required for the ability. | +| readPermission | string | Yes | No | Permission required for reading the ability data. | +| writePermission | string | Yes | No | Permission required for writing data to the ability. | +| applicationInfo | ApplicationInfo | Yes | No | Application configuration information. | +| formEntity | number | Yes | No | Area where the ability form can be displayed. | +| minFormHeight | number | Yes | No | Minimum height of the ability form. | +| defaultFormHeight | number | Yes | No | Default height of the ability form. | +| minFormWidth | number | Yes | No | Minimum width of the ability form. | +| defaultFormWidth | number | Yes | No | Default width of the ability form. | +| uri | string | Yes | No | URI of the ability. | +| customizeData | Map> | Yes | Yes | Custom data of the ability. | +| labelId | number | Yes | No | Ability label ID. | +| subType | AbilitySubType | Yes | No | Subtype of the template that can be used by the ability. | +| metaData | Array | Yes| No| Custom metadata of the ability.| +| enabled | boolean | Yes| No| Whether the ability is enabled.| + +## AbilityType + +Describes the ability type. + +| Name | Type| Description | +| ------- | ---- | --------------------------- | +| UNKNOWN | None | Unknown ability type. | +| PAGE | None | Ability that has a UI. | +| SERVICE | None | Ability that does not have a UI. | +| DATA | None | Ability that is used to provide data access services.| + +## DisplayOrientation + +Describes the display orientation. + +| Name | Type| Description | +| ------------- | ---- | ------------------------ | +| UNSPECIFIED | None | The system automatically determines the display orientation. | +| LANDSCAPE | None | Landscape orientation. | +| PORTRAIT | None | Portrait orientation. | +| FOLLOW_RECENT | None | The page ability orientation is the same as that of the nearest ability in the stack.| + +## LaunchMode + +Describes the launch mode. + +| Name | Type| Description | +| ----------- | ---- | ------------------- | +| UNSPECIFIED | 0 | The ability has only one instance.| +| STANDARD | 1 | The ability can have multiple instances. | + +## AbilitySubType + +Describes the ability subtype. + +| Name | Type| Description | +| ----------- | ---- | ----------------------------- | +| UNSPECIFIED | 0 | Undefined ability subtype. | +| CA | 1 | Ability that has a UI.| -- Gitee From 7285a4da074f9a43cd5d1b44f59be3cbbad9dab2 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 11:08:38 +0800 Subject: [PATCH 238/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-featureAbility.md | 405 +++++++----------- 1 file changed, 149 insertions(+), 256 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-featureAbility.md b/en/application-dev/reference/apis/js-apis-featureAbility.md index 49119078246..505e8cee176 100644 --- a/en/application-dev/reference/apis/js-apis-featureAbility.md +++ b/en/application-dev/reference/apis/js-apis-featureAbility.md @@ -16,12 +16,16 @@ startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\) Starts an ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | --------------------- | ---- | ------------------- | -| parameter | [StartAbilityParameter](#startabilityparameter) | Yes| Ability to start.| -| callback | AsyncCallback\ | Yes| Callback used to return the result.| +| parameter | [StartAbilityParameter](#startabilityparameter) | Yes | Ability to start.| +| callback | AsyncCallback\ | Yes | Callback used to return the result. | **Example** @@ -53,11 +57,15 @@ startAbility(parameter: StartAbilityParameter): Promise\ Starts an ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | ----------------------------------------------- | ---- | --------------------- | -| parameter | [StartAbilityParameter](#startabilityparameter) | Yes| Ability to start.| +| parameter | [StartAbilityParameter](#startabilityparameter) | Yes | Ability to start.| **Example** @@ -89,15 +97,19 @@ acquireDataAbilityHelper(uri: string): DataAbilityHelper Obtains a **dataAbilityHelper** object. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory| Description | | ---- | ------ | ---- | ------------------------ | -| uri | string | Yes| URI of the file to open.| +| uri | string | Yes | URI of the file to open.| **Return value** -| Type| Description| +| Type | Description | | ----------------- | -------------------------------------------- | | DataAbilityHelper | A utility class used to help other abilities access the Data ability.| @@ -116,12 +128,16 @@ startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback\ Starts an ability. This method uses a callback to return the execution result when the ability is destroyed. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | ----------------------------------------------- | ---- | --------------------- | -| parameter | [StartAbilityParameter](#startabilityparameter) | Yes| Ability to start.| -| callback | AsyncCallback\<[AbilityResult](#abilityresult)> | Yes| Callback used to return the result.| +| parameter | [StartAbilityParameter](#startabilityparameter) | Yes | Ability to start.| +| callback | AsyncCallback\<[AbilityResult](#abilityresult)> | Yes | Callback used to return the result. | **Example** @@ -151,14 +167,18 @@ startAbilityForResult(parameter: StartAbilityParameter): Promise\ Starts an ability. This method uses a promise to return the execution result when the ability is destroyed. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | ----------------------------------------------- | ---- | ------------------- | -| parameter | [StartAbilityParameter](#startabilityparameter) | Yes| Ability to start.| +| parameter | [StartAbilityParameter](#startabilityparameter) | Yes | Ability to start.| **Return value** -| Type| Description| +| Type | Description | | ----------------------------------------- | -------------- | | Promise\<[AbilityResult](#abilityresult)> | Promised returned with the execution result.| @@ -204,12 +224,16 @@ terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback\ Destroys this Page ability, with the result code and data sent to the caller. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | ------------- | ---- | ------------------- | -| parameter | [AbilityResult](#abilityresult) | Yes| Ability to start.| -| callback | AsyncCallback\ | Yes| Callback used to return the result.| +| parameter | [AbilityResult](#abilityresult) | Yes | Ability to start.| +| callback | AsyncCallback\ | Yes | Callback used to return the result. | **Example** @@ -250,14 +274,18 @@ terminateSelfWithResult(parameter: AbilityResult): Promise\ Destroys this Page ability, with the result code and data sent to the caller. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | --------- | ------------------------------- | ---- | ------------------- | -| parameter | [AbilityResult](#abilityresult) | Yes| Ability to start.| +| parameter | [AbilityResult](#abilityresult) | Yes | Ability to start.| **Return value** -| Type| Description| +| Type | Description | | -------------- | ----------------------- | | Promise\ | Promise used to return the result.| @@ -304,11 +332,15 @@ hasWindowFocus(callback: AsyncCallback\): void Checks whether the main window of this ability has the focus. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ----------------------- | ---- | ------------------------------------------------------------ | -| callback | AsyncCallback\ | Yes| Callback used to return the result.
Returns **true** if the main window of this ability has the focus; returns **false** otherwise.| +| callback | AsyncCallback\ | Yes | Callback used to return the result.
Returns **true** if the main window of this ability has the focus; returns **false** otherwise.| **Example** @@ -325,9 +357,13 @@ hasWindowFocus(): Promise\ Checks whether the main window of this ability has the focus. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Return value** -| Type| Description| +| Type | Description | | ----------------- | ---------------------------------------------------------- | | Promise\ | Returns **true** if the main window of this ability has the focus; returns **false** otherwise.| @@ -348,11 +384,15 @@ getWant(callback: AsyncCallback\): void Obtains the **Want** object sent from this ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | ----------------------------- | ---- | ------------------ | -| callback | AsyncCallback\<[Want](#want)> | Yes| Callback used to return the result.| +| callback | AsyncCallback\<[Want](#want)> | Yes | Callback used to return the result.| **Example** @@ -369,8 +409,12 @@ getWant(): Promise\ Obtains the **Want** object sent from this ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Return value** -| Type| Description| +| Type | Description | | ----------------------- | ------------------------- | | Promise\<[Want](#want)> | Promise used to return the result.| @@ -389,8 +433,12 @@ getContext(): Context Obtains the application context. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Return value** -| Type| Description| +| Type | Description | | ------- | -------------------- | | Context | Application context returned.| @@ -410,11 +458,15 @@ terminateSelf(callback: AsyncCallback\): void Destroys this Page ability, with the result code and data sent to the caller. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | -------- | -------------------- | ---- | ---------------- | -| callback | AsyncCallback\ | Yes| Callback used to return the result.| +| callback | AsyncCallback\ | Yes | Callback used to return the result.| **Example** @@ -431,8 +483,12 @@ terminateSelf(): Promise\ Destroys this Page ability, with the result code and data sent to the caller. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Return value** -| Type| Description| +| Type | Description | | -------------- | ------------------------- | | Promise\ | Promise used to return the result.| @@ -450,31 +506,35 @@ connectAbility(request: Want, options:ConnectOptions): number Connects this ability to a specific Service ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ------- | -------------- | ---- | ---------------------------- | -| request | [Want](#want) | Yes| Service ability to connect.| -| options | ConnectOptions | Yes| Callback used to return the result.| +| request | [Want](#want) | Yes | Service ability to connect.| +| options | ConnectOptions | Yes | Callback used to return the result. | Want -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable | Type | Mandatory| Description | | ------------ | -------- | -------- | ---- | ---------------------------------- | -| deviceId | Read-only| string | No| Device ID of the Service ability to connect. The default value is the local device ID.| -| bundleName | Read-only| string | Yes| Bundle name of the Service ability to connect.| -| abilityName | Read-only| string | Yes| Class name of the Service ability to connect.| +| deviceId | Read-only | string | No | Device ID of the Service ability to connect. The default value is the local device ID.
System capabilities: SystemCapability.Ability.AbilityBase| +| bundleName | Read-only | string | Yes | Bundle name of the Service ability to connect.
System capabilities: SystemCapability.Ability.AbilityBase | +| abilityName | Read-only | string | Yes | Class name of the Service ability to connect.
System capabilities: SystemCapability.Ability.AbilityBase | ConnectOptions -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ------------ | -------- | -------- | ---- | ---------------------------------- | -| onConnect | Read-only| function | Yes| Callback invoked when the connection is successful.| -| onDisconnect | Read-only| function | Yes| Callback invoked when the connection fails.| -| onFailed | Read-only| function | Yes| Callback invoked when **connectAbility** fails to be called.| +| onConnect | Read-only | function | Yes | Callback invoked when the connection is successful.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core | +| onDisconnect | Read-only | function | Yes | Callback invoked when the connection fails.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core | +| onFailed | Read-only | function | Yes | Callback invoked when **connectAbility** fails to be called.
System capabilities: SystemCapability.Ability.AbilityRuntime.Core| **Return value** -| Type| Description| +| Type | Description | | ------ | ------------------------ | | number | Returns the ID of the Service ability connected.| @@ -512,12 +572,16 @@ disconnectAbility(connection: number, callback:AsyncCallback\): void Disconnects this ability from a specific Service ability. This method uses a callback to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | ------------- | ---- | ------------------------------ | -| connection | number | Yes| ID of the Service ability to disconnect.| -| callback | AsyncCallback\ | Yes| Callback used to return the result.| +| connection | number | Yes | ID of the Service ability to disconnect.| +| callback | AsyncCallback\ | Yes | Callback used to return the result. | **Example** @@ -557,14 +621,18 @@ disconnectAbility(connection: number): Promise\ Disconnects this ability from a specific Service ability. This method uses a promise to return the result. +**System capabilities** + +SystemCapability.Ability.AbilityRuntime.FAModel + **Parameters** -| Name| Type| Mandatory| Description| +| Name | Type | Mandatory| Description | | ---------- | ------ | ---- | ------------------------------ | -| connection | number | Yes| ID of the Service ability to disconnect.| +| connection | number | Yes | ID of the Service ability to disconnect.| **Return value** -| Type| Description| +| Type | Description | | -------------- | ----------------------- | | Promise\ | Promise used to return the result.| @@ -596,226 +664,51 @@ var connId = featureAbility.connectAbility( var result = await featureAbility.disconnectAbility(connId); ``` -## featureAbility.continueAbility - -continueAbility(options: ContinueAbilityOptions, callback: AsyncCallback\): void - -Migrates an ability to another device. This method uses a callback to return the execution result. - -**Parameters** - -| Name| Type| Mandatory| Description| -| -------- | ---------------------- | ---- | ------------------- | -| options | ContinueAbilityOptions | Yes| Ability to migrate.| -| callback | AsyncCallback\ | Yes| Callback used to return the result.| - -ContinueAbilityOptions - -| Name| Readable/Writable| Type| Mandatory| Description| -| ---------- | -------- | ------- | ---- | ------------------------------------------------------------ | -| deviceId | Read-only| string | Yes| Information about the ability to migrate.| -| reversible | Read-only| boolean | Yes| Whether migration back is supported. Currently, this feature is not supported. This parameter is reserved and can be set to **false**.| - -**Example** - -```javascript -import device from '@system.device' -import ability from '@ohos.ability.featureability' - -var DEVICE_LIST_LOCALHOST -export default { - data: { - title: "", - deviceId: '', - deviceList: [], - remoteDeviceModel : new RemoteDeviceModel() - }, - onInit() { - DEVICE_LIST_LOCALHOST = { - id: 'localhost', - }; - this.deviceList = [DEVICE_LIST_LOCALHOST]; - }, - onShow() { - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - const reportExtend = new ReportExtend(file) - core.addService('expect', expectExtend) - core.addService('report', reportExtend) - core.init() - const configService = core.getDefaultService('config') - configService.setConfig(this) - core.execute() - }, - onReady() { - }, - GetNetWorkId(){ - let self = this; - this.remoteDeviceModel.registerDeviceListCallback(() => { - var list = []; - list[0] = DEVICE_LIST_LOCALHOST; - var deviceList = self.remoteDeviceModel.deviceList; - for (var i = 0; i < deviceList.length; i++) { - list[i] = { - id: deviceList[i].deviceId, - }; - } - self.deviceList = list; - }); - }, - ShowNetWorkId(){ - this.deviceId = this.deviceList[0].id; - }, - - async ContinueAbility(){ - function ContinueAbilityCallback(err) { - console.info("=============>ContinueAbilityCallback============>"); - } - var continueAbilityOptions = { - reversible: false, - deviceId: this.deviceId, - } - //continueAbility callback - await ability.continueAbility(continueAbilityOptions, ContinueAbilityCallback); - }, -} -``` - -## featureAbility.continueAbility - -continueAbility(options: ContinueAbilityOptions): Promise\; - -Migrates an ability to another device. This method uses a promise to return the execution result. - -**Parameters** - -| Name| Type| Mandatory| Description| -| ------- | ---------------------- | ---- | ------------------- | -| options | ContinueAbilityOptions | Yes| Ability to migrate.| - -ContinueAbilityOptions - -| Name| Readable/Writable| Type| Mandatory| Description| -| ---------- | -------- | ------- | ---- | ------------------------------------------------------------ | -| deviceId | Read-only| string | Yes| Information about the ability to migrate.| -| reversible | Read-only| boolean | Yes| Whether migration back is supported. Currently, this feature is not supported. This parameter is reserved and can be set to **false**.| - -**Example** - -```javascript -import device from '@system.device' -import ability from '@ohos.ability.featureability' - -var DEVICE_LIST_LOCALHOST -export default { - data: { - title: "", - deviceId: '', - deviceList: [], - remoteDeviceModel : new RemoteDeviceModel() - }, - onInit() { - DEVICE_LIST_LOCALHOST = { - id: 'localhost', - }; - this.deviceList = [DEVICE_LIST_LOCALHOST]; - }, - onShow() { - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - const reportExtend = new ReportExtend(file) - core.addService('expect', expectExtend) - core.addService('report', reportExtend) - core.init() - const configService = core.getDefaultService('config') - configService.setConfig(this) - core.execute() - }, - onReady() { - }, - GetNetWorkId(){ - let self = this; - this.remoteDeviceModel.registerDeviceListCallback(() => { - var list = []; - list[0] = DEVICE_LIST_LOCALHOST; - var deviceList = self.remoteDeviceModel.deviceList; - for (var i = 0; i < deviceList.length; i++) { - list[i] = { - id: deviceList[i].deviceId, - }; - } - self.deviceList = list; - }); - }, - ShowNetWorkId(){ - this.deviceId = this.deviceList[0].id; - }, - - async ContinueAbility(){ - function ContinueAbilityCallback(err) { - console.info("=============>ContinueAbilityCallback============>"); - } - var continueAbilityOptions = { - reversible: false, - deviceId: this.deviceId, - } - //continueAbility promise - await ability.continueAbility(continueAbilityOptions).then(() => { - console.info("=======>continueAbilityCallback=========>"); - }); - }, -} -``` - ## AbilityResult -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ---------- | -------- | --------------------- | ---- | ------------------------------------------------------------ | -| resultCode | Read-only| number | Yes| Result code returned after the ability is destroyed. The feature for defining error-specific result codes is coming soon.| -| want | Read-only| [Want](#want) | No| Data returned after the ability is destroyed. You can define the data to be returned. This parameter can be **null**.| +| resultCode | Read-only | number | Yes | Result code returned after the ability is destroyed. The feature for defining error-specific result codes is coming soon.
System capabilities: SystemCapability.Ability.AbilityBase| +| want | Read-only | [Want](#want) | No | Data returned after the ability is destroyed. You can define the data to be returned. This parameter can be **null**.
System capabilities: SystemCapability.Ability.AbilityBase | ## StartAbilityParameter -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ------------------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| want | Read-only| [Want](#want) | Yes| Information about the ability to start.| -| abilityStartSetting | Read-only| {[key: string]: any} | No| Special attribute of the ability to start. This attribute can be passed in the method call.| +| want | Read-only | [Want](#want) | Yes | Information about the ability to start.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel | +| abilityStartSetting | Read-only | {[key: string]: any} | No | Special attribute of the ability to start. This attribute can be passed in the method call.
System capabilities: SystemCapability.Ability.AbilityRuntime.FAModel| ## Want -| Name| Readable/Writable| Type| Mandatory| Description| +| Name | Readable/Writable| Type | Mandatory| Description | | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | -| deviceId | Read-only| string | No| ID of the device that runs the ability.| -| bundleName | Read-only| string | No| Bundle name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.| -| abilityName | Read-only| string | No| Name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.| -| uri | Read-only| string | No| URI information to match. If **uri** is specified in a **Want** object, the **Want** object will match the specified URI information, including **scheme**, **schemeSpecificPart**, **authority**, and **path**.| -| type | Read-only| string | No| MIME type, for example, text/plain or image/*.| -| flags | Read-only| number | No| How the **Want** object will be handled. By default, a number is passed. For details, see [flags](#flags).| -| action | Read-only| string | No| Action option.| -| parameters | Read-only| {[key: string]: any} | No| List of parameters in a **Want** object.| -| entities | Read-only| Array\ | No| List of entities.| +| deviceId | Read-only | string | No | ID of the device that runs the ability.
System capabilities: SystemCapability.Ability.AbilityBase | +| bundleName | Read-only | string | No | Bundle name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.
System capabilities: SystemCapability.Ability.AbilityBase| +| abilityName | Read-only | string | No | Name of the ability to start. If both **bundleName** and **abilityName** are specified in a **Want** object, the **Want** object can directly match the specified ability.
System capabilities: SystemCapability.Ability.AbilityBase| +| uri | Read-only | string | No | URI information to match. If **uri** is specified in a **Want** object, the **Want** object will match the specified URI information, including **scheme**, **schemeSpecificPart**, **authority**, and **path**.
System capabilities: SystemCapability.Ability.AbilityBase| +| type | Read-only | string | No | MIME type, for example, text/plain or image/*.
System capabilities: SystemCapability.Ability.AbilityBase | +| flags | Read-only | number | No | How the **Want** object will be handled. By default, a number is passed. For details, see [flags](#flags).
System capabilities: SystemCapability.Ability.AbilityBase| +| action | Read-only | string | No | Action option.
System capabilities: SystemCapability.Ability.AbilityBase | +| parameters | Read-only | {[key: string]: any} | No | List of parameters in a **Want** object.
System capabilities: SystemCapability.Ability.AbilityBase | +| entities | Read-only | Array\ | No | List of entities.
System capabilities: SystemCapability.Ability.AbilityBase | ## flags -| Name| Name| Description| +| Name | Name | Description | | ------------------------------------ | ---------- | ------------------------------------------------------------ | -| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | Indicates the permission to read the URI.| -| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | Indicates the permission to write the URI.| -| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | Returns the result to the ability.| -| FLAG_ABILITY_CONTINUATION | 0x00000008 | Indicates whether the ability on the local device can be migrated to a remote device.| -| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | Indicates that a component does not belong to OHOS.| -| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | Indicates whether to enable an ability.| -| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | Indicates the permission to make the URI persistent.| -| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | Indicates the permission to verify URIs by prefix matching.| -| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | Supports cross-device startup in a distributed scheduler.| -| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | Indicates that the Service ability is started regardless of whether the host application has been started.| -| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | Indicates that the migration is reversible.| -| FLAG_INSTALL_ON_DEMAND | 0x00000800 | Indicates that the specific ability will be installed if it has not been installed.| -| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | Indicates that the specific ability will be installed in the background if it has not been installed.| -| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | Clears other operation missions. This flag can be set for the **Want** object passed to **ohos.app.Context#startAbility** and must be used together with **flag_ABILITY_NEW_MISSION**.| -| FLAG_ABILITY_NEW_MISSION | 0x10000000 | Creates a mission on the historical mission stack.| -| FLAG_ABILITY_MISSION_TOP | 0x20000000 | Starts the mission on the top of the existing mission stack; creates an ability instance if no mission exists.| +| FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | Indicates the permission to read the URI.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | Indicates the permission to write the URI.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | Returns the result to the ability.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION | 0x00000008 | Indicates whether the ability on the local device can be migrated to a remote device.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_NOT_OHOS_COMPONENT | 0x00000010 | Indicates that a component does not belong to OHOS.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_FORM_ENABLED | 0x00000020 | Indicates whether to enable an ability.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | Indicates the permission to make the URI persistent.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | Indicates the permission to verify URIs by prefix matching.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | Supports cross-device startup in a distributed scheduler.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_START_FOREGROUND_ABILITY | 0x00000200 | Indicates that the Service ability is started regardless of whether the host application has been started.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | Indicates that the migration is reversible.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_ON_DEMAND | 0x00000800 | Indicates that the specific ability will be installed if it has not been installed.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | Indicates that the specific ability will be installed in the background if it has not been installed.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | Clears other operation missions. This flag can be set for the **Want** object passed to **ohos.app.Context#startAbility** and must be used together with **flag_ABILITY_NEW_MISSION**.
System capabilities: SystemCapability.Ability.AbilityBase| +| FLAG_ABILITY_NEW_MISSION | 0x10000000 | Creates a mission on the historical mission stack.
System capabilities: SystemCapability.Ability.AbilityBase | +| FLAG_ABILITY_MISSION_TOP | 0x20000000 | Starts the mission on the top of the existing mission stack; creates an ability instance if no mission exists.
System capabilities: SystemCapability.Ability.AbilityBase| -- Gitee From a8f970f81a61774072e0f58615245314d4349e1d Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 11:33:47 +0800 Subject: [PATCH 239/282] updated docs Signed-off-by: wusongqing --- .../apis/js-apis-abilityrunninginfo.md | 7 +---- .../apis/js-apis-abilitystagecontext.md | 6 +---- .../apis/js-apis-application-ability.md | 26 ++----------------- .../apis/js-apis-application-abilitystage.md | 8 +----- .../apis/js-apis-application-context.md | 10 ++----- .../reference/apis/js-apis-appmanager.md | 13 +++------- .../reference/apis/js-apis-configuration.md | 6 +---- .../apis/js-apis-configurationconstant.md | 8 +----- .../reference/apis/js-apis-eventhub.md | 10 ++----- .../apis/js-apis-extensionrunninginfo.md | 11 +++----- .../apis/js-apis-permissionrequestresult.md | 5 +--- .../apis/js-apis-processrunninginfo.md | 6 +---- .../reference/apis/js-apis-treemap.md | 4 +-- .../apis/js-apis-uripermissionmanager.md | 9 ++----- 14 files changed, 24 insertions(+), 105 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-abilityrunninginfo.md b/zh-cn/application-dev/reference/apis/js-apis-abilityrunninginfo.md index d355f7b81a9..07db08c7cb0 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-abilityrunninginfo.md +++ b/zh-cn/application-dev/reference/apis/js-apis-abilityrunninginfo.md @@ -1,12 +1,7 @@ # AbilityRunningInfo -- [使用说明](#使用说明) -- [属性](#属性) -- [abilityManager.AbilityState](#abilityManagerAbilityState) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 8开始支持。 +> 本模块首批接口从API 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 Ability运行相关信息。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-abilitystagecontext.md b/zh-cn/application-dev/reference/apis/js-apis-abilitystagecontext.md index 8018f3b36e3..493ab4c9691 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-abilitystagecontext.md +++ b/zh-cn/application-dev/reference/apis/js-apis-abilitystagecontext.md @@ -1,11 +1,7 @@ # AbilityStageContext -- [使用说明](#使用说明) -- [属性](#属性) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 9开始支持。 +> 本模块首批接口从API 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 AbilityStage的上下文环境,继承自[Context](js-apis-application-context.md)。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-application-ability.md b/zh-cn/application-dev/reference/apis/js-apis-application-ability.md index 02f6373ad19..4ba79871dda 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-application-ability.md +++ b/zh-cn/application-dev/reference/apis/js-apis-application-ability.md @@ -1,29 +1,7 @@ # Ability -- [导入模块](#导入模块) -- [属性](#属性) -- [onCreate](#onCreate) -- [onWindowStageCreate](#onWindowStageCreate) -- [onWindowStageDestroy](#onWindowStageDestroy) -- [onWindowStageRestore](#onWindowStageRestore) -- [onDestroy](#onDestroy) -- [onForeground](#onForeground) -- [onBackground](#onBackground) -- [onContinue](#onContinue) -- [onNewWant](#onNewWant) -- [onConfigurationUpdated](#onConfigurationUpdated) -- [Caller](#Caller) - - [call](#call) - - [callWithResult](#callWithResult) - - [release](#release) - - [onRelease](#onRelease) -- [Callee](#Callee) - - [on](#on) - - [off](#off) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 从API Version 8 开始支持。 +> 从API Version 8 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 Ability模块,提供对Ability生命周期、上下文环境等调用管理。 @@ -43,7 +21,7 @@ import Ability from '@ohos.application.Ability'; | -------- | -------- | -------- | -------- | -------- | | context | [AbilityContext](js-apis-ability-context.md) | 是 | 否 | 上下文。 | | launchWant | [Want](js-apis-featureAbility.md#Want类型说明) | 是 | 否 | Ability启动时的参数。 | -| lastRequestWant | [Want](js-apis-featureAbility.md#Want类型说明) | 是 | 否 | Ability最后请求时的参数。 | +| lastRequestWant | [Want](js-apis-featureAbility.md#Want类型说明) | 是 | 否 | 上一次请求Ability启动时的参数。 | ## onCreate diff --git a/zh-cn/application-dev/reference/apis/js-apis-application-abilitystage.md b/zh-cn/application-dev/reference/apis/js-apis-application-abilitystage.md index 81409eb8908..a35ebe09eef 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-application-abilitystage.md +++ b/zh-cn/application-dev/reference/apis/js-apis-application-abilitystage.md @@ -1,13 +1,7 @@ # AbilityStage -- [导入模块](#导入模块) -- [onCreate](#onCreate) -- [onAcceptWant](#onAcceptWant) -- [onConfigurationUpdated](#onConfigurationUpdated) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 9开始支持。 +> 本模块首批接口从API 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 AbilityStage是HAP包的运行时类。在HAP加载的时候,通知开发者,开发者可以在此进行该HAP的初始化(如资源预加载,线程创建等)。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-application-context.md b/zh-cn/application-dev/reference/apis/js-apis-application-context.md index ab48a690657..83c984acf58 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-application-context.md +++ b/zh-cn/application-dev/reference/apis/js-apis-application-context.md @@ -1,13 +1,7 @@ # Context -- [使用说明](#使用说明) -- [属性](#属性) -- [createBundleContext](#createBundleContext) -- [getApplicationContext](#getApplicationContext) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API version 9开始支持。 +> 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 提供开发者运行代码的上下文环境,包括应用信息、ResourceManager等信息。 @@ -16,7 +10,7 @@ ## 使用说明 -通过AbilityContext等集成实现。 +通过AbilityContext等继承实现。 ## 属性 diff --git a/zh-cn/application-dev/reference/apis/js-apis-appmanager.md b/zh-cn/application-dev/reference/apis/js-apis-appmanager.md index 795b19aa771..5d920d5660b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-appmanager.md +++ b/zh-cn/application-dev/reference/apis/js-apis-appmanager.md @@ -1,15 +1,10 @@ # appManager -- [导入模块](#导入模块) -- [isRunningInStabilityTest](#isRunningInStabilityTest) -- [isRunningInStabilityTest](#isRunningInStabilityTest) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 8开始支持。 +> 本模块首批接口从API 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -App运行相关信息。 +App管理。 ## 导入模块 @@ -24,7 +19,7 @@ import app from '@ohos.application.appManager'; static isRunningInStabilityTest(callback: AsyncCallback<boolean>): void -查询当前用户是否是一个稳定性测试。 +查询当前是否处于稳定性测试场景。 - 参数: | 参数名 | 类型 | 必填 | 说明 | @@ -35,7 +30,7 @@ static isRunningInStabilityTest(callback: AsyncCallback<boolean>): void ``` import app from '@ohos.application.appManager'; - app.isRunningInStabilityTest((err, flag) => { + app.isRunningInStabilityTest((err, flag) => { console.log('startAbility result:' + JSON.stringfy(err); } ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-configuration.md b/zh-cn/application-dev/reference/apis/js-apis-configuration.md index d35dfa4b321..efd704780a9 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-configuration.md +++ b/zh-cn/application-dev/reference/apis/js-apis-configuration.md @@ -1,11 +1,7 @@ # Configuration -- [导入模块](#导入模块) -- [属性](#属性) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API version 8开始支持。 +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 环境变化信息。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-configurationconstant.md b/zh-cn/application-dev/reference/apis/js-apis-configurationconstant.md index 41a55a9f528..f59e65444d0 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-configurationconstant.md +++ b/zh-cn/application-dev/reference/apis/js-apis-configurationconstant.md @@ -1,13 +1,7 @@ # ConfigurationConstant -- [导入模块](#导入模块) -- [ColorMode](#ColorMode) -- [Direction](#Direction) -- [ScreenDensity](#ScreenDensity) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API version 8开始支持。 +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 配置信息枚举值定义。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-eventhub.md b/zh-cn/application-dev/reference/apis/js-apis-eventhub.md index 0fd0ecc9b5b..073acbb3c5b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-eventhub.md +++ b/zh-cn/application-dev/reference/apis/js-apis-eventhub.md @@ -1,16 +1,10 @@ # EventHub -- [使用说明](#使用说明) -- [on](#on) -- [off](#off) -- [emit](#emit) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 9开始支持。 +> 本模块首批接口从API 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -事件中心。提供订阅、取消订阅、触发事件能力。 +事件中心,提供订阅、取消订阅、触发事件能力。 ## 使用说明 diff --git a/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md b/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md index 36b807c84b1..19ed0e0bc21 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md +++ b/zh-cn/application-dev/reference/apis/js-apis-extensionrunninginfo.md @@ -1,12 +1,7 @@ # ExtensionRunningInfo -- [使用说明](#使用说明) - - [属性](#属性) -- [bundle.ExtensionAbilityType](#bundleExtensionAbilityType) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 8开始支持。 +> 本模块首批接口从API 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 Extension运行相关信息。 @@ -36,7 +31,7 @@ abilitymanager.getExtensionRunningInfos(upperLimit, (err,data) => { | uid | number | 是 | 否 | 用户ID。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | | processName | string | 是 | 否 | 进程名称。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | | startTime | number | 是 | 否 | Extension启动时间。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | -| clientPackage | Array<String> | 是 | 否 | 连接客户端包名。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | +| clientPackage | Array<String> | 是 | 否 | 表示当期进程下的所有包名。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | | type | [bundle.ExtensionAbilityType](#bundle-extensionabilitytype) | 是 | 否 | Extension类型。
系统能力:SystemCapability.Ability.AbilityRuntime.Core | @@ -47,7 +42,7 @@ Extension类型。 | 名称 | 值 | 说明 | | -------- | -------- | -------- | | FORM | 0 | 表示带有form类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | -| WORK_SCHEDULER | 1 | 表示带有work schedule类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | +| WORK_SCHEDULER | 1 | 表示带有work scheduler类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | | INPUT_METHOD | 2 | 表示用输入法类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | | SERVICE | 3 | 表示带有service类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | | ACCESSIBILITY | 4 | 表示具有可访问性类型的扩展信息。
系统能力:SystemCapability.BundleManager.BundleFramework | diff --git a/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md b/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md index 7047a1584e6..472bb7dbbc5 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md +++ b/zh-cn/application-dev/reference/apis/js-apis-permissionrequestresult.md @@ -1,10 +1,7 @@ # PermissionRequestResult -- [属性](#属性) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 9开始支持。 +> 本模块首批接口从API 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 权限请求结果。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md b/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md index dbcf41ed4c7..cfedc01e68f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md +++ b/zh-cn/application-dev/reference/apis/js-apis-processrunninginfo.md @@ -1,11 +1,7 @@ # ProcessRunningInfo -- [使用说明](#使用说明) -- [属性](#属性) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 8开始支持。 +> 本模块首批接口从API 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 进程运行信息。 diff --git a/zh-cn/application-dev/reference/apis/js-apis-treemap.md b/zh-cn/application-dev/reference/apis/js-apis-treemap.md index e31c6540de6..796112066e3 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-treemap.md +++ b/zh-cn/application-dev/reference/apis/js-apis-treemap.md @@ -95,13 +95,13 @@ let result1 = treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); hasValue(value: V): boolean -判断此容器中是否含有该指定元素。 +判断此容器中是否含有该指定value。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | V | 是 | 指定元素。 | +| value | V | 是 | 指定value。 | **返回值:** diff --git a/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md b/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md index 14a3814de07..f09e2458dfd 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md +++ b/zh-cn/application-dev/reference/apis/js-apis-uripermissionmanager.md @@ -1,12 +1,7 @@ # UriPermissionManager -- [导入模块](#导入模块) -- [verifyUriPermission](#verifyUriPermission) -- [verifyUriPermission](#verifyUriPermission) - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API 9开始支持。 +> 本模块首批接口从API 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 Uri权限管理。 @@ -36,7 +31,7 @@ SystemCapability.Ability.AbilityRuntime.Core | uri | string | 是 | 指向文件的uri,例如fileshare:///com.samples.filesharetest.FileShare/person/10。 | | flag | wantConstant.Flags | 是 | uri的读权限或写权限。 | | accessTokenId | number | 是 | 每个应用的唯一标识ID,开发者通过包管理接口自行获取。 | - | callback | AsyncCallback<number> | 是 | callback形式返回启动结果,返回0表示有权限,返回-1表示无权限。 | + | callback | AsyncCallback<number> | 是 | callback形式返回检验结果,返回0表示有权限,返回-1表示无权限。 | - 示例: -- Gitee From 6599a8187dd9d7339f8d72a11de686a76dfebcf1 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Wed, 9 Mar 2022 14:46:57 +0800 Subject: [PATCH 240/282] update docs Signed-off-by: shawn_he --- .../subsys-dfx-hisysevent-listening.md | 36 +++++++++---------- .../subsystems/subsys-dfx-hisysevent-query.md | 26 +++++++------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md index b7106bf6f4e..5df286d2676 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-listening.md @@ -21,34 +21,34 @@ Before subscribing to system events, you need to configure HiSysEvent logging. F ### Available APIs -**Table 1** EventListener APIs +**Table 1** Description of EventListener APIs -| API| Description| +| Name| Description | | -------- | --------- | -|bool HiSysEventManager::AddEventListener(std::shared_ptr<HiSysEventSubscribeCallBackBase> listener, std::vector<ListenerRule>& rules)|Registers a listener for system events. You can listen for certain events by specifying rules.

Input arguments:
  • **listener**: callback object for system events.
  • **rules**: rules for event listening.
Return value:
  • **0**: Repeated registration is successful.
  • **1**: Initial registration is successful.
  • Other values: Registration has failed.
| -|bool HiSysEventManager::RemoveListener(std::shared_ptr<HiSysEventSubscribeCallBackBase> listener)|Removes the listener for system events.

Input argument:
  • **listener**: callback object for system events.
Return value:
  None.| +|bool HiSysEventManager::AddEventListener(std::shared_ptr<HiSysEventSubscribeCallBack> listener, std::vector<ListenerRule>& rules)|Registers a listener for system events. You can listen for certain events by specifying rules.

Input arguments:
  • **listener**: callback object for system events.
  • **rules**: rules for event listening.
Return value:
  • **0**: Repeated registration is successful.
  • **1**: Initial registration is successful.
  • Other values: Registration has failed.
| +|bool HiSysEventManager::RemoveListener(std::shared_ptr<HiSysEventSubscribeCallBack> listener)|Removes the listener for system events.

Input arguments:
  • **listener**: callback object for system events.
Return value:
None.| **Table 2** Description of ListenerRule -| API| Description| +| API| Description | | -------- | --------- | -|ListenerRule(const std::string& tag, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event tag.

Input arguments:
  • **tag**: indicates the event tag for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, lowercase letters, and digits.
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| -|ListenerRule(const std::string& domain, const std::string& eventName, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event domain and event name.

Input arguments:
  • **domain**: indicates the event domain for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, digits, and underscores (_).
  • **eventName**: indicates the event name for the **ListenerRule** object. The value is a string of 1 to 32 characters, including uppercase letters, digits, and underscores (_).
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| -|ListenerRule(const std::string& domain, const std::string& eventName, const std::string& tag, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event domain, event name, and event tag.

Input arguments:
  • **tag**: indicates the event tag for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, lowercase letters, and digits.
  • **domain**: indicates the event domain for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, digits, and underscores (_).
  • **eventName**: indicates the event name for the **ListenerRule** object. The value is a string of 1 to 32 characters, including uppercase letters, digits, and underscores (_).
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| +|ListenerRule(const std::string& tag, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event tag.

Input arguments:
  • **tag**: indicates the event tag for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, lowercase letters, and digits.
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| +|ListenerRule(const std::string& domain, const std::string& eventName, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event domain and event name.

Input arguments:
  • **domain**: indicates the event domain for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, digits, and underscores (_).
  • **eventName**: indicates the event name for the **ListenerRule** object. The value is a string of 1 to 32 characters, including uppercase letters, digits, and underscores (_).
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| +|ListenerRule(const std::string& domain, const std::string& eventName, const std::string& tag, RuleType ruleType = RuleType::WHOLE_WORD)|Constructor used to create a **ListenerRule** object based on the event domain, event name, and event tag.

Input arguments:
  • **tag**: indicates the event tag for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, lowercase letters, and digits.
  • **domain**: indicates the event domain for the **ListenerRule** object. The value is a string of 1 to 16 characters, including uppercase letters, digits, and underscores (_).
  • **eventName**: indicates the event name for the **ListenerRule** object. The value is a string of 1 to 32 characters, including uppercase letters, digits, and underscores (_).
  • **ruleType**: indicates the type of the **ListenerRule** object. The value is an enum defined by **RuleType**.
| **Table 3** Description of RuleType -| Enum| Description| +| Value | Description | | ------------ | ------------- | -| WHOLE_WORD | Whole word matching| -| PREFIX | Prefix matching| -| REGULAR | Regular expression matching| +| WHOLE_WORD | Whole word matching | +| PREFIX | Prefix matching | +| REGULAR | Regular expression matching | -**Table 4** Description of HiSysEventSubscribeCallBackBase +**Table 4** Description of HiSysEventSubscribeCallBack -| API| Description| +| API| Description | | -------- | --------- | -|void HiSysEventSubscribeCallBackBase::OnHandle(const std::string& domain, const std::string& eventName, const int eventType, const std::string& eventDetail)|Provides the callback of system events.

Input arguments:
  • **domain**: indicates the domain to which the event belongs.
  • **eventName**: indicates the event name.
  • **eventType**: indicates the event type.
  • **eventDetail**: indicates the event information, in JSON format.
Return value:
  None.| +|void HiSysEventSubscribeCallBack::OnHandle(const std::string& domain, const std::string& eventName, const int eventType, const std::string& eventDetail)|Provides the callback of system events.

Input arguments:
  • **domain**: indicates the domain to which the event belongs.
  • **eventName**: indicates the event name.
  • **eventType**: indicates the event type.
  • **eventDetail**: indicates the event information, in JSON format.
Return value:
None.| ### Development Example @@ -66,16 +66,16 @@ C++ #include - class DemoListener : public OHOS::HiviewDFX::HiSysEventSubscribeCallBackNative { + class DemoListener : public OHOS::HiviewDFX::HiSysEventSubscribeCallBack { public: - explicit DemoListener() : HiSysEventSubscribeCallBackNative() {} + explicit DemoListener() : HiSysEventSubscribeCallBack() {} void OnHandle(const std::string& domain, const std::string& eventName, const int eventType, const std::string& eventDetail); virtual ~DemoListener() {} void OnServiceDied(); }; - #endif DEMO_LISTENER_H + #endif // DEMO_LISTENER_H ``` Create the **DemoListener.cpp** file, and add the implementation logic of the custom event callback API in the **DemoListener** class. diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md index 03660c68278..8401862dae6 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md @@ -13,16 +13,16 @@ HiSysEvent provides an API for you to query system events. You can query concern ### Available APIs -**Table 1** HiSysEvent query API +**Table 1** Description of the HiSysEvent query API -| API| Description| +| Name| Description | | -------- | --------- | -| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBackBase> queryCallBack) | Queries system events by specifying search criteria such as the time segment, event domain, and event name.

Input arguments:
  • **queryArg**: event query parameter.
  • **queryRules**: event filtering rules.
  • **queryCallBack**: callback object for query results.
Return value:
  • **true**: The query is successful.
  • **false**: The query has failed.
| +| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBack> queryCallBack) | Queries system events by specifying search criteria such as the time segment, event domain, and event name.

Input arguments:
  • **queryArg**: event query parameter.
  • **queryRules**: event filtering rules.
  • **queryRules**: callback object for query results.
Return value:
  • **true**: The query is successful.
  • **false**: The query has failed.
| **Table 2** Description of QueryArg -| Attribute| Description| +| Attribute| Description | | -------- | --------- | | beginTime | Start time, in the **long long int** format.| | endTime | End time, in the **long long int** format.| @@ -30,16 +30,16 @@ HiSysEvent provides an API for you to query system events. You can query concern **Table 3** Description of QueryRule -| API| Description| +| API| Description | | -------- | --------- | -| QueryRule(const std::string& domain, const std::vector<std::string>& eventList) | Constructor used to create a **QueryRule** object based on domain and event name list.

Input arguments:
  • **domain**:domain to which the event belongs, in the **string** format. By default, an empty string indicates that the domain is successfully matched.
  • **eventList**:event name list, in the std::vector<std::string> format. By default, an empty string indicates that the event names on the list are successfully matched.
| +| QueryRule(const std::string& domain, const std::vector<std::string>& eventList) | Constructor used to create a **QueryRule** object.

Input arguments:
  • **domain: domain to which the event of the **QueryRule** object belongs, in the **string** format. By default, an empty string indicates that the domain is successfully matched.
  • **eventList**: event name list, in the **std::vector<std::string>** format. By default, an empty string indicates that the event names on the list are successfully matched.
| -**Table 4** Description of HiSysEventQueryCallBackBase +**Table 4** Description of HiSysEventQueryCallBack -| API| Description| +| API| Description | | -------- | --------- | -| void HiSysEventQueryCallBackBase::OnQuery(const ::std::vector<std::string>& sysEvent, const ::std::vector<int64_t>& seq) | Callback object for event query.

Input arguments:
  • **sysEvent**: event set.
  • **seq**: event sequence set.
Return value:
  None.| -| void HiSysEventQueryCallBackBase::OnComplete(int32_t reason, int32_t total) | Callback object for completion of event query.

Input arguments:
  • **reason**: reason for completion of event query. The default value is **0**.
  • **total**: total number of events returned in this query.
Return value:
  None.| +| void HiSysEventQueryCallBack::OnQuery(const ::std::vector<std::string>& sysEvent, const ::std::vector<int64_t>& seq) | Callback object for event query.

Input arguments:
  • **sysEvent**: event set.
  • **seq**: event sequence set.
Return value:
None.| +| void HiSysEventQueryCallBack::OnComplete(int32_t reason, int32_t total) | Callback object for completion of event query.

Input arguments:
  • **reason**: reason for completion of event query. The default value is **0**.
  • **total**: total number of events returned in this query.
Return value:
None.| ### Development Example @@ -53,13 +53,13 @@ C++ - Implement the callback API. - void HiSysEventQueryCallBackBase::OnQuery\(const ::std::vector& sysEvent, const ::std::vector& seq\) + void HiSysEventQueryCallBack::OnQuery\(const ::std::vector<std::string>& sysEvent, const ::std::vector& seq\) - void HiSysEventQueryCallBackBase::OnComplete\(int32\_t reason, int32\_t total\) + void HiSysEventQueryCallBack::OnComplete\(int32\_t reason, int32\_t total\) - Invoke the query API in the corresponding service logic. - HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) + HiSysEventManager::QueryHiSysEvent\(struct QueryArg& queryArg, std::vector& queryRules, std::shared\_ptr queryCallBack\) ``` -- Gitee From 0d5318ad966852d5236603b5f0336e21710b8849 Mon Sep 17 00:00:00 2001 From: conglin Date: Wed, 9 Mar 2022 14:47:41 +0800 Subject: [PATCH 241/282] combine the docker of L01 and L2 Signed-off-by: conglin --- docker/CHANGELOG.md | 0 docker/CHANGELOG_en.md | 0 docker/Dockerfile | 89 ++++++++++++------------- docker/README_en.md | 0 docker/build.sh | 2 +- docker/standard/CHANGELOG.md | 36 ---------- docker/standard/CHANGELOG_en.md | 35 ---------- docker/standard/Readme-en.md | 31 --------- docker/standard/Readme.md | 31 --------- docker/standard/build.sh | 16 ----- docker/standard/dockerfile | 112 -------------------------------- docker/standard/sources.list | 24 ------- 12 files changed, 41 insertions(+), 335 deletions(-) mode change 100644 => 100755 docker/CHANGELOG.md mode change 100644 => 100755 docker/CHANGELOG_en.md mode change 100644 => 100755 docker/README_en.md delete mode 100644 docker/standard/CHANGELOG.md delete mode 100644 docker/standard/CHANGELOG_en.md delete mode 100755 docker/standard/Readme-en.md delete mode 100755 docker/standard/Readme.md delete mode 100755 docker/standard/build.sh delete mode 100755 docker/standard/dockerfile delete mode 100755 docker/standard/sources.list diff --git a/docker/CHANGELOG.md b/docker/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/docker/CHANGELOG_en.md b/docker/CHANGELOG_en.md old mode 100644 new mode 100755 diff --git a/docker/Dockerfile b/docker/Dockerfile index 9e5371eae3b..70560a93c1d 100755 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -12,80 +12,71 @@ # limitations under the License. -FROM ubuntu:20.04 -MAINTAINER dongjinguang@huawei.com +FROM ubuntu:18.04 WORKDIR /home/openharmony -RUN apt-get update -y \ - && apt-get install curl wget -y \ - && apt-get install vim -y \ - && apt-get install ssh -y \ - && apt-get install git -y \ - && apt-get install python3.8 -y \ - && apt-get install python3-pip -y \ - && apt-get install dosfstools -y \ - && apt-get install mtools -y \ - && apt-get install scons -y \ - && apt-get install make -y \ - && apt-get install libffi-dev -y \ - && apt-get install zip -y \ - && apt-get install python3-distutils -y \ - && apt-get install binutils -y \ - && apt-get install mtd-utils -y \ - && apt-get install libc6-dev-x32 -y \ - && DEBIAN_FRONTEND="noninteractive" TZ="America/New_York" apt-get -y install tzdata \ - && apt-get install default-jre -y \ - && apt-get install default-jdk -y \ - && apt-get install bison -y \ - && apt-get install flex -y \ - && apt-get install bc -y \ - && apt-get install doxygen -y \ - && apt-get install u-boot-tools -y \ - && apt-get install gcc-arm-linux-gnueabi -y \ - && apt-get install build-essential \ - && apt-get install locales \ - && apt-get install ruby -y \ +RUN sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list \ + && sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list \ + && apt-get update -y \ + && apt-get install -y apt-utils binutils bison flex bc build-essential make mtd-utils gcc-arm-linux-gnueabi u-boot-tools python3.8 python3-pip git zip unzip curl wget gcc g++ ruby=1:2.5.1 dosfstools mtools default-jre default-jdk scons python3.8-distutils perl openssl libssl-dev cpio git-lfs m4 ccache zlib1g-dev tar rsync liblz4-tool genext2fs binutils-dev device-tree-compiler e2fsprogs git-core gnupg gnutls-bin gperf lib32ncurses5-dev libffi-dev zlib* libelf-dev libx11-dev libgl1-mesa-dev lib32z1-dev xsltproc x11proto-core-dev libc6-dev-i386 libxml2-dev lib32z-dev libdwarf-dev \ + && apt-get install -y grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5 libncurses5-dev libncursesw5 libstdc++6 python2.7 gcc-arm-none-eabi \ + && apt-get install -y vim ssh locales \ + && apt-get install -y doxygen \ && locale-gen "en_US.UTF-8" \ - && rm -rf /bin/sh /usr/bin/python /usr/bin/python3 \ + && rm -rf /bin/sh /usr/bin/python /usr/bin/python3 /usr/bin/python3m \ && ln -s /bin/bash /bin/sh \ && ln -s /usr/bin/python3.8 /usr/bin/python3 \ + && ln -s /usr/bin/python3.8 /usr/bin/python3m \ && ln -s /usr/bin/python3.8 /usr/bin/python \ - && pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple setuptools \ - && pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple kconfiglib \ - && pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple pycryptodome \ - && pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple ecdsa \ - && pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple ohos-build \ + && curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/bin/repo \ + && chmod +x /usr/bin/repo \ + && pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple requests setuptools pymongo kconfiglib pycryptodome ecdsa ohos-build pyyaml prompt_toolkit==1.0.14 redis json2html yagmail python-jenkins \ + && pip3 install esdk-obs-python --trusted-host pypi.org \ + && pip3 install six --upgrade --ignore-installed six \ && mkdir -p /home/tools \ + && mkdir -p /home/tools/gn \ && wget -P /home/tools https://repo.huaweicloud.com/harmonyos/compiler/clang/10.0.1-62608/linux/llvm.tar.gz \ && wget -P /home/tools https://repo.huaweicloud.com/harmonyos/compiler/hc-gen/0.65/linux/hc-gen-0.65-linux.tar \ && wget -P /home/tools https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz \ && wget -P /home/tools https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar \ && wget -P /home/tools https://repo.huaweicloud.com/harmonyos/compiler/gn/1717/linux/gn-linux-x86-1717.tar.gz \ - && wget -P /home/tools https://mirrors.huaweicloud.com/nodejs/v12.20.0/node-v12.20.0-linux-x64.tar.gz \ - && wget -P /home/tools https://repo.huaweicloud.com/harmonyos/develop_tools/hmos_app_packing_tool.jar \ - && wget -P /home/tools https://repo.huaweicloud.com/harmonyos/develop_tools/hapsigntoolv2.jar \ - && tar xvf /home/tools/llvm.tar.gz -C /home/tools \ - && tar xvf /home/tools/hc-gen-0.65-linux.tar -C /home/tools \ - && tar xvf /home/tools/gcc_riscv32-linux-7.3.0.tar.gz -C /home/tools \ - && tar xvf /home/tools/ninja.1.9.0.tar -C /home/tools \ - && tar xvf /home/tools/gn-linux-x86-1717.tar.gz -C /home/tools \ - && tar xvf /home/tools/node-v12.20.0-linux-x64.tar.gz -C /home/tools \ + && wget -P /home/tools https://mirrors.huaweicloud.com/nodejs/v14.15.4/node-v14.15.4-linux-x64.tar.xz \ + && wget -P /home/tools https://hm-verify.obs.cn-north-4.myhuaweicloud.com/qemu-5.2.0.tar.xz \ + && tar -xvf /home/tools/llvm.tar.gz -C /home/tools \ + && tar -xvf /home/tools/hc-gen-0.65-linux.tar -C /home/tools \ + && tar -xvf /home/tools/gcc_riscv32-linux-7.3.0.tar.gz -C /home/tools \ + && tar -xvf /home/tools/ninja.1.9.0.tar -C /home/tools \ + && tar -xvf /home/tools/gn-linux-x86-1717.tar.gz -C /home/tools/gn \ + && tar -xJf /home/tools/node-v14.15.4-linux-x64.tar.xz -C /home/tools \ + && cp /home/tools/node-v14.15.4-linux-x64/bin/node /usr/local/bin \ + && ln -s /home/tools/node-v14.15.4-linux-x64/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \ + && ln -s /home/tools/node-v14.15.4-linux-x64/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx \ + && tar -xJf /home/tools/qemu-5.2.0.tar.xz -C /home/tools \ && sed -i '$aexport PATH=/home/tools/llvm/bin:$PATH' /root/.bashrc \ && sed -i '$aexport PATH=/home/tools/hc-gen:$PATH' /root/.bashrc \ && sed -i '$aexport PATH=/home/tools/gcc_riscv32/bin:$PATH' /root/.bashrc \ && sed -i '$aexport PATH=/home/tools/ninja:$PATH' /root/.bashrc \ - && sed -i '$aexport PATH=/home/tools/node-v12.20.0-linux-x64/bin:$PATH' /root/.bashrc \ - && sed -i '$aexport PATH=/home/tools:$PATH' /root/.bashrc \ + && sed -i '$aexport PATH=/home/tools/node-v14.15.4-linux-x64/bin:$PATH' /root/.bashrc \ + && sed -i '$aexport PATH=/home/tools/gn:$PATH' /root/.bashrc \ && sed -i '$aexport PATH=/root/.local/bin:$PATH' /root/.bashrc \ && export PATH=/home/tools/llvm/bin:$PATH \ && export PATH=/home/tools/hc-gen:$PATH \ && export PATH=/home/tools/gcc_riscv32/bin:$PATH \ && export PATH=/home/tools/ninja:$PATH \ && export PATH=/home/tools/node-v12.20.0-linux-x64/bin:$PATH \ - && export PATH=/home/tools:$PATH \ + && export PATH=/home/tools/gn:$PATH \ && export PATH=/root/.local/bin:$PATH \ + && cd /home/tools/qemu-5.2.0 \ + && mkdir build \ + && cd build \ + && ../configure --target-list=arm-softmmu \ + && make -j \ + && make install \ + && cd /home/openharmony \ && rm -rf /home/tools/*.tar \ && rm -rf /home/tools/*.gz \ + && rm -rf /home/tools/*.xz \ + && rm -rf /home/tools/qemu-5.2.0 \ && npm install -g @ohos/hpm-cli --registry https://mirrors.huaweicloud.com/repository/npm/ ENV LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8 LC_ALL=en_US.UTF-8 diff --git a/docker/README_en.md b/docker/README_en.md old mode 100644 new mode 100755 diff --git a/docker/build.sh b/docker/build.sh index 0c8b1fc8b36..e1a76182519 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -docker build -t openharmony-docker:0.0.7 . +docker build -t openharmony-docker:1.0.0 . diff --git a/docker/standard/CHANGELOG.md b/docker/standard/CHANGELOG.md deleted file mode 100644 index c37b6bc9eef..00000000000 --- a/docker/standard/CHANGELOG.md +++ /dev/null @@ -1,36 +0,0 @@ - ### 0.0.8(2022/01/16) - -新增安装doxygen。 - - ### 0.0.7(2022/01/11) - -新增安装genext2fs和liblz4-tool。 - - ### 0.0.6(2022/01/04) - -新增安装hb。 - - ### 0.0.5(2021/10/28) - -新增安装tar、binutils、git-lfs、gnutls-bin、python3.8、python3-pip、cpio。 - - ### 0.0.4(2021/09/18) - -1、删除编译依赖的工具预装。 - -2、增加安装ruby。 - - ### 0.0.3(2021/08/30) - -1、更新llvm版本从10.0.1-62608更新到10.0.1-69957。 - -2、增加安装gcc_aarch64。 - - ### 0.0.2(2021/08/11) - -新增安装llvm-10.0.1-62608和restool工具。 - - ### 0.0.1(2021/06/02) - -提供OpenHarmony 2.0版本docker编译环境,预装编译依赖工具。 - diff --git a/docker/standard/CHANGELOG_en.md b/docker/standard/CHANGELOG_en.md deleted file mode 100644 index ce1cceda1cc..00000000000 --- a/docker/standard/CHANGELOG_en.md +++ /dev/null @@ -1,35 +0,0 @@ - ### 0.0.8 (2022/01/16) - -Added the installation of doxygen. - - ### 0.0.7 (2022/01/11) - -Added the installation of genext2fs and liblz4-tool. - - ### 0.0.6 (2022/01/04) - -Added the installation of hb. - - ### 0.0.5 (2021/10/28) - -Added the installation of tar, binutils, git-lfs, gnutls-bin, python3.8, python3-pip, and cpio. - - ### 0.0.4 (2021/09/18) - -1\. Removed pre-installed build dependency tools. - -2\. Added the Ruby installation. - - ### 0.0.3 (2021/08/30) - -1\. Updated LLVM from 10.0.1-62608 to 10.0.1-69957. - -2\. Added the installation of gcc_aarch64. - - ### 0.0.2 (2021/08/11) - -Added the installation of llvm-10.0.1-62608 and restool. - - ### 0.0.1 (2021/06/02) - -Provided a Docker build environment for OpenHarmony 2.0 and pre-installed build dependency tools. \ No newline at end of file diff --git a/docker/standard/Readme-en.md b/docker/standard/Readme-en.md deleted file mode 100755 index cdfc3cc4a00..00000000000 --- a/docker/standard/Readme-en.md +++ /dev/null @@ -1,31 +0,0 @@ -## Standalone Docker Environment - -This document provides guidance on building the Docker image for standard-system devices. For details about how to build the Docker image for mini- and small-system devices, see [OpenHarmony Docker Image](https://gitee.com/openharmony/docs/blob/master/docker/README_en.md) - -The Docker image of OpenHarmony is hosted on [HUAWEI Cloud SWR](https://auth.huaweicloud.com/authui/login.html?service=https%3A%2F%2Fconsole.huaweicloud.com%2Fswr%2F%3Fregion%3Dcn-south-1%26cloud_route_state%3D%2Fapp%2Fwarehouse%2FwarehouseMangeDetail%2Fgoldensir%2Fopenharmony-docker%2Fopenharmony-docker%3Ftype%3DownImage&locale=en-us#/login). Using the Docker image will help simplify environment configurations needed for the building. After configuring the development environments, perform the steps below to access the Docker environment. The following steps use Ubuntu as an example (Windows is also supported). - -### Setting Up the Docker Environment for Standard-System Devices (reference memory ≥ 128 MB) - -1. Obtain the Docker image. -``` -docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 -``` -2. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: -``` -docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 -``` - -### Building for Standard-System Devices (reference memory ≥ 128 MB) -Run the following script to start building for Standard-System Devices (reference memory ≥ 128 MB) - -``` -./build.sh --product-name {product_name} --ccache -``` -**{product_name}** indicates the platform supported by the current distribution, for example, Hi3516DV300, rk3568. -Files generated during compilation are stored in the **out/{device_name}/** directory, and the generated image is stored in the **out/{device_name}/packages/phone/images/** directory. - - - -**Note** - -You can exit Docker by simply running the **exit** command. \ No newline at end of file diff --git a/docker/standard/Readme.md b/docker/standard/Readme.md deleted file mode 100755 index 5997c8b0ade..00000000000 --- a/docker/standard/Readme.md +++ /dev/null @@ -1,31 +0,0 @@ -## 独立Docker环境 - -本文为标准系统类设备Docker使用指导,[点此查看](https://gitee.com/openharmony/docs/blob/master/docker/README.md)小型和轻量系统类设备使用指导。 - -OpenHarmony的Docker镜像托管在HuaweiCloud SWR上。开发者可以通过该镜像在很大程度上简化编译前的环境配置。开发者在配置好开发环境后,通过以下步骤来使用Docker环境。 - -### 搭建Docker环境-标准系统类设备(参考内存≥128MB) - -1. 获取Docker镜像。 -``` -docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 -``` -2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 -``` -docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 -``` - -### 编译源码-标准系统类设备(参考内存≥128MB) -通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 - -``` -./build.sh --product-name {product_name} --ccache -``` -{product_name}为当前版本支持的平台。比如:Hi3516DV300、rk3568等。 -编译所生成的文件都归档在out/{device_name}/目录下,结果镜像输出在 out/{device_name}/packages/phone/images/ 目录下。 - - - -**说明** - - 退出Docker执行exit命令即可。 \ No newline at end of file diff --git a/docker/standard/build.sh b/docker/standard/build.sh deleted file mode 100755 index d51927c8ef8..00000000000 --- a/docker/standard/build.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -docker build -t openharmony-docker-standard:0.0.8 . diff --git a/docker/standard/dockerfile b/docker/standard/dockerfile deleted file mode 100755 index 5451542fc8a..00000000000 --- a/docker/standard/dockerfile +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FROM ubuntu:18.04 -WORKDIR /home/openharmony - -ARG DEBIAN_FRONTEND=noninteractive -ARG PREBUILTS_DIR=/home/prebuilts -ARG HOME_TOOLS=/home/tools - -RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak - -COPY sources.list /etc/apt - -RUN apt-get update \ - && apt-get install -y \ - apt-utils \ - vim \ - tar \ - binutils \ - software-properties-common \ - openssh-server \ - iputils-ping \ - curl \ - net-tools \ - bsdmainutils \ - kmod \ - bc \ - rsync \ - gawk \ - ssh \ - ccache \ - zip \ - python-dev \ - make \ - m4 \ - gcc-multilib \ - ca-certificates-java \ - unzip \ - python3-yaml \ - perl \ - openssl \ - libssl1.1 \ - gnupg \ - xsltproc \ - x11proto-core-dev \ - tcl \ - python3-crypto \ - python-yaml \ - python-crypto \ - libxml2-utils \ - libxml2-dev \ - libx11-dev \ - libssl-dev \ - libgl1-mesa-dev \ - lib32z1-dev \ - lib32ncurses5-dev \ - g++-multilib \ - flex \ - bison \ - doxygen \ - git \ - git-lfs \ - subversion \ - tofrodos \ - pigz \ - expect \ - python3-xlrd \ - python-xlrd \ - wget \ - git-core \ - gperf \ - build-essential \ - zlib1g-dev \ - libc6-dev-i386 \ - lib32z-dev \ - openjdk-8-jdk \ - ruby \ - gnutls-bin \ - python3.8 \ - python3-pip \ - cpio \ - genext2fs \ - doxygen \ - liblz4-tool \ - && rm -rf /bin/sh /usr/bin/python /usr/bin/python3 \ - && ln -s /bin/bash /bin/sh \ - && ln -s /usr/bin/python3.8 /usr/bin/python3 \ - && ln -s /usr/bin/python3.8 /usr/bin/python \ - && python3 -m pip install --user ohos-build \ - && mkdir -p $PREBUILTS_DIR/prebuilts $HOME_TOOLS - -RUN wget -P $HOME_TOOLS https://mirrors.huaweicloud.com/nodejs/v12.18.4/node-v12.18.4-linux-x64.tar.gz \ - && wget -P $HOME_TOOLS https://mirrors.huaweicloud.com/nodejs/v12.18.4/node-v12.18.4-darwin-x64.tar.gz \ - && tar xvf $HOME_TOOLS/node-v12.18.4-linux-x64.tar.gz -C $PREBUILTS_DIR/prebuilts \ - && tar xvf $HOME_TOOLS/node-v12.18.4-darwin-x64.tar.gz -C $PREBUILTS_DIR/prebuilts \ - && sed -i '$aexport PATH='"$PREBUILTS_DIR"'/prebuilts/node-v12.18.4-linux-x64/bin:$PATH' /root/.bashrc \ - && sed -i '$aexport PATH='"$PREBUILTS_DIR"'/prebuilts/hc-gen:$PATH' /root/.bashrc \ - && export PATH=$PATH:$PREBUILTS_DIR/prebuilts/node-v12.18.4-linux-x64/bin \ - && export PATH=$PATH:$PREBUILTS_DIR/prebuilts/hc-gen \ - && rm -rf $HOME_TOOLS \ - && npm install -g @ohos/hpm-cli --registry https://registry.npm.taobao.org diff --git a/docker/standard/sources.list b/docker/standard/sources.list deleted file mode 100755 index 78030974c6f..00000000000 --- a/docker/standard/sources.list +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe -deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe -deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe -deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe -deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe -deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe -deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe -deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe -deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe -deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe \ No newline at end of file -- Gitee From 8cef0ccbfd066f9fba5bf37a07e5af2f7212bed4 Mon Sep 17 00:00:00 2001 From: c00565983 Date: Wed, 9 Mar 2022 15:48:51 +0800 Subject: [PATCH 242/282] combine docker Signed-off-by: c00565983 --- docker/CHANGELOG.md | 6 ++++++ docker/CHANGELOG_en.md | 8 +++++++- docker/README.md | 19 +++++++++---------- docker/README_en.md | 18 ++++++++---------- en/device-dev/get-code/gettools-acquire.md | 19 ++++++++++--------- .../quickstart-standard-docker-environment.md | 4 ++-- zh-cn/device-dev/get-code/gettools-acquire.md | 16 ++++++++-------- .../quickstart-lite-docker-environment.md | 4 ++-- ...uickstart-standard-running-hi3516-build.md | 4 ++-- ...uickstart-standard-running-rk3568-build.md | 4 ++-- 10 files changed, 56 insertions(+), 46 deletions(-) diff --git a/docker/CHANGELOG.md b/docker/CHANGELOG.md index c293b830db2..ab06f140919 100755 --- a/docker/CHANGELOG.md +++ b/docker/CHANGELOG.md @@ -1,3 +1,9 @@ +### 1.0.0 (2022/03/09) + +合并轻设备和富设备系统docker编译环境。 + + + ### 0.0.7 (2022/02/16) 增加安装doxygen工具。 diff --git a/docker/CHANGELOG_en.md b/docker/CHANGELOG_en.md index 1dac4c8e523..94189f8d742 100755 --- a/docker/CHANGELOG_en.md +++ b/docker/CHANGELOG_en.md @@ -1,10 +1,16 @@ +### 1.0.0 (2022/03/09) + +Combine the docker build environment of Mini-System Devices (reference memory ≥ 128 KB), Small-System Devices (reference memory ≥ 1 MB) and Standard-System Devices (reference memory ≥ 128 MB). + + + ### 0.0.7 (2022/02/16) Added the installation of doxygen. -### 0.0.6(2022/02/10) +### 0.0.6 (2022/02/10) 1\. Updated hb. diff --git a/docker/README.md b/docker/README.md index 6f536192dcc..d38a6f295c2 100755 --- a/docker/README.md +++ b/docker/README.md @@ -2,30 +2,29 @@ ### Docker镜像简介 -本文为小型和轻量系统类设备Docker使用指导,[点此查看](https://gitee.com/openharmony/docs/blob/master/docker/standard/Readme.md)标准系统类设备使用指导。 +本文为OpenHarmony的Docker编译环境使用指导。 OpenHarmony的Docker镜像托管在**HuaweiCloud SWR**上,开发者可以通过该镜像在很大程度上简化编译前的环境配置。 目前容器化构建选项支持情况如下: -| Docker镜像仓库 | 标签 | 说明 | -| :----------------------------------------------------------- | :------ | :----------------------------------------------------------- | -| `swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker` | `0.0.7` | 已经预安装OpenHarmony版本的编译环境,支持轻量系统类设备(参考内存≥128KB)和小型系统类设备(参考内存≥1MB)的版本构建。 | +| Docker镜像仓库 | 标签 | 说明 | +| :----------------------------------------------------------- | :------ | :------------------------------------ | +| `swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker` | `1.0.0` | 已经预安装OpenHarmony版本的编译环境。 | ### 使用方式及步骤 - 开发者在配置好开发环境后,可以通过以下步骤来使用我们提供的Docker环境。详情请参见[Docker编译环境](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/gettools-acquire.md)。 + 开发者在下载好源码后,可以通过以下步骤来使用我们提供的Docker环境。详情请参见[Docker编译环境](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/gettools-acquire.md)。 1. 获取Docker镜像 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 3. 通过如下命令启动不同平台的编译 ``` - hb set #设置工作目录。 - . #输入源码所在目录,点(.)表示当前目录。 - 在显示的页面中通过键盘上下键选择需要编译的平台,通过回车确定选择。 + hb set #在显示的页面中通过键盘上下键选择需要编译的平台,通过回车确定选择。 hb build -f #执行编译。 ``` + diff --git a/docker/README_en.md b/docker/README_en.md index c41dab5a571..9853079a565 100755 --- a/docker/README_en.md +++ b/docker/README_en.md @@ -2,30 +2,28 @@ ### Docker Image -This document provides guidance on building the Docker image for mini- and small-system devices. For details about how to build the Docker image for standard-system devices, see [OpenHarmony Docker Image](https://gitee.com/openharmony/docs/blob/master/docker/standard/Readme-en.md) +This document provides guidance on building the Docker image for mini- and small-system devices. The Docker image of OpenHarmony is hosted on [HUAWEI Cloud SWR](https://auth.huaweicloud.com/authui/login.html?service=https%3A%2F%2Fconsole.huaweicloud.com%2Fswr%2F%3Fregion%3Dcn-south-1%26cloud_route_state%3D%2Fapp%2Fwarehouse%2FwarehouseMangeDetail%2Fgoldensir%2Fopenharmony-docker%2Fopenharmony-docker%3Ftype%3DownImage&locale=en-us#/login). Using the Docker image will help simplify environment configurations needed for the building. The following table lists container-based options needed for building in the standalone Docker environment. -| Docker Image Repository | Tag | Description | -| :----------------------------------------------------------- | :------ | :----------------------------------------------------------- | -| `swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker` | `0.0.7` | The OpenHarmony build environment has been pre-installed. This repository applies to Mini-System Devices (reference memory ≥ 128 KB) and Small-System Devices (reference memory ≥ 1 MB). | +| Docker Image Repository | Tag | Description | +| :----------------------------------------------------------- | :------ | :-------------------------------------------------------- | +| `swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker` | `1.0.0` | The OpenHarmony build environment has been pre-installed. | ### Usage - After configuring the development environments, perform the steps below to access the Docker environment. + After downloading the OpenHarmony code, perform the steps below to access the Docker environment. 1. Obtain the Docker image. ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 3. Run the following script to start building for different platforms. ``` - hb set # Set the working directory. - . # Enter the directory where the source code is stored. If the code is stored in the current directory, enter a period (.). - Press the Up or Down key to select the platform to build on, then press Enter. + hb set # Press the Up or Down key to select the platform to build on, then press Enter. hb build -f # Start building. ``` diff --git a/en/device-dev/get-code/gettools-acquire.md b/en/device-dev/get-code/gettools-acquire.md index 21e5bccc54e..6c06f41669b 100644 --- a/en/device-dev/get-code/gettools-acquire.md +++ b/en/device-dev/get-code/gettools-acquire.md @@ -30,16 +30,16 @@ OpenHarmony provides the following two types of Docker environments for you to q

swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker

-

0.0.7

+

1.0.0

Standard system

Ubuntu

-

swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard

+

swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker

-

0.0.8

+

1.0.0

HPM-based Docker environment

@@ -62,6 +62,7 @@ OpenHarmony provides the following two types of Docker environments for you to q + ## Preparations Before using the Docker environment, perform the following operations: @@ -82,7 +83,7 @@ The Docker image of OpenHarmony is hosted on [HUAWEI CLOUD SWR](https://console 1. Obtain the Docker image. ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: @@ -90,13 +91,13 @@ The Docker image of OpenHarmony is hosted on [HUAWEI CLOUD SWR](https://console Run the following command in Ubuntu: ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` Run the following command in Windows \(assuming that the source code directory is **D:\\OpenHarmony**\): ``` - docker run -it -v D:\OpenHarmony:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker run -it -v D:\OpenHarmony:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` @@ -108,7 +109,6 @@ Set the build path to the current path. ``` hb set - . ``` **Figure 1** Setting page @@ -116,6 +116,7 @@ hb set >![](../public_sys-resources/icon-note.gif) **NOTE:** >The mapping between the development board and the building GUI: +> >- Hi3861: wifiiot\_hispark\_pegasus@hisilicon >- Hi3516: ipcamera\_hispark\_taurus@hisilicon >- Hi3518: ipcamera\_hispark\_aries@hisilicon @@ -137,13 +138,13 @@ hb set 1. Obtain the Docker image. ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:1.0.0 ``` 2. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` diff --git a/en/device-dev/quick-start/quickstart-standard-docker-environment.md b/en/device-dev/quick-start/quickstart-standard-docker-environment.md index 4f61ac051f7..ab1534cdd01 100644 --- a/en/device-dev/quick-start/quickstart-standard-docker-environment.md +++ b/en/device-dev/quick-start/quickstart-standard-docker-environment.md @@ -64,13 +64,13 @@ By default, the downloaded prebuilts binary file is stored in **OpenHarmony\_2. 1. Obtain the Docker image. ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. Go to the root directory of source code and run the following command to access the Docker build environment: ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` diff --git a/zh-cn/device-dev/get-code/gettools-acquire.md b/zh-cn/device-dev/get-code/gettools-acquire.md index 830c6001e94..a20b0312146 100644 --- a/zh-cn/device-dev/get-code/gettools-acquire.md +++ b/zh-cn/device-dev/get-code/gettools-acquire.md @@ -43,7 +43,7 @@ OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完

swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker

-

0.0.7

+

1.0.0

标准系统

@@ -52,7 +52,7 @@ OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完

swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard

-

0.0.8

+

1.0.0

HPM Docker环境

@@ -75,6 +75,7 @@ OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完 + ## 环境准备 在使用docker环境前需要先完成以下操作: @@ -95,7 +96,7 @@ OpenHarmony的Docker镜像托管在[HuaweiCloud SWR](https://console.huaweicloud 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 @@ -103,13 +104,13 @@ OpenHarmony的Docker镜像托管在[HuaweiCloud SWR](https://console.huaweicloud ubuntu下执行: ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` windows下执行(假设源码目录为D:\\OpenHarmony): ``` - docker run -it -v D:\OpenHarmony:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker run -it -v D:\OpenHarmony:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` @@ -121,7 +122,6 @@ OpenHarmony的Docker镜像托管在[HuaweiCloud SWR](https://console.huaweicloud ``` hb set - . ``` **图 1** 设置编译界面 @@ -150,13 +150,13 @@ hb set 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-docker-environment.md b/zh-cn/device-dev/quick-start/quickstart-lite-docker-environment.md index a81005a338f..0618477f49c 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-docker-environment.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-docker-environment.md @@ -24,11 +24,11 @@ OpenHarmony的Docker镜像托管在[HuaweiCloud SWR](https://console.huaweicloud 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.7 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-running-hi3516-build.md b/zh-cn/device-dev/quick-start/quickstart-standard-running-hi3516-build.md index 5bb3128a436..47f745e8c9c 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-running-hi3516-build.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-running-hi3516-build.md @@ -41,13 +41,13 @@ bash build/prebuilts_download.sh 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` 2. 进入源码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-running-rk3568-build.md b/zh-cn/device-dev/quick-start/quickstart-standard-running-rk3568-build.md index 781ce3a9e2b..2b414676249 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-running-rk3568-build.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-running-rk3568-build.md @@ -41,13 +41,13 @@ bash build/prebuilts_download.sh 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:1.0.0 ``` 2. 进入源码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.8 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 ``` -- Gitee From 8f3dfc6619f87d6c37779b13a7a45d87b29856fc Mon Sep 17 00:00:00 2001 From: zhangxingxia Date: Wed, 9 Mar 2022 16:14:27 +0800 Subject: [PATCH 243/282] update filemanager api Signed-off-by: zhangxingxia --- .../reference/apis/js-apis-filemanager.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-filemanager.md b/zh-cn/application-dev/reference/apis/js-apis-filemanager.md index 5c520aef02e..28aacbace59 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-filemanager.md +++ b/zh-cn/application-dev/reference/apis/js-apis-filemanager.md @@ -4,7 +4,7 @@ ## 导入模块 ```js -import filemanager from 'ohos.filemanager'; +import filemanager from '@ohos.fileManager'; ``` ## 系统能力 @@ -71,7 +71,7 @@ filemanager.getRoot((err, fileInfo) => { listFile(path : string, type : string, options? : {dev? : DevInfo, offset? : number, count? : number}) : Promise<FileInfo[]> -以异步方法获取获取第二层相册,文件信息。使用promise形式返回结果。 +以异步方法获取第二层相册,文件信息。使用promise形式返回结果。 - 参数 | 参数名 | 类型 | 必填 | 说明 | @@ -106,8 +106,7 @@ filemanager.listFile(media_path, "file") console.log(JSON.Stringify(fileInfo)) } } -}) -.catch((err) => { +}).catch((err) => { console.log(err) }) ``` @@ -115,7 +114,7 @@ filemanager.listFile(media_path, "file") listFile(path : string, type : string, options? : {dev? : DevInfo, offset? : number, count? : number}, callback : AsyncCallback<FileInfo[]>) : void -以异步方法获取获取第二层相册,文件信息。使用callback形式返回结果。 +以异步方法获取第二层相册,文件信息。使用callback形式返回结果。 - 参数 -- Gitee From 702cd2843c3b6fd199e86947439b7e89add52db3 Mon Sep 17 00:00:00 2001 From: zhangxin_T Date: Wed, 9 Mar 2022 16:24:19 +0800 Subject: [PATCH 244/282] modify the doc Signed-off-by: zhangxin_T --- .../background-task-dev-guide.md | 4 +- .../background-task-overview.md | 4 +- .../apis/js-apis-backgroundTaskManager.md | 56 ++++++++++++------- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/zh-cn/application-dev/background-task-management/background-task-dev-guide.md b/zh-cn/application-dev/background-task-management/background-task-dev-guide.md index 20477809167..526670f34b7 100644 --- a/zh-cn/application-dev/background-task-management/background-task-dev-guide.md +++ b/zh-cn/application-dev/background-task-management/background-task-dev-guide.md @@ -13,7 +13,7 @@ import backgroundTaskManager from '@ohos.backgroundTaskManager'; ## 短时任务 -**表1** backgroundTaskManager主要接口 +**表1** 短时任务主要接口 | 接口名 | 描述 | | -------- | -------- | @@ -106,7 +106,7 @@ ohos.permission.KEEP_BACKGROUND_RUNNING | function stopBackgroundRunning(context: Context, callback: AsyncCallback<void>): void;
function stopBackgroundRunning(context: Context): Promise<void>; | 停止后台长时任务的运行 | -其中,wantAgent的信息详见([WantAgent](#zh-cn/application-dev/reference/apis/js-apis-notification.md#WantAgent接口)) +其中,wantAgent的信息详见([WantAgent](../reference/apis/js-apis-notification.md#WantAgent接口) **表4** 后台模式类型 diff --git a/zh-cn/application-dev/background-task-management/background-task-overview.md b/zh-cn/application-dev/background-task-management/background-task-overview.md index fa4c7330628..403126992ae 100644 --- a/zh-cn/application-dev/background-task-management/background-task-overview.md +++ b/zh-cn/application-dev/background-task-management/background-task-overview.md @@ -57,6 +57,6 @@ OpenHarmony提供了九种后台模式,供需要在后台做长时任务的业 ### 长时任务使用约束 - 如果用户选择可感知业务(如播音、导航、上传下载等),触发对应后台模式,在任务启动时,系统会强制弹出通知提醒用户。 - 如果任务结束,应用应主动退出后台模式。若在后台运行期间,系统检测到应用并未使用对应后台模式的资源,则会被挂起(Suspend)。 -- 避免不合理地申请后台长时任务,长时任务类型要与应用的业务类型匹配。如表1所示。如果执行的任务和申请的类型不匹配,也会被系统检测到并被挂起(Suspend)。 +- 避免不合理地申请后台长时任务,长时任务类型要与应用的业务类型匹配。如果执行的任务和申请的类型不匹配,也会被系统检测到并被挂起(Suspend)。 - 长时任务是为了真正在后台长时间执行某个任务,如果一个应用申请了长时任务,但在实际运行过程中,并未真正运行或执行此类任务时,也会被系统检测到并被挂起(Suspend)。 -- 每个Ability同一时刻只能申请运行一个长时任务。 \ No newline at end of file +- 一个Ability同一时刻只能申请运行一个长时任务。 \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/js-apis-backgroundTaskManager.md b/zh-cn/application-dev/reference/apis/js-apis-backgroundTaskManager.md index fb4a41f4bbd..7e0470b09ba 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-backgroundTaskManager.md +++ b/zh-cn/application-dev/reference/apis/js-apis-backgroundTaskManager.md @@ -10,10 +10,6 @@ import backgroundTaskManager from '@ohos.backgroundTaskManager'; ``` -## 系统能力 -SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask -SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask - ## 权限列表 长时任务需要申请如下权限: @@ -29,6 +25,8 @@ requestSuspendDelay(reason: string, callback: Callback<void>): DelaySuspen 延迟挂起时间一般情况下默认值为180000,低电量(依据系统低电量广播)时默认值为60000。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -55,6 +53,8 @@ getRemainingDelayTime(requestId: number, callback: AsyncCallback<number>): 获取应用程序进入挂起状态前的剩余时间,使用callback形式返回。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -80,6 +80,8 @@ getRemainingDelayTime(requestId: number): Promise<number> 获取应用程序进入挂起状态前的剩余时间,使用Promise形式返回。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -107,6 +109,8 @@ cancelSuspendDelay(requestId: number): void 取消延迟挂起。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -122,6 +126,8 @@ cancelSuspendDelay(requestId: number): void 延迟挂起信息。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask + | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | requestId | number | 是 | 延迟挂起的请求ID。 | @@ -129,16 +135,18 @@ cancelSuspendDelay(requestId: number): void ## backgroundTaskManager.startBackgroundRunning -[8] startBackgroundRunning(context: Context, bgMode: BackgroundMode, wantAgent: WantAgent, callback: AsyncCallback<void>): void; +startBackgroundRunning(context: Context, bgMode: BackgroundMode, wantAgent: WantAgent, callback: AsyncCallback<void>): void; 8+ 向系统申请长时任务,使用callback形式返回结果。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | context | Context | 是 | 应用运行的上下文 | | bgMode | BackgroundMode | 是 | 向系统申请的后台模式 | - | wantAgent | WantAgent | 是 | 通知参数,用于指定长时任务通知点击跳转的界面。使用方式参考:[8] | + | wantAgent | [WantAgent](js-apis-notification.md#WantAgent接口) | 是 | 通知参数,用于指定长时任务通知点击后跳转的界面。 | | callback | AsyncCallback<void> | 是 | callback形式返回启动长时任务的结果 | - **示例**: @@ -176,16 +184,18 @@ wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { ## backgroundTaskManager.startBackgroundRunning -[8] startBackgroundRunning(context: Context, bgMode: BackgroundMode, wantAgent: WantAgent): Promise<void> +startBackgroundRunning(context: Context, bgMode: BackgroundMode, wantAgent: WantAgent): Promise<void>; 8+ 向系统申请长时任务,使用promise形式返回结果。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | context | Context | 是 | 应用运行的上下文 | | bgMode | BackgroundMode | 是 | 向系统申请的后台模式 | - | wantAgent | WantAgent | 是 | 通知参数,用于指定长时任务通知点击跳转的界面 | + | wantAgent | [WantAgent](js-apis-notification.md#WantAgent接口) | 是 | 通知参数,用于指定长时任务通知点击跳转的界面 | - **返回值** | 类型 | 说明 | @@ -223,10 +233,12 @@ wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { ## backgroundTaskManager.stopBackgroundRunning -[8] stopBackgroundRunning(context: Context, callback: AsyncCallback<void>): void; +stopBackgroundRunning(context: Context, callback: AsyncCallback<void>): void; 8+ 向系统申请取消长时任务,使用callback形式返回结果。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -252,10 +264,12 @@ backgroundTaskManager.stopBackgroundRunning(featureAbility.getContext(), callbac ## backgroundTaskManager.stopBackgroundRunning -[8] stopBackgroundRunning(context: Context): Promise<void>; +stopBackgroundRunning(context: Context): Promise<void>; 8+ 向系统申请取消长时任务,使用promise形式返回结果。 +**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask + - **参数**: | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -279,16 +293,16 @@ backgroundTaskManager.stopBackgroundRunning(featureAbility.getContext()).then(() ``` -## [8] BackgroundMode +## BackgroundMode 8+ -| 参数名 | 参数 | 描述 | +| 参数名 | 参数值 | 描述 | | ----------------------- | -------- | -------- | -| DATA_TRANSFER | 1 | 数据传输 | -| AUDIO_PLAYBACK | 2 | 音频播放 | -| AUDIO_RECORDING | 3 | 录音 | -| LOCATION | 4 | 定位导航 | -| BLUETOOTH_INTERACTION | 5 | 蓝牙相关 | -| MULTI_DEVICE_CONNECTION | 6 | 多设备互联 | -| WIFI_INTERACTION | 7 | WLAN相关(系统保留) | -| VOIP | 8 | 音视频通话(系统保留) | -| TASK_KEEPING | 9 | 计算任务(仅供PC使用) | \ No newline at end of file +| DATA_TRANSFER | 1 | 数据传输
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| AUDIO_PLAYBACK | 2 | 音频播放
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| AUDIO_RECORDING | 3 | 录音
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| LOCATION | 4 | 定位导航
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| BLUETOOTH_INTERACTION | 5 | 蓝牙相关
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| MULTI_DEVICE_CONNECTION | 6 | 多设备互联
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| WIFI_INTERACTION | 7 | WLAN相关(系统保留)
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| VOIP | 8 | 音视频通话(系统保留)
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | +| TASK_KEEPING | 9 | 计算任务(仅供PC使用)
**系统能力:** SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask | \ No newline at end of file -- Gitee From 4b6775c90e3103a4818f9c7394157feb79367de3 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Wed, 9 Mar 2022 17:12:49 +0800 Subject: [PATCH 245/282] update readme Signed-off-by: ester.zhou --- .../reference/arkui-ts/Readme-EN.md | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/en/application-dev/reference/arkui-ts/Readme-EN.md b/en/application-dev/reference/arkui-ts/Readme-EN.md index 7924866850f..1d6f1dcd5e0 100644 --- a/en/application-dev/reference/arkui-ts/Readme-EN.md +++ b/en/application-dev/reference/arkui-ts/Readme-EN.md @@ -52,17 +52,20 @@ - [Gauge](ts-basic-components-gauge.md) - [Image](ts-basic-components-image.md) - [ImageAnimator](ts-basic-components-imageanimator.md) + - [LoadingProgress](ts-basic-components-loadingprogress.md) - [Marquee](ts-basic-components-marquee.md) - [Progress](ts-basic-components-progress.md) - [QRCode](ts-basic-components-qrcode.md) - [Rating](ts-basic-components-rating.md) - - [Span](ts-basic-components-span.md) + - [Select](ts-basic-components-select.md) - [Slider](ts-basic-components-slider.md) + - [Span](ts-basic-components-span.md) - [Text](ts-basic-components-text.md) - [TextArea](ts-basic-components-textarea.md) - - [TextInput](ts-basic-components-textinput.md) +- [TextInput](ts-basic-components-textinput.md) - [Toggle](ts-basic-components-toggle.md) - + - [TextClock](ts-basic-components-textclock.md) + - [Container Components](ts-components-container.md) - [AlphabetIndexer](ts-container-alphabet-indexer.md) - [Badge](ts-container-badge.md) @@ -85,30 +88,30 @@ - [Stack](ts-container-stack.md) - [Swiper](ts-container-swiper.md) - [Tabs](ts-container-tabs.md) - - [TabContent](ts-container-tabcontent.md) + - [TabContent](ts-container-tabcontent.md) - [Stepper](ts-container-stepper.md) - [StepperItem](ts-container-stepperitem.md) - + - [Drawing Components](ts-drawing-components.md) - [Circle](ts-drawing-components-circle.md) - [Ellipse](ts-drawing-components-ellipse.md) - [Line](ts-drawing-components-line.md) - [Polyline](ts-drawing-components-polyline.md) - [Polygon](ts-drawing-components-polygon.md) - - [Path](ts-drawing-components-path.md) + - [Path](ts-drawing-components-path.md) - [Rect](ts-drawing-components-rect.md) - [Shape](ts-drawing-components-shape.md) - + - [Canvas Components](ts-components-canvas.md) - [Canvas](ts-components-canvas-canvas.md) - [CanvasRenderingContext2D](ts-canvasrenderingcontext2d.md) - [OffscreenCanvasRenderingConxt2D](ts-offscreencanvasrenderingcontext2d.md) - [Lottie](ts-components-canvas-lottie.md) - [Path2D](ts-components-canvas-path2d.md) - - [CanvasGradient](ts-components-canvas-canvasgradient.md) + - [CanvasGradient](ts-components-canvas-canvasgradient.md) - [ImageBitmap](ts-components-canvas-imagebitmap.md) - [ImageData](ts-components-canvas-imagedata.md) - + - [Animation](ts-animation.md) - [Attribute Animation](ts-animatorproperty.md) - [Explicit Animation](ts-explicit-animation.md) -- Gitee From 2743cc7eabf01151e39b0a3766ef44216baef0da Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Wed, 9 Mar 2022 17:17:40 +0800 Subject: [PATCH 246/282] update readme Signed-off-by: ester.zhou --- en/application-dev/reference/arkui-ts/Readme-EN.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/en/application-dev/reference/arkui-ts/Readme-EN.md b/en/application-dev/reference/arkui-ts/Readme-EN.md index 1d6f1dcd5e0..38d0248e35c 100644 --- a/en/application-dev/reference/arkui-ts/Readme-EN.md +++ b/en/application-dev/reference/arkui-ts/Readme-EN.md @@ -62,10 +62,10 @@ - [Span](ts-basic-components-span.md) - [Text](ts-basic-components-text.md) - [TextArea](ts-basic-components-textarea.md) -- [TextInput](ts-basic-components-textinput.md) + - [TextInput](ts-basic-components-textinput.md) - [Toggle](ts-basic-components-toggle.md) - [TextClock](ts-basic-components-textclock.md) - + - [Container Components](ts-components-container.md) - [AlphabetIndexer](ts-container-alphabet-indexer.md) - [Badge](ts-container-badge.md) @@ -111,7 +111,6 @@ - [CanvasGradient](ts-components-canvas-canvasgradient.md) - [ImageBitmap](ts-components-canvas-imagebitmap.md) - [ImageData](ts-components-canvas-imagedata.md) - - [Animation](ts-animation.md) - [Attribute Animation](ts-animatorproperty.md) - [Explicit Animation](ts-explicit-animation.md) @@ -132,5 +131,6 @@ - [List Selection Dialog Box](ts-methods-action-sheet.md) - [Appendix](ts-appendix.md) + - [Built-in Enums](ts-appendix-enums.md) -- Gitee From 66bedba43dce52e9963f9f6ed44701469fc48fde Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Wed, 9 Mar 2022 17:23:56 +0800 Subject: [PATCH 247/282] add docs Signed-off-by: ester.zhou --- .../reference/arkui-ts/figures/refresh.gif | Bin 0 -> 21315 bytes .../arkui-ts/ts-container-refresh.md | 80 ++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 en/application-dev/reference/arkui-ts/figures/refresh.gif create mode 100644 en/application-dev/reference/arkui-ts/ts-container-refresh.md diff --git a/en/application-dev/reference/arkui-ts/figures/refresh.gif b/en/application-dev/reference/arkui-ts/figures/refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7796bdc1286c55b3853d52cf0f81d84cec6e8d4 GIT binary patch literal 21315 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 literal 0 HcmV?d00001 diff --git a/en/application-dev/reference/arkui-ts/ts-container-refresh.md b/en/application-dev/reference/arkui-ts/ts-container-refresh.md new file mode 100644 index 00000000000..fefd46e33b5 --- /dev/null +++ b/en/application-dev/reference/arkui-ts/ts-container-refresh.md @@ -0,0 +1,80 @@ +# Refresh + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version. + +The **** component is used to refresh a page through a pull-down gesture. + +## Required Permissions + +None + +## Child Components + +This component supports only one child component. + +## APIs + +Refresh\(value: \{refreshing: boolean, offset?: Length, friction?: number\}\) + +- Parameters + + | Name| Value Type| Mandatory| Default Value| Description| + | -------- | -------- | -------- | -------- | -------- | + | refreshing | boolean | Yes| - | Whether the current component is being refreshed.| + | offset | Length | No| 16 | Distance to the top of the parent component from the **** component that comes to rest after a successful pull-down gesture.| + | friction | number | No| 62 | Coefficient of friction, which indicates the **** component's sensitivity to the pull-down gesture. The value ranges from 0 to 100.
- **0** indicates that the **** component is not sensitive to the pull-down gesture.
- **100** indicates that the **** component is highly sensitive to the pull-down gesture.
- A larger value indicates a more sensitive response of the **** component to the pull-down gesture.| + + + +## Events + + +| Name| Description| +| -------- | -------- | +| onStateChange(callback: (state: RefreshStatus) => void)| Triggered when the refresh status changes.
**state** indicates the refresh status.| +| onRefreshing(callback: () => void)| Triggered when the component enters the refresh state.| + +- RefreshStatus enums + + | Name| Description| + | -------- | -------- | + | Inactive | The component is not pulled down. This is the default value.| + | Drag | The component is being pulled down, but the pulled distance is shorter than the minimum length required to trigger the refresh.| + | OverDrag | The component is being pulled down, and the pulled distance exceeds the minimum length required to trigger the refresh.| + | Refresh | The pull-down ends, and the component rebounds to the minimum length required to trigger the refresh and enters the refresh state.| + | Done | The refresh is complete, and the component returns to the initial state (top).| + + +## Example + +``` +@Entry +@Component +struct RefreshExample { + @State isRefreshing: boolean = false + @State counter: number = 0 + + build() { + Column() { + Refresh({refreshing: this.isRefreshing, offset: 120, friction: 100}) { + Text('Pull Down and refresh: ' + this.counter) + .fontSize(30) + .margin(10) + } + .onStateChange((refreshStatus: RefreshStatus) => { + console.info('Refresh onStatueChange state is ' + refreshStatus) + }) + .onRefreshing(() => { + setTimeout(() => { + this.counter++ + this.isRefreshing = false + }, 1000) + console.log('onRefreshing test') + }) + } + } +} +``` + +![](figures/refresh.gif) -- Gitee From 4813c95e2e28c4b88378bc70a9412e3c47b33ca1 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Wed, 9 Mar 2022 17:30:34 +0800 Subject: [PATCH 248/282] update readme Signed-off-by: ester.zhou --- en/application-dev/reference/arkui-ts/Readme-EN.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/en/application-dev/reference/arkui-ts/Readme-EN.md b/en/application-dev/reference/arkui-ts/Readme-EN.md index 38d0248e35c..775bd3d067c 100644 --- a/en/application-dev/reference/arkui-ts/Readme-EN.md +++ b/en/application-dev/reference/arkui-ts/Readme-EN.md @@ -88,11 +88,11 @@ - [Stack](ts-container-stack.md) - [Swiper](ts-container-swiper.md) - [Tabs](ts-container-tabs.md) - - [TabContent](ts-container-tabcontent.md) - - [Stepper](ts-container-stepper.md) - - [StepperItem](ts-container-stepperitem.md) - + - [TabContent](ts-container-tabcontent.md) + + - [Refresh](ts-container-refresh.md) - [Drawing Components](ts-drawing-components.md) + - [Circle](ts-drawing-components-circle.md) - [Ellipse](ts-drawing-components-ellipse.md) - [Line](ts-drawing-components-line.md) -- Gitee From 484dd8c57fdc72db2c653ec109dde89e455955c5 Mon Sep 17 00:00:00 2001 From: zhangxingxia Date: Wed, 9 Mar 2022 17:33:27 +0800 Subject: [PATCH 249/282] update api Signed-off-by: zhangxingxia --- .../apis/js-apis-storage-statistics.md | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-storage-statistics.md b/zh-cn/application-dev/reference/apis/js-apis-storage-statistics.md index 1f6fd7240d5..423630408b8 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-storage-statistics.md +++ b/zh-cn/application-dev/reference/apis/js-apis-storage-statistics.md @@ -6,7 +6,7 @@ ## 导入模块 ```js -import storagestatistics from "@ohos.storagestatistics"; +import storagestatistics from "@ohos.storageStatistics"; ``` ## 系统能力 @@ -61,9 +61,10 @@ getTotalSizeOfVolume(volumeUuid: string, callback:AsyncCallback<number>):v let uuid = ""; storagestatistics.getTotalSizeOfVolume(uuid, function(error, number){ // do something + console.info("getTotalSizeOfVolume successfully:"+ number); }); ``` - + ## storagestatistics.getFreeSizeOfVolume @@ -115,22 +116,22 @@ getFreeSizeOfVolume(volumeUuid: string, callback:AsyncCallback<number>):vo let uuid = ""; storagestatistics.getFreeSizeOfVolume(uuid, function(error, number){ // do something + console.info("getFreeSizeOfVolume successfully:"+ number); }); ``` -## storagestatistics.getBundleStats +## storagestatistics.getBundleStats9+ -getBundleStats(volumeUuid: string, packageName:String, ): Promise<BundleStats> +getBundleStats(packageName:String, ): Promise<BundleStats> -异步获取指定卷上的应用存储状态,以promise方式返回。 +异步获取应用存储状态,以promise方式返回。 - 参数 | 参数名 | 类型 | 必填 | 说明 | | ----------- | ------ | ---- | -------- | - | volumeUuid | string | 是 | 卷id | | packageName | string | 是 | 应用包名 | - + - 返回值 | 类型 | 说明 | @@ -140,35 +141,33 @@ getBundleStats(volumeUuid: string, packageName:String, ): Promise<BundleStat - 示例 ```js - let uuid = ""; let packageName = ""; - storagestatistics.getBundleStats(uuid, packageName).then(function(BundleStats){ + storagestatistics.getBundleStats(packageName).then(function(BundleStats){ console.info("getBundleStats successfully:"+ JSON.stringify(BundleStats)); }).catch(function(err){ console.info("getBundleStats failed with error:"+ err); }); ``` -## storagestatistics.getBundleStats +## storagestatistics.getBundleStats9+ -getBundleStats(volumeUuid: string, callback:AsyncCallback<BundleStats>):void +getBundleStats(callback:AsyncCallback<BundleStats>):void -异步获取指定卷上的应用存储状态,以callback方式返回。 +异步获取应用存储状态,以callback方式返回。 - 参数 - | 参数名 | 类型 | 必填 | 说明 | - | ---------- | --------------------------------------------------------- | ---- | ------------------------------------ | - | volumeUuid | string | 是 | 卷id | - | callback | callback:AsyncCallback<[Bundlestats](#bundlestats)> | 是 | 获取指定卷上的应用存储状态之后的回调 | - + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------------------------------------- | ---- | ------------------------------------ | + | callback | callback:AsyncCallback<[Bundlestats](#bundlestats)> | 是 | 获取指定卷上的应用存储状态之后的回调 | + - 示例 ```js - let uuid = ""; let packageName = ""; - storagestatistics.getBundleStats(uuid, packageName, function(error, BundleStats){ + storagestatistics.getBundleStats(packageName, function(error, BundleStats){ // do something + console.info("getBundleStats successfully:"+ JSON.stringify(BundleStats)); }); ``` -- Gitee From 136c14a9e417f60d7fe761d1e87d03338dde29e2 Mon Sep 17 00:00:00 2001 From: CY Fan Date: Wed, 9 Mar 2022 17:37:56 +0800 Subject: [PATCH 250/282] fix typo in eswap doc Signed-off-by: CY Fan --- zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md b/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md index b95a6202433..ef358a73ff0 100644 --- a/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md +++ b/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md @@ -53,7 +53,7 @@ ESwap(Enhanced Swap)提供了自定义新增存储分区作为内存交换分区 echo /dev/block/loop6 > /proc/sys/kernel/hyperhold/device ``` - ESwap默认对换出数据使用软件加密,如果1中创建的ESwap设备支持inline加密,可以关闭ESwap的软件加密功能: + ESwap默认对换出数据使用软件加密,如果2中创建的ESwap设备支持inline加密,可以关闭ESwap的软件加密功能: ```Bash // 需确认是否支持并开启硬加密,否则不要执行该操作。 -- Gitee From 0bfc2840710912e5511ff5e7391c98beba1f9a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=9B=E4=BA=9A=E8=8A=B3?= Date: Wed, 9 Mar 2022 10:23:39 +0000 Subject: [PATCH 251/282] update zh-cn/contribute/template/guide-template.md. Signed-off-by: @ge-yafang --- zh-cn/contribute/template/guide-template.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/zh-cn/contribute/template/guide-template.md b/zh-cn/contribute/template/guide-template.md index 8305f34c38f..e01c26119b3 100644 --- a/zh-cn/contribute/template/guide-template.md +++ b/zh-cn/contribute/template/guide-template.md @@ -123,4 +123,13 @@ | 仅进行最后的业务调测,每个小任务的操作结果,在开发步骤执行完成后,及时验证操作结果。 | | | 明确开发成功标准。 | | +## 开发实例 +** *【写作要求】*** + +*提供完整的sample示例,同时简要描述示例原理和实现,并链接到源码仓。* + +针对xxx开发,有以下示例工程可供参考: + +- xxx(此处请提供源码超链接) +本示例xxxx。 -- Gitee From 599f747f977af175aea83fdccd7db23aa746276f Mon Sep 17 00:00:00 2001 From: liujinwei Date: Wed, 9 Mar 2022 10:15:00 +0800 Subject: [PATCH 252/282] add menu into doc Signed-off-by: liujinwei Change-Id: Ie73ee84179c84afddff2742ca144b2e712e73187 --- .../reference/arkui-ts/Readme-CN.md | 1 + .../reference/arkui-ts/ts-methods-menu.md | 39 +++++++++++++++++++ .../arkui-ts/ts-universal-attributes-menu.md | 15 +++++-- 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 zh-cn/application-dev/reference/arkui-ts/ts-methods-menu.md diff --git a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md index 821bad6125b..127299e7b6b 100644 --- a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md +++ b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md @@ -138,5 +138,6 @@ - [自定义弹窗](ts-methods-custom-dialog-box.md) - [日期时间选择弹窗](ts-methods-datepicker-dialog.md) - [文本选择弹窗](ts-methods-textpicker-dialog.md) + - [菜单](ts-methods-menu.md) - 附录 - [文档中涉及到的内置枚举值](ts-appendix-enums.md) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-methods-menu.md b/zh-cn/application-dev/reference/arkui-ts/ts-methods-menu.md new file mode 100644 index 00000000000..df97249f6d3 --- /dev/null +++ b/zh-cn/application-dev/reference/arkui-ts/ts-methods-menu.md @@ -0,0 +1,39 @@ +# 菜单 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 从 API Version 8 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 + +## ContextMenu.close + +close(): void + +可以通过该方法在页面范围内关闭通过[bindContextMenu](./ts-universal-attributes-menu.md#属性)给组件绑定的菜单。 + +- 示例 + ``` + @Entry + @Component + struct Index { + @Builder MenuBuilder(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text('close') + .fontSize(30) + .fontWeight(FontWeight.Bold) + .onClick(() => { + ContextMenu.close(); + }) + }.height(400) + .backgroundColor(Color.Pink) + + } + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + Column(){ + Text("Text") + }.bindContextMenu(this.MenuBuilder, ResponseType.LongPress) + } + .width('100%') + .height('100%') + } + } + ``` diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md index ba903b5b767..71c1273bb27 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-menu.md @@ -15,7 +15,7 @@ | 名称 | 参数类型 | 默认值 | 描述 | | -------- | -------- | -------- | -------- | | bindMenu | Array8+ | - | 给组件绑定菜单,点击后弹出菜单。弹出菜单项支持文本和自定义两种功能。 | -| bindContextMenu | content: [CustomBuilder](../../ui/ts-types.md)8+
responseType: ResponseType8+ | - | 给组件绑定菜单,触发方式为长按或者右键点击,弹出菜单项需要自定义。 | +| bindContextMenu8+ | content: [CustomBuilder](../../ui/ts-types.md)
responseType: ResponseType | - | 给组件绑定菜单,触发方式为长按或者右键点击,弹出菜单项需要自定义。 | - MenuItem @@ -27,11 +27,13 @@ - ResponseType8+ | 参数值 | 描述 | | -------- | -------- | - | LongPress | 通过长按触发菜单弹出 | - | RightClick | 通过鼠标右键触发菜单弹出 | + | LongPress | 通过长按触发菜单弹出。 | + | RightClick | 通过鼠标右键触发菜单弹出。 | ## 示例 +#### 普通菜单 + ``` @Entry @Component @@ -62,6 +64,8 @@ struct MenuExample { ![zh-cn_image_0000001174582862](figures/zh-cn_image_0000001174582862.gif) +#### 自定义内容菜单 + ``` import router from '@system.router'; @@ -110,10 +114,12 @@ struct MenuExample { ![zh-cn_image_0000001186807708](figures/zh-cn_image_0000001186807708.gif) +#### 菜单(右键触发显示) + ``` @Entry @Component -struct MenuExample { +struct ContextMenuExample { @Builder MenuBuilder() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { Text('Test menu item 1') @@ -129,6 +135,7 @@ struct MenuExample { .textAlign(TextAlign.Center) }.width(100) } + build() { Column() { Text('rightclick for menu') -- Gitee From f4e961d6056724e974ea006e65ee66a920049c9d Mon Sep 17 00:00:00 2001 From: laiguizhong Date: Tue, 8 Mar 2022 11:57:50 +0800 Subject: [PATCH 253/282] add accessibility docs Signed-off-by: laiguizhong Change-Id: I57ed963554fc551403d020dc6e6ff17fc23a4613 --- .../reference/apis/js-apis-accessibility.md | 585 ++++++++++++++++++ 1 file changed, 585 insertions(+) create mode 100644 zh-cn/application-dev/reference/apis/js-apis-accessibility.md diff --git a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md new file mode 100644 index 00000000000..bba00f38db9 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md @@ -0,0 +1,585 @@ +# 辅助功能 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从 API version 7 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +```typescript +import accessibility from '@ohos.accessibility'; +``` + +## 权限列表 + +无 + +## AbilityState + +辅助应用状态类型。 + +| 名称 | 描述 | +| -------- | -------- | +| enable | 无障碍服务已启用。 | +| disable | 无障碍服务已禁用。 | +| install | 无障碍服务已安装。 | + +## AbilityType + +无障碍辅助应用类型。 + +| 名称 | 描述 | +| -------- | -------- | +| audible | 表示具有听觉反馈。 | +| generic | 表示具有通用反馈。 | +| haptic | 表示具有触觉反馈。 | +| spoken | 表示具有语音反馈。 | +| visual | 表示具有视觉反馈。 | + +## AccessibilityAbilityInfo + +辅助应用信息。 + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| id | number | 是 | 否 | ability id。 | +| name | string | 是 | 否 | ability 名。 | +| bundleName | string | 是 | 否 | 包名。 | +| abilityTypes | Array<[AbilityType](#abilitytype)> | 是 | 否 | 辅助应用类型。 | +| capabilities | Array<[Capability](#capability)> | 是 | 否 | 辅助应用能力列表。 | +| description | string | 是 | 否 | 辅助应用描述。 | +| eventTypes | Array<[EventType](#eventtype)> | 是 | 否 | 辅助应用关注的无障碍事件列表。 | + +## Action + +应用所支持的目标动作。 + +| 名称 | 描述 | +| -------- | -------- | +| click | 表示点击操作。 | +| longClick | 表示长按操作。 | +| scrollForward | 表示向前滚动操作。 | +| scrollBackward | 表示向后滚动操作。 | +| focus | 表示获得焦点操作。 | +| clearFocus | 表示清除焦点操作。 | +| clearSelection | 表示清除选择操作。 | +| accessibilityFocus | 表示获得无障碍焦点操作。 | +| clearAccessibilityFocus | 表示清除无障碍焦点操作。 | +| cut | 表示剪切操作。 | +| copy | 表示复制操作。 | +| paste | 表示粘贴操作。 | +| select | 表示选择操作。 | +| setText | 表示设置文本操作。 | +| delete | 表示删除操作。 | +| setSelection | 表示选择操作。 | + +## Capability + +辅助应用能力类型。 + +| 名称 | 描述 | +| -------- | -------- | +| retrieve | 具有检索窗口内容的能力。 | +| touchGuide | 具有触摸探索模式的能力。 | +| keyEventObserver | 具有过滤按键事件的能力。 | +| zoom | 具有控制显示放大的能力。 | +| gesture | 具有执行手势动作的能力。 | + +## CaptionsFontEdgeType8+ + +字幕字体边缘类型。 + +| 名称 | 描述 | +| -------- | -------- | +| none | 无效果。 | +| raised | 凸起效果。 | +| depressed | 凹陷效果。 | +| uniform | 轮廓效果。 | +| dropShadow | 阴影效果。 | + +## CaptionsFontFamily8+ + +字幕字体。 + +| 名称 | 描述 | +| -------- | -------- | +| default | 默认字体。 | +| monospacedSerif | 等宽 Serif 字体。 | +| serif | Serif 字体。 | +| monospacedSansSerif | 等宽 Sans Serif 字体。 | +| sansSerif | Sans Serif 字体。 | +| casual | 非正式字体。 | +| cursive | 手写字体。 | +| smallCapitals | 小型大写字母字体。 | + +## CaptionsStyle8+ + +字幕风格。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| fontFamily | [CaptionsFontFamily](#captionsfontfamily) | 是 | 否 | 描述字幕字体。 | +| fontScale | number | 是 | 否 | 描述字幕字体缩放系数。 | +| fontColor | number \| string | 是 | 否 | 描述字幕字体颜色。 | +| fontEdgeType | [CaptionsFontEdgeType](#captionsfontedgetype) | 是 | 否 | 描述字幕字体边缘。 | +| backgroundColor | number \| string | 是 | 否 | 描述字幕背景颜色。 | +| windowColor | number \| string | 是 | 否 | 描述字幕窗口颜色。 | + +## CaptionsManager8+ + +字幕配置。 + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| enabled | boolean | 是 | 否 | 表示字幕风格。 | +| style | [CaptionsStyle](#captionsstyle) | 是 | 否 | 表示是否启用字幕配置。 | + +## 方法 + +### on + +on(type: 'enableChange', callback: Callback<boolean>): void; + +注册字幕配置启用的监听函数。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | 'enableChange' | 是 | 监听字幕配置启用状态。 | + | callback | Callback<boolean> | 是 | 回调函数,在启用状态变化时将状态通过此函数进行通知。 | + +- 示例 + + ```typescript + captionsMgr.on('enableChange',(data) => { + console.info('success data:subscribeStateObserver : ' + JSON.stringify(data)) + }) + ``` + +### on + +on(type: 'styleChange', callback: Callback<CaptionsStyle>): void; + +注册字幕风格变化的监听函数。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | 'styleChange' | 是 | 监听字幕风格变化。 | + | callback | Callback<CaptionsStyle> | 是 | 回调函数,在字幕风格变化时通过此函数进行通知。 | + +- 示例 + + ```typescript + captionsMgr.on('styleChange',(data) => { + console.info('success data:subscribeStateObserver : ' + JSON.stringify(data)) + }) + ``` + +### off + +off(type: 'enableChange', callback: Callback<boolean>): void; + +移除字幕配置启用的监听函数。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | 'enableChange' | 是 | 监听字幕配置启用状态。 | + | callback | Callback<boolean> | 否 | 回调函数,在启用状态变化时将状态通过此函数进行通知。 | + +- 示例 + + ```typescript + captionsMgr.off('enableChange') + ``` + +### off + +off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; + +移除字幕风格变化的监听函数。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | 'styleChange' | 是 | 字幕风格变化。 | + | callback | Callback<CaptionsStyle> | 否 | 回调函数,在字幕风格变化时通过此函数进行通知。 | + +- 示例 + + ```typescript + captionsMgr.off('styleChange') + ``` + +## EventInfo + +界面变更事件。 + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| type | [EventType](#eventtype) | 是 | 是 | 无障碍事件类型。 | +| windowUpdateType | [WindowUpdateType](#windowupdatetype) | 是 | 是 | 窗口变化类型。 | +| bundleName | string | 是 | 是 | 目标应用名。 | +| componentType | string | 是 | 是 | 事件源组件类型,如按钮、图表。 | +| pageId | number | 是 | 是 | 事件源的页面 ID。 | +| description | string | 是 | 是 | 事件描述。 | +| triggerAction | [Action](#Action) | 是 | 是 | 触发事件的 Action。 | +| textMoveUnit | [TextMoveUnit](#textmoveunit) | 是 | 是 | 文本移动粒度。 | +| contents | Array<string> | 是 | 是 | 内容列表。 | +| lastContent | string | 是 | 是 | 最新内容。 | +| beginIndex | number | 是 | 是 | 画面显示条目的开始序号。 | +| currentIndex | number | 是 | 是 | 当前条目序号。 | +| endIndex | number | 是 | 是 | 画面显示条目的结束序号。 | +| itemCount | number | 是 | 是 | 条目总数。 | + +## EventType + +无障碍事件类型。 + +| 名称 | 描述 | +| -------- | -------- | +| click | 描述点击组件的事件。 | +| longClick | 描述长按组件的事件。 | +| select | 描述选择组件的事件。 | +| focus | 描述组件获得焦点的事件。 | +| textUpdate | 描述组件文本已更改的事件。 | +| hoverEnter | 描述悬停进入组件的事件。 | +| hoverExit | 描述悬停离开组件的事件。 | +| scroll | 描述滚动视图的事件。 | +| textSelectionUpdate | 描述选定文本已更改的事件。 | +| accessibilityFocus | 描述获得无障碍焦点的事件。 | +| accessibilityFocusClear | 描述清除无障碍焦点的事件。 | + +## TextMoveUnit + +文本无障碍导航移动粒度。 + +| 名称 | 描述 | +| -------- | -------- | +| char | 以字符为移动粒度遍历节点文本。 | +| word | 以词为移动粒度遍历节点文本。 | +| line | 以行为移动粒度遍历节点文本。 | +| page | 以页为移动粒度遍历节点文本。 | +| paragraph | 以段落为移动粒度遍历节点文本。 | + +## WindowUpdateType + +窗口变化类型。 + +| 名称 | 描述 | +| -------- | -------- | +| add | 添加窗口的窗口变化事件。 | +| remove | 一个窗口被删除的窗口变化事件。 | +| title | 窗口标题已更改的窗口变化事件。 | +| bounds | 窗口边界已更改的窗口变化事件。 | +| layer | 窗口层级发生变化的窗口变化事件。 | +| active | 窗口变为活动或不活动的窗口变化事件。 | +| focus | 窗口焦点发生变化的窗口变化事件。 | +| accessibilityFocus | 窗口无障碍焦点发生变化的窗口更改事件。 | +| parent | 父窗口已更改的窗口变化事件。 | +| children | 子窗口已更改的窗口变化事件。 | +| pip | 窗口进入或退出画中画(PIP)模式的窗口变化事件。 | + +## accessibility.getAbilityLists + +getAbilityLists(abilityType: AbilityType, stateType: AbilityState): Promise<Array<AccessibilityAbilityInfo>> + +查询辅助应用列表。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | abilityType | [AbilityType](#abilitytype) | 是 | 辅助应用的类型。 | + | stateType | [AbilityState](#abilitystate) | 是 | 辅助应用的状态。 | + +- 返回值: + + | 类型 | 说明 | + | -------- | -------- | + | Promise<Array<[AccessibilityAbilityInfo](#accessibilityabilityinfo)>> | 返回辅助应用信息列表。 | + +- 示例 + + ```typescript + accessibility.getAbilityLists("spoken", "enable") + .then((data) => { + console.info('success data:getAbilityList1 : ' + JSON.stringify(data)); + for (let item of data) { + console.info(item.id); + console.info(item.name); + console.info(item.description); + console.info(item.abilityTypes); + console.info(item.eventTypes); + console.info(item.capabilities); + console.info(item.packageName); + console.info(item.filterBundleNames); + console.info(item.bundleName); + } + }).catch((error) => { + console.error('failed to getAbilityList1 because ' + JSON.stringify(error)); + }) + ``` + +## accessibility.getAbilityLists + +getAbilityLists(abilityType: AbilityType, stateType: AbilityState,callback: AsyncCallback<Array<AccessibilityAbilityInfo>>): void + +查询辅助应用列表。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | abilityType | [AbilityType](#abilitytype) | 是 | 辅助应用的类型。 | + | stateType | [AbilityState](#abilitystate) | 是 | 辅助应用的状态。 | + | callback | AsyncCallback<Array<[AccessibilityAbilityInfo](#accessibilityabilityinfo)>> | 是 | 回调函数,返回辅助应用信息列表。 | + +- 示例 + + ```typescript + accessibility.getAbilityLists("visual", "enable", (err, data) => { + if (err) { + console.error('failed to getAbilityList2 because ' + JSON.stringify(err)); + return; + } + console.info('success data:getAbilityList2 : ' + JSON.stringify(data)); + for (let item of data) { + console.info(item.id); + console.info(item.name); + console.info(item.description); + console.info(item.abilityTypes); + console.info(item.eventTypes); + console.info(item.capabilities); + console.info(item.packageName); + console.info(item.filterBundleNames); + console.info(item.bundleName); + } + }) + ``` + +## accessibility.getCaptionsManager + +getCaptionsManager(): CaptionsManager + +获取无障碍字幕配置。 + +- 参数: + + 无 + +- 返回值: + + | 类型 | 说明 | + | -------- | -------- | + | CaptionsManager | 无障碍字幕配置管理。 | + +- 示例 + + ```typescript + captionsManager = accessibility.getCaptionsManager() + ``` + +## accessibility.on + +on(type: 'accessibilityStateChange' | 'touchGuideStateChange', callback: Callback<boolean>): void + +启用变化监听。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 是 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。 | + | callback | Callback<boolean> | 是 | 回调函数,在启用状态变化时将状态通过此函数进行通知。 | + +- 示例 + + ```typescript + accessibility.on('accessibilityStateChange',(data) => { + console.info('success data:subscribeStateObserver : ' + JSON.stringify(data)) + }) + ``` + +## accessibility.off + +off(type: ‘accessibilityStateChange ’ | ‘touchGuideStateChange’, callback?: Callback<boolean>): void + +关闭变化监听。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 否 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。 | + | callback | Callback<boolean> | 否 | 要取消的监听回调函数。 | + +- 示例 + + ```typescript + accessibility.off('accessibilityStateChange',(data) => { + console.info('success data:unSubscribeStateObserver : ' + JSON.stringify(data)) + }) + ``` + +## accessibility.isOpenAccessibility + +isOpenAccessibility(): Promise<boolean> + +判断是否启用了辅助功能。 + +- 参数: + + 无 + +- 返回值: + + | 类型 | 说明 | + | -------- | -------- | + | Promise<boolean> | 如果辅助功能已启用,则返回 true;否则返回 false。 | + +- 示例 + + ```typescript + accessibility.isOpenAccessibility() + .then((data) => { + console.info('success data:isOpenAccessibility : ' + JSON.stringify(data)) + }).catch((error) => { + console.error('failed to isOpenAccessibility because ' + JSON.stringify(error)); + }) + ``` + +## accessibility.isOpenAccessibility + +isOpenAccessibility(callback: AsyncCallback<boolean>): void + +判断是否启用了辅助功能。 + +- 参数 + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<boolean> | 是 | 回调函数,如果辅助功能已启用,则返回 true;否则返回 false。 | + +- 示例 + + ```typescript + accessibility.isOpenAccessibility((err, data) => { + if (err) { + console.error('failed to isOpenAccessibility because ' + JSON.stringify(err)); + return; + } + console.info('success data:isOpenAccessibility : ' + JSON.stringify(data)) + }) + ``` + +## accessibility.isOpenTouchGuide + +isOpenTouchGuide(): Promise<boolean> + +判断触摸浏览模式是否开启。 + +- 返回值: + + | 类型 | 说明 | + | -------- | -------- | + | Promise<boolean> | 如果触摸浏览模式已开启,则返回 true;否则返回 false。 | + +- 示例 + + ```typescript + accessibility.isOpenTouchGuide() + .then((data) => { + console.info('success data:isOpenTouchGuide : ' + JSON.stringify(data)) + }).catch((error) => { + console.error('failed to isOpenTouchGuide because ' + JSON.stringify(error)); + }) + ``` + +## accessibility.isOpenTouchGuide + +isOpenTouchGuide(callback: AsyncCallback<boolean>): void + +判断触摸浏览模式是否开启。 + +- 参数 + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<boolean> | 是 | 回调函数,如果触摸浏览模式已开启,则返回 true;否则返回 false。 | + +- 示例 + + ```typescript + accessibility.isOpenTouchGuide((err, data) => { + if (err) { + console.error('failed to isOpenTouchGuide because ' + JSON.stringify(err)); + return; + } + console.info('success data:isOpenTouchGuide : ' + JSON.stringify(data)) + }) + ``` + +## accessibility.sendEvent + +sendEvent(event: EventInfo): Promise<void> + +发送无障碍事件。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | event | [EventInfo](#eventinfo) | 是 | 无障碍事件对象。 | + +- 返回值: + + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 以 Promise 形式返回结果,如果发送无障碍事件成功,则 data 有数据返回;如果发送无障碍事件失败,则 err 有数据返回。 | + +- 示例 + + ```typescript + accessibility.sendEvent(this.eventInfo) + .then((data) => { + console.info('success data:sendEvent : ' + JSON.stringify(data)) + }).catch((error) => { + console.error('failed to sendEvent because ' + JSON.stringify(error)); + }) + ``` + +## accessibility.sendEvent + +sendEvent(event: EventInfo, callback: AsyncCallback<void>): void + +发送无障碍事件。 + +- 参数: + + | 参数名 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | event | [EventInfo](#eventinfo) | 是 | 辅助事件对象。 | + | callback | AsyncCallback<void> | 是 | 回调函数,如果发送无障碍事件成功,则 AsyncCallback 中 data 有数据返回;如果发送无障碍事件失败,则 AsyncCallback 中 err 有数据返回。 | + +- 示例 + + ```typescript + accessibility.sendEvent(this.eventInfo,(err, data) => { + if (err) { + console.error('failed to sendEvent because ' + JSON.stringify(err)); + return; + } + console.info('success data:sendEvent : ' + JSON.stringify(data)) + }) + ``` -- Gitee From 5ce02794bec161fee97e9ce6f6b3bb733b9994f9 Mon Sep 17 00:00:00 2001 From: laiguizhong Date: Tue, 8 Mar 2022 12:14:30 +0800 Subject: [PATCH 254/282] add syscap Signed-off-by: laiguizhong Change-Id: I0f9f124ed30c2a9cbecdc78d4f1d73a3ae2d561e --- .../reference/apis/js-apis-accessibility.md | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md index bba00f38db9..efa6f736a13 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md @@ -17,6 +17,8 @@ import accessibility from '@ohos.accessibility'; 辅助应用状态类型。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + | 名称 | 描述 | | -------- | -------- | | enable | 无障碍服务已启用。 | @@ -27,6 +29,8 @@ import accessibility from '@ohos.accessibility'; 无障碍辅助应用类型。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + | 名称 | 描述 | | -------- | -------- | | audible | 表示具有听觉反馈。 | @@ -39,6 +43,8 @@ import accessibility from '@ohos.accessibility'; 辅助应用信息。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + ### 属性 | 名称 | 参数类型 | 可读 | 可写 | 说明 | @@ -55,6 +61,8 @@ import accessibility from '@ohos.accessibility'; 应用所支持的目标动作。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + | 名称 | 描述 | | -------- | -------- | | click | 表示点击操作。 | @@ -78,6 +86,8 @@ import accessibility from '@ohos.accessibility'; 辅助应用能力类型。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + | 名称 | 描述 | | -------- | -------- | | retrieve | 具有检索窗口内容的能力。 | @@ -90,6 +100,8 @@ import accessibility from '@ohos.accessibility'; 字幕字体边缘类型。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + | 名称 | 描述 | | -------- | -------- | | none | 无效果。 | @@ -102,6 +114,8 @@ import accessibility from '@ohos.accessibility'; 字幕字体。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + | 名称 | 描述 | | -------- | -------- | | default | 默认字体。 | @@ -117,6 +131,8 @@ import accessibility from '@ohos.accessibility'; 字幕风格。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | | fontFamily | [CaptionsFontFamily](#captionsfontfamily) | 是 | 否 | 描述字幕字体。 | @@ -145,6 +161,8 @@ on(type: 'enableChange', callback: Callback<boolean>): void; 注册字幕配置启用的监听函数。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | @@ -166,6 +184,8 @@ on(type: 'styleChange', callback: Callback<CaptionsStyle>): void; 注册字幕风格变化的监听函数。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | @@ -187,6 +207,8 @@ off(type: 'enableChange', callback: Callback<boolean>): void; 移除字幕配置启用的监听函数。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | @@ -206,6 +228,8 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 移除字幕风格变化的监听函数。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | @@ -223,6 +247,8 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 界面变更事件。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + ### 属性 | 名称 | 参数类型 | 可读 | 可写 | 说明 | @@ -246,6 +272,8 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 无障碍事件类型。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + | 名称 | 描述 | | -------- | -------- | | click | 描述点击组件的事件。 | @@ -264,6 +292,8 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 文本无障碍导航移动粒度。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + | 名称 | 描述 | | -------- | -------- | | char | 以字符为移动粒度遍历节点文本。 | @@ -276,6 +306,8 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 窗口变化类型。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + | 名称 | 描述 | | -------- | -------- | | add | 添加窗口的窗口变化事件。 | @@ -296,6 +328,8 @@ getAbilityLists(abilityType: AbilityType, stateType: AbilityState): Promise<A 查询辅助应用列表。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | @@ -337,6 +371,8 @@ getAbilityLists(abilityType: AbilityType, stateType: AbilityState,callback: Asyn 查询辅助应用列表。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | @@ -374,6 +410,8 @@ getCaptionsManager(): CaptionsManager 获取无障碍字幕配置。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing + - 参数: 无 @@ -400,7 +438,7 @@ on(type: 'accessibilityStateChange' | 'touchGuideStateChange', callback: Callbac | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 是 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。 | + | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 是 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
**系统能力**:SystemCapability.Barrierfree.Accessibility.Core
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。
**系统能力**:SystemCapability.Barrierfree.Accessibility.Vision | | callback | Callback<boolean> | 是 | 回调函数,在启用状态变化时将状态通过此函数进行通知。 | - 示例 @@ -417,11 +455,13 @@ off(type: ‘accessibilityStateChange ’ | ‘touchGuideStateChange’, callbac 关闭变化监听。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 否 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。 | + | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 否 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
**系统能力**:SystemCapability.Barrierfree.Accessibility.Core
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。
**系统能力**:SystemCapability.Barrierfree.Accessibility.Vision | | callback | Callback<boolean> | 否 | 要取消的监听回调函数。 | - 示例 @@ -438,6 +478,8 @@ isOpenAccessibility(): Promise<boolean> 判断是否启用了辅助功能。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数: 无 @@ -465,6 +507,8 @@ isOpenAccessibility(callback: AsyncCallback<boolean>): void 判断是否启用了辅助功能。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数 | 参数名 | 参数类型 | 必填 | 说明 | @@ -489,6 +533,8 @@ isOpenTouchGuide(): Promise<boolean> 判断触摸浏览模式是否开启。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 返回值: | 类型 | 说明 | @@ -512,6 +558,8 @@ isOpenTouchGuide(callback: AsyncCallback<boolean>): void 判断触摸浏览模式是否开启。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数 | 参数名 | 参数类型 | 必填 | 说明 | @@ -536,6 +584,8 @@ sendEvent(event: EventInfo): Promise<void> 发送无障碍事件。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | @@ -565,6 +615,8 @@ sendEvent(event: EventInfo, callback: AsyncCallback<void>): void 发送无障碍事件。 +**系统能力**:SystemCapability.Barrierfree.Accessibility.Core + - 参数: | 参数名 | 参数类型 | 必填 | 说明 | -- Gitee From 2a1f435d068f02ad59bc13dd7ed1f05aa3505bfd Mon Sep 17 00:00:00 2001 From: zengyawen Date: Wed, 9 Mar 2022 19:19:18 +0800 Subject: [PATCH 255/282] update docs Signed-off-by: zengyawen --- .../security/userauth-guidelines.md | 75 +++++-------------- .../security/userauth-overview.md | 8 +- 2 files changed, 22 insertions(+), 61 deletions(-) diff --git a/en/application-dev/security/userauth-guidelines.md b/en/application-dev/security/userauth-guidelines.md index ede673ad7ac..38dc7021985 100644 --- a/en/application-dev/security/userauth-guidelines.md +++ b/en/application-dev/security/userauth-guidelines.md @@ -1,65 +1,27 @@ -# User Authentication Development +# User Authentication Development ->**NOTE:** ->This document applies to JS. +## When to Use -## When to Use +OpenHarmony supports 2D and 3D facial recognition that can be used for identity authentication during device unlocking, application login, and payment. -HarmonyOS supports 2D and 3D facial recognition that can be used for identity authentication during device unlocking, application login, and payment. - -## Available APIs +## Available APIs The **userIAM\_userAuth** module provides methods for checking the support for biometric authentication, and performing and canceling authentication. You can perform authentication based on biometric features such as facial characteristics. Before performing biometric authentication, check whether your device supports this capability, including the authentication type, security level, and whether local authentication is used. If biometric authentication is not supported, consider using another authentication type. The following table lists methods in the APIs available for biometric authentication. **Table 1** Methods available for biometric authentication - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Method

-

Description

-

getAuthenticator(): Authenticator

-

Obtains an Authenticator object for user authentication. 6+

-

Obtains an Authenticator object to check the device's capability of user authentication, perform or cancel user authentication, and obtain the tips generated in the authentication process. 7+

-

checkAvailability(type: AuthType, level: SecureLevel): number

-

Checks whether the device supports the specified authentication type and security level.

-

execute(type: AuthType, level: SecureLevel, callback: AsyncCallback<number>): void

-

Performs user authentication and returns the authentication result using an asynchronous callback.

-

execute(type: AuthType, level: SecureLevel): Promise<number>

-

Performs user authentication and returns the authentication result using a promise.

-

cancel(): void

-

Cancels the current authentication.

-

on(type: "tip", callback: Callback<Tip>): void

-

Subscribes to the events of the specified type.

-

off(type: "tip", callback?: Callback<Tip>): void

-

Unsubscribes from the events of the specified type.

-
- -## How to Develop +| Method | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| getAuthenticator(): Authenticator | Obtains an **Authenticator** object for user authentication. 6+
Obtains an **Authenticator** object to check the device's capability of user authentication, perform or cancel user authentication, and obtain the tips generated in the authentication process. 7+ | +| checkAvailability(type: AuthType, level: SecureLevel): number | Checks whether the device supports the specified authentication type and security level. | +| execute(type: AuthType, level: SecureLevel, callback: AsyncCallback\): void | Performs user authentication and returns the authentication result using an asynchronous callback. | +| execute(type: AuthType, level: SecureLevel): Promise\ | Performs user authentication and returns the authentication result using a promise. | +| cancel(): void | Cancels the current authentication. | +| on(type: "tip", callback: Callback\): void | Subscribes to the events of the specified type. | +| off(type: "tip", callback?: Callback\): void | Unsubscribes from the events of the specified type. | + + +## How to Develop Before starting the development, make the following preparations: @@ -88,7 +50,7 @@ The development procedure is as follows: } ``` -3. \(Optional\) Subscribe to tip information. The sample code is as follows: +3. \(Optional\) Subscribe to tip information. The sample code is as follows: ``` let authenticator = userIAM_userAuth.getAuthenticator(); @@ -112,7 +74,7 @@ The development procedure is as follows: }); ``` -5. \(Optional\) Unsubscribe from tip information if [you have subscribed to tip information](#li109311114115111)you have subscribed to tip information. +5. \(Optional\) Unsubscribe from tip information if you have subscribed to tip information you have subscribed to tip information. ``` let authenticator = userIAM_userAuth.getAuthenticator(); @@ -138,4 +100,3 @@ The development procedure is as follows: } ``` - diff --git a/en/application-dev/security/userauth-overview.md b/en/application-dev/security/userauth-overview.md index 5bd678a6301..f3e6a9a9042 100644 --- a/en/application-dev/security/userauth-overview.md +++ b/en/application-dev/security/userauth-overview.md @@ -1,22 +1,22 @@ -# User Authentication Overview +# User Authentication Overview OpenHarmony provides biometric recognition that can be used for identity authentication in device unlocking, application login, and payment. OpenHarmony provides both 2D and 3D facial recognition. You can provide either or both of them on your device based on the hardware and technology applied on the device. 3D facial recognition is superior to 2D facial recognition in terms of recognition rate and anti-counterfeiting capability. However, you can use 3D facial recognition only if your device supports capabilities such as 3D structured light and 3D Time of Flight \(TOF\). -## Basic Concepts +## Basic Concepts Biometric recognition \(also known as biometric authentication\) uses optical, acoustical, and biological sensors, as well as the biological statistics mechanism to identify individuals. Facial recognition is a biometric recognition technology that identifies individuals based on facial characteristics. A camera is used to collect images or video streams that contain human faces, and automatically detect, track, and recognize the human faces. -## Working Principles +## Working Principles Facial recognition establishes a secure channel between a camera and a trusted execution environment \(TEE\). Through this channel, face image data is transmitted to the TEE. This protects against any attack from the rich execution environment \(REE\) as the face image data cannot be obtained from the REE. The face image collection, characteristic extraction, alive human body detection, and characteristic comparison are all completed in the TEE. The TEE implements security isolation based on the trust zone. The external face framework only initiates face authentication and processes authentication results. It does not process the human face data. Facial characteristics are stored in the TEE, which uses strong cryptographic algorithms to encrypt and protect the integrity of facial characteristics. The collected and stored facial characteristics will not be transferred out of the TEE without user authorization. This ensures that system or third-party applications cannot obtain facial characteristics, or send or back them up to any external storage medium. -## Limitations and Constraints +## Limitations and Constraints - OpenHarmony only supports facial recognition and local authentication, and does not support an authentication UI. - To use biometric recognition, a device must have a camera with a face image pixel greater than 100x100. -- Gitee From a3c407f6713e19950f19e6c7c1a6ae311e3c6491 Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Wed, 9 Mar 2022 19:22:25 +0800 Subject: [PATCH 256/282] update docs Signed-off-by: ester.zhou --- en/application-dev/reference/apis/js-apis-commonEvent.md | 6 +++--- .../reference/arkui-js/js-components-canvas-image.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-commonEvent.md b/en/application-dev/reference/apis/js-apis-commonEvent.md index 655c8682e35..32045b0f0c9 100644 --- a/en/application-dev/reference/apis/js-apis-commonEvent.md +++ b/en/application-dev/reference/apis/js-apis-commonEvent.md @@ -169,9 +169,9 @@ Publishes a common event with given attributes. This method uses a callback to r ```js // Attributes of a common event. var options = { - code: 0; // Result code of the common event - data: "initial data";// Result data of the common event - isOrdered: true; // The common event is an ordered one. + code: 0, // Result code of the common event + data: "initial data",// Result data of the common event + isOrdered: true // The common event is an ordered one. } // Callback for common event publication function PublishCallBack(err) { diff --git a/en/application-dev/reference/arkui-js/js-components-canvas-image.md b/en/application-dev/reference/arkui-js/js-components-canvas-image.md index 8ad046dea4f..32bd1bb59a4 100644 --- a/en/application-dev/reference/arkui-js/js-components-canvas-image.md +++ b/en/application-dev/reference/arkui-js/js-components-canvas-image.md @@ -89,7 +89,7 @@ export default { onShow(){ const el =this.$refs.canvas - var ctx = this.$element('drawImage').getContext('2d'); + var ctx =el.getContext('2d'); var img = new Image(); img.src = 'common/images/example.jpg'; img.onload = function() { -- Gitee From bcdb20937af0592b22895c98ea070c15bbaa5a45 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 19:59:15 +0800 Subject: [PATCH 257/282] updated docs Signed-off-by: wusongqing --- zh-cn/application-dev/reference/apis/js-apis-lightweightset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md b/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md index 1ff86fc1903..66b3a24981a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md +++ b/zh-cn/application-dev/reference/apis/js-apis-lightweightset.md @@ -146,7 +146,7 @@ has(key: T): boolean | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 指定key | +| key | T | 是 | 指定key | **返回值:** -- Gitee From 3208d5e0d6f1fe965e7257bc172ac18825372643 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Wed, 9 Mar 2022 20:03:14 +0800 Subject: [PATCH 258/282] added docs Signed-off-by: wusongqing --- .../reference/apis/js-apis-arraylist.md | 576 ++++++++++++++++ .../reference/apis/js-apis-deque.md | 274 ++++++++ .../reference/apis/js-apis-hashset.md | 275 ++++++++ .../reference/apis/js-apis-lightweightset.md | 505 ++++++++++++++ .../reference/apis/js-apis-list.md | 619 ++++++++++++++++++ .../reference/apis/js-apis-queue.md | 187 ++++++ .../reference/apis/js-apis-stack.md | 236 +++++++ .../reference/apis/js-apis-treemap.md | 518 +++++++++++++++ .../reference/apis/js-apis-treeset.md | 428 ++++++++++++ 9 files changed, 3618 insertions(+) create mode 100644 en/application-dev/reference/apis/js-apis-arraylist.md create mode 100644 en/application-dev/reference/apis/js-apis-deque.md create mode 100644 en/application-dev/reference/apis/js-apis-hashset.md create mode 100644 en/application-dev/reference/apis/js-apis-lightweightset.md create mode 100644 en/application-dev/reference/apis/js-apis-list.md create mode 100644 en/application-dev/reference/apis/js-apis-queue.md create mode 100644 en/application-dev/reference/apis/js-apis-stack.md create mode 100644 en/application-dev/reference/apis/js-apis-treemap.md create mode 100644 en/application-dev/reference/apis/js-apis-treeset.md diff --git a/en/application-dev/reference/apis/js-apis-arraylist.md b/en/application-dev/reference/apis/js-apis-arraylist.md new file mode 100644 index 00000000000..e3ba42ce095 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-arraylist.md @@ -0,0 +1,576 @@ +# Linear Container ArrayList + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + +## Modules to Import + +``` +import ArrayList from '@ohos.util.ArrayList' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + +## ArrayList + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in an array list (called container later).| + + +### constructor + +constructor() + +A constructor used to create an **ArrayList** instance. + +**Example** + +``` +let arrayList = new ArrayList(); +``` + + +### add + +add(element: T): boolean + +Adds an entry at the end of this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to add.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is added successfully; returns **false** otherwise.| + +**Example** + + ``` + let arrayList = new ArrayList(); + let result = arrayList.add("a"); + let result1 = arrayList.add(1); + let b = [1, 2, 3]; + let result2 = arrayList.add(b); + let c = {name: "lala", age: "13"}; + let result3 = arrayList.add(false); + ``` + +### insert + +insert(element: T, index: number): void + +Inserts an entry at the specified position in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to insert.| +| index | number | Yes| Index of the position where the entry is to be inserted.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.insert("A", 0); +arrayList.insert(0, 1); +arrayList.insert(true, 2); +``` + +### has + +has(element: T): boolean + +Checks whether this container has the specified entry. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to check.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified entry is contained; returns **false** otherwise.| + +**Example** + +``` +let arrayList = new ArrayList(); +let result = arrayList.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +arrayList.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result1 = arrayList.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +``` + +### getIndexOf + +getIndexOf(element: T): number + +Obtains the index of the first occurrence of the specified entry in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| number | Returns the position index if obtained; returns **-1** if the specified entry is not found.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(2); +arrayList.add(1); +arrayList.add(2); +arrayList.add(4); +let result = arrayList.getIndexOf(2); +``` + +### getLastIndexOf + +getLastIndexOf(element: T): number + +Obtains the index of the last occurrence of the specified entry in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| number | Returns the position index if obtained; returns **-1** if the specified entry is not found.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(2); +arrayList.add(1); +arrayList.add(2); +arrayList.add(4); +let result = arrayList.getLastIndexOf(2); +``` + +### removeByIndex + +removeByIndex(index: number): T + +Removes an entry with the specified position from this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| index | number | Yes| Position index of the entry to remove.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry removed.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(2); +arrayList.add(4); +let result = arrayList.removeByIndex(2); +``` + +### remove + +remove(element: T): boolean + +Removes the first occurrence of the specified entry from this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to remove.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is removed successfully; returns **false** otherwise.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +let result = arrayList.remove(2); +``` + +### removeByRange + +removeByRange(fromIndex: number, toIndex: number): void + +Removes from this container all of the entries within a range, including the entry at the start position but not that at the end position. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| fromIndex | number | Yes| Index of the start position.| +| toIndex | number | Yes| Index of the end position.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +arrayList.removeByRange(2, 4); +arrayList.removeByRange(4, 3); +arrayList.removeByRange(2, 6); +``` + +### replaceAllElements +replaceAllElements(callbackfn: (value: T, index?: number, arrlist?: ArrayList<T>) => T, +thisArg?: Object): void + +Replaces all entries in this container with new entries, and returns the new ones. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked for the replacement.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| index | number | No| Position index of the entry that is currently traversed.| +| arrlist | ArrayList<T> | No| Instance that invokes the **replaceAllElements** method.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +arrayList.replaceAllElements((value, index) => { + return value = 2 * value; +}); +arrayList.replaceAllElements((value, index) => { + return value = value - 2; +}); +``` + +### forEach +forEach(callbackfn: (value: T, index?: number, arrlist?: ArrayList<T>) => void, +thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| index | number | No| Position index of the entry that is currently traversed.| +| arrlist | ArrayList<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +arrayList.forEach((value, index) => { + console.log(value, index); +}); +``` + +### sort +sort(comparator?: (firstValue: T, secondValue: T) => number): void + +Sorts entries in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| comparator | function | No| Callback invoked for sorting.| + +comparator + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| firstValue | T | Yes| Previous entry.| +| secondValue | T | Yes| Next entry.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +arrayList.sort(a, (b => a - b)); +arrayList.sort(a, (b => b - a)); +arrayList.sort(); +``` + +### subArrayList +subArrayList(fromIndex: number, toIndex: number): ArrayList<T> + +Obtains entries within a range in this container, including the entry at the start position but not that at the end position, and returns these entries as a new **ArrayList** instance. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| fromIndex | number | Yes| Index of the start position.| +| toIndex | number | Yes| Index of the end position.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| ArrayList<T> | New **ArrayList** instance obtained.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +let result1 = arrayList.subArrayList(2, 4); +let result2 = arrayList.subArrayList(4, 3); +let result3 = arrayList.subArrayList(2, 6); +``` + +### clear +clear(): void + +Clears this container and sets its length to **0**. + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +arrayList.clear(); +``` + +### clone +clone(): ArrayList<T> + +Clones this container and returns a copy. The modification to the copy does not affect the original instance. + + +**Return value** + +| Type| Description| +| -------- | -------- | +| ArrayList<T> | New **ArrayList** instance obtained.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +let result = arrayList.clone(); +``` + +### getCapacity +getCapacity(): number + +Obtains the capacity of this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| number | Capacity obtained.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +let result = arrayList.getCapacity(); +``` + +### convertToArray +convertToArray(): Array<T> + +Converts this container into an array. + +**Return value** + +| Type| Description| +| -------- | -------- | +| Array<T> | Array obtained.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +let result = arrayList.convertToArray(); +``` + +### isEmpty +isEmpty(): boolean + +Checks whether this container is empty (contains no entry). + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the container is empty; returns **false** otherwise.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +let result = arrayList.isEmpty(); +``` + +### increaseCapacityTo +increaseCapacityTo(newCapacity: number): void + +Increases the capacity of this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| newCapacity | number | Yes| New capacity.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +arrayList.increaseCapacityTo(2); +arrayList.increaseCapacityTo(8); +``` + +### trimToCurrentLength +trimToCurrentLength(): void + +Trims the capacity of this container to its current length. + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); +arrayList.trimToCurrentLength(); +``` + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T> + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let arrayList = new ArrayList(); +arrayList.add(2); +arrayList.add(4); +arrayList.add(5); +arrayList.add(4); + +// Method 1: +for (let item of arrayList) { + console.log(item); +} + +// Method 2: +let iter = arrayList[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-deque.md b/en/application-dev/reference/apis/js-apis-deque.md new file mode 100644 index 00000000000..1d94bd6b83d --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-deque.md @@ -0,0 +1,274 @@ +# Linear Container Deque + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import Deque from '@ohos.util.Deque' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + +## Deque + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a double-ended queue (deque, called container later).| + +### constructor + +constructor() + +A constructor used to create a **Deque** instance. + +**Example** + +``` +let deque = new Deque(); +``` + +### insertFront + +insertFront(element: T): void + +Inserts an entry at the front of this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to insert.| + +**Example** + +``` +let deque = new Deque; +deque.insertFront("a"); +deque.insertFront(1); +let b = [1, 2, 3]; +deque.insertFront(b); +let c = {name : "lala", age : "13"}; +deque.insertFront(false); +``` + +### insertEnd + +insertEnd(element: T): void + +Inserts an entry at the end of this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to insert.| + +**Example** + +``` +let deque = new Deque; +deque.insertEnd("a"); +deque.insertEnd(1); +let b = [1, 2, 3]; +deque.insertEnd(b); +let c = {name : "lala", age : "13"}; +deque.insertEnd(false); +``` + +### has + +has(element: T): boolean + +Checks whether this container has the specified entry. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to check.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified entry is contained; returns **false** otherwise.| + +**Example** + +``` +let deque = new Deque(); +let result = deque.has("Ahfbrgrbgnutfodgorrogorg"); +deque.insertFront("Ahfbrgrbgnutfodgorrogorg"); +let result1 = deque.has("Ahfbrgrbgnutfodgorrogorg"); +``` + +### popFirst + +popFirst(): T + +Removes the first entry of this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry removed.| + +**Example** + +``` +let deque = new Deque(); +deque.insertFront(2); +deque.insertFront(4); +deque.insertEnd(5); +deque.insertFront(2); +deque.insertFront(4); +let result = deque.popFirst(); +``` + +### popLast + +popLast(): T + +Removes the last entry of this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry removed.| + +**Example** + +``` +let deque = new Deque(); +deque.insertFront(2); +deque.insertEnd(4); +deque.insertFront(5); +deque.insertFront(2); +deque.insertFront(4); +deque.popLast(); +let result = deque.popLast(); +``` + +### forEach +forEach(callbackfn: (value: T, index?: number, deque?: Deque<T>) => void, +thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the element that is currently traversed.| +| index | number | No| Position index of the entry that is currently traversed.| +| deque | Deque<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let deque = new Deque(); +deque.insertFront(2); +deque.insertEnd(4); +deque.insertFront(5); +deque.insertEnd(4); +deque.forEach((value, index) => { + console.log(value, index); +}); +``` + +### getFirst + +getFirst(): T; + +Obtains the first entry of this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry obtained.| + +**Example** + +``` +let deque = new Deque(); +deque.insertEnd(2); +deque.insertEnd(4); +deque.insertFront(5); +deque.insertFront(4); +let result = deque.getFirst(); +``` + +### getLast + +getLast(): T + +Obtains the last entry of this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry obtained.| + +**Example** + +``` +let deque = new Deque(); +deque.insertFront(2); +deque.insertFront(4); +deque.insertFront(5); +deque.insertFront(4); +let result = deque.getLast(); +``` + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T> + + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** +``` +let deque = new Deque(); +deque.insertFront(2); +deque.insertFront(4); +deque.insertFront(5); +deque.insertFront(4); + +// Method 1: +for (let item of deque) { + console.log(item); +} + +// Method 2: +let iter = deque[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-hashset.md b/en/application-dev/reference/apis/js-apis-hashset.md new file mode 100644 index 00000000000..7ba96f84539 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-hashset.md @@ -0,0 +1,275 @@ +# Nonlinear Container HashSet + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import HashSet from '@ohos.util.HashSet'; +``` + +## System Capabilities + +SystemCapability.Utils.Lang + +## HashSet + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a hash set (called container later).| + + +### constructor + +constructor() + +A constructor used to create a **HashSet** instance. + +**Example** + +``` +let hashSet = new HashSet(); +``` + + +### isEmpty + +isEmpty(): boolean + +Checks whether this container is empty (contains no entry). + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the container is empty; returns **false** otherwise.| + +**Example** + +``` +const hashSet = new HashSet(); +hashSet.isEmpty(); +``` + + +### has + +has(value: T): boolean + +Checks whether this container contains the specified entry. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Entry to check.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified entry is contained; returns **false** otherwise.| + +**Example** + +``` +let hashSet = new HashSet(); +let result = hashSet.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +let result1 = hashSet.has("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +``` + + +### add + +add(value: T): boolean + +Adds an entry to this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Entry to add.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is added successfully; returns **false** otherwise.| + +**Example** + +``` +let hashSet = new HashSet(); +let result = hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +``` + + +### remove + +remove(value: T): boolean + +Removes an entry from this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Entry to remove.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is removed successfully; returns **false** otherwise.| + +**Example** + +``` +let hashSet = new HashSet(); +hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +hashSet.add("sdfs"); +let result = hashSet.remove("sdfs"); +``` + + +### clear + +clear(): void + +Clears this container and sets its length to **0**. + +**Example** + +``` +let hashSet = new HashSet(); +hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +hashSet.add("sdfs"); +hashSet.clear(); +``` + + +### values + +values(): IterableIterator<T> + +Obtains an iterator that contains all the values in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let hashSet = new HashSet(); +hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +hashSet.add("sdfs"); +let iter = hashSet.values(); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` + + +### forEach + +forEach(callbackfn: (value: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| key | T | No| Key of the entry that is currently traversed (same as **value**).| +| set | HashSet<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let hashSet = new HashSet(); +hashSet.add("sdfs"); +hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +hashSet.forEach((value, key) => { + console.log(value, key); +}); +``` + + +### entries +entries(): IterableIterator<[T, T]> + +Obtains an iterator that contains all the entries in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<[T, T]> | Iterator obtained.| + +**Example** + +``` +let hashSet = new HashSet(); +hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +hashSet.add("sdfs"); +let iter = hashSet.entries(); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp[0]); + console.log(temp[1]); + temp = iter.next().value; +} +``` + + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T> + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let hashSet = new HashSet(); +hashSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +hashSet.add("sdfs"); + +// Method 1: +for (let item of hashSet) { + console.log("value: " + item); +} + +// Method 2: +let iter = hashSet[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-lightweightset.md b/en/application-dev/reference/apis/js-apis-lightweightset.md new file mode 100644 index 00000000000..cf32ebe8d59 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-lightweightset.md @@ -0,0 +1,505 @@ +# Nonlinear Container LightWeightSet + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import LightWeightSet from '@ohos.util.LightWeightSet' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + +## LightWeightSet + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a lightweight set (called container later).| + + +### constructor + +constructor() + +A constructor used to create a **LightWeightSet** instance. + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +``` + + +### isEmpty + +isEmpty(): boolean + +Checks whether this container is empty. + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the container is empty; returns **false** otherwise.| + +**Example** + +``` +const lightWeightSet = new LightWeightSet(); +let result = lightWeightSet.isEmpty(); +``` + +### add + +add(obj: T): boolean + +Adds an entry to this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| obj | T | Yes| Entry to add.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is added successfully; returns **false** otherwise.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +let result = lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +``` + + +### addAll + +addAll(set: LightWeightSet<T>): boolean + +Adds all entries in a **LightWeightSet** instance to this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| set | LightWeightSet<T> | Yes| **LightWeightSet** instance whose entries are to be added to the current container.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let set = new LightWeightSet(); +set.add("sfage"); +let result = lightWeightSet.addAll(set); +``` + + +### hasAll + +hasAll(set: LightWeightSet<T>): boolean + +Checks whether this container contains all entries of the specified **LightWeightSet** instance. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| set | LightWeightSet<T> | Yes| **LightWeightSet** instance to be used for comparison.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if all the entries in the specified **LightWeightSet** instance are contained; returns **false** otherwise.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let set = new LightWeightSet(); +set.add("sdfs"); +let result = lightWeightSet.hasAll(set); +``` + + +### has + +has(key: T): boolean + +Checks whether this container has the specified key. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key| T | Yes| Key to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified key is contained; returns **false** otherwise.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +let result = lightWeightSet.has(123); +lightWeightSet.add(123); +let result = lightWeightSet.has(123); +``` + + +### equal + +equal(obj: Object): boolean + +Checks whether this container contains objects of the same type as the specified **obj**. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| obj | Object | Yes| Object to be used for comparison.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the container contains objects of the same type as the specified **obj**; returns **false** otherwise.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let obj = {"Ahfbrgrbgnutfodgorrogorgrogofdfdf", "sdfs"}; +let result = lightWeightSet.equal(obj); +``` + + +### increaseCapacityTo + +increaseCapacityTo(minimumCapacity: number): void + +Increases the capacity of this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| minimumCapacity | number | Yes| Minimum number of entries to accommodate in the container.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.increaseCapacityTo(10); +``` + + +### getIndexOf + +getIndexOf(key: T): number + +Obtains the position index of the entry with the specified key in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | T | Yes| Key of the entry to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| number | Position index of the entry.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let result = lightWeightSet.getIndexOf("sdfs"); +``` + + +### remove + +remove(key: T): T + +Removes an entry of the specified key from this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | T | Yes| Key of the entry to remove.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Value of the entry removed.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let result = lightWeightSet.remove("sdfs"); +``` + + +### removeAt + +removeAt(index: number): boolean + +Removes the entry at the specified position from this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| index | number | Yes| Position index of the entry to remove.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is removed successfully; returns **false** otherwise.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let result = lightWeightSet.removeAt(1); +``` + + +### getValueAt + +getValueAt(index: number): T + +Obtains the value of the entry at the specified position in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| index | number | Yes| Position index of the entry.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Value obtained.| + +**Parameters** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let result = lightWeightSet.getValueAt(1); +``` + + +### clear + +clear(): void + +Clears this container and sets its length to **0**. + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +lightWeightSet.clear(); +``` + + +### toString + +toString(): String + +Obtains a string that contains all entries in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| String | String obtained.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let result = lightWeightSet.toString(); +``` + + +### toArray + +toArray(): Array<T> + +Obtains an array that contains all objects in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| Array<T> | Array obtained.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let result = lightWeightSet.toArray(); +``` + + +### values + +values(): IterableIterator<T> + +Obtains an iterator that contains all the values in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let iter = lightWeightSet.values(); +let index = 0; +while(index < lightWeightSet.length) { + console.log(JSON.stringify(iter.next().value)); + index++; +} +``` + + +### forEach + +forEach(callbackfn: (value: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| key | T | No| Key of the entry that is currently traversed (same as **value**).| +| set | LightWeightSet<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("sdfs"); +lightWeightSet.add("dfsghsf"); +lightWeightSet.forEach((value, key) => { + console.log(value, key); +}); +``` + + +### entries + +entries(): IterableIterator<[T, T]> + +Obtains an iterator that contains all the entries in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<[T, T]> | Iterator obtained.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); +let iter = lightWeightSet.entries(); +let index = 0; +while(index < lightWeightSet.length) { + console.log(JSON.stringify(iter.next().value)); + index++; +} +``` + + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T> + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let lightWeightSet = new LightWeightSet(); +lightWeightSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +lightWeightSet.add("sdfs"); + +// Method 1: +for (let item of lightWeightSet) { + console.log("value: " + item); +} + +// Method 2: +let iter = lightWeightSet[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-list.md b/en/application-dev/reference/apis/js-apis-list.md new file mode 100644 index 00000000000..fc7e38d2a1a --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-list.md @@ -0,0 +1,619 @@ +# Linear Container List + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import List from '@ohos.util.List' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + + +## List + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a list (called container later).| + + +### constructor + +constructor(head?: NodeObj<T>) + +A constructor used to create a **List** instance. + +**Parameters** + +| Name| Value Type | Readable| Description| +| -------- | -------- | -------- | -------- | +| head | NodeObj<T> | Yes| Node object, including **element** and **next**.| + +**Example** + +``` +let list = new List(); +``` + + +### add + +add(element: T): boolean + +Adds an entry at the end of this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Element to add.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is added successfully; returns **false** otherwise.| + +**Example** + +``` +let list = new List; +let result = list.add("a"); +let result1 = list.add(1); +let b = [1, 2, 3]; +list.add(b); +let c = {name : "lala", age : "13"}; +let result3 = list.add(false); +``` + +### insert + +insert(element: T, index: number): void + +Inserts an entry at the specified position in this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Element to insert.| +| index | number | Yes| Index of the position where the entry is to be inserted.| + +**Example** + +``` +let list = new List(); +list.insert("A", 0); +list.insert(0, 1); +list.insert(true, 2); +``` + +### has + +has(element: T): boolean + +Checks whether this container has the specified entry. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to query.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| boolean | Returns **true** if the specified entry is contained; returns **false** otherwise.| + +**Example** + +``` +let list = new List(); +let result = list.has("Ahfbrgrbgnutfodgorrogorg"); +list.add("Ahfbrgrbgnutfodgorrogorg"); +let result1 = list.has("Ahfbrgrbgnutfodgorrogorg"); +``` + +### get + +get(index: number): T + +Obtains the entry at the specified position in this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| index | number | Yes| Position index of the entry to obtain.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| T | Entry obtained.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(2); +list.add(1); +list.add(2); +list.add(4); +let result = list.get(2); +``` + +### getLastIndexOf + +getLastIndexOf(element: T): number + +Obtains the index of the last occurrence of the specified entry in this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to query.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| number | Returns the position index if obtained; returns **-1** if the specified entry is not found.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(2); +list.add(1); +list.add(2); +list.add(4); +let result = list.getLastIndexOf(2); +``` + +### getIndexOf + +getIndexOf(element: T): number + +Obtains the index of the first occurrence of the specified entry in this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to query.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| number | Returns the position index if obtained; returns **-1** if the specified entry is not found.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(2); +list.add(1); +list.add(2); +list.add(4); +list.getIndexOf(2); +let result = list.getIndexOf(2); +``` + +### equal + +equal(obj: Object): boolean + +Compares whether a specified object is equal to this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| obj | Object | Yes| Object used for comparison.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| boolean | Returns **true** if the two are equal; returns **false** otherwise.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(2); +let obj1 = new List(); +obj1.add(2); +obj1.add(4); +obj1.add(5); +list.equal(obj1); +let obj2 = {name : "lala", age : "13"}; +let result = list.equal(obj2); +``` + +### removeByIndex + +removeByIndex(index: number): T + +Removes an entry at the specified position from this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| index | number | Yes| Position index of the entry to remove.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| T | Entry removed.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(2); +list.add(4); +let result = list.removeByIndex(2); +``` + +### remove + +remove(element: T): boolean + +Removes the first occurrence of the specified entry from this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to remove.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is removed successfully; returns **false** otherwise.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +let result = list.remove(2); +``` + +### replaceAllElements +replaceAllElements(callbackfn: (value: T, index?: number, list?: List<T>) => T, +thisArg?: Object): void + +Replaces all entries in this container with new entries, and returns the new ones. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked for the replacement.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| index | number | No| Position index of the entry that is currently traversed.| +| list | List<T> | No| Instance that invokes the **replaceAllElements** method.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +list.replaceAllElements((value, index) => { + return value = 2 * value; +}); +list.replaceAllElements((value, index) => { + return value = value - 2; +}); +``` + +### forEach +forEach(callbackfn: (value: T, index?: number, List?: List<T>) => void, +thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| index | number | No| Position index of the entry that is currently traversed.| +| List | List<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +list.forEach((value, index) => { + console.log(value, index); +}); + +``` + +### sort +sort(comparator: (firstValue: T, secondValue: T) => number): void + +Sorts entries in this container. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| comparator | function | Yes| Callback invoked for sorting.| + +comparator + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| firstValue | T | Yes| Previous entry.| +| secondValue | T | Yes| Next entry.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +list.sort(a, (b => a - b)); +list.sort(a, (b => b - a)); +``` + +### getSubList +getSubList(fromIndex: number, toIndex: number): List<T> + +Obtains entries within a range in this container, including the entry at the start position but not that at the end position, and returns these entries as a new **List** instance. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| fromIndex | number | Yes| Index of the start position.| +| toIndex | number | Yes| Index of the end position.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| List<T> | New **List** instance obtained.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +let result = list.subList(2, 4); +let result1 = list.subList(4, 3); +let result2 = list.subList(2, 6); +``` + +### clear +clear(): void + +Clears this container and sets its length to **0**. + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +list.clear(); +``` + +### set +set(index: number, element: T): T +Replaces an entry at the specified position in this container with a given entry. + +**Parameters** + +| Name| Value Type | Mandatory| Description| +| -------- | -------- | -------- | -------- | +| index | number | Yes| Position index of the entry to replace.| +| element | T | Yes| Entry to be used for replacement.| + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| T | New entry.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +list.set(2, "b"); + +``` + +### convertToArray +convertToArray(): Array<T> + +Converts this container into an array. + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| Array<T> | Array obtained.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +let result = list.convertToArray(); +``` + +### isEmpty +isEmpty(): boolean + +Checks whether this container is empty (contains no entry). + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| boolean | Returns **true** if the container is empty; returns **false** otherwise.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +let result = list.isEmpty(); +``` + +### getFirst + +getFirst(): T + +Obtains the first entry in this container. + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| T | The first entry obtained.| + +**Example** + +``` +let list = new Vector(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +let result = list.getFirst(); +``` + +### getLast + +getLast(): T + +Obtains the last entry in this container. + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| T | The last entry obtained.| + +**Example** + +``` +let list = new Vector(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); +let result = list.getLast(); +``` + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T>; + + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Value Type | Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let list = new List(); +list.add(2); +list.add(4); +list.add(5); +list.add(4); + +// Method 1: +for (let item of list) { + console.log(item); +} + +// Method 2: +let iter = list[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-queue.md b/en/application-dev/reference/apis/js-apis-queue.md new file mode 100644 index 00000000000..543dcf5ea86 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-queue.md @@ -0,0 +1,187 @@ +# Linear Container Queue + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import Queue from '@ohos.util.Queue' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + + +## Queue + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a queue (called container later).| + + +### constructor + +constructor() + +A constructor used to create a **Queue** instance. + +**Example** + +``` +let queue = new Queue(); +``` + + +### add + +add(element: T): boolean + +Adds an entry at the end of this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to add.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is added successfully; returns **false** otherwise.| + +**Example** + +``` +let queue = new Queue(); +let result = queue.add("a"); +let result1 = queue.add(1); +queue.add(1); +let b = [1, 2, 3]; +queue.add(b); +let c = {name : "lala", age : "13"}; +let result3 = queue.add(c); +``` + +### pop + +pop(): T + +Removes the first entry from this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry removed.| + +**Example** + +``` +let queue = new Queue(); +queue.add(2); +queue.add(4); +queue.add(5); +queue.add(2); +queue.add(4); +let result = queue.pop(); +``` + +### getFirst + +getFirst(): T + +Obtains the first entry of this container. + +**Parameters** + +| Type| Description| +| -------- | -------- | +| T | The first entry obtained.| + +**Example** + +``` +let queue = new Queue(); +queue.add(2); +queue.add(4); +queue.add(5); +queue.add(2); +let result = queue.getFirst(); +``` + +### forEach +forEach(callbackfn: (value: T, index?: number, Queue?: Queue<T>) => void, +thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| index | number | No| Position index of the entry that is currently traversed.| +| Queue | Queue<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let queue = new Queue(); +queue.add(2); +queue.add(4); +queue.add(5); +queue.add(4); +queue.forEach((value, index) => { + console.log(value, index); +}); + +``` + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T> + + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** +``` +let queue = new Queue(); +queue.add(2); +queue.add(4); +queue.add(5); +queue.add(4); + +// Method 1: +for (let item of queue) { + console.log(item); +} + +// Method 2: +let iter = queue[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-stack.md b/en/application-dev/reference/apis/js-apis-stack.md new file mode 100644 index 00000000000..2cec7c7cc34 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-stack.md @@ -0,0 +1,236 @@ +# Linear Container Stack + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import Stack from '@ohos.util.Stack' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + + +## Stack + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a stack (called container later).| + + +### constructor + +constructor() + +A constructor used to create a **Stack** instance. + +**Example** + +``` +let stack = new Stack(); +``` + + +### push + +push(item: T): T + +Adds an entry at the top of this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| item | T | Yes| Element to add.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Element added.| + +**Example** + +``` +let stack = new Stack(); +let result = stack.push("a"); +let result1 = stack.push(1); +let b = [1, 2, 3]; +stack.push(b); +let c = {name : "lala", age : "13"}; +let result3 = stack.push(c); +``` + +### pop + +pop(): T + +Removes the top entry from this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry removed.| + +**Example** + +``` +let stack = new Stack(); +stack.push(2); +stack.push(4); +stack.push(5); +stack.push(2); +stack.push(4); +let result = stack.pop(); +``` + +### peek + +peek(): T + +Obtains the top entry of this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry obtained.| + +**Example** + +``` +let stack = new Stack(); +stack.push(2); +stack.push(4); +stack.push(5); +stack.push(2); +let result = stack.peek(); +``` + +### locate + +locate(element: T): number + +Obtains the index of the first occurrence of the specified entry in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| element | T | Yes| Entry to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| number | Returns the position index if obtained; returns **-1** if the specified entry is not found.| + +**Example** + +``` +let stack = new Stack(); +stack.push(2); +stack.push(4); +stack.push(5); +stack.push(2); +let result = stack.locate(2); +``` + +### forEach +forEach(callbackfn: (value: T, index?: number, stack?: Stack<T>) => void, +thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| index | number | No| Position index of the entry that is currently traversed.| +| stack | Stack<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let stack = new Stack(); +stack.push(2); +stack.push(4); +stack.push(5); +stack.push(4); +stack.forEach((value, index) => { + console.log(value, index); +}); +``` + +### isEmpty +isEmpty(): boolean + +Checks whether this container is empty (contains no entries). + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the container is empty; returns **false** otherwise.| + +**Example** + +``` +let stack = new Stack(); +stack.push(2); +stack.push(4); +stack.push(5); +stack.push(4); +let result = stack.isEmpty(); +``` + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T> + + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** +``` +let stack = new Stack(); +stack.push(2); +stack.push(4); +stack.push(5); +stack.push(4); + +// Method 1: +for (let item of stack) { + console.log(item); +} + +// Method 2: +let iter = stack[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-treemap.md b/en/application-dev/reference/apis/js-apis-treemap.md new file mode 100644 index 00000000000..047a66fbf44 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-treemap.md @@ -0,0 +1,518 @@ +# Nonlinear Container TreeMap + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import TreeMap from '@ohos.util.TreeMap' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + +## TreeMap + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a tree map (called container later).| + + +### constructor + +constructor(comparator?:(firstValue: K, secondValue: K) => boolean) + +A constructor used to create a **TreeMap** instance. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| comparator | function | No| Custom comparator.| + +**Example** + +``` +let treeMap = new TreeMap(); +``` + + +### isEmpty + +isEmpty(): boolean; + +Checks whether this container is empty (contains no entry). + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the container is empty; returns **false** otherwise.| + +**Example** + +``` +const treeMap = new TreeMap(); +let result = treeMap.isEmpty(); +``` + + +### hasKey + +hasKey(key: K): boolean; + +Checks whether this container has the specified key. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | K | Yes| Key to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified key is contained; returns **false** otherwise.| + +**Example** + +``` +let treeMap = new TreeMap(); +let result = treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +let result1 = treeMap.hasKey("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +``` + + +### hasValue + +hasValue(value: V): boolean + +Checks whether this container has the specified value. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | V | Yes| Value to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified value is contained; returns **false** otherwise.| + +**Example** + +``` +let treeMap = new TreeMap(); +let result = treeMap.hasValue(123); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +let result1 = treeMap.hasValue(123); +``` + + +### get + +get(key: K): V + +Obtains the value of the specified key in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | K | Yes| Key to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| V | Value of the key.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +let result = treeMap.get("sdfs"); +``` + + +### getFirstKey + +getFirstKey(): K; + +Obtains the first key in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| K | Key obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +let result = treeMap.getFirstKey(); +``` + + +### getLastKey + +getLastKey(): K; + +Obtains the last key in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| K | Key obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +let result = treeMap.getLastKey(); +``` + + +### setAll + +setAll(map: TreeMap): void + +Adds all entries in a **TreeMap** instance to this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| map | TreeMap | Yes| **TreeMap** instance whose entries are to be added to the current container.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +let map = new TreeMap(); +treeMap.setAll(map); +``` + + +### set +set(key: K, value: V): Object + +Adds an entry to this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | K | Yes| Key of the entry to add.| +| value | V | Yes| Value of the entry to add.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| Object | Container that contains the new entry.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +``` + + +### remove + +remove(key: K): V; + +Removes the entry with the specified key from this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | K | Yes| Key of the entry to remove.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| V | Value of the entry removed.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +treeMap.remove("sdfs"); +``` + + +### getLowerKey + +getLowerKey(key: K): K + +Obtains the key that is placed in front of the input key in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | K | Yes| Input key.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| K | Key obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +treeMap.set("zdfgsd", 356); +let result = treeMap.getLowerKey("sdfs"); +``` + + +### getHigherKey + +getHigherKey(key: K): K + +Obtains the key that is placed next to the input key in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | K | Yes| Input key.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| K | Key obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +treeMap.set("zdfgsd", 356); +let result = treeMap.getHigherKey("sdfs"); +``` + +### replace +replace(key: K, newValue: V): boolean + +Replaces an entry in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | K | Yes| Key of the entry to replace.| +| newValue | V | Yes| New value of the entry.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is replaced successfully; returns **false** otherwise.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("sdfs", 123); +let result = treeMap.replace("sdfs", 357); +``` + + +### clear + +clear(): void + +Clears this container and sets its length to **0**. + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +treeMap.clear(); +``` + + +### keys + +keys(): IterableIterator<K> + +Obtains an iterator that contains all the keys in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<K> | Iterator obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +let iter = treeMap.keys(); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` + + +### values + +values(): IterableIterator<V> + +Obtains an iterator that contains all the values in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<V> | Iterator obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +let iter = treeMap.values(); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` + + +### forEach + +forEach(callbackfn: (value: V, key?: K, map?: TreeMap) => void, thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | V | Yes| Value of the entry that is currently traversed.| +| key | K | Yes| Key of the entry that is currently traversed.| +| map | TreeMap | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("sdfs", 123); +treeMap.set("dfsghsf", 357); +treeMap.forEach((value, key) => { + console.log(value, key); +}); +``` + + +### entries + +entries(): IterableIterator<[K, V]> + +Obtains an iterator that contains all the entries in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<[K, V]> | Iterator obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); +let iter = treeMap.entries(); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp[0]); + console.log(temp[1]); + temp = iter.next().value; +} +``` + + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<[K, V]>; + + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** +| Type| Description| +| -------- | -------- | +| IterableIterator<[K, V]> | Iterator obtained.| + +**Example** + +``` +let treeMap = new TreeMap(); +treeMap.set("Ahfbrgrbgnutfodgorrogorgrogofdfdf", 123); +treeMap.set("sdfs", 356); + +// Method 1: +for (let item of treeMap) { + console.log("key: " + item[0]); + console.log("value: " + item[1]); +} + +// Method 2: +let iter = treeMap[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp[0]); + console.log(temp[1]); + temp = iter.next().value; +} +``` diff --git a/en/application-dev/reference/apis/js-apis-treeset.md b/en/application-dev/reference/apis/js-apis-treeset.md new file mode 100644 index 00000000000..bc937047ab2 --- /dev/null +++ b/en/application-dev/reference/apis/js-apis-treeset.md @@ -0,0 +1,428 @@ +# Nonlinear Container TreeSet + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. + + +## Modules to Import + +``` +import TreeSet from '@ohos.util.TreeSet' +``` + +## System Capabilities + +SystemCapability.Utils.Lang + +## TreeSet + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| length | number | Yes| No| Number of entries in a tree set (called container later).| + + +### constructor + +constructor(comparator?:(firstValue: T, secondValue: T) => boolean) + +A constructor used to create a **TreeSet** instance. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| comparator | function | No| Custom comparator.| + +**Example** + +``` +let treeSet = new TreeSet(); +``` + + +### isEmpty + +isEmpty(): boolean + +Checks whether this container is empty (contains no entry). + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the container is empty; returns **false** otherwise.| + +**Example** + +``` +const treeSet = new TreeSet(); +let result = treeSet.isEmpty(); +``` + + +### has + +has(value: T): boolean + +Checks whether this container has the specified value. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value to query.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the specified value is contained; returns **false** otherwise.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.has(123); +treeSet.add(123); +let result1 = treeSet.has(123); +``` + + +### getFirstValue + +getFirstValue(): T + +Obtains the value of the first entry in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Value obtained.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +let result = treeSet.getFirstValue(); +``` + + +### getLastValue + +getLastValue(): T + +Obtains the value of the last entry in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Value obtained.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +let result = treeSet.getLastValue(); +``` + + +### add +add(value: T): boolean + +Adds an entry to this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Entry to add.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is added successfully; returns **false** otherwise.| + +**Example** + +``` +let treeSet = new TreeSet(); +let result = treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +``` + + +### remove + +remove(value: T): boolean; + +Removes the entry with the specified key from this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Key of the entry to remove.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| boolean | Returns **true** if the entry is removed successfully; returns **false** otherwise.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +let result = treeSet.remove("sdfs"); +``` + + +### getLowerValue + +getLowerValue(key: T): T + +Obtains the value that is placed in front of the input key in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | T | Yes| Input key.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Value obtained.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +treeSet.add("zdfgsd"); +let result = treeSet.getLowerValue("sdfs"); +``` + + +### getHigherValue + +getHigherValue(key: T): T + +Obtains the value that is placed next to the input key in this container. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| key | T | Yes| Input key.| + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Value obtained.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +treeSet.add("zdfgsd"); +let result = treeSet.getHigherValue("sdfs"); +``` + + +### popFirst + +popFirst(): T + +Removes the first entry in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry removed.| + +**Return value** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +let result = treeSet.popFirst(); +``` + + +### popLast + +popLast(): T + +Removes the last entry in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| T | Entry removed.| + +**Return value** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +let result = treeSet.popLast(); +``` + + +### clear + +clear(): void + +Clears this container and sets its length to **0**. + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +treeSet.clear(); +``` + + +### values + +values(): IterableIterator<T> + +Obtains an iterator that contains all the values in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +let iter = treeSet.values(); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` + + +### forEach + +forEach(callbackfn: (value: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object): void + +Uses a callback to traverse the entries in this container and obtain their position indexes. + +**Parameters** + +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| callbackfn | function | Yes| Callback invoked to traverse the entries in the container.| +| thisArg | Object | No| Value to use when the callback is invoked.| + +callbackfn +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| value | T | Yes| Value of the entry that is currently traversed.| +| key | T | No| Key of the entry that is currently traversed (same as **value**).| +| set | TreeSet<T> | No| Instance that invokes the **forEach** method.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("sdfs"); +treeSet.add("dfsghsf"); +treeSet.forEach((value, key) => { + console.log(value, key) +}); +``` + + +### entries + +entries(): IterableIterator<[T, T]> + +Obtains an iterator that contains all the entries in this container. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<[T, T]> | Iterator obtained.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); +let iter = treeSet.entries(); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp[0]); + console.log(temp[1]); + temp = iter.next().value; +} +``` + + +### [Symbol.iterator] + +[Symbol.iterator]\(): IterableIterator<T> + + +Obtains an iterator, each item of which is a JavaScript object. + +**Return value** + +| Type| Description| +| -------- | -------- | +| IterableIterator<T> | Iterator obtained.| + +**Example** + +``` +let treeSet = new TreeSet(); +treeSet.add("Ahfbrgrbgnutfodgorrogorgrogofdfdf"); +treeSet.add("sdfs"); + +// Method 1: +for (let item of treeSet) { + console.log("value: " + item); +} + +// Method 2: +let iter = treeSet[Symbol.iterator](); +let temp = iter.next().value; +while(temp != undefined) { + console.log(temp); + temp = iter.next().value; +} +``` -- Gitee From 8e9636ce7f1388fe5aff5d0540baf0a8f11f917a Mon Sep 17 00:00:00 2001 From: zengyawen Date: Wed, 9 Mar 2022 12:07:45 +0000 Subject: [PATCH 259/282] update zh-cn/application-dev/reference/apis/js-apis-url.md. Signed-off-by: zengyawen --- zh-cn/application-dev/reference/apis/js-apis-url.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-url.md b/zh-cn/application-dev/reference/apis/js-apis-url.md index f9fc0379bbb..2208093cd8c 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-url.md +++ b/zh-cn/application-dev/reference/apis/js-apis-url.md @@ -36,7 +36,7 @@ var objectParams = new URLSearchParams([ ['user1', 'abc1'], ['query2', 'first2'] var objectParams1 = new URLSearchParams({"fod" : 1 , "bard" : 2}); var objectParams2 = new URLSearchParams('?fod=1&bard=2'); var urlObject = new URL('https://developer.mozilla.org/?fod=1&bard=2'); -var params = new URLSearchParams(urlObject .search); +var params = new URLSearchParams(urlObject.search); ``` @@ -79,7 +79,7 @@ delete(name: string): void ``` let urlObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); let paramsobject = new URLSearchParams(urlObject.search.slice(1)); -paramsobject.delete('foo'); +paramsobject.delete('fod'); ``` @@ -106,7 +106,7 @@ getAll(name: string): string[] ``` let urlObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); let paramsObject = new URLSearchParams(urlObject.search.slice(1)); -paramsObject.append('fod', 3); // Add a second value for the foo parameter. +paramsObject.append('fod', 3); // Add a second value for the fod parameter. console.log(params.getAll('fod')) // Output ["1","3"]. ``` -- Gitee From 67dd61b90bd399706108dcd0f66309722d3d0250 Mon Sep 17 00:00:00 2001 From: wyuanchao Date: Wed, 9 Mar 2022 20:53:33 +0800 Subject: [PATCH 260/282] modify file Signed-off-by: wyuanchao --- .../device-usage-statistics-dev-guide.md | 202 ++++++++---------- .../device-usage-statistics-overview.md | 4 +- .../apis/js-apis-deviceUsageStatistics.md | 195 ++++++++++------- 3 files changed, 210 insertions(+), 191 deletions(-) diff --git a/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-dev-guide.md b/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-dev-guide.md index 3afd163afdf..5cc72d56f4f 100644 --- a/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-dev-guide.md +++ b/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-dev-guide.md @@ -8,7 +8,7 @@ ## 接口说明 注册相关接口包导入: ```js -import stats from '@ohos.usagestatskit'; +import stats from '@ohos.bundleState'; ``` **表1** 设备使用信息统计主要接口 @@ -38,188 +38,170 @@ import stats from '@ohos.usagestatskit'; } ``` -2. 通过指定起始和结束时间查询所有应用的事件集合。 +2. 通过指定起始和结束时间查询所有应用的事件集合,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。 ```js - import stats from '@ohos.usagestatskit' + import stats from '@ohos.bundleState' // 异步方法promise方式 stats.queryBundleActiveStates(0, 20000000000000).then( res => { - console.log('queryBundleActiveStates promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise success.'); for (let i = 0; i < res.length; i++) { - console.log("queryBundleActiveStates, promise bundleName = " + res[i].bundleName) - console.log("queryBundleActiveStates, promise stateType = " + res[i].stateType) - console.log("queryBundleActiveStates, promise stateOccurredTime = " + res[i].stateOccurredTime) + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise result ' + JSON.stringify(res[i])); } }).catch( err => { - console.log('queryBundleActiveStates promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise failed, because: ' + err.code); }); // 异步方法callback方式 - setTimeout(()=>{ - stats.queryBundleActiveStates(0, 20000000000000, (err, res) => { - console.log('queryBundleActiveStates callback succeeded, data number: ' + res.length); - if(err.data == 0) { - for (let i = 0; i < res.length; i++) { - console.log("queryBundleActiveStates, callback bundleName = " + res[i].bundleName) - console.log("queryBundleActiveStates, callback stateType = " + res[i].stateType) - console.log("queryBundleActiveStates, callback stateOccurredTime = " + res[i].stateOccurredTime) - } - } else { - console.log('queryBundleActiveStates callback failed, because: ' + err.data); + stats.queryBundleActiveStates(0, 20000000000000, (err, res) => { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback success.'); + for (let i = 0; i < res.length; i++) { + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback result ' + JSON.stringify(res[i])); } - }) - }, 500); + } else { + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback failed, because: ' + err.code); + } + }); ``` -3. 通过指定起始和结束时间查询应用使用时长统计信息。 +3. 通过指定起始和结束时间查询应用使用时长统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。 ```js - import stats from '@ohos.usagestatskit' + import stats from '@ohos.bundleState' // 异步方法promise方式 stats.queryBundleStateInfos(0, 20000000000000).then( res => { - console.log('queryBundleStateInfos promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise success.'); + let i = 1; for(let key in res){ - console.log("queryBundleStateInfos promise key = " + key) - console.log("queryBundleStateInfos promise bundleName = " + res[key].bundleName) - console.log("queryBundleStateInfos promise abilityPrevAccessTime = " + res[key].abilityPrevAccessTime) - console.log("queryBundleStateInfos promise abilityInFgTotalTime = " + res[key].abilityInFgTotalTime) + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise number : ' + i); + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise result ' + JSON.stringify(res[key])); + i++; } }).catch( err => { - console.log('queryBundleStateInfos promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise failed, because: ' + err.code); }); // 异步方法callback方式 - setTimeout(()=>{ - stats.queryBundleStateInfos(0, 20000000000000,(err, res) => { - console.log('queryBundleStateInfos callback succeeded, data number: ' + res.length); - if(err.data == 0) { - for(let key in res){ - console.log("queryBundleStateInfos callback key = " + key) - console.log("queryBundleStateInfos callback bundleName = " + res[key].bundleName) - console.log("queryBundleStateInfos callback abilityPrevAccessTime = " + res[key].abilityPrevAccessTime) - console.log("queryBundleStateInfos callback abilityInFgTotalTime = " + res[key].abilityInFgTotalTime) - } - } else { - console.log('queryBundleStateInfos callback failed, because: ' + err.data); + stats.queryBundleStateInfos(0, 20000000000000, (err, res) => { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback success.'); + let i = 1; + for(let key in res){ + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback number : ' + i); + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback result ' + JSON.stringify(res[key])); + i++; } - }) - }, 500); + } else { + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback failed, because: ' + err.code); + } + }); ``` -4. 通过指定起始和结束时间查询当前应用的事件集合。 +4. 通过指定起始和结束时间查询当前应用的事件集合,config.json中不需要配置权限。 ```js - import stats from '@ohos.usagestatskit' + import stats from '@ohos.bundleState' // 异步方法promise方式 stats.queryCurrentBundleActiveStates(0, 20000000000000).then( res => { - console.log('queryCurrentBundleActiveStates promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise success.'); for (let i = 0; i < res.length; i++) { - console.log("queryCurrentBundleActiveStates, promise bundleName = " + res[i].bundleName) - console.log("queryCurrentBundleActiveStates, promise stateType = " + res[i].stateType) - console.log("queryCurrentBundleActiveStates, promise stateOccurredTime = " + res[i].stateOccurredTime) + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise result ' + JSON.stringify(res[i])); } }).catch( err => { - console.log('queryCurrentBundleActiveStates promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise failed, because: ' + err.code); }); // 异步方法callback方式 - setTimeout(()=>{ - stats.queryCurrentBundleActiveStates(0, 20000000000000,(err, res) => { - console.log('queryCurrentBundleActiveStates callback succeeded, data number: ' + res.length); - if(err.data == 0) { - for (let i = 0; i < res.length; i++) { - console.log("queryCurrentBundleActiveStates, callback bundleName = " + res[i].bundleName) - console.log("queryCurrentBundleActiveStates, callback stateType = " + res[i].stateType) - console.log("queryCurrentBundleActiveStates, callback stateOccurredTime = " + res[i].stateOccurredTime) - } - } else { - console.log('queryCurrentBundleActiveStates callback failed, because: ' + err.data); - } - }) - }, 500); + stats.queryCurrentBundleActiveStates(0, 20000000000000, (err, res) => { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback success.'); + for (let i = 0; i < res.length; i++) { + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback result ' + JSON.stringify(res[i])); + } + } else { + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback failed, because: ' + err.code); + } + }); ``` -5. 通过指定时间段间隔(天、周、月、年)查询应用使用时长统计信息。 +5. 通过指定时间段间隔(天、周、月、年)查询应用使用时长统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。 ```js - import stats from '@ohos.usagestatskit' + import stats from '@ohos.bundleState' // 异步方法promise方式 stats.queryBundleStateInfoByInterval(0, 0, 20000000000000).then( res => { - console.log('queryBundleStateInfoByInterval promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise success.'); for (let i = 0; i < res.length; i++) { - console.log("queryBundleStateInfoByInterval, promise bundleName = " + res[i].bundleName) - console.log("queryBundleStateInfoByInterval, promise abilityPrevAccessTime = " + res[i].abilityPrevAccessTime) - console.log("queryBundleStateInfoByInterval, promise abilityInFgTotalTime = " + res[i].abilityInFgTotalTime) + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise result ' + JSON.stringify(res[i])); } }).catch( err => { - console.log('queryBundleStateInfoByiInterval promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise failed, because: ' + err.code); }); // 异步方法callback方式 - setTimeout(()=>{ - stats.queryBundleStateInfoByInterval(0, 0, 20000000000000,(err, res) => { - console.log('queryBundleStateInfoByInterval callback succeeded, data number: ' + res.length); - if(err.data == 0) { - for (let i = 0; i < res.length; i++) { - console.log("queryBundleStateInfoByInterval, callback bundleName = " + res[i].bundleName) - console.log("queryBundleStateInfoByInterval, callback abilityPrevAccessTime = " + res[i].abilityPrevAccessTime) - console.log("queryBundleStateInfoByInterval, callback abilityInFgTotalTime = " + res[i].abilityInFgTotalTime) - } - } else { - console.log('queryBundleStateInfoByInterval callback failed, because: ' + err.data); + stats.queryBundleStateInfoByInterval(0, 0, 20000000000000, (err, res) => { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback success.'); + for (let i = 0; i < res.length; i++) { + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback result ' + JSON.stringify(res[i])); } - }) - }, 500); + } else { + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback failed, because: ' + err.code); + } + }); ``` -6. 查询(返回)当前调用者应用的使用优先级群组。 +6. 查询(返回)当前调用者应用的使用优先级群组,config.json中不需要配置权限。 ```js - import stats from '@ohos.usagestatskit' + import stats from '@ohos.bundleState' // 异步方法promise方式 stats.queryAppUsagePriorityGroup().then( res => { - console.log('queryAppUsagePriorityGroup promise succeeded. result: ' + JSON.stringify(res)); + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise succeeded. result: ' + JSON.stringify(res)); }).catch( err => { - console.log('queryAppUsagePriorityGroup promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise failed. because: ' + err.code); }); // 异步方法callback方式 - setTimeout(()=>{ - stats.queryAppUsagePriorityGroup((err, res) => { - if(err.data === 0) { - console.log('queryAppUsagePriorityGroup callback succeeded. result: ' + JSON.stringify(res)); - } else { - console.log('queryAppUsagePriorityGroup callback failed, because: ' + err.data); - } - }) - }, 500); + stats.queryAppUsagePriorityGroup((err, res) => { + if(err.code === 0) { + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback succeeded. result: ' + JSON.stringify(res)); + } else { + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback failed. because: ' + err.code); + } + }); ``` -7. 判断指定Bundle Name的应用当前是否是空闲状态。 +7. 判断指定Bundle Name的应用当前是否是空闲状态,config.json中不需要配置权限。 ```js - import stats from '@ohos.usagestatskit' + import stats from '@ohos.bundleState' // 异步方法promise方式 stats.isIdleState("com.ohos.camera").then( res => { - console.log('isIdleState promise succeeded. result: ' + JSON.stringify(res)); + console.log('BUNDLE_ACTIVE isIdleState promise succeeded, result: ' + JSON.stringify(res)); }).catch( err => { - console.log('isIdleState promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE isIdleState promise failed, because: ' + err.code); }); // 异步方法callback方式 - setTimeout(()=>{ - stats.isIdleState("com.ohos.camera", (err, res) => { - if(err.data === 0) { - console.log('isIdleState callback succeeded. result: ' + JSON.stringify(res)); - } else { - console.log('isIdleState callback failed, because: ' + err.data); - } - }) - }, 500); + stats.isIdleState("com.ohos.camera", (err, res) => { + if(err.code === 0) { + console.log('BUNDLE_ACTIVE isIdleState callback succeeded, result: ' + JSON.stringify(res)); + } else { + console.log('BUNDLE_ACTIVE isIdleState callback failed, because: ' + err.code); + } + }); ``` \ No newline at end of file diff --git a/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-overview.md b/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-overview.md index 2044ec8683c..66c2ea874ae 100644 --- a/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-overview.md +++ b/zh-cn/application-dev/device-usage-statistics/device-usage-statistics-overview.md @@ -20,5 +20,5 @@ >6. 判断指定应用当前是否是空闲状态; ### 设备使用信息统计使用权限 -- 设备使用信息统计接口只对系统应用开放,三方应用不可调用。 -- 系统应用调用设备使用信息统计接口前,必须申请ohos.permission.BUNDLE_ACTIVE_INFO权限。 \ No newline at end of file +- 设备使用信息统计的queryBundleActiveStates、queryBundleStateInfos、queryBundleStateInfoByInterval接口为系统api,调用前需要申请ohos.permission.BUNDLE_ACTIVE_INFO权限。 +- 设备使用信息统计的queryCurrentBundleActiveStates、queryAppUsagePriorityGroup、isIdleState接口为三方api,调用时不需要申请权限。 \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/js-apis-deviceUsageStatistics.md b/zh-cn/application-dev/reference/apis/js-apis-deviceUsageStatistics.md index 0ff74ddd401..8a8634363b7 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-deviceUsageStatistics.md +++ b/zh-cn/application-dev/reference/apis/js-apis-deviceUsageStatistics.md @@ -7,10 +7,10 @@ ## 导入模块 ``` -import stats from '@ohos.usagestatskit' +import stats from '@ohos.bundleState' ``` -## usagestatskit.isIdleState +## bundleState.isIdleState isIdleState(bundleName: string, callback: AsyncCallback): void - **系统能力**: @@ -26,20 +26,22 @@ SystemCapability.ResourceSchedule.UsageStatistics.AppGroup | bundleName | string | 是 | 应用的bundleName。| | callback | AsyncCallback | 是 | 指定的callback回调方法。如果指定的bundleName有效,则返回指定bundleName的应用当前是否是空闲状态;否则返回null。 | +- **权限**: +无权限 - **示例**: ``` stats.isIdleState("com.ohos.camera", (err, res) => { - if(err.data === 0) { - console.log('isIdleState callback succeeded, result: ' + JSON.stringify(res)); + if(err.code === 0) { + console.log('BUNDLE_ACTIVE isIdleState callback succeeded, result: ' + JSON.stringify(res)); } else { - console.log('isIdleState callback failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE isIdleState callback failed, because: ' + err.code); } }); ``` -## usagestatskit.isIdleState +## bundleState.isIdleState isIdleState(bundleName: string): Promise; - **系统能力**: @@ -60,17 +62,20 @@ SystemCapability.ResourceSchedule.UsageStatistics.AppGroup | -------- | -------- | | Promise | 指定的Promise回调方法。如果指定的bundleName有效,则返回指定bundleName的应用当前是否是空闲状态;否则返回null。 | +- **权限**: +无权限 + - **示例**: ``` stats.isIdleState("com.ohos.camera").then( res => { - console.log('isIdleState callback succeeded, result: ' + JSON.stringify(res)); + console.log('BUNDLE_ACTIVE isIdleState promise succeeded, result: ' + JSON.stringify(res)); }).catch( err => { - console.log('isIdleState callback failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE isIdleState promise failed, because: ' + err.code); }); ``` -## usagestatskit.queryAppUsagePriorityGroup +## bundleState.queryAppUsagePriorityGroup queryAppUsagePriorityGroup(callback: AsyncCallback): void - **系统能力**: @@ -85,19 +90,22 @@ SystemCapability.ResourceSchedule.UsageStatistics.AppGroup | -------- | -------- | -------- | -------- | | callback | AsyncCallback | 是 | 指定的callback回调方法。返回当前调用者应用的使用优先级群组。| +- **权限**: +无权限 + - **示例**: ``` stats.queryAppUsagePriorityGroup((err, res) => { - if(err.data === 0) { - console.log('queryAppUsagePriorityGroup callback succeeded. result: ' + JSON.stringify(res)); + if(err.code === 0) { + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback succeeded. result: ' + JSON.stringify(res)); } else { - console.log('queryAppUsagePriorityGroup callback failed. because: ' + err.data); + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback failed. because: ' + err.code); } }); ``` -## usagestatskit.queryAppUsagePriorityGroup +## bundleState.queryAppUsagePriorityGroup queryAppUsagePriorityGroup(): Promise - **系统能力**: @@ -112,17 +120,20 @@ SystemCapability.ResourceSchedule.UsageStatistics.AppGroup | -------- | -------- | | Promise | 指定的Promise回调方法。查询(返回)当前调用者应用的使用优先级群组。| +- **权限**: +无权限 + - **示例**: ``` stats.queryAppUsagePriorityGroup().then( res => { - console.log('queryAppUsagePriorityGroup promise succeeded. result: ' + JSON.stringify(res)); + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise succeeded. result: ' + JSON.stringify(res)); }).catch( err => { - console.log('queryAppUsagePriorityGroup promise failed. because: ' + err.data); + console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise failed. because: ' + err.code); }); ``` -## usagestatskit.queryBundleStateInfos +## bundleState.queryBundleStateInfos queryBundleStateInfos(begin: number, end: number, callback: AsyncCallback): void - **系统能力**: @@ -139,25 +150,28 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | end | number | 是 | 结束时间。| | callback | AsyncCallback | 是 | 指定的callback回调方法。返回指定起始和结束时间内应用使用时长统计信息。| +- **权限**: +ohos.permission.BUNDLE_ACTIVE_INFO + - **示例**: ``` stats.queryBundleStateInfos(0, 20000000000000, (err, res) => { - console.log('queryBundleStateInfos callback succeeded, data number: ' + res.length); - if(err.data == 0) { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback success.'); + let i = 1; for(let key in res){ - console.log("queryBundleStateInfos callback key = " + key) - console.log("queryBundleStateInfos callback bundleName = " + res[key].bundleName) - console.log("queryBundleStateInfos callback abilityPrevAccessTime = " + res[key].abilityPrevAccessTime) - console.log("queryBundleStateInfos callback abilityInFgTotalTime = " + res[key].abilityInFgTotalTime) + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback number : ' + i); + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback result ' + JSON.stringify(res[key])); + i++; } } else { - console.log('queryBundleStateInfos callback failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleStateInfos callback failed, because: ' + err.code); } }); ``` -## usagestatskit.queryBundleStateInfos +## bundleState.queryBundleStateInfos queryBundleStateInfos(begin: number, end: number): Promise - **系统能力**: @@ -179,23 +193,26 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | -------- | -------- | | Promise | 指定的Promise回调方法。返回指定起始和结束时间内应用使用时长统计信息。| +- **权限**: +ohos.permission.BUNDLE_ACTIVE_INFO + - **示例**: ``` stats.queryBundleStateInfos(0, 20000000000000).then( res => { - console.log('queryBundleStateInfos promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise success.'); + let i = 1; for(let key in res){ - console.log("queryBundleStateInfos promise key = " + key) - console.log("queryBundleStateInfos promise bundleName = " + res[key].bundleName) - console.log("queryBundleStateInfos promise abilityPrevAccessTime = " + res[key].abilityPrevAccessTime) - console.log("queryBundleStateInfos promise abilityInFgTotalTime = " + res[key].abilityInFgTotalTime) + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise number : ' + i); + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise result ' + JSON.stringify(res[key])); + i++; } }).catch( err => { - console.log('queryBundleStateInfos promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleStateInfos promise failed, because: ' + err.code); }); ``` -## usagestatskit.queryBundleStateInfoByInterval +## bundleState.queryBundleStateInfoByInterval queryBundleStateInfoByInterval(byInterval: IntervalType, begin: number, end: number, callback: AsyncCallback>): void - **系统能力**: @@ -213,24 +230,26 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | end | number | 是 | 结束时间。| | callback | AsyncCallback> | 是 | 指定的callback回调方法。返回指定时间段间隔(天、周、月、年)查询应用使用时长统计信息。| +- **权限**: +ohos.permission.BUNDLE_ACTIVE_INFO + - **示例**: ``` stats.queryBundleStateInfoByInterval(0, 0, 20000000000000, (err, res) => { - console.log('queryBundleStateInfoByInterval callback succeeded, data number: ' + res.length); - if(err.data == 0) { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback success.'); for (let i = 0; i < res.length; i++) { - console.log("queryBundleStateInfoByInterval, callback bundleName = " + res[i].bundleName) - console.log("queryBundleStateInfoByInterval, callback abilityPrevAccessTime = " + res[i].abilityPrevAccessTime) - console.log("queryBundleStateInfoByInterval, callback abilityInFgTotalTime = " + res[i].abilityInFgTotalTime) + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback result ' + JSON.stringify(res[i])); } } else { - console.log('queryBundleStateInfoByInterval callback failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback failed, because: ' + err.code); } }); ``` -## usagestatskit.queryBundleStateInfoByInterval +## bundleState.queryBundleStateInfoByInterval queryBundleStateInfoByInterval(byInterval: IntervalType, begin: number, end: number): Promise> - **系统能力**: @@ -253,22 +272,24 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | -------- | -------- | | Promise> | 指定的Promise回调方法。返回指定时间段间隔(天、周、月、年)查询应用使用时长统计信息。| +- **权限**: +ohos.permission.BUNDLE_ACTIVE_INFO + - **示例**: ``` stats.queryBundleStateInfoByInterval(0, 0, 20000000000000).then( res => { - console.log('queryBundleStateInfoByInterval promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise success.'); for (let i = 0; i < res.length; i++) { - console.log("queryBundleStateInfoByInterval, promise bundleName = " + res[i].bundleName) - console.log("queryBundleStateInfoByInterval, promise abilityPrevAccessTime = " + res[i].abilityPrevAccessTime) - console.log("queryBundleStateInfoByInterval, promise abilityInFgTotalTime = " + res[i].abilityInFgTotalTime) + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise result ' + JSON.stringify(res[i])); } }).catch( err => { - console.log('queryBundleStateInfoByiInterval promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise failed, because: ' + err.code); }); ``` -## usagestatskit.queryBundleActiveStates +## bundleState.queryBundleActiveStates queryBundleActiveStates(begin: number, end: number, callback: AsyncCallback>): void - **系统能力**: @@ -285,24 +306,26 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | end | number | 是 | 结束时间。| | callback | AsyncCallback> | 是 | 指定的callback回调方法。返回指定起始和结束时间查询所有应用的事件集合。| +- **权限**: +ohos.permission.BUNDLE_ACTIVE_INFO + - **示例**: ``` stats.queryBundleActiveStates(0, 20000000000000, (err, res) => { - console.log('queryBundleActiveStates callback succeeded, data number: ' + res.length); - if(err.data == 0) { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback success.'); for (let i = 0; i < res.length; i++) { - console.log("queryBundleActiveStates, callback bundleName = " + res[i].bundleName) - console.log("queryBundleActiveStates, callback stateType = " + res[i].stateType) - console.log("queryBundleActiveStates, callback stateOccurredTime = " + res[i].stateOccurredTime) + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback result ' + JSON.stringify(res[i])); } } else { - console.log('queryBundleActiveStates callback failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleActiveStates callback failed, because: ' + err.code); } }); ``` -## usagestatskit.queryBundleActiveStates +## bundleState.queryBundleActiveStates queryBundleActiveStates(begin: number, end: number): Promise> - **系统能力**: @@ -324,22 +347,24 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | -------- | -------- | | Promise> | 指定的Promise回调方法。返回指定起始和结束时间查询所有应用的事件集合。| +- **权限**: +ohos.permission.BUNDLE_ACTIVE_INFO + - **示例**: ``` stats.queryBundleActiveStates(0, 20000000000000).then( res => { - console.log('queryBundleActiveStates promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise success.'); for (let i = 0; i < res.length; i++) { - console.log("queryBundleActiveStates, promise bundleName = " + res[i].bundleName) - console.log("queryBundleActiveStates, promise stateType = " + res[i].stateType) - console.log("queryBundleActiveStates, promise stateOccurredTime = " + res[i].stateOccurredTime) + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise result ' + JSON.stringify(res[i])); } }).catch( err => { - console.log('queryBundleActiveStates promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryBundleActiveStates promise failed, because: ' + err.code); }); ``` -## usagestatskit.queryCurrentBundleActiveStates +## bundleState.queryCurrentBundleActiveStates queryCurrentBundleActiveStates(begin: number, end: number, callback: AsyncCallback>): void - **系统能力**: @@ -356,24 +381,26 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | end | number | 是 | 结束时间。| | callback | AsyncCallback> | 是 | 指定的callback回调方法。返回指定起始和结束时间查询当前应用的事件集合。| +- **权限**: +无权限 + - **示例**: ``` - stats.queryCurrentBundleActiveStates(0, 20000000000000,(err, res) => { - console.log('queryCurrentBundleActiveStates callback succeeded, data number: ' + res.length); - if(err.data == 0) { + stats.queryCurrentBundleActiveStates(0, 20000000000000, (err, res) => { + if(err.code == 0) { + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback success.'); for (let i = 0; i < res.length; i++) { - console.log("queryCurrentBundleActiveStates, callback bundleName = " + res[i].bundleName) - console.log("queryCurrentBundleActiveStates, callback stateType = " + res[i].stateType) - console.log("queryCurrentBundleActiveStates, callback stateOccurredTime = " + res[i].stateOccurredTime) - } + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback result ' + JSON.stringify(res[i])); + } } else { - console.log('queryCurrentBundleActiveStates callback failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback failed, because: ' + err.code); } }); ``` -## usagestatskit.queryCurrentBundleActiveStates +## bundleState.queryCurrentBundleActiveStates queryCurrentBundleActiveStates(begin: number, end: number): Promise> - **系统能力**: @@ -395,26 +422,30 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | -------- | -------- | | Promise> | 指定的Promise回调方法。返回指定起始和结束时间查询当前应用的事件集合。| +- **权限**: +无权限 + - **示例**: ``` stats.queryCurrentBundleActiveStates(0, 20000000000000).then( res => { - console.log('queryCurrentBundleActiveStates promise succeeded, data number: ' + res.length); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise success.'); for (let i = 0; i < res.length; i++) { - console.log("queryCurrentBundleActiveStates, promise bundleName = " + res[i].bundleName) - console.log("queryCurrentBundleActiveStates, promise stateType = " + res[i].stateType) - console.log("queryCurrentBundleActiveStates, promise stateOccurredTime = " + res[i].stateOccurredTime) + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise number : ' + (i + 1)); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise result ' + JSON.stringify(res[i])); } }).catch( err => { - console.log('queryCurrentBundleActiveStates promise failed, because: ' + err.data); + console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise failed, because: ' + err.code); }); ``` -## usagestatskit.BundleStateInfo +## bundleState.BundleStateInfo - **系统能力**: SystemCapability.ResourceSchedule.UsageStatistics.App -提供应用使用时长的具体信息。 +- **参数**: + + 提供应用使用时长的具体信息。 | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -422,11 +453,13 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | abilityPrevAccessTime | number | 是 | 应用最后一次使用的时间。| | abilityInFgTotalTime | number | 是 | 应用在前台使用的总时间。| -## usagestatskit.BundleActiveState +## bundleState.BundleActiveState - **系统能力**: SystemCapability.ResourceSchedule.UsageStatistics.App -提供应用事件的具体信息。 +- **参数**: + + 提供应用事件的具体信息。 | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | @@ -434,21 +467,25 @@ SystemCapability.ResourceSchedule.UsageStatistics.App | stateType | number | 是 | 应用事件类型。| | stateOccurredTime | number | 是 | 应用事件发生的时间戳。| -## usagestatskit.BundleActiveInfoResponse +## bundleState.BundleActiveInfoResponse - **系统能力**: SystemCapability.ResourceSchedule.UsageStatistics.App -提供应用使用时长的具体信息。 +- **参数**: + + 提供应用使用时长的具体信息。 | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | [key: string]: BundleStateInfo | BundleStateInfo | 是 | 不同应用的使用时长统计信息。| -## usagestatskit.IntervalType +## bundleState.IntervalType - **系统能力**: SystemCapability.ResourceSchedule.UsageStatistics.App -触发工作的网络类型。 +- **参数**: + + 提供查询的类型 |名称 |默认值 |说明| | -------- | -------- | -------- | -- Gitee From 9a8c8b98ce8e4b45e290b379ba5c57212389250d Mon Sep 17 00:00:00 2001 From: huangke11 Date: Wed, 9 Mar 2022 21:58:33 +0800 Subject: [PATCH 261/282] modify cust_lite Signed-off-by: huangke11 --- en/readme/globalization.md | 9 --------- ...3\345\214\226\345\255\220\347\263\273\347\273\237.md" | 9 --------- 2 files changed, 18 deletions(-) diff --git a/en/readme/globalization.md b/en/readme/globalization.md index 8879c928bbf..6fc2c3fa69e 100755 --- a/en/readme/globalization.md +++ b/en/readme/globalization.md @@ -45,13 +45,6 @@ The directory structure of the Globalization subsystem for the mini and small sy │ │ │ └── src # Implementation code │ ├── interfaces # APIs │ │ └── innerkits # APIs for internal subsystems -├── cust_lite # Code repository for the Cust framework -│ ├── frameworks # Core code of the Cust framework -│ │ ├── cust_lite # Cust framework -│ │ │ ├── src # Implementation code -│ │ │ └── test # Test code -│ ├── interfaces # APIs -│ │ └── innerkits # APIs for internal subsystems ``` The directory structure of the Globalization subsystem for the standard system is as follows: @@ -78,8 +71,6 @@ The directory structure of the Globalization subsystem for the standard system i **Globalization subsystem** -global\_cust\_lite - global\_i18n\_lite global\_i18n\_standard diff --git "a/zh-cn/readme/\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237.md" "b/zh-cn/readme/\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237.md" index 19c3e0812df..539168f4a3c 100755 --- "a/zh-cn/readme/\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237.md" +++ "b/zh-cn/readme/\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237.md" @@ -50,13 +50,6 @@ │ │ │ └── src # 实现代码 │ ├── interfaces # 资源管理框架接口 │ │ └── innerkits # 资源管理框架对子系统间接口 -├── cust_lite # 定制框架代码仓 -│ ├── frameworks # 定制框架核心代码 -│ │ ├── cust_lite # 定制框架模块 -│ │ │ ├── src # 实现代码 -│ │ │ └── test # 测试代码 -│ ├── interfaces # 定制框架接口 -│ │ └── innerkits # 定制框架子系统间接口 ``` 标准系统的目录结构如下所示: @@ -83,8 +76,6 @@ **全球化子系统** -global\_cust\_lite - global\_i18n\_lite global\_i18n\_standard -- Gitee From a9a5a542f3e779b7de8ac24329d101333b458af9 Mon Sep 17 00:00:00 2001 From: rcy-hw Date: Thu, 10 Mar 2022 11:08:11 +0800 Subject: [PATCH 262/282] update description Signed-off-by: rcy-hw Change-Id: I7bcf573867ba035e1e460219ece0f3cc5db6bb67 --- ...ackground-agent-scheduled-reminder-guide.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/zh-cn/application-dev/background-agent-scheduled-reminder/background-agent-scheduled-reminder-guide.md b/zh-cn/application-dev/background-agent-scheduled-reminder/background-agent-scheduled-reminder-guide.md index e1b2b4c62a6..9e5045eacc2 100644 --- a/zh-cn/application-dev/background-agent-scheduled-reminder/background-agent-scheduled-reminder-guide.md +++ b/zh-cn/application-dev/background-agent-scheduled-reminder/background-agent-scheduled-reminder-guide.md @@ -87,15 +87,15 @@ interface ReminderRequest: 需要发布的提醒实例的信息 interface ReminderRequestCalendar extends ReminderRequest: 日历类提醒实例。 -第一次指定的目标时间必须大于当前时间。 +如果没有指定重复的月或天,那么第一次指定的目标时间必须大于当前时间,否则应用将异常退出。 **表8** ReminderRequestCalendar | 参数名 | 类型 | 必填 | 描述 | | -------- | -------- | -------- | -------- | -| dateTime | LocalDataTime | 是 | 设置目标时间 | -| repeatMonths | Array<number> | 否 | 设置重复提醒的月份 | -| repeatDays | Array<number> | 否 | 设置重复提醒的日期 | +| dateTime | LocalDataTime | 是 | 设置目标时间(精确到分钟级别) | +| repeatMonths | Array<number> | 否 | 设置重复提醒的月份,范围从 1 到 12 | +| repeatDays | Array<number> | 否 | 设置重复提醒的日期,范围从 1 到 31 | interface ReminderRequestAlarm extends ReminderRequest: 闹钟类提醒实例。 @@ -103,9 +103,9 @@ interface ReminderRequestAlarm extends ReminderRequest: 闹钟类提醒实例。 | 参数名 | 类型 | 必填 | 描述 | | -------- | -------- | -------- | -------- | -| hour | number | 是 | 设置目标时间(小时) | -| minute | number | 是 | 设置目标时间(分钟) | -| daysOfWeek | Array<number> | 否 | 设置每个星期哪一天重复提醒 | +| hour | number | 是 | 设置目标时间(小时),范围从 0 到 23 | +| minute | number | 是 | 设置目标时间(分钟),范围从 0 到 59 | +| daysOfWeek | Array<number> | 否 | 设置每个星期哪一天重复提醒,范围从 1 到 7 | interface ReminderRequestTimer extends ReminderRequest:倒计时提醒实例 @@ -196,8 +196,8 @@ calendar: { minute: 14, second: 30 }, - repeatMonths: [0], - repeatDays: [0], + repeatMonths: [1], + repeatDays: [1], actionButton: [ { title: "close", -- Gitee From 6869d1433603dbf13a867468cd8bff5ca79461f3 Mon Sep 17 00:00:00 2001 From: laiguizhong Date: Wed, 9 Mar 2022 17:35:56 +0800 Subject: [PATCH 263/282] fix review opinion Signed-off-by: laiguizhong Change-Id: Ib201450c2500a2a88fbc2cf2355232317396d6f8 --- .../reference/apis/Readme-CN.md | 1 + .../reference/apis/js-apis-accessibility.md | 102 ++++++++---------- 2 files changed, 48 insertions(+), 55 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/Readme-CN.md b/zh-cn/application-dev/reference/apis/Readme-CN.md index 532f240e1d0..e612643dbce 100644 --- a/zh-cn/application-dev/reference/apis/Readme-CN.md +++ b/zh-cn/application-dev/reference/apis/Readme-CN.md @@ -83,6 +83,7 @@ - [屏幕截图](js-apis-screenshot.md) - [输入法框架](js-apis-inputmethod.md) - [输入法服务](js-apis-inputmethodengine.md) + - [辅助功能](js-apis-accessibility.md) - DFX - [应用打点](js-apis-hiappevent.md) - [性能打点](js-apis-hitracemeter.md) diff --git a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md index efa6f736a13..dd94e8a7360 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md @@ -9,27 +9,23 @@ import accessibility from '@ohos.accessibility'; ``` -## 权限列表 - -无 - ## AbilityState 辅助应用状态类型。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core | 名称 | 描述 | | -------- | -------- | -| enable | 无障碍服务已启用。 | -| disable | 无障碍服务已禁用。 | -| install | 无障碍服务已安装。 | +| enable | 辅助应用已启用。 | +| disable | 辅助应用已禁用。 | +| install | 辅助应用已安装。 | ## AbilityType 无障碍辅助应用类型。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core | 名称 | 描述 | | -------- | -------- | @@ -43,7 +39,7 @@ import accessibility from '@ohos.accessibility'; 辅助应用信息。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core ### 属性 @@ -61,7 +57,7 @@ import accessibility from '@ohos.accessibility'; 应用所支持的目标动作。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core | 名称 | 描述 | | -------- | -------- | @@ -86,7 +82,7 @@ import accessibility from '@ohos.accessibility'; 辅助应用能力类型。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core | 名称 | 描述 | | -------- | -------- | @@ -100,7 +96,7 @@ import accessibility from '@ohos.accessibility'; 字幕字体边缘类型。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Hearing | 名称 | 描述 | | -------- | -------- | @@ -114,7 +110,7 @@ import accessibility from '@ohos.accessibility'; 字幕字体。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Hearing | 名称 | 描述 | | -------- | -------- | @@ -131,14 +127,14 @@ import accessibility from '@ohos.accessibility'; 字幕风格。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Hearing | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| fontFamily | [CaptionsFontFamily](#captionsfontfamily) | 是 | 否 | 描述字幕字体。 | +| fontFamily | [CaptionsFontFamily](#CaptionsFontFamily8) | 是 | 否 | 描述字幕字体。 | | fontScale | number | 是 | 否 | 描述字幕字体缩放系数。 | | fontColor | number \| string | 是 | 否 | 描述字幕字体颜色。 | -| fontEdgeType | [CaptionsFontEdgeType](#captionsfontedgetype) | 是 | 否 | 描述字幕字体边缘。 | +| fontEdgeType | [CaptionsFontEdgeType](#CaptionsFontEdgeType8) | 是 | 否 | 描述字幕字体边缘。 | | backgroundColor | number \| string | 是 | 否 | 描述字幕背景颜色。 | | windowColor | number \| string | 是 | 否 | 描述字幕窗口颜色。 | @@ -150,12 +146,14 @@ import accessibility from '@ohos.accessibility'; | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| enabled | boolean | 是 | 否 | 表示字幕风格。 | -| style | [CaptionsStyle](#captionsstyle) | 是 | 否 | 表示是否启用字幕配置。 | +| enabled | boolean | 是 | 否 | 表示是否启用字幕配置。 | +| style | [CaptionsStyle](#CaptionsStyle8) | 是 | 否 | 表示字幕风格。 | + +### 方法 -## 方法 +下列 API 示例中都需要使用 [accessibility.CaptionsManager()](#accessibilitygetCaptionsManager8) 获取 captionsManager 实例,再通过此实例调用对应的方法。 -### on +#### on('enableChange') on(type: 'enableChange', callback: Callback<boolean>): void; @@ -167,18 +165,18 @@ on(type: 'enableChange', callback: Callback<boolean>): void; | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'enableChange' | 是 | 监听字幕配置启用状态。 | + | type | string | 是 | 监听字幕配置启用状态。 | | callback | Callback<boolean> | 是 | 回调函数,在启用状态变化时将状态通过此函数进行通知。 | - 示例 ```typescript - captionsMgr.on('enableChange',(data) => { + captionsManager.on('enableChange',(data) => { console.info('success data:subscribeStateObserver : ' + JSON.stringify(data)) }) ``` -### on +#### on('styleChange') on(type: 'styleChange', callback: Callback<CaptionsStyle>): void; @@ -190,20 +188,20 @@ on(type: 'styleChange', callback: Callback<CaptionsStyle>): void; | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'styleChange' | 是 | 监听字幕风格变化。 | - | callback | Callback<CaptionsStyle> | 是 | 回调函数,在字幕风格变化时通过此函数进行通知。 | + | type | string | 是 | 监听字幕风格变化。 | + | callback | Callback<[CaptionsStyle](#CaptionsStyle8)> | 是 | 回调函数,在字幕风格变化时通过此函数进行通知。 | - 示例 ```typescript - captionsMgr.on('styleChange',(data) => { + captionsManager.on('styleChange',(data) => { console.info('success data:subscribeStateObserver : ' + JSON.stringify(data)) }) ``` -### off +#### off('enableChange') -off(type: 'enableChange', callback: Callback<boolean>): void; +off(type: 'enableChange', callback?: Callback<boolean>): void; 移除字幕配置启用的监听函数。 @@ -213,16 +211,16 @@ off(type: 'enableChange', callback: Callback<boolean>): void; | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'enableChange' | 是 | 监听字幕配置启用状态。 | + | type | string | 是 | 监听字幕配置启用状态。 | | callback | Callback<boolean> | 否 | 回调函数,在启用状态变化时将状态通过此函数进行通知。 | - 示例 ```typescript - captionsMgr.off('enableChange') + captionsManager.off('enableChange') ``` -### off +#### off('styleChange') off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; @@ -234,20 +232,20 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'styleChange' | 是 | 字幕风格变化。 | + | type | string | 是 | 字幕风格变化。 | | callback | Callback<CaptionsStyle> | 否 | 回调函数,在字幕风格变化时通过此函数进行通知。 | - 示例 ```typescript - captionsMgr.off('styleChange') + captionsManager.off('styleChange') ``` ## EventInfo 界面变更事件。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core ### 属性 @@ -272,7 +270,7 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 无障碍事件类型。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core | 名称 | 描述 | | -------- | -------- | @@ -292,7 +290,7 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 文本无障碍导航移动粒度。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core | 名称 | 描述 | | -------- | -------- | @@ -306,7 +304,7 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; 窗口变化类型。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力均为 SystemCapability.Barrierfree.Accessibility.Core | 名称 | 描述 | | -------- | -------- | @@ -404,7 +402,7 @@ getAbilityLists(abilityType: AbilityType, stateType: AbilityState,callback: Asyn }) ``` -## accessibility.getCaptionsManager +## accessibility.getCaptionsManager8+ getCaptionsManager(): CaptionsManager @@ -412,15 +410,11 @@ getCaptionsManager(): CaptionsManager **系统能力**:SystemCapability.Barrierfree.Accessibility.Hearing -- 参数: - - 无 - - 返回值: | 类型 | 说明 | | -------- | -------- | - | CaptionsManager | 无障碍字幕配置管理。 | + | [CaptionsManager](#CaptionsManager8) | 无障碍字幕配置管理。 | - 示例 @@ -428,17 +422,19 @@ getCaptionsManager(): CaptionsManager captionsManager = accessibility.getCaptionsManager() ``` -## accessibility.on +## accessibility.on('accessibilityStateChange' | 'touchGuideStateChange') on(type: 'accessibilityStateChange' | 'touchGuideStateChange', callback: Callback<boolean>): void -启用变化监听。 +启用辅助应用和触摸浏览功能的状态变化监听。 + +**系统能力**:以下各项对应的系统能力有所不同,详见下表。 - 参数: | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 是 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
**系统能力**:SystemCapability.Barrierfree.Accessibility.Core
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。
**系统能力**:SystemCapability.Barrierfree.Accessibility.Vision | + | type | string | 是 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
**系统能力**:SystemCapability.Barrierfree.Accessibility.Core
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。
**系统能力**:SystemCapability.Barrierfree.Accessibility.Vision | | callback | Callback<boolean> | 是 | 回调函数,在启用状态变化时将状态通过此函数进行通知。 | - 示例 @@ -449,19 +445,19 @@ on(type: 'accessibilityStateChange' | 'touchGuideStateChange', callback: Callbac }) ``` -## accessibility.off +## accessibility.off('accessibilityStateChange' | 'touchGuideStateChange') off(type: ‘accessibilityStateChange ’ | ‘touchGuideStateChange’, callback?: Callback<boolean>): void -关闭变化监听。 +关闭辅助应用和触摸浏览功能的状态变化监听。 -**系统能力**:SystemCapability.Barrierfree.Accessibility.Core +**系统能力**:以下各项对应的系统能力有所不同,详见下表。 - 参数: | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | - | type | 'accessibilityStateChange'\|'touchGuideStateChange' | 否 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
**系统能力**:SystemCapability.Barrierfree.Accessibility.Core
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。
**系统能力**:SystemCapability.Barrierfree.Accessibility.Vision | + | type | string | 否 | 监听的事件类型。
- type 为'accessibilityStateChange'时表示监听类型为辅助功能启用状态变化监听;
**系统能力**:SystemCapability.Barrierfree.Accessibility.Core
- type 为'touchGuideStateChange'时表示监听类型为触摸浏览启用状态变化监听。
**系统能力**:SystemCapability.Barrierfree.Accessibility.Vision | | callback | Callback<boolean> | 否 | 要取消的监听回调函数。 | - 示例 @@ -480,10 +476,6 @@ isOpenAccessibility(): Promise<boolean> **系统能力**:SystemCapability.Barrierfree.Accessibility.Core -- 参数: - - 无 - - 返回值: | 类型 | 说明 | -- Gitee From 0c8edccc8f5c7d54ce61484e6205dc01dd09e26d Mon Sep 17 00:00:00 2001 From: laiguizhong Date: Thu, 10 Mar 2022 11:21:27 +0800 Subject: [PATCH 264/282] fix jump link Signed-off-by: laiguizhong Change-Id: Id52b1b1ebf78e950a5659402d2e8d9a130319da5 --- .../reference/apis/js-apis-accessibility.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md index dd94e8a7360..d91a478a4e3 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md @@ -131,10 +131,10 @@ import accessibility from '@ohos.accessibility'; | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | -| fontFamily | [CaptionsFontFamily](#CaptionsFontFamily8) | 是 | 否 | 描述字幕字体。 | +| fontFamily | [CaptionsFontFamily](#captionsfontfamily8) | 是 | 否 | 描述字幕字体。 | | fontScale | number | 是 | 否 | 描述字幕字体缩放系数。 | | fontColor | number \| string | 是 | 否 | 描述字幕字体颜色。 | -| fontEdgeType | [CaptionsFontEdgeType](#CaptionsFontEdgeType8) | 是 | 否 | 描述字幕字体边缘。 | +| fontEdgeType | [CaptionsFontEdgeType](#captionsfontedgetype8) | 是 | 否 | 描述字幕字体边缘。 | | backgroundColor | number \| string | 是 | 否 | 描述字幕背景颜色。 | | windowColor | number \| string | 是 | 否 | 描述字幕窗口颜色。 | @@ -147,11 +147,11 @@ import accessibility from '@ohos.accessibility'; | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | | enabled | boolean | 是 | 否 | 表示是否启用字幕配置。 | -| style | [CaptionsStyle](#CaptionsStyle8) | 是 | 否 | 表示字幕风格。 | +| style | [CaptionsStyle](#captionsstyle8) | 是 | 否 | 表示字幕风格。 | ### 方法 -下列 API 示例中都需要使用 [accessibility.CaptionsManager()](#accessibilitygetCaptionsManager8) 获取 captionsManager 实例,再通过此实例调用对应的方法。 +下列 API 示例中都需要使用 [accessibility.CaptionsManager()](#accessibilitygetcaptionsmanager8) 获取 captionsManager 实例,再通过此实例调用对应的方法。 #### on('enableChange') @@ -189,7 +189,7 @@ on(type: 'styleChange', callback: Callback<CaptionsStyle>): void; | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | type | string | 是 | 监听字幕风格变化。 | - | callback | Callback<[CaptionsStyle](#CaptionsStyle8)> | 是 | 回调函数,在字幕风格变化时通过此函数进行通知。 | + | callback | Callback<[CaptionsStyle](#captionsstyle8)> | 是 | 回调函数,在字幕风格变化时通过此函数进行通知。 | - 示例 @@ -233,7 +233,7 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; | 参数名 | 参数类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | type | string | 是 | 字幕风格变化。 | - | callback | Callback<CaptionsStyle> | 否 | 回调函数,在字幕风格变化时通过此函数进行通知。 | + | callback | Callback<[CaptionsStyle](#captionsstyle8)> | 否 | 回调函数,在字幕风格变化时通过此函数进行通知。 | - 示例 @@ -414,7 +414,7 @@ getCaptionsManager(): CaptionsManager | 类型 | 说明 | | -------- | -------- | - | [CaptionsManager](#CaptionsManager8) | 无障碍字幕配置管理。 | + | [CaptionsManager](#captionsmanager8) | 无障碍字幕配置管理。 | - 示例 -- Gitee From 739513f5260a025fab361e46a6202dbfa5da9d97 Mon Sep 17 00:00:00 2001 From: liangZ15 Date: Thu, 10 Mar 2022 11:34:58 +0800 Subject: [PATCH 265/282] Signed-off-by: liangZ15 refresh doc --- .../reference/apis/js-apis-update.md | 110 +++++++----------- 1 file changed, 41 insertions(+), 69 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-update.md b/zh-cn/application-dev/reference/apis/js-apis-update.md index b0f789003d7..a17531a2694 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-update.md +++ b/zh-cn/application-dev/reference/apis/js-apis-update.md @@ -17,15 +17,13 @@ import update from '@ohos.update' 无 -## 获取升级对象Updater - -### update.getUpdater +## update.getUpdater getUpdater(upgradeFile: string, updateType?: UpdateTypes): Updater 获取本地升级Updater。 -**系统能力**:SystemCapability.Updater.update_service +**系统能力**:SystemCapability.Update.UpdateService **参数:** @@ -50,13 +48,13 @@ try { } ``` -### update.getUpdaterForOther +## update.getUpdaterForOther getUpdaterForOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater 获取升级对象给待升级设备。 -**系统能力**:SystemCapability.Updater.update_service +**系统能力**:SystemCapability.Update.UpdateService **参数:** @@ -82,13 +80,13 @@ try { } ``` -### update.getUpdaterFromOther +## update.getUpdaterFromOther getUpdaterFromOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater 获取其它设备为本设备升级的Updater。 -**系统能力**:SystemCapability.Updater.update_service +**系统能力**:SystemCapability.Update.UpdateService **参数:** @@ -116,14 +114,14 @@ try { ## Updater +**系统能力**:以下各项对应能力均为:SystemCapability.Update.UpdateService + ### getNewVersionInfo getNewVersionInfo(callback: AsyncCallback\): void 获取新版本信息,使用callback方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -147,8 +145,6 @@ getNewVersionInfo(): Promise\ 获取新版本信息,使用promise方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **返回值:** | 类型 | 说明 | @@ -173,8 +169,6 @@ checkNewVersion(callback: AsyncCallback\): void 检查新版本,使用callback方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -198,8 +192,6 @@ checkNewVersion(): Promise\ 检查新版本,使用promise方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **返回值:** | 类型 | 说明 | @@ -224,8 +216,6 @@ verifyUpdatePackage(upgradeFile: string, certsFile: string): void 升级前检查升级包是否有效。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -248,8 +238,6 @@ rebootAndCleanUserData(): Promise\ 重启设备并清除用户分区数据。 -**系统能力**:SystemCapability.Updater.update_service - **返回值:** | 类型 | 说明 | @@ -272,8 +260,6 @@ rebootAndCleanUserData(callback: AsyncCallback\): void 重启设备并清除用户分区数据。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -294,8 +280,6 @@ applyNewVersion(): Promise\ 重启设备后安装升级包。 -**系统能力**:SystemCapability.Updater.update_service - **返回值:** | 类型 | 说明 | @@ -318,8 +302,6 @@ applyNewVersion(callback: AsyncCallback\): void 重启设备后安装升级包。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -340,8 +322,6 @@ download(): void 下载新版本,并监听下载进程。 -**系统能力**:SystemCapability.Updater.update_service - **示例:** ``` @@ -359,8 +339,6 @@ updater.upgrade():void 启动升级。 -**系统能力**:SystemCapability.Updater.update_service - **示例:** ``` @@ -378,8 +356,6 @@ setUpdatePolicy(policy: UpdatePolicy, callback: AsyncCallback\): void 设置升级策略,使用callback方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -409,8 +385,6 @@ setUpdatePolicy(policy: UpdatePolicy): Promise\ 设置升级策略,使用promise方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -446,8 +420,6 @@ getUpdatePolicy(callback: AsyncCallback\): void 获取升级策略信息,使用callback方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -471,8 +443,6 @@ getUpdatePolicy(): Promise\ 获取升级策略,通过promise方式作为异步方法。 -**系统能力**:SystemCapability.Updater.update_service - **返回值:** | 类型 | 说明 | @@ -495,10 +465,12 @@ update.getUpdatePolicy().then(value => { 升级类型。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 参数名 | 说明 | | ------ | -------- | -| OTA | OTA升级
**系统能力**:SystemCapability.Updater.update_service| -| patch | 补丁升级
**系统能力**:SystemCapability.Updater.update_service| +| OTA | OTA升级 | +| patch | 补丁升级 | ## PackageTypes @@ -506,13 +478,13 @@ update.getUpdatePolicy().then(value => { | 参数名 | 默认值 | 说明 | | -------------------- | ------ | -------------- | -| PACKAGE_TYPE_NORMAL | 1 | 通用升级包
**系统能力**:SystemCapability.Updater.update_service| -| PACKAGE_TYPE_BASE | 2 | 基础升级包
**系统能力**:SystemCapability.Updater.update_service| -| PACKAGE_TYPE_CUST | 3 | 定制升级包
**系统能力**:SystemCapability.Updater.update_service| -| PACKAGE_TYPE_PRELOAD | 4 | 预装升级包
**系统能力**:SystemCapability.Updater.update_service| -| PACKAGE_TYPE_COTA | 5 | 参数配置升级包
**系统能力**:SystemCapability.Updater.update_service| -| PACKAGE_TYPE_VERSION | 6 | 版本升级包
**系统能力**:SystemCapability.Updater.update_service| -| PACKAGE_TYPE_PATCH | 7 | 补丁包
**系统能力**:SystemCapability.Updater.update_service| +| PACKAGE_TYPE_NORMAL | 1 | 通用升级包 | +| PACKAGE_TYPE_BASE | 2 | 基础升级包 | +| PACKAGE_TYPE_CUST | 3 | 定制升级包 | +| PACKAGE_TYPE_PRELOAD | 4 | 预装升级包 | +| PACKAGE_TYPE_COTA | 5 | 参数配置升级包 | +| PACKAGE_TYPE_VERSION | 6 | 版本升级包 | +| PACKAGE_TYPE_PATCH | 7 | 补丁包 | ## InstallMode @@ -520,9 +492,9 @@ update.getUpdatePolicy().then(value => { | 参数名 | 默认值 | 说明 | | ------------------- | ------ | -------- | -| INSTALL_MODE_NORMAL | 0 | 正常升级
**系统能力**:SystemCapability.Updater.update_service| -| INSTALL_MODE_NIGHT | 1 | 夜间升级
**系统能力**:SystemCapability.Updater.update_service| -| INSTALL_MODE_AUTO | 2 | 自动升级
**系统能力**:SystemCapability.Updater.update_service| +| INSTALL_MODE_NORMAL | 0 | 正常升级 | +| INSTALL_MODE_NIGHT | 1 | 夜间升级 | +| INSTALL_MODE_AUTO | 2 | 自动升级 | ## NewVersionStatus @@ -530,10 +502,10 @@ update.getUpdatePolicy().then(value => { | 参数名 | 默认值 | 说明 | | ------------------- | ------ | ---------------- | -| VERSION_STATUS_ERR | -1 | 检测版本时出错
**系统能力**:SystemCapability.Updater.update_service| -| VERSION_STATUS_NEW | 0 | 检测到新版本
**系统能力**:SystemCapability.Updater.update_service| -| VERSION_STATUS_NONE | 1 | 没有检测到新版本
**系统能力**:SystemCapability.Updater.update_service| -| VERSION_STATUS_BUSY | 2 | 检测版本时忙
**系统能力**:SystemCapability.Updater.update_service| +| VERSION_STATUS_ERR | -1 | 检测版本时出错 | +| VERSION_STATUS_NEW | 0 | 检测到新版本 | +| VERSION_STATUS_NONE | 1 | 没有检测到新版本 | +| VERSION_STATUS_BUSY | 2 | 检测版本时忙 | ## UpdatePolicy @@ -541,9 +513,9 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | ------------------- | --------------------------- | ---- | -------------- | -| autoDownload | bool | 是 | 自动升级开关
**系统能力**:SystemCapability.Updater.update_service| -| installMode | [InstallMode](#installmode) | 是 | 安装模式
**系统能力**:SystemCapability.Updater.update_service| -| autoUpgradeInterval | Array\ | 是 | 自动升级时间段
**系统能力**:SystemCapability.Updater.update_service| +| autoDownload | bool | 是 | 自动升级开关 | +| installMode | [InstallMode](#installmode) | 是 | 安装模式 | +| autoUpgradeInterval | Array\ | 是 | 自动升级时间段 | ## NewVersionInfo @@ -551,10 +523,10 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | --------------- | ------------------------------------------- | ---- | -------- | -| status | [NewVersionStatus](#newversionstatus) | 是 | 升级状态
**系统能力**:SystemCapability.Updater.update_service| -| errMsg | string | 是 | 错误信息
**系统能力**:SystemCapability.Updater.update_service| -| checkResults | Array<[CheckResult](#checkresult)> | 是 | 检测结果
**系统能力**:SystemCapability.Updater.update_service| -| descriptionInfo | Array\<[DescriptionInfo](#descriptioninfo)> | 是 | 描述信息
**系统能力**:SystemCapability.Updater.update_service| +| status | [NewVersionStatus](#newversionstatus) | 是 | 升级状态 | +| errMsg | string | 是 | 错误信息 | +| checkResults | Array<[CheckResult](#checkresult)> | 是 | 检测结果 | +| descriptionInfo | Array\<[DescriptionInfo](#descriptioninfo)> | 是 | 描述信息 | ## CheckResult @@ -562,12 +534,12 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | ------------- | ----------------------------- | ---- | ------------ | -| versionName | string | 是 | 版本名称
**系统能力**:SystemCapability.Updater.update_service| -| versionCode | number | 是 | 版本编码
**系统能力**:SystemCapability.Updater.update_service| -| size | number | 是 | 版本大小
**系统能力**:SystemCapability.Updater.update_service| -| verifyInfo | string | 是 | 版本校验信息
**系统能力**:SystemCapability.Updater.update_service| -| packageType | [PackageTypes](#packagetypes) | 是 | 版本类型
**系统能力**:SystemCapability.Updater.update_service| -| descriptionId | string | 是 | 版本描述信息
**系统能力**:SystemCapability.Updater.update_service| +| versionName | string | 是 | 版本名称 | +| versionCode | number | 是 | 版本编码 | +| size | number | 是 | 版本大小 | +| verifyInfo | string | 是 | 版本校验信息 | +| packageType | [PackageTypes](#packagetypes) | 是 | 版本类型 | +| descriptionId | string | 是 | 版本描述信息 | ## DescriptionInfo @@ -575,5 +547,5 @@ update.getUpdatePolicy().then(value => { | 名称 | 参数类型 | 必填 | 说明 | | ------------- | -------- | ---- | ----------------- | -| descriptionId | string | 是 | 版本versionId信息
**系统能力**:SystemCapability.Updater.update_service| -| content | string | 是 | 版本changelog信息
**系统能力**:SystemCapability.Updater.update_service| \ No newline at end of file +| descriptionId | string | 是 | 版本versionId信息 | +| content | string | 是 | 版本changelog信息 | \ No newline at end of file -- Gitee From 3edefcf10000addfd755d191ad77d584525d08e0 Mon Sep 17 00:00:00 2001 From: liujinwei Date: Wed, 9 Mar 2022 22:17:31 +0800 Subject: [PATCH 266/282] add web Signed-off-by: liujinwei Change-Id: I49117fade29106037fc683511fd8bff59e3b9391 --- .../arkui-ts/ts-basic-components-web.md | 88 +++++++++++++++++-- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md b/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md index 566d3b60124..3373cce20b1 100755 --- a/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md @@ -61,15 +61,32 @@ ohos.permission.READ_USER_STORAGE 通用事件仅支持onFocus。 -| 名称 | 功能描述 | -| ---------------------------------------- | ---------------------------------------- | +| 名称 | 功能描述 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | | onDownloadStart(callback: (event?: { url: string, userAgent: string, contentDisposition: string, mimetype: string, contentLength: number }) => void) |

下载开始时触发该回调。
url:Web引擎返回的下载URL。
userAgent:Web引擎返回的用户代理名称。
contentDisposition:Web引擎返回的响应头。
mimetype:Web引擎返回的mimetype信息。
contentLength:Web引擎返回的内容长度。

| -| onGeolocationHide(callback: () => void) |

调用onGeolocationShow时发出的地理位置权限请求被取消后触发该回调。

| +| onGeolocationHide(callback: () => void) |

调用onGeolocationShow时发出的地理位置权限请求被取消后触发该回调。

| | onGeolocationShow(callback: (event?: { origin: string, geolocation: JsGeolocation }) => void) |

应用尝试使用地理位置时触发该回调,并向用户请求权限。
origin:尝试获取地理位置的Web内容的来源。
geolocation:用于请求地理位置权限。

| -| onPageBegin(callback: (event?: { url: string }) => void) |

网页加载时触发该回调。
url:Web引擎返回的URL。

| -| onPageEnd(callback: (event?: { url: string }) => void) |

网页加载结束时触发该回调。
url:Web引擎返回的URL。

| +| onPageBegin(callback: (event?: { url: string }) => void) |

网页加载时触发该回调。
url:Web引擎返回的URL。

| +| onPageEnd(callback: (event?: { url: string }) => void) |

网页加载结束时触发该回调。
url:Web引擎返回的URL。

| | onProgressChange(callback: (event?: { newProgress: number }) => void) |

网页加载进度变化时触发该回调。
newProgress:加载进度,取值范围为0到100的整数。

| -| onTitleReceive(callback: (event?: { title: string }) => void) |

网页主页面标题更改时触发该回调。
title:标题内容。

| +| onTitleReceive(callback: (event?: { title: string }) => void) |

网页主页面标题更改时触发该回调。
title:标题内容。

| +| onErrorReceive(callback: (event?: { request: WebResourceRequest, error: WebResourceError }) => void) |

网页加载错误时触发该回调。
request:网页的请求信息。
error:网页的错误信息 。

| +| onHttpErrorReceive(callback: (event?: { request: WebResourceRequest, response: WebResourceResponse }) => void) |

网页加载出现网络错误时触发该回调。
request:网页的请求信息。
response:网页的响应信息

| +| onConsole(callback: (event?: { message: ConsoleMessage }) => boolean) |

向主应用报告JavaScript控制台消息时触发该回调。
message:触发的控制台信息。

| +| onAlert(callback: (event?: { url: string; message: string; result: JsResult }) => boolean) |

网页触发alert()告警弹窗时触发。
url:Web引擎返回的下载URL。
message:Web引擎返回的信息。
JsResult:Web引擎返回的弹窗确认或弹窗取消功能对象。

| +| onBeforeUnload(callback: (event?: { url: string; message: string; result: JsResult }) => boolean) |

网页重新加载或关闭时触发。
url:Web引擎返回的下载URL。
message:Web引擎返回的信息。
JsResult:Web引擎返回的弹窗确认或弹窗取消功能对象。

| +| onConfirm(callback: (event?: { url: string; message: string; result: JsResult }) => boolean) |

即将离开当前页面(刷新或关闭)时触发。
url:Web引擎返回的下载URL。
message:Web引擎返回的信息。
JsResult:Web引擎返回的弹窗确认或弹窗取消功能对象。

| + +### JsResult 对象说明 + +Web引擎返回的弹窗确认或弹窗取消功能对象。 + +- 接口 + + | 接口名称 | 功能描述 | + | --------------------- | ----------------- | + | handleCancel(): void |

取消弹窗。

| + | handleConfirm(): void |

确认弹窗。

| ### JsGeolocation 对象说明 @@ -77,10 +94,65 @@ ohos.permission.READ_USER_STORAGE - 接口 - | 接口名称 | 功能描述 | - | ---------------------------------------- | ---------------------------------------- | + | 接口名称 | 功能描述 | + | ------------------------------------------------------------ | ------------------------------------------------------------ | | invoke(origin: string, allow: boolean, retain: boolean): void |

通知系统用户是否批准该应用使用地理位置权限。
origin:尝试获取地理位置的Web内容的来源。
allow:用户是否批准该应用使用地理位置权限。true: 允许访问,false: 不允许访问。
retain:是否允许将地理位置权限状态保存到系统中。true: 允许,false: 不允许。

| +### WebResourceRequest对象说明 + +- 接口 + + | 接口名称 | 功能描述 | + | --------------------------------- | ------------------------------------ | + | getRequestUrl(): string | 获取请求的url信息。 | + | isRequestGesture(): boolean | 获取请求是否与手势关联。 | + | isMainFrame(): boolean | 获取请求是否时为了获取主窗口的信息。 | + | isRedirect(): boolean | 获取请求是否重定向。 | + | getRequestHeader(): Array
| 获取请求头信息。 | + +### WebResourceError对象说明 + +- 接口 + + | 接口名称 | 功能描述 | + | ---------------------- | ------------------------ | + | getErrorInfo(): string | 获取加载资源的错误信息。 | + | getErrorCode(): number | 获取加载资源的错误码。 | + +### WebResourceResponse对象说明 + +- 接口 + + | 接口名称 | 功能描述 | + | ---------------------------------- | ---------------------- | + | getResponseData(): string | 获取响应数据。 | + | getResponseEncoding(): string | 获取响应的编码。 | + | getResponseMimeType(): string | 获取响应的MIME类型。 | + | getResponseCode(): number | 获取响应的状态码。 | + | getReasonMessage(): string | 获取响应的状态码描述。 | + | getResponseHeader(): Array
| 获取响应头信息。 | + +### ConsoleMessage对象说明 + +- 接口 + + | 接口名称 | 功能描述 | + | ------------------------------- | ------------------------------ | + | getMessage(): string | 获取ConsoleMessage的日志信息。 | + | getSourceId(): string | 获取ConsoleMessage的源的Id。 | + | getLineNumber(): number | 获取ConsoleMessage的行数。 | + | getMessageLevel(): MessageLevel | 获取ConsoleMessage的信息级别。 | + +- MessageLevel枚举说明 + + | 名称 | 描述 | + | ----- | :--------- | + | Debug | 调试级别。 | + | Error | 错误级别。 | + | Info | 消息级别。 | + | Log | 日志级别。 | + | Warn | 警告级别。 | + ## WebController Web 组件的控制器。 -- Gitee From de7d369739574c493155df400bef75831dabdda4 Mon Sep 17 00:00:00 2001 From: liangZ15 Date: Thu, 10 Mar 2022 13:53:31 +0800 Subject: [PATCH 267/282] Signed-off-by: liangZ15 refresh doc --- .../reference/apis/js-apis-update.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/zh-cn/application-dev/reference/apis/js-apis-update.md b/zh-cn/application-dev/reference/apis/js-apis-update.md index a17531a2694..860f5c0ad14 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-update.md +++ b/zh-cn/application-dev/reference/apis/js-apis-update.md @@ -476,6 +476,8 @@ update.getUpdatePolicy().then(value => { 升级包类型。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 参数名 | 默认值 | 说明 | | -------------------- | ------ | -------------- | | PACKAGE_TYPE_NORMAL | 1 | 通用升级包 | @@ -488,6 +490,8 @@ update.getUpdatePolicy().then(value => { ## InstallMode +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + 安装模式。 | 参数名 | 默认值 | 说明 | @@ -498,6 +502,8 @@ update.getUpdatePolicy().then(value => { ## NewVersionStatus +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + 新版本检测状态。 | 参数名 | 默认值 | 说明 | @@ -509,6 +515,8 @@ update.getUpdatePolicy().then(value => { ## UpdatePolicy +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + 升级策略。 | 名称 | 参数类型 | 必填 | 说明 | @@ -519,6 +527,8 @@ update.getUpdatePolicy().then(value => { ## NewVersionInfo +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + 新版本信息。 | 名称 | 参数类型 | 必填 | 说明 | @@ -530,6 +540,8 @@ update.getUpdatePolicy().then(value => { ## CheckResult +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + 检测结果。 | 名称 | 参数类型 | 必填 | 说明 | @@ -543,6 +555,8 @@ update.getUpdatePolicy().then(value => { ## DescriptionInfo +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + 版本描述信息。 | 名称 | 参数类型 | 必填 | 说明 | -- Gitee From 12aca81d5e39b101efb148eb311bcefa40a1dd3a Mon Sep 17 00:00:00 2001 From: liangZ15 Date: Thu, 10 Mar 2022 14:19:29 +0800 Subject: [PATCH 268/282] Signed-off-by: liangZ15 refresh doc --- .../reference/apis/js-apis-update.md | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-update.md b/zh-cn/application-dev/reference/apis/js-apis-update.md index 860f5c0ad14..1825dc3153a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-update.md +++ b/zh-cn/application-dev/reference/apis/js-apis-update.md @@ -114,14 +114,14 @@ try { ## Updater -**系统能力**:以下各项对应能力均为:SystemCapability.Update.UpdateService - ### getNewVersionInfo getNewVersionInfo(callback: AsyncCallback\): void 获取新版本信息,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -145,6 +145,8 @@ getNewVersionInfo(): Promise\ 获取新版本信息,使用promise方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **返回值:** | 类型 | 说明 | @@ -169,6 +171,8 @@ checkNewVersion(callback: AsyncCallback\): void 检查新版本,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -192,6 +196,8 @@ checkNewVersion(): Promise\ 检查新版本,使用promise方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **返回值:** | 类型 | 说明 | @@ -216,6 +222,8 @@ verifyUpdatePackage(upgradeFile: string, certsFile: string): void 升级前检查升级包是否有效。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -238,6 +246,8 @@ rebootAndCleanUserData(): Promise\ 重启设备并清除用户分区数据。 +**系统能力**:SystemCapability.Update.UpdateService + **返回值:** | 类型 | 说明 | @@ -260,6 +270,8 @@ rebootAndCleanUserData(callback: AsyncCallback\): void 重启设备并清除用户分区数据。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -280,6 +292,8 @@ applyNewVersion(): Promise\ 重启设备后安装升级包。 +**系统能力**:SystemCapability.Update.UpdateService + **返回值:** | 类型 | 说明 | @@ -302,6 +316,8 @@ applyNewVersion(callback: AsyncCallback\): void 重启设备后安装升级包。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -322,6 +338,8 @@ download(): void 下载新版本,并监听下载进程。 +**系统能力**:SystemCapability.Update.UpdateService + **示例:** ``` @@ -339,6 +357,8 @@ updater.upgrade():void 启动升级。 +**系统能力**:SystemCapability.Update.UpdateService + **示例:** ``` @@ -356,6 +376,8 @@ setUpdatePolicy(policy: UpdatePolicy, callback: AsyncCallback\): void 设置升级策略,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -385,6 +407,8 @@ setUpdatePolicy(policy: UpdatePolicy): Promise\ 设置升级策略,使用promise方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -420,6 +444,8 @@ getUpdatePolicy(callback: AsyncCallback\): void 获取升级策略信息,使用callback方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -443,6 +469,8 @@ getUpdatePolicy(): Promise\ 获取升级策略,通过promise方式作为异步方法。 +**系统能力**:SystemCapability.Update.UpdateService + **返回值:** | 类型 | 说明 | -- Gitee From 734df6703207d6334cfd789b53f2ab0fda3ad841 Mon Sep 17 00:00:00 2001 From: liangZ15 Date: Thu, 10 Mar 2022 14:26:21 +0800 Subject: [PATCH 269/282] Signed-off-by: liangZ15 refresh doc --- .../reference/apis/js-apis-update.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-update.md b/zh-cn/application-dev/reference/apis/js-apis-update.md index 1825dc3153a..667ec5463cb 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-update.md +++ b/zh-cn/application-dev/reference/apis/js-apis-update.md @@ -518,10 +518,10 @@ update.getUpdatePolicy().then(value => { ## InstallMode -**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService - 安装模式。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 参数名 | 默认值 | 说明 | | ------------------- | ------ | -------- | | INSTALL_MODE_NORMAL | 0 | 正常升级 | @@ -530,10 +530,10 @@ update.getUpdatePolicy().then(value => { ## NewVersionStatus -**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService - 新版本检测状态。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 参数名 | 默认值 | 说明 | | ------------------- | ------ | ---------------- | | VERSION_STATUS_ERR | -1 | 检测版本时出错 | @@ -543,10 +543,10 @@ update.getUpdatePolicy().then(value => { ## UpdatePolicy -**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService - 升级策略。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 名称 | 参数类型 | 必填 | 说明 | | ------------------- | --------------------------- | ---- | -------------- | | autoDownload | bool | 是 | 自动升级开关 | @@ -555,10 +555,10 @@ update.getUpdatePolicy().then(value => { ## NewVersionInfo -**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService - 新版本信息。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 名称 | 参数类型 | 必填 | 说明 | | --------------- | ------------------------------------------- | ---- | -------- | | status | [NewVersionStatus](#newversionstatus) | 是 | 升级状态 | @@ -568,10 +568,10 @@ update.getUpdatePolicy().then(value => { ## CheckResult -**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService - 检测结果。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 名称 | 参数类型 | 必填 | 说明 | | ------------- | ----------------------------- | ---- | ------------ | | versionName | string | 是 | 版本名称 | @@ -583,10 +583,10 @@ update.getUpdatePolicy().then(value => { ## DescriptionInfo -**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService - 版本描述信息。 +**系统能力**:以下各项对应的系统能力均为:SystemCapability.Update.UpdateService + | 名称 | 参数类型 | 必填 | 说明 | | ------------- | -------- | ---- | ----------------- | | descriptionId | string | 是 | 版本versionId信息 | -- Gitee From 357439a1f71ec102edc71d5f9f848947ea5f8ac4 Mon Sep 17 00:00:00 2001 From: wangyong1995626wywz Date: Thu, 10 Mar 2022 14:28:47 +0800 Subject: [PATCH 270/282] Modify the similar problem of two interface descriptions in plainarray Description The descriptions of getindexofkey and getindexofvalue are similar. In order to distinguish them, the specified element is modified to the specified value element in getIndexOfValue #I4X88:Modify the similar problem of two interface descriptions in plainarray Signed-off-by: wangyong1995626wywz --- .../application-dev/reference/apis/js-apis-plainarray.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-plainarray.md b/zh-cn/application-dev/reference/apis/js-apis-plainarray.md index 0ff829fa745..44ce21f9db6 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-plainarray.md +++ b/zh-cn/application-dev/reference/apis/js-apis-plainarray.md @@ -117,7 +117,7 @@ let result = plainArray.get(1); getIndexOfKey(key: number): number; -查找指定key第一次出现的下标值,如果没有找到该元素返回-1。 +查找指定key第一次出现的下标值,如果没有找到该key返回-1。 **参数:** @@ -145,19 +145,19 @@ let result = plainArray.getIndexOfKey("sdfs"); getIndexOfValue(value: T): number; -查找指定元素第一次出现的下标值,如果没有找到该元素返回-1。 +查找指定value元素第一次出现的下标值,如果没有找到该value元素返回-1。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| value | T | 是 | 指定元素。 | +| value | T | 是 | 指定value元素。 | **返回值:** | 类型 | 说明 | | -------- | -------- | -| number | 返回指定元素第一次出现时的下标值,查找失败返回-1。 | +| number | 返回指定value元素第一次出现时的下标值,查找失败返回-1。 | **示例:** -- Gitee From 4b38feacfad659aa9caa7f3b3df0d6fb79770ccb Mon Sep 17 00:00:00 2001 From: liangZ15 Date: Thu, 10 Mar 2022 15:01:22 +0800 Subject: [PATCH 271/282] Signed-off-by: liangZ15 refresh doc --- zh-cn/application-dev/reference/apis/js-apis-update.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zh-cn/application-dev/reference/apis/js-apis-update.md b/zh-cn/application-dev/reference/apis/js-apis-update.md index 667ec5463cb..3acc7a89e9c 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-update.md +++ b/zh-cn/application-dev/reference/apis/js-apis-update.md @@ -7,6 +7,9 @@ - SD卡升级依赖升级包和SD卡安装。 - 在线升级依赖手机厂商部署的用于管理升级包的服务器。服务器由手机厂商部署,IP由调用者传入,请求的request接口是固定的,由手机厂商开发。 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + ## 导入模块 ```js -- Gitee From 239c593f41a6162b3d52ffba014e34d2184e8b90 Mon Sep 17 00:00:00 2001 From: liangZ15 Date: Thu, 10 Mar 2022 15:05:39 +0800 Subject: [PATCH 272/282] Signed-off-by: liangZ15 refresh doc --- zh-cn/application-dev/reference/apis/js-apis-update.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-update.md b/zh-cn/application-dev/reference/apis/js-apis-update.md index 3acc7a89e9c..ea84b0d18e4 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-update.md +++ b/zh-cn/application-dev/reference/apis/js-apis-update.md @@ -1,5 +1,8 @@ # 升级 +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + 升级范围:升级整个系统,包括内置的资源、预置应用;第三方的应用不在升级的范围。 升级依赖:升级分为SD卡升级和在线升级两种。 @@ -7,9 +10,6 @@ - SD卡升级依赖升级包和SD卡安装。 - 在线升级依赖手机厂商部署的用于管理升级包的服务器。服务器由手机厂商部署,IP由调用者传入,请求的request接口是固定的,由手机厂商开发。 -> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** -> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 - ## 导入模块 ```js -- Gitee From d38b715f78b6dd299cc9b9c0e9e268fc24b8540c Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 10 Mar 2022 15:29:08 +0800 Subject: [PATCH 273/282] update audio docs Signed-off-by: zengyawen --- .../reference/apis/js-apis-audio.md | 1424 ++++++++++++++--- 1 file changed, 1202 insertions(+), 222 deletions(-) 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 607758131ea..e7e1b3a06ea 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-audio.md +++ b/zh-cn/application-dev/reference/apis/js-apis-audio.md @@ -1,7 +1,12 @@ # 音频管理 > **说明:** -> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +该模块提供以下音频相关的常用功能: + +- [AudioManager](#audiomanager):音频管理。 +- [AudioRenderer](#audiorenderer8):音频播放,用于播放PCM(Pulse Code Modulation)音频数据。 ## 导入模块 @@ -10,7 +15,7 @@ import audio from '@ohos.multimedia.audio'; ``` -## getAudioManager +## audio.getAudioManager getAudioManager(): AudioManager @@ -19,8 +24,8 @@ getAudioManager(): AudioManager **系统能力:** SystemCapability.Multimedia.Audio.Core **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ----------------------------- | ------------ | | [AudioManager](#audiomanager) | 音频管理类。 | **示例:** @@ -28,91 +33,356 @@ getAudioManager(): AudioManager var audioManager = audio.getAudioManager(); ``` +## audio.createAudioRenderer8+ + +createAudioRenderer(options: AudioRendererOptions): AudioRenderer + +获取音频播放器。 + +**系统能力:** SystemCapability.Multimedia.Audio.Renderer + +**参数**: + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------------- | ---- | ----------- | +| options | [AudioRendererOptions](#audiorendereroptions8) | 是 | 配置播放器. | + +**返回值**: + +| 类型 | 说明 | +| -------------------------------- | ---------------- | +| [AudioRenderer](#audiorenderer8) | 音频播放器对象。 | + +**示例:** + +``` +var audioStreamInfo = { + samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, + channels: audio.AudioChannel.CHANNEL_1, + sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, + encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW +} + +var audioRendererInfo = { + content: audio.ContentType.CONTENT_TYPE_SPEECH, + usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, + rendererFlags: 1 +} + +var audioRendererOptions = { + streamInfo: audioStreamInfo, + rendererInfo: audioRendererInfo +} + +let audioRenderer = await audio.createAudioRenderer(audioRendererOptions); +``` ## AudioVolumeType 枚举,音频流类型。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| RINGTONE | 2 | 表示铃声。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | -| MEDIA | 3 | 表示媒体。
**系统能力:** SystemCapability.Multimedia.Audio.Volume | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Volume + +| 名称 | 默认值 | 描述 | +| ---------------------------- | ------ | ---------- | +| VOICE_CALL8+ | 0 | 语音电话。 | +| RINGTONE | 2 | 铃声。 | +| MEDIA | 3 | 媒体。 | +| VOICE_ASSISTANT8+ | 9 | 语音助手。 | ## DeviceFlag 枚举,可获取的设备种类。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| OUTPUT_DEVICES_FLAG | 1 | 表示输出设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| INPUT_DEVICES_FLAG | 2 | 表示输入设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| ALL_DEVICES_FLAG | 3 | 表示所有设备种类。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Device + +| 名称 | 默认值 | 描述 | +| ------------------- | ------ | ---------- | +| OUTPUT_DEVICES_FLAG | 1 | 输出设备。 | +| INPUT_DEVICES_FLAG | 2 | 输入设备。 | +| ALL_DEVICES_FLAG | 3 | 所有设备。 | ## DeviceRole 枚举,设备角色。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| INPUT_DEVICE | 1 | 输入设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| OUTPUT_DEVICE | 2 | 输出设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Device + +| 名称 | 默认值 | 描述 | +| ------------- | ------ | -------------- | +| INPUT_DEVICE | 1 | 输入设备角色。 | +| OUTPUT_DEVICE | 2 | 输出设备角色。 | ## DeviceType 枚举,设备类型。 -| 名称 | 默认值 | 描述 | -| -------------- | ------ | ------------------------------------------------------------ | -| INVALID | 0 | 无效设备。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| EARPIECE | 1 | 听筒。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| WIRED_HEADSET | 3 | 有线耳机。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP连接(Advanced Audio Distribution Profile)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| MIC | 15 | 麦克风。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Device + +| 名称 | 默认值 | 描述 | +| -------------- | ------ | --------------------------------------------------------- | +| INVALID | 0 | 无效设备。 | +| EARPIECE | 1 | 听筒。 | +| SPEAKER | 2 | 扬声器。 | +| WIRED_HEADSET | 3 | 有线耳机。 | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO(Synchronous Connection Oriented)连接。 | +| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP(Advanced Audio Distribution Profile)连接。 | +| MIC | 15 | 麦克风。 | ## ActiveDeviceType 枚举,活跃设备类型。 -| 名称 | 默认值 | 描述 | -| ------------- | ------ | ------------------------------------------------------------ | -| SPEAKER | 2 | 扬声器。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Device + +| 名称 | 默认值 | 描述 | +| ------------- | ------ | ---------------------------------------------------- | +| SPEAKER | 2 | 扬声器。 | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO(Synchronous Connection Oriented)连接。 | -## AudioRingMode +## AudioRingMode 枚举,铃声模式。 -| 名称 | 默认值 | 描述 | -| -------- | -------- | -------- | -| RINGER_MODE_SILENT | 0 | 静音模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | -| RINGER_MODE_VIBRATE | 1 | 震动模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | -| RINGER_MODE_NORMAL | 2 | 响铃模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Communication + +| 名称 | 默认值 | 描述 | +| ------------------- | ------ | ---------- | +| RINGER_MODE_SILENT | 0 | 静音模式。 | +| RINGER_MODE_VIBRATE | 1 | 震动模式。 | +| RINGER_MODE_NORMAL | 2 | 响铃模式。 | + +## AudioSampleFormat8+ + +枚举,音频采样格式。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 默认值 | 描述 | +| --------------------- | ------ | -------------------------- | +| SAMPLE_FORMAT_INVALID | -1 | 无效格式。 | +| SAMPLE_FORMAT_U8 | 0 | 无符号8位整数。 | +| SAMPLE_FORMAT_S16LE | 1 | 带符号的16位整数,小尾数。 | +| SAMPLE_FORMAT_S24LE | 2 | 带符号的24位整数,小尾数。 | +| SAMPLE_FORMAT_S32LE | 3 | 带符号的32位整数,小尾数。 | + +## AudioChannel8+ + +枚举, 音频声道。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 默认值 | 描述 | +| --------- | -------- | -------- | +| CHANNEL_1 | 0x1 << 0 | 单声道。 | +| CHANNEL_2 | 0x1 << 1 | 双声道。 | + +## AudioSamplingRate8+ + +枚举,音频采样率。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 默认值 | 描述 | +| ----------------- | ------ | --------------- | +| SAMPLE_RATE_8000 | 8000 | 采样率为8000。 | +| SAMPLE_RATE_11025 | 11025 | 采样率为11025。 | +| SAMPLE_RATE_12000 | 12000 | 采样率为12000。 | +| SAMPLE_RATE_16000 | 16000 | 采样率为16000。 | +| SAMPLE_RATE_22050 | 22050 | 采样率为22050。 | +| SAMPLE_RATE_24000 | 24000 | 采样率为24000。 | +| SAMPLE_RATE_32000 | 32000 | 采样率为32000。 | +| SAMPLE_RATE_44100 | 44100 | 采样率为44100。 | +| SAMPLE_RATE_48000 | 48000 | 采样率为48000。 | +| SAMPLE_RATE_64000 | 64000 | 采样率为64000。 | +| SAMPLE_RATE_96000 | 96000 | 采样率为96000。 | + +## AudioEncodingType8+ + +枚举,音频编码类型。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 默认值 | 描述 | +| --------------------- | ------ | --------- | +| ENCODING_TYPE_INVALID | -1 | 无效。 | +| ENCODING_TYPE_RAW | 0 | PCM编码。 | + +## ContentType8+ + +枚举,音频内容类型。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 默认值 | 描述 | +| ------------------------- | ------ | ---------- | +| CONTENT_TYPE_UNKNOWN | 0 | 未知类型。 | +| CONTENT_TYPE_SPEECH | 1 | 语音。 | +| CONTENT_TYPE_MUSIC | 2 | 音乐。 | +| CONTENT_TYPE_MOVIE | 3 | 电影。 | +| CONTENT_TYPE_SONIFICATION | 4 | 加密类型。 | +| CONTENT_TYPE_RINGTONE | 5 | 铃声。 | + +## StreamUsage8+ + +枚举,音频流使用类型。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 默认值 | 描述 | +| ---------------------------------- | ------ | ---------- | +| STREAM_USAGE_UNKNOWN | 0 | 未知类型。 | +| STREAM_USAGE_MEDIA | 1 | 音频。 | +| STREAM_USAGE_VOICE_COMMUNICATION | 2 | 语音通信。 | +| STREAM_USAGE_NOTIFICATION_RINGTONE | 3 | 通知铃声。 | + +## AudioState8+ + +枚举,音频状态。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 默认值 | 描述 | +| -------------- | ------ | ---------------- | +| STATE_INVALID | -1 | 无效状态。 | +| STATE_NEW | 0 | 创建新实例状态。 | +| STATE_PREPARED | 1 | 准备状态。 | +| STATE_RUNNING | 2 | 可运行状态。 | +| STATE_STOPPED | 3 | 停止状态。 | +| STATE_RELEASED | 4 | 释放状态。 | +| STATE_PAUSED | 5 | 暂停状态。 | + +## AudioRendererRate8+ + +枚举,播放速度。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Renderer + +| 名称 | 默认值 | 描述 | +| ------------------ | ------ | ---------- | +| RENDER_RATE_NORMAL | 0 | 正常速度。 | +| RENDER_RATE_DOUBLE | 1 | 2倍速。 | +| RENDER_RATE_HALF | 2 | 0.5倍数。 | + +## InterruptType8+ + +枚举,中断类型。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Renderer +| 名称 | 默认值 | 描述 | +| -------------------- | ------ | ---------------------- | +| INTERRUPT_TYPE_BEGIN | 1 | 音频播放中断事件开始。 | +| INTERRUPT_TYPE_END | 2 | 音频播放中断事件结束。 | + +## InterruptForceType8+ + +枚举,强制打断类型。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Renderer + +| 名称 | 默认值 | 描述 | +| --------------- | ------ | ------------------------------------ | +| INTERRUPT_FORCE | 0 | 由系统进行操作,强制打断音频播放。 | +| INTERRUPT_SHARE | 1 | 由应用进行操作,可以选择打断或忽略。 | + +## InterruptHint8+ + +枚举,中断提示。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Renderer + +| 名称 | 默认值 | 描述 | +| --------------------- | ------ | -------------------------------------------- | +| INTERRUPT_HINT_NONE | 0 | 无提示。 | +| INTERRUPT_HINT_RESUME | 1 | 提示音频恢复。 | +| INTERRUPT_HINT_PAUSE | 2 | 提示音频暂停。 | +| INTERRUPT_HINT_STOP | 3 | 提示音频停止。 | +| INTERRUPT_HINT_DUCK | 4 | 提示音频躲避。(躲避:音量减弱,而不会停止) | +| INTERRUPT_HINT_UNDUCK | 5 | 提示音量恢复。 | + +## AudioStreamInfo8+ + +音频流信息。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 类型 | 必填 | 说明 | +| ------------ | ---------------------------------------- | ---- | ------------------ | +| samplingRate | [AudioSamplingRate](#audiosamplingrate8) | 是 | 音频文件的采样率。 | +| channels | [AudioChannel](#audiochannel8) | 是 | 音频文件的通道数。 | +| sampleFormat | [AudioSampleFormat](#audiosampleformat8) | 是 | 音频采样格式。 | +| encodingType | [AudioEncodingType](#audioencodingtype8) | 是 | 音频编码格式。 | + +## AudioRendererInfo8+ + +音频播放器信息。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Core + +| 名称 | 类型 | 必填 | 说明 | +| ------------- | ---------------------------- | ---- | ---------------- | +| contentType | [ContentType](#contenttype8) | 是 | 媒体类型。 | +| usage | [StreamUsage](#streamusage8) | 是 | 音频流使用类型。 | +| rendererFlags | number | 是 | 音频播放器标志。 | + +## AudioRendererOptions8+ + +音频播放器选项信息。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Renderer + +| 名称 | 类型 | 必填 | 说明 | +| ------------ | ---------------------------------------- | ---- | ---------------- | +| streamInfo | [AudioStreamInfo](#audiostreaminfo8) | 是 | 表示音频流信息。 | +| rendererInfo | [AudioRendererInfo](#audiorendererinfo8) | 是 | 表示播放器信息。 | + +## InterruptEvent8+ + +播放中断时,应用接收的中断事件。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Renderer + +| 名称 | 类型 | 必填 | 说明 | +| --------- | ------------------------------------------ | ---- | ------------------------------------ | +| eventType | [InterruptType](#interrupttype8) | 是 | 中断事件类型,开始或是结束。 | +| forceType | [InterruptForceType](#interruptforcetype8) | 是 | 操作是由系统执行或是由应用程序执行。 | +| hintType | [InterruptHint](#interrupthint8) | 是 | 中断提示。 | + +## VolumeEvent8+ + +音量改变时,应用接收的事件。 + +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Volume + +| 名称 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | -------------------------------------------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | +| updateUi | boolean | 是 | 在UI中显示音量变化。 | ## AudioManager -管理音频音量和音频设备。 +管理音频音量和音频设备。在调用AudioManager的接口前,需要先通过[getAudioManager](#audiogetaudiomanager)创建实例。 ### setVolume setVolume(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback<void>): void -设置指定流的音量,使用callback方式返回异步结果。 +设置指定流的音量,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | -| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | -------------------------------------------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | **示例:** @@ -131,21 +401,21 @@ audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ setVolume(volumeType: AudioVolumeType, volume: number): Promise<void> -设置指定流的音量,使用promise方式返回异步结果。 +设置指定流的音量,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | -------------------------------------------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------------- | ----------------------------- | | Promise<void> | Promise回调表示成功还是失败。 | **示例:** @@ -161,16 +431,16 @@ audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> getVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void -获取指定流的音量,使用callback方式返回异步结果。 +获取指定流的音量,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<number> | 是 | 回调返回音量大小。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------------ | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回音量大小。 | **示例:** @@ -189,20 +459,20 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { getVolume(volumeType: AudioVolumeType): Promise<number> -获取指定流的音量,使用promise方式返回异步结果。 +获取指定流的音量,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------ | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| --------------------- | ------------------------- | | Promise<number> | Promise回调返回音量大小。 | **示例:** @@ -218,16 +488,16 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => getMinVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void -获取指定流的最小音量,使用callback方式返回异步结果。 +获取指定流的最小音量,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<number> | 是 | 回调返回最小音量。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------------ | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回最小音量。 | **示例:** @@ -246,20 +516,20 @@ audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { getMinVolume(volumeType: AudioVolumeType): Promise<number> -获取指定流的最小音量,使用promise方式返回异步结果。 +获取指定流的最小音量,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------ | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| --------------------- | ------------------------- | | Promise<number> | Promise回调返回最小音量。 | **示例:** @@ -275,16 +545,16 @@ audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => getMaxVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void -获取指定流的最大音量,使用callback方式返回异步结果。 +获取指定流的最大音量,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<number> | 是 | 回调返回最大音量大小。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ---------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回最大音量大小。 | **示例:** @@ -303,20 +573,20 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { getMaxVolume(volumeType: AudioVolumeType): Promise<number> -获取指定流的最大音量,使用promise方式返回异步结果。 +获取指定流的最大音量,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------ | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| --------------------- | ----------------------------- | | Promise<number> | Promise回调返回最大音量大小。 | **示例:** @@ -332,17 +602,17 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback<void>): void -设置指定音量流静音,使用callback方式返回异步结果。 +设置指定音量流静音,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | -| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------------------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | **示例:** @@ -361,21 +631,21 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { mute(volumeType: AudioVolumeType, mute: boolean): Promise<void> -设置指定音量流静音,使用promise方式返回异步结果。 +设置指定音量流静音,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------------------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------------- | ----------------------------- | | Promise<void> | Promise回调表示成功还是失败。 | **示例:** @@ -393,16 +663,16 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => isMute(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void -获取指定音量流是否被静音,使用callback方式返回异步结果。 +获取指定音量流是否被静音,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<boolean> | 是 | 回调返回流静音状态,true为静音,false为非静音。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ----------------------------------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回流静音状态,true为静音,false为非静音。 | **示例:** @@ -422,20 +692,20 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { isMute(volumeType: AudioVolumeType): Promise<boolean> -获取指定音量流是否被静音,使用promise方式返回异步结果。 +获取指定音量流是否被静音,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------ | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ---------------------- | ------------------------------------------------------ | | Promise<boolean> | Promise回调返回流静音状态,true为静音,false为非静音。 | **示例:** @@ -451,16 +721,16 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => isActive(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void -获取指定音量流是否为活跃状态,使用callback方式返回异步结果。 +获取指定音量流是否为活跃状态,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | -| callback | AsyncCallback<boolean> | 是 | 回调返回流的活跃状态,true为活跃,false为不活跃。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------------------------------------------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回流的活跃状态,true为活跃,false为不活跃。 | **示例:** @@ -479,20 +749,20 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { isActive(volumeType: AudioVolumeType): Promise<boolean> -获取指定音量流是否为活跃状态,使用promise方式返回异步结果。 +获取指定音量流是否为活跃状态,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Volume **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | ------------ | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ---------------------- | -------------------------------------------------------- | | Promise<boolean> | Promise回调返回流的活跃状态,true为活跃,false为不活跃。 | **示例:** @@ -508,16 +778,16 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void -设置铃声模式,使用callback方式返回异步结果。 +设置铃声模式,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Communication **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------- | ---- | ------------------------ | +| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | **示例:** @@ -525,7 +795,7 @@ setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void var audioManager = audio.getAudioManager(); audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { if (err) { - console.error('Failed to set the ringer mode.​ ${err.message}'); + console.error('Failed to set the ringer mode. ${err.message}'); return; } console.log('Callback invoked to indicate a successful setting of the ringer mode.'); @@ -536,20 +806,20 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { setRingerMode(mode: AudioRingMode): Promise<void> -设置铃声模式,使用promise方式返回异步结果。 +设置铃声模式,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Communication **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------- | ---- | -------------- | +| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------------- | ------------------------------- | | Promise<void> | Promise回调返回设置成功或失败。 | **示例:** @@ -566,15 +836,15 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => getRingerMode(callback: AsyncCallback<AudioRingMode>): void -获取铃声模式,使用callback方式返回异步结果。 +获取铃声模式,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Communication **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| callback | AsyncCallback<[AudioRingMode](#audioringmode)> | 是 | 回调返回系统的铃声模式。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------------------- | ---- | ------------------------ | +| callback | AsyncCallback<[AudioRingMode](#audioringmode)> | 是 | 回调返回系统的铃声模式。 | **示例:** @@ -582,7 +852,7 @@ getRingerMode(callback: AsyncCallback<AudioRingMode>): void var audioManager = audio.getAudioManager(); audioManager.getRingerMode((err, value) => { if (err) { - console.error('Failed to obtain the ringer mode.​ ${err.message}'); + console.error('Failed to obtain the ringer mode. ${err.message}'); return; } console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); @@ -594,14 +864,14 @@ audioManager.getRingerMode((err, value) => { getRingerMode(): Promise<AudioRingMode> -获取铃声模式,使用promise方式返回异步结果。 +获取铃声模式,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Communication **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ---------------------------------------------- | ------------------------------- | | Promise<[AudioRingMode](#audioringmode)> | Promise回调返回系统的铃声模式。 | **示例:** @@ -617,17 +887,17 @@ audioManager.getRingerMode().then((value) => setAudioParameter(key: string, value: string, callback: AsyncCallback<void>): void -音频参数设置,使用callback方式返回异步结果。 +音频参数设置,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 被设置的音频参数的键。 | -| value | string | 是 | 被设置的音频参数的值。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------- | ---- | ------------------------ | +| key | string | 是 | 被设置的音频参数的键。 | +| value | string | 是 | 被设置的音频参数的值。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | **示例:** @@ -646,21 +916,21 @@ audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { setAudioParameter(key: string, value: string): Promise<void> -音频参数设置,使用promise方式返回异步结果。 +音频参数设置,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 被设置的音频参数的键。 | -| value | string | 是 | 被设置的音频参数的值。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ---------------------- | +| key | string | 是 | 被设置的音频参数的键。 | +| value | string | 是 | 被设置的音频参数的值。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------------- | ------------------------------- | | Promise<void> | Promise回调返回设置成功或失败。 | **示例:** @@ -676,16 +946,16 @@ audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => getAudioParameter(key: string, callback: AsyncCallback<string>): void -获取指定音频参数值,使用callback方式返回异步结果。 +获取指定音频参数值,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 待获取的音频参数的键。 | -| callback | AsyncCallback<string> | 是 | 回调返回获取的音频参数的值。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------- | ---- | ---------------------------- | +| key | string | 是 | 待获取的音频参数的键。 | +| callback | AsyncCallback<string> | 是 | 回调返回获取的音频参数的值。 | **示例:** @@ -704,20 +974,20 @@ audioManager.getAudioParameter('PBits per sample', (err, value) => { getAudioParameter(key: string): Promise<string> -获取指定音频参数值,使用promise方式返回异步结果。 +获取指定音频参数值,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Core **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| key | string | 是 | 待获取的音频参数的键。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ---------------------- | +| key | string | 是 | 待获取的音频参数的键。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| --------------------- | ----------------------------------- | | Promise<string> | Promise回调返回获取的音频参数的值。 | **示例:** @@ -733,16 +1003,16 @@ audioManager.getAudioParameter('PBits per sample').then((value) => getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void -获取音频设备列表,使用callback方式返回异步结果。 +获取音频设备列表,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | -| callback | AsyncCallback<[AudioDeviceDescriptors](#audiodevicedescriptors)> | 是 | 回调,返回设备列表。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------------------------------------------------------------ | ---- | -------------------- | +| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | +| callback | AsyncCallback<[AudioDeviceDescriptors](#audiodevicedescriptors)> | 是 | 回调,返回设备列表。 | **示例:** ``` @@ -760,20 +1030,20 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ (deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors> -获取音频设备列表,使用promise方式返回异步结果。 +获取音频设备列表,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------------------------- | ---- | ---------------- | +| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------------------------------------------------------ | ------------------------- | | Promise<[AudioDeviceDescriptors](#audiodevicedescriptors)> | Promise回调返回设备列表。 | **示例:** @@ -789,17 +1059,17 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback<void>): void -设置设备激活状态,使用callback方式返回异步结果。 +设置设备激活状态,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | -| active | boolean | 是 | 设备激活状态。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------------------------- | ---- | ------------------------ | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| active | boolean | 是 | 设备激活状态。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | **示例:** @@ -818,21 +1088,21 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { setDeviceActive(deviceType: DeviceType, active: boolean): Promise<void> -设置设备激活状态,使用promise方式返回异步结果。 +设置设备激活状态,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | -| active | boolean | 是 | 设备激活状态。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------------------------- | ---- | -------------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| active | boolean | 是 | 设备激活状态。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------------- | ------------------------------- | | Promise<void> | Promise回调返回设置成功或失败。 | **示例:** @@ -849,16 +1119,16 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> isDeviceActive(deviceType: DeviceType, callback: AsyncCallback<boolean>): void -获取指定设备的激活状态,使用callback方式返回异步结果。 +获取指定设备的激活状态,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | -| callback | AsyncCallback<boolean> | 是 | 回调返回设备的激活状态。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ---------------------------- | ---- | ------------------------ | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回设备的激活状态。 | **示例:** @@ -878,20 +1148,20 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { isDeviceActive(deviceType: DeviceType): Promise<boolean> -获取指定设备的激活状态,使用promise方式返回异步结果。 +获取指定设备的激活状态,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------------------------- | ---- | -------------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | **返回值:** -| Type | Description | -| -------- | -------- | +| Type | Description | +| ---------------------- | ------------------------------- | | Promise<boolean> | Promise回调返回设备的激活状态。 | **示例:** @@ -907,16 +1177,16 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => setMicrophoneMute(mute: boolean, callback: AsyncCallback<void>): void -设置麦克风静音状态,使用callback方式返回异步结果。 +设置麦克风静音状态,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | -| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------- | ---- | --------------------------------------------- | +| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | **示例:** @@ -935,20 +1205,20 @@ audioManager.setMicrophoneMute(true, (err) => { setMicrophoneMute(mute: boolean): Promise<void> -设置麦克风静音状态,使用promise方式返回异步结果。 +设置麦克风静音状态,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------- | ---- | --------------------------------------------- | +| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ------------------- | ------------------------------- | | Promise<void> | Promise回调返回设置成功或失败。 | **示例:** @@ -964,15 +1234,15 @@ audioManager.setMicrophoneMute(true).then(() => isMicrophoneMute(callback: AsyncCallback<boolean>): void -获取麦克风静音状态,使用callback方式返回异步结果。 +获取麦克风静音状态,使用callback方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | -------- | -------- | -| callback | AsyncCallback<boolean> | 是 | 回调返回系统麦克风静音状态,true为静音,false为非静音。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------- | ---- | ------------------------------------------------------- | +| callback | AsyncCallback<boolean> | 是 | 回调返回系统麦克风静音状态,true为静音,false为非静音。 | **示例:** @@ -991,14 +1261,14 @@ audioManager.isMicrophoneMute((err, value) => { isMicrophoneMute(): Promise<boolean> -获取麦克风静音状态,使用promise方式返回异步结果。 +获取麦克风静音状态,使用Promise方式异步返回结果。 **系统能力:** SystemCapability.Multimedia.Audio.Device **返回值:** -| 类型 | 说明 | -| -------- | -------- | +| 类型 | 说明 | +| ---------------------- | ------------------------------------------------------------ | | Promise<boolean> | Promise回调返回系统麦克风静音状态,true为静音,false为非静音。 | **示例:** @@ -1011,19 +1281,729 @@ audioManager.isMicrophoneMute().then((value) => ) ``` +### on('volumeChange') + +on(type: 'volumeChange', callback: Callback\): void + +监听系统音量变化事件。 + +**系统能力:** SystemCapability.Multimedia.Audio.Volume + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持的事件为:'volumeChange'(系统音量变化事件,检测到系统音量改变时,触发该事件)。 | +| callback | Callback<[VolumeEvent](#volumeevent8)> | 是 | 回调方法。 | + +**示例:** + +``` +audioManager.on('volumeChange', (volumeEvent) => { + console.log('VolumeType of stream: ' + volumeEvent.volumeType); + console.log('Volume level: ' + volumeEvent.volume); + console.log('Whether to updateUI: ' + volumeEvent.updateUi); +}) +``` + +### on('ringerModeChange') + +on(type: 'ringerModeChange', callback: Callback\): void + +监听铃声模式变化事件。 + +**系统能力:** SystemCapability.Multimedia.Audio.Communication + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持的事件为:'ringerModeChange'(铃声模式变化事件,检测到铃声模式改变时,触发该事件)。 | +| callback | Callback<[AudioRingMode](#audioringmode)> | 是 | 回调方法。 | ## AudioDeviceDescriptor 描述音频设备。 -| 名称 | 参数型 | 可读 | 可写 | 说明 | -| -------- | -------- | -------- | -------- | -------- | -| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | -| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Device +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| ---------- | ------------------------- | ---- | ---- | ---------- | +| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。 | +| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。 | ## AudioDeviceDescriptors -| 名称 | 描述 | -| -------- | -------- | -| 设备属性数组 | AudioDeviceDescriptor的数组,只读。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Multimedia.Audio.Device + +| 名称 | 描述 | +| ------------ | ----------------------------------- | +| 设备属性数组 | AudioDeviceDescriptor的数组,只读。 | + +**示例:** + +``` +function deviceProp(audioDeviceDescriptor, index, array) { + deviceRoleValue = audioDeviceDescriptor.deviceRole; + deviceTypeValue = audioDeviceDescriptor.deviceType; +} + +deviceRoleValue = null; +deviceTypeValue = null; +const promise = audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG); +promise.then(async function (audioDeviceDescriptors) { + console.info('getDevices OUTPUT_DEVICES_FLAG'); + audioDeviceDescriptors.forEach(deviceProp); + if (deviceTypeValue != null && deviceRoleValue != null){ + console.info('OUTPUT_DEVICES_FLAG : Pass'); + expect(true).assertTrue(); + } + else{ + console.error('OUTPUT_DEVICES_FLAG : fail'); + expect(false).assertTrue(); + } + }); + await promise; + done(); +}) +``` + +## AudioRenderer8+ + +提供音频播放的相关接口。在调用AudioRenderer的接口前,需要先通过[createAudioRenderer](#audiocreateaudiorenderer8)创建实例。 + +### 属性 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ----- | -------------------------- | ---- | ---- | ------------------ | +| state | [AudioState](#audiostate8) | 是 | 否 | 当前播放器的状态。 | + +**示例:** + +``` +var state = audioRenderer.state; +``` + +### getRendererInfo8+ + +getRendererInfo(callback: AsyncCallback): void + +获取当前被创建的音频播放器的信息,使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| :------- | :------------------------------------------------------- | :--- | :------------------------- | +| callback | AsyncCallback<[AudioRendererInfo](#audiorendererinfo8)\> | 是 | 回调返回音频播放器的信息。 | + +**示例:** + +``` +audioRenderer.getRendererInfo((err, rendererInfo)=>{ + console.log('Renderer GetRendererInfo:'); + console.log('Renderer content:' + rendererInfo.content); + console.log('Renderer usage:' + rendererInfo.usage); + console.log('Renderer flags:' + rendererInfo.rendererFlags); +}) +``` + +### getRendererInfo8+ + +getRendererInfo(): Promise + +获取当前被创建的音频播放器的信息,使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| -------------------------------------------------- | ------------------------------- | +| Promise<[AudioRendererInfo](#audiorendererinfo8)\> | Promise用于返回音频播放器信息。 | + +**示例:** + +``` +let streamInfo = await audioRenderer.getStreamInfo(); +console.log('Renderer GetStreamInfo:'); +console.log('Renderer sampling rate:' + streamInfo.samplingRate); +console.log('Renderer channel:' + streamInfo.AudioChannel); +console.log('Renderer format:' + streamInfo.AudioSampleFormat); +console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); +``` + +### getStreamInfo8+ + +getStreamInfo(callback: AsyncCallback): void + +获取音频流信息,使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| :------- | :--------------------------------------------------- | :--- | :------------------- | +| callback | AsyncCallback<[AudioStreamInfo](#audiostreaminfo8)\> | 是 | 回调返回音频流信息。 | + +**示例:** + +``` +audioRenderer.getStreamInfo((err, streamInfo)=>{ + console.log('Renderer GetStreamInfo:'); + console.log('Renderer sampling rate:' + streamInfo.samplingRate); + console.log('Renderer channel:' + streamInfo.AudioChannel); + console.log('Renderer format:' + streamInfo.AudioSampleFormat); + console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); +}) +``` + +### getStreamInfo8+ + +getStreamInfo(): Promise + +获取音频流信息,使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| :--------------------------------------------- | :--------------------- | +| Promise<[AudioStreamInfo](#audiostreaminfo8)\> | Promise返回音频流信息. | + +**示例:** + +``` +let streamInfo = await audioRenderer.getStreamInfo(); +console.log('Renderer GetStreamInfo:'); +console.log('Renderer sampling rate:' + streamInfo.samplingRate); +console.log('Renderer channel:' + streamInfo.AudioChannel); +console.log('Renderer format:' + streamInfo.AudioSampleFormat); +console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); +``` + +### start8+ + +start(callback: AsyncCallback): void + +启动音频播放器。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------- | +| callback | AsyncCallback\ | 是 | 回调函数。 | + +**示例:** + +``` +audioRenderer.start((err)=>{ + if (err) { + console.error('Renderer start failed.'); + } else { + console.info('Renderer start success.'); + } +}) +``` + +### start8+ + +start(): Promise + +启动音频播放器。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | Promise方式异步返回结果。 | + +**示例:** + +``` +await audioRenderer.start(); +``` + +### pause8+ + +pause(callback: AsyncCallback\): void + +暂停音频播放器。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------- | +| callback | AsyncCallback\ | 是 | 返回回调的结果。 | + +**示例:** + +``` +audioRenderer.pause((err)=>{ + if (err) { + console.error('Renderer pause failed'); + } else { + console.log('Renderer paused.'); + } +}) +``` + +### pause8+ + +pause(): Promise\ + +暂停音频播放器。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | Promise方式异步返回结果。 | + +**示例:** + +``` +await audioRenderer.pause(); +``` + +### drain8+ + +drain(callback: AsyncCallback\): void + +检查播放缓冲区是否已被耗尽。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------- | +| callback | AsyncCallback\ | 是 | 返回回调的结果。 | + +**示例:** + +``` +audioRenderer.drain((err)=>{ + if (err) { + console.error('Renderer drain failed'); + } else { + console.log('Renderer drained.'); + } +}) +``` + +### drain8+ + +drain(): Promise\ + +检查播放缓冲区是否已被耗尽。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | Promise方式异步返回结果。 | + +**示例:** + +``` +await audioRenderer.drain(); +``` + +### stop8+ + +stop(callback: AsyncCallback\): void + +停止播放。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------- | +| callback | AsyncCallback\ | 是 | 返回回调的结果。 | + +**示例:** + +``` +audioRenderer.stop((err)=>{ + if (err) { + console.error('Renderer stop failed'); + } else { + console.log('Renderer stopped.'); + } +}) +``` + +### stop8+ + +stop(): Promise\ + +停止播放。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | Promise方式异步返回结果。 | + +**示例:** + +``` +await audioRenderer.stop(); +``` + +### release8+ + +release(callback: AsyncCallback\): void + +释放音频播放器。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------- | +| callback | AsyncCallback\ | 是 | 返回回调的结果。 | + +**示例:** + +``` +audioRenderer.release((err)=>{ + if (err) { + console.error('Renderer release failed'); + } else { + console.log('Renderer released.'); + } +}) +``` + +### release8+ + +release(): Promise\ + +释放渲染器。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | Promise方式异步返回结果。 | + +**示例:** + +``` +await audioRenderer.release(); +``` + +### write8+ + +write(buffer: ArrayBuffer, callback: AsyncCallback\): void + +写入缓冲区。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | --------------------------------------------------- | +| buffer | ArrayBuffer | 是 | 要写入缓冲区的数据。 | +| callback | AsyncCallback\ | 是 | 回调如果成功,返回写入的字节数,否则返回errorcode。 | + +**示例:** + +``` +let ss = fileio.createStreamSync(filePath, 'r'); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +audioRenderer.write(buf, (err, writtenbytes)=>{ + if (writtenbytes < 0) { + console.error('write failed.'); + } else { + console.log('Actual written bytes: ' + writtenbytes); + } +}) +``` + +### write8+ + +write(buffer: ArrayBuffer): Promise\ + +写入缓冲区。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| ---------------- | ------------------------------------------------------------ | +| Promise\ | Promise返回结果,如果成功,返回写入的字节数,否则返回errorcode。 | + +**示例:** + +``` +let ss = fileio.createStreamSync(filePath, 'r'); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +let writtenbytes = await audioRenderer.write(buf); +if (writtenbytes < 0) { + console.error('write failed.'); +} else { + console.log('Actual written bytes: ' + writtenbytes); +} +``` + +### getAudioTime8+ + +getAudioTime(callback: AsyncCallback\): void + +获取时间戳。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ---------------- | +| callback | AsyncCallback\ | 是 | 回调返回时间戳。 | + +**示例:** + +``` +audioRenderer.getAudioTime((err, timestamp)=>{ + console.log('Current timestamp: ' + timestamp); +}) +``` + +### getAudioTime8+ + +getAudioTime(): Promise\ + +获取时间戳。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 描述 | +| ---------------- | ----------------------- | +| Promise\ | Promise回调返回时间戳。 | + +**示例:** + +``` +let timestamp = await audioRenderer.getAudioTime(); +console.log('Current timestamp: ' + timestamp); +``` + +### getBufferSize8+ + +getBufferSize(callback: AsyncCallback\): void + +获取音频播放器的最小缓冲区大小。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | -------------------- | +| callback | AsyncCallback\ | 是 | 回调返回缓冲区大小。 | + +**示例:** + +``` +audioRenderer.getBufferSize((err, bufferSize)=>{ + if (err) { + console.error('getBufferSize error'); + } +}) +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +``` + +### getBufferSize8+ + +getBufferSize(): Promise\ + +获取音频播放器的最小缓冲区大小。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| ---------------- | --------------------------- | +| Promise\ | promise回调返回缓冲区大小。 | + +**示例:** + +``` +var bufferSize = await audioRenderer.getBufferSize(); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +``` + +### setRenderRate8+ + +setRenderRate(rate: AudioRendererRate, callback: AsyncCallback\): void + +设置音频播放速率。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------------------- | ---- | ------------------------ | +| rate | [AudioRendererRate](#audiorendererrate8) | 是 | 播放的速率。 | +| callback | AsyncCallback\ | 是 | 用于返回执行结果的回调。 | + +**示例:** + +``` +audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL, (err)=> { + if (err) { + console.error('Failed to set params'); + } else { + console.log('Callback invoked to indicate a successful render rate setting.'); + } +}) +``` + +### setRenderRate8+ + +setRenderRate(rate: AudioRendererRate): Promise\ + +设置音频播放速率。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ---------------------------------------- | ---- | ------------ | +| rate | [AudioRendererRate](#audiorendererrate8) | 是 | 播放的速率。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | Promise用于返回执行结果。 | + +**示例:** + +``` +await audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL); +``` + +### getRenderRate8+ + +getRenderRate(callback: AsyncCallback\): void + +获取当前播放速率。使用callback方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------- | ---- | ------------------ | +| callback | AsyncCallback<[AudioRendererRate](#audiorendererrate8)> | 是 | 回调返回播放速率。 | + +**示例:** + +``` +audioRenderer.getRenderRate((err, renderrate)=>{ + console.log('getRenderRate: ' + renderrate); +}) +``` + +### getRenderRate8+ + +getRenderRate(): Promise\ + +获取当前播放速率。使用Promise方式异步返回结果。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------- | ------------------------- | +| Promise<[AudioRendererRate](#audiorendererrate8)> | Promise回调返回播放速率。 | + +**示例:** + +``` +let renderRate = await audioRenderer.getRenderRate(); +console.log('getRenderRate: ' + renderrate); +``` + +### on('interrupt')8+ + +on(type: 'interrupt', callback: Callback\): void + +监听音频中断事件。使用callback获取中断事件。 + +**系统能力**: SystemCapability.Multimedia.Audio.Renderer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持的事件为:'interrupt'(中断事件被触发,音频播放被中断。) | +| callback | Callback<[InterruptEvent](#interruptevent8)> | 是 | 被监听的中断事件的回调。 | + +**示例:** + +``` +audioRenderer.on('interrupt', (interruptEvent) => { + if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) { + switch (interruptEvent.hintType) { + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + console.log('Force paused. Stop writing'); + isPlay = false; + break; + case audio.InterruptHint.INTERRUPT_HINT_STOP: + console.log('Force stopped. Stop writing'); + isPlay = false; + break; + } + } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) { + switch (interruptEvent.hintType) { + case audio.InterruptHint.INTERRUPT_HINT_RESUME: + console.log('Resume force paused renderer or ignore'); + startRenderer(); + break; + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + console.log('Choose to pause or ignore'); + pauseRenderer(); + break; + } + } +}) +``` + + + -- Gitee From fdb1bbc3e4983892dc3d94908bb62ab818a088b6 Mon Sep 17 00:00:00 2001 From: zengsiyu Date: Thu, 10 Mar 2022 15:09:15 +0800 Subject: [PATCH 274/282] fix: update commonevent Signed-off-by: zengsiyu Change-Id: I58f799178a70abeff704909e9e3e6ec93a32f90b Signed-off-by: zengsiyu --- .../reference/apis/js-apis-commonEvent.md | 473 ++++++++++++------ 1 file changed, 333 insertions(+), 140 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-commonEvent.md b/zh-cn/application-dev/reference/apis/js-apis-commonEvent.md index a1d58119282..09fa471f41b 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-commonEvent.md +++ b/zh-cn/application-dev/reference/apis/js-apis-commonEvent.md @@ -116,18 +116,14 @@ import CommonEvent from '@ohos.commonEvent'; ``` -## 系统能力 - -```js -SystemCapability.Notification.CommonEvent -``` - ## CommonEvent.publish publish(event: string, callback: AsyncCallback\): void 发布公共事件(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 名称 | 读写属性 | 类型 | 必填 | 描述 | @@ -140,11 +136,15 @@ publish(event: string, callback: AsyncCallback\): void ```js //发布公共事件回调 function PublishCallBack(err) { - console.info("==========================>PublishCallBack=======================>"); - console.info("==========================>err:=======================>", err.code); + if (err.code) { + console.error("publish failed " + JSON.stringify(err)); + } else { + console.info("publish"); + } } + //发布公共事件 -CommonEvent.publish("publish_event", PublishCallBack); +CommonEvent.publish("event", PublishCallBack); ``` @@ -155,6 +155,8 @@ publish(event: string, options: CommonEventPublishData, callback: AsyncCallback\ 发布公共事件指定发布信息(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 名称 | 读写属性 | 类型 | 必填 | 描述 | @@ -173,12 +175,18 @@ var options = { data: "initial data",//公共事件的初始数据 isOrdered: true //有序公共事件 } + //发布公共事件回调 function PublishCallBack(err) { - console.info("==========================>PublishCallBack=======================>"); + if (err.code) { + console.error("publish failed " + JSON.stringify(err)); + } else { + console.info("publish"); + } } + //发布公共事件 -CommonEvent.publish("publish_event", options, PublishCallBack); +CommonEvent.publish("event", options, PublishCallBack); ``` @@ -189,6 +197,8 @@ publishAsUser(event: string, userId: number, callback: AsyncCallback\): vo 向指定用户发布公共事件(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 名称 | 读写属性 | 类型 | 必填 | 描述 | @@ -203,15 +213,17 @@ publishAsUser(event: string, userId: number, callback: AsyncCallback\): vo //发布公共事件回调 function PublishAsUserCallBack(err) { if (err.code) { - console.info("publishAsUser failed " + JSON.stringify(err)); + console.error("publishAsUser failed " + JSON.stringify(err)); } else { console.info("publishAsUser"); } } + //指定发送的用户 var userId = 100; + //发布公共事件 -CommonEvent.publish("publish_event", userId, PublishAsUserCallBack); +CommonEvent.publishAsUser("event", userId, PublishAsUserCallBack); ``` @@ -222,6 +234,8 @@ publishAsUser(event: string, userId: number, options: CommonEventPublishData, ca 向指定用户发布公共事件并指定发布信息(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 名称 | 读写属性 | 类型 | 必填 | 描述 | @@ -240,18 +254,21 @@ var options = { code: 0; //公共事件的初始代码 data: "initial data";//公共事件的初始数据 } + //发布公共事件回调 function PublishAsUserCallBack(err) { if (err.code) { - console.info("publishAsUser failed " + JSON.stringify(err)); + console.error("publishAsUser failed " + JSON.stringify(err)); } else { console.info("publishAsUser"); } } + //指定发送的用户 var userId = 100; + //发布公共事件 -CommonEvent.publish("publish_event", userId, options, PublishAsUserCallBack); +CommonEvent.publishAsUser("event", userId, options, PublishAsUserCallBack); ``` @@ -262,6 +279,8 @@ createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallbac 创建订阅者(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 名称 | 读写属性 | 类型 | 必填 | 描述 | @@ -274,15 +293,22 @@ createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallbac ```js var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 var subscribeInfo = { events: ["event"] }; + //创建订阅者回调 -function CreateSubscriberCallBack(err, data) { - console.info("==========================>CreateSubscriberCallBack=======================>"); - subscriber = data; +function CreateSubscriberCallBack(err, commonEventSubscriber) { + if (err.code) { + console.error("createSubscriber failed " + JSON.stringify(err)); + } else { + console.info("createSubscriber"); + subscriber = commonEventSubscriber; + } } + //创建订阅者 CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); ``` @@ -295,6 +321,8 @@ createSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise\ { - console.info("==========================>createSubscriberPromise=======================>"); - subscriber = data; +CommonEvent.createSubscriber(subscribeInfo).then((commonEventSubscriber) => { + console.info("createSubscriber"); + subscriber = commonEventSubscriber; +}).catch((err) => { + console.error("createSubscriber failed " + JSON.stringify(err)); }); ``` @@ -329,6 +361,8 @@ subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback\SubscribeCallBack=======================>"); + if (err.code) { + console.error("subscribe failed " + JSON.stringify(err)); + } else { + console.info("subscribe " + JSON.stringify(data)); + } } + //创建订阅者回调 -function CreateSubscriberCallBack(err, data) { - console.info("==========================>CreateSubscriberCallBack=======================>"); - subscriber = data; - //订阅公共事件 - CommonEvent.subscribe(subscriber, SubscribeCallBack); +function CreateSubscriberCallBack(err, commonEventSubscriber) { + if (err.code) { + console.error("createSubscriber failed " + JSON.stringify(err)); + } else { + console.info("createSubscriber"); + subscriber = commonEventSubscriber; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } } + //创建订阅者 CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); ``` @@ -365,6 +411,7 @@ CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); ```js var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 var subscribeInfo = { events: ["event"] @@ -372,40 +419,63 @@ var subscribeInfo = { //设置有序公共事件的结果代码回调 function SetCodeCallBack(err) { - console.info("==========================>SetCodeCallBack=======================>"); + if (err.code) { + console.error("setCode failed " + JSON.stringify(err)); + } else { + console.info("setCode"); + } } + //设置有序公共事件的结果数据回调 function SetDataCallBack(err) { - console.info("==========================>SetDataCallBack=======================>"); + if (err.code) { + console.error("setData failed " + JSON.stringify(err)); + } else { + console.info("setData"); + } } + //完成本次有序公共事件处理回调 function FinishCommonEventCallBack(err) { - console.info("==========================>FinishCommonEventCallBack=======================>"); + if (err.code) { + console.error("finishCommonEvent failed " + JSON.stringify(err)); + } else { + console.info("finishCommonEvent"); + } } + //订阅公共事件回调 function SubscribeCallBack(err, data) { - console.info("==========================>SubscribeCallBack=======================>"); - //设置有序公共事件的结果代码 - subscriber.setCode(0, SetCodeCallBack); - //设置有序公共事件的结果数据 - subscriber.setData("publish_data_changed", SetDataCallBack); - //完成本次有序公共事件处理 - subscriber.finishCommonEvent(FinishCommonEventCallBack) + if (err.code) { + console.error("subscribe failed " + JSON.stringify(err)); + } else { + console.info("subscribe " + JSON.stringify(data)); + //设置有序公共事件的结果代码 + subscriber.setCode(0, SetCodeCallBack); + //设置有序公共事件的结果数据 + subscriber.setData("publish_data_changed", SetDataCallBack); + //完成本次有序公共事件处理 + subscriber.finishCommonEvent(FinishCommonEventCallBack) + } } //创建订阅者回调 -function CreateSubscriberCallBack(err, data) { - console.info("==========================>CreateSubscriberCallBack=======================>"); - subscriber = data; - //订阅公共事件 - CommonEvent.subscribe(subscriber, SubscribeCallBack); +function CreateSubscriberCallBack(err, commonEventSubscriber) { + if (err.code) { + console.error("createSubscriber failed " + JSON.stringify(err)); + } else { + console.info("createSubscriber"); + subscriber = commonEventSubscriber; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } } //创建订阅者 CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); ``` - + ## CommonEvent.unsubscribe @@ -413,6 +483,8 @@ unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback\): 取消订阅公共事件(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 名称 | 读写属性 | 类型 | 必填 | 描述 | @@ -424,61 +496,79 @@ unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback\): ```js var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 var subscribeInfo = { events: ["event"] }; + //订阅公共事件回调 function SubscribeCallBack(err, data) { - console.info("==========================>SubscribeCallBack=======================>"); + if (err.code) { + console.info("subscribe failed " + JSON.stringify(err)); + } else { + console.info("subscribe " + JSON.stringify(data)); + } } + //创建订阅者回调 -function CreateSubscriberCallBack(err, data) { - console.info("==========================>CreateSubscriberCallBack=======================>"); - subscriber = data; - //订阅公共事件 - CommonEvent.subscribe(subscriber, SubscribeCallBack); +function CreateSubscriberCallBack(err, commonEventSubscriber) { + if (err.code) { + console.info("createSubscriber failed " + JSON.stringify(err)); + } else { + console.info("createSubscriber"); + subscriber = commonEventSubscriber; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } } + //取消订阅公共事件回调 function UnsubscribeCallBack(err) { - console.info("==========================>UnsubscribeCallBack=======================>"); + if (err.code) { + console.info("unsubscribe failed " + JSON.stringify(err)); + } else { + console.info("unsubscribe"); + } } + //创建订阅者 CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); + //取消订阅公共事件 CommonEvent.unsubscribe(subscriber, UnsubscribeCallBack); ``` ## CommonEventPublishData -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| --------------------- | -------- | -------------------- | ---- | ---------------------------- | -| bundleName | 只读 | string | 否 | 表示包名称 | -| code | 只读 | number | 否 | 表示公共事件的结果代码 | -| data | 只读 | string | 否 | 表示公共事件的自定义结果数据 | -| subscriberPermissions | 只读 | Array\ | 否 | 表示订阅者的权限 | -| isOrdered | 只读 | boolean | 否 | 表示是否是有序事件 | -| parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息 | +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------------------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | +| bundleName | 只读 | string | 否 | 表示包名称
**系统能力**:SystemCapability.Notification.CommonEvent | +| code | 只读 | number | 否 | 表示公共事件的结果代码
**系统能力**:SystemCapability.Notification.CommonEvent | +| data | 只读 | string | 否 | 表示公共事件的自定义结果数据
**系统能力**:SystemCapability.Notification.CommonEvent | +| subscriberPermissions | 只读 | Array\ | 否 | 表示订阅者的权限
**系统能力**:SystemCapability.Notification.CommonEvent | +| isOrdered | 只读 | boolean | 否 | 表示是否是有序事件
**系统能力**:SystemCapability.Notification.CommonEvent | +| parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息
**系统能力**:SystemCapability.Notification.CommonEvent | ## CommonEventSubscribeInfo | 名称 | 读写属性 | 类型 | 必填 | 描述 | | ------------------- | -------- | -------------- | ---- | ------------------------------------------------------------ | -| events | 只读 | Array\ | 是 | 表示要发送的公共事件 | -| publisherPermission | 只读 | string | 否 | 表示发布者的权限 | -| publisherDeviceId | 只读 | string | 否 | 表示设备ID,该值必须是同一ohos网络上的现有设备ID | -| userId | 只读 | number | 否 | 表示用户ID。此参数是可选的,默认值当前用户的ID。如果指定了此参数,则该值必须是系统中现有的用户ID。 | -| priority | 只读 | number | 否 | 表示订阅者的优先级。值的范围是-100到1000 | +| events | 只读 | Array\ | 是 | 表示要发送的公共事件
**系统能力**:SystemCapability.Notification.CommonEvent | +| publisherPermission | 只读 | string | 否 | 表示发布者的权限
**系统能力**:SystemCapability.Notification.CommonEvent | +| publisherDeviceId | 只读 | string | 否 | 表示设备ID,该值必须是同一ohos网络上的现有设备ID
**系统能力**:SystemCapability.Notification.CommonEvent | +| userId | 只读 | number | 否 | 表示用户ID。此参数是可选的,默认值当前用户的ID。如果指定了此参数,则该值必须是系统中现有的用户ID。
**系统能力**:SystemCapability.Notification.CommonEvent | +| priority | 只读 | number | 否 | 表示订阅者的优先级。值的范围是-100到1000
**系统能力**:SystemCapability.Notification.CommonEvent | ## CommonEventData -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| ---------- | -------- | -------------------- | ---- | ------------------------------------------------------ | -| event | 只读 | string | 是 | 表示当前接收的公共事件名称 | -| bundleName | 只读 | string | 否 | 表示包名称 | -| code | 只读 | number | 否 | 表示公共事件的结果代码,用于传递int类型的数据 | -| data | 只读 | string | 否 | 表示公共事件的自定义结果数据,用于传递string类型的数据 | -| parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息 | +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | +| event | 只读 | string | 是 | 表示当前接收的公共事件名称
**系统能力**:SystemCapability.Notification.CommonEvent | +| bundleName | 只读 | string | 否 | 表示包名称
**系统能力**:SystemCapability.Notification.CommonEvent | +| code | 只读 | number | 否 | 表示公共事件的结果代码,用于传递int类型的数据
**系统能力**:SystemCapability.Notification.CommonEvent | +| data | 只读 | string | 否 | 表示公共事件的自定义结果数据,用于传递string类型的数据
**系统能力**:SystemCapability.Notification.CommonEvent | +| parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息
**系统能力**:SystemCapability.Notification.CommonEvent | ## CommonEventSubscriber @@ -488,6 +578,8 @@ getCode(callback: AsyncCallback\): void 获取公共事件的结果代码(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -497,12 +589,16 @@ getCode(callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 -function getCodeCallback(err, data) { - console.info("==========================>getCodeCallback=======================>"); - console.info("==========================>err:=======================>", err.code); - console.info("==========================>code:=======================>", data); +getCode() { +function getCodeCallback(err, Code) { + if (err.code) { + console.error("getCode failed " + JSON.stringify(err)); + } else { + console.info("getCode " + JSON.stringify(Code)); + } } subscriber.getCode(getCodeCallback); ``` @@ -513,6 +609,8 @@ getCode(): Promise\ 获取公共事件的结果代码(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **返回值:** | 类型 | 说明 | @@ -522,10 +620,12 @@ getCode(): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 -subscriber.getCode().then((data) => { - console.info("==========================>getCodePromise=======================>"); - console.info("==========================>code:=======================>", data); +var subscriber; //创建成功的订阅者对象 + +subscriber.getCode().then((Code) => { + console.info("getCode " + JSON.stringify(Code)); +}).catch((err) => { + console.error("getCode failed " + JSON.stringify(err)); }); ``` @@ -535,6 +635,8 @@ setCode(code: number, callback: AsyncCallback\): void 设置公共事件的结果代码(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -545,11 +647,15 @@ setCode(code: number, callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 function setCodeCallback(err) { - console.info("==========================>setCodeCallback=======================>"); - console.info("==========================>err:=======================>", err.code); + if (err.code) { + console.error("setCode failed " + JSON.stringify(err)); + } else { + console.info("setCode"); + } } subscriber.setCode(1, setCodeCallback); ``` @@ -560,6 +666,8 @@ setCode(code: number): Promise\ 设置公共事件的结果代码(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -569,9 +677,12 @@ setCode(code: number): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + subscriber.setCode(1).then(() => { - console.info("==========================>setCodePromise=======================>"); + console.info("setCode"); +}).catch((err) => { + console.error("setCode failed " + JSON.stringify(err)); }); ``` @@ -581,6 +692,8 @@ getData(callback: AsyncCallback\): void 获取公共事件的结果数据(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -590,12 +703,15 @@ getData(callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 -function getDataCallback(err, data) { - console.info("==========================>getDataCallback=======================>"); - console.info("==========================>err:=======================>", err.code); - console.info("==========================>data:=======================>", data); +function getDataCallback(err, Data) { + if (err.code) { + console.error("getData failed " + JSON.stringify(err)); + } else { + console.info("getData " + JSON.stringify(Data)); + } } subscriber.getData(getDataCallback); ``` @@ -606,6 +722,8 @@ getData(): Promise\ 获取公共事件的结果数据(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **返回值:** | 类型 | 说明 | @@ -615,10 +733,12 @@ getData(): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 -subscriber.getData().then((data) => { - console.info("==========================>getDataPromise=======================>"); - console.info("==========================>data:=======================>", data); +var subscriber; //创建成功的订阅者对象 + +subscriber.getData().then((Data) => { + console.info("getData " + JSON.stringify(Data)); +}).catch((err) => { + console.error("getData failed " + JSON.stringify(err)); }); ``` @@ -628,6 +748,8 @@ setData(data: string, callback: AsyncCallback\): void 设置公共事件的结果数据(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -638,11 +760,15 @@ setData(data: string, callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 function setDataCallback(err) { - console.info("==========================>setDataCallback=======================>"); - console.info("==========================>err:=======================>", err.code); + if (err.code) { + console.error("setData failed " + JSON.stringify(err)); + } else { + console.info("setData"); + } } subscriber.setData("publish_data_changed", setDataCallback); ``` @@ -653,6 +779,8 @@ setData(data: string): Promise\ 设置公共事件的结果数据(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -662,9 +790,12 @@ setData(data: string): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + subscriber.setData("publish_data_changed").then(() => { - console.info("==========================>setDataPromise=======================>"); + console.info("setData"); +}).catch((err) => { + console.error("setData failed " + JSON.stringify(err)); }); ``` @@ -674,6 +805,8 @@ setCodeAndData(code: number, data: string, callback:AsyncCallback\): void 设置公共事件的结果代码和结果数据(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -685,11 +818,15 @@ setCodeAndData(code: number, data: string, callback:AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 function setCodeDataCallback(err) { - console.info("==========================>setCodeDataCallback=======================>"); - console.info("==========================>err:=======================>", err.code); + if (err.code) { + console.error("setCodeAndData failed " + JSON.stringify(err)); + } else { + console.info("setCodeDataCallback"); + } } subscriber.setCodeAndData(1, "publish_data_changed", setCodeDataCallback); ``` @@ -700,6 +837,8 @@ setCodeAndData(code: number, data: string): Promise\ 设置公共事件的结果代码和结果数据(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -710,9 +849,12 @@ setCodeAndData(code: number, data: string): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + subscriber.setCodeAndData(1, "publish_data_changed").then(() => { - console.info("==========================>setCodeAndData=======================>"); + console.info("setCodeAndData"); +}).catch((err) => { + console.info("setCodeAndData failed " + JSON.stringify(err)); }); ``` @@ -724,6 +866,8 @@ isOrderedCommonEvent(callback: AsyncCallback\): void 返回true代表是有序公共事件,false代表不是有序公共事件。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -733,12 +877,15 @@ isOrderedCommonEvent(callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 -function isOrderedCallback(err, data) { - console.info("==========================>isOrderedCallback=======================>"); - console.info("==========================>err:=======================>", err.code); - console.info("==========================>isOrdered:=======================>", data); +function isOrderedCallback(err, isOrdered) { + if (err.code) { + console.error("isOrderedCommonEvent failed " + JSON.stringify(err)); + } else { + console.info("isOrdered " + JSON.stringify(isOrdered)); + } } subscriber.isOrderedCommonEvent(isOrderedCallback); ``` @@ -751,6 +898,8 @@ isOrderedCommonEvent(): Promise\ 返回true代表是有序公共事件,false代表不是有序公共事件。 +**系统能力**:SystemCapability.Notification.CommonEvent + **返回值:** | 类型 | 说明 | @@ -760,9 +909,12 @@ isOrderedCommonEvent(): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 -subscriber.isOrderedCommonEvent().then((data) => { - console.info("==========================>isOrdered:=======================>", data); +var subscriber; //创建成功的订阅者对象 + +subscriber.isOrderedCommonEvent().then((isOrdered) => { + console.info("isOrdered " + JSON.stringify(isOrdered)); +}).catch((err) => { + console.error("isOrdered failed " + JSON.stringify(err)); }); ``` @@ -772,6 +924,8 @@ abortCommonEvent(callback: AsyncCallback\): void 取消当前的公共事件,仅对有序公共事件有效,取消后,公共事件不再向下一个订阅者传递(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -781,11 +935,15 @@ abortCommonEvent(callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 function abortCallback(err) { - console.info("==========================>abortCallback=======================>"); - console.info("==========================>err:=======================>", err.code); + if (err.code) { + console.error("abortCommonEvent failed " + JSON.stringify(err)); + } else { + console.info("abortCommonEvent"); + } } subscriber.abortCommonEvent(abortCallback); ``` @@ -796,12 +954,17 @@ abortCommonEvent(): Promise\ 取消当前的公共事件,仅对有序公共事件有效,取消后,公共事件不再向下一个订阅者传递(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + subscriber.abortCommonEvent().then(() => { - console.info("==========================>abortCommonEvent:=======================>"); + console.info("abortCommonEvent"); +}).catch((err) => { + console.error("abortCommonEvent failed " + JSON.stringify(err)); }); ``` @@ -811,6 +974,8 @@ clearAbortCommonEvent(callback: AsyncCallback\): void 清除当前公共事件的取消状态,仅对有序公共事件有效(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -820,11 +985,15 @@ clearAbortCommonEvent(callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 function clearAbortCallback(err) { - console.info("==========================>clearAbortCallback=======================>"); - console.info("==========================>err:=======================>", err.code); + if (err.code) { + console.error("clearAbortCommonEvent failed " + JSON.stringify(err)); + } else { + console.info("clearAbortCommonEvent"); + } } subscriber.clearAbortCommonEvent(clearAbortCallback); ``` @@ -835,12 +1004,17 @@ clearAbortCommonEvent(): Promise\ 清除当前公共事件的取消状态,仅对有序公共事件有效(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + subscriber.clearAbortCommonEvent().then(() => { - console.info("==========================>clearAbortCommonEvent:=======================>"); + console.info("clearAbortCommonEvent"); +}).catch((err) => { + console.error("clearAbortCommonEvent failed " + JSON.stringify(err)); }); ``` @@ -850,6 +1024,8 @@ getAbortCommonEvent(callback: AsyncCallback\): void 获取当前有序公共事件是否取消的状态(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -859,12 +1035,15 @@ getAbortCommonEvent(callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 -function getAbortCallback(err, data) { - console.info("==========================>getAbortCallback=======================>"); - console.info("==========================>err:=======================>", err.code); - console.info("==========================>abort:=======================>", data); +function getAbortCallback(err, AbortCommonEvent) { + if (err.code) { + console.error("getAbortCommonEvent failed " + JSON.stringify(err)); + } else { + console.info("AbortCommonEvent " + AbortCommonEvent) + } } subscriber.getAbortCommonEvent(getAbortCallback); ``` @@ -875,6 +1054,8 @@ getAbortCommonEvent(): Promise\ 获取当前有序公共事件是否取消的状态(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **返回值:** | 类型 | 说明 | @@ -884,10 +1065,12 @@ getAbortCommonEvent(): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 -subscriber.getAbortCommonEvent().then((data) => { - console.info("==========================>getAbortCommonEvent:=======================>"); - console.info("==========================>abort:=======================>", data); +var subscriber; //创建成功的订阅者对象 + +subscriber.getAbortCommonEvent().then((AbortCommonEvent) => { + console.info("AbortCommonEvent " + JSON.stringify(AbortCommonEvent)); +}).catch((err) => { + console.error("getAbortCommonEvent failed " + JSON.stringify(err)); }); ``` @@ -897,6 +1080,8 @@ getSubscribeInfo(callback: AsyncCallback\): void 获取订阅者的订阅信息(callback形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **参数:** | 参数名 | 类型 | 必填 | 描述 | @@ -906,12 +1091,15 @@ getSubscribeInfo(callback: AsyncCallback\): void **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +var subscriber; //创建成功的订阅者对象 + //设置有序公共事件的结果数据回调 -function getSubscribeInfoCallback(err, data) { - console.info("==========================>getSubscribeInfoCallback=======================>"); - console.info("==========================>err:=======================>", err.code); - console.info("==========================>priority:=======================>", data.priority); +function getSubscribeInfoCallback(err, SubscribeInfo) { + if (err.code) { + console.error("getSubscribeInfo failed " + JSON.stringify(err)); + } else { + console.info("SubscribeInfo " + JSON.stringify(SubscribeInfo)); + } } subscriber.getSubscribeInfo(getSubscribeInfoCallback); ``` @@ -922,6 +1110,8 @@ getSubscribeInfo(): Promise\ 获取订阅者的订阅信息(Promise形式)。 +**系统能力**:SystemCapability.Notification.CommonEvent + **返回值:** | 类型 | 说明 | @@ -931,9 +1121,12 @@ getSubscribeInfo(): Promise\ **示例:** ```js -var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 -subscriber.getSubscribeInfo().then((data) => { - console.info("==========================>getSubscribeInfo:=======================>"); - console.info("==========================>priority:=======================>", data.priority); +var subscriber; //创建成功的订阅者对象 + +subscriber.getSubscribeInfo().then((SubscribeInfo) => { + console.info("SubscribeInfo " + JSON.stringify(SubscribeInfo)); +}).catch((err) => { + console.error("getSubscribeInfo failed " + JSON.stringify(err)); }); -``` \ No newline at end of file +``` + -- Gitee From 885f07acde8862794c14b5e7e9b27b67d827739f Mon Sep 17 00:00:00 2001 From: laiguizhong Date: Thu, 10 Mar 2022 16:39:12 +0800 Subject: [PATCH 275/282] fix indent problem Change-Id: Ie7ef7ad2f4a6fe70a358de6f943fb6d23aa65547 Signed-off-by: laiguizhong --- .../reference/apis/js-apis-accessibility.md | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md index d91a478a4e3..7d3076a1c53 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-accessibility.md +++ b/zh-cn/application-dev/reference/apis/js-apis-accessibility.md @@ -151,7 +151,7 @@ import accessibility from '@ohos.accessibility'; ### 方法 -下列 API 示例中都需要使用 [accessibility.CaptionsManager()](#accessibilitygetcaptionsmanager8) 获取 captionsManager 实例,再通过此实例调用对应的方法。 +下列 API 示例中都需要使用 [accessibility.getCaptionsManager()](#accessibilitygetcaptionsmanager8) 获取 captionsManager 实例,再通过此实例调用对应的方法。 #### on('enableChange') @@ -257,7 +257,7 @@ off(type: 'styleChange', callback?: Callback<CaptionsStyle>): void; | componentType | string | 是 | 是 | 事件源组件类型,如按钮、图表。 | | pageId | number | 是 | 是 | 事件源的页面 ID。 | | description | string | 是 | 是 | 事件描述。 | -| triggerAction | [Action](#Action) | 是 | 是 | 触发事件的 Action。 | +| triggerAction | [Action](#action) | 是 | 是 | 触发事件的 Action。 | | textMoveUnit | [TextMoveUnit](#textmoveunit) | 是 | 是 | 文本移动粒度。 | | contents | Array<string> | 是 | 是 | 内容列表。 | | lastContent | string | 是 | 是 | 最新内容。 | @@ -347,20 +347,20 @@ getAbilityLists(abilityType: AbilityType, stateType: AbilityState): Promise<A accessibility.getAbilityLists("spoken", "enable") .then((data) => { console.info('success data:getAbilityList1 : ' + JSON.stringify(data)); - for (let item of data) { - console.info(item.id); - console.info(item.name); - console.info(item.description); - console.info(item.abilityTypes); - console.info(item.eventTypes); - console.info(item.capabilities); - console.info(item.packageName); - console.info(item.filterBundleNames); - console.info(item.bundleName); - } - }).catch((error) => { - console.error('failed to getAbilityList1 because ' + JSON.stringify(error)); - }) + for (let item of data) { + console.info(item.id); + console.info(item.name); + console.info(item.description); + console.info(item.abilityTypes); + console.info(item.eventTypes); + console.info(item.capabilities); + console.info(item.packageName); + console.info(item.filterBundleNames); + console.info(item.bundleName); + } + }).catch((error) => { + console.error('failed to getAbilityList1 because ' + JSON.stringify(error)); + }) ``` ## accessibility.getAbilityLists @@ -538,10 +538,10 @@ isOpenTouchGuide(): Promise<boolean> ```typescript accessibility.isOpenTouchGuide() .then((data) => { - console.info('success data:isOpenTouchGuide : ' + JSON.stringify(data)) - }).catch((error) => { - console.error('failed to isOpenTouchGuide because ' + JSON.stringify(error)); - }) + console.info('success data:isOpenTouchGuide : ' + JSON.stringify(data)) + }).catch((error) => { + console.error('failed to isOpenTouchGuide because ' + JSON.stringify(error)); + }) ``` ## accessibility.isOpenTouchGuide @@ -595,10 +595,10 @@ sendEvent(event: EventInfo): Promise<void> ```typescript accessibility.sendEvent(this.eventInfo) .then((data) => { - console.info('success data:sendEvent : ' + JSON.stringify(data)) - }).catch((error) => { - console.error('failed to sendEvent because ' + JSON.stringify(error)); - }) + console.info('success data:sendEvent : ' + JSON.stringify(data)) + }).catch((error) => { + console.error('failed to sendEvent because ' + JSON.stringify(error)); + }) ``` ## accessibility.sendEvent -- Gitee From 3d6b244d56eeade9a88b875ca034efc57a663156 Mon Sep 17 00:00:00 2001 From: hanhaibin Date: Thu, 10 Mar 2022 19:56:53 +0800 Subject: [PATCH 276/282] Add js-apis-zlib.md Signed-off-by: hanhaibin --- .../reference/apis/js-apis-zlib.md | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 zh-cn/application-dev/reference/apis/js-apis-zlib.md diff --git a/zh-cn/application-dev/reference/apis/js-apis-zlib.md b/zh-cn/application-dev/reference/apis/js-apis-zlib.md new file mode 100644 index 00000000000..c23db3897b7 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-zlib.md @@ -0,0 +1,161 @@ +# Zip模块(JS端SDK接口) + +## 使用限制 +无。 +## 导入模块 +import zlib from '@ohos.zlib' +## zlib.zipFile +zipFile(inFile:string, outFile:string, options: Options): Promise; +压缩接口(Promise形式)。 + +**系统能力:** SystemCapability.BundleManager.Zlib + +**参数:** + +| 名称 | 类型 | 必填 | 描述 | +| ------- | ----------------------------------- | ---- | ------------------------------------------- | +| inFile | string | 是 | 指定压缩的文件夹路径或者文件路径 | +| outFile | string | 是 | 指定的压缩结果的文件路径(文件的扩展名zip) | +| options | [Options](#options对象可选参数说明) | 否 | 压缩的可选参数 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ---------------------------------------------------- | +| Promise\ | ERROR_CODE_OK:压缩成功 ERROR_CODE_ERRNO:压缩失败 | + +**示例1:** + +```javascript + +//【压缩文件 例子1】 +import zlib from '@ohos.zlib' +var inFile = "/xxx/filename.xxx"; +var outFile = "/xxx/xxx.zip"; +var options = {}; +options.level = zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION; +options.memLevel = zlib.MemLevel.MEM_LEVEL_DEFAULT; +options.strategy = zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY; + +zlib.zipFile(inFile, outFile, options).then((data) => { + if (data == zlib.ErrorCode.ERROR_CODE_OK) { + console.log("zipFile OK"); + } else { + console.log("zipFile NG"); + } +}).catch((err)=>{ + console.log("catch((err)=>" + err); +}); + +``` + +**示例2:** + +``` +// 【压缩文件夹 例子2】 +import zlib from '@ohos.zlib' +var inFile = "/xxx/xxx"; +var outFile = "/xxx/xxx.zip"; +var options = {}; +options.level = zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION; +options.memLevel = zlib.MemLevel.MEM_LEVEL_DEFAULT; +options.strategy = zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY; + +zlib.zipFile(inFile , unzipDir, options).then((data) => { + if (data == zlib.ErrorCode.ERROR_CODE_OK) { + console.log("zipFile OK"); + } else { + console.log("zipFile NG"); + } +}).catch((err)=>{ + console.log("catch((err)=>" + err); +}); +``` + +## zlib.unzipFile + +unzipFile(inFile:string, outFile:string, options: Options): Promise; + +解压文件,解压完成返回执行结果(Promise形式)。 + +**系统能力:** SystemCapability.BundleManager.Zlib + +**参数:** + +| 名称 | 类型 | 必填 | 描述 | +| ------- | ----------------------------------- | ---- | ----------------------------------- | +| inFile | string | 是 | 指定解压的文件路径(文件扩展名zip) | +| outFile | string | 是 | 指定的解压文件路径 | +| options | [Options](#options对象可选参数说明) | 否 | 解压的可选参数 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------------------------------ | +| Promise\ | ERROR_CODE_OK:解压成功 ERROR_CODE_ERRNO:解压失败返回执行结果。 | + +**示例:** + +```javascript +// 【解压例子1】 +import zlib from '@ohos.zlib' +var inFile = "/xx/xxx.zip"; +var outFile = "/xxx"; + +var options = {}; +options.level = zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION; +options.memLevel = zlib.MemLevel.MEM_LEVEL_DEFAULT; +options.strategy = zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY; + +zlib.unzipFile(inFile, outFile, options).then((data) => { + if (data == zlib.ErrorCode.ERROR_CODE_OK) { + console.log("unzipFile OK"); + } else { + console.log("unzipFile NG"); + } +}).catch((err)=>{ + console.log("catch((err)=>" + err); +}) + +``` + +## Options对象可选参数说明 + +| 参数 | | +| --------------------------- | ------------------------------------------------------------ | +| level?: CompressLeve | [参考zip.CompressLevel枚举定义](#zip.CompressLevel压缩等级可选参数说明) | +| memLevel?: MemLevel | [参考zip.MemLevel枚举定义](#zip.MemLevel可选参数说明) | +| strategy?: CompressStrategy | [参考zip.CompressStrategy枚举定义](#zip.CompressStrategy压缩策略可选参数说明) | + +## zip.MemLevel可选参数说明 + +| MEM_LEVEL_MIN | zip 接口在压缩过程中最小使用内存 | +| ----------------- | -------------------------------- | +| MEM_LEVEL_MAX | zip 接口在压缩过程中最大使用内存 | +| MEM_LEVEL_DEFAULT | zip 接口在压缩过程中默认使用内存 | + +## zip.CompressLevel压缩等级可选参数说明 + +| 参数 | 描述 | +| --------------------------------------- | ----------------- | +| COMPRESS_LEVEL_NO_COMPRESSION : 0 | 压缩率为0压缩等级 | +| COMPRESS_LEVEL_BEST_SPEED : 1 | 最佳速度压缩等级 | +| COMPRESS_LEVEL_BEST_COMPRESSION :9 | 最佳压缩等级 | +| COMPRESS_LEVEL_DEFAULT_COMPRESSION :-1 | 默认压缩等级 | + +## zip.CompressStrategy压缩策略可选参数说明 + +| 参数 | 描述 | +| -------------------------------------- | ------------------------ | +| COMPRESS_STRATEGY_DEFAULT_STRATEGY : 0 | 常规数据策略 | +| COMPRESS_STRATEGY_FILTERED : 1 | 过滤器产生的数据压缩策略 | +| COMPRESS_STRATEGY_HUFFMAN_ONLY : 2 | 霍夫曼编码格式压缩策略 | +| OMPRESS_STRATEGY_RLE : 3 | 游标编码压缩策略 | +| COMPRESS_STRATEGY_FIXED : 4 | 固定的压缩策略 | + +## zip.ErrorCode接口返回值参数说明 + +| 参数 | 描述 | +| -------------------- | ------------ | +| ERROR_CODE_OK: 0 | 函数调用成功 | +| ERROR_CODE_ERRNO:- 1 | 函数调用失败 | -- Gitee From b28b7f2b84780802098466a33c5d4a37b9bd5f7a Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 10 Mar 2022 12:17:56 +0000 Subject: [PATCH 277/282] update zh-cn/application-dev/reference/apis/js-apis-brightness.md. Signed-off-by: zengyawen --- .../application-dev/reference/apis/js-apis-brightness.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-brightness.md b/zh-cn/application-dev/reference/apis/js-apis-brightness.md index 07ed408bb13..2398385699f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-brightness.md +++ b/zh-cn/application-dev/reference/apis/js-apis-brightness.md @@ -12,17 +12,15 @@ import brightness from '@ohos.brightness'; ``` -## 系统能力 - -SystemCapability.PowerManager.DisplayPowerManager - ## brightness.setValue setValue(value: number) 设置系统的屏幕亮度。 -**补充说明:**该接口为system api,仅供系统应用使用。 +**系统能力:** SystemCapability.PowerManager.DisplayPowerManager + +**补充说明:** 该接口为system api,仅供系统应用使用。 **参数:** @@ -33,6 +31,5 @@ setValue(value: number) **示例:** ``` -import brightness from '@ohos.brightness.d.ts'; brightness.setValue(128); ``` -- Gitee From 4ed5c6a6d4fb3531c1643dd63e17351c7f744bbf Mon Sep 17 00:00:00 2001 From: chyyy0213 Date: Wed, 9 Mar 2022 17:16:43 +0800 Subject: [PATCH 278/282] window interface modify Signed-off-by: chyyy0213 Change-Id: I5876a05dbf45a7262d82677d07dff9064ad936b4 Signed-off-by: chyyy0213 --- .../reference/apis/js-apis-window.md | 886 +++++++++++++++--- 1 file changed, 753 insertions(+), 133 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-window.md b/zh-cn/application-dev/reference/apis/js-apis-window.md index faac688921e..975ce49cb9e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-window.md +++ b/zh-cn/application-dev/reference/apis/js-apis-window.md @@ -13,118 +13,152 @@ import window from '@ohos.window'; 窗口类型。 -| 名称 | 默认值 | 说明 | -| ----------------- | ------ | ------------------------------------------------------------ | -| TYPE_APP | 0 | 表示应用子窗口。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| TYPE_SYSTEM_ALERT | 1 | 表示系统告警窗口。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 默认值 | 说明 | +| ----------------- | ------ | ------------------ | +| TYPE_APP | 0 | 表示应用子窗口。 | +| TYPE_SYSTEM_ALERT | 1 | 表示系统告警窗口。 | ## AvoidAreaType7+ 窗口内容需要规避区域的类型。 -| 名称 | 默认值 | 说明 | -| ----------- | ------ | ------------------------------------------------------------ | -| TYPE_SYSTEM | 0 | 表示系统默认区域。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| TYPE_CUTOUT | 1 | 表示刘海屏区域。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 默认值 | 说明 | +| ----------- | ------ | ------------------ | +| TYPE_SYSTEM | 0 | 表示系统默认区域。 | +| TYPE_CUTOUT | 1 | 表示刘海屏区域。 | ## WindowMode7+ 窗口模式。 -| 名称 | 默认值 | 说明 | -| ---------- | ------ | ------------------------------------------------------------ | -| UNDEFINED | 1 | 表示APP未定义窗口模式。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| FULLSCREEN | 2 | 表示APP全屏模式。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| PRIMARY | 3 | 表示APP分屏多窗口主要模式。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| SECONDARY | 4 | 表示APP分屏多窗口次要模式。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| FLOATING | 5 | 表示APP自由悬浮形式窗口模式。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +此接口为系统接口,三方应用不支持调用。 + +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 默认值 | 说明 | +| ---------- | ------ | ----------------------------- | +| UNDEFINED | 1 | 表示APP未定义窗口模式。 | +| FULLSCREEN | 2 | 表示APP全屏模式。 | +| PRIMARY | 3 | 表示APP分屏多窗口主要模式。 | +| SECONDARY | 4 | 表示APP分屏多窗口次要模式。 | +| FLOATING | 5 | 表示APP自由悬浮形式窗口模式。 | ## SystemBarProperties 状态栏导航栏的属性。 +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + | 名称 | 参数类型 | 可读 | 可写 | 说明 | | -------------------------------------- | -------- | ---- | ---- | ------------------------------------------------------------ | -| statusBarColor | string | 是 | 是 | 状态栏背景颜色,为16进制RGB或ARGB颜色,例如"\#00FF00"或"\#FF00FF00"。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| isStatusBarLightIcon7+ | boolean | 否 | 是 | 状态栏图标是否为高亮状态。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| statusBarContentColor8+ | string | 否 | 是 | 状态栏文字颜色。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| navigationBarColor | string | 是 | 是 | 导航栏背景颜色,为16进制RGB或ARGB颜色,例如"\#00FF00"或"\#FF00FF00"。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| isNavigationBarLightIcon7+ | boolean | 否 | 否 | 导航栏图标是否为高亮状态。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| navigationBarContentColor8+ | string | 否 | 是 | 导航栏文字颜色。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +| statusBarColor | string | 是 | 是 | 状态栏背景颜色,为16进制RGB或ARGB颜色,例如"\#00FF00"或"\#FF00FF00"。 | +| isStatusBarLightIcon7+ | boolean | 否 | 是 | 状态栏图标是否为高亮状态。 | +| statusBarContentColor8+ | string | 否 | 是 | 状态栏文字颜色。 | +| navigationBarColor | string | 是 | 是 | 导航栏背景颜色,为16进制RGB或ARGB颜色,例如"\#00FF00"或"\#FF00FF00"。 | +| isNavigationBarLightIcon7+ | boolean | 否 | 否 | 导航栏图标是否为高亮状态。 | +| navigationBarContentColor8+ | string | 否 | 是 | 导航栏文字颜色。 | ## SystemBarRegionTint 8+ 单个导航栏或状态栏回调信息。 +此接口为系统接口,三方应用不支持调用。 + +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + | 名称 | 参数类型 | 可读 | 可写 | 说明 | | --------------- | ------------------------- | ---- | ---- | ------------------------------------------------------------ | -| type | [WindowType](#windowtype) | 是 | 是 | 当前属性改变的系统栏类型,仅支持类型为导航栏、状态栏的系统栏。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| isEnable | boolean | 是 | 是 | 当前系统栏是否显示。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| region | [Rect](#rect) | 是 | 是 | 当前系统栏的位置及大小。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| backgroundColor | string | 是 | 是 | 系统栏背景颜色,为16进制RGB或ARGB颜色,例如"\#00FF00"或"\#FF00FF00"。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| contentColor | string | 是 | 是 | 系统栏文字颜色。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +| type | [WindowType](#windowtype) | 是 | 是 | 当前属性改变的系统栏类型,仅支持类型为导航栏、状态栏的系统栏。 | +| isEnable | boolean | 是 | 是 | 当前系统栏是否显示。 | +| region | [Rect](#rect) | 是 | 是 | 当前系统栏的位置及大小。 | +| backgroundColor | string | 是 | 是 | 系统栏背景颜色,为16进制RGB或ARGB颜色,例如"\#00FF00"或"\#FF00FF00"。 | +| contentColor | string | 是 | 是 | 系统栏文字颜色。 | ## SystemBarTintState 8+ 当前系统栏回调信息集合。 -| 名称 | 参数类型 | 可读 | 可写 | 说明 | -| ---------- | -------------------------------------------------- | ---- | ---- | ------------------------------------------------------------ | -| displayId | number | 是 | 否 | 当前物理屏幕id。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| regionTint | Array<[SystemBarRegionTint](#systembartegiontint)> | 是 | 是 | 当前改变所有的系统栏信息。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +此接口为系统接口,三方应用不支持调用。 + +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| ---------- | -------------------------------------------------- | ---- | ---- | -------------------------- | +| displayId | number | 是 | 否 | 当前物理屏幕id。 | +| regionTint | Array<[SystemBarRegionTint](#systembartegiontint)> | 是 | 是 | 当前改变所有的系统栏信息。 | ## Rect7+ 矩形。 -| 名称 | 参数类型 | 可读 | 可写 | 说明 | -| ------ | -------- | ---- | ---- | ------------------------------------------------------------ | -| left | number | 是 | 是 | 矩形区域的左边界。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| top | number | 是 | 是 | 矩形区域的上边界。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| width | number | 是 | 是 | 矩形区域的宽度。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| height | number | 是 | 是 | 矩形区域的高度。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| ------ | -------- | ---- | ---- | ------------------ | +| left | number | 是 | 是 | 矩形区域的左边界。 | +| top | number | 是 | 是 | 矩形区域的上边界。 | +| width | number | 是 | 是 | 矩形区域的宽度。 | +| height | number | 是 | 是 | 矩形区域的高度。 | ## AvoidArea7+ 表示窗口内容规避区域。 -| 名称 | 参数类型 | 可读 | 可写 | 说明 | -| ---------- | ------------- | ---- | ---- | ------------------------------------------------------------ | -| leftRect | [Rect](#rect) | 是 | 是 | 屏幕左侧的矩形区。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| topRect | [Rect](#rect) | 是 | 是 | 屏幕顶部的矩形区。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| rightRect | [Rect](#rect) | 是 | 是 | 屏幕右侧的矩形区。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| bottomRect | [Rect](#rect) | 是 | 是 | 屏幕底部的矩形区。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| ---------- | ------------- | ---- | ---- | ------------------ | +| leftRect | [Rect](#rect) | 是 | 是 | 屏幕左侧的矩形区。 | +| topRect | [Rect](#rect) | 是 | 是 | 屏幕顶部的矩形区。 | +| rightRect | [Rect](#rect) | 是 | 是 | 屏幕右侧的矩形区。 | +| bottomRect | [Rect](#rect) | 是 | 是 | 屏幕底部的矩形区。 | ## Size7+ 窗口大小。 -| 名称 | 参数类型 | 可读 | 可写 | 说明 | -| ------ | -------- | ---- | ---- | ------------------------------------------------------------ | -| width | number | 是 | 是 | 窗口宽度。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| height | number | 是 | 是 | 窗口高度。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| ------ | -------- | ---- | ---- | ---------- | +| width | number | 是 | 是 | 窗口宽度。 | +| height | number | 是 | 是 | 窗口高度。 | ## WindowProperties 窗口属性。 +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + | 名称 | 参数类型 | 可读 | 可写 | 说明 | | ------------------------------- | ------------------------- | ---- | ---- | ------------------------------------------------------------ | -| windowRect7+ | [Rect](#rect) | 是 | 是 | 窗口尺寸。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| type7+ | [WindowType](#windowtype) | 是 | 是 | 窗口类型。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| isFullScreen | boolean | 是 | 是 | 是否全屏,默认为false。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| isLayoutFullScreen7+ | boolean | 是 | 是 | 窗口是否为沉浸式,默认为false。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| focusable7+ | boolean | 是 | 否 | 窗口是否可聚焦,默认为true。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| touchable7+ | boolean | 是 | 否 | 窗口是否可触摸,默认为true。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +| windowRect7+ | [Rect](#rect) | 是 | 是 | 窗口尺寸。 | +| type7+ | [WindowType](#windowtype) | 是 | 是 | 窗口类型。 | +| isFullScreen | boolean | 是 | 是 | 是否全屏,默认为false。 | +| isLayoutFullScreen7+ | boolean | 是 | 是 | 窗口是否为沉浸式,默认为false。 | +| focusable7+ | boolean | 是 | 否 | 窗口是否可聚焦,默认为true。 | +| touchable7+ | boolean | 是 | 否 | 窗口是否可触摸,默认为true。 | +| brightness | number | 是 | 是 | 屏幕亮度, 取值范围为0~1,1表示最大亮度值。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 | +| dimBehindValue7+ | number | 是 | 是 | 靠后窗口的暗度值,取值范围为0~1,1表示最暗。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 | +| isKeepScreenOn | boolean | 是 | 是 | 屏幕是否常亮,默认为false。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 | +| isPrivacyMode7+ | boolean | 是 | 是 | 隐私模式,默认为false。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 | +| isRoundCorner7+ | boolean | 是 | 是 | 窗口是否为圆角。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 | +| isTransparent7+ | boolean | 是 | 是 | 窗口是否透明。默认为false。
本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 | ## ColorSpace8+ 色域模式。 -| 名称 | 默认值 | 说明 | -| ---------- | ------ | ------------------------------------------------------------ | -| DEFAULT | 0 | 默认色域模式。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | -| WIDE_GAMUT | 1 | 广色域模式。
**系统能力**:SystemCapability.WindowManager.WindowManager.Core | +**系统能力**:以下各项对应的系统能力均为SystemCapability.WindowManager.WindowManager.Core。 + +| 名称 | 默认值 | 说明 | +| ---------- | ------ | -------------- | +| DEFAULT | 0 | 默认色域模式。 | +| WIDE_GAMUT | 1 | 广色域模式。 | ## window.create7 @@ -145,12 +179,13 @@ create(id: string, type: WindowType, callback: AsyncCallback<Window>): voi - 示例 ``` + var windowClass = null; window.create("first", window.WindowType.TYPE_APP, (err, data) => { - windowClass = data; if (err.code) { console.error('Failed to create the subWindow. Cause: ' + JSON.stringify(err)); return; } + windowClass = data; console.info('SubWindow created. Data: ' + JSON.stringify(data)) windowClass.resetSize(500, 1000); }); @@ -180,8 +215,10 @@ create(id: string, type: WindowType): Promise<Window> - 示例 ``` + var windowClass = null; let promise = window.create("first", window.WindowType.TYPE_APP); promise.then((data)=> { + windowClass = data; console.info('SubWindow created. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to create the subWindow. Cause: ' + JSON.stringify(err)); @@ -208,12 +245,13 @@ create(ctx: Context, id: string, type: WindowType, callback: AsyncCallback<Wi - 示例 ``` + var windowClass = null; window.create(this.context, "alertWindow", window.WindowType.TYPE_SYSTEM_ALERT, (err, data) => { - windowClass = data; if (err.code) { console.error('Failed to create the Window. Cause: ' + JSON.stringify(err)); return; } + windowClass = data; console.info('Window created. Data: ' + JSON.stringify(data)) windowClass.resetSize(500, 1000); }); @@ -244,8 +282,10 @@ create(ctx: Context, id: string, type: WindowType): Promise<Window> - 示例 ``` + var windowClass = null; let promise = window.create(this.context, "alertWindow", window.WindowType.TYPE_SYSTEM_ALERT); promise.then((data)=> { + windowClass = data; console.info('Window created. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to create the Window. Cause: ' + JSON.stringify(err)); @@ -270,13 +310,14 @@ find(id: string, callback: AsyncCallback<Window>): void - 示例 ``` - window.find("first", (err, data) => { + var windowClass = null; + window.find("alertWindow", (err, data) => { if (err.code) { console.error('Failed to find the Window. Cause: ' + JSON.stringify(err)); return; } - console.info('window found. Data: ' + JSON.stringify(data)) - windowClass = data; + windowClass = data; + console.info('window found. Data: ' + JSON.stringify(data)) }); ``` @@ -303,8 +344,10 @@ find(id: string): Promise<Window> - 示例 ``` - let promise = window.find("first"); + var windowClass = null; + let promise = window.find("alertWindow"); promise.then((data)=> { + windowClass = data; console.info('window found. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to find the Window. Cause: ' + JSON.stringify(err)); @@ -328,13 +371,14 @@ getTopWindow(callback: AsyncCallback<Window>): void - 示例 ``` + var windowClass = null; window.getTopWindow((err, data) => { if (err.code) { console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err)); return; } - console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data)); windowClass = data; + console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data)); }); ``` @@ -355,8 +399,10 @@ getTopWindow(): Promise<Window> - 示例 ``` + var windowClass = null; let promise = window.getTopWindow(); promise.then((data)=> { + windowClass = data; console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err)); @@ -381,13 +427,14 @@ getTopWindow(ctx: Context, callback: AsyncCallback<Window>): void - 示例 ``` + var windowClass = null; window.getTopWindow(this.context, (err, data) => { if (err.code) { console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err)); return; } - console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data)); windowClass = data; + console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data)); }); ``` @@ -414,8 +461,10 @@ getTopWindow(ctx: Context): Promise<Window> - 示例 ``` + var windowClass = null; let promise = window.getTopWindow(this.context); promise.then((data)=> { + windowClass = data; console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err)); @@ -428,6 +477,8 @@ on(type: 'systemBarTintChange', callback: Callback<SystemBarTintState>): v 注册状态栏、导航栏的监听函数。 +此接口为系统接口,三方应用不支持调用。 + **系统能力**:SystemCapability.WindowManager.WindowManager.Core - 参数 @@ -452,6 +503,8 @@ off(type: 'systemBarTintChange', callback?: Callback<SystemBarTintState >) 关闭监听。 +此接口为系统接口,三方应用不支持调用。 + **系统能力**:SystemCapability.WindowManager.WindowManager.Core - 参数 @@ -478,6 +531,8 @@ hide (callback: AsyncCallback<void>): void 隐藏当前窗口,使用callback方式作为异步方法。 +此接口为系统接口,三方应用不支持调用。 + **系统能力**:SystemCapability.WindowManager.WindowManager.Core - 参数 @@ -489,12 +544,12 @@ hide (callback: AsyncCallback<void>): void - 示例 ``` - windowClass.hide((err) => { + windowClass.hide((err, data) => { if (err.code) { console.error('Failed to hide the window. Cause: ' + JSON.stringify(err)); return; } - console.info('window hidden.') + console.info('window hidden. data: ' + JSON.stringify(data)) }) ``` @@ -504,6 +559,8 @@ hide(): Promise<void> 隐藏当前窗口,使用Promise方式作为异步方法。 +此接口为系统接口,三方应用不支持调用。 + **系统能力**:SystemCapability.WindowManager.WindowManager.Core - 返回值 @@ -516,8 +573,8 @@ hide(): Promise<void> ``` let promise = windowClass.hide(); - promise.then(()=> { - console.info('window hidden.') + promise.then((data)=> { + console.info('window hidden. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to hide the window. Cause: ' + JSON.stringify(err)); }) @@ -540,12 +597,12 @@ show(callback: AsyncCallback<void>): void - 示例 ``` - windowClass.show((err) => { + windowClass.show((err, data) => { if (err.code) { console.error('Failed to show the window. Cause: ' + JSON.stringify(err)); return; } - console.info('Succeeded in showing the window.') + console.info('Succeeded in showing the window. Data: ' + JSON.stringify(data)) }) ``` @@ -567,8 +624,8 @@ show(): Promise<void> ``` let promise = windowClass.show(); - promise.then(()=> { - console.info('Succeeded in showing the window.') + promise.then((data)=> { + console.info('Succeeded in showing the window. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to show the window. Cause: ' + JSON.stringify(err)); }) @@ -591,12 +648,12 @@ destroy(callback: AsyncCallback<void>): void - 示例 ``` - windowClass.destroy((err) => { + windowClass.destroy((err, data) => { if (err.code) { console.error('Failed to destroy the window. Cause:' + JSON.stringify(err)); return; } - console.info('Succeeded in destroying the window.') + console.info('Succeeded in destroying the window. Data: ' + JSON.stringify(data)) }) ``` @@ -618,8 +675,8 @@ destroy(): Promise<void> ``` let promise = windowClass.destroy(); - promise.then(()=> { - console.info('Succeeded in destroying the window.') + promise.then((data)=> { + console.info('Succeeded in destroying the window. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to destroy the window. Cause: ' + JSON.stringify(err)); }) @@ -644,12 +701,12 @@ moveTo(x: number, y: number, callback: AsyncCallback<void>): void - 示例 ``` - windowClass.moveTo(300, 300, (err)=>{ + windowClass.moveTo(300, 300, (err, data)=>{ if (err.code) { console.error('Failed to move the window. Cause:' + JSON.stringify(err)); return; } - console.info('Window moved.'); + console.info('Window moved. Data: ' + JSON.stringify(data)) }); ``` @@ -679,8 +736,8 @@ moveTo(x: number, y: number): Promise<void> ``` let promise = windowClass.moveTo(300, 300); - promise.then(()=> { - console.info('Window moved.') + promise.then((data)=> { + console.info('Window moved. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to move the window. Cause: ' + JSON.stringify(err)); }) @@ -705,12 +762,12 @@ resetSize(width: number, height: number, callback: AsyncCallback<void>): v - 示例 ``` - windowClass.resetSize(500, 1000, (err) => { + windowClass.resetSize(500, 1000, (err, data) => { if (err.code) { console.error('Failed to change the window size. Cause:' + JSON.stringify(err)); return; } - console.info('Window size changed.'); + console.info('Window size changed. Data: ' + JSON.stringify(data)) }); ``` @@ -739,8 +796,8 @@ resetSize(width: number, height: number): Promise<void> ``` let promise = windowClass.resetSize(500, 1000); - promise.then(()=> { - console.info('Window size changed.') + promise.then((data)=> { + console.info('Window size changed. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to change the window size. Cause: ' + JSON.stringify(err)); }); @@ -752,6 +809,8 @@ setWindowType(type: WindowType, callback: AsyncCallback<void>): void 设置窗口类型,使用callback方式作为异步方法。 +此接口为系统接口,三方应用不支持调用。 + **系统能力**:SystemCapability.WindowManager.WindowManager.Core - 参数 @@ -765,12 +824,12 @@ setWindowType(type: WindowType, callback: AsyncCallback<void>): void ``` var type = window.TYPE_APP; - windowClass.setWindowType(type, (err) => { + windowClass.setWindowType(type, (err, data) => { if (err.code) { console.error('Failed to set the window type. Cause: ' + JSON.stringify(err)); return; } - console.info('Succeeded in setting the window type.') + console.info('Succeeded in setting the window type. Data: ' + JSON.stringify(data)) }); ``` @@ -780,6 +839,8 @@ setWindowType(type: WindowType): Promise<void> 设置窗口类型,使用Promise方式作为异步方法。 +此接口为系统接口,三方应用不支持调用。 + **系统能力**:SystemCapability.WindowManager.WindowManager.Core - 参数 @@ -799,8 +860,8 @@ setWindowType(type: WindowType): Promise<void> ``` var type = window.TYPE_APP; let promise = windowClass.setWindowType(type); - promise.then(()=> { - console.info('Succeeded in setting the window type.') + promise.then((data)=> { + console.info('Succeeded in setting the window type. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to set the window type. Cause: ' + JSON.stringify(err)); }); @@ -935,12 +996,12 @@ setFullScreen(isFullScreen: boolean, callback: AsyncCallback<void>): void ``` var isFullScreen = true; - windowClass.setFullScreen(isFullScreen, (err) => { + windowClass.setFullScreen(isFullScreen, (err, data) => { if (err.code) { console.error('Failed to enable the full-screen mode. Cause: ' + JSON.stringify(err)); return; } - console.info('Succeeded in enabling the full-screen mode.'); + console.info('Succeeded in enabling the full-screen mode. Data: ' + JSON.stringify(data)) }); ``` @@ -969,8 +1030,8 @@ setFullScreen(isFullScreen: boolean): Promise<void> ``` var isFullScreen = true; let promise = windowClass.setFullScreen(isFullScreen); - promise.then(()=> { - console.info('Succeeded in enabling the full-screen mode.')) + promise.then((data)=> { + console.info('Succeeded in enabling the full-screen mode. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to enable the full-screen mode. Cause: ' + JSON.stringify(err)); }); @@ -995,12 +1056,12 @@ setLayoutFullScreen(isLayoutFullScreen: boolean, callback: AsyncCallback<void ``` var isLayoutFullScreen= true; - windowClass.setLayoutFullScreen(isLayoutFullScreen, (err) => { + windowClass.setLayoutFullScreen(isLayoutFullScreen, (err, data) => { if (err.code) { console.error('Failed to set the window layout to full-screen mode. Cause:' + JSON.stringify(err)); return; } - console.info('Succeeded in setting the window layout to full-screen mode.'); + console.info('Succeeded in setting the window layout to full-screen mode. Data: ' + JSON.stringify(data)) }); ``` @@ -1029,8 +1090,8 @@ setLayoutFullScreen(isLayoutFullScreen: boolean): Promise<void> ``` var isLayoutFullScreen = true; let promise = windowClass.setLayoutFullScreen(isLayoutFullScreen); - promise.then(()=> { - console.info('Succeeded in setting the window layout to full-screen mode.')) + promise.then((data)=> { + console.info('Succeeded in setting the window layout to full-screen mode. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to set the window layout to full-screen mode. Cause:' + JSON.stringify(err)); }); @@ -1055,12 +1116,12 @@ setSystemBarEnable(names: Array<'status' | 'navigation'>, callback: AsyncCallbac ``` var names = ["status", "navigation"]; - windowClass.setSystemBarEnable(names, (err) => { + windowClass.setSystemBarEnable(names, (err, data) => { if (err.code) { console.error('Failed to set the system bar to be visible. Cause:' + JSON.stringify(err)); return; } - console.info('Succeeded in setting the system bar to be visible.'); + console.info('Succeeded in setting the system bar to be visible. Data: ' + JSON.stringify(data)) }); ``` @@ -1089,8 +1150,8 @@ setSystemBarEnable(names: Array<'status' | 'navigation'>): Promise<void> ``` var names = ["status", "navigation"]; let promise = windowClass.setSystemBarEnable(names); - promise.then(()=> { - console.info('Succeeded in setting the system bar to be visible.')) + promise.then((data)=> { + console.info('Succeeded in setting the system bar to be visible. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to set the system bar to be visible. Cause:' + JSON.stringify(err)); }); @@ -1121,15 +1182,15 @@ setSystemBarProperties(systemBarProperties: SystemBarProperties, callback: Async isStatusBarLightIcon: true, isNavigationBarLightIcon:false, //以下两个属性从API Version8开始支持 - statusBarContentColor:'#ffffff' + statusBarContentColor:'#ffffff', navigationBarContentColor:'#00ffff' }; - windowClass.setSystemBarProperties(SystemBarProperties, (err) => { + windowClass.setSystemBarProperties(SystemBarProperties, (err, data) => { if (err.code) { console.error('Failed to set the system bar properties. Cause: ' + JSON.stringify(err)); return; } - console.info('Succeeded in setting the system bar properties.'); + console.info('Succeeded in setting the system bar properties. Data: ' + JSON.stringify(data)) }); ``` @@ -1163,20 +1224,20 @@ setSystemBarProperties(systemBarProperties: SystemBarProperties): Promise<voi isStatusBarLightIcon: true, isNavigationBarLightIcon:false, //以下两个属性从API Version8开始支持 - statusBarContentColor:'#ffffff' + statusBarContentColor:'#ffffff', navigationBarContentColor:'#00ffff' }; let promise = windowClass.setSystemBarProperties(SystemBarProperties); - promise.then(()=> { - console.info('Succeeded in setting the system bar properties.')) + promise.then((data)=> { + console.info('Succeeded in setting the system bar properties. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to set the system bar properties. Cause: ' + JSON.stringify(err)); }); ``` -### loadContent8+ +### loadContent7+ -loadContent(path: string, storage: ContentStorage, callback: AsyncCallback<void>): void +loadContent(path: string, callback: AsyncCallback<void>): void 当前窗口加载具体页面内容,使用callback方式作为异步方法。 @@ -1187,24 +1248,23 @@ loadContent(path: string, storage: ContentStorage, callback: AsyncCallback<vo | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------- | ---- | -------------------- | | path | string | 是 | 设置加载页面的路径。 | - | storage | ContentStorage | 否 | 当前应用内的数据。 | | callback | AsyncCallback<void> | 是 | 回调函数。 | - + - 示例 ``` - windowClass.loadContent("pages/page2/page2", (err) => { + windowClass.loadContent("pages/page2/page2", (err, data) => { if (err.code) { console.error('Failed to load the content. Cause:' + JSON.stringify(err)); return; } - console.info('Succeeded in loading the content.'); + console.info('Succeeded in loading the content. Data: ' + JSON.stringify(data)) }); ``` -### loadContent8+ +### loadContent7+ -loadContent(path: string, storage?: ContentStorage): Promise<void> +loadContent(path: string): Promise<void> 当前窗口加载具体页面内容,使用Promise方式作为异步方法。 @@ -1212,11 +1272,10 @@ loadContent(path: string, storage?: ContentStorage): Promise<void> - 参数 - | 参数名 | 类型 | 必填 | 说明 | - | ------- | -------------- | ---- | -------------------- | - | path | string | 是 | 设置加载页面的路径。 | - | storage | ContentStorage | 否 | 当前应用内的数据。 | - + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------- | + | path | string | 是 | 设置加载页面的路径。 | + - 返回值 | 类型 | 说明 | @@ -1227,8 +1286,8 @@ loadContent(path: string, storage?: ContentStorage): Promise<void> ``` let promise = windowClass.loadContent("pages/page2/page2"); - promise.then(()=> { - console.info('Succeeded in loading the content.')) + promise.then((data)=> { + console.info('Succeeded in loading the content. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to load the content. Cause: ' + JSON.stringify(err)); }); @@ -1251,12 +1310,12 @@ isShowing(callback: AsyncCallback<boolean>): void - 示例 ``` - windowClass.isShowing((err) => { + windowClass.isShowing((err, data) => { if (err.code) { console.error('Failed to check whether the window is showing. Cause:' + JSON.stringify(err)); return; } - console.info('Succeeded in checking whether the window is showing. Cause:') + console.info('Succeeded in checking whether the window is showing. Data: ' + JSON.stringify(data)) }); ``` @@ -1278,8 +1337,8 @@ isShowing(): Promise<boolean> ``` let promise = windowClass.isShowing(); - promise.then(()=> { - console.info('Succeeded in checking whether the window is showing.') + promise.then((data)=> { + console.info('Succeeded in checking whether the window is showing. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to check whether the window is showing. Cause: ' + JSON.stringify(err)); }); @@ -1377,6 +1436,56 @@ off(type: 'systemAvoidAreaChange', callback?: Callback<AvoidArea>): void windowClass.off(type); ``` +### on('keyboardHeightChange')7+ + +on(type: 'keyboardHeightChange', callback: Callback<number>): void + +开启键盘高度变化的监听。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'keyboardHeightChange'时表示监听类型为键盘高度变化监听。 | + | callback | Callback<[AvoidArea](#avoidarea)> | 是 | 回调返回监听到的信息。 | + +- 示例 + + ``` + var type = 'keyboardHeightChange'; + windowClass.on(type, (data) => { + console.info('Succeeded in enabling the listener for keyboard height changes. Data: ' + JSON.stringify(data)); + }); + ``` + +### off('keyboardHeightChange')7+ + +off(type: 'keyboardHeightChange', callback?: Callback<number>): void + +关闭键盘高度变化的监听。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'keyboardHeightChange'时表示监听类型为键盘高度变化监听。 | + | callback | Callback<number> | 否 | 回调返回监听到的信息。 | + +- 示例 + + ``` + var type = 'keyboardHeightChange'; + windowClass.off(type); + ``` + ### isSupportWideGamut8+ isSupportWideGamut(callback: AsyncCallback<boolean>): void @@ -1394,12 +1503,12 @@ isSupportWideGamut(callback: AsyncCallback<boolean>): void - 示例 ``` - windowClass.isSupportWideGamut((err) => { + windowClass.isSupportWideGamut((err, data) => { if (err.code) { console.error('Failed to check whether the window support WideGamut. Cause:' + JSON.stringify(err)); return; } - console.info('Succeeded in checking whether the window support WideGamut.') + console.info('Succeeded in checking whether the window support WideGamut Data: ' + JSON.stringify(data)) }) ``` @@ -1421,8 +1530,8 @@ isSupportWideGamut(): Promise<boolean> ``` let promise = windowClass.isSupportWideGamut(); - promise.then(()=> { - console.info('Succeeded in checking whether the window support WideGamut.') + promise.then((data)=> { + console.info('Succeeded in checking whether the window support WideGamut. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to check whether the window support WideGamut. Cause: ' + JSON.stringify(err)); }); @@ -1446,12 +1555,12 @@ setColorSpace(colorSpace:ColorSpace, callback: AsyncCallback<void>): void - 示例 ``` - windowClass.setColorSpace(window.ColorSpace.WIDE_GAMUT, (err) => { + windowClass.setColorSpace(window.ColorSpace.WIDE_GAMUT, (err, data) => { if (err.code) { console.error('Failed to set window colorspace. Cause:' + JSON.stringify(err)); return; } - console.info('Succeeded in setting window colorspace.') + console.info('Succeeded in setting window colorspace. Data: ' + JSON.stringify(data)) }) ``` @@ -1479,8 +1588,8 @@ setColorSpace(colorSpace:ColorSpace): Promise<void> ``` let promise = windowClass.isSupportWideGamut(window.ColorSpace.WIDE_GAMUT); - promise.then(()=> { - console.info('Succeeded in setting window colorspace.') + promise.then((data)=> { + console.info('Succeeded in setting window colorspace. Data: ' + JSON.stringify(data)) }).catch((err)=>{ console.error('Failed to set window colorspacet. Cause: ' + JSON.stringify(err)); }); @@ -1537,3 +1646,514 @@ getColorSpace(): Promise<ColorSpace> }); ``` +### setBackgroundColor + +setBackgroundColor(color: string, callback: AsyncCallback<void>): void + +设置窗口的背景色,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------- | ---- | ------------------------------------------------------------ | + | color | string | 是 | 需要设置的背景色,为16进制颜色,例如"#00FF00"或"#FF00FF00"。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + var color = '#00ff33'; + windowClass.setBackgroundColor(color, (err, data) => { + if (err.code) { + console.error('Failed to set the background color. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the background color. Data: ' + JSON.stringify(data)); + }); + ``` + +### setBackgroundColor + +setBackgroundColor(color: string): Promise<void> + +设置窗口的背景色,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | ------------------------------------------------------------ | + | color | string | 是 | 需要设置的背景色,为16进制颜色,例如"#00FF00"或"#FF00FF00"。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + var color = '#00ff33'; + let promise = windowClass.setBackgroundColor(color); + promise.then((data)=> { + console.info('Succeeded in setting the background color. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the background color. Cause: ' + JSON.stringify(err)); + }); + ``` + +### setBrightness + +setBrightness(brightness: number, callback: AsyncCallback<void>): void + +设置屏幕亮度值,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ---------- | ------------------------- | ---- | ------------------------------------ | + | brightness | number | 是 | 屏幕亮度值,值为0-1之间。1表示最亮。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + var brightness = 1; + windowClass.setBrightness(brightness, (err, data) => { + if (err.code) { + console.error('Failed to set the brightness. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the brightness. Data: ' + JSON.stringify(data)); + }); + ``` + +### setBrightness + +setBrightness(brightness: number): Promise<void> + +设置屏幕亮度值,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ---------- | ------ | ---- | ------------------------------------ | + | brightness | number | 是 | 屏幕亮度值,值为0-1之间。1表示最亮。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + var brightness = 1; + let promise = windowClass.setBrightness(brightness); + promise.then((data)=> { + console.info('Succeeded in setting the brightness. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the brightness. Cause: ' + JSON.stringify(err)); + }); + ``` + +### setDimBehind7+ + +setDimBehind(dimBehindValue: number, callback: AsyncCallback<void>): void + +窗口叠加时,设备有子窗口的情况下设置靠后的窗口的暗度值,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------------- | ------------------------- | ---- | -------------------------------------------------- | + | dimBehindValue | number | 是 | 表示靠后的窗口的暗度值,取值范围为0-1,1表示最暗。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + windowClass.setDimBehind(0.5, (err, data) => { + if (err.code) { + console.error('Failed to set the dimness. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the dimness. Data:' + JSON.stringify(data)); + }); + ``` + +### setDimBehind7+ + +setDimBehind(dimBehindValue: number): Promise<void> + +窗口叠加时,设备有子窗口的情况下设置靠后的窗口的暗度值,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------------- | ------ | ---- | -------------------------------------------------- | + | dimBehindValue | number | 是 | 表示靠后的窗口的暗度值,取值范围为0-1,1表示最暗。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + let promise = windowClass.setDimBehind(0.5); + promise.then((data)=> { + console.info('Succeeded in setting the dimness. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the dimness. Cause: ' + JSON.stringify(err)); + }); + ``` + +### setFocusable7+ + +setFocusable(isFocusable: boolean, callback: AsyncCallback<void>): void + +设置点击时是否支持切换焦点窗口,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ----------- | ------------------------- | ---- | ---------------------------- | + | isFocusable | boolean | 是 | 点击时是否支持切换焦点窗口。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + var isFocusable= true; + windowClass.setFocusable(isFocusable, (err, data) => { + if (err.code) { + console.error('Failed to set the window to be focusable. Cause:' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the window to be focusable. Data: ' + JSON.stringify(data)); + }); + ``` + +### setFocusable7+ + +setFocusable(isFocusable: boolean): Promise<void> + +设置点击时是否支持切换焦点窗口,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ----------- | ------- | ---- | ---------------------------- | + | isFocusable | boolean | 是 | 点击时是否支持切换焦点窗口。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + var isFocusable= true; + let promise = windowClass.setFocusable(isFocusable); + promise.then((data)=> { + console.info('Succeeded in setting the window to be focusable. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the window to be focusable. Cause: ' + JSON.stringify(err)); + }); + ``` + +### setKeepScreenOn + +setKeepScreenOn(isKeepScreenOn: boolean, callback: AsyncCallback<void>): void + +设置屏幕是否为常亮状态,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------------- | ------------------------- | ---- | ------------------------ | + | isKeepScreenOn | boolean | 是 | 是否设置为屏幕常亮状态。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + var isKeepScreenOn = true; + windowClass.setKeepScreenOn(isKeepScreenOn, (err, data) => { + if (err.code) { + console.error('Failed to set the screen to be always on. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the screen to be always on. Data: ' + JSON.stringify(data)); + }); + ``` + +### setKeepScreenOn + +setKeepScreenOn(isKeepScreenOn: boolean): Promise<void> + +设置屏幕是否为常亮状态,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------------- | ------- | ---- | ------------------------ | + | isKeepScreenOn | boolean | 是 | 是否设置为屏幕常亮状态。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + var isKeepScreenOn= true; + let promise = windowClass.setKeepScreenOn(isKeepScreenOn); + promise.then((data)=> { + console.info('Succeeded in setting the screen to be always on. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the screen to be always on. Cause: ' + JSON.stringify(err)); + }); + ``` + +### setOutsideTouchable7+ + +setOutsideTouchable(touchable: boolean, callback: AsyncCallback<void>): void + +设置是否允许可点击子窗口以外的区域,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | --------- | ------------------------- | ---- | ---------------- | + | touchable | boolean | 是 | 设置是否可点击。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + windowClass.setOutsideTouchable(true, (err, data) => { + if (err.code) { + console.error('Failed to set the area to be touchable. Cause: ' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the area to be touchable. Data: ' + JSON.stringify(data)) + }) + ``` + +### setOutsideTouchable7+ + +setOutsideTouchable(touchable: boolean): Promise<void> + +设置是否允许可点击子窗口以外的区域,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | --------- | ------- | ---- | ---------------- | + | touchable | boolean | 是 | 设置是否可点击。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + let promise = windowClass.setOutsideTouchable(true); + promise.then((data)=> { + console.info('Succeeded in setting the area to be touchable. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the area to be touchable. Cause: ' + JSON.stringify(err)); + }); + ``` + +### setPrivacyMode7+ + +setPrivacyMode(isPrivacyMode: boolean, callback: AsyncCallback<void>): void + +设置窗口是否为隐私模式,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------------- | ------------------------- | ---- | -------------------- | + | isPrivacyMode | boolean | 是 | 窗口是否为隐私模式。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + var isPrivacyMode = true; + windowClass.setPrivacyMode(isPrivacyMode, (err, data) => { + if (err.code) { + console.error('Failed to set the window to privacy mode. Cause:' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the window to privacy mode. Data:' + JSON.stringify(data)); + + }); + ``` + +### setPrivacyMode7+ + +setPrivacyMode(isPrivacyMode: boolean): Promise<void> + +设置窗口是否为隐私模式,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------------- | ------- | ---- | -------------------- | + | isPrivacyMode | boolean | 是 | 窗口是否为隐私模式。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + var isPrivacyMode = true; + let promise = windowClass.setPrivacyMode(isPrivacyMode); + promise.then((data)=> { + console.info('Succeeded in setting the window to privacy mode. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the window to privacy mode. Cause: ' + JSON.stringify(err)); + }); + ``` + +### setTouchable7+ + +setTouchable(isTouchable: boolean, callback: AsyncCallback<void>): void + +设置窗口是否为可触状态,使用callback方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ----------- | ------------------------- | ---- | -------------------- | + | isTouchable | boolean | 是 | 窗口是否为可触状态。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + var isTouchable = true; + windowClass.setTouchable(isTouchable, (err, data) => { + if (err.code) { + console.error('Failed to set the window to be touchable. Cause:' + JSON.stringify(err)); + return; + } + console.info('Succeeded in setting the window to be touchable. Data:' + JSON.stringify(data)); + + }); + ``` + +### setTouchable7+ + +setTouchable(isTouchable: boolean): Promise<void> + +设置窗口是否为可触状态,使用Promise方式作为异步方法。 + +本接口在OpenHarmony 3.1 Release版本仅为接口定义,暂不支持使用。接口将在OpenHarmony 3.1 MR版本中提供使用支持。 + +**系统能力**:SystemCapability.WindowManager.WindowManager.Core + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ----------- | ------- | ---- | -------------------- | + | isTouchable | boolean | 是 | 窗口是否为可触状态。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ----------------------------------------------- | + | Promise<void> | 以Promise形式返回结果,返回当前函数执行的结果。 | + +- 示例 + + ``` + var isTouchable = true; + let promise = windowClass.setTouchable(isTouchable); + promise.then((data)=> { + console.info('Succeeded in setting the window to be touchable. Data: ' + JSON.stringify(data)) + }).catch((err)=>{ + console.error('Failed to set the window to be touchable. Cause: ' + JSON.stringify(err)); + }); + ``` + +### \ No newline at end of file -- Gitee From 320f21b7fb6419ec40c0f812aba85694af04ade9 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 10 Mar 2022 21:23:46 +0800 Subject: [PATCH 279/282] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- .../reference/apis/js-apis-faultLogger.md | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-faultLogger.md b/zh-cn/application-dev/reference/apis/js-apis-faultLogger.md index f27debab52a..9ea0cbac0f5 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-faultLogger.md +++ b/zh-cn/application-dev/reference/apis/js-apis-faultLogger.md @@ -73,7 +73,7 @@ function queryFaultLogCallback(error, value) { } } } -faultLogger.querySelfFaultLog(faultlogger.FaultType.JS_CRASH, queryFaultLogCallback); +faultLogger.querySelfFaultLog(faultLogger.FaultType.JS_CRASH, queryFaultLogCallback); ``` ## faultLogger.querySelfFaultLog @@ -97,20 +97,22 @@ querySelfFaultLog(faultType: FaultType) : Promise<Array<FaultLogInfo>&g **示例:** ``` -let value = await faultLogger.querySelfFaultLog(faultlogger.FaultType.JS_CRASH); -if (value) { - console.info("value length is " + value.length); - let len = value.length; - for (let i = 0; i < len; i++) { - console.info("log: " + i); - console.info("Log pid: " + value[i].pid); - console.info("Log uid: " + value[i].uid); - console.info("Log type: " + value[i].type); - console.info("Log ts: " + value[i].ts); - console.info("Log reason: " + value[i].reason); - console.info("Log module: " + value[i].module); - console.info("Log summary: " + value[i].summary); - console.info("Log text: " + value[i].fullLog); +async function getLog() { + let value = await faultLogger.querySelfFaultLog(faultLogger.FaultType.JS_CRASH); + if (value) { + console.info("value length is " + value.length); + let len = value.length; + for (let i = 0; i < len; i++) { + console.info("log: " + i); + console.info("Log pid: " + value[i].pid); + console.info("Log uid: " + value[i].uid); + console.info("Log type: " + value[i].type); + console.info("Log ts: " + value[i].ts); + console.info("Log reason: " + value[i].reason); + console.info("Log module: " + value[i].module); + console.info("Log summary: " + value[i].summary); + console.info("Log text: " + value[i].fullLog); + } } } -``` \ No newline at end of file +``` -- Gitee From d822201b4828bef974b902eb446f677239a85d6d Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 10 Mar 2022 13:36:45 +0000 Subject: [PATCH 280/282] update zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md. Signed-off-by: zengyawen --- .../apis/js-apis-abilityAccessCtrl.md | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) 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 f7a50c58358..d5351e156e3 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md +++ b/zh-cn/application-dev/reference/apis/js-apis-abilityAccessCtrl.md @@ -9,15 +9,15 @@ import abilityAccessCtrl from '@ohos.abilityAccessCtrl' ``` -## 系统能力 -SystemCapability.Security.AccessToken - ## abilityAccessCtrl.createAtManager createAtManager(): AtManager 访问控制管理:获取访问控制模块对象。 +**系统能力:** SystemCapability.Security.AccessToken + + **返回值:** | 类型 | 说明 | @@ -40,6 +40,8 @@ verifyAccessToken(tokenID: number, permissionName: string): Promise<GrantStat 校验应用是否授予权限,使用Promise方式异步返回结果。 +**系统能力:** SystemCapability.Security.AccessToken + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -56,7 +58,7 @@ verifyAccessToken(tokenID: number, permissionName: string): Promise<GrantStat **示例:** ``` -const AtManager = abilityAccessCtrl.createAtManager(); +var AtManager = abilityAccessCtrl.createAtManager(); let tokenID = 0; let promise = AtManager.verifyAccessToken(tokenID, "ohos.permission.GRANT_SENSITIVE_PERMISSIONS"); promise.then(data => { @@ -70,7 +72,9 @@ grantUserGrantedPermission(tokenID: number, permissionName: string, permissionFl 授予应用user grant权限,使用Promise方式异步返回结果。 -需要权限:ohos.permission.GRANT_SENSITIVE_PERMISSIONS。 +**需要权限:** ohos.permission.GRANT_SENSITIVE_PERMISSIONS + +**系统能力:** SystemCapability.Security.AccessToken **参数:** @@ -89,7 +93,7 @@ grantUserGrantedPermission(tokenID: number, permissionName: string, permissionFl **示例:** ``` -const AtManager = abilityAccessCtrl.createAtManager(); +var AtManager = abilityAccessCtrl.createAtManager(); let tokenID = 0; let promise = AtManager.grantUserGrantedPermission(tokenID, "ohos.permission.GRANT_SENSITIVE_PERMISSIONS"); promise.then(data => { @@ -105,7 +109,9 @@ grantUserGrantedPermission(tokenID: number, permissionName: string, permissionFl 授予应用user grant权限,使用callback回调异步返回结果。 -需要权限:ohos.permission.GRANT_SENSITIVE_PERMISSIONS。 +**需要权限:** ohos.permission.GRANT_SENSITIVE_PERMISSIONS + +**系统能力:** SystemCapability.Security.AccessToken **参数:** @@ -119,7 +125,7 @@ grantUserGrantedPermission(tokenID: number, permissionName: string, permissionFl **示例:** ``` -const AtManager = abilityAccessCtrl.createAtManager(); +var AtManager = abilityAccessCtrl.createAtManager(); let tokenID = 0; let permissionFlag = 1; AtManager.grantUserGrantedPermission(tokenID, "ohos.permission.GRANT_SENSITIVE_PERMISSIONS",permissionFlag, data => { @@ -133,7 +139,9 @@ revokeUserGrantedPermission(tokenID: number, permissionName: string, permissionF 撤销应用user grant权限,使用Promise方式异步返回结果。 -需要权限:ohos.permission.REVOKE_SENSITIVE_PERMISSIONS。 +**需要权限:** ohos.permission.REVOKE_SENSITIVE_PERMISSIONS + +**系统能力:** SystemCapability.Security.AccessToken **参数:** @@ -152,7 +160,7 @@ revokeUserGrantedPermission(tokenID: number, permissionName: string, permissionF **示例:** ``` -const AtManager = abilityAccessCtrl.createAtManager(); +var AtManager = abilityAccessCtrl.createAtManager(); let tokenID = 0; let permissionFlag = 1; let promise = AtManager.revokeUserGrantedPermission(tokenID, "ohos.permission.GRANT_SENSITIVE_PERMISSIONS", permissionFlag); @@ -167,7 +175,9 @@ revokeUserGrantedPermission(tokenID: number, permissionName: string, permissionF 撤销应用user grant权限,使用callback回调异步返回结果。 -需要权限:ohos.permission.REVOKE_SENSITIVE_PERMISSIONS。 +**需要权限:** ohos.permission.REVOKE_SENSITIVE_PERMISSIONS + +**系统能力:** SystemCapability.Security.AccessToken **参数:** @@ -181,7 +191,7 @@ revokeUserGrantedPermission(tokenID: number, permissionName: string, permissionF **示例:** ``` -const AtManager = abilityAccessCtrl.createAtManager(); +var AtManager = abilityAccessCtrl.createAtManager(); let tokenID = 0; AtManager.revokeUserGrantedPermission(tokenID, "ohos.permission.GRANT_SENSITIVE_PERMISSIONS",permissionFlag, data => { console.log(`callback: data->${JSON.stringify(data)}`); @@ -194,6 +204,8 @@ getPermissionFlags(tokenID: number, permissionName: string): Promise<number&g 获取指定应用的指定权限的flag,使用Promise方式异步返回结果。 +**系统能力:** SystemCapability.Security.AccessToken + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -210,7 +222,7 @@ getPermissionFlags(tokenID: number, permissionName: string): Promise<number&g **示例:** ``` -const AtManager = abilityAccessCtrl.createAtManager(); +var AtManager = abilityAccessCtrl.createAtManager(); let tokenID = 0; let promise = AtManager.getPermissionFlags(tokenID, "ohos.permission.GRANT_SENSITIVE_PERMISSIONS"); promise.then(data => { @@ -222,6 +234,8 @@ promise.then(data => { 表示授权状态的枚举。 +**系统能力:** 以下各项对应的系统能力均为SystemCapability.Security.AccessToken + | 名称 | 默认值 | 描述 | | ----------------------------- | ---------------------- | ----------------------- | | PERMISSION_DENIED | -1 | 表示未授权。 | -- Gitee From 5e296eb187535f597cf1a42cfdcb3916902ffeed Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 10 Mar 2022 13:59:49 +0000 Subject: [PATCH 281/282] update zh-cn/application-dev/reference/apis/js-apis-runninglock.md. Signed-off-by: zengyawen --- .../reference/apis/js-apis-runninglock.md | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-runninglock.md b/zh-cn/application-dev/reference/apis/js-apis-runninglock.md index f26db121c4b..df65e342c82 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-runninglock.md +++ b/zh-cn/application-dev/reference/apis/js-apis-runninglock.md @@ -9,19 +9,16 @@ ## 导入模块 ``` -import runninglock from '@ohos.runningLock'; +import runningLock from '@ohos.runningLock'; ``` -## 系统能力 - -SystemCapability.PowerManager.PowerManager.Core - - ## RunningLockType RunningLock锁的类型。 +**系统能力:** 以下各项对应的系统能力均为SystemCapability.PowerManager.PowerManager.Core + | 名称 | 默认值 | 描述 | | ------------------------ | ---- | ------------------- | | BACKGROUND | 1 | 阻止系统休眠的锁。 | @@ -34,6 +31,8 @@ isRunningLockTypeSupported(type: RunningLockType, callback: AsyncCallback<boo 查询系统是否支持该类型的锁。 +**系统能力:** SystemCapability.PowerManager.PowerManager.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -60,6 +59,8 @@ isRunningLockTypeSupported(type: RunningLockType): Promise<boolean> 查询系统是否支持该类型的锁。 +**系统能力:** SystemCapability.PowerManager.PowerManager.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -91,7 +92,9 @@ createRunningLock(name: string, type: RunningLockType, callback: AsyncCallback&l 创建RunningLock锁。 -**需要权限:**ohos.permission.RUNNING_LOCK +**系统能力:** SystemCapability.PowerManager.PowerManager.Core + +**需要权限:** ohos.permission.RUNNING_LOCK **参数:** @@ -124,7 +127,9 @@ createRunningLock(name: string, type: RunningLockType): Promise<RunningLock&g 创建Runninglock锁。 -**需要权限:**ohos.permission.RUNNING_LOCK +**系统能力:** SystemCapability.PowerManager.PowerManager.Core + +**需要权限:** ohos.permission.RUNNING_LOCK **参数:** @@ -163,6 +168,8 @@ lock(timeout: number): void 锁定和持有RunningLock。 +**系统能力:** SystemCapability.PowerManager.PowerManager.Core + **参数:** | 参数名 | 类型 | 必填 | 说明 | @@ -189,6 +196,8 @@ unlock(): void 释放Runninglock锁。 +**系统能力:** SystemCapability.PowerManager.PowerManager.Core + **示例:** ``` @@ -209,6 +218,8 @@ isUsed(): boolean 查询当前Runninglock是持有状态还是释放状态。 +**系统能力:** SystemCapability.PowerManager.PowerManager.Core + **返回值:** | 类型 | 说明 | | ------- | ------------------------------------- | -- Gitee From 2003d897ef0aa8acd161a4d9401b98d60e5e5ea3 Mon Sep 17 00:00:00 2001 From: zhouyaoying Date: Fri, 11 Mar 2022 10:52:28 +0800 Subject: [PATCH 282/282] =?UTF-8?q?=E5=88=B7=E6=96=B0=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E5=AD=90=E7=B3=BB=E7=BB=9Freadme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyaoying Change-Id: I84340c8956bb2c4a92b1f93ea90fe7f7bcba7038 --- ...\243\345\255\220\347\263\273\347\273\237.md" | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git "a/zh-cn/readme/\347\252\227\345\217\243\345\255\220\347\263\273\347\273\237.md" "b/zh-cn/readme/\347\252\227\345\217\243\345\255\220\347\263\273\347\273\237.md" index 77182df5410..7813ab5c8c1 100644 --- "a/zh-cn/readme/\347\252\227\345\217\243\345\255\220\347\263\273\347\273\237.md" +++ "b/zh-cn/readme/\347\252\227\345\217\243\345\255\220\347\263\273\347\273\237.md" @@ -1,4 +1,4 @@ -# windowmanager +# 窗口子系统 - [简介](#简介) - [目录](#目录) @@ -8,15 +8,14 @@ ## 简介 -**窗口子系统** 提供窗口管理和Display管理的基础能力,是系统图形界面显示所需的基础子系统 - -其主要的结构如下图所示: +**窗口子系统** 提供窗口管理和Display管理的基础能力,是系统图形界面显示所需的基础子系统。其主要的结构如图1所示。 +**图 1** 窗口子系统架构图 ![窗口子系统架构图](./figures/WindowManager.png) - **Window Manager Client** - 应用进程窗口管理接口层,提供窗口对对象抽象和窗口管理接口,对接原能力和UI框架。 + 应用进程窗口管理接口层,提供窗口对象抽象和窗口管理接口,对接元能力和UI框架。 - **Display Manager Client** @@ -24,17 +23,17 @@ - **Window Manager Server** - 窗口管理服务,提供窗口布局、Z序控制、窗口树结构、窗口拖拽、窗口快照等能力,并提供窗口布局和焦点窗口给多模输入 + 窗口管理服务,提供窗口布局、Z序控制、窗口树结构、窗口拖拽、窗口快照等能力,并提供窗口布局和焦点窗口给多模输入。 - **Display Manager Server** - Display管理服务,提供Display信息、屏幕截图、屏幕亮灭和亮度处理控制,并处理Display与Screen映射关系 + Display管理服务,提供Display信息、屏幕截图、屏幕亮灭和亮度处理控制,并处理Display与Screen映射关系。 ## 目录 ``` foundation/windowmanager/ ├── dm # Dislplay Manager Client实现代码 -├── dmserver # Dislplay Manager Service实现代码 +├── dmserver # Dislplay Manager Server实现代码 ├── interfaces # 对外接口存放目录 │   ├── innerkits # native接口存放目录 │   └── kits # js/napi接口存放目录 @@ -43,7 +42,7 @@ foundation/windowmanager/ ├── snapshot # 截屏命令行工具实现代码 ├── utils # 工具类存放目录 ├── wm # Window Manager Client实现代码 -├── wmserver # Window Manager Service实现代码 +├── wmserver # Window Manager Server实现代码 ``` ## 约束 -- Gitee

8 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 DJX0$y -- Gitee From 52bd7aa355e0015b366a2c120536fb8d418bc62b Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:45:47 +0000 Subject: [PATCH 216/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md. Signed-off-by: LiAn --- .../arkui-ts/ts-universal-attributes-gradient-color.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md index 4e94c8db23f..cc12361fe98 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md @@ -14,9 +14,9 @@ | 名称 | 参数类型 | 默认值 | 描述 | | -------- | -------- | -------- | -------- | -| linearGradient | {
angle?: [Angle](../../ui/ts-types.md#角度类型),
direction?: GradientDirection,
colors: Array<[ColorStop](../../ui/ts-types.md#角度类型/ts-types.md#colorstop类型)>
repeating?: boolean
} | - | 线性渐变。
angle: 线性渐变的角度。
direction: 线性渐变的方向。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | -| sweepGradient | {
center: Point,
start?: angle,
end?: angle,
colors: Array<[ColorStop](../../ui/ts-types.md#colorstop类型)>
repeating?: boolean
} | - | 角度渐变。
center:为角度渐变的中心点。
start:角度渐变的起点。
end:角度渐变的终点。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | -| radialGradient | {
center: Point,
radius: Length,
colors: Array<[ColorStop](../../ui//ts-types.md#colorstop类型)>
repeating: boolean
} | - | 径向渐变。
center:径向渐变的中心点。
radius:径向渐变的半径。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | +| linearGradient | {
angle?: [Angle](../../ui/ts-types.md),
direction?: GradientDirection,
colors: Array<[ColorStop](../../ui/ts-types.md/ts-types.md)>
repeating?: boolean
} | - | 线性渐变。
angle: 线性渐变的角度。
direction: 线性渐变的方向。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | +| sweepGradient | {
center: Point,
start?: angle,
end?: angle,
colors: Array<[ColorStop](../../ui/ts-types.md)>
repeating?: boolean
} | - | 角度渐变。
center:为角度渐变的中心点。
start:角度渐变的起点。
end:角度渐变的终点。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | +| radialGradient | {
center: Point,
radius: Length,
colors: Array<[ColorStop](../../ui/ts-types.md)>
repeating: boolean
} | - | 径向渐变。
center:径向渐变的中心点。
radius:径向渐变的半径。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | - GradientDirection枚举说明
-- Gitee From 16e1ce35a760fb03433ab98c16832eda38b86100 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:46:39 +0000 Subject: [PATCH 217/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md. Signed-off-by: LiAn --- .../reference/arkui-ts/ts-universal-events-drag-drop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md index d941e88d8c6..988437562c8 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-events-drag-drop.md @@ -7,7 +7,7 @@ | 名称 | 支持冒泡 | 功能描述 | | -------- | -------- | -------- | -| onDragStart(callback: (event: DragEvent, extraParams?: string) =>  [CustomBuilder](../../ui/ts-types.md#custombuilder类型8+)) | 否 | 第一次拖拽此事件绑定的组件时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。
返回值:当前跟手效果所拖拽的对象,用于显示拖拽时的提示组件。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - 长按150毫秒(ms)可触发拖拽事件。
> - 优先级:长按手势配置时间小于等于150毫秒(ms)时,长按手势优先触发,否则拖拽事件优先触发。 | +| onDragStart(callback: (event: DragEvent, extraParams?: string) =>  [CustomBuilder](../../ui/ts-types.md)) | 否 | 第一次拖拽此事件绑定的组件时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。
返回值:当前跟手效果所拖拽的对象,用于显示拖拽时的提示组件。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - 长按150毫秒(ms)可触发拖拽事件。
> - 优先级:长按手势配置时间小于等于150毫秒(ms)时,长按手势优先触发,否则拖拽事件优先触发。 | | onDragEnter(callback: (event: DragEvent, extraParams?: string) => void) | 否 | 拖拽进入组件范围内时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 当监听了onDrop事件时,此事件才有效。 | | onDragMove(callback: (event: DragEvent, extraParams?: string) => void) | 否 | 拖拽在组件范围内移动时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 当监听了onDrop事件时,此事件才有效。 | | onDragLeave(callback: (event: DragEvent, extraParams?: string) => void) | 否 | 拖拽离开组件范围内时,触发回调。
event:拖拽事件信息,包括拖拽点坐标。
extraParams:拖拽事件额外信息,详见extraParam类型描述。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 当监听了onDrop事件时,此事件才有效。 | -- Gitee From fe48600a5f5c76a18943954a4e3523327a8e1079 Mon Sep 17 00:00:00 2001 From: LiAn Date: Tue, 8 Mar 2022 03:58:35 +0000 Subject: [PATCH 218/282] update zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md. Signed-off-by: LiAn --- .../arkui-ts/ts-universal-attributes-gradient-color.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md index cc12361fe98..8dfcbfc0820 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-gradient-color.md @@ -14,7 +14,7 @@ | 名称 | 参数类型 | 默认值 | 描述 | | -------- | -------- | -------- | -------- | -| linearGradient | {
angle?: [Angle](../../ui/ts-types.md),
direction?: GradientDirection,
colors: Array<[ColorStop](../../ui/ts-types.md/ts-types.md)>
repeating?: boolean
} | - | 线性渐变。
angle: 线性渐变的角度。
direction: 线性渐变的方向。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | +| linearGradient | {
angle?: [Angle](../../ui/ts-types.md),
direction?: GradientDirection,
colors: Array<[ColorStop](../../ui/ts-types.md)>
repeating?: boolean
} | - | 线性渐变。
angle: 线性渐变的角度。
direction: 线性渐变的方向。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | | sweepGradient | {
center: Point,
start?: angle,
end?: angle,
colors: Array<[ColorStop](../../ui/ts-types.md)>
repeating?: boolean
} | - | 角度渐变。
center:为角度渐变的中心点。
start:角度渐变的起点。
end:角度渐变的终点。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | | radialGradient | {
center: Point,
radius: Length,
colors: Array<[ColorStop](../../ui/ts-types.md)>
repeating: boolean
} | - | 径向渐变。
center:径向渐变的中心点。
radius:径向渐变的半径。
colors: 为渐变的颜色描述。
repeating: 为渐变的颜色重复着色。 | -- Gitee From e82f7e60a0f3afeb0d9adb75a62bc7fe2b909a8a Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 8 Mar 2022 12:14:38 +0800 Subject: [PATCH 219/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 0952cbe8247..174e11f0893 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -92,13 +92,13 @@ getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult> | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------------------------------------- | ---- | ------------ | -| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体检索选项 | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 文件检索选项 | **返回值** | 类型 | 说明 | | ----------------------------- | -------------- | -| [FetchFileResult](#fetchfileresult8) | 媒体数据结果集 | +| [FetchFileResult](#fetchfileresult8) | 文件数据结果集 | **示例:** @@ -177,7 +177,7 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal | ------------ | --------------------------------------- | ---- | ------------------------------------------------------------ | | mediaType | [MediaType](#mediatype) | 是 | 媒体类型 | | displayName | string | 是 | 展示文件名 | -| relativePath | string | 是 | 相对公共目录路径,可以通过getPublicDirectory获取不同类型媒体文件的一层目录的relative path | +| relativePath | string | 是 | 文件保存路径,可以通过[getPublicDirectory](#getpublicdirectory8)获取不同类型文件的保存路径 | | callback | AsyncCallback<[FileAsset](#fileasset8)> | 是 | 异步获取媒体数据FileAsset之后的回调 | **示例:** @@ -185,8 +185,9 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal ``` // 使用Callback方式创建Image类型文件 let mediaType = mediaLibrary.MediaType.IMAGE; -let path = "Pictures/"; -mediaLibrary.createAsset(mediaType, 'imageCallBack.jpg', path, (err, fileAsset) => { +let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; +const path = await media.getPublicDirectory(DIR_IMAGE); +mediaLibrary.createAsset(mediaType, 'imageCallBack.jpg', path + 'myPicture/', (err, fileAsset) => { if (fileAsset != undefined) { console.info('createAsset successfully, message = ' + err); } else { @@ -224,8 +225,9 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr ``` // 使用Promise方式创建Image类型文件 let mediaType = mediaLibrary.MediaType.IMAGE; -let path = "Pictures/"; -mediaLibrary.createAsset(mediaType, "image01.jpg", path).then (function (asset) { +let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; +const path = await media.getPublicDirectory(DIR_IMAGE); +mediaLibrary.createAsset(mediaType, "image01.jpg", path + 'myPicture/').then (function (asset) { console.info("createAsset successfully:"+ JSON.stringify(asset)); }).catch(function(err){ console.info("createAsset failed with error:"+ err); @@ -252,7 +254,7 @@ getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): ``` let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; media.getPublicDirectory(DIR_CAMERA, (err, dicResult) => { - if (dicResult == 'camera/') { + if (dicResult == 'Camera/') { console.info('mediaLibraryTest : getPublicDirectory passed'); } else { console.info('mediaLibraryTest : getPublicDirectory failed'); @@ -286,7 +288,7 @@ getPublicDirectory(type: DirectoryType): Promise<string> async function example() { let DIR_CAMERA = mediaLibrary.DirectoryType.DIR_CAMERA; const dicResult = await media.getPublicDirectory(DIR_CAMERA); - if (dicResult == 'camera/') { + if (dicResult == 'Camera/') { console.info('MediaLibraryTest : getPublicDirectory'); } else { console.info('MediaLibraryTest : getPublicDirectory failed'); @@ -298,7 +300,7 @@ async function example() { getAlbums(options: MediaFetchOptions, callback: AsyncCallback): void -获取实体相册,使用callback 方式返回结果。 +获取相册列表,使用callback 方式返回结果。 **需要权限**:ohos.permission.READ_MEDIA @@ -308,7 +310,7 @@ getAlbums(options: MediaFetchOptions, callback: AsyncCallback> | 是 | 异步获取Album列表之后的回调 | **示例:** @@ -333,7 +335,7 @@ mediaLibrary.getAlbums(AlbumNoArgsfetchOp, (err, albumList) => { getAlbums(options: MediaFetchOptions): Promise -获取实体相册,使用 promise 方式返回结果。 +获取相册列表,使用 promise 方式返回结果。 **需要权限**:ohos.permission.READ_MEDIA @@ -341,9 +343,9 @@ getAlbums(options: MediaFetchOptions): Promise **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------- | ---------------------------------------- | ---- | ---------------- | -| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体文件获取条件 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ---------------------------------------- | ---- | ------------ | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 相册获取条件 | **返回值:** @@ -384,7 +386,7 @@ release(callback: AsyncCallback<void>): void ``` var media = mediaLibrary.getMediaLibrary(context); -media.release((err, data) => { +media.release((err) => { // do something }); ``` @@ -423,7 +425,7 @@ media.release() | uri | string | 是 | 否 | 文件资源uri(如:dataability:///media/image/2) | | mimeType | string | 是 | 否 | 文件扩展属性 | | mediaType | [MediaType](#mediatype) | 是 | 否 | 媒体类型 | -| displayName | string | 是 | 是 | 显示文件名 | +| displayName | string | 是 | 是 | 显示文件名,包含后缀名 | | title | string | 是 | 是 | 文件标题 | | relativePath | string | 是 | 是 | 相对公共目录路径 | | parent | number | 是 | 否 | 父目录id | @@ -606,7 +608,8 @@ open(mode: string, callback: AsyncCallback<number>): void ``` async function example() { let mediaType = mediaLibrary.MediaType.IMAGE; - let path = "Pictures/"; + let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; + const path = await media.getPublicDirectory(DIR_IMAGE); asset = await media.createAsset(mediaType, "image00003.jpg", path); asset.open('rw', (openError, fd) => { if(fd > 0){ @@ -645,7 +648,8 @@ open(mode: string): Promise<number> ``` async function example() { let mediaType = mediaLibrary.MediaType.IMAGE; - let path = "Pictures/"; + let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; + const path = await media.getPublicDirectory(DIR_IMAGE); asset = await media.createAsset(mediaType, "image00003.jpg", path); asset.open('rw').then((openError, fd) => { if(fd > 0){ @@ -663,7 +667,7 @@ close(fd: number, callback: AsyncCallback<void>): void 关闭当前文件,使用callback方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA('w'模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -704,7 +708,7 @@ close(fd: number): Promise<void> 关闭当前文件,使用promise方式返回异步结果。 -**需要权限**:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA +**需要权限**:ohos.permission.READ_MEDIA('r'模式打开),ohos.permission.WRITE_MEDIA('w'模式打开) **系统能力**:SystemCapability.Multimedia.MediaLibrary.Core @@ -1798,14 +1802,14 @@ async function example() { ## PeerInfo8+ -注册设备信息。 +注册设备的信息。 -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ---------- | ---------- | ---- | ---- | -------------- | -| deviceName | string | 是 | 否 | 注册设备名称 | -| networkId | string | 是 | 否 | 注册设备网络ID | -| deviceType | DeviceType | 是 | 否 | 设备类型 | -| isOnline | boolean | 是 | 否 | 是否在线 | +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ---------- | ---------- | ---- | ---- | ---------------- | +| deviceName | string | 是 | 否 | 注册设备的名称 | +| networkId | string | 是 | 否 | 注册设备的网络ID | +| deviceType | DeviceType | 是 | 否 | 设备类型 | +| isOnline | boolean | 是 | 否 | 是否在线 | -- Gitee From 43f3e6cae420deead331743f02f4622a6524eac4 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 8 Mar 2022 12:16:26 +0800 Subject: [PATCH 220/282] fix code issue Signed-off-by: panqiangbiao --- zh-cn/application-dev/reference/apis/js-apis-medialibrary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 174e11f0893..27d19058671 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -12,7 +12,7 @@ import mediaLibrary from '@ohos.multimedia.medialibrary'; ## mediaLibrary.getMediaLibrary -function getMediaLibrary(context: Context): MediaLibrary +getMediaLibrary(context: Context): MediaLibrary 获取媒体库的实例,用于访问和修改用户的个人数据信息。 -- Gitee From 9a33df38e67191f4e656df1352054dbf9469f49e Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 8 Mar 2022 12:20:56 +0800 Subject: [PATCH 221/282] fix code issue Signed-off-by: panqiangbiao --- .../reference/apis/js-apis-medialibrary.md | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 27d19058671..2057d1e2ad1 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -183,17 +183,19 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string, cal **示例:** ``` -// 使用Callback方式创建Image类型文件 -let mediaType = mediaLibrary.MediaType.IMAGE; -let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; -const path = await media.getPublicDirectory(DIR_IMAGE); -mediaLibrary.createAsset(mediaType, 'imageCallBack.jpg', path + 'myPicture/', (err, fileAsset) => { - if (fileAsset != undefined) { - console.info('createAsset successfully, message = ' + err); - } else { - console.info('createAsset failed, message = ' + err); - } -}); +async function example() { + // 使用Callback方式创建Image类型文件 + let mediaType = mediaLibrary.MediaType.IMAGE; + let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; + const path = await media.getPublicDirectory(DIR_IMAGE); + mediaLibrary.createAsset(mediaType, 'imageCallBack.jpg', path + 'myPicture/', (err, fileAsset) => { + if (fileAsset != undefined) { + console.info('createAsset successfully, message = ' + err); + } else { + console.info('createAsset failed, message = ' + err); + } + }); +} ``` ### createAsset8+ @@ -223,15 +225,17 @@ createAsset(mediaType: MediaType, displayName: string, relativePath: string): Pr **示例:** ``` -// 使用Promise方式创建Image类型文件 -let mediaType = mediaLibrary.MediaType.IMAGE; -let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; -const path = await media.getPublicDirectory(DIR_IMAGE); -mediaLibrary.createAsset(mediaType, "image01.jpg", path + 'myPicture/').then (function (asset) { - console.info("createAsset successfully:"+ JSON.stringify(asset)); -}).catch(function(err){ - console.info("createAsset failed with error:"+ err); -}); +async function example() { + // 使用Promise方式创建Image类型文件 + let mediaType = mediaLibrary.MediaType.IMAGE; + let DIR_IMAGE = mediaLibrary.DirectoryType.DIR_IMAGE; + const path = await media.getPublicDirectory(DIR_IMAGE); + mediaLibrary.createAsset(mediaType, "image01.jpg", path + 'myPicture/').then (function (asset) { + console.info("createAsset successfully:"+ JSON.stringify(asset)); + }).catch(function(err){ + console.info("createAsset failed with error:"+ err); + }); +} ``` ### getPublicDirectory8+ -- Gitee From f0aa53295f4d8c3502bc51d25be92c28d7858a44 Mon Sep 17 00:00:00 2001 From: CY Fan Date: Thu, 3 Mar 2022 16:34:57 +0800 Subject: [PATCH 222/282] add eswap configuration doc Signed-off-by: CY Fan --- zh-cn/device-dev/kernel/Readme-CN.md | 3 + .../kernel-standard-enhanced-features.md | 3 + .../kernel/kernel-standard-mm-eswap.md | 234 ++++++++++++++++++ zh-cn/device-dev/kernel/kernel-standard-mm.md | 3 + zh-cn/device-dev/kernel/kernel-standard.md | 2 + 5 files changed, 245 insertions(+) create mode 100644 zh-cn/device-dev/kernel/kernel-standard-enhanced-features.md create mode 100644 zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md create mode 100644 zh-cn/device-dev/kernel/kernel-standard-mm.md diff --git a/zh-cn/device-dev/kernel/Readme-CN.md b/zh-cn/device-dev/kernel/Readme-CN.md index 69a2a9ca7c6..66f6c859f7d 100755 --- a/zh-cn/device-dev/kernel/Readme-CN.md +++ b/zh-cn/device-dev/kernel/Readme-CN.md @@ -178,3 +178,6 @@ - [Linux内核概述](kernel-standard-overview.md) - [开发板Patch使用指导](kernel-standard-patch.md) - [Linux内核编译与构建指导](kernel-standard-build.md) + - [内核增强特性](kernel-standard-enhanced-features.md) + - [内存管理](kernel-standard-mm.md) + - [Enhanced SWAP特性介绍](kernel-standard-mm-eswap.md) diff --git a/zh-cn/device-dev/kernel/kernel-standard-enhanced-features.md b/zh-cn/device-dev/kernel/kernel-standard-enhanced-features.md new file mode 100644 index 00000000000..348cf8bd681 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-standard-enhanced-features.md @@ -0,0 +1,3 @@ +# 内核增强特性 + +- **[内存管理](kernel-standard-mm.md)** \ No newline at end of file diff --git a/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md b/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md new file mode 100644 index 00000000000..b95a6202433 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md @@ -0,0 +1,234 @@ +# Enhanced SWAP特性介绍 + + +## 基本概念 + +ESwap(Enhanced Swap)提供了自定义新增存储分区作为内存交换分区的能力,并创建了一个常驻进程zswapd将压缩后的匿名页加密换出到ESwap存储分区,从而能完全的空出一块可用内存,以此来达到维持Memavailable水线的目标。同时,配合这个回收机制,在整个内存框架上进行改进,优化匿名页和文件页的回收效率,并且使两者的回收比例更加合理以避免过度回收导致的refault问题造成卡顿现象。 + + +## ZRAM与ESwap配置指导 + +### 使能ESwap +1. 打开相关配置项及依赖 + + 启用ESwap,需要通过编译内核时打开相应的配置项及依赖,ESwap相关CONFIG如下: + + ``` + CONFIG_HYPERHOLD=y + CONFIG_HYPERHOLD_DEBUG=y + CONFIG_HYPERHOLD_ZSWAPD=y + CONFIG_HYPERHOLD_FILE_LRU=y + CONFIG_HYPERHOLD_MEMCG=y + CONFIG_ZRAM_GROUP=y + CONFIG_ZRAM_GROUP_DEBUG=y + CONFIG_ZLIST_DEBUG=y + CONFIG_ZRAM_GROUP_WRITEBACK=y + ``` + + 另有部分CONFIG被依赖: + + ``` + CONFIG_MEMCG=y + CONFIG_SWAP=y + CONFIG_ZSMALLOC=y + CONFIG_ZRAM=y + ``` + +2. 创建ESwap设备 + + 可以使用任意block设备作为ESwap交换设备,这里创建一个文件hpdisk挂载为loop6设备: + + ```Bash + // 通过dd命令创建一个文件hpdisk用于ESwap换出,具体大小需根据产品及需求调整,此处设置为512MB。 + dd if=/dev/random of=/data/hpdisk bs=4096 count=131072 + // 将上一步创建的hpdisk与ESwap device进行绑定。 + losetup /dev/block/loop6 hpdisk + ``` + +3. 配置ESwap + + 将2中创建的设备绑定为ESwap换出设备: + + ```Bash + echo /dev/block/loop6 > /proc/sys/kernel/hyperhold/device + ``` + + ESwap默认对换出数据使用软件加密,如果1中创建的ESwap设备支持inline加密,可以关闭ESwap的软件加密功能: + + ```Bash + // 需确认是否支持并开启硬加密,否则不要执行该操作。 + echo 0 > /proc/sys/kernel/hyperhold/soft_crypt + ``` + + > ![icon-caution.gif](public_sys-resources/icon-caution.gif) **注意:** + > 出于安全考虑,所有换出内容均需加密。因此若当前配置ESwap的设备不支持inline加密,或编译时未打开inline加密宏,则在关闭软加密时,ESwap无法enable。 + +4. 使能ESwap + + 使能ESwap,使能后无法更改上述配置: + + ```Bash + echo enable > /proc/sys/kernel/hyperhold/enable + ``` + + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 使能ESwap需要在使能ZRAM之前,不需要使用ESwap时, 也可以仅使能ZRAM。如部分设备不包括用于换出的存储设备,也没有新建相应的存储分区,那么可以仅使能ZRAM来通过zswapd进行内存回收。 + +### 使能ZRAM + +1. 初始化ZRAM + + ```Bash + // 打开ZRAM到eswap的换入换出功能,该步骤必须要在配置ZRAM大小之前。 + echo readwrite > /sys/block/zram0/group + // 配置ZRAM的大小,具体大小需根据产品及需求调整,此处设置为512MB。 + echo 512M > /sys/block/zram0/disksize + ``` + + > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** + > /sys/block/zram0/group可接受参数及作用为: + > + > - none:表示disable; + > - readonly:表示只记录数据的cgroup信息,并不换出; + > - readwrite:表示打开ZRAM到eswap的换入换出功能。 + +2. 使能ZRAM + + ```Bash + mkswap /dev/block/zram0 + swapon /dev/block/zram0 + ``` + + +### 关闭ESwap与ZRAM + +1. 关闭ESwap + + ```Bash + echo disable > /proc/sys/kernel/hyperhold/enable + 或 + echo force_disable > /proc/sys/kernel/hyperhold/enable + ``` + + > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** + > 两者的区别在于: + > + > - disable:表示如果ESwap中没有数据,则完全关闭,否则变为只读模式; + > - force_disable:表示如果没有数据,完全关闭,否则变为只读模式,并同步等待ESwap中数据完全读出,然后完全关闭。 + +2. 关闭ZRAM及ZRAM group + + ```Bash + echo 1 > /sys/block/zram0/reset + ``` + + +## ESwap相关接口 + +ESwap提供了一些接口用于控制换入换出策略以及记录当前状态,这些接口位于memcg所挂载的目录当中,如`/dev/memcg/`。 + +| 功能分类 | 接口名 | 描述 | +| -------- | -------- | -------- | +| 控制接口 | [avail_buffers](#avail_buffers) | 设置buffer区间 | +| | [zswapd_single_memcg_param](#zswapd_single_memcg_param) | 设置当前memcg相关配置 | +| | [zswapd_wm_ratio](#zswapd_wm_ratio) | 设置zram换出水线 | +| 状态接口 | [zswapd_pressure_show](#zswapd_pressure_show) | 记录当前buffer以及refault | +| | [stat](#stat) | 检测ESwap实时情况 | +| | [zswapd_vmstat_show](#zswapd_vmstat_show) | 记录zswapd运行过程中各种事件 | + +> ![icon-caution.gif](public_sys-resources/icon-caution.gif) **注意:** +> 除avail_buffers会因为调整了buffer水线而会主动去唤醒zswapd外,其余控制接口并不会主动唤醒zswapd,只是其配置需在zswapd所被唤醒后方可生效。 + +各接口的具体描述如下: + +### avail_buffers + +avail_buffers接口用于设置buffer区间[min_avail_buffers, high_avail_buffers],当检测到当前的buffer低于min_avail_buffers时则会唤醒zswapd进行匿名页回收,期望的回收量为high_avail_buffers与当前系统buffer值的差值,实际可能会因为无法回收等原因而未回收那么多内存。avail_buffers为期望的内存正常状态buffer值,free_swap_threshold则是设置交换分区空闲容量的阈值,当zswapd唤醒并进行内存回收之后,会根据当前系统情况以及两者的设置记录当前内存压力事件,如medium press,critical press等。可主动调整来触发zswapd回收,如`echo 1000 950 1050 0 > /dev/memcg/memory.avail_buffers`。 + +默认值: + +``` + avail_buffers: 0 + min_avail_buffers: 0 + high_avail_buffers: 0 + free_swap_threshold: 0 +``` + +限制: + +0<=min_avail_buffers<=avail_buffers<=high_avail_buffers + +0<=free_swap_threashold + +取值均为整型。 + +### zswapd_single_memcg_param + +设置当前memcg的相关配置。score为当前memcg回收优先级,ub_mem2zram_ratio为内存压缩到ZRAM的比率,ub_zram2ufs_ratio为ZRAM换出到ESwap的比率,refault_threshold为refault的阈值,可通过调整比率来控制ZRAM压缩以及ESwap换出情况,如`echo 60 10 50 > memory.zswapd_single_memcg_param`。 + +默认值: + +``` + memcg score: 300 + memcg ub_mem2zram_ratio: 60 + memcg ub_zram2ufs_ratio: 10 + memcg refault_threshold: 50 +``` + +限制: + +0<=ub_mem2zram_ratio<=100 + +0<=ub_zram2ufs_ratio<=100 + +0<=refault_threshold<=100 + +取值均为整型。 + +### zram_wm_ratio + +设置ZRAM换出水线,即当当前ZRAM中压缩的匿名页大于ZRAM总大小*zram_wm_ratio时,会开始向ESwap进行换出,但是具体换出时间为zswapd因buffer水线而唤醒之后。设置为0时系统默认为37,可进行调整,如`echo 30 > /dev/memcg/memory.zram_wm_ratio`。 + +默认值: + +``` + zram_wm_ratio: 0 +``` + +限制: + +0<=zram_wm_ratio<=100 + +取值为整型。 + +### zswapd_pressure_show + +记录当前zswapd所需相关状态,buffer_size为当前系统的buffer值,recent_refault为最近产生的refault次数。 + + +### stat + +在原有memcg.stat的基础上新增了Anon,File,zram,Eswap等项,用以监测ESwap的实时情况。 + + +### zswapd_vmstat_show + +记录zswapd运行过程中的各种事件。 + + +## 触发zswapd回收 + +可先通过`cat /dev/memcg/memory.zswapd_pressure_show`查看当前buffer值,比如当前为1200,那么便可通过主动调整buffer区间,来主动唤醒zswapd。 + +```Bash +echo 1300 1250 1350 0 > /dev/memcg/memory.avail_buffers +``` + + +## ESwap配置大小示例 + +ZRAM与ESwap的大小配置需根据实际使用场景以及产品硬件特点进行适配。目前在rk3568板子上使用时,其ram为2G,因此设置的ZRAM与ESwap大小均为512MB。 + + + diff --git a/zh-cn/device-dev/kernel/kernel-standard-mm.md b/zh-cn/device-dev/kernel/kernel-standard-mm.md new file mode 100644 index 00000000000..2c54cc79301 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-standard-mm.md @@ -0,0 +1,3 @@ +# 内存管理 + +- **[Enhanced SWAP特性介绍](kernel-standard-mm-eswap.md)** \ No newline at end of file diff --git a/zh-cn/device-dev/kernel/kernel-standard.md b/zh-cn/device-dev/kernel/kernel-standard.md index d642451274a..73034025e7f 100644 --- a/zh-cn/device-dev/kernel/kernel-standard.md +++ b/zh-cn/device-dev/kernel/kernel-standard.md @@ -7,3 +7,5 @@ - **[Linux内核编译与构建指导](kernel-standard-build.md)** +- **[内核增强特性](kernel-standard-enhanced-features.md)** + -- Gitee From 0d2b74d74b5a60bf440b61a134ca5ad6e0810451 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 8 Mar 2022 15:47:02 +0800 Subject: [PATCH 223/282] update docs Signed-off-by: shawn_he --- .../reference/apis/js-apis-i18n.md | 3609 +++++------------ .../reference/apis/js-apis-intl.md | 2587 +++--------- 2 files changed, 1734 insertions(+), 4462 deletions(-) diff --git a/en/application-dev/reference/apis/js-apis-i18n.md b/en/application-dev/reference/apis/js-apis-i18n.md index 27dc8eb464f..7a604fdd852 100644 --- a/en/application-dev/reference/apis/js-apis-i18n.md +++ b/en/application-dev/reference/apis/js-apis-i18n.md @@ -1,2665 +1,1252 @@ -# Internationalization \(i18n\)
+# Internationalization – i18n ->![](public_sys-resources/icon-note.gif) **NOTE:** ->- The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. ->- This module contains enhanced i18n APIs, which are not defined in ECMA 402. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> - The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> +> - This module contains enhanced i18n APIs, which are not defined in ECMA 402. -## Modules to Import + +## Modules to Import ``` import i18n from '@ohos.i18n'; ``` -## Required Permissions - -None -## i18n.getDisplayLanguage +## i18n.getDisplayLanguage -getDisplayLanguage\(language: string, locale: string, sentenceCase?: boolean\): string +getDisplayLanguage(language: string, locale: string, sentenceCase?: boolean): string Obtains the localized script for the specified language. -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

language

-

string

-

Yes

-

Specified language.

-

locale

-

string

-

Yes

-

Locale ID.

-

sentenceCase

-

boolean

-

No

-

Whether to use sentence case for the localized script.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Localized script for the specified language.

-
- -- Example - - ``` - I18n.getDisplayLanguage("zh", "en-GB", true); - I18n.getDisplayLanguage("zh", "en-GB"); - ``` - - -## i18n.getDisplayCountry - -getDisplayCountry\(country: string, locale: string, sentenceCase?: boolean\): string +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | language | string | Yes| Specified language.| + | locale | string | Yes| Locale ID.| + | sentenceCase | boolean | No| Whether to use sentence case for the localized script.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Localized script for the specified language.| + +- Example + ``` + i18n.getDisplayLanguage("zh", "en-GB", true); + i18n.getDisplayLanguage("zh", "en-GB"); + ``` + + +## i18n.getDisplayCountry + +getDisplayCountry(country: string, locale: string, sentenceCase?: boolean): string Obtains the localized script for the specified country. -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

country

-

string

-

Yes

-

Specified country.

-

locale

-

string

-

Yes

-

Locale ID.

-

sentenceCase

-

boolean

-

No

-

Whether to use sentence case for the localized script.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Localized script for the specified country.

-
- -- Example - - ``` - I18n.getDisplayCountry("zh-CN", "en-GB", true); - I18n.getDisplayCountry("zh-CN", "en-GB"); - ``` - - -## i18n.isRTL8+ - -isRTL\(locale: string\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | country | string | Yes| Specified country.| + | locale | string | Yes| Locale ID.| + | sentenceCase | boolean | No| Whether to use sentence case for the localized script.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Localized script for the specified country.| + +- Example + ``` + i18n.getDisplayCountry("zh-CN", "en-GB", true); + i18n.getDisplayCountry("zh-CN", "en-GB"); + ``` + + +## i18n.isRTL8+ + +isRTL(locale: string): boolean Checks whether the localized script for the specified language is displayed from right to left. -- Parameters - - - - - - - - - - - - -

Name

-

Type

-

Description

-

locale

-

string

-

Locale ID.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the localized script is displayed from right to left, and value false indicates the opposite.

-
- -- Example - - ``` - i18n.isRTL("zh-CN");// Since Chinese is not written from right to left, false is returned. - i18n.isRTL("ar-EG");// Since Arabic is written from right to left, true is returned. - ``` - - -## i18n.getSystemLanguage - -getSystemLanguage\(\): string +**System capability**: SystemCapability.Global.I18n -Obtains the system language. +- Parameters + | Name| Type| Description| + | -------- | -------- | -------- | + | locale | string | Locale ID.| -- Return values +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the localized script is displayed from right to left, and value **false** indicates the opposite.| - - - - - - - - - -

Type

-

Description

-

string

-

System language ID.

-
+- Example + ``` + i18n.isRTL("zh-CN");// Since Chinese is not written from right to left, false is returned. + i18n.isRTL("ar-EG");// Since Arabic is written from right to left, true is returned. + ``` -- Example - ``` - I18n.getSystemLanguage(); - ``` +## i18n.getSystemLanguage +getSystemLanguage(): string -## i18n.getSystemRegion +Obtains the system language. -getSystemRegion\(\): string +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | string | System language ID.| + +- Example + ``` + i18n.getSystemLanguage(); + ``` -Obtains the system region. -- Return values +## i18n.getSystemRegion - - - - - - - - - -

Type

-

Description

-

string

-

System region ID.

-
+getSystemRegion(): string -- Example +Obtains the system region. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | string | System region ID.| - ``` - I18n.getSystemRegion(); - ``` +- Example + ``` + i18n.getSystemRegion(); + ``` -## i18n.getSystemLocale +## i18n.getSystemLocale -getSystemLocale\(\): string +getSystemLocale(): string Obtains the system locale. -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

System locale ID.

-
- -- Example - - ``` - I18n.getSystemLocale(); - ``` - - -## i18n.getCalendar8+ - -getCalendar\(locale: string, type? : string\): Calendar - -Obtains a **Calendar** object. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

Yes

-

Valid locale value, for example, zh-Hans-CN.

-

type

-

string

-

No

-

Valid calendar type. Currently, the valid types are as follows: buddhist, chinese, coptic, ethiopic, hebrew, gregory, indian, islamic_civil, islamic_tbla, islamic_umalqura, japanese, and persian. If this parameter is left unspecified, the default calendar type of the specified locale is used.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Calendar

-

Calendar object.

-
- -- Example - - ``` - I18n.getCalendar("zh-Hans", "gregory"); - ``` - - -## Calendar8+ - -### setTime8+ - -setTime\(date: Date\): void - -Sets the date for this **Calendar** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

date

-

Date

-

Yes

-

Date to be set for the Calendar object.

-
- - -- Example - - ``` - var calendar = I18n.getCalendar("en-US", "gregory"); - var date = new Date(2021, 10, 7, 8, 0, 0, 0); - calendar.setTime(date); - ``` - - -### setTime8+ - -setTime\(time: number\): void - -Sets the date and time for this **Calendar** object. The value is represented by the number of milliseconds that have elapsed since the Unix epoch \(00:00:00 UTC on January 1, 1970\). - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

time

-

number

-

Yes

-

Number of milliseconds that have elapsed since the Unix epoch.

-
- - -- Example - - ``` - var calendar = I18n.getCalendar("en-US", "gregory"); - calendar.setTime(10540800000); - ``` - - -### set8+ - -set\(year: number, month: number, date:number, hour?: number, minute?: number, second?: number\): void - -Sets the year, month, day, hour, minute, and second for this **Calendar** object. - -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

year

-

number

-

Yes

-

Year to set.

-

month

-

number

-

Yes

-

Month to set.

-

date

-

number

-

Yes

-

Day to set.

-

hour

-

number

-

No

-

Hour to set.

-

minute

-

number

-

No

-

Minute to set.

-

second

-

number

-

No

-

Second to set.

-
- -- Example - - ``` - var calendar = I18n.getCalendar("zh-Hans"); - calendar.setTime(2021, 10, 1, 8, 0, 0); // set time to 2021.10.1 08:00:00 - ``` - - -### setTimeZone8+ - -setTimeZone\(timezone: string\): void - -Sets the time zone of this **Calendar** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

timezone

-

string

-

Yes

-

Time zone, for example, Asia/Shanghai.

-
- -- Example - - ``` - var calendar = I18n.getCalendar("zh-Hans"); - calendar.setTimeZone("Asia/Shanghai"); - ``` - - -### getTimeZone8+ - -getTimeZone\(\): string - -Obtains the time zone of this **Calendar** object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Time zone of the Calendar object.

-
- -- Example - - ``` - var calendar = I18n.getCalendar("zh-Hans"); - calendar.setTimeZone("Asia/Shanghai"); - calendar.getTimeZone(); // Asia/Shanghai" - ``` - - -### getFirstDayOfWeek8+ - -getFirstDayOfWeek\(\): number - -Obtains the start day of a week for this **Calendar** object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Start day of a week. The value 1 indicates Sunday, and value 7 indicates Saturday.

-
+**System capability**: SystemCapability.Global.I18n +- Return value + | Type| Description| + | -------- | -------- | + | string | System locale ID.| -- Example - - ``` - var calendar = I18n.getCalendar("en-US", "gregory"); - calendar.getFirstDayOfWeek(); - ``` - - -### setFirstDayOfWeek8+ - -setFirstDayOfWeek\(value: number\): void - -Sets the start day of a week for this **Calendar** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

value

-

number

-

No

-

Start day of a week. The value 1 indicates Sunday, and value 7 indicates Saturday.

-
+- Example + ``` + i18n.getSystemLocale(); + ``` -- Example - ``` - var calendar = I18n.getCalendar("zh-Hans"); - calendar.setFirstDayOfWeek(0); - ``` +## i18n.getCalendar8+ +getCalendar(locale: string, type? : string): Calendar -### getMinimalDaysInFirstWeek8+ +Obtains a **Calendar** object. -getMinimalDaysInFirstWeek\(\): number +**System capability**: SystemCapability.Global.I18n -Obtains the minimum number of days in the first week of a year. +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string | Yes| Valid locale value, for example, **zh-Hans-CN**.| + | type | string | No| Valid calendar type. Currently, the valid types are as follows: buddhist, chinese, coptic, ethiopic, hebrew, gregory, indian, islamic\_civil, islamic\_tbla, islamic\_umalqura, japanese, and persian. If this parameter is left unspecified, the default calendar type of the specified locale is used.| + +- Return value + | Type| Description| + | -------- | -------- | + | [Calendar](#calendar8) | **Calendar** object.| + +- Example + ``` + i18n.getCalendar("zh-Hans", "gregory"); + ``` + + +## Calendar8+ + + +### setTime8+ + +setTime(date: Date): void + +Sets the date for this **Calendar** object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | date | Date | Yes| Date to be set for the **Calendar** object.| + +- Example + ``` + var calendar = I18n.getCalendar("en-US", "gregory"); + var date = new Date(2021, 10, 7, 8, 0, 0, 0); + calendar.setTime(date); + ``` + + +### setTime8+ + +setTime(time: number): void + +Sets the date and time for this **Calendar** object. The value is represented by the number of milliseconds that have elapsed since the Unix epoch (00:00:00 UTC on January 1, 1970). + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | time | number | Yes| Number of milliseconds that have elapsed since the Unix epoch.| + +- Example + ``` + var calendar = I18n.getCalendar("en-US", "gregory"); + calendar.setTime(10540800000); + ``` + + +### set8+ + +set(year: number, month: number, date:number, hour?: number, minute?: number, second?: number): void + +Sets the year, month, day, hour, minute, and second for this **Calendar** object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | year | number | Yes| Year to set.| + | month | number | Yes| Month to set.| + | date | number | Yes| Day to set.| + | hour | number | No| Hour to set.| + | minute | number | No| Minute to set.| + | second | number | No| Second to set.| + +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.setTime(2021, 10, 1, 8, 0, 0); // set time to 2021.10.1 08:00:00 + ``` + + +### setTimeZone8+ + +setTimeZone(timezone: string): void + +Sets the time zone of this **Calendar** object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | timezone | string | Yes| Time zone, for example, **Asia/Shanghai**.| + +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.setTimeZone("Asia/Shanghai"); + ``` + + +### getTimeZone8+ + +getTimeZone(): string + +Obtains the time zone of this **Calendar** object. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | string | Time zone of the **Calendar** object.| + +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.setTimeZone("Asia/Shanghai"); + calendar.getTimeZone(); // Asia/Shanghai" + ``` + + +### getFirstDayOfWeek8+ + +getFirstDayOfWeek(): number + +Obtains the start day of a week for this **Calendar** object. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | number | Start day of a week. The value **1** indicates Sunday, and value **7** indicates Saturday.| + +- Example + ``` + var calendar = I18n.getCalendar("en-US", "gregory"); + calendar.getFirstDayOfWeek(); + ``` + + +### setFirstDayOfWeek8+ + +setFirstDayOfWeek(value: number): void + +Sets the start day of a week for this **Calendar** object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | value | number | No| Start day of a week. The value **1** indicates Sunday, and value **7** indicates Saturday.| -- Return values +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.setFirstDayOfWeek(0); + ``` - - - - - - - - - -

Type

-

Description

-

number

-

Minimum number of days in the first week of a year.

-
-- Example +### getMinimalDaysInFirstWeek8+ - ``` - var calendar = I18n.getCalendar("zh-Hans"); - calendar.getMinimalDaysInFirstWeek(); - ``` +getMinimalDaysInFirstWeek(): number + +Obtains the minimum number of days in the first week of a year. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | number | Minimum number of days in the first week of a year.| + +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.getMinimalDaysInFirstWeek(); + ``` -### setMinimalDaysInFirstWeek8+ +### setMinimalDaysInFirstWeek8+ -setMinimalDaysInFirstWeek\(value: number\): void +setMinimalDaysInFirstWeek(value: number): void Sets the minimum number of days in the first week of a year. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

value

-

number

-

No

-

Minimum number of days in the first week of a year.

-
- -- Example - - ``` - var calendar = i18n.getCalendar("zh-Hans"); - calendar.setMinimalDaysInFirstWeek(3); - ``` - - -### get8+ - -get\(field: string\): number - -Obtains the value of the specified field in the **Calendar** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

field

-

string

-

Yes

-

Value of the specified field in the Calendar object. Currently, the valid fields are as follows: era, year, month, week_of_year, week_of_month, date, day_of_year, day_of_week, day_of_week_in_month, hour, hour_of_day, minute, second, millisecond, zone_offset, dst_offset, year_woy, dow_local, extended_year, julian_day, milliseconds_in_day, and is_leap_month.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Value of the specified field. For example, if the year in the internal date of this Calendar object is 1990, the get("year") function will return 1990.

-
- -- Example - - ``` - var calendar = I18n.getCalendar("zh-Hans"); - calendar.setTime(2021, 10, 1, 8, 0, 0); // set time to 2021.10.1 08:00:00 - calendar.get("hour_of_day"); // 8 - ``` - - -### getDisplayName8+ - -getDisplayName\(locale: string\): string - -Obtains the name of the **Calendar** object displayed for the specified locale. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

Yes

-

Locale for which the name of the Calendar object is displayed. For example, if locale is en-US, the name of the Buddhist calendar will be Buddhist Calendar.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Name of the Calendar object displayed for the specified locale.

-
- -- Example - - ``` - var calendar = I18n.getCalendar("en-US", "buddhist"); - calendar.getDisplayName("zh"); // Obtain the name of the Buddhist calendar in zh. - ``` - - -### isWeekend8+ - -isWeekend\(date?: Date\): boolean - -Checks whether the specified date in this **Calendar** object is a weekend. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

date

-

Date

-

No

-

Specified date in this Calendar object. If this parameter is left unspecified, the system checks whether the current date in the Calendar object is a weekend.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the date is a weekend, and value false indicates a weekday.

-
- -- Example - - ``` - var calendar = I18n.getCalendar("zh-Hans"); - calendar.setTime(2021, 11, 11, 8, 0, 0); // Set the time to 2021.11.11 08:00:00. - calendar.isWeekend(); // false - var date = new Date(2011, 11, 6, 9, 0, 0); - calendar.isWeekend(date); // true - ``` - - -## PhoneNumberFormat8+ - -### constructor8+ - -constructor\(country: string, options?: PhoneNumberFormatOptions\) - -Creates a **PhoneNumberFormat** object. +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | value | number | No| Minimum number of days in the first week of a year.| + +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.setMinimalDaysInFirstWeek(3); + ``` + + +### get8+ + +get(field: string): number + +Obtains the value of the specified field in the **Calendar** object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | field | string | Yes| Value of the specified field in the **Calendar** object. Currently, a valid field can be any of the following: era, year, month, week\_of\_year, week\_of\_month, date, day\_of\_year, day\_of\_week, day\_of\_week\_in\_month, hour, hour\_of\_day, minute, second, millisecond, zone\_offset, dst\_offset, year\_woy, dow\_local, extended\_year, julian\_day, milliseconds\_in\_day, is\_leap\_month.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Value of the specified field. For example, if the year in the internal date of this **Calendar** object is **1990**, the **get("year")** function will return **1990**.| + +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.setTime(2021, 10, 1, 8, 0, 0); // set time to 2021.10.1 08:00:00 + calendar.get("hour_of_day"); // 8 + ``` + + +### getDisplayName8+ + +getDisplayName(locale: string): string + +Obtains the name of the **Calendar** object displayed for the specified locale. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string | Yes| Locale for which the name of the **Calendar** object is displayed. For example, if **locale** is **en-US**, the name of the Buddhist calendar will be **Buddhist Calendar**.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Name of the **Calendar** object displayed for the specified locale.| + +- Example + ``` + var calendar = i18n.getCalendar("en-US", "buddhist"); + calendar.getDisplayName("zh"); // Obtain the name of the Buddhist calendar in zh. + ``` + + +### isWeekend8+ + +isWeekend(date?: Date): boolean + +Checks whether the specified date in this **Calendar** object is a weekend. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | date | Date | No| Specified date in this **Calendar** object. If this parameter is left unspecified, the system checks whether the current date in the **Calendar** object is a weekend.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the date is a weekend, and value **false** indicates a weekday.| + +- Example + ``` + var calendar = i18n.getCalendar("zh-Hans"); + calendar.setTime(2021, 11, 11, 8, 0, 0); // set time to 2021.11.11 08:00:00 + calendar.isWeekend(); // false + var date = new Date(2011, 11, 6, 9, 0, 0); + calendar.isWeekend(date); // true + ``` + + +## PhoneNumberFormat8+ + + +### constructor8+ + +constructor(country: string, options?: PhoneNumberFormatOptions) + +Creates a **PhoneNumberFormat** object. + +**System capability**: SystemCapability.Global.I18n Parameters +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| country | string | Yes| Country or region to which the phone number to be formatted belongs.| +| options | [PhoneNumberFormatOptions](#phonenumberformatoptions8) | No| Options of the **PhoneNumberFormat** object.| - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

country

-

string

-

Yes

-

Country or region to which the phone number to be formatted belongs.

-

options

-

PhoneNumberFormatOptions

-

No

-

Options of the PhoneNumberFormat object.

-
- -- Example - - ``` - var phoneNumberFormat= new I18n.PhoneNumberFormat("CN", {"type": "E164"}); - ``` - - -### isValidNumber8+ - -isValidNumber\(number: string\): boolean +- Example + ``` + var phoneNumberFormat= new i18n.PhoneNumberFormat("CN", {"type": "E164"}); + ``` + + +### isValidNumber8+ + +isValidNumber(number: string): boolean Checks whether the format of the specified phone number is valid. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

number

-

string

-

Yes

-

Phone number to be checked.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates the phone number format is valid, and value false indicates the opposite.

-
- - -- Example - - ``` - var phonenumberfmt = new I18n.PhoneNumberFormat("CN"); - phonenumberfmt.isValidNumber("15812312312"); - ``` - - -### format8+ - -format\(number: string\): string +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | number | string | Yes| Phone number to be checked.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates the phone number format is valid, and value **false** indicates the opposite.| + +- Example + ``` + var phonenumberfmt = new i18n.PhoneNumberFormat("CN"); + phonenumberfmt.isValidNumber("15812312312"); + ``` + + +### format8+ + +format(number: string): string Formats a phone number. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

number

-

string

-

Yes

-

Phone number to be formatted.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Formatted phone number.

-
- - -- Example - - ``` - var phonenumberfmt = new I18n.PhoneNumberFormat("CN"); - phonenumberfmt.format("15812312312"); - ``` - - -## PhoneNumberFormatOptions8+ - -Defines the options for this **PhoneNumberFormat** object. - - - - - - - - - - - - - - - - -

Name

-

Type

-

Readable

-

Writable

-

Description

-

type

-

string

-

Yes

-

Yes

-

Format type of a phone number. The available options are as follows: E164, INTERNATIONAL, NATIONAL, and RFC3966.

-
- -## UnitInfo8+ +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | number | string | Yes| Phone number to be formatted.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Formatted phone number.| + +- Example + ``` + var phonenumberfmt = new i18n.PhoneNumberFormat("CN"); + phonenumberfmt.format("15812312312"); + ``` + + +## PhoneNumberFormatOptions8+ + +Defines the options for this PhoneNumberFormat object. + + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| type | string | Yes| Yes| Format type of a phone number. The value can be **E164**, **INTERNATIONAL**, **NATIONAL**, or **RFC3966**.
**System capability**: SystemCapability.Global.I18n| + + +## UnitInfo8+ Defines the measurement unit information. - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Readable

-

Writable

-

Description

-

unit

-

string

-

Yes

-

Yes

-

Name of the measurement unit, for example, meter, inch, or cup.

-

measureSystem

-

string

-

Yes

-

Yes

-

Measurement system. The value can be SI, US, or UK.

-
- -## Util8+ - -### unitConvert8+ - -unitConvert\(fromUnit: UnitInfo, toUnit: UnitInfo, value: number, locale: string, style?: string\): string + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| unit | string | Yes| Yes| Name of the measurement unit, for example, **meter**, **inch**, or **cup**.| +| measureSystem | string | Yes| Yes| Measurement system. The value can be **SI**, **US**, or **UK**.
**System capability**: SystemCapability.Global.I18n| + + +## Util8+ + + +### unitConvert8+ + +unitConvert(fromUnit: UnitInfo, toUnit: UnitInfo, value: number, locale: string, style?: string): string Converts one measurement unit into another and formats the unit based on the specified locale and style. -- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

fromUnit

-

UnitInfo

-

Yes

-

Measurement unit to be converted.

-

toUnit

-

UnitInfo

-

Yes

-

Measurement unit to be converted to.

-

value

-

number

-

Yes

-

Value of the measurement unit to be converted.

-

locale

-

string

-

Yes

-

Locale used for formatting, for example, zh-Hans-CN.

-

style

-

string

-

No

-

Style used for formatting. The value can be long, short, or medium.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Character string obtained after formatting based on the measurement unit specified by toUnit.

-
- - -- Example - - ``` - I18n.Util.unitConvert({unit: "cup", measureSystem: "US"}, {unit: "liter", measureSystem: "SI"}, 1000, "en-US", "long"); - ``` - - -## i18n.getInstance8+ - -getInstance\(locale?: string\): IndexUtil - -Creates an **IndexUtil** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

No

-

A string containing locale information, including the language, optional script, and region.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

IndexUtil

-

IndexUtil object mapping to the specified locale.

-
- - -- Example - - ``` - var indexUtil= I18n.getInstance("zh-CN"); - ``` - - -## IndexUtil8+ - -### getIndexList8+ - -getIndexList\(\): Array - -Obtains the index list for this **locale** object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

Array<string>

-

Index list for this locale.

-
- - -- Example - - ``` - var indexUtil = i18n.getInstance("zh-CN"); - var indexList = indexUtil.getIndexList(); - ``` - - -### addLocale8+ - -addLocale\(locale: string\) - -Adds the index of the new **locale** object to the index list. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

Yes

-

A string containing locale information, including the language, optional script, and region.

-
- - -- Example - - ``` - var indexUtil = i18n.getInstance("zh-CN"); - indexUtil.addLocale("en-US"); - ``` - - -### getIndex8+ - -getIndex\(text: string\): string - -Obtains the index of a **text** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

text

-

string

-

Yes

-

text object whose index is to be obtained.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Index of the text object.

-
- - -- Example - - ``` - var indexUtil= i18n.getInstance("zh-CN"); - indexUtil.getIndex("hi"); // Return h. - ``` - - -## Character8+ - -### isDigit8+ - -isDigit\(char: string\): boolean - -Checks whether the input character is a digit. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is a digit, and value false indicates the opposite.

-
- - -- Example - - ``` - var isdigit = Character.isDigit("1"); // Return true. - ``` - - -### isSpaceChar8+ - -isSpaceChar\(char: string\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | fromUnit | [UnitInfo](#unitinfo8) | Yes| Measurement unit to be converted.| + | toUnit | [UnitInfo](#unitinfo8) | Yes| Measurement unit to be converted to.| + | value | number | Yes| Value of the measurement unit to be converted.| + | locale | string | Yes| Locale used for formatting, for example, **zh-Hans-CN**.| + | style | string | No| Style used for formatting. The value can be **long**, **short**, or **medium**.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Character string obtained after formatting based on the measurement unit specified by **toUnit**.| + +- Example + ``` + I18n.Util.unitConvert({unit: "cup", measureSystem: "US"}, {unit: "liter", measureSystem: "SI"}, 1000, "en-US", "long"); + ``` + + +## IndexUtil8+ + + +### getInstance8+ + +getInstance(): IndexUtil + +Creates an **IndexUtil** object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string | No| A string containing locale information, including the language, optional script, and region.| + +- Return value + | Type| Description| + | -------- | -------- | + | [IndexUtil](#indexutil8) | **IndexUtil** object mapping to the specified locale.| + +- Example + ``` + var indexUtil= i18n.IndexUtil.getInstance("zh-CN"); + ``` + + +### getIndexList8+ + +getIndexList(): Array<string> + +Obtains the index list for this **locale** object. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | Array<string> | Index list for this **locale** object.| + +- Example + ``` + var indexUtil = i18n.getInstance("zh-CN"); + var indexList = indexUtil.getIndexList(); + ``` + + +### addLocale8+ + +addLocale(locale: string) + +Adds the index of the new **locale** object to the index list. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string | Yes| A string containing locale information, including the language, optional script, and region.| + +- Example + ``` + var indexUtil = i18n.getInstance("zh-CN"); + indexUtil.addLocale("en-US"); + ``` + + +### getIndex8+ + +getIndex(text: string): string + +Obtains the index of a text object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | text | string | Yes| **text** object whose index is to be obtained.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Index of the **text** object.| + +- Example + ``` + var indexUtil= i18n.getInstance("zh-CN"); + indexUtil.getIndex("hi"); // Return h. + ``` + + +## Character8+ + + +### isDigit8+ + +isDigit(char: string): boolean + +Checks whether the input character string is composed of digits. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the input character is a digit, and value **false** indicates the opposite.| + +- Example + ``` + var isdigit = Character.isDigit("1"); // Return true. + ``` + + +### isSpaceChar8+ + +isSpaceChar(char: string): boolean Checks whether the input character is a space. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is a space, and value false indicates the opposite.

-
- - -- Example - - ``` - var isspacechar = Character.isSpaceChar("a"); // Return false. - ``` - - -### isWhitespace8+ - -isWhitespace\(char: string\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the input character is a space, and value **false** indicates the opposite.| + +- Example + ``` + var isspacechar = Character.isSpaceChar("a"); // Return false. + ``` + + +### isWhitespace8+ + +isWhitespace(char: string): boolean Checks whether the input character is a white space. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is a white space, and value false indicates the opposite.

-
- - -- Example - - ``` - var iswhitespace = Character.isWhitespace("a"); // Return false. - ``` - - -### isRTL8+ - -isRTL\(char: string\): boolean - -Checks whether the input character is of the right to left \(RTL\) language. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is of the RTL language, and value false indicates the opposite.

-
- - -- Example - - ``` - var isrtl = Character.isRTL("a"); // Return false. - ``` - - -### isIdeograph8+ - -isIdeograph\(char: string\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the input character is a white space, and value **false** indicates the opposite.| + +- Example + ``` + var iswhitespace = Character.isWhitespace("a"); // Return false. + ``` + + +### isRTL8+ + +isRTL(char: string): boolean + +Checks whether the input character is of the right to left (RTL) language. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the input character is of the RTL language, and value **false** indicates the opposite.| + +- Example + ``` + var isrtl = Character.isRTL("a"); // Return false. + ``` + + +### isIdeograph8+ + +isIdeograph(char: string): boolean Checks whether the input character is an ideographic character. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is an ideographic character, and value false indicates the opposite.

-
- - -- Example - - ``` - var isideograph = Character.isIdeograph("a"); // Return false. - ``` - - -### isLetter8+ - -isLetter\(char: string\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the input character is an ideographic character, and value **false** indicates the opposite.| + +- Example + ``` + var isideograph = Character.isIdeograph("a"); // Return false. + ``` + + +### isLetter8+ + +isLetter(char: string): boolean Checks whether the input character is a letter. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is a letter, and value false indicates the opposite.

-
- - -- Example - - ``` - var isletter = Character.isLetter("a"); // Return true. - ``` - - -### isLowerCase8+ - -isLowerCase\(char: string\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the input character is a letter, and value **false** indicates the opposite.| + +- Example + ``` + var isletter = Character.isLetter("a"); // Return true. + ``` + + +### isLowerCase8+ + +isLowerCase(char: string): boolean Checks whether the input character is a lowercase letter. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is a lowercase letter, and value false indicates the opposite.

-
- - -- Example - - ``` - var islowercase = Character.isLowerCase("a"); // Return true. - ``` - - -### isUpperCase8+ - -isUpperCase\(char: string\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the input character is a lowercase letter, and value **false** indicates the opposite.| + +- Example + ``` + var islowercase = Character.isLowerCase("a"); // Return true. + ``` + + +### isUpperCase8+ + +isUpperCase(char: string): boolean Checks whether the input character is an uppercase letter. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the input character is an uppercase letter, and value false indicates the opposite.

-
- - -- Example - - ``` - var isuppercase = Character.isUpperCase("a"); // Return false. - ``` - - -### getType8+ - -getType\(char: string\): string +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value true indicates that the input character is an uppercase letter, and value false indicates the opposite.| + +- Example + ``` + var isuppercase = Character.isUpperCase("a"); // Return false. + ``` + + +### getType8+ + +getType(char: string): string Obtains the type of the input character string. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

char

-

string

-

Yes

-

Input character.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Type of the input character.

-
- - -- Example - - ``` - var type = Character.getType("a"); - ``` - - -## i18n.getLineInstance8+ - -getLineInstance\(locale: string\): BreakIterator - -Obtains a [BreakIterator](#section1312302611613) object for text segmentation. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

Yes

-

Valid locale value, for example, zh-Hans-CN. The BreakIterator object segments text according to the rules of the specified locale.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

BreakIterator

-

Break iterator used for text segmentation.

-
- -- Example - - ``` - I18n.getLineInstance("en"); - ``` - - -## BreakIterator8+ - -### setLineBreakText8+ - -setLineBreakText\(text: string\): void - -Sets the text to be processed by the [BreakIterator](#section1312302611613) object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

text

-

string

-

Yes

-

Text to be processed by the BreakIterator object.

-
- +**System capability**: SystemCapability.Global.I18n -- Example +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | char | string | Yes| Input character.| - ``` - var iterator = I18n.getLineInstance("en"); - var iterator.setLineBreakText("Apple is my favorite fruit."); - ``` - - -### getLineBreakText8+ +- Return value + | Type| Description| + | -------- | -------- | + | string | Type of the input character.| -getLineBreakText\(\): string - -Obtains the text being processed by the [BreakIterator](#section1312302611613) object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Text being processed by the BreakIterator object.

-
- - -- Example +- Example + ``` + var type = Character.getType("a"); + ``` - ``` - var iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - iterator.getLineBreakText(); // Apple is my favorite fruit. - ``` +## i18n.getLineInstance8+ -### current8+ +getLineInstance(locale: string): BreakIterator -current\(\): number +Obtains a [BreakIterator](#breakiterator8) object for text segmentation. -Obtains the position of the [BreakIterator](#section1312302611613) object in the text being processed. +**System capability**: SystemCapability.Global.I18n -- Return values +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string | Yes| Valid locale value, for example, **zh-Hans-CN**. The [BreakIterator](#breakiterator8) object segments text according to the rules of the specified locale.| - - - - - - - - - -

Type

-

Description

-

number

-

Position of the BreakIterator object in the text being processed.

-
+- Return value + | Type| Description| + | -------- | -------- | + | [BreakIterator](#breakiterator8) | [BreakIterator](#breakiterator8) object used for text segmentation.| +- Example + ``` + i18n.getLineInstance("en"); + ``` -- Example - - ``` - var iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - breakIter.current(); // 0 - ``` +## BreakIterator8+ -### first8+ - -first\(\): number - -Puts the [BreakIterator](#section1312302611613) object to the first text boundary, which is always at the beginning of the processed text. - -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Offset to the first text boundary of the processed text.

-
+### setLineBreakText8+ -- Example +setLineBreakText(text: string): void - ``` - iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - breakIter.first(); // 0 - ``` +Sets the text to be processed by the [BreakIterator](#breakiterator8) object. +**System capability**: SystemCapability.Global.I18n -### last8+ +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | text | string | Yes| Text to be processed by the **BreakIterator** object.| -last\(\): number +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + ``` -Puts the [BreakIterator](#section1312302611613) object to the last text boundary, which is always the next position after the end of the processed text. -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Offset of the last text boundary of the processed text.

-
+### getLineBreakText8+ +getLineBreakText(): string -- Example - - ``` - var iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - iterator.last(); // 27 - ``` +Obtains the text being processed by the [BreakIterator](#breakiterator8) object. +**System capability**: SystemCapability.Global.I18n -### next8+ +- Return value + | Type| Description| + | -------- | -------- | + | string | Text being processed by the **BreakIterator** object.| -next\(index?: number\): number +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + iterator.getLineBreakText(); // Apple is my favorite fruit. + ``` -Moves the [BreakIterator](#section1312302611613) object backward by the specified number of text boundaries if the specified index is a positive number. If the index is a negative number, the [BreakIterator](#section1312302611613) object will be moved forward by the corresponding number of text boundaries. If no index is specified, the index will be treated as **1**. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

index

-

number

-

No

-

Number of text boundaries by which the BreakIterator object is moved. A positive value indicates that the text boundary is moved backward, and a negative value indicates the opposite. If no index is specified, the index will be treated as 1.

-
- - -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Position of the BreakIterator object in the text after it is moved by the specified number of text boundaries. The value -1 is returned if the position of the BreakIterator object is outside of the processed text after it is moved by the specified number of text boundaries.

-
- - -- Example - - ``` - var iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - iterator.first(); // 0 - iterator.next(); // 6 - iterator.next(10); // -1 - ``` - - -### previous8+ - -previous\(\): number - -Moves the [BreakIterator](#section1312302611613) object to the previous text boundary. - -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Position of the BreakIterator object in the text after it is moved to the previous text boundary. The value -1 is returned if the position of the BreakIterator object is outside of the processed text after it is moved by the specified number of text boundaries.

-
- - -- Example - - ``` - var iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - iterator.first(); // 0 - iterator.next(3); // 12 - iterator.previous(); // 9 - ``` - - -### following8+ - -following\(offset: number\): number - -Moves the [BreakIterator](#section1312302611613) object to the text boundary after the position specified by the offset. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

offset

-

number

-

Yes

-

Offset to the position before the text boundary to which the BreakIterator object is moved.

-
- - -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

The value -1 is returned if the text boundary to which the BreakIterator object is moved is outside of the processed text.

-
- - -- Example - - ``` - var iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - iterator.following(0); // 6 - iterator.following(100); // -1 - iterator.current(); // 27 - ``` - - -### isBoundary8+ - -isBoundary\(offset: number\): boolean - -Checks whether the position specified by the offset is a text boundary. If **true** is returned, the [BreakIterator](#section1312302611613) object is moved to the position specified by the offset. If **false** is returned, the [BreakIterator](#section1312302611613) object is moved to the text boundary after the position specified by the offset, which is equivalent to calling [following\(offset\)](#section1743155314301). - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

offset

-

number

-

Yes

-

Position to check.

-
- - -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the position specified by the offset is a text boundary, and value false indicates the opposite.

-
- - -- Example - - ``` - var iterator = I18n.getLineInstance("en"); - iterator.setLineBreakText("Apple is my favorite fruit."); - iterator.isBoundary(0); // true; - iterator.isBoundary(5); // false; - ``` - - -## i18n.is24HourClock8+ - -is24HourClock\(\): boolean +### current8+ -Checks whether the 24-hour clock is used. +current(): number + +Obtains the position of the [BreakIterator](#breakiterator8) object in the text being processed. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | number | Position of the **BreakIterator** object in the text being processed.| + +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + breakIter.current(); // 0 + ``` + + +### first8+ + +first(): number + +Puts the [BreakIterator](#breakiterator8) object to the first text boundary, which is always at the beginning of the processed text. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | number | Offset to the first text boundary of the processed text.| + +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + breakIter.first(); // 0 + ``` + + +### last8+ + +last(): number + +Puts the [BreakIterator](#breakiterator8) object to the last text boundary, which is always the next position after the end of the processed text. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | number | Offset of the last text boundary of the processed text.| + +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + iterator.last(); // 27 + ``` + + +### next8+ + +next(index?: number): number + +Moves the [BreakIterator](#breakiterator8) object backward by the specified number of text boundaries if the specified index is a positive number. If the index is a negative number, the [BreakIterator](#breakiterator8) object will be moved forward by the corresponding number of text boundaries. If no index is specified, the index will be treated as **1**. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | index | number | No| Number of text boundaries by which the [BreakIterator](#breakiterator8) object is moved. A positive value indicates that the text boundary is moved backward, and a negative value indicates the opposite. If no index is specified, the index will be treated as **1**.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Position of the [BreakIterator](#breakiterator8) object in the text after it is moved by the specified number of text boundaries. The value **-1** is returned if the position of the [BreakIterator](#breakiterator8) object is outside of the processed text after it is moved by the specified number of text boundaries.| + +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + iterator.first(); // 0 + iterator.next(); // 6 + iterator.next(10); // -1 + ``` + + +### previous8+ + +previous(): number + +Moves the [BreakIterator](#breakiterator8) object to the previous text boundary. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | number | Position of the [BreakIterator](#breakiterator8) object in the text after it is moved to the previous text boundary. The value **-1** is returned if the position of the [BreakIterator](#breakiterator8) object is outside of the processed text after it is moved by the specified number of text boundaries.| -- Return values +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + iterator.first(); // 0 + iterator.next(3); // 12 + iterator.previous(); // 9 + ``` - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the 24-hour clock is used, and value false indicates the opposite.

-
+### following8+ -- Example +following(offset: number): number - ``` - var is24HourClock = i18n.is24HourClock(); - ``` +Moves the [BreakIterator](#breakiterator8) object to the text boundary after the position specified by the offset. Position of the [BreakIterator](#breakiterator8) object after it is moved to the text boundary after the position specified by the offset. +**System capability**: SystemCapability.Global.I18n -## i18n.set24HourClock8+ +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | offset | number | Yes| Offset to the position before the text boundary to which the [BreakIterator](#breakiterator8) object is moved.| -set24HourClock\(option: boolean\): boolean +- Return value + | Type| Description| + | -------- | -------- | + | number | The value **-1** is returned if the text boundary to which the [BreakIterator](#breakiterator8) object is moved is outside of the processed text.| + +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + iterator.following(0); // 6 + iterator.following(100); // -1 + iterator.current(); // 27 + ``` + + +### isBoundary8+ + +isBoundary(offset: number): boolean + +Checks whether the position specified by the offset is a text boundary. If **true** is returned, the [BreakIterator](#breakiterator8) object is moved to the position specified by the offset. If **false** is returned, the [BreakIterator](#breakiterator8) object is moved to the text boundary after the position specified by the offset, which is equivalent to calling [following](#following8)(offset). + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | offset | number | Yes| Position to check.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the position specified by the offset is a text boundary, and value **false** indicates the opposite.| + +- Example + ``` + iterator = I18n.getLineInstance("en"); + iterator.setLineBreakText("Apple is my favorite fruit."); + iterator.isBoundary(0); // true; + iterator.isBoundary(5); // false; + ``` + + +## i18n.is24HourClock8+ + +is24HourClock(): boolean + +Checks whether the 24-hour clock is used. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the 24-hour clock is used, and value **false** indicates the opposite.| + +- Example + ``` + var is24HourClock = i18n.is24HourClock(); + ``` + + +## i18n.set24HourClock8+ + +set24HourClock(option: boolean): boolean Sets the 24-hour clock. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

option

-

boolean

-

Yes

-

Whether to enable the 24-hour clock. The value true means to enable the 24-hour clock, and value false means the opposite.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the 24-hour clock is enabled, and value false indicates the opposite.

-
- - -- Example - - ``` - // Set the system time to the 24-hour format. - var success = I18n.set24HourClock(true); - ``` - - -## i18n.addPreferredLanguage8+ - -addPreferredLanguage\(language: string, index?: number\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | option | boolean | Yes| Whether to enable the 24-hour clock. The value **true** means to enable the 24-hour clock, and value **false** means the opposite.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the 24-hour clock is enabled, and value **false** indicates the opposite.| + +- Example + ``` + // Set the system time to the 24-hour clock. + var success = I18n.set24HourClock(true); + ``` + + +## i18n.addPreferredLanguage8+ + +addPreferredLanguage(language: string, index?: number): boolean Adds a preferred language to the specified position on the preferred language list. -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

language

-

string

-

Yes

-

Preferred language to add.

-

index

-

number

-

No

-

Position to which the preferred language is added.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the preferred language is added, and value false indicates the opposite.

-
- - -- Example - - ``` - // Add zh-CN to the preferred language list. - var language = 'zh-CN'; - var index = 0; - var success = i18n.addPreferredLanguage(langauge, index); - ``` - - -## i18n.removePreferredLanguage8+ - -removePreferredLanguage\(index: number\): boolean +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | language | string | Yes| Preferred language to add.| + | index | number | No| Position to which the preferred language is added.| + +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the preferred language is successfully added, and value **false** indicates the opposite.| + +- Example + ``` + // Add zh-CN to the preferred language list. + var language = 'zh-CN'; + var index = 0; + var success = i18n.addPreferredLanguage(language, index); + ``` + + +## i18n.removeDisplayLanguage8+ + +removeDisplayLanguage(index: number): boolean Deletes a preferred language from the specified position on the preferred language list. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

index

-

number

-

Yes

-

Position of the preferred language to delete.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

boolean

-

The value true indicates that the preferred language is deleted, and value false indicates the opposite.

-
- - -- Example - - ``` - // Delete the first preferred language from the preferred language list. - var index = 0; - var success = i18n.removePreferredLanguage(index); - ``` - - -## i18n.getPreferredLanguageList8+ - -getPreferredLanguageList\(\): Array +**System capability**: SystemCapability.Global.I18n -Obtains the preferred language list. +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | index | number | Yes| Position of the preferred language to delete.| -- Return values +- Return value + | Type| Description| + | -------- | -------- | + | boolean | The value **true** indicates that the preferred language is deleted, and value **false** indicates the opposite.| - - - - - - - - - -

Type

-

Description

-

Array<string>

-

Preferred language list.

-
+- Example + ``` + // Delete the first preferred language from the preferred language list. + var index = 0; + var success = i18n.removePreferredLanguage(index); + ``` -- Example +## i18n.getPreferredLanguageList8+ - ``` - var preferredLanguageList = i18n.getPreferredLanguageList(); - ``` +getPreferredLanguageList(): Array +Obtains the preferred language list. -## i18n.getFirstPreferredLanguage8+ +**System capability**: SystemCapability.Global.I18n -getFirstPreferredLanguage\(\): string +- Return value + | Type| Description| + | -------- | -------- | + | Array | Preferred language list.| -Obtains the preferred language that best matches the HAP resource. +- Example + ``` + var preferredLanguageList = i18n.getPreferredLanguageList(); + ``` -- Return values - - - - - - - - - -

Type

-

Description

-

string

-

Preferred language that best matches the HAP resource.

-
+## i18n.getFirstPreferredLanguage8+ +getFirstPreferredLanguage(): string + +Obtains the preferred language that best matches the HAP resource. -- Example +**System capability**: SystemCapability.Global.I18n - ``` - var firstPreferredLangauge = i18n.getFirstPreferredLangauge(); - ``` +- Return value + | Type| Description| + | -------- | -------- | + | string | Preferred language that best matches the HAP resource.| +- Example + ``` + var firstPreferredLanguage = i18n.getFirstPreferredLanguage(); + ``` diff --git a/en/application-dev/reference/apis/js-apis-intl.md b/en/application-dev/reference/apis/js-apis-intl.md index f18b8b8bf31..719154b9fca 100644 --- a/en/application-dev/reference/apis/js-apis-intl.md +++ b/en/application-dev/reference/apis/js-apis-intl.md @@ -1,1996 +1,681 @@ -# Internationalization (intl) +# Internationalization – intl ->![](../../public_sys-resources/icon-note.gif) **NOTE:** ->- The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. ->- This module contains standard i18n APIs, which are defined in ECMA 402. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> - The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version. +> +> - This module contains standard i18n APIs, which are defined in ECMA 402. -## Modules to Import + +## Modules to Import ``` import Intl from '@ohos.intl'; ``` -## Required Permissions - -None - -## Locale - -### Attributes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

language

-

string

-

Yes

-

No

-

Language associated with the locale, for example, zh.

-

script

-

string

-

Yes

-

No

-

Script type of the language, for example, Hans.

-

region

-

string

-

Yes

-

No

-

Region associated with the locale, for example, CN.

-

baseName

-

string

-

Yes

-

No

-

Basic key information about the locale, which consists of the language, script, and region, for example, zh-Hans-CN.

-

caseFirst

-

string

-

Yes

-

No

-

Whether case is taken into account for the locale's collation rules. The value can be upper, lower, or false.

-

calendar

-

string

-

Yes

-

No

-

Calendar for the locale. The value can be buddhist, chinese, coptic, dangi, ethioaa, ethiopic, gregory, hebrew, indian, islamic, islamic-umalqura, islamic-tbla, islamic-civil, islamic-rgsa, iso8601, japanese, persian, roc, or islamicc.

-

collation

-

string

-

Yes

-

No

-

Collation rules for the locale. The value can be any of the following: big5han, compat, dict, direct, ducet, eor, gb2312, phonebk, phonetic, pinyin, reformed, searchjl, stroke, trad, unihan, and zhuyin.

-

hourCycle

-

string

-

Yes

-

No

-

Time system for the locale. The value can be h11, h12, h23, or h24.

-

numberingSystem

-

string

-

Yes

-

No

-

Numbering system for the locale. The value can be any of the following: adlm, ahom, arab, arabext, bali, beng, bhks, brah, cakm, cham, deva, diak, fullwide, gong, gonm, gujr, guru, hanidec, hmng, hmnp, java, kali, khmr, knda, lana, lanatham, laoo, latn, lepc, limb, mathbold, mathdbl, mathmono, mathsanb, mathsans, mlym, modi, mong, mroo, mtei, mymr, mymrshan, mymrtlng, newa, nkoo, olck, orya, osma, rohg, saur, segment, shrd, sind, sinh, sora, sund, takr, talu, tamldec, telu, thai, tibt, tirh, vaii, wara, and wcho.

-

numeric

-

boolean

-

Yes

-

No

-

Whether to apply special collation rules for numeric characters.

-
- -### constructor - -constructor\(locale: string, options?: options\) - -Creates a **Locale** object. - -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

Yes

-

A string containing locale information, including the language, optional script, and locale.

-
- - -- Example - - ``` - var locale = new Intl.Locale("zh-CN"); - ``` - - -### toString - -toString\(\): string + +## Locale + + +### Attributes + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| language | string | Yes| No| Language associated with the locale, for example, **zh**.
**System capability**: SystemCapability.Global.I18n| +| script | string | Yes| No| Script type of the language, for example, **Hans**.
**System capability**: SystemCapability.Global.I18n| +| region | string | Yes| No| Region associated with the locale, for example, **CN**.
**System capability**: SystemCapability.Global.I18n| +| baseName | string | Yes| No| Basic key information about the locale, which consists of the language, script, and region, for example, **zh-Hans-CN**.
**System capability**: SystemCapability.Global.I18n| +| caseFirst | string | Yes| No| Whether case is taken into account for the locale's collation rules. The value can be **upper**, **lower**, or **false**.
**System capability**: SystemCapability.Global.I18n| +| calendar | string | Yes| No| Calendar for the locale. The value can be any of the following: buddhist, chinese, coptic, dangi, ethioaa, ethiopic, gregory, hebrew, indian, islamic, islamic-umalqura, islamic-tbla, islamic-civil, islamic-rgsa, iso8601, japanese, persian, roc, islamicc.
**System capability**: SystemCapability.Global.I18n| +| collation | string | Yes| No| Rule for sorting regions. The value can be any of the following: big5han, compat, dict, direct, ducet, eor, gb2312, phonebk, phonetic, pinyin, reformed, searchjl, stroke, trad, unihan, zhuyin.
**System capability**: SystemCapability.Global.I18n| +| hourCycle | string | Yes| No| Time system for the locale. The value can be any of the following: h12, h23, h11, and h24.
**System capability**: SystemCapability.Global.I18n| +| numberingSystem | string | Yes| No| Numbering system for the locale. The value can be any of the following: adlm, ahom, arab, arabext, bali, beng, bhks, brah, cakm, cham, deva, diak, fullwide, gong, gonm, gujr, guru, hanidec, hmng, hmnp, java, kali, khmr, knda, lana, lanatham, laoo, latn, lepc, limb, mathbold, mathdbl, mathmono, mathsanb, mathsans, mlym, modi, mong, mroo, mtei, mymr, mymrshan, mymrtlng, newa, nkoo, olck, orya, osma, rohg, saur, segment, shrd, sind, sinh, sora, sund, takr, talu, tamldec, telu, thai, tibt, tirh, vaii, wara, wcho.
**System capability**: SystemCapability.Global.I18n| +| numeric | boolean | Yes| No| Whether to apply special collation rules for numeric characters.
**System capability**: SystemCapability.Global.I18n| + + +### constructor + +constructor(locale: string, options?: options) + +Creates a Locale object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string | Yes| A string containing locale information, including the language, optional script, and region.| + | options | options | No| Options for creating the **Locale** object.| + +- Example + ``` + var locale = new Intl.Locale("zh-CN"); + ``` + + +### toString + +toString(): string Converts locale information to a string. -- Return values +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | string | String containing locale information.| + +- Example + ``` + var locale = new Intl.Locale("zh-CN"); + locale.toString(); + ``` + + +### maximize + +maximize(): Locale + +Maximizes information of the **Locale** object. If the script and locale information is missing, add the information. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | [Locale](#locale) | **Locale** object with the maximized information.| + +- Example + ``` + var locale = new Intl.Locale("zh-CN"); + locale.maximize(); + ``` + - - - - - - - - - -

Type

-

Description

-

string

-

String containing locale information.

-
+### minimize +minimize(): Locale -- Example +Minimizes information of the **Locale** object. If the script and locale information is present, delete the information. - ``` - var locale = new Intl.Locale("zh-CN"); - locale.toString(); - ``` - - -### maximize - -maximize\(\): Locale - -Maximizes information of the **Locale** object. If the script and locale information is missing, add the information. - -- Return values - - - - - - - - - - -

Type

-

Description

-

Locale

-

Locale object with the maximized information.

-
+**System capability**: SystemCapability.Global.I18n +- Return value + | Type| Description| + | -------- | -------- | + | [Locale](#locale) | **Locale** object with the minimized information.| -- Example +- Example + ``` + var locale = new Intl.Locale("zh-CN"); + locale.minimize(); + ``` - ``` - var locale = new Intl.Locale("zh-CN"); - locale.maximize(); - ``` +## DateTimeFormat -### minimize - -minimize\(\): Locale - -Minimizes information of the **Locale** object. If the script and locale information is present, delete the information. - -- Return values - - - - - - - - - - -

Type

-

Description

-

Locale

-

Locale object with the minimized information.

-
- - -- Example - - ``` - var locale = new Intl.Locale("zh-CN"); - locale.minimize(); - ``` - - -## DateTimeFormat - -### constructor - -constructor\(locale: string, options?: DateTimeOptions\) - -Creates a **DateTimeOptions** object for the specified locale. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

Yes

-

A string containing locale information, including the language, optional script, and locale.

-

options

-

DateTimeOptions

-

No

-

Options for creating a DateTimeFormat object.

-
- - -- Example - - ``` - var datefmt= new Intl.DateTimeFormat("zh-CN", { dateStyle: 'full', timeStyle: 'medium' }); - ``` - - -### constructor - -constructor\(locales: Array, options?: DateTimeOptions\) - -Creates a **DateTimeOptions** object for the specified array of locales. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locales

-

Array<string>

-

Yes

-

An array of strings containing locale information.

-

options

-

DateTimeOptions

-

No

-

Options for creating a DateTimeFormat object.

-
- - -- Example - - ``` - var datefmt= new Intl.DateTimeFormat(["ban", "zh"], { dateStyle: 'full', timeStyle: 'medium' }); - ``` - - -### format - -format\(date: Date\): string + +### constructor + +constructor(locale: string, options?: DateTimeOptions) + +Creates a **DateTimeOptions** object for the specified locale. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string | Yes| A string containing locale information, including the language, optional script, and region.| + | options | [DateTimeOptions](#datetimeoptions) | No| Options for creating a **DateTimeFormat** object.| + +- Example + ``` + var datefmt= new Intl.DateTimeFormat("zh-CN", { dateStyle: 'full', timeStyle: 'medium' }); + ``` + + +### constructor + +constructor(locales: Array<string>, options?: DateTimeOptions) + +Creates a **DateTimeOptions** object for the specified locale. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locales | Array<string> | Yes| An array of strings containing locale information.| + | options | [DateTimeOptions](#datetimeoptions) | No| Options for creating a **DateTimeFormat** object.| + +- Example + ``` + var datefmt= new Intl.DateTimeFormat(["ban", "zh"], { dateStyle: 'full', timeStyle: 'medium' }); + ``` + + +### format + +format(date: Date): string Formats the specified date and time. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

date

-

Date

-

Yes

-

Date and time to be formatted.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

A string containing the formatted date and time.

-
- - -- Example - - ``` - var date = new Date(2021, 11, 17, 3, 24, 0); - var datefmt = new Intl.DateTimeFormat("en-GB"); - datefmt.format(date); - ``` - - -### formatRange - -formatRange\(fromDate: Date, toDate: Date\): string +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | date | Date | Yes| Date and time to be formatted.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | A string containing the formatted date and time.| + +- Example + ``` + var date = new Date(2021, 11, 17, 3, 24, 0); + var datefmt = new Intl.DateTimeFormat("en-GB"); + datefmt.format(date); + ``` + + +### formatRange + +formatRange(fromDate: Date, toDate: Date): string Formats the specified date range. -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

startDate

-

Date

-

Yes

-

Start date and time to be formatted.

-

endDate

-

Date

-

Yes

-

End date and time to be formatted.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

A string containing the formatted date and time range.

-
- - -- Example - - ``` - var startDate = new Date(2021, 11, 17, 3, 24, 0); - var endDate = new Date(2021, 11, 18, 3, 24, 0); - var datefmt = new Intl.DateTimeFormat("en-GB"); - datefmt.formatRange(startDate, endDate); - ``` - - -### resolvedOptions - -resolvedOptions\(\): DateTimeOptions - -Obtains the formatting options for **DateTimeFormat** object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

DateTimeOptions

-

Formatting options for DateTimeFormat objects.

-
- - -- Example - - ``` - var datefmt = new Intl.DateTimeFormat("en-GB"); - datefmt.resolvedOptions(); - ``` - - -## DateTimeOptions - -Provides the options for the **DateTimeFormat** object. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

locale

-

string

-

Yes

-

No

-

Locale, for example, zh-Hans-CN.

-

dateStyle

-

string

-

Yes

-

Yes

-

Date display format. The value can be long, short, medium, or full.

-

timeStyle

-

string

-

Yes

-

Yes

-

Time display format. The value can be long, short, medium, or full.

-

hourCycle

-

string

-

Yes

-

Yes

-

Time system for the locale. The value can be h11, h12, h23, or h24.

-

timeZone

-

string

-

Yes

-

Yes

-

Time zone represented by a valid IANA time zone ID.

-

numberingSystem

-

string

-

Yes

-

Yes

-

Numbering system for the locale. The value can be any of the following: adlm, ahom, arab, arabext, bali, beng, bhks, brah, cakm, cham, deva, diak, fullwide, gong, gonm, gujr, guru, hanidec, hmng, hmnp, java, kali, khmr, knda, lana, lanatham, laoo, latn, lepc, limb, mathbold, mathdbl, mathmono, mathsanb, mathsans, mlym, modi, mong, mroo, mtei, mymr, mymrshan, mymrtlng, newa, nkoo, olck, orya, osma, rohg, saur, segment, shrd, sind, sinh, sora, sund, takr, talu, tamldec, telu, thai, tibt, tirh, vaii, wara, and wcho.

-

hour12

-

boolean

-

Yes

-

Yes

-

Whether to use the 12-hour clock.

-

weekday

-

string

-

Yes

-

Yes

-

Workday display format. The value can be long, short, or narrow.

-

era

-

string

-

Yes

-

Yes

-

Era display format. The value can be long, short, or narrow.

-

year

-

string

-

Yes

-

Yes

-

Year display format. The value can be numeric or 2-digit.

-

month

-

string

-

Yes

-

Yes

-

Month display format. The value can be numeric, 2-digit, long, short, or narrow.

-

day

-

string

-

Yes

-

Yes

-

Day display format. The value can be numeric or 2-digit.

-

hour

-

string

-

Yes

-

Yes

-

Hour display format. The value can be numeric or 2-digit.

-

minute

-

string

-

Yes

-

Yes

-

Minute display format. The value can be numeric or 2-digit.

-

second

-

string

-

Yes

-

Yes

-

Second display format. The value can be numeric or 2-digit.

-

timeZoneName

-

string

-

Yes

-

Yes

-

Localized representation of a time zone name.

-

dayPeriod

-

string

-

Yes

-

Yes

-

Time period display format. The value can be long, short, or narrow.

-

localeMatcher

-

string

-

Yes

-

Yes

-

Locale matching algorithm. The value can be lookup or best fit.

-

formatMatcher

-

string

-

Yes

-

Yes

-

Format matching algorithm. The value can be basic or best fit.

-
- -## NumberFormat - -### constructor - -constructor\(locale: string, options?: NumberOptions\) - -Creates a **NumberFormat** object for the specified locale. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string

-

Yes

-

A string containing locale information, including the language, optional script, and locale.

-

options

-

NumberOptions

-

No

-

Options for creating a NumberFormat object.

-
- -- Example - - ``` - var numfmt = new Intl.NumberFormat("en-GB", {style:'decimal', notation:"scientific"}); - ``` - - -### constructor - -constructor\(locales: Array, options?: NumberOptions\) - -Creates a **NumberFormat** object for the specified array of locales. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locales

-

Array<string>

-

Yes

-

An array of strings containing locale information.

-

options

-

NumberOptions

-

No

-

Options for creating a NumberFormat object.

-
- - -- Example - - ``` - var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); - ``` - - -### format - -format\(number: number\): string; +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | startDate | Date | Yes| Start date and time to be formatted.| + | endDate | Date | Yes| End date and time to be formatted.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | A string containing the formatted date and time range.| + +- Example + ``` + var startDate = new Date(2021, 11, 17, 3, 24, 0); + var endDate = new Date(2021, 11, 18, 3, 24, 0); + var datefmt = new Intl.DateTimeFormat("en-GB"); + datefmt.formatRange(startDate, endDate); + ``` + + +### resolvedOptions + +resolvedOptions(): DateTimeOptions + +Obtains the formatting options for **DateTimeFormat** object. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | [DateTimeOptions](#datetimeoptions) | Formatting options for **DateTimeFormat** objects.| + +- Example + ``` + var datefmt = new Intl.DateTimeFormat("en-GB"); + datefmt.resolvedOptions(); + ``` + + +## DateTimeOptions + +Provides the options for the **DateTimeFormat** object. + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| locale | string | Yes| No| Locale, for example, **zh-Hans-CN**.
**System capability**: SystemCapability.Global.I18n| +| dateStyle | string | Yes| Yes| Date display format. The value can be **long**, **short**, **medium**, or **full**.
**System capability**: SystemCapability.Global.I18n| +| timeStyle | string | Yes| Yes| Time display format. The value can be **long**, **short**, **medium**, or **full**.
**System capability**: SystemCapability.Global.I18n| +| hourCycle | string | Yes| Yes| Time system for the locale. The value can be any of the following: h11, h12, h23, h24.
**System capability**: SystemCapability.Global.I18n| +| timeZone | string | Yes| Yes| Time zone represented by a valid IANA time zone ID.
**System capability**: SystemCapability.Global.I18n| +| numberingSystem | string | Yes| Yes| Numbering system for the locale. The value can be any of the following: adlm, ahom, arab, arabext, bali, beng, bhks, brah, cakm, cham, deva, diak, fullwide, gong, gonm, gujr, guru, hanidec, hmng, hmnp, java, kali, khmr, knda, lana, lanatham, laoo, latn, lepc, limb, mathbold, mathdbl, mathmono, mathsanb, mathsans, mlym, modi, mong, mroo, mtei, mymr, mymrshan, mymrtlng, newa, nkoo, olck, orya, osma, rohg, saur, segment, shrd, sind, sinh, sora, sund, takr, talu, tamldec, telu, thai, tibt, tirh, vaii, wara, wcho.
**System capability**: SystemCapability.Global.I18n| +| hour12 | boolean | Yes| Yes| Whether to use the 12-hour clock.
**System capability**: SystemCapability.Global.I18n| +| weekday | string | Yes| Yes| Workday display format. The value can be **long**, **short**, or **narrow**.
**System capability**: SystemCapability.Global.I18n| +| era | string | Yes| Yes| Era display format. The value can be **long**, **short**, or **narrow**.
**System capability**: SystemCapability.Global.I18n| +| year | string | Yes| Yes| Year display format. The value can be **numeric** or **2-digit**.
**System capability**: SystemCapability.Global.I18n| +| month | string | Yes| Yes| Month display format. The value can be any of the following: numeric, 2-digit, long, short, narrow.
**System capability**: SystemCapability.Global.I18n| +| day | string | Yes| Yes| Day display format. The value can be **numeric** or **2-digit**.
**System capability**: SystemCapability.Global.I18n| +| hour | string | Yes| Yes| Hour display format. The value can be **numeric** or **2-digit**.
**System capability**: SystemCapability.Global.I18n| +| minute | string | Yes| Yes| Minute display format. The value can be **numeric** or **2-digit**.
**System capability**: SystemCapability.Global.I18n| +| second | string | Yes| Yes| Seconds display format. The value can be **numeric** or **2-digit**.
**System capability**: SystemCapability.Global.I18n| +| timeZoneName | string | Yes| Yes| Localized representation of a time zone name.
**System capability**: SystemCapability.Global.I18n| +| dayPeriod | string | Yes| Yes| Time period display format. The value can be **long**, **short**, or **narrow**.
**System capability**: SystemCapability.Global.I18n| +| localeMatcher | string | Yes| Yes| Locale matching algorithm. The value can be **lookup** or **best fit**.
**System capability**: SystemCapability.Global.I18n| +| formatMatcher | string | Yes| Yes| Format matching algorithm. The value can be **basic** or **best fit**.
**System capability**: SystemCapability.Global.I18n| + + +## NumberFormat + + +### constructor + +constructor(locale: string, options?: NumberOptions) + +Creates a **NumberFormat** object for the specified locale. + +**System capability**: SystemCapability.Global.I18n + +Parameters +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| locale | string | Yes| A string containing locale information, including the language, optional script, and region.| +| options | [NumberOptions](#numberoptions) | No| Options for creating a **NumberFormat** object.| + +- Example + ``` + var numfmt = new Intl.NumberFormat("en-GB", {style:'decimal', notation:"scientific"}); + ``` + + +### constructor + +constructor(locales: Array<string>, options?: NumberOptions) + +Creates a **NumberFormat** object for the specified locale. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locales | Array<string> | Yes| An array of strings containing locale information.| + | options | [NumberOptions](#numberoptions) | No| Options for creating a **NumberFormat** object.| + +- Example + ``` + var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); + ``` + + +### format + +format(number: number): string; Formats a number. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

number

-

number

-

Yes

-

Number to be formatted.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Formatted number.

-
- - -- Example - - ``` - var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); - numfmt.format(1223); - ``` - - -### resolvedOptions - -resolvedOptions\(\): NumberOptions - -Obtains the options of the **NumberFormat** object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

NumberOptions

-

Options of the NumberFormat object.

-
- - -- Example - - ``` - var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); - numfmt.resolvedOptions(); - ``` - - -## NumberOptions +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | number | number | Yes| Number to be formatted.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Formatted number.| + + +- Example + ``` + var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); + numfmt.format(1223); + ``` + + +### resolvedOptions + +resolvedOptions(): NumberOptions + +Obtains the options of the **NumberFormat** object. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | [NumberOptions](#numberoptions) | Formatting options for **NumberFormat** objects.| + + +- Example + ``` + var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); + numfmt.resolvedOptions(); + ``` + + +## NumberOptions Provides the device capability. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

locale

-

string

-

Yes

-

No

-

Locale, for example, zh-Hans-CN.

-

currency

-

string

-

Yes

-

Yes

-

Currency unit, for example, EUR, CNY, or USD.

-

currencySign

-

string

-

Yes

-

Yes

-

Currency unit symbol. The value can be symbol, narrowSymbol, code, or name.

-

currencyDisplay

-

string

-

Yes

-

Yes

-

Currency display mode. The value can be symbol, narrowSymbol, code, or name.

-

unit

-

string

-

Yes

-

Yes

-

Unit name, for example, meter, inch, or hectare.

-

unitDisplay

-

string

-

Yes

-

Yes

-

Unit display format. The value can be long, short, or medium.

-

unitUsage

-

string

-

Yes

-

Yes

-

Unit use case. The value can be any of the following: default, area-land-agricult, area-land-commercl, area-land-residntl, length-person, length-person-small, length-rainfall, length-road, length-road-small, length-snowfall, length-vehicle, length-visiblty, length-visiblty-small, length-person-informal, length-person-small-informal, length-road-informal, speed-road-travel, speed-wind, temperature-person, temperature-weather, and volume-vehicle-fuel.

-

signDisplay

-

string

-

Yes

-

Yes

-

Number sign display format. The value can be auto, never, always, or expectZero.

-

compactDisplay

-

string

-

Yes

-

Yes

-

Compact display format. The value can be long or short.

-

notation

-

string

-

Yes

-

Yes

-

Number notation. The value can be standard, scientific, engineering, or compact.

-

localeMatcher

-

string

-

Yes

-

Yes

-

Locale matching algorithm. The value can be lookup or best fit.

-

style

-

string

-

Yes

-

Yes

-

Number display format. The value can be decimal, currency, percent, or unit.

-

numberingSystem

-

string

-

Yes

-

Yes

-

Numbering system for the locale. The value can be any of the following: adlm, ahom, arab, arabext, bali, beng, bhks, brah, cakm, cham, deva, diak, fullwide, gong, gonm, gujr, guru, hanidec, hmng, hmnp, java, kali, khmr, knda, lana, lanatham, laoo, latn, lepc, limb, mathbold, mathdbl, mathmono, mathsanb, mathsans, mlym, modi, mong, mroo, mtei, mymr, mymrshan, mymrtlng, newa, nkoo, olck, orya, osma, rohg, saur, segment, shrd, sind, sinh, sora, sund, takr, talu, tamldec, telu, thai, tibt, tirh, vaii, wara, and wcho.

-

useGrouping

-

boolean

-

Yes

-

Yes

-

Whether to use grouping for display.

-

miniumumIntegerDigits

-

number

-

Yes

-

Yes

-

Minimum number of digits allowed in the integer part of a number. The value ranges from 1 to 21.

-

miniumumFractionDigits

-

number

-

Yes

-

Yes

-

Minimum number of digits in the fraction part of a number. The value ranges from 0 to 20.

-

maxiumumFractionDigits

-

number

-

Yes

-

Yes

-

Maximum number of digits in the fraction part of a number. The value ranges from 1 to 21.

-

miniumumSignificantDigits

-

number

-

Yes

-

Yes

-

Minimum number of the least significant digits. The value ranges from 1 to 21.

-

maxiumumSignificantDigits

-

number

-

Yes

-

Yes

-

Maximum number of the least significant digits. The value ranges from 1 to 21.

-
- -## Collator8+ - -### constructor8+ - -constructor\(\) - -Creates a **Collator** object. - -- Example - - ``` - var collator = new Intl.Collator(); - ``` - - -### constructor8+ - -constructor\(locale: string | Array, options?: CollatorOptions\) - -Creates a **Collator** object based on the specified locale and options. +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| locale | string | Yes| No| Locale, for example, **zh-Hans-CN**.
**System capability**: SystemCapability.Global.I18n| +| currency | string | Yes| Yes| Currency unit, for example, **EUR**, **CNY**, or **USD**.
**System capability**: SystemCapability.Global.I18n| +| currencySign | string | Yes| Yes| Currency unit symbol. The value can be **symbol**, **narrowSymbol**, **code**, or **name**.
**System capability**: SystemCapability.Global.I18n| +| currencyDisplay | string | Yes| Yes| Currency display mode. The value can be **symbol**, **narrowSymbol**, **code**, or **name**.
**System capability**: SystemCapability.Global.I18n| +| unit | string | Yes| Yes| Unit name, for example, **meter**, **inch**, or **hectare**.
**System capability**: SystemCapability.Global.I18n| +| unitDisplay | string | Yes| Yes| Unit display format. The value can be **long**, **short**, or **medium**.
**System capability**: SystemCapability.Global.I18n| +| unitUsage | string | Yes| Yes| Unit usage scenario. The value can be any of the following: default, area-land-agricult, area-land-commercl, area-land-residntl, length-person, length-person-small, length-rainfall, length-road, length-road-small, length-snowfall, length-vehicle, length-visiblty, length-visiblty-small, length-person-informal, length-person-small-informal, length-road-informal, speed-road-travel, speed-wind, temperature-person, temperature-weather, volume-vehicle-fuel.
**System capability**: SystemCapability.Global.I18n| +| signDisplay | string | Yes| Yes| Number sign display format. The value can be **auto**, **never**, always**, or **expectZero**.
**System capability**: SystemCapability.Global.I18n| +| compactDisplay | string | Yes| Yes| Compact display format. The value can be **long** or **short**.
**System capability**: SystemCapability.Global.I18n| +| notation | string | Yes| Yes| Number formatting specification. The value can be **standard**, **scientific**, engineering**, or **compact**.
**System capability**: SystemCapability.Global.I18n| +| localeMatcher | string | Yes| Yes| Locale matching algorithm. The value can be **lookup** or **best fit**.
**System capability**: SystemCapability.Global.I18n| +| style | string | Yes| Yes| Number display format. The value can be **decimal**, **currency**, **percent**, or **unit**.
**System capability**: SystemCapability.Global.I18n| +| numberingSystem | string | Yes| Yes| Numbering system for the locale. The value can be any of the following: adlm, ahom, arab, arabext, bali, beng, bhks, brah, cakm, cham, deva, diak, fullwide, gong, gonm, gujr, guru, hanidec, hmng, hmnp, java, kali, khmr, knda, lana, lanatham, laoo, latn, lepc, limb, mathbold, mathdbl, mathmono, mathsanb, mathsans, mlym, modi, mong, mroo, mtei, mymr, mymrshan, mymrtlng, newa, nkoo, olck, orya, osma, rohg, saur, segment, shrd, sind, sinh, sora, sund, takr, talu, tamldec, telu, thai, tibt, tirh, vaii, wara, wcho.
**System capability**: SystemCapability.Global.I18n| +| useGrouping | boolean | Yes| Yes| Whether to use grouping for display.
**System capability**: SystemCapability.Global.I18n| +| miniumumIntegerDigits | number | Yes| Yes| Minimum number of digits allowed in the integer part of a number. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| +| miniumumFractionDigits | number | Yes| Yes| Minimum number of digits in the fraction part of a number. The value ranges from **1** to **20**.
**System capability**: SystemCapability.Global.I18n| +| maxiumumFractionDigits | number | Yes| Yes| Maximum number of digits in the fraction part of a number. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| +| miniumumSignificantDigits | number | Yes| Yes| Minimum number of the least significant digits. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| +| maxiumumSignificantDigits | number | Yes| Yes| Maximum number of the least significant digits. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| -Parameters - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string|Array<string>

-

Yes

-

A string containing locale information, including the language, optional script, and locale.

-

options

-

CollatorOptions

-

No

-

Options for creating a Collator object.

-
- -- Example - - ``` - var collator = new Intl.Collator("zh-CN", {"localeMatcher": "lookup", "usage": "sort"}); - ``` - - -### compare8+ - -compare\(first: string, second: string\): number - -Compares two strings based on the sorting policy of the **Collator**. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

first

-

string

-

Yes

-

First string to compare.

-

second

-

string

-

Yes

-

Second string to compare.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

number

-

Comparison result. If the value is a negative number, the first string is before the second string. If the value of number is 0, the first string is equal to the second string. If the value of number is a positive number, the first string is after the second string.

-
- - -- Example - - ``` - var collator = new intl.Collator("zh-Hans"); - collator.compare("first", "second"); - ``` - - -### resolvedOptions8+ - -resolvedOptions\(\): CollatorOptions - -Returns properties reflecting the locale and collation options of a **Collator** object. - -- Return values - - - - - - - - - - -

Type

-

Description

-

CollatorOptions

-

Properties of the Collator object.

-
- - -- Example - - ``` - var collator = new intl.Collator("zh-Hans"); - var options = collator.resolvedOptions(); - ``` - - -## CollatorOptions8+ - -Represents the properties of a **Collator** object. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

localeMatcher

-

string

-

Yes

-

Yes

-

Locale matching algorithm. The value can be lookup or best fit.

-

usage

-

string

-

Yes

-

Yes

-

Whether the comparison is for sorting or for searching. The value can be sort or search.

-

sensitivity

-

string

-

Yes

-

Yes

-

Differences in the strings that lead to non-zero return values. The value can be base, accent, case, or variant.

-

ignorePunctuation

-

boolean

-

Yes

-

Yes

-

Whether punctuation is ignored. The value can be true or false.

-

collation

-

string

-

Yes

-

Yes

-

Sorting policy. The value can be any of the following: big5han, compat, dict, direct, ducet, eor, gb2312, phonebk, phonetic, pinyin, reformed, searchjl, stroke, trad, unihan, and zhuyin.

-

numeric

-

boolean

-

Yes

-

Yes

-

Whether numeric collation is used. The value can be true or false.

-

caseFirst

-

string

-

Yes

-

Yes

-

Whether upper case or lower case is sorted first. The value can be upper, lower, or false.

-
- -## PluralRules8+ - -### constructor8+ - -constructor\(\) - -Create a **PluralRules** object. - -- Example - - ``` - var pluralRules = new Intl.PluralRules(); - ``` - - -### constructor8+ - -constructor\(locale: string | Array, options?: PluralRulesOptions\) - -Creates a **PluralRules** object based on the specified locale and options. +## Collator8+ + + +### constructor8+ + +constructor() + +Creates a Collator object. + +**System capability**: SystemCapability.Global.I18n + +- Example + ``` + var collator = new Intl.Collator(); + ``` + + +### constructor8+ + +constructor(locale: string | Array<string>, options?: CollatorOptions) + +Creates a Collator object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | locale | string\|Array<string> | Yes| A string containing locale information, including the language, optional script, and region.| + | options | [CollatorOptions](#collatoroptions) | No| Options for creating a **Collator** object.| + +- Example + ``` + var collator = new Intl.Collator("zh-CN", {"localeMatcher": "lookup", "usage": "sort"}); + ``` + + +### compare8+ + +compare(first: string, second: string): number + +Compares two strings based on the sorting policy of the **Collator** object. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | first | string | Yes| First string to compare.| + | second | string | Yes| Second string to compare.| + +- Return value + | Type| Description| + | -------- | -------- | + | number | Comparison result. If the value is a negative number, the first string is before the second string. If the value of number is **0**, the first string is equal to the second string. If the value of number is a positive number, the first string is after the second string.| + +- Example + ``` + var collator = new Intl.Collator("zh-Hans"); + collator.compare("first", "second"); + ``` + + +### resolvedOptions8+ + +resolvedOptions(): CollatorOptions + +Returns properties reflecting the locale and collation options of a **Collator** object. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | [CollatorOptions](#collatoroptions) | Properties of the **Collator** object.| + +- Example + ``` + var collator = new Intl.Collator("zh-Hans"); + var options = collator.resolvedOptions(); + ``` + + +## CollatorOptions8+ + +Represents the properties of a **Collator** object. + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| localeMatcher | string | Yes| Yes| Locale matching algorithm. The value can be **lookup** or **best fit**.
**System capability**: SystemCapability.Global.I18n| +| usage | string | Yes| Yes| Whether the comparison is for sorting or for searching. The value can be **sort** or **search**.
**System capability**: SystemCapability.Global.I18n| +| sensitivity | string | Yes| Yes| Differences in the strings that lead to non-zero return values. The value can be **base**, **accent**, **case**, or **variant**.
**System capability**: SystemCapability.Global.I18n| +| ignorePunctuation | boolean | Yes| Yes| Whether punctuation is ignored. The value can be **true** or **false**.
**System capability**: SystemCapability.Global.I18n| +| collation | string | Yes| Yes| Rule for sorting regions. The value can be any of the following: big5han, compat, dict, direct, ducet, eor, gb2312, phonebk, phonetic, pinyin, reformed, searchjl, stroke, trad, unihan, zhuyin.
**System capability**: SystemCapability.Global.I18n| +| numeric | boolean | Yes| Yes| Whether numeric collation is used. The value can be **true** or **false**.
**System capability**: SystemCapability.Global.I18n| +| caseFirst | string | Yes| Yes| Whether upper case or lower case is sorted first. The value can be **upper**, **lower**, or **false**.
**System capability**: SystemCapability.Global.I18n| + + +## PluralRules8+ + + +### constructor8+ + +constructor() + +Create a **PluralRules** object. + +**System capability**: SystemCapability.Global.I18n + +- Example + ``` + var pluralRules = new Intl.PluralRules(); + ``` + + +### constructor8+ + +constructor(locale: string | Array<string>, options?: PluralRulesOptions) + +Create a **PluralRules** object. + +**System capability**: SystemCapability.Global.I18n Parameters +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| locale | string\|Array<string> | Yes| A string containing locale information, including the language, optional script, and region.| +| options | [PluralRulesOptions](#pluralrulesoptions) | No| Options for creating a **PluralRules** object.| + +- Example + ``` + var pluralRules= new Intl.PluraRules("zh-CN", {"localeMatcher": "lookup", "type": "cardinal"}); + ``` - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string|Array<string>

-

Yes

-

A string containing locale information, including the language, optional script, and locale.

-

options

-

PluralRulesOptions

-

No

-

Options for creating a PluralRules object.

-
- -- Example - - ``` - var pluralRules= new Intl.PluraRules("zh-CN", {"localeMatcher": "lookup", "type": "cardinal"}); - ``` - - -### select8+ - -select\(n: number\): string + +### select8+ + +select(n: number): string Obtains a string that represents the singular-plural type of the specified number. -- Parameters - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

n

-

number

-

Yes

-

Number for which the singular-plural type is to be obtained.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Singular-plural type. The options are as follows: zero, one, two, few, many, and others.

-
- - -- Example - - ``` - var pluralRules = new intl.PluralRules("zh-Hans"); - pluralRules.select(1); - ``` - - -## PluralRulesOptions8+ - -Represents the properties of a **PluralRules** object. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

localeMatcher

-

string

-

Yes

-

Yes

-

Locale matching algorithm. The value can be lookup or best fit.

-

type

-

string

-

Yes

-

Yes

-

Sorting type. The value can be cardinal or ordinal.

-

minimumIntegerDigits

-

number

-

Yes

-

Yes

-

Minimum number of digits allowed in the integer part of a number. The value ranges from 1 to 21.

-

minimumFractionDigits

-

number

-

Yes

-

Yes

-

Minimum number of digits in the fraction part of a number. The value ranges from 0 to 20.

-

maximumFractionDigits

-

number

-

Yes

-

Yes

-

Maximum number of digits in the fraction part of a number. The value ranges from 1 to 21.

-

minimumSignificantDigits

-

number

-

Yes

-

Yes

-

Minimum number of the least significant digits. The value ranges from 1 to 21.

-

maximumSignificantDigits

-

number

-

Yes

-

Yes

-

Maximum number of the least significant digits. The value ranges from 1 to 21.

-
- -## RelativeTimeFormat8+ - -### constructor8+ - -constructor\(\) - -Creates a **RelativeTimeFormat** object. - -- Example - - ``` - var relativetimefmt = new Intl.RelativeTimeFormat(); - ``` - - -### constructor8+ - -constructor\(locale: string | Array, options?: RelativeTimeFormatInputOptions\) - -Creates a **RelativeTimeFormat** object based on the specified locale and options. +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | n | number | Yes| Number for which the singular-plural type is to be obtained.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Singular-plural type. The value can be any of the following: one, two, few, many, others.| + +- Example + ``` + var pluralRules = new Intl.PluralRules("zh-Hans"); + pluralRules.select(1); + ``` + + +## PluralRulesOptions8+ + +Represents the properties of a **PluralRules** object. + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| localeMatcher | string | Yes| Yes| Locale matching algorithm. The value can be **lookup** or **best fit**.
**System capability**: SystemCapability.Global.I18n| +| type | string | Yes| Yes| Sorting type. The value can be **cardinal** or **ordinal**.
**System capability**: SystemCapability.Global.I18n| +| minimumIntegerDigits | number | Yes| Yes| Minimum number of digits allowed in the integer part of a number. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| +| minimumFractionDigits | number | Yes| Yes| Minimum number of digits in the fraction part of a number. The value ranges from **0** to **20**.
**System capability**: SystemCapability.Global.I18n| +| maximumFractionDigits | number | Yes| Yes| Maximum number of digits in the fraction part of a number. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| +| minimumSignificantDigits | number | Yes| Yes| Minimum number of the least significant digits. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| +| maximumSignificantDigits | number | Yes| Yes| Maximum number of the least significant digits. The value ranges from **1** to **21**.
**System capability**: SystemCapability.Global.I18n| + + +## RelativeTimeFormat8+ + + +### constructor8+ + +constructor() + +Creates a **RelativeTimeFormat** object. + +**System capability**: SystemCapability.Global.I18n + +- Example + ``` + var relativetimefmt = new Intl.RelativeTimeFormat(); + ``` + + +### constructor8+ + +constructor(locale: string | Array<string>, options?: RelativeTimeFormatInputOptions) + +Creates a **RelativeTimeFormat** object. + +**System capability**: SystemCapability.Global.I18n Parameters +| Name| Type| Mandatory| Description| +| -------- | -------- | -------- | -------- | +| locale | string\|Array<string> | Yes| A string containing locale information, including the language, optional script, and region.| +| options | [RelativeTimeFormatInputOptions](#relativetimeformatinputoptions) | No| Options for creating a **RelativeTimeFormat** object.| + +- Example + ``` + var relativeTimeFormat = new Intl.RelativeTimeFormat("zh-CN", {"localeMatcher": "lookup", "numeric": "always", "style": "long"}); + ``` + - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

locale

-

string|Array<string>

-

Yes

-

A string containing locale information, including the language, optional script, and locale.

-

options

-

RelativeTimeFormatInputOptions

-

No

-

Options for creating a RelativeTimeFormat object.

-
- -- Example - - ``` - var relativeTimeFormat = new Intl.RelativeTimeFormat("zh-CN", {"localeMatcher": "lookup", "numeric": "always", "style": "long"}); - ``` - - -### format8+ - -format\(value: numeric, unit: string\): string +### format8+ + +format(value: numeric, unit: string): string Formats the value and unit based on the specified locale and formatting options. -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

value

-

numeric

-

Yes

-

Value to format.

-

unit

-

string

-

Yes

-

Unit to format. The value can be year, quarter, month, week, day, hour, minute, or second.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

string

-

Relative time after formatting.

-
- - -- Example - - ``` - var relativetimefmt = new Intl.RelativeTimeFormat("zh-CN"); - relativetimefmt.format(3, "quarter") - ``` - - -### formatToParts8+ - -formatToParts\(value: numeric, unit: string\): Array - -Returns an array of **RelativeTimeFormat** objects in parts for locale-aware formatting. - -- Parameters - - - - - - - - - - - - - - - - - - - -

Name

-

Type

-

Mandatory

-

Description

-

value

-

numeric

-

Yes

-

Value to format.

-

unit

-

string

-

Yes

-

Unit to format. The value can be year, quarter, month, week, day, hour, minute, or second.

-
- -- Return values - - - - - - - - - - -

Type

-

Description

-

Array<Object>

-

An array of RelativeTimeFormat objects in parts.

-
- - -- Example - - ``` - var relativetimefmt = new Intl.RelativeTimeFormat("en", {"numeric": "auto"}); - var parts = relativetimefmt.format(10, "seconds"); - ``` - - -### resolvedOptions8+ - -resolvedOptions\(\): RelativeTimeFormatResolvedOptions - -Obtains the formatting options for **RelativeTimeFormat** objects. - -- Return values - - - - - - - - - - -

Type

-

Description

-

RelativeTimeFormatResolvedOptions

-

Formatting options for RelativeTimeFormat objects.

-
- - -- Example - - ``` - var relativetimefmt= new Intl.RelativeTimeFormat("en-GB"); - relativetimefmt.resolvedOptions(); - ``` - - -## RelativeTimeFormatInputOptions8+ - -Represents the properties of a **RelativeTimeFormat** object. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

localeMatcher

-

string

-

Yes

-

Yes

-

Locale matching algorithm. The value can be lookup or best fit.

-

numeric

-

string

-

Yes

-

Yes

-

Format of the output message. The value can be always or auto.

-

style

-

string

-

Yes

-

Yes

-

Length of the internationalized message. The value can be long, short, or narrow.

-
- -## RelativeTimeFormatResolvedOptions8+ - -Represents the properties of a **RelativeTimeFormat** object. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Parameter Type

-

Readable

-

Writable

-

Description

-

locale

-

string

-

Yes

-

Yes

-

A string containing locale information, including the language, optional script, and locale.

-

numeric

-

string

-

Yes

-

Yes

-

Format of the output message. The value can be always or auto.

-

style

-

string

-

Yes

-

Yes

-

Length of the internationalized message. The value can be long, short, or narrow.

-

numberingSystem

-

string

-

Yes

-

Yes

-

Numbering system.

-
+**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | value | numeric | Yes| Value to format.| + | unit | string | Yes| Unit to format. The value can be any of the following: year, quarter, month, week, day, hour, minute, second.| + +- Return value + | Type| Description| + | -------- | -------- | + | string | Relative time after formatting.| + +- Example + ``` + var relativetimefmt = new Intl.RelativeTimeFormat("zh-CN"); + relativetimefmt.format(3, "quarter") + ``` + + +### formatToParts8+ + +formatToParts(value: numeric, unit: string): Array<Object> + +Returns an array of RelativeTimeFormat objects in parts for locale-aware formatting. + +**System capability**: SystemCapability.Global.I18n + +- Parameters + | Name| Type| Mandatory| Description| + | -------- | -------- | -------- | -------- | + | value | numeric | Yes| Value to format.| + | unit | string | Yes| Unit to format. The value can be any of the following: year, quarter, month, week, day, hour, minute, second.| + +- Return value + | Type| Description| + | -------- | -------- | + | Array<Object> | An array of **RelativeTimeFormat** objects in parts.| + +- Example + ``` + var relativetimefmt = new Intl.RelativeTimeFormat("en", {"numeric": "auto"}); + var parts = relativetimefmt.format(10, "seconds"); + ``` + + +### resolvedOptions8+ + +resolvedOptions(): RelativeTimeFormatResolvedOptions + +Obtains the formatting options for **RelativeTimeFormat** objects. + +**System capability**: SystemCapability.Global.I18n + +- Return value + | Type| Description| + | -------- | -------- | + | [RelativeTimeFormatResolvedOptions](#relativetimeformatresolvedoptions) | Formatting options for **RelativeTimeFormat** objects.| + +- Example + ``` + var relativetimefmt= new Intl.RelativeTimeFormat("en-GB"); + relativetimefmt.resolvedOptions(); + ``` + + +## RelativeTimeFormatInputOptions8+ + +Represents the properties of a **RelativeTimeFormat** object. + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| localeMatcher | string | Yes| Yes| Locale matching algorithm. The value can be **lookup** or **best fit**.
**System capability**: SystemCapability.Global.I18n| +| numeric | string | Yes| Yes| Format of the output message. The value can be **always** or **auto**.
**System capability**: SystemCapability.Global.I18n| +| style | string | Yes| Yes| Length of an internationalized message. The value can be **long**, **short**, or **narrow**.
**System capability**: SystemCapability.Global.I18n| + + +## RelativeTimeFormatResolvedOptions8+ + +Represents the properties of a **RelativeTimeFormat** object. + +| Name| Type| Readable| Writable| Description| +| -------- | -------- | -------- | -------- | -------- | +| locale | string | Yes| Yes| A string containing locale information, including the language, optional script, and region.
**System capability**: SystemCapability.Global.I18n| +| numeric | string | Yes| Yes| Format of the output message. The value can be **always** or **auto**.
**System capability**: SystemCapability.Global.I18n| +| style | string | Yes| Yes| Length of an internationalized message. The value can be **long**, **short**, or **narrow**.
**System capability**: SystemCapability.Global.I18n| +| numberingSystem | string | Yes| Yes| Numbering system.
**System capability**: SystemCapability.Global.I18n| -- Gitee From 1a2b2fecc8684dd3927bdac4ae745ae11a8bfde0 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Tue, 8 Mar 2022 16:00:10 +0800 Subject: [PATCH 224/282] fix code issue Signed-off-by: panqiangbiao --- .../application-dev/reference/apis/js-apis-medialibrary.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md index 2057d1e2ad1..06cc8523579 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md +++ b/zh-cn/application-dev/reference/apis/js-apis-medialibrary.md @@ -53,9 +53,9 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileRe **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------------- | ---- | --------------------------------- | -| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 媒体获取选项 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------------- | ---- | --------------------------------- | +| options | [MediaFetchOptions](#mediafetchoptions8) | 是 | 文件获取选项 | | callback | AsyncCallback<[FetchFileResult](#fetchfileresult8)> | 是 | 异步获取FetchFileResult之后的回调 | **示例:** -- Gitee From 6ba0fb67112758f2e02950afa3ba7e6545f1829e Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 8 Mar 2022 16:25:18 +0800 Subject: [PATCH 225/282] update docs Signed-off-by: shawn_he --- en/application-dev/reference/apis/js-apis-i18n.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/application-dev/reference/apis/js-apis-i18n.md b/en/application-dev/reference/apis/js-apis-i18n.md index 7a604fdd852..98c7ee90d3a 100644 --- a/en/application-dev/reference/apis/js-apis-i18n.md +++ b/en/application-dev/reference/apis/js-apis-i18n.md @@ -847,7 +847,7 @@ Checks whether the input character is an uppercase letter. - Return value | Type| Description| | -------- | -------- | - | boolean | The value true indicates that the input character is an uppercase letter, and value false indicates the opposite.| + | boolean | The value **true** indicates that the input character is an uppercase letter, and value **false** indicates the opposite.| - Example ``` -- Gitee From 97899289c6a92676764630c1d43e9017963fa498 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 8 Mar 2022 16:30:01 +0800 Subject: [PATCH 226/282] update docs Signed-off-by: shawn_he --- en/application-dev/reference/apis/js-apis-i18n.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/application-dev/reference/apis/js-apis-i18n.md b/en/application-dev/reference/apis/js-apis-i18n.md index 98c7ee90d3a..7a604fdd852 100644 --- a/en/application-dev/reference/apis/js-apis-i18n.md +++ b/en/application-dev/reference/apis/js-apis-i18n.md @@ -847,7 +847,7 @@ Checks whether the input character is an uppercase letter. - Return value | Type| Description| | -------- | -------- | - | boolean | The value **true** indicates that the input character is an uppercase letter, and value **false** indicates the opposite.| + | boolean | The value true indicates that the input character is an uppercase letter, and value false indicates the opposite.| - Example ``` -- Gitee From 242e9badec46c6d4dc09d72353d6816dad46e73e Mon Sep 17 00:00:00 2001 From: xuyong Date: Tue, 8 Mar 2022 16:43:48 +0800 Subject: [PATCH 227/282] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E6=98=BE=E7=A4=BA=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuyong --- en/device-dev/subsystems/subsys-dfx-hisysevent-query.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md index aae12719745..03660c68278 100644 --- a/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md +++ b/en/device-dev/subsystems/subsys-dfx-hisysevent-query.md @@ -17,7 +17,7 @@ HiSysEvent provides an API for you to query system events. You can query concern | API| Description| | -------- | --------- | -| bool HiSysEventManager::QueryHiSysEvent(struct QueryArg& queryArg, std::vector<QueryRule>& queryRules, std::shared_ptr<HiSysEventQueryCallBackBase> queryCallBack) | Queries system events by specifying search criteria such as the time segment, event domain, and event name.

Input arguments:

!9c|43S2Ch!V8aWF8m4d_1y$JkDyJP?*5X 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�3( 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 AK>z>% -- Gitee From d1810baf8f4f3e960c7745e33b3eb41175cfe2ec Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Thu, 3 Mar 2022 15:13:16 +0800 Subject: [PATCH 081/282] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=B3=95jsapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyongfei --- .../reference/apis/Readme-CN.md | 2 + .../reference/apis/js-apis-inputmethod.md | 202 +++++ .../apis/js-apis-inputmethodengine.md | 741 ++++++++++++++++++ 3 files changed, 945 insertions(+) create mode 100644 zh-cn/application-dev/reference/apis/js-apis-inputmethod.md create mode 100644 zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md diff --git a/zh-cn/application-dev/reference/apis/Readme-CN.md b/zh-cn/application-dev/reference/apis/Readme-CN.md index 184a5d5467b..532f240e1d0 100644 --- a/zh-cn/application-dev/reference/apis/Readme-CN.md +++ b/zh-cn/application-dev/reference/apis/Readme-CN.md @@ -81,6 +81,8 @@ - [WebGL](js-apis-webgl.md) - [WebGL2](js-apis-webgl2.md) - [屏幕截图](js-apis-screenshot.md) + - [输入法框架](js-apis-inputmethod.md) + - [输入法服务](js-apis-inputmethodengine.md) - DFX - [应用打点](js-apis-hiappevent.md) - [性能打点](js-apis-hitracemeter.md) diff --git a/zh-cn/application-dev/reference/apis/js-apis-inputmethod.md b/zh-cn/application-dev/reference/apis/js-apis-inputmethod.md new file mode 100644 index 00000000000..3824dc28314 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-inputmethod.md @@ -0,0 +1,202 @@ +# 输入法框架 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import inputMethod from '@ohos.inputMethod'; +``` + +## inputMethod8+ + +常量值。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| MAX_TYPE_NUM | number | 是 | 否 | 可支持的最大输入法个数。
**系统能力**: SystemCapability.MiscServices.InputMethod | + + +## InputMethodProperty8+
+ +输入法应用属性。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| packageName | string | 是 | 否 | 包名。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| methodId | string | 是 | 否 | Ability名。
**系统能力**: SystemCapability.MiscServices.InputMethod | + +## inputMethod.getInputMethodController + +getInputMethodController(): InputMethodController + +获取客户端实例[InputMethodController](#InputMethodController)。 + +**系统能力**:SystemCapability.MiscServices.InputMethod + +- 返回值 + + | 类型 | 说明 | + | -------- | -------- | + | [InputMethodController](#InputMethodController) | 回调返回当前客户端实例。 | + +- 示例 + ``` + var InputMethodController = inputMethod.getInputMethodController(); + ``` +## inputMethod.getInputMethodSetting8+ + +getInputMethodSetting(): InputMethodSetting + +获取客户端设置实例[InputMethodSetting](#InputMethodSetting)。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 返回值 + + | 类型 | 说明 | + | ----------------------------------------- | ---------------------------- | + | [InputMethodSetting](#InputMethodSetting) | 回调返回当前客户端设置实例。 | + + +- 示例 + ``` + var InputMethodSetting = inputMethod.getInputMethodSetting(); + ``` + +## InputMethodController + +下列API示例中都需使用[getInputMethodController](#getInputMethodController)回调获取到InputMethodController实例,再通过此实例调用对应方法 + +### stopInput + +stopInput(callback: AsyncCallback<boolean>): void + +隐藏输入法。 + +**系统能力**:SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<boolean> | 是 | 返回输入法隐藏是否成功。 | + +- 示例 + +``` + InputMethodController.stopInput((error)=>{ + console.info('stopInput'); + }); +``` + +### stopInput + +stopInput(): Promise<boolean> + +隐藏输入法。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | Promise<boolean> | 是 | 返回输入法隐藏是否成功。 | + +- 示例 + + +``` + var isSuccess = InputMethodController.stopInput(); + console.info('stopInput isSuccess = ' + isSuccess); +``` + +## InputMethodSetting + +下列API示例中都需使用[getInputMethodSetting](#getInputMethodSetting)回调获取到InputMethodSetting实例,再通过此实例调用对应方法 + +### listInputMethod8+ + +listInputMethod(callback: AsyncCallback<Array<InputMethodProperty>>): void + +查询已安装的输入法列表。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Array<[InputMethodProperty](#InputMethodProperty)> | 返回已安装输入法列表。 | + +- 示例 + ``` + InputMethodSetting.listInputMethod((properties)=>{ + var property = properties[i]; + console.info(property.packageName + "/" + property.methodId); + }); + ``` + +### listInputMethod8+ + +listInputMethod(): Promise<Array<InputMethodProperty>> + +查询已安装的输入法列表。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Array<[InputMethodProperty](#InputMethodProperty)> | 返回已安装输入法列表。 | + +- 示例 + ``` + var properties = InputMethodSetting.listInputMethod(); + for (var i = 0;i < properties.length; i++) { + var property = properties[i]; + console.info(property.packageName + "/" + property.methodId); + } + ``` + +### displayOptionalInputMethod8+ + +displayOptionalInputMethod(callback: AsyncCallback<void>): void + +显示输入法选择对话框。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + ``` + InputMethodSetting.displayOptionalInputMethod(()=>{ + console.info('displayOptionalInputMethod is called'); + }); + ``` + +### displayOptionalInputMethod8+ + + displayOptionalInputMethod(): Promise<void> + + 显示输入法选择对话框。 + + **系统能力**: SystemCapability.MiscServices.InputMethod + +- 返回值 + +| 参数名 | 说明 | +| -------- | -------- | +| Promise<void> | 回调函数。 | + + - 示例 + ``` + InputMethodSetting.displayOptionalInputMethod(); + ``` \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md new file mode 100644 index 00000000000..6d7e7e6f862 --- /dev/null +++ b/zh-cn/application-dev/reference/apis/js-apis-inputmethodengine.md @@ -0,0 +1,741 @@ +# 输入法服务 + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +``` +import inputMethodEngine from '@ohos.inputMethodEngine'; +``` + +## inputMethodEngine + +常量值。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| ENTER_KEY_TYPE_UNSPECIFIED | number | 是 | 否 | 无功能键。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| ENTER_KEY_TYPE_GO | number | 是 | 否 | “前往”功能键。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| ENTER_KEY_TYPE_SEARCH | number | 是 | 否 | “搜索”功能键。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| ENTER_KEY_TYPE_SEND | number | 是 | 否 | “发送”功能键。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| ENTER_KEY_TYPE_NEXT | number | 是 | 否 | “下一个”功能键。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| ENTER_KEY_TYPE_DONE | number | 是 | 否 | “回车”功能键。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| ENTER_KEY_TYPE_PREVIOUS | number | 是 | 否 | “前一个”功能键。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_NULL | number | 是 | 否 | 无特殊性编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_TEXT | number | 是 | 否 | 文本编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_NUMBER | number | 是 | 否 | 数字编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_PHONE | number | 是 | 否 | 电话编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_DATETIME | number | 是 | 否 | 日期编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_EMAIL | number | 是 | 否 | 邮件编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_URI | number | 是 | 否 | 超链接编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| PATTERN_PASSWORD | number | 是 | 否 | 密码编辑框。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| OPTION_ASCII | number | 是 | 否 | 允许输入ASCII值。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| OPTION_NONE | number | 是 | 否 | 不指定编辑框输入属性。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| OPTION_AUTO_CAP_CHARACTERS | number | 是 | 否 | 允许输入字符。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| OPTION_AUTO_CAP_SENTENCES | number | 是 | 否 | 允许输入句子。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| OPTION_AUTO_WORDS | number | 是 | 否 | 允许输入单词。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| OPTION_MULTI_LINE | number | 是 | 否 | 允许输入多行。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| OPTION_NO_FULLSCREEN | number | 是 | 否 | 半屏样式。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| FLAG_SELECTING | number | 是 | 否 | 编辑框处于选择状态。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| FLAG_SINGLE_LINE | number | 是 | 否 | 编辑框为单行。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| DISPLAY_MODE_PART | number | 是 | 否 | 编辑框显示为半屏。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| DISPLAY_MODE_FULL | number | 是 | 否 | 编辑框显示为全屏。
**系统能力**: SystemCapability.MiscServices.InputMethod | + +## inputMethodEngine.getInputMethodEngine + +getInputMethodEngine(): InputMethodEngine + +获取服务端实例[InputMethodEngine](#InputMethodEngine)。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 返回值 + + | 类型 | 说明 | + | --------------------------------------- | ------------ | + | [InputMethodEngine](#InputMethodEngine) | 服务端实例。 | + +- 示例 + + ``` + var InputMethodEngine = inputMethodEngine.getInputMethodEngine(); + ``` + +## inputMethodEngine.createKeyboardDelegate + +createKeyboardDelegate(): KeyboardDelegate + +获取客户端监听实例[KeyboardDelegate](#KeyboardDelegate)。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 返回值 + + | 类型 | 说明 | + | ------------------------------------- | ---------------- | + | [KeyboardDelegate](#KeyboardDelegate) | 客户端监听实例。 | + +- 示例 + + ``` + var KeyboardDelegate = inputMethodEngine.createKeyboardDelegate(); + ``` + +## InputMethodEngine + +下列API示例中都需使用[getInputMethodEngine](#getInputMethodEngine)回调获取到InputMethodEngine实例,再通过此实例调用对应方法。 + +### on('inputStart') + +on(type: 'inputStart', callback: (kbController: KeyboardController, textInputClient: TextInputClient) => void): void; + +订阅输入法绑定成功事件,使用callback输入法操作相关实例。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数: + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 设置监听类型。
-type为‘inputStart’时表示订阅输入法绑定。 | +| callback | [KeyboardController](#KeyboardController), [TextInputClient](#TextInputClient) | 是 | 回调返回监听到的信息。 | + +- 示例: + + ``` + InputMethodEngine.on('inputStart', (kbController, textInputClient) => { + KeyboardController = kbController; + TextInputClient = textInputClient; + }); + ``` + +### off('inputStart') + +off(type: 'inputStart', callback?: (kbController: KeyboardController, textInputClient: TextInputClient) => void): void; + +取消订阅输入法绑定成功事件。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------------------- | ---- | ------------------------ | + | type | string | 是 | 设置监听类型。
-type为‘inputStart’时表示订阅输入法绑定。 | + | callback | [KeyboardController](#KeyboardController), [TextInputClient](#TextInputClient) | 否 | 回调返回监听到的信息。 | + + + +- 示例: + + ``` + InputMethodEngine.off('inputStart'); + ``` + +### on('keyboardShow'|'keyboardHide') + +on(type: 'keyboardShow'|'keyboardHide', callback: () => void): void; + +订阅输入法事件。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------ | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'keyboardShow',表示订阅输入法显示。
- type为'keyboardHide',表示订阅输入法隐藏。 | + | callback | void | 否 | 无返回值。 | + +- 示例: + + ``` + InputMethodEngine.on('keyboardShow', (err) => { + console.info('keyboardShow'); + }); + ``` + +### off('keyboardShow'|'keyboardHide') + +off(type: 'keyboardShow'|'keyboardHide', callback?: () => void): void; + +取消订阅输入法事件。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------ | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'keyboardShow',表示订阅输入法显示。
- type为'keyboardHide',表示订阅输入法隐藏。 | + | callback | void | 否 | 无返回值。 | + +- 示例: + + ``` + InputMethodEngine.off('keyboardShow'); + ``` + + +## KeyboardDelegate + +下列API示例中都需使用[createKeyboardDelegate](#createKeyboardDelegate)回调获取到TextInputClient实例,再通过此实例调用对应方法。 + +### on('keyDown'|'keyUp') + +on(type: 'keyDown'|'keyUp', callback: (event: KeyEvent) => boolean): void; + +订阅硬键盘事件,使用callback回调按键信息。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'keyDown',表示订阅硬键盘按下。
- type为'keyUp',表示订阅硬键盘抬起。 | + | callback | [KeyEvent](#KeyEvent) | 是 | 回调返回按键信息。 | + + + +- 示例: + + ``` + KeyboardDelegate.on('keyDown', (event) => { + console.info('keyDown'); + }); + ``` + +### off('keyDown'|'keyUp') + +off(type: 'keyDown'|'keyUp', callback?: (event: KeyEvent) => boolean): void; + +取消订阅硬键盘事件。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 设置监听类型。
- type为'keyDown',表示订阅硬键盘按下。
- type为'keyUp',表示订阅硬键盘抬起。 | + | callback | [KeyEvent](#KeyEvent) | 否 | 回调返回监听到的信息。 | + +- 示例: + + ``` + KeyboardDelegate.off('keyDown'); + ``` + +### on('cursorContextChange') + +on(type: 'cursorContextChange', callback: (x: number, y:number, height:number) => void): void; + +订阅光标变化事件,使用callback返回光标信息。 + + **系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------ | ---- | ------------------------------------------------------------ | + | type | string | 是 | 光标变化事件。
-type为’cursorContextChange‘时,表示光标变化。 | + | callback | number | 是 | 回调返回监听到的信息。 | + + + + - 示例: + + ``` + KeyboardDelegate.on('cursorContextChange', (x, y, height) => { + console.info('cursorContextChange'); + }); + ``` + +### off('cursorContextChange') + +off(type: 'cursorContextChange', callback?: (x: number, y:number, height:number) => void): void; + +取消订阅光标变化事件。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------------------- | ---- | ------------------------ | + | type | string | 是 | 光标变化事件。
-type为’cursorContextChange‘时,表示光标变化。 | + | callback | number | 否 | 回调返回监听到的信息。 | + + + - 示例: + + ``` + KeyboardDelegate.off('cursorContextChange'); + ``` +### on('selectionChange') + +on(type: 'selectionChange', callback: (oldBegin: number, oldEnd: number, newBegin: number, newEnd: number) => void): void; + +订阅文本选择变化事件,使用callback回调文本选择信息。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------ | ---- | ------------------------------------------------------------ | + | type | string | 是 | 文本选择变化事件。
-type为’selectionChange‘时,表示选择文本变化。 | + | callback | number | 是 | 回调返回监听到的信息。 | + + - 示例: + + ``` + KeyboardDelegate.on('selectionChange', (oldBegin, oldEnd, newBegin, newEnd) => { + console.info('selectionChange'); + }); + ``` + +### off('selectionChange') + +off(type: 'selectionChange', callback?: (oldBegin: number, oldEnd: number, newBegin: number, newEnd: number) => void): void; + +取消订阅文本选择变化事件。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------------------- | ---- | ------------------------ | + | type | string | 是 | 文本选择变化事件。
-type为’selectionChange‘时,表示选择文本变化。 | + | callback | number | 否 | 回调返回监听到的信息。 | + + - 示例: + + ``` + KeyboardDelegate.off('selectionChange'); + ``` + + +### on('textChange') + +on(type: 'textChange', callback: (text: string) => void): void; + +订阅文本变化事件,使用callback回调当前文本内容。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------- | ---- | ------------------------------------------------------------ | + | type | string | 是 | 文本变化事件。
-type为’textChange‘时,表示当前文本变化。 | + | callback | string | 是 | 回调返回监听到的信息。 | + + - 示例: + + ``` + KeyboardDelegate.on('textChange', (text) => { + console.info('textChange'); + }); + ``` + +### off('textChange') + +off(type: 'textChange', callback?: (text: string) => void): void; + +取消订阅文本变化事件。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数: + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------------------- | ---- | ------------------------ | + | type | string | 是 | 文本变化事件。
-type为’textChange‘时,表示当前文本变化。 | + | callback | string | 否 | 回调返回监听到的信息。 | + + - 示例: + + ``` + KeyboardDelegate.off('textChange'); + ``` + + + +## KeyboardController + +下列API示例中都需使用[inputStart](#inputStart)回调获取到KeyboardController实例,再通过此实例调用对应方法。 + +### hideKeyboard + +hideKeyboard(callback: AsyncCallback<void>): void + +隐藏输入法。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 示例 + + +``` + KeyboardController.hideKeyboard(()=>{ + }); +``` + +### hideKeyboard + +hideKeyboard(): Promise<void> + +隐藏输入法。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 示例 + + +``` + KeyboardController.hideKeyboard(); +``` + +## TextInputClient + +下列API示例中都需使用[inputStart](#inputStart)回调获取到TextInputClient实例,再通过此实例调用对应方法。 + +### getForward + +getForward(length:number, callback: AsyncCallback<string>): void + +获取光标前固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + | callback | AsyncCallback<string> | 是 | 返回文本。 | + +- 示例 + ``` + var text = TextInputClient.getForward(5,(text) =>{ + console.info("text = " + text); + }); + ``` + +### getForward + +getForward(length:number): Promise<string> + +获取光标前固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + +- 返回值 + ​ + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Promise<string> | 返回文本。 | + + ​ + +- 示例 + ``` + var text = TextInputClient.getForward(5); + console.info("text = " + text); + ``` + +### getBackward + +getBackward(length:number, callback: AsyncCallback<string>): void + +获取光标后固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + | callback | AsyncCallback<string> | 是 | 返回文本。 | + +- 示例 + ``` + var text = TextInputClient.getBackward(5,(text)=>{ + console.info("text = " + text); + }); + ``` + +### getBackward + +getBackward(length:number): Promise<string> + +获取光标后固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Promise<string> | 返回文本。 | + +- 示例 + ``` + var text = TextInputClient.getBackward(5); + console.info("text = " + text); + ``` + +### deleteForward + +deleteForward(length:number, callback: AsyncCallback<boolean>): void + +删除光标前固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + | callback | AsyncCallback<boolean> | 是 | 操作成功与否。 | + +- 示例 + ``` + TextInputClient.deleteForward(5,(isSuccess)=>{ + console.info("isSuccess = " + isSuccess); + }); + ``` +### deleteForward + +deleteForward(length:number): Promise<boolean> + +删除光标前固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Promise<boolean> | 操作成功与否。 | + + - 示例 + ``` + var isSuccess = TextInputClient.deleteForward(5); + console.info("isSuccess = " + isSuccess); + ``` + +### deleteBackward + +deleteBackward(length:number, callback: AsyncCallback<boolean>): void + +删除光标后固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + | callback | AsyncCallback<boolean> | 是 | 操作成功与否。 | + + - 示例 + ``` + TextInputClient.deleteBackward(5, (isSuccess)=>{ + console.info("isSuccess = " + isSuccess); + }); + ``` + +### deleteBackward + +deleteBackward(length:number): Promise<boolean> +删除光标后固定长度的文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Promise<boolean> | 操作成功与否。 | + +- 示例 + + ``` + var isSuccess = TextInputClient.deleteBackward(5); + console.info("isSuccess = " + isSuccess); + ``` +### sendKeyFunction + +sendKeyFunction(action:number, callback: AsyncCallback<boolean>): void + +发送功能键。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + + - 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + | callback | AsyncCallback<boolean> | 是 | 操作成功与否。 | + + - 示例 + ``` + TextInputClient.sendKeyFunction(inputMethod.ENTER_KEY_TYPE_NEXT,(isSuccess)=>{ + console.info("isSuccess = " + isSuccess); + }); + ``` + +### sendKeyFunction + +sendKeyFunction(action:number): Promise<boolean> + +发送功能键。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | length | number | 是 | 文本长度。 | + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Promise<boolean> | 操作成功与否。 | + +- 示例 + + ``` + var isSuccess = TextInputClient.sendKeyFunction(inputMethod.ENTER_KEY_TYPE_NEXT); + console.info("isSuccess = " + isSuccess); + ``` + +### insertText + +insertText(text:string, callback: AsyncCallback<boolean>): void + +插入文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | text | string | 是 | 文本。 | + | callback | AsyncCallback<boolean> | 是 | 操作成功与否。 | + +- 示例 + ``` + TextInputClient.insertText("test", (isSuccess)=>{ + console.info("isSuccess = " + isSuccess); + }); + ``` + +### insertText + +insertText(text:string): Promise<boolean> +插入文本。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | text | string | 是 | 文本。 | + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Promise<boolean> | 操作成功与否。 | + +- 示例 + + ``` + var isSuccess = TextInputClient.insertText("test"); + console.info("isSuccess = " + isSuccess); + ``` + +### getEditorAttribute + +getEditorAttribute(callback: AsyncCallback<EditorAttribute>): void + +获取编辑框属性[EditorAttribute](#EditorAttribute)实例。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | + | callback | AsyncCallback<EditorAttribute> | 是 | 编辑框属性实例。 | + + - 示例 + ``` + TextInputClient.getEditorAttribute((EditorAttribute)=>{ + }); + ``` + +### getEditorAttribute + +getEditorAttribute(): Promise<EditorAttribute> +获取编辑框属性[EditorAttribute](#EditorAttribute)实例。 + +**系统能力**: SystemCapability.MiscServices.InputMethod + +- 返回值 + | 类型 | 说明 | + | ------------------------------- | ------------------------------------------------------------ | + | Promise<EditorAttribute> | 返回编辑框属性实例。 | + +- 示例 + ``` + var EditorAttribute = TextInputClient.getEditorAttribute(); + ``` + +## EditorAttribute + +编辑框属性值。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| ------------ | -------- | ---- | ---- | ------------------------------------------------------------ | +| enterKeyType | number | 是 | 否 | 功能键属性。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| inputPattern | number | 是 | 否 | 编辑框属性。
**系统能力**: SystemCapability.MiscServices.InputMethod | + +## KeyEvent + +按键属性值 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| --------- | -------- | ---- | ---- | ------------------------------------------------------------ | +| keyCode | number | 是 | 否 | 键值。
**系统能力**: SystemCapability.MiscServices.InputMethod | +| keyAction | number | 是 | 否 | 按键状态。
**系统能力**: SystemCapability.MiscServices.InputMethod | + -- Gitee From 985bc3c1f1daf934e1e13ad4cb92a94e871cadc2 Mon Sep 17 00:00:00 2001 From: wusongqing Date: Thu, 3 Mar 2022 15:45:31 +0800 Subject: [PATCH 082/282] updated docs Signed-off-by: wusongqing --- .../reference/apis/Readme-EN.md | 29 +- .../reference/arkui-js/Readme-EN.md | 2 +- .../reference/arkui-ts/Readme-EN.md | 2 +- ...ionsheet.md => ts-methods-action-sheet.md} | 0 .../ui/ts-application-resource-access.md | 184 -- ...lication-states-storagelink-storageprop.md | 54 - en/device-dev/driver/driver-peripherals.md | 3 + en/device-dev/faqs/Readme-EN.md | 2 +- ...tartup-and-recovery.md => faqs-startup.md} | 2 +- .../kernel/kernel-small-debug-user.md | 6 - en/device-dev/subsystems/subsys-build.md | 2 + en/device-dev/subsystems/subsys-dfx.md | 3 + ...RK-Runtime-Subsystem.md => ark-runtime.md} | 0 en/readme/{kernel-subsystem.md => kernel.md} | 0 en/readme/{test_subsystem.md => test.md} | 0 en/readme/testing.md | 513 ----- en/readme/{subsys-user-iam.md => user-iam.md} | 0 en/readme/{x-test-suite.md => xts.md} | 0 en/website-directory.md | 1869 +++++++++++++++++ zh-cn/application-dev/database/Readme-CN.md | 2 +- ...41\347\214\256\346\214\207\345\215\227.md" | 17 + zh-cn/device-dev/faqs/Readme-CN.md | 2 +- ...tartup-and-recovery.md => faqs-startup.md} | 0 zh-cn/device-dev/subsystems/subsys-dfx.md | 4 + 24 files changed, 1922 insertions(+), 774 deletions(-) rename en/application-dev/reference/arkui-ts/{ts-methods-custom-actionsheet.md => ts-methods-action-sheet.md} (100%) delete mode 100644 en/application-dev/ui/ts-application-resource-access.md delete mode 100644 en/application-dev/ui/ts-application-states-storagelink-storageprop.md rename en/device-dev/faqs/{faqs-startup-and-recovery.md => faqs-startup.md} (97%) rename en/readme/{ARK-Runtime-Subsystem.md => ark-runtime.md} (100%) rename en/readme/{kernel-subsystem.md => kernel.md} (100%) rename en/readme/{test_subsystem.md => test.md} (100%) delete mode 100755 en/readme/testing.md rename en/readme/{subsys-user-iam.md => user-iam.md} (100%) rename en/readme/{x-test-suite.md => xts.md} (100%) mode change 100755 => 100644 create mode 100644 en/website-directory.md create mode 100644 "zh-cn/contribute/\350\264\241\347\214\256\346\214\207\345\215\227.md" rename zh-cn/device-dev/faqs/{faqs-startup-and-recovery.md => faqs-startup.md} (100%) diff --git a/en/application-dev/reference/apis/Readme-EN.md b/en/application-dev/reference/apis/Readme-EN.md index 5e372b0913e..e762c752f19 100644 --- a/en/application-dev/reference/apis/Readme-EN.md +++ b/en/application-dev/reference/apis/Readme-EN.md @@ -5,28 +5,29 @@ - [ParticleAbility Module](js-apis-particleAbility.md) - [DataAbilityHelper Module](js-apis-dataAbilityHelper.md) - [DataUriUtils Module](js-apis-DataUriUtils.md) + - [Bundle Module](js-apis-Bundle.md) - [Context Module](js-apis-Context.md) - Event Notification - [CommonEvent Module](js-apis-commonEvent.md) - [Notification Module](js-apis-notification.md) - [Reminder Agent](js-apis-reminderAgent.md) -- Resource Management +- Resource Management - [Resource Manager](js-apis-resource-manager.md) - [Internationalization \(intl\) ](js-apis-intl.md) - [Internationalization \(i18n\) ](js-apis-i18n.md) -- Media +- Media - [Audio Management](js-apis-audio.md) - [Media](js-apis-media.md) -- Security +- Security - [User Authentication](js-apis-useriam-userauth.md) - [Access Control](js-apis-abilityAccessCtrl.md) -- Data Management - - [File Management](js-apis-fileio.md) - - [Lightweight Storage](js-apis-data-storage.md) +- Data Management + - [Lightweight Storage (deprecated since 8)](js-apis-data-storage.md) - [Distributed Data Management](js-apis-distributed-data.md) - [Relational Database](js-apis-data-rdb.md) - [Result Set](js-apis-data-resultset.md) - [DataAbilityPredicates](js-apis-data-ability.md) + - [Settings](js-apis-settings.md) - File Management - [File Management](js-apis-fileio.md) - [Statfs](js-apis-statfs.md) @@ -42,10 +43,11 @@ - [SMS](js-apis-sms.md) - [SIM Management](js-apis-sim.md) - [Radio](js-apis-radio.md) -- Network and Connectivity +- Network and Connectivity - [WLAN](js-apis-wifi.md) -- Device Management - - [Sensors](js-apis-sensor.md) + - [Bluetooth](js-apis-bluetooth.md) +- Device Management + - [Sensor](js-apis-sensor.md) - [Vibrator](js-apis-vibrator.md) - [Brightness](js-apis-brightness.md) - [Battery Info](js-apis-battery-info.md) @@ -58,7 +60,7 @@ - [Display](js-apis-display.md) - [Update](js-apis-update.md) - [USB](js-apis-usb.md) -- Basic Features +- Basic Features - [Application Context](js-apis-basic-features-app-context.md) - [Console Logs](js-apis-basic-features-logs.md) - [Page Routing](js-apis-basic-features-routes.md) @@ -67,12 +69,17 @@ - [Timer](js-apis-basic-features-timer.md) - [Setting the System Time](js-apis-system-time.md) - [Animation](js-apis-basic-features-animator.md) + - [WebGL](js-apis-webgl.md) + - [WebGL2](js-apis-webgl2.md) +- DFX - [HiAppEvent](js-apis-hiappevent.md) - [Performance Tracing](js-apis-hitracemeter.md) - [Fault Logger](js-apis-faultLogger.md) - [Distributed Call Chain Tracing](js-apis-hitracechain.md) - [HiLog](js-apis-hilog.md) -- Language Base Class Library + - [HiChecker](js-apis-hichecker.md) + - [HiDebug](js-apis-hidebug.md) +- Language Base Class Library - [Obtaining Process Information](js-apis-process.md) - [URL String Parsing](js-apis-url.md) - [URI String Parsing](js-apis-uri.md) diff --git a/en/application-dev/reference/arkui-js/Readme-EN.md b/en/application-dev/reference/arkui-js/Readme-EN.md index d9159c600a7..02a9479f1d2 100644 --- a/en/application-dev/reference/arkui-js/Readme-EN.md +++ b/en/application-dev/reference/arkui-js/Readme-EN.md @@ -64,7 +64,7 @@ - [Media Components](js-components-media.md) - [video](js-components-media-video.md) - - [Canvas Components ](js-components-canvas.md) + - [Canvas Components](js-components-canvas.md) - [canvas](js-components-canvas-canvas.md) - [CanvasRenderingContext2D](js-components-canvas-canvasrenderingcontext2d.md) - [Image](js-components-canvas-image.md) diff --git a/en/application-dev/reference/arkui-ts/Readme-EN.md b/en/application-dev/reference/arkui-ts/Readme-EN.md index 634f77c8f6c..7924866850f 100644 --- a/en/application-dev/reference/arkui-ts/Readme-EN.md +++ b/en/application-dev/reference/arkui-ts/Readme-EN.md @@ -126,7 +126,7 @@ - [Custom Dialog box](ts-methods-custom-dialog-box.md) - [Image Cache](ts-methods-image-cache.md) - [Media Query](ts-methods-media-query.md) - - [List Selection Dialog Box](ts-methods-custom-actionsheet.md) + - [List Selection Dialog Box](ts-methods-action-sheet.md) - [Appendix](ts-appendix.md) - [Built-in Enums](ts-appendix-enums.md) diff --git a/en/application-dev/reference/arkui-ts/ts-methods-custom-actionsheet.md b/en/application-dev/reference/arkui-ts/ts-methods-action-sheet.md similarity index 100% rename from en/application-dev/reference/arkui-ts/ts-methods-custom-actionsheet.md rename to en/application-dev/reference/arkui-ts/ts-methods-action-sheet.md diff --git a/en/application-dev/ui/ts-application-resource-access.md b/en/application-dev/ui/ts-application-resource-access.md deleted file mode 100644 index 15c34218bba..00000000000 --- a/en/application-dev/ui/ts-application-resource-access.md +++ /dev/null @@ -1,184 +0,0 @@ -# Accessing Application Resources - -## Resource Definition - -Application resources are defined by in the project's **resources** directory, which is organized as follows: - -- Level-1: **base** sub-directory, qualifiers sub-directories, and **rawfile** sub-directory - - The **base** sub-directory is a default directory. If no qualifiers sub-directories in the **resources** directory of the application match the device status, the resource file in the **base** sub-directory will be automatically referenced. - - You need to create qualifiers sub-directories on your own. The name of a qualifiers sub-directory consists of one or more qualifiers that represent the application scenarios or device characteristics, covering the mobile country code \(MCC\), mobile network code \(MNC\), language, script, country or region, screen orientation, device type, color mode, and screen density. The qualifiers are separated using underscores \(\_\) or hyphens \(-\). - - When the resources in the **rawfile** sub-directory are referenced, resource files will not be matched based on the device status. You can directly store resource files in the **rawfile** sub-directory. - -- Level-2: resource sub-directories - - Resource sub-directories store basic elements such as character strings, colors, and floating point numbers, and resource files such as media files. - - Supported files and resource types are listed in the table below: - - - - - - - - - - - - - - - - - - - - - - -

File Name

-

Resource Type

-

color.json

-

Color resource.

-

float.json

-

Resources such as spacing, rounded corners, and fonts.

-

string.json

-

String resource.

-

plural.json

-

String resource.

-

media directory

-

Image resource.

-
- - - -## Referencing Resources - -To reference an application resource in a project, use the **"$r\('app.type.name'\)"** format. **app** indicates the resource defined in the **resources** directory of the application. **type** indicates the resource type \(or the location where the resource is stored\). The value can be **color**, **float**, **string**, **plural**, or **media**. **name** indicates the resource name, which you set when defining the resource. - -When referencing resources in the **rawfile** sub-directory, use the **"$rawfile\('filename'\)"** format. Currently, **$rawfile** allows only the **** component to reference image resources. In the format, **filename** indicates the relative path of a file in the **rawfile** directory, and the file name must contain the file name extension. Note that the relative path cannot start with a slash \(/\). - -## Example - -Some custom resources in the **base** sub-directory are as follows: - -``` - resources - ├─ base - │ ├─ element - │ │ ├─ color.json - │ │ ├─ string.json - │ │ └─ float.json - │ └─ media - │ └─ my_background_image.png - └─ rawfile - ├─ test.png - └─ newDir - └─ newTest.png -``` - -The content of the **color.json** file is as follows: - -``` -{ - "color": [ - { - "name": "color_hello", - "value": "#ffff0000" - }, - { - "name": "color_world", - "value": "#ff0000ff" - } - ] -} -``` - -The content of the **float.json** file is as follows: - -``` -{ - "float":[ - { - "name":"font_hello", - "value":"28.0fp" - }, - { - "name":"font_world", - "value":"20.0fp" - } - ] -} -``` - -The content of the **string.json** file is as follows: - -``` -{ - "string":[ - { - "name":"string_hello", - "value":"Hello" - }, - { - "name":"string_world", - "value":"World" - }, - { - "name":"message_arrive", - "value":"We will arrive at %s." - } - ] -} -``` - -The content of the **plural.json** file is as follows: - -``` -{ - "plural":[ - { - "name":"eat_apple", - "value":[ - { - "quantity":"one", - "value":"%d apple" - }, - { - "quantity":"other", - "value":"%d apples" - } - ] - } - ] -} -``` - -In the **ets** file, you can use the resources defined in the **resources** directory. - -``` -Text($r('app.string.string_hello')) - .fontColor($r('app.color.color_hello')) - .fontSize($r('app.float.font_hello')) -} - -Text($r('app.string.string_world')) - .fontColor($r('app.color.color_world')) - .fontSize($r('app.float.font_world')) -} - -Text($r('app.string.message_arrive', "five of the clock")) // Reference string resources. The second parameter of $r is used to replace %s. - .fontColor($r('app.color.color_hello')) - .fontSize($r('app.float.font_hello')) -} - -Text($r('app.plural.eat_apple', 5, 5)) // Reference plural resources. The first parameter specifies the plural resource, and the second parameter specifies the number of plural resources. The third number indicates the substitute of %d. - .fontColor($r('app.color.color_world')) - .fontSize($r('app.float.font_world')) -} - -Image($r(?app.media.my_background_image creation)) // Reference media resources. - -Image($rawfile( Femaletest.png loaded)) // Reference an image in the rawfile directory. - -Image($rawfile(newDir/newTest.png loaded)) // Reference an image in the rawfile directory. -``` - diff --git a/en/application-dev/ui/ts-application-states-storagelink-storageprop.md b/en/application-dev/ui/ts-application-states-storagelink-storageprop.md deleted file mode 100644 index c2c4f351939..00000000000 --- a/en/application-dev/ui/ts-application-states-storagelink-storageprop.md +++ /dev/null @@ -1,54 +0,0 @@ -# Synchronization Between AppStorage and Components - -In [Managing Component States](ts-component-states-state.md), we have defined how to synchronize the state variables of the child components with the **@State** decorated variables in the parent component or ancestor component, including **@Prop**, **@Link**, and **@Consume**. - -In this section, we'll describe how to synchronize component variables with the **AppStorage** through the **@StorageLink** and **@StorageProp** decorators. - -## @StorageLink Decorator - -Two-way data binding can be established between components and the **AppStorage** through state variables decorated by **@StorageLink\(_key_\)**. Wherein, **key** is the attribute key value in the **AppStorage**. When a component containing the **@StorageLink** decorated variable is created, the variable is initialized using the value in the **AppStorage**. Changes made to this variable in the component will be first synchronized to the **AppStorage**, and then to other bound instances, such as **PersistentStorage** or other bound UI components. - -## @StorageProp Decorator - -One-way data binding can be established between components and the **AppStorage** through state variables decorated by **@StorageProp\(_key_\)**. Wherein, **key** is the attribute key value in the **AppStorage**. When a component containing the **StorageProp** decorated variable is created, the variable is initialized using the value in the **AppStorage**. The change to the attribute value in the **AppStorage** will cause the bound UI component to update the state. - -## Example - -``` -let varA = AppStorage.Link('varA') -let envLang = AppStorage.Prop('languageCode') - -@Entry -@Component -struct ComponentA { - @StorageLink('varA') varA: number = 2 - @StorageProp('languageCode') lang: string = 'en' - private label: string = 'count' - - private aboutToAppear() { - this.label = (this.lang === 'en') ? 'Number' : 'Count' - } - - build() { - Row({ space: 20 }) { - - Button(`${this.label}: ${this.varA}`) - .onClick(() => { - AppStorage.Set('varA', AppStorage.Get('varA') + 1) - }) - Button(`lang: ${this.lang}`) - .onClick(() => { - if (this.lang === 'zh') { - AppStorage.Set('languageCode', 'en') - } else { - AppStorage.Set('languageCode', 'en') - } - this.label = (this.lang === 'en') ? 'Number' : 'Count' - }) - } - } -} -``` - -Each time the user clicks the **Count** button, the value of **this.varA** will increase by 1. This variable is synchronized with **varA** in the **AppStorage**. Each time the user clicks the language icon, the value of **languageCode** in the **AppStorage** will be changed, and the change will be synchronized to the **this.lang** variable. - diff --git a/en/device-dev/driver/driver-peripherals.md b/en/device-dev/driver/driver-peripherals.md index 4b65137ea60..e4137579577 100644 --- a/en/device-dev/driver/driver-peripherals.md +++ b/en/device-dev/driver/driver-peripherals.md @@ -10,4 +10,7 @@ - **[Audio](driver-peripherals-audio-des.md)** +- **[USB](driver-peripherals-usb-des.md)** + +- **[Camera](driver-peripherals-camera-des.md)** diff --git a/en/device-dev/faqs/Readme-EN.md b/en/device-dev/faqs/Readme-EN.md index 56e61019cc1..cc68918bdf7 100644 --- a/en/device-dev/faqs/Readme-EN.md +++ b/en/device-dev/faqs/Readme-EN.md @@ -6,6 +6,6 @@ - [Burning](faqs-burning.md) - [Kernel](faqs-kernel.md) - [Porting](faqs-porting.md) -- [Startup and Recovery](faqs-startup-and-recovery.md) +- [Startup](faqs-startup.md) - [System Applications](faqs-system-applications.md) diff --git a/en/device-dev/faqs/faqs-startup-and-recovery.md b/en/device-dev/faqs/faqs-startup.md similarity index 97% rename from en/device-dev/faqs/faqs-startup-and-recovery.md rename to en/device-dev/faqs/faqs-startup.md index dec59820e73..f3814ab7f95 100644 --- a/en/device-dev/faqs/faqs-startup-and-recovery.md +++ b/en/device-dev/faqs/faqs-startup.md @@ -1,4 +1,4 @@ -# Startup and Recovery +# Startup ## System startup interrupted due to "parse failed!" error diff --git a/en/device-dev/kernel/kernel-small-debug-user.md b/en/device-dev/kernel/kernel-small-debug-user.md index 14f7c5097c5..e9add7160c3 100644 --- a/en/device-dev/kernel/kernel-small-debug-user.md +++ b/en/device-dev/kernel/kernel-small-debug-user.md @@ -8,10 +8,4 @@ - **[Typical Memory Problems](kernel-small-debug-user-faqs.md)** -- **[Linux Kernel Overview](kernel-standard-overview.md)** - -- **[Guidelines for Using Patches on OpenHarmony Development Boards](kernel-standard-patch.md)** - -- **[Guidelines for Compiling and Building the Linux Kernel](kernel-standard-build.md)** - diff --git a/en/device-dev/subsystems/subsys-build.md b/en/device-dev/subsystems/subsys-build.md index 8af635290fe..b26c0743bcb 100644 --- a/en/device-dev/subsystems/subsys-build.md +++ b/en/device-dev/subsystems/subsys-build.md @@ -4,4 +4,6 @@ - **[Building Guidelines for Standard Systems](subsys-build-standard-large.md)** +- **[Build System Coding Specifications and Best Practices](subsys-build-gn-coding-style-and-best-practice)** + diff --git a/en/device-dev/subsystems/subsys-dfx.md b/en/device-dev/subsystems/subsys-dfx.md index 75fff2b955f..a0fb539b3c3 100644 --- a/en/device-dev/subsystems/subsys-dfx.md +++ b/en/device-dev/subsystems/subsys-dfx.md @@ -3,7 +3,10 @@ - [DFX Overview](subsys-dfx-overview.md) - [HiLog Development](subsys-dfx-hilog-rich.md) - [HiLog_Lite Development](subsys-dfx-hilog-lite.md) +- [HiTrace Development](subsys-dfx-hitrace.md) +- [HiCollie Development](subsys-dfx-hicollie.md) - [HiSysEvent Development](subsys-dfx-hisysevent.md) + - [HiSysEvent Logging Configuration](subsys-dfx-hisysevent-logging-config.md) - [HiSysEvent Logging](subsys-dfx-hisysevent-logging.md) - [HiSysEvent Listening](subsys-dfx-hisysevent-listening.md) - [HiSysEvent Query](subsys-dfx-hisysevent-query.md) diff --git a/en/readme/ARK-Runtime-Subsystem.md b/en/readme/ark-runtime.md similarity index 100% rename from en/readme/ARK-Runtime-Subsystem.md rename to en/readme/ark-runtime.md diff --git a/en/readme/kernel-subsystem.md b/en/readme/kernel.md similarity index 100% rename from en/readme/kernel-subsystem.md rename to en/readme/kernel.md diff --git a/en/readme/test_subsystem.md b/en/readme/test.md similarity index 100% rename from en/readme/test_subsystem.md rename to en/readme/test.md diff --git a/en/readme/testing.md b/en/readme/testing.md deleted file mode 100755 index e4f0f517b81..00000000000 --- a/en/readme/testing.md +++ /dev/null @@ -1,513 +0,0 @@ -# Testing - -## Overview - -The test-driven development mode is used during the development process. You can develop new cases or modify existing cases to test new or enhanced system features. The test helps you develop high-quality code in the development phase. - -## Directory Structure - -``` -test/ -├── developertest # Developers test framework -│ ├── aw # Static library of the test framework -│ ├── config # Test framework configuration -│ ├── examples # Test case examples -│ ├── src # Source code of the test framework -│ ├── third_party # Adaptation code for third-party modules on which the test framework depends -│ ├── start.bat # Developers test entry for Windows -│ ├── start.sh # Developers test entry for Linux -│ └── BUILD.gn # Build entry of the test framework -├── xdevice # Basic component of the test framework -│ ├── config # Framework configuration file -│ ├── extension # Extension for the basic component -│ ├── resource # Test resources of the basic component -│ └── src # Source code of the basic component -└── xts # X test suite -``` - -## Constraints - -The test tool environment must meet the following requirements: - -1. Python version: 3.7.5 or later -2. Paramiko version: 2.7.1 or later -3. Setuptools version: 40.8.0 or later -4. RSA version: 4.0 or later -5. NFS version: V4 or later \(required when device supports connection using the serial port but not the hdc\) -6. pySerial version: 3.3 or later \(required when the device supports connection using the serial port but not the hdc\) -7. OS version: Windows 10 or later; Ubuntu 18.04 - -## Installation - -The Python environment is required. - -1. Run the following command to install the Linux extension component Readline: - - ``` - sudo apt-get install libreadline-dev - ``` - - If the installation is successful, the following prompts are displayed: - - ``` - Reading package lists... Done - Building dependency tree - Reading state information... Done - libreadline-dev is already the newest version (7.0-3). - 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. - ``` - -2. Run the following command to install the plug-in Setuptools: - - ``` - pip3 install setuptools - ``` - - If the installation is successful, the following prompts are displayed: - - ``` - Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0) - ``` - -3. Run the following command to install the plug-in Paramiko: - - ``` - pip3 install paramiko - ``` - - If the installation is successful, the following prompts are displayed: - - ``` - Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko - Successfully installed bcrypt-3.2.0 cffi-1.14.4 cryptography-3.3.1 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0 - ``` - -4. Run the following command to install the Python plug-in RSA: - - ``` - pip3 install rsa - ``` - - If the installation is successful, the following prompts are displayed: - - ``` - Installing collected packages: pyasn1, rsa - Successfully installed pyasn1-0.4.8 rsa-4.7 - ``` - -5. Run the following command to install the serial port plug-in pySerial for Python on the local PC: - - ``` - pip3 install pyserial - ``` - - If the installation is successful, the following prompts are displayed: - - ``` - Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4) - ``` - -6. If the device supports test result output only using the serial port, install the NFS server. - - For example, to install haneWIN NFS Server 1.2.50 for Windows, download the installation package from https://www.hanewin.net/nfs-e.htm. - - For Linux, run the following command: - - ``` - sudo apt install nfs-kernel-server - ``` - - If the installation is successful, the following prompts are displayed: - - ``` - Reading package lists... Done - Building dependency tree - Reading state information... Done - nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3). - 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. - ``` - - -## Test Cases - -- Test case specifications - - Naming rules - - The source file name of the test case must be consistent with the test suite content. A test suite can contain multiple test cases and has only one test source file that is globally unique. Source files are named in the \[Feature\]\_\[Function\]\_\[Subfunction 1\]\_\[Subfunction 1.1\] format. Subfunctions can be further divided. - - A source file name consists of lowercase letters and underscores \(\_\), and must end with **test**, for example, **developertest/examples/calculator**. - - - Test case coding specifications - - The test cases must comply with the feature code coding specifications. In addition, necessary case description information must be added. For details, see [Test case template](#li2069415903917). - - - Test case compilation and configuration specifications - - The test cases are compiled in GN mode. The configuration must comply with the compilation guide of the open-source project. - - -- Test case template - - For details, see the test case **developertest/examples/calculator/test/unittest/common/calculator\_add\_test.cpp**. - -- Directories planned for test cases - - ``` - subsystem # Subsystem and system module - ├── parts # Components - │ └── test # Module test - │ └── unittest # Unit test - │ ├── common # Common test cases - │ ├── phone # Test case of the smartphone form - │ └── ivi # Test case of the head unit form - │ └── liteos-a # Test case of the IP camera form - │ └── moduletest # Module test - │ ├── common - │ ├── phone - │ └── ivi - │ └── liteos-a - └── test # Subsystem test - └── resource # Test resources - ├── module - ├── common - ├── phone - ├── ivi - ├── liteos-a - └── systemtest # System test - ├── common - ├── phone - ├── ivi - ├── liteos-a - ``` - - >![](public_sys-resources/icon-note.gif) **NOTE:** - >The **phone**, **ivi**, **liteos-a** test cases are used as examples only for different device forms. For the same feature on different development boards, if the test cases are the same, they are stored in the **common** directory. For the same feature, if the test cases are used to distinguish different device forms and may include kernel differences and chip platform differences, the test cases are distinguished by directory. - -- Writing a test case - 1. Add comments to the test case header file. - 2. Reference the **gtest** header file and **ext** namespace. - 3. Add the header file to test. - 4. Define test suites \(test classes\). - 5. Implement specific test cases of the test suite, including test case comments and logic implementation. - 6. Set the test case compilation configuration. - - >![](public_sys-resources/icon-note.gif) **NOTE:** - >The following examples are provided for reference: - >For devices supporting the serial port only: **developertest/examples/lite/cxx\_demo/test/unittest/common/calc\_subtraction\_test.cpp**. - >For devices supporting the hdc: **developertest/examples/calculator/test/unittest/common/calculator\_add\_test.cpp**. - >- **SetUp** and **TearDown** are the processing logic before and after each test case in the test suite is executed. - >- **SetUpTestCase** and **TearDownTestCase** are the processing logic before and after all cases in the test suite are executed. - >- HWTEST usage: This method is applicable only to simple tests \(not depending on **Setup** and **Teardown**\). This method is not applicable to the scenario where multiple test scenarios require the same data configuration. The test cases may affect each other and are not independent. - >- Use the **printf** function to print logs. - - -- Writing a test case compilation file - - Define test case compilation and building objectives. - 1. Add comments to the test case compilation header file. - 2. Import the test case compilation template file. - 3. Specify the output path of the test case file. - 4. Configure the directory contained in the test case compilation dependency. - 5. Specify the file name generated by the test case compilation target. - 6. Write a specific test case compilation script and add the source files, configurations, and dependencies involved in the compilation. - 7. Group the target test case files by condition. The group name is fixed to **unittest/moduletest**. - - - If there are multiple test suites, define the common compilation configuration. - - Add test cases to the build system. - - >![](public_sys-resources/icon-note.gif) **NOTE:** - >The following examples are provided for reference: - >- Devices supporting serial port connection only - >Test case compilation configuration: **developertest/examples/lite/cxx\_demo/test/unittest/common/BUILD.gn** - >Compilation entry configuration: **developertest/examples/lite/BUILD.gn** - >- Devices supporting the hdc connection - >Test case compilation configuration: **developertest/examples/calculator/test/unittest/common/BUILD.gn** - >Compilation entry configuration: **developertest/examples/ohos.build** - - -- Writing a test case resource file - 1. Create the **resource** directory in the **test** directory of a component or module. - 2. Create a directory for a device form, for example, **phone**, in the **resource** directory. - 3. Create a folder named after the module in the device form directory, for example, **testmodule**. - 4. Create the **ohos\_test.xml** file in the folder named after the module. The file content is in the following format: - - ``` - - - - - - - - ``` - - 5. Define **resource\_config\_file** in the compilation configuration file of the test case to specify the resource file **ohos\_test.xml**. - - >![](public_sys-resources/icon-note.gif) **NOTE:** - >The resource file is used to push the **test.txt** file in the **resource** directory to the **/data/test/resource** directory of the device to test. To do so, run the **hdc push** command. - - 6. Configure the **ohos\_test.xml** file, which contains the following tags: - - >![](public_sys-resources/icon-note.gif) **NOTE:** - >**target\_name**: name of the test unit, which is usually defined in the **BUILD.gn** file in the test directory - >**preparer**: action to take before the test unit is executed - >**cleaner**: action to take after the test unit is executed - >**src="res"** indicates that test resources are stored in the **resource** directory under the root directory of the subsystem. **src="out"** indicates that test resources are in the **out/release/$**_subsystem name_ directory. - - -- Test case levels - - Basic \(level 1\) - - Major \(level 2\) - - Minor \(level 3\) - - Uncommon \(level 4\) - - -## Test Framework Usage - -- \(Optional\) Install the XDevice module. - 1. Open the **xdevice** installation directory, for example, **test/xdevice** in Windows. - 2. Open the console and run the following command: - - ``` - python setup.py install - ``` - - The following figure is displayed when the installation is complete. - - ``` - Installed d:\programs\python37\lib\site-packages\xdevice-0.0.0-py3.7.egg - Processing dependencies for xdevice==0.0.0 - Finished processing dependencies for xdevice==0.0.0 - ``` - - -- Configure the developers test module. - - Configuration file: **developertest/config/user\_config.xml** - - 1. Modify basic configuration parameters. - - \[build\] \# Set build parameters of the test case. - - ``` - - false - false - true - ... ... - - ``` - - >![](public_sys-resources/icon-note.gif) **NOTE:** - >**example**: whether to build the test case example. The default value is **false**. - >**version**: whether to build the test version. The default value is **false**. - >**testcase**: whether to build the test case. The default value is **true**. - - 2. For devices that support the Harmony device connector \(hdc\), modify the configuration file as follows: - - \[device\] \# Configure the device information with the **"usb-hdc"** attribute, including the test device IP address and the matched hdc port. - - ``` - - 192.168.1.1 - 9111 - - - ``` - - 3. For devices that support serial port connection only, modify the configuration file as follows: - - \[board\_info\] \# Configure development board information. - - ``` - - hispark - taurus - ipcamera - hb build - - ``` - - >![](public_sys-resources/icon-note.gif) **NOTE:** - >**board\_series**: development board series. The default value is **hispark**. - >**board\_type**: development board type. The default value is **taurus**. - >**board\_product**: target product. The default value is **ipcamera**. - >**build\_command**: command used for building the test version and test case. The default value is **hb build**. - - \[device\] \# Configure the serial port information with the **"ipcamera"** attribute, including the COM port and baud rate. For example: - - ``` - - - COM1 - cmd - 115200 - 8 - 1 - 1 - - - ``` - - -- Modify the configuration of the **developertest** component. - - \(Optional\) If a test case has been compiled, specify the compilation output path of the test case. In this case, the test platform will not recompile the test case. - - Configuration file: **config/user\_config.xml** - - 1. Specify the output path of the test case and the compilation output directory. Example: - - ``` - -