说明:
TUICallKit 组件支持在 App 退到后台或被系统杀死时,通过国内各厂商推送通道唤醒被叫用户,使其能及时收到来电。
集成效果
按照本文档接入后,您的 App 在被杀进程或锁屏状态下也能及时唤醒被叫用户的来电。被叫端的实际显示效果会因厂商系统而异,整体类似于系统电话的来电通知:
说明:
不同厂商的系统在通知样式上略有差异,下图以 vivo 设备为例。整体来看用户在 App 退后台或锁屏状态下都能可靠收到来电通知。
应用在后台时或离线时 | 锁屏时 |
![]() | ![]() |
说明:
国内通话离线推送由各厂商通道(华为 / 小米 / OPPO / vivo / 荣耀 / 魅族)下发,不依赖 FCM。出厂的中国大陆设备一般不带 GMS 服务,FCM 在大陆环境无法触达,请勿在国内场景下仅依赖 FCM。
各厂商通道由各自的应用市场审核管理,vivo / 小米 / OPPO 正式环境推送通常要求 App 已上架其应用市场,否则推送可能不下发或受频次限制。建议在上架前用厂商提供的“测试推送”模式做基本验证。
前置准备
需要先在各厂商的开放平台申请推送应用、把厂商凭据上传到 IM 控制台、并把控制台返回的证书 ID 告诉 SDK。
步骤1:申请各厂商推送应用并获取凭据
请按需在各厂商开放平台分别注册推送应用,每家会要求的字段不同,整体清单如下:
厂商 | 必需字段 | 说明 |
华为 HMS Push | agconnect-services.json | |
小米 MiPush | AppId、AppKey | |
OPPO Push | AppKey、AppSecret | |
vivo Push | AppId、AppKey | |
荣耀 Push | mcs-services.json 或 AppId | |
魅族 Flyme Push | AppId、AppKey |
说明:
您的应用包名(applicationId)必须与各厂商开放平台注册时填写的包名完全一致,否则推送无法下发。
步骤2:将厂商凭据上传到 IM 控制台

说明:
需要哪几家厂商就上传哪几家,不全也可以(不上传的厂商对应通道不可用)。
应用包名(Bundle ID)必须与您 App 的
applicationId 一致。上传成功后,每家厂商会得到一个证书 ID(数字),用于后续 SDK 调用
setCertificateID 时填写。功能接入
步骤1:开通服务

步骤2:接入 TIMPush 主包和厂商外挂
在 App 模块
build.gradle 中添加:dependencies {implementation 'io.trtc.uikit:atomicx-core:latest.release'// TIMPush 主包(必引)implementation 'com.tencent.timpush:timpush:latest.release'// 各厂商外挂(按需引入)implementation 'com.tencent.timpush:huawei:latest.release'implementation 'com.tencent.timpush:xiaomi:latest.release'implementation 'com.tencent.timpush:oppo:latest.release'implementation 'com.tencent.timpush:vivo:latest.release'implementation 'com.tencent.timpush:honor:latest.release'implementation 'com.tencent.timpush:meizu:latest.release'}
步骤 3. 配置厂商所需的 manifestPlaceholders 和插件
部分厂商外挂需要通过 manifestPlaceholders 注入 AppId / AppKey。在
build.gradle 的 defaultConfig 中加入:android {defaultConfig {manifestPlaceholders = [VIVO_APPKEY : 'YOUR_VIVO_APPKEY',VIVO_APPID : 'YOUR_VIVO_APPID',HONOR_APPID : 'YOUR_HONOR_APPID',]}}
并在工程级和 app 模块的
build.gradle 中应用华为、荣耀的 Gradle 插件:// 工程根目录 build.gradlebuildscript {dependencies {classpath 'com.huawei.agconnect:agcp:1.9.1.301'classpath 'com.hihonor.mcs:asplugin:2.0.1.300'}}// app 模块 build.gradle 顶部apply plugin: 'com.huawei.agconnect'apply plugin: 'com.hihonor.mcs.asplugin'
注意:
工程根目录还需要在 repositories 中添加华为、荣耀 maven 仓库,否则上述插件和 SDK 拉不下来。
把华为的 agconnect-services.json 放到 app 模块根目录、把荣耀的 mcs-services.json 放到对应位置(按各厂商接入文档要求)。
步骤4:下载并添加 TIMPush 配置文件

下载后,将该文件添加到应用模块的
assets 目录。推荐存储路径:app/src/main/assets/timpush-configs.json,其中 app 是您项目的应用模块,可替换成实际名称。如果工程中没有 assets 目录,请在 src/main/ 下手动创建。注意:
TIMPush 注册推送时会读取该文件中的厂商证书配置,不要放在 MainActivity 同级目录、工程根目录或 res 目录。如果文件缺失或放错目录,SDK 无法获得对应厂商通道配置,可能导致注册或收消息失败。
步骤5:实现自动登录
您需要在
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 时发出。
TIMPush 主包通过
ServiceInitializer 机制自动初始化,并在 IM 登录成功后自动 registerPush 拿 token,业务侧无需手动调用任何初始化方法。步骤6:拨打通话
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 = "张三"offlinePushDescription = "邀请您视频通话"}val userIdList = listOf("被叫用户的 userID")CallStore.shared.calls(participantIds = userIdList,mediaType = CallMediaType.VIDEO, // VIDEO 视频通话,AUDIO 语音通话params = params) { result ->if (result.isSuccess) {// 通话发起成功,跳转到您自己的通话页面} else {// 通话失败处理}}
高级功能
自定义铃声
SDK 默认使用
phone_ringing 作为离线推送铃声资源名。如果您想自定义铃声,只需在您 App 的 app/src/main/res/raw/ 目录下放置一个名为 phone_ringing.mp3 的音频文件,Android 资源合并机制会自动覆盖 SDK 内置的同名资源。your-app/└── app/└── src/main/res/raw/└── phone_ringing.mp3 ← 您的自定义铃声
注意:
替换后不论应用在前台、后台或者离线,铃声都会是替换后的铃声。
替换后所有厂商手机收到邀请后的铃声都会是替换后的铃声。
文件名必须严格为
phone_ringing.mp3(小写、不带空格),否则不会生效。常见问题
收不到推送,如何排查?
按以下顺序逐项排查:
1. 检查 IM 控制台是否上传了对应厂商的证书:证书 ID 是否与代码里
setCertificateID 填的一致。2. 检查应用包名(applicationId):必须与各厂商开放平台注册时一致,与 IM 控制台上传证书时填的包名一致。
3. 检查通知权限:在系统设置中确认您的 App 已授予“通知”权限。
4. 检查应用是否在厂商应用市场上架:vivo / 小米 / OPPO 在生产环境一般要求 App 已上架其应用市场,否则推送可能不下发。
5. 过滤 Logcat 关键字
[PushManager] 和 [ChannelManager]:查看 SDK 实际调用的厂商通道及返回结果。应用被杀死后无法弹出来电 UI,怎么办?
如果已经收到推送但没有弹出来电 UI,按以下顺序排查:
1. 确认收到推送:过滤 Logcat 关键字
[PushManager] / [ChannelManager] / TIMPush,确认厂商通道有 token 注册成功并能收到推送下发。如果没收到推送,请按 常见问题:收不到推送,如何排查? 排查。2. 确认应用已实现自动登录:SDK 收到推送后会自动尝试拉取通话请求,但拉取依赖 IM 已登录态。如果应用被杀进程后没有实现自动登录,SDK 拉不到通话请求,自然也不会显示来电 UI。建议在应用启动入口或
Application.onCreate 中实现 IM 自动登录逻辑。3. 确认权限:部分厂商系统需要授予“显示在其他应用上层”、“后台拉起界面”权限才能在被杀状态下弹出来电 UI,请引导用户在系统设置中开启。
厂商推送服务上架有哪些要求?
各厂商推送通道在生产环境的上架要求和账号要求如下:
厂商通道 | 是否需要上架 | 账号说明 |
小米 | 是 | 需要注册企业开发者账号。 |
vivo | 是 | 需要注册企业开发者账号。 |
OPPO | 是 | 需要注册企业开发者账号。 |
荣耀 | 否 | 需要注册企业开发者账号。 |
华为 | 否 | 个人开发者账号即可。 |
魅族 | 否 | 个人开发者账号即可。 |
上架时,小米 / vivo / OPPO 在开放平台都提供了“测试推送”模式以便联调:
vivo:测试推送每天 1000 条额度,可加白名单设备。
小米:可申请少量公信通道临时权限。
OPPO:可在后台添加测试设备白名单。
如何确认 TIMPush 推送链路是否正常工作?
过滤 Logcat 关键字
TIMPush,关注这几条日志:register success:厂商通道注册 token 成功setOfflinePushConfig success:token 上报到 IM 后台成功主叫端发起呼叫后,被叫端日志中出现
onReceiveNotificationMessage:表示已收到推送
