I figured out how to do this. Here I will explain step by step:
Step 1:
Install npm -> npm install react-native-twilio -save . In an Android project, select and add the following two classes:
TwilioModule.java
import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.annotation.Nullable; import android.util.Log; import android.widget.Toast; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.twilio.client.Connection; import com.twilio.client.ConnectionListener; import com.twilio.client.Device; import com.twilio.client.DeviceListener; import com.twilio.client.PresenceEvent; import com.twilio.client.Twilio; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Map; public class TwilioModule extends ReactContextBaseJavaModule implements ConnectionListener, DeviceListener { private ReactContext rContext; private Device twilioDevice; private Connection connection; private Connection pendingConnection; private IntentReceiver _receiver; private TwilioModule self; private String TAG = "CDMS_TWILIO"; public class IntentReceiver extends BroadcastReceiver { private ConnectionListener _cl; public IntentReceiver(ConnectionListener connectionListener) { this._cl = connectionListener; } public void onReceive(Context context, Intent intent) { Log.d(TAG,"onReceive method called"); pendingConnection = (Connection)intent.getParcelableExtra("com.twilio.client.Connection"); pendingConnection.setConnectionListener(this._cl); pendingConnection.accept(); connection = pendingConnection; pendingConnection = null; sendEvent("deviceDidReceiveIncoming", null); } } public TwilioModule(ReactApplicationContext reactContext) { super(reactContext); Log.d(TAG,"TwilioModule constructor called"); rContext = reactContext; this.rContext = reactContext; self = this; this._receiver = new IntentReceiver(this); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.rogchap.react.modules.twilio.incoming"); this.rContext.registerReceiver(this._receiver, intentFilter); } private void sendEvent(String eventName, @Nullable Map<String, String> params) { if (eventName.equals("connectionDidDisconnect")) {
TwilioPackage.java
import com.facebook.react.ReactPackage; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.Arrays; import java.util.Collections; import java.util.List; public class TwilioPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { return Arrays.<NativeModule>asList( new TwilioModule(reactContext) ); } @Override public List<Class<? extends JavaScriptModule>> createJSModules() { return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Arrays.asList(); } }
Step 2:
Then add the package module to your main application class:
@Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new TwilioPackage() <-- Here ); }
Step 3:
Add the Twilio service to the manifest file:
<service android:name="com.twilio.client.TwilioClientService" android:exported="false" android:stopWithTask="true" />
Step 4:
Add twilio lib to build.gradle:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.facebook.react:react-native:+' compile 'com.twilio:client-android:1.2.15' <-- Here }
Step 5:
Now you should add this code to your native answer:
Dailer.js
'use strict'; import React, { Component } from 'react'; import { NativeModules, NativeAppEventEmitter,AppRegistry,TouchableOpacity,Text,StyleSheet,TextInput,View,TouchableHighlight,Alert,ActivityIndicator,AsyncStorage,Image ,Navigator} from 'react-native'; var Dimensions = require('Dimensions'); var windowSize = Dimensions.get('window'); const Twilio = require('react-native-twilio'); var styles = StyleSheet.create({ container: { flexDirection: 'column', flex: 1, backgroundColor: 'transparent' }, }); class Dialer extends Component { constructor(props) { super(props); this.state = { phno:'+9112345678',twiliotoken:'xaxaxaxaxaxaxax',statusMessage:'Wait...',jsonData:'',isConnecting:false,connectionFailed:false,}; } componentWillMount() { this.InitTwilioClientMethods(); } render() { return ( <Navigator renderScene={this.renderScene.bind(this)} navigator={this.props.navigator} /> ); } renderScene(route, navigator) { return ( <View style={styles.container}> <View style={{position: 'absolute',left: 0,top: 0, width: windowSize.width,height: windowSize.height,backgroundColor:'#343B44'}}/> <View style = {{flex: 1.1,backgroundColor: 'transparent',flexDirection: 'column',}}> <View style = {{justifyContent: 'flex-end',alignItems: 'center',flex: 1,backgroundColor: 'transparent'}}> <Text style={{color: '#FFFFFF', fontFamily: 'Montserrat-Regular',fontWeight: 'bold', fontSize:20,}}> {this.state.username}</Text> </View> <View style = {{justifyContent: 'flex-start',alignItems: 'center',flex: 1,backgroundColor: 'transparent'}}> <Text style={{color: '#6AF182', fontFamily: 'Montserrat-Regular', marginTop:10, fontSize:17,}}> {this.state.statusMessage} </Text> </View> </View> <View style = {{justifyContent: 'center',alignItems: 'center',flex: 2,backgroundColor: 'transparent'}}> <Image source={{uri: 'http://servicedrivetoday.com/wp-content/uploads/2015/10/shutterstock_285486080-512x342.jpg'}} style={{ width: 112,height: 112,borderRadius: 112/2}}/> </View> <View style = {{justifyContent: 'center',alignItems: 'center',flex: 1,backgroundColor: 'transparent'}}> <TouchableOpacity style={{justifyContent: 'center',alignItems: 'center',backgroundColor: 'transparent'}} onPress={() => this.endCallAction()}> <Image source={require('image!icon_call_cancel')} style={{height:60,width:60}}/> </TouchableOpacity> </View> </View> );
}
callNumber(){ Twilio.connect({To: this.state.phno}); } endCallAction() { this.callDisconnectHandler(); var navigator = this.props.navigator; navigator.pop(); } InitTwilioClientMethods(){ Twilio.initWithToken(this.state.twiliotoken); Twilio.addEventListener('deviceDidStartListening', this.deviceDidStartListening); Twilio.addEventListener('deviceDidStopListening', this.deviceDidStopListening); Twilio.addEventListener('deviceDidReceiveIncoming', this.deviceDidReceiveIncoming); Twilio.addEventListener('connectionDidStartConnecting', this.connectionDidStartConnecting); Twilio.addEventListener('connectionDidConnect', this.connectionDidConnect); Twilio.addEventListener('connectionDidDisconnect', this.connectionDidDisconnect); Twilio.addEventListener('connectionDidFail', this.connectionDidFail); setTimeout(() => { this.setState({ statusMessage: 'Connecting...' }); Twilio.connect({To: this.state.phno}); }, 6000); } deviceDidStartListening(){ console.log('deviceDidStartListening'); } deviceDidStopListening(){ console.log('deviceDidStopListening'); } deviceDidReceiveIncoming(){ console.log('deviceDidReceiveIncoming'); } connectionDidStartConnecting(){
For ios, you need to follow the instructions from the repo: https://github.com/rogchap/react-native-twilio
If you find any problem for ios, check out this link: Twilio call does not work on iOS and Android interactively
Happy coding ...