@tencent-rtc/mcp 1.4.7 → 1.6.0-beta.1

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 (552) hide show
  1. package/cursor-setting.png +0 -0
  2. package/knowledge/bm25-cache.js +74 -0
  3. package/knowledge/bm25-cache.js.map +1 -0
  4. package/knowledge/bm25.js +148 -0
  5. package/knowledge/bm25.js.map +1 -0
  6. package/knowledge/build-index.js +70 -0
  7. package/knowledge/build-index.js.map +1 -0
  8. package/knowledge/chunker.js +168 -0
  9. package/knowledge/chunker.js.map +1 -0
  10. package/knowledge/content-loader.js +40 -0
  11. package/knowledge/content-loader.js.map +1 -0
  12. package/knowledge/doc-url-resolver.js +143 -0
  13. package/knowledge/doc-url-resolver.js.map +1 -0
  14. package/knowledge/extractors.js +26 -0
  15. package/knowledge/extractors.js.map +1 -0
  16. package/knowledge/path-meta.js +185 -0
  17. package/knowledge/path-meta.js.map +1 -0
  18. package/knowledge/search/exact-lookup.js +498 -0
  19. package/knowledge/search/exact-lookup.js.map +1 -0
  20. package/knowledge/search/filter-pool.js +105 -0
  21. package/knowledge/search/filter-pool.js.map +1 -0
  22. package/knowledge/search/product-scope-intent.js +41 -0
  23. package/knowledge/search/product-scope-intent.js.map +1 -0
  24. package/knowledge/search/requires-framework.js +82 -0
  25. package/knowledge/search/requires-framework.js.map +1 -0
  26. package/knowledge/search/search-knowledge.js +230 -0
  27. package/knowledge/search/search-knowledge.js.map +1 -0
  28. package/mcp-server-prompt.png +0 -0
  29. package/package.json +1 -1
  30. package/resource/_schema/feature-aliases.yaml +10 -0
  31. package/resource/_schema/goal-tags.yaml +72 -0
  32. package/resource/_schema/products.yaml +19 -0
  33. package/resource/_schema/trtc-intents.yaml +27 -0
  34. package/resource/_schema/types.yaml +43 -0
  35. package/resource/index/component-slugs.json +1 -0
  36. package/resource/index/doc-source-urls.json +1 -0
  37. package/resource/index/manifest.json +1 -0
  38. package/resource/{doc → integration}/callkit/preset/android/integration.md +34 -28
  39. package/resource/integration/callkit/preset/flutter/integration.md +346 -0
  40. package/resource/integration/callkit/preset/ios/integration.md +408 -0
  41. package/resource/integration/callkit/preset/react/integration.md +362 -0
  42. package/resource/integration/callkit/preset/vue/integration.md +356 -0
  43. package/resource/integration/chat/preset/android/integration.md +500 -0
  44. package/resource/integration/chat/preset/flutter/integration.md +370 -0
  45. package/resource/integration/chat/preset/ios/integration.md +566 -0
  46. package/resource/integration/chat/preset/react/integration.md +490 -0
  47. package/resource/integration/chat/preset/vue/integration.md +504 -0
  48. package/resource/{doc → integration}/livekit/preset/live/vue/live-list-integration.md +26 -22
  49. package/resource/{doc → integration}/livekit/preset/live/vue/live-player-desk-integration.md +22 -18
  50. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +309 -0
  51. package/resource/{doc → integration}/livekit/preset/live/vue/live-pusher-integration.md +47 -39
  52. package/resource/integration/roomkit/preset/vue/integration.md +562 -0
  53. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +828 -0
  54. package/resource/knowledge/callkit/core-sdk/android/make-call.md +897 -0
  55. package/resource/knowledge/callkit/core-sdk/android/offline-push.md +363 -0
  56. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +1111 -0
  57. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +1132 -0
  58. package/resource/{doc → knowledge}/callkit/core-sdk/flutter/offline-push.md +174 -151
  59. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +1084 -0
  60. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +1252 -0
  61. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +534 -0
  62. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +953 -0
  63. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +1061 -0
  64. package/resource/knowledge/callkit/faq/android.md +92 -0
  65. package/resource/{doc/callkit/faq/android-faq.md → knowledge/callkit/faq/common.md} +11 -12
  66. package/resource/knowledge/callkit/faq/error-code.md +67 -0
  67. package/resource/knowledge/callkit/faq/flutter.md +52 -0
  68. package/resource/knowledge/callkit/faq/ios.md +104 -0
  69. package/resource/knowledge/callkit/faq/web.md +74 -0
  70. package/resource/knowledge/callkit/preset/android/api.md +412 -0
  71. package/resource/knowledge/callkit/preset/flutter/api.md +22 -0
  72. package/resource/knowledge/callkit/preset/ios/api.md +234 -0
  73. package/resource/knowledge/callkit/preset/web/api.md +83 -0
  74. package/resource/knowledge/chat/preset/android/features/chat-setting.md +74 -0
  75. package/resource/knowledge/chat/preset/android/features/contact-list.md +43 -0
  76. package/resource/knowledge/chat/preset/android/features/conversation-list.md +117 -0
  77. package/resource/knowledge/chat/preset/android/features/language.md +136 -0
  78. package/resource/knowledge/chat/preset/android/features/message-input.md +57 -0
  79. package/resource/knowledge/chat/preset/android/features/message-list.md +142 -0
  80. package/resource/knowledge/chat/preset/android/features/search.md +64 -0
  81. package/resource/knowledge/chat/preset/android/features/theme.md +222 -0
  82. package/resource/knowledge/chat/preset/android-view/integration.md +300 -0
  83. package/resource/knowledge/chat/preset/flutter/features/chat-setting.md +64 -0
  84. package/resource/knowledge/chat/preset/flutter/features/contact-list.md +40 -0
  85. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +129 -0
  86. package/resource/knowledge/chat/preset/flutter/features/language.md +104 -0
  87. package/resource/knowledge/chat/preset/flutter/features/message-input.md +54 -0
  88. package/resource/knowledge/chat/preset/flutter/features/message-list.md +158 -0
  89. package/resource/knowledge/chat/preset/flutter/features/search.md +59 -0
  90. package/resource/knowledge/chat/preset/flutter/features/theme.md +261 -0
  91. package/resource/knowledge/chat/preset/ios/features/chat-setting.md +94 -0
  92. package/resource/knowledge/chat/preset/ios/features/contact-list.md +119 -0
  93. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +134 -0
  94. package/resource/knowledge/chat/preset/ios/features/language.md +125 -0
  95. package/resource/knowledge/chat/preset/ios/features/message-input.md +69 -0
  96. package/resource/knowledge/chat/preset/ios/features/message-list.md +162 -0
  97. package/resource/knowledge/chat/preset/ios/features/search.md +93 -0
  98. package/resource/knowledge/chat/preset/ios/features/theme.md +270 -0
  99. package/resource/{doc/chatkit/ios → knowledge/chat/preset/ios-uikit}/integration.md +160 -158
  100. package/resource/knowledge/chat/preset/react/features/chat-setting.md +101 -0
  101. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/contact-list.md +43 -41
  102. package/resource/knowledge/chat/preset/react/features/conversation-actions.md +215 -0
  103. package/resource/knowledge/chat/preset/react/features/conversation-list.md +339 -0
  104. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +101 -0
  105. package/resource/knowledge/chat/preset/react/features/conversation-search.md +61 -0
  106. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/message-input.md +117 -156
  107. package/resource/knowledge/chat/preset/react/features/message-list.md +297 -0
  108. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/search.md +65 -59
  109. package/resource/knowledge/chat/preset/react/features/theme.md +93 -0
  110. package/resource/knowledge/chat/preset/vue/features/chat-header.md +331 -0
  111. package/resource/knowledge/chat/preset/vue/features/chat-setting.md +79 -0
  112. package/resource/knowledge/chat/preset/vue/features/contact-list.md +277 -0
  113. package/resource/knowledge/chat/preset/vue/features/conversation-actions.md +234 -0
  114. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +331 -0
  115. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +216 -0
  116. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/conversation-search.md +13 -13
  117. package/resource/knowledge/chat/preset/vue/features/message-input.md +551 -0
  118. package/resource/knowledge/chat/preset/vue/features/message-list.md +350 -0
  119. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/search.md +79 -73
  120. package/resource/knowledge/chat/preset/vue/features/theme.md +136 -0
  121. package/resource/knowledge/chat/urls/error-code.md +17 -0
  122. package/resource/knowledge/chat/urls/product.md +43 -0
  123. package/resource/knowledge/chat/urls/restapi.md +204 -0
  124. package/resource/knowledge/chat/urls/sdk/android.md +80 -0
  125. package/resource/knowledge/chat/urls/sdk/flutter.md +71 -0
  126. package/resource/knowledge/chat/urls/sdk/ios.md +80 -0
  127. package/resource/knowledge/chat/urls/sdk/web.md +80 -0
  128. package/resource/knowledge/chat/urls/webhook.md +68 -0
  129. package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +286 -0
  130. package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +174 -0
  131. package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +329 -0
  132. package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +55 -0
  133. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +434 -0
  134. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +362 -0
  135. package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +466 -0
  136. package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +173 -0
  137. package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +51 -0
  138. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +291 -0
  139. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +78 -0
  140. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +488 -0
  141. package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +219 -0
  142. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +282 -0
  143. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +212 -0
  144. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +153 -0
  145. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +312 -0
  146. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +404 -0
  147. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +334 -0
  148. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +426 -0
  149. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +166 -0
  150. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +52 -0
  151. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +281 -0
  152. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +150 -0
  153. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +438 -0
  154. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +190 -0
  155. package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +291 -0
  156. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +192 -0
  157. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +146 -0
  158. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +309 -0
  159. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +370 -0
  160. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +339 -0
  161. package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +503 -0
  162. package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +188 -0
  163. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +51 -0
  164. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +289 -0
  165. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +78 -0
  166. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +487 -0
  167. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +183 -0
  168. package/resource/knowledge/livekit/core-sdk/api-reference/web/index.md +736 -0
  169. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audience-list.md +53 -47
  170. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audio-effect.md +28 -24
  171. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-barrage.md +22 -18
  172. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-base-beauty.md +17 -15
  173. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-co-guest-interaction.md +19 -18
  174. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-gift.md +102 -89
  175. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-host-interaction.md +41 -37
  176. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-integration.md +45 -43
  177. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-live-list.md +23 -20
  178. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audience-list.md +41 -41
  179. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audio-effect.md +70 -69
  180. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-barrage.md +68 -71
  181. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-base-beauty.md +43 -47
  182. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-co-guest-interaction.md +59 -56
  183. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-gift.md +103 -105
  184. package/resource/knowledge/livekit/core-sdk/live/flutter/live-host-interaction.md +869 -0
  185. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-integration.md +84 -87
  186. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-live-list.md +43 -40
  187. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audience-list.md +11 -10
  188. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audio-effect.md +28 -24
  189. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-barrage.md +22 -18
  190. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-base-beauty.md +15 -14
  191. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-co-guest-interaction.md +19 -18
  192. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-gift.md +54 -50
  193. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-host-interaction.md +41 -37
  194. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-integration.md +40 -40
  195. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-live-list.md +19 -18
  196. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audience-list.md +53 -47
  197. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audio-effect.md +28 -24
  198. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-barrage.md +22 -18
  199. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-co-guest-interaction.md +41 -33
  200. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-gift.md +94 -81
  201. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-host-interaction.md +35 -30
  202. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-integration.md +45 -42
  203. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-room-list.md +23 -20
  204. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audience-list.md +260 -0
  205. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audio-effect.md +598 -0
  206. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-barrage.md +490 -0
  207. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-co-guest-interaction.md +65 -59
  208. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-gift.md +424 -0
  209. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-integration.md +69 -76
  210. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-room-list.md +726 -0
  211. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audience-list.md +11 -10
  212. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audio-effect.md +28 -24
  213. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-barrage.md +22 -18
  214. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-co-guest-interaction.md +41 -33
  215. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-gift.md +54 -50
  216. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-host-interaction.md +35 -30
  217. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-integration.md +49 -46
  218. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-room-list.md +19 -18
  219. package/resource/knowledge/livekit/faq/error-code.md +193 -0
  220. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/barrage.md +56 -53
  221. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-audience-list.md +22 -21
  222. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-view.md +34 -32
  223. package/resource/knowledge/push/config/android.md +92 -0
  224. package/resource/knowledge/push/config/harmonyos.md +83 -0
  225. package/resource/knowledge/push/config/ios.md +254 -0
  226. package/resource/knowledge/push/config/react-native.md +254 -0
  227. package/resource/knowledge/push/config/unity.md +209 -0
  228. package/resource/knowledge/push/config/unreal-engine.md +194 -0
  229. package/resource/knowledge/push/integration/android.md +404 -0
  230. package/resource/knowledge/push/integration/flutter.md +465 -0
  231. package/resource/knowledge/push/integration/harmonyos.md +63 -0
  232. package/resource/knowledge/push/integration/ios.md +246 -0
  233. package/resource/knowledge/push/integration/react-native.md +366 -0
  234. package/resource/knowledge/push/integration/uni-app.md +208 -0
  235. package/resource/knowledge/push/integration/unity.md +389 -0
  236. package/resource/knowledge/push/integration/unreal-engine.md +390 -0
  237. package/resource/knowledge/push/overview/prepare.md +60 -0
  238. package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +241 -0
  239. package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +588 -0
  240. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +364 -0
  241. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +340 -0
  242. package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +230 -0
  243. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +797 -0
  244. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +325 -0
  245. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +325 -0
  246. package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +233 -0
  247. package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +569 -0
  248. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +325 -0
  249. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +322 -0
  250. package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +221 -0
  251. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/device-detection.md +49 -48
  252. package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +461 -0
  253. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +216 -0
  254. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +370 -0
  255. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-participant-state.md +61 -60
  256. package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +280 -0
  257. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-view.md +57 -56
  258. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +319 -0
  259. package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +267 -0
  260. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +261 -0
  261. package/resource/knowledge/roomkit/preset/android/integration.md +396 -0
  262. package/resource/knowledge/roomkit/preset/flutter/integration.md +404 -0
  263. package/resource/knowledge/roomkit/preset/ios/integration.md +369 -0
  264. package/resource/knowledge/roomkit/preset/react/integration.md +576 -0
  265. package/resource/knowledge/rtcengine/web/how_to_run_web_sdk_demo.md +44 -0
  266. package/resource/{doc → knowledge}/rtcengine/web/plugin/21-advanced-auto-play-policy.md +8 -2
  267. package/resource/{doc → knowledge}/rtcengine/web/plugin/22-advanced-audio-mixer.md +19 -1
  268. package/resource/{doc → knowledge}/rtcengine/web/plugin/23-advanced-support-detection.md +1 -1
  269. package/resource/{doc → knowledge}/rtcengine/web/plugin/24-advanced-network-quality.md +8 -8
  270. package/resource/{doc → knowledge}/rtcengine/web/plugin/25-advanced-device-change.md +1 -1
  271. package/resource/{doc → knowledge}/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +6 -6
  272. package/resource/{doc → knowledge}/rtcengine/web/plugin/27-advanced-small-stream.md +3 -3
  273. package/resource/{doc → knowledge}/rtcengine/web/plugin/29-advanced-water-mark.md +18 -0
  274. package/resource/{doc → knowledge}/rtcengine/web/plugin/31-advanced-plugins-overview.md +1 -1
  275. package/resource/{doc → knowledge}/rtcengine/web/plugin/34-advanced-proxy.md +2 -2
  276. package/resource/{doc → knowledge}/rtcengine/web/plugin/35-advanced-ai-denoiser.md +1 -1
  277. package/resource/knowledge/trtc/android/TRTCCloud.md +1915 -0
  278. package/resource/knowledge/trtc/android/TRTCCloudDef.md +1029 -0
  279. package/resource/knowledge/trtc/android/TRTCCloudListener.md +1095 -0
  280. package/resource/knowledge/trtc/android/TRTCStatistics.md +68 -0
  281. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +502 -0
  282. package/resource/knowledge/trtc/android/TXBeautyManager.md +415 -0
  283. package/resource/knowledge/trtc/android/TXDeviceManager.md +169 -0
  284. package/resource/knowledge/trtc/android/TXLiteAVCode.md +125 -0
  285. package/resource/knowledge/trtc/c++/ITRTCCloud.md +2069 -0
  286. package/resource/knowledge/trtc/c++/ITRTCStatistics.md +73 -0
  287. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +502 -0
  288. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +391 -0
  289. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +1191 -0
  290. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +931 -0
  291. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +127 -0
  292. package/resource/knowledge/trtc/ios/TRTCCloud.md +2118 -0
  293. package/resource/knowledge/trtc/ios/TRTCCloudDef.md +975 -0
  294. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +1131 -0
  295. package/resource/knowledge/trtc/ios/TRTCStatistics.md +68 -0
  296. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +423 -0
  297. package/resource/knowledge/trtc/ios/TXBeautyManager.md +416 -0
  298. package/resource/knowledge/trtc/ios/TXDeviceManager.md +387 -0
  299. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +127 -0
  300. package/server.js +35 -11
  301. package/server.js.map +1 -1
  302. package/tools/call/get_native_call_uikit_integration.js +2 -3
  303. package/tools/call/get_native_call_uikit_integration.js.map +1 -1
  304. package/tools/call/get_native_callkit_core_integration.js +2 -5
  305. package/tools/call/get_native_callkit_core_integration.js.map +1 -1
  306. package/tools/call/get_web_call_uikit_integration.js +2 -3
  307. package/tools/call/get_web_call_uikit_integration.js.map +1 -1
  308. package/tools/chat/get_native_chat_uikit_integration.js +2 -3
  309. package/tools/chat/get_native_chat_uikit_integration.js.map +1 -1
  310. package/tools/chat/get_web_chat_uikit_integration.js +2 -3
  311. package/tools/chat/get_web_chat_uikit_integration.js.map +1 -1
  312. package/tools/common/present_framework_choice.js +19 -13
  313. package/tools/common/present_framework_choice.js.map +1 -1
  314. package/tools/common/record_answer.js +19 -25
  315. package/tools/common/record_answer.js.map +1 -1
  316. package/tools/common/record_feedback.js +17 -30
  317. package/tools/common/record_feedback.js.map +1 -1
  318. package/tools/common/search_trtc_knowledge.js +45 -0
  319. package/tools/common/search_trtc_knowledge.js.map +1 -0
  320. package/tools/definitions/get_native_call_uikit_integration_def.js +3 -1
  321. package/tools/definitions/get_native_call_uikit_integration_def.js.map +1 -1
  322. package/tools/definitions/get_native_callkit_core_integration_def.js +5 -3
  323. package/tools/definitions/get_native_callkit_core_integration_def.js.map +1 -1
  324. package/tools/definitions/get_native_chat_uikit_integration_def.js +5 -2
  325. package/tools/definitions/get_native_chat_uikit_integration_def.js.map +1 -1
  326. package/tools/definitions/get_native_livekit_core_integration_def.js +6 -5
  327. package/tools/definitions/get_native_livekit_core_integration_def.js.map +1 -1
  328. package/tools/definitions/get_web_call_uikit_integration_def.js +4 -2
  329. package/tools/definitions/get_web_call_uikit_integration_def.js.map +1 -1
  330. package/tools/definitions/get_web_chat_uikit_integration_def.js +2 -0
  331. package/tools/definitions/get_web_chat_uikit_integration_def.js.map +1 -1
  332. package/tools/definitions/get_web_live_uikit_integration_def.js +5 -5
  333. package/tools/definitions/get_web_live_uikit_integration_def.js.map +1 -1
  334. package/tools/definitions/get_web_room_core_integration_def.js +50 -0
  335. package/tools/definitions/get_web_room_core_integration_def.js.map +1 -0
  336. package/tools/definitions/get_web_room_uikit_integration_def.js +5 -4
  337. package/tools/definitions/get_web_room_uikit_integration_def.js.map +1 -1
  338. package/tools/definitions/integration-boundary.js +6 -0
  339. package/tools/definitions/integration-boundary.js.map +1 -0
  340. package/tools/definitions/present_framework_choice_def.js +12 -10
  341. package/tools/definitions/present_framework_choice_def.js.map +1 -1
  342. package/tools/definitions/record_answer_def.js +19 -17
  343. package/tools/definitions/record_answer_def.js.map +1 -1
  344. package/tools/definitions/record_feedback_def.js +14 -13
  345. package/tools/definitions/record_feedback_def.js.map +1 -1
  346. package/tools/definitions/search_trtc_knowledge_def.js +40 -0
  347. package/tools/definitions/search_trtc_knowledge_def.js.map +1 -0
  348. package/tools/index.js +5 -36
  349. package/tools/index.js.map +1 -1
  350. package/tools/live/get_native_livekit_core_integration.js +1 -3
  351. package/tools/live/get_native_livekit_core_integration.js.map +1 -1
  352. package/tools/live/get_web_live_uikit_integration.js +2 -4
  353. package/tools/live/get_web_live_uikit_integration.js.map +1 -1
  354. package/tools/room/get_web_room_core_integration.js +48 -0
  355. package/tools/room/get_web_room_core_integration.js.map +1 -0
  356. package/tools/room/get_web_room_uikit_integration.js +2 -3
  357. package/tools/room/get_web_room_uikit_integration.js.map +1 -1
  358. package/utils/generate-structured-result.js +24 -30
  359. package/utils/generate-structured-result.js.map +1 -1
  360. package/utils/get-doc-content.js +14 -8
  361. package/utils/get-doc-content.js.map +1 -1
  362. package/utils/report-cls-client.js +18 -20
  363. package/utils/report-cls-client.js.map +1 -1
  364. package/utils/report-es-client.js +1 -1
  365. package/resource/doc/callkit/core-sdk/.gitkeep +0 -0
  366. package/resource/doc/callkit/core-sdk/android/answer-call.md +0 -852
  367. package/resource/doc/callkit/core-sdk/android/make-call.md +0 -954
  368. package/resource/doc/callkit/core-sdk/android/offline-push.md +0 -361
  369. package/resource/doc/callkit/core-sdk/flutter/answer-call.md +0 -1160
  370. package/resource/doc/callkit/core-sdk/flutter/make-call.md +0 -1205
  371. package/resource/doc/callkit/core-sdk/ios/answer-call.md +0 -1090
  372. package/resource/doc/callkit/core-sdk/ios/make-call.md +0 -1248
  373. package/resource/doc/callkit/core-sdk/ios/offline-push.md +0 -485
  374. package/resource/doc/callkit/core-sdk/uni-app/answer-call.md +0 -950
  375. package/resource/doc/callkit/core-sdk/uni-app/make-call.md +0 -1052
  376. package/resource/doc/callkit/faq/common/error-code.md +0 -47
  377. package/resource/doc/callkit/faq/flutter-faq.md +0 -115
  378. package/resource/doc/callkit/faq/ios-faq.md +0 -115
  379. package/resource/doc/callkit/faq/web-faq.md +0 -36
  380. package/resource/doc/callkit/preset/android/api.md +0 -296
  381. package/resource/doc/callkit/preset/flutter/api.md +0 -410
  382. package/resource/doc/callkit/preset/flutter/integration.md +0 -164
  383. package/resource/doc/callkit/preset/ios/api.md +0 -80
  384. package/resource/doc/callkit/preset/ios/integration.md +0 -187
  385. package/resource/doc/callkit/preset/react/api.md +0 -501
  386. package/resource/doc/callkit/preset/react/integration.md +0 -86
  387. package/resource/doc/callkit/preset/vue/api.md +0 -501
  388. package/resource/doc/callkit/preset/vue/integration.md +0 -83
  389. package/resource/doc/chatkit/android/faq.md +0 -111
  390. package/resource/doc/chatkit/android/features/theme.md +0 -219
  391. package/resource/doc/chatkit/android/integration.md +0 -490
  392. package/resource/doc/chatkit/faq/android_sdk/client-api.md +0 -281
  393. package/resource/doc/chatkit/faq/common/product.md +0 -7
  394. package/resource/doc/chatkit/faq/common/server.md +0 -44
  395. package/resource/doc/chatkit/faq/common/server_error_code.md +0 -74
  396. package/resource/doc/chatkit/faq/flutter_sdk/client-api.md +0 -199
  397. package/resource/doc/chatkit/faq/flutter_sdk/faq.md +0 -53
  398. package/resource/doc/chatkit/faq/ios_sdk/client-api.md +0 -235
  399. package/resource/doc/chatkit/faq/web_sdk/error_code.md +0 -47
  400. package/resource/doc/chatkit/faq/web_sdk/faq.md +0 -287
  401. package/resource/doc/chatkit/flutter/faq.md +0 -23
  402. package/resource/doc/chatkit/flutter/features/theme.md +0 -235
  403. package/resource/doc/chatkit/flutter/integration.md +0 -344
  404. package/resource/doc/chatkit/ios/faq.md +0 -111
  405. package/resource/doc/chatkit/ios/features/theme.md +0 -267
  406. package/resource/doc/chatkit/react/components/avatar.md +0 -104
  407. package/resource/doc/chatkit/react/components/chat-header.md +0 -148
  408. package/resource/doc/chatkit/react/components/chat-setting.md +0 -57
  409. package/resource/doc/chatkit/react/components/chat.md +0 -38
  410. package/resource/doc/chatkit/react/components/component-list.md +0 -37
  411. package/resource/doc/chatkit/react/components/conversation-actions.md +0 -174
  412. package/resource/doc/chatkit/react/components/conversation-list.md +0 -333
  413. package/resource/doc/chatkit/react/components/conversation-preview.md +0 -118
  414. package/resource/doc/chatkit/react/components/conversation-search.md +0 -60
  415. package/resource/doc/chatkit/react/components/message-list.md +0 -293
  416. package/resource/doc/chatkit/react/components/tuikit.md +0 -34
  417. package/resource/doc/chatkit/react/faq.md +0 -26
  418. package/resource/doc/chatkit/react/integration.md +0 -416
  419. package/resource/doc/chatkit/vue/components/avatar.md +0 -104
  420. package/resource/doc/chatkit/vue/components/chat-header.md +0 -148
  421. package/resource/doc/chatkit/vue/components/chat-setting.md +0 -62
  422. package/resource/doc/chatkit/vue/components/chat.md +0 -45
  423. package/resource/doc/chatkit/vue/components/component-list.md +0 -87
  424. package/resource/doc/chatkit/vue/components/contact-list.md +0 -271
  425. package/resource/doc/chatkit/vue/components/conversation-actions.md +0 -228
  426. package/resource/doc/chatkit/vue/components/conversation-list.md +0 -320
  427. package/resource/doc/chatkit/vue/components/conversation-preview.md +0 -213
  428. package/resource/doc/chatkit/vue/components/message-input.md +0 -1054
  429. package/resource/doc/chatkit/vue/components/message-list.md +0 -433
  430. package/resource/doc/chatkit/vue/components/tuikit.md +0 -31
  431. package/resource/doc/chatkit/vue/components/userpicker.md +0 -256
  432. package/resource/doc/chatkit/vue/faq.md +0 -36
  433. package/resource/doc/chatkit/vue/integration.md +0 -428
  434. package/resource/doc/livekit/core-sdk/live/flutter/live-host-interaction.md +0 -866
  435. package/resource/doc/livekit/faq/common/error-code.md +0 -88
  436. package/resource/doc/livekit/preset/live/vue/api-reference/index.md +0 -780
  437. package/resource/doc/livekit/preset/live/vue/components/co-guest-panel.md +0 -91
  438. package/resource/doc/livekit/preset/live/vue/components/live-scene-panel.md +0 -112
  439. package/resource/doc/livekit/preset/live/vue/components/stream-mixer.md +0 -215
  440. package/resource/doc/livekit/preset/live/vue/live-player-h5-integration.md +0 -300
  441. package/resource/doc/roomkit/faq/common/error-code.md +0 -67
  442. package/resource/doc/roomkit/vue/features/call-user-to-room.md +0 -220
  443. package/resource/doc/roomkit/vue/features/device-state.md +0 -460
  444. package/resource/doc/roomkit/vue/features/free-beauty-panel.md +0 -215
  445. package/resource/doc/roomkit/vue/features/room-chat.md +0 -369
  446. package/resource/doc/roomkit/vue/features/room-state.md +0 -282
  447. package/resource/doc/roomkit/vue/features/schedule-room.md +0 -318
  448. package/resource/doc/roomkit/vue/features/screen-share.md +0 -265
  449. package/resource/doc/roomkit/vue/features/virtual-background.md +0 -271
  450. package/resource/doc/roomkit/vue/integration.md +0 -315
  451. package/resource/doc/rtcengine/faq/common/error_code.md +0 -1
  452. package/resource/doc/rtcengine/faq/web_sdk/.gitkeep +0 -0
  453. package/resource/doc/rtcengine/web/.gitkeep +0 -0
  454. package/resource/doc/rtcengine/web/how_to_run_web_sdk_demo.md +0 -59
  455. package/resource/doc/trtc/C++/ITRTCCloud.md +0 -1970
  456. package/resource/doc/trtc/C++/ITRTCStatistics.md +0 -70
  457. package/resource/doc/trtc/C++/ITXAudioEffectManager.md +0 -469
  458. package/resource/doc/trtc/C++/ITXDeviceManager.md +0 -387
  459. package/resource/doc/trtc/C++/TRTCCloudCallback.md +0 -1082
  460. package/resource/doc/trtc/C++/TRTCTypeDef.md +0 -925
  461. package/resource/doc/trtc/C++/TXLiteAVCode.md +0 -129
  462. package/resource/doc/trtc/android/TRTCCloud.md +0 -1815
  463. package/resource/doc/trtc/android/TRTCCloudDef.md +0 -992
  464. package/resource/doc/trtc/android/TRTCCloudListener.md +0 -1004
  465. package/resource/doc/trtc/android/TRTCStatistics.md +0 -65
  466. package/resource/doc/trtc/android/TXAudioEffectManager.md +0 -469
  467. package/resource/doc/trtc/android/TXBeautyManager.md +0 -402
  468. package/resource/doc/trtc/android/TXDeviceManager.md +0 -173
  469. package/resource/doc/trtc/android/TXLiteAVCode.md +0 -127
  470. package/resource/doc/trtc/iOS/TRTCCloud.md +0 -2028
  471. package/resource/doc/trtc/iOS/TRTCCloudDef.md +0 -958
  472. package/resource/doc/trtc/iOS/TRTCCloudDelegate.md +0 -1046
  473. package/resource/doc/trtc/iOS/TRTCStatistics.md +0 -65
  474. package/resource/doc/trtc/iOS/TXAudioEffectManager.md +0 -397
  475. package/resource/doc/trtc/iOS/TXBeautyManager.md +0 -403
  476. package/resource/doc/trtc/iOS/TXDeviceManager.md +0 -381
  477. package/resource/doc/trtc/iOS/TXLiteAVCode.md +0 -130
  478. package/tools/call/get_callkit_api.js +0 -33
  479. package/tools/call/get_callkit_api.js.map +0 -1
  480. package/tools/chat/get_native_chat_uikit_feature_detail.js +0 -35
  481. package/tools/chat/get_native_chat_uikit_feature_detail.js.map +0 -1
  482. package/tools/chat/get_web_chat_uikit_component_detail.js +0 -35
  483. package/tools/chat/get_web_chat_uikit_component_detail.js.map +0 -1
  484. package/tools/common/get_faq.js +0 -266
  485. package/tools/common/get_faq.js.map +0 -1
  486. package/tools/common/record_skill_session.js +0 -69
  487. package/tools/common/record_skill_session.js.map +0 -1
  488. package/tools/definitions/get_callkit_api_def.js +0 -29
  489. package/tools/definitions/get_callkit_api_def.js.map +0 -1
  490. package/tools/definitions/get_faq_def.js +0 -47
  491. package/tools/definitions/get_faq_def.js.map +0 -1
  492. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js +0 -31
  493. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js.map +0 -1
  494. package/tools/definitions/get_native_livekit_core_features_def.js +0 -34
  495. package/tools/definitions/get_native_livekit_core_features_def.js.map +0 -1
  496. package/tools/definitions/get_native_trtc_sdk_docs_def.js +0 -32
  497. package/tools/definitions/get_native_trtc_sdk_docs_def.js.map +0 -1
  498. package/tools/definitions/get_web_chat_uikit_component_detail_def.js +0 -31
  499. package/tools/definitions/get_web_chat_uikit_component_detail_def.js.map +0 -1
  500. package/tools/definitions/get_web_livekit_api_def.js +0 -30
  501. package/tools/definitions/get_web_livekit_api_def.js.map +0 -1
  502. package/tools/definitions/get_web_livekit_component_detail_def.js +0 -32
  503. package/tools/definitions/get_web_livekit_component_detail_def.js.map +0 -1
  504. package/tools/definitions/get_web_roomkit_feature_detail_def.js +0 -31
  505. package/tools/definitions/get_web_roomkit_feature_detail_def.js.map +0 -1
  506. package/tools/definitions/get_web_trtc_sdk_api_def.js +0 -27
  507. package/tools/definitions/get_web_trtc_sdk_api_def.js.map +0 -1
  508. package/tools/definitions/get_web_trtc_sdk_integration_def.js +0 -27
  509. package/tools/definitions/get_web_trtc_sdk_integration_def.js.map +0 -1
  510. package/tools/definitions/get_web_trtc_sdk_plugin_def.js +0 -27
  511. package/tools/definitions/get_web_trtc_sdk_plugin_def.js.map +0 -1
  512. package/tools/definitions/record_skill_session_def.js +0 -31
  513. package/tools/definitions/record_skill_session_def.js.map +0 -1
  514. package/tools/live/get_native_livekit_core_features.js +0 -68
  515. package/tools/live/get_native_livekit_core_features.js.map +0 -1
  516. package/tools/live/get_web_livekit_api.js +0 -33
  517. package/tools/live/get_web_livekit_api.js.map +0 -1
  518. package/tools/live/get_web_livekit_component_detail.js +0 -35
  519. package/tools/live/get_web_livekit_component_detail.js.map +0 -1
  520. package/tools/room/get_web_roomkit_feature_detail.js +0 -69
  521. package/tools/room/get_web_roomkit_feature_detail.js.map +0 -1
  522. package/tools/rtcengine/get_web_trtc_sdk_api.js +0 -32
  523. package/tools/rtcengine/get_web_trtc_sdk_api.js.map +0 -1
  524. package/tools/rtcengine/get_web_trtc_sdk_integration.js +0 -32
  525. package/tools/rtcengine/get_web_trtc_sdk_integration.js.map +0 -1
  526. package/tools/rtcengine/get_web_trtc_sdk_plugin.js +0 -32
  527. package/tools/rtcengine/get_web_trtc_sdk_plugin.js.map +0 -1
  528. package/tools/trtc/get_native_trtc_sdk_docs.js +0 -74
  529. package/tools/trtc/get_native_trtc_sdk_docs.js.map +0 -1
  530. package/utils/build-session-directives.js +0 -120
  531. package/utils/build-session-directives.js.map +0 -1
  532. package/utils/handle-framework.js +0 -9
  533. package/utils/handle-framework.js.map +0 -1
  534. package/utils/handle-state-name.js +0 -29
  535. package/utils/handle-state-name.js.map +0 -1
  536. package/utils/report-runtime-error-cls-client.js +0 -91
  537. package/utils/report-runtime-error-cls-client.js.map +0 -1
  538. /package/resource/{doc/livekit/preset/live/vue/faq.md → knowledge/push/config/donut.md} +0 -0
  539. /package/resource/{doc/roomkit/vue/faq.md → knowledge/push/integration/donut.md} +0 -0
  540. /package/resource/{doc → knowledge}/rtcengine/web/api.md +0 -0
  541. /package/resource/{doc/rtcengine/faq/web/web.md → knowledge/rtcengine/web/faq.md} +0 -0
  542. /package/resource/{doc → knowledge}/rtcengine/web/how_to_integrated_web_sdk.md +0 -0
  543. /package/resource/{doc → knowledge}/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +0 -0
  544. /package/resource/{doc → knowledge}/rtcengine/web/plugin/28-advanced-beauty.md +0 -0
  545. /package/resource/{doc → knowledge}/rtcengine/web/plugin/30-advanced-cross-room-link.md +0 -0
  546. /package/resource/{doc → knowledge}/rtcengine/web/plugin/36-advanced-virtual-background.md +0 -0
  547. /package/resource/{doc → knowledge}/rtcengine/web/plugin/37-advanced-voice-changer.md +0 -0
  548. /package/resource/{doc → knowledge}/rtcengine/web/plugin/39-advanced-video-decoder.md +0 -0
  549. /package/resource/{doc → knowledge}/rtcengine/web/plugin/40-advanced-video-mixer.md +0 -0
  550. /package/resource/{doc → knowledge}/rtcengine/web/plugin/41-advanced-small-stream-auto-switcher.md +0 -0
  551. /package/resource/{doc → knowledge}/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +0 -0
  552. /package/resource/{doc → knowledge}/rtcengine/web/plugin/43-advanced-face-detection.md +0 -0
@@ -0,0 +1,1132 @@
1
+ This guide shows you how to use the **AtomicXCore SDK** components—**DeviceStore**, **CallStore**, and **CallCoreView**—to quickly implement an audio/video call feature.
2
+
3
+ ## Core Features
4
+
5
+ To build multi-party audio/video call scenarios with **AtomicXCore**, you’ll need these three modules:
6
+
7
+ |**Module**|**Description**|
8
+ |---------|---------|
9
+ |[CallCoreView](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_view_call_call_core_view/CallCoreView-class.html)|Core UI component for calls. Automatically observes CallStore data and renders the interface, switching layouts between 1v1 and group calls as needed.|
10
+ |[CallStore](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallStore-class.html)|Manages the call lifecycle: make, answer, reject, hang up. Provides real-time status for participants’ audio/video, call duration, call history, and more.|
11
+ |[DeviceStore](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_device_device_store/DeviceStore-class.html)|Controls audio/video devices: microphone (toggle/volume), camera (toggle/switch/quality), screen sharing, and monitors device status in real time.|
12
+
13
+ ## Preparation
14
+
15
+ ### Step 1: Activate the Service
16
+
17
+ To obtain either a trial or paid version of the SDK, follow the instructions in Activate the Service.
18
+
19
+ ### Step 2: Integrate the SDK
20
+
21
+ **Install the package:** In your project root, run:
22
+ ``` bash
23
+ flutter pub add atomic_x_core
24
+ ```
25
+
26
+ ### Step 3: Initialize and Log in
27
+
28
+ #### Android Configuration
29
+ 1. The SDK uses Java reflection, so you must prevent certain SDK classes from being obfuscated.
30
+
31
+ - In your project’s `android/app/` directory, update `build.gradle.kts` or `build.gradle` to enable Proguard rules:
32
+
33
+ ``` java
34
+ android {
35
+ buildTypes {
36
+ release {
37
+ isMinifyEnabled = true
38
+ proguardFiles(
39
+ getDefaultProguardFile("proguard-android.txt"),
40
+ "proguard-rules.pro"
41
+ )
42
+ }
43
+ }
44
+ }
45
+ ```
46
+ ``` java
47
+ android {
48
+ buildTypes {
49
+ release {
50
+ minifyEnabled true
51
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
52
+ }
53
+ }
54
+ }
55
+ ```
56
+ - Create a `proguard-rules.pro` file in `android/app` and add:
57
+
58
+ ``` java
59
+ -keep class com.tencent.** { *; }
60
+ ```
61
+ 2. (Optional) To enable CallKit’s floating window outside the app, turn on system Picture-in-Picture for `MainActivity` in `AndroidManifest.xml`:
62
+
63
+ ``` xml
64
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
65
+ <application>
66
+ <activity
67
+ android:name=".MainActivity"
68
+ android:supportsPictureInPicture="true"
69
+ </activity>
70
+ </application>
71
+ </manifest>
72
+ ```
73
+
74
+ #### iOS Configuration
75
+
76
+ If you encounter a `symbol not found` error in Release on iOS (due to Flutter FFI symbol stripping), do the following:
77
+ 1. In Xcode Build Settings, set **Deployment Postprocessing** to **Yes**.
78
+
79
+ 2. Set **Strip Style** for Release to **Non-Global Symbols**.
80
+
81
+ #### Flutter Initialization & Login Process
82
+
83
+ Initialize CallStore and log in the user before starting a call. CallStore will sync user info automatically and enter the ready state after a successful login. See flowchart and sample code:
84
+
85
+ ``` java
86
+ import 'package:atomic_x_core/atomicxcore.dart';
87
+ import 'package:rtc_room_engine/api/call/tui_call_engine.dart';
88
+
89
+ Future<void> _login() async {
90
+ int sdkAppId = 1400000001; // Enter your SDKAppID
91
+ String userId = 'test_001'; // Enter your UserID
92
+ String userSig = 'xxxxxxxxxxx'; // Enter your UserSig
93
+
94
+ CallStore.shared;
95
+ final result = await LoginStore.shared.login(sdkAppId, userId, userSig);
96
+ TUICallEngine.instance.init(sdkAppId, userId, userSig);
97
+ if (result.isSuccess) {
98
+ // Login successful
99
+ debugPrint('login success');
100
+ } else {
101
+ // Login failed
102
+ debugPrint('login failed, code: ${result.code}, message: ${result.message}');
103
+ }
104
+ }
105
+ ```
106
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Description</strong> |
107
+ | --- | --- | --- |
108
+ | userId | String | Unique identifier for the current user; use only letters, numbers, hyphens, and underscores. Avoid simple IDs like 1 or 123 to prevent multi-device login conflicts. |
109
+ | sdkAppId | int | Get this from the <a href="https://trtc.io/login?fro=gt&s_url=https%3A%2F%2Fconsole.trtc.io%2F">console</a>, usually a 10-digit integer starting with 140 or 160. |
110
+ | userSig | String | Authentication token for TRTC.<br>- <strong>Development:</strong> Generate userSig locally using <a href="https://github.com/Tencent-RTC/TUIKit_Flutter/blob/main/call/example/lib/debug/generate_test_user_sig.dart">GenerateTestUserSig.genTestUserSig</a> or with the <a href="https://console.trtc.io/usersig">UserSig Assistant Tool</a> for temporary use.<br>- <strong>Production:</strong> Always generate userSig on your server to protect your secret key. See Server-side UserSig generation.<br>For details, see How to calculate and use UserSig. |
111
+
112
+ ## Implementation Steps
113
+
114
+ **Make sure you have logged in before initiating a call.** Service is unavailable until login is complete. Follow these 5 steps to implement the "make a call" feature.
115
+
116
+ ### Step 1: Create the Call Interface
117
+
118
+ You need a dedicated call page to display when a call is active.
119
+ 1. **Create the call page:** Implement a `StatefulWidget` for your call host page, which will be used for navigation on incoming calls.
120
+
121
+ 2. **Add CallCoreView to the call page:** CallCoreView takes a `controller` parameter, observes **CallStore** data, and automatically adjusts the layout for 1v1 or multi-party calls.
122
+
123
+ ``` java
124
+ import 'package:flutter/material.dart';
125
+ import 'package:atomic_x_core/atomicxcore.dart';
126
+
127
+ // 1. Create call page Widget
128
+ class CallPage extends StatefulWidget {
129
+ const CallPage({super.key});
130
+
131
+ @override
132
+ State<CallPage> createState() => _CallPageState();
133
+ }
134
+
135
+ class _CallPageState extends State<CallPage> {
136
+ late CallCoreController controller;
137
+
138
+ @override
139
+ void initState() {
140
+ super.initState();
141
+ controller = CallCoreController.create();
142
+ }
143
+
144
+ @override
145
+ Widget build(BuildContext context) {
146
+ // 2. Use CallCoreView Widget on the call page
147
+ return CallCoreView(controller: controller);
148
+ }
149
+ }
150
+ ```
151
+
152
+ **CallCoreView Widget Features:**
153
+
154
+ |**Feature**|**Description**|**Reference**|
155
+ |---------|---------|---------|
156
+ |Set layout mode|Supports dynamic layout mode switching. If not set, layout auto-adapts by participant count.|Switch layout mode|
157
+ |Set avatar|Allows custom avatars for users by passing resource paths.|Customize default avatar|
158
+ |Set volume indicator icon|Custom icons for different volume levels.|Customize volume indicator icon|
159
+ |Set network indicator icon|Custom icons for real-time network quality.|Customize network indicator icon|
160
+ |Set waiting animation|Displays GIF animation for users in a waiting state during multi-party calls.|Customize loading animation|
161
+
162
+ ### Step 2: Add Call Control Buttons
163
+
164
+ Customize your control buttons using [DeviceStore](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_device_device_store/DeviceStore-class.html) and [CallStore](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallStore-class.html) APIs:
165
+ - **DeviceStore:** Controls microphone (toggle/volume), camera (toggle/switch/quality), screen sharing, and monitors device status. Bind button actions to these methods and listen for status changes to update UI in real time.
166
+
167
+ - **CallStore:** Handles answering, hanging up, and rejecting calls. Bind these methods to button actions and listen for call status changes to sync UI accordingly.
168
+
169
+ - **Button icon resources:** Download the TUICallKit button icons from [GitHub](https://github.com/iveshzf/TUIKit_Flutter/tree/main/call/assets/images). These are copyright-free.
170
+
171
+ |**Icons:**|||||||||
172
+ |---------|---------|---------|---------|---------|---------|---------|---------|---------|
173
+
174
+ **Example: Adding hang up, microphone, and camera buttons**
175
+
176
+ 1. **Create a container for control buttons:** Place hang up, microphone, and camera buttons at the bottom of your call page.
177
+
178
+ ``` java
179
+ import 'package:flutter/material.dart';
180
+ import 'package:atomic_x_core/atomicxcore.dart';
181
+
182
+ // Bottom control button container Widget
183
+ class ControlsContainer extends StatelessWidget {
184
+ const ControlsContainer({super.key});
185
+
186
+ @override
187
+ Widget build(BuildContext context) {
188
+ return Row(
189
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
190
+ children: [
191
+ // Add control buttons here
192
+ ],
193
+ );
194
+ }
195
+ }
196
+ ```
197
+ 2. **Add hang up button:** Call `hangup` to end the call and close the page.
198
+
199
+ ``` java
200
+ import 'package:atomic_x_core/atomicxcore.dart';
201
+ import 'package:flutter/material.dart';
202
+
203
+ // Hang up button Widget
204
+ Widget buildHangupButton() {
205
+ return GestureDetector(
206
+ onTap: () {
207
+ // Call hangup API to end the call
208
+ CallStore.shared.hangup();
209
+ },
210
+ child: Container(
211
+ width: 60,
212
+ height: 60,
213
+ decoration: const BoxDecoration(
214
+ color: Colors.red,
215
+ shape: BoxShape.circle,
216
+ ),
217
+ child: const Icon(
218
+ Icons.call_end,
219
+ color: Colors.white,
220
+ size: 30,
221
+ ),
222
+ ),
223
+ );
224
+ }
225
+ ```
226
+ 3. **Add microphone toggle button:** Use `openLocalMicrophone` and `closeLocalMicrophone` to toggle the mic.
227
+
228
+ ``` java
229
+ import 'package:atomic_x_core/atomicxcore.dart';
230
+ import 'package:flutter/material.dart';
231
+
232
+ // Microphone toggle button Widget
233
+ // Use ValueListenableBuilder to listen for microphone status changes
234
+ Widget buildMicrophoneButton() {
235
+ return ValueListenableBuilder(
236
+ valueListenable: DeviceStore.shared.state.microphoneStatus,
237
+ builder: (context, status, child) {
238
+ final isOn = status == DeviceStatus.on;
239
+ return GestureDetector(
240
+ onTap: () {
241
+ // Toggle microphone based on current status
242
+ if (isOn) {
243
+ DeviceStore.shared.closeLocalMicrophone();
244
+ } else {
245
+ DeviceStore.shared.openLocalMicrophone();
246
+ }
247
+ },
248
+ child: Container(
249
+ width: 60,
250
+ height: 60,
251
+ decoration: BoxDecoration(
252
+ color: Colors.white.withOpacity(0.2),
253
+ shape: BoxShape.circle,
254
+ ),
255
+ child: Icon(
256
+ isOn ? Icons.mic : Icons.mic_off,
257
+ color: Colors.white,
258
+ size: 30,
259
+ ),
260
+ ),
261
+ );
262
+ },
263
+ );
264
+ }
265
+ ```
266
+ 4. **Add camera toggle button:** Use `openLocalCamera` and `closeLocalCamera` to toggle the camera.
267
+
268
+ ``` java
269
+ import 'package:atomic_x_core/atomicxcore.dart';
270
+ import 'package:flutter/material.dart';
271
+
272
+ // Camera toggle button Widget
273
+ // Use ValueListenableBuilder to listen for camera status changes
274
+ Widget buildCameraButton() {
275
+ return ValueListenableBuilder(
276
+ valueListenable: DeviceStore.shared.state.cameraStatus,
277
+ builder: (context, status, child) {
278
+ final isOn = status == DeviceStatus.on;
279
+ return GestureDetector(
280
+ onTap: () {
281
+ // Toggle camera based on current status
282
+ if (isOn) {
283
+ DeviceStore.shared.closeLocalCamera();
284
+ } else {
285
+ final isFrontCamera = DeviceStore.shared.state.isFrontCamera.value;
286
+ DeviceStore.shared.openLocalCamera(isFrontCamera);
287
+ }
288
+ },
289
+ child: Container(
290
+ width: 60,
291
+ height: 60,
292
+ decoration: BoxDecoration(
293
+ color: Colors.white.withOpacity(0.2),
294
+ shape: BoxShape.circle,
295
+ ),
296
+ child: Icon(
297
+ isOn ? Icons.videocam : Icons.videocam_off,
298
+ color: Colors.white,
299
+ size: 30,
300
+ ),
301
+ ),
302
+ );
303
+ },
304
+ );
305
+ }
306
+ ```
307
+ 5. **Update device button status in real time:** Use `ValueListenableBuilder` to react to device status changes.
308
+
309
+ ``` java
310
+ import 'package:atomic_x_core/atomicxcore.dart';
311
+ import 'package:flutter/material.dart';
312
+
313
+ // In Flutter, use ValueListenableBuilder for reactive state updates
314
+ // When DeviceStore state changes, UI rebuilds automatically
315
+ Widget buildDeviceControlButtons() {
316
+ return Row(
317
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
318
+ children: [
319
+ // Microphone button - reacts to microphoneStatus changes
320
+ ValueListenableBuilder(
321
+ valueListenable: DeviceStore.shared.state.microphoneStatus,
322
+ builder: (context, status, _) {
323
+ final isOn = status == DeviceStatus.on;
324
+ return Text(isOn ? 'Turn off microphone' : 'Turn on microphone');
325
+ },
326
+ ),
327
+ // Camera button - reacts to cameraStatus changes
328
+ ValueListenableBuilder(
329
+ valueListenable: DeviceStore.shared.state.cameraStatus,
330
+ builder: (context, status, _) {
331
+ final isOn = status == DeviceStatus.on;
332
+ return Text(isOn ? 'Turn off camera' : 'Turn on camera');
333
+ },
334
+ ),
335
+ ],
336
+ );
337
+ }
338
+ ```
339
+
340
+ ### Step 3: Request Microphone/Camera Permissions
341
+
342
+ Check for audio/video permissions before starting a call. If permissions are missing, prompt users to grant them.
343
+ 1. **Declare permissions for Android in **`AndroidManifest.xml`**:**
344
+
345
+ ``` xml
346
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
347
+ <!-- Microphone permission -->
348
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
349
+ <!-- Camera permission -->
350
+ <uses-permission android:name="android.permission.CAMERA" />
351
+ </manifest>
352
+ ```
353
+ 2. **Declare permissions for iOS in **`Info.plist`**:**
354
+
355
+ ``` xml
356
+ <key>NSCameraUsageDescription</key>
357
+ <string>CallingApp needs access to your camera. Video recording requires camera permission.</string>
358
+ <key>NSMicrophoneUsageDescription</key>
359
+ <string>CallingApp needs access to your microphone. Video recording requires microphone permission.</string>
360
+ ```
361
+ 3. **Request permissions dynamically:** Use the `permission_handler` plugin for runtime permission requests.
362
+
363
+ ``` bash
364
+ flutter pub add permission_handler
365
+ ```
366
+ ``` java
367
+ import 'package:permission_handler/permission_handler.dart';
368
+
369
+ // Request audio/video permissions
370
+ Future<bool> requestCallPermissions() async {
371
+ // Request microphone and camera permissions
372
+ Map<Permission, PermissionStatus> statuses = await [
373
+ Permission.microphone,
374
+ Permission.camera,
375
+ ].request();
376
+
377
+ // Check permission status
378
+ bool micGranted = statuses[Permission.microphone]?.isGranted ?? false;
379
+ bool cameraGranted = statuses[Permission.camera]?.isGranted ?? false;
380
+
381
+ if (micGranted && cameraGranted) {
382
+ // Permissions granted
383
+ return true;
384
+ } else {
385
+ // Some permissions denied, prompt user to enable
386
+ return false;
387
+ }
388
+ }
389
+ ```
390
+
391
+ ### Step 4: Initiate a Call
392
+
393
+ After calling [calls](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallStore/calls.html), navigate to the call interface. Automatically enable microphone and/or camera based on the chosen media type.
394
+ 1. **Initiate the call:** Call `calls` to start.
395
+
396
+ 2. **Enable media devices:** After calling, enable the microphone; for video calls, enable the camera as well.
397
+
398
+ 3. **Navigate to the call page:** On success, push the call page.
399
+
400
+ ``` java
401
+ import 'package:atomic_x_core/atomicxcore.dart';
402
+ import 'package:flutter/material.dart';
403
+
404
+ // Initiate call
405
+ Future<void> startCall(List<String> userIdList, CallMediaType mediaType) async {
406
+ final handler = await CallStore.shared.calls(userIdList, mediaType, null);
407
+ if (handler.errorCode == 0) {
408
+ // Navigate to call page
409
+ if (mounted) {
410
+ Navigator.push(
411
+ context,
412
+ MaterialPageRoute(builder: (context) => const CallPage()),
413
+ );
414
+ }
415
+ } else {
416
+ debugPrint('Call failed: ${handler.errorCode}, ${handler.errorMessage}');
417
+ }
418
+ }
419
+ ```
420
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
421
+ | --- | --- | --- | --- |
422
+ | userIdList | List | Yes | List of target users’ <code>userId</code>. |
423
+ | mediaType | <a href="https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallMediaType.html">CallMediaType</a> | Yes | Specifies call type: audio or video.<br>- <code>CallMediaType.video</code>: Video call<br>- <code>CallMediaType.audio</code>: Audio call |
424
+ | params | <a href="https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallParams-class.html">CallParams</a> | No | Additional parameters: room ID, timeout, custom data, group ID, ephemeral flag. |
425
+
426
+ ### Step 5: End the Call
427
+
428
+ When you call [hangup](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallStore/hangup.html) or the other party ends the call, the [onCallEnded](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallEventListener/onCallEnded.html) event fires. Listen for this event and close the call interface accordingly.
429
+ 1. **Listen for call end event:** Subscribe to `onCallEnded`.
430
+
431
+ 2. **Destroy the call page:** On event, close the call UI.
432
+
433
+ ``` java
434
+ import 'package:atomic_x_core/atomicxcore.dart';
435
+ import 'package:flutter/cupertino.dart';
436
+
437
+ void addListener(BuildContext context) {
438
+ CallEventListener listener = CallEventListener(
439
+ onCallEnded: (callId, mediaType, reason, userId) {
440
+ Navigator.of(context).pop();
441
+ }
442
+ );
443
+ CallStore.shared.addListener(listener);
444
+ }
445
+ ```
446
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Description</strong> |
447
+ | --- | --- | --- |
448
+ | callId | String | Unique identifier for the call. |
449
+ | mediaType | <a href="https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallMediaType.html">CallMediaType</a> | Specifies audio or video call.<br>- <code>CallMediaType.video</code>: Video<br>- <code>CallMediaType.audio</code>: Audio |
450
+ | reason | <a href="https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallEndReason.html">CallEndReason</a> | Reason for call end:<br>- <code>unknown</code>: Unknown<br>- <code>hangup</code>: User hung up<br>- <code>reject</code>: Call rejected<br>- <code>noResponse</code>: No answer<br>- <code>offline</code>: Callee offline<br>- <code>lineBusy</code>: Callee busy<br>- <code>canceled</code>: Caller canceled<br>- <code>otherDeviceAccepted</code>: Answered elsewhere<br>- <code>otherDeviceReject</code>: Rejected elsewhere<br>- <code>endByServer</code>: Ended by server |
451
+ | userId | String | User ID that triggered the end event |
452
+
453
+ ### Result
454
+
455
+ After completing these 5 steps, your "make a call" feature will run as shown:
456
+
457
+ ## Customizing the Interface
458
+
459
+ **CallCoreView** supports extensive UI customization, including avatars and volume indicator icons. For fast integration, download TUICallKit icons from [GitHub](https://github.com/Tencent-RTC/TUIKit_Flutter/tree/main/atomic-x/call_assets). All icons are copyright-free.
460
+
461
+ ### Custom Volume Indicator Icons
462
+
463
+ Use the [volumeIcons](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_view_call_call_core_view/CallCoreView/volumeIcons.html) parameter in **CallCoreView** to assign icons for each volume level.
464
+
465
+ - **Sample usage:**
466
+
467
+ ``` java
468
+ Widget _buildCallCoreView() {
469
+ Map<VolumeLevel, Image> volumeIcons = {
470
+ VolumeLevel.mute : Image.asset(''), // Icon for mute
471
+ };
472
+ return CallCoreView(
473
+ controller: CallCoreController.create(),
474
+ volumeIcons: volumeIcons,
475
+ );
476
+ }
477
+ ```
478
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
479
+ | --- | --- | --- | --- |
480
+ | volumeIcons | Map | No | Maps volume levels to icons.<br>- <code>VolumeLevel.mute</code>: Muted<br>- <code>VolumeLevel.low</code>: 0-25<br>- <code>VolumeLevel.medium</code>: 25-50<br>- <code>VolumeLevel.high</code>: 50-75<br>- <code>VolumeLevel.peak</code>: 75-100 |
481
+
482
+ |**Icon**|**Description**|
483
+ |---------|---------|
484
+ ||Volume indicator icon; use for `VolumeLevel.low` or `VolumeLevel.medium`.|
485
+ ||Mute icon; use for `VolumeLevel.mute`.|
486
+
487
+ ### Custom Network Indicator Icons
488
+
489
+ Use [networkQualityIcons](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_view_call_call_core_view/CallCoreView/networkQualityIcons.html) in **CallCoreView** to set icons for different network states.
490
+
491
+ - **Sample usage:**
492
+
493
+ ``` java
494
+ Widget _buildCallCoreView() {
495
+ Map<NetworkQuality, Image> networkQualityIcons = {
496
+ NetworkQuality.bad : Image.asset(''), // Icon for poor network
497
+ };
498
+ return CallCoreView(
499
+ controller: CallCoreController.create(),
500
+ networkQualityIcons: networkQualityIcons,
501
+ );
502
+ }
503
+ ```
504
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
505
+ | --- | --- | --- | --- |
506
+ | networkQualityIcons | Map | No | Maps network quality to icons.<br>Keys:<br>- <code>NetworkQuality.unknown</code><br>- <code>NetworkQuality.excellent</code><br>- <code>NetworkQuality.good</code><br>- <code>NetworkQuality.poor</code><br>- <code>NetworkQuality.bad</code><br>- <code>NetworkQuality.veryBad</code><br>- <code>NetworkQuality.down</code> |
507
+
508
+ |**Icon**|**Description**|
509
+ |---------|---------|
510
+ ||Poor network indicator; use for `NetworkQuality.bad`, `NetworkQuality.veryBad`, or `NetworkQuality.down`.|
511
+
512
+ ### Custom Default Avatar
513
+
514
+ Use [defaultAvatar](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_view_call_call_core_view/CallCoreView/defaultAvatar.html) in **CallCoreView** to specify a fallback user avatar. Monitor [allParticipants](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallState/allParticipants.html) for custom avatars; show the default avatar if none is set or loading fails.
515
+ - **Sample usage:**
516
+
517
+ ``` java
518
+ Widget _buildCallCoreView() {
519
+ Image defaultAvatarImage = Image.asset(''); // Default avatar image
520
+ return CallCoreView(
521
+ controller: CallCoreController.create(),
522
+ defaultAvatar: defaultAvatarImage,
523
+ );
524
+ }
525
+ ```
526
+ |**Parameter**|**Type**|Required|**Description**|
527
+ |---------|---------|---------|---------|
528
+ |defaultAvatar|Image|No|Default avatar image|
529
+
530
+ |**Icon**|**Description**|
531
+ |---------|---------|
532
+ ||Default avatar; use as a placeholder when loading fails or no avatar is set.|
533
+
534
+ ### Custom Loading Animation
535
+
536
+ Use [loadingAnimation](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_view_call_call_core_view/CallCoreView/loadingAnimation.html) in **CallCoreView** to set a waiting animation for users not yet connected.
537
+
538
+ - **Sample usage:**
539
+
540
+ ``` java
541
+ Widget _buildCallCoreView() {
542
+ Image loading = Image.asset(''); // Loading animation resource
543
+ return CallCoreView(
544
+ controller: CallCoreController.create(),
545
+ loadingAnimation: loading,
546
+ );
547
+ }
548
+ ```
549
+ |**Parameter**|**Type**|**Required**|**Description**|
550
+ |---------|---------|---------|---------|
551
+ |loadingAnimation|Image|No|GIF animation resource for waiting state|
552
+
553
+ |**Icon**|**Description**|
554
+ |---------|---------|
555
+ ||Waiting animation; use for group calls to indicate users in waiting state.|
556
+
557
+ ### Add Call Duration Indicator
558
+
559
+ You can display call duration in real time using [activeCall](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallState/activeCall.html) and its `duration` field.
560
+ 1. **Subscribe to call data:** Listen to `CallStore.shared.state.activeCall` for updates.
561
+
562
+ 2. **Bind duration to UI:** Use the `activeCall.duration` field in your widget. This value updates reactively—no timer needed.
563
+
564
+ ``` java
565
+ import 'package:atomic_x_core/atomicxcore.dart';
566
+ import 'package:flutter/material.dart';
567
+
568
+ class TimerWidget extends StatelessWidget {
569
+ final double? fontSize;
570
+ final FontWeight? fontWeight;
571
+
572
+ const TimerWidget({
573
+ super.key,
574
+ this.fontSize,
575
+ this.fontWeight,
576
+ });
577
+
578
+ @override
579
+ Widget build(BuildContext context) {
580
+ return ValueListenableBuilder(
581
+ valueListenable: CallStore.shared.state.selfInfo,
582
+ builder: (context, info, child) {
583
+ if (info.status == CallParticipantStatus.accept) {
584
+ return ValueListenableBuilder(
585
+ valueListenable: CallStore.shared.state.activeCall,
586
+ builder: (context, activeCall, child) {
587
+ return Text(
588
+ formatDuration(activeCall.duration.toInt()),
589
+ style: TextStyle(
590
+ fontSize: fontSize,
591
+ fontWeight: fontWeight,
592
+ ),
593
+ );
594
+ },
595
+ );
596
+ } else {
597
+ return Container();
598
+ }
599
+ }
600
+ );
601
+ }
602
+
603
+ String formatDuration(int timeCount) {
604
+ int hour = timeCount ~/ 3600;
605
+ int minute = (timeCount % 3600) ~/ 60;
606
+ String minuteShow = minute <= 9 ? "0$minute" : "$minute";
607
+ int second = timeCount % 60;
608
+ String secondShow = second <= 9 ? "0$second" : "$second";
609
+
610
+ if (hour > 0) {
611
+ String hourShow = hour <= 9 ? "0$hour" : "$hour";
612
+ return '$hourShow:$minuteShow:$secondShow';
613
+ } else {
614
+ return '$minuteShow:$secondShow';
615
+ }
616
+ }
617
+ }
618
+ ```
619
+
620
+ > **Note :**
621
+ >
622
+
623
+ > For more reactive call state data, see [CallState](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallState-class.html).
624
+ >
625
+
626
+ ## More Features
627
+
628
+ ### Set Avatar and Nickname
629
+
630
+ Before making a call, set your nickname and avatar via [setSelfInfo](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_login_login_store/LoginStore/setSelfInfo.html):
631
+ ``` java
632
+ UserProfile profile = UserProfile(
633
+ userID: "", // Your UserId
634
+ avatarURL: "", // Avatar URL
635
+ nickname: "", // Nickname to set
636
+ );
637
+ CompletionHandler result = await LoginStore.shared.setSelfInfo(userInfo: profile);
638
+ if (result.errorCode == 0) {
639
+ print("setSelfInfo success");
640
+ } else {
641
+ print("setSelfInfo failed");
642
+ }
643
+ ```
644
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
645
+ | --- | --- | --- | --- |
646
+ | userProfile | <a href="https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_login_login_store/UserProfile-class.html">UserProfile</a> | Yes | - <code>userID</code>: User ID<br>- <code>avatarURL</code>: Avatar URL<br>- <code>nickname</code>: Nickname<br>For more, see <a href="https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_login_login_store/UserProfile-class.html">UserProfile</a>. |
647
+ | completion | CompletionHandler | No | Callback returns result of set operation |
648
+
649
+ ### Switch Layout Modes
650
+
651
+ Switch layouts flexibly using [setLayoutTemplate](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_view_call_call_core_view/CallCoreController/setLayoutTemplate.html). If not set, **CallCoreView** adapts automatically: 1v1 defaults to `Float`, group calls use `Grid`.
652
+ | <strong>Float Mode</strong> | <strong>Grid Mode</strong> | <strong>PIP Mode</strong> |
653
+ | --- | --- | --- |
654
+ | | | |
655
+ | - <strong>Layout:</strong> Full screen self-view while waiting; after connecting, full screen remote view with self-view as a floating window.<br>- <strong>Interaction:</strong> Floating window supports drag and click-to-swap with the main view. | - <strong>Layout:</strong> Grid layout for all participants, suitable for 2+ users. Supports click-to-enlarge.<br>- <strong>Interaction:</strong> Click any participant's view to enlarge. | - <strong>Layout:</strong> 1v1 shows fixed remote view; multi-party uses active speaker strategy with full screen for the current speaker.<br>- <strong>Interaction:</strong> Waiting state shows self-view; after connecting, call duration is displayed. |
656
+
657
+ - **Sample usage:**
658
+
659
+ ``` java
660
+ CallCoreController controller = CallCoreController.create();
661
+ CallLayoutTemplate template = CallLayoutTemplate.float;
662
+ controller.setLayoutTemplate(template);
663
+ ```
664
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
665
+ | --- | --- | --- | --- |
666
+ | template | <a href="https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_view_call_call_core_view/CallLayoutTemplate.html">CallLayoutTemplate</a> | Yes | Layout mode:<br>- <code>float</code>: Waiting is self full screen, answered is remote full screen/self floating window.<br>- <code>grid</code>: All participants tiled.<br>- <code>pip</code>: 1v1 always remote, group uses Active Speaker. |
667
+
668
+ ### Set Default Call Timeout
669
+
670
+ Set the `timeout` field in [CallParams](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallParams-class.html) when calling [calls](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallStore/calls.html):
671
+ ``` java
672
+ void startCall(List<String> userIdList, CallMediaType mediaType) {
673
+ CallParams params = CallParams(
674
+ timeout: 30, // Set call waiting timeout
675
+ );
676
+ CallStore.shared.calls(userIdList, mediaType, params);
677
+ }
678
+ ```
679
+
680
+ |**Parameter**|**Type**|**Required**|**Description**|
681
+ |---------|---------|---------|---------|
682
+ |userIdList|List|Yes|List of target userIds.|
683
+ |mediaType|[CallMediaType](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallMediaType.html)|Yes|Specifies call type: audio or video.|
684
+ |params|[CallParams](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/en/api_call_call_store/CallParams-class.html)|No|Additional options: room ID, timeout, custom data, group ID, ephemeral flag.|
685
+
686
+ ### Implement In-App Floating Window
687
+
688
+ When the call interface is covered (e.g., by navigation), display an in-app floating window that shows key call status (such as duration and participant info) and provides one-tap return to the full call view.
689
+ ``` java
690
+ _buildPipWindowWidget() {
691
+ final pipWidth = MediaQuery.of(context).size.width;
692
+ final pipHeight = MediaQuery.of(context).size.height;
693
+ final scale = pipWidth / originWidth;
694
+ CallCoreController controller = CallCoreController.create();
695
+ controller.setLayoutTemplate(CallLayoutTemplate.pip);
696
+ return Scaffold(
697
+ body: SizedBox(
698
+ width: pipWidth,
699
+ height: pipHeight,
700
+ child: Container(
701
+ width: pipWidth,
702
+ height: pipHeight,
703
+ decoration: const BoxDecoration(color: Colors.transparent),
704
+ child: MediaQuery(
705
+ data: MediaQuery.of(context).copyWith(
706
+ size: Size(originWidth ?? pipWidth, originHeight ?? pipHeight)
707
+ ),
708
+ child: ClipRect(
709
+ child: Transform.scale(
710
+ scale: scale,
711
+ alignment: Alignment.center,
712
+ child: OverflowBox(
713
+ maxWidth: originWidth,
714
+ maxHeight: originHeight,
715
+ alignment: Alignment.center,
716
+ child: CallCoreView(
717
+ controller: controller,
718
+ ),
719
+ ),
720
+ ),
721
+ ),
722
+ ),
723
+ ),
724
+ ),
725
+ );
726
+ }
727
+ ```
728
+
729
+ ### Implement Android Picture-in-Picture Outside App
730
+
731
+ Picture-in-Picture requires Android 8.0 (API 26) or above.
732
+ 1. **MainActivity configuration:** Listen for lifecycle changes and enter PiP when needed.
733
+
734
+ ``` java
735
+ import android.app.PictureInPictureParams
736
+ import android.content.pm.PackageManager
737
+ import android.os.Build
738
+ import android.util.Log
739
+ import android.util.Rational
740
+ import io.flutter.embedding.android.FlutterActivity
741
+ import io.flutter.embedding.engine.FlutterEngine
742
+ import io.flutter.plugin.common.MethodChannel
743
+
744
+ class MainActivity : FlutterActivity() {
745
+ companion object {
746
+ private const val TAG = "MainActivity"
747
+ private const val CHANNEL = "atomic_x/pip"
748
+ }
749
+
750
+ private var enablePictureInPicture = false
751
+
752
+ override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
753
+ super.configureFlutterEngine(flutterEngine)
754
+
755
+ MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
756
+ when (call.method) {
757
+ "enablePictureInPicture" -> {
758
+ val enable = call.argument<Boolean>("enable") ?: false
759
+ val success = enablePIP(enable)
760
+ result.success(success)
761
+ }
762
+ "enterPictureInPicture" -> {
763
+ val success = enterPIP()
764
+ result.success(success)
765
+ }
766
+ else -> result.notImplemented()
767
+ }
768
+ }
769
+ }
770
+
771
+ override fun onUserLeaveHint() {
772
+ super.onUserLeaveHint()
773
+ // Automatically enter PiP when user presses Home
774
+ if (enablePictureInPicture) {
775
+ enterPIP()
776
+ }
777
+ }
778
+
779
+ private fun enablePIP(enable: Boolean): Boolean {
780
+ Log.i(TAG, "enablePictureInPicture: $enable")
781
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
782
+ packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
783
+ enablePictureInPicture = enable
784
+ return true
785
+ }
786
+ return false
787
+ }
788
+
789
+ private fun enterPIP(): Boolean {
790
+ if (!enablePictureInPicture) return false
791
+
792
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
793
+ try {
794
+ val aspectRatio = Rational(9, 16)
795
+ val params = PictureInPictureParams.Builder()
796
+ .setAspectRatio(aspectRatio)
797
+ .build()
798
+ return enterPictureInPictureMode(params)
799
+ } catch (e: Exception) {
800
+ Log.e(TAG, "enterPIP failed: ${e.message}")
801
+ }
802
+ }
803
+ return false
804
+ }
805
+ }
806
+ ```
807
+ 2. **AndroidManifest.xml configuration:** Enable PiP for MainActivity.
808
+
809
+ ``` xml
810
+ <activity
811
+ android:name=".MainActivity"
812
+ android:exported="true"
813
+ android:launchMode="singleTop"
814
+ android:taskAffinity=""
815
+ android:theme="@style/LaunchTheme"
816
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
817
+ android:hardwareAccelerated="true"
818
+ android:windowSoftInputMode="adjustResize"
819
+ android:supportsPictureInPicture="true">
820
+ <meta-data
821
+ android:name="io.flutter.embedding.android.NormalTheme"
822
+ android:resource="@style/NormalTheme"
823
+ />
824
+ <intent-filter>
825
+ <action android:name="android.intent.action.MAIN"/>
826
+ <category android:name="android.intent.category.LAUNCHER"/>
827
+ </intent-filter>
828
+ </activity>
829
+ ```
830
+ 3. **Dart layer configuration:**
831
+
832
+ ``` java
833
+ import 'package:flutter/services.dart';
834
+
835
+ class PipManager {
836
+ static const MethodChannel _channel = MethodChannel('atomic_x/pip');
837
+
838
+ /// Enable/disable PiP feature
839
+ static Future<bool> enablePictureInPicture(bool enable) async {
840
+ try {
841
+ final result = await _channel.invokeMethod<bool>('enablePictureInPicture', {'enable': enable});
842
+ return result ?? false;
843
+ } catch (e) {
844
+ return false;
845
+ }
846
+ }
847
+
848
+ /// Enter PiP mode immediately
849
+ static Future<bool> enterPictureInPicture() async {
850
+ try {
851
+ final result = await _channel.invokeMethod<bool>('enterPictureInPicture');
852
+ return result ?? false;
853
+ } catch (e) {
854
+ return false;
855
+ }
856
+ }
857
+ }
858
+ ```
859
+
860
+ Enable PiP before the call starts, and disable it after the call ends.
861
+
862
+ ### Implement iOS Picture-in-Picture Outside App
863
+
864
+ iOS supports Picture-in-Picture outside the app using the underlying TRTC engine. When the app goes to background, the call interface floats over other apps as a system PiP window.
865
+
866
+ > **Note:**
867
+ >
868
+
869
+ > In Xcode, add `Background Modes` under `Signing & Capabilities` and check `Audio, AirPlay, and Picture in Picture`.
870
+ >
871
+
872
+ > Requires iOS 15.0 or above.
873
+ >
874
+
875
+ 1. **Enable PiP:**
876
+
877
+ ``` java
878
+ import 'package:tencent_rtc_sdk/trtc_cloud.dart';
879
+
880
+ TRTCCloud.sharedInstance().then((trtcCloud) {
881
+ trtcCloud.callExperimentalAPI('''
882
+ {
883
+ "api": "configPictureInPicture",
884
+ "params": {
885
+ "enable": true,
886
+ "cameraBackgroundCapture": true,
887
+ "canvas": {
888
+ "width": 720,
889
+ "height": 1280,
890
+ "backgroundColor": "#111111"
891
+ },
892
+ "regions": [
893
+ {
894
+ "userId": "remoteUserId",
895
+ "userName": "",
896
+ "width": 1.0,
897
+ "height": 1.0,
898
+ "x": 0.0,
899
+ "y": 0.0,
900
+ "fillMode": 0,
901
+ "streamType": "high",
902
+ "backgroundColor": "#111111",
903
+ "backgroundImage": "file:///path/to/avatar.png"
904
+ },
905
+ {
906
+ "userId": "localUserId",
907
+ "userName": "",
908
+ "width": 0.333,
909
+ "height": 0.333,
910
+ "x": 0.65,
911
+ "y": 0.05,
912
+ "fillMode": 0,
913
+ "streamType": "high",
914
+ "backgroundColor": "#111111"
915
+ }
916
+ ]
917
+ }
918
+ }
919
+ ''');
920
+ });
921
+ ```
922
+ 2. **Disable PiP:**
923
+
924
+ ``` java
925
+ import 'package:tencent_rtc_sdk/trtc_cloud.dart';
926
+
927
+ TRTCCloud.sharedInstance().then((trtcCloud) {
928
+ trtcCloud.callExperimentalAPI('''
929
+ {
930
+ "api": "configPictureInPicture",
931
+ "params": {
932
+ "enable": false
933
+ }
934
+ }
935
+ ''');
936
+ });
937
+ ```
938
+
939
+ ### Play Waiting Ringtone
940
+
941
+ Monitor call status, play ringtone while waiting for an answer, and stop it when the call is accepted or ends.
942
+ ``` java
943
+ CallStore.shared.state.selfInfo.addListener(() {
944
+ CallParticipantInfo info = CallStore.shared.state.selfInfo.value;
945
+ if (info.status == CallParticipantStatus.accept || info.status == CallParticipantStatus.none) {
946
+ // Stop ringtone
947
+ return;
948
+ }
949
+ if (info.status == CallParticipantStatus.waiting) {
950
+ // Play ringtone
951
+ }
952
+ });
953
+ ```
954
+
955
+ ### Enable Background Audio/Video Capture
956
+
957
+ To ensure call audio/video capture continues when the app goes to background, configure Android and iOS as follows.
958
+
959
+ #### Android Configuration
960
+ 1. **Permissions and service in AndroidManifest.xml:** Starting from Android 9.0 (API 28), foreground service permission is required. Android 14 (API 34) requires specifying service type.
961
+
962
+ ``` java
963
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
964
+
965
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
966
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
967
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
968
+
969
+ <application>
970
+ <service
971
+ android:name=".CallForegroundService"
972
+ android:enabled="true"
973
+ android:exported="false"
974
+ android:foregroundServiceType="camera|microphone" />
975
+ </application>
976
+ </manifest>
977
+ ```
978
+ 2. **Create foreground service class (**`CallForegroundService`**):**
979
+
980
+ ``` java
981
+ import android.app.Notification
982
+ import android.app.NotificationChannel
983
+ import android.app.NotificationManager
984
+ import android.app.Service
985
+ import android.content.Context
986
+ import android.content.Intent
987
+ import android.os.Build
988
+ import android.os.IBinder
989
+ import androidx.core.app.NotificationCompat
990
+
991
+ class CallForegroundService : Service() {
992
+ companion object {
993
+ private const val NOTIFICATION_ID = 1001
994
+ private const val CHANNEL_ID = "call_foreground_channel"
995
+
996
+ fun start(context: Context) {
997
+ val intent = Intent(context, CallForegroundService::class.java)
998
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
999
+ context.startForegroundService(intent)
1000
+ } else {
1001
+ context.startService(intent)
1002
+ }
1003
+ }
1004
+
1005
+ fun stop(context: Context) {
1006
+ val intent = Intent(context, CallForegroundService::class.java)
1007
+ context.stopService(intent)
1008
+ }
1009
+ }
1010
+
1011
+ override fun onCreate() {
1012
+ super.onCreate()
1013
+ createNotificationChannel()
1014
+ // Start foreground notification to ensure background capture permission
1015
+ startForeground(NOTIFICATION_ID, createNotification())
1016
+ }
1017
+
1018
+ override fun onBind(intent: Intent?): IBinder? = null
1019
+
1020
+ private fun createNotification(): Notification {
1021
+ return NotificationCompat.Builder(this, CHANNEL_ID)
1022
+ .setContentTitle("In Call")
1023
+ .setContentText("App is running in background to keep the call alive")
1024
+ .setSmallIcon(android.R.drawable.ic_menu_call) // Replace with your app icon
1025
+ .setPriority(NotificationCompat.PRIORITY_HIGH)
1026
+ .build()
1027
+ }
1028
+
1029
+ private fun createNotificationChannel() {
1030
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
1031
+ val channel = NotificationChannel(
1032
+ CHANNEL_ID,
1033
+ "Call Keep-Alive Service",
1034
+ NotificationManager.IMPORTANCE_HIGH
1035
+ )
1036
+ val manager = getSystemService(NotificationManager::class.java)
1037
+ manager.createNotificationChannel(channel)
1038
+ }
1039
+ }
1040
+ }
1041
+ ```
1042
+
1043
+ #### iOS Configuration
1044
+
1045
+ Open your project in Xcode and:
1046
+ 1. Select your project `Target` > `Signing & Capabilities`.
1047
+
1048
+ 2. Click `+ Capability`.
1049
+
1050
+ 3. Add `Background Modes`.
1051
+
1052
+ 4. Check:
1053
+
1054
+ - `Audio, AirPlay, and Picture in Picture`
1055
+
1056
+ - `Voice over IP`
1057
+
1058
+ - `Remote notifications` (optional for offline push)
1059
+
1060
+ Your `Info.plist` will include:
1061
+
1062
+ ``` xml
1063
+ <key>UIBackgroundModes</key>
1064
+ <array>
1065
+ <string>audio</string>
1066
+ <string>voip</string>
1067
+ <string>remote-notification</string>
1068
+ </array>
1069
+ ```
1070
+
1071
+ **Configure audio session (AVAudioSession):**
1072
+
1073
+ Set up the audio session before the call starts. Recommended in the call interface’s `viewDidLoad` or before initiating a call:
1074
+
1075
+ ``` swift
1076
+ import AVFoundation
1077
+
1078
+ /**
1079
+ * Configure audio session for background audio capture
1080
+ *
1081
+ * Recommended scenarios:
1082
+ * 1. In call interface's viewDidLoad
1083
+ * 2. Before initiating a call (calls)
1084
+ * 3. Before answering a call (accept)
1085
+ */
1086
+ private func start() {
1087
+ let audioSession = AVAudioSession.sharedInstance()
1088
+ do {
1089
+ // Set session category to play and record
1090
+ // .allowBluetooth: Support Bluetooth headset
1091
+ // .allowBluetoothA2DP: Support high-quality Bluetooth audio (A2DP)
1092
+ try audioSession.setCategory(.playAndRecord, options: [.allowBluetooth, .allowBluetoothA2DP])
1093
+
1094
+ // Activate audio session
1095
+ try audioSession.setActive(true)
1096
+ } catch {
1097
+ // Audio session configuration failed
1098
+ }
1099
+ }
1100
+ ```
1101
+
1102
+ > **Note:**
1103
+ >
1104
+
1105
+ > Call `start()` via `MethodChannel` at the appropriate time to enable background keep-alive.
1106
+ >
1107
+
1108
+ ## Next Steps
1109
+
1110
+ You’ve now completed the "make a call" feature. To implement call answering, see the integration guide below:
1111
+
1112
+ |**Feature**|**Description**|**Integration Guide**|
1113
+ |---------|---------|---------|
1114
+ |Answer the first call|Quick integration guide for handling incoming calls, including answer/reject controls and call interface invocation.|Answer the first call|
1115
+
1116
+ ## FAQ
1117
+
1118
+ ### Why does my iOS Release build show [symbol not found] at runtime?
1119
+
1120
+ If you see `symbol not found` errors in your iOS Release build, it’s likely because Xcode’s symbol stripping removed TRTC C symbols used by tencent_rtc_sdk (via Flutter FFI). To fix:
1121
+ 1. In Build Settings, set **Deployment Postprocessing** to **Yes**.
1122
+
1123
+ 2. In Build Settings, set **Strip Style** for Release to **Non-Global Symbols**.
1124
+
1125
+ ### If the callee goes offline and returns within the call invite timeout, will they still get the incoming call event?
1126
+ - For single calls: If the callee comes online within the timeout period, they will receive the incoming call invite.
1127
+
1128
+ - For group calls: If the callee returns within the timeout, up to 20 unprocessed group messages will be pulled; if there is a call invite, the incoming call event will be triggered.
1129
+
1130
+ ## Contact Us
1131
+
1132
+ If you have any questions or suggestions during integration or use, join our [Telegram](https://t.me/+Lmw2MSqW6ethMGM1) technical group or [Contact Us](https://trtc.io/contact) for support.