文档中心>实时音视频>视频通话 SDK>离线唤醒>Android>Android 通话离线推送接入(海外场景)

Android 通话离线推送接入(海外场景)

最近更新时间:2026-06-15 17:06:31

我的收藏
说明:
本文档适用于在 海外(Google Play 等)应用市场上架的 App。如果您的 App 仅在中国大陆上架,请参见 Android 通话离线推送接入(中国大陆)
TUICallKit 组件支持在 App 退到后台或被系统杀死时,通过 FCM(Firebase Cloud Messaging)推送通道唤醒被叫用户,使其能及时收到来电。本文档为您提供两种集成方式:基础推送(免费)付费推送(基于 TIMPush 推送插件),您可以根据自己的业务需求进行 方案选择

集成效果

按照本文档接入后,您的 App 在被杀进程或锁屏状态下也能及时唤醒被叫用户的来电:
应用在前台时的显示效果
应用在后台时或者离线时的显示效果






说明:
为获得良好的通话来电体验,建议您引导用户在 App 中开启 "通知"、"显示在其他应用上层"、"后台拉起界面" 等权限。

方案选择

您的需求
接入方案
费用
仅在 App 前台使用通话,不需要离线唤醒。
无需接入推送,跳过本文档
免费
App 退后台/被杀死时收到来电响铃,无其他诉求。
免费
在响铃基础上需要数据统计、营销推送、跨平台支持等。
付费, 需要 开通 TIMPush 服务
说明:
海外通话离线推送由 FCM(Firebase Cloud Messaging) 下发,需要您先在 Firebase 控制台创建项目并下载 google-services.json。
FCM 需要设备带有 GMS(Google Mobile Services)服务才能工作。中国大陆地区出厂的设备一般不带 GMS,请勿在国内场景下仅依赖 FCM。
如果您的 App 同时面向中国大陆用户,请同时参见 Android 通话离线推送接入(中国大陆) 接入国内厂商通道。
完成选择后,请先阅读 前置准备 章节完成 FCM 项目创建和证书申请,再前往对应方案章节完成接入。

前置准备

无论选择方案一还是方案二,都需要先在 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 {
// 已有 AtomicXCore
implementation '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

Application.onCreate 中调用 LoginStore.setCertificateID,把您在 前置准备 中拿到的 FCM 证书 ID 上报:
import io.trtc.tuikit.atomicxcore.api.login.LoginStore

class 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. 拨打通话

AtomicXCoreCallStore 在发起通话时自动携带离线推送参数,您不需要手动设置任何 offlinePushInfo 字段。默认推送内容如下:
字段
默认值
推送标题
主叫用户的 ID。
推送描述
中文环境下为「您有新的来电」,其它语言为「You have a new call」。
铃声
SDK 内置铃声。
如果您想自定义推送标题或描述,可在发起通话时通过 CallParams 传入 offlinePushTitle / offlinePushDescription,传入后会覆盖上述默认值。
import io.trtc.tuikit.atomicxcore.api.call.CallStore
import io.trtc.tuikit.atomicxcore.api.call.CallParams
import io.trtc.tuikit.atomicxcore.api.call.CallMediaType

val 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. 开通服务

进入 IM 控制台 > 插件市场,单击立即购买免费试用(每个应用可免费试用一次,有效期 7 天)。




注意:
推送插件试用或购买到期后,将自动停止提供推送服务(包括普通消息离线推送、全员/标签推送等服务)。为避免影响您业务正常使用,请提前 购买 / 续费

步骤 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'
}
google-services 插件配置参见 方案一 > 步骤 2

步骤 3. 下载 timpush-configs.json

进入 IM 控制台 > 推送管理,下载 timpush-configs.json 文件,添加到 App 模块的 assets/ 目录下。




步骤 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() {
@Override
public 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:表示已收到推送
如果某一段日志缺失,请按 常见问题:收不到推送,如何排查? 的顺序排查。

交流与反馈

如有问题,可以 联系我们,进行技术交流和产品沟通。