From edb57254474dd3f2ccd2085f72c553847d0845bf Mon Sep 17 00:00:00 2001 From: shawn_he Date: Tue, 9 May 2023 11:42:14 +0800 Subject: [PATCH] update doc Signed-off-by: shawn_he --- en/application-dev/connectivity/Readme-EN.md | 1 + en/application-dev/connectivity/net-mdns.md | 156 ++++++++ .../connectivity/net-mgmt-overview.md | 15 +- .../dfx/apprecovery-guidelines.md | 19 +- en/application-dev/faqs/Readme-EN.md | 9 +- en/application-dev/faqs/faqs-connectivity.md | 33 -- .../faqs/faqs-data-management.md | 76 ---- .../faqs/faqs-development-board.md | 50 --- .../faqs/faqs-device-management.md | 48 --- en/application-dev/faqs/faqs-dfx.md | 61 +--- en/application-dev/faqs/faqs-globalization.md | 118 ++++++ en/application-dev/faqs/faqs-international.md | 19 - en/application-dev/faqs/faqs-language.md | 5 +- .../faqs/faqs-network-management.md | 222 ++++++++++++ en/application-dev/faqs/faqs-startup.md | 43 +++ en/application-dev/napi/figures/rawfile1.png | Bin 0 -> 103107 bytes en/application-dev/napi/rawfile-guidelines.md | 343 ++++++++++++++---- .../reference/apis/figures/printing-logs.png | Bin 0 -> 9907 bytes .../reference/apis/js-apis-geolocation.md | 2 +- .../reference/apis/js-apis-logs.md | 331 +++++++++++++++-- .../apis/js-apis-resource-manager.md | 88 ++--- .../reference/apis/js-apis-uiappearance.md | 2 +- 22 files changed, 1212 insertions(+), 429 deletions(-) create mode 100644 en/application-dev/connectivity/net-mdns.md delete mode 100644 en/application-dev/faqs/faqs-connectivity.md delete mode 100644 en/application-dev/faqs/faqs-data-management.md delete mode 100644 en/application-dev/faqs/faqs-development-board.md delete mode 100644 en/application-dev/faqs/faqs-device-management.md create mode 100644 en/application-dev/faqs/faqs-globalization.md delete mode 100644 en/application-dev/faqs/faqs-international.md create mode 100644 en/application-dev/faqs/faqs-network-management.md create mode 100644 en/application-dev/faqs/faqs-startup.md create mode 100644 en/application-dev/napi/figures/rawfile1.png create mode 100644 en/application-dev/reference/apis/figures/printing-logs.png diff --git a/en/application-dev/connectivity/Readme-EN.md b/en/application-dev/connectivity/Readme-EN.md index 7176cb8fb4..59df854e8a 100755 --- a/en/application-dev/connectivity/Readme-EN.md +++ b/en/application-dev/connectivity/Readme-EN.md @@ -9,6 +9,7 @@ - [Network Sharing](net-sharing.md) - [Ethernet Connection](net-ethernet.md) - [Network Connection Management](net-connection-manager.md) + - [mDNS Management](net-mdns.md) - IPC & RPC - [IPC & RPC Overview](ipc-rpc-overview.md) - [IPC & RPC Development](ipc-rpc-development-guideline.md) diff --git a/en/application-dev/connectivity/net-mdns.md b/en/application-dev/connectivity/net-mdns.md new file mode 100644 index 0000000000..34319197fc --- /dev/null +++ b/en/application-dev/connectivity/net-mdns.md @@ -0,0 +1,156 @@ +# MDNS Management + +## Introduction + +Multicast DNS (mDNS) provides functions such as adding, removing, discovering, and resolving local services on a LAN. +- Local service: a service provider on a LAN, for example, a printer or scanner. + +Typical MDNS management scenarios include: + +- Managing local services on a LAN, such as adding, removing, and resolving local services. +- Discovering local services and listening to the status changes of local services of the specified type through the **DiscoveryService** object. + +> **NOTE** +> To maximize the application running efficiency, most API calls are called asynchronously in callback or promise mode. The following code examples use the callback mode. For details about the APIs, see [mDNS Management](../reference/apis/js-apis-net-mdns.md). + +The following describes the development procedure specific to each application scenario. + +## Available APIs + +For the complete list of APIs and example code, see [mDNS Management](../reference/apis/js-apis-net-mdns.md). + +| Type| API| Description| +| ---- | ---- | ---- | +| ohos.net.mdns | addLocalService(context: Context, serviceInfo: LocalServiceInfo, callback: AsyncCallback\): void | Adds an mDNS service. This API uses an asynchronous callback to return the result.| +| ohos.net.mdns | removeLocalService(context: Context, serviceInfo: LocalServiceInfo, callback: AsyncCallback\): void | Removes an mDNS service. This API uses an asynchronous callback to return the result.| +| ohos.net.mdns | createDiscoveryService(context: Context, serviceType: string): DiscoveryService | Creates a **DiscoveryService** object, which is used to discover mDNS services of the specified type.| +| ohos.net.mdns | resolveLocalService(context: Context, serviceInfo: LocalServiceInfo, callback: AsyncCallback\): void | Resolves an mDNS service. This API uses an asynchronous callback to return the result.| +| ohos.net.mdns.DiscoveryService | startSearchingMDNS(): void | Searches for mDNS services on the LAN.| +| ohos.net.mdns.DiscoveryService | stopSearchingMDNS(): void | Stops searching for mDNS services on the LAN.| +| ohos.net.mdns.DiscoveryService | on(type: 'discoveryStart', callback: Callback<{serviceInfo: LocalServiceInfo, errorCode?: MdnsError}>): void | Enables listening for **discoveryStart** events.| +| ohos.net.mdns.DiscoveryService | on(type: 'discoveryStop', callback: Callback<{serviceInfo: LocalServiceInfo, errorCode?: MdnsError}>): void | Enables listening for **discoveryStop** events.| +| ohos.net.mdns.DiscoveryService | on(type: 'serviceFound', callback: Callback\): void | Enables listening for **serviceFound** events.| +| ohos.net.mdns.DiscoveryService | on(type: 'serviceLost', callback: Callback\): void | Enables listening for **serviceLost** events.| + +## Managing Local Services + +1. Connect the device to the Wi-Fi network. +2. Import the **mdns** namespace from **@ohos.net.mdns**. +3. Call **addLocalService** to add a local service. +4. (Optional) Call **resolveLocalService** to resolve the local service for the IP address of the local network. +5. Call **removeLocalService** to remove the local service. + +```js +// Import the mdns namespace from @ohos.net.mdns. +import mdns from '@ohos.net.mdns' + +// Obtain the context of the FA model. +import featureAbility from '@ohos.ability.featureAbility'; +let context = featureAbility.getContext(); + +// Obtain the context of the stage model. +import UIAbility from '@ohos.app.ability.UIAbility'; +class EntryAbility extends UIAbility { + onWindowStageCreate(windowStage){ + globalThis.context = this.context; + } +} +let context = globalThis.context; + +// Create a LocalService object. +let localServiceInfo = { + serviceType: "_print._tcp", + serviceName: "servicename", + port: 5555, + host: { + address: "10.14.**.***", + }, + serviceAttribute: [{ + key: "111", + value: [1] + }] +} + +// Call addLocalService to add a local service. +mdns.addLocalService(context, localServiceInfo, function (error, data) { + console.log(JSON.stringify(error)); + console.log(JSON.stringify(data)); +}); + +// (Optional) Call resolveLocalService to resolve the local service. +mdns.resolveLocalService(context, localServiceInfo, function (error, data) { + console.log(JSON.stringify(error)); + console.log(JSON.stringify(data)); +}); + +// Call removeLocalService to remove the local service. +mdns.removeLocalService(context, localServiceInfo, function (error, data) { + console.log(JSON.stringify(error)); + console.log(JSON.stringify(data)); +}); +``` + +## Discovering Local Services + +1. Connect the device to the Wi-Fi network. +2. Import the **mdns** namespace from **@ohos.net.mdns**. +3. Creates a **DiscoveryService** object, which is used to discover mDNS services of the specified type. +4. Subscribe to mDNS service discovery status changes. +5. Enable discovery of mDNS services on the LAN. +6. Stop searching for mDNS services on the LAN. + +```js +// Import the mdns namespace from @ohos.net.mdns. +import mdns from '@ohos.net.mdns' + +// Obtain the context of the FA model. +import featureAbility from '@ohos.ability.featureAbility'; +let context = featureAbility.getContext(); + +// Obtain the context of the stage model. +import UIAbility from '@ohos.app.ability.UIAbility'; +class EntryAbility extends UIAbility { + onWindowStageCreate(windowStage){ + globalThis.context = this.context; + } +} +let context = globalThis.context; + +// Create a LocalService object. +let localServiceInfo = { + serviceType: "_print._tcp", + serviceName: "servicename", + port: 5555, + host: { + address: "10.14.**.***", + }, + serviceAttribute: [{ + key: "111", + value: [1] + }] +} + +// Create a DiscoveryService object, which is used to discover mDNS services of the specified type. +let serviceType = "_print._tcp"; +let discoveryService = mdns.createDiscoveryService(context, serviceType); + +// Subscribe to mDNS service discovery status changes. +discoveryService.on('discoveryStart', (data) => { + console.log(JSON.stringify(data)); +}); +discoveryService.on('discoveryStop', (data) => { + console.log(JSON.stringify(data)); +}); +discoveryService.on('serviceFound', (data) => { + console.log(JSON.stringify(data)); +}); +discoveryService.on('serviceLost', (data) => { + console.log(JSON.stringify(data)); +}); + +// Enable discovery of mDNS services on the LAN. +discoveryService.startSearchingMDNS(); + +// Stop searching for mDNS services on the LAN. +discoveryService.stopSearchingMDNS(); +``` diff --git a/en/application-dev/connectivity/net-mgmt-overview.md b/en/application-dev/connectivity/net-mgmt-overview.md index 0ad30c35cc..043d41768f 100644 --- a/en/application-dev/connectivity/net-mgmt-overview.md +++ b/en/application-dev/connectivity/net-mgmt-overview.md @@ -2,13 +2,14 @@ Network management functions include: -- [HTTP data request](http-request.md): Initiates a data request through HTTP. -- [WebSocket connection](websocket-connection.md): Establishes a bidirectional connection between the server and client through WebSocket. -- [Socket connection](socket-connection.md): Transmits data through Socket. -- [Network policy management](net-policy-management.md): Restricts network capabilities by setting network policies, including cellular network policy, sleep/power-saving mode policy, and background network policy, and resets network policies as needed. -- [Network sharing](net-sharing.md): Shares a device's Internet connection with other connected devices by means of Wi-Fi hotspot, Bluetooth, and USB sharing, and queries the network sharing state and shared mobile data volume. -- [Ethernet connection](net-ethernet.md): Provides wired network capabilities, which allow you to set the IP address, subnet mask, gateway, and Domain Name System (DNS) server of a wired network. -- [Network connection management](net-connection-manager.md): Provides basic network management capabilities, including management of Wi-Fi/cellular/Ethernet connection priorities, network quality evaluation, subscription to network connection status changes, query of network connection information, and DNS resolution. +- [HTTP data request](http-request.md): initiates a data request through HTTP. +- [WebSocket connection](websocket-connection.md): establishes a bidirectional connection between the server and client through WebSocket. +- [Socket connection](socket-connection.md): transmits data through Socket. +- [Network policy management](net-policy-management.md): restricts network capabilities by setting network policies, including cellular network policy, sleep/power-saving mode policy, and background network policy, and resets network policies as needed. +- [Network sharing](net-sharing.md): shares a device's Internet connection with other connected devices by means of Wi-Fi hotspot, Bluetooth, and USB sharing, and queries the network sharing state and shared mobile data volume. +- [Ethernet connection](net-ethernet.md): provides wired network capabilities, which allow you to set the IP address, subnet mask, gateway, and Domain Name System (DNS) server of a wired network. +- [Network connection management](net-connection-manager.md): provides basic network management capabilities, including management of Wi-Fi/cellular/Ethernet connection priorities, network quality evaluation, subscription to network connection status changes, query of network connection information, and DNS resolution. +- [mDNS management](net-mdns.md): provides Multicast DNS (mDNS) management capabilities, such as adding, removing, discovering, and resolving local services on a LAN. ## Constraints diff --git a/en/application-dev/dfx/apprecovery-guidelines.md b/en/application-dev/dfx/apprecovery-guidelines.md index 5c297d3357..e5e7b52743 100644 --- a/en/application-dev/dfx/apprecovery-guidelines.md +++ b/en/application-dev/dfx/apprecovery-guidelines.md @@ -9,7 +9,7 @@ Application recovery helps to restore the application state and save temporary d In API version 9, application recovery is supported only for a single ability of the application developed using the stage model. Application state saving and automatic restart are performed when a JsError occurs. -In API version 10, application recovery is also supported for multiple abilities of the application developed using the stage model. Application state storage and restore are performed when an AppFreeze occurs. If an application is killed in control mode, the application state will be restored upon next startup. +In API version 10, application recovery is applicable to multiple abilities of an application developed using the stage model. Application state storage and restore are performed when an AppFreeze occurs. If an application is killed in control mode, the application state will be restored upon next startup. ## Available APIs @@ -221,3 +221,20 @@ export default class EntryAbility extends Ability { } } ``` + +#### Restart Flag for the Failed Ability + +If the failed ability is restarted again, the [ABILITY_RECOVERY_RESTART](../reference/apis/js-apis-app-ability-wantConstant.md#wantconstantparams) flag will be added as a **parameters** member for the **want** parameter in **onCreate** and its value is **true**. + +```ts +import UIAbility from '@ohos.app.ability.UIAbility'; +import wantConstant from '@ohos.app.ability.wantConstant'; +export default class EntryAbility extends UIAbility { + onCreate(want, launchParam) { + if (want.parameters[wantConstant.Params.ABILITY_RECOVERY_RESTART] != undefined && + want.parameters[wantConstant.Params.ABILITY_RECOVERY_RESTART] == true) { + console.log("This ability need to recovery"); + } + } +} +``` diff --git a/en/application-dev/faqs/Readme-EN.md b/en/application-dev/faqs/Readme-EN.md index 63535a32ae..e76f1f1205 100644 --- a/en/application-dev/faqs/Readme-EN.md +++ b/en/application-dev/faqs/Readme-EN.md @@ -2,7 +2,7 @@ - [Programming Languages](faqs-language.md) - [Ability Framework Development](faqs-ability.md) -- [Bundle Management Development](faqs-bundle.md) +- [Resource Manager Development](faqs-globalization.md) - [ArkUI (ArkTS) Development](faqs-ui-ets.md) - [ArkUI Web Component (ArkTS) Development](faqs-web-arkts.md) - [ArkUI (JavaScript) Development](faqs-ui-js.md) @@ -10,12 +10,9 @@ - [Graphics and Image Development](faqs-graphics.md) - [File Management Development](faqs-file-management.md) - [Media Development](faqs-media.md) -- [Network and Connection Development](faqs-connectivity.md) -- [Data Management Development](faqs-data-management.md) -- [Device Management Development](faqs-device-management.md) +- [Network Management Development](faqs-network-management.md) - [DFX Development](faqs-dfx.md) -- [Intl Development](faqs-international.md) - [Native API Usage](faqs-native.md) +- [Startup Development](faqs-startup.md) - [Usage of Third- and Fourth-Party Libraries](faqs-third-party-library.md) - [IDE Usage](faqs-ide.md) -- [Development Board](faqs-development-board.md) \ No newline at end of file diff --git a/en/application-dev/faqs/faqs-connectivity.md b/en/application-dev/faqs/faqs-connectivity.md deleted file mode 100644 index 31e1db2e15..0000000000 --- a/en/application-dev/faqs/faqs-connectivity.md +++ /dev/null @@ -1,33 +0,0 @@ -# Network and Connection Development - - - -## What are the data formats supported by extraData in an HTTP request? - -Applicable to: OpenHarmony SDK 3.2.2.5, stage model of API version 9 - -**extraData** indicates additional data in an HTTP request. It varies depending on the HTTP request method. - -- If the HTTP request uses a POST or PUT method, **extraData** serves as the content of the HTTP request. - -- If the HTTP request uses a GET, OPTIONS, DELETE, TRACE, or CONNECT method, **extraData** serves as a supplement to the HTTP request parameters and will be added to the URL when the request is sent. - -- If you pass in a string object, **extraData** contains the string encoded on your own. - - -## What does error code 28 mean for an HTTP request? - -Applicable to: OpenHarmony SDK 3.2.2.5, stage model of API version 9 - -Error code 28 refers to **CURLE_OPERATION_TIMEDOUT**, which means a cURL operation timeout. For details, see any HTTP status code description available. - -Reference: [Response Codes](../reference/apis/js-apis-http.md#responsecode) and [Curl Error Codes](https://curl.se/libcurl/c/libcurl-errors.html) - - -## What does error code 6 mean for the response of \@ohos.net.http.d.ts? - -Applicable to: OpenHarmony SDK 3.2.3.5 - -Error code 6 indicates a failure to resolve the host in the address. You can ping the URL carried in the request to check whether the host is accessible. - -Reference: [Response Codes](../reference/apis/js-apis-http.md#responsecode) and [Curl Error Codes](https://curl.se/libcurl/c/libcurl-errors.html) diff --git a/en/application-dev/faqs/faqs-data-management.md b/en/application-dev/faqs/faqs-data-management.md deleted file mode 100644 index 47f0b7ce20..0000000000 --- a/en/application-dev/faqs/faqs-data-management.md +++ /dev/null @@ -1,76 +0,0 @@ -# Data Management Development - -## How Do I Save PixelMap Data to a Database? - -Applicable to: OpenHarmony SDK 3.2.3.5 - -You can convert a **PixelMap** into an **ArrayBuffer** and save the **ArrayBuffer** to your database. - -Reference: [readPixelsToBuffer](../reference/apis/js-apis-image.md#readpixelstobuffer7-1) - -## How Do I Obtain RDB Store Files? - -Applicable to: OpenHarmony SDK 3.2.3.5, stage model of API version 9 - -Run the hdc_std command to copy the .db, .db-shm, and .db-wal files in **/data/app/el2/100/database/*bundleName*/entry/db/**, and then use the SQLite tool to open the files. - -Example: - -``` - hdc_std file recv /data/app/el2/100/database/com.xxxx.xxxx/entry/db/test.db ./test.db -``` - -## Does the Database Has a Lock Mechanism? - -Applicable to: OpenHarmony SDK 3.2.5.5, stage model of API version 9 - -The distributed data service (DDS), relational database (RDB) store, and preferences provided OpenHarmony have a lock mechanism. You do not need to bother with the lock mechanism during the development. - -## What Is a Transaction in an RDB Store? - -Applicable to: all versions - -When a large number of operations are performed in an RDB store, an unexpected exception may cause a failure of some data operations and loss of certain data. As a result, the application may become abnormal or even crash. - -A transaction is a group of tasks serving as a single logical unit. It eliminates the failure of some of the operations and loss of associated data. - -## What Data Types Does an RDB Store Support? - -Applicable to: OpenHarmony SDK 3.0 or later, stage model of API version 9 - -An RDB store supports data of the number, string, and Boolean types. The number array supports data of the Double, Long, Float, Int, or Int64 type, with a maximum precision of 17 decimal digits. - -## How Do I View Database db Files? - -Applicable to: OpenHarmony SDK 3.2.6.5, stage model of API version 9 - -1. Run the **hdc_std shell** command. - -2. Obtain the absolute path or sandbox path of the database. - -The absolute path is **/data/app/el2//database/**. The default **** is **100**. - -To obtain the sandbox path, run the **ps -ef | grep hapName** command to obtain the process ID of the application. - -The database sandbox path is **/proc//root/data/storage/el2/database/**. - -3. Run the **find ./ -name "\*.db"** command in the absolute path or sandbox path of the database. - -## How Do I Store Long Text Data? - -Applicable to: OpenHarmony SDK 3.2.5.5, API version 9 - -- Preferences support a string of up to 8192 bytes. - -- The KV store supports a value of up to 4 MB. - -Reference: [Preference Overview](../database/database-preference-overview.md) and [Distributed Data Service Overview](../database/database-mdds-overview.md) - -## How Do I Develop DataShare on the Stage Model - -Applicable to: OpenHarmony SDK 3.2.5.5, API version 9 - -The DataShare on the stage model cannot be used with the **DataAbility** for the FA model. The connected server application must be implemented by using **DataShareExtensionAbility**. - -Reference: [DataShare Development](../database/database-datashare-guidelines.md) - diff --git a/en/application-dev/faqs/faqs-development-board.md b/en/application-dev/faqs/faqs-development-board.md deleted file mode 100644 index 0a2a29db5b..0000000000 --- a/en/application-dev/faqs/faqs-development-board.md +++ /dev/null @@ -1,50 +0,0 @@ -# Development Board Usage - -## How do I take screenshots on a development board? - -Applicable to: OpenHarmony SDK 3.2.2.5, stage model of API version 9 - -- Method 1: Click the screenshot button in the Control Panel from the development board UI. The screenshot is displayed in Gallery. - -- Method 2: Run the screenshot script. Connect to the development board to a computer running Windows. Create a text file on the computer, copy the following script content to the file, change the file name extension to **.bat** (the HDC environment variables must be configured in advance), and click **Run**. The screenshot is saved to the same directory as the **.bat** script file. - Example: - - ``` - set filepath=/data/%date:~0,4%%date:~5,2%%date:~8,2%%time:~1,1%%time:~3,2%%time:~6,2%.png - echo %filepath% - : pause - hdc_std shell snapshot_display -f %filepath% - : pause - hdc_std file recv %filepath% . - : pause - ``` - -## How do I adjust Previewer in DevEco Studio so that the preview looks the same as what's displayed on a real RK3568 development board? - -Applicable to: DevEco Studio 3.0.0.991 - -1. Create a profile in Previewer. - - ![en-us_image_0000001361254285](figures/en-us_image_0000001361254285.png) - -2. Set the profile parameters as follows: - - Device type : default - - Resolution: 720\*1280 - - DPI: 240 - -## What should I do if Device Manager incorrectly identifies a development board as FT232R USB UART even when the development board already has a driver installed? - -Possible cause: The USB serial driver of the development version is not installed. - -Solution: Search for **FT232R USB UART**, and download and install the driver. - -## How do I complete authentication when logging in to the development board? - -Applicable to: OpenHarmony SDK 3.2.2.5 - -When connecting to the network that requires authentication, open any web page in the browser to access the authentication page. - -If there is no browser on the development board, you can install the [sample browser application](https://gitee.com/openharmony/app_samples/tree/master/device/Browser). diff --git a/en/application-dev/faqs/faqs-device-management.md b/en/application-dev/faqs/faqs-device-management.md deleted file mode 100644 index ea71edd6c9..0000000000 --- a/en/application-dev/faqs/faqs-device-management.md +++ /dev/null @@ -1,48 +0,0 @@ -# Device Management Development - -## How do I obtain the DPI of a device? - -Applicable to: OpenHarmony 3.2 Beta5, stage model of API version 9 - -Import the **@ohos.display** module and call the **getDefaultDisplaySync** API. - -**Example** - -``` -import display from '@ohos.display'; -let displayClass = null; -try { - displayClass = display.getDefaultDisplaySync(); - console.info('Test densityDPI:' + JSON.stringify(data.densityDPI)); -} catch (exception) { - console.error('Failed to obtain the default display object. Code: ' + JSON.stringify(exception)); -} -``` - -## How do I obtain the type of the device where the application is running? - -Applicable to: OpenHarmony SDK 3.2.2.5, stage model of API version 9 - -Import the **\@ohos.deviceInfo** module and call the **deviceInfo.deviceType** API. - -For details, see [Device Information](../reference/apis/js-apis-device-info.md). - -## How do I obtain the system version of a device? - -Applicable to: OpenHarmony SDK 3.2.5.5, stage model of API version 9 - -Use the **osFullName** attribute of the [deviceInfo](../reference/apis/js-apis-device-info.md) object. - -## How do I obtain the UDID of an OpenHarmony device? - -Applicable to: OpenHarmony SDK3.0, stage model of API version 9 - -- To obtain the UDID of the connected device, run the **hdc shell bm get --udid** command. - -- For details about how to obtain the UDID from code, see [udid](../reference/apis/js-apis-device-info.md). - -## How do I develop a shortcut key function? - -Applicable to: OpenHarmony SDK 3.2.6.5, stage model of API version 9 - -To develop a shortcut key function, use the APIs in [Input Consumer](../reference/apis/js-apis-inputconsumer.md). diff --git a/en/application-dev/faqs/faqs-dfx.md b/en/application-dev/faqs/faqs-dfx.md index 9fc12a1b1c..51945bd8d0 100644 --- a/en/application-dev/faqs/faqs-dfx.md +++ b/en/application-dev/faqs/faqs-dfx.md @@ -1,54 +1,27 @@ # DFX Development -## How do I locate the fault when the application crashes? +## How do I flush HiLog information to disks? -Applicable to: OpenHarmony SDK 3.2.5.5 +Applicable to: OpenHarmony 3.2 Beta (API version 9) -1. Locate the crash-related code based on the service log. +**Symptom** -2. View the error information in the crash file, which is located at **/data/log/faultlog/faultlogger/**. +How do I flush HiLog information to disks? -## Why cannot access controls in the UiTest test framework? +**Solution** -Applicable to: OpenHarmony SDK 3.2.5.5 +Run the **hilog -w start -f ckTest -l 1M -n 5 -m zlib -j 11** command. -Check whether **persist.ace.testmode.enabled** is turned on. +The log file is saved in the **/data/log/hilog/** directory. -Run **hdc\_std shell param get persist.ace.testmode.enabled**. +Parameter description: -If the value is **0**, run the **hdc\_std shell param set persist.ace.testmode.enabled 1** to enable the test mode. - - -## Why is private displayed in logs when the format parameter type of HiLog in C++ code is %d or %s? - -When format parameters such as **%d** and **%s** are directly used, the standard system uses **private** to replace the actual data for printing by default to prevent data leakage. To print the actual data, replace **%d** with **%{public}d** or replace **%s** with **%{public}s**. - -## What should I do if the hilog.debug log cannot be printed? - -Applicable to: OpenHarmony SDK 3.2.5.5, stage model of API version 9 - -Run **hdc_std shell hilog -b D** to turn on the debugging switch. - -## Is HiLog or console recommended for log printing? How do I set the domain if HiLog is used? - -Applicable to: OpenHarmony SDK 3.2.2.5 - -You are advised to use the [HiLog](../reference/apis/js-apis-hilog.md) for log printing. For details about how to set the **domain** parameter, see the [Development Guide](../reference/apis/js-apis-hilog.md#hilogisloggable). - -## What is the maximum length of a log record when HiLog is used? Is it configurable? - -Applicable to: OpenHarmony SDK 3.2.2.5 - -The maximum length of a log record is 1,024 characters, and it is not changeable. - -## Can I separate multiple strings by spaces in the tag parameter of the HiLog API? - -Applicable to: OpenHarmony SDK 3.2.6.5, stage model of API version 9 - -No. Separating multiple strings by spaces is not allowed. - -## How do I print real data if HiLog does not contain data labeled by {public}? - -Applicable to: OpenHarmony SDK 3.2.6.5, stage model of API version 9 - -Run **hdc\_std shell hilog -p off** to disable logging of data labeled by {public}. +``` +-**-w**: Starts a log flushing task. **start** means to start the task, and **stop** means to stop the task. +-**-f**: Sets the log file name. +-**-l**: Sets the size of a single log file. The unit can be B, KB, MB, or GB. +-**-n**: Sets the maximum number of log files. When the number of log files exceeds the specified value, the earliest log file will be overwritten. The value range is [2,1000]. +-**-m**: Specifies the log file compression algorithm. +-**-j**: Specifies the task ID. The value ranges from **10** to **0xffffffffff**. +For more details about parameters, run the **hilog --help** command. +``` diff --git a/en/application-dev/faqs/faqs-globalization.md b/en/application-dev/faqs/faqs-globalization.md new file mode 100644 index 0000000000..b4d06ab98c --- /dev/null +++ b/en/application-dev/faqs/faqs-globalization.md @@ -0,0 +1,118 @@ +# Resource Manager Development + +## How do I read an XML file in rawfile and convert the data in it to the string type? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Solution** + +Call **getRawFileContent** of the **ResourceManager** module to obtain the data in the XML file, and then use **String.fromCharCode** to convert the data to the string type. + +**Sample Code** + +``` +resourceManager.getRawFileContent('test.xml', (error, value) => { + if (error != null) { + console.log("error is " + error); + } else { + let rawFile = value; + let xml = String.fromCharCode.apply(null, rawFile) + } +}); +``` + +**Reference** + +[Resource Manager](../reference/apis/js-apis-resource-manager.md) + +## How do I obtain resources in the stage model? + +Applicable to: OpenHarmony 3.1 Beta 5 (API version 9) + +**Solution** + +The stage model allows an application to obtain a **ResourceManager** object based on **context** and call its resource management APIs without first importing the required bundle. This mode does not apply to the FA model. + +**Sample Code** + +``` +const context = getContext(this) as any +context + .resourceManager + .getString($r('app.string.entry_desc').id) + .then(value => { + this.message = value.toString() +}) +``` + +## How do I obtain the path of the resource directory by using an API? + +Applicable to: OpenHarmony 3.1 Beta 5 (API version 9) + +**Symptom** + +How do I obtain the path of the **resource** directory so that I can manage the files in it by using the file management API? + +**Solution** + +Because the application is installed in HAP mode and the HAP package is not decompressed after the installation is complete, the resource path cannot be obtained when the program is running. + +To obtain the path of the **resource** directory, try either of the following ways: + +1. Use **\$r** or **\$rawfile** for access. This method applies to static access, during which the **resource** directory remains unchanged when the application is running. + +2. Use **ResourceManager** for access. This method applies to dynamic access, during which the **resource** directory dynamically changes when the application is running. + +**Reference** + +[Resource Categories and Access](../quick-start/resource-categories-and-access.md) and [Resource Manager](../reference/apis/js-apis-resource-manager.md) + +## Why does getPluralString return an incorrect value? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Symptom** + +The value obtained by the **getPluralString** is **other**, which is incorrect. + +**Solution** + +The **getPluralString** API is effective only when the system language is English. + +## How do I obtain the customized string fields in the resources directory? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Solution** + +Use **getStringValue** of the **ResourceManager** module. + +**Reference** + +[Resource Manager](../reference/apis/js-apis-resource-manager.md#getstringvalue9) + +## How do I reference resources such as images and text in AppScope? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Solution** + +Reference resources in the **\$r\('app.type.name'\)** format. Wherein, **type** indicates the resource type, such as color, string, and media, and **name** indicates the resource name. + +## How do I convert resources to strings? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Solution** + +For a qualifier directory, use **this.context.resourceManager.getStringSync\(\$r\('app.string.test'\).id\)** to covert resources to strings synchronously. Note that the **\$r\('app.string.test', 2\)** mode is not supported. + +**Reference** + +[Resource Manager](../reference/apis/js-apis-resource-manager.md#getstringsync9) + +## Can $ be used to reference constants in the form\_config.json file? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**\$** cannot be used to reference constants in the **form\_config.json** file. diff --git a/en/application-dev/faqs/faqs-international.md b/en/application-dev/faqs/faqs-international.md deleted file mode 100644 index 546402921c..0000000000 --- a/en/application-dev/faqs/faqs-international.md +++ /dev/null @@ -1,19 +0,0 @@ -# Intl Development - -## How resources in AppScope, such as images and text, are referenced? - -Applicable to: OpenHarmony SDK 3.2.5.5, stage model of API version 9 - -Resources are referenced in the **$r('app.type.name')** format. Where, **type** indicates the resource type, such as color, string, and media, and **name** indicates the resource name. - -## How do I convert the resource type to string? - -Applicable to: OpenHarmony SDK3.0, stage model of API version 9 - -If the resource type is set to **string**, the qualifier directory can be set as **this.context.resourceManager.getStringSync(\\$r('app.string.test').id)** and can be converted synchronously. The **\$r('app.string.test', 2)** mode is not supported. For more usage methods, see [Resource Manager](../reference/apis/js-apis-resource-manager.md#getstringsync9). - -## Why should I do if the constants referenced by $ in the form_config.json file does not take effect? - -Applicable to: OpenHarmony SDK 3.2.6.5, API9 Stage model - -In the **form\_config.json** file, **$** cannot be used to reference constants. diff --git a/en/application-dev/faqs/faqs-language.md b/en/application-dev/faqs/faqs-language.md index 6d3ded94a7..686283d7f8 100644 --- a/en/application-dev/faqs/faqs-language.md +++ b/en/application-dev/faqs/faqs-language.md @@ -85,8 +85,6 @@ Applicable to: OpenHarmony SDK 3.2.3.5, stage model of API version 9 Objects imported to abilities and pages are packaged into two different closures, that is, two global objects. In this case, a static variable referenced by the abilities is not the same object as that referenced by the pages. Therefore, global variables cannot be defined by defining static variables in the class. You are advised to use AppStorage to manage global variables. -Reference: [State Management with Application-level Variables](../quick-start/arkts-state-mgmt-application-level.md) - ## How do I obtain resources in the stage model? Applicable to: OpenHarmony SDK 3.2.3.5, stage model of API version 9 @@ -181,7 +179,7 @@ Similar to **new Date().getTime()**, **systemTime.getCurrentTime(false)** return Applicable to: OpenHarmony SDK 3.2.6.5, stage model of API version 9 -If no parameter is passed when assigning a value to the **@BuilderParam** decorated attribute (for example, **content: this.specificParam**), define the type of the attribute as a function without a return value (for example, **@BuilderParam content: () => voi**). If any parameter is passed when assigning a value to the **@BuilderParam** decorated attribute (for example, **callContent: this.specificParam1("111")**), define the type of the attribute as **any** (for example, **@BuilderParam callContent: any**). For details, see [BuilderParam](../quick-start/arkts-dynamic-ui-elememt-building.md#builderparam8). +If no parameter is passed when assigning a value to the **@BuilderParam** decorated attribute (for example, **content: this.specificParam**), define the type of the attribute as a function without a return value (for example, **@BuilderParam content: () => voi**). If any parameter is passed when assigning a value to the **@BuilderParam** decorated attribute (for example, **callContent: this.specificParam1("111")**), define the type of the attribute as **any** (for example, **@BuilderParam callContent: any**). ## How does ArkTS convert a string into a byte array? @@ -251,7 +249,6 @@ Applicable to: OpenHarmony SDK 3.2.5.5, stage model of API version 9 To listen for in-depth changes of **@State** decorated variables, you can use **@Observed** and **@ObjectLink** decorators. - ## How do I implement character string encoding and decoding? Applicable to: OpenHarmony SDK 3.2.5.5, stage model of API version 9 diff --git a/en/application-dev/faqs/faqs-network-management.md b/en/application-dev/faqs/faqs-network-management.md new file mode 100644 index 0000000000..dd585f87cc --- /dev/null +++ b/en/application-dev/faqs/faqs-network-management.md @@ -0,0 +1,222 @@ +# Network Management Development + +## What are the data formats supported by extraData in an HTTP request? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Solution** + +**extraData** indicates additional data in an HTTP request. It varies depending on the HTTP request method. + +- If the HTTP request uses a POST or PUT method, **extraData** serves as the content of the HTTP request. +- If the HTTP request uses a GET, OPTIONS, DELETE, TRACE, or CONNECT method, **extraData** serves as a supplement to the HTTP request parameters and will be added to the URL when the request is sent. +- If you pass in a string object, **extraData** contains the string encoded on your own. + +## What does error code 28 mean in the response to an HTTP request? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Symptom** + +Error code 28 is reported after an HTTP request is initiated. + +**Solution** + +Error code 28 indicates **CURLE\_OPERATION\_TIMEDOUT**, which means a libcurl library operation timeout. For details, see any HTTP status code description available. + +**Reference** + +[Common HTTP Response Codes](../reference/apis/js-apis-http.md#responsecode) and [Curl Error Codes](https://curl.se/libcurl/c/libcurl-errors.html) + +## What does error code 6 mean in the response to an HTTP request? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Symptom** + +Error code 6 is reported after an HTTP request is initiated. + +**Solution** + +Error code 6 indicates a failure to resolve the host in the address. You can ping the URL carried in the request to check whether the host is accessible. + +**Reference** + +[Common HTTP Response Codes](../reference/apis/js-apis-http.md#responsecode) and [Curl Error Codes](https://curl.se/libcurl/c/libcurl-errors.html) + +## How are parameters passed to queryParams of the POST request initiated by @ohos/axios? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Symptom** + +How are parameters passed to **queryParams** when the third-party component @ohos/axios initiates a POST request? + +**Solution** + +- Method 1: Have the **axios.post** API receive only one parameter. The **Url.URLSearchParams** parameter needs to be converted into a string and appended to the end of the URL. + + ``` + let params:Url.URLSearchParams = new Url.URLSearchParams() + params.append('ctl', 'sug') + params.append('query', 'wangjunkai') + params.append('cfrom', '1099a') + axios.post('http://10.100.195.234:3000/save?' + params.toString()).then(res => { + this.message = "request result: " + JSON.stringify(res.data); + }).catch(err => { + this.message = "request error: " + err.message; + }) + ``` + +- Method 2: Have the **axios** API receive only one **config** object. The request parameters are written in **params** of the **config** object. + + ``` + axios({ + url: 'http://10.100.195.234:3000/save', + method: 'post', + params: { + ctl: 'sug', + query: 'wangjunkai', + cfrom: '1099a' + } + }).then(res => { + this.message = "request result: " + JSON.stringify(res.data); + }).catch(err => { + this.message = "request error: " + err.message; + }) + ``` + + +## What should I do if no data is returned after connection.getNetCapabilities\(mNetHandle\) is called? + +Applicable to: OpenHarmony 3.2 Beta 2 (API version 9) + +**Symptom** + +No data is returned after **connection.getNetCapabilities\(\)** is called. What should I do? + +**Possible Cause** + +This problem is due to incorrect pointing of the **this** object. You are expected to use **\(err,data\)=\>\{\}** instead of **function\(err,data\)** to access the callback function to obtain the return result. The reason is that the function declared by **function** has its own **this** object and therefore cannot point to the **globalThis** object. + +**Solution** + +Change **function\(err,data\)** to **\(err,data\)** for the second parameter of **getNetCapabilities**. + +## How is data in HTTP requests transmitted in JSON format? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Solution** + +In the HTTP message header, **Content-Type** is used to indicate the media type information. It tells the server how to process the requested data and tells the client (usually a browser) how to parse the response data, for example, displaying an image, parsing HTML, or displaying only the text. + +To transmit data in HTTP requests in JSON format, set **Content-Type** to **application/json**. + +``` +this.options = { + method: http.RequestMethod.GET, + extraData: this.extraData, + header: { 'Content-Type': 'application/json' }, + readTimeout: 50000, + connectTimeout: 50000 +} +``` + +## How do I upload photos taken by a camera to the server? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Symptom** + +After an application calls the camera to take a photo, how do I upload the photo to the server? + +**Solution** + +After the application is started and the permission is obtained, have the system access the remote server and transfer the locally saved photos to the remote server through the upload API. + +**Reference** + +[Upload and Download](../reference/apis/js-apis-request.md) + +## What should I do if calling connection.hasDefaultNet\(\) fails even when the network is normal? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Symptom** + +The network connection is normal, and web pages can be opened properly on the browser. However, calling the **hasDefaultNet** fails, and the callback function returns an error. + +**Solution** + +Declare the **ohos.permission.GET\_NETWORK\_INFO** permission when calling **connection.hasDefaultNet**. + +For details, see [Applying for Permissions](../security/accesstoken-guidelines.md). + +## What does netId mean in the netHandle object returned by connection.getDefaultNet? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Symptom** + +What are the meanings of the values of **netId**, such as **0** and **100**? + +**Solution** + +If the value of **netId** is **0**, no network connection is available. In such a case, check and rectify network faults. If the value is greater than or equal to **100**, the network connection is normal. + +## How do I use HTTP requests to obtain data from the network? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Solution** + +Use the **@ohos.net.http** module to initiate an HTTP request. + +1. Import the **http** module and create an HTTP request. +2. Set the request URL and parameters and initiate the HTTP request. +3. Obtain the response and parse the data. + +**Reference** + +[HTTP Data Request](../connectivity/http-request.md) + +## How do I encapsulate network requests by using JavaScript? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Solution** + +OpenHarmony supports the JavaScript development mode. You can directly use JavaScript to encapsulate network requests. For details, see [Network Connection](../reference/apis/js-apis-http.md). + +## How do I write network requests when developing a JavaScript-based application for smart watches? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Solution** + +OpenHarmony supports the JavaScript development mode. You can directly use JavaScript to encapsulate network requests. For details, see [Network Connection](../reference/apis/js-apis-http.md). + +## Why does an application fail to start after the ohos.permission.NOTIFICATION\_CONTROLLER permission is declared? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Symptom** + +When an application is started, the following error message is reported w: error: install failed due to grant request permissions failed. + +**Solution** + +The **ohos.permission.NOTIFICATION\_CONTROLLER** permission is a **system core** permission and is not available for third-party applications. + +## What should I do if an error is reported when wifi.getIpInfo\(\).ipAddress is used in the Wi-Fi module? + +Applicable to: OpenHarmony 3.2 Beta (API version 9) + +**Symptom** + +When **wifi.getIpInfo\(\).ipAddress** is used in the Wi-Fi module, the following error message is reported: Error: assertion \(wifiDevicePtr != nullptr\) failed: Wifi device instance is null. + +**Solution** + +This problem is due to insufficient permissions. Check whether you have applied for the required permissions. For details, see [Permission Management](../security/accesstoken-overview.md). diff --git a/en/application-dev/faqs/faqs-startup.md b/en/application-dev/faqs/faqs-startup.md new file mode 100644 index 0000000000..3d0d9d2cf8 --- /dev/null +++ b/en/application-dev/faqs/faqs-startup.md @@ -0,0 +1,43 @@ +# Startup Development + +## How do I obtain the system version of a device? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Solution** + +You can obtain the system version of a device through the **osFullName** attribute of the [deviceInfo](../reference/apis/js-apis-device-info.md) object. + +**Sample Code** + +``` +import deviceInfo from '@ohos.deviceInfo' +let v = deviceInfo.osFullName +``` + +## How do I obtain the UDID of a device? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Solution** + +- Method 1: Run the **hdc shell bm get --udid** command. +- Method 2: Obtain the value from the code. For details, see [udid](../reference/apis/js-apis-device-info.md). + +## How do I obtain device information? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +You can call **deviceInfo** to obtain device information, such as the device model. + +**Reference** + +[Device Information](../reference/apis/js-apis-device-info.md) + +## How do I prevent application development from being interrupted by screen saving? + +Applicable to: OpenHarmony 3.2 Beta 5 (API version 9) + +**Solution** + +Run the **hdc shell "power-shell setmode 602"** command to turn off screen saving. diff --git a/en/application-dev/napi/figures/rawfile1.png b/en/application-dev/napi/figures/rawfile1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f29f7875cd983f967b7a3b27b5898bfce76c9f3 GIT binary patch literal 103107 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 z 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 { - rawfileTest.testRawFile("test", resmgr, (error, value) => { - console.log("test rawFile"); - }) - }); - ``` - - ```c++ - // Obtain and parse the parameters in the C++ file. - NativeResourceManager* nativeResourceManager = nullptr; - std::string path; - if (i == 0 && valueType == napi_string) { - // Parse the first parameter, which is the file or directory path relative to the raw file directory. - ...... - path = buf.data(); - } else if (i == 1 && valueType == napi_object) { - // Parse the second parameter, which is the JS resource manager. - nativeResourceManager = OH_ResourceManager_InitNativeResourceManager(env, argv[i]); + ```c++ + import resourceManager from '@ohos.resourceManager'; + export const getFileList: (resmgr: resourceManager.ResourceManager, path: string) => Array; + export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array; + export const getRawFileDescriptor: (resmgr: resourceManager.ResourceManager, path: string) => resourceManager.RawFileDescriptor; + ``` + +3. Modify the source file. + +1. Open the **src/main/cpp/hello.cpp** file. During initialization, the file maps the external JavaScript APIs **getFileList**, **getRawFileContent**, and **getRawFileDescriptor** to C++ native APIs **GetFileList**, **GetRawFileContent**, and **GetRawFileDescriptor**. + + ```c++ + EXTERN_C_START + static napi_value Init(napi_env env, napi_value exports) + { + napi_property_descriptor desc[] = { + { "getFileList", nullptr, GetFileList, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "getRawFileContent", nullptr, GetRawFileContent, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "getRawFileDescriptor", nullptr, GetRawFileDescriptor, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; } + EXTERN_C_END ``` +2. Add the three functions to the **src/main/cpp/hello.cpp** file. + + ```c++ + static napi_value GetFileList(napi_env env, napi_callback_info info) + static napi_value GetRawFileContent(napi_env env, napi_callback_info info) + static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info) + ``` + +3. Obtain JavaScript resource objects from the **hello.cpp** file, and convert them to native resource objects. Then, call the native APIs to obtain the raw file list, raw file content, and raw file descriptor {fd, offset, length}. The sample code is as follows: + + ```c++ + // Example 1: Use GetFileList to obtain the raw file list. + static napi_value GetFileList(napi_env env, napi_callback_info info) + { + OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest Begin"); + size_t requireArgc = 3; + size_t argc = 2; + napi_value argv[2] = { nullptr }; + // Obtain arguments of the native API. + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + + // Obtain argv[0], which specifies conversion of the JavaScript resource object (that is, OH_ResourceManager_InitNativeResourceManager) to a native object. + NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]); + + // Obtain argv[1], which specifies the relative path of the raw file. + size_t strSize; + char strBuf[256]; + napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize); + std::string dirName(strBuf, strSize); + + // Obtain the corresponding rawDir pointer object. + RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str()); + + // Obtain the number of files and folders in rawDir. + int count = OH_ResourceManager_GetRawFileCount(rawDir); + + // Traverse rawDir to obtain the list of file names and save it. + std::vector tempArray; + for(int i = 0; i < count; i++) { + std::string filename = OH_ResourceManager_GetRawFileName(rawDir, i); + tempArray.emplace_back(filename); + } + + napi_value fileList; + napi_create_array(env, &fileList); + for (size_t i = 0; i < tempArray.size(); i++) { + napi_value jsString; + napi_create_string_utf8(env, tempArray[i].c_str(), NAPI_AUTO_LENGTH, &jsString); + napi_set_element(env, fileList, i, jsString); + } + + // Close the rawDir pointer object. + OH_ResourceManager_CloseRawDir(rawDir); + OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); + return fileList; + } + + // Example 2: Use rawDir pointer object to obtain the content of the raw file. + napi_value CreateJsArrayValue(napi_env env, std::unique_ptr &data, long length) + { + napi_value buffer; + napi_status status = napi_create_external_arraybuffer(env, data.get(), length, + [](napi_env env, void *data, void *hint) { + delete[] static_cast(data); + }, nullptr, &buffer); + if (status != napi_ok) { + OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create external array buffer"); + return nullptr; + } + napi_value result = nullptr; + status = napi_create_typedarray(env, napi_uint8_array, length, buffer, 0, &result); + if (status != napi_ok) { + OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create media typed array"); + return nullptr; + } + data.release(); + return result; + } + static napi_value GetRawFileContent(napi_env env, napi_callback_info info) + { + OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "GetFileContent Begin"); + size_t requireArgc = 3; + size_t argc = 2; + napi_value argv[2] = { nullptr }; + // Obtain arguments of the native API. + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + + // Obtain argv[0], which specifies conversion of the JavaScript resource object (that is, OH_ResourceManager_InitNativeResourceManager) to a native object. + NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]); + size_t strSize; + char strBuf[256]; + napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize); + std::string filename(strBuf, strSize); + + // Obtain the raw file pointer object. + RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str()); + if (rawFile != nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success"); + } + // Obtain the size of the raw file and apply for memory. + long len = OH_ResourceManager_GetRawFileSize(rawFile); + std::unique_ptr data= std::make_unique(len); + // Read the raw file. + int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len); + // Close the raw file pointer object. + OH_ResourceManager_CloseRawFile(rawFile); + OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); + // Convert the native object to a JavaScript object. + return CreateJsArrayValue(env, data, len); + } + + // Example 3: Use GetRawFileDescriptor to obtain the FD of the raw file. + napi_value createJsFileDescriptor(napi_env env, RawFileDescriptor &descriptor) + { + napi_value result; + napi_status status = napi_create_object(env, &result); + if (status != napi_ok) { + return result; + } + + napi_value fd; + status = napi_create_int32(env, descriptor.fd, &fd); + if (status != napi_ok) { + return result; + } + status = napi_set_named_property(env, result, "fd", fd); + if (status != napi_ok) { + return result; + } + + napi_value offset; + status = napi_create_int64(env, descriptor.start, &offset); + if (status != napi_ok) { + return result; + } + status = napi_set_named_property(env, result, "offset", offset); + if (status != napi_ok) { + return result; + } + + napi_value length; + status = napi_create_int64(env, descriptor.length, &length); + if (status != napi_ok) { + return result; + } + status = napi_set_named_property(env, result, "length", length); + if (status != napi_ok) { + return result; + } + return result; + } + static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info) + { + OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest GetRawFileDescriptor Begin"); + size_t requireArgc = 3; + size_t argc = 2; + napi_value argv[2] = { nullptr }; + // Obtain arguments of the native API. + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + + napi_valuetype valueType; + napi_typeof(env, argv[0], &valueType); + // Obtain the native resourceManager object. + NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]); + size_t strSize; + char strBuf[256]; + napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize); + std::string filename(strBuf, strSize); + // Obtain the raw file pointer object. + RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str()); + if (rawFile != nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success"); + } + // Obtain the FD of the raw file, that is, RawFileDescriptor {fd, offset, length}. + RawFileDescriptor descriptor; + OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor); + // Close the raw file pointer object. + OH_ResourceManager_CloseRawFile(rawFile); + OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); + // Convert the native object to a JavaScript object. + return createJsFileDescriptor(env,descriptor); + } + ``` + +4. Call APIs on the JavaScript side. + +1. Open **src\main\ets\pages\index.ets**, and import **libentry.so**. + +2. Obtain the JavaScript resource object, that is, **resourceManager**. +3. Call **getFileList**, that is, the native API declared in **src/main/cpp/types/libentry/index.d.ts**. When calling the API, pass the JavaScript resource object and the relative path of the raw file. The sample code is as follows: + + ```js + import hilog from '@ohos.hilog'; + import testNapi from 'libentry.so' // Import the libentry.so file. + @Entry + @Component + struct Index { + @State message: string = 'Hello World' + private resmgr = getContext().resourceManager; // Obtain the JavaScript resource object. + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + .onClick(() => { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + let rawfilelist = testNapi.getFileList(this.resmgr, ""); // Pass the JavaScript resource object and the relative path of the raw file. + console.log("rawfilelist" + rawfilelist); + let rawfileContet = testNapi.getRawFileContent(this.resmgr, "rawfile1.txt"); + console.log("rawfileContet" + rawfileContet); + let rawfileDescriptor = testNapi.getRawFileDescriptor(this.resmgr, "rawfile1.txt"); + console.log("getRawFileDescriptor" + rawfileDescriptor.fd, rawfileDescriptor.offset, rawfileDescriptor.length); + }) + } + .width('100%') + } + .height('100%') + } + } + ``` + +## Using C++ Functions -3. Call **OH_ResourceManager_OpenRawDir** to obtain a **RawDir** instance based on the **NativeResourceManager** instance. +1. Call **OH_ResourceManager_OpenRawDir** to obtain a **RawDir** instance based on the **NativeResourceManager** instance. ```c++ RawDir* rawDir = OH_ResourceManager_OpenRawDir(nativeResourceManager, path.c_str()); ``` - - -4. Call **OH_ResourceManager_GetRawFileCount** to obtain the total number of raw files in the directory based on the **RawDir** instance. +2. Call **OH_ResourceManager_GetRawFileCount** to obtain the total number of raw files in the directory based on the **RawDir** instance. ```c++ int count = OH_ResourceManager_GetRawFileCount(rawDir); ``` - - -5. Call **OH_ResourceManager_GetRawFileName** to obtain the name of the raw file with the specified index. +3. Call **OH_ResourceManager_GetRawFileName** to obtain the name of the raw file with the specified index. ```c++ for (int index = 0; index < count; index++) { @@ -88,85 +315,65 @@ This document describes how to use the native Rawfile APIs to manage raw file di } ``` - - -6. Call **OH_ResourceManager_OpenRawFile** to obtain a **RawFile** instance with the specified file name. +4. Call **OH_ResourceManager_OpenRawFile** to obtain a **RawFile** instance with the specified file name. ```c++ RawFile* rawFile = OH_ResourceManager_OpenRawFile(nativeResourceManager, fileName.c_str()); ``` - - -7. Call **OH_ResourceManager_GetRawFileSize** to obtain the size of the raw file. +5. Call **OH_ResourceManager_GetRawFileSize** to obtain the size of the raw file. ```c++ long rawFileSize = OH_ResourceManager_GetRawFileSize(rawFile); ``` - - -8. Call **OH_ResourceManager_SeekRawFile** to seek a read/write position in the raw file based on the specified offset. +6. Call **OH_ResourceManager_SeekRawFile** to seek a read/write position in the raw file based on the specified offset. ```c++ int position = OH_ResourceManager_SeekRawFile(rawFile, 10, 0); int position = OH_ResourceManager_SeekRawFile(rawFile, 0 , 1); int position = OH_ResourceManager_SeekRawFile(rawFile, -10, 2); ``` - - -9. Call **OH_ResourceManager_GetRawFileOffset** to obtain the raw file offset. +7. Call **OH_ResourceManager_GetRawFileOffset** to obtain the raw file offset. ```c++ long rawFileOffset = OH_ResourceManager_GetRawFileOffset(rawFile) ``` - - -10. Call **OH_ResourceManager_ReadRawFile** to read the raw file. +8. Call **OH_ResourceManager_ReadRawFile** to read the raw file. ```c++ std::unique_ptr mediaData = std::make_unique(rawFileSize); long rawFileOffset = OH_ResourceManager_ReadRawFile(rawFile, mediaData.get(), rawFileSize); ``` - - -11. Call **OH_ResourceManager_CloseRawFile** to close the file to release resources. +9. Call **OH_ResourceManager_CloseRawFile** to close the file to release resources. ```c++ OH_ResourceManager_CloseRawFile(rawFile); ``` - - -12. Call **OH_ResourceManager_CloseRawDir** to close the raw file directory. +10. Call **OH_ResourceManager_CloseRawDir** to close the raw file directory. ```c++ OH_ResourceManager_CloseRawDir(rawDir); ``` - - -13. Call **OH_ResourceManager_GetRawFileDescriptor** to obtain the FD of the raw file. +11. Call **OH_ResourceManager_GetRawFileDescriptor** to obtain the FD of the raw file. ```c++ RawFileDescriptor descriptor; bool result = OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor); ``` - - -14. Call **OH_ResourceManager_ReleaseRawFileDescriptor** to release the FD of the raw file. +12. Call **OH_ResourceManager_ReleaseRawFileDescriptor** to release the FD of the raw file. ```c++ OH_ResourceManager_ReleaseRawFileDescriptor(descriptor); ``` - - -15. Call **OH_ResourceManager_ReleaseNativeResourceManager** to release the native resource manager. +13. Call **OH_ResourceManager_ReleaseNativeResourceManager** to release the native resource manager. ```c++ OH_ResourceManager_ReleaseNativeResourceManager(nativeResourceManager); diff --git a/en/application-dev/reference/apis/figures/printing-logs.png b/en/application-dev/reference/apis/figures/printing-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb89772d315b440636e8ceeda928e5db6b34e40 GIT binary patch literal 9907 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 **NOTE**
-> The APIs of this module are no longer maintained since API version 7. You are advised to use ['@ohos.hilog](js-apis-hilog.md)' instead. +The **console** module provides basic log printing capabilities and supports log printing by log level. + +If you want to use more advanced log printing services, for example, filtering logs by the specified ID, you are advised to use [`@ohos.hilog`](js-apis-hilog.md). + +> **NOTE** +> +> The initial APIs of this module are supported since API version 3. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## console.debug debug(message: string): void -Prints debug logs. +Prints debug-level logs. + +**System capability**: SystemCapability.ArkUI.ArkUI.Full + +**Parameters** -- Parameters - | Name | Type | Mandatory | Description | - | ------- | ------ | ---- | ----------- | - | message | string | Yes | Text to print.| +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| message | string | Yes | Text to print.| ## console.log log(message: string): void -Prints debug logs. +Prints debug-level logs. -- Parameters - | Name | Type | Mandatory | Description | - | ------- | ------ | ---- | ----------- | - | message | string | Yes | Text to print.| +**System capability**: SystemCapability.ArkUI.ArkUI.Full + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| message | string | Yes | Text to print.| ## console.info @@ -33,10 +44,13 @@ info(message: string): void Prints info-level logs. -- Parameters - | Name | Type | Mandatory | Description | - | ------- | ------ | ---- | ----------- | - | message | string | Yes | Text to print.| +**System capability**: SystemCapability.ArkUI.ArkUI.Full + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| message | string | Yes | Text to print.| ## console.warn @@ -45,10 +59,13 @@ warn(message: string): void Prints warn-level logs. -- Parameters - | Name | Type | Mandatory | Description | - | ------- | ------ | ---- | ----------- | - | message | string | Yes | Text to print.| +**System capability**: SystemCapability.ArkUI.ArkUI.Full + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| message | string | Yes | Text to print.| ## console.error @@ -57,13 +74,16 @@ error(message: string): void Prints error-level logs. -- Parameters - | Name | Type | Mandatory | Description | - | ------- | ------ | ---- | ----------- | - | message | string | Yes | Text to print.| +**System capability**: SystemCapability.ArkUI.ArkUI.Full + +**Parameters** +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| message | string | Yes | Text to print.| -## Example + +**Example** ``` export default { @@ -78,4 +98,261 @@ export default { Switch to the HiLog window at the bottom of HUAWEI DevEco Studio. Specifically, select the current device and process, set the log level to Info, and enter Hello World in the search box. Logs that meet the search criteria are displayed, as shown in the following figure. -![en-us_image_0000001200913929](figures/en-us_image_0000001200913929.png) +![Printing logs](figures/printing-logs.png) + +## console.assert10+ + +assert(value?: Object, ...arguments: Object[]): void + +If **value** is false, the subsequent content will be printed. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| value | Object | No | Value| +| arguments | Object | No | Prints error messages.| + +**Example** +``` +console.assert(true, 'does nothing'); + +console.assert(false, 'console %s work', 'didn\'t'); +// Assertion console:ohos didn't work + +console.assert(); +// Assertion failed +``` +## console.count10+ + +count(label?: string): void + +Adds a counter by the specified label name to count the number of times **console.count()** is called. The default value is **default**. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| label | string | No | Counter label name.| + +**Example** +``` +console.count() +// default: 1 +console.count('default') +// default: 2 +console.count('abc') +// abc: 1 +console.count('xyz') +// xyz: 1 +console.count('abc') +abc: 2 +console.count() +// default: 3 +``` + +## console.countReset10+ + +countReset(label?: string): void + +Resets a counter by the specified label name. The default value is **default**. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| label | string | No | Counter label name.| + +**Example** +``` +console.count('abc'); +// abc: 1 +console.countReset('abc'); +console.count('abc'); +// abc: 1 +``` + +## console.dir10+ + +dir(dir?: Object): void + +Prints content of the specified object. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| dir | Object | No | Object whose content needs to be printed.| + +## console.dirxml10+ + +dirxml(...arguments: Object[]): void + +Calls **console.log()** and passes the received parameters to it. This API does not produce any content of the XML format. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| arguments | Object | No | Information to be printed.| + +## console.group10+ + +group(...arguments: Object[]): void + +Creates an inline group so that subsequent lines are indented by the value specified by **groupIndentation**. +If the information to be printed is provided, the information is printed without extra indentation. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| arguments | Object | No | Information to be printed.| +## console.groupCollapsed10+ + +groupCollapsed(...arguments: Object[]): void + +Creates a collapsed inline group. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| arguments | Object | No | Information to be printed.| + +## console.groupEnd10+ + +groupEnd(): void + +Exits an inline group so that subsequent lines are not indented by the value specified by **groupIndentation** . + +**System capability**: SystemCapability.Utils.Lang + +## console.table10+ + +table(tableData?: Object): void + +Prints data in a table. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| tableData | Object | No | Data to be printed in a table.| + +**Example** +``` +console.table([1, 2, 3]); +// ┌─────────┬────────┐ +// │ (index) │ Values │ +// ├─────────┼────────┤ +// │ 0 │ 1 │ +// │ 1 │ 2 │ +// │ 2 │ 3 │ +// └─────────┴────────┘ + +console.table({ a: [1, 2, 3, 4, 5], b: 5, c: { e: 5 } }); + +// ┌─────────┬───┬───┬───┬───┬───┬───┬────────┐ +// │ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ e │ Values │ +// ├─────────┼───┼───┼───┼───┼───┼───┼────────┤ +// │ a │ 1 │ 2 │ 3 │ 4 │ 5 │ │ │ +// │ b │ │ │ │ │ │ │ 5 │ +// │ c │ │ │ │ │ │ 5 │ │ +// └─────────┴───┴───┴───┴───┴───┴───┴────────┘ +``` +## console.time10+ + +time(label?: string): void + +Starts a timer to track the duration of an operation. The default value is **default**. You can use **console.timeEnd()** to disable the timer and print the result. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| label | string | No | Timer label.| + +## console.timeEnd10+ + +timeEnd(label?: string): void + +Stops the timer started by **console.time()** and prints the result. The default value is **default**. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| label | string | No | Timer label.| + +**Example** +``` +console.time('abc'); +console.timeEnd('abc'); +// abc: 225.438ms +``` + +## console.timeLog10+ + +timeLog(label?: string, ...arguments: Object[]): void + +Prints the elapsed time and other logs for the timer started by **console.time()**. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| label | string | No | Timer label.| +| arguments | Object | No | Logs to be printed.| + +**Example** +``` +console.time('timer1'); +const value = aaa (); // Return 17. +console.timeLog('timer1', value); +// timer1: 365.227ms 17 +console.timeEnd('timer1'); +// timer1: 513.22ms +``` + +## console.trace10+ + +trace(...arguments: Object[]): void + +Creates a stack trace. + +**System capability**: SystemCapability.Utils.Lang + +**Parameters** + +| Name | Type | Mandatory | Description | +| ------- | ------ | ---- | ----------- | +| arguments | Object | No | Logs to be printed.| + +**Example** +``` +console.trace(); +console.trace("Show the trace"); +``` 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 0cd8b2df9f..76d9a3456a 100644 --- a/en/application-dev/reference/apis/js-apis-resource-manager.md +++ b/en/application-dev/reference/apis/js-apis-resource-manager.md @@ -13,7 +13,7 @@ The Resource Manager module provides APIs to obtain information about applicatio import resourceManager from '@ohos.resourceManager'; ``` -## How to Use +## Instruction Since API version 9, the stage model allows an application to obtain a **ResourceManager** object based on **context** and call its resource management APIs without first importing the required bundle. This approach, however, is not applicable to the FA model. For the FA model, you need to import the required bundle and then call the [getResourceManager](#resourcemanagergetresourcemanager) API to obtain a **ResourceManager** object. For details about how to reference context in the stage model, see [Context in the Stage Model](../../application-models/application-context-stage.md). @@ -78,7 +78,7 @@ Obtains the **ResourceManager** object of an application based on the specified | Name | Type | Mandatory | Description | | ---------- | ---------------------------------------- | ---- | ----------------------------- | -| bundleName | string | Yes | Bundle name of the target application. | +| bundleName | string | Yes | Bundle name of the application. | | callback | AsyncCallback<[ResourceManager](#resourcemanager)> | Yes | Callback used to return the result.| **Example** @@ -135,7 +135,7 @@ Obtains the **ResourceManager** object of an application based on the specified | Name | Type | Mandatory | Description | | ---------- | ------ | ---- | ------------- | -| bundleName | string | Yes | Bundle name of the target application.| +| bundleName | string | Yes | Bundle name of the application.| **Return value** @@ -171,12 +171,12 @@ Enumerates the device types. | Name | 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 @@ -278,7 +278,7 @@ Defines the capability of accessing application resources. > **NOTE** > -> - The methods involved in **ResourceManager** are applicable only to the TypeScript-based declarative development paradigm. +> - The APIs 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**. @@ -645,7 +645,7 @@ For details about the error codes, see [Resource Manager Error Codes](../errorco getMediaContent(resId: number, 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. +Obtains the content of the media file corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -1234,9 +1234,9 @@ For details about the error codes, see [Resource Manager Error Codes](../errorco ``` -### getPluralString9+ +### getPluralStringValue9+ -getPluralString(resource: Resource, num: number): Promise<string> +getPluralStringValue(resource: Resource, num: number): Promise<string> Obtains the singular-plural string corresponding to the specified resource object based on the specified number. This API uses a promise to return the result. @@ -1273,10 +1273,10 @@ For details about the error codes, see [Resource Manager Error Codes](../errorco id: $r('app.plural.test').id }; try { - this.context.resourceManager.getPluralString(resource, 1).then(value => { + this.context.resourceManager.getPluralStringValue(resource, 1).then(value => { let str = value; }).catch(error => { - console.log("getPluralString promise error is " + error); + console.log("getPluralStringValue promise error is " + error); }); } catch (error) { console.error(`callback getPluralStringValue failed, error code: ${error.code}, message: ${error.message}.`) @@ -1658,7 +1658,7 @@ Obtains the string corresponding to the specified resource name. This API uses a | Type | Description | | --------------------- | ---------- | -| Promise<string> | Promise used to return the result.| +| Promise<string> | String corresponding to the resource name.| For details about the error codes, see [Resource Manager Error Codes](../errorcodes/errorcode-resource-manager.md). @@ -1770,7 +1770,7 @@ For details about the error codes, see [Resource Manager Error Codes](../errorco 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. +Obtains the content of the media file corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.Global.ResourceManager @@ -2036,7 +2036,7 @@ Obtains the string corresponding to the specified resource ID. This API returns | Type | Description | | ------ | ----------- | -| string | String corresponding to the specified resource ID.| +| string | Promise used to return the result.| For details about the error codes, see [Resource Manager Error Codes](../errorcodes/errorcode-resource-manager.md). @@ -2070,7 +2070,7 @@ Obtains the string corresponding to the specified resource ID and formats the st | Name | Type | Mandatory | Description | | ----- | ------ | ---- | ----- | | resId | number | Yes | Resource ID.| -| args | Array | No | Arguments for formatting strings.
Supported arguments:
-%d, %f, %s, and %%
Note: %% is used to translate %.
Example: %%d is translated into the %d string.| +| args | Array | No | Arguments for formatting strings.
Supported arguments:
-%d, %f, %s, and %%
Note: **%%** is used to translate **%**.
Example: **%%d** is translated into the **%d** string.| **Return value** @@ -2116,7 +2116,7 @@ Obtains the string corresponding to the specified resource object. This API retu | Type | Description | | ------ | ---------------- | -| string | String corresponding to the resource object.| +| string | Promise used to return the result.| For details about the error codes, see [Resource Manager Error Codes](../errorcodes/errorcode-resource-manager.md). @@ -2155,7 +2155,7 @@ Obtains the string corresponding to the specified resource object and formats th | Name | Type | Mandatory | Description | | -------- | ---------------------- | ---- | ---- | | resource | [Resource](#resource9) | Yes | Resource object.| -| args | Array | No | Arguments for formatting strings.
Supported arguments:
-%d, %f, %s, and %%
Note: %% is used to translate %.
Example: %%d is translated into the %d string.| +| args | Array | No | Arguments for formatting strings.
Supported arguments:
-%d, %f, %s, and %%
Note: **%%** is used to translate **%**.
Example: **%%d** is translated into the **%d** string.| **Return value** @@ -2206,7 +2206,7 @@ Obtains the string corresponding to the specified resource name. This API return | Type | Description | | ------ | ---------- | -| string | String corresponding to the resource name.| +| string | String corresponding to the specified resource name.| For details about the error codes, see [Resource Manager Error Codes](../errorcodes/errorcode-resource-manager.md). @@ -2240,7 +2240,7 @@ Obtains the string corresponding to the specified resource name and formats the | Name | Type | Mandatory | Description | | ------- | ------ | ---- | ---- | | resName | string | Yes | Resource name.| -| args | Array | No | Arguments for formatting strings.
Supported arguments:
-%d, %f, %s, and %%
Note: %% is used to translate %.
Example: %%d is translated into the %d string.| +| args | Array | No | Arguments for formatting strings.
Supported arguments:
-%d, %f, %s, and %%
Note: **%%** is used to translate **%**.
Example: **%%d** is translated into the **%d** string.| **Return value** @@ -2406,8 +2406,8 @@ Obtains the integer or float value corresponding to the specified resource ID. T **Return value** | Type | Description | -| ------ | ---------- | -| number | Integer or float value corresponding to the specified resource ID.| +| ------ | ---------- | +| number | Integer or float value corresponding to the specified resource ID. Wherein, the integer value is the original value, and the float value is the actual pixel value.| For details about the error codes, see [Resource Manager Error Codes](../errorcodes/errorcode-resource-manager.md). @@ -2422,13 +2422,13 @@ For details about the error codes, see [Resource Manager Error Codes](../errorco **Example** ```ts try { - this.context.resourceManager.getNumber($r('app.integer.integer_test').id); + this.context.resourceManager.getNumber($r('app.integer.integer_test').id); // integer refers to the original value. } catch (error) { console.error(`getNumber failed, error code: ${error.code}, message: ${error.message}.`) } try { - this.context.resourceManager.getNumber($r('app.float.float_test').id); + this.context.resourceManager.getNumber($r('app.float.float_test').id); // float refers to the actual pixel value. } catch (error) { console.error(`getNumber failed, error code: ${error.code}, message: ${error.message}.`) } @@ -2452,7 +2452,7 @@ Obtains the integer or float value corresponding to the specified resource objec | Type | Description | | ------ | --------------- | -| number | Integer or float value corresponding to the specified resource object.| +| number | Integer or float value corresponding to the specified resource object. Wherein, the integer value is the original value, and the float value is the actual pixel value.| For details about the error codes, see [Resource Manager Error Codes](../errorcodes/errorcode-resource-manager.md). @@ -2472,7 +2472,7 @@ For details about the error codes, see [Resource Manager Error Codes](../errorco id: $r('app.integer.integer_test').id }; try { - this.context.resourceManager.getNumber(resource); + this.context.resourceManager.getNumber(resource);// integer refers to the original value; float refers to the actual pixel value. } catch (error) { console.error(`getNumber failed, error code: ${error.code}, message: ${error.message}.`) } @@ -2666,7 +2666,7 @@ getString(resId: number, callback: AsyncCallback<string>): void Obtains the string corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. -This API is deprecated since API version 9. You are advised to use [getStringValue](#getstringvalue9) instead. +This API is deprecated since API version 9. You are advised to use [getStringValue](#getstringvalue9). **System capability**: SystemCapability.Global.ResourceManager @@ -2697,7 +2697,7 @@ getString(resId: number): Promise<string> Obtains the string corresponding to the specified resource ID. This API uses a promise to return the result. -This API is deprecated since API version 9. You are advised to use [getStringValue](#getstringvalue9-1) instead. +This API is deprecated since API version 9. You are advised to use [getStringValue](#getstringvalue9-1). **System capability**: SystemCapability.Global.ResourceManager @@ -2731,7 +2731,7 @@ getStringArray(resId: number, callback: AsyncCallback<Array<string>> Obtains the string array corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. -This API is deprecated since API version 9. You are advised to use [getStringArrayValue](#getstringarrayvalue9) instead. +This API is deprecated since API version 9. You are advised to use [getStringArrayValue](#getstringarrayvalue9). **System capability**: SystemCapability.Global.ResourceManager @@ -2762,7 +2762,7 @@ getStringArray(resId: number): Promise<Array<string>> Obtains the string array corresponding to the specified resource ID. This API uses a promise to return the result. -This API is deprecated since API version 9. You are advised to use [getStringArrayValue](#getstringarrayvalue9-1) instead. +This API is deprecated since API version 9. You are advised to use [getStringArrayValue](#getstringarrayvalue9-1). **System capability**: SystemCapability.Global.ResourceManager @@ -2794,9 +2794,9 @@ This API is deprecated since API version 9. You are advised to use [getStringArr getMedia(resId: number, 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. +Obtains the content of the media file corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. -This API is deprecated since API version 9. You are advised to use [getMediaContent](#getmediacontent9) instead. +This API is deprecated since API version 9. You are advised to use [getMediaContent](#getmediacontent9). **System capability**: SystemCapability.Global.ResourceManager @@ -2827,7 +2827,7 @@ getMedia(resId: number): Promise<Uint8Array> Obtains the content of the media file corresponding to the specified resource ID. This API uses a promise to return the result. -This API is deprecated since API version 9. You are advised to use [getMediaContent](#getmediacontent9-1) instead. +This API is deprecated since API version 9. You are advised to use [getMediaContent](#getmediacontent9-1). **System capability**: SystemCapability.Global.ResourceManager @@ -2861,7 +2861,7 @@ getMediaBase64(resId: number, callback: AsyncCallback<string>): void Obtains the Base64 code of the image corresponding to the specified resource ID. This API uses an asynchronous callback to return the result. -This API is deprecated since API version 9. You are advised to use [getMediaContentBase64](#getmediacontentbase649) instead. +This API is deprecated since API version 9. You are advised to use [getMediaContentBase64](#getmediacontentbase649). **System capability**: SystemCapability.Global.ResourceManager @@ -2892,7 +2892,7 @@ getMediaBase64(resId: number): Promise<string> Obtains the Base64 code of the image corresponding to the specified resource ID. This API uses a promise to return the result. -This API is deprecated since API version 9. You are advised to use [getMediaContentBase64](#getmediacontentbase649-1) instead. +This API is deprecated since API version 9. You are advised to use [getMediaContentBase64](#getmediacontentbase649-1). **System capability**: SystemCapability.Global.ResourceManager @@ -2926,7 +2926,7 @@ getPluralString(resId: number, num: number): Promise<string> Obtains the singular-plural string corresponding to the specified resource ID based on the specified number. This API uses a promise to return the result. -This API is deprecated since API version 9. You are advised to use [getPluralStringValue](#getpluralstringvalue9) instead. +This API is deprecated since API version 9. You are advised to use [getPluralStringValue](#getpluralstringvalue9). **System capability**: SystemCapability.Global.ResourceManager @@ -2961,7 +2961,7 @@ getPluralString(resId: number, num: number, callback: AsyncCallback<string> Obtains the singular-plural string corresponding to the specified resource ID based on the specified number. This API uses an asynchronous callback to return the result. -This API is deprecated since API version 9. You are advised to use [getPluralStringValue](#getpluralstringvalue9-1) instead. +This API is deprecated since API version 9. You are advised to use [getPluralStringValue](#getpluralstringvalue9-1). **System capability**: SystemCapability.Global.ResourceManager @@ -2993,7 +2993,7 @@ getRawFile(path: string, callback: AsyncCallback<Uint8Array>): void Obtains the content of the raw file in the **resources/rawfile** directory. This API uses an asynchronous callback to return the result. -This API is deprecated since API version 9. You are advised to use [getRawFileContent](#getrawfilecontent9) instead. +This API is deprecated since API version 9. You are advised to use [getRawFileContent](#getrawfilecontent9). **System capability**: SystemCapability.Global.ResourceManager @@ -3024,7 +3024,7 @@ getRawFile(path: string): Promise<Uint8Array> Obtains the content of the raw file in the **resources/rawfile** directory. This API uses a promise to return the result. -This API is deprecated since API version 9. You are advised to use [getRawFileContent](#getrawfilecontent9-1) instead. +This API is deprecated since API version 9. You are advised to use [getRawFileContent](#getrawfilecontent9-1). **System capability**: SystemCapability.Global.ResourceManager @@ -3058,7 +3058,7 @@ getRawFileDescriptor(path: string, callback: AsyncCallback<RawFileDescriptor& Obtains the descriptor of the raw file in the **resources/rawfile** directory. This API uses an asynchronous callback to return the result. -This API is deprecated since API version 9. You are advised to use [getRawFd](#getrawfd9) instead. +This API is deprecated since API version 9. You are advised to use [getRawFd](#getrawfd9). **System capability**: SystemCapability.Global.ResourceManager @@ -3090,7 +3090,7 @@ getRawFileDescriptor(path: string): Promise<RawFileDescriptor> Obtains the descriptor of the raw file in the **resources/rawfile** directory. This API uses a promise to return the result. -This API is deprecated since API version 9. You are advised to use [getRawFd](#getrawfd9-1) instead. +This API is deprecated since API version 9. You are advised to use [getRawFd](#getrawfd9-1). **System capability**: SystemCapability.Global.ResourceManager diff --git a/en/application-dev/reference/apis/js-apis-uiappearance.md b/en/application-dev/reference/apis/js-apis-uiappearance.md index 3bac964627..ebbdc97184 100644 --- a/en/application-dev/reference/apis/js-apis-uiappearance.md +++ b/en/application-dev/reference/apis/js-apis-uiappearance.md @@ -1,4 +1,4 @@ -# UI Appearance +# @ohos.uiAppearance (UI Appearance) The **uiAppearance** module provides basic capabilities for managing the system appearance. It allows for color mode configuration currently, and will introduce more features over time. -- GitLab