{"id":"800f6846-3d8e-479a-96ec-cc38b47234c8","entityType":"agent","slug":"clawhub-baidu-maps-baidu-map-harmonyos-sdk","name":"Baidu Map Harmonyos SDK（百度地图官方鸿蒙 SKills）","canonicalUrl":"https://www.xpersona.co/agent/clawhub-baidu-maps-baidu-map-harmonyos-sdk","canonicalPath":"/agent/clawhub-baidu-maps-baidu-map-harmonyos-sdk","generatedAt":"2026-10-10T13:31:11.903Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T11:18:15.349Z","emptyReason":null},"description":"帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap... Skill: Baidu Map Harmonyos SDK（百度地图官方鸿蒙 SKills） Owner: baidu-maps Summary: 帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-06-01T03:54:22.909Z | user - 新增 references/api/ 下大量 API 文档（440 个文件），覆盖 SDK 的基础模块与主要能力。 - 移除旧版元信息及 skill 说明文件，全面切换为文档化 API 结构。 - SKILL.","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.5K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s178nge8tvzzhnan6cc08q0ech84dmtm:baidu-map-harmonyos-sdk","sourceUrl":"https://clawhub.ai/baidu-maps/baidu-map-harmonyos-sdk","homepage":"https://clawhub.ai/baidu-maps/skills/baidu-map-harmonyos-sdk","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/baidu-maps/baidu-map-harmonyos-sdk","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/baidu-maps/skills/baidu-map-harmonyos-sdk","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:18:15.349Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:18:15.349Z","emptyReason":null},"stars":null,"forks":null,"downloads":1470,"packageName":null,"latestVersion":"1.0.3","tractionLabel":"1.5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:18:15.347Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T11:18:15.349Z","lastCrawledAt":"2026-10-10T11:18:15.347Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T11:18:15.347Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.3","createdAt":"2026-06-01T03:54:22.909Z","changelog":"- 新增 references/api/ 下大量 API 文档（440 个文件），覆盖 SDK 的基础模块与主要能力。 - 移除旧版元信息及 skill 说明文件，全面切换为文档化 API 结构。 - SKILL.md 增补三段式 API 文档定位方式，指明 references/api/modules.md 作为模块索引。 - 能力指引表格补充 references/api/ 文档入口，方便开发时查阅完整类型定义与参数详情。 - 明确强调先查包内声明文件及正式 API 文档，减少因文档/API 变化导致的代码偏差。","fileCount":453,"zipByteSize":521591},{"version":"1.0.2","createdAt":"2026-04-07T04:07:26.451Z","changelog":"Baidu Map HarmonyOS SDK v1.0.2 - 新增 _meta.json 文件，提升对 HarmonyOS SDK 开发场景的能力聚合与管理。 - 其他内容保持不变。","fileCount":13,"zipByteSize":85605},{"version":"1.0.1","createdAt":"2026-03-11T11:15:48.212Z","changelog":"**1.0.1 版本简介：补充并强化依赖安装流程和开发规范，提升 SDK 接入与接口定位的一致性约束。** - 增加“依赖安装前置”强制要求：明确禁止依赖包未本地安装前编写或分析业务代码，需先声明依赖、成功安装再开展后续操作。 - 在开发流程和规范中，多处补充必须通过本地已安装 SDK 的声明文件（Index.d.ets 及其引用）确定导入路径、类型名称和 API。 - 明确依赖安装成功的校验流程与路径核查指引，避免接口/属性名推测及导入定位错误。 - 其它规范与包管理、资源、日志等要求保持一致。","fileCount":12,"zipByteSize":84277},{"version":"1.0.0","createdAt":"2026-03-11T09:43:12.677Z","changelog":"Initial release of Baidu Map HarmonyOS SDK Skill. - Provides comprehensive guidance for Baidu Map SDK development on HarmonyOS NEXT, supporting both independent packages and combined packages. - Enforces strict rules on logging, image resource usage, API usage, map & UI interaction, code modularization, and package management exclusivity. - Details required compatibility (system/IDE/SDK versions) and mandatory project permissions. - Includes step-by-step development flow, issue categorization, and common scenarios for map display, interactions, overlays, search, routing, navigation, and location. - Introduces mandatory auto-run/self-check procedures after code changes to ensure coding and build quality.","fileCount":12,"zipByteSize":83684}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s178nge8tvzzhnan6cc08q0ech84dmtm:baidu-map-harmonyos-sdk","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T13:31:11.898Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-baidu-maps-baidu-map-harmonyos-sdk/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T11:18:15.349Z","emptyReason":null},"readme":"Skill: Baidu Map Harmonyos SDK（百度地图官方鸿蒙 SKills）\n\nOwner: baidu-maps\n\nSummary: 帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap...\n\nTags: latest:1.0.3\n\nVersion history:\n\nv1.0.3 | 2026-06-01T03:54:22.909Z | user\n\n- 新增 references/api/ 下大量 API 文档（440 个文件），覆盖 SDK 的基础模块与主要能力。\n- 移除旧版元信息及 skill 说明文件，全面切换为文档化 API 结构。\n- SKILL.md 增补三段式 API 文档定位方式，指明 references/api/modules.md 作为模块索引。\n- 能力指引表格补充 references/api/ 文档入口，方便开发时查阅完整类型定义与参数详情。\n- 明确强调先查包内声明文件及正式 API 文档，减少因文档/API 变化导致的代码偏差。\n\nv1.0.2 | 2026-04-07T04:07:26.451Z | user\n\nBaidu Map HarmonyOS SDK v1.0.2\n\n- 新增 _meta.json 文件，提升对 HarmonyOS SDK 开发场景的能力聚合与管理。\n- 其他内容保持不变。\n\nv1.0.1 | 2026-03-11T11:15:48.212Z | user\n\n**1.0.1 版本简介：补充并强化依赖安装流程和开发规范，提升 SDK 接入与接口定位的一致性约束。**\n\n- 增加“依赖安装前置”强制要求：明确禁止依赖包未本地安装前编写或分析业务代码，需先声明依赖、成功安装再开展后续操作。\n- 在开发流程和规范中，多处补充必须通过本地已安装 SDK 的声明文件（Index.d.ets 及其引用）确定导入路径、类型名称和 API。\n- 明确依赖安装成功的校验流程与路径核查指引，避免接口/属性名推测及导入定位错误。\n- 其它规范与包管理、资源、日志等要求保持一致。\n\nv1.0.0 | 2026-03-11T09:43:12.677Z | user\n\nInitial release of Baidu Map HarmonyOS SDK Skill.\n\n- Provides comprehensive guidance for Baidu Map SDK development on HarmonyOS NEXT, supporting both independent packages and combined packages.\n- Enforces strict rules on logging, image resource usage, API usage, map & UI interaction, code modularization, and package management exclusivity.\n- Details required compatibility (system/IDE/SDK versions) and mandatory project permissions.\n- Includes step-by-step development flow, issue categorization, and common scenarios for map display, interactions, overlays, search, routing, navigation, and location.\n- Introduces mandatory auto-run/self-check procedures after code changes to ensure coding and build quality.\n\nArchive index:\n\nArchive v1.0.3: 453 files, 521591 bytes\n\nFiles: references/api/classes/base.AlgorithmUtil.md (1515b), references/api/classes/base.BMFileUtils.md (39437b), references/api/classes/base.BMLog.md (1540b), references/api/classes/base.BMStringUtils.md (11062b), references/api/classes/base.BMThreadUtils.md (3183b), references/api/classes/base.Bounds.md (4861b), references/api/classes/base.CoordTrans.md (2021b), references/api/classes/base.CoordUtil.md (2508b), references/api/classes/base.CoordUtilConcurrent.md (4136b), references/api/classes/base.DeviceInfo.md (3340b), references/api/classes/base.Initializer.md (2466b), references/api/classes/base.LatLng.md (1476b), references/api/classes/base.LatLngBounds.md (1838b), references/api/classes/base.MapEngineConfig.md (878b), references/api/classes/base.MapLanguageStorageManager.md (3121b), references/api/classes/base.PermissionCheck.md (3693b), references/api/classes/base.PermissionCheckResult.md (2012b), references/api/classes/base.Point.md (2766b), references/api/classes/base.StringBuilder.md (860b), references/api/classes/base.SysOSAPI.md (810b), references/api/classes/base.WeightedLatLng.md (2050b), references/api/classes/map.AlphaAnimation.md (8556b), references/api/classes/map.Animation.md (6724b), references/api/classes/map.AnimationSet.md (7994b), references/api/classes/map.Arc.md (16855b), references/api/classes/map.BaseGroupUI.md (9078b), references/api/classes/map.BaseMap.md (18111b), references/api/classes/map.BaseUI.md (6892b), references/api/classes/map.Bd_3DModel.md (21447b), references/api/classes/map.BmObject.md (1698b), references/api/classes/map.Building.md (27563b), references/api/classes/map.Circle.md (21709b), references/api/classes/map.ClusterGroup.md (15606b), references/api/classes/map.ClusterIcon.md (1138b), references/api/classes/map.ClusterTemplate.md (1016b), references/api/classes/map.ClusterText.md (1167b), references/api/classes/map.CompassLayer.md (3898b), references/api/classes/map.FavoriteManager.md (2088b), references/api/classes/map.FileTileProvider.md (1155b), references/api/classes/map.FrameLayout.md (9489b), references/api/classes/map.GeoBound.md (2286b), references/api/classes/map.GestureListener.md (1161b), references/api/classes/map.Gradient.md (1289b), references/api/classes/map.Ground.md (18461b), references/api/classes/map.HeatMap.md (8407b), references/api/classes/map.HeatMapAnimation.md (2119b), references/api/classes/map.HeatMapBuilder.md (8033b), references/api/classes/map.HexagonMap.md (1170b), references/api/classes/map.HexagonMapBuilder.md (5352b), references/api/classes/map.HorizontalLayout.md (9664b), references/api/classes/map.ImageEntity.md (4394b), references/api/classes/map.ImageTileLayer.md (7026b), references/api/classes/map.ImageUI.md (9208b), references/api/classes/map.ItsClickObj.md (885b), references/api/classes/map.Label.md (37987b), references/api/classes/map.LabelUI.md (9526b), references/api/classes/map.LineStyle.md (2945b), references/api/classes/map.LocalMapConstants.md (9207b), references/api/classes/map.LocalMapManager.md (6794b), references/api/classes/map.LocalMapResource.md (6049b), references/api/classes/map.LocalMapResourceUtils.md (8165b), references/api/classes/map.LocationLayer.md (7263b), references/api/classes/map.MapClickObj.md (5281b), references/api/classes/map.MapComInit.md (943b), references/api/classes/map.MapController.md (40389b), references/api/classes/map.MapControllerManager.md (2333b), references/api/classes/map.MapOptions.md (9037b), references/api/classes/map.MapParams.md (1261b), references/api/classes/map.MapStatus.md (11512b), references/api/classes/map.MapUIOperateModel.md (2391b), references/api/classes/map.MapUIStyleLogoModel.md (7022b), references/api/classes/map.MapUIStyleModel.md (3454b), references/api/classes/map.Marker.md (36568b), references/api/classes/map.MultiPoint.md (17204b), references/api/classes/map.MultiPointItem.md (1179b), references/api/classes/map.Overlay.md (10639b), references/api/classes/map.OverlayLayer.md (5268b), references/api/classes/map.ParticleOptions.md (1355b), references/api/classes/map.Polygon.md (21038b), references/api/classes/map.Polyline.md (40314b) (+53 more)\n\nFile v1.0.3:references/api/classes/base.AlgorithmUtil.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / AlgorithmUtil\n\n# Class: AlgorithmUtil\n\n[base](../modules/base.md).AlgorithmUtil\n\n算法工具类\n\n## Table of contents\n\n### Methods\n\n- [aesDecryptAsync](base.AlgorithmUtil.md#aesdecryptasync)\n- [aesDecryptCRT](base.AlgorithmUtil.md#aesdecryptcrt)\n- [hexStringConvertBytes](base.AlgorithmUtil.md#hexstringconvertbytes)\n- [uint8ArrayToString](base.AlgorithmUtil.md#uint8arraytostring)\n\n## Methods\n\n### aesDecryptAsync\n\n▸ **aesDecryptAsync**(`geom`, `aesSaltKey`, `aesVitKey`): `Promise`\\<`string`\\>\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `geom` | `string` |\n| `aesSaltKey` | `string` |\n| `aesVitKey` | `string` |\n\n#### Returns\n\n`Promise`\\<`string`\\>\n\n___\n\n### aesDecryptCRT\n\n▸ **aesDecryptCRT**(`geom`, `aesSaltKey`, `aesVitKey`, `callback`): `Promise`\\<`void`\\>\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `geom` | `string` |\n| `aesSaltKey` | `string` |\n| `aesVitKey` | `string` |\n| `callback` | (`result`: `string`) => `void` |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### hexStringConvertBytes\n\n▸ **hexStringConvertBytes**(`data`): `Uint8Array`\n\n转16进制\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `data` | `string` | 密文 |\n\n#### Returns\n\n`Uint8Array`\n\n___\n\n### uint8ArrayToString\n\n▸ **uint8ArrayToString**(`array`): `string`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `array` | `Uint8Array` |\n\n#### Returns\n\n`string`\n\nFile v1.0.3:references/api/classes/base.BMFileUtils.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMFileUtils\n\n# Class: BMFileUtils\n\n[base](../modules/base.md).BMFileUtils\n\n文件操作相关工具类\n\n## Table of contents\n\n### Properties\n\n- [separator](base.BMFileUtils.md#separator)\n\n### Methods\n\n- [getFilesDirPath](base.BMFileUtils.md#getfilesdirpath)\n- [getCacheDirPath](base.BMFileUtils.md#getcachedirpath)\n- [getTempDirPath](base.BMFileUtils.md#gettempdirpath)\n- [hasDirPath](base.BMFileUtils.md#hasdirpath)\n- [getFileUri](base.BMFileUtils.md#getfileuri)\n- [getFileName](base.BMFileUtils.md#getfilename)\n- [getFilePath](base.BMFileUtils.md#getfilepath)\n- [getParentUri](base.BMFileUtils.md#getparenturi)\n- [getParentPath](base.BMFileUtils.md#getparentpath)\n- [getUriFromPath](base.BMFileUtils.md#geturifrompath)\n- [getFileExtention](base.BMFileUtils.md#getfileextention)\n- [getFileDirSize](base.BMFileUtils.md#getfiledirsize)\n- [isFile](base.BMFileUtils.md#isfile)\n- [isDirectory](base.BMFileUtils.md#isdirectory)\n- [rename](base.BMFileUtils.md#rename)\n- [renameSync](base.BMFileUtils.md#renamesync)\n- [mkdir](base.BMFileUtils.md#mkdir)\n- [mkdirSync](base.BMFileUtils.md#mkdirsync)\n- [rmdir](base.BMFileUtils.md#rmdir)\n- [rmdirSync](base.BMFileUtils.md#rmdirsync)\n- [unlink](base.BMFileUtils.md#unlink)\n- [unlinkSync](base.BMFileUtils.md#unlinksync)\n- [access](base.BMFileUtils.md#access)\n- [accessSync](base.BMFileUtils.md#accesssync)\n- [open](base.BMFileUtils.md#open)\n- [openSync](base.BMFileUtils.md#opensync)\n- [read](base.BMFileUtils.md#read)\n- [readSync](base.BMFileUtils.md#readsync)\n- [readText](base.BMFileUtils.md#readtext)\n- [readTextSync](base.BMFileUtils.md#readtextsync)\n- [write](base.BMFileUtils.md#write)\n- [writeSync](base.BMFileUtils.md#writesync)\n- [writeEasy](base.BMFileUtils.md#writeeasy)\n- [close](base.BMFileUtils.md#close)\n- [closeSync](base.BMFileUtils.md#closesync)\n- [listFile](base.BMFileUtils.md#listfile)\n- [listFileSync](base.BMFileUtils.md#listfilesync)\n- [stat](base.BMFileUtils.md#stat)\n- [statSync](base.BMFileUtils.md#statsync)\n- [copy](base.BMFileUtils.md#copy)\n- [copyFile](base.BMFileUtils.md#copyfile)\n- [copyFileSync](base.BMFileUtils.md#copyfilesync)\n- [copyDir](base.BMFileUtils.md#copydir)\n- [copyDirSync](base.BMFileUtils.md#copydirsync)\n- [moveFile](base.BMFileUtils.md#movefile)\n- [moveFileSync](base.BMFileUtils.md#movefilesync)\n- [moveDir](base.BMFileUtils.md#movedir)\n- [moveDirSync](base.BMFileUtils.md#movedirsync)\n- [truncate](base.BMFileUtils.md#truncate)\n- [truncateSync](base.BMFileUtils.md#truncatesync)\n- [lstat](base.BMFileUtils.md#lstat)\n- [lstatSync](base.BMFileUtils.md#lstatsync)\n- [fsync](base.BMFileUtils.md#fsync)\n- [fsyncSync](base.BMFileUtils.md#fsyncsync)\n- [fdatasync](base.BMFileUtils.md#fdatasync)\n- [fdatasyncSync](base.BMFileUtils.md#fdatasyncsync)\n- [createStream](base.BMFileUtils.md#createstream)\n- [createStreamSync](base.BMFileUtils.md#createstreamsync)\n- [fdopenStream](base.BMFileUtils.md#fdopenstream)\n- [fdopenStreamSync](base.BMFileUtils.md#fdopenstreamsync)\n- [mkdtemp](base.BMFileUtils.md#mkdtemp)\n- [mkdtempSync](base.BMFileUtils.md#mkdtempsync)\n- [dup](base.BMFileUtils.md#dup)\n- [utimes](base.BMFileUtils.md#utimes)\n- [getFormatFileSize](base.BMFileUtils.md#getformatfilesize)\n- [getRawFileContentSync](base.BMFileUtils.md#getrawfilecontentsync)\n- [getRawFileContent](base.BMFileUtils.md#getrawfilecontent)\n- [getRawFileContentStrSync](base.BMFileUtils.md#getrawfilecontentstrsync)\n- [getRawFileContentStr](base.BMFileUtils.md#getrawfilecontentstr)\n- [saveImage](base.BMFileUtils.md#saveimage)\n\n## Properties\n\n### separator\n\n▪ `Static` `Readonly` **separator**: `string` = `'/'`\n\n## Methods\n\n### getFilesDirPath\n\n▸ **getFilesDirPath**(`dirPath?`, `fileName?`, `blHap?`): `string`\n\n获取文件目录下的文件夹路径或文件路径。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `dirPath` | `string` | `\"\"` | 文件路径；支持完整路径和相对路径（download/wps/doc）；dirPath传空字符串表示根目录 |\n| `fileName` | `string` | `\"\"` | 文件名（test.text）；fileName传空字符串表示文件夹路径 |\n| `blHap` | `boolean` | `true` | true：HAP级别文件路径、 false：App级别文件路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getCacheDirPath\n\n▸ **getCacheDirPath**(`dirPath?`, `fileName?`, `blHap?`): `string`\n\n获取缓存目录下的文件夹路径或文件路径。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `dirPath` | `string` | `\"\"` | 文件路径；支持完整路径和相对路径（download/wps/doc）；dirPath传空字符串表示根目录 |\n| `fileName` | `string` | `\"\"` | 文件名（test.text）；fileName传空字符串表示文件夹路径 |\n| `blHap` | `boolean` | `true` | true：HAP级别文件路径、 false：App级别文件路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getTempDirPath\n\n▸ **getTempDirPath**(`dirPath?`, `fileName?`, `blHap?`): `string`\n\n获取临时目录下的文件夹路径或文件路径。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `dirPath` | `string` | `\"\"` | 文件路径；支持完整路径和相对路径（download/wps/doc）；dirPath传空字符串表示根目录 |\n| `fileName` | `string` | `\"\"` | 文件名（test.text）；fileName传空字符串表示文件夹路径 |\n| `blHap` | `boolean` | `true` | true：HAP级别文件路径、 false：App级别文件路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### hasDirPath\n\n▸ **hasDirPath**(`path`): `boolean`\n\n判断是否是完整路径\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 文件路径 |\n\n#### Returns\n\n`boolean`\n\n___\n\n### getFileUri\n\n▸ **getFileUri**(`uriOrPath`): `FileUri`\n\n通过URI或路径，获取FileUri\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `uriOrPath` | `string` | URI或路径 |\n\n#### Returns\n\n`FileUri`\n\n___\n\n### getFileName\n\n▸ **getFileName**(`uriOrPath`): `string`\n\n通过URI或路径，获取文件名。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `uriOrPath` | `string` | URI或路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getFilePath\n\n▸ **getFilePath**(`uriOrPath`): `string`\n\n通过URI或路径，获取文件路径\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `uriOrPath` | `string` | URI或路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getParentUri\n\n▸ **getParentUri**(`uriOrPath`): `string`\n\n通过URI或路径，获取对应文件父目录的URI。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `uriOrPath` | `string` | URI或路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getParentPath\n\n▸ **getParentPath**(`uriOrPath`): `string`\n\n通过URI或路径，获取对应文件父目录的路径名。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `uriOrPath` | `string` | URI或路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getUriFromPath\n\n▸ **getUriFromPath**(`path`): `string`\n\n以同步方法获取文件URI。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 应用沙箱路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getFileExtention\n\n▸ **getFileExtention**(`fileName`): `string`\n\n根据文件名获取文件后缀\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fileName` | `string` | 例如: test.txt test.doc |\n\n#### Returns\n\n`string`\n\n___\n\n### getFileDirSize\n\n▸ **getFileDirSize**(`path`): `number`\n\n获取指定文件夹下所有文件的大小或指定文件大小。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 文件夹路径 或 文件路径 |\n\n#### Returns\n\n`number`\n\n___\n\n### isFile\n\n▸ **isFile**(`file`): `boolean`\n\n判断文件是否是普通文件。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `file` | `string` \\| `number` | string\\|number 文件应用沙箱路径path或已打开的文件描述符fd。 |\n\n#### Returns\n\n`boolean`\n\n___\n\n### isDirectory\n\n▸ **isDirectory**(`file`): `boolean`\n\n判断文件是否是目录。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `file` | `string` \\| `number` | string\\|number 文件应用沙箱路径path或已打开的文件描述符fd。 |\n\n#### Returns\n\n`boolean`\n\n___\n\n### rename\n\n▸ **rename**(`oldPath`, `newPath`): `Promise`\\<`void`\\>\n\n重命名文件或文件夹，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `oldPath` | `string` | string 文件的应用沙箱原路径。 |\n| `newPath` | `string` | string 文件的应用沙箱新路径。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### renameSync\n\n▸ **renameSync**(`oldPath`, `newPath`): `void`\n\n重命名文件或文件夹，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `oldPath` | `string` | string 文件的应用沙箱原路径。 |\n| `newPath` | `string` | string 文件的应用沙箱新路径。 |\n\n#### Returns\n\n`void`\n\n___\n\n### mkdir\n\n▸ **mkdir**(`path`, `recursion?`): `Promise`\\<`void`\\>\n\n创建目录，当recursion指定为true，可多层级创建目录，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `path` | `string` | `undefined` | 目录的应用沙箱路径。 |\n| `recursion` | `boolean` | `true` | 是否多层级创建目录。recursion指定为true时，可多层级创建目录。recursion指定为false时，仅可创建单层目录。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### mkdirSync\n\n▸ **mkdirSync**(`path`, `recursion?`): `void`\n\n创建目录以同步方法，当recursion指定为true，可多层级创建目录。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `path` | `string` | `undefined` | 目录的应用沙箱路径。 |\n| `recursion` | `boolean` | `true` | 是否多层级创建目录。recursion指定为true时，可多层级创建目录。recursion指定为false时，仅可创建单层目录。 |\n\n#### Returns\n\n`void`\n\n___\n\n### rmdir\n\n▸ **rmdir**(`path`): `Promise`\\<`void`\\>\n\n删除整个目录，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 目录的应用沙箱路径。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### rmdirSync\n\n▸ **rmdirSync**(`path`): `any`\n\n删除整个目录，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 目录的应用沙箱路径。 |\n\n#### Returns\n\n`any`\n\n___\n\n### unlink\n\n▸ **unlink**(`path`): `Promise`\\<`void`\\>\n\n删除单个文件，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 文件的应用沙箱路径。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### unlinkSync\n\n▸ **unlinkSync**(`path`): `void`\n\n删除单个文件，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 文件的应用沙箱路径。 |\n\n#### Returns\n\n`void`\n\n___\n\n### access\n\n▸ **access**(`path`): `Promise`\\<`boolean`\\>\n\n检查文件是否存在，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 文件应用沙箱路径。 |\n\n#### Returns\n\n`Promise`\\<`boolean`\\>\n\n___\n\n### accessSync\n\n▸ **accessSync**(`path`): `boolean`\n\n检查文件是否存在，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | 文件应用沙箱路径。 |\n\n#### Returns\n\n`boolean`\n\n___\n\n### open\n\n▸ **open**(`path`, `mode?`): `Promise`\\<`File`\\>\n\n打开文件，支持使用URI打开文件。使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | string 文件的应用沙箱路径或URI。 |\n| `mode` | `number` | number 打开文件的选项，必须指定如下选项中的一个，默认以只读方式打开。 |\n\n#### Returns\n\n`Promise`\\<`File`\\>\n\n___\n\n### openSync\n\n▸ **openSync**(`path`, `mode?`): `File`\n\n打开文件，支持使用URI打开文件。以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | string 文件的应用沙箱路径或URI。 |\n| `mode` | `number` | number 打开文件的选项，必须指定如下选项中的一个，默认以只读方式打开。 |\n\n#### Returns\n\n`File`\n\n___\n\n### read\n\n▸ **read**(`fd`, `buffer`, `options?`): `Promise`\\<`number`\\>\n\n从文件读取数据，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n| `buffer` | `ArrayBuffer` | ArrayBuffer 用于保存读取到的文件数据的缓冲区。 |\n| `options?` | `any` | 支持如下选项： offset，number类型，表示期望读取文件的位置。可选，默认从当前位置开始读。 length，number类型，表示期望读取数据的长度。可选，默认缓冲区长度。 |\n\n#### Returns\n\n`Promise`\\<`number`\\>\n\n___\n\n### readSync\n\n▸ **readSync**(`fd`, `buffer`, `options?`): `number`\n\n从文件读取数据，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n| `buffer` | `ArrayBuffer` | ArrayBuffer 用于保存读取到的文件数据的缓冲区。 |\n| `options?` | `any` | 支持如下选项： offset，number类型，表示期望读取文件的位置。可选，默认从当前位置开始读。 length，number类型，表示期望读取数据的长度。可选，默认缓冲区长度。 |\n\n#### Returns\n\n`number`\n\n___\n\n### readText\n\n▸ **readText**(`filePath`, `options?`): `Promise`\\<`string`\\>\n\n基于文本方式读取文件（即直接读取文件的文本内容），使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `filePath` | `string` | 文件的应用沙箱路径。 |\n| `options?` | `any` | 支持如下选项： offset，number类型，表示期望读取文件的位置。可选，默认从当前位置开始读取。 length，number类型，表示期望读取数据的长度。可选，默认文件长度。 encoding，string类型，当数据是 string 类型时有效，表示数据的编码方式，默认 'utf-8'，仅支持 'utf-8'。 |\n\n#### Returns\n\n`Promise`\\<`string`\\>\n\n___\n\n### readTextSync\n\n▸ **readTextSync**(`filePath`, `options?`): `string`\n\n基于文本方式读取文件（即直接读取文件的文本内容），以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `filePath` | `string` | 文件的应用沙箱路径。 |\n| `options?` | `any` | 支持如下选项： offset，number类型，表示期望读取文件的位置。可选，默认从当前位置开始读取。 length，number类型，表示期望读取数据的长度。可选，默认文件长度。 encoding，string类型，当数据是 string 类型时有效，表示数据的编码方式，默认 'utf-8'，仅支持 'utf-8'。 |\n\n#### Returns\n\n`string`\n\n___\n\n### write\n\n▸ **write**(`fd`, `buffer`, `options?`): `Promise`\\<`number`\\>\n\n将数据写入文件，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n| `buffer` | `string` \\| `ArrayBuffer` | ArrayBuffer\\|string 待写入文件的数据，可来自缓冲区或字符串。 |\n| `options?` | `any` | 支持如下选项： offset，number类型，表示期望写入文件的位置。可选，默认从当前位置开始写。 length，number类型，表示期望写入数据的长度。可选，默认缓冲区长度。 encoding，string类型，当数据是string类型时有效，表示数据的编码方式，默认 'utf-8'。当前仅支持 'utf-8'。 |\n\n#### Returns\n\n`Promise`\\<`number`\\>\n\n___\n\n### writeSync\n\n▸ **writeSync**(`fd`, `buffer`, `options?`): `number`\n\n将数据写入文件，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n| `buffer` | `string` \\| `ArrayBuffer` | ArrayBuffer\\|string 待写入文件的数据，可来自缓冲区或字符串。 |\n| `options?` | `any` | 支持如下选项： offset，number类型，表示期望写入文件的位置。可选，默认从当前位置开始写。 length，number类型，表示期望写入数据的长度。可选，默认缓冲区长度。 encoding，string类型，当数据是string类型时有效，表示数据的编码方式，默认 'utf-8'。当前仅支持 'utf-8'。 |\n\n#### Returns\n\n`number`\n\n___\n\n### writeEasy\n\n▸ **writeEasy**(`path`, `buffer`, `append?`): `Promise`\\<`number`\\>\n\n将数据写入文件，并关闭文件。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `path` | `string` | `undefined` | string 文件的应用沙箱路径或URI。 |\n| `buffer` | `string` \\| `ArrayBuffer` | `undefined` | ArrayBuffer\\|string 待写入文件的数据，可来自缓冲区或字符串。 |\n| `append` | `boolean` | `true` | 是否追加，true-追加，false-不追加（直接覆盖） |\n\n#### Returns\n\n`Promise`\\<`number`\\>\n\n___\n\n### close\n\n▸ **close**(`file`): `Promise`\\<`void`\\>\n\n关闭文件，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `file` | `any` | 已打开的File对象或已打开的文件描述符fd。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### closeSync\n\n▸ **closeSync**(`file`): `void`\n\n关闭文件，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `file` | `any` | 已打开的File对象或已打开的文件描述符fd。 |\n\n#### Returns\n\n`void`\n\n___\n\n### listFile\n\n▸ **listFile**(`path`, `options?`): `Promise`\\<`string`[]\\>\n\n列出文件夹下所有文件名，支持递归列出所有文件名（包含子目录下），支持文件过滤，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | string 文件夹的应用沙箱路径。 |\n| `options?` | `any` | 文件过滤选项。默认不进行过滤。 recursion boolean 是否递归子目录下文件名，默认为false。 listNum number 列出文件名数量。当设置0时，列出所有文件，默认为0。 filter Filter 文件过滤选项。当前仅支持后缀名匹配、文件名模糊查询、文件大小过滤、最近修改时间过滤。 |\n\n#### Returns\n\n`Promise`\\<`string`[]\\>\n\n___\n\n### listFileSync\n\n▸ **listFileSync**(`path`, `options?`): `string`[]\n\n列出文件夹下所有文件名，支持递归列出所有文件名（包含子目录下），支持文件过滤，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | string 文件夹的应用沙箱路径。 |\n| `options?` | `any` | 文件过滤选项。默认不进行过滤。 recursion boolean 是否递归子目录下文件名，默认为false。 listNum number 列出文件名数量。当设置0时，列出所有文件，默认为0。 filter Filter 文件过滤选项。当前仅支持后缀名匹配、文件名模糊查询、文件大小过滤、最近修改时间过滤。 |\n\n#### Returns\n\n`string`[]\n\n___\n\n### stat\n\n▸ **stat**(`file`): `Promise`\\<`Stat`\\>\n\n获取文件详细属性信息，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `file` | `string` \\| `number` | string\\|number 文件应用沙箱路径path或已打开的文件描述符fd。 |\n\n#### Returns\n\n`Promise`\\<`Stat`\\>\n\n___\n\n### statSync\n\n▸ **statSync**(`file`): `Stat`\n\n获取文件详细属性信息，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `file` | `string` \\| `number` | string\\|number 文件应用沙箱路径path或已打开的文件描述符fd。 |\n\n#### Returns\n\n`Stat`\n\n___\n\n### copy\n\n▸ **copy**(`srcUri`, `destUri`, `options?`): `Promise`\\<`void`\\>\n\n拷贝文件或者目录，支持拷贝进度监听，使用Promise异步返回。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `srcUri` | `string` | 待复制文件或目录的uri。 |\n| `destUri` | `string` | 目标文件或目录的uri。 |\n| `options?` | `any` | options中提供拷贝进度回调： ProgressListener 拷贝进度监听。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### copyFile\n\n▸ **copyFile**(`src`, `dest`, `mode?`): `Promise`\\<`void`\\>\n\n复制文件，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` \\| `number` | `undefined` | string\\|number 待复制文件的路径或待复制文件的文件描述符。 |\n| `dest` | `string` \\| `number` | `undefined` | string\\|number 目标文件路径或目标文件的文件描述符。 |\n| `mode` | `number` | `0` | number 提供覆盖文件的选项，当前仅支持0，且默认为0。0：完全覆盖目标文件。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### copyFileSync\n\n▸ **copyFileSync**(`src`, `dest`, `mode?`): `void`\n\n以同步方法复制文件。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` \\| `number` | `undefined` | string\\|number 待复制文件的路径或待复制文件的文件描述符。 |\n| `dest` | `string` \\| `number` | `undefined` | string\\|number 目标文件路径或目标文件的文件描述符。 |\n| `mode` | `number` | `0` | number 提供覆盖文件的选项，当前仅支持0，且默认为0。0：完全覆盖目标文件。 |\n\n#### Returns\n\n`void`\n\n___\n\n### copyDir\n\n▸ **copyDir**(`src`, `dest`, `mode?`): `Promise`\\<`void`\\>\n\n复制源文件夹至目标路径下，只能复制沙箱里的文件夹，使用Promise异步返回。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` | `undefined` | 源文件夹的应用沙箱路径。 |\n| `dest` | `string` | `undefined` | 目标文件夹的应用沙箱路径。 |\n| `mode` | `number` | `1` | 复制模式: mode为0，文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下，目标文件夹下未冲突文件将继续保留，且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。 mode为1，文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则强制覆盖冲突文件夹下所有同名文件，未冲突文件将继续保留。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### copyDirSync\n\n▸ **copyDirSync**(`src`, `dest`, `mode?`): `void`\n\n以同步方法复制源文件夹至目标路径下，只能复制沙箱里的文件夹。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` | `undefined` | 源文件夹的应用沙箱路径。 |\n| `dest` | `string` | `undefined` | 目标文件夹的应用沙箱路径。 |\n| `mode` | `number` | `1` | 复制模式: mode为0，文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下，目标文件夹下未冲突文件将继续保留，且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。 mode为1，文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则强制覆盖冲突文件夹下所有同名文件，未冲突文件将继续保留。 |\n\n#### Returns\n\n`void`\n\n___\n\n### moveFile\n\n▸ **moveFile**(`src`, `dest`, `mode?`): `Promise`\\<`void`\\>\n\n移动文件，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` | `undefined` | string 源文件的应用沙箱路径。 |\n| `dest` | `string` | `undefined` | string 目的文件的应用沙箱路径。 |\n| `mode` | `number` | `0` | number 移动模式。若mode为0，移动位置存在同名文件时，强制移动覆盖。若mode为1，移动位置存在同名文件时，抛出异常。默认为0。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### moveFileSync\n\n▸ **moveFileSync**(`src`, `dest`, `mode?`): `void`\n\n移动文件，以同步方法。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` | `undefined` | string 源文件的应用沙箱路径。 |\n| `dest` | `string` | `undefined` | string 目的文件的应用沙箱路径。 |\n| `mode` | `number` | `0` | number 移动模式。若mode为0，移动位置存在同名文件时，强制移动覆盖。若mode为1，移动位置存在同名文件时，抛出异常。默认为0。 |\n\n#### Returns\n\n`void`\n\n___\n\n### moveDir\n\n▸ **moveDir**(`src`, `dest`, `mode?`): `Promise`\\<`void`\\>\n\n移动源文件夹至目标路径下，使用Promise异步返回。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` | `undefined` | 源文件夹的应用沙箱路径 |\n| `dest` | `string` | `undefined` | 目标文件夹的应用沙箱路径 |\n| `mode` | `number` | `3` | 移动模式: mode为0，文件夹级别抛异常。若目标文件夹下存在与源文件夹名冲突的非空文件夹，则抛出异常。 mode为1，文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下，目标文件夹下未冲突文件将继续保留，且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。 mode为2，文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则强制覆盖冲突文件夹下所有同名文件，未冲突文件将继续保留。 mode为3，文件夹级别强制覆盖。移动源文件夹至目标文件夹下，目标文件夹下移动的文件夹内容与源文件夹完全一致。若目标文件夹下存在与源文件夹名冲突的文件夹，该文件夹下所有原始文件将不会保留。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### moveDirSync\n\n▸ **moveDirSync**(`src`, `dest`, `mode?`): `any`\n\n以同步方法移动源文件夹至目标路径下。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` | `undefined` | 源文件夹的应用沙箱路径 |\n| `dest` | `string` | `undefined` | 目标文件夹的应用沙箱路径 |\n| `mode` | `number` | `3` | 移动模式: mode为0，文件夹级别抛异常。若目标文件夹下存在与源文件夹名冲突的非空文件夹，则抛出异常。 mode为1，文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下，目标文件夹下未冲突文件将继续保留，且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。 mode为2，文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹，若冲突文件夹下存在同名文件，则强制覆盖冲突文件夹下所有同名文件，未冲突文件将继续保留。 mode为3，文件夹级别强制覆盖。移动源文件夹至目标文件夹下，目标文件夹下移动的文件夹内容与源文件夹完全一致。若目标文件夹下存在与源文件夹名冲突的文件夹，该文件夹下所有原始文件将不会保留。 |\n\n#### Returns\n\n`any`\n\n___\n\n### truncate\n\n▸ **truncate**(`file`, `len?`): `Promise`\\<`void`\\>\n\n截断文件，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `file` | `string` \\| `number` | `undefined` | string\\|number 文件的应用沙箱路径或已打开的文件描述符fd。 |\n| `len` | `number` | `0` | number 文件截断后的长度，以字节为单位。默认为0。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### truncateSync\n\n▸ **truncateSync**(`file`, `len?`): `void`\n\n截断文件，以同步方法。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `file` | `string` \\| `number` | `undefined` | string\\|number 文件的应用沙箱路径或已打开的文件描述符fd。 |\n| `len` | `number` | `0` | number 文件截断后的长度，以字节为单位。默认为0。 |\n\n#### Returns\n\n`void`\n\n___\n\n### lstat\n\n▸ **lstat**(`path`): `Promise`\\<`Stat`\\>\n\n获取链接文件信息，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | string 文件的应用沙箱路径。 |\n\n#### Returns\n\n`Promise`\\<`Stat`\\>\n\n___\n\n### lstatSync\n\n▸ **lstatSync**(`path`): `Stat`\n\n获取链接文件信息，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | string 文件的应用沙箱路径。 |\n\n#### Returns\n\n`Stat`\n\n___\n\n### fsync\n\n▸ **fsync**(`fd`): `Promise`\\<`void`\\>\n\n同步文件数据，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### fsyncSync\n\n▸ **fsyncSync**(`fd`): `void`\n\n同步文件数据，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n\n#### Returns\n\n`void`\n\n___\n\n### fdatasync\n\n▸ **fdatasync**(`fd`): `Promise`\\<`void`\\>\n\n实现文件内容数据同步，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### fdatasyncSync\n\n▸ **fdatasyncSync**(`fd`): `void`\n\n实现文件内容数据同步，以同步方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | number 已打开的文件描述符。 |\n\n#### Returns\n\n`void`\n\n___\n\n### createStream\n\n▸ **createStream**(`path`, `mode?`): `Promise`\\<`Stream`\\>\n\n基于文件路径打开文件流，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `path` | `string` | `undefined` | string 文件的应用沙箱路径。 |\n| `mode` | `string` | `'r'` | string 文件打开类型 r：打开只读文件，该文件必须存在。 r+：打开可读写的文件，该文件必须存在。 w：打开只写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 w+：打开可读写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 a：以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。 a+：以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。 |\n\n#### Returns\n\n`Promise`\\<`Stream`\\>\n\n___\n\n### createStreamSync\n\n▸ **createStreamSync**(`path`, `mode?`): `Stream`\n\n基于文件路径打开文件流，以同步方法。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `path` | `string` | `undefined` | string 文件的应用沙箱路径。 |\n| `mode` | `string` | `'r'` | string 文件打开类型 r：打开只读文件，该文件必须存在。 r+：打开可读写的文件，该文件必须存在。 w：打开只写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 w+：打开可读写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 a：以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。 a+：以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。 |\n\n#### Returns\n\n`Stream`\n\n___\n\n### fdopenStream\n\n▸ **fdopenStream**(`fd`, `mode?`): `Promise`\\<`Stream`\\>\n\n基于文件描述符打开文件流，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `fd` | `number` | `undefined` | number 已打开的文件描述符。 |\n| `mode` | `string` | `'r'` | string 文件打开类型 r：打开只读文件，该文件必须存在。 r+：打开可读写的文件，该文件必须存在。 w：打开只写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 w+：打开可读写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 a：以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。 a+：以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。 |\n\n#### Returns\n\n`Promise`\\<`Stream`\\>\n\n___\n\n### fdopenStreamSync\n\n▸ **fdopenStreamSync**(`fd`, `mode?`): `Stream`\n\n基于文件描述符打开文件流，以同步方法。\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `fd` | `number` | `undefined` | number 已打开的文件描述符。 |\n| `mode` | `string` | `'r'` | string 文件打开类型 r：打开只读文件，该文件必须存在。 r+：打开可读写的文件，该文件必须存在。 w：打开只写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 w+：打开可读写文件，若文件存在则文件长度清0，即该文件内容会消失。若文件不存在则建立该文件。 a：以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。 a+：以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。 |\n\n#### Returns\n\n`Stream`\n\n___\n\n### mkdtemp\n\n▸ **mkdtemp**(`prefix`): `Promise`\\<`string`\\>\n\n创建临时目录，使用Promise异步回调。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `prefix` | `string` | string 用随机产生的字符串替换以“XXXXXX”结尾目录路径。 |\n\n#### Returns\n\n`Promise`\\<`string`\\>\n\n___\n\n### mkdtempSync\n\n▸ **mkdtempSync**(`prefix`): `string`\n\n创建临时目录，以同步的方法。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `prefix` | `string` | string 用随机产生的字符串替换以“XXXXXX”结尾目录路径。 |\n\n#### Returns\n\n`string`\n\n___\n\n### dup\n\n▸ **dup**(`fd`): `File`\n\n将文件描述符转化为File。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `fd` | `number` | 文件描述符。 |\n\n#### Returns\n\n`File`\n\n___\n\n### utimes\n\n▸ **utimes**(`path`, `mtime`): `void`\n\n修改文件最近访问时间属性。\npath 文件的应用沙箱路径。\nmtime 待更新的时间戳。自1970年1月1日起至目标时间的毫秒数。仅支持修改文件最近访问时间属性。\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `path` | `string` |\n| `mtime` | `number` |\n\n#### Returns\n\n`void`\n\n___\n\n### getFormatFileSize\n\n▸ **getFormatFileSize**(`fileSize`): `string`\n\n格式化文件大小\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `fileSize` | `number` |\n\n#### Returns\n\n`string`\n\n___\n\n### getRawFileContentSync\n\n▸ **getRawFileContentSync**(`path`): `Uint8Array`\n\n获取resources/rawfile目录下对应的rawfile文件内容，使用同步形式返回\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | rawfile文件路径 |\n\n#### Returns\n\n`Uint8Array`\n\n___\n\n### getRawFileContent\n\n▸ **getRawFileContent**(`path`): `Promise`\\<`Uint8Array`\\>\n\n获取resources/rawfile目录下对应的rawfile文件内容，使用Promise异步回调\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `path` | `string` |\n\n#### Returns\n\n`Promise`\\<`Uint8Array`\\>\n\n___\n\n### getRawFileContentStrSync\n\n▸ **getRawFileContentStrSync**(`path`): `string`\n\n获取resources/rawfile目录下对应的rawfile文件内容，使用同步形式返回\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `path` | `string` | rawfile文件路径 |\n\n#### Returns\n\n`string`\n\n___\n\n### getRawFileContentStr\n\n▸ **getRawFileContentStr**(`path`): `Promise`\\<`string`\\>\n\n获取resources/rawfile目录下对应的rawfile文件内容，使用Promise异步回调\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `path` | `string` |\n\n#### Returns\n\n`Promise`\\<`string`\\>\n\n___\n\n### saveImage\n\n▸ **saveImage**(`pixelMap`, `dirPath?`, `fileName`, `quality?`): `Promise`\\<`string`\\>\n\n将PixelMap图像数据保存到本地沙盒目录\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `pixelMap` | `PixelMap` | `undefined` | PixelMap图像数据 |\n| `dirPath` | `string` | `\"images\"` | 保存目录路径，相对沙盒目录 |\n| `fileName` | `string` | `undefined` | 保存的文件名（包含扩展名） |\n| `quality` | `number` | `80` | 图片质量，1-100，默认80 |\n\n#### Returns\n\n`Promise`\\<`string`\\>\n\n保存后的文件完整路径\n\nFile v1.0.3:references/api/classes/base.BMLog.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMLog\n\n# Class: BMLog\n\n[base](../modules/base.md).BMLog\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.BMLog.md#constructor)\n\n### Properties\n\n- [logLevel](base.BMLog.md#loglevel)\n\n### Methods\n\n- [debug](base.BMLog.md#debug)\n- [info](base.BMLog.md#info)\n- [warn](base.BMLog.md#warn)\n- [error](base.BMLog.md#error)\n\n## Constructors\n\n### constructor\n\n• **new BMLog**(): [`BMLog`](base.BMLog.md)\n\n#### Returns\n\n[`BMLog`](base.BMLog.md)\n\n## Properties\n\n### logLevel\n\n▪ `Static` **logLevel**: `LogLevel` = `hilog.LogLevel.FATAL`\n\n## Methods\n\n### debug\n\n▸ **debug**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`\n\n___\n\n### info\n\n▸ **info**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`\n\n___\n\n### warn\n\n▸ **warn**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`\n\n___\n\n### error\n\n▸ **error**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`\n\nFile v1.0.3:references/api/classes/base.BMStringUtils.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMStringUtils\n\n# Class: BMStringUtils\n\n[base](../modules/base.md).BMStringUtils\n\nstring 相关的工具类\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.BMStringUtils.md#constructor)\n\n### Methods\n\n- [isNull](base.BMStringUtils.md#isnull)\n- [isNotNull](base.BMStringUtils.md#isnotnull)\n- [isEmpty](base.BMStringUtils.md#isempty)\n- [isNotEmpty](base.BMStringUtils.md#isnotempty)\n- [replace](base.BMStringUtils.md#replace)\n- [replaceAll](base.BMStringUtils.md#replaceall)\n- [stripHtmlTags](base.BMStringUtils.md#striphtmltags)\n- [startsWith](base.BMStringUtils.md#startswith)\n- [endsWith](base.BMStringUtils.md#endswith)\n- [contains](base.BMStringUtils.md#contains)\n- [equal](base.BMStringUtils.md#equal)\n- [equalsIgnoreCase](base.BMStringUtils.md#equalsignorecase)\n- [split](base.BMStringUtils.md#split)\n- [toLower](base.BMStringUtils.md#tolower)\n- [toUpper](base.BMStringUtils.md#toupper)\n- [capitalize](base.BMStringUtils.md#capitalize)\n- [strToUint8Array](base.BMStringUtils.md#strtouint8array)\n- [unit8ArrayToStr](base.BMStringUtils.md#unit8arraytostr)\n- [strToHex](base.BMStringUtils.md#strtohex)\n- [hexToStr](base.BMStringUtils.md#hextostr)\n- [strToBase64](base.BMStringUtils.md#strtobase64)\n- [base64ToStr](base.BMStringUtils.md#base64tostr)\n- [strToBuffer](base.BMStringUtils.md#strtobuffer)\n- [bufferToStr](base.BMStringUtils.md#buffertostr)\n- [bufferToUint8Array](base.BMStringUtils.md#buffertouint8array)\n- [unit8ArrayToBuffer](base.BMStringUtils.md#unit8arraytobuffer)\n- [trimParentheses](base.BMStringUtils.md#trimparentheses)\n- [copyArray](base.BMStringUtils.md#copyarray)\n- [format](base.BMStringUtils.md#format)\n- [toDouble](base.BMStringUtils.md#todouble)\n\n## Constructors\n\n### constructor\n\n• **new BMStringUtils**(): [`BMStringUtils`](base.BMStringUtils.md)\n\n#### Returns\n\n[`BMStringUtils`](base.BMStringUtils.md)\n\n## Methods\n\n### isNull\n\n▸ **isNull**(`str`): `boolean`\n\n字符串是否为空(undefined、null)\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### isNotNull\n\n▸ **isNotNull**(`str`): `boolean`\n\n判断字符串是否为非空。true为非空，否则false\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### isEmpty\n\n▸ **isEmpty**(`str`): `boolean`\n\n字符串是否为空(undefined、null、字符串长度为0)\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### isNotEmpty\n\n▸ **isNotEmpty**(`str`): `boolean`\n\n判断字符串是否为非空。true为非空空，否则false\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### replace\n\n▸ **replace**(`str`, `pattern`, `replacement?`): `string`\n\n替换字符串中匹配的正则为给定的字符串\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `undefined` | 待替换的字符串 |\n| `pattern` | `string` \\| `RegExp` | `undefined` | 要匹配的内容正则或字符串 |\n| `replacement` | `string` | `''` | 替换的内容 |\n\n#### Returns\n\n`string`\n\n返回替换后的字符串\n\n___\n\n### replaceAll\n\n▸ **replaceAll**(`str`, `pattern`, `replacement?`): `string`\n\n替换字符串中所有匹配的正则为给定的字符串\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `undefined` | 待替换的字符串 |\n| `pattern` | `string` \\| `RegExp` | `undefined` | 要匹配的内容正则或字符串 |\n| `replacement` | `string` | `''` | 替换的内容 |\n\n#### Returns\n\n`string`\n\n返回替换后的字符串\n\n___\n\n### stripHtmlTags\n\n▸ **stripHtmlTags**(`str`): `string`\n\n去除字符串中的 HTML 标签\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `str` | `string` | 待处理的字符串 |\n\n#### Returns\n\n`string`\n\n去除标签后的字符串\n\n___\n\n### startsWith\n\n▸ **startsWith**(`string?`, `target`, `position?`): `boolean`\n\n检查字符串是否以给定的字符串开头\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `string` | `string` | `''` | 源字符串 |\n| `target` | `string` | `undefined` | 要检索字符 |\n| `position` | `number` | `0` | 检索的位置 |\n\n#### Returns\n\n`boolean`\n\n如果字符串以字符串开头，那么返回 true，否则返回 false\n\n___\n\n### endsWith\n\n▸ **endsWith**(`str?`, `target`, `position?`): `boolean`\n\n检查字符串是否以给定的字符串结尾\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `''` | 源字符串 |\n| `target` | `string` | `undefined` | 要检索字符 |\n| `position` | `number` | `str.length` | 检索的位置 |\n\n#### Returns\n\n`boolean`\n\n如果字符串以字符串结尾，那么返回 true，否则返回 false\n\n___\n\n### contains\n\n▸ **contains**(`str?`, `target`): `boolean`\n\n检查字符串是否包含给定的字符串\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `''` | 源字符串 |\n| `target` | `string` | `undefined` | 要检索字符 |\n\n#### Returns\n\n`boolean`\n\n如果str包含target，返回true，否则返回false\n\n___\n\n### equal\n\n▸ **equal**(`source`, `target`): `boolean`\n\n判断两个传入的数值或者是字符串是否相等\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `source` | `string` \\| `number` |\n| `target` | `string` \\| `number` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### equalsIgnoreCase\n\n▸ **equalsIgnoreCase**(`source`, `target`): `boolean`\n\n判断两个传入的数值或者是字符串是否相等\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `source` | `string` \\| `number` |\n| `target` | `string` \\| `number` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### split\n\n▸ **split**(`str`, `separator`): `string`[]\n\n字符串分割\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` | 源字符串 |\n| `separator` | `string` \\| `RegExp` | 分割符 |\n\n#### Returns\n\n`string`[]\n\n分割后的字符串数组\n\n___\n\n### toLower\n\n▸ **toLower**(`str?`): `string`\n\n转换整个字符串的字符为小写\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `''` | 要转换的字符串 |\n\n#### Returns\n\n`string`\n\n返回小写的字符串\n\n___\n\n### toUpper\n\n▸ **toUpper**(`str?`): `string`\n\n转换整个字符串的字符为大写\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `''` | 要转换的字符串 |\n\n#### Returns\n\n`string`\n\n返回小写的字符串\n\n___\n\n### capitalize\n\n▸ **capitalize**(`str?`): `string`\n\n转换字符串首字母为大写，剩下为小写\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `''` | 待转换的字符串 |\n\n#### Returns\n\n`string`\n\n转换后的\n\n___\n\n### strToUint8Array\n\n▸ **strToUint8Array**(`src`, `encoding?`): `Uint8Array`\n\n字符串转Uint8Array\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `string` | `undefined` | 字符串 |\n| `encoding` | `BufferEncoding` | `'utf-8'` | - |\n\n#### Returns\n\n`Uint8Array`\n\nUint8Array\n\n___\n\n### unit8ArrayToStr\n\n▸ **unit8ArrayToStr**(`src`, `encoding?`): `string`\n\nUint8Array转字符串\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `src` | `Uint8Array` | `undefined` | Uint8Array |\n| `encoding` | `BufferEncoding` | `'utf-8'` | - |\n\n#### Returns\n\n`string`\n\n字符串\n\n___\n\n### strToHex\n\n▸ **strToHex**(`hexStr`): `Uint8Array`\n\n16进制字符串转换unit8Array\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `hexStr` | `string` |\n\n#### Returns\n\n`Uint8Array`\n\n___\n\n### hexToStr\n\n▸ **hexToStr**(`arr`): `string`\n\n16进制unit8Array转字符串\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `arr` | `Uint8Array` |\n\n#### Returns\n\n`string`\n\n___\n\n### strToBase64\n\n▸ **strToBase64**(`src`): `string`\n\n字符串转Base64字符串\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `src` | `string` | 字符串 |\n\n#### Returns\n\n`string`\n\n___\n\n### base64ToStr\n\n▸ **base64ToStr**(`base64Str`): `string`\n\nBase64字符串转字符串\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `base64Str` | `string` | Base64字符串 |\n\n#### Returns\n\n`string`\n\n___\n\n### strToBuffer\n\n▸ **strToBuffer**(`src`, `encoding?`): `ArrayBuffer`\n\n字符串转ArrayBuffer\n\n#### Parameters\n\n| Name | Type | Default value |\n| :------ | :------ | :------ |\n| `src` | `string` | `undefined` |\n| `encoding` | `BufferEncoding` | `'utf-8'` |\n\n#### Returns\n\n`ArrayBuffer`\n\n___\n\n### bufferToStr\n\n▸ **bufferToStr**(`src`, `encoding?`): `string`\n\nArrayBuffer转字符串\n\n#### Parameters\n\n| Name | Type | Default value |\n| :------ | :------ | :------ |\n| `src` | `ArrayBuffer` | `undefined` |\n| `encoding` | `BufferEncoding` | `'utf-8'` |\n\n#### Returns\n\n`string`\n\n___\n\n### bufferToUint8Array\n\n▸ **bufferToUint8Array**(`src`): `Uint8Array`\n\nArrayBuffer转Uint8Array\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `src` | `ArrayBuffer` |\n\n#### Returns\n\n`Uint8Array`\n\n___\n\n### unit8ArrayToBuffer\n\n▸ **unit8ArrayToBuffer**(`src`): `ArrayBuffer`\n\nUint8Array转ArrayBuffer\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `src` | `Uint8Array` |\n\n#### Returns\n\n`ArrayBuffer`\n\n___\n\n### trimParentheses\n\n▸ **trimParentheses**(`str?`): `string`\n\n去除字符串首尾的小括号\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `\"\"` | 待处理的字符串，默认为空字符串 |\n\n#### Returns\n\n`string`\n\n去除首尾小括号后的字符串\n\n___\n\n### copyArray\n\n▸ **copyArray**(`target`): `string`[]\n\n复制数组\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `target` | `undefined` \\| ``null`` \\| `string`[] | 目标数组 |\n\n#### Returns\n\n`string`[]\n\n复制后的数组\n\n___\n\n### format\n\n▸ **format**(`formatString`, `...values`): `string`\n\n字符串format方法\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `formatString` | `string` |\n| `...values` | (`undefined` \\| ``null`` \\| `string` \\| `number` \\| `boolean`)[] |\n\n#### Returns\n\n`string`\n\n___\n\n### toDouble\n\n▸ **toDouble**(`str`): ``null`` \\| `number`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `string` |\n\n#### Returns\n\n``null`` \\| `number`\n\nFile v1.0.3:references/api/classes/base.BMThreadUtils.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMThreadUtils\n\n# Class: BMThreadUtils\n\n[base](../modules/base.md).BMThreadUtils\n\n线程工具类\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.BMThreadUtils.md#constructor)\n\n### Properties\n\n- [mainThreadId](base.BMThreadUtils.md#mainthreadid)\n\n### Methods\n\n- [initMainThreadId](base.BMThreadUtils.md#initmainthreadid)\n- [isOnUiThread](base.BMThreadUtils.md#isonuithread)\n- [assertOnUiThread](base.BMThreadUtils.md#assertonuithread)\n- [runOnUiThread](base.BMThreadUtils.md#runonuithread)\n- [runOnTaskPool](base.BMThreadUtils.md#runontaskpool)\n- [generateTask](base.BMThreadUtils.md#generatetask)\n\n## Constructors\n\n### constructor\n\n• **new BMThreadUtils**(): [`BMThreadUtils`](base.BMThreadUtils.md)\n\n#### Returns\n\n[`BMThreadUtils`](base.BMThreadUtils.md)\n\n## Properties\n\n### mainThreadId\n\n▪ `Static` **mainThreadId**: `number` = `0`\n\n主线程ID\n\n## Methods\n\n### initMainThreadId\n\n▸ **initMainThreadId**(): `void`\n\n设置主线程ID\n\nprocess.tid可以获取到调用时的所在线程的ID，但没有直接获取到主线程的ID的api；\nAbility初始化时，通过process获取主线程ID，保存在BMThreadUtils.mainThreadId。\n\n#### Returns\n\n`void`\n\n___\n\n### isOnUiThread\n\n▸ **isOnUiThread**(): `boolean`\n\n判断是否在主线程\n\n#### Returns\n\n`boolean`\n\n如果当前所在为主线程，返回true；否则返回false\n\n___\n\n### assertOnUiThread\n\n▸ **assertOnUiThread**(): `void`\n\n判断是否在主线程，如果不是则抛出异常\n\n#### Returns\n\n`void`\n\n___\n\n### runOnUiThread\n\n▸ **runOnUiThread**(`func?`, `...args`): `Promise`\\<`void`\\>\n\n切换至主线程执行\n\n如果当前在主线程，则直接执行func；否则通过taskpool.Task发送到主线程执行。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `func?` | `Function` | 待执行方法 |\n| `...args` | `Object`[] | 参数 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### runOnTaskPool\n\n▸ **runOnTaskPool**(`func`, `...args`): `Promise`\\<`Object`\\>\n\n切换至工作线程执行\n\napi使用限制：\n1.在工作线程执行的函数，必须有@Concurrent注解；由于@Concurrent的限制，可将方法放置于ConcurrentFuctions.ets中。\n2.在工作线程执行的函数，参数必须为可序列化的（如果需要其他不可序列化的参数，请通过全局、单例等方法在函数执行时获取）。\n\n如果待执行函数中需要向host线程回调，请直接使用原生api来实现：\n     1）设置回调函数，通过task.onReceiveData(callback)设置。\n     2）在task的func中，通过task.sendData(...args: Object[])向host线程发送数据，args为calback所需要的参数。\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `func` | `Function` |\n| `...args` | `Object`[] |\n\n#### Returns\n\n`Promise`\\<`Object`\\>\n\n___\n\n### generateTask\n\n▸ **generateTask**(`func`, `...args`): `any`\n\n生成待执行任务\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `func` | `Function` | 待执行方法 |\n| `...args` | `Object`[] | 参数 |\n\n#### Returns\n\n`any`\n\ntaskpool.Task\n\nFile v1.0.3:references/api/classes/base.Bounds.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / Bounds\n\n# Class: Bounds\n\n[base](../modules/base.md).Bounds\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.Bounds.md#constructor)\n\n### Accessors\n\n- [minX](base.Bounds.md#minx)\n- [minY](base.Bounds.md#miny)\n- [maxX](base.Bounds.md#maxx)\n- [maxY](base.Bounds.md#maxy)\n- [midX](base.Bounds.md#midx)\n- [midY](base.Bounds.md#midy)\n\n### Methods\n\n- [isEmpty](base.Bounds.md#isempty)\n- [equals](base.Bounds.md#equals)\n- [containsBounds](base.Bounds.md#containsbounds)\n- [getCenter](base.Bounds.md#getcenter)\n- [intersects](base.Bounds.md#intersects)\n- [containsPoint](base.Bounds.md#containspoint)\n- [extend](base.Bounds.md#extend)\n- [getSouthWest](base.Bounds.md#getsouthwest)\n- [getNorthEast](base.Bounds.md#getnortheast)\n- [setSouthWest](base.Bounds.md#setsouthwest)\n- [setNorthEast](base.Bounds.md#setnortheast)\n- [clone](base.Bounds.md#clone)\n- [toString](base.Bounds.md#tostring)\n\n## Constructors\n\n### constructor\n\n• **new Bounds**(`sw?`, `ne?`): [`Bounds`](base.Bounds.md)\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `sw?` | [`LatLng`](base.LatLng.md) |\n| `ne?` | [`LatLng`](base.LatLng.md) |\n\n#### Returns\n\n[`Bounds`](base.Bounds.md)\n\n## Accessors\n\n### minX\n\n• `get` **minX**(): `number`\n\n获取minX\n\n#### Returns\n\n`number`\n\n___\n\n### minY\n\n• `get` **minY**(): `number`\n\n获取minY\n\n#### Returns\n\n`number`\n\n___\n\n### maxX\n\n• `get` **maxX**(): `number`\n\n获取maxX\n\n#### Returns\n\n`number`\n\n___\n\n### maxY\n\n• `get` **maxY**(): `number`\n\n获取maxY\n\n#### Returns\n\n`number`\n\n___\n\n### midX\n\n• `get` **midX**(): `number`\n\n#### Returns\n\n`number`\n\n___\n\n### midY\n\n• `get` **midY**(): `number`\n\n#### Returns\n\n`number`\n\n## Methods\n\n### isEmpty\n\n▸ **isEmpty**(): `boolean`\n\n矩形区域是否为空\n\n#### Returns\n\n`boolean`\n\n是否为空\n\n___\n\n### equals\n\n▸ **equals**(`other`): `boolean`\n\n当且仅当此矩形中的两点参数都等于其他矩形的两点参数时，返回`true`\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `other` | [`Bounds`](base.Bounds.md) | 对比的矩形区域 |\n\n#### Returns\n\n`boolean`\n\n___\n\n### containsBounds\n\n▸ **containsBounds**(`bounds`): `boolean`\n\n返回该区域是否包含指定的区域\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `bounds` | [`Bounds`](base.Bounds.md) | 用于测试的区域 |\n\n#### Returns\n\n`boolean`\n\n是否包含测试的区域\n\n___\n\n### getCenter\n\n▸ **getCenter**(): ``null`` \\| [`LatLng`](base.LatLng.md)\n\n返回该区域的中心点地理坐标\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)\n\n地理点坐标对象.\n\n___\n\n### intersects\n\n▸ **intersects**(`bounds`): ``null`` \\| [`Bounds`](base.Bounds.md)\n\n返回一个新的矩形对象，表示该项矩形区域与指定矩形区域的交集，不相交返回`null`\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `bounds` | [`Bounds`](base.Bounds.md) | 指定的地理矩形区域 |\n\n#### Returns\n\n``null`` \\| [`Bounds`](base.Bounds.md)\n\n相交的地理矩形区域，返回`null`则表示不相交\n\n___\n\n### containsPoint\n\n▸ **containsPoint**(`point?`): `undefined` \\| `boolean`\n\n返回该区域是否包含指定的点(Point)\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `point?` | [`LatLng`](base.LatLng.md) | 点对象 |\n\n#### Returns\n\n`undefined` \\| `boolean`\n\n布尔值,包含:true,不包含:false;.\n\n___\n\n### extend\n\n▸ **extend**(`point?`): `void`\n\n根据地理坐标扩展 bounds 区域，以便将该点包含在区域内\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `point?` | [`LatLng`](base.LatLng.md) | 坐标对象 |\n\n#### Returns\n\n`void`\n\n___\n\n### getSouthWest\n\n▸ **getSouthWest**(): [`LatLng`](base.LatLng.md)\n\n获取西南角坐标\n\n#### Returns\n\n[`LatLng`](base.LatLng.md)\n\n西南角坐标\n\n___\n\n### getNorthEast\n\n▸ **getNorthEast**(): [`LatLng`](base.LatLng.md)\n\n获取东北角坐标\n\n#### Returns\n\n[`LatLng`](base.LatLng.md)\n\n东北角坐标\n\n___\n\n### setSouthWest\n\n▸ **setSouthWest**(`sw?`): `void`\n\n设置西南角坐标\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `sw?` | [`LatLng`](base.LatLng.md) | 西南角坐标 |\n\n#### Returns\n\n`void`\n\n___\n\n### setNorthEast\n\n▸ **setNorthEast**(`ne?`): `void`\n\n设置东北角坐标\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `ne?` | [`LatLng`](base.LatLng.md) | 东北角坐标 |\n\n#### Returns\n\n`void`\n\n___\n\n### clone\n\n▸ **clone**(): [`Bounds`](base.Bounds.md)\n\n复制一个矩形区域对象\n\n#### Returns\n\n[`Bounds`](base.Bounds.md)\n\n复制的对象\n\n___\n\n### toString\n\n▸ **toString**(): `string`\n\n返回类型描述信息\n\n#### Returns\n\n`string`\n\n类型信息\n\nFile v1.0.3:references/api/classes/base.CoordTrans.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / CoordTrans\n\n# Class: CoordTrans\n\n[base](../modules/base.md).CoordTrans\n\n经纬度坐标系转换工具类\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.CoordTrans.md#constructor)\n\n### Methods\n\n- [baiduToGcj](base.CoordTrans.md#baidutogcj)\n- [wgsToGcj](base.CoordTrans.md#wgstogcj)\n- [gcjToBaidu](base.CoordTrans.md#gcjtobaidu)\n- [wgsToBaidu](base.CoordTrans.md#wgstobaidu)\n\n## Constructors\n\n### constructor\n\n• **new CoordTrans**(): [`CoordTrans`](base.CoordTrans.md)\n\n#### Returns\n\n[`CoordTrans`](base.CoordTrans.md)\n\n## Methods\n\n### baiduToGcj\n\n▸ **baiduToGcj**(`latLng`): ``null`` \\| [`LatLng`](base.LatLng.md)\n\n百度转国测局\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `latLng` | [`LatLng`](base.LatLng.md) | 百度经纬度 |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)\n\n若转换成功，返回国测局经纬度；否则，返回null。\n\n___\n\n### wgsToGcj\n\n▸ **wgsToGcj**(`latLng`): ``null`` \\| [`LatLng`](base.LatLng.md)\n\nwgs84转国测局\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `latLng` | [`LatLng`](base.LatLng.md) |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)\n\n___\n\n### gcjToBaidu\n\n▸ **gcjToBaidu**(`latLng`): ``null`` \\| [`LatLng`](base.LatLng.md)\n\n国测局转百度\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `latLng` | ``null`` \\| [`LatLng`](base.LatLng.md) | 国测局经纬度 |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)\n\n若转换成功，返回百度经纬度；否则，返回null。\n\n___\n\n### wgsToBaidu\n\n▸ **wgsToBaidu**(`latLng`): ``null`` \\| [`LatLng`](base.LatLng.md)\n\nwgs84转百度\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `latLng` | [`LatLng`](base.LatLng.md) | WGS84经纬度 |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)\n\n若转换成功，返回百度经纬度；否则，返回null。\n\nFile v1.0.3:references/api/classes/base.CoordUtil.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / CoordUtil\n\n# Class: CoordUtil\n\n[base](../modules/base.md).CoordUtil\n\n坐标系工具\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.CoordUtil.md#constructor)\n\n### Methods\n\n- [decodeLocation](base.CoordUtil.md#decodelocation)\n- [ll2point](base.CoordUtil.md#ll2point)\n- [point2ll](base.CoordUtil.md#point2ll)\n- [decodeLocationList2D](base.CoordUtil.md#decodelocationlist2d)\n- [getDistanceByLL](base.CoordUtil.md#getdistancebyll)\n- [getMCDistanceByOneLatLngAndRadius](base.CoordUtil.md#getmcdistancebyonelatlngandradius)\n\n## Constructors\n\n### constructor\n\n• **new CoordUtil**(): [`CoordUtil`](base.CoordUtil.md)\n\n#### Returns\n\n[`CoordUtil`](base.CoordUtil.md)\n\n## Methods\n\n### decodeLocation\n\n▸ **decodeLocation**(`geo`): ``null`` \\| [`LatLng`](base.LatLng.md)\n\n解密经纬度坐标\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `geo` | `string` | 加密的经纬度 |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)\n\nBD09MC 坐标\n\n___\n\n### ll2point\n\n▸ **ll2point**(`latLng`): [`Point`](base.Point.md)\n\n经纬度坐标转百度墨卡托坐标\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `latLng` | [`LatLng`](base.LatLng.md) |\n\n#### Returns\n\n[`Point`](base.Point.md)\n\n___\n\n### point2ll\n\n▸ **point2ll**(`point`): [`LatLng`](base.LatLng.md)\n\n百度墨卡托坐标转经纬度坐标\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `point` | [`Point`](base.Point.md) |\n\n#### Returns\n\n[`LatLng`](base.LatLng.md)\n\n___\n\n### decodeLocationList2D\n\n▸ **decodeLocationList2D**(`strGeoList`): ``null`` \\| [`LatLng`](base.LatLng.md)[][]\n\n解析加密geo为二维LatLng数组\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `strGeoList` | `string` |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)[][]\n\n___\n\n### getDistanceByLL\n\n▸ **getDistanceByLL**(`p1`, `p2`): `number`\n\n两个经纬度点之间的距离\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `p1` | ``null`` \\| [`LatLng`](base.LatLng.md) |\n| `p2` | ``null`` \\| [`LatLng`](base.LatLng.md) |\n\n#### Returns\n\n`number`\n\n-1: error\n\n___\n\n### getMCDistanceByOneLatLngAndRadius\n\n▸ **getMCDistanceByOneLatLngAndRadius**(`p1`, `radius`): `number`\n\n根据半径和已知经纬度估算墨卡托坐标下的半径\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `p1` | [`LatLng`](base.LatLng.md) |\n| `radius` | `number` |\n\n#### Returns\n\n`number`\n\nFile v1.0.3:references/api/classes/base.CoordUtilConcurrent.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / CoordUtilConcurrent\n\n# Class: CoordUtilConcurrent\n\n[base](../modules/base.md).CoordUtilConcurrent\n\n跨线程同步坐标工具类\n用于在工作线程中执行坐标转换，不依赖主线程的 Initializer.coordType\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.CoordUtilConcurrent.md#constructor)\n\n### Methods\n\n- [setCoordType](base.CoordUtilConcurrent.md#setcoordtype)\n- [getCoordType](base.CoordUtilConcurrent.md#getcoordtype)\n- [decodeLocation](base.CoordUtilConcurrent.md#decodelocation)\n- [ll2point](base.CoordUtilConcurrent.md#ll2point)\n- [point2ll](base.CoordUtilConcurrent.md#point2ll)\n- [decodeLocationList2D](base.CoordUtilConcurrent.md#decodelocationlist2d)\n- [getDistanceByLL](base.CoordUtilConcurrent.md#getdistancebyll)\n\n## Constructors\n\n### constructor\n\n• **new CoordUtilConcurrent**(): [`CoordUtilConcurrent`](base.CoordUtilConcurrent.md)\n\n#### Returns\n\n[`CoordUtilConcurrent`](base.CoordUtilConcurrent.md)\n\n## Methods\n\n### setCoordType\n\n▸ **setCoordType**(`coordType`): `void`\n\n设置当前线程的坐标系类型\n在工作线程使用坐标工具前必须先调用此方法设置坐标系类型\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `coordType` | `number` | 坐标系类型，默认为 BD09LL |\n\n#### Returns\n\n`void`\n\n___\n\n### getCoordType\n\n▸ **getCoordType**(): `number`\n\n获取当前线程的坐标系类型\n\n#### Returns\n\n`number`\n\n当前坐标系类型\n\n___\n\n### decodeLocation\n\n▸ **decodeLocation**(`geo`, `coordType?`): ``null`` \\| [`LatLng`](base.LatLng.md)\n\n解密经纬度坐标（并发版本）\n不依赖主线程的 Initializer.coordType，使用线程本地变量或参数\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `geo` | `string` | 加密的经纬度 |\n| `coordType?` | `number` | 可选，坐标系类型。如果传入则优先使用，否则使用线程本地变量 |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)\n\nBD09LL 坐标\n\n___\n\n### ll2point\n\n▸ **ll2point**(`latLng`, `coordType?`): [`Point`](base.Point.md)\n\n经纬度坐标转百度墨卡托坐标（并发版本）\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `latLng` | [`LatLng`](base.LatLng.md) | 经纬度坐标 |\n| `coordType?` | `number` | 可选，坐标系类型。如果传入则优先使用，否则使用线程本地变量 |\n\n#### Returns\n\n[`Point`](base.Point.md)\n\n百度墨卡托坐标\n\n___\n\n### point2ll\n\n▸ **point2ll**(`point`, `coordType?`): [`LatLng`](base.LatLng.md)\n\n百度墨卡托坐标转经纬度坐标（并发版本）\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `point` | [`Point`](base.Point.md) | 百度墨卡托坐标 |\n| `coordType?` | `number` | 可选，坐标系类型。如果传入则优先使用，否则使用线程本地变量 |\n\n#### Returns\n\n[`LatLng`](base.LatLng.md)\n\n经纬度坐标\n\n___\n\n### decodeLocationList2D\n\n▸ **decodeLocationList2D**(`strGeoList`, `coordType?`): ``null`` \\| [`LatLng`](base.LatLng.md)[][]\n\n解析加密geo为二维LatLng数组（并发版本）\n注意：此方法内部仍使用 Initializer.coordType，需要改造\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `strGeoList` | `string` | 加密的geo字符串列表 |\n| `coordType?` | `number` | 可选，坐标系类型。如果传入则优先使用，否则使用线程本地变量 |\n\n#### Returns\n\n``null`` \\| [`LatLng`](base.LatLng.md)[][]\n\n二维LatLng数组\n\n___\n\n### getDistanceByLL\n\n▸ **getDistanceByLL**(`p1`, `p2`, `coordType?`): `number`\n\n两个经纬度点之间的距离（并发版本）\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `p1` | ``null`` \\| [`LatLng`](base.LatLng.md) | 第一个点 |\n| `p2` | ``null`` \\| [`LatLng`](base.LatLng.md) | 第二个点 |\n| `coordType?` | `number` | 可选，坐标系类型。如果传入则优先使用，否则使用线程本地变量 |\n\n#### Returns\n\n`number`\n\n距离（米），-1 表示错误\n\nFile v1.0.3:references/api/classes/base.DeviceInfo.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / DeviceInfo\n\n# Class: DeviceInfo\n\n[base](../modules/base.md).DeviceInfo\n\n## Table of contents\n\n### Accessors\n\n- [authToken](base.DeviceInfo.md#authtoken)\n\n### Methods\n\n- [getInstance](base.DeviceInfo.md#getinstance)\n- [init](base.DeviceInfo.md#init)\n- [getParams](base.DeviceInfo.md#getparams)\n- [getName](base.DeviceInfo.md#getname)\n- [setCuid](base.DeviceInfo.md#setcuid)\n- [getModel](base.DeviceInfo.md#getmodel)\n- [getCuid](base.DeviceInfo.md#getcuid)\n- [getCTM](base.DeviceInfo.md#getctm)\n- [getZid](base.DeviceInfo.md#getzid)\n- [getResId](base.DeviceInfo.md#getresid)\n- [getChanel](base.DeviceInfo.md#getchanel)\n- [getSdkVersion](base.DeviceInfo.md#getsdkversion)\n- [getSdkVersionForEngine](base.DeviceInfo.md#getsdkversionforengine)\n- [getOsVersion](base.DeviceInfo.md#getosversion)\n- [getDpi](base.DeviceInfo.md#getdpi)\n- [getPCN](base.DeviceInfo.md#getpcn)\n- [getScreenSize](base.DeviceInfo.md#getscreensize)\n- [getBrands](base.DeviceInfo.md#getbrands)\n- [getOEM](base.DeviceInfo.md#getoem)\n- [getAppId](base.DeviceInfo.md#getappid)\n- [getNet](base.DeviceInfo.md#getnet)\n\n## Accessors\n\n### authToken\n\n• `get` **authToken**(): `string`\n\n#### Returns\n\n`string`\n\n• `set` **authToken**(`value`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `value` | `string` |\n\n#### Returns\n\n`void`\n\n## Methods\n\n### getInstance\n\n▸ **getInstance**(): [`DeviceInfo`](base.DeviceInfo.md)\n\n#### Returns\n\n[`DeviceInfo`](base.DeviceInfo.md)\n\n___\n\n### init\n\n▸ **init**(): `Promise`\\<`boolean`\\>\n\n#### Returns\n\n`Promise`\\<`boolean`\\>\n\n___\n\n### getParams\n\n▸ **getParams**(): `DeviceParams`\n\n#### Returns\n\n`DeviceParams`\n\n___\n\n### getName\n\n▸ **getName**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### setCuid\n\n▸ **setCuid**(`cuid`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `cuid` | `string` |\n\n#### Returns\n\n`void`\n\n___\n\n### getModel\n\n▸ **getModel**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getCuid\n\n▸ **getCuid**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getCTM\n\n▸ **getCTM**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getZid\n\n▸ **getZid**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getResId\n\n▸ **getResId**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getChanel\n\n▸ **getChanel**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getSdkVersion\n\n▸ **getSdkVersion**(): `string`\n\n地图SDK版本获取\n\n#### Returns\n\n`string`\n\n___\n\n### getSdkVersionForEngine\n\n▸ **getSdkVersionForEngine**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getOsVersion\n\n▸ **getOsVersion**(): `string`\n\n获取设备系统版本，规则以『OpenHarmony』+ 系统版本号的形式返回\n注：可以在用户未授权时调用\n\n#### Returns\n\n`string`\n\n百度地图定义的系统版本版本\n\n___\n\n### getDpi\n\n▸ **getDpi**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getPCN\n\n▸ **getPCN**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getScreenSize\n\n▸ **getScreenSize**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getBrands\n\n▸ **getBrands**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getOEM\n\n▸ **getOEM**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getAppId\n\n▸ **getAppId**(): `string`\n\n#### Returns\n\n`string`\n\n___\n\n### getNet\n\n▸ **getNet**(): `string`\n\n#### Returns\n\n`string`\n\nFile v1.0.3:references/api/classes/base.Initializer.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / Initializer\n\n# Class: Initializer\n\n[base](../modules/base.md).Initializer\n\n用于初始化权限并管理令牌的单例类。\n\n## Implements\n\n- [`PermissionCheckResultListener`](../interfaces/base.PermissionCheckResultListener.md)\n\n## Table of contents\n\n### Accessors\n\n- [watchSearchTime](base.Initializer.md#watchsearchtime)\n- [watchSearchMaxNum](base.Initializer.md#watchsearchmaxnum)\n- [coordType](base.Initializer.md#coordtype)\n\n### Methods\n\n- [getInstance](base.Initializer.md#getinstance)\n- [initialize](base.Initializer.md#initialize)\n\n## Accessors\n\n### watchSearchTime\n\n• `get` **watchSearchTime**(): `number`\n\n#### Returns\n\n`number`\n\n• `set` **watchSearchTime**(`value`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `value` | `number` |\n\n#### Returns\n\n`void`\n\n___\n\n### watchSearchMaxNum\n\n• `get` **watchSearchMaxNum**(): `number`\n\n#### Returns\n\n`number`\n\n• `set` **watchSearchMaxNum**(`value`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `value` | `number` |\n\n#### Returns\n\n`void`\n\n___\n\n### coordType\n\n• `get` **coordType**(): [`CoordType`](../enums/base.CoordType.md)\n\n获取使用的坐标类型，支持GCJ02和 BD09LL两种坐标[CoordType](../enums/base.CoordType.md)的输入输出，默认是BD09LL坐标\n\n#### Returns\n\n[`CoordType`](../enums/base.CoordType.md)\n\n使用的坐标类型\n\n• `set` **coordType**(`value`): `void`\n\n设置使用的坐标类型，支持GCJ02和BD09LL两种坐标[CoordType](../enums/base.CoordType.md)的输入输出，默认是BD09LL坐标\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `value` | [`CoordType`](../enums/base.CoordType.md) |\n\n#### Returns\n\n`void`\n\n## Methods\n\n### getInstance\n\n▸ **getInstance**(): [`Initializer`](base.Initializer.md)\n\n获取 Initializer 的单例实例。\n\n#### Returns\n\n[`Initializer`](base.Initializer.md)\n\nInitializer 的单例实例。\n\n___\n\n### initialize\n\n▸ **initialize**(`ak`, `context`): `Promise`\\<`boolean`\\>\n\n使用提供的 API 密钥初始化权限。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `ak` | `string` | 用于初始化的 API 密钥。 |\n| `context` | `UIAbilityContext` | UIAbility上下文，建议每个Hap包中只包含一个UIAbility。(https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-ability-66) |\n\n#### Returns\n\n`Promise`\\<`boolean`\\>\n\nFile v1.0.3:references/api/classes/base.LatLng.md\n\n[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / LatLng\n\n# Class: LatLng\n\n[base](../modules/base.md).LatLng\n\n经纬度点封装类\n\n**`Package`**\n\n@bdmap/base\n\n**`Since`**\n\n1.0.0\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.LatLng.md#constructor)\n\n### Properties\n\n- [lat](base.LatLng.md#lat)\n- [lng](base.LatLng.md#lng)\n\n### Methods\n\n- [clone](base.LatLng.md#clone)\n- [equals](base.LatLng.md#equals)\n- [toString](base.LatLng.md#tostring)\n\n## Constructors\n\n### constructor\n\n• **new LatLng**(`_lat`, `_lng`): [`LatLng`](base.LatLng.md)\n\n经纬度构造函数\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `_lat` | `number` | 纬度，取值范围[-90,90]。 |\n| `_lng` | `number` | 经度，取值范围[-180,180]。 |\n\n#### Returns\n\n[`LatLng`](base.LatLng.md)\n\n**`Since`**\n\n1.0.0\n\n## Properties\n\n### lat\n\n• **lat**: `number`\n\n___\n\n### lng\n\n• **lng**: `number`\n\n## Methods\n\n### clone\n\n▸ **clone**(): [`LatLng`](base.LatLng.md)\n\n#### Returns\n\n[`LatLng`](base.LatLng.md)\n\n___\n\n### equals\n\n▸ **equals**(`other`): `boolean`\n\n判断经纬度坐标点是否相等，坐标值差小于1e-8\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `other` | [`LatLng`](base.LatLng.md) | 待比较的坐标 |\n\n#### Returns\n\n`boolean`\n\nboolean\n\n___\n\n### toString\n\n▸ **toString**(): `string`\n\n字符串描述对象数据\n\n#### Returns\n\n`string`\n\nstring\n\nArchive v1.0.2: 13 files, 85605 bytes\n\nFiles: _meta.json (142b), references/assets.md (1933b), references/guidelines/build-and-test.md (2429b), references/guidelines/coding-standards.md (3923b), references/guidelines/location-sdk-guide.md (18072b), references/guidelines/map-style-guide.md (11374b), references/guidelines/package-management.md (6679b), references/guidelines/performance-optimization.md (2754b), references/guidelines/ui-feedback.md (3838b), references/guidelines/walkride-sdk-guide.md (32762b), references/reference.md (120581b), skill-card.md (2739b), SKILL.md (32033b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: baidu-map-harmonyos-sdk\ndescription: 帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap/locsdk）。涵盖地图展示与交互、覆盖物绘制、POI/AOI 检索、路线规划、导航、前台/后台定位、地址/POI 获取等场景。适用于提到鸿蒙地图、百度地图 HarmonyNEXT SDK、地图展示、检索、路线规划、导航、定位能力等需求。\n---\n\n# Baidu Map HarmonyOS SDK 开发 Skill\n\n## 使用场景\n\n在以下情况**必须优先使用本 Skill**：\n\n- 提到 **HarmonyOS NEXT 百度地图 / 鸿蒙地图 SDK / HarmonyNEXT 地图** 开发\n- 在本项目中使用 `@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util` 等包或者直接完全使用 `@bdmap/map_walkride_search`等组合包\n- 需要实现以下能力之一：\n  - 地图组件展示、手势和控件交互\n  - 标注点（Marker）、线、面、多边形、圆、文字、信息窗口等覆盖物\n  - 普通地图、卫星地图、个性化地图、自定义瓦片图等图层\n  - 驾车/步行/骑行/公交等路线规划以及步骑行导航\n  - POI/AOI/室内 POI/建筑物/行政区/天气 等检索\n  - 正逆地址解析、推荐上车点、坐标转换、调起百度地图等\n\n以下情况**不适合使用本 Skill，应转用其他平台/能力的 Skill**：\n\n- 仅涉及 **Web 版百度地图 JavaScript API**、Android/iOS 原生 SDK、或小程序地图能力\n- 与地图无关的一般 HarmonyOS 应用开发（此时应优先使用空工程/通用 HarmonyOS Skill）\n\n## ⚠️ 强制要求（必须严格遵守）\n\n在使用本 Skill 进行开发时，**必须严格遵守**以下规范（仅列核心摘要，详细说明见引用文档）：\n\n1. **依赖安装前置（最高优先级，必须在编码之前执行）**\n   - **禁止在依赖包未安装到本地的情况下编写任何业务代码。** 必须先确保 `oh-package.json5` 中声明了所需的 `@bdmap/*` 依赖，并在工程根目录成功执行 `ohpm install`，使 `oh_modules/` 下存在对应包的声明文件（`.d.ets`）后，才能开始分析需求和编写代码。\n   - **原因**：百度地图 SDK 的类型导出位置、类/接口名、属性名等均以安装包内的声明文件（`Index.d.ets` 及其引用的 `.d.ets`）为准。仅凭文档示例或记忆推测 API 会导致导入路径错误。\n   - **执行流程**：\n     1. 检查 `entry/oh-package.json5`（或工程根 `oh-package.json5`）中是否已声明所需的 `@bdmap/*` 依赖；若缺失则先补充声明。\n     2. 在工程根目录执行 `ohpm install`，确认安装成功（无报错）。\n     3. 确认 `oh_modules/.ohpm/@bdmap+<包名>@<版本>/oh_modules/@bdmap/<包名>/Index.d.ets` 文件存在。\n     4. **在编写 import 语句前**，必须通过查阅安装包的 `Index.d.ets` �灵精附体确认目标类/接口/枚举的实际导出包名和导出名称。对于属性名、方法签名等细节，应跳转到具体的 `.d.ets` 定义文件确认。\n2. **日志 / 注释 / 模块化规范**  \n   - 必须使用统一的 `Logger` 工具类封装原生 `console`，第一个参数固定使用场景名 `\"SportHealthMap\"`，禁止直接使用 `console.info/error/warn/debug`。  \n   - 关键业务方法必须补充中文注释说明用途、参数与返回值，通用工具类必须抽取为独立模块，禁止在页面内联定义通用类。  \n   - 详细规则与示例见：[代码规范](references/guidelines/coding-standards.md)。\n\n3. **图片资源使用规范（必须主动拷贝）**  \n   - 生成或修改示例代码时，优先使用本 Skill 资产中约定的图片名，并保持与 [assets](references/assets.md) 表格中的用途一致或相近。  \n   - 必须提醒开发者：将对应图片主动拷贝到 HarmonyOS 工程的 `resources/rawfile/` 目录后，再通过 `rawfile://xxx.png` 方式引用，否则覆盖物会因为找不到资源而不显示或报错。  \n   - 详细说明见：[代码规范 / 图片资源使用规范](references/guidelines/coding-standards.md#4-图片资源使用规范)。\n\n4. **地图功能开发（代码组织与规范）（强制要求）**\n   - **示例与 API 使用**：回答与实现时，应优先参考本目录下 `references/reference.md` 中给出的示例代码与调用方式，在此基础上按业务场景做适配，避免自创与 SDK 不一致的用法。  \n   - **性能与覆盖物分层**：高频 UI 更新场景（如气泡内容刷新、轨迹回放等）必须缓存复用 PopView/Label 等对象，所有覆盖物需显式设置 `zIndex` 并遵循统一分层，避免信息被遮挡；详细见：[地图性能与覆盖物分层规范](references/guidelines/performance-optimization.md)。  \n   - **地图 & UI 交互反馈**：地图初始化、检索、路线规划、定位、覆盖物增删、权限/网络异常等关键行为，必须通过 Toast/Dialog/页面状态文本等方式给出清晰的用户反馈，而不仅仅是日志；详细见：[地图 UI 交互与用户反馈规范](references/guidelines/ui-feedback.md)。  \n   - **定位与地图协同**：涉及 `@bdmap/locsdk` 的地图场景时，需同时遵守定位 SDK 的初始化顺序、权限与错误处理规范；完整说明见：[定位 SDK 开发指南](references/guidelines/location-sdk-guide.md)。\n   - **步骑行导航开发**：涉及步行/骑行导航（`@bdmap/map_walkride_search`）时，需遵循导航引擎初始化时序、生命周期管理、模拟导航退出、默认 UI 手势穿透等规范；完整说明见：[步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md)。\n   - **地图样式与视觉规范**：涉及 Marker 锚点、路线/区域颜色与线宽、不同缩放级别信息密度控制等样式问题时，需遵循统一规范；详见：[地图样式与视觉规范](references/guidelines/map-style-guide.md)。\n   - **类型与 ArkTSCheck**：实现地图相关回调与方法时，必须显式声明参数与返回值类型，禁止使用 `any` 或隐式 `undefined`；当无法明确 `.catch` 回调参数类型时，优先使用 `Error` 或 `object`，确保通过 ArkTSCheck。\n\n5. **包管理互斥规则（强制要求）**\n   - 组合包（`@bdmap/map_walkride_search`、`@bdmap/navi_map`）与独立包（`@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util`）**不允许混用**，否则会导致依赖冲突。\n   - 添加任何百度地图依赖前，必须先检查 `oh-package.json5` 中已有的包方案，并严格遵循同一方案。\n   - **自动切换**：当项目已使用独立包、但新需求明确需要组合包能力时，Agent 必须**自动执行切换**（卸载独立包 → 安装组合包 → 批量替换 import → 构建验证），无需额外询问用户。\n   - `@bdmap/locsdk` 为独立定位包，不受上述互斥限制，可与任何方案搭配使用。\n   - 详细规则、自动切换流程与场景建议见：[包管理规范](references/guidelines/package-management.md)。\n\n6. **运行检测（Auto Run 构建）**  \n   - 每次完成与百度地图 HarmonyOS SDK 相关的代码改动后，必须按照约定的 Auto Run 流程执行一次构建与 ArkTSCheck，自检是否存在编码错误。  \n   - 核心命令为：`ohpm install` + `hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon`。  \n   - 详细流程与错误分类处理见：[构建与编码错误自检规范](references/guidelines/build-and-test.md)。\n\n## 基本开发流程（通用步骤）\n\n处理任何鸿蒙百度地图 SDK 相关问题时，遵循以下流程组织思路与回答：\n\n1. **确认需求类型**\n   - 判断问题属于哪类场景：\n     - 地图展示与交互\n     - 覆盖物绘制（点/Marker/线/面/文字/圆）\n     - 检索（POI/AOI/建筑物/行政区/天气等）\n     - 路线规划（驾车/步行/骑行/公交）\n     - 步骑行导航（导航引擎、默认导航 UI、导航状态监听、模拟导航等）\n     - 定位能力（单点定位/持续定位/后台定位）\n     - 工具类能力（距离/面积计算、坐标转换、点与图形位置关系等）\n2. **检查依赖与安装方式（强制遵守包管理互斥规则）**\n  - **必须先阅读 [包管理规范](references/guidelines/package-management.md)**，确认当前项目使用的是组合包还是独立包方案，严格遵守互斥规则。\n  - 根据模块索引建议：\n     - 若只需要部分能力，建议按需安装独立包：\n       - `ohpm install @bdmap/base`\n       - `ohpm install @bdmap/search`\n       - `ohpm install @bdmap/util`\n       - `ohpm install @bdmap/map`\n       - `ohpm install @bdmap/locsdk`\n     - 若需要地图 + 步行/骑行 等组合能力，可直接使用组合包：\n       - `ohpm install @bdmap/map_walkride_search`\n     - 若需要导航 + 地图能力，可使用组合包：\n       - `ohpm install @bdmap/navi_map`\n   - **组合包与独立包不允许混用**，详见 [包管理规范](references/guidelines/package-management.md)。\n   - 在回答中明确指出需要安装的包以及命令。\n   - **⚠️ 依赖安装后必须验证**：在 `oh-package.json5` 中声明依赖后，必须在工程根目录执行 `ohpm install` 并确认安装成功。**在依赖包未实际安装到 `oh_modules/` 之前，禁止编写任何业务代码**。安装成功后，必须通过查阅 `oh_modules/.ohpm/@bdmap+<包名>@<版本>/oh_modules/@bdmap/<包名>/Index.d.ets` 确认所需类/接口/枚举的实际导出位置和名称，再开始编码。\n3. **确认系统与工具链约束**\n  - 参考在线文档的约束与限制，回答时需提醒：\n     - 仅支持标准系统，设备为华为手机\n     - HarmonyOS 版本：HarmonyOS NEXT Developer Preview1 及以上\n     - DevEco Studio 版本：DevEco Studio NEXT Developer Preview1 及以上\n     - HarmonyOS SDK 版本：HarmonyOS NEXT Developer Preview1 SDK 及以上\n4. **配置权限**\n   - 如涉及网络访问、检索、路线规划等，需要在权限配置中加入至少：\n     - `\"ohos.permission.GET_WIFI_INFO\"`\n     - `\"ohos.permission.GET_NETWORK_INFO\"`\n     - `\"ohos.permission.GET_BUNDLE_INFO\"`\n     - `\"ohos.permission.INTERNET\"`\n   - 提示在工程配置中正确声明这些权限。\n5. **精确定位 API 声明推荐流程**\n   - 从业务代码出发：先看 import { MapOptions } from '@bdmap/map' 里的「包名 + 类型名」。\n   - 定位包根声明文件：在当前工程找到 oh_modules/@bdmap/map/Index.d.ets。\n   - 在 Index.d.ets 中查导出：搜索 MapOptions，找到类似\n    import MapOptions from \"./src/main/ets/lbsmapsdk/e/p\";\n   - 跳到具体定义文件：根据相对路径打开 src/main/ets/lbsmapsdk/e/p.d.ets，再在文件内搜索 class MapOptions 查看完整定义。\n\n## 常见能力指引\n\n在提需求时，优先按照下列能力分类，结合对应模块文档进行回答。\n\n### 1. 能力索引（给开发工具全局搜索用）\n\n使用建议：\n\n- **先搜关键词，再跳转**：优先用下表”推荐搜索词”（包含类名/方法名/中文别名）做全局搜索；命中后再打开对应 `references/reference.md` 小节查看示例与用法。\n- **两段式定位**：`关键词（用户问题）` → [references/reference](references/reference.md)（示例与用法）。如需更详细的 API 参数/枚举/接口明细，请查阅在线官方文档或安装包声明文件。\n\n| 场景（按功能归类） | 推荐搜索词 | [references/reference](references/reference.md) 定位 |\n| --- | --- | --- |\n| 地图初始化/展示 | MapComponent、MapController、onReady、MapOptions、MapStatus、显示地图 | [references/reference](references/reference.md#1-地图展示与交互模块map) / [references/reference](references/reference.md#显示地图) |\n| 地图类型/底图 | setMapType、普通图、卫星图、空白地图、POI显隐、交通流 | [references/reference](references/reference.md#地图类型切换) / [references/reference](references/reference.md#交通流控制) |\n| 个性化地图 | CustomStyle、setCustomStyleById、initCustomStyle、sty | [references/reference](references/reference.md#个性化地图) |\n| 室内图 | indoorMap、INDOORSTATUSCHANGE、switchIndoorFloor、getIndoorInfo | [references/reference](references/reference.md#室内图控制) |\n| 离线地图 | LocalMapManager、getHotCities、start、pause、resume、delete | [references/reference](references/reference.md#离线地图) |\n| 手势/交互 | gestures、zoomGesturesEnabled、moveGesturesEnabled、rotateGesturesEnabled、MapEvent.PINCH | [references/reference](references/reference.md#手势交互) |\n| 控件/图层 | CompassLayer、LocationLayer、比例尺、缩放控件、定位控件、getLayerByTag | [references/reference](references/reference.md#控件交互) / [references/reference](references/reference.md#ref-map-compass-layer) |\n| 地图事件 | MAPSTATUSCHANGE、CLICK、DOUBLECLICK、PINCHSTART、ROTATIONUPDATE | [references/reference](references/reference.md#事件交互) |\n| 地图生命周期/销毁 | onWillDisappear、MapController.onWillDisappear、Navigation、Router | [references/reference](references/reference.md#销毁地图) |\n| 英文地图 | MapLanguage、setMapLanguage、getMapLanguage | [references/reference](references/reference.md#英文地图) |\n| 粒子效果 | ParticleEffectType、showParticleEffectByType、customParticleEffectByType | [references/reference](references/reference.md#粒子效果) |\n| 覆盖物：Marker | Marker、ImageEntity、addOverlay、removeOverlay、OverlayEvent.CLICK | [references/reference](references/reference.md#绘制Marker点) |\n| 覆盖物：气泡（弹框、信息窗） | PopView、LabelUI、HorizontalLayout | [references/reference](references/reference.md#添加信息框) / [references/reference](references/reference.md#信息框) |\n| 覆盖物：点聚合 | ClusterGroup、ClusterTemplate、addMarker | [references/reference](references/reference.md#点聚合) |\n| 覆盖物：折线/轨迹 | Polyline、textures、dottedline、TrackAnimation、Track | [references/reference](references/reference.md#绘制线) / [references/reference](references/reference.md#Track动画能力) / [references/reference](references/reference.md#绘制动态轨迹) |\n| 覆盖物：面/圆 | Polygon、Circle、Stroke、fillcolor、alpha | [references/reference](references/reference.md#绘制面) / [references/reference](references/reference.md#绘制圆) |\n| 覆盖物：3D | Prism、Building、Bd_3DModel、GLTF、OBJ | [references/reference](references/reference.md#绘制棱柱) / [references/reference](references/reference.md#建筑物) / [references/reference](references/reference.md#绘制3D模型) |\n| 图层：瓦片/热力 | UrlTileProvider、ImageTileLayer、HeatMapBuilder、HexagonMapBuilder | [references/reference](references/reference.md#瓦片图层) / [references/reference](references/reference.md#ref-map-heatmap-3d) / [references/reference](references/reference.md#ref-map-heatmap-hexagon) / [references/reference](references/reference.md#2D蜂窝热力图) |\n| 检索：POI | PoiSearch、searchInCity、searchNearby、searchInBound、PoiDetail | [references/reference](references/reference.md#POI检索) |\n| 检索：地理编码 | GeoCoder、geocode、reverseGeoCode、GeoCodeOption | [references/reference](references/reference.md#地理编码) |\n| 检索：AOI | AoiSearch、requestAoi、polygon | [references/reference](references/reference.md#AOI检索) |\n| 检索：Sug | SuggestionSearch、requestSuggestion | [references/reference](references/reference.md#ref-search-suggestion) |\n| 检索：公交线路 | BusLineSearch、searchBusLine、BUS_LINE、SUBWAY_LINE | [references/reference](references/reference.md#公交信息检索) |\n| 检索：天气 | WeatherSearch、WeatherResult、districtID | [references/reference](references/reference.md#天气服务) |\n| 检索：推荐上车点 | requestRecommendStop、RecommendStopResult | [references/reference](references/reference.md#推荐上车点) |\n| 检索：行政区 | DistrictSearch、searchDistrict、边界、polylines | [references/reference](references/reference.md#检索行政区边界数据) |\n| 检索：建筑物 | BuildingSearch、requestBuilding、3D楼块 | [references/reference](references/reference.md#地图建筑物检索) |\n| 路线：驾车 | RoutePlanSearch、drivingSearch、DrivingRouteResult | [references/reference](references/reference.md#驾车路线规划) |\n| 路线：步行 | walkingSearch、WalkingRouteResult | [references/reference](references/reference.md#步行路线规划) |\n| 路线：骑行 | bikingSearch、BikingRouteResult | [references/reference](references/reference.md#骑行路线规划) |\n| 路线：公交 | transitSearch、masstransitSearch、TransitRouteResult | [references/reference](references/reference.md#公交路线规划) |\n| 导航：步骑行引擎 | BDNaviService、NaviType、NaviMode、initializer、init、unInit | [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md#4-引擎初始化) |\n| 导航：路线规划 | RoutePlanOption、RouteNodeInfo、IRoutePlanListener、RoutePlanError、displayRoutePlanResult | [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md#6-路线规划) |\n| 导航：导航控制 | start、stop、pause、resume、isStart、cancelRoutePlanDisplay、isMultiNaviCreated | [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md#7-导航控制) |\n| 导航：状态监听 | IGuideSubStatusListener、IGuideInfoListener、onRouteFarAway、onArriveDest、onFinalEnd | [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md#8-导航状态监听) |\n| 导航：默认 UI | walkRideDefaultUIPage、walkRideUIPageOption、headerGuideShow、naviETAShow、hitTestBehavior | [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md#9-界面渲染) |\n| 导航：模拟导航 | MockLocationPlugin、setLocationPlugin、resetLocationPlugin、reloadTrack | [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md#7-导航控制) |\n| 导航：语音播报 | ITTSPlugin、playTTSText、setTTsPlugin | [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md#4-引擎初始化) |\n| 工具：距离/面积 | DistanceUtil、AreaUtil、calculateArea、getDistance | [references/reference](references/reference.md#距离和面积计算) |\n| 工具：空间关系 | SpatialRelationUtil、isPolygonContainsPoint、getNearestPointFromLine | [references/reference](references/reference.md#点和其他图形的位置关系) |\n| 工具：坐标转换 | NativeMethods、wgsll2bdll、gcjll2bdll、mc2ll | [references/reference](references/reference.md#坐标转换) |\n| 其他：收藏/分享 | FavoriteManager、ShareUrlSearch、requestRouteShareUrl | [references/reference](references/reference.md#地图收藏夹) / [references/reference](references/reference.md#位置短地址分享) |\n\n### 2. 地图展示与交互（模块：map）\n\n- 引导：\n  - 从 [references/reference](references/reference.md) 查找对应的地图组件、控制器相关示例与用法\n  - 选择合适的地图类型：标准地图、个性化地图、卫星图、自定义瓦片图\n  - 配置基本参数：中心点、缩放级别、旋转、倾斜、罗盘、比例尺、定位按钮等控件\n- 回答中应覆盖：\n  - 如何在鸿蒙页面中引入 `MapComponent`\n  - 如何在 `onReady` 中拿到 `MapController`\n  - 开启/关闭手势交互（缩放、平移、旋转、倾斜等）\n  - 控件显隐与自定义样式的关键配置点（如在文档中有具体字段名，需引用）\n\n### 3. 覆盖物绘制（模块：map）\n\n- 关注以下覆盖物类型（优先在 [references/reference](references/reference.md) 中查找具体接口名）：\n  - Marker 点、点聚合、Marker 动画\n  - 折线（Polyline）、弧线\n  - 多边形/面\n  - 圆\n  - 文本注记\n  - 地面覆盖物、棱柱、3D 建筑物/模型\n  - 气泡/弹框/信息框/信息窗口\n- 回答时的通用模式：\n  - 指出需要通过 `MapController` 提供的方法添加/更新/删除对应覆盖物\n  - 说明必要参数（经纬度、颜色、宽度、透明度、zIndex 等）\n  - 如需复杂样式（自定义 icon），引导查阅在线文档中对应章节（地图覆盖物部分）。\n\n### 4. 检索能力（模块：search）\n\n- 根据需求分类：\n  - POI 检索：普通地点搜索，支持关键字、城市、范围检索\n  - AOI 检索：区域面信息\n  - 室内 POI 检索：购物中心、写字楼内部 POI\n  - 建筑物检索：楼宇信息\n  - 行政区检索：省/市/区划边界数据\n  - 天气检索：实况天气、预报等\n- 回答时应：\n  - 指出需安装 `@bdmap/search` 或组合包\n  - 引导查看 [references/reference](references/reference.md) 的对应接口说明\n  - 说明同步/异步调用模式（根据文档）以及结果回调/Promise 的处理方式\n  - 提醒注意配额限制、错误码处理，可引导查看在线文档「请求状态码说明」。\n\n### 5. 路线规划（模块：@bdmap/map_walkride_search组合包）\n\n- 支持：\n  - 驾车路线规划\n  - 步行路线规划\n  - 骑行路线规划\n  - 公交路线规划\n  - 跨城公交路线规划\n- 回答步骤建议：\n  - 明确需要的出行方式（驾车/步行/骑行/公交）\n  - 提示安装 `@bdmap/search` 以及必要的步行/骑行/公交相关模块或组合包，例如 `@bdmap/map_walkride_search`\n  - 在 [references/reference](references/reference.md) 查找对应 API：\n    - 典型参数：起终点坐标 / 关键字、策略（最短时间、最短距离、避堵等）、途经点等\n  - 在回答中给出：\n    - 如何构造请求参数对象\n    - 如何发起路线规划调用\n    - 如何从返回结果中解析路线、路段、坐标点，并在地图上绘制（配合地图覆盖物功能）。\n\n> **步骑行导航场景**：若需求不仅是路线规划，还涉及**实时导航引导**（导航启停、偏航重算、默认导航 UI、语音播报、模拟导航等），请直接参考第 8 节「步骑行导航能力」和 [步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md)。\n\n### 6. 工具类能力与其他（模块：util / map / search）\n\n- 能力示例：\n  - 距离和面积计算\n  - 点与其他图形的位置关系判断（点是否在多边形内等）\n  - 坐标转换（如与其他坐标系互转）\n  - 调起百度地图客户端相关能力（如在线文档中有说明）\n  - 位置短地址分享、地图收藏夹等\n- 回答方式：\n  - 根据具体需求，指明应使用 [references/reference](references/reference.md) 或在线文档中「工具」「调起百度地图功能」「位置短地址分享」等章节\n  - 简要讲清：\n    - 输入参数含义\n    - 返回值结构\n    - 常见错误和注意事项（如坐标系要求）。\n\n### 7. 定位能力（模块：locsdk / @bdmap/locsdk）\n  本节只给出**关键要点**，完整开发指南请见：[定位 SDK 开发指南](references/guidelines/location-sdk-guide.md)。\n\n  - **适用场景**：前台连续定位、单次定位、后台持续定位、经纬度/地址/POI 获取等。  \n  - **依赖与安装**：统一使用项目约定的 `@bdmap/locsdk` 版本，按指南配置线上/线下依赖并执行 `ohpm install` + 构建自检。  \n  - **隐私与权限（强制）**：先获取用户隐私同意和运行时定位权限，再调用 `LocationClient.setAgreePrivacy(true)`、`LocationClient.checkAuthKey(...)`，并正确声明 `module.json5` 中的定位相关权限与 `backgroundModes`。  \n  - **初始化与使用顺序**：遵循「隐私合规 → AK 鉴权 → 权限申请 → 创建 `LocationClient` → 注册监听 → 配置 `LocationClientOption` → 启动定位」的顺序，页面/业务结束时必须停止定位并注销监听。  \n  - **模式与能力**：根据业务选择连续定位、单次定位、后台定位，并合理设置坐标系、时间/距离间隔、是否返回地址/位置描述/POI 等参数。  \n  - **结果校验与错误处理**：使用前需检查 `isLocSuccess`、坐标非 (0,0)、精度半径合理，并通过 Logger + Toast/状态文本反馈错误原因与解决建议。  \n  - **性能与合规**：对连续/后台定位设置合理频率和结束条件，敏感数据通过 HTTPS 传输并避免在日志中输出精确坐标。\n\n### 8. 步骑行导航能力（模块：@bdmap/map_walkride_search 组合包）\n  本节只给出**关键要点**，完整开发指南请见：[步骑行导航 SDK 开发指南](references/guidelines/walkride-sdk-guide.md)。\n\n  - **适用场景**：步行导航、骑行导航、路线规划结果展示、导航状态监听、默认导航 UI 渲染、模拟导航调试等。\n  - **依赖与安装**：使用组合包 `@bdmap/map_walkride_search`（已包含 base + map + search + util），与独立包不可混用。\n  - **核心类与接口**：\n    - `BDNaviService`：导航服务主入口，通过 `NaviType.WALK` / `NaviType.RIDE` 创建\n    - `RoutePlanOption` + `IRoutePlanListener`：路线规划参数与回调\n    - `IGuideSubStatusListener`：导航状态监听（偏航、接近/到达目的地等）\n    - `IGuideInfoListener`：诱导信息、剩余距离/时间、速度等实时数据\n    - `ITTSPlugin`：语音播报接口\n    - `walkRideDefaultUIPage`：内置导航 UI 组件\n    - `MockLocationPlugin`：模拟定位插件（调试用）\n  - **初始化时序**：`aboutToAppear` 注册 TTS 插件 → `MapComponent.onReady` 获取 MapController → `service.initializer().init(context, mapController)`。\n  - **导航控制**：路线规划成功 → `cancelRoutePlanDisplay()` 清除路线展示 → `lifecycle().start()` 启动导航 → 到达终点后 `lifecycle().stop()` 停止 → 页面销毁时 `initializer().unInit()` 释放引擎。\n  - **默认 UI**：使用 `walkRideDefaultUIPage` 渲染导航界面时，必须设置 `.hitTestBehavior(HitTestMode.None)` 防止拦截底图手势。\n  - **坐标转换**：SDK 使用百度坐标系（BD09ll），外部 WGS84/GCJ-02 数据须通过 `CoordTrans.wgsToBaidu()` / `CoordTrans.gcjToBaidu()` 转换。\n  - **错误处理**：`RoutePlanError` 提供 20+ 种错误码，必须封装用户友好的错误提示，不可仅输出日志。\n\n\n## 回答风格与输出格式要求\n\n在基于本 Skill 回答问题时：\n\n1. **优先使用中文回答**，除非明确要求英文。\n2. **文档检索与工具调用顺序（强制要求）**：\n   - ✅ 当涉及百度地图 HarmonyOS SDK（例如 `@bdmap/map` 覆盖物、信息框/PopView 等能力）时，**必须优先读取本地文档**：\n     - （例如）使用 `read_file` / `grep` 等工具打开并检索：\n       - [references/reference](references/reference.md)\n   - ✅ 只有在本地文档无法覆盖、或发现明显版本差异/缺失时，才使用 `web_search` 查阅在线文档（如 `https://lbsyun.baidu.com/faq/api?title=harmonynextsdk`），并在回答中说明参考来源。\n   - ✅ 回答中引用 API 名称、参数、枚举等时，应以「本地文档 + 官方在线文档」为准，**禁止仅凭记忆或经验臆造 API**。\n   - ❌ 在未阅读本地 [references/reference](references/reference.md) 前，**禁止直接通过在线搜索结果给出具体 API 写法**（例如 PopView 的构造参数、事件枚举名等）。\n3. **回答结构尽量清晰，建议使用如下顺序**：\n   - **场景说明**：先简要说明这是哪个模块/能力（地图展示、检索、路线规划等）。\n   - **依赖与权限**：列出需要安装的 ohpm 包和必需权限。\n   - **关键步骤**：用 3–6 个步骤说明从初始化到接口调用的流程。\n   - **示例代码**：给出尽量简洁的示例（注意不要与本 Skill 说明中的示意代码冲突，应参考项目实际 API 命名）。\n   - **扩展阅读**：给出应查看的本地文档文件（如 [references/reference](references/reference.md) 对应章节）和在线文档章节（如「地图覆盖物」「路线规划」等）。\n4. **构建与编码错误自检（强制要求）**：\n   - 每次完成与百度地图 HarmonyOS SDK 相关的代码改动后，需在工程根目录执行一次 `ohpm install` 与 `hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon` 进行构建与 ArkTSCheck 自检。  \n   - 如构建报错，需根据错误信息回溯并修复本次改动引入的编码问题；若为环境/工具链问题，则在回答中明确区分并给出处理建议。详细流程见：[构建与编码错误自检规范](references/guidelines/build-and-test.md)。\n\n## 资源文件\n- 图像资源：[assets.md](references/assets.md)，生成代码中的图像，优先使用提供的图像资源\n\n## 参考文档\n\n使用本 Skill 时，**始终优先结合本地文档、安装包声明文件和在线官方文档**：\n\n- 本地文档（本项目）：\n  - [references/reference](references/reference.md)：HarmonyNEXT 地图 SDK 使用文档以及参考代码摘要\n- 开发指南（本项目）：\n  - [references/guidelines/walkride-sdk-guide](references/guidelines/walkride-sdk-guide.md)：步骑行导航 SDK 完整开发指南（引擎初始化、路线规划、导航控制、状态监听、默认 UI、模拟导航、TTS、资源释放）\n  - [references/guidelines/location-sdk-guide](references/guidelines/location-sdk-guide.md)：定位 SDK 开发指南\n  - [references/guidelines/package-management](references/guidelines/package-management.md)：包管理互斥规范\n  - [references/guidelines/coding-standards](references/guidelines/coding-standards.md)：代码规范（日志、注释、模块化、图片资源）\n  - [references/guidelines/performance-optimization](references/guidelines/performance-optimization.md)：性能与覆盖物分层规范\n  - [references/guidelines/ui-feedback](references/guidelines/ui-feedback.md)：UI 交互与用户反馈规范\n  - [references/guidelines/map-style-guide](references/guidelines/map-style-guide.md)：地图样式与视觉规范\n  - [references/guidelines/build-and-test](references/guidelines/build-and-test.md)：构建与编码错误自检规范\n- 安装包声明文件：\n  - 前置条件，检查`entry/oh-package.json5`中的引用是否已经安装，如果未安装，则需要通过`ohpm install`安装，记录下包名版本号\n  - 查声明文件中的 class/接口名：\n    用 grep（或 IDE 全局搜索）搜：\"class MapOptions\"，范围限制到 oh_modules/@bdmap/map/src/main/ets/。\n  - 不确定具体路径时,统一推荐走 @bdmap/xxx/Index.d.ets → 目标 .d.ets 这条路径，不要直接在大量混淆文件里乱翻:\n    - 首先检索当前工程的`oh_modules/.ohpm/@bdmap+包名@版本号`，找到目录\n    - 然后，继续往下查找`oh_modules/@bdmap/包名/Index.d.ets`文件\n    - 最后，从`Index.d.ets`文件中内部搜索类型名，查看定义\n    - (举例)查找 `{MapController} from '@bdmap/map'`的`MapController`定义，定位到当前工程中的`oh_modules/.ohpm/@bdmap+map@2.0.3/oh_modules/@bdmap/map/Index.d.ets`文件，查到`MapController`是`Index.d.ets`的相对路径`./src/main/ets/lbsmapsdk/e/g`，则通过`oh_modules/.ohpm/@bdmap+map@2.0.3/oh_modules/@bdmap/map/src/main/ets/lbsmapsdk/e/g.d.ets`文件，即可找到`MapController`的定义;\n- 在线官方文档（需要更详细 API、枚举、参数说明时查阅）：\n  - HarmonyNEXT 地图 SDK 概述与开发指南：`https://lbsyun.baidu.com/faq/api?title=harmonynextsdk`\n\n当本地文档与在线文档存在差异时，以**在线官方文档**为准，但要在回答中说明参考了哪一类文档。\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn778b6bf766ym71fdvrc5yvg98319rv\",\n  \"slug\": \"baidu-map-harmonyos-sdk\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1775534846451\n}\n\nFile v1.0.2:references/assets.md\n\n# 图片资源\n\n**边界**：技能内 `assets/images/` 图片及用途，**必须**需要将需要使用的图像资源拷贝到项目模块（module）资源文件目录（resources）下的rawfile文件夹中，如果无满足要求应用场景的图像资源，则通过生成svg图像资源形式提供使用。\n\n| 图片 | 用途 |\n|------|------|\n| icon_car | 小车 marker |\n| car_triangle | 带方向小车（车头朝上） |\n| track_car | 带方向小车（车头朝右），**轨迹动画推荐** |\n| icon_start | （位置点）起点标注 |\n| icon_end | （位置点）终点标注 |\n| icon_via | （位置点）途经点 |\n| traffic_texture_* | （线）路况纹理，蚯蚓线纹理 |\n| bg_* |（背景图）气泡、信息框背景图，**名称包含相对点的Located** （lb代表右侧上；lt代表右侧下），如果未能识别相对Marker或者Label覆盖物的的Located（方向），则优先使用bg_middle.png|\n｜transparent.png｜（位置点）占位图标**透明图**可配合气泡、信息框实现无点覆盖物图标的效果｜\n\n## 背景图 .9 拉伸参数指导\n\n下表给出常用气泡背景图的推荐 `.9` 拉伸参数，便于在 `setBackground(image, { scaleX, scaleY, fillArea })` 中直接使用（可根据实际视觉效果微调）：\n\n| name | scaleX | scaleY | fillArea | 说明 |\n|------|--------|--------|----------|------|\n| bg_middle.png | [50, 95] | [25, 50] | [50, 95, 25, 50] | 中间气泡，适合不关心相对 Marker 方向时的通用信息框 |\n| bg_lb.png | [70, 220] | [35, 80] | [70, 220, 35, 80] | 左下带三角的对话气泡，三角在左下，拉伸区域避开三角和边框阴影。设置方位锚点为`SysEnum.Located.RIGHT_TOP`。 |\n| bg_lt.png | [70, 220] | [30, 75] | [70, 220, 30, 75] | 左上带三角的对话气泡，三角在左上，拉伸区域避开三角和边框阴影。设置方位锚点为`SysEnum.Located.RIGHT_BOTTOM`。 |\n\nFile v1.0.2:references/guidelines/build-and-test.md\n\n## 构建与编码错误自检规范（Auto Run）\n\n本文件从 `SKILL.md` 的「构建与编码错误自检」章节抽取而来，用于规范与百度地图 HarmonyOS SDK 相关改动的构建流程。\n\n### 1. 适用范围（强制）\n\n每次在本仓库内**完成任意与百度地图 HarmonyOS SDK 相关的代码改动后（尤其是在提交 / 合并前）**，都需要执行一次构建自检流程。\n\n### 2. Auto Run 构建流程\n\n在工程根目录（例如 Harmony 应用根目录）执行：\n\n1. 安装依赖：\n\n```bash\nohpm install\n```\n\n2. 执行构建与 ArkTSCheck：\n\n```bash\nhvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon\n```\n\n> 提示：在 CI 中建议将以上命令作为固定步骤，保证所有与地图相关的改动都经过同样的构建校验。\n\n### 3. 对构建失败的处理要求\n\n#### 3.1 编码错误（必须修复）\n\n若构建命令报告**编译 / 语法 / 类型检查等编码错误**（例如 ArkTS 语法错误、类型不匹配、缺少符号等），开发者或代理必须：\n\n- 根据错误信息主动回溯到本次改动的相关文件和代码位置；\n- 对代码进行修正，而不是仅给出文字说明；\n- 再次执行同样的构建命令，直至与本次改动相关的编码错误被消除；\n- 在对外说明中明确标注「已按 auto run 规范完成一次构建并修复由本次修改引入的错误」。\n\n#### 3.2 环境 / 工具链问题\n\n若构建失败的原因属于**环境 / 工具链问题**（例如 Hvigor 版本与 `modelVersion` 不匹配、SDK 安装不完整、网络异常导致依赖无法下载等），则应：\n\n- 在说明中**明确区分**这是环境问题而非编码问题；\n- 原样展示或概述关键错误信息（如「Unsupported modelVersion of Hvigor 6.0.0. The supported Hvigor modelVersion is 5.0.4」）；\n- 提示需要在本地或 CI 环境中调整 Hvigor 版本、SDK 或网络环境后重新尝试构建。\n\n### 4. 无法在当前环境执行构建时\n\n在某些无法实际执行上述命令的场景（例如当前运行环境不支持 Hvigor 或 ohpm）下，开发者或代理需要：\n\n- 在文档或回答中**显式提示**：需要在本地工程目录手动执行 `ohpm install` 与 `hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon`；\n- 将本地构建是否通过作为本次修改是否可用的最终判定依据。\n\nFile v1.0.2:references/guidelines/coding-standards.md\n\n## Baidu Map HarmonyOS SDK 代码规范\n\n本文件补充 `SKILL.md` 中的「强制要求」部分，对日志、注释、模块化以及图片资源使用做出更细致的约定。\n\n### 1. 日志输出规范（Logger）\n\n- **统一入口**\n  - 必须使用统一的 `Logger` 工具类封装原生 `console`。\n  - 第一个参数固定使用场景名：`\"SportHealthMap\"`。\n  - 第二个参数统一使用 `string | object`，推荐直接传入对象，由 `Logger` 负责 JSON 序列化。\n- **禁止行为**\n  - 禁止在业务代码中直接调用 `console.info / console.error / console.warn / console.debug`。\n  - 禁止输出包含敏感信息（如完整经纬度、appIdentifier 等）的明文日志，上线前需脱敏。\n\n示例（推荐写法）：\n\n```ts\n// ✅ 推荐：统一使用 Logger，输出结构化 JSON\nLogger.info('SportHealthMap', {\n  action: 'mapReady',\n  mapType: 'normal',\n  sdkVersion: '2.0.3'\n});\n\n// ❌ 禁止：直接使用 console\nconsole.info('map ready');\n```\n\n> 提示：在回答中给出示例代码时，同样应遵守以上规范，避免出现直接使用 `console` 的示例。\n\n### 2. 代码注释规范\n\n- **必须注释的内容**\n  - 关键业务方法（例如初始化 SDK、发起路线规划、创建地图覆盖物）。\n  - 非直观的参数或返回值含义。\n  - 对性能、内存或安全有重要影响的逻辑。\n- **注释风格**\n  - 使用简洁的中文说明，必要时补充英文术语。\n  - 避免无意义注释（如 `// 调用接口`）。\n  - 建议使用 JSDoc/TS 注释格式，让 IDE 能展示提示。\n\n示例：\n\n```ts\n/**\n * 初始化百度地图 SDK。\n * @param context Ability 上下文，用于创建 MapComponent 和 LocationClient。\n * @param ak 百度地图开放平台申请到的 AK，不应硬编码在代码中。\n */\ninitBaiduMapSdk(context: common.UIAbilityContext, ak: string): void {\n  // ...\n}\n```\n\n### 3. 模块化规范\n\n- **必须模块化的内容**\n  - 通用工具类：如 Logger、权限助手、坐标转换工具等。\n  - 可复用的 UI 组件：如轨迹回放控制条、地图状态面板等。\n  - 与具体页面解耦的业务能力：如路线规划服务、定位服务封装等。\n- **禁止行为**\n  - 禁止在页面组件内部内联定义通用类（如在单个页面里定义 `class Logger` 或大段工具方法）。\n  - 禁止在多个页面拷贝粘贴相同逻辑而不抽取公共模块。\n\n建议结构示例：\n\n```text\nentry/src/main/ets/\n  common/\n    Logger.ts\n    PermissionHelper.ts\n    CoordinateUtil.ts\n  service/\n    RoutePlanService.ts\n    LocationService.ts\n  feature/\n    track/\n      TrackPlayer.ts\n```\n\n### 4. 图片资源使用规范\n\n本 Skill 提供了一套约定好的图片资源，位于仓库内 `references/assets.md` 与 `references/assets/images/` 目录，用于轨迹、路况、起终点等常见场景。\n\n- **命名与用途约定**\n  - 轨迹小车优先使用：`track_car@2x.png` / `track_car@3x.png`。\n  - 路况线条优先使用：`traffic_texture_*` 系列纹理。\n  - 起点终点图标：`icon_start@*x.png` / `icon_end@*x.png`。\n  - 当前位置：`location@*x.png`。\n- **拷贝与引用要求（强制）**\n  - 需要将本仓库的图片文件**主动拷贝**到当前 HarmonyOS 工程的模块资源目录：\n    - 通用示例：`entry/src/main/resources/rawfile/`\n    - 或业务模块下：`<module>/src/main/resources/rawfile/`\n  - 在代码中通过 `rawfile://` 形式引用，例如：\n\n```ts\n// 将 track_car@2x.png 拷贝到 resources/rawfile/ 后\nconst carImage = new ImageEntity('rawfile://track_car@2x.png');\n```\n\n- **回答时的提醒要求**\n  - 当示例代码中使用到图片时，必须在文字说明中提醒：\n    - 需要从本仓库的 `assets/images/` 目录**主动拷贝**到工程的 `resources/rawfile/`。\n    - 若未拷贝，运行时地图覆盖物会因为找不到资源而不显示或报错。\n\nFile v1.0.2:references/guidelines/location-sdk-guide.md\n\n## Baidu HarmonyOS NEXT 定位 SDK 开发指南（@bdmap/locsdk）\n\n本指南整合了 `SKILL.md` 中关于定位能力（模块：locsdk / `@bdmap/locsdk`）的详细规范，用于实现基础 / 单次 / 后台定位，以及经纬度 / 地址 / POI 等位置信息获取。\n\n> 使用本指南时，需同时遵守 `SKILL.md` 中的「日志 / 注释 / 模块化 / 用户反馈 / 构建检查」等强制要求。\n\n---\n\n### 1. 使用场景与依赖\n\n典型使用场景：\n\n- 前台连续定位（实时位置展示、轨迹采集）\n- 单次定位（位置打点、选择当前地址）\n- 后台持续定位（安全守护、行程跟踪）\n- 获取经纬度 + 精度、地址信息、位置描述、周边 POI\n\n典型触发定位能力业务流程\n    ↓\n① 隐私协议弹窗 → 不同意 → 提示并阻断\n    ↓ 同意\n② 申请定位权限 → 拒绝 → 弹出引导弹窗（前往设置）\n    ↓ 授予              ↓ UI显示「申请定位权限」按钮（支持重试）\n③ 启动定位\n\n依赖安装方式：\n\n- 线下引用（推荐在无外网或内网环境）：\n  - 将官网下载的 `locsdk.har` 放到 `entry/libs` 目录；\n  - 在 `entry/oh-package.json5` 中配置：\n\n```json\n\"dependencies\": {\n  \"@bdmap/locsdk\": \"file:libs/locsdk.har\"\n}\n```\n\n- 线上引用（常规环境）：\n\n```json\n\"dependencies\": {\n  \"@bdmap/locsdk\": \"1.1.7\"\n}\n```\n\n规范要求：\n\n- 团队在一个工程内统一 `@bdmap/locsdk` 版本号，避免多模块间版本不一致；\n- 依赖安装后，必须在项目根目录执行 `ohpm install` 与构建命令进行自检（见「构建与编码错误自检规范」）。\n\n强制要求：\n- 使用 `@bdmap/locsdk` 的 `LocationClient` 进行设备定位时，**必须严格遵循以下初始化顺序和校验规范**，否则极易出现\"定位回调无数据\"、\"坐标始终为 (0,0)\"、\"定位结果不准确\"等难以排查的问题。\n- 初始化三步骤（必须按顺序执行，缺一不可）\n  **Step 1 — 隐私合规声明**（推荐通过用户隐私协议弹窗形式）：\n  ```typescript\n  LocationClient.setAgreePrivacy(true);\n  ```\n  必须在用户同意隐私政策后调用。若遗漏，SDK 内部鉴权流程不会启动，定位回调永远不触发。\n\n  **Step 2 — AK 鉴权校验**（在同意隐私政策后中紧接执行）：\n  ```typescript\n  LocationClient.checkAuthKey(BAIDU_MAP_AK, this.context, (authResult: string): void => {\n    Logger.info('SportHealthMap', JSON.stringify({ action: 'locSdkAuthKey', result: authResult }));\n  });\n  ```\n  鉴权失败时定位 SDK 会静默返回无效坐标（如 `0, 0`），**不会抛异常**，极难排查。建议在回调中记录鉴权结果，便于定位问题。\n\n  **Step 3 — 等待运行时权限授予后再启动定位**（在页面级执行）：\n  ```typescript\n  private async startLocation(): Promise<void> {\n    const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;\n    const granted: boolean = await PermissionHelper.checkAndRequestLocationPermissions(context);\n    if (!granted) {\n      // 提示用户并返回，不启动 LocationClient\n      return;\n    }\n    // 权限已授予，安全启动定位\n    this.locationClient = new LocationClient(context);\n    // ... 注册监听器、配置参数、start()\n  }\n  ```\n\n  **常见竞态错误**：权限申请是异步的（弹窗等待用户操作），但地图 `onReady` 回调可能在权限弹窗响应之前就触发。如果在 `onReady` 中直接 `new LocationClient().start()` 而不 `await` 权限结果，定位会在权限未授予的状态下启动，导致静默失败。\n- 定位结果有效性校验（强制要求）\n  **禁止直接使用 `getLatitude()`/`getLongitude()` 的返回值**，必须先校验定位是否成功：\n\n  ```typescript\n  onReceiveLocation(bdLocation: BDLocation): void {\n    // ① 校验定位是否成功\n    if (!bdLocation.isLocSuccess()) {\n      const locType: number = bdLocation.getLocType();\n      const desc: string = bdLocation.getLocTypeDescription() ?? 'unknown';\n      Logger.warn('SportHealthMap', JSON.stringify({\n        action: 'locResult', success: false, locType: locType, desc: desc\n      }));\n      return;  // 不处理失败结果\n    }\n\n    // ② 校验坐标有效性（排除 0,0 无效坐标）\n    const lat: number = bdLocation.getLatitude();\n    const lng: number = bdLocation.getLongitude();\n    if (lat === 0 && lng === 0) {\n      Logger.warn('SportHealthMap', JSON.stringify({ action: 'locResult', reason: 'invalidCoords' }));\n      return;\n    }\n\n    // ③ 校验精度半径（可选：超过阈值提示用户）\n    const radius: number = bdLocation.getRadius();\n    if (radius > 500) {\n      Logger.warn('SportHealthMap', JSON.stringify({ action: 'locResult', radius: radius, reason: 'lowAccuracy' }));\n      // 根据业务需求决定是否使用该结果\n    }\n\n    // ④ 安全使用定位结果\n    const addr: string = bdLocation.getAddrStr() ?? '未知地址';\n    // ... 业务逻辑\n  }\n  ```\n\n---\n\n### 2. 隐私合规与 AK 鉴权\n\n#### 2.1 隐私合规（强制）\n\n- 在任何定位 API 调用前，必须先确保用户已阅读并同意隐私政策；\n- 必须在代码中显式将隐私同意结果通知给定位 SDK：\n\n```ts\nLocationClient.setAgreePrivacy(true); // 用户明确同意后才能为 true\n```\n\n- 用户未同意或拒绝时：\n  - 必须设置为 `false`；\n  - 禁止继续调用任何定位接口。\n\n#### 2.2 权限与 AbilityKit\n\n- 使用定位 SDK 前，必须通过 `@kit.AbilityKit` 获取定位相关运行时权限，推荐统一封装权限助手（如 `LocationPermissionHelper`）：\n\n```ts\nimport { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit';\n\nconst LOCATION_PERMISSIONS: Permissions[] = [\n  'ohos.permission.LOCATION',\n  'ohos.permission.APPROXIMATELY_LOCATION'\n];\n```\n- 权限拒绝后的引导 — 被拒绝时引导用户去系统设置手动开启\n\n示例代码\n```ts\n promptAction.showDialog({\n    title: '需要定位权限',\n    message: 'xxx需要定位权限才能获取xxx的实时位置。\\n\\n'\n      + '请前往「设置 > 应用管理 > 应用名称 > 权限」中开启位置权限。',\n    buttons: [\n      { text: '暂不开启', color: '#888888' },\n      { text: '前往设置', color: '#0288D1' }\n    ]\n  }).then((result) => {\n    if (result.index === 1) {\n      // 跳转到应用设置页面\n      // 调用封装的context.startAbility方法\n    } else {\n      Logger.log('SportHealthMap', 'user dismissed permission denied dialog');\n    }\n  }).catch((err: Error) => {\n    Logger.error('SportHealthMap', `permissionDeniedDialog error: ${String(err)}`);\n  });\n```\n- 页面上的权限状态展示 — 让用户清楚看到当前权限状态\n\n规范要求：\n\n- `Permissions` 类型必须从 `@kit.AbilityKit` 正确导入，禁止本地声明 `type Permissions = string`；\n- 对 hvigor / ArkTS 编译期报错（如找不到 `@kit.AbilityKit` 类型声明），优先检查工程 SDK 版本与导入路径（应为 `@kit.*` 新范式）。\n\n#### 2.3 定位 SDK 鉴权（AK 校验）\n\n在首次使用定位能力前（通常在应用初始化阶段），调用：\n\n```ts\nLocationClient.checkAuthKey(BAIDU_MAP_AK, this.context, (result: string) => {\n  console.debug('Baidu Location SDK auth result = ' + result);\n});\n```\n\n规范建议：\n\n- AK 需通过安全配置管理（如配置文件、服务端下发等），禁止直接写入公开仓库；\n- 对鉴权失败结果需要有用户可感知的提示和降级处理（可通过 Toast + 状态文本），并结合 Logger 输出内部日志。\n\n---\n\n### 3. 权限与 appIdentifier 配置\n\n#### 3.1 module.json5 中的定位权限\n\n按需声明定位相关权限（根据业务选择最小集）：\n\n```json\n\"requestPermissions\": [\n  {\n    \"name\": \"ohos.permission.LOCATION\",\n    \"reason\": \"$string:permission_location_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"inuse\"\n    }\n  },\n  {\n    \"name\": \"ohos.permission.LOCATION_IN_BACKGROUND\",\n    \"reason\": \"$string:permission_location_background_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"always\"\n    }\n  },\n  {\n    \"name\": \"ohos.permission.APPROXIMATELY_LOCATION\",\n    \"reason\": \"$string:permission_approx_location_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"inuse\"\n    }\n  },\n  {\n    \"name\": \"ohos.permission.APP_TRACKING_CONSENT\",\n    \"reason\": \"$string:permission_app_tracking_consent_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"always\"\n    }\n  },\n  {\n    \"name\": \"ohos.permission.GET_WIFI_INFO\",\n    \"reason\": \"$string:permission_get_wifi_info_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"inuse\"\n    }\n  },\n  {\n    \"name\": \"ohos.permission.GET_NETWORK_INFO\",\n    \"reason\": \"$string:permission_get_network_info_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"inuse\"\n    }\n  },\n  {\n    \"name\": \"ohos.permission.INTERNET\",\n    \"reason\": \"$string:permission_internet_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"always\"\n    }\n  },\n  {\n    \"name\": \"ohos.permission.KEEP_BACKGROUND_RUNNING\",\n    \"reason\": \"$string:permission_keep_background_running_reason\",\n    \"usedScene\": {\n      \"abilities\": [\"EntryAbility\"],\n      \"when\": \"always\"\n    }\n  }\n]\n```\n\n#### 3.2 获取 appIdentifier（可选）\n\n仅在真机环境有效，用于安全校验等场景：\n\n```ts\npublic getBundleAppIdentifier() {\n  let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;\n  try {\n    return bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {\n      const appIdentifier = data.signatureInfo.appIdentifier;\n      console.info('getBundleAppIdentifier successfully. Data: ' + appIdentifier);\n    }).catch((error: Error) => {\n      console.error('getBundleAppIdentifier failed. Cause: ' + error.message);\n    });\n  } catch (error) {\n    console.error('getBundleAppIdentifier failed:' + (error as Error).message);\n  }\n}\n```\n\n规范建议：\n\n- 只在必要时将 `appIdentifier` 上传服务端，并通过 HTTPS 传输；\n- 敏感标识不在控制台日志、埋点中明文输出，上线前注意脱敏或移除。\n\n---\n\n### 4. 定位客户端初始化与监听模式\n\n#### 4.1 推荐初始化顺序（强制）\n\n使用 `LocationClient` 进行定位时，必须严格遵循以下顺序：\n\n1. 在用户同意隐私政策后调用 `LocationClient.setAgreePrivacy(true)`；\n2. 在 `EntryAbility.onCreate` 中调用 `LocationClient.checkAuthKey(...)` 完成 AK 鉴权；\n3. 在页面级代码中，等待运行时权限授予后再创建 `LocationClient` 并启动定位。\n\n示例（权限检查与启动）：\n\n```ts\nprivate async startLocation(): Promise<void> {\n  const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;\n  const granted: boolean = await PermissionHelper.checkAndRequestLocationPermissions(context);\n  if (!granted) {\n    // 提示用户并返回，不启动 LocationClient\n    return;\n  }\n  // 权限已授予，安全启动定位\n  this.locationClient = new LocationClient(context);\n  // ... 注册监听器、配置参数、start()\n}\n```\n\n> 常见错误：在地图 `onReady` 回调中直接 `new LocationClient().start()` 而未等待权限结果，导致定位在权限未授予时静默失败。\n\n#### 4.2 监听模式\n\n推荐做法：\n\n- 按页面/业务生命周期管理 `LocationClient`，避免频繁 `new`；\n- 使用自定义 `BDLocationListener` 统一处理定位结果，通过状态管理或事件分发传递到各页面。\n\n示例（简化版）：\n\n```ts\nclass MyLocationListener extends BDLocationListener {\n  onReceiveLocation(bdLocation: BDLocation): void {\n    const longitude: number = bdLocation.getLongitude();\n    const latitude: number = bdLocation.getLatitude();\n    const radius: number = bdLocation.getRadius();\n    // TODO: 分发给 UI / 数据层，并结合 Logger + Toast 提示定位状态\n  }\n}\n```\n\n规范要求：\n\n- 页面销毁或业务结束时，必须停止定位并注销监听（若 SDK 提供对应接口需调用）；\n- 定位状态变化需通过 Toast + 页面状态文本反馈给用户，不得只打日志。\n\n---\n\n### 5. 单次定位使用规范\n\n使用场景：\n\n- 用户主动触发的「获取当前位置」按钮；\n- 地址选择 / 打点等只需一次性坐标的场景。\n\n基本调用模式：\n\n```ts\nsingleLocation() {\n  let locClient: LocationClient | null = null;\n  try {\n    locClient = new LocationClient(this.context);\n  } catch (error) {\n    return;\n  }\n  if (!locClient) {\n    return;\n  }\n\n  const listener: MyLocationListener = new MyLocationListener();\n  locClient.registerListener(listener);\n\n  const option = new LocationClientOption();\n  option.setCoorType('gcj02');\n  option.setIsNeedAddress(true);\n  option.setIsNeedLocationDescribe(true);\n  option.setIsNeedLocationPoiList(true);\n  option.setLocationMode(LocationMode.High_Accuracy);\n\n  locClient.setLocOption(option);\n  locClient.requestSingleLocation(); // 触发单次定位\n}\n```\n\n规范建议：\n\n- 对频繁点击「定位一次」的场景做防抖/节流，避免短时间内多次请求；\n- 单次定位完成后可按需复用 / 释放 `LocationClient`，避免泄漏。\n\n---\n\n### 6. 后台持续定位规范\n\n使用场景：\n\n- 儿童安全守护、行程轨迹记录等需要长时间持续位置更新的业务。\n\n前置条件：\n\n- 已获取后台定位和长时任务权限，并在 UI 明确说明用途；\n- 在 `module.json5` 的 `abilities` 配置中加入：\n\n```json\n\"backgroundModes\": [\"location\"]\n```\n\n启动后台定位示例（简化）：\n\n```ts\nconst wantAgentInfo: wantAgent.WantAgentInfo = {\n  wants: [\n    {\n      bundleName: '您的包名',\n      abilityName: '您的Ability名'\n    }\n  ],\n  operationType: wantAgent.OperationType.START_ABILITY,\n  requestCode: 0,\n  wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]\n};\n\nwantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {\n  if (this.client != null) {\n    this.client.enableLocInBackground(wantAgentObj);\n  }\n});\n```\n\n关闭后台定位：\n\n```ts\nif (this.client != null) {\n  this.client.disableLocInBackground();\n}\n```\n\n规范要求：\n\n- 后台定位必须有明确的结束条件（如守护任务结束、超时等），禁止无限期运行；\n- 用户可在设置页显式关闭后台定位，并在关闭时同步调用 `disableLocInBackground`；\n- 业务逻辑要对前台 / 后台状态切换进行处理（如降低频率、合并上报）。\n\n---\n\n### 7. 坐标系、经纬度与精度\n\n#### 7.1 坐标系支持\n\n- `gcj02`：国测局坐标（默认）；\n- `bd09ll`：百度经纬度坐标（在百度地图上标注时推荐）；\n- `bd09`：百度墨卡托坐标。\n\n配置示例：\n\n```ts\nconst option = new LocationClientOption();\noption.setCoorType('bd09ll'); // 在百度地图展示时推荐\n```\n\n解析位置：\n\n```ts\nconst longitude: number = bdLocation.getLongitude();\nconst latitude: number = bdLocation.getLatitude();\nconst radius: number = bdLocation.getRadius(); // 定位精度（米）\nconst coorType: string = bdLocation.getCoorType();\n```\n\n规范建议：\n\n- 工程内统一约定主用坐标系（例如地图展示统一使用 `bd09ll`），避免混用；\n- 对精度较大的定位结果（radius 过大）在界面和业务上做降级处理，如提示“定位不精确，请稍后重试”。\n\n---\n\n### 8. 地址、位置描述与周边 POI\n\n地址信息（需显式开启）：\n\n```ts\nconst option = new LocationClientOption();\noption.setIsNeedAddress(true);\n```\n\n在回调中获取：\n\n```ts\nconst addr: string | null = bdLocation.getAddrStr();\nconst country: string | null = bdLocation.getCountry();\nconst province: string | null = bdLocation.getProvince();\nconst city: string | null = bdLocation.getCity();\nconst district: string | null = bdLocation.getDistrict();\nconst street: string | null = bdLocation.getStreet();\nconst adcode: string | null = bdLocation.getAdCode();\nconst town: string | null = bdLocation.getTown();\n```\n\n位置描述（需显式开启）：\n\n```ts\noption.setIsNeedLocationDescribe(true);\nconst locationDescribe: string | null = bdLocation.getLocationDescribe();\n```\n\n周边 POI（需显式开启）：\n\n```ts\noption.setIsNeedLocationPoiList(true);\n\nconst poi: Poi | undefined = bdLocation.getPoiList().pop();\nif (poi) {\n  const poiName: string = poi.getName();\n  const poiTags: string = poi.getTags();\n  const poiAddr: string = poi.getAddr();\n}\n\nconst poiRegion: PoiRegion | null = bdLocation.getPoiRegion();\nif (poiRegion != null) {\n  const poiDirectionDesc: string = poiRegion.getDirectionDesc();\n  const poiRegionName: string = poiRegion.getName();\n  const poiRegionTags: string = poiRegion.getTags();\n}\n```\n\n规范要求：\n\n- 各字段可能为空，业务逻辑中必须进行空值和长度判断；\n- POI 列表数量可能较多，需在前端或服务端做数量 / 频率控制；\n- 对 POI 类型（`tags`）可在产品层面进行归类统一展示。\n\n---\n\n### 9. 错误处理、性能与合规要求\n\n- 错误处理：\n  - 对 `LocationClient` 初始化失败、权限不足、定位失败、网络异常等情况，必须：\n    - 使用 Logger 记录内部错误详情（`action` + `error` 对象）；\n    - 使用 Toast / 状态文本给出用户可理解的错误原因和解决建议；\n    - 区分「编码问题」与「环境问题」，编码问题需要修复后重新执行构建命令。\n- 性能与功耗：\n  - 对连续定位合理设置时间 / 距离间隔，避免高频请求导致耗电过快；\n  - 后台定位需设置最大持续时长或依据业务状态自动停止。\n- 安全与隐私：\n  - 经纬度 / 地址 / POI 等均视为敏感信息，传输必须通过 HTTPS；\n  - 日志 / 埋点中避免输出用户具体坐标，必要时做精度裁剪或模糊化；\n  - 应用设置中需提供显式定位开关和后台定位开关，用户可随时撤销授权。\n\nFile v1.0.2:references/guidelines/map-style-guide.md\n\n## 地图样式与视觉规范（Map Style Guideline）\n\n> 目标：在使用百度地图 HarmonyOS SDK（`@bdmap/map` 等）时，统一标注点、路线、面、文本等地图元素的**视觉样式与锚点约定**，保证不同业务页面风格一致、信息层级清晰，可读性与美观兼顾。  \n> 本文为**样式规范文档**，与性能/交互规范配合使用：\n> - 性能与覆盖物分层规范：`performance-optimization.md`\n> - 地图 UI 交互与用户反馈规范：`ui-feedback.md`\n\n---\n\n## 1. 点标注（Marker）图标与锚点规范\n\n### 1.1 Located 枚举语义说明（重要）\n\n> **Agent 必读**：`SysEnum.Located` 的语义是描述**图标整体相对于坐标点的位置方向**，而非图标的哪条边对齐坐标。这与常见 UI 框架中 anchor/gravity 的含义**相反**，极易混淆，生成代码时务必参照本节。\n\n百度地图 SDK 中 `SysEnum.Located` 的含义如下：\n\n| 枚举值 | 语义 | 图标与坐标点的位置关系 | 图标哪条边对齐坐标点 |\n|---|---|---|---|\n| `Located.TOP` | 图标位于坐标点**上方** | 图标在坐标点的上面 | 图标**底边中点**对齐坐标 |\n| `Located.BOTTOM` | 图标位于坐标点**下方** | 图标在坐标点的下面 | 图标**顶边中点**对齐坐标 |\n| `Located.CENTER` | 图标**中心**对齐坐标点 | 图标中心在坐标点上 | 图标**几何中心**对齐坐标 |\n| `Located.LEFT` | 图标位于坐标点**左侧** | 图标在坐标点的左边 | 图标**右边中点**对齐坐标 |\n| `Located.RIGHT` | 图标位于坐标点**右侧** | 图标在坐标点的右边 | 图标**左边中点**对齐坐标 |\n\n**图示说明**（`●` 表示地理坐标点）：\n\n```\nLocated.TOP           Located.CENTER        Located.BOTTOM\n\n   ╭──╮                                        ● ← 坐标点\n   │  │                   ╭──╮                 ╭──╮\n   │  │                   │ ●│ ← 坐标点        │  │\n   ╰─┬╯                   ╰──╯                 ╰──╯\n     ● ← 坐标点\n```\n\n**关键记忆口诀**：`Located` 的值表示”图标在坐标点的哪个方向”——`TOP` 表示图标在上、坐标在下，所以图标底边对齐坐标点。\n\n### 1.2 锚点通用约定\n\n- **非圆形图标（带尖角/底边）**\n  - **默认锚点：`SysEnum.Located.TOP`**\n    - 图标整体在坐标点上方，底边中点对齐坐标，尖角/底边精准落在地理位置上。\n    - 适用场景：定位点、POI 标注、起终点标记、针状/水滴图标等。\n\n- **圆形图标 / 正方形图标**\n  - **默认锚点：`SysEnum.Located.CENTER`**\n    - 图标中心与实际经纬度对齐。\n    - 适用场景：轨迹节点、兴趣点聚合圆点、状态指示点等。\n\n- **带 PopView 的 Marker**\n  - 当 Marker 需要在上方附加信息气泡（PopView）时，Marker 自身通常使用 `Located.BOTTOM`，使 Marker 图标在坐标点下方，PopView 通过 `setLocated(Located.TOP)` 显示在 Marker 上方。\n\n- **其他特殊需求**\n  - 若图标视觉重心明显上移（如带大图标 + 小尖角），可根据具体需求调整锚点，保证「视觉重心」落在真实经纬度附近；但必须在代码注释中**说明原因**。\n  - 对于需要「悬浮在地面上方」的图标（如气泡阴影、弹窗箭头），可以在 yOffset 方向上设置小于 0 的像素值（例如 `-20`），让图标稍微”抬起”。\n\n### 1.3 常见业务场景锚点示例\n\n- **用户当前位置 / 定位点（非圆形水滴图标）**\n  - 图标：水滴或针形图标，底部有尖角。\n  - 锚点：`SysEnum.Located.TOP` —— 图标在坐标上方，尖角（底边）指向真实位置。\n\n- **兴趣点（POI）圆点**\n  - 图标：纯色圆点 / 圆环。\n  - 锚点：`SysEnum.Located.CENTER` —— 圆心对应真实位置。\n\n- **起点 / 终点 / 途经点（带底边的方形或图标卡片）**\n  - 图标：下边缘为直线的矩形。\n  - 锚点：`SysEnum.Located.TOP` —— 图标在坐标上方，下边中点落在道路或位置上。\n\n- **聚合点（Cluster）**\n  - 图标：数字圆点或圆形徽章。\n  - 锚点：`SysEnum.Located.CENTER`，保证数字居中。\n\n- **带信息气泡的 Marker**\n  - Marker 锚点：`SysEnum.Located.BOTTOM`（图标在坐标下方）。\n  - PopView 锚点：`popView.setLocated(SysEnum.Located.TOP)`（气泡在 Marker 上方）。  \n\n---\n\n## 2. 路线与线条样式规范\n\n### 2.1 路线规划线（导航/路径）\n\n- **基础规则**  \n  - 默认使用**单纹理**线条表达路线（如纯色或渐变色纹理），保证清晰、简洁。  \n  - 线宽：根据分辨率与缩放级别，一般在 **8-16px** 之间，需在实现中与 UI 设计统一。  \n\n- **拥堵 / 通畅状态表达（多纹理）**  \n  - 当需要表达「拥挤/畅通」等实时路况时，采用**多纹理**（Multi-Texture）线条：  \n    - 绿色：通畅  \n    - 黄色：缓行  \n    - 红色：拥堵  \n    - 深红/紫色：严重拥堵  \n  - 各纹理段之间应平滑过渡，避免频繁颜色跳变造成视觉噪音。  \n\n- **主路线 vs 备选路线**  \n  - 主路线：  \n    - 颜色：高饱和主色（如品牌蓝/绿色），不透明度 80%–100%。  \n    - 线宽：略宽（如 12-16px），以突出主路线。  \n  - 备选路线：  \n    - 颜色：同色系低饱和或灰色，透明度 40%–60%。  \n    - 线宽：略细（如 8-12px）。  \n\n### 2.2 轨迹线（历史轨迹 / 运动记录）\n\n- 颜色：与业务品牌色一致的中等饱和色，如蓝/绿。  \n- 线宽：比路线规划线略细，强调辅信息属性。  \n- 若需要方向感，可使用**箭头纹理**或在关键点增加小箭头 Marker。  \n\n### 2.3 行政边界 / 功能区线条\n\n- 省 / 市 / 区边界：  \n  - 颜色：低饱和灰色或浅色实线，透明度 30%–60%。  \n  - 线宽：较细（如 4-6px），避免喧宾夺主。  \n- 业务相关区域边界（如配送范围、服务区域）：  \n  - 使用半透明填充色 + 清晰边线，详见「面与区域」部分。  \n\n---\n\n## 3. 面（Polygon/Region）与圆形区域样式\n\n### 3.1 半透明填充 + 清晰边线\n\n- 所有面状区域应使用：  \n  - **填充色**：低饱和品牌色 + 较高透明度（例如 10%–30%）。  \n  - **边线**：同色系略深颜色，透明度 60%–80%，线宽 4-6px。  \n- 目的：  \n  - 区域可被明显识别，但不遮挡地图底图细节。  \n\n### 3.2 常见业务区域推荐样式\n\n- **服务范围 / 配送区域**  \n  - 填充：品牌主色的浅色（如浅绿/浅蓝），透明度 15%–20%。  \n  - 边线：主色深一档，线宽 4px。  \n\n- **风险区域 / 禁止进入区域**  \n  - 填充：红色或橙色，透明度 10%–15%。  \n  - 边线：同色系深色虚线或实线，线宽 4-6px。  \n  - 覆盖物 `zIndex` 应低于标注点和信息气泡，避免遮挡重要提示。  \n\n- **安全区域 / 推荐活动范围**  \n  - 填充：绿色/蓝色系浅色，透明度 10%–20%。  \n  - 边线：不必过于抢眼，可与背景相融。  \n\n---\n\n## 4. 文本与标签（Label）样式\n\n### 4.1 文本层级与字号\n\n- 文本字号应随缩放级别自动调整（若 SDK & 业务支持），但需保持：  \n  - **一级信息（地点名称、路线名称）**：字号较大，颜色对比度高。  \n  - **二级信息（地址简要、距离/时长）**：中等字号，颜色略浅。  \n  - **辅助信息（标签、分类）**：较小字号，灰色系。  \n\n### 4.2 颜色与对比度\n\n- 深色底图：  \n  - 主文本：浅色（如 #FFFFFF、#F5F5F5）  \n  - 辅助文本：浅灰（如 #CCCCCC）  \n- 浅色底图：  \n  - 主文本：深色（如 #222222、#333333）  \n  - 辅助文本：中灰（如 #666666、#888888）  \n- 必须确保**足够对比度**（建议对比度不低于 WCAG 标准 4.5:1），兼顾可读性与无障碍需求。  \n\n### 4.3 标签与信息框（PopView/InfoWindow）\n\n- 信息框内：  \n  - 标题：使用较大字号 + 粗体。  \n  - 副标题/地址：中等字号，单行或两行内展示，超长用省略号。  \n  - 操作按钮（若有）：与全局按钮风格一致，避免在气泡内放过多操作。  \n- 信息框与 Marker 的组合需遵循：  \n  - Marker 锚点与信息框锚点协调，确保信息框三角箭头指向目标点。  \n  - 承载信息框的透明 Marker `zIndex` 必须处于最高层级，避免被线/面遮挡。  \n\n---\n\n## 5. 颜色体系与主题适配\n\n### 5.1 基础颜色体系\n\n- **品牌主色**：用于主路线、关键 Marker、高亮区域。  \n- **辅助色**：用于次级路线、备选路径、次要区域。  \n- **警告色**：用于拥堵、风险区域、错误提示。  \n- **中性色**：用于行政边界、背景线条、辅助文本。  \n\n### 5.2 深色/浅色主题\n\n- 浅色主题：  \n  - 底图偏浅，路线与标注可使用饱和度更高的颜色。  \n  - 警告色需适当降低饱和度避免刺眼。  \n- 深色主题：  \n  - 路线与标注需使用高亮浅色或荧光色系。  \n  - 文本需使用高对比度浅色，避免纯白大面积导致眩光。  \n\n---\n\n## 6. 不同缩放级别下的样式调整\n\n- **低缩放级别（城市/全国视野）**  \n  - 仅展示关键信息：主路线、主要城市/地标、重要区域轮廓。  \n  - 隐藏或合并普通 POI、细粒度轨迹点。  \n\n- **中缩放级别（区县/城区视野）**  \n  - 展示更多 POI 与区域信息；  \n  - 路线细节适度展示，但避免过多小折线导致视觉负担。  \n\n- **高缩放级别（街道/楼宇级）**  \n  - 展示详细 POI、建筑轮廓、轨迹节点等。  \n  - 允许显示更多文本标签，但需避免碰撞：  \n    - 可开启 SDK 文本避让能力（如有）；  \n    - 业务侧避免在同一位置叠加多文本。  \n\n---\n\n## 7. 交互相关样式建议\n\n- Marker 点击态：  \n  - 建议在选中状态下放大 10%–20%，或添加描边/光晕高亮；  \n  - 同时改变对应信息框或底部卡片样式，形成「联动」。  \n\n- 路线选中态：  \n  - 被选中的路线加粗或改变颜色，其他路线降低透明度。  \n\n- 区域 hover/点击态（若有）：  \n  - 填充色稍微加深或边线加粗，以提示用户当前操作目标。  \n\n---\n\n## 8. 与其他规范的关系\n\n- **与性能规范的关系**  \n  - 颜色、线宽、透明度等样式设置不得通过频繁重建覆盖物的方式实现，应尽量在已有对象上更新属性，详见 `performance-optimization.md`。  \n\n- **与 zIndex 分层规范的关系**  \n  - 任何样式调整不得破坏既定的 zIndex 分层原则：面 < 线 < Marker < 信息框/临时标注。  \n\n- **与 UI 反馈规范的关系**  \n  - 样式变化（如选中态、错误态）需与交互反馈（Toast/Dialog/状态文本）保持一致的语义颜色和文案，详见 `ui-feedback.md`。  \n\n---\n\n## 9. 实施与落地建议\n\n- 新增地图样式时：  \n  - 优先在此文档中补充规则，再在代码中实现；  \n  - 重要样式变化需评审通过后方可全局使用。  \n\n- 代码实现中：  \n  - 避免在页面内写死魔法值（如颜色、线宽、透明度），推荐集中定义样式常量或配置；  \n  - 对锚点、颜色等关键参数需添加中文注释，说明选择原因与业务含义。\n\nFile v1.0.2:references/guidelines/package-management.md\n\n## 鸿蒙百度地图 SDK 包管理规范\n\n本文件规定了在 HarmonyOS NEXT 项目中引入百度地图 SDK 时，组合包与独立包的选择和互斥规则。\n\n### 1. 包分类\n\n百度地图鸿蒙 SDK 发布为**组合包**和**独立包**两种形式。\n\n#### 1.1 组合包\n\n组合包是多个独立包的集合，安装后即包含对应的全部独立包能力，使用时通过组合包包名引入。\n\n| 组合包 | 包含的独立包能力 | 说明 |\n| --- | --- | --- |\n| `@bdmap/map_walkride_search` | `@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util` | 地图 + 步行/骑行路线 + 检索组合包 |\n| `@bdmap/navi_map` | `@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util` | 导航 + 地图组合包 |\n\n#### 1.2 独立包\n\n独立包可按需单独安装，适用于只需要部分能力的场景。\n\n| 独立包 | 能力 |\n| --- | --- |\n| `@bdmap/base` | 基础能力（坐标类型、AK 鉴权等） |\n| `@bdmap/map` | 地图组件、控制器、覆盖物、图层等 |\n| `@bdmap/search` | POI/AOI/行政区/天气/路线规划等检索能力 |\n| `@bdmap/util` | 距离/面积计算、空间关系判断、坐标转换等工具 |\n| `@bdmap/locsdk` | 定位 SDK（前台/后台定位、地址/POI 获取） |\n\n> **注意**：`@bdmap/locsdk` 是独立的定位能力包，不属于任何组合包，可与组合包或独立包搭配使用。\n\n### 2. 互斥规则（强制）\n\n**组合包与独立包不允许混用。** 组合包内部已包含对应独立包的全部能力，如果同时安装会导致依赖冲突或运行时异常。\n\n#### 2.1 禁止行为\n\n- **禁止**在已安装组合包 `@bdmap/map_walkride_search` 的项目中，再单独安装 `@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util` 中的任何一个。\n- **禁止**在已安装组合包 `@bdmap/navi_map` 的项目中，再单独安装 `@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util` 中的任何一个。\n- **禁止**同时安装两个组合包（如同时安装 `@bdmap/map_walkride_search` 和 `@bdmap/navi_map`）。\n\n#### 2.2 允许行为\n\n- 使用组合包时，可以额外安装 `@bdmap/locsdk`（因为定位包不包含在组合包中）。\n- 仅使用独立包时，可以自由组合安装多个独立包。\n\n### 3. import 引用差异\n\n使用组合包和独立包时，代码中的 import 路径不同：\n\n```ts\n// ✅ 使用组合包 @bdmap/map_walkride_search 时：\nimport { MapComponent, MapController } from '@bdmap/map_walkride_search';\nimport { PoiSearch } from '@bdmap/map_walkride_search';\n\n// ✅ 使用独立包时：\nimport { MapComponent, MapController } from '@bdmap/map';\nimport { PoiSearch } from '@bdmap/search';\n```\n\n**注意**：切换包方案后，需要同步修改所有相关的 import 语句。\n\n### 4. 检查与判断流程\n\n在为项目添加百度地图依赖前，Agent **必须**按以下步骤检查：\n\n1. **读取 `oh-package.json5`**：检查 `dependencies` 中是否已存在百度地图相关包。\n2. **判断已有包类型**：\n   - 若已存在 `@bdmap/map_walkride_search` 或 `@bdmap/navi_map`，则当前项目使用的是**组合包方案**。\n   - 若已存在 `@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util` 中的任意一个，则当前项目使用的是**独立包方案**。\n   - 若不存在任何百度地图包，则为**全新接入**，需询问用户选择方案。\n3. **遵守互斥规则并自动切换**：\n   - 已使用组合包 → 新增依赖只能用同一组合包的包名引入，**不得**新增独立包。\n   - 已使用独立包，但新需求需要组合包能力（如需要步行/骑行路线规划需要 `@bdmap/map_walkride_search`，或导航需要 `@bdmap/navi_map`） → **自动执行切换流程**（见下方第 4 步），无需询问用户。\n   - 已使用独立包，新需求仍可由独立包满足 → 继续安装独立包。\n   - 全新接入 → 根据需求选择一种方案，并在后续开发中保持一致。\n\n### 4.1 自动切换流程（独立包 → 组合包）\n\n当项目已安装独立包，但新需求明确需要组合包才能满足时，Agent **必须自动执行**以下切换步骤，无需额外询问用户：\n\n**步骤 1：卸载全部已有的独立包**\n\n从 `oh-package.json5` 的 `dependencies` 中移除所有已安装的百度地图独立包（`@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util`），然后执行卸载：\n\n```bash\nohpm uninstall @bdmap/base @bdmap/map @bdmap/search @bdmap/util\n```\n\n> **注意**：`@bdmap/locsdk` 不需要卸载，它可与组合包共存。\n\n**步骤 2：安装目标组合包**\n\n```bash\nohpm install @bdmap/map_walkride_search\n# 或\nohpm install @bdmap/navi_map\n```\n\n**步骤 3：批量替换 import 语句**\n\n扫描项目中所有 `.ets` / `.ts` 源文件，将独立包的 import 路径替换为组合包路径。替换映射关系：\n\n| 原 import 来源（独立包） | 替换为（组合包） |\n| --- | --- |\n| `from '@bdmap/base'` | `from '<组合包名>'` |\n| `from '@bdmap/map'` | `from '<组合包名>'` |\n| `from '@bdmap/search'` | `from '<组合包名>'` |\n| `from '@bdmap/util'` | `from '<组合包名>'` |\n\n其中 `<组合包名>` 为实际安装的组合包，如 `@bdmap/map_walkride_search` 或 `@bdmap/navi_map`。\n\n示例：\n\n```ts\n// 切换前（独立包）\nimport { MapComponent, MapController } from '@bdmap/map';\nimport { PoiSearch } from '@bdmap/search';\nimport { DistanceUtil } from '@bdmap/util';\n\n// 切换后（组合包 @bdmap/map_walkride_search）\nimport { MapComponent, MapController } from '@bdmap/map_walkride_search';\nimport { PoiSearch } from '@bdmap/map_walkride_search';\nimport { DistanceUtil } from '@bdmap/map_walkride_search';\n```\n\n> `@bdmap/locsdk` 的 import 保持不变，无需替换。\n\n**步骤 4：执行构建验证**\n\n完成切换后，执行 `ohpm install` + 构建命令，确保无编译错误：\n\n```bash\nohpm install && hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon\n```\n\n### 5. 场景选择建议\n\n| 场景 | 推荐方案 | 理由 |\n| --- | --- | --- |\n| 需要地图 + 检索 + 步行/骑行路线规划 | 组合包 `@bdmap/map_walkride_search` | 增加步行/骑行导航能力 |\n| 需要导航 + 地图能力 | 组合包 `@bdmap/navi_map` | 一次安装包含全部能力 |\n| 仅需要地图展示，无检索/路线需求 | 独立包 `@bdmap/base` + `@bdmap/map` | 按需引入，减小包体积 |\n| 仅需要检索能力，无地图 UI | 独立包 `@bdmap/base` + `@bdmap/search` | 按需引入，减小包体积 |\n| 需要定位能力 | 独立包 `@bdmap/locsdk`（可与任何方案搭配） | 定位包独立于组合包体系 |\n\nFile v1.0.2:references/guidelines/performance-optimization.md\n\n## 地图性能与覆盖物分层规范\n\n本文件补充 `SKILL.md` 中「地图功能开发（代码组织与规范）」下的性能与分层要求。\n\n### 1. 性能优化：缓存复用，避免反复重建\n\n在以下场景中，频繁创建/销毁对象会导致不必要的内存分配和 UI 刷新：\n\n- 位置轮询（定时更新坐标）\n- 气泡自动消失/重新显示\n- 轨迹回放（沿轨迹移动标注/气泡）\n\n**强制要求：**\n\n- 首次创建完整 UI 结构时缓存关键对象（如 `PopView`、`LabelUI` 等）。\n- 后续仅更新必要的字段（如文本内容、可见性），禁止每次都重新构建整棵 UI 树。\n- 当绑定对象（如 Marker）被销毁并重建时，必须同步重置缓存引用。\n\n示例（正确做法）：\n\n```ts\n// ✅ 正确：缓存 PopView + LabelUI，后续只更新文本\nprivate childPopView: PopView | null = null;\nprivate childPopLabel: LabelUI | null = null;\n\nprivate updatePopView(text: string): void {\n  if (this.childPopLabel !== null) {\n    this.childPopLabel.setText(text);  // 只更新文本，不重建结构\n    return;\n  }\n  // 首次才创建完整结构...\n  this.childPopLabel = new LabelUI();\n  // ... 设置样式 ...\n  this.childPopView = new PopView();\n  // ... 绑定到 Marker ...\n}\n\nprivate togglePopView(visible: boolean): void {\n  if (this.childPopView !== null) {\n    this.childPopView.setVisibility(\n      visible ? SysEnum.Visibility.VISIBLE : SysEnum.Visibility.GONE\n    );\n  }\n}\n```\n\n> 提示：回答中若涉及 PopView/信息框或高频更新 UI 的逻辑，应主动提醒「缓存复用」策略，避免每次重建。\n\n### 2. 覆盖物 zIndex 分层规范（必须显式设置）\n\n默认 `zIndex = 0` 容易导致后添加的信息气泡、标注被先添加的轨迹线、面等遮挡，出现“气泡在下面看不到”的问题。\n\n**强制要求：**\n\n- 为所有覆盖物（Marker、Polyline、Polygon、PopView 等）显式指定 `zIndex`，禁止依赖默认值。\n- 在项目初期约定统一的分层表，并在新增覆盖物时对照执行。\n\n推荐分层表：\n\n| 层级 | zIndex 范围 | 覆盖物类型 |\n|------|-------------|------------|\n| 底层 | 0           | 安全区域 Polygon、地理围栏等面状底图 |\n| 中层 | 1-2         | 轨迹线 Polyline、路线规划线 |\n| 标记层 | 3-5       | 起点/终点 Marker、动画回放 Marker |\n| 顶层 | 10+         | 信息气泡 Marker（承载 PopView）、临时标注 |\n\n特别说明：\n\n- 承载 PopView 的透明 Marker 决定了气泡的显示层级，必须高于所有可能与之重叠的覆盖物。\n- 若业务上存在额外图层（如告警区域、热点点位），应在以上分层表基础上预留范围，并在文档中补充说明。\n\nFile v1.0.2:references/guidelines/ui-feedback.md\n\n## 地图 UI 交互与用户反馈规范\n\n本文件从 `SKILL.md` 中拆分而来，统一约束地图相关操作时的用户反馈方式。\n\n### 1. 必须提供用户反馈的场景\n\n以下场景中，必须通过 Toast / Dialog / 页面状态文本等方式给用户明确反馈，而不仅仅是打日志：\n\n- 地图初始化成功 / 失败\n- 地图点击选择坐标点（起点 / 终点）\n- POI 检索成功 / 无结果 / 失败\n- 路线规划成功 / 失败 / 无结果\n- 定位成功 / 失败\n- 覆盖物添加 / 删除成功\n- 地图视野调整完成\n- 用户输入验证失败（如坐标格式错误、必填项为空）\n- 网络请求失败 / 超时\n- 权限获取失败（包括定位、网络等）\n\n### 2. 反馈方式选择建议\n\n#### 2.1 Toast（推荐用于简单提示）\n\n- 场景：成功提示、简单错误提示、操作确认等。\n- 要求：时长建议 2000ms（2 秒），文案简短清晰。\n\n示例：\n\n```ts\nimport { promptAction } from '@kit.ArkUI';\n\n// 成功提示\npromptAction.showToast({\n  message: '路线规划成功',\n  duration: 2000\n});\n\n// 错误提示\npromptAction.showToast({\n  message: '坐标格式不正确，请检查后重试',\n  duration: 2000\n});\n```\n\n#### 2.2 Dialog（用于重要确认或详细错误）\n\n- 场景：需要用户确认的操作、重要错误信息展示等。\n\n示例：\n\n```ts\nimport { promptAction } from '@kit.ArkUI';\n\n// 确认对话框\npromptAction.showDialog({\n  title: '确认删除',\n  message: '确定要删除这条路线吗？',\n  buttons: [\n    { text: '取消', color: '#666666' },\n    { text: '确定', color: '#1EB980' }\n  ]\n}).then((result) => {\n  if (result.index === 1) {\n    // 用户点击了\"确定\"\n  }\n});\n\n// 错误信息对话框\npromptAction.showDialog({\n  title: '路线规划失败',\n  message: '网络连接异常，请检查网络后重试',\n  buttons: [{ text: '确定', color: '#1EB980' }]\n});\n```\n\n#### 2.3 页面状态文本（用于实时状态）\n\n- 场景：需要持续显示的状态信息，如“正在规划路线…”、“路线规划成功！距离：2.5 公里”等。\n\n示例：\n\n```ts\n@State statusMessage: string = '请在地图上点击选择起点和终点';\n\n// 在 build() 中\nText(this.statusMessage)\n  .fontSize(14)\n  .fontColor('#555555');\n```\n\n### 3. 错误处理与反馈示例\n\n**推荐模式：同时输出用户友好提示和内部日志。**\n\n```ts\n// ✅ 正确：提供用户友好的反馈\ntry {\n  const result = await RunRoutePlanner.planRoute(start, end);\n  if (result.success) {\n    this.showToast('路线规划成功');\n    this.statusMessage = `路线规划成功！距离：${(result.distance / 1000).toFixed(2)} 公里`;\n  } else {\n    this.showToast(result.error || '路线规划失败，请稍后重试');\n    this.statusMessage = result.error || '路线规划失败，请稍后重试';\n  }\n} catch (err) {\n  const userMessage = '网络连接异常，请检查网络后重试';\n  this.showToast(userMessage);\n  this.statusMessage = userMessage;\n  Logger.error('SportHealthMap', { error: err, action: 'planRoute' });\n}\n\n// ❌ 错误：仅使用日志，没有用户反馈\ntry {\n  const result = await RunRoutePlanner.planRoute(start, end);\n  console.info('Route planning result:', result);\n} catch (err) {\n  console.error('Route planning failed:', err);\n}\n```\n\n### 4. 文案规范\n\n- 必须使用简洁、明确的中文消息，避免生硬的技术术语。\n- 必须区分「成功 / 失败 / 进行中」三种状态。\n- 成功消息：如“路线规划成功”、“起点已选择”。\n- 失败消息：说明原因和解决建议，如“坐标格式不正确，请输入形如『纬度,经度』的数值”。\n- 进行中消息：明确操作进度，如“正在规划路线，请稍候…”.\n- 禁止仅展示 JSON 化的错误对象或英文异常信息给用户。\n\nFile v1.0.2:references/guidelines/walkride-sdk-guide.md\n\n## HarmonyNEXT 步骑行导航 SDK 开发指南\n\n百度地图鸿蒙步骑行导航 SDK 是专为 HarmonyOS NEXT 系统开发的导航服务解决方案，提供步行与骑行场景下的路线规划、导航引导及界面渲染能力。通过 ArkTS 语言实现核心逻辑，支持开发者快速构建符合鸿蒙生态规范的导航功能，覆盖引擎初始化、路径计算、实时导航及状态监听等全流程需求。\n\n---\n\n### 1. 功能介绍\n\n#### 1.1 多模式导航服务\n- 支持步行 / 骑行双模式切换，通过 `NaviType` 枚举参数动态配置导航类型（`NaviType.WALK` / `NaviType.RIDE`）\n- 提供路线规划、导航启停、偏航重算等核心功能\n\n#### 1.2 智能路线规划\n- 支持自定义起终点和途经点坐标（`LatLng` 类型）\n- 支持多路线规划与路线切换（`multiRoute` / `switchRoute`）\n- 提供路线规划结果可视化展示（`displayRoutePlanResult` 方法）\n\n#### 1.3 生命周期管理\n- 导航状态监控：通过 Promise 接口实现异步控制\n- 支持 `start()` / `resume()` / `pause()` / `stop()` 完整生命周期操作\n- 提供 `isStart()` 状态校验方法\n- 支持多实例检测（`isMultiNaviCreated()`）\n\n#### 1.4 默认 UI 组件化\n- 内置导航界面组件（`walkRideDefaultUIPage`）\n- 支持头部引导区、2D/3D 切换、路线变更、全览/播报按钮、底部 ETA 等交互控件\n- 提供退出导航回调（`onExitNav`）等事件绑定\n\n#### 1.5 实时状态监听\n- 通过 `IGuideSubStatusListener` 接口实现 7 种导航状态事件回调\n- 覆盖偏航预警、目的地接近、室内定位等关键场景\n- 通过 `IGuideInfoListener` 接口获取诱导信息、剩余距离/时间、速度等实时数据\n\n#### 1.6 语音播报（TTS）\n- 通过 `ITTSPlugin` 接口实现自定义语音播报\n- 支持抢占式 / 非抢占式播报模式\n\n#### 1.7 模拟导航\n- 通过 `MockLocationPlugin` 实现基于轨迹数据的模拟定位\n- 支持自定义模拟速度和轨迹重载\n\n---\n\n### 2. 工程配置\n\n#### 2.1 创建鸿蒙工程\n\n在 DevEco Studio 中创建 HarmonyOS NEXT 工程。\n\n#### 2.2 SDK 引用\n\n在模块目录下的 `oh-package.json5` 文件中声明依赖：\n\n```json5\n\"dependencies\": {\n  \"@bdmap/map_walkride_search\": \"2.0.3\"\n}\n```\n\n> **注意**：`@bdmap/map_walkride_search` 是组合包，已包含 `@bdmap/base`、`@bdmap/map`、`@bdmap/search`、`@bdmap/util` 的能力。**不允许与独立包（如 `@bdmap/map`）混用**，否则会导致依赖冲突。详见 [包管理规范](package-management.md)。\n\n安装依赖：\n\n```bash\nohpm install\n```\n\n#### 2.3 权限配置\n\n在 `module.json5` 文件中配置步骑行 SDK 所需权限：\n\n```json5\n{\n  \"requestPermissions\": [\n    { \"name\": \"ohos.permission.LOCATION\" },\n    { \"name\": \"ohos.permission.APPROXIMATELY_LOCATION\" },\n    { \"name\": \"ohos.permission.LOCATION_IN_BACKGROUND\" },\n    { \"name\": \"ohos.permission.GET_WIFI_INFO\" },\n    { \"name\": \"ohos.permission.GET_NETWORK_INFO\" },\n    { \"name\": \"ohos.permission.GET_BUNDLE_INFO\" },\n    { \"name\": \"ohos.permission.INTERNET\" }\n  ]\n}\n```\n\n| 权限 | 用途 | 是否必须 |\n|------|------|----------|\n| `ohos.permission.LOCATION` | 精确定位 | 是 |\n| `ohos.permission.APPROXIMATELY_LOCATION` | 模糊定位 | 是 |\n| `ohos.permission.LOCATION_IN_BACKGROUND` | 后台导航时持续定位 | 后台导航必须 |\n| `ohos.permission.GET_WIFI_INFO` | 网络信息获取 | 是 |\n| `ohos.permission.GET_NETWORK_INFO` | 网络信息获取 | 是 |\n| `ohos.permission.GET_BUNDLE_INFO` | 包信息获取 | 是 |\n| `ohos.permission.INTERNET` | 网络请求 | 是 |\n\n---\n\n### 3. 导入与基础类型\n\n使用组合包 `@bdmap/map_walkride_search` 时，所有类型均从该包导入：\n\n```typescript\n// 地图相关\nimport {\n  MapComponent, MapController, MapOptions, MapStatus,\n  CoordUtil, CoordTrans, Event\n} from '@bdmap/map_walkride_search';\n\n// 导航核心类\nimport {\n  BDNaviService, NaviType, NaviMode,\n  RouteNodeInfo, RoutePlanOption, RoutePlanError,\n  MockLocationPlugin, DefaultMsg,\n  walkRideDefaultUIPage\n} from '@bdmap/map_walkride_search';\n\n// 监听器接口\nimport {\n  IRoutePlanListener, IGuideSubStatusListener,\n  IGuideInfoListener, ITTSPlugin, ILocationPlugin\n} from '@bdmap/map_walkride_search';\n\n// 检索相关\nimport {\n  PoiSearch, PoiCitySearchOption, PoiCitySearchOptionParams,\n  PoiInfo, ERRORNO\n} from '@bdmap/map_walkride_search';\n\n// 基础类型\nimport { LatLng } from '@bdmap/map_walkride_search';\n\n```\n\n---\n\n### 4. 引擎初始化\n\n在使用步骑行导航功能前，需要对引擎进行初始化。初始化成功后方可调用其他功能。\n\n#### 4.1 创建导航服务对象\n\n通过入参选择创建步行或骑行服务：\n\n```typescript\n// 创建步行导航服务\nlet service: BDNaviService = new BDNaviService(NaviType.WALK);\n\n// 或创建骑行导航服务\nlet service: BDNaviService = new BDNaviService(NaviType.RIDE);\n```\n> **注意**：\n> 如果当前页面同时需要步骑行导航功能，只需创建一个导航服务对象即可，动态切换导航类型 `NaviType` 参数实现。具体参考 4.2 节内容。\n\n#### 4.2 动态切换导航类型\n\n也可在路线规划前修改服务对象的类型：\n\n```typescript\n// 切换为骑行模式\nservice.setNaviType(NaviType.RIDE);\n\n// 切换为步行模式\nservice.setNaviType(NaviType.WALK);\n```\n\n#### 4.3 配置 TTS 语音插件（可选）\n\n若需要语音播报能力，需在引擎初始化前注册 TTS 插件。开发者需实现 `ITTSPlugin` 接口：\n\n```typescript\nimport { ITTSPlugin } from '@bdmap/map_walkride_search';\n\n@ObservedV2\nclass DefaultTTSPlugin implements ITTSPlugin {\n  @Trace voiceText: string = '';\n\n  init(): void {\n    // TTS 引擎初始化，如加载语音合成资源\n  }\n\n  unInit(): void {\n    // TTS 引擎释放\n  }\n\n  /**\n   * 播放 TTS 文本。\n   * @param speech 播报语音文本\n   * @param bPreempt 是否抢占当前播报\n   * @returns 播报状态码（0 表示成功）\n   */\n  playTTSText(speech: string, bPreempt: boolean): number {\n    this.voiceText = speech;\n    Logger.info('SportHealthMap', { action: 'playTTS', speech: speech, preempt: bPreempt });\n    // 实际项目中应调用系统 TTS 或第三方语音合成能力\n    return 0;\n  }\n}\n```\n\n在引擎初始化前注册：\n\n```typescript\nprivate ttsPlugin: DefaultTTSPlugin = new DefaultTTSPlugin();\n\naboutToAppear() {\n  this.service.initializer().setTTsPlugin(this.ttsPlugin);\n}\n```\n\n#### 4.4 配置自定义定位插件（可选）\n\n步骑行导航 SDK 默认使用内置定位能力。若业务已有独立的定位服务（如 `@bdmap/locsdk`），可通过实现 `ILocationPlugin` 接口自定义定位插件，并在引擎初始化前通过 `setLocationPlugin` 注册，使导航引擎使用外部定位数据源。\n\n##### 4.4.1 实现 ILocationPlugin 接口\n\n`ILocationPlugin` 接口定义了定位插件的标准能力，需实现以下方法：\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `init(context: Context)` | `void` | 初始化定位服务 |\n| `unInit()` | `void` | 释放定位资源 |\n| `startContinuousLocation(callback)` | `Promise<boolean>` | 启动连续定位，通过 callback 持续回传位置 |\n| `stopContinuousLocation()` | `Promise<boolean>` | 停止连续定位 |\n| `getCurrentLocation()` | `Promise<BMLocation>` | 获取当前位置 |\n\n以下示例基于 `@bdmap/locsdk` 实现自定义定位插件：\n\n```typescript\nimport { Context } from \"@ohos.abilityAccessCtrl\";\nimport { BDLocation, BDLocationListener } from \"@bdmap/locsdk\";\nimport { ILocationPlugin, BMLocation as WalkRideLocation } from \"@bdmap/map_walkride_search\";\n\nexport class WalkRideLocPlugin implements ILocationPlugin {\n  private continuousCallback: ((location: WalkRideLocation) => void) | null = null;\n  private locListener: BDLocationListener | null = new BDLocationListener();\n  private initialized = false;\n  private currentLoc: WalkRideLocation | null = null;\n  private locationClient: LocationClient;\n\n  constructor(loc: LocationClient) {\n    this.locationClient = loc;\n  }\n\n  init(context: Context): void {\n    if (!this.initialized) {\n      // 初始化定位服务\n      this.locListener = new BDLocationListener();\n      this.initialized = true;\n    }\n  }\n\n  unInit(): void {\n    if (this.initialized) {\n      try {\n        this.stopContinuousLocation()\n          .then(() => {\n            this.locListener = null;\n            this.initialized = false;\n          });\n      } catch (err) {\n        console.error(\"Failed to stop location during unInit\", err);\n        throw new Error(`Failed to uninitialize: ${err.message}`);\n      }\n    }\n  }\n\n  /**\n   * 将 locsdk 的 BMLocation 转换为步骑行 SDK 的 BMLocation。\n   * 需映射经纬度、海拔、速度、方向等字段，并设置定位精度。\n   */\n  private convertToWalkRideLocation(source: BDLocation | undefined): WalkRideLocation {\n    const target = new WalkRideLocation();\n    if (source) {\n      target.setLongitude(source.getLongitude());\n      target.setLatitude(source.getLatitude());\n      target.setAltitude(source.getAltitude());\n      target.setSpeed(source.getSpeed());\n      target.setDirection(source.getDirection());\n    } else {\n      target.setLongitude(0);\n      target.setLatitude(0);\n      target.setAltitude(0);\n      target.setSpeed(0);\n      target.setDirection(0);\n    }\n    target.setRadius(10);\n    this.currentLoc = target;\n    return target;\n  }\n\n  async startContinuousLocation(callback: (location: WalkRideLocation) => void): Promise<boolean> {\n    this.continuousCallback = callback;\n\n    if (this.locListener) {\n      // 将 locsdk 的定位回调转换后传递给导航引擎\n      this.locListener.onReceiveLocationBlock = (value: BDLocation) => {\n        if (this.continuousCallback) {\n          this.continuousCallback(this.convertToWalkRideLocation(value));\n        }\n      };\n\n      this.locationClient.registerLocationListener(this.locListener);\n    }\n\n    return true;\n  }\n\n  async stopContinuousLocation(): Promise<boolean> {\n    if (this.continuousCallback && this.locListener) {\n      this.locationClient.unRegisterLocationListener(this.locListener);\n      this.continuousCallback = null;\n      return Promise.resolve(true);\n    } else {\n      return Promise.reject(false);\n    }\n  }\n\n  async getCurrentLocation(): Promise<WalkRideLocation> {\n    return Promise.resolve(this.convertToWalkRideLocation(this.currentLoc));\n  }\n}\n```\n\n##### 4.4.2 注册自定义定位插件\n\n在引擎初始化前，通过 `setLocationPlugin` 将自定义插件注册到导航服务：\n\n```typescript\nimport { WalkRideLocPlugin } from './WalkRideLocPlugin';\n\n// 假设 locationClient 为已初始化的定位服务客户端\nprivate locPlugin: WalkRideLocPlugin = new WalkRideLocPlugin(this.locationClient);\n\naboutToAppear() {\n  // 注册自定义定位插件（需在 init() 之前调用）\n  this.service.initializer().setLocationPlugin(this.locPlugin);\n\n  // 注册 TTS 插件（可选）\n  this.service.initializer().setTTsPlugin(this.ttsPlugin);\n}\n```\n\n> **注意**：\n> - `setLocationPlugin` 必须在 `init()` 之前调用，否则不生效。\n> - 自定义定位插件与模拟定位插件（`MockLocationPlugin`）互斥，注册新插件会替换当前插件。\n> - 退出导航时若需恢复默认定位，应调用 `resetLocationPlugin()`。\n\n#### 4.5 初始化导航引擎\n\n引擎初始化需传入上下文和地图控制器，必须在 `MapComponent.onReady` 回调中执行：\n\n```typescript\nMapComponent({\n  onReady: (err: Error | null, map: MapController) => {\n    if (map) {\n      this.mapController = map;\n\n      // 初始化导航引擎（需传入 UIAbility 上下文和 MapController）\n      this.service.initializer()\n        .init(getContext(this) as common.UIAbilityContext, this.mapController)\n        .then(() => {\n          Logger.info('SportHealthMap', { action: 'naviEngineInit', status: 'success' });\n          promptAction.showToast({ message: '导航引擎初始化成功', duration: 2000 });\n        })\n        .catch((reason: string) => {\n          Logger.error('SportHealthMap', { action: 'naviEngineInit', error: reason });\n          promptAction.showToast({ message: '导航引擎初始化失败：' + reason, duration: 3000 });\n        });\n    }\n  },\n  mapOptions: this.mapOptions\n}).width('100%').height('100%')\n```\n\n#### 4.6 隐藏底图默认控件（可选）\n\n导航场景下通常不需要默认的缩放和比例尺控件，可在地图就绪后关闭：\n\n```typescript\nimport { Event } from '@bdmap/map_walkride_search';\nimport { emitter } from '@kit.BasicServicesKit';\n\n// 隐藏缩放控件\nemitter.emit({ eventId: Event.ZoomCom }, {\n  data: { show: false, mapViewId: this.mapController?.mapViewId }\n});\n// 隐藏比例尺控件\nemitter.emit({ eventId: Event.ScaleCom }, {\n  data: { show: false, mapViewId: this.mapController?.mapViewId }\n});\n```\n\n---\n\n### 5. 坐标转换\n\n步骑行 SDK 内部使用百度坐标系（BD09ll）。如果外部数据源使用 WGS84 或 GCJ-02 坐标，需在传入前进行转换：\n\n```typescript\nimport { CoordTrans } from '@bdmap/map_walkride_search';\n\n// WGS84 → 百度坐标\nlet wgsLatLng: LatLng = new LatLng(40.048241, 116.296165);\nlet bdLatLng: LatLng | null = CoordTrans.wgsToBaidu(wgsLatLng);\n\n// GCJ-02 → 百度坐标\nlet gcjLatLng: LatLng = new LatLng(40.048241, 116.296165);\nlet bdLatLng2: LatLng | null = CoordTrans.gcjToBaidu(gcjLatLng);\n\n// 百度坐标 → GCJ-02\nlet bdBack: LatLng | null = CoordTrans.baiduToGcj(bdLatLng!);\n```\n\n> **注意**：转换后需进行空值检查，`CoordTrans` 方法在参数异常时会返回 `null`。\n\n---\n\n### 6. 路线规划\n\n#### 6.1 构造起终点\n\n使用 `RouteNodeInfo` 描述起终点位置：\n\n```typescript\nlet startLocation: RouteNodeInfo = new RouteNodeInfo();\nstartLocation.location = new LatLng(40.048241, 116.296165);\n\nlet endLocation: RouteNodeInfo = new RouteNodeInfo();\nendLocation.location = new LatLng(40.04721, 116.316372);\n```\n\n#### 6.2 构造路线规划参数\n\n使用 `RoutePlanOption` 的链式调用设置参数：\n\n```typescript\nlet param: RoutePlanOption = new RoutePlanOption()\n  .startNodeInfo(startLocation)\n  .endNodeInfo(endLocation)\n  .extraNaviMode(NaviMode.RealNavi);  // 设置为真实导航模式\n```\n\n**NaviMode 取值说明：**\n\n| 模式 | 值 | 说明 |\n|------|---|------|\n| `NaviMode.Invalid` | 0 | 无效 |\n| `NaviMode.RealNavi` | 1 | 真实导航（使用实际 GPS 定位） |\n| `NaviMode.DemoNavi` | 2 | 模拟导航 |\n| `NaviMode.TrackNavi` | 3 | 轨迹文件导航 |\n\n#### 6.3 计算起终点距离（可选）\n\n可在规划前使用 `CoordUtil` 计算两点间距离：\n\n```typescript\nimport { CoordUtil } from '@bdmap/map_walkride_search';\n\nlet distance: number = CoordUtil.getDistanceByLL(startLocation.location!, endLocation.location!);\nLogger.info('SportHealthMap', { action: 'calcDistance', distance: distance });\n// distance 单位为米，返回 -1 表示计算失败\n```\n\n#### 6.4 发起路线规划\n\n通过 `routePlanService().routePlanWithRouteNode()` 发起规划，并通过 `IRoutePlanListener` 回调处理结果：\n\n```typescript\n/** 路线规划回调 */\nprivate routePlanListener: IRoutePlanListener = new Object({\n  /** 路线规划开始 */\n  onRoutePlanStart: (): void => {\n    Logger.info('SportHealthMap', { action: 'routePlanStart' });\n  },\n  /** 路线规划成功 */\n  onRoutePlanSuccess: (): void => {\n    Logger.info('SportHealthMap', { action: 'routePlanSuccess' });\n    // 在地图上展示规划路线\n    this.service.routePlanService().displayRoutePlanResult();\n    promptAction.showToast({ message: '路线规划成功', duration: 2000 });\n  },\n  /** 路线规划失败 */\n  onRoutePlanFail: (error: RoutePlanError): void => {\n    let errorMsg: string = this.routeSearchError(error);\n    Logger.error('SportHealthMap', { action: 'routePlanFail', error: errorMsg });\n    promptAction.showToast({ message: '路线规划失败：' + errorMsg, duration: 3000 });\n  }\n}) as IRoutePlanListener;\n\n// 注册导航状态监听（建议在路线规划前完成）\nthis.service.navigationService()\n  .info()\n  .routeGuidanceInfo()\n  .addRGSubStatusListener(this.guideSubStatusListener);\n\n// 发起路线规划\nthis.service.routePlanService().routePlanWithRouteNode(param, this.routePlanListener);\n```\n\n#### 6.5 路线展示与控制\n\n```typescript\n// 展示路线规划结果（多路线场景可传入 MultiRouteDisplayOption 自定义样式）\nthis.service.routePlanService().displayRoutePlanResult();\n\n// 隐藏/清除路线展示\nthis.service.routePlanService().cancelRoutePlanDisplay();\n\n// 切换到指定路线（多路线场景，routeIndex 从 0 开始）\nthis.service.routePlanService().switchRoute(routeIndex)\n  .then((success: boolean) => {\n    Logger.info('SportHealthMap', { action: 'switchRoute', index: routeIndex, success: success });\n  });\n```\n\n#### 6.6 路线规划错误码\n\n`RoutePlanError` 枚举定义了完整的错误码体系：\n\n| 错误码 | 枚举值 | 说明 |\n|--------|--------|------|\n| 1000 | `SERVER_UNUSUAL` | 服务器异常 |\n| 1001 | `PARSE_FAIL` | 数据解析失败 |\n| 1002 | `NET_ERR` | 网络错误 |\n| 1010 | `FORWARD_AK_ERROR` | AK 鉴权失败 |\n| 1011 | `INVAILD_PERMISSION` | 权限未开通 |\n| 2000 | `PARAM_ERROR` | 参数错误 |\n| 2001 | `DISTANCE_LESS_THAN_30M` | 起终点距离小于 30 米 |\n| 2002 | `DISTANCE_MORE_THAN_50KM` | 起终点距离大于 50 公里 |\n| 2003 | `DISTANCE_TOO_CLOSE` | 起终点距离过近 |\n| 2004 | `DISTANCE_MORE_THAN` | 起终点距离过远 |\n| 2005 | `ROUTE_DIS_SAME` | 起终点相同 |\n| 3000 | `IS_NOT_SUPPORT_INDOOR_NAVI` | 不支持室内导航 |\n| 3001 | `IS_NOT_SUPPORT_AR_NAVI` | API 级别不支持 AR 步行导航 |\n| 4000 | `ENGINE_STATUS_ERROR` | 引擎状态错误 |\n| 4001 | `NAVI_STATUS_ERROR` | 导航状态错误 |\n| 5000 | `SDK_NOT_INITIALIZED` | SDK 未初始化 |\n| 5001 | `REQUEST_TIMEOUT` | 请求超时 |\n| 5002 | `ENGINE_SEARCH_ERROR` | 引擎检索错误 |\n| 5003 | `INTERRUPTED` | 请求被中断 |\n\n建议封装错误码解码方法，为用户提供友好的错误提示：\n\n```typescript\n/**\n * 将路线规划错误码转换为用户友好的提示信息。\n * @param error 路线规划错误枚举\n * @returns 中文错误提示\n */\nrouteSearchError(error: RoutePlanError): string {\n  const errorMap: Record<string, string> = {\n    [RoutePlanError.SERVER_UNUSUAL.toString()]: '服务器异常，请稍后重试',\n    [RoutePlanError.PARSE_FAIL.toString()]: '数据解析失败',\n    [RoutePlanError.NET_ERR.toString()]: '网络错误，请检查网络连接',\n    [RoutePlanError.FORWARD_AK_ERROR.toString()]: '鉴权失败，请检查 AK 配置',\n    [RoutePlanError.INVAILD_PERMISSION.toString()]: '权限未开通',\n    [RoutePlanError.PARAM_ERROR.toString()]: '参数错误',\n    [RoutePlanError.DISTANCE_LESS_THAN_30M.toString()]: '起终点距离太近（小于 30 米）',\n    [RoutePlanError.DISTANCE_MORE_THAN_50KM.toString()]: '起终点距离太远（超过 50 公里）',\n    [RoutePlanError.DISTANCE_TOO_CLOSE.toString()]: '起终点距离过近',\n    [RoutePlanError.DISTANCE_MORE_THAN.toString()]: '起终点距离过远',\n    [RoutePlanError.ROUTE_DIS_SAME.toString()]: '起终点位置相同',\n    [RoutePlanError.IS_NOT_SUPPORT_INDOOR_NAVI.toString()]: '不支持该室内导航',\n    [RoutePlanError.IS_NOT_SUPPORT_AR_NAVI.toString()]: 'API 级别不支持 AR 步行导航',\n    [RoutePlanError.ENGINE_STATUS_ERROR.toString()]: '引擎状态错误',\n    [RoutePlanError.SDK_NOT_INITIALIZED.toString()]: 'SDK 未初始化',\n    [RoutePlanError.REQUEST_TIMEOUT.toString()]: '请求超时，请检查网络',\n    [RoutePlanError.ENGINE_SEARCH_ERROR.toString()]: '引擎检索错误',\n  };\n  return errorMap[error.toString()] ?? '未知错误';\n}\n```\n\n---\n\n### 7. 导航控制\n\n#### 7.1 开始真实导航\n\n开始导航前必须先清除路线展示，再启动导航生命周期：\n\n```typescript\nstartNavi(): void {\n  // 必须先清除路线展示覆盖物\n  this.service.routePlanService().cancelRoutePlanDisplay();\n\n  // 启动导航\n  this.service.navigationService()\n    .lifecycle()\n    .start()\n    .then(() => {\n      this.serviceState = true;\n      Logger.info('SportHealthMap', { action: 'naviStart', status: 'success' });\n      promptAction.showToast({ message: '导航已开始', duration: 2000 });\n\n      // 检测多实例状态（可选）\n      const multiResult = this.service.navigationService()\n        .lifecycle()\n        .isMultiNaviCreated();\n      if (multiResult?.code !== 0) {\n        promptAction.showToast({ message: multiResult?.message, duration: 2000 });\n      }\n    })\n    .catch((reason: string) => {\n      Logger.error('SportHealthMap', { action: 'naviStart', error: reason });\n      promptAction.showToast({ message: '导航启动失败：' + reason, duration: 3000 });\n    });\n}\n```\n\n#### 7.2 模拟导航\n\n使用 `MockLocationPlugin` 可基于预置的 GPS 轨迹数据模拟导航过程，适用于开发调试阶段：\n\n```typescript\n// WGS84坐标类型数据\ninterface GPSPoint {\n  type: string; // 坐标类型，必填项，默认 2，代表  \"wgs84\"。当前仅支持 \"wgs84\" 坐标类型\n  longitude: number; // 必须\n  latitude: number; // 必须\n  altitude: number; // 高度， 默认 0\n  direction: number; // 方向范围 0~360，0为正北，顺时针方向\n  speed: number; // 速度，默认 0\n  timestamp: string; // 时间戳，格式为 'yyyy-MM-dd HH:mm:ss'\n  unknownFlag: number; // 未知标识， 默认 0\n  timeIncrement: number; // 轨迹点时间增量，默认 1000\n}\nconst trackPoints: GPSPoint[] = [\n  // 轨迹点数据\n];\nconst trackData = trackPoints.map(gpsPoint=>{\n  return `${gpsPoint.type},${gpsPoint.longitude},${gpsPoint.latitude},${gpsPoint.altitude},${gpsPoint.direction},${gpsPoint.speed},${gpsPoint.timestamp},${gpsPoint.unknownFlag},${gpsPoint.timeIncrement}`;\n}).join('\\n')\n\nstartMockNavi(): void {\n  // 创建模拟定位插件（传入轨迹字符串和模拟速度）\n  let mockPlugin: MockLocationPlugin = new MockLocationPlugin(trackData,\n    100  // 模拟速度，值越小移动越快\n  );\n\n  // 注册模拟定位插件\n  this.service.initializer().setLocationPlugin(mockPlugin);\n  this.mockPlugin = mockPlugin;\n\n  // 启动导航（流程同真实导航）\n  this.startNavi();\n}\n```\n\n> **注意**：模拟导航结束或退出时，必须重置定位插件并释放资源：\n\n```typescript\nexitNavi(): void {\n  if (this.mockPlugin) {\n    this.service.initializer().resetLocationPlugin();\n    this.mockPlugin = null;\n  }\n  this.serviceState = false;\n}\n```\n\n#### 7.3 导航生命周期方法\n\n`navigationService().lifecycle()` 提供以下生命周期方法：\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `start()` | `Promise<void>` | 开始导航 |\n| `resume()` | `void` | 恢复导航（从暂停状态恢复） |\n| `pause()` | `void` | 暂停导航 |\n| `stop()` | `void` | 停止导航 |\n| `isStart()` | `boolean` | 判断是否已开始导航 |\n| `isMultiNaviCreated()` | `IMultiNaviCallbackResult` | 检测是否存在多实例 |\n\n---\n\n### 8. 导航状态监听\n\n#### 8.1 导航子状态监听（IGuideSubStatusListener）\n\n通过 `IGuideSubStatusListener` 接口监听导航过程中的关键状态变化：\n\n```typescript\nprivate guideSubStatusListener: IGuideSubStatusListener = new Object({\n  /** 已开始偏航 */\n  onRouteFarAway: (msg: DefaultMsg): void => {\n    Logger.info('SportHealthMap', { action: 'onRouteFarAway', msg: msg });\n    promptAction.showToast({ message: '您已偏离路线，正在重新规划', duration: 2000 });\n  },\n  /** 偏航规划中 */\n  onRoutePlanYawing: (msg: DefaultMsg): void => {\n    Logger.info('SportHealthMap', { action: 'onRoutePlanYawing', msg: msg });\n  },\n  /** 偏航规划结束 */\n  onReRouteComplete: (msg: DefaultMsg): void => {\n    Logger.info('SportHealthMap', { action: 'onReRouteComplete', msg: msg });\n    promptAction.showToast({ message: '路线已重新规划', duration: 2000 });\n  },\n  /** 接近目的地 */\n  onArriveDestNear: (msg: DefaultMsg): void => {\n    Logger.info('SportHealthMap', { action: 'onArriveDestNear', msg: msg });\n    promptAction.showToast({ message: '即将到达目的地', duration: 2000 });\n  },\n  /** 到达目的地 */\n  onArriveDest: (msg: DefaultMsg): void => {\n    Logger.info('SportHealthMap', { action: 'onArriveDest', msg: msg });\n  },\n  /** 到达室内目的地 */\n  onIndoorEnd: (msg: DefaultMsg): void => {\n    Logger.info('SportHealthMap', { action: 'onIndoorEnd', msg: msg });\n  },\n  /** 到达最终目的地 */\n  onFinalEnd: (msg: DefaultMsg): void => {\n    Logger.info('SportHealthMap', { action: 'onFinalEnd', msg: msg });\n    promptAction.showToast({ message: '已到达目的地', duration: 2000 });\n    // 到达后自动停止导航\n    this.stopNavi();\n  }\n}) as IGuideSubStatusListener;\n```\n\n注册监听（建议在路线规划前完成）：\n\n```typescript\nthis.service.navigationService()\n  .info()\n  .routeGuidanceInfo()\n  .addRGSubStatusListener(this.guideSubStatusListener);\n```\n\n#### 8.2 诱导信息监听（IGuideInfoListener）\n\n通过 `IGuideInfoListener` 获取导航过程中的实时诱导信息：\n\n```typescript\nprivate guideInfoListener: IGuideInfoListener = new Object({\n  /** 简易诱导信息更新（如\"前方 200 米左转\"） */\n  onSimpleGuideInfoUpdate: (info: BWNaviSimpleMapInfo): void => {\n    Logger.info('SportHealthMap', { action: 'guideInfoUpdate', info: info });\n  },\n  /** 剩余距离和时间更新 */\n  onRemainInfoUpdate: (record: Record<string, BMObject>): void => {\n    Logger.info('SportHealthMap', { action: 'remainInfoUpdate' });\n  },\n  /** 速度和行驶距离更新 */\n  onSpeedUpdate: (travelData: BWNaviTravelData): void => {\n    Logger.info('SportHealthMap', { action: 'speedUpdate' });\n  },\n  /** 定位匹配路线信息 */\n  onMatchRouteInfo: (record: Record<string, BMObject>): void => {\n    Logger.info('SportHealthMap', { action: 'matchRouteInfo' });\n  },\n  /** 红绿灯状态变化 */\n  onTrafficLightUpdate: (json: string): void => {\n    Logger.info('SportHealthMap', { action: 'trafficLightUpdate', data: json });\n  },\n  /** 外部路线图层信息 */\n  onOutNaviInfo: (record: Record<string, BMObject>): void => {\n    Logger.info('SportHealthMap', { action: 'outNaviInfo' });\n  }\n}) as IGuideInfoListener;\n```\n\n---\n\n### 9. 界面渲染\n\n#### 9.1 默认导航 UI\n\n导航开始后，可渲染步骑行导航默认 UI。`walkRideDefaultUIPage` 是内置组件，提供完整的导航界面：\n\n```typescript\nif (this.serviceState) {\n  walkRideDefaultUIPage({\n    service: this.service,\n    walkRideUIPageOption: {\n      isAutoStop: true,                // 到达终点后自动停止导航\n      onExitNav: () => { this.exitNavi(); },  // 退出导航回调\n      // 以下均为可选参数，默认全部显示\n      headerGuideShow: true,           // 头部诱导区\n      twoDThreeDToggleShow: true,      // 2D/3D 切换按钮\n      transRouteBtnShow: true,         // 路线朝向变更按钮\n      voiceViewChangeShow: true,       // 全览、播报按钮\n      naviETAShow: true                // 底部 ETA 信息\n    }\n  })\n    .hitTestBehavior(HitTestMode.None)  // 确保默认 UI 不拦截底图手势\n}\n```\n\n**UI 控件说明：**\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `isAutoStop` | `boolean` | - | 到达终点后是否自动停止导航 |\n| `onExitNav` | `() => void` | - | 用户退出导航时的回调 |\n| `headerGuideShow` | `boolean` | `true` | 头部诱导引导区 |\n| `twoDThreeDToggleShow` | `boolean` | `true` | 2D/3D 视图切换按钮 |\n| `transRouteBtnShow` | `boolean` | `true` | 路线朝向变更按钮 |\n| `voiceViewChangeShow` | `boolean` | `true` | 全览/语音播报按钮 |\n| `naviETAShow` | `boolean` | `true` | 底部预计到达时间 |\n\n> **重要**：必须设置 `.hitTestBehavior(HitTestMode.None)`，否则默认 UI 会拦截底图的手势事件。\n\n---\n\n### 10. POI 检索（设置起终点）\n\n步骑行场景中，通常通过 POI 检索让用户搜索并选择起终点。组合包已内置检索能力：\n\n```typescript\nimport {\n  PoiSearch, PoiCitySearchOption, PoiCitySearchOptionParams,\n  PoiInfo, ERRORNO\n} from '@bdmap/map_walkride_search';\n\n/**\n * 在指定城市内搜索 POI。\n * @param keyword 搜索关键词\n * @param city 城市名称\n */\nasync searchAddress(keyword: string, city: string): Promise<void> {\n  let search: PoiSearch = PoiSearch.newInstance();\n  let optionParams: PoiCitySearchOptionParams = {\n    keyword: keyword,\n    city: city\n  };\n  let option: PoiCitySearchOption = new PoiCitySearchOption(optionParams);\n  let searchResult = await search.searchInCity(option);\n\n  if (searchResult.error === ERRORNO.NO_ERROR && searchResult.arrayPoiInfo !== undefined) {\n    // 检索成功，展示结果列表\n    this.addressList = searchResult.arrayPoiInfo;\n    Logger.info('SportHealthMap', { action: 'poiSearch', count: this.addressList.length });\n  } else {\n    // 检索失败，提示用户\n    Logger.error('SportHealthMap', { action: 'poiSearch', error: searchResult.error });\n    promptAction.showToast({ message: '搜索失败，请稍后重试', duration: 2000 });\n  }\n}\n```\n\n用户选择结果后，将 `PoiInfo.location` 用作路线规划的起点或终点。\n\n---\n\n### 11. 资源释放\n\n#### 11.1 退出导航\n\n退出导航时需重置状态并释放模拟插件（如有）：\n\n```typescript\nexitNavi(): void {\n  // 释放模拟定位插件\n  if (this.mockPlugin) {\n    this.service.initializer().resetLocationPlugin();\n    this.mockPlugin = null;\n  }\n  // 重置业务状态\n  this.serviceState = false;\n}\n```\n\n#### 11.2 停止导航\n\n导航自动结束（到达目的地）或手动停止时：\n\n```typescript\nstopNavi(): void {\n  this.service.navigationService().lifecycle().stop();\n  this.exitNavi();\n}\n```\n\n#### 11.3 销毁导航引擎\n\n页面销毁时必须释放导航实例，避免内存泄漏：\n\n```typescript\naboutToDisappear(): void {\n  this.service.initializer()\n    .unInit()\n    .then(() => {\n      Logger.info('SportHealthMap', { action: 'naviEngineDestroy', status: 'success' });\n    })\n    .catch(() => {\n      Logger.error('SportHealthMap', { action: 'naviEngineDestroy', status: 'fail' });\n    });\n}\n```\n\n---\n\n### 12. 完整开发流程总结\n\n以下是步骑行导航的典型开发流程：\n\n```\n1. 工程配置\n   └─ oh-package.json5 添加 @bdmap/map_walkride_search\n   └─ module.json5 配置权限\n\n2. 页面初始化\n   └─ aboutToAppear: 注册 TTS 插件、坐标转换\n   └─ MapComponent.onReady: 获取 MapController → 初始化导航引擎\n\n3. 路线规划\n   └─ 用户选择起终点（POI 检索 / 地图选点 / 手动输入）\n   └─ 构造 RoutePlanOption → routePlanWithRouteNode()\n   └─ onRoutePlanSuccess → displayRoutePlanResult() 展示路线\n\n4. 开始导航\n   └─ cancelRoutePlanDisplay() 清除路线展示\n   └─ lifecycle().start() 启动导航\n   └─ 渲染 walkRideDefaultUIPage 默认 UI\n\n5. 导航中\n   └─ IGuideSubStatusListener 监听偏航 / 到达等状态\n   └─ IGuideInfoListener 获取诱导 / 剩余距离等信息\n   └─ ITTSPlugin 处理语音播报\n\n6. 导航结束\n   └─ lifecycle().stop() 停止导航\n   └─ resetLocationPlugin() 释放模拟插件\n   └─ initializer().unInit() 销毁引擎\n\n7. 页面销毁\n   └─ aboutToDisappear: unInit() 释放所有资源\n```\n\n---\n\n### 13. 注意事项\n\n1. **引擎初始化时序**：`init()` 必须在 `MapComponent.onReady` 中获取 `MapController` 后调用，不可在页面构造阶段提前调用。\n2. **导航前清除路线**：调用 `start()` 前必须先执行 `cancelRoutePlanDisplay()`，否则路线展示覆盖物会与导航覆盖物冲突。\n3. **坐标系一致性**：SDK 使用百度坐标系（BD09ll），外部 WGS84/GCJ-02 数据必须通过 `CoordTrans` 转换后再传入。\n4. **模拟导航退出**：使用 `MockLocationPlugin` 后，退出导航时必须调用 `resetLocationPlugin()` 重置为默认定位插件。\n5. **引擎销毁**：页面 `aboutToDisappear` 中必须调用 `unInit()` 释放引擎资源，否则会导致内存泄漏。\n6. **默认 UI 手势穿透**：`walkRideDefaultUIPage` 必须设置 `.hitTestBehavior(HitTestMode.None)`，否则会拦截底图手势。\n7. **组合包互斥**：`@bdmap/map_walkride_search` 与独立包（`@bdmap/map` 等）不可混用，详见 [包管理规范](package-management.md)。\n8. **构建自检**：每次完成代码改动后，需在工程根目录执行 `ohpm install` 和 `hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon` 进行构建自检，详见 [构建与编码错误自检规范](build-and-test.md)。\n\nFile v1.0.2:references/reference.md\n\n# 百度地图鸿蒙SDK开发指南\n\n## 注册和获取密钥\n\n### 什么是密钥\n\n开发者在使用SDK之前需要获取百度地图移动版开发密钥（AK），该AK与您的百度账户相关联。地图初始化时需要使用AK，这是访问百度地图服务的必要前提，**请妥善保存您的AK，避免AK丢失和AK泄露。**\n\n**在哪里可以查看我已申请的AK？**\n\n点击控制台-应用管理-[我的应用](https://lbsyun.baidu.com/apiconsole/app)可查看您所申请的全部AK信息。\n\n**如果我的AK被泄露会有什么后果？**\n\nAK泄露会导致您的账号服务额度被盗用，导致服务消耗量增大，可能会消耗账户充值金额，或被他人用于从事不法活动，建议您谨慎保管您账号所有AK应用信息。\n\n**如果我的AK被泄露应该怎么办？**\n\n若AK已被泄露，建议您立即在控制台-应用管理-[我的应用](https://lbsyun.baidu.com/apiconsole/app)删除该项AK，重新更换AK进行服务调用\n\n### 获取开发密钥(AK)\n\n请在控制台-[我的应用](https://lbsyun.baidu.com/apiconsole/app)申请SDK开发密钥\n\n申请步骤大致可分为如下四个步骤：\n\n1. 若您未登录百度账号，请登录您的百度账号，如下图：\n\n（若您没有百度账号，点击右下角根据提示注册并登录）\n\n2. 登录后将进入官网控制台，如下图：\n\n3. 点击【我的应用】、【创建应用】开始申请开发密钥，如下图：\n\n4. 填写应用名称，选择【应用类型】选择“鸿蒙 SDK”、选择【启用服务】，并填写【AppID】（获取方式参考下方介绍）。如下图：\n\n注意：「启动服务」中的各项服务须勾选后才能正常使用，取消勾选会导致AK没有使用对应服务的权限，若您没有特殊要求，建议保持默认勾选。例如，如果您在申请时没有勾选“国内天气查询”，则申请到的AK访问过那天起查询时会返回无权限。\n\n**申请AK时没有选择某项服务，我该如何重新勾选**\n\n请点击控制台-应用管理-我的应用，找到对应AK点击设置，重新勾选所需服务\n\n5. 完成以上内容之后点击提交会为您生成该应用的AK，到这您就可以使用AK来开始开发工作了。\n\n### 获取AppIdentifier（官网注册所用的AppID）\n\n```typescript\n  public getBundleAppIdentifier() {\n       // 根据给定的bundle名称获取BundleInfo。 \n       // 使用此方法需要申请 ohos.permission.GET_BUNDLE_INFO权限。 \n       let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;\n       try {\n          return bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {\n          //获取appIdentifier \n             appIdentifier = data.signatureInfo.appIdentifier;\n             console.info(\"getBundleAppIdentifier successfully. Data: \" + appIdentifier );\n          }).catch(error => {\n             console.error(\"getBundleAppIdentifier failed. Cause: \" + error.message);\n          });\n       } catch (error) {\n           console.error(\"getBundleAppIdentifier failed:\" + error.message);\n       }\n}\n```\n\n获取正\n\nArchive v1.0.1: 12 files, 84277 bytes\n\nFiles: references/assets.md (1933b), references/guidelines/build-and-test.md (2429b), references/guidelines/coding-standards.md (3923b), references/guidelines/location-sdk-guide.md (18072b), references/guidelines/map-style-guide.md (11374b), references/guidelines/package-management.md (6679b), references/guidelines/performance-optimization.md (2754b), references/guidelines/ui-feedback.md (3838b), references/guidelines/walkride-sdk-guide.md (32762b), references/reference.md (120581b), SKILL.md (32033b), _meta.json (142b)\n\nArchive v1.0.0: 12 files, 83684 bytes\n\nFiles: references/assets.md (1933b), references/guidelines/build-and-test.md (2429b), references/guidelines/coding-standards.md (3923b), references/guidelines/location-sdk-guide.md (18072b), references/guidelines/map-style-guide.md (11374b), references/guidelines/package-management.md (6679b), references/guidelines/performance-optimization.md (2754b), references/guidelines/ui-feedback.md (3838b), references/guidelines/walkride-sdk-guide.md (32762b), references/reference.md (120581b), SKILL.md (30290b), _meta.json (142b)","readmeExcerpt":"Skill: Baidu Map Harmonyos SDK（百度地图官方鸿蒙 SKills） Owner: baidu-maps Summary: 帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-06-01T03:54:22.909Z | user - 新增 references/api/ 下大量 API 文档（440 个文件），覆盖 SDK 的基础模块与主要能力。 - 移除旧版元信息及 skill 说明文件，全面切换为文档化 API 结构。 - SKILL.","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"ohpm install"},{"language":"bash","snippet":"hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon"},{"language":"ts","snippet":"// ✅ 推荐：统一使用 Logger，输出结构化 JSON\nLogger.info('SportHealthMap', {\n  action: 'mapReady',\n  mapType: 'normal',\n  sdkVersion: '2.0.3'\n});\n\n// ❌ 禁止：直接使用 console\nconsole.info('map ready');"},{"language":"ts","snippet":"/**\n * 初始化百度地图 SDK。\n * @param context Ability 上下文，用于创建 MapComponent 和 LocationClient。\n * @param ak 百度地图开放平台申请到的 AK，不应硬编码在代码中。\n */\ninitBaiduMapSdk(context: common.UIAbilityContext, ak: string): void {\n  // ...\n}"},{"language":"text","snippet":"entry/src/main/ets/\n  common/\n    Logger.ts\n    PermissionHelper.ts\n    CoordinateUtil.ts\n  service/\n    RoutePlanService.ts\n    LocationService.ts\n  feature/\n    track/\n      TrackPlayer.ts"},{"language":"ts","snippet":"// 将 track_car@2x.png 拷贝到 resources/rawfile/ 后\nconst carImage = new ImageEntity('rawfile://track_car@2x.png');"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"references/api/classes/base.AlgorithmUtil.md","content":"[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / AlgorithmUtil\n\n# Class: AlgorithmUtil\n\n[base](../modules/base.md).AlgorithmUtil\n\n算法工具类\n\n## Table of contents\n\n### Methods\n\n- [aesDecryptAsync](base.AlgorithmUtil.md#aesdecryptasync)\n- [aesDecryptCRT](base.AlgorithmUtil.md#aesdecryptcrt)\n- [hexStringConvertBytes](base.AlgorithmUtil.md#hexstringconvertbytes)\n- [uint8ArrayToString](base.AlgorithmUtil.md#uint8arraytostring)\n\n## Methods\n\n### aesDecryptAsync\n\n▸ **aesDecryptAsync**(`geom`, `aesSaltKey`, `aesVitKey`): `Promise`\\<`string`\\>\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `geom` | `string` |\n| `aesSaltKey` | `string` |\n| `aesVitKey` | `string` |\n\n#### Returns\n\n`Promise`\\<`string`\\>\n\n___\n\n### aesDecryptCRT\n\n▸ **aesDecryptCRT**(`geom`, `aesSaltKey`, `aesVitKey`, `callback`): `Promise`\\<`void`\\>\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `geom` | `string` |\n| `aesSaltKey` | `string` |\n| `aesVitKey` | `string` |\n| `callback` | (`result`: `string`) => `void` |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### hexStringConvertBytes\n\n▸ **hexStringConvertBytes**(`data`): `Uint8Array`\n\n转16进制\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `data` | `string` | 密文 |\n\n#### Returns\n\n`Uint8Array`\n\n___\n\n### uint8ArrayToString\n\n▸ **uint8ArrayToString**(`array`): `string`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `array` | `Uint8Array` |\n\n#### Returns\n\n`string`"},{"path":"references/api/classes/base.BMFileUtils.md","content":"[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMFileUtils\n\n# Class: BMFileUtils\n\n[base](../modules/base.md).BMFileUtils\n\n文件操作相关工具类\n\n## Table of contents\n\n### Properties\n\n- [separator](base.BMFileUtils.md#separator)\n\n### Methods\n\n- [getFilesDirPath](base.BMFileUtils.md#getfilesdirpath)\n- [getCacheDirPath](base.BMFileUtils.md#getcachedirpath)\n- [getTempDirPath](base.BMFileUtils.md#gettempdirpath)\n- [hasDirPath](base.BMFileUtils.md#hasdirpath)\n- [getFileUri](base.BMFileUtils.md#getfileuri)\n- [getFileName](base.BMFileUtils.md#getfilename)\n- [getFilePath](base.BMFileUtils.md#getfilepath)\n- [getParentUri](base.BMFileUtils.md#getparenturi)\n- [getParentPath](base.BMFileUtils.md#getparentpath)\n- [getUriFromPath](base.BMFileUtils.md#geturifrompath)\n- [getFileExtention](base.BMFileUtils.md#getfileextention)\n- [getFileDirSize](base.BMFileUtils.md#getfiledirsize)\n- [isFile](base.BMFileUtils.md#isfile)\n- [isDirectory](base.BMFileUtils.md#isdirectory)\n- [rename](base.BMFileUtils.md#rename)\n- [renameSync](base.BMFileUtils.md#renamesync)\n- [mkdir](base.BMFileUtils.md#mkdir)\n- [mkdirSync](base.BMFileUtils.md#mkdirsync)\n- [rmdir](base.BMFileUtils.md#rmdir)\n- [rmdirSync](base.BMFileUtils.md#rmdirsync)\n- [unlink](base.BMFileUtils.md#unlink)\n- [unlinkSync](base.BMFileUtils.md#unlinksync)\n- [access](base.BMFileUtils.md#access)\n- [accessSync](base.BMFileUtils.md#accesssync)\n- [open](base.BMFileUtils.md#open)\n- [openSync](base.BMFileUtils.md#opensync)\n- [read](base.BMFileUtils.md#read)\n- [readSync](base.BMFileUtils.md#readsync)\n- [readText](base.BMFileUtils.md#readtext)\n- [readTextSync](base.BMFileUtils.md#readtextsync)\n- [write](base.BMFileUtils.md#write)\n- [writeSync](base.BMFileUtils.md#writesync)\n- [writeEasy](base.BMFileUtils.md#writeeasy)\n- [close](base.BMFileUtils.md#close)\n- [closeSync](base.BMFileUtils.md#closesync)\n- [listFile](base.BMFileUtils.md#listfile)\n- [listFileSync](base.BMFileUtils.md#listfilesync)\n- [stat](base.BMFileUtils.md#stat)\n- [statSync](base.BMFileUtils.md#statsync)\n- [copy](base.BMFileUtils.md#copy)\n- [copyFile](base.BMFileUtils.md#copyfile)\n- [copyFileSync](base.BMFileUtils.md#copyfilesync)\n- [copyDir](base.BMFileUtils.md#copydir)\n- [copyDirSync](base.BMFileUtils.md#copydirsync)\n- [moveFile](base.BMFileUtils.md#movefile)\n- [moveFileSync](base.BMFileUtils.md#movefilesync)\n- [moveDir](base.BMFileUtils.md#movedir)\n- [moveDirSync](base.BMFileUtils.md#movedirsync)\n- [truncate](base.BMFileUtils.md#truncate)\n- [truncateSync](base.BMFileUtils.md#truncatesync)\n- [lstat](base.BMFileUtils.md#lstat)\n- [lstatSync](base.BMFileUtils.md#lstatsync)\n- [fsync](base.BMFileUtils.md#fsync)\n- [fsyncSync](base.BMFileUtils.md#fsyncsync)\n- [fdatasync](base.BMFileUtils.md#fdatasync)\n- [fdatasyncSync](base.BMFileUtils.md#fdatasyncsync)\n- [createStream](base.BMFileUtils.md#createstream)\n- [createStreamSync](base.BMFileUtils.md#createstreamsync)\n- [fdopenStream](base.BMFileUtils.md#fdopenstream)\n- [fdopenStreamSync](base.BMFil"},{"path":"references/api/classes/base.BMLog.md","content":"[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMLog\n\n# Class: BMLog\n\n[base](../modules/base.md).BMLog\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.BMLog.md#constructor)\n\n### Properties\n\n- [logLevel](base.BMLog.md#loglevel)\n\n### Methods\n\n- [debug](base.BMLog.md#debug)\n- [info](base.BMLog.md#info)\n- [warn](base.BMLog.md#warn)\n- [error](base.BMLog.md#error)\n\n## Constructors\n\n### constructor\n\n• **new BMLog**(): [`BMLog`](base.BMLog.md)\n\n#### Returns\n\n[`BMLog`](base.BMLog.md)\n\n## Properties\n\n### logLevel\n\n▪ `Static` **logLevel**: `LogLevel` = `hilog.LogLevel.FATAL`\n\n## Methods\n\n### debug\n\n▸ **debug**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`\n\n___\n\n### info\n\n▸ **info**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`\n\n___\n\n### warn\n\n▸ **warn**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`\n\n___\n\n### error\n\n▸ **error**(`tag?`, `content?`, `...args`): `void`\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `tag?` | `string` |\n| `content?` | `string` |\n| `...args` | `ESObject`[] |\n\n#### Returns\n\n`void`"},{"path":"references/api/classes/base.BMStringUtils.md","content":"[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMStringUtils\n\n# Class: BMStringUtils\n\n[base](../modules/base.md).BMStringUtils\n\nstring 相关的工具类\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.BMStringUtils.md#constructor)\n\n### Methods\n\n- [isNull](base.BMStringUtils.md#isnull)\n- [isNotNull](base.BMStringUtils.md#isnotnull)\n- [isEmpty](base.BMStringUtils.md#isempty)\n- [isNotEmpty](base.BMStringUtils.md#isnotempty)\n- [replace](base.BMStringUtils.md#replace)\n- [replaceAll](base.BMStringUtils.md#replaceall)\n- [stripHtmlTags](base.BMStringUtils.md#striphtmltags)\n- [startsWith](base.BMStringUtils.md#startswith)\n- [endsWith](base.BMStringUtils.md#endswith)\n- [contains](base.BMStringUtils.md#contains)\n- [equal](base.BMStringUtils.md#equal)\n- [equalsIgnoreCase](base.BMStringUtils.md#equalsignorecase)\n- [split](base.BMStringUtils.md#split)\n- [toLower](base.BMStringUtils.md#tolower)\n- [toUpper](base.BMStringUtils.md#toupper)\n- [capitalize](base.BMStringUtils.md#capitalize)\n- [strToUint8Array](base.BMStringUtils.md#strtouint8array)\n- [unit8ArrayToStr](base.BMStringUtils.md#unit8arraytostr)\n- [strToHex](base.BMStringUtils.md#strtohex)\n- [hexToStr](base.BMStringUtils.md#hextostr)\n- [strToBase64](base.BMStringUtils.md#strtobase64)\n- [base64ToStr](base.BMStringUtils.md#base64tostr)\n- [strToBuffer](base.BMStringUtils.md#strtobuffer)\n- [bufferToStr](base.BMStringUtils.md#buffertostr)\n- [bufferToUint8Array](base.BMStringUtils.md#buffertouint8array)\n- [unit8ArrayToBuffer](base.BMStringUtils.md#unit8arraytobuffer)\n- [trimParentheses](base.BMStringUtils.md#trimparentheses)\n- [copyArray](base.BMStringUtils.md#copyarray)\n- [format](base.BMStringUtils.md#format)\n- [toDouble](base.BMStringUtils.md#todouble)\n\n## Constructors\n\n### constructor\n\n• **new BMStringUtils**(): [`BMStringUtils`](base.BMStringUtils.md)\n\n#### Returns\n\n[`BMStringUtils`](base.BMStringUtils.md)\n\n## Methods\n\n### isNull\n\n▸ **isNull**(`str`): `boolean`\n\n字符串是否为空(undefined、null)\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### isNotNull\n\n▸ **isNotNull**(`str`): `boolean`\n\n判断字符串是否为非空。true为非空，否则false\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### isEmpty\n\n▸ **isEmpty**(`str`): `boolean`\n\n字符串是否为空(undefined、null、字符串长度为0)\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### isNotEmpty\n\n▸ **isNotEmpty**(`str`): `boolean`\n\n判断字符串是否为非空。true为非空空，否则false\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `str` | `undefined` \\| ``null`` \\| `string` |\n\n#### Returns\n\n`boolean`\n\n___\n\n### replace\n\n▸ **replace**(`str`, `pattern`, `replacement?`): `string`\n\n替换字符串中匹配的正则为给定的字符串\n\n#### Parameters\n\n| Name | Type | Default value | Description |\n| :------ | :------ | :------ | :------ |\n| `str` | `string` | `"},{"path":"references/api/classes/base.BMThreadUtils.md","content":"[HarmonyNEXT地图SDK](../README.md) / [Modules](../modules.md) / [base](../modules/base.md) / BMThreadUtils\n\n# Class: BMThreadUtils\n\n[base](../modules/base.md).BMThreadUtils\n\n线程工具类\n\n## Table of contents\n\n### Constructors\n\n- [constructor](base.BMThreadUtils.md#constructor)\n\n### Properties\n\n- [mainThreadId](base.BMThreadUtils.md#mainthreadid)\n\n### Methods\n\n- [initMainThreadId](base.BMThreadUtils.md#initmainthreadid)\n- [isOnUiThread](base.BMThreadUtils.md#isonuithread)\n- [assertOnUiThread](base.BMThreadUtils.md#assertonuithread)\n- [runOnUiThread](base.BMThreadUtils.md#runonuithread)\n- [runOnTaskPool](base.BMThreadUtils.md#runontaskpool)\n- [generateTask](base.BMThreadUtils.md#generatetask)\n\n## Constructors\n\n### constructor\n\n• **new BMThreadUtils**(): [`BMThreadUtils`](base.BMThreadUtils.md)\n\n#### Returns\n\n[`BMThreadUtils`](base.BMThreadUtils.md)\n\n## Properties\n\n### mainThreadId\n\n▪ `Static` **mainThreadId**: `number` = `0`\n\n主线程ID\n\n## Methods\n\n### initMainThreadId\n\n▸ **initMainThreadId**(): `void`\n\n设置主线程ID\n\nprocess.tid可以获取到调用时的所在线程的ID，但没有直接获取到主线程的ID的api；\nAbility初始化时，通过process获取主线程ID，保存在BMThreadUtils.mainThreadId。\n\n#### Returns\n\n`void`\n\n___\n\n### isOnUiThread\n\n▸ **isOnUiThread**(): `boolean`\n\n判断是否在主线程\n\n#### Returns\n\n`boolean`\n\n如果当前所在为主线程，返回true；否则返回false\n\n___\n\n### assertOnUiThread\n\n▸ **assertOnUiThread**(): `void`\n\n判断是否在主线程，如果不是则抛出异常\n\n#### Returns\n\n`void`\n\n___\n\n### runOnUiThread\n\n▸ **runOnUiThread**(`func?`, `...args`): `Promise`\\<`void`\\>\n\n切换至主线程执行\n\n如果当前在主线程，则直接执行func；否则通过taskpool.Task发送到主线程执行。\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `func?` | `Function` | 待执行方法 |\n| `...args` | `Object`[] | 参数 |\n\n#### Returns\n\n`Promise`\\<`void`\\>\n\n___\n\n### runOnTaskPool\n\n▸ **runOnTaskPool**(`func`, `...args`): `Promise`\\<`Object`\\>\n\n切换至工作线程执行\n\napi使用限制：\n1.在工作线程执行的函数，必须有@Concurrent注解；由于@Concurrent的限制，可将方法放置于ConcurrentFuctions.ets中。\n2.在工作线程执行的函数，参数必须为可序列化的（如果需要其他不可序列化的参数，请通过全局、单例等方法在函数执行时获取）。\n\n如果待执行函数中需要向host线程回调，请直接使用原生api来实现：\n     1）设置回调函数，通过task.onReceiveData(callback)设置。\n     2）在task的func中，通过task.sendData(...args: Object[])向host线程发送数据，args为calback所需要的参数。\n\n#### Parameters\n\n| Name | Type |\n| :------ | :------ |\n| `func` | `Function` |\n| `...args` | `Object`[] |\n\n#### Returns\n\n`Promise`\\<`Object`\\>\n\n___\n\n### generateTask\n\n▸ **generateTask**(`func`, `...args`): `any`\n\n生成待执行任务\n\n#### Parameters\n\n| Name | Type | Description |\n| :------ | :------ | :------ |\n| `func` | `Function` | 待执行方法 |\n| `...args` | `Object`[] | 参数 |\n\n#### Returns\n\n`any`\n\ntaskpool.Task"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap... Skill: Baidu Map Harmonyos SDK（百度地图官方鸿蒙 SKills） Owner: baidu-maps Summary: 帮助在 HarmonyOS NEXT 上使用百度地图鸿蒙 SDK 进行开发。支持独立包（@bdmap/base、@bdmap/map、@bdmap/search、@bdmap/util）和组合包（@bdmap/map_walkride_search、@bdmap/navi_map），以及定位 SDK（@bdmap... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-06-01T03:54:22.909Z | user - 新增 references/api/ 下大量 API 文档（440 个文件），覆盖 SDK 的基础模块与主要能力。 - 移除旧版元信息及 skill 说明文件，全面切换为文档化 API 结构。 - SKILL.","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1060,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T11:18:15.349Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T11:18:15.349Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:31:11.903Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}