说明:
TUICallKit 组件支持在 App 退到后台或被系统杀死时,通过 FCM(Firebase Cloud Messaging)推送通道唤醒被叫用户,使其能及时收到来电。本文档为您提供两种集成方式:基础推送(免费) 和 付费推送(基于 TIMPush 推送插件),您可以根据自己的业务需求进行 方案选择。
集成效果
按照本文档接入后,您的 App 在被杀进程或锁屏状态下也能及时唤醒被叫用户的来电:
应用在前台时的显示效果 | 应用在后台时或者离线时的显示效果 |
![]() | ![]() |
说明:
为获得良好的通话来电体验,建议您引导用户在 App 中开启 "通知"、"显示在其他应用上层"、"后台拉起界面" 等权限。
方案选择
您的需求 | 接入方案 | 费用 |
仅在 App 前台使用通话,不需要离线唤醒。 | 无需接入推送,跳过本文档 | 免费 |
App 退后台/被杀死时收到来电响铃,无其他诉求。 | 免费 | |
在响铃基础上需要数据统计、营销推送、跨平台支持等。 |
说明:
海外通话离线推送由 FCM(Firebase Cloud Messaging) 下发,需要您先在 Firebase 控制台创建项目并下载 google-services.json。
FCM 需要设备带有 GMS(Google Mobile Services)服务才能工作。中国大陆地区出厂的设备一般不带 GMS,请勿在国内场景下仅依赖 FCM。
如果您的 App 同时面向中国大陆用户,请同时参见 Android 通话离线推送接入(中国大陆) 接入国内厂商通道。
前置准备
无论选择方案一还是方案二,都需要先在 Firebase 创建项目、把 FCM 凭据上传到 IM 控制台、并把控制台返回的证书 ID 告诉 SDK。
步骤 1. 创建 Firebase 项目并下载 google-services.json
1. 登录 Firebase 控制台,Add Project 创建新项目(或使用已有项目)。
2. 在项目里 Add an app > Android,输入 App 的包名(必须与您 App 的
applicationId 完全一致)。3. 下载生成的
google-services.json,放到 App 模块根目录(与 build.gradle 同级)。4. 进入 Firebase 项目 Project Settings > Cloud Messaging,记录下 Server Key(用于上传到 IM 控制台)。


说明:
如果 Firebase 控制台 Cloud Messaging 标签下找不到 Server Key 入口,请按 Firebase 官方文档启用 Cloud Messaging API(Legacy)。
步骤 2. 将 FCM 凭据上传到 IM 控制台
打开 IM 控制台 > 选择您的 IM 应用 > 基础配置 > 离线推送证书配置 > 立即前往。在 厂商配置 > Android 标签下,点击添加证书,推送类型选择 FCM,消息类型选择透传(数据)消息,上传 Server Key 并填写应用包名。


说明:
FCM 推送类型必须选择"透传(数据)消息",不要选择"通知消息"。因为通知消息无法在 App 被杀时唤醒进程,不能满足通话场景的离线唤醒需求。
应用包名必须与您 App 的
applicationId 一致。上传成功后会得到一个 FCM 证书 ID,用于后续 SDK 调用
setCertificateID 时填写。方案一:基础推送
步骤 1. 添加 FCM 外挂依赖
在 App 模块的
build.gradle 中添加:dependencies {// 已有 AtomicXCoreimplementation 'com.tencent.atomicxcore:atomicxcore:latest.release'// FCM 外挂(不需要引 TIMPush 主包)implementation 'com.tencent.timpush:fcm:latest.release'}
禁止:
请勿引入
com.tencent.timpush:timpush 主包 。主包带有自动注册机制,会和 AtomicXCore 内置推送链路冲突。基础推送方案只需要 FCM 外挂包。注意:
FCM 外挂会通过 Gradle 自动传递依赖
com.google.firebase:firebase-messaging,您不需要单独添加。步骤 2. 应用 google-services Gradle 插件
在工程根目录的
build.gradle 中添加:buildscript {dependencies {classpath 'com.google.gms:google-services:4.4.0'}}
在 App 模块的
build.gradle 顶部应用插件:apply plugin: 'com.google.gms.google-services'
说明:
请确认
google-services.json 已经放到 App 模块根目录(与 build.gradle 同级),否则编译时会报错。步骤 3. 上报证书 ID
import io.trtc.tuikit.atomicxcore.api.login.LoginStoreclass App : Application() {override fun onCreate() {super.onCreate()LoginStore.shared.setCertificateID(mapOf("fcmCertificateId" to "12345" // 证书 ID))}}
说明:
调用时机不限,登录前后都可以,SDK 会在 IM 登录态就绪后自动同步 token 到 IM 后台。
只需调用一次,登出/重新登录后不需要再调一次,SDK 内部会自动处理。
如果您同时面向国内和海外用户,可以一次性把国内厂商证书 ID 和 FCM 证书 ID 都填入,SDK 会根据设备类型自动选择通道。
步骤 4. 拨打通话
AtomicXCore 的 CallStore 在发起通话时自动携带离线推送参数,您不需要手动设置任何 offlinePushInfo 字段。默认推送内容如下:字段 | 默认值 |
推送标题 | 主叫用户的 ID。 |
推送描述 | 中文环境下为「您有新的来电」,其它语言为「You have a new call」。 |
铃声 | SDK 内置铃声。 |
如果您想自定义推送标题或描述,可在发起通话时通过
CallParams 传入 offlinePushTitle / offlinePushDescription,传入后会覆盖上述默认值。import io.trtc.tuikit.atomicxcore.api.call.CallStoreimport io.trtc.tuikit.atomicxcore.api.call.CallParamsimport io.trtc.tuikit.atomicxcore.api.call.CallMediaTypeval params = CallParams().apply {timeout = 30 // 超时时间(秒)userData = "自定义数据" // 扩展信息(可选)// 可选:自定义离线推送标题和描述(不填则使用默认值)offlinePushTitle = "Alice"offlinePushDescription = "is calling you"}val userIdList = listOf("被叫用户的 userID")CallStore.shared.calls(participantIds = userIdList,mediaType = CallMediaType.VIDEO, // VIDEO 视频通话,AUDIO 语音通话params = params) { result ->if (result.isSuccess) {// 通话发起成功,跳转到您自己的通话页面} else {// 通话失败处理}}
方案二:付费推送
注意:
使用 TIMPush 推送插件首先需要开通 TIMPush 服务(付费/限时免费试用)。
步骤 1. 开通服务


步骤 2. 接入 TIMPush 主包和 FCM 外挂
在 App 模块
build.gradle 中添加:dependencies {implementation 'com.tencent.atomicxcore:atomicxcore:latest.release'// TIMPush 主包(必引)implementation 'com.tencent.timpush:timpush:latest.release'// FCM 外挂implementation 'com.tencent.timpush:fcm:latest.release'}
步骤 3. 下载 timpush-configs.json


步骤 4. 实现自动登录
方案二在 App 被推送唤起时,TIMPush 会通过
TUICore 事件总线发出登录通知。您需要在 Application 中监听该事件并实现自动登录逻辑,否则被叫端在应用被杀死后无法拉起来电 UI。import com.tencent.qcloud.tuicore.TUIConstants;import com.tencent.qcloud.tuicore.TUICore;import com.tencent.qcloud.tuicore.interfaces.ITUINotification;TUICore.registerEvent(TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_KEY,TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_SUB_KEY,new ITUINotification() {@Overridepublic void onNotifyEvent(String key, String subKey, Map<String, Object> param) {if (TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_KEY.equals(key)&& TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_SUB_KEY.equals(subKey)) {// 实现您的自动登录逻辑(拉起通话页面前必须先完成 IM 登录)autoLogin();}}});
说明:
该事件由 TIMPush 主包在用户点击通知横幅唤起 App 时发出,仅方案二可用。
方案一(基础推送)请直接在
Application.onCreate 中实现 IM 自动登录逻辑,无需监听该事件。TIMPush 主包通过
ServiceInitializer 机制自动初始化,并在 IM 登录成功后自动 registerPush 拿 token,业务侧无需手动调用任何初始化方法。步骤 5. 拨打通话
高级功能
自定义铃声
如果您想自定义该铃声,可以替换
tuicallkit-kt/src/main/res/raw/phone_ringing.mp3文件。注意:
替换掉该铃声后,不论应用在前台、后台或者离线,铃声都会是替换后的铃声。
替换后其他厂商手机收到邀请后的铃声也会是替换后的铃声。
常见问题
通用问题
收不到推送,如何排查?
按以下顺序逐项排查:
1. 检查 IM 控制台:FCM 证书是否上传成功,消息类型是否选择"透传(数据)消息"(不能选"通知消息")。
2. 检查应用包名(applicationId):必须与 Firebase 项目里注册的包名一致,与 IM 控制台上传证书时填的包名一致。
3. 检查
google-services.json:是否放到 App 模块根目录、应用了 com.google.gms.google-services 插件。4. 检查设备 GMS 环境:FCM 需要设备带有 Google Mobile Services。可以装一个测试 App(比如 Google Play 商店)确认 GMS 可用。
5. 检查通知权限:在系统设置中确认您的 App 已授予"通知"权限(Android 13+ 需要在运行时申请)。
6. 过滤 Logcat 关键字
[PushManager] 和 [ChannelManager] :查看 SDK 实际调用的 FCM 通道及返回结果。应用被杀死后无法弹出来电 UI,怎么办?
如果已经收到推送但没有弹出来电 UI,按以下顺序排查:
1. 确认收到数据消息:过滤 Logcat 关键字
TIMPush,确认有收到 FCM 透传消息的日志打印。如果没收到,说明卡在推送下发环节,请按 常见问题:收不到推送,如何排查? 排查。2. 确认应用已实现自动登录:SDK 收到推送后会自动尝试拉取通话请求,但拉取依赖 IM 已登录态。如果应用被杀进程后没有实现自动登录,SDK 拉不到通话请求,自然也不会显示来电 UI。建议在应用启动入口或
Application.onCreate 中实现 IM 自动登录逻辑。3. 确认权限:部分厂商系统需要授予"显示在其他应用上层"、"后台拉起界面"权限才能在被杀状态下弹出来电 UI,请引导用户在系统设置中开启。
中国大陆用户能用 FCM 吗?
通常不能。中国大陆出厂的设备一般不带 GMS(Google Mobile Services),FCM 服务无法连接到 Google 推送服务器。如果您的 App 同时面向国内用户,请同时参见 Android 通话离线推送接入(中国大陆)接入国内厂商通道。SDK 会根据设备类型自动选择对应通道,无需手动判断。
我的 App 同时面向国内和海外,需要分别打两个包吗?
不需要。同一个 App 可以同时引入国内厂商外挂和 FCM 外挂,并在
setCertificateID 中一次性填入所有证书 ID:LoginStore.shared.setCertificateID(mapOf(// 国内"huaweiCertificateId" to "12345","xiaomiCertificateId" to "12345","xiaomiAppId" to "...","xiaomiAppKey" to "...",// ... 其他国内厂商// 海外"fcmCertificateId" to "12345"))
SDK 会根据当前设备品牌自动选择对应的通道,国内设备走国内厂商通道,海外设备走 FCM。
方案一相关问题
接入方案一后发现不够用,如何升级到方案二?
按以下步骤切换:
1. 在
build.gradle 中加上 implementation 'com.tencent.timpush:timpush:latest.release'(厂商外挂依赖保持不变)。2. 删除代码中的
LoginStore.shared.setCertificateID(...) 调用——TIMPush 主包通过 ServiceInitializer 自动初始化、并在 IM 登录成功后自动 registerPush,不需要手动初始化。3. 按 方案二 > 实现自动登录 监听
EVENT_IM_LOGIN_AFTER_APP_WAKEUP_KEY 事件实现被推送唤起后的自动登录。4. 完成 方案二 > 开通服务 中的购买或试用流程。
注意:
两种方案不能同时使用,切换时请确保
build.gradle 里只保留一套依赖(要么 atomicxcore 单独引厂商外挂,要么搭配 timpush 主包),代码里也只保留一套初始化逻辑。方案二相关问题
如何确认 TIMPush 推送链路是否正常工作?
过滤 Logcat 关键字
TIMPush,关注这几条日志:register success:FCM 通道注册 token 成功setOfflinePushConfig success:token 上报到 IM 后台成功主叫端发起呼叫后,被叫端日志中出现
onReceiveNotificationMessage:表示已收到推送
