
Security News
Critical Security Vulnerability in React Server Components
React disclosed a CVSS 10.0 RCE in React Server Components and is advising users to upgrade affected packages and frameworks to patched versions now.
rn-incall-manager
Advanced tools
Handling media-routes/sensors/events during a audio/video chat on React Native
This repository is created so I can easily update the code to my needs; some decisions may not be to your liking so it might be best to just use the original: react-native-incall-manager
Handling media-routes/sensors/events during a audio/video chat on React Native
The purpose of this module is to handle actions/events during a phone call (audio/video) on react-native, ex:
Basically, it is a telecommunication module which handles most of the requirements when making/receiving/talking with a call.
From npm package: npm install rn-incall-manager
From git package: npm install git://github.com/marqroldan/rn-incall-manager.git
===================================================
If you want to use bundled ringtone/ringback/busytone sound instead of system sound,
put files in android/app/src/main/res/raw
and rename file correspond to sound type:
incallmanager_busytone.mp3
incallmanager_ringback.mp3
incallmanager_ringtone.mp3
On android, as long as your file extension supported by android, this module will load it.
===================================================
If you want to use bundled ringtone/ringback/busytone sound instead of system sound
copy file if neededincallmanager_busytone.mp3
incallmanager_ringback.mp3
incallmanager_ringtone.mp3
On ios, we only support mp3 files currently.
This module implements a basic handle logic automatically, just:
import InCallManager from "rn-incall-manager";
// --- start manager when the chat start based on logics of your app
// On Call Established:
InCallManager.start({ media: "audio" }); // audio/video, default: audio
// ... it will also register and emit events ...
// --- On Call Hangup:
InCallManager.stop();
// ... it will also remove event listeners ...
If you want to use ringback:
// ringback is basically for OUTGOING call. and is part of start().
InCallManager.start({ media: "audio", ringback: "_BUNDLE_" }); // or _DEFAULT_ or _DTMF_
//when callee answered, you MUST stop ringback explicitly:
InCallManager.stopRingback();
If you want to use busytone:
// busytone is basically for OUTGOING call. and is part of stop()
// If the call failed or callee are busing,
// you may want to stop the call and play busytone
InCallManager.stop({ busytone: "_DTMF_" }); // or _BUNDLE_ or _DEFAULT_
If you want to use ringtone:
// ringtone is basically for INCOMING call. it's independent to start() and stop()
// if you receiving an incoming call, before user pick up,
// you may want to play ringtone to notify user.
InCallManager.startRingtone("_BUNDLE_"); // or _DEFAULT_ or system filename with extension
// when user pickup
InCallManager.stopRingtone();
InCallManager.start();
// or user hangup
InCallManager.stopRingtone();
InCallManager.stop();
Also can interact with events if you want: See API section.
import { DeviceEventEmitter } from "react-native";
DeviceEventEmitter.addListener("Proximity", function (data) {
// --- do something with events
});
On start:
audio, route voice to earpiece, otherwise route to speaker.On stop:
You can customize behavior using API/events exposed by this module. See API section.
Note: iOS only supports auto currently.
Methods
| Method | android | ios | description |
|---|---|---|---|
start({media: ?string, auto: ?boolean, ringback: ?string}) | :smile: | :smile: | start incall manager. ringback accept non-empty string or it won't play default: {media:'audio', auto: true, ringback: ''} |
stop({busytone: ?string}) | :smile: | :smile: | stop incall manager busytone accept non-empty string or it won't play default: {busytone: ''} |
| turnScreenOn() | :smile: | :rage: | force turn screen on |
| turnScreenOff() | :smile: | :rage: | force turn screen off |
setKeepScreenOn(enable: ?boolean) | :smile: | :smile: | set KeepScreenOn flag = true or false default: false |
setSpeakerphoneOn(enable: ?boolean) | :smile: | :rage: | toggle speaker ON/OFF once. but not force default: false |
setForceSpeakerphoneOn(flag: ?boolean) | :smile: | :smile: | true -> force speaker on false -> force speaker off null -> use default behavior according to media type default: null |
setMicrophoneMute(enable: ?boolean) | :smile: | :rage: | mute/unmute micophone default: false p.s. if you use webrtc, you can just use track.enabled = false to mute |
| async getAudioUriJS() | :smile: | :smile: | get audio Uri path. this would be useful when you want to pass Uri into another module. |
startRingtone(ringtone: string, ?vibrate_pattern: array, ?ios_category: string, ?seconds: number) | :smile: | :smile: | play ringtone. ringtone: 'DEFAULT' or 'BUNDLE'vibrate_pattern: same as RN, but does not support repeatios_category: ios only, if you want to use specific audio categoryseconds: android only, specify how long do you want to play rather than play once nor repeat. in sec. |
| stopRingtone() | :smile: | :smile: | stop play ringtone if previous started via startRingtone() |
| stopRingback() | :smile: | :smile: | stop play ringback if previous started via start() |
setFlashOn(enable: ?boolean, brightness: ?number) | :rage: | :smile: | set flash light on/off |
| async getIsWiredHeadsetPluggedIn() | :rage: | :smile: | return wired headset plugged in state |
Events
| Event | android | ios | description |
|---|---|---|---|
| 'Proximity' | :smile: | :smile: | proximity sensor detected changes. data: {'isNear': boolean} |
| 'WiredHeadset' | :smile: | :smile: | fire when wired headset plug/unplug data: {'isPlugged': boolean, 'hasMic': boolean, 'deviceName': string } |
| 'NoisyAudio' | :smile: | :rage: | see andriod doc. data: null |
| 'MediaButton' | :smile: | :rage: | when external device controler pressed button. see android doc data: {'eventText': string, 'eventCode': number } |
| 'onAudioFocusChange' | :smile: | :rage: | see andriod doc data: {'eventText': string, 'eventCode': number } |
NOTE: platform OS always has the final decision, so some toggle API may not work in some cases be careful when customizing your own behavior
ISC License ( functionality equivalent to MIT License )
FAQs
Handling media-routes/sensors/events during a audio/video chat on React Native
We found that rn-incall-manager demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
React disclosed a CVSS 10.0 RCE in React Server Components and is advising users to upgrade affected packages and frameworks to patched versions now.

Research
/Security News
We spotted a wave of auto-generated “elf-*” npm packages published every two minutes from new accounts, with simple malware variants and early takedowns underway.

Security News
TypeScript 6.0 will be the last JavaScript-based major release, as the project shifts to the TypeScript 7 native toolchain with major build speedups.