harmonyos-best-practices-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/README.md +121 -0
  2. package/data/docs/bpta-2in1-window-shape.md +296 -0
  3. package/data/docs/bpta-abckitts-implements-instrumentation.md +1279 -0
  4. package/data/docs/bpta-add-watermark.md +379 -0
  5. package/data/docs/bpta-ads-jump.md +67 -0
  6. package/data/docs/bpta-agent.md +472 -0
  7. package/data/docs/bpta-always-on-market-watch.md +703 -0
  8. package/data/docs/bpta-analysis-of-image-blurring.md +231 -0
  9. package/data/docs/bpta-analyze-memory-problem.md +17 -0
  10. package/data/docs/bpta-animation-frame.md +28 -0
  11. package/data/docs/bpta-antipeep-protection.md +291 -0
  12. package/data/docs/bpta-app-architecture-overview.md +25 -0
  13. package/data/docs/bpta-app-asset-protection-design.md +277 -0
  14. package/data/docs/bpta-app-code-ob.md +180 -0
  15. package/data/docs/bpta-app-concurrency-design.md +1189 -0
  16. package/data/docs/bpta-app-data-security.md +397 -0
  17. package/data/docs/bpta-app-icon-configuration.md +226 -0
  18. package/data/docs/bpta-app-privacy-protection.md +295 -0
  19. package/data/docs/bpta-application-aspect-programming-design.md +675 -0
  20. package/data/docs/bpta-application-cold-start-optimization.md +1397 -0
  21. package/data/docs/bpta-application-continue-progess.md +285 -0
  22. package/data/docs/bpta-application-gesture-share.md +468 -0
  23. package/data/docs/bpta-application-knock-file-share.md +263 -0
  24. package/data/docs/bpta-application-knock-video-share.md +552 -0
  25. package/data/docs/bpta-application-latency-optimization-cases.md +615 -0
  26. package/data/docs/bpta-application-power-analysis.md +15 -0
  27. package/data/docs/bpta-application-power-optimization.md +12 -0
  28. package/data/docs/bpta-application-power-test.md +52 -0
  29. package/data/docs/bpta-application-track-practice.md +595 -0
  30. package/data/docs/bpta-arkts-high-performance.md +464 -0
  31. package/data/docs/bpta-arkts-js-memory-analysis.md +111 -0
  32. package/data/docs/bpta-arkts-language.md +18 -0
  33. package/data/docs/bpta-arkweb-component-security.md +1134 -0
  34. package/data/docs/bpta-arkweb_rendering_framework.md +412 -0
  35. package/data/docs/bpta-aspect-implements-aop.md +505 -0
  36. package/data/docs/bpta-audio-and-video.md +30 -0
  37. package/data/docs/bpta-audio-cast.md +460 -0
  38. package/data/docs/bpta-audio-focus-management.md +862 -0
  39. package/data/docs/bpta-audio-in-ear-monitor.md +803 -0
  40. package/data/docs/bpta-audio-playback-series.md +16 -0
  41. package/data/docs/bpta-audio-record-base-on-audiocapturer.md +188 -0
  42. package/data/docs/bpta-audio-record-base-on-avrecorder-arkts.md +179 -0
  43. package/data/docs/bpta-audio-record-base-on-avrecorder.md +207 -0
  44. package/data/docs/bpta-audio-record-base-on-avscreencapture.md +165 -0
  45. package/data/docs/bpta-audio-record-base-on-ohaudio.md +162 -0
  46. package/data/docs/bpta-audio-record-overview.md +34 -0
  47. package/data/docs/bpta-audio-record.md +16 -0
  48. package/data/docs/bpta-audio-ripple-animation.md +198 -0
  49. package/data/docs/bpta-audio-video-synchronization.md +508 -0
  50. package/data/docs/bpta-audio-video.md +15 -0
  51. package/data/docs/bpta-automated-testing-frameworks.md +481 -0
  52. package/data/docs/bpta-avplayer-basic-control.md +533 -0
  53. package/data/docs/bpta-avplayer-embeded-network-video.md +486 -0
  54. package/data/docs/bpta-avplayer-embeded-short-video.md +512 -0
  55. package/data/docs/bpta-avplayer-long-video.md +907 -0
  56. package/data/docs/bpta-avplayer-short-video.md +158 -0
  57. package/data/docs/bpta-avplayer-video-practices.md +15 -0
  58. package/data/docs/bpta-avscreencapture-for-screen-recording.md +1121 -0
  59. package/data/docs/bpta-back-task-implement.md +317 -0
  60. package/data/docs/bpta-background-blur.md +316 -0
  61. package/data/docs/bpta-background-sensors-baned-analysis.md +93 -0
  62. package/data/docs/bpta-best-practices-long-list.md +891 -0
  63. package/data/docs/bpta-best-practices-overview.md +48 -0
  64. package/data/docs/bpta-bluetooth-low-energy.md +905 -0
  65. package/data/docs/bpta-buffer-mode-transcoding.md +728 -0
  66. package/data/docs/bpta-buffer-power-optimization.md +224 -0
  67. package/data/docs/bpta-camera-shot2see.md +368 -0
  68. package/data/docs/bpta-card-update-and-data-interaction.md +670 -0
  69. package/data/docs/bpta-carousel-graphic-works.md +379 -0
  70. package/data/docs/bpta-cell-phone.md +13 -0
  71. package/data/docs/bpta-click-to-click-response-optimization.md +264 -0
  72. package/data/docs/bpta-click-to-complete-delay-analysis.md +637 -0
  73. package/data/docs/bpta-collaboration-office.md +1178 -0
  74. package/data/docs/bpta-comment-reply-pop-up-window.md +523 -0
  75. package/data/docs/bpta-common-list-flows.md +688 -0
  76. package/data/docs/bpta-common-list-operations.md +828 -0
  77. package/data/docs/bpta-common-network-query.md +784 -0
  78. package/data/docs/bpta-comparative_practice_of_taskpool_and_worker.md +381 -0
  79. package/data/docs/bpta-compatible-scheme.md +11 -0
  80. package/data/docs/bpta-complex-type-pass.md +868 -0
  81. package/data/docs/bpta-component-nesting-optimization.md +421 -0
  82. package/data/docs/bpta-component-reuse-issue-diagnosis-and-analysis.md +637 -0
  83. package/data/docs/bpta-component-reuse.md +1258 -0
  84. package/data/docs/bpta-concurrency-capability.md +23 -0
  85. package/data/docs/bpta-concurrent-optimization.md +369 -0
  86. package/data/docs/bpta-content-creation.md +646 -0
  87. package/data/docs/bpta-continue-cast.md +702 -0
  88. package/data/docs/bpta-continue-data.md +335 -0
  89. package/data/docs/bpta-continue.md +1323 -0
  90. package/data/docs/bpta-control-rendering-range.md +29 -0
  91. package/data/docs/bpta-controlling-background-process-cpu.md +31 -0
  92. package/data/docs/bpta-crash-monitor-practice.md +116 -0
  93. package/data/docs/bpta-cross-domain-solutions-for-web-pages.md +308 -0
  94. package/data/docs/bpta-cross-end-migration.md +13 -0
  95. package/data/docs/bpta-cross-module-reference.md +406 -0
  96. package/data/docs/bpta-cross-platform-compatibility.md +321 -0
  97. package/data/docs/bpta-custom-camera-photo.md +454 -0
  98. package/data/docs/bpta-custom-camera-preview.md +1170 -0
  99. package/data/docs/bpta-custom-camera-video.md +322 -0
  100. package/data/docs/bpta-custom-font-settings.md +354 -0
  101. package/data/docs/bpta-custom-hvigor-plugin.md +159 -0
  102. package/data/docs/bpta-custom-keyboard.md +519 -0
  103. package/data/docs/bpta-customdialog-selection-and-development.md +406 -0
  104. package/data/docs/bpta-dark-mode-adaptation.md +321 -0
  105. package/data/docs/bpta-deal-stride-solution.md +261 -0
  106. package/data/docs/bpta-decrease_pakage_size.md +126 -0
  107. package/data/docs/bpta-delayed-trigger-operation.md +215 -0
  108. package/data/docs/bpta-desktop-shortcuts.md +180 -0
  109. package/data/docs/bpta-detection.md +12 -0
  110. package/data/docs/bpta-developing-high-performance-ui.md +19 -0
  111. package/data/docs/bpta-development-scenarios-for-tabs.md +934 -0
  112. package/data/docs/bpta-dialog-encapsulation.md +201 -0
  113. package/data/docs/bpta-dispose-highly-loaded-component-render.md +352 -0
  114. package/data/docs/bpta-distribute-drag-cast.md +60 -0
  115. package/data/docs/bpta-distributed-pasteboard-cast.md +88 -0
  116. package/data/docs/bpta-distributed-pasteboard.md +314 -0
  117. package/data/docs/bpta-drawing-capability-improve-performance.md +436 -0
  118. package/data/docs/bpta-dynamic-link-library.md +272 -0
  119. package/data/docs/bpta-easygo-parallel.md +402 -0
  120. package/data/docs/bpta-fair-use-animation.md +1693 -0
  121. package/data/docs/bpta-file-transmission-based-on-sfft.md +265 -0
  122. package/data/docs/bpta-file-upload-and-download-performance.md +484 -0
  123. package/data/docs/bpta-foldable-guide.md +205 -0
  124. package/data/docs/bpta-folded-hover.md +202 -0
  125. package/data/docs/bpta-form-kit.md +12 -0
  126. package/data/docs/bpta-frontend-invisible-animation-analysis.md +187 -0
  127. package/data/docs/bpta-full-scenario-collaborative-development.md +13 -0
  128. package/data/docs/bpta-fuzzy-scene-performance-optimization.md +256 -0
  129. package/data/docs/bpta-game-prelaunch-practice.md +175 -0
  130. package/data/docs/bpta-general-comments.md +17 -0
  131. package/data/docs/bpta-gestures-practice.md +619 -0
  132. package/data/docs/bpta-global-state-management-state-store.md +472 -0
  133. package/data/docs/bpta-gpu-acceleration-practices.md +11 -0
  134. package/data/docs/bpta-graphic-drawing-practices.md +13 -0
  135. package/data/docs/bpta-grid-based-on-scrollcomponents.md +1112 -0
  136. package/data/docs/bpta-grid-drag-swap.md +725 -0
  137. package/data/docs/bpta-hadss_dialoghub.md +786 -0
  138. package/data/docs/bpta-harmony-application-security.md +1253 -0
  139. package/data/docs/bpta-hdrtosdr.md +439 -0
  140. package/data/docs/bpta-hdrvivid.md +700 -0
  141. package/data/docs/bpta-high-cpu-load-analysis.md +113 -0
  142. package/data/docs/bpta-high-performance-json-parsing.md +263 -0
  143. package/data/docs/bpta-high-performance-protobuf-parsing.md +259 -0
  144. package/data/docs/bpta-hmos-live-stream-audio-call.md +140 -0
  145. package/data/docs/bpta-hmos-live-stream-solution.md +495 -0
  146. package/data/docs/bpta-hmrouter.md +659 -0
  147. package/data/docs/bpta-hopping.md +60 -0
  148. package/data/docs/bpta-hwc-self-rendering-layer-analysis.md +77 -0
  149. package/data/docs/bpta-image-processing-practices.md +13 -0
  150. package/data/docs/bpta-image-to-video-synthesis.md +459 -0
  151. package/data/docs/bpta-image-white-lump-solution.md +282 -0
  152. package/data/docs/bpta-image_get_and_save.md +120 -0
  153. package/data/docs/bpta-implement-timeline-based-on-canvas.md +493 -0
  154. package/data/docs/bpta-implementing-image-filters.md +406 -0
  155. package/data/docs/bpta-implementing-image-resizable.md +270 -0
  156. package/data/docs/bpta-improve-layout-performance.md +547 -0
  157. package/data/docs/bpta-improve-running-efficiency.md +187 -0
  158. package/data/docs/bpta-improve_grid_performance.md +268 -0
  159. package/data/docs/bpta-input-method-framework.md +12 -0
  160. package/data/docs/bpta-intent-recommend-practice.md +313 -0
  161. package/data/docs/bpta-js-leak-watcher.md +153 -0
  162. package/data/docs/bpta-kernel-memory-analysis.md +38 -0
  163. package/data/docs/bpta-keyboard-layout-adapt.md +725 -0
  164. package/data/docs/bpta-landscape-and-portrait-development.md +947 -0
  165. package/data/docs/bpta-layered-architecture-design.md +82 -0
  166. package/data/docs/bpta-lazyforeach-optimization.md +217 -0
  167. package/data/docs/bpta-link-between-apps-overview.md +99 -0
  168. package/data/docs/bpta-list-based-on-scrollcomponents.md +1643 -0
  169. package/data/docs/bpta-lite-wearable-guide.md +1899 -0
  170. package/data/docs/bpta-live-form-development-practice.md +544 -0
  171. package/data/docs/bpta-live-streaming-optimization.md +397 -0
  172. package/data/docs/bpta-local-file-and-data-multithreaded-io.md +367 -0
  173. package/data/docs/bpta-local-file.md +11 -0
  174. package/data/docs/bpta-lock-screen-immersive-live-window.md +473 -0
  175. package/data/docs/bpta-long-snapshot-practice.md +1046 -0
  176. package/data/docs/bpta-low-power-consumption-of-background-tasks.md +14 -0
  177. package/data/docs/bpta-low-power-consumption-of-foreground-tasks.md +14 -0
  178. package/data/docs/bpta-low-power-design-in-dark-mode.md +418 -0
  179. package/data/docs/bpta-ltpo-description.md +323 -0
  180. package/data/docs/bpta-maleoon-gpu-best-practices.md +1297 -0
  181. package/data/docs/bpta-malloc-dispatch-table.md +144 -0
  182. package/data/docs/bpta-managing-audio-input-devices.md +350 -0
  183. package/data/docs/bpta-managing-audio-output-devices.md +399 -0
  184. package/data/docs/bpta-mate-book-fold.md +229 -0
  185. package/data/docs/bpta-matetv-guide.md +223 -0
  186. package/data/docs/bpta-matext-guide.md +269 -0
  187. package/data/docs/bpta-memory-basic-knowledge.md +71 -0
  188. package/data/docs/bpta-memory-optimization.md +545 -0
  189. package/data/docs/bpta-modular-design.md +282 -0
  190. package/data/docs/bpta-multi-device-adaptive-layout.md +775 -0
  191. package/data/docs/bpta-multi-device-adaptive.md +11 -0
  192. package/data/docs/bpta-multi-device-camera.md +584 -0
  193. package/data/docs/bpta-multi-device-collaboration.md +19 -0
  194. package/data/docs/bpta-multi-device-component-layout.md +190 -0
  195. package/data/docs/bpta-multi-device-design-principles.md +26 -0
  196. package/data/docs/bpta-multi-device-function.md +99 -0
  197. package/data/docs/bpta-multi-device-hardware.md +12 -0
  198. package/data/docs/bpta-multi-device-ide.md +124 -0
  199. package/data/docs/bpta-multi-device-interaction.md +11 -0
  200. package/data/docs/bpta-multi-device-layout-overview.md +47 -0
  201. package/data/docs/bpta-multi-device-overview.md +340 -0
  202. package/data/docs/bpta-multi-device-page-layout.md +699 -0
  203. package/data/docs/bpta-multi-device-page.md +19 -0
  204. package/data/docs/bpta-multi-device-resource.md +122 -0
  205. package/data/docs/bpta-multi-device-responsive-layout.md +1274 -0
  206. package/data/docs/bpta-multi-device-responsive.md +14 -0
  207. package/data/docs/bpta-multi-device-screen-diff.md +197 -0
  208. package/data/docs/bpta-multi-device-screen-layout.md +834 -0
  209. package/data/docs/bpta-multi-device-start.md +376 -0
  210. package/data/docs/bpta-multi-device-ui-development.md +27 -0
  211. package/data/docs/bpta-multi-device-window-direction.md +1322 -0
  212. package/data/docs/bpta-multi-device-window-immersive.md +364 -0
  213. package/data/docs/bpta-multi-device-window-mode.md +1293 -0
  214. package/data/docs/bpta-multi-device-window.md +13 -0
  215. package/data/docs/bpta-multi-device.md +13 -0
  216. package/data/docs/bpta-multi-interaction.md +368 -0
  217. package/data/docs/bpta-multi-mobile-payment.md +282 -0
  218. package/data/docs/bpta-multi-music-app-overview.md +365 -0
  219. package/data/docs/bpta-multi-settings-application-page.md +163 -0
  220. package/data/docs/bpta-multi-tab-practice.md +750 -0
  221. package/data/docs/bpta-multi-target.md +490 -0
  222. package/data/docs/bpta-multi-window-practice.md +795 -0
  223. package/data/docs/bpta-multi_game.md +472 -0
  224. package/data/docs/bpta-music-card.md +1916 -0
  225. package/data/docs/bpta-music-playback-scenarios.md +120 -0
  226. package/data/docs/bpta-native-memory-analysis.md +101 -0
  227. package/data/docs/bpta-native-sub-main-comm.md +323 -0
  228. package/data/docs/bpta-navigation-scenarios.md +69 -0
  229. package/data/docs/bpta-network-ca-security.md +241 -0
  230. package/data/docs/bpta-network-reconnection.md +327 -0
  231. package/data/docs/bpta-network-resources.md +24 -0
  232. package/data/docs/bpta-news-reading.md +12 -0
  233. package/data/docs/bpta-news_homepage.md +449 -0
  234. package/data/docs/bpta-object-serialization-performance.md +12 -0
  235. package/data/docs/bpta-one-shot-to-the-end.md +932 -0
  236. package/data/docs/bpta-online-video-playback-lags-practice.md +298 -0
  237. package/data/docs/bpta-optimization-overview.md +227 -0
  238. package/data/docs/bpta-optimization-tool-practice.md +20 -0
  239. package/data/docs/bpta-package-structure.md +13 -0
  240. package/data/docs/bpta-pad-guide.md +268 -0
  241. package/data/docs/bpta-page-brightness-settings.md +256 -0
  242. package/data/docs/bpta-page-transition.md +583 -0
  243. package/data/docs/bpta-pc-guide.md +438 -0
  244. package/data/docs/bpta-pc.md +12 -0
  245. package/data/docs/bpta-perceived-smoothness.md +49 -0
  246. package/data/docs/bpta-performance-detection.md +160 -0
  247. package/data/docs/bpta-performance-guide-reading.md +50 -0
  248. package/data/docs/bpta-performance-mainthread-consumption-detection.md +11 -0
  249. package/data/docs/bpta-performance-optimization.md +23 -0
  250. package/data/docs/bpta-performance-runtime-detection.md +13 -0
  251. package/data/docs/bpta-performance-sliding-frame-drop-detection.md +19 -0
  252. package/data/docs/bpta-performance-startup-time-detection.md +13 -0
  253. package/data/docs/bpta-permission-application.md +318 -0
  254. package/data/docs/bpta-permission-timeout-analysis.md +51 -0
  255. package/data/docs/bpta-photo.md +15 -0
  256. package/data/docs/bpta-picture-preview.md +464 -0
  257. package/data/docs/bpta-picture.md +12 -0
  258. package/data/docs/bpta-playing-formatted-audio-based-avplayer-arkts.md +481 -0
  259. package/data/docs/bpta-playing-formatted-audio-based-avplayer-cpp.md +593 -0
  260. package/data/docs/bpta-playing-pcm-audio-based-audiorenderer.md +959 -0
  261. package/data/docs/bpta-playing-pcm-audio-based-ohaudio.md +599 -0
  262. package/data/docs/bpta-playing-short-audio-based-soundpool.md +182 -0
  263. package/data/docs/bpta-positioning.md +364 -0
  264. package/data/docs/bpta-power-basic-quality-test.md +35 -0
  265. package/data/docs/bpta-power-consumption-analysis.md +12 -0
  266. package/data/docs/bpta-power-consumption-develop-analysis.md +12 -0
  267. package/data/docs/bpta-power-consumption-experience.md +119 -0
  268. package/data/docs/bpta-power-consumption-runtime-analysis.md +15 -0
  269. package/data/docs/bpta-power_overview.md +26 -0
  270. package/data/docs/bpta-pptimized-component-drawing.md +27 -0
  271. package/data/docs/bpta-pre-connect.md +133 -0
  272. package/data/docs/bpta-preloading-resources.md +21 -0
  273. package/data/docs/bpta-program-framework.md +15 -0
  274. package/data/docs/bpta-properly-use-foreground-resources.md +22 -0
  275. package/data/docs/bpta-purax-guide.md +215 -0
  276. package/data/docs/bpta-quality-overview.md +79 -0
  277. package/data/docs/bpta-reader-page-flip.md +890 -0
  278. package/data/docs/bpta-reasonable-audio-playback-use.md +42 -0
  279. package/data/docs/bpta-reasonable-audio-use.md +163 -0
  280. package/data/docs/bpta-reasonable-bluetooth-use.md +52 -0
  281. package/data/docs/bpta-reasonable-gps-use.md +59 -0
  282. package/data/docs/bpta-reasonable-network-use.md +105 -0
  283. package/data/docs/bpta-reasonable-position-navigation-use.md +47 -0
  284. package/data/docs/bpta-reasonable-request-use.md +77 -0
  285. package/data/docs/bpta-reasonable-sensor-use.md +53 -0
  286. package/data/docs/bpta-reasonable-system-use.md +67 -0
  287. package/data/docs/bpta-recommended-use-of-device-id.md +79 -0
  288. package/data/docs/bpta-reduce-layout-nodes.md +30 -0
  289. package/data/docs/bpta-reduce-time-consuming.md +36 -0
  290. package/data/docs/bpta-redundancy-refresh-guide.md +409 -0
  291. package/data/docs/bpta-render-web-using-same-layer-render.md +601 -0
  292. package/data/docs/bpta-resource-and-storage-optimization.md +14 -0
  293. package/data/docs/bpta-retrieve-process-memory-info.md +49 -0
  294. package/data/docs/bpta-rich-text-display.md +475 -0
  295. package/data/docs/bpta-rich-text-editor.md +426 -0
  296. package/data/docs/bpta-risk-control-engine.md +146 -0
  297. package/data/docs/bpta-scenario-performance-optimization.md +17 -0
  298. package/data/docs/bpta-scenario-power-optimization.md +12 -0
  299. package/data/docs/bpta-scenario-stability-address-sanitizer.md +210 -0
  300. package/data/docs/bpta-scenario-stability-app-freeze.md +615 -0
  301. package/data/docs/bpta-scenario-stability-cppcrash.md +516 -0
  302. package/data/docs/bpta-scenario-stability-exception-exit.md +12 -0
  303. package/data/docs/bpta-scenario-stability-jscrash.md +922 -0
  304. package/data/docs/bpta-scenario-stability-leak.md +276 -0
  305. package/data/docs/bpta-scenario-stability.md +14 -0
  306. package/data/docs/bpta-screen-flicker-solution.md +480 -0
  307. package/data/docs/bpta-shared-bicycle.md +509 -0
  308. package/data/docs/bpta-short-video-base-adaptivevideo.md +403 -0
  309. package/data/docs/bpta-smart-reach.md +306 -0
  310. package/data/docs/bpta-smartwatch.md +755 -0
  311. package/data/docs/bpta-smartwatchnavigation.md +384 -0
  312. package/data/docs/bpta-smooth-application-design.md +225 -0
  313. package/data/docs/bpta-smooth-switching.md +294 -0
  314. package/data/docs/bpta-social-communications.md +11 -0
  315. package/data/docs/bpta-social-share.md +637 -0
  316. package/data/docs/bpta-solutions-to-special-issues.md +12 -0
  317. package/data/docs/bpta-sound-quality-switching.md +422 -0
  318. package/data/docs/bpta-spatiality-immersive.md +531 -0
  319. package/data/docs/bpta-special-text-recognition.md +137 -0
  320. package/data/docs/bpta-stability-address-illegal-way.md +190 -0
  321. package/data/docs/bpta-stability-address-sanitizer-catagory.md +212 -0
  322. package/data/docs/bpta-stability-address-sanitizer-faq.md +32 -0
  323. package/data/docs/bpta-stability-address-sanitizer-opt.md +170 -0
  324. package/data/docs/bpta-stability-address-sanitizer-overview.md +23 -0
  325. package/data/docs/bpta-stability-address-sanitizer-principle.md +179 -0
  326. package/data/docs/bpta-stability-analysis.md +17 -0
  327. package/data/docs/bpta-stability-app-analyzer.md +11 -0
  328. package/data/docs/bpta-stability-app-crash-cpp-way.md +200 -0
  329. package/data/docs/bpta-stability-app-crash-js-way.md +148 -0
  330. package/data/docs/bpta-stability-app-crash.md +13 -0
  331. package/data/docs/bpta-stability-app-freeze-ark-runtime.md +339 -0
  332. package/data/docs/bpta-stability-app-freeze-opt.md +80 -0
  333. package/data/docs/bpta-stability-app-freeze-way.md +410 -0
  334. package/data/docs/bpta-stability-app-freeze.md +12 -0
  335. package/data/docs/bpta-stability-app-killed-way.md +49 -0
  336. package/data/docs/bpta-stability-ark-detection.md +12 -0
  337. package/data/docs/bpta-stability-ark-exception-detection.md +38 -0
  338. package/data/docs/bpta-stability-ark-runtime-detection.md +134 -0
  339. package/data/docs/bpta-stability-asan-detection.md +450 -0
  340. package/data/docs/bpta-stability-coding-standard-api.md +2054 -0
  341. package/data/docs/bpta-stability-coding-standard-cpp.md +91 -0
  342. package/data/docs/bpta-stability-coding-standard-libuv.md +772 -0
  343. package/data/docs/bpta-stability-coding-standard-ndk-arkts.md +189 -0
  344. package/data/docs/bpta-stability-coding-standard-node.md +478 -0
  345. package/data/docs/bpta-stability-coding-standard.md +16 -0
  346. package/data/docs/bpta-stability-cpp-crash-opt.md +346 -0
  347. package/data/docs/bpta-stability-detection.md +14 -0
  348. package/data/docs/bpta-stability-deveco-testing.md +73 -0
  349. package/data/docs/bpta-stability-develop-detection.md +17 -0
  350. package/data/docs/bpta-stability-exception-exit-opt.md +12 -0
  351. package/data/docs/bpta-stability-fault-log.md +14 -0
  352. package/data/docs/bpta-stability-fault-type.md +31 -0
  353. package/data/docs/bpta-stability-file-handle-detection.md +96 -0
  354. package/data/docs/bpta-stability-gwpasan-detection.md +588 -0
  355. package/data/docs/bpta-stability-hwasan-detection.md +360 -0
  356. package/data/docs/bpta-stability-ide-static-detection.md +343 -0
  357. package/data/docs/bpta-stability-js-crash-opt.md +21 -0
  358. package/data/docs/bpta-stability-js-memleak-detection.md +214 -0
  359. package/data/docs/bpta-stability-leak-detection.md +15 -0
  360. package/data/docs/bpta-stability-leak-opt.md +251 -0
  361. package/data/docs/bpta-stability-leak-way.md +459 -0
  362. package/data/docs/bpta-stability-log-specs.md +31 -0
  363. package/data/docs/bpta-stability-log-standard-hilog.md +191 -0
  364. package/data/docs/bpta-stability-log-standard.md +11 -0
  365. package/data/docs/bpta-stability-memleak-detection-overview.md +109 -0
  366. package/data/docs/bpta-stability-native-memleak-detection.md +204 -0
  367. package/data/docs/bpta-stability-operate-apm.md +113 -0
  368. package/data/docs/bpta-stability-operate-app-event.md +320 -0
  369. package/data/docs/bpta-stability-operate-event.md +11 -0
  370. package/data/docs/bpta-stability-operate.md +15 -0
  371. package/data/docs/bpta-stability-opt.md +18 -0
  372. package/data/docs/bpta-stability-overview.md +17 -0
  373. package/data/docs/bpta-stability-ram-detection.md +17 -0
  374. package/data/docs/bpta-stability-runtime-address-sanitizer-detection.md +21 -0
  375. package/data/docs/bpta-stability-runtime-appkilled-detection.md +44 -0
  376. package/data/docs/bpta-stability-runtime-crash-detection.md +14 -0
  377. package/data/docs/bpta-stability-runtime-detection.md +14 -0
  378. package/data/docs/bpta-stability-runtime-exception-exit-detection.md +12 -0
  379. package/data/docs/bpta-stability-runtime-freeze-detection.md +21 -0
  380. package/data/docs/bpta-stability-runtime-leak-detection.md +31 -0
  381. package/data/docs/bpta-stability-testing.md +11 -0
  382. package/data/docs/bpta-stability-thread-detection.md +11 -0
  383. package/data/docs/bpta-stability-thread-leak-detection.md +35 -0
  384. package/data/docs/bpta-stability-tsan-detection.md +477 -0
  385. package/data/docs/bpta-stability-ubsan-detection.md +350 -0
  386. package/data/docs/bpta-startup-response-optimization.md +12 -0
  387. package/data/docs/bpta-state-refresh.md +48 -0
  388. package/data/docs/bpta-static-scenarios.md +63 -0
  389. package/data/docs/bpta-status-management.md +872 -0
  390. package/data/docs/bpta-surface-encoder.md +427 -0
  391. package/data/docs/bpta-swiper_high_performance_development_guide.md +357 -0
  392. package/data/docs/bpta-tablet-pc.md +11 -0
  393. package/data/docs/bpta-taskpool_usage_specifications_and_faqs.md +625 -0
  394. package/data/docs/bpta-text-expand-collapse.md +274 -0
  395. package/data/docs/bpta-texture-compression-improve-performance.md +336 -0
  396. package/data/docs/bpta-thread-priority-setting.md +233 -0
  397. package/data/docs/bpta-threads-serialization-timeout-analysis.md +169 -0
  398. package/data/docs/bpta-time-optimization-of-the-main-thread.md +1239 -0
  399. package/data/docs/bpta-travel-navigation.md +11 -0
  400. package/data/docs/bpta-tv.md +11 -0
  401. package/data/docs/bpta-ui-component-encapsulation.md +585 -0
  402. package/data/docs/bpta-ui-component-performance-optimization.md +597 -0
  403. package/data/docs/bpta-ui-dynamic-operations.md +618 -0
  404. package/data/docs/bpta-ui-skip-analysis.md +191 -0
  405. package/data/docs/bpta-unified-drag-and-drop.md +1189 -0
  406. package/data/docs/bpta-use-of-background-hardware-resources.md +16 -0
  407. package/data/docs/bpta-use-of-background-software-resources.md +14 -0
  408. package/data/docs/bpta-use-of-background-tasks.md +23 -0
  409. package/data/docs/bpta-utilize-hwc-efficiently.md +461 -0
  410. package/data/docs/bpta-vdeocast.md +558 -0
  411. package/data/docs/bpta-video-adaptation-based-web.md +462 -0
  412. package/data/docs/bpta-video-barrage.md +68 -0
  413. package/data/docs/bpta-video-codec.md +42 -0
  414. package/data/docs/bpta-video-component-long-video.md +659 -0
  415. package/data/docs/bpta-video-component-short-video.md +337 -0
  416. package/data/docs/bpta-video-layer.md +32 -0
  417. package/data/docs/bpta-video-practices.md +12 -0
  418. package/data/docs/bpta-video-render.md +1225 -0
  419. package/data/docs/bpta-video-rom.md +37 -0
  420. package/data/docs/bpta-video-thumbnail.md +179 -0
  421. package/data/docs/bpta-video-wifi.md +40 -0
  422. package/data/docs/bpta-vsync-power-optimization.md +116 -0
  423. package/data/docs/bpta-waterflow-based-on-scrollcomponents.md +989 -0
  424. package/data/docs/bpta-waterflow-operations.md +991 -0
  425. package/data/docs/bpta-waterflow-performance-optimization.md +191 -0
  426. package/data/docs/bpta-wavewheel-for-image-editor.md +421 -0
  427. package/data/docs/bpta-wear.md +12 -0
  428. package/data/docs/bpta-web-adaptation.md +451 -0
  429. package/data/docs/bpta-web-app-jump-and-pull-up.md +310 -0
  430. package/data/docs/bpta-web-click-response-delay-analysis.md +164 -0
  431. package/data/docs/bpta-web-completion-delay-analysis.md +209 -0
  432. package/data/docs/bpta-web-develop-optimization.md +2596 -0
  433. package/data/docs/bpta-web-development.md +15 -0
  434. package/data/docs/bpta-web-frame-rate-performance-analysis.md +252 -0
  435. package/data/docs/bpta-web-interceptor.md +724 -0
  436. package/data/docs/bpta-web-performance-optimization.md +11 -0
  437. package/data/docs/bpta-window-and-screen-management.md +12 -0
  438. package/data/docs/bpta-zhenlv.md +559 -0
  439. package/data/docs/changelog.md +1410 -0
  440. package/data/docs/low-power-consumption-suggestions.md +246 -0
  441. package/data/docs/multi-business-office.md +275 -0
  442. package/data/docs/multi-communication-app.md +240 -0
  443. package/data/docs/multi-community-app.md +257 -0
  444. package/data/docs/multi-convenient-life.md +501 -0
  445. package/data/docs/multi-financial-app.md +288 -0
  446. package/data/docs/multi-news-read.md +286 -0
  447. package/data/docs/multi-picture-app.md +219 -0
  448. package/data/docs/multi-shopping-price-comparison.md +254 -0
  449. package/data/docs/multi-short-video-app.md +315 -0
  450. package/data/docs/multi-ticket-class.md +458 -0
  451. package/data/docs/multi-travel-accommodation.md +361 -0
  452. package/data/docs/multi-travel-navigation.md +449 -0
  453. package/data/docs/multi-video-app.md +492 -0
  454. package/data/index.md +2886 -0
  455. package/dist/data.js +180 -0
  456. package/dist/index.js +203 -0
  457. package/dist/search.js +102 -0
  458. package/package.json +57 -0
  459. package/scripts/trim-code-extra.mjs +78 -0
  460. package/scripts/trim-code.mjs +106 -0
@@ -0,0 +1,379 @@
1
+ # 水印添加
2
+
3
+ > 来源: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-add-watermark
4
+ > 文档标识(fileName): bpta-add-watermark
5
+ > 目录(catalogName): best-practices
6
+ > 语言: cn
7
+ > 更新时间: 2026-06-23 03:36:07
8
+ > 导航地址: /hmos/hmos-dp1
9
+
10
+ ---
11
+ #### 概述
12
+
13
+ 在软件开发中,水印是一种在应用页面、图片或文档中嵌入的标记,它通常采用文字或图案的形式展现。水印通常有以下用途:
14
+
15
+ - 标识来源:可用于标识应用、各种文件的来源或作者,确保产权的归属。
16
+ - 版权保护:可携带版权保护信息,有效防止他人篡改、盗用、非法复制。
17
+ - 艺术效果:可作为一种艺术效果,为图片或应用增添独特的风格。
18
+
19
+ 本文通过图文与代码结合的方式,对以下几种常见的水印添加场景进行讲解,旨在让开发者理解水印添加的基本原理以及掌握开发的流程与细节。
20
+
21
+ - [页面上添加水印](#section12388834480)
22
+ - [图片上添加水印](#section987311343125)
23
+ - [PDF文档添加水印](#section7418171112138)
24
+
25
+ #### 页面上添加水印
26
+
27
+ ## 场景描述
28
+
29
+ 某个页面背景上添加水印文字,实现效果图如下。
30
+
31
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/25/v3/ZwSU-gh_R7SL4_qHHGyAIw/zh-cn_image_0000002229451785.png?HW-CC-KV=V1&HW-CC-Date=20260623T075558Z&HW-CC-Expire=86400&HW-CC-Sign=9BD2380DA0D11080AD85E345E2BD1EA04335A7711424EE4FF756C2B9741B9BDF "点击放大")
32
+
33
+ ## 实现原理
34
+
35
+ **关键技术**
36
+
37
+ [Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)提供画布组件,用于自定义绘制图形。使用[CanvasRenderingContext2D](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d)对象在[Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)组件上进行绘制,其中[fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d#filltext)方法用于绘制文本,[drawImage()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d#drawimage)方法用于图像绘制。
38
+
39
+ **开发流程**
40
+
41
+ 1. 创建[Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)画布,在画布上绘制水印。
42
+ 2. 使用[Stack](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-stack)组件或[浮层overlay](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-overlay#overlay)属性,将画布与UI页面组件融合显示。
43
+
44
+ ## 开发步骤
45
+
46
+ 1. 封装水印组件
47
+ 1. 创建Canvas组件,监听[Canvas.onReady](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas#事件)事件,该事件回调在Canvas组件初始化完成时或大小变化时执行,在回调中进行水印绘制draw()方法的执行。并通过设置Canvas组件的[hitTestBehavior](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-hit-test-behavior#hittestbehavior)属性,使水印组件不影响其他组件的触摸测试,让页面能正常交互。
48
+
49
+ ```
50
+ @Component
51
+ export struct Watermark {
52
+ private settings: RenderingContextSettings = new RenderingContextSettings(true);
53
+ private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
54
+ // ...
55
+ build() {
56
+ Canvas(this.context)
57
+ .width('100%')
58
+ .height('100%')
59
+ .hitTestBehavior(HitTestMode.Transparent)
60
+ .onReady(() => this.draw())
61
+ }
62
+ }
63
+ ```
64
+ 2. 实现绘制水印draw()方法。绘制的起点默认为坐标轴的原点(画布的左上角),通过坐标轴的平移及旋转,实现在画布的不同位置、不同角度绘制水印。如果水印有一定旋转角度,想保证第一个水印能完整显示,需要对绘制的起点做平移,平移距离通过旋转角度及水印宽高计算。
65
+ - 旋转角度大于0,由下图可知,水印沿x轴方向平移距离positionX = tan(θ) * 水印高度,即绘制起点为(positionX, 0)。
66
+
67
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/40/v3/0B0L4fKJTmmURlAacxd5Ww/zh-cn_image_0000002229337289.png?HW-CC-KV=V1&HW-CC-Date=20260623T075558Z&HW-CC-Expire=86400&HW-CC-Sign=806A816B994171286636F27740C01E505B9C3BA7BB93D081335875C1949A5E5C "点击放大")
68
+ - 旋转角度小于0,由下图可知,水印沿y轴方向平移距离positionY = tan(θ) * 水印宽度,即绘制起点为(0, positionY)。
69
+
70
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/5f/v3/NVFMq32fTvKvuY-c-kEMTA/zh-cn_image_0000002229337285.png?HW-CC-KV=V1&HW-CC-Date=20260623T075558Z&HW-CC-Expire=86400&HW-CC-Sign=249323B300929CCE70BBD3D3772E82BAC2DC5FB124C431B22FC2632DF815B486 "点击放大")
71
+
72
+ 最终通过[CanvasRenderingContext2D.fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d#filltext)方法进行水印文字的绘制。
73
+
74
+ ```
75
+ @Prop watermarkWidth: number = 120;
76
+ @Prop watermarkHeight: number = 120;
77
+ @Prop watermarkText: string = this.getWatermarkText();
78
+ @Prop rotationAngle: number = -30;
79
+ @Prop fillColor: string | number | CanvasGradient | CanvasPattern = '#10000000';
80
+ @Prop font: string = '16vp';
81
+
82
+ draw() {
83
+ this.context.fillStyle = this.fillColor;
84
+ this.context.font = this.font;
85
+ const colCount = Math.ceil(this.context.width / this.watermarkWidth);
86
+ const rowCount = Math.ceil(this.context.height / this.watermarkHeight);
87
+ for (let col = 0; col <= colCount; col++) {
88
+ let row = 0;
89
+ for (; row <= rowCount; row++) {
90
+ const angle = this.rotationAngle * Math.PI / 180;
91
+ this.context.rotate(angle);
92
+ const positionX = this.rotationAngle > 0 ? this.watermarkHeight * Math.tan(angle) : 0;
93
+ const positionY = this.rotationAngle > 0 ? 0 : this.watermarkWidth * Math.tan(-angle);
94
+ this.context.fillText(this.watermarkText, positionX, positionY);
95
+ this.context.rotate(-angle);
96
+ this.context.translate(0, this.watermarkHeight);
97
+ }
98
+ this.context.translate(0, -this.watermarkHeight * row);
99
+ this.context.translate(this.watermarkWidth, 0);
100
+ }
101
+ }
102
+ ```
103
+ 2. 将水印组件与UI页面组件融合显示。
104
+
105
+ 方式一:使用Stack将水印组件叠加在UI组件上层。
106
+
107
+ ```
108
+ Stack({ alignContent: Alignment.Center }) {
109
+ Column() {
110
+ Image($r('app.media.empty'))
111
+ .width(110)
112
+ .height(88)
113
+ // ...
114
+ }
115
+ Watermark({ rotationAngle: 20 })
116
+ }
117
+ ```
118
+
119
+ 方式二:设置UI组件的overlay属性,使水印组件作为UI组件的浮层显示。注意watermarkBuilder中嵌套了一层父元素Column,所以需要同时设置Column的[hitTestBehavior](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-hit-test-behavior#hittestbehavior)属性,使浮层下方页面能正常交互。
120
+
121
+ ```
122
+ @Builder
123
+ watermarkBuilder() {
124
+ Column() {
125
+ Watermark()
126
+ }
127
+ .hitTestBehavior(HitTestMode.Transparent)
128
+ }
129
+ build() {
130
+ // ...
131
+ Column() {
132
+ Image($r('app.media.empty'))
133
+ .width(110)
134
+ .height(88)
135
+ // ...
136
+ }
137
+ .justifyContent(FlexAlign.Center)
138
+ .alignItems(HorizontalAlign.Center)
139
+ .layoutWeight(1)
140
+ .overlay(this.watermarkBuilder())
141
+ // ...
142
+ }
143
+ ```
144
+
145
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/d7/v3/eQjnUxfgSjmdKVXeprNldA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260623T075558Z&HW-CC-Expire=86400&HW-CC-Sign=5883C63433C65CB828C3832D80BC3E73A1F474396BC54D03421E91F1DB2627A7)
146
+
147
+ 如果需要多个页面或应用全局添加水印,可将上述方式二中的watermarkBuilder封装到一个单独的文件,export出一个全局的watermarkBuilder。在需要添加水印页面的根节点上添加.overlay绑定watermarkBuilder即可。
148
+
149
+ #### 图片上添加水印
150
+
151
+ ## 场景描述
152
+
153
+ 保存的图片、拍照生成的图片等场景,需要添加水印。实现效果图如下。
154
+
155
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3f/v3/exK2Qs7-Rm60-hfxan93cg/zh-cn_image_0000002229451781.png?HW-CC-KV=V1&HW-CC-Date=20260623T075558Z&HW-CC-Expire=86400&HW-CC-Sign=F9E1259111C264657A92A039E177C677E29298B5744E079C080EE073C4DDA334 "点击放大")
156
+
157
+ ## 实现原理
158
+
159
+ **关键技术**
160
+
161
+ [OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)提供离屏画布,与[Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)使用场景区别在于是否需要将画布渲染在屏幕上。使用[OffscreenCanvasRenderingContext2D](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d)在[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)上进行离屏绘制,其中[fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#filltext)方法用于绘制文本,[drawImage()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#drawimage)方法用于图像绘制。
162
+
163
+ **开发流程**
164
+
165
+ 1. 解析图片得到pixelMap数据。
166
+ 2. 创建与图片宽高一致的[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)离屏画布。
167
+ 3. 将图片和水印依次绘制到离屏画布上。
168
+ 4. 获取离屏画布的pixelMap数据。
169
+ 5. 将pixelMap数据写入文件中。
170
+
171
+ ## 开发步骤
172
+
173
+ 1. 解析图片得到pixelMap数据。
174
+ 1. 使用[resourceManager.getMediaContent()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-resource-manager#getmediacontent9-1)方法获取图片内容,得到ArrayBuffer数据。使用[image.createImageSource(buf: ArrayBuffer)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-f#imagecreateimagesource9-2)方法创建图片源实例。
175
+
176
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/b3/v3/IimCugPKQjmAG3jP_Ul7AQ/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260623T075558Z&HW-CC-Expire=86400&HW-CC-Sign=D33C623914CFB13690B0437D517F005E0E3492B655CD600631828BC9F18F514C)
177
+
178
+ ImagePixelMap为自定义类型:{ pixelMap: image.PixelMap, width: number, height: number }。
179
+
180
+ ```
181
+ async getImagePixelMap(resource: Resource): Promise<ImagePixelMap | undefined> {
182
+ let result: ImagePixelMap | undefined = undefined;
183
+ try {
184
+ const data: Uint8Array =
185
+ await this.getUIContext().getHostContext()?.resourceManager.getMediaContent(resource.id) as Uint8Array;
186
+ const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteLength + data.byteOffset);
187
+ const imageSource: image.ImageSource = image.createImageSource(arrayBuffer);
188
+ result = await imageSource2PixelMap(imageSource);
189
+ } catch (e) {
190
+ let err = e as BusinessError;
191
+ hilog.error(0x0000, TAG, `failed code=${err.code}, message=${err.message}`);
192
+ }
193
+ return result;
194
+ }
195
+ ```
196
+ 2. 使用[ImageSource.getImageInfo()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-imagesource#getimageinfo-2)方法获取图片宽、高信息,使用[ImageSource.createPixelMap()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-imagesource#createpixelmap7)方法创建PixelMap对象。
197
+
198
+ ```
199
+ export async function imageSource2PixelMap(imageSource: image.ImageSource): Promise<ImagePixelMap> {
200
+ const imageInfo: image.ImageInfo = await imageSource.getImageInfo();
201
+ const height = imageInfo.size.height;
202
+ const width = imageInfo.size.width;
203
+ const options: image.DecodingOptions = {
204
+ editable: true,
205
+ desiredSize: { height, width }
206
+ };
207
+ const pixelMap: PixelMap = await imageSource.createPixelMap(options);
208
+ const result: ImagePixelMap = { pixelMap, width, height };
209
+ return result;
210
+ }
211
+ ```
212
+ 2. 通过[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)离屏画布绘制图片及水印,得到融合水印后的pixelMap数据。
213
+ 1. 创建与图片宽高一致的[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)离屏画布,这里注意单位保持一致。
214
+ 2. 使用[OffscreenCanvasRenderingContext2D.drawImage()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#drawimage)将图片绘制到离屏画布上。
215
+ 3. 使用[OffscreenCanvasRenderingContext2D.fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#filltext)将水印绘制在离屏画布的指定位置。
216
+ 4. 使用[OffscreenCanvasRenderingContext2D.getPixelMap()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#getpixelmap)以当前离屏画布指定区域内的像素创建PixelMap对象。
217
+
218
+ ```
219
+ export function addWatermark(
220
+ imagePixelMap: ImagePixelMap,
221
+ text: string = 'watermark',
222
+ drawWatermark?: (OffscreenContext: OffscreenCanvasRenderingContext2D) => void
223
+ ): image.PixelMap {
224
+ const height = uiContext?.px2vp(imagePixelMap.height) as number;
225
+ const width = uiContext?.px2vp(imagePixelMap.width) as number;
226
+ const offScreenCanvas = new OffscreenCanvas(width, height);
227
+ const offScreenContext = offScreenCanvas.getContext('2d');
228
+ offScreenContext.drawImage(imagePixelMap.pixelMap, 0, 0, width, height);
229
+ if (drawWatermark) {
230
+ drawWatermark(offScreenContext);
231
+ } else {
232
+ let displayWidth: number = 0;
233
+ try {
234
+ displayWidth = display.getDefaultDisplaySync().width;
235
+ } catch (e) {
236
+ let err = e as BusinessError;
237
+ hilog.error(0x0000, TAG, `failed code=${err.code}, message=${err.message}`);
238
+ }
239
+ const vpWidth = uiContext?.px2vp(displayWidth) ?? displayWidth;
240
+ const imageScale = width / vpWidth;
241
+ offScreenContext.textAlign = 'right';
242
+ offScreenContext.fillStyle = '#A2FFFFFF';
243
+ offScreenContext.font = 12 * imageScale + 'vp';
244
+ const padding = 5 * imageScale;
245
+ offScreenContext.fillText(text, width - padding, height - padding);
246
+ }
247
+ return offScreenContext.getPixelMap(0, 0, width, height);
248
+ }
249
+ ```
250
+ 3. 将添加水印后得到的pixelMap数据写入文件中。
251
+
252
+ ```
253
+ export async function saveToFile(pixelMap: image.PixelMap, context: Context): Promise<void> {
254
+ try {
255
+ const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
256
+ const filePath = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png');
257
+ const imagePacker = image.createImagePacker();
258
+ const imageBuffer = await imagePacker.packToData(pixelMap, {
259
+ format: 'image/png',
260
+ quality: 100
261
+ });
262
+ const mode = fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE;
263
+ fd = (await fileIo.open(filePath, mode)).fd;
264
+ await fileIo.truncate(fd);
265
+ await fileIo.write(fd, imageBuffer);
266
+ } catch (err) {
267
+ hilog.error(0x0000, TAG, 'saveToFile error:', JSON.stringify(err) ?? '');
268
+ } finally {
269
+ try {
270
+ if (fd) {
271
+ fileIo.close(fd);
272
+ }
273
+ } catch (e) {
274
+ let err = e as BusinessError;
275
+ hilog.error(0x0000, TAG, `close failed code=${err.code}, message=${err.message}`);
276
+ }
277
+ }
278
+ }
279
+ ```
280
+
281
+ #### PDF文档添加水印
282
+
283
+ ## 场景描述
284
+
285
+ 在PDF预览页面点击添加水印按钮,生成带水印的PDF文档,并显示在预览页面中。
286
+
287
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c9/v3/CMuGFRSXSsWD5CmkvRGKTw/zh-cn_image_0000002229337293.png?HW-CC-KV=V1&HW-CC-Date=20260623T075558Z&HW-CC-Expire=86400&HW-CC-Sign=A902D53A3ABF9B77B88E71D35277522ECFF6C070810E1720F9D18381EEDD15EC "点击放大")
288
+
289
+ ## 实现原理
290
+
291
+ **关键技术**
292
+
293
+ [pdfService](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice)模块为应用提供统一管理PDF页面的页眉页脚、水印、背景、批注、书签的能力。[TextWatermarkInfo](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#textwatermarkinfo)类和[ImageWatermarkInfo](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#imagewatermarkinfo)分别提供创建文本水印和图片水印的能力。[PdfDocument](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#pdfdocument)类提供与文档相关能力,其中[addWatermark()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#addwatermark)方法用于添加水印。
294
+
295
+ **开发流程**
296
+
297
+ 1. 将应用侧PDF文件写入沙箱中。
298
+ 2. 使用[pdfService](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice)模块相关API加载指定沙箱路径的PDF并添加水印。
299
+
300
+ ## 开发步骤
301
+
302
+ 1. 使用[getRawFileContentSync()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-resource-manager#getrawfilecontentsync10)方法获取resource/rawfile目录下的PDF文件内容,使用[writeSync()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs#writesync10)方法写入沙箱中。
303
+
304
+ ```
305
+ savePdfToSandbox(): string {
306
+ const filePath = this.getPdfSandboxPath();
307
+ try {
308
+ fileIo.accessSync(filePath);
309
+ const content: Uint8Array = this.getUIContext().getHostContext()?.resourceManager.getRawFileContentSync('watermark.pdf') as Uint8Array;
310
+ const file = fileIo.openSync(filePath, fileIo.OpenMode.WRITE_ONLY | fileIo.OpenMode.CREATE | fileIo.OpenMode.TRUNC);
311
+ fileIo.writeSync(file.fd, content.buffer);
312
+ fileIo.closeSync(file.fd);
313
+ } catch (e) {
314
+ let err = e as BusinessError;
315
+ hilog.error(0x0000, TAG, `savePdfToSandbox failed code=${err.code}, message=${err.message}`);
316
+ }
317
+ return filePath;
318
+ }
319
+ ```
320
+ 2. 使用[PdfController](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfviewmanage#pdfcontroller)控制器中的[loadDocument()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#loaddocument)方法通过沙箱路径加载文件,显示到PDF预览组件[PdfView](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfview-component)中。
321
+
322
+ ```
323
+ private controller: pdfViewManager.PdfController = new pdfViewManager.PdfController();
324
+ // ...
325
+ aboutToAppear(): void {
326
+ const filePath = this.savePdfToSandbox();
327
+ this.controller.loadDocument(filePath);
328
+ }
329
+ // ...
330
+ build() {
331
+ // ...
332
+ PdfView({
333
+ controller: this.controller,
334
+ pageFit: pdfService.PageFit.FIT_WIDTH
335
+ })
336
+ // ...
337
+ ```
338
+ 3. 通过文本水印类TextWatermarkInfo创建水印对象,设置水印内容、字体、颜色、位置等相关属性;图片水印对象通过ImageWatermarkInfo创建。
339
+
340
+ ```
341
+ getWatermarkInfo() {
342
+ const watermarkInfo: pdfService.TextWatermarkInfo = new pdfService.TextWatermarkInfo();
343
+ watermarkInfo.watermarkType = pdfService.WatermarkType.WATERMARK_TEXT;
344
+ watermarkInfo.content = 'This is Watermark';
345
+ watermarkInfo.textSize = 32;
346
+ watermarkInfo.textColor = 200;
347
+ watermarkInfo.rotation = 45;
348
+ watermarkInfo.opacity = 0.3;
349
+ return watermarkInfo;
350
+ }
351
+ ```
352
+ 4. 通过PDF文档类PdfDocument创建文档对象,使用文档对象的loadDocument()方法加载文档,addWatermark()方法添加水印、[saveDocument()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#savedocument)方法将添加水印后的文档保存到沙箱中。
353
+
354
+ ```
355
+ addWatermark() {
356
+ const filePath = this.getPdfSandboxPath();
357
+ let pdfDocument: pdfService.PdfDocument = new pdfService.PdfDocument();
358
+ pdfDocument.loadDocument(filePath);
359
+ pdfDocument.addWatermark(this.getWatermarkInfo(), 0, pdfDocument.getPageCount(), true, true);
360
+ const watermarkFilePath = this.getAddedWatermarkPdfSandboxPath();
361
+ pdfDocument.saveDocument(watermarkFilePath);
362
+ this.showInPdfView(watermarkFilePath);
363
+ }
364
+ ```
365
+ 5. 将沙箱中添加水印后的文档加载到PDF预览器中。
366
+
367
+ ```
368
+ async showInPdfView(filePath: string) {
369
+ this.hasWatermark = true;
370
+ // release before reload avoid crash.
371
+ this.controller.releaseDocument();
372
+ await this.controller.loadDocument(filePath);
373
+ this.controller.setPageFit(pdfService.PageFit.FIT_WIDTH);
374
+ }
375
+ ```
376
+
377
+ #### 示例代码
378
+
379
+ - [实现添加水印功能](https://gitcode.com/harmonyos_samples/watermark)
@@ -0,0 +1,67 @@
1
+ # 广告跳转
2
+
3
+ > 来源: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-ads-jump
4
+ > 文档标识(fileName): bpta-ads-jump
5
+ > 目录(catalogName): best-practices
6
+ > 语言: cn
7
+ > 更新时间: 2026-06-23 03:35:01
8
+ > 导航地址: /hmos/hmos-dp1
9
+
10
+ ---
11
+ #### 概述
12
+
13
+ 在移动应用或Web开发中,广告跳转是一种常见的商业模式,通过引导用户点击广告并跳转到目标页面(例如应用下载、商品详情、活动页等)来实现流量变现或推广。
14
+
15
+ 典型场景:例如视频应用作为广告载体,用户在开屏广告中点击商品广告后,系统自动跳转到商城应用的商品详情页。这样既提升了广告转化率,也优化了用户体验。
16
+
17
+ [](https://contentcenter-videovali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_300_3/4d/v3/Ml6UClqIS66HyhB5IFomkg/zh-cn_media_0000002284717440.mp4?HW-CC-KV=V1&HW-CC-Date=20260623T075538Z&HW-CC-Expire=86400&HW-CC-Sign=750992E248E25DE54C88A3E2905E82C6F499A45FDBA75E38459FEF70C132FFFE)
18
+
19
+ 本文以广告目标方(如商城应用)的开发为主,介绍商城应用如何通过App Linking技术,支持视频应用等外部广告载体高效拉起商城应用商品页,并完善未安装、延迟跳转等各种链路,从而实现完整的广告变现闭环。
20
+
21
+ #### 实现原理
22
+
23
+ 广告跳转链路涉及两个应用,具体如下:
24
+
25
+ - 广告载体方(如视频应用):承担广告展示与落地页跳转功能。
26
+ - 广告目标方(如商城应用):被外部应用拉起,承接点击流量至商品详情页。
27
+
28
+ 广告跳转的流程图如下所示。
29
+
30
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/1b/v3/4StvzceKTA6nbuF2OlJOlQ/zh-cn_image_0000002319470037.png?HW-CC-KV=V1&HW-CC-Date=20260623T075538Z&HW-CC-Expire=86400&HW-CC-Sign=F347F06927D0F24E90A8A2EAE294C887BF7FB78794FBE558377B5E83F811F653 "点击放大")
31
+
32
+ 跳转过程基于[App Linking](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-linking-startup)能力,分为几种情况:
33
+
34
+ 1. 商城应用已安装
35
+
36
+ 用户在视频应用广告页点击商品,系统通过App Linking直接拉起商城应用并跳转到指定商品详情页。
37
+ 2. 商城应用未安装,配置直达应用市场
38
+
39
+ 点击广告后由系统自动跳转至商城应用在应用市场的详情页,用户下载安装后,首次打开即可通过延迟链接直接定位到对应商品页。
40
+ 3. 商城应用未安装,未配置直达应用市场
41
+
42
+ 点击广告后,系统拉起商城应用的Web页面(商品详情页),用户可直接浏览或通过页面引导下载安装商城应用。后续如完成安装,仍能保留原始跳转意图,实现直达商品页。
43
+
44
+ #### 开发步骤
45
+
46
+ 1. [配置App Linking服务](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-social-share#section109826570198)。
47
+ - 在AGC(AppGallery Connect)后台为商城应用开通[App Linking](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-linking-startup)能力,正确配置商品详情页的深度链接与参数。
48
+ - 确认所有需要被广告载体(如视频应用)跳转的页面均能通过App Linking唯一链接定位。
49
+ 2. 开发商品详情Web页面
50
+ - 实现商品详情的Web页面,保证当商城应用未安装时,点击跳转链接可以展示同样的商品信息。
51
+ - 在Web页面中,可以提供“打开商城应用”“下载商城应用”等引导按钮,增强用户转化率。
52
+ - 参考[Web页面开发与部署](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-social-share#section157709544229)完成部署与配置。
53
+
54
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/1e/v3/EBxC2VujSPeCYpYk2PatIQ/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260623T075538Z&HW-CC-Expire=86400&HW-CC-Sign=6CC2B9068DAF67C16FBAB5E53D84DB0EDC1EA6F965581EB08C26138AC6BE59C4)
55
+
56
+ 如果广告载体方(如视频应用)希望在自身应用内直接打开商城应用的商品详情Web页面,可以在调用[openLink()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-uiabilitycontext#openlink12)接口时,将参数appLinkingOnly设置为true。这样当无法拉起商城应用时,系统不会自动跳转到浏览器打开Web页面,而是通过失败回调返回结果。
57
+
58
+ 广告载体方(如视频应用)可在回调中自行处理异常,例如手动跳转到商城应用的商品详情Web页面,实现更灵活的跳转控制。
59
+ 3. 配置直达应用市场能力(可选)
60
+ - 若目标是让用户优先安装商城应用以获得完整体验,建议在App Linking配置中启用[直达应用市场](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/applinking-direct-to-ag)能力。
61
+ - 用户点击广告,如果商城应用未安装,将直接进入商城应用的应用市场页面,无须经过Web中转。
62
+ 4. 实现延迟链接能力
63
+ - 配置并实现[延迟链接](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/applinking-deferredlink)(Deferred Link)功能。
64
+ - 用户在广告链路中下载安装商城应用后,首次打开应用可自动恢复跳转到指定商品页,保证广告流量完整转化。
65
+ 5. 向广告载体方(如视频应用)提供标准App Linking跳转链接
66
+
67
+ 将每一个商品的App Linking链接提供给广告载体(如视频应用),广告点击后调用openLink()接口进行跳转。