接入声网视频通话SDK-初步接通视频通话教程

一、前言

视频通话接通不难,难的是各种情况处理,且有点功能声网SDK是不提供的,如果要完整的视频通话,这代码量有点大,这篇文章仅以接通为目标

二、看下效果图(设计图)

video_calling.png
video_call.png

二、跟着我开始步骤

1、配置部分

在app下的build.gradle中配置

implementation 'io.agora.rtc:full-sdk:3.6.2'
2、拨打前或者加入频道前先询问权限
private fun checkPermission(isClickAcceptCallBack:(() -> Unit)?= null){
    if (PermissionCheckUtil.checkPermissions(mContext,if (startCallBean.type == AUDIO_TYPE) PermissionAppUtils.Group.MICROPHONE else PermissionAppUtils.Group.CAMERA_RECORD)){
        if (startCallBean.type == AUDIO_TYPE) isClickAcceptCallBack?.invoke()?:initAudioEngine() else isClickAcceptCallBack?.invoke()?:initVideoEngine()
    } else {
        DialogUtils.okAndCancel(
            mContext,
            if (startCallBean.type == AUDIO_TYPE) getString(R.string.audio_call_permission_tip) else getString(R.string.video_call_permission_tip),
            ok = getString(R.string.go_open),
            okListener = {
                PermissionAppUtils.requestCombinedPermission(mContext,if (startCallBean.type == AUDIO_TYPE) PermissionAppUtils.Group.MICROPHONE else PermissionAppUtils.Group.CAMERA_RECORD) {
                    if (it.granted){
                        if (isClickAcceptCallBack != null){
                            if (startCallBean.type == AUDIO_TYPE) {
                                initAudioEngine()
                                isClickAcceptCallBack.invoke()
                            } else {
                                initVideoEngine()
                                isClickAcceptCallBack.invoke()
                            }
                        } else {
                            if (startCallBean.type == AUDIO_TYPE) initAudioEngine() else initVideoEngine()
                        }

                    } else  {
                        if (it.shouldShowRequestPermissionRationale){
                            //禁止,不做操作,拨打方直接关闭界面,接听方在点接听时再询问一次
                            if (isCallOutGoing || isClickAcceptCallBack != null){
                                show(R.string.call_permission_empty_tip)
                                finish()
                            }

                        } else {
                            //永久禁止,需求说只弹前面的弹框,永久禁止就直接跳设置
                            //点接听时跳到设置,返回不处理,让它再点一次接听按钮
                            if (isClickAcceptCallBack == null){
                                isJumpAppSetting = true
                                CUtils.startAppSettings(mContext)
                            }

                        }
                    }

                }

            })
    }
}

override fun onResume() {
    super.onResume()
    if (isJumpAppSetting){
        isJumpAppSetting = false
        when(startCallBean.type){
            AUDIO_TYPE -> {
                if (PermissionCheckUtil.checkPermissions(mContext,PermissionAppUtils.Group.MICROPHONE)){
                    initAudioEngine()
                }
            }
            VIDEO_TYPE -> {
                if (PermissionCheckUtil.checkPermissions(mContext,PermissionAppUtils.Group.CAMERA_RECORD)){
                    initVideoEngine()
                }
            }
            else ->{
                show(R.string.call_permission_empty_tip)
                finish()
            }
        }
    }

}
3、有了权限初始化声网引擎和加入频道(显示自己的视频画面)

initVideoEngine()代码如下:

private fun initVideoEngine(){
    initializeAgoraEngine()
    setupVideoProfile()
    initVideoModule()
    setupLocalVideo(startCallBean.closeCamera)
    rtcEngine?.setVideoSource(RtcVideoConsumer())
    if (isCallOutGoing && !startCallBean.isFloatBackCall){
        joinChannel(startCallBean.token,startCallBean.channelName,SPUtil.getUserId())
    }
}

我这个本地视频用了相芯美颜的,可参考它demo原来的代码。上面代码中token和channelName都是app服务器接口返回的

4、自己加入频道后通知对方
/**
     * @desc : 自己加入频道成功回调
     * @author : congge on 2022-03-24 15:07
     **/
    override fun onJoinChannelSuccess(channel: String, uid: Int, elapsed: Int) {
        runOnUiThread {
            LogUtils.i("mRtcEventHandler","onJoinChannelSuccess")
            if (!isCallOutGoing){
                dealViewShow(true)
                dealCallTime(true)
                mViewModel.postChatMediaAnswer(startCallBean.mediaId)
            } else {
                //拨打方加入频道后,邀请对方通话
                if(disposableIntervalCall == null || disposableIntervalCall!!.isDisposed){
                    disposableIntervalCall = Observable.interval(0,5, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
                        .take(55)
                        .subscribe {
                            //只有第一次邀请要通知栏
                            mViewModel.getChatMediaSendInvite(startCallBean.mediaId,it == 0L)

                        }
                }
                //自己加入频道后,给对方60s加入频道的时间
                longTimeNoResponse(timeOutNoResponse)
            }

        }
    }

注:onJoinChannelSuccess是加入频道成功后的回调,拨打方加入频道后,就通知对方。如果是接听方加入频道后就可以显示通话中界面了。声网是没有通知对方的api的,我项目是用融云IM通知对方的。

5、对方加入频道后(显示对方的视频画面)
/**
     * @desc : 对方加入频道成功回调
     * 此回调在以下任一情况下触发:
     * 1、远程用户/主机通过调用joinChannel方法加入通道。
     * 2、远程用户在加入通道后通过调用setClientRole方法将用户角色切换到主机。
     * 3、网络中断后,远程用户/主机重新加入通道。
     * 4、主机通过调用addInjectStreamUrl方法将在线媒体流注入频道。
     * @author : congge on 2022-03-24 15:08
     **/
    override fun onUserJoined(uid: Int, elapsed: Int) {
        runOnUiThread {
            LogUtils.i("mRtcEventHandler","onUserJoined")
            //stopRinging关闭声音要在dealViewShow前面,里面有关扬声器
            CallRingingUtil.getInstance().stopRinging()
            dealViewShow(false)
            dealCallTime(true)
            //10s内对方进入了频道
            cancelLongTimeNoResponse()
            if (startCallBean.type == VIDEO_TYPE){
                videoUid = uid
                setupRemoteVideo(uid)
            }
        }
    }

private fun setupRemoteVideo(uid: Int,fl: FrameLayout? = mBinding.flVideoCallRemoteVideo,surfaceViewRemote1:SurfaceView? = null) {
    if (isMBindingViewInitialised()){
        fl?.let {
            if (it.childCount >= 1) {
                return
            }
            it.removeAllViews()
            if (surfaceViewRemote1 == null){
                surfaceViewRemote = RtcEngine.CreateRendererView(mContext)
                it.addView(surfaceViewRemote)
                // Initializes the video view of a remote user.
                rtcEngine?.setupRemoteVideo(VideoCanvas(surfaceViewRemote, VideoCanvas.RENDER_MODE_HIDDEN, uid))
                surfaceViewRemote!!.tag = uid // for mark purpose
            } else {
                surfaceViewRemote = surfaceViewRemote1
                it.addView(surfaceViewRemote)
                surfaceViewRemote!!.tag = uid
            }
        }
    }
}

1、拨打方监听到接听方进入频道的回调
2、接听方进入频道后也会收到这回调

6、至此双方应该能互相看见对方了,最后就是挂断了

挂断就是退出频道

rtcEngine?.leaveChannel()

然后对方就会收到以下回调

override fun onUserOffline(uid: Int, reason: Int) 

如果需要完整的声网音视频通话的代码,可私信我

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容