From 1cec32a4858033d75f2b60066a395e67bdb7f025 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Thu, 16 Jun 2022 11:05:09 +0800 Subject: [PATCH] update docs Signed-off-by: shawn_he --- .../reference/apis/Readme-EN.md | 8 +- .../apis/js-apis-resource-manager.md | 608 +++++++++++++++--- en/readme/figures/multimodal-architecture.png | Bin 0 -> 36267 bytes en/readme/multimodal-input.md | 60 +- 4 files changed, 569 insertions(+), 107 deletions(-) create mode 100644 en/readme/figures/multimodal-architecture.png diff --git a/en/application-dev/reference/apis/Readme-EN.md b/en/application-dev/reference/apis/Readme-EN.md index 76484be761..5e261f99ad 100644 --- a/en/application-dev/reference/apis/Readme-EN.md +++ b/en/application-dev/reference/apis/Readme-EN.md @@ -46,8 +46,8 @@ - application/[ProcessRunningInfo](js-apis-processrunninginfo.md) - application/[ServiceExtensionContext](js-apis-service-extension-context.md) - application/[shellCmdResult](js-apis-application-shellCmdResult.md) - - application/[MissionInfo (MissionInfo)](js-apis-application-missionInfo.md) - + - application/[MissionInfo](js-apis-application-missionInfo.md) + - Common Event and Notification - [@ohos.commonEvent](js-apis-commonEvent.md) @@ -135,6 +135,7 @@ - [@ohos.statfs](js-apis-statfs.md) - [@ohos.storageStatistics](js-apis-storage-statistics.md) - [@ohos.volumeManager](js-apis-volumemanager.md) + - [@ohos.securityLabel](js-apis-securityLabel.md) - Telephony Service @@ -157,6 +158,9 @@ - [@ohos.bluetooth](js-apis-bluetooth.md) - [@ohos.connectedTag](js-apis-connectedTag.md) + - [@ohos.nfc.cardEmulation](js-apis-cardEmulation.md) + - [@ohos.nfc.controller](js-apis-nfcController.md) + - [@ohos.nfc.tag](js-apis-nfcTag.md) - [@ohos.rpc](js-apis-rpc.md) - [@ohos.wifi](js-apis-wifi.md) - [@ohos.wifiext](js-apis-wifiext.md) diff --git a/en/application-dev/reference/apis/js-apis-resource-manager.md b/en/application-dev/reference/apis/js-apis-resource-manager.md index 2effb8b20a..335e31cdb2 100644 --- a/en/application-dev/reference/apis/js-apis-resource-manager.md +++ b/en/application-dev/reference/apis/js-apis-resource-manager.md @@ -2,7 +2,7 @@ The resource management module provides APIs to obtain information about the current device configuration (including the language, region, screen direction, and MCC/MNC) and device capability (including the device type and resolution). -> ![icon-note.gif](public_sys-resources/icon-note.gif) **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. @@ -12,31 +12,41 @@ The resource management module provides APIs to obtain information about the cur import resourceManager from '@ohos.resourceManager'; ``` +## Usage + +Since API version 9, the stage model allows an application to obtain a **ResourceManager** object based on **context** and call its APIs without first importing the required bundle. This method, however, is not applicable to the FA model. + +``` +this.context.resourceManager; +``` + ## resourceManager.getResourceManager getResourceManager(callback: AsyncCallback<ResourceManager>): void -Obtains the **ResourceManager** object of this application. This API uses a callback to return the result. +Obtains the **ResourceManager** object of this application. This API uses an asynchronous callback to return the result. + +This API is used only in the FA model. **System capability**: SystemCapability.Global.ResourceManager **Parameters** | Name | Type | Mandatory | Description | | -------- | ---------------------------------------- | ---- | ----------------------------- | -| callback | AsyncCallback<[ResourceManager](#resourcemanager)> | Yes | Asynchronous callback used to return the **ResourceManager** object obtained.| +| callback | AsyncCallback<[ResourceManager](#resourcemanager)> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { if (error != null) { - console.log("error occurs" + error); + console.log("error is " + error); return; } mgr.getString(0x1000000, (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let str = value; } }); }); @@ -47,7 +57,9 @@ Obtains the **ResourceManager** object of this application. This API uses a call getResourceManager(bundleName: string, callback: AsyncCallback<ResourceManager>): void -Obtains the **ResourceManager** object of an application. This API uses an asynchronous callback to return the result. +Obtains the **ResourceManager** object of an application based on the specified bundle name. This API uses an asynchronous callback to return the result. + +This API is used only in the FA model. **System capability**: SystemCapability.Global.ResourceManager @@ -55,7 +67,7 @@ Obtains the **ResourceManager** object of an application. This API uses an async | Name | Type | Mandatory | Description | | ---------- | ---------------------------------------- | ---- | ----------------------------- | | bundleName | string | Yes | Bundle name of the target application. | -| callback | AsyncCallback<[ResourceManager](#resourcemanager)> | Yes | Asynchronous callback used to return the **ResourceManager** object obtained.| +| callback | AsyncCallback<[ResourceManager](#resourcemanager)> | Yes | Asynchronous callback used to return the result.| **Example** ``` @@ -70,25 +82,27 @@ getResourceManager(): Promise<ResourceManager> Obtains the **ResourceManager** object of this application. This API uses a promise to return the result. +This API is used only in the FA model. + **System capability**: SystemCapability.Global.ResourceManager **Return value** | Type | Description | | ---------------------------------------- | ----------------- | -| Promise<[ResourceManager](#resourcemanager)> | Promise used to return the **ResourceManager** object obtained.| +| Promise<[ResourceManager](#resourcemanager)> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager().then(mgr => { mgr.getString(0x1000000, (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let str = value; } }); }).catch(error => { - console.log(error); + console.log("error is " + error); }); ``` @@ -97,7 +111,9 @@ Obtains the **ResourceManager** object of this application. This API uses a prom getResourceManager(bundleName: string): Promise<ResourceManager> -Obtains the **ResourceManager** object of an application. This API uses a promise to return the result. +Obtains the **ResourceManager** object of an application based on the specified bundle name. This API uses a promise to return the result. + +This API is used only in the FA model. **System capability**: SystemCapability.Global.ResourceManager @@ -109,7 +125,7 @@ Obtains the **ResourceManager** object of an application. This API uses a promis **Return value** | Type | Description | | ---------------------------------------- | ------------------ | -| Promise<[ResourceManager](#resourcemanager)> | Promise used to return the **ResourceManager** object obtained.| +| Promise<[ResourceManager](#resourcemanager)> | Promise used to return the result.| **Example** ``` @@ -129,8 +145,8 @@ Enumerates the screen directions. | Name | Default Value | Description | | -------------------- | ---- | ---- | -| DIRECTION_VERTICAL | 0 | Portrait | -| DIRECTION_HORIZONTAL | 1 | Landscape | +| DIRECTION_VERTICAL | 0 | Portrait. | +| DIRECTION_HORIZONTAL | 1 | Landscape. | ## DeviceType @@ -141,12 +157,12 @@ Enumerates the device types. | Name | Default Value | Description | | -------------------- | ---- | ---- | -| DEVICE_TYPE_PHONE | 0x00 | Phone | -| DEVICE_TYPE_TABLET | 0x01 | Tablet | -| DEVICE_TYPE_CAR | 0x02 | Head unit | -| DEVICE_TYPE_PC | 0x03 | PC | -| DEVICE_TYPE_TV | 0x04 | TV | -| DEVICE_TYPE_WEARABLE | 0x06 | Wearable | +| DEVICE_TYPE_PHONE | 0x00 | Phone. | +| DEVICE_TYPE_TABLET | 0x01 | Tablet. | +| DEVICE_TYPE_CAR | 0x02 | Head unit. | +| DEVICE_TYPE_PC | 0x03 | PC. | +| DEVICE_TYPE_TV | 0x04 | TV. | +| DEVICE_TYPE_WEARABLE | 0x06 | Wearable. | ## ScreenDensity @@ -182,8 +198,8 @@ Defines the device configuration. ``` resourceManager.getResourceManager((error, mgr) => { mgr.getConfiguration((error, value) => { - console.log(value.direction); - console.log(value.locale); + let direction = value.direction; + let locale = value.locale; }); }); ``` @@ -205,8 +221,8 @@ Defines the device capability. ``` resourceManager.getResourceManager((error, mgr) => { mgr.getDeviceCapability((error, value) => { - console.log(value.screenDensity); - console.log(value.deviceType); + let screenDensity = value.screenDensity; + let deviceType = value.deviceType; }); }); ``` @@ -227,7 +243,7 @@ Defines the descriptor information of the raw file.
Defines the capability of accessing application resources. -> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
+> **NOTE**
> - The methods involved in **ResourceManager** are applicable only to the TypeScript-based declarative development paradigm. > > - Resource files are defined in the **resources** directory of the project. You can obtain the resource ID using **$r(resource address).id**, for example, **$r('app.string.test').id**. @@ -245,16 +261,16 @@ Obtains the string corresponding to the specified resource ID. This API uses an | Name | Type | Mandatory | Description | | -------- | --------------------------- | ---- | --------------- | | resId | number | Yes | Resource ID. | -| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the obtained string.| +| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getString($r('app.string.test').id, (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let str = value; } }); }); @@ -277,15 +293,15 @@ Obtains the string corresponding to the specified resource ID. This API uses a p **Return value** | Type | Description | | --------------------- | ----------- | -| Promise<string> | Promise used to return the string obtained.| +| Promise<string> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getString($r('app.string.test').id).then(value => { - console.log(value); + let str = value; }).catch(error => { - console.log("getstring promise " + error); + console.log("getstring promise error is " + error); }); }); ``` @@ -295,7 +311,7 @@ Obtains the string corresponding to the specified resource ID. This API uses a p getStringArray(resId: number, callback: AsyncCallback<Array<string>>): void -Obtains the array of strings corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. +Obtains the string array corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -303,16 +319,16 @@ Obtains the array of strings corresponding to the specified resource ID. This AP | Name | Type | Mandatory | Description | | -------- | ---------------------------------------- | ---- | ----------------- | | resId | number | Yes | Resource ID. | -| callback | AsyncCallback<Array<string>> | Yes | Asynchronous callback used to return the obtained array of strings.| +| callback | AsyncCallback<Array<string>> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getStringArray($r('app.strarray.test').id, (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let strArray = value; } }); }); @@ -323,7 +339,7 @@ Obtains the array of strings corresponding to the specified resource ID. This AP getStringArray(resId: number): Promise<Array<string>> -Obtains the array of strings corresponding to the specified resource ID. This API uses a promise to return the result. +Obtains the string array corresponding to the specified resource ID. This API uses a promise to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -335,15 +351,15 @@ Obtains the array of strings corresponding to the specified resource ID. This AP **Return value** | Type | Description | | ---------------------------------- | ------------- | -| Promise<Array<string>> | Promise used to return the array of strings obtained.| +| Promise<Array<string>> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getStringArray($r('app.strarray.test').id).then(value => { - console.log(value); + let strArray = value; }).catch(error => { - console.log("getstring promise " + error); + console.log("getStringArray promise error is " + error); }); }); ``` @@ -361,16 +377,16 @@ Obtains the content of the media file corresponding to the specified resource ID | Name | Type | Mandatory | Description | | -------- | ------------------------------- | ---- | ------------------ | | resId | number | Yes | Resource ID. | -| callback | AsyncCallback<Uint8Array> | Yes | Asynchronous callback used to return the content of the media file obtained.| +| callback | AsyncCallback<Uint8Array> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getMedia($r('app.media.test').id, (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let media = value; } }); }); @@ -393,15 +409,15 @@ Obtains the content of the media file corresponding to the specified resource ID **Return value** | Type | Description | | ------------------------- | -------------- | -| Promise<Uint8Array> | Promise used to return the content of the media file obtained.| +| Promise<Uint8Array> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getMedia($r('app.media.test').id).then(value => { - console.log(value); + let media = value; }).catch(error => { - console.log("getstring promise " + error); + console.log("getMedia promise error is " + error); }); }); ``` @@ -419,16 +435,16 @@ Obtains the Base64 code of the image corresponding to the specified resource ID. | Name | Type | Mandatory | Description | | -------- | --------------------------- | ---- | ------------------------ | | resId | number | Yes | Resource ID. | -| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the Base64 code of the image obtained.| +| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getMediaBase64($r('app.media.test').id, (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let media = value; } }); }); @@ -451,15 +467,15 @@ Obtains the Base64 code of the image corresponding to the specified resource ID. **Return value** | Type | Description | | --------------------- | -------------------- | -| Promise<string> | Promise used to return the Base64 code of the image obtained.| +| Promise<string> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getMediaBase64($r('app.media.test').id).then(value => { - console.log(value); + let media = value; }).catch(error => { - console.log("getstring promise " + error); + console.log("getMediaBase64 promise error is " + error); }); }); ``` @@ -476,16 +492,17 @@ Obtains the device configuration. This API uses an asynchronous callback to retu **Parameters** | Name | Type | Mandatory | Description | | -------- | ---------------------------------------- | ---- | ------------------------- | -| callback | AsyncCallback<[Configuration](#configuration)> | Yes | Asynchronous callback used to return the obtained device configuration.| +| callback | AsyncCallback<[Configuration](#configuration)> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getConfiguration((error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let direction = value.direction; + let locale = value.locale; } }); }); @@ -503,15 +520,16 @@ Obtains the device configuration. This API uses a promise to return the result. **Return value** | Type | Description | | ---------------------------------------- | ---------------- | -| Promise<[Configuration](#configuration)> | Promise used to return the device configuration.| +| Promise<[Configuration](#configuration)> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getConfiguration().then(value => { - console.log(value); + let direction = value.direction; + let locale = value.locale; }).catch(error => { - console.log("getstring promise " + error); + console.log("getConfiguration promise error is " + error); }); }); ``` @@ -528,16 +546,17 @@ Obtains the device capability. This API uses an asynchronous callback to return **Parameters** | Name | Type | Mandatory | Description | | -------- | ---------------------------------------- | ---- | ---------------------------- | -| callback | AsyncCallback<[DeviceCapability](#devicecapability)> | Yes | Asynchronous callback used to return the obtained device capability.| +| callback | AsyncCallback<[DeviceCapability](#devicecapability)> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getDeviceCapability((error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let screenDensity = value.screenDensity; + let deviceType = value.deviceType; } }); }); @@ -555,15 +574,16 @@ Obtains the device capability. This API uses a promise to return the result. **Return value** | Type | Description | | ---------------------------------------- | ------------------- | -| Promise<[DeviceCapability](#devicecapability)> | Promise used to return the obtained device capability.| +| Promise<[DeviceCapability](#devicecapability)> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getDeviceCapability().then(value => { - console.log(value); + let screenDensity = value.screenDensity; + let deviceType = value.deviceType; }).catch(error => { - console.log("getstring promise " + error); + console.log("getDeviceCapability promise error is " + error); }); }); ``` @@ -582,16 +602,16 @@ Obtains the specified number of singular-plural strings corresponding to the spe | -------- | --------------------------- | ---- | ------------------------------- | | resId | number | Yes | Resource ID. | | num | number | Yes | Number that determines the plural or singular form. | -| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the singular-plural string obtained.| +| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getPluralString($r("app.plural.test").id, 1, (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let str = value; } }); }); @@ -615,15 +635,15 @@ Obtains the specified number of singular-plural strings corresponding to the spe **Return value** | Type | Description | | --------------------- | ------------------------- | -| Promise<string> | Promise used to return the singular-plural string obtained.| +| Promise<string> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getPluralString($r("app.plural.test").id, 1).then(value => { - console.log(value); + let str = value; }).catch(error => { - console.log("getstring promise " + error); + console.log("getPluralString promise error is " + error); }); }); ``` @@ -632,7 +652,7 @@ Obtains the specified number of singular-plural strings corresponding to the spe getRawFile(path: string, callback: AsyncCallback<Uint8Array>): void -Obtains the content of rawfile in the specified path. This API uses an asynchronous callback to return the result. +Obtains the content of the raw file in the **resources/rawfile** directory. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -640,16 +660,16 @@ Obtains the content of rawfile in the specified path. This API uses an asynchron | Name | Type | Mandatory | Description | | -------- | ------------------------------- | ---- | ----------------------- | | path | string | Yes | Path of the raw file. | -| callback | AsyncCallback<Uint8Array> | Yes | Asynchronous callback used to return the raw file content, in byte arrays.| +| callback | AsyncCallback<Uint8Array> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getRawFile("test.xml", (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { - console.log(value); + let rawFile = value; } }); }); @@ -659,7 +679,7 @@ Obtains the content of rawfile in the specified path. This API uses an asynchron getRawFile(path: string): Promise<Uint8Array> -Obtains the content of the raw file in the specified path. This API uses a promise to return the result. +Obtains the content of the raw file in the **resources/rawfile** directory. This API uses a promise to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -671,15 +691,15 @@ Obtains the content of the raw file in the specified path. This API uses a promi **Return value** | Type | Description | | ------------------------- | ----------- | -| Promise<Uint8Array> | Promise used to return the raw file content, in byte arrays.| +| Promise<Uint8Array> | Promise used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getRawFile("test.xml").then(value => { - console.log(value); + let rawFile = value; }).catch(error => { - console.log("getrawfile promise " + error); + console.log("getRawFile promise error is " + error); }); }); ``` @@ -688,7 +708,7 @@ Obtains the content of the raw file in the specified path. This API uses a promi getRawFileDescriptor(path: string, callback: AsyncCallback<RawFileDescriptor>): void -Obtains the descriptor of the raw file in the specified path. This API uses an asynchronous callback to return the result. +Obtains the descriptor of the raw file in the **resources/rawfile** directory. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -696,14 +716,14 @@ Obtains the descriptor of the raw file in the specified path. This API uses an a | Name | Type | Mandatory | Description | | -------- | ---------------------------------------- | ---- | -------------------------------- | | path | string | Yes | Path of the raw file. | -| callback | AsyncCallback<[RawFileDescriptor](#rawfiledescriptor8)> | Yes | Asynchronous callback used to return the raw file descriptor.| +| callback | AsyncCallback<[RawFileDescriptor](#rawfiledescriptor8)> | Yes | Asynchronous callback used to return the result.| **Example** ``` resourceManager.getResourceManager((error, mgr) => { mgr.getRawFileDescriptor("test.xml", (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } else { let fd = value.fd; let offset = value.offset; @@ -717,7 +737,7 @@ Obtains the descriptor of the raw file in the specified path. This API uses an a getRawFileDescriptor(path: string): Promise<RawFileDescriptor> -Obtains the descriptor of the raw file in the specified path. This API uses a promise to return the result. +Obtains the descriptor of the raw file in the **resources/rawfile** directory. This API uses a promise to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -729,7 +749,7 @@ Obtains the descriptor of the raw file in the specified path. This API uses a pr **Return value** | Type | Description | | ---------------------------------------- | ------------------- | -| Promise<[RawFileDescriptor](#rawfiledescriptor8)> | Promise used to return the raw file descriptor.| +| Promise<[RawFileDescriptor](#rawfiledescriptor8)> | Promise used to return the result.| **Example** ``` @@ -739,7 +759,7 @@ Obtains the descriptor of the raw file in the specified path. This API uses a pr let offset = value.offset; let length = value.length; }).catch(error => { - console.log("getRawFileDescriptor promise " + error); + console.log("getRawFileDescriptor promise error is " + error); }); }); ``` @@ -748,7 +768,7 @@ Obtains the descriptor of the raw file in the specified path. This API uses a pr closeRawFileDescriptor(path: string, callback: AsyncCallback<void>): void -Closes the descriptor of the raw file in the specified path. This API uses an asynchronous callback to return the result. +Closes the descriptor of the raw file in the **resources/rawfile** directory. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -763,7 +783,7 @@ Closes the descriptor of the raw file in the specified path. This API uses an as resourceManager.getResourceManager((error, mgr) => { mgr.closeRawFileDescriptor("test.xml", (error, value) => { if (error != null) { - console.log(value); + console.log("error is " + error); } }); }); @@ -773,7 +793,7 @@ Closes the descriptor of the raw file in the specified path. This API uses an as closeRawFileDescriptor(path: string): Promise<void> -Closes the descriptor of the raw file in the specified path. This API uses a promise to return the result. +Closes the descriptor of the raw file in the **resources/rawfile** directory. This API uses a promise to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -791,9 +811,9 @@ Closes the descriptor of the raw file in the specified path. This API uses a pro ``` resourceManager.getResourceManager((error, mgr) => { mgr.closeRawFileDescriptor("test.xml").then(value => { - console.log(value); + let result = value; }).catch(error => { - console.log("closeRawFileDescriptor promise " + error); + console.log("closeRawFileDescriptor promise error is " + error); }); }); ``` @@ -809,10 +829,408 @@ Releases the created **resourceManager**. **Example** ``` resourceManager.getResourceManager((error, mgr) => { - mgr.release((error, value) => { - if (error != null) { - console.log(value); - } - }); + mgr.release(); + }); + ``` + +### getStringByName9+ + +getStringByName(resName: string, callback: AsyncCallback<string>): void + +Obtains the string corresponding to the specified resource name. This API uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| -------- | --------------------------- | ---- | --------------- | +| resName | string | Yes | Resource name. | +| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the result.| + +**Example** + ``` + resourceManager.getStringByName("test", (error, value) => { + if (error != null) { + console.log("error is " + error); + } else { + let string = value; + } + }); + ``` + +### getStringByName9+ + +getStringByName(resName: string): Promise<string> + +Obtains the string corresponding to the specified resource name. This API uses a promise to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ---- | +| resName | string | Yes | Resource name.| + +**Return value** +| Type | Description | +| --------------------- | ----------- | +| Promise<string> | String corresponding to the resource name.| + +**Example** + ``` + resourceManager.getStringByName("test").then(value => { + let string = value; + }).catch(error => { + console.log("getStringByName promise error is " + error); + }); + ``` + +### getStringArrayByName9+ + +getStringArrayByName(resName: string, callback: AsyncCallback<Array<string>>): void + +Obtains the string array corresponding to the specified resource name. This API uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| -------- | ---------------------------------------- | ---- | ----------------- | +| resName | string | Yes | Resource name. | +| callback | AsyncCallback<Array<string>> | Yes | Asynchronous callback used to return the result.| + +**Example** + ``` + resourceManager.getStringArrayByName("test", (error, value) => { + if (error != null) { + console.log("error is " + error); + } else { + let strArray = value; + } + }); + ``` + +### getStringArrayByName9+ + +getStringArrayByName(resName: string): Promise<Array<string>> + +Obtains the string array corresponding to the specified resource name. This API uses a promise to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----- | +| resName | string | Yes | Resource name.| + +**Return value** +| Type | Description | +| ---------------------------------- | ------------- | +| Promise<Array<string>> | Promise used to return the result.| + +**Example** + ``` + resourceManager.getStringArrayByName("test").then(value => { + let strArray = value; + }).catch(error => { + console.log("getStringArrayByName promise error is " + error); + }); + ``` + +### getMediaByName9+ + +getMediaByName(resName: string, callback: AsyncCallback<Uint8Array>): void + +Obtains the content of the media file corresponding to the specified resource name. This API uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| -------- | ------------------------------- | ---- | ------------------ | +| resName | string | Yes | Resource name. | +| callback | AsyncCallback<Uint8Array> | Yes | Asynchronous callback used to return the result.| + +**Example** + ``` + resourceManager.getMediaByName("test", (error, value) => { + if (error != null) { + console.log("error is " + error); + } else { + let media = value; + } + }); + ``` + +### getMediaByName9+ + +getMediaByName(resName: string): Promise<Uint8Array> + +Obtains the content of the media file corresponding to the specified resource name. This API uses a promise to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ----- | ------ | ---- | ----- | +| resName | string | Yes | Resource name.| + +**Return value** +| Type | Description | +| ------------------------- | -------------- | +| Promise<Uint8Array> | Promise used to return the result.| + +**Example** + ``` + resourceManager.getMediaByName("test").then(value => { + let media = value; + }).catch(error => { + console.log("getMediaByName promise error is " + error); + }); + ``` + +### getMediaBase64ByName9+ + +getMediaBase64ByName(resName: string, callback: AsyncCallback<string>): void + +Obtains the Base64 code of the image corresponding to the specified resource name. This API uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| -------- | --------------------------- | ---- | ------------------------ | +| resName | string | Yes | Resource name. | +| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the result.| + +**Example** + ``` + resourceManager.getMediaBase64ByName("test", (error, value) => { + if (error != null) { + console.log("error is " + error); + } else { + let media = value; + } }); ``` + +### getMediaBase64ByName9+ + +getMediaBase64ByName(resName: string): Promise<string> + +Obtains the Base64 code of the image corresponding to the specified resource name. This API uses a promise to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----- | +| resName | string | Yes | Resource name.| + +**Return value** +| Type | Description | +| --------------------- | -------------------- | +| Promise<string> | Promise used to return the result.| + +**Example** + ``` + resourceManager.getMediaByName("test").then(value => { + let media = value; + }).catch(error => { + console.log("getMediaBase64ByName promise error is " + error); + }); + ``` + +### getPluralStringByName9+ + +getPluralStringByName(resName: string, num: number, callback: AsyncCallback<string>): void + +Obtains the plural string corresponding to the specified resource name. This API uses an asynchronous callback to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| -------- | --------------------------- | ---- | ------------------------------- | +| resName | string | Yes | Resource name. | +| num | number | Yes | Number that determines the plural or singular form. | +| callback | AsyncCallback<string> | Yes | Asynchronous callback used to return the result.| + +**Example** + ``` + resourceManager.getPluralStringByName("test", 1, (error, value) => { + if (error != null) { + console.log("error is " + error); + } else { + let str = value; + } + }); + ``` + +### getPluralStringByName9+ + +getPluralStringByName(resName: string, num: number): Promise<string> + +Obtains the plural string corresponding to the specified resource name. This API uses a promise to return the result. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----- | +| resName | string | Yes | Resource name.| +| num | number | Yes | Number that determines the plural or singular form. | + +**Return value** +| Type | Description | +| --------------------- | ------------------------- | +| Promise<string> | Promise used to return the result.| + +**Example** + ``` + resourceManager.getPluralStringByName("test", 1).then(value => { + let str = value; + }).catch(error => { + console.log("getPluralStringByName promise error is " + error); + }); + ``` + +### getStringSync9+ + +getStringSync(resId: number): string + +Obtains the string corresponding to the specified resource ID. This API returns the result synchronously. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ----- | ------ | ---- | ----- | +| resId | number | Yes | Resource ID.| + +**Return value** +| Type | Description | +| --------------------- | ----------- | +| string | String corresponding to the specified resource ID.| + +**Example** + ``` + resourceManager.getStringSync($r('app.string.test').id); + ``` + +### getStringByNameSync9+ + +getStringByNameSync(resName: string): string + +Obtains the string corresponding to the specified resource name. This API returns the result synchronously. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ----- | ------ | ---- | ----- | +| resName | string | Yes | Resource name.| + +**Return value** +| Type | Description | +| --------------------- | ----------- | +| string | String corresponding to the resource name.| + +**Example** + ``` + resourceManager.getStringByNameSync("test"); + ``` + + ### getBoolean9+ + +getBoolean(resId: number): boolean + +Obtains the Boolean result corresponding to the specified resource ID. This API returns the result synchronously. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ----- | ------ | ---- | ----- | +| resId | number | Yes | Resource ID.| + +**Return value** +| Type | Description | +| --------------------- | ----------- | +| boolean | Boolean result corresponding to the specified resource ID.| + +**Example** + ``` + resourceManager.getBoolean($r('app.boolean.boolean_test').id); + ``` + +### getBooleanByName9+ + +getBooleanByName(resName: string): boolean + +Obtains the Boolean result corresponding to the specified resource name. This API returns the result synchronously. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----- | +| resName | string | Yes | Resource name.| + +**Return value** +| Type | Description | +| --------------------- | ----------- | +| boolean | Boolean result corresponding to the specified resource name.| + +**Example** + ``` + resourceManager.getBooleanByName("boolean_test"); + ``` + + ### getNumber9+ + +getNumber(resId: number): number + +Obtains the integer or float value corresponding to the specified resource ID. This API returns the result synchronously. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ----- | ------ | ---- | ----- | +| resId | number | Yes | Resource ID.| + +**Return value** +| Type | Description | +| --------------------- | ----------- | +| number | Integer or float value corresponding to the specified resource ID.| + +**Example** + ``` + resourceManager.getNumber($r('app.integer.integer_test').id); + resourceManager.getNumber($r('app.float.float_test').id); + ``` + +### getNumberByName9+ + +getNumberByName(resName: string): number + +Obtains the integer or float value corresponding to the specified resource name. This API returns the result synchronously. + +**System capability**: SystemCapability.Global.ResourceManager + +**Parameters** +| Name | Type | Mandatory | Description | +| ----- | ------ | ---- | ----- | +| resName | string | Yes | Resource name.| + +**Return value** +| Type | Description | +| --------------------- | ----------- | +| number | Integer or float value corresponding to the specified resource name.| + +**Example** + ``` + resourceManager.getNumberByName("integer_test"); + resourceManager.getNumberByName("float_test"); + ``` diff --git a/en/readme/figures/multimodal-architecture.png b/en/readme/figures/multimodal-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7bfa62475e4e6d5f01ce146fb0a3534caa2385 GIT binary patch literal 36267 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 literal 0 HcmV?d00001 diff --git a/en/readme/multimodal-input.md b/en/readme/multimodal-input.md index 7c95ae5366..e9981899ed 100644 --- a/en/readme/multimodal-input.md +++ b/en/readme/multimodal-input.md @@ -1,12 +1,14 @@ -# Multimodal Input +# Multimodal Input -## Overview +## Description -OpenHarmony provides a Natural User Interface \(NUI\) for you to interact with your users. Unlike conventional categorization of input methods, OpenHarmony combines input methods of different dimensions into multimodal inputs, so you can easily arm your application with multi-dimensional, natural interaction features by using the application framework and system built-in UI components or APIs. +OpenHarmony provides a Natural User Interface (NUI) for you to interact with your users. Unlike conventional categorization of input methods, OpenHarmony combines input methods of different dimensions into multimodal inputs, so you can easily arm your application with multi-dimensional, natural interaction features by using the application framework and system built-in UI components or APIs. -Specifically, OpenHarmony currently supports traditional input methods such as key and touch inputs. +Specifically, the Multimodal Input subsystem receives input events from various input devices, such as the keyboard, mouse, touchscreen, and touchpad, via the Linux native driver and HDF driver. After that, it normalizes and standardizes the input events, and distributes the events to the Inner SDK. The Inner SDK distributes the events to the ArkUI framework, which then encapsulates the input events and passes them to applications. Alternatively, the Inner SDK can also directly distribute input events to applications through JsKit APIs. -## Directory Structure +![](figures/multimodal-architecture.png) + +## Contents ``` /foundation/multimodalinput/input @@ -19,13 +21,51 @@ Specifically, OpenHarmony currently supports traditional input methods such as k ├── uinput # Input event injection module ``` -## Usage +## Usage + +### Available APIs + +Available APIs of the Multimodal Input subsystem are event injection ones, which are open only to system applications currently. + +The **inputEventClient** class provides APIs for event injection. + +**Table 1** Major APIs in inputEventClient + +| Category| API | Description | +| :------: | :-----------------------------------------------: | :----------------: | +| Key injection| function injectEvent(keyEvent: KeyEvent): number; | Injects events.| + +### How to Use + +Currently, only the **BACK** key event can be injected. + +When a system app needs to return to the previous directory, you can call the API to inject the **BACK** key event to Multimodal Input, which then transfers this event to the system app, thereby achieving the return effect. The example code is as follows: + +``` +// Import the required JavaScript API library. +import inputEventClient from '@ohos.multimodalInput.inputEventClient'; + +// Call the API for injecting events. +let keyEvent = { + isPressed: true, // Action type of the key event. true indicates that the key is being pressed down, and false indicates that the key is being released. + keyCode: 2, // Keycode for the key, for example, 2 for the BACK key. + keyDownDuration: 0, // Duration in which the current key is pressed down before it is released, in milliseconds. + isIntercepted: false // Whether to intercept key pressing events. +} +res = inputEventClient.injectEvent({KeyEvent: keyEvent}); +``` + +> **NOTE**
New APIs must be downward compatible. -Available APIs of Multimodal Input are event injection ones, which are open only to system apps currently. +### Supported Devices -## Repositories Involved +| Device | Touchscreen| Touchpad| Mouse| Keyboard| +| :---------: | :----: | :----: | :--: | :--: | +| rk3568 | Yes | Yes | Yes | Yes | +| hi3516dv300 | Yes | No | No | No | -**Multimodal input subsystem** +## Repositories Involved -[multimodalinput\_input](https://gitee.com/openharmony/multimodalinput_input) +**Multimodal Input Subsystem** +[multimodalinput_input](https://gitee.com/openharmony/multimodalinput_input) -- GitLab