Windows(PC) SDK 开发手册(C# 封装层)

概述

Windows(PC) SDK对外暴露的是C接口,为了让桌面开发者更加方便快捷的接入SDK,我们基于C接口封装了C# SDK,既可以让开发者方便直观的调用接口使用云信的服务,也可以供基于C接口开发的的开发者作为参考。

开发准备

需要.NET Framework 3.5及以上版本。可以通过官网下载SDK以及Demo源码。SDK包含对c++ API接口的封装,Demo提供了简单的接口使用实例。 C# 应用程序在运行时依赖于c++ SDK提供的dll (nim.dll,nim_tools_http.dll是必须的,如果要使用语言功能需要有nim_audio.dll,需要使用聊天室需要有nim_chatroom.dll),这些文件可以在SDK文件夹或者Demo文件夹Dependents\dllimport下找到。 SDK 3.3 版本支持64位,复制dll时确保dll平台与生成文件的平台一致。

SDK内容

C#程序集

依赖的 c sdk

SDK C#封装层类讲解

SDK C#封装层代码在Src\Core子目录下,主要封装了以下核心类(XXXAPI.cs主要封装该模块的API,XXXDef.cs主要封装该模块的数据结构定义,有些模块拆分了几个独立的文件来定义):

此外,还包含一些工具类,如JsonParser.cs提供了JSON系列化相关的辅助方法。

Audio C#封装层类讲解

代码位于Src\Audio子目录下,详见NIMAudioAPI.cs和NIMAudioDef.cs。

HTTP C#封装层类讲解

代码位于Src\Http子目录下,详见NIMHttpAPI.cs和NIMHttpDef.cs。

接入SDK C#封装层

添加SDK C#封装层

在Src目录下包含NIM.sln文件,该工程是基于Visual Studio 2010开发,开发者直接打开该工程文件就可以加载所有的项目。 开发者自行编译NIM C# SDK,并将生产的C# DLL文件添加到自己项目的“引用”里,即可方便地调用NIM C# SDK的接口。特别强调一下:开发者自行编译NIM C# SDK生成的dll文件及其依赖的所有dll文件必须放在用户程序(以NIM Demo程序为例)生成的可执行程序目录下, 确保可以成功加载依赖的dll。NIM Demo工程里引用的NIM模块(即NIM C# SDK dll)需要确保路径正确,如果提示出错,需要用户自己重新添加该模块的引用!

添加所需的第三方库

SDK C#项目文件依赖第三方库Newtonsoft.Json,这是一款.NET中开源的Json序列化和反序列化类库(下载地址)。我们随包提供了Newtonsoft.Json.dll(开发者也可以自行下载相应的DLL或使用源代码进行编译)。

当然,开发者也可以使用自己熟悉的json有关的第三方库,如果使用其他第三方库,需要手工调整C# SDK源码中引用到Newtonsoft.Json相关的代码。

初始化SDK

在使用sdk提供的功能之前 必须 调用 NIM.ClientAPI.Init 函数进行初始化,函数声明如下:

public static bool Init(string appDataDir, string appInstallDir = "", NimUtility.NimConfig config = null)

清理SDK

在程序退出前,调用函数NIM.ClientAPI.Cleanup()接口进行NIM SDK 的清理工作。在用户已经登录的情况下,Cleanup 需要在登出完成后才可以调用, 避免造成内存访问冲突。如下代码是典型的使用方法 (Logout 异步执行,需要在回调函数中执行Cleanup)

public void LogoutAndCleanup()
{
    NIM.ClientAPI.Logout(NIM.NIMLogoutType.kNIMLogoutAppExit, OnAppExitLogoutCompleted(result)=>
    {
        ClientAPI.Cleanup();
    });
}

登录与登出

首次登录

SDK 登录后会同步群信息,离线消息,漫游消息,系统通知等数据,所以首次登录前需要提前注册一些全局回调(具体说明请参阅API 文档)。

登录

调用函数 public static void Login(string appKey, string account, string token, LoginResultDelegate handler = null) 执行登录, 需要设置 LoginResultDelegate 委托来获取登录过程的不同状态。登录过程中的不同步骤和返回的错误码参考 枚举 NIMLoginStepResponseCode。 当登录步骤为 NIMLoginStep.kNIMLoginStepLogin 并且 错误码为 ResponseCode.kNIMResSuccess 时标明登录成功。

登录成功后需要注册一些回调函数或者事件接收来自sdk的通知,使应用程序能够做出合理的响应。

数据同步

NIM SDK 在登录后会同步群信息,离线消息,漫游消息,系统通知等数据。

class NIM.DataSync.DataSyncAPI

public delegate void DataSyncDelegate(NIMDataSyncType syncType, NIMDataSyncStatus status, string jsonAttachment);
public static void RegCompleteCb(DataSyncDelegate cb)

NIMDataSyncType 定义了同步数据的类型,数据同步完成时sdk会调用注册的委托通知应用程序。

被踢

云信内置踢人策略为:移动端(Android,iOS)互踢,桌面端(PC,Web)互踢,移动端和桌面端共存。 如果当前的互踢策略无法满足业务需求的话,可以联系我们取消内置互踢,根据多端登录的回调和当前的设备列表,判断本设备是否需要被踢出。如果需要踢出,直接调用登出接口并在界面上给出相关提示即可。

public delegate void KickoutResultHandler(NIMKickoutResult result);
NIM.ClientAPI.RegKickoutCb(KickoutResultHandler) 

调用 RegKickoutCb 注册委托后,在当前账号被其他客户端踢下线时会执行委托函数,参数中包含了对方的客户端类型和被踢掉的原因。

多端登录

public static void RegMultiSpotLoginNotifyCb(MultiSpotLoginNotifyResultHandler handler)

调用该函数注册委托后,当用户在某个客户端登录时,其他没有被踢掉的端会触发回调。在登录成功时,登录回调函数的参数里也包含了当前正在登录的其他设备。

掉线与自动重连

调用函数

public static void RegDisconnectedCb(Action handler)

注册账号掉线的回调函数,在掉线后sdk会尝试自动进行重新连接和登录,重连的回调函数通过

public static void RegAutoReloginCb(LoginResultDelegate handler, string jsonExtension = null)

注册。由于sdk已经处理了掉线自动重连,应用程序在收到掉线的通知后通常只需要在程序界面上告知用户即可。

注意:

SDK的回调函数并不会保存用户调用接口时的线程状态,所以用户需要自行切换线程,登录回调不在主线程,如果要更新UI数据需要将任务抛到主线程中执行。

注销/登出

应用层登出/注销自己的账号时需要调用 SDK 的登出操作 public static void Logout(NIMLogoutType logoutType, LogoutResultDelegate @delegate), 该操作会通知云信服务器进行 APNS 推送信息的解绑操作, 避免用户已登出但推送依然发送到当前设备的情况发生。在调用 Logout 时需要设置正确的 NIMLogoutType 参数,类型说明请参考API文档。

基础消息功能

消息功能概述

SDK 中 NIMIMMessage 是所有消息的基类,目前提供以下几种消息类型:

NIMTextMessage 文本消息
NIMImageMessage 图片消息
NIMFileMessage 文件消息
NIMAudioMessage 语音消息
NIMCustomMessage 自定义消息

发送消息

构造消息对象

使用适当的类型构造消息对象,设置消息属性,所有消息类型以下属性必须正确设置:

SessionType:NIMSessionType 会话类型,双人会话或者是群组会话
ReceiverID:string 接收方账号
ClientMsgID:string 消息ID,sdk默认使用GUID,用户可以自定义生成策略
ResendFlag: int 消息重发标记,消息发送失败需要重新发送时需要设置为 1 ,第一次发送保持默认值 0 即可

文本消息: TextContent 消息内容

包含附件的消息类型(图片、文件、语音) LocalFilePath 字段必须设置,为发送文件的完整路径

消息发送属性设置

SDK 提供消息发送设置来满足开发者的对服务器自定义需求

消息允许在消息历史中拉取开关 ServerSaveHistory

默认为 True 。正常而言所有消息都会出现在通过 MessagelogAPI.QueryMsglogOnline 返回的结果中,但是可以通过设置这个值来使得消息不出现在这其中。

消息支持漫游开关 Roaming

默认为 True 。 消息漫游的概念是指一定时间内发送的消息可以在另一端被同步到,以保证最大限度的消息同步。(如 iOS 上收发的消息过了一天登录 PC 仍旧会收到,这种消息我们称之为漫游消息)

消息支持多端同步开关 MultiSync

默认为 True 。在默认情况下,如果用户在 iOS 端和其他端(如 PC )同时登录一个帐号,那么 iOS 端发送的消息会被同步到其他端,同样其他端发送的消息也会被同步到 iOS 端。但是需要注意的是因为 iOS 经常会退到后台,所以其他端发送的消息在 iOS 断线后是通过漫游消息来同步到的。

消息被计入未读开关 NeedCounting

默认为 True 。默认情况下,用户收到的所有消息都会被计入未读。设置这个为 False 后,对应的消息被对端接受后将不计入未读消息计数内。本地写消息时,也可以用这个字段配置写入后是否计入未读。

消息需要被推送开关 NeedPush

默认为True。设置这个为 False 后,消息将不再有苹果推送通知。

消息推送前缀开关(一般为昵称) NeedPushNick

默认为True。将这个字段设为False,推送消息将不带有前缀,如推送消息 “ 小明:今天吃什么? ” 中的 “ 小明:” 将被省略。

消息是否需要抄送 Routable

默认为True。将这个字段设为False, 则不会抄送此消息给开发者的服务器(如果有配置的话)

发送消息

调用函数 NIM.TalkAPI.SendMessage(NIMIMMessage) 将创建的消息对象发送出去。

sdk 提供了消息发送的事件通知:

public static EventHandler<MessageArcEventArgs> OnSendMessageCompleted { get; set; }

注册该事件,能够获取消息的发送状态。该事件为全局静态变量,在登录成功后注册一次即可。

接收消息

消息接收由底层统一处理,SDK开放了一个事件通知 NIM.TalkAPI.OnReceiveMessageHandler 给外部注册,事件参数中包含了详细的消息信息。

提前注册好接收消息的回调函数。以下代码注册消息接收回调和处理函数:

NIM.TalkAPI.OnReceiveMessageHandler += ReceiveMessageHandler;
void ReceiveMessageHandler(object sender, NIM.NIMReceiveMessageEventArgs args)
{
    //处理自定义消息
    if (args.Message != null && args.Message.MessageContent.MessageType == NIMMessageType.kNIMMessageTypeCustom)
    {
        var m = args.Message.MessageContent as NIMCustomMessage<object>;
        //CustomContent 是一个JObject对象,可以根据Extention字段或者其他方法来决定如何解析
        var jObj = m.CustomContent as JObject;
        if (m.Extention == "1")
        {
            var x = jObj.ToObject<CustomMessageContent>();
            if (x != null)
            {

            }
        }
    }
    if (args.Message != null && args.Message.MessageContent.MessageType == NIM.NIMMessageType.kNIMMessageTypeText)
    {
        Action action = () =>
        {
            var m = args.Message.MessageContent as NIM.NIMTextMessage;
            this.listBox1.Items.Add(new string(' ', 50) + m.TextContent);
        };
        this.Invoke(action);
    }
}

已读回执

收到消息并读取后向对方发送一条已读回执,表示已经阅读了该条消息,对放将收到此回执。 调用 public static void SendReceipt(NIMIMMessage msg, MsglogStatusChangedDelegate cb, string jsonExtension = null) 发送回执。

自定义消息

sdk支持用户自己增加新的消息类型,提供了自定义消息的基类 NIMCustomMessage 便于进行扩展。如下所示代码 CustomMessageContent 是自定义的消息体,将发送的字段用 Newtonsoft.Json.JsonProperty 属性进行标记,这样方便序列化操作,Extention 用于发送附加内容或者用来区别消息类型。 自定义消息的收发与普通消息保持一致,使用相同的函数。

class CustomMessageContent
{
    [Newtonsoft.Json.JsonProperty("text")]
    public string Text { get; set; }

    [Newtonsoft.Json.JsonProperty("imagepath")]
    public string ImagePath { get; set; }
}

class ImageTextMessage : NIMCustomMessage<CustomMessageContent>
{
    public override CustomMessageContent CustomContent { get; set; }

    public ImageTextMessage()
    {
        MessageType = NIMMessageType.kNIMMessageTypeCustom;
        CustomContent = new CustomMessageContent();
        Extention = "1";
    }
}

用户信息管理

NIM.User.UserAPI 提供用户资料管理功能,用户信息为 UserNameCard,定义了用户资料的所有信息。

获取本地用户资料

public static void GetUserNameCard(List<string> accountIdList, GetUserNameCardResultDelegate resultDelegate)

用户资料除自己之外,不保证其他用户资料实时更新。其他用户数据更新时机为:

获取服务器用户资料

public static void QueryUserNameCardOnline(List<string> accountIdList, GetUserNameCardResultDelegate resultDelegate)

此接口可以批量从服务器获取用户资料,出于用户体验和流量成本考虑,不建议应用频繁调用此接口。对于用户数据实时性要求不高的页面,应尽量调用读取本地缓存接口。

更新自己的信息

public static void UpdateMyCard(UserNameCard card, UpdateNameCardResultDelegate d)

更新自己的信息时通常先调用 GetUserNameCard 获取到自己的原始信息,然后更新要修改的字段,把这个对象传递给上述函数。

用户信息变化通知

通过注册事件 UserNameCardChangedHandler 可以获取所有用户资料的变化通知。

好友关系管理

NIM.Friend.FriendAPI 提供好友关系管理功能。NIM.Friend.NIMFriendProfile 定义了好友关系的所有信息。

获取好友列表

public static void GetFriendsList(GetFriendsListResultDelegate cb)

好友列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。在函数的回调函数中可以获取到 NIM.Friend.NIMFriendProfile 对象的列表, 根据好友的ID通过调用 GetUserNameCard 获取用户的详细资料。

好友请求

public static void ProcessFriendRequest(string accid, NIMVerifyType verifyType, string msg, FriendOperationDelegate cb)

以下代码演示如何通过系统通知处理好友请求:

//注册系统通知
NIM.SysMessage.SysMsgAPI.ReceiveSysMsgHandler += OnReceiveSysMessage;

private void OnReceiveSysMessage(object sender, NIMSysMsgEventArgs e)
{
    var _sysMessage = e.Message;
    string _processFriendReqResult;
    //kNIMSysMsgTypeFriendAdd 表示为好友请求
    if (_sysMessage.Content.MsgType == NIMSysMsgType.kNIMSysMsgTypeFriendAdd)
    {
        //Attachment 字段为json串 {"vt":NIMVerifyType},key 为 "vt",value 为 枚举类型 `NIMVerifyType`
        string attach = _sysMessage.Content.Attachment;
        string senderId = _sysMessage.Content.SenderId;
        FriendRequestVerify type = FriendRequestVerify.Deserialize(attach);
        if (type.VerifyType == NIMVerifyType.kNIMVerifyTypeAsk)
        {
            _processFriendReqResult = string.Format("{0} 加你为好友,需要通过验证", senderId);
        }
        if(type.VerifyType == NIMVerifyType.kNIMVerifyTypeAdd)
        {
            _processFriendReqResult = string.Format("{0} 加你为好友", senderId);
        }
        if (type.VerifyType == NIMVerifyType.kNIMVerifyTypeReject)
        {
            _processFriendReqResult = string.Format("{0} 拒绝了你的好友请求", senderId);
        }
        if (type.VerifyType == NIMVerifyType.kNIMVerifyTypeAgree)
        {
            _processFriendReqResult = string.Format("{0} 同意了你的好友请求", senderId);
        }
    }
}

删除好友

用户与用户之间可以解除好友关系,修改成功后会同时修改本地缓存数据。

public static void DeleteFriend(string accid, FriendOperationDelegate cb)

好友关系变更通知

通过注册 FriendProfileChangedHandler,在好友关系发生变化时会收到通知。好友关系变化包括以下类型:

群组功能

群组功能对应的管理类为 NIM.Team.TeamAPI,提供了普通群 (Normal) 以及高级群 (Advanced) 两种形式的群聊功能。高级群拥有更多的权限操作,两种群聊形式在共有操作上保持了接口一致。推荐 APP 开发时只选择一种群类型进行开发。普通群和高级群在原则上是不能互相转换的,他们的群类型在创建时就已经确定。在 SDK 2.4.0 版本后,高级群可以拥有普通群的全部功能,推荐使用高级群进行开发。

获取群组

NIM SDK 在程序启动时会对本地群信息进行同步,所以只需要调用本地缓存接口获取群就可以了。 SDK 提供了批量获取自己的群接口、以及根据单个群 id 查询的接口。同样 SDK 也提供了远程获取群信息的接口。 类NIMTeamInfo 封装了群信息。

本地获取

public static void QueryCachedTeamInfo(string tid, QueryCachedTeamInfoResultDelegate action)

在线获取

public static void QueryTeamInfoOnline(string tid, TeamChangedNotificationDelegate action)

创建群组

public static void CreateTeam(NIMTeamInfo teamInfo, string[] idList, string postscript, TeamChangedNotificationDelegate action)

NIMTeamInfo 包含群组的详细信息,通过设置该对象可以指定群类型,群组权限,群资料等信息;如果设置了 postscript,会发送给群中的每个成员。

加入群组

用户可以通过被动接受邀请主动加入两种方式进入群组。

邀请用户入群

public static void Invite(string tid, string[] idList, string postscript, TeamChangedNotificationDelegate action)

请求完成后,如果是普通群,被邀请者将直接入群;如果是高级群,云信服务器会下发一条系统消息到目标用户,目标用户可以选择同意或者拒绝入群。

主动申请入群

仅限高级群。

public static void ApplyForJoiningTeam(string tid, string reason, TeamChangedNotificationDelegate action)

请求完成后,云信服务器会下发一条系统消息给群管理员,管理员可以选择通过或者拒绝申请。

编辑群组资料

普通成员可以修改自己的群资料,管理员以上权限的群成员可以修改他人群资料以及群组信息。

public static void UpdateTeamInfo(string tid, NIMTeamInfo info, TeamChangedNotificationDelegate action)

群组权限管理

仅限高级群,高级群群主可以对群进行权限管理。

添加管理员

public static void AddTeamManagers(string tid, string[] managerIdArray, TeamChangedNotificationDelegate action)

将 managerIdArray 中包含的账号全部设置为群管理员

移除管理员

public static void RemoveTeamManagers(string tid, string[] managerIdArray, TeamChangedNotificationDelegate action)

转让群

public static void TransferTeamAdmin(string tid, string newOwnerId, bool leaveTeam, TeamChangedNotificationDelegate action)

当群管理员需要把其他人设置为管理员或者在退出群时需要调用该函数,将管理员权限转让给其他成员。

群组成员

NIMTeamMemberInfo 封装群组成员信息。SDK 提供了查询群成员信息、修改成员属性、用户退群、踢出指定群成员等功能。

群组通知

当发生枚举 NIMNotificationType 中定义的事件时会触发群组通知,通过注册 TeamEventNotificationHandler 接收通知。群通知是接收型的消息,开发者不应该自己手动去创建和发送群通知消息。

音视频网络通话

在音视频相关接口调用前需要先初始化,在最后释放前需要先关闭所有设备。其中示例代码中的只是简单的打开设备,邀请对方。 Demo中初始化音视频在public LoginForm()中,释放在NIM.ClientAPI.Logout的回调中;音视频的监听和相关被动交互处理在FriendsListForm中,包括InitVChatInfo及StartDevices、EndDevices等;实时语音发起在点对点会话窗口中ChatForm.VideoTest发起。音视频聊天需要appkey开通相关服务器,如果未开通,则会在发起时提示错误。

代码摘抄自DEMO源码

void AudioChat()
{
    VChatAPI.Init();//全局一次,在Client初始化之后调用
    NIMVChatSessionStatus session = new NIMVChatSessionStatus();
    VChatAPI.SetSessionStatusCb(session);//音视频通话状态监听,全局一次,需要提前设置(接收邀请通知等)
    DeviceAPI.SetAudioCaptureDataCb(null);//音频数据监听的监听,全局一次,需要用户自己穿handle

    DeviceAPI.GetDeviceList(NIMDeviceType.kNIMDeviceTypeAudioIn);//遍历设备,用于开启制定设备

    DeviceAPI.StartDevice(NIMDeviceType.kNIMDeviceTypeAudioIn, "", 0, null);//开启麦克风
    DeviceAPI.StartDevice(NIMDeviceType.kNIMDeviceTypeAudioOutChat, "", 0, null);//开启扬声器播放对方语音
    NIMVChatInfo info = new NIMVChatInfo();
    info.Uids = new System.Collections.Generic.List<string>();
    info.Uids.Add("test_id");
    VChatAPI.Start(NIMVideoChatMode.kNIMVideoChatModeAudio, info);//邀请test_id进行语音通话
}

初始化与清理

在调用音视频网络通话相关功能前,需要在nim.dll所在目录中有对应版本的nrtc.dll文件。

初始化NIM VCHAT,需要在SDK的NIM.ClientAPI.Init成功之后

VChatAPI.Init()

清理NIM VCHAT,需要在SDK的NIM.VChatAPI.Cleanup之前

VChatAPI.Cleanup()

设置通话回调函数

在使用音视频网络通话前,需要先设置通话回调

注册通话回调函数
VChatAPI.SetSessionStatusCb(NIMVChatSessionStatus session);

回调原型
public struct NIMVChatSessionStatus
{
    /// <summary>
    /// 发起结果回调
    /// </summary>
    public onSessionHandler             onSessionStartRes;
    /// <summary>
    /// 邀请通知
    /// </summary>
    public onSessionInviteNotify        onSessionInviteNotify;
    /// <summary>
    /// 邀请响应的结果回调
    /// </summary>
    public onSessionHandler             onSessionCalleeAckRes;
    /// <summary>
    /// 发起后对方响应通知
    /// </summary>
    public onSessionCalleeAckNotify     onSessionCalleeAckNotify;
    /// <summary>
    /// 控制操作结果回调
    /// </summary>
    public onSessionControlRes          onSessionControlRes;
    /// <summary>
    /// 控制操作通知
    /// </summary>
    public onSessionControlNotify       onSessionControlNotify;
    /// <summary>
    /// 链接通知
    /// </summary>
    public onSessionConnectNotify       onSessionConnectNotify;
    /// <summary>
    /// 成员状态通知
    /// </summary>
    public onSessionPeopleStatus        onSessionPeopleStatus;
    /// <summary>
    /// 网络状态通知
    /// </summary>
    public onSessionNetStatus           onSessionNetStatus;
    /// <summary>
    /// 主动挂断结果回调
    /// </summary>
    public onSessionHandler             onSessionHangupRes;
    /// <summary>
    /// 对方挂断通知
    /// </summary>
    public onSessionHandler             onSessionHangupNotify;
    /// <summary>
    /// 本人其他端响应通知
    /// </summary>
    public onSessionSyncAckNotify       onSessionSyncAckNotify;
}

发起通话

发起一个音视频网络通话,结果将在nim_vchat_cb_func中返回

启动通话
VChatAPI.Start(NIMVideoChatMode mode, NIMVChatInfo info)

异步回调见
NIMVChatSessionStatus.onSessionStartRes

通话邀请回应

通知邀请方自己的处理结果

VChatAPI.CalleeAck(long channel_id, bool accept, NIMVChatInfo info)

设置通话类型

开始通话,或者和对方协商转换通话类型后,告诉SDK当前的通话类型(不告知对方)

VChatAPI.SetMode(NIMVideoChatMode mode)

通话控制

协商或通知对方当前会话的一些变化

VChatAPI.ChatControl(long channel_id, NIMVChatControlType type)

结束通话

需要在通话结束后调用,用于底层挂断和清理数据,如果是自己主动结束会通知对方

VChatAPI.End()

音视频设备

提供麦克风、扬声器(听筒)、摄像头等设备的遍历、启动关闭、监听的接口,依赖VChatApi.Init

遍历设备

在启动设备前或者设备有变更后需要遍历设备,其中kNIMDeviceTypeAudioOut和kNIMDeviceTypeAudioOutChat都为听筒设备,遍历的时候等同

DeviceAPI.GetDeviceList(NIMDeviceType type)

启动设备

可以启动麦克风、摄像头、本地采集音频播放器、对方语音播放器,设备路径填空的时候会启动系统首选项

DeviceAPI.StartDevice(NIMDeviceType type, string devicePath, uint fps, StartDeviceResultHandler handler)

结束设备

DeviceAPI.EndDevice(NIMDeviceType type)

监听设备状态

通过设置设备监听,可以定时获知设备状态并启动非主动结束的设备,这里只对麦克风和摄像头有效

DeviceAPI.AddDeviceStatusCb(NIMDeviceType type, DeviceStatusHandler handler)

由于开启设备监听后会定时检查设备状态,在不需要时结束监听

DeviceAPI.RemoveDeviceStatusCb(NIMDeviceType type)

监听音频数据

通过设置监听,可以获得音频的pcm数据包,通过启动设备kDeviceTypeAudioOut和kDeviceTypeAudioOutChat由底层播放,可以不监听

DeviceAPI.SetAudioCaptureDataCb(AudioDataHandler handler)
DeviceAPI.SetAudioReceiveDataCb(AudioDataHandler handler)

监听视频数据

通过设置监听,可以获得视频的ARGB数据包

DeviceAPI.SetVideoCaptureDataCb(VideoDataHandler handler)
DeviceAPI.SetVideoReceiveDataCb(VideoDataHandler handler)

音频设置

设置音频音量,默认255,且音量均由软件换算得出,设置麦克风音量自动调节后麦克风音量参数无效

DeviceAPI.AudioCaptureVolumn
DeviceAPI.AudioPlayVolumn

设置麦克风音量自动调节

DeviceAPI.AudioCaptureAutoVolumn

音视频自定义数据输入

对于需要用户自己处理生成音视频数据,可能在启动时对NIMVChatInfo.CustomAudio及NIMVChatInfo.CustomVideo进行设置

DeviceAPI.CustomAudioData(ulong time, IntPtr data, uint size, NIMCustomAudioDataInfo info)
DeviceAPI.CustomVideoData(ulong time, IntPtr data, uint size, uint width, uint height)

聊天室

使用聊天室功能时首先要执行NIMChatRoom.ChatRoomApi.Init()进行初始化,退出时执行NIMChatRoom.ChatRoomApi.Cleanup()清理环境。提供了NIMChatRoom.AvailableRooms 类获取当前可用的聊天室(用于测试)。进入聊天室首先需要通过NIM.Plugin.ChatRoom.RequestLoginInfo函数获取授权信息,操作成功后通过NIMChatRoom.ChatRoomApi.Login执行登陆。

代码摘抄自DEMO源码

NIM.Plugin.ChatRoom.RequestLoginInfo(roomId, (response, authResult) =>
                {
                    if (response == NIM.ResponseCode.kNIMResSuccess)
                    {
                        NIMChatRoom.ChatRoomApi.Login(roomId, authResult);
                    }
                });

开发者需要通过注册事件跟踪聊天室数据更新,目前开放的事件包括以下几种类型:

    /// <summary>
    /// 登录聊天室事件
    /// </summary>
    public static event ChatRoomLoginDelegate LoginHandler;

    /// <summary>
    /// 退出聊天室事件
    /// </summary>
    public static event ExitChatRoomDelegate ExitHandler;

    /// <summary>
    /// 聊天室连接状态更改事件
    /// </summary>
    public static event LinkStateChangedDelegate LinkStateChanged;

    /// <summary>
    /// 接收聊天室消息事件
    /// </summary>
    public static event ReceiveMessageDelegate ReceiveMessageHandler;

    /// <summary>
    /// 发送聊天室消息事件
    /// </summary>
    public static event SendMessageDelegate SendMessageHandler;

    /// <summary>
    /// 接收聊天室通知事件
    /// </summary>
    public static event ReceiveNotificationDelegate ReceiveNotificationHandler;

通过NIMChatRoom.ChatRoomApi.SendMessage(roomId, msg)方法在聊天室中发送消息,发送文本消息如下所示代码:

void SendTextMsg(long roomId,string text)
{
      NIMChatRoom.Message msg = new NIMChatRoom.Message();
      msg.MessageType = NIMChatRoom.NIMChatRoomMsgType.kNIMChatRoomMsgTypeText;
      msg.RoomId = roomId;
      msg.MessageAttachment = text;
      NIMChatRoom.ChatRoomApi.SendMessage(roomId, msg);
}