-
Notifications
You must be signed in to change notification settings - Fork 30
Migration to improved meetings associated with a space
In Webex, meetings can be broadly classified into Webex Meetings and Space Meetings. Set of features available in each of these meeting types are different. As a result meeting experience differs.
Goal of improved meetings in a space is to provide a single meeting experience which is a superset of Webex Meeting and Space Meetings. Meeting experience would be same regardless of how the meeting is joined or where it is scheduled from.
Note: This new behavior change would be applicable from upcoming February 2024, 3.11.0 release onwards.
-
Dynamic meeting ID and URL. URL includes /MTID. This makes concurrent meetings by different hosts in the same space possible.
-
Ad-hoc meeting/Instant meeting has new meeting URL everytime. Earlier in instant meeting same static URL were used all the time.
-
Earlier meeting experience and feature set was tied to meeting sponsor's entitlement. Meeting sponsor is one who created the space. With improved space meetings, concept of meeting sponsorship is removed. Meeting creator's license determines meeting capabilities.
-
For scheduled meetings, if the user is not part of the space then there is a requirement to enter the password. On entering incorrect password few times, captcha information is provided along with appropriate error code via API. Subsequently correct password and captcha information is required for user to be able to successfully join the meeting.
-
Space meetings now has advanced meeting capabilities such as real time transcriptions and closed captions.
Earlier a group space-id could be passed as an input string to create an instant meeting in the space. This is no longer supported. Error CANNOT_START_INSTANT_MEETING(-7015)
will be thrown for such cases.
SDK clients can only join or start an already created meeting. webex.phone.dial
API only accepts a meeting number
, sip uri of the meeting
or a meeting url
.
eg:
webex.phone.dial("12345678901", option, CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
// Handle error
}
})
webex.phone.dial("12345678901@webex.com", option, CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
// Handle error
}
})
webex.phone.dial("https://cisco.webex.com/cisco/j.php?MTID=m12345fe91b1d96592e749dc331b492eddd", option, CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
// Handle error
}
})
Depending on how the meeting is created, participant might have to wait in a lobby before host admits them to the meeting. This is notifed in the Call
observer.
webex.phone().dial("https://cisco.webex.com/cisco/j.php?MTID=m12345fe91b1d96592e749dc331b492eddd", MediaOption.audioVideoSharing(Pair(localView,remoteView), screenShareView), CompletionHandler { result ->
if (result.isSuccessful) {
result.data?.let { _call ->
// Joining a meeting is successful
_call.setObserver(object : CallObserver {
override fun onConnected(call: Call?) {
}
override fun onRinging(call: Call?) {
}
override fun onWaiting(call: Call?, reason: Call.WaitReason?) {
// Indicates self participant is Waiting in lobby and has to be letIn by host
}
override fun onDisconnected(event: CallObserver.CallDisconnectedEvent?) {
}
override fun onInfoChanged(call: Call?) {
}
override fun onCallMembershipChanged(event: CallObserver.CallMembershipChangedEvent?) {
}
override fun onScheduleChanged(call: Call?) {
}
})
}
} else {
result.error?.let { errorCode ->
}
}
});
If SDK client is joining a meeting as a host and if another participant is waiting in the lobby, For such cases, SDK client can admit the participant using below API. CallMembership object needs to be passed of the participant who is waiting in the lobby.
call.letIn(callMembership)
If the user is not part of the space where the meeting is created then the user will be prompted for password. On entering incorrect password few times, captcha information is provided along with appropriate error code in the completion result of webex.phone.dial
API. Subsequently correct password and captcha information is required for user to be able to successfully join the meeting.
webex.phone.dial(input, option, CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
result.error?.let { error ->
when(error.errorCode){
WebexError.ErrorCode.HOST_PIN_OR_MEETING_PASSWORD_REQUIRED.code -> {
// Prompt user for password. Use MediaOption param in dial API for providing password
}
WebexError.ErrorCode.INVALID_PASSWORD.code -> {
// Prompt user for password. Use MediaOption param in dial API for providing password
}
WebexError.ErrorCode.CAPTCHA_REQUIRED.code -> {
// Prompt user to enter password, captcha. Use MediaOption param in dial API for providing password, captcha value entered by user and captcha id. Captcha ID, Image URL, Audio URL are part of the error data which is Phone.Captcha sent with this error.
}
WebexError.ErrorCode.INVALID_PASSWORD_WITH_CAPTCHA.code -> {
// Prompt user to enter password, captcha. Use MediaOption param in dial API for providing password, captcha value entered by user and captcha id. Captcha ID, Image URL, Audio URL are part of the error data which is Phone.Captcha sent with this error.
}
else -> {
}
}
} ?: run {
}
}
})
Note : Password and Captcha flow is applicable only when dialing a meeting number and sip uri. Joining using meeting link does not prompt for password.
A new API is added for refreshing the meeting captcha code if present.
webex.phone.refreshMeetingCaptcha(CompletionHandler { result ->
result?.let {
//result.data is of type Phone.Captcha
}
})
If the user has the host key and wishes to join the meeting as host, below API can be used.
val option: MediaOption = MediaOption.audioOnly()
mediaOption.setModerator(true)
mediaOption.setPin(123456)
webex.phone.dial("12345678901@webex.com", option, CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
// Handle error
}
})
When joining a meeting using a meeting link, password is not required. Such a participant is an attendee and not a host. If the attendee has the host key and wishes to reclaim the host role, below API can be used.
If the participant is the creator of the meeting then host pin can be empty in the reclaimHost API.
call.reclaimHost("123456", CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
// Handle error
}
})
A participant can be made host using below API. Only a host or co-host can make another participant host. Participant Id can be obtained from CallMembership
object.
call.makeHost("participantId", CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
// Handle error
}
})
A participant can be invited to the meeting using below API. Only a host can invite another participant. Participant can be invited using an email address.
call.inviteParticipant("user@email.com", CompletionHandler { result ->
if (result.isSuccessful) {
// Success. Do necessary handling
} else {
// Handle error
}
})
Once you have migrated to this new meetings experience, features like real time transcription, closed captions, etc can be used. Please refer to the Real Time Transcription and Closed Captions documents for more details.