智慧服务,成就美好体验 项目咨询

主页 > 服务与支持 > 开发平台 > 客户端SDK参考 > Windows Native SDK > 音视频呼叫 结束通话(或呼叫)

入门使用

结束通话(或呼叫)

更新时间:2019-11-20

描述

用户在通话接通前可进行取消呼叫或拒绝呼叫等操作,通话过程中可以结束通话。

业务流程

图1 结束通话(呼叫)流程 

主叫或被叫在通话过程中挂断呼叫

说明: 

通话双方均可挂断呼叫,本章节以主叫发起挂断为例。

  1. 主叫UI调用tsdk_end_call()接口挂断通话。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_end_call(callid);
    if(TSDK_SUCCESS != ret)
    {
       LOG_D_CALL_ERROR("end call failed. result=%#x", ret);
       return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 主、被叫SDK完成呼叫挂断信令交互,向UI上报通话结束事件TSDK_E_CALL_EVT_CALL_ENDED,UI刷新界面显示通话结束。
    代码示例:
    //c code
    case TSDK_E_CALL_EVT_CALL_ENDED:
    {
         CHECK_POINTER(data);
         TSDK_S_CALL_INFO* callInfo = (TSDK_S_CALL_INFO*)data;
         TSDK_S_CALL_INFO* notifyInfo = new TSDK_S_CALL_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CALL_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CALL_INFO), callInfo, sizeof(TSDK_S_CALL_INFO));
    
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CALL_END, (WPARAM)notifyInfo, NULL);
         break;
    }
    
     

 

主叫在通话接通前取消呼叫

  1. 主叫UI调用tsdk_end_call()接口取消呼叫。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_end_call(callid);
    if(TSDK_SUCCESS != ret)
    {
       LOG_D_CALL_ERROR("end call failed. result=%#x", ret);
       return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 主、被叫SDK完成呼叫挂断信令交互,向UI上报通话结束事件TSDK_E_CALL_EVT_CALL_ENDED,UI刷新界面显示通话结束。
    代码示例:
    //c code
    case TSDK_E_CALL_EVT_CALL_ENDED:
    {
         CHECK_POINTER(data);
         TSDK_S_CALL_INFO* callInfo = (TSDK_S_CALL_INFO*)data;
         TSDK_S_CALL_INFO* notifyInfo = new TSDK_S_CALL_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CALL_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CALL_INFO), callInfo, sizeof(TSDK_S_CALL_INFO));
    
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CALL_END, (WPARAM)notifyInfo, NULL);
         break;
    }
    
     

 

被叫在收到来电时拒绝呼叫

  1. 被叫UI调用tsdk_end_call()接口拒绝通话。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_end_call(callid);
    if(TSDK_SUCCESS != ret)
    {
       LOG_D_CALL_ERROR("end call failed. result=%#x", ret);
       return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 主、被叫SDK完成呼叫挂断信令交互,向UI上报通话结束事件TSDK_E_CALL_EVT_CALL_ENDED,UI刷新界面显示通话结束。
    说明: 

    在实际现网部署过程中,业务服务器可能开启了呼叫等待功能,在被叫拒绝呼叫时,业务服务器会与主叫建立通话并播放提示音“对方忙”或“对方通话中”,主叫SDK在此过程中会上报TSDK_E_CALL_EVT_CALL_CONNECTED事件,需要用户通过主叫UI主动挂断呼叫。

    代码示例:
    //c code
    case TSDK_E_CALL_EVT_CALL_ENDED:
    {
         CHECK_POINTER(data);
         TSDK_S_CALL_INFO* callInfo = (TSDK_S_CALL_INFO*)data;
         TSDK_S_CALL_INFO* notifyInfo = new TSDK_S_CALL_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CALL_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CALL_INFO), callInfo, sizeof(TSDK_S_CALL_INFO));
    
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CALL_END, (WPARAM)notifyInfo, NULL);
         break;
    }
    
     

 

被叫在收到来电时未接听

  1. 主、被叫SDK向UI上报通话结束事件TSDK_E_CALL_EVT_CALL_ENDED,UI刷新界面显示通话结束。
    说明: 

    在实际现网部署过程中,业务服务器可能开启了呼叫等待功能,在被叫拒绝呼叫时,业务服务器会与主叫建立通话并播放提示音“对方未接听”,主叫SDK在此过程中会上报TSDK_E_CALL_EVT_CALL_RTP_CREATED或TSDK_E_CALL_EVT_CALL_CONNECTED事件,需要用户通过主叫UI主动挂断呼叫。

    代码示例:
    //c code
    case TSDK_E_CALL_EVT_CALL_ENDED:
    {
         CHECK_POINTER(data);
         TSDK_S_CALL_INFO* callInfo = (TSDK_S_CALL_INFO*)data;
         TSDK_S_CALL_INFO* notifyInfo = new TSDK_S_CALL_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CALL_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CALL_INFO), callInfo, sizeof(TSDK_S_CALL_INFO));
    
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CALL_END, (WPARAM)notifyInfo, NULL);
         break;
    }
    
     

注意事项

无。