@tencent-rtc/mcp 1.4.7 → 1.6.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 (553) hide show
  1. package/cursor-setting.png +0 -0
  2. package/index.js +0 -1
  3. package/knowledge/bm25-cache.js +73 -0
  4. package/knowledge/bm25.js +147 -0
  5. package/knowledge/build-index.js +69 -0
  6. package/knowledge/chunker.js +167 -0
  7. package/knowledge/content-loader.js +39 -0
  8. package/knowledge/doc-url-resolver.js +142 -0
  9. package/knowledge/extractors.js +25 -0
  10. package/knowledge/path-meta.js +184 -0
  11. package/knowledge/search/exact-lookup.js +497 -0
  12. package/knowledge/search/filter-pool.js +104 -0
  13. package/knowledge/search/product-scope-intent.js +40 -0
  14. package/knowledge/search/requires-framework.js +81 -0
  15. package/knowledge/search/search-knowledge.js +229 -0
  16. package/mcp-server-prompt.png +0 -0
  17. package/package.json +1 -1
  18. package/resource/_schema/feature-aliases.yaml +10 -0
  19. package/resource/_schema/goal-tags.yaml +72 -0
  20. package/resource/_schema/products.yaml +19 -0
  21. package/resource/_schema/trtc-intents.yaml +27 -0
  22. package/resource/_schema/types.yaml +43 -0
  23. package/resource/index/component-slugs.json +1 -0
  24. package/resource/index/doc-source-urls.json +1 -0
  25. package/resource/index/manifest.json +1 -0
  26. package/resource/{doc → integration}/callkit/preset/android/integration.md +34 -28
  27. package/resource/integration/callkit/preset/flutter/integration.md +346 -0
  28. package/resource/integration/callkit/preset/ios/integration.md +408 -0
  29. package/resource/integration/callkit/preset/react/integration.md +362 -0
  30. package/resource/integration/callkit/preset/vue/integration.md +356 -0
  31. package/resource/integration/chat/preset/android/integration.md +500 -0
  32. package/resource/integration/chat/preset/flutter/integration.md +370 -0
  33. package/resource/integration/chat/preset/ios/integration.md +566 -0
  34. package/resource/integration/chat/preset/react/integration.md +490 -0
  35. package/resource/integration/chat/preset/vue/integration.md +504 -0
  36. package/resource/{doc → integration}/livekit/preset/live/vue/live-list-integration.md +26 -22
  37. package/resource/{doc → integration}/livekit/preset/live/vue/live-player-desk-integration.md +22 -18
  38. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +309 -0
  39. package/resource/{doc → integration}/livekit/preset/live/vue/live-pusher-integration.md +47 -39
  40. package/resource/integration/roomkit/preset/vue/integration.md +562 -0
  41. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +828 -0
  42. package/resource/knowledge/callkit/core-sdk/android/make-call.md +897 -0
  43. package/resource/knowledge/callkit/core-sdk/android/offline-push.md +363 -0
  44. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +1111 -0
  45. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +1132 -0
  46. package/resource/{doc → knowledge}/callkit/core-sdk/flutter/offline-push.md +174 -151
  47. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +1084 -0
  48. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +1252 -0
  49. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +534 -0
  50. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +953 -0
  51. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +1061 -0
  52. package/resource/knowledge/callkit/faq/android.md +92 -0
  53. package/resource/{doc/callkit/faq/android-faq.md → knowledge/callkit/faq/common.md} +11 -12
  54. package/resource/knowledge/callkit/faq/error-code.md +67 -0
  55. package/resource/knowledge/callkit/faq/flutter.md +52 -0
  56. package/resource/knowledge/callkit/faq/ios.md +104 -0
  57. package/resource/knowledge/callkit/faq/web.md +74 -0
  58. package/resource/knowledge/callkit/preset/android/api.md +412 -0
  59. package/resource/knowledge/callkit/preset/flutter/api.md +22 -0
  60. package/resource/knowledge/callkit/preset/ios/api.md +234 -0
  61. package/resource/knowledge/callkit/preset/web/api.md +83 -0
  62. package/resource/knowledge/chat/preset/android/features/chat-setting.md +74 -0
  63. package/resource/knowledge/chat/preset/android/features/contact-list.md +43 -0
  64. package/resource/knowledge/chat/preset/android/features/conversation-list.md +117 -0
  65. package/resource/knowledge/chat/preset/android/features/language.md +136 -0
  66. package/resource/knowledge/chat/preset/android/features/message-input.md +57 -0
  67. package/resource/knowledge/chat/preset/android/features/message-list.md +142 -0
  68. package/resource/knowledge/chat/preset/android/features/search.md +64 -0
  69. package/resource/knowledge/chat/preset/android/features/theme.md +222 -0
  70. package/resource/knowledge/chat/preset/android-view/integration.md +300 -0
  71. package/resource/knowledge/chat/preset/flutter/features/chat-setting.md +64 -0
  72. package/resource/knowledge/chat/preset/flutter/features/contact-list.md +40 -0
  73. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +129 -0
  74. package/resource/knowledge/chat/preset/flutter/features/language.md +104 -0
  75. package/resource/knowledge/chat/preset/flutter/features/message-input.md +54 -0
  76. package/resource/knowledge/chat/preset/flutter/features/message-list.md +158 -0
  77. package/resource/knowledge/chat/preset/flutter/features/search.md +59 -0
  78. package/resource/knowledge/chat/preset/flutter/features/theme.md +261 -0
  79. package/resource/knowledge/chat/preset/ios/features/chat-setting.md +94 -0
  80. package/resource/knowledge/chat/preset/ios/features/contact-list.md +119 -0
  81. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +134 -0
  82. package/resource/knowledge/chat/preset/ios/features/language.md +125 -0
  83. package/resource/knowledge/chat/preset/ios/features/message-input.md +69 -0
  84. package/resource/knowledge/chat/preset/ios/features/message-list.md +162 -0
  85. package/resource/knowledge/chat/preset/ios/features/search.md +93 -0
  86. package/resource/knowledge/chat/preset/ios/features/theme.md +270 -0
  87. package/resource/{doc/chatkit/ios → knowledge/chat/preset/ios-uikit}/integration.md +160 -158
  88. package/resource/knowledge/chat/preset/react/features/chat-setting.md +101 -0
  89. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/contact-list.md +43 -41
  90. package/resource/knowledge/chat/preset/react/features/conversation-actions.md +215 -0
  91. package/resource/knowledge/chat/preset/react/features/conversation-list.md +339 -0
  92. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +101 -0
  93. package/resource/knowledge/chat/preset/react/features/conversation-search.md +61 -0
  94. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/message-input.md +117 -156
  95. package/resource/knowledge/chat/preset/react/features/message-list.md +297 -0
  96. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/search.md +65 -59
  97. package/resource/knowledge/chat/preset/react/features/theme.md +93 -0
  98. package/resource/knowledge/chat/preset/vue/features/chat-header.md +331 -0
  99. package/resource/knowledge/chat/preset/vue/features/chat-setting.md +79 -0
  100. package/resource/knowledge/chat/preset/vue/features/contact-list.md +277 -0
  101. package/resource/knowledge/chat/preset/vue/features/conversation-actions.md +234 -0
  102. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +331 -0
  103. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +216 -0
  104. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/conversation-search.md +13 -13
  105. package/resource/knowledge/chat/preset/vue/features/message-input.md +551 -0
  106. package/resource/knowledge/chat/preset/vue/features/message-list.md +350 -0
  107. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/search.md +79 -73
  108. package/resource/knowledge/chat/preset/vue/features/theme.md +136 -0
  109. package/resource/knowledge/chat/urls/error-code.md +17 -0
  110. package/resource/knowledge/chat/urls/product.md +43 -0
  111. package/resource/knowledge/chat/urls/restapi.md +204 -0
  112. package/resource/knowledge/chat/urls/sdk/android.md +80 -0
  113. package/resource/knowledge/chat/urls/sdk/flutter.md +71 -0
  114. package/resource/knowledge/chat/urls/sdk/ios.md +80 -0
  115. package/resource/knowledge/chat/urls/sdk/web.md +80 -0
  116. package/resource/knowledge/chat/urls/webhook.md +68 -0
  117. package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +286 -0
  118. package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +174 -0
  119. package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +329 -0
  120. package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +55 -0
  121. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +434 -0
  122. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +362 -0
  123. package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +466 -0
  124. package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +173 -0
  125. package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +51 -0
  126. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +291 -0
  127. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +78 -0
  128. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +488 -0
  129. package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +219 -0
  130. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +282 -0
  131. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +212 -0
  132. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +153 -0
  133. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +312 -0
  134. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +404 -0
  135. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +334 -0
  136. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +426 -0
  137. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +166 -0
  138. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +52 -0
  139. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +281 -0
  140. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +150 -0
  141. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +438 -0
  142. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +190 -0
  143. package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +291 -0
  144. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +192 -0
  145. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +146 -0
  146. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +309 -0
  147. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +370 -0
  148. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +339 -0
  149. package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +503 -0
  150. package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +188 -0
  151. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +51 -0
  152. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +289 -0
  153. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +78 -0
  154. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +487 -0
  155. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +183 -0
  156. package/resource/knowledge/livekit/core-sdk/api-reference/web/index.md +736 -0
  157. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audience-list.md +53 -47
  158. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audio-effect.md +28 -24
  159. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-barrage.md +22 -18
  160. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-base-beauty.md +17 -15
  161. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-co-guest-interaction.md +19 -18
  162. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-gift.md +102 -89
  163. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-host-interaction.md +41 -37
  164. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-integration.md +45 -43
  165. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-live-list.md +23 -20
  166. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audience-list.md +41 -41
  167. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audio-effect.md +70 -69
  168. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-barrage.md +68 -71
  169. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-base-beauty.md +43 -47
  170. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-co-guest-interaction.md +59 -56
  171. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-gift.md +103 -105
  172. package/resource/knowledge/livekit/core-sdk/live/flutter/live-host-interaction.md +869 -0
  173. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-integration.md +84 -87
  174. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-live-list.md +43 -40
  175. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audience-list.md +11 -10
  176. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audio-effect.md +28 -24
  177. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-barrage.md +22 -18
  178. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-base-beauty.md +15 -14
  179. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-co-guest-interaction.md +19 -18
  180. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-gift.md +54 -50
  181. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-host-interaction.md +41 -37
  182. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-integration.md +40 -40
  183. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-live-list.md +19 -18
  184. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audience-list.md +53 -47
  185. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audio-effect.md +28 -24
  186. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-barrage.md +22 -18
  187. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-co-guest-interaction.md +41 -33
  188. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-gift.md +94 -81
  189. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-host-interaction.md +35 -30
  190. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-integration.md +45 -42
  191. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-room-list.md +23 -20
  192. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audience-list.md +260 -0
  193. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audio-effect.md +598 -0
  194. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-barrage.md +490 -0
  195. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-co-guest-interaction.md +65 -59
  196. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-gift.md +424 -0
  197. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-integration.md +69 -76
  198. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-room-list.md +726 -0
  199. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audience-list.md +11 -10
  200. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audio-effect.md +28 -24
  201. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-barrage.md +22 -18
  202. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-co-guest-interaction.md +41 -33
  203. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-gift.md +54 -50
  204. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-host-interaction.md +35 -30
  205. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-integration.md +49 -46
  206. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-room-list.md +19 -18
  207. package/resource/knowledge/livekit/faq/error-code.md +193 -0
  208. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/barrage.md +56 -53
  209. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-audience-list.md +22 -21
  210. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-view.md +34 -32
  211. package/resource/knowledge/push/config/android.md +92 -0
  212. package/resource/knowledge/push/config/harmonyos.md +83 -0
  213. package/resource/knowledge/push/config/ios.md +254 -0
  214. package/resource/knowledge/push/config/react-native.md +254 -0
  215. package/resource/knowledge/push/config/unity.md +209 -0
  216. package/resource/knowledge/push/config/unreal-engine.md +194 -0
  217. package/resource/knowledge/push/integration/android.md +404 -0
  218. package/resource/knowledge/push/integration/flutter.md +465 -0
  219. package/resource/knowledge/push/integration/harmonyos.md +63 -0
  220. package/resource/knowledge/push/integration/ios.md +246 -0
  221. package/resource/knowledge/push/integration/react-native.md +366 -0
  222. package/resource/knowledge/push/integration/uni-app.md +208 -0
  223. package/resource/knowledge/push/integration/unity.md +389 -0
  224. package/resource/knowledge/push/integration/unreal-engine.md +390 -0
  225. package/resource/knowledge/push/overview/prepare.md +60 -0
  226. package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +241 -0
  227. package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +588 -0
  228. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +364 -0
  229. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +340 -0
  230. package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +230 -0
  231. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +797 -0
  232. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +325 -0
  233. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +325 -0
  234. package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +233 -0
  235. package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +569 -0
  236. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +325 -0
  237. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +322 -0
  238. package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +221 -0
  239. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/device-detection.md +49 -48
  240. package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +461 -0
  241. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +216 -0
  242. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +370 -0
  243. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-participant-state.md +61 -60
  244. package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +280 -0
  245. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-view.md +57 -56
  246. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +319 -0
  247. package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +267 -0
  248. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +261 -0
  249. package/resource/knowledge/roomkit/preset/android/integration.md +396 -0
  250. package/resource/knowledge/roomkit/preset/flutter/integration.md +404 -0
  251. package/resource/knowledge/roomkit/preset/ios/integration.md +369 -0
  252. package/resource/knowledge/roomkit/preset/react/integration.md +576 -0
  253. package/resource/knowledge/rtcengine/web/how_to_run_web_sdk_demo.md +44 -0
  254. package/resource/{doc → knowledge}/rtcengine/web/plugin/21-advanced-auto-play-policy.md +8 -2
  255. package/resource/{doc → knowledge}/rtcengine/web/plugin/22-advanced-audio-mixer.md +19 -1
  256. package/resource/{doc → knowledge}/rtcengine/web/plugin/23-advanced-support-detection.md +1 -1
  257. package/resource/{doc → knowledge}/rtcengine/web/plugin/24-advanced-network-quality.md +8 -8
  258. package/resource/{doc → knowledge}/rtcengine/web/plugin/25-advanced-device-change.md +1 -1
  259. package/resource/{doc → knowledge}/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +6 -6
  260. package/resource/{doc → knowledge}/rtcengine/web/plugin/27-advanced-small-stream.md +3 -3
  261. package/resource/{doc → knowledge}/rtcengine/web/plugin/29-advanced-water-mark.md +18 -0
  262. package/resource/{doc → knowledge}/rtcengine/web/plugin/31-advanced-plugins-overview.md +1 -1
  263. package/resource/{doc → knowledge}/rtcengine/web/plugin/34-advanced-proxy.md +2 -2
  264. package/resource/{doc → knowledge}/rtcengine/web/plugin/35-advanced-ai-denoiser.md +1 -1
  265. package/resource/knowledge/trtc/android/TRTCCloud.md +1915 -0
  266. package/resource/knowledge/trtc/android/TRTCCloudDef.md +1029 -0
  267. package/resource/knowledge/trtc/android/TRTCCloudListener.md +1095 -0
  268. package/resource/knowledge/trtc/android/TRTCStatistics.md +68 -0
  269. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +502 -0
  270. package/resource/knowledge/trtc/android/TXBeautyManager.md +415 -0
  271. package/resource/knowledge/trtc/android/TXDeviceManager.md +169 -0
  272. package/resource/knowledge/trtc/android/TXLiteAVCode.md +125 -0
  273. package/resource/knowledge/trtc/c++/ITRTCCloud.md +2069 -0
  274. package/resource/knowledge/trtc/c++/ITRTCStatistics.md +73 -0
  275. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +502 -0
  276. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +391 -0
  277. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +1191 -0
  278. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +931 -0
  279. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +127 -0
  280. package/resource/knowledge/trtc/ios/TRTCCloud.md +2118 -0
  281. package/resource/knowledge/trtc/ios/TRTCCloudDef.md +975 -0
  282. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +1131 -0
  283. package/resource/knowledge/trtc/ios/TRTCStatistics.md +68 -0
  284. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +423 -0
  285. package/resource/knowledge/trtc/ios/TXBeautyManager.md +416 -0
  286. package/resource/knowledge/trtc/ios/TXDeviceManager.md +387 -0
  287. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +127 -0
  288. package/server-config.js +0 -1
  289. package/server.js +35 -12
  290. package/streamable-http.js +0 -1
  291. package/tools/call/get_native_call_uikit_integration.js +2 -4
  292. package/tools/call/get_native_callkit_core_integration.js +2 -6
  293. package/tools/call/get_web_call_uikit_integration.js +2 -4
  294. package/tools/chat/get_native_chat_uikit_integration.js +2 -4
  295. package/tools/chat/get_web_chat_uikit_integration.js +2 -4
  296. package/tools/common/get_usersig.js +0 -1
  297. package/tools/common/present_framework_choice.js +19 -14
  298. package/tools/common/record_answer.js +19 -26
  299. package/tools/common/record_feedback.js +17 -31
  300. package/tools/common/search_trtc_knowledge.js +44 -0
  301. package/tools/definitions/get_native_call_uikit_integration_def.js +3 -2
  302. package/tools/definitions/get_native_callkit_core_integration_def.js +5 -4
  303. package/tools/definitions/get_native_chat_uikit_integration_def.js +5 -3
  304. package/tools/definitions/get_native_livekit_core_integration_def.js +6 -6
  305. package/tools/definitions/get_usersig_def.js +0 -1
  306. package/tools/definitions/get_web_call_uikit_integration_def.js +4 -3
  307. package/tools/definitions/get_web_chat_uikit_integration_def.js +2 -1
  308. package/tools/definitions/get_web_live_uikit_integration_def.js +5 -6
  309. package/tools/definitions/get_web_room_core_integration_def.js +49 -0
  310. package/tools/definitions/get_web_room_uikit_integration_def.js +5 -5
  311. package/tools/definitions/integration-boundary.js +5 -0
  312. package/tools/definitions/present_framework_choice_def.js +12 -11
  313. package/tools/definitions/record_answer_def.js +19 -18
  314. package/tools/definitions/record_feedback_def.js +14 -14
  315. package/tools/definitions/search_trtc_knowledge_def.js +39 -0
  316. package/tools/index.js +5 -37
  317. package/tools/live/get_native_livekit_core_integration.js +1 -4
  318. package/tools/live/get_web_live_uikit_integration.js +2 -5
  319. package/tools/room/get_web_room_core_integration.js +47 -0
  320. package/tools/room/get_web_room_uikit_integration.js +2 -4
  321. package/utils/generate-structured-result.js +24 -31
  322. package/utils/generate-usersig.js +0 -1
  323. package/utils/get-device-identifier.js +0 -1
  324. package/utils/get-doc-content.js +14 -9
  325. package/utils/http-get.js +0 -1
  326. package/utils/http-post.js +0 -1
  327. package/utils/report-cls-client.js +18 -21
  328. package/utils/report-es-client.js +1 -2
  329. package/index.js.map +0 -1
  330. package/resource/doc/callkit/core-sdk/.gitkeep +0 -0
  331. package/resource/doc/callkit/core-sdk/android/answer-call.md +0 -852
  332. package/resource/doc/callkit/core-sdk/android/make-call.md +0 -954
  333. package/resource/doc/callkit/core-sdk/android/offline-push.md +0 -361
  334. package/resource/doc/callkit/core-sdk/flutter/answer-call.md +0 -1160
  335. package/resource/doc/callkit/core-sdk/flutter/make-call.md +0 -1205
  336. package/resource/doc/callkit/core-sdk/ios/answer-call.md +0 -1090
  337. package/resource/doc/callkit/core-sdk/ios/make-call.md +0 -1248
  338. package/resource/doc/callkit/core-sdk/ios/offline-push.md +0 -485
  339. package/resource/doc/callkit/core-sdk/uni-app/answer-call.md +0 -950
  340. package/resource/doc/callkit/core-sdk/uni-app/make-call.md +0 -1052
  341. package/resource/doc/callkit/faq/common/error-code.md +0 -47
  342. package/resource/doc/callkit/faq/flutter-faq.md +0 -115
  343. package/resource/doc/callkit/faq/ios-faq.md +0 -115
  344. package/resource/doc/callkit/faq/web-faq.md +0 -36
  345. package/resource/doc/callkit/preset/android/api.md +0 -296
  346. package/resource/doc/callkit/preset/flutter/api.md +0 -410
  347. package/resource/doc/callkit/preset/flutter/integration.md +0 -164
  348. package/resource/doc/callkit/preset/ios/api.md +0 -80
  349. package/resource/doc/callkit/preset/ios/integration.md +0 -187
  350. package/resource/doc/callkit/preset/react/api.md +0 -501
  351. package/resource/doc/callkit/preset/react/integration.md +0 -86
  352. package/resource/doc/callkit/preset/vue/api.md +0 -501
  353. package/resource/doc/callkit/preset/vue/integration.md +0 -83
  354. package/resource/doc/chatkit/android/faq.md +0 -111
  355. package/resource/doc/chatkit/android/features/theme.md +0 -219
  356. package/resource/doc/chatkit/android/integration.md +0 -490
  357. package/resource/doc/chatkit/faq/android_sdk/client-api.md +0 -281
  358. package/resource/doc/chatkit/faq/common/product.md +0 -7
  359. package/resource/doc/chatkit/faq/common/server.md +0 -44
  360. package/resource/doc/chatkit/faq/common/server_error_code.md +0 -74
  361. package/resource/doc/chatkit/faq/flutter_sdk/client-api.md +0 -199
  362. package/resource/doc/chatkit/faq/flutter_sdk/faq.md +0 -53
  363. package/resource/doc/chatkit/faq/ios_sdk/client-api.md +0 -235
  364. package/resource/doc/chatkit/faq/web_sdk/error_code.md +0 -47
  365. package/resource/doc/chatkit/faq/web_sdk/faq.md +0 -287
  366. package/resource/doc/chatkit/flutter/faq.md +0 -23
  367. package/resource/doc/chatkit/flutter/features/theme.md +0 -235
  368. package/resource/doc/chatkit/flutter/integration.md +0 -344
  369. package/resource/doc/chatkit/ios/faq.md +0 -111
  370. package/resource/doc/chatkit/ios/features/theme.md +0 -267
  371. package/resource/doc/chatkit/react/components/avatar.md +0 -104
  372. package/resource/doc/chatkit/react/components/chat-header.md +0 -148
  373. package/resource/doc/chatkit/react/components/chat-setting.md +0 -57
  374. package/resource/doc/chatkit/react/components/chat.md +0 -38
  375. package/resource/doc/chatkit/react/components/component-list.md +0 -37
  376. package/resource/doc/chatkit/react/components/conversation-actions.md +0 -174
  377. package/resource/doc/chatkit/react/components/conversation-list.md +0 -333
  378. package/resource/doc/chatkit/react/components/conversation-preview.md +0 -118
  379. package/resource/doc/chatkit/react/components/conversation-search.md +0 -60
  380. package/resource/doc/chatkit/react/components/message-list.md +0 -293
  381. package/resource/doc/chatkit/react/components/tuikit.md +0 -34
  382. package/resource/doc/chatkit/react/faq.md +0 -26
  383. package/resource/doc/chatkit/react/integration.md +0 -416
  384. package/resource/doc/chatkit/vue/components/avatar.md +0 -104
  385. package/resource/doc/chatkit/vue/components/chat-header.md +0 -148
  386. package/resource/doc/chatkit/vue/components/chat-setting.md +0 -62
  387. package/resource/doc/chatkit/vue/components/chat.md +0 -45
  388. package/resource/doc/chatkit/vue/components/component-list.md +0 -87
  389. package/resource/doc/chatkit/vue/components/contact-list.md +0 -271
  390. package/resource/doc/chatkit/vue/components/conversation-actions.md +0 -228
  391. package/resource/doc/chatkit/vue/components/conversation-list.md +0 -320
  392. package/resource/doc/chatkit/vue/components/conversation-preview.md +0 -213
  393. package/resource/doc/chatkit/vue/components/message-input.md +0 -1054
  394. package/resource/doc/chatkit/vue/components/message-list.md +0 -433
  395. package/resource/doc/chatkit/vue/components/tuikit.md +0 -31
  396. package/resource/doc/chatkit/vue/components/userpicker.md +0 -256
  397. package/resource/doc/chatkit/vue/faq.md +0 -36
  398. package/resource/doc/chatkit/vue/integration.md +0 -428
  399. package/resource/doc/livekit/core-sdk/live/flutter/live-host-interaction.md +0 -866
  400. package/resource/doc/livekit/faq/common/error-code.md +0 -88
  401. package/resource/doc/livekit/preset/live/vue/api-reference/index.md +0 -780
  402. package/resource/doc/livekit/preset/live/vue/components/co-guest-panel.md +0 -91
  403. package/resource/doc/livekit/preset/live/vue/components/live-scene-panel.md +0 -112
  404. package/resource/doc/livekit/preset/live/vue/components/stream-mixer.md +0 -215
  405. package/resource/doc/livekit/preset/live/vue/live-player-h5-integration.md +0 -300
  406. package/resource/doc/roomkit/faq/common/error-code.md +0 -67
  407. package/resource/doc/roomkit/vue/features/call-user-to-room.md +0 -220
  408. package/resource/doc/roomkit/vue/features/device-state.md +0 -460
  409. package/resource/doc/roomkit/vue/features/free-beauty-panel.md +0 -215
  410. package/resource/doc/roomkit/vue/features/room-chat.md +0 -369
  411. package/resource/doc/roomkit/vue/features/room-state.md +0 -282
  412. package/resource/doc/roomkit/vue/features/schedule-room.md +0 -318
  413. package/resource/doc/roomkit/vue/features/screen-share.md +0 -265
  414. package/resource/doc/roomkit/vue/features/virtual-background.md +0 -271
  415. package/resource/doc/roomkit/vue/integration.md +0 -315
  416. package/resource/doc/rtcengine/faq/common/error_code.md +0 -1
  417. package/resource/doc/rtcengine/faq/web_sdk/.gitkeep +0 -0
  418. package/resource/doc/rtcengine/web/.gitkeep +0 -0
  419. package/resource/doc/rtcengine/web/how_to_run_web_sdk_demo.md +0 -59
  420. package/resource/doc/trtc/C++/ITRTCCloud.md +0 -1970
  421. package/resource/doc/trtc/C++/ITRTCStatistics.md +0 -70
  422. package/resource/doc/trtc/C++/ITXAudioEffectManager.md +0 -469
  423. package/resource/doc/trtc/C++/ITXDeviceManager.md +0 -387
  424. package/resource/doc/trtc/C++/TRTCCloudCallback.md +0 -1082
  425. package/resource/doc/trtc/C++/TRTCTypeDef.md +0 -925
  426. package/resource/doc/trtc/C++/TXLiteAVCode.md +0 -129
  427. package/resource/doc/trtc/android/TRTCCloud.md +0 -1815
  428. package/resource/doc/trtc/android/TRTCCloudDef.md +0 -992
  429. package/resource/doc/trtc/android/TRTCCloudListener.md +0 -1004
  430. package/resource/doc/trtc/android/TRTCStatistics.md +0 -65
  431. package/resource/doc/trtc/android/TXAudioEffectManager.md +0 -469
  432. package/resource/doc/trtc/android/TXBeautyManager.md +0 -402
  433. package/resource/doc/trtc/android/TXDeviceManager.md +0 -173
  434. package/resource/doc/trtc/android/TXLiteAVCode.md +0 -127
  435. package/resource/doc/trtc/iOS/TRTCCloud.md +0 -2028
  436. package/resource/doc/trtc/iOS/TRTCCloudDef.md +0 -958
  437. package/resource/doc/trtc/iOS/TRTCCloudDelegate.md +0 -1046
  438. package/resource/doc/trtc/iOS/TRTCStatistics.md +0 -65
  439. package/resource/doc/trtc/iOS/TXAudioEffectManager.md +0 -397
  440. package/resource/doc/trtc/iOS/TXBeautyManager.md +0 -403
  441. package/resource/doc/trtc/iOS/TXDeviceManager.md +0 -381
  442. package/resource/doc/trtc/iOS/TXLiteAVCode.md +0 -130
  443. package/server-config.js.map +0 -1
  444. package/server.js.map +0 -1
  445. package/streamable-http.js.map +0 -1
  446. package/tools/call/get_callkit_api.js +0 -33
  447. package/tools/call/get_callkit_api.js.map +0 -1
  448. package/tools/call/get_native_call_uikit_integration.js.map +0 -1
  449. package/tools/call/get_native_callkit_core_integration.js.map +0 -1
  450. package/tools/call/get_web_call_uikit_integration.js.map +0 -1
  451. package/tools/chat/get_native_chat_uikit_feature_detail.js +0 -35
  452. package/tools/chat/get_native_chat_uikit_feature_detail.js.map +0 -1
  453. package/tools/chat/get_native_chat_uikit_integration.js.map +0 -1
  454. package/tools/chat/get_web_chat_uikit_component_detail.js +0 -35
  455. package/tools/chat/get_web_chat_uikit_component_detail.js.map +0 -1
  456. package/tools/chat/get_web_chat_uikit_integration.js.map +0 -1
  457. package/tools/common/get_faq.js +0 -266
  458. package/tools/common/get_faq.js.map +0 -1
  459. package/tools/common/get_usersig.js.map +0 -1
  460. package/tools/common/present_framework_choice.js.map +0 -1
  461. package/tools/common/record_answer.js.map +0 -1
  462. package/tools/common/record_feedback.js.map +0 -1
  463. package/tools/common/record_skill_session.js +0 -69
  464. package/tools/common/record_skill_session.js.map +0 -1
  465. package/tools/definitions/get_callkit_api_def.js +0 -29
  466. package/tools/definitions/get_callkit_api_def.js.map +0 -1
  467. package/tools/definitions/get_faq_def.js +0 -47
  468. package/tools/definitions/get_faq_def.js.map +0 -1
  469. package/tools/definitions/get_native_call_uikit_integration_def.js.map +0 -1
  470. package/tools/definitions/get_native_callkit_core_integration_def.js.map +0 -1
  471. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js +0 -31
  472. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js.map +0 -1
  473. package/tools/definitions/get_native_chat_uikit_integration_def.js.map +0 -1
  474. package/tools/definitions/get_native_livekit_core_features_def.js +0 -34
  475. package/tools/definitions/get_native_livekit_core_features_def.js.map +0 -1
  476. package/tools/definitions/get_native_livekit_core_integration_def.js.map +0 -1
  477. package/tools/definitions/get_native_trtc_sdk_docs_def.js +0 -32
  478. package/tools/definitions/get_native_trtc_sdk_docs_def.js.map +0 -1
  479. package/tools/definitions/get_usersig_def.js.map +0 -1
  480. package/tools/definitions/get_web_call_uikit_integration_def.js.map +0 -1
  481. package/tools/definitions/get_web_chat_uikit_component_detail_def.js +0 -31
  482. package/tools/definitions/get_web_chat_uikit_component_detail_def.js.map +0 -1
  483. package/tools/definitions/get_web_chat_uikit_integration_def.js.map +0 -1
  484. package/tools/definitions/get_web_live_uikit_integration_def.js.map +0 -1
  485. package/tools/definitions/get_web_livekit_api_def.js +0 -30
  486. package/tools/definitions/get_web_livekit_api_def.js.map +0 -1
  487. package/tools/definitions/get_web_livekit_component_detail_def.js +0 -32
  488. package/tools/definitions/get_web_livekit_component_detail_def.js.map +0 -1
  489. package/tools/definitions/get_web_room_uikit_integration_def.js.map +0 -1
  490. package/tools/definitions/get_web_roomkit_feature_detail_def.js +0 -31
  491. package/tools/definitions/get_web_roomkit_feature_detail_def.js.map +0 -1
  492. package/tools/definitions/get_web_trtc_sdk_api_def.js +0 -27
  493. package/tools/definitions/get_web_trtc_sdk_api_def.js.map +0 -1
  494. package/tools/definitions/get_web_trtc_sdk_integration_def.js +0 -27
  495. package/tools/definitions/get_web_trtc_sdk_integration_def.js.map +0 -1
  496. package/tools/definitions/get_web_trtc_sdk_plugin_def.js +0 -27
  497. package/tools/definitions/get_web_trtc_sdk_plugin_def.js.map +0 -1
  498. package/tools/definitions/present_framework_choice_def.js.map +0 -1
  499. package/tools/definitions/record_answer_def.js.map +0 -1
  500. package/tools/definitions/record_feedback_def.js.map +0 -1
  501. package/tools/definitions/record_skill_session_def.js +0 -31
  502. package/tools/definitions/record_skill_session_def.js.map +0 -1
  503. package/tools/index.js.map +0 -1
  504. package/tools/live/get_native_livekit_core_features.js +0 -68
  505. package/tools/live/get_native_livekit_core_features.js.map +0 -1
  506. package/tools/live/get_native_livekit_core_integration.js.map +0 -1
  507. package/tools/live/get_web_live_uikit_integration.js.map +0 -1
  508. package/tools/live/get_web_livekit_api.js +0 -33
  509. package/tools/live/get_web_livekit_api.js.map +0 -1
  510. package/tools/live/get_web_livekit_component_detail.js +0 -35
  511. package/tools/live/get_web_livekit_component_detail.js.map +0 -1
  512. package/tools/room/get_web_room_uikit_integration.js.map +0 -1
  513. package/tools/room/get_web_roomkit_feature_detail.js +0 -69
  514. package/tools/room/get_web_roomkit_feature_detail.js.map +0 -1
  515. package/tools/rtcengine/get_web_trtc_sdk_api.js +0 -32
  516. package/tools/rtcengine/get_web_trtc_sdk_api.js.map +0 -1
  517. package/tools/rtcengine/get_web_trtc_sdk_integration.js +0 -32
  518. package/tools/rtcengine/get_web_trtc_sdk_integration.js.map +0 -1
  519. package/tools/rtcengine/get_web_trtc_sdk_plugin.js +0 -32
  520. package/tools/rtcengine/get_web_trtc_sdk_plugin.js.map +0 -1
  521. package/tools/trtc/get_native_trtc_sdk_docs.js +0 -74
  522. package/tools/trtc/get_native_trtc_sdk_docs.js.map +0 -1
  523. package/utils/build-session-directives.js +0 -120
  524. package/utils/build-session-directives.js.map +0 -1
  525. package/utils/generate-structured-result.js.map +0 -1
  526. package/utils/generate-usersig.js.map +0 -1
  527. package/utils/get-device-identifier.js.map +0 -1
  528. package/utils/get-doc-content.js.map +0 -1
  529. package/utils/handle-framework.js +0 -9
  530. package/utils/handle-framework.js.map +0 -1
  531. package/utils/handle-state-name.js +0 -29
  532. package/utils/handle-state-name.js.map +0 -1
  533. package/utils/http-get.js.map +0 -1
  534. package/utils/http-post.js.map +0 -1
  535. package/utils/report-cls-client.js.map +0 -1
  536. package/utils/report-es-client.js.map +0 -1
  537. package/utils/report-runtime-error-cls-client.js +0 -91
  538. package/utils/report-runtime-error-cls-client.js.map +0 -1
  539. /package/resource/{doc/livekit/preset/live/vue/faq.md → knowledge/push/config/donut.md} +0 -0
  540. /package/resource/{doc/roomkit/vue/faq.md → knowledge/push/integration/donut.md} +0 -0
  541. /package/resource/{doc → knowledge}/rtcengine/web/api.md +0 -0
  542. /package/resource/{doc/rtcengine/faq/web/web.md → knowledge/rtcengine/web/faq.md} +0 -0
  543. /package/resource/{doc → knowledge}/rtcengine/web/how_to_integrated_web_sdk.md +0 -0
  544. /package/resource/{doc → knowledge}/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +0 -0
  545. /package/resource/{doc → knowledge}/rtcengine/web/plugin/28-advanced-beauty.md +0 -0
  546. /package/resource/{doc → knowledge}/rtcengine/web/plugin/30-advanced-cross-room-link.md +0 -0
  547. /package/resource/{doc → knowledge}/rtcengine/web/plugin/36-advanced-virtual-background.md +0 -0
  548. /package/resource/{doc → knowledge}/rtcengine/web/plugin/37-advanced-voice-changer.md +0 -0
  549. /package/resource/{doc → knowledge}/rtcengine/web/plugin/39-advanced-video-decoder.md +0 -0
  550. /package/resource/{doc → knowledge}/rtcengine/web/plugin/40-advanced-video-mixer.md +0 -0
  551. /package/resource/{doc → knowledge}/rtcengine/web/plugin/41-advanced-small-stream-auto-switcher.md +0 -0
  552. /package/resource/{doc → knowledge}/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +0 -0
  553. /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.