2016-09-23 84 views
6

我正在與反應原生的建設需要twilio集成的android移動應用程序。我使用了npm repo的示例代碼。 。如何在android中集成twilio native native?

https://github.com/rogchap/react-native-twilio

const Twilio = require('react-native-twilio'); 
Twilio.initWithToken('sometoken'); 

componentWillMount() { 
Twilio.initWithTokenUrl('https://example.com/token'); 
// or 
Twilio.initWithToken('sometoken'); 
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); 
} 

Twilio.connect({To: '+61234567890'}); 

Twilio.disconnect(); 

Twilio.accept(); 

Twilio.reject(); 

Twilio.ignore(); 

,但我不能把它做。如果有人對此有所瞭解,請幫助我。

回答

11

我已經找到了辦法。在這裏,我將在步驟解釋步驟:

步驟1:

安裝NPM - >NPM安裝反應天然-twilio --save。 在Android項目去,並添加如下這兩個類:

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")) { 
    //Log.e("mytag", "not emitting an event, just dereferncing the DeviceEventEmitter"); 
    rContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).toString(); 
    //Log.e("mytag", "DONE"); 
} 
else { 
    rContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, null); 
} 
} 

@Override 
public String getName() { 
return "Twilio"; 
} 

@ReactMethod 
public void initWithTokenUrl(String tokenUrl) { 
Log.d(TAG,"TwilioModule initWithTokenUrl method called"); 
StringBuilder sb = new StringBuilder(); 
try { 
    URLConnection conn = new URL(tokenUrl).openConnection(); 
    InputStream in = conn.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); 
    String line = ""; 
    while ((line = reader.readLine()) != null) { 
    sb.append(line); 
    } 
} catch (Exception e) { 
} 
initWithToken(sb.toString()); 
} 

@ReactMethod 
public void initWithToken(final String token) { 
Log.d(TAG,"TwilioModule initWithToken method called, token = "+token); 
if (!Twilio.isInitialized()) { 
    Twilio.initialize(rContext, new Twilio.InitListener() { 
    @Override 
    public void onInitialized() { 
     try { 
     if (twilioDevice == null) { 
      twilioDevice = Twilio.createDevice(token, self); 
      if (twilioDevice!=null){ 
      Log.d(TAG,"twilioDevice is available"); 
      } 
      else{ 
      Log.d(TAG,"twilioDevice is null"); 
      } 
      Intent intent = new Intent(); 
      intent.setAction("com.rogchap.react.modules.twilio.incoming"); 
      PendingIntent pi = PendingIntent.getBroadcast(rContext, 0, intent, 0); 
      twilioDevice.setIncomingIntent(pi); 
     } 
     } catch (Exception e) { 
     } 
    } 

    @Override 
    public void onError(Exception e) { 
     Log.d(TAG, e.toString() + "Twilio initilization failed"); 
    } 
    }); 
} 
} 

@ReactMethod 
public void connect(ReadableMap par) { 
Log.d(TAG,"twilioDevice connect"); 
String contact = ""; 
Map<String, String> params = new HashMap<String, String>(); 
contact = par.getString("To").trim(); 
params.put("To", contact); 

// Create an outgoing connection 
if (twilioDevice != null) { 
    connection = twilioDevice.connect(params, self); 
} 
else { 
    Log.d(TAG,"twilioDevice is null"); 
} 
} 

@ReactMethod 
public void disconnect() { 
Log.d(TAG,"disconnect method called"); 
if (connection != null) { 
    connection.disconnect(); 
    connection = null; 
} 
} 

@ReactMethod 
public void accept() { 
Log.d(TAG,"accept method called"); 
} 

@ReactMethod 
public void reject() { 
    Log.d(TAG,"reject method called"); 
    pendingConnection.reject(); 
} 

@ReactMethod 
public void ignore() { 
    Log.d(TAG,"ignore method called"); 
    pendingConnection.ignore(); 
} 

@ReactMethod 
public void setMuted(Boolean isMuted) { 
Log.d(TAG,"setMuted method called"); 
if (connection != null && connection.getState() == Connection.State.CONNECTED) { 
    connection.setMuted(isMuted); 
} 
} 

/* ConnectionListener */ 

@Override 
public void onConnecting(Connection connection) { 
Log.d(TAG,"onConnecting method called"); 
sendEvent("connectionDidStartConnecting", null); 
} 

@Override 
public void onConnected(Connection connection) { 
Log.d(TAG,"onConnected method called"); 
sendEvent("connectionDidConnect", null); 
} 

@Override 
public void onDisconnected(Connection connection) { 
Log.d(TAG,"onDisconnected method called"); 
if (connection == connection) { 
    connection = null; 
} 
if (connection == pendingConnection) { 
    pendingConnection = null; 
} 
sendEvent("connectionDidDisconnect", null); 
} 

@Override 
public void onDisconnected(Connection connection, int errorCode, String errorMessage) { 
Log.d(TAG,"onDisconnected method with error called"); 
Map errors = new HashMap(); 
errors.put("err", errorMessage); 
sendEvent("connectionDidFail", errors); 
} 

/* DeviceListener */ 
@Override 
public void onStartListening(Device device) { 
Log.d(TAG,"onStartListening method called"); 
this.sendEvent("deviceDidStartListening", null); 
} 

@Override 
public void onStopListening(Device device) { 
Log.d(TAG,"onStopListening method called"); 
} 

@Override 
public void onStopListening(Device inDevice, int inErrorCode, String inErrorMessage) { 
Log.d(TAG,"onStopListening method with error code called"); 
} 

@Override 
public boolean receivePresenceEvents(Device device) { 
Log.d(TAG,"receivePresenceEvents method called"); 
return false; 
} 

@Override 
public void onPresenceChanged(Device inDevice, PresenceEvent inPresenceEvent) { 
Log.d(TAG,"onPresenceChanged method called"); 
} 
} 

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(); 
} 
} 

第2步:

然後添加packag在主應用程序級電子模塊:

@Override 
protected List<ReactPackage> getPackages() { 
    return Arrays.<ReactPackage>asList(
     new MainReactPackage(), 
     new TwilioPackage() <-- Here 
); 
} 

第3步:

清單文件添加Twilio服務:

<service 
     android:name="com.twilio.client.TwilioClientService" 
     android:exported="false" 
     android:stopWithTask="true" /> 

第4步:

添加twilio lib in 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 
} 

第5步:

現在你必須在添加此代碼的反應母語:

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> 
); 

}

/* Methods for connect Call */ 
callNumber(){ 
    Twilio.connect({To: this.state.phno}); 
} 


/* Method for disconnect call */ 
endCallAction() { 
    this.callDisconnectHandler(); 
    var navigator = this.props.navigator; 
    navigator.pop(); 
} 

/*Init Twilio client methods and make call */ 
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); 
} 


/* call back for device Did Start Listening*/ 
deviceDidStartListening(){ 
console.log('deviceDidStartListening'); 
} 


/* call back for device Did Stop Listening*/ 
deviceDidStopListening(){ 
console.log('deviceDidStopListening'); 
} 


/* call back for device Did Receive Incoming*/ 
deviceDidReceiveIncoming(){ 
console.log('deviceDidReceiveIncoming'); 
} 


/* call back for connection Did Start Connecting */ 
connectionDidStartConnecting(){ 
//this.setState({ statusMessage: 'Connecting...' }); 
} 

/* call back for connection Did Connect */ 
connectionDidConnect(){ 
//this.setState({ statusMessage: 'Connected' }); 
} 


/* call back for connection Did Disconnect */ 
connectionDidDisconnect(){ 
//this.setState({ statusMessage: 'DisConnected' }); 
} 


/* call back for connection Did Fail */ 
connectionDidFail(){ 
//this.setState({ statusMessage: 'Connection Failed' }); 
} 


/* Handler for disconnect call Twilio */ 
callDisconnectHandler(){ 
Twilio.disconnect(); 
} 

/* Handler for accept incoming call Twilio */ 
callAcceptHandler(){ 
Twilio.accept(); 
} 

/* Handler for reject incoming call Twilio*/ 
callRejectHandler(){ 
Twilio.reject(); 
} 

/* Handler for ignore incoming call Twilio */ 
callIgnoreHandler(){ 
    Twilio.ignore(); 
} 
} 

module.exports = Dialer; 

對於ios你必須遵循插件從回購truction: https://github.com/rogchap/react-native-twilio

如果找到IOS的任何問題都看看這個鏈接: Twilio call is not working in iOS and Android in react-native

快樂編碼...

相關問題