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

如何自定义ConnectycubeFlutterCallKit来电通知界面?需添加图片与自定义按钮

锁屏SIP来电通知自定义(含多按钮与图片)方案

一、Connectycube-flutter-call-kit的自定义局限性

Connectycube-flutter-call-kit本质是封装了iOS的CallKit和Android的ConnectionService,这两个系统级组件的来电UI自定义空间极小:

  • iOS端:CallKit的来电界面由系统统一渲染,无法添加自定义图片或额外按钮(仅支持系统默认的接听/拒绝),强行修改会违反Apple的审核规则。
  • Android端:ConnectionService的默认UI受系统ROM限制,部分定制系统允许有限调整,但跨设备兼容性极差,无法保证所有机型都能显示自定义元素。

如果坚持使用该插件,只能通过原生层二次开发绕开系统组件:

  • iOS:放弃CallKit,改用本地通知(UNNotification)实现自定义界面,添加图片和自定义按钮,但会失去系统来电的高优先级(无法打断媒体播放、锁屏置顶展示)。
  • Android:修改插件原生代码,创建自定义全屏通知,使用XML布局添加图片和按钮,但需要处理锁屏权限、通知渠道优先级等细节。

二、更适合的替代插件方案

1. flutter_local_notifications

这是Flutter生态中最成熟的通知插件,支持跨平台自定义锁屏通知,完全满足你的需求:

  • 支持添加自定义图片(通过BigPictureStyleInformation)
  • 可配置多个动作按钮(接听、开门、忽略)
  • 配合audio_service插件可实现铃声和震动播放
  • 支持锁屏下全屏展示通知

简化实现代码:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

final FlutterLocalNotificationsPlugin _notificationPlugin = FlutterLocalNotificationsPlugin();

Future<void> initNotifications() async {
  // 初始化配置
  const AndroidInitializationSettings androidInit = AndroidInitializationSettings('app_icon');
  const IOSInitializationSettings iosInit = IOSInitializationSettings();
  const InitializationSettings initSettings = InitializationSettings(android: androidInit, iOS: iosInit);
  await _notificationPlugin.initialize(initSettings, onSelectNotification: (payload) {
    // 处理按钮点击回调
    if (payload == 'accept') { /* 接听逻辑 */ }
    else if (payload == 'open_door') { /* 开门逻辑 */ }
    else if (payload == 'ignore') { /* 忽略逻辑 */ }
  });
}

Future<void> showCameraCallNotification() async {
  // Android通知配置(含自定义图片和按钮)
  const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
    'camera_call_channel',
    '摄像机来电通知',
    channelDescription: '接收门口摄像机的SIP来电',
    importance: Importance.max,
    priority: Priority.high,
    fullScreenIntent: true,
    visibility: NotificationVisibility.public,
    styleInformation: BigPictureStyleInformation(
      DrawableResourceAndroidBitmap('camera_preview'), // 自定义图片资源
      contentTitle: '门口摄像机来电',
      summaryText: '访客请求进入',
    ),
    actions: [
      AndroidNotificationAction('accept', '接听'),
      AndroidNotificationAction('open_door', '开门'),
      AndroidNotificationAction('ignore', '忽略'),
    ],
  );

  // iOS通知配置
  const IOSNotificationDetails iosDetails = IOSNotificationDetails(
    presentAlert: true,
    presentSound: true,
    sound: 'call_ringtone.wav',
    actions: [
      IOSNotificationAction('accept', '接听', options: [IOSNotificationActionOption.foreground]),
      IOSNotificationAction('open_door', '开门', options: [IOSNotificationActionOption.foreground]),
      IOSNotificationAction('ignore', '忽略', options: [IOSNotificationActionOption.destructive]),
    ],
  );

  const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails, iOS: iosDetails);
  await _notificationPlugin.show(
    1001,
    '摄像机来电',
    '点击处理访客请求',
    notificationDetails,
  );
}

2. awesome_notifications

该插件提供更简洁的跨平台API,无需复杂的原生配置即可实现自定义通知:

  • 直接支持添加图片、视频等媒体附件
  • 一键配置多动作按钮
  • 内置铃声和震动控制
  • 支持锁屏全屏通知

三、关键注意事项

  • 权限配置:
    • Android:需申请POST_NOTIFICATIONS、WAKE_LOCK权限,通知渠道设置为最高优先级。
    • iOS:需开启Push Notifications权限,在Background Modes中勾选Audio, AirPlay, and Picture in Picture。
  • SIP后台监听:Android需使用前台服务保持SIP客户端后台运行,iOS需启用VoIP推送接收来电事件。
  • 资源准备:铃声、图片资源需放入原生项目的对应目录(Android的res文件夹,iOS的Assets.xcassets)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:16:25