google-services.json) and a way to deliver a high-priority data message that
wakes the device.
What merges in automatically
From the plugin manifest: the TelecomConnectionService, the foreground ring service, the
full-screen call Activity, the notification action receiver, and the permissions
MANAGE_OWN_CALLS, FOREGROUND_SERVICE, FOREGROUND_SERVICE_PHONE_CALL, POST_NOTIFICATIONS,
USE_FULL_SCREEN_INTENT, VIBRATE, WAKE_LOCK, MODIFY_AUDIO_SETTINGS.
Runtime permissions
- Android 13+ — request
POST_NOTIFICATIONSbefore calls arrive. The full-screen fallback is a notification; without the permission it cannot show. (The Telecom path does not need it.) - Android 14+ —
USE_FULL_SCREEN_INTENTis auto-granted to apps whose notifications useCATEGORY_CALL(RingKit’s do). No manual grant needed for a calling app. - Bluetooth selection — enumerating/selecting a specific Bluetooth device on Android 12+
needs the runtime
BLUETOOTH_CONNECTpermission. Without it, RingKit still routes to earpiece/speaker.
Delivering the wake push
Option A — RingKit owns the FCM service
If your app has no other FCM service, declare the opt-in service in your app manifest:data message (at minimum callId):
RingKitMessagingService treats any data message carrying callId as a call; override
onNonCallMessage(message) in a subclass to handle your other pushes.
Option B — you already have a push service
If you already run a push service (OneSignal, your ownFirebaseMessagingService, SIP), do
not declare RingKit’s service — it would collide. From your existing handler, call:
type == cancelType), call RingKitIncomingCall.dismiss(context, callId)
instead — branch on RingKitPayload.isCancel(dataMap, config). For OneSignal, set
payloadPreset: "onesignal" and hand OneSignal’s data map to RingKitPayload.extract.
Hybrid presentation
present() first tries a self-managed Telecom ConnectionService — the true native call
screen. If Telecom is unavailable or the OEM rejects it, RingKit falls back to a
full-screen-intent Activity backed by a foreground ring service, so the call still rings from a
killed app. Control it with androidFullScreenFallback / androidForceFullScreen. The
strict-OEM story is on the Reliability page.
Localizing the full-screen call UI
The fallback screen ships English strings. App resources override library resources, so define the same names in your app’sres/values-<lang>/strings.xml:
Huawei / non-GMS devices can’t receive FCM. RingKit is push-agnostic — deliver the wake
message with HMS Push and call the same
present(...) entry point. See the HMS section on
the Reliability page.