Android

DEMO运行指引

1.环境准备:

2.运行项目:


第一次编译 DEMO 项目时,需要下载特定的 gradle套件 及 DEMO 所需要的依赖库,所以请确保开发电脑已经连接到 internet 且能正常访问 https://services.gradle.org

3.部分说明:

SDK获取及集成

1.SDK概述:

2.下载SDK:

3.拷贝SDK:

4.引入SDK:

5.添加权限申明:

6.开始使用:

功能实现文档

多人语音实现流程简述:

  1. SDK初始化
  2. 初始化频道类型(语音、音乐)
  3. 设置用户登陆参数及登陆
  4. 打开&关闭播放,打开&关闭麦克风
  5. 监听Response回调
  6. 监听Notify回调
  7. 退出频道
  8. 销毁对象
  9. 刷新用户列表代码示例

1.SDK初始化:

  1. InitSDK:初始化SDK环境,设置SDK工作目录,谷人云SDK将会把临时日志,配置文件存放在配置的工作目录中。
  2. 具体代码参考DEMO ApplicationEx类中GetAudioClient函数,部分关键代码如下:
    protected IRtcChannel  m_pClient  = null;
    protected Watcher m_watcher = null;
    boolean m_bInit = false;
    public IRtcChannel GetAudioClient()
    {
    if(!m_bInit)
    {
    m_bInit = true;
    String mDataPath = "";
    try
    {
    File file = Environment.getExternalStorageDirectory();
    mDataPath = file.getAbsolutePath() + "/real_audio_client";
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    ValleyRtcAPI.InitSDK(this, mDataPath);//mDataPath为谷人云相关目录,可以自定义
    m_pClient = new IRtcChannel();
    m_watcher = new Watcher();
    m_watcher.start();
    }
    return m_pClient;
    }

谷人云AndroidSDK对开发者共提供六类接口,分别由六个对应的对象来控制:
ValleyRtcAPI类中包含SDK初始化,退出等接口;
IRtcChannel类中包含登录频道,登出频道的操作,并包含有初始化用户想用的接口功能函数EnableInterface;
IRtcUsers类中包含和用户相关的接口函数,包含取用户列表,踢人,设置用户标识等函数;
IRtcAudio类中包含实时语音相关所有接口,包含打开麦克风,打开扬声器等函数;
IRtcAudioSystem类中包含操作系统声音控制的系列接口;
IRtcMusicControler类中包含音乐模式下主播,观众,耳返等系列接口;

2.初始化频道类型(语音、音乐):

  1. 通过SetAuthoKey函数指定appkey
  2. 进行频道初始化,谷人云实时语音SDK提供两种频道类型供用户使用,在初始化频道的时候需要进行设置,谷人云采用全接口化的方式,使用特定的频道类型只需要激活相应的接口列表即可,具体可以参考demo LoginActivity代码实现如下:

    ApplicationEx theApp = (ApplicationEx)this.getApplication();
    IRtcChannel demo_api = theApp.GetAudioClient();
    ValleyRtcAPI.SetAuthoKey("");//SetAuthoKey为注册函数,填入从谷人申请的id,留空为测试
    //音乐频道类型按照如下方式激活接口
    demo_api.EnableInterface(IRtcUsers.IID|IRtcAudio.IID|IRtcAudioSystem.IID|IRtcMusicControler.IID);
    //语音频道类型按照如下方式激活接口
    demo_api.EnableInterface(IRtcUsers.IID|IRtcAudio.IID|IRtcAudioSystem.IID);
  3. 音乐模式以及语音模式在接口获得上仅多获得了IRtcMusicControler类接口。

  4. ValleyRtcAPI.SetAuthoKey可以在SDK初始化时调用,也可以在进行登录频道时调用,强烈建议KEY值应该由服务端传给客户端,不应该写死于客户端中。

3.设置用户登陆参数及登陆:

public static String m_strLoginUserID = "test";//用户名
public static String m_strRoomID = "25";//频道号

ApplicationEx theApp = (ApplicationEx)this.getApplication();
IRtcChannel demo_api = theApp.GetAudioClient();
IRtcAudio demo_real_audio_api = null;
//IRtcAudio 包含实时语音相关,开启通话,禁言,设置音量等接口
demo_real_audio_api = (IRtcAudio)demo_api.GetInterface(IRtcAudio.IID);
demo_real_audio_api.EnablePlayout(true);//打开声音播放
demo_real_audio_api.EnableSpeak(false);//关闭麦克风采集
demo_api.Login(m_strRoomID, m_strLoginUserID, "");//登陆频道

IRtcChannel的GetInterface应该在EnableInterface调用过后进行调用,表示将初始化哪些接口功能。

4.打开&关闭播放,打开&关闭麦克风:

demo_real_audio_api.EnablePlayout(true);
//打开声音接收,播放频道内的语音。
demo_real_audio_api.EnablePlayout(false);
//关闭声音接收,不播放频道内的语音。
demo_real_audio_api.EnableSpeak(true);
//打开麦克风,用户可以发言。
demo_real_audio_api.EnableSpeak(false);
//关闭麦克风,用户不可以发言。

5.监听Respond回调:

protected IRtcChannel demo_api  = null;
ApplicationEx theApp = (ApplicationEx)this.getApplication();
demo_api = theApp.GetAudioClient();
demo_api.RegisterRtcSink(this);//设置监听回调

public void Respond(int type, int ec, Object ob)
{
switch (type)
{
case ValleyRtcAPI.RespondLogin:
{
if(ERR_OK == ec) //login successfull and jump to mainview
{
LoginActivity.m_login.ShowLoginOk();
clearUserList();
showStatus("登录成功!");
showUserListInfo(); //if user login successfully , get the userlist
}
}
break;
case RtcUsers.RespondKickOff:
{
}
break;
case IRtcAudio.RespondDisableUserSpeaking:
{
}
break;
case IRtcAudio.RespondBlockUser:
{
}
break;
}
}

6.监听Notify回调:

protected IRtcChannel demo_api  = null;
ApplicationEx theApp = (ApplicationEx)this.getApplication();
demo_api = theApp.GetAudioClient();
demo_api.RegisterRtcSink(this);//设置监听回调

public void Notify(int type, Object ob)
{
switch (type)
{
case ValleyRtcAPI.NotifyConnectionLost: // ob: null
{
clearUserList();
showStatus("网络断开...");
}
break;
case ValleyRtcAPI.NotifyReConnected: // ob: null
{
showUserListInfo(); //if user login successfully , get the userlist
showStatus("恢复连接");
}
break;
case ValleyRtcAPI.NotifyDuplicateLogined: // ob: null
{
LoginActivity.m_login.ShowLoginFailedInfo("重复登录");
Close();
}
break;
case IRtcUsers.NotifyUserEnterChannel: // ob: object_user
{
object_user oUser = (object_user)ob;
adduser(oUser.getUserID());
}
break;
case IRtcUsers.NotifyUserLeaveChannel: // ob: object_userid
{
}
break;
case IRtcAudio.NotifyUserSpeaking: // ob: object_user_speaking
{
object_user_speaking user = (object_user_speaking)ob;
updateUserSpeakingStatus(user.getUserID(),true);
}
break;
case IRtcUsers.NotifyChannelClose: //ob: object_error
{
showStatus(String.valueOf(ob));
clearUserList();
}
break;
case IRtcUsers.NotifyKickOff: //ob: object_userid
{
}
break;
case IRtcAudio.NotifyDisableUserSpeaking: //ob: object_user_disable_speaking
{
}
break;
}
}

7.退出频道:

8.销毁对象:

ApplicationEx theApp = (ApplicationEx)this.getApplication();
IRtcChannel demo_api = theApp.GetAudioClient();
demo_api.Logout();
theApp.exit();

//ApplicationEx中exit代码
public void exit()
{
m_watcher.Stop();
m_debugger = null;
m_pClient = null;
ValleyRtcAPI.CleanSDK();
System.exit(0);
}

9.刷新用户列表代码示例

接口目录

概述:
谷人云Android 实时语音SDK根据接口类别和作用主要分为七类,分别是:

ValleyRtcAPI类详述:

1.接口函数-InitSDK(Application app, String wkfolder):

2.接口函数-CleanSDK():

3.接口函数-SetAuthoKey(String authokey):

4.接口函数-GetErrDesc(int ec):

5.接口函数-GetSDKVersion():

6.接口函数-CreateChannel()

IRtcChannel类详述:

1.接口函数-RegisterRtcSink(IRtcSink sink):

2.接口函数-EnableInterface(int iid)&&GetInterface(int iid)&&DisableInterface(int iid):

3.Login:(函数int类型返回值没有填写)

4.接口函数-Logout():

5.接口函数-GetLoginStatus():

6.接口函数-SetChannelAttr(String name, String value):

7.接口函数-GetChannelAttr(String name, String value)

8.Respond回调-常量RespondLogin

9.Respond回调-常量RespondChannelAttr

10.Notify回调-常量NotifyConnectionLost

11.Notify回调-常量NotifyReConnected

12.Notify回调-常量NotifyDuplicateLogined

13.Notify回调-常量NotifyChannelClose

14.Notify回调-常量NotifyChannelAttr

IRtcUsers类详述:

1.接口函数-GetUserCount():

2.接口函数-GetUserList(object_user_sheet userlist):

3.接口函数-GetUser(String uid, object_user user):

4.接口函数-KickOff(String uid):

5.接口函数-SetUserAttr(String uid, String name, String value)

6.接口函数-GettUserAttr(String uid, String name, String value)

7.Respond回调-常量RespondKickOff

8.Respond回调-常量RespondUserAttr

9.Notify回调-常量NotifyUserEnterChannel

10.Notify回调-常量NotifyUserLeaveChannel

11.Notify回调-常量NotifyKickOff

Notify回调-常量NotifyUserAttr

IRtcAudio类详述:

1.接口函数-BlockUser(String uid, boolean block):

2.接口函数-DisableUserSpeak(String uid, boolean disspeak):

3.接口函数-EnableSpeak(boolean enable):

4.接口函数GetSpeakEnabled():

5.接口函数EnablePlayout(boolean enable):

6.接口函数GetPlayoutEnabled():

7.Respond回调-常量RespondDisableUserSpeak

8.Respond回调-常量RespondBlockUser

9.Notify回调-常量NotifyDisableUserSpeak

10.Notify回调-常量NotifyUserSpeaking

IRtcAudioSystem类详述:

1.接口函数SetPlayoutVolume(int volume):

2.接口函数SetSpeakerphoneOn(boolean on)

3.接口函数GetPlayoutVolume()

4.接口函数GetSpeakphoneOn()

IRtcDeviceControler类详述:

1.接口函数-SetBackgroudMusic(int trackIndex, String filepath, boolean loopflag, float volume, boolean bSendToNet, boolean bPlayout):

2.接口函数-SetBackgroudMusicVolume(int trackIndex, float volume):

3.接口函数-IsSpeakWithMusic():

4.功能模式控制:

1.语音通话房间:

musiccontroler.Enable(IRtcDeviceControler.typeMusicMode,false);

2.音乐房间并且当前用户为主播,需要进行高音质的歌唱:

musiccontroler.Enable(IRtcDeviceControler.typeMusicMode,true);
musiccontroler.Enable(IRtcDeviceControler.typeBackgroundMusic,true);
musiccontroler.Enable(IRtcDeviceControler.typeCtrlByHeadset,false);
musiccontroler.Enable(IRtcDeviceControler.typeAec,false);
musiccontroler.Enable(IRtcDeviceControler.typeNs,false);
musiccontroler.Enable(IRtcDeviceControler.typeVad,false);
musiccontroler.Enable(IRtcDeviceControler.typeAgc,true);

3.音乐房间并且当前用户为观众,需要进行普通连麦与主播互动:

musiccontroler.Enable(IRtcDeviceControler.typeMusicMode,true);
musiccontroler.Enable(IRtcDeviceControler.typeBackgroundMusic,true);
musiccontroler.Enable(IRtcDeviceControler.typeCtrlByHeadset,false);
musiccontroler.Enable(IRtcDeviceControler.typeAec,true);
musiccontroler.Enable(IRtcDeviceControler.typeNs,true);
musiccontroler.Enable(IRtcDeviceControler.typeVad,true);
musiccontroler.Enable(IRtcDeviceControler.typeAgc,true);

5.接口函数StartRtmp(String url, int sreamtypes, boolean bUseServer)

6.接口函数StopRtmp()

7.接口函数StartRecordEx(int sreamtypes)

8.接口函数StopRecordEx()

8.接口函数PauseRecordEx()

9.Notify回调-常量NotifyPlayAudioEnd

IRtcMsger类详述:

1.接口函数SendMsgr(int type, String data, String token, String toUserID):

2.接口函数GetMsgrList(int msgid, int nCount):

3.Respond回调-常量RespondSendMessage

3.Respond回调-常量RespondGetMessageList

3.Notify回调-常量NotifyRecvedMessage

ec错误码:

ec 类型为int,含义如下:
ERR_SUCCEED 0 // 操作成功
ERR_NOT_LOGINED -1 // 未登录成功
ERR_ALREADY_RUN -2 // 已经在运行了
ERR_USER_NOTFOUND -3 // 为找到用户
ERR_EXCUTING -4 // 已经执行中了
ERR_NOT_INITIALIZE -5 // 未初始化
ERR_UNSUPPORT -6 // 功能不支持
ERR_ARGUMENT -7 // 参数错误

ERR_CHANNEL_EXPIRED 1 // 频道已经失效
ERR_CONNECT_SERVER_FAILED 2 // 连接服务器失败
ERR_REQUEST_TIMEOUT 3 // 请求超时
ERR_CONFIG 4 // 配置信息错误
ERR_NET_POOL 5 // 网络不好
ERR_VERSION_UNSUPPORTED 6 // 版本不支持
ERR_AUTHO_FAILED 7 // 授权失败
ERR_NOT_ENOUGH_CHANNEL 8 // 频道资源不足
ERR_SERVER_ERROR 9 // 服务器错误
ERR_OPEN_RECORD_DEVICE 10 // 打开麦克风采集失败
ERR_OPEN_PLAYOUT_DEVICE 11 // 打开播放失败
ERR_RECORD_PERMISSION 12 // 没有录音权限