====== CEC Android SDK集成(Eclipse) ====== 有些开发者还在用Eclipse或者在用jar的方式,自己写UI,那样就要用到下面的集成文档。 ===== 1. 下载SDK ===== 从[[http://www.easemob.com/download|环信官网]]下载 **Android客服访客端SDK**。 下载后有三个目录: * kefu-android-demo 基于客服SDK开发的演示商城demo,可通过Android Studio直接打开 * libs 为完整版本的客服SDK,内含实时音视频库,使用时把jar包和so都加入自有项目中的libs文件夹中 * libs.without.audio 为轻量版客服SDK,和完整版的区别为不含有实时音视频库的其他所有功能,使用时把jar包和so都加入自有项目中的libs文件夹中 ===== 2. 配置权限 ===== 在AndroidManifest.xml中配置需要的权限: ===== 3. 初始化SDK ===== ChatClient.Options options = new ChatClient.Options(); options.setAppkey("app渠道的appkey"); // 可以在管理员模式的APP渠道中找到自己的关联 options.setTenantId("自己的tenantid"); // 租户ID可以在管理员模式的企业信息里面查看 options.showAgentInputState().showVisitorWaitCount();// 打开排队人数和坐席输入状态提示功能(可选) //增加GCM推送,对于国外的APP可能比较需要 // options.setGCMNumber("****"); //在小米手机上当app被kill时使用小米推送进行消息提示,SDK已支持,可选 options.setMipushConfig(String mipushAppid, String mipushAppKey); //设为调试模式,打成正式包时,最好设为false,以免消耗额外的资源 options.setConsoleLog(boolean enable); ===== 4. 登录登出 ===== 登录前可检测当前是否为已登录状态: ChatClient.getInstance().isLoggedInBefore() // 如果已经是登录状态则不需要再次登录, ChatClient.getInstance().currentUserName() //获取当前登录的用户名,例如当前已经登录非自己的用户,可以先调用退出然后再调用登录操作 ChatClient.getInstance().login(final String userName, String password, final Callback callback) //异步登录方法 ChatClient.getInstance().logout(boolean unbindToken, final Callback callback) //退出方法,unBindToken是解绑设备推送的token,需要网络,如果true无网络会返回失败,如果也希望能够退出则可以把unbindToken设置false ===== 5. 绑定服务号 ===== // 在聊天界面,的onCreate方法中调用绑定IM服务号,让SDK知道你要给发消息的IM服务号 ChatClient.getInstance().chatManager().bindChat(final String toChatUsername) // 在聊天界面,的onDestory方法中调用解绑IM服务号,当SDK知道目前你没有再收发消息 ChatClient.getInstance().chatManager().unbindChat() ===== 6. 发送消息 ===== Message message = Message.createTxtSendMessage(String content, String toUserName) //发送文本消息 toUserName为IM服务号,content为具体内容, message = Message.createVoiceSendMessage(String filePath, int timeLength, String toUserName) //发送语音消息 message = Message.createImageSendMessage(String filePath, boolean sendOriginalImage, String toUserName) // 发送图片消息 message = Message.createVideoSendMessage(String filePath, String thumbImagePath, int fileLength, String toUserName) // 发送视频消息 message = Message.createLocationSendMessage(double latitude, double longitude, String locAddress, String toUserName) // 发送位置消息 message = Message.createFileSendMessage(String filePath, String toUserName) //发送文件消息 message = Message.createTranferToKefuMessage(String toUserName, ToCustomServiceInfo info) //发送转人工消息 message = Message.createVideoInviteSendMessage(String content, String toUserName) // 发送实时视频邀请消息 ChatClient.getInstance().chatManager().sendMessage(message, new Callback(){}); //发送消息 ===== 7. 收消息监听 ===== // 在onResume中调用 ChatClient.getInstance().chatManager().addMessageListener(this); // 在onStop中调用 ChatClient.getInstance().chatManager().removeMessageListener(this); // 并实现MessageListener监听 public interface MessageListener { void onMessage(List msgs); // 收到普通的消息 (会存储数据库) void onCmdMessage(List msgs); // 收到命令消息 (不存储数据库) void onMessageStatusUpdate(); void onMessageSent(); } ===== 8. 消息详情 ===== Message msg = ChatClient.getInstance().chatManager().getMessage(msgId);//获取某个消息, msg.getType() == Message.Type.CMD // 命令消息 EMCmdMessageBody body = (EMCmdMessageBody)msg.body(); String action = body.action(); msg.getType() == Message.Type.TXT // 文本消息 EMTextMessageBody body = (EMTextMessageBody)msg.body(); String message = body.getMessage(); // 具体消息内容 msg.getType() == Message.Type.IMAGE //图片消息 EMImageMessageBody body = (EMImageMessageBody)msg.body(); String fileName = body.getFileName(); // 图片名称 String remoteUrl = body.getRemoteUrl(); //图片服务器URL String thumbnailUrl = body.getThumbnailUrl(); //缩略图服务器URL String localPath = body.getLocalUrl();//图片本地URL String thumbnailPath = body.thumbnailLocalPath(); // 缩略图本地URL int height = body.getHeight();//图片高度 int width = body.getWidth();//图片宽度 msg.getType() == Message.Type.VOICE // 语音消息 EMVoiceMessageBody body = (EMVoiceMessageBody)msg.body(); int duration = body.getLength(); //录制的语音长度 String fileName = body.getFileName(); //文件名 String localPath = body.getLocalUrl();//本地语音地址 String remoteUrl = body.getRemoteUrl();// 服务器语音地址 msg.getType() == Message.Type.FILE // 文件消息 EMFileMessageBody body = (EMFileMessageBody)msg.body(); String fileName = body.getFileName(); // 文件名称 String localPath = body.getLocalUrl(); // 本地文件路径 String remoteUrl = body.getRemoteUrl(); // 远程服务器文件地址 ===== 9. 注册实时音视频广播 ===== IntentFilter callFilter = new IntentFilter(ChatClient.getInstance().callManager().getIncomingCallBroadcastAction()); if (callReceiver == null){ callReceiver = new CallReceiver(); //自己新建一个Receiever extends BroadcastReceiver 当接收到实时视频邀请时,会回调这里, } // register incoming call receiver appContext.registerReceiver(callReceiver, callFilter); ===== 10. 音视频API ===== ChatClient.getInstance().callManager().acceptCall(String nickName, final Callback callback) // 接受呼叫 ChatClient.getInstance().callManager().endCall(); // 挂断或者拒绝接听 ChatClient.getInstance().callManager().setLocalView(CallSurfaceView localSurface) //设置自己的视频View, ChatClient.getInstance().callManager().setRemoteView(String streamId, CallSurfaceView callSurfaceView) //设置非自己的视频View ChatClient.getInstance().callManager().pauseVideo() //关闭视频流 ChatClient.getInstance().callManager().resumeVideo(); // 打开视频流 ChatClient.getInstance().callManager().resumeVoice(); // 打开音频流 ChatClient.getInstance().callManager().pauseVoice(); // 关闭音频流 ChatClient.getInstance().callManager().subscribe(final EMediaStream stream, final CallSurfaceView videoView, final Callback callback) // 订阅某个流到对应视频View上 ChatClient.getInstance().callManager().unSubscribe(final EMediaStream stream, final Callback callback) // 取消订阅某个流 ChatClient.getInstance().callManager().addDelegate(this); // 添加视频监听, 需要在onCreate中调用 ChatClient.getInstance().callManager().removeDelegate(this); //取消视频监听, 需要在onDestory中调用 public interface CallManagerDelegate { void onAddStream(MediaStream stream); // 当有流进来时回调,例如会议增加一个人 void onRemoveStream(MediaStream stream); // 当有流离开时回调,例如视频会议离开一个人 void onUpdateStream(MediaStream stream); // 当流的某个状态更改的回调,例如某个流关闭了视频或者音频流 void onCallEnd(int reason, String desc); // 当视频会议被关闭回调, 由于某种原因,需要关闭视频 void onNotice(HMediaNoticeCode code, String arg1, String arg2, Object arg3); }