騰訊互動白板+即時通訊+實時音視訊,Android學生端接入
一、簡介
線上教學方案:騰訊雲互動白板(Tencent Interactive Whiteboard,TIW)+即時通訊(Instant Messaging,IM)+實時音視訊(Tencent RTC)實現老師線上互動教學
官方地址:
https://cloud.tencent.com/product/tiw
https://cloud.tencent.com/product/im
https://cloud.tencent.com/product/trtc
二、接入
1、前置步驟
需要在控制檯申請appid,key等,參考:https://cloud.tencent.com/document/product/1137/39899
2、配置工程
app.build: 引用依賴庫 rtc,im,eb,並指定app的cpu架構
android{
...
defaultconfig{
...
ndk {
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
}
...
}
...
}
...
dependencies{
...
api 'com.tencent.liteav:LiteAVSDK_TRTC:8.7.10102'
api 'com.tencent.imsdk:imsdk:4.8.50'
api 'com.tencent.edu:TEduBoardSdk:2.6.0.98'
...
}
project.build: app.build中的依賴檔案下載出問題時,可以參考如下配置
buildscript {
repositories {
...
maven {url 'https://dl.bintray.com/tencentqcloudterminal/maven' }
...
}
}
...
allprojects {
repositories {
...
maven {url 'https://dl.bintray.com/tencentqcloudterminal/maven' }
...
}
}
Manifest: 新增以下許可權
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
3、接入IM
- 初始化IM:
V2TIMManager.getInstance().initSDK(Context context, int sdkAppID, V2TIMSDKConfig config,V2TIMSDKListener listener)
sdkAppID: 上述控制檯上申請的appid
config: 配置資訊可為傳null,目前只有配置日誌等級,預設info級別
listener: 初始化回撥介面,提供了網路狀態和使用者資訊變化回撥,所有V2TIMSDKListener
回撥都可以參考下:
回撥方法 | 描述 | 推薦操作 |
---|---|---|
onConnecting() |
SDK 正在連線到騰訊雲伺服器 | 適合在 UI 上展示“正在連線”狀態。 |
onConnectSuccess() |
SDK 已經成功連線到騰訊雲伺服器 | 連線成功 |
onConnectFailed() |
SDK 連線騰訊雲伺服器失敗 | 可以提示使用者當前網路連線不可用。 |
onKickedOffline() |
當前使用者被踢下線 | 此時可以 UI 提示使用者“您已經在其他端登入了當前賬號,是否重新登入?” |
onUserSigExpired() |
線上時票據過期 | 請使用新簽發的 UserSig 進行登入。 |
onSelfInfoUpdated() |
登入使用者的資料發生了更新 | 可以在 UI 上更新自己的頭像和暱稱。 |
- 登入IM:
V2TIMManager.getInstance().login(String userId, String userSig, V2TIMCallback callback);
userId: 使用者id,可自定義,不超過32位
userSig: IM SDK 登入票據(token),由業務伺服器生成
callback: 操作結果回撥,所有V2TIMCallback
回撥都可以參考下表說明:
回撥方法 | 描述 |
---|---|
void onError(int code, String desc); |
出錯時回撥,code碼詳情 |
void onSuccess(); |
成功時回撥 |
注意:呼叫 IM SDK Login 成功登入後,將會開始計算 DAU,請根據業務場景合理使用 IM SDK Login操作,避免出現 DAU 過高的情況。
登入時機 | 說明 |
---|---|
App 啟動後首次使用 IM SDK 的能力時 | 本專案為進入連麥模式才首次登入 |
IM SDK (V2TIMSDKListener) 丟擲 onUserSigExpired 回撥 | 登入票據 (token) 已過期,需要使用新的 UserSig進行登入 |
IM SDK(V2TIMSDKListener) 丟擲 onKickOffline 回撥 | 當前使用者被踢下線,同平臺多點登入時觸發,可考慮重新登入或者下線 |
- 退出登入:
V2TIMManager.getInstance().logout(null);
為了降低 DAU,專案在結束連麥後,要及時呼叫退出登入。
- 加入群組:
群分類: 好友工作群(Work)、陌生人社交群(Public)、臨時會議群(Meeting)、直播群(AVChatRoom);專案採用public群(需要審批),詳細區別參考:官方群型別介紹
申請入群:
V2TIMManager.getInstance().joinGroup(String groupID, String message, V2TIMCallback callback);
引數 | 說明 |
---|---|
groupID | 群id,由主播端建立、業務伺服器下發 |
message | 申請入群說明 |
callback | 傳送申請狀態回撥 |
入群結果監聽:void onApplicationProcessed(String groupID, V2TIMGroupMemberInfo opUser, booleanisAgreeJoin, String opReason)
其中isAgreeJoin
為true
表示同意加群,反之被拒絕。同意加群后,全員(包括請求者)收到onMemberEnter
回。
監聽申請結果:
V2TIMManager.getInstance().setGroupListener(V2TIMGroupListener listener);
V2TIMGroupListener
:該回撥介面能監聽所有群相關的狀態,重要方法參考下表:
方法 | 說明 |
---|---|
void onMemberEnter(String groupID, List<V2TIMGroupMemberInfo>memberList) |
有使用者加入群(全員能夠收到)memberList - 加入的成員 |
void onMemberLeave(String groupID, V2TIMGroupMemberInfomember) |
有使用者離開群(全員能夠收到)member - 離開的成員注意:群主只能解散群不能離開 |
void onMemberKicked(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo>memberList) |
某些人被踢出某群(全員能夠收到)opUser - 處理人memberList - 被踢成員 |
void onGroupDismissed(String groupID, V2TIMGroupMemberInfoopUser) |
群被解散了(全員能收到)opUser - 處理人 |
void onGroupRecycled(String groupID, V2TIMGroupMemberInfoopUser) |
群被回收(全員能收到)opUser - 處理人 |
void onApplicationProcessed(String groupID, V2TIMGroupMemberInfo opUser, boolean isAgreeJoin, StringopReason) |
加群請求已經被群主或管理員處理了(只有申請人能夠收到)opUser -處理人isAgreeJoin - 是否同意加群opReason - 處理原因 |
4、接入RTC
備註:rtc使用的房間為im中的房間
- 概念:
名稱 | 說明 |
---|---|
通話模式 | 無旁路,本專案不用 |
直播模式 | 有旁路 |
介面機 | 用於連麥互動,費用高 |
代理機 | 用於觀眾拉流觀看,費用低 |
- 初始化RTC:
- 獲取 TRTCCloud 例項:
TRTCCloud.sharedInstance(context);
- 設定騰訊雲視訊通話功能的事件回撥介面:
setListener(TRTCCloudListener listener)
- 設定本地視訊編碼引數:
詳情參考官方文件說明void setVideoEncoderParam(com.tencent.trtc.TRTCCloudDef.TRTCVideoEncParam trtcVideoEncParam)
- 進入房間:
進入房間的返回結果,會在void enterRoom(com.tencent.trtc.TRTCCloudDef.TRTCParams trtcParams, int scene)
TRTCCloudListener.onEnterRoom(result)
中回撥。更多詳情參考官方文件- trtcParams:appid,token,roomId,role等,如果進入房間並互動,role要設定為主播。更多詳情參考官方文件
- scene:應用場景主播端和連入端必須統一,本專案採用連麥直播(Live)
TRTCCloudDef.TRTC_APP_SCENE_LIVE
。更多詳情參考官方文件
- 退出房間:
void exitRoom()
- 開始連麥互動:
trtcCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT); trtcCloud.startLocalPreview(true, view);
- 如果當前沒有在互動中,需要先呼叫
trtcCloud.switchRole(TRTCCloudDef.TRTCRoleAnchor)
切換到主播角色 - startLocalAudio: 開啟音訊,引數為音訊質量。更多詳細說明請參考官網文件
- startLocalPreview: 開啟攝像頭預覽,第一個引數是否為前置攝像頭,第二個引數為承載預覽的
TXCloudVideoView
。更多詳細說明請參考官網文件 - 只要在房間中,會自動推流
- 如果當前沒有在互動中,需要先呼叫
- 結束連麥互動:
trtcCloud.stopLocalAudio(); trtcCloud.stopLocalPreview();
5、接入IW
互動白板在有IM前提下,接入比較簡單
- 初始化:
initParam: 白板配置為預設配置,如果有筆畫顏色等特殊需求,參考官方文件配置。// 建立並初始化白板控制器 //(1)鑑權配置 TEduBoardController.TEduBoardAuthParam authParam = new TEduBoardController.TEduBoardAuthParam(sdkAppId, userId, userSig); //(2)白板預設配置 TEduBoardController.TEduBoardInitParam initParam = new TEduBoardController.TEduBoardInitParam(); mBoard = new TEduBoardController(context); //(3)新增白板事件回撥 mBoard.addCallback(callback); //(4)進行初始化 mBoard.init(authParam, roomId, initParam);
- 顯示白板:
//(1)獲取白板 View View boardview = mBoard.getBoardRenderView(); //(2)新增到父檢視中 FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); FrameLayout container = findViewById(R.id.board_view_container); container.addView(boardview, layoutParams);
- 銷燬:
TIMManager.getInstance().unInit();