You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 14下如何实现不可关闭的自定义CallStyle通知?

解决方案:结合CallStyle与自定义视图实现Android全版本不可关闭通知

核心思路

Android 14 仅认可CallStyle通知(及企业DPC场景)为不可关闭通知,原setOngoing(true)的行为已失效。因此我们需要基于CallStyle构建通知框架,同时嵌入自定义视图,既满足系统的不可关闭要求,又保留自定义UI的灵活性。

分步实现

1. 构建CallStyle基础配置

系统需要识别通知为通话类(如VoIP、视频会议)才会赋予不可关闭权限,因此必须配置CallStyle的必要字段:

// 构建通话方信息(可根据业务场景自定义名称/头像)
NotificationCompat.Person caller = new NotificationCompat.Person.Builder()
        .setName("会议来电") // 替换为你的业务场景名称
        .build();

// 初始化CallStyle
NotificationCompat.CallStyle callStyle = new NotificationCompat.CallStyle()
        .setCaller(caller)
        .setIsVideoCall(true) // 根据场景设置是否为视频通话
        .setActions(R.id.action_accept, R.id.action_decline); // 关联通知操作按钮ID

2. 兼容全版本的通知Builder配置

通过版本判断,Android 14及以上使用CallStyle,旧版本保留原有的DecoratedCustomViewStyle,同时保留自定义视图配置:

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, INCOMING_CALL_CHANNEL_ID)
        .setSmallIcon(R.drawable.logo_light)
        .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        // 版本适配:Android14+用CallStyle,旧版本用原自定义样式
        .setStyle(Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE 
                ? callStyle 
                : new NotificationCompat.DecoratedCustomViewStyle())
        .setCustomContentView(notificationLayout) // 你的自定义布局
        .setCustomHeadsUpContentView(notificationLayout) // 锁屏/悬浮通知的自定义布局
        .setFullScreenIntent(setViewNotificationClick(conferenceRoom, member), true)
        .setOngoing(true) // 旧版本仍需此参数保证不可关闭
        .setAutoCancel(true)
        .setDeleteIntent(getTimeDestroyNotificationPendingIntent(context, conferenceRoom))
        .setTimeoutAfter(30000);

// 添加通知操作按钮(需与CallStyle中setActions的ID对应)
builder.addAction(new NotificationCompat.Action.Builder(
        R.drawable.ic_accept, "接入", acceptPendingIntent)
        .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_ANSWER)
        .setId(R.id.action_accept)
        .build());

builder.addAction(new NotificationCompat.Action.Builder(
        R.drawable.ic_decline, "拒绝", declinePendingIntent)
        .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_DECLINE)
        .setId(R.id.action_decline)
        .build());

// 构建最终通知
Notification notification = builder.build();

关键注意事项

  • CallStyle必填字段:必须设置setCaller,否则系统无法识别为通话类通知,依然会允许用户关闭。
  • 自定义视图覆盖:CallStyle的默认UI会被setCustomContentView设置的布局完全覆盖,无需担心样式冲突。
  • 非通话场景适配:如果你的场景是视频会议、直播连麦等持续交互场景,同样可以使用CallStyle;若为后台下载等非通话场景,普通应用无法绕过Android14的限制,只能通过企业DPC方案实现。
  • 版本兼容:旧版本(<14)仍依赖setOngoing(true)保证不可关闭,需保留该参数。

内容的提问来源于stack exchange,提问作者TinaTT2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:57:34