实时位置共享


实时位置共享:向聊天参与者实时发送自己的位置信息。

实时位置共享

当A用户开启位置共享,需要实时监听自己的位置变化,同时在坐标变化时向B用户发送一条带有自己坐标的透传信息。

当B用户接收到实时共享的透传消息时,解析消息中的坐标,在需要的时候显示在界面上。

  1. 用户A向用户B发送一条带位置扩展的透传消息。
  2. 用户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];
      }
}

上一页:输入状态提示

下一页:端到端加密方案