Skip to main content

Installation

Add the plugin to your Flutter project and configure dependencies.

Quickstart

Show your first incoming call screen in under 5 minutes.

Android Setup

Configure AndroidManifest.xml, permissions, and proguard rules.

iOS Setup

Configure Info.plist, CallKit entitlements, and AppDelegate.

What is Flutter Callkit Incoming?

Flutter Callkit Incoming is a Flutter plugin that shows a native incoming call UI when your app receives a VoIP call. On iOS it uses Apple’s CallKit framework for a system-level call screen. On Android it renders a custom full-screen notification that works on the lock screen. The plugin handles the full call lifecycle — from showing the ringing UI to accepting, declining, ending, holding, and muting calls — and fires Dart events for each action so your app can react accordingly.

Key features

Native incoming call UI

iOS uses the native CallKit screen. Android shows a full-screen custom notification with ringtone and vibration.

Full call lifecycle

Handle accept, decline, end, timeout, hold, mute, DTMF, and audio session events via a single Dart stream.

VoIP PushKit (iOS)

Wake your app from a terminated state when a VoIP push arrives using Apple’s PushKit framework.

Outgoing calls

Start outgoing calls that appear in the iOS Phone app’s recents list and fire the same lifecycle events.

Missed call notifications

Show a missed call notification on both platforms with a configurable callback action.

Native integration

Initiate calls directly from Swift, Kotlin, or Objective-C without going through Dart.

Platform support

PlatformMin versionNotes
AndroidAPI 21+Custom full-screen notification UI
iOSiOS 10+Native CallKit framework — real device only
iOS CallKit does not work on the simulator. Always test incoming calls on a real iOS device.

Quick example

import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';

// Show an incoming call
final params = CallKitParams(
  id: '44d915e1-5ff4-4bed-bf13-c423048ec97a',
  nameCaller: 'Jane Smith',
  appName: 'MyApp',
  handle: '+1 555 123 4567',
  type: 0, // 0 = audio, 1 = video
  duration: 30000,
  android: const AndroidParams(
    isCustomNotification: true,
    backgroundColor: '#0955fa',
    actionColor: '#4CAF50',
  ),
  ios: const IOSParams(
    handleType: 'generic',
    supportsVideo: false,
  ),
);
await FlutterCallkitIncoming.showCallkitIncoming(params);

// Listen for call events
FlutterCallkitIncoming.onEvent.listen((CallEvent? event) {
  switch (event?.event) {
    case Event.actionCallAccept:
      // Connect your WebRTC/P2P session
      break;
    case Event.actionCallDecline:
      // Notify your server
      break;
    case Event.actionCallEnded:
      // Clean up
      break;
    default:
      break;
  }
});

Next steps

Installation

Install the package

Android setup

Configure Android

iOS setup

Configure iOS

Show incoming call

Display a call screen

Call events

React to user actions

API reference

Full API docs

Build docs developers (and LLMs) love