Anrufe tätigen
Übersicht
In diesem Handbuch werden die Funktionen Ihrer Vonage Client-Anwendung beschrieben, mit denen Sie In-App- oder Server-verwaltete Sprachanrufe starten können.
Bevor Sie beginnen, stellen Sie sicher, dass Sie das SDK zu Ihrer Anwendung hinzugefügt.
Einen In-App-Anruf starten
Der schnellste Weg, einen In-App-Anruf zu starten, ist ein In-App-Anruf zwischen zwei Nutzern.
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.
...
}];
Die möglichen Sprachfähigkeiten sind sehr begrenzt, da sie nicht die die Voice API. Diese Methode wird vor allem für das Onboarding empfohlen. Später wird empfohlen, einen vom Server verwalteten Aufruf zu verwenden.
Starten Sie einen Server Managed Call
Mit dieser Methode können Sie sowohl In-App-Anrufe als auch Telefongespräche führen und dabei die Vorteile der umfangreichen Funktionen der Voice API.
Wenn Ihre Client-Anwendung diese Methode aufruft, wird die answer_url Webhook die für Ihr System konfiguriert ist Vonage Anwendung ausgeführt wird. Das definiert die Logik und Fähigkeiten des Anrufs.
Starten Sie auf der Client-Seite den Aufruf als solchen:
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.
...
}];
Benutzerdefinierte Daten
Die Server-Aufrufmethode hat einen Parameter für benutzerdefinierte Daten. Damit können Sie zusätzlichen Kontext in einem Schlüssel-Wert-Format an Ihre answer_url Webhook-Server.
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.
...
}];
Die Daten werden über die Abfrage der Anfrage an Ihre Website verfügbar sein. answer_url Webhook-Server:
{
"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"
}
}
Auf Anrufereignisse achten
Um den aktuellen Status eines Anrufs zu erfahren, z. B. ob der andere Teilnehmer den Anruf angenommen oder aufgelegt hat, sollten Sie die Anrufereignisse abhören.
Aktuelle Informationen über den Stand des Aufrufs und seine Mitglieder:
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)
Entfernen Sie den Hörer bei Bedarf:
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);
Entfernen Sie den Hörer bei Bedarf:
nexmoCall.removeCallEventListener(callEventListener);
Hinzufügen der aktuellen ViewControlleroder ähnliches, als Delegierter für die call Objekt, das bei einem Anruf zurückgegeben wird:
call.setDelegate(self)
call.answer { [weak self] error in
...
}
ViewController müssen nun den folgenden Anforderungen entsprechen 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
...
}
}
Hinzufügen der aktuellen ViewControlleroder ähnliches, als Delegierter für die call Objekt, das bei einem Anruf zurückgegeben wird:
[call setDelegate:self];
[call answer:^(NSError * _Nullable error) {
...
}];
ViewController müssen nun den folgenden Anforderungen entsprechen 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