注意:说明:
注意:这篇档适用于在中国大陆应用市场上架的 App。如果你的 App 面向海外市场,请参见 Android 通话离线推送接入(海外场景)。
一、集成效果
按照这篇档接入后,你的 App 在被杀进程或锁屏状态下也能及时唤醒被叫用户的来电。被叫端的实际显示效果会因厂商系统而异,整体类似于系统电话的来电通知:
注意:说明:
注意:不同厂商的系统在通知样式上略有差异,下图以 vivo 设备为例。整体来看用户在 App 退后台或锁屏状态下都能可靠收到来电通知。
| 应用在后台时或离线时 | 锁屏时 |
| | |
注意:说明:
二、前置准备
需要先在各厂商的开放平台申请推送应用、把厂商凭据上传到 IM 控制台、并把控制台返回的证书 ID 告诉 SDK。
三、步骤1:申请各厂商推送应用并获取凭据
请按需在各厂商开放平台分别注册推送应用,每家会要求的字段不同,整体清单如下:
| 厂商 | 必需字段 | 说明 |
| 华为 HMS Push | agconnect-services.json | 在 华为 AppGallery Connect 创建项目后下载,放到 App 模块根目录。 |
| 小米 MiPush | AppId、AppKey | 在小米开放平台 创建应用后获得。 |
| OPPO Push | AppKey、AppSecret | 在 OPPO 开放平台 创建应用后获得。 |
| vivo Push | AppId、AppKey | 在 vivo 开放平台 创建应用后获得。 |
| 荣耀 Push | mcs-services.json 或 AppId | 在 荣耀开发者服务平台 创建项目后下载/获取。 |
| 魅族 Flyme Push | AppId、AppKey | 在 魅族开放平台 创建应用后获得。 |
注意:说明:
注意:你的应用包名(applicationId)必须与各厂商开放平台注册时填写的包名完全一致,否则推送无法下发。
四、步骤2:将厂商凭据上传到 IM 控制台
打开 IM 控制台 > 选择你的 IM 应用 > 推送服务 Push > 概览 > 配置厂商证书。在右侧 Android 标签下,按厂商分别:添加证书、上传凭据、设置应用包名。
注意:说明:
五、步骤1:开通服务
进入 IM 控制台 > 插件市场,单击立即购买或免费试用(每个应用可免费试用一次,有效期 7 天)。
注意:推送插件试用或购买到期后,将自动停止提供推送服务(包括普通消息离线推送、全员/标签推送等服务)。为避免影响你业务正常使用,请提前 购买 / 续费。
六、步骤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'
八、步骤4:下载并添加 TIMPush 配置文件
完成厂商配置后,在腾讯云控制台下载 timpush-configs.json,下载路径为:控制台 > 推送服务 Push > 推送设置 > 厂商配置 > 下载证书,示意图为:
下载后,将该文件添加到应用模块的 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() { @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(); } } });
注意:说明:
十、步骤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 ← 你的自定义铃声
十二、收不到推送,如何排查?
按以下顺序逐项排查:
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:表示已收到推送
如果某一段日志缺失,请按 常见问题:收不到推送,如何排查? 的顺序排查。
十六、交流与反馈
如有问题,可以 联系我们,进行技术交流和产品沟通。