====== 实时位置共享 ====== ---- 实时位置共享:向聊天参与者实时发送自己的位置信息。 {{:start:490integrationcases:share_location.jpg|实时位置共享}} 当A用户开启位置共享,需要实时监听自己的位置变化,同时在坐标变化时向B用户发送一条带有自己坐标的透传信息。 当B用户接收到实时共享的透传消息时,解析消息中的坐标,在需要的时候显示在界面上。 - 用户A向用户B发送一条带位置扩展的透传消息。 - 用户B在收到消息后,判断是否要展示并刷新界面。 注:“透传消息”是一种特殊类型的消息,收发双方不会存数据库,同时用户离线时也不会有推送,比较适合配合业务来处理一些功能。 ===== 发送包含位置信息的透传 ===== === Android示例 === EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD); // 如果是群聊,设置chattype,默认是单聊 if (chatType == CHATTYPE_GROUP){ cmdMsg.setChatType(ChatType.GroupChat); } String action="shareLocation"; // 当前cmd消息的关键字 CmdMessageBody cmdBody=new CmdMessageBody(action); // 设置消息body cmdMsg.addBody(cmdBody); // 设置要发给谁,用户username或者群聊groupid cmdMsg.setReceipt(toChatUsername); // 通过扩展字段设置坐标位置(参数可以自定义,但要求与iOS保持一致) JSONObject jsonObject = new JSONObject(); jsonObject.put("latitude", "38.6518"); jsonObject.put("longitude", "104.07642"); cmdMsg.setAttribute("coordinate",jsonObject.toString()); EMChatManager.getInstance().sendMessage(cmdMsg,new EMCallBack() { @Override public void onSuccess() {} @Override public void onProgress(int progress, String status) {} @Override public void onError(int code, String error) {} }); === iOS示例 === EMChatCommand *shareCommand = [[EMChatCommand alloc] init]; shareCommand.cmd = @"shareLocation"; // 当前cmd消息的关键字 EMCommandMessageBody *shareMsgBody = [[EMCommandMessageBody alloc] initWithChatObject:shareCommand]; // 设置要发给谁,用户username或者群聊groupid EMMessage *shareMsg = [[EMMessage alloc] initWithReceiver:toChatUsername bodies:@[shareMsgBody]]; shareMsg.messageType = eMessageTypeChat; // 单聊或者群聊 //latitude,longitude:获取到的经纬度 shareMsg.ext = @{@"latitude":@"38.6518",@"longitude":@"104.07642"}; [[EaseMob sharedInstance].chatManager asyncSendMessage:shareMsg progress:nil]; ===== 接受并解析位置共享透传消息 ===== 接收透传消息有两种方法,一种是接收在线透传消息,一种是接收离线透传消息,考虑到位置共享的实时性,此处只处理用在线时收到的位置共享即可。 === Android示例 === //接收透传消息 EMChatManager.getInstance().registerEventListener(new EMEventListener() { @Override public void onEvent(EMNotifierEvent event) { switch (event.getEvent()) { case EventNewCMDMessage: // CMD消息 { EMMessage message = (EMMessage) event.getData(); CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody(); String aciton = cmdMsgBody.action;//获取自定义action if(action.equals("shareLocation")){//判断是否是共享实时位置 try { String co = message.getStringAttribute("coordinate"); JSONTokener jsonTokener = new JSONTokener(co); JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); // 解析出来的经纬度 double lati = Double.valueOf(jsonObject.getString("latitude")); double longi = Double.valueOf(jsonObject.getString("longitude")); } catch (EaseMobException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } break; } default: break; } } }, new EMNotifierEvent.Event[] { EMNotifierEvent.Event.EventNewCMDMessage}); === iOS示例 === // 接收透传消息回调 -(void)didReceiveCmdMessage:(EMMessage *)cmdMessage{ EMCommandMessageBody *body = cmdMessage.messageBodies.firstObject; if ([body.action isEqualToString:@"shareLocation"]) { // 判断是否是位置共享消息 // 解析出来的经纬度 double latitude = [[cmdMessage.ext objectForKey:@"latitude"] doubleValue]; double longitude = [[cmdMessage.ext objectForKey:@"longitude"] doubleValue]; } } ---- 上一页:[[start:490integrationcases:input-status|输入状态提示]] 下一页:[[start:490integrationcases:end2end-encryption|端到端加密方案]]