Passer un appel
Vue d'ensemble
Ce guide couvre les fonctionnalités de votre application Vonage Client, afin de lancer des appels vocaux in-app ou gérés par le serveur.
Avant de commencer, assurez-vous que ajouter le SDK à votre application.
Lancer un appel dans l'application
Le moyen le plus rapide de lancer un appel in-app est de passer un appel in-app à in-app, c'est-à-dire entre deux utilisateurs.
new NexmoClient()
.createSession(USER_JWT)
.then(application => {
...
application.inAppCall(userName);
})
val callListener = object: NexmoRequestListener<NexmoCall> {
override fun onSuccess(nexmoCall: NexmoCall?) {
Log.d("TAG", "Call started: ${nexmoCall.toString()}")
}
override fun onError(apiError: NexmoApiError) {
Log.d("TAG", "Error: Unable to start a call ${apiError.message}")
}
}
client.inAppCall("123456", callListener);
NexmoRequestListener<NexmoCall> callListener = new NexmoRequestListener<NexmoCall>() {
@Override
public void onSuccess(@Nullable NexmoCall nexmoCall) {
Log.d("TAG", "Call started: " + nexmoCall.toString());
}
@Override
public void onError(@NonNull NexmoApiError apiError) {
Log.d("TAG", "Error: Unable to start a call " + apiError.getMessage());
}
};
client.inAppCall("123456", callListener)
NXMClient.shared.inAppCall(withCallee: userName) { [weak self] (error, call) in
guard let call = call else {
// Handle create call failure
...
return
}
// Handle call created successfully.
...
})
[[NXMClient shared] inAppCallWithCallee:userName completionHandler:^(NSError * _Nullable error, NXMCall * _Nullable call) {
if(error) {
// Handle create call failure
...
return;
}
// Handle call created successfully.
...
}];
Les possibilités vocales sont très limitées, car il n'y a pas d'utilisation de la technologie de l'Internet. l'API Voice. Cette méthode est surtout recommandée pour l'accueil des nouveaux arrivants. Par la suite, il est recommandé d'utiliser un appel géré par le serveur.
Lancer un appel géré par le serveur
Cette méthode vous permet d'effectuer des appels in-app ainsi que des appels téléphoniques tout en profitant de la richesse de l'application. Caractéristiques de Voice API.
Lorsque votre application cliente appelle cette méthode, le answer_url webhook qui est configuré pour votre Applications Vonage s'exécutera. Cela définit le logique et capacités de l'appel.
Du côté du client, commencez l'appel comme suit :
new NexmoClient()
.createSession(USER_JWT)
.then(application => {
...
application.callServer(phoneNumber);
})
val callListener = object: NexmoRequestListener<NexmoCall> {
override fun onSuccess(nexmoCall: NexmoCall?) {
Log.d("TAG", "Call started: ${nexmoCall.toString()}")
}
override fun onError(apiError: NexmoApiError) {
Log.d("TAG", "Error: Unable to start a call ${apiError.message}")
}
}
client.serverCall("123456", null, callListener);
NexmoRequestListener<NexmoCall> callListener = new NexmoRequestListener<NexmoCall>() {
@Override
public void onSuccess(@Nullable NexmoCall nexmoCall) {
Log.d("TAG", "Call started: " + nexmoCall.toString());
}
@Override
public void onError(@NonNull NexmoApiError apiError) {
Log.d("TAG", "Error: Unable to start a call " + apiError.getMessage());
}
};
client.serverCall("123456", null, callListener)
NXMClient.shared.serverCall(withCallee: userName, customData: nil) { [weak self] (error, call) in
guard let call = call else {
// Handle create call failure
...
return
}
// Handle call created successfully.
...
})
[[NXMClient shared] serverCallWithCallee:userName customData:nil
completionHandler:^(NSError * _Nullable error, NXMCall * _Nullable call) {
if(error) {
// Handle create call failure
...
return;
}
// Handle call created successfully.
...
}];
Données personnalisées
La méthode d'appel au serveur comporte un paramètre pour les données personnalisées. Cela vous permet de transmettre un contexte supplémentaire, dans un format clé-valeur, à votre méthode d'appel au serveur. answer_url serveur webhook.
new NexmoClient()
.createSession(USER_JWT)
.then(application => {
...
application.callServer(phoneNumber, "phone", {"device_name": "Alice app"});
})
val callListener = object: NexmoRequestListener<NexmoCall> {
override fun onSuccess(nexmoCall: NexmoCall?) {
Log.d("TAG", "Call started: ${nexmoCall.toString()}")
}
override fun onError(apiError: NexmoApiError) {
Log.d("TAG", "Error: Unable to start a call ${apiError.message}")
}
}
val customData:HashMap<String, Any> = HashMap<String, Any>()
customData.put("device_name", "Alice app")
client.serverCall("123456", customData, callListener);
NexmoRequestListener<NexmoCall> callListener = new NexmoRequestListener<NexmoCall>() {
@Override
public void onSuccess(@Nullable NexmoCall nexmoCall) {
Log.d("TAG", "Call started: " + nexmoCall.toString());
}
@Override
public void onError(@NonNull NexmoApiError apiError) {
Log.d("TAG", "Error: Unable to start a call " + apiError.getMessage());
}
};
HashMap<String, Object> customData = new HashMap<String, Object>();
customData.put("device_name", "Alice app");
client.serverCall("123456", customData, callListener)
NXMClient.shared.serverCall(withCallee: userName, customData: ["device_name": "Alice app"]) { [weak self] (error, call) in
guard let call = call else {
// Handle create call failure
...
return
}
// Handle call created successfully.
...
})
[[NXMClient shared] serverCallWithCallee:userName customData:@{@"device_name": @"Alice app"}
completionHandler:^(NSError * _Nullable error, NXMCall * _Nullable call) {
if(error) {
// Handle create call failure
...
return;
}
// Handle call created successfully.
...
}];
Les données seront disponibles sur la requête faite à votre answer_url serveur webhook :
{
"to": "447000000000",
"from_user": "Alice",
"conversation_uuid": "CON-8dd32088-66be-42ae-b0af-c9e12ca588ed",
"uuid": "54c255ca-9c1c-4ecd-b175-a1d022dc7b07",
"custom_data": {
"device_name": "Alice app"
}
}
Écouter les événements de l'appel
Pour connaître l'état d'un appel, par exemple pour savoir si l'autre membre a répondu ou raccroché, vous devez écouter les événements de l'appel.
To see updates on the state of the call and its members:
application.on("call:status:changed",(call) => {
...
});
val callEventListener = object : NexmoCallEventListener {
override fun onDTMF(digit: String?, nexmoMember: NexmoMember?) {
Log.d("TAG", "onDTMF(): digit: $digit, nexmoMember: $nexmoMember")
}
override fun onMemberStatusUpdated(memberStatus: NexmoCallMemberStatus?, nexmoMember: NexmoMember?) {
Log.d("TAG", "onMemberStatusUpdated(): status: $memberStatus, nexmoMember: $nexmoMember")
}
override fun onMuteChanged(muteState: NexmoMediaActionState?, nexmoMember: NexmoMember?) {
Log.d("TAG", ":NexmoMediaActionState(): muteState: $muteState, nexmoMember: $nexmoMember")
}
override fun onEarmuffChanged(earmuffState: NexmoMediaActionState?, nexmoMember: NexmoMember?) {
Log.d("TAG", "onEarmuffChanged(): earmuffState: $earmuffState, nexmoMember: $nexmoMember")
}
}
nexmoCall?.addCallEventListener(callEventListener)
Remove the listener when needed:
nexmoCall?.removeCallEventListener(callEventListener)
NexmoCallEventListener callEventListener = new NexmoCallEventListener() {
@Override
public void onMemberStatusUpdated(NexmoCallMemberStatus $memberStatus, NexmoMember nexmoMember) {
Log.d("TAG", "onMemberStatusUpdated(): status: " + $memberStatus + " nexmoMember: " + nexmoMember);
}
@Override
public void onMuteChanged(NexmoMediaActionState muteState, NexmoMember nexmoMember) {
Log.d("TAG", "NexmoMediaActionState(): muteState: " + muteState + ", nexmoMember: " + nexmoMember);
}
@Override
public void onEarmuffChanged(NexmoMediaActionState earmuffState, NexmoMember nexmoMember) {
Log.d("TAG", "onEarmuffChanged(): earmuffState: " + earmuffState + ", nexmoMember: " + nexmoMember);
}
@Override
public void onDTMF(String digit, NexmoMember nexmoMember) {
Log.d("TAG", "onDTMF(): digit:" + digit + ", nexmoMember: " + nexmoMember);
}
};
nexmoCall.addCallEventListener(callEventListener);
Remove the listener when needed:
nexmoCall.removeCallEventListener(callEventListener);
Add the current ViewController, or similar, as a delegate for the call object returned when making a call:
call.setDelegate(self)
call.answer { [weak self] error in
...
}
ViewController will now have to conform to NXMCallDelegate:
extension ViewController: NXMCallDelegate {
func call(_ call: NXMCall, didUpdate member: NXMMember, with status: NXMCallMemberStatus) {
// Handle call status updates
...
}
func call(_ call: NXMCall, didUpdate member: NXMMember, isMuted muted: Bool) {
// Handle member muting updates
...
}
func call(_ call: NXMCall, didReceive error: Error) {
print("call error: \(error.localizedDescription)")
// Handle call errors
...
}
}
Add the current ViewController, or similar, as a delegate for the call object returned when making a call:
[call setDelegate:self];
[call answer:^(NSError * _Nullable error) {
...
}];
ViewController will now have to conform to NXMCallDelegate:
@interface ViewController () <NXMCallDelegate>
...
@end
@implementation ViewController
...
//MARK:- NXMCallDelegate
- (void)call:(nonnull NXMCall *)call didUpdate:(nonnull NXMMember *)member withStatus:(NXMCallMemberStatus)status {
// Handle call status updates
...
}
- (void)call:(nonnull NXMCall *)call didUpdate:(nonnull NXMMember *)member isMuted:(BOOL)muted {
// Handle member muting updates
...
}
- (void)call:(nonnull NXMCall *)call didReceive:(nonnull NSError *)error {
NSLog(@"call error: %@", [error localizedDescription]);
// Handle call errors
...
}
@end