Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
react-native-incall-manager
Advanced tools
Handling media-routes/sensors/events during a audio/video chat on React Native
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 handle most of requirements when making/receiving/talking to a call.
This module is desinged to work with react-native-webrtc you can find demo here: https://github.com/oney/RCTWebRTCDemo
since 2.1.0
, you should use RN 40+
and upgrade your xcode to support swift 3
.
after upgrading xcode, Edit -> Convert -> To Current Swift Syntax
to invoke Swift Migration Assistant
see Migrating to Swift 2.3 or Swift 3 from Swift 2.2
for old RN versions (RN < 0.40) please use version 1.5.4
( Swift 2.2~2.3 )
from npm package: npm install react-native-incall-manager
from git package: npm install git://github.com/zxcpoiu/react-native-incall-manager.git
=================================================== ####android:
After install, you can use rnpm
(npm install rnpm -g
) to link android.
use rnpm link react-native-incall-manager
to link or manually if you like.
optional sound files on android if you want to use bundled ringtone/ringback/busytone sound instead of system sound
We use android support library v4 to check/request permissions.
You should add compile "com.android.support:support-v4:23.0.1"
in $your_project/android/app/build.gradle
dependencies on android.
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.
===================================================
####ios:
since ios part written in swift and it doesn't support static library yet.
before that, you should add this project manually:
Add files in to your project:
add files
to your project and add node_modules/react-native-incall-manager/ios/RNInCallManager/
Copy items if needed
and select Added folders: Create groups
then add it. you will see a new directory named RNInCallmanager under your_project
directory.Setup Objective-C Bridging Header:
project's xcodeproject root
, go to build setting
and search Objective-C Bridging Header
ReactNativeProjectRoot/ios/
, in this case, you should set ../node_modules/react-native-incall-manager/ios/RNInCallManager/RNInCallManager-Bridging-Header.h
optional sound files on android if you want to use bundled ringtone/ringback/busytone sound instead of system sound
copy file if needed
incallmanager_busytone.mp3
incallmanager_ringback.mp3
incallmanager_ringtone.mp3
on ios, we only support mp3 files currently.
This module implement a basic handle logic automatically, just:
import InCallManager from 'react-native-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 remote 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
});
since version 1.2.0, two functions and a property were added:
// --- function
async checkRecordPermission() // return promise
async requestRecordPermission() // return promise
// --- property
recordPermission = 'unknow' or 'granted' or 'denied', default is 'unknow'
After incall-manager initialized, it will check current state of record permission and set to recordPermission
property.
so you can just write below code in your ComponentDidMount
like:
if (InCallManager.recordPermission !== 'granted') {
InCallManager.requestRecordPermission()
.then((requestedRecordPermissionResult) => {
console.log("InCallManager.requestRecordPermission() requestedRecordPermissionResult: ", requestedRecordPermissionResult);
})
.catch((err) => {
console.log("InCallManager.requestRecordPermission() catch: ", err);
});
}
We use android support library v4 to check/request permissions.
You should add compile "com.android.support:support-v4:23.0.1"
in $your_project/android/app/build.gradle
dependencies on android.
NOTE for android:
React Native does not officially support api 23 currently ( it is on api 22 now. see: RN known issues) and android supports request permission at runtime since api 23, so it will always return 'granted' immediately after calling checkRecordPermission()
or requestRecordPermission()
.
If you really need the functionality, you can do the following to make them work but at your own risk:
( I've tested it though, but who knows :) )
Step 1: change your targetSdkVersion
to 23 in $your_project/android/app/build.gradle
Step 2: override onRequestPermissionsResult
in your MainActivity.java
like:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
InCallManagerPackage.onRequestPermissionsResult(requestCode, permissions, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
then you can test it on android 6 now.
Another thing you should know is:
If you change targetSdkVersion to 23, the red box
which React Native used to display errors in development mode requires permission Draw Over Other Apps
.
So in development mode, you should manually grant permission in app settings
on your device or declare android.permission.SYSTEM_ALERT_WINDOW
in your manifest.
You don't have to do this in release mode since there are no red box.
checkout this awesome project: react-native-android-permissions by @lucasferreira for more information.
on start:
audio
, route voice to earpiece, otherwise route to speaker.on stop:
you can custom behavior use 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 checkRecordPermission() | :smile: | :smile: | check record permission without promt. return Promise. see about permission section above |
async requestRecordPermission() | :smile: | :smile: | request record permission to user. return Promise. see about permission section above |
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() |
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 case be care when customize your own behavior
ISC License ( functionality equivalent to MIT License )
I'm not expert neither on ios nor android, any suggestions, pull request, corrections are really appreciated and welcome.
FAQs
Handling media-routes/sensors/events during a audio/video chat on React Native
The npm package react-native-incall-manager receives a total of 5,968 weekly downloads. As such, react-native-incall-manager popularity was classified as popular.
We found that react-native-incall-manager demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers 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.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.