产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明



google-services.json 文件 ,来实现离线推送功能。厂商推送平台 | IM 控制台配置 |
![]() | ![]() |
timpush-configs.json 文件添加到应用模块的 assets 目录下,将 google-services.json 添加到工程 app 目录下。选择下载配置文件 timpush-configs.json | 下载文件 google-services.json | 添加到您的工程 |
![]() | ![]() | ![]() |
app 目录下的build.gradle文件中添加如下依赖:implementation "com.tencent.timpush:timpush:latest.release"implementation "com.tencent.timpush:fcm:latest.release"
tuicallkit-kt/build.gradle文件中修改 Chat SDK 的版本号。build.gradle 文件的 buildscript > dependencies 下添加以下配置:buildscript {dependencies {classpath 'com.google.gms:google-services:4.3.15'}}
app 目录下的build.gradle文件中添加下方配置:apply plugin: 'com.google.gms.google-services'
app 目录下,找到并打开build.gradle文件,将应用包名修改为您的实际应用包名。applicationId 'com.****.callkit'
import android.content.BroadcastReceiverimport android.content.Contextimport android.content.Intentimport android.content.IntentFilterimport android.os.Bundleimport androidx.localbroadcastmanager.content.LocalBroadcastManagerclass PushWakeupReceiver : BroadcastReceiver() {override fun onReceive(context: Context?, intent: Intent?) {if (intent?.action == "TIMPush.BROADCAST_IM_LOGIN_AFTER_APP_WAKEUP") {val bundle = intent.getExtras()// 2.执行自动登录// autoLogin()}}}class MainActivity : AppCompatActivity() {private val wakeupReceiver = PushWakeupReceiver()private var callListener: CallListener? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 1.监听应用唤醒广播observeAppWeakup()}private fun observeAppWeakup() {val filter = IntentFilter("TIMPush.BROADCAST_IM_LOGIN_AFTER_APP_WAKEUP")LocalBroadcastManager.getInstance(this).registerReceiver(wakeupReceiver, filter)}}
NotificationManager 通知管理类显示您定制的来电通知界面,实现方式如下:IncomingCallNotificationManager):封装推送的创建和显示等逻辑。RemoteViews 定制通知布局。关于如何使用 NotificationCompat.Builder 配置通知的详细参数(如 Channel、PendingIntent、优先级等),请参阅 Android 官方文档:NotificationCompat.Builder。import android.app.Notificationimport android.app.NotificationChannelimport android.app.NotificationManagerimport android.content.Contextimport android.content.Intentimport android.os.Buildimport android.widget.RemoteViewsimport androidx.core.app.NotificationCompatclass IncomingCallNotificationManager(private val context: Context) {private val channelId = "incoming_call_channel"private val channelName = "来电通知"private val notificationId = 1001private var remoteViews: RemoteViews? = nullprivate val notificationManager: NotificationManager =context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagerinit {// 1.创建通知渠道createNotificationChannel()}private fun createNotificationChannel() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val channel = NotificationChannel(channelId, // 渠道 ID(唯一标识)"来电通知", // 渠道名称(用户可见)NotificationManager.IMPORTANCE_HIGH // 重要性:高优先级).apply {description = "显示来电通知" // 渠道描述(用户可见)enableLights(true) // 启用通知灯enableVibration(true) // 启用震动setShowBadge(false) // 不显示角标}notificationManager.createNotificationChannel(channel)}}// 2. 显示自定义来电通知的 UI 样式fun showIncomingCallNotification(callerName: String,callerAvatar: Int?, // Bitmap 或 Int (资源 ID)isVideoCall: Boolean) {// RemoteViews 用于在通知中显示自定义的布局remoteViews = RemoteViews(context.packageName, R.layout.incoming_call_notification)// 设置来电者姓名remoteViews?.setTextViewText(R.id.tv_caller_name, callerName)// 设置通话类型描述(视频通话 或 语音通话)remoteViews?.setTextViewText(R.id.tv_call_desc, if (isVideoCall) "视频通话" else "语音通话")// 设置通话类型图标val callTypeIcon = if (isVideoCall) {R.drawable.ic_video_call} else {R.drawable.ic_audio_call}remoteViews?.setImageViewResource(R.id.img_call_type, callTypeIcon)// 设置呼叫用户头像remoteViews?.setImageViewResource(R.id.img_avatar, callerAvatar)// 创建通知对象val notification = NotificationCompat.Builder(context, channelId).setSmallIcon(R.drawable.ic_notification_small) // 状态栏显示的小图标.setContent(remoteViews) // 设置自定义布局.setCustomContentView(remoteViews) // 标准视图(通知栏收起时).setCustomBigContentView(remoteViews) // 展开视图(通知栏展开时).setOngoing(true) // 持续通知(用户无法滑动删除).setAutoCancel(true) // 点击后自动取消.setCategory(NotificationCompat.CATEGORY_CALL) // 分类为通话通知.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) // 锁屏时可见.setTimeoutAfter(60000) // 60秒后自动取消.build()notificationManager.notify(notificationId, notification)}}
R.layout.incoming_call_notification ):<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="16dp"android:background="#FFFFFF"android:gravity="center_vertical"><!-- 用户头像 --><ImageViewandroid:id="@+id/img_avatar"android:layout_width="56dp"android:layout_height="56dp"android:layout_gravity="center_vertical"android:scaleType="centerCrop"android:src="@drawable/callview_ic_avatar"android:background="@drawable/avatar_background" /><!-- 用户信息和描述 --><LinearLayoutandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical"android:layout_marginStart="16dp"android:orientation="vertical"><TextViewandroid:id="@+id/tv_caller_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:textStyle="bold"android:textColor="#212121"android:maxLines="1"android:ellipsize="end"android:text="来电" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="6dp"android:orientation="horizontal"android:gravity="center_vertical"><ImageViewandroid:id="@+id/img_call_type"android:layout_width="16dp"android:layout_height="16dp"android:src="@drawable/ic_audio_call" /><TextViewandroid:id="@+id/tv_call_desc"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="6dp"android:textSize="14sp"android:textColor="#757575"android:text="语音通话" /></LinearLayout></LinearLayout></LinearLayout>
class MainActivity : AppCompatActivity() {private val wakeupReceiver = PushWakeupReceiver()private var callListener: CallListener? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 1.监听来电事件observeCallReceived()}private fun observeCallReceived() {callListener = object : CallListener() {override fun onCallReceived(callId: String, mediaType: CallMediaType, userData: String) {super.onCallReceived(callId, mediaType, userData)// 2.显示来电通知showIncomingCallNotification(mediaType)}}callListener?.let { CallStore.shared.addListener(it) }}private fun showIncomingCallNotification(mediaType: CallMediaType) {try {val callerName = CallStore.shared.observerState.activeCall.value.inviterIdval notificationManager = IncomingCallNotificationManager(this)notificationManager.showIncomingCallNotification(callerName = callerName,callerAvatar = R.drawable.callview_ic_avatar,isVideoCall = mediaType == CallMediaType.Video)} catch (e: Exception) {}}}
参数 | 类型 | 说明 |
callId | String | 此次通话的唯一标识。 |
mediaType | 通话媒体类型,用于指定发起音频通话还是视频通话。 CallMediaType.Video : 视频通话。CallMediaType.Audio : 语音通话。 |
字段 | 类型 | 说明 |
callId | String | 此次通话的唯一标识。 |
roomId | String | 此次通话的房间 ID 。 |
inviterId | String | 发起通话用户的 ID 。 |
inviteeIds | LinkedHashSet<String> | 被叫用户的 ID 列表。 |
chatGroupId | String | 此次通话的群组 ID ,与 Chat 配合使用。 |
mediaType | 此次通话的媒体类型。 CallMediaType.Video : 视频通话。CallMediaType.Audio : 语音通话。 | |
result | 通话结果/方向。 CallDirection.Unknown:未知通话。CallDirection.Missed:未接通话。CallDirection.Incoming:来电通话。CallDirection.Outgoing:拨出通话。 | |
duration | Long | 通话时长。 |
startTime | Long | 通话接通的开始时间。 |


TIMPushManager.getInstance().forceUseFCMPushChannel(true);
文档反馈