1、基于高德地图定位与聊天 摘 要随着生活类搜索的风行,人们越来越多的关注身旁的一些日常生活信息,如:住房、餐饮、出行、等等。电子地图产品将越来越接近人们的生活,更加及时的反映出人们四周的转变,以更好的满足人们的日常需求。智能手机的普及也造成了人们对于软件功能的需求。随着人们对于出行、餐饮、住房越来越关注。随之诞生如 QQ、高德、携程,美团,58 同程等 app 的兴起。但是他们都没偶解决朋友出行,聊天并同时告诉对方自己现在所出位置地功能所以人人地图是为了解决这一问题而研发出来的。人人地图移动版 API(android)是一套基于 Android1.7 及以上设备的应用程序接口,通过该接口,您可以
2、轻松访问高德地图服务和数据,构建功能丰富、交互性强的地图应用程序。高德地图移动版 API 不仅包含构建地图的基本接口,还提供了诸如地图定位、本地搜索、路线规划等数据服务,您可以根据自己的需要进行选择。人人地图是一款基于高德地图 API2.4.0 开发的具有聊天互动以及相互定位功能的软件关键词:高德地图 api,聊天互动,相互定位。Based on High German map positioning and chatAbstractWith the popularity of life search, people pay more and more attention to the dai
3、ly life information, such as: housing, catering, travel, etc Electronic map products will be closer to peoples life, more timely reflect the people around the change to better meet the daily needs of people. The popularity of smart phones has also caused the need for the function of the software. As
4、 people for travel, catering, housing more and more attention. Along with the birth of the such as QQ, Gao De, Ctrip, the U.S. group, 58 with the rise of the same way app. But they didnt even solve travel friends, chat and tell each other their own now deviative landmark function so everyone map is
5、in order to solve this problem out of research and development.All the mobile version of the map API (Android) is a set of application program interface based on Android1.7 and above equipment, through the interface, you can easy access to High German map services and data, build a feature rich, int
6、eractive maps application. High German map mobile version of the API includes not only to construct a map of the basic interface and also provides services such as location maps, search the local route planning and data, you can choose according to their own needs. Everyone map is a API2.4.0 based o
7、n the development of high moral map chat interactive and mutual positioning softwareKeywords: high moral map API, chat interaction, mutual positioning.目 录论文总页数:25 页1 引言 .11.1 系统需求分析 11.2 国内外进展 11.3 系统功能实现主要功能 22 系统界面及菜单设计 22.1 前期主界面设计 22.2 前期菜单页面设计 33 地图 43.1 地图展示 43.1.1 申请高德地图 API 开发 key.43.1.2 主界面
8、显示地图 53.1.3 主界面布局及地图首次定位 .64 聊天 .104. 1 事件协议及处理 .114.1.1 注册 .114.1.2 登录 124.1.3 添加好友 124 .2 网络结构设计图 .124.3 下面简单从代码角度分析聊天功能的实现 135 相互定位 206 结论与讨论 23致 谢 25声 明 26第 1 页 共 26 页1 引言1.1 系统需求分析基于移动互联网时代的兴起,人们对于智能手机的需求越来越高,现如今智能移动端大体分为安卓和 iOS,智能手机的普及也造成了人们对于软件功能的需求。随着人们对于出行、餐饮、住房越来越关注。随之诞生如携程,美团,58 同程等 app 的
9、兴起。当好朋友相约出去游玩时,虽然上述软件可以满足人们查询景点、购票等需求,但目前还没有一款软件可以同时提供相约一同出去玩的朋友的确切位置,而这一信息对于结伴出行的朋友之间快速集合、高效到达目的地等极为重要。因此人人地图就基于上述需求而开发出来的为结伴出行的好友之间提供便利通信与相互定位功能的软件,它是基于安卓手机平台改变当前团体活动在成员定位方面主要靠成员之间通过手机通讯口头交流位置信息,这是因为当前的团体内成员之间定位的方法即不效率低,又不准确。1.2 国内外进展1.2.1 Facebook Facebook 墙就是用户档案页上的留言板。有权浏览某一个用户完整档案页的其他用户,都可以看到该
10、用户的墙。用户墙上的留言还会用 Feed 输出。很多用户通过他们朋友的墙,留短信儿。更私秘的交流则通过“消息(Messages)”进行。消息发送到用户的个人信箱,就象电子邮件,只有收信人和发信人可以看到。 2007 年 7 月起,用户可以在墙上贴附件。之前,只允许文本内容1.2.2 QQ腾讯 QQ(简称“QQ”)是腾讯公司开发的一款基于 Internet 的即时通信(IM)软件。腾讯 QQ 支持在线聊天、视频通话、点对点断点续传文件、共享文件、网络硬盘、自定义面板、 QQ 邮箱等多种功能,并可与多种通讯终端相连。2015 年,QQ 继续为用户创造良好的通讯体验!其标志是一只戴着红色围巾的小企鹅
11、。1.2.3 高德地图高德是国内领先的数字地图内容、导航和位置服务解决方案提供商。自2002 年起步以来,经过十二年的不懈努力和艰辛探索,积累了扎实的技术,构筑了地图行业高壁垒,公司在各项业务取得重大发展的同时成为行业翘楚。2010 年,高德提出了向移动互联网转型的战略,依托在汽车导航市场取得的领先地位,在产品、服务和商务模式上继续不断创新,迅速构建起支撑各类产品和服务海量用户的“地图云服务”平台,努力实现基于“四屏一云”业务构架的“移动生活位置服务门户”战略。第 2 页 共 26 页通过以上信息我们可以看出无论国外的 facebook 还是国内被广泛使用的QQ 他们都只是仅仅做了通讯功能,并
12、未做定位功能。而国内的如高德地图,百度地图它们就仅仅做了导航、定位功能,并未做聊天、通信定位功能。所以我开发出一款基于定位与聊天为主要功能搭载在安卓移动手机平台的软件人人地图。人人地图侧重点是实现相互聊天与定位功能。为广大的出行朋友提供导航,通信、定位功能一体化的服务。1.3 系统功能实现主要功能1)此项目实现了客户端首次定位,可以让用户知道自己现在什么地方,什么方位为用户提供首次导航功能。2)进行了首次定位,用户可以打开右上角的菜单栏,里面有登录,注册功能。用户想实现聊天与定位首先得进行登录与注册。3)用户登录注册成功后,进入到好友列表界面,点击好友列表,就可以通过我们自定义 xmpp 即时
13、通讯协议,进行聊天通话。4)进入聊天界面后,客户端点击右上角的定位按钮,你就可以定位到你的好朋友现在的位置2 系统界面及菜单设计2.1 前期主界面设计前期主界面如下图,顶部希望有个搜索功能,就如高德、百度的 poi 检索功能一样,用户输入一些关键字可以搜素出用户感兴趣的区域。右边有个路况,代表现在地图是在 3D 模式下还是在卫星模式下。模式是用户可以自己设置导航这里模式有定位、跟随、和旋转 3 种模式可供用户选择。全景我希望用户点击进去可以能够有个实地街景的效果,用户点击附近按钮,可以检索到附近的上线的朋友。用户点击地图上的加号和减号,可以实现地图的放大缩小功能。最后在屏幕中央显示地图,并显示
14、你当前的位置。第 3 页 共 26 页2.2 前期菜单页面设计这里是菜单界面,整个菜单界面是用安卓布局里的线性布局实现的如同一张表的样式,第一个按钮是登陆按钮,用户输入自己注册的用户名及密码然后点击登陆按钮。登陆按钮地方原本想如同网易,QQ 客户端那样放一张图片,登陆后显示用户的头像界面。用户点击附近人群可以显示附近已上线的好友位置,第三个是定位功能,可以定位到对方的位置,设置按钮提供用户去设置一些私人信息。消息按钮进入到消息界面,查看好友发送过来的消息以及你发送出去的历史消息。第 4 页 共 26 页点击登录键会跳转到一个登录页面中,点击好友列表会跳转到一个好友列表界面。3 地图3.1 地图
15、展示3.1.1 申请高德地图 API 开发 key对于每一个使用高德地图进行开发的人,他都需要在高德地图官网 API 申请自己的 key 值然后下载高德地图提供的.so 库以及 jar 包如图 1 和 2.第 5 页 共 26 页3.1.2 主界面显示地图前期工作准备好了以后,我们就准备将高德地图显示在主界面中,首先我们在主程序里引用中继数据,这里的中继数据就是 metadata 这个标记是安卓为引用外部数据而提供的一个借口其中 name 为高德地图 api 唯一标示,value 值为你在官网申请的 key 值。然后在布局文件中写入高德地图控件。这里 id 是地图控件的唯一标示,通过这个 id
16、 你可以获得地图控件对象从而对地图控件进行操作。在主 Activity 中调用mapView = (MapView) findViewById(R.id.map);获得 map 地图对象mapView.onCreate(savedInstanceState);将地图与 Activity 生命周期绑定protected void onResume() super.onResume();mapView.onResume();Intent intent = getIntent();if (intent.hasExtra(“p“) addMarkersToMap();Overrideprotected
17、 void onPause() 在 activity 被销毁时解除定位绑定super.onPause();mapView.onPause();deactivate();Overrideprotected void onSaveInstanceState(Bundle outState) super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);Overrideprotected void onDestroy() 在 activity 销毁时,将地图对象一并销毁super.onDestroy();mapVi
18、ew.onDestroy();这样我们就将高德地图展示在主界面上了3.1.3主界面布局及地图首次定位主界面布局采用安卓相对布局,主界面一个单选按钮组件,下面放置了一第 7 页 共 26 页个地图控件。在地图控件里我们实现首次定位功能,显示系统小蓝点。private void setUpMap() System.out.println(“setupmap-“);aMap.setLocationSource(this);/ 设置定位监听aMap.getUiSettings().setMyLocationButtonEnabled(true);/ 设置默认定位按钮是否显示aMap.setMyLoca
19、tionEnabled(true);/ 设置为 true 表示显示定位层并可触发定位,false 表示隐藏定位层并不可触发定位,默认是 false/ 设置定位的类型为定位模式 ,可以由定位、跟随或地图根据面向方向旋转几种aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_ROTATE);在 setupmap 方法里我们设置地图定位的一些参数,并为地图对象绑定了监听,绑定好监听后系统会回调 activate 方法public void activate(OnLocationChangedListener listener) mListener = list
20、ener;System.out.println(“activate-“);if (mAMapLocationManager = null) mAMapLocationManager = LocationManagerProxy.getInstance(this);mAMapLocationManager.setGpsEnable(false);/* mAMapLocManager.setGpsEnable(false);* 1.0.2 版本新增方法,设置 true 表示混合定位中包含 gps定位,false 表示纯网络定位,默认是 true Location* API 定位采用 GPS 和网络
21、混合定位方式* ,第一个参数是定位 provider,第二个参数时间最短是2000 毫秒,第三个参数距离间隔单位是米,第四个参数是定位监听者*/mAMapLocationManager.requestLocationData(LocationProviderProxy.AMapNetwork, 30000, 10, this);在方法里我们获得了一个 mAMapLocationManager 位置管理对象,通过位置第 8 页 共 26 页管理对象掉用 requestLocationData 方法。方法参数在注释里有详细解释,这样我们就向高德服务器发送了定位请求。当定位成功后系统回调onloca
22、tionchange 方法。public void onLocationChanged(AMapLocation aLocation) if (mListener != null System.out.println(“aLocation.getAMapException().getErrorCode()=“+ aLocation.getAMapException().getErrorCode();if (aLocation.getAMapException().getErrorCode() = 0) String desc = “;Bundle locBundle = aLocation.g
23、etExtras();if (locBundle != null) desc = locBundle.getString(“desc“);tv_address.setText(desc);mListener.onLocationChanged(aLocation);/ 显示系统小蓝点在回调方法中我们获得一个 alocation 对象通过这个对象我们可以调用 getextras 方法获得 bundle 数据包通过这个包我们就可以获得我们详细地址信息。当点击标题头像时会弹出右侧滑动菜单栏,我采用安卓开源框架slidingmenu 然后对 slidingmenu 进行设置代码如下slidingMen
24、u = new SlidingMenu(this);slidingMenu.setMode(SlidingMenu.RIGHT);slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN;slidingMenu.setMenu(R.layout.right_drawer);slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);slidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);设置了菜单的布局、划出
25、方向、响应位置、菜单宽度、以及绑定的activity第 9 页 共 26 页主界面效果如图 1 和图 2 所示这里我们看见了主界面,中间有个蓝色的箭头,这地方标示当前用户所在的位置,还有个蓝色的缓冲区,头上有 3 个模式设置按钮,他们分别是定位、追随、旋转用户可以单击这 3 个按钮来切换不同定位模式,右边头像是菜单栏的控制键,点击控制键就可以弹出菜单栏,或者手势向右滑动也可以呼出菜单栏。当再次点击菜单栏或者手势向左滑动就可以关闭菜单栏。当你滑动到其他地方时,你只需再次点击左边的定位按钮,你又可以回到当前位置。当你点击右下角的放大和缩小按钮时。你可以放大地图和缩小地图。第 10 页 共 26 页
26、这里是当你将菜单栏呼出时候的界面,通过图上我们可以看出有 3 种图像,分别是普通图交通图以及卫星图,用户点击不同图像,地图就会切换到不同图像。下面是你位置的详细信息。从高德服务获取用户的位置数据并将它展示出来,下面是用户登陆按钮,当用户点击这个按钮时,可以跳转到登陆界面。让用户去登陆。当用户第一次使用这个软件并未注册时。他需要点击登陆按钮下面的注册按钮,先登陆再去注册。当用户点击好友列表界面,会跳转到好友列表界面去查看自己的好友。用户点击找到他也会跳转到好友列表界面通过点击右上角的定位按钮、可以定位到现在好友的位置。4 聊天聊天功能是基于 C/S 模式 既客户端与服务器端 运用了 java N
27、IO 知识体系第 11 页 共 26 页采用 socket 通信机制实现多个客户端相互通信的功能。首先先看一下客服端与服务器端4. 1 事件协议及处理 3.26 改(第三次重新设计):将接收消息分为当前消息,当前消息,当前只在页面接收,全局消息,每个页面接收,所以需要改变网络结构,在每个页面生成时传出当前页面 handler 到接受线程。发送消息时将 buffer 和 handler发送给发送线程。cmdcmd 和 type 参数相当于是一个动作标示,就是客服端告诉服务器端我做了什么操作,服务器端会依据客服端传递过来的 cmd 值和 type 值做出相应的动作,然后会返还 cmd 值和一些特定
28、的数据(res 参数和 type 参数)来告诉客户端我服务器端处理后的结果。Output_thread 也就是输出线程即是客服端像服务器端写入数据的而 input_thread 也就是输入线程即是服务器端向客户端写入数据的线程。4.1.1 注册客户端载入进出,用户首先要去注册自己的账号及密码,不然无法实现通信,用户去注册时在输出线程将 cmd 值设为 0 传入自己的账号名、密码、以及电话号码封装在 information 类中转化为 json 数据格式传入服务器端,第 12 页 共 26 页服务器端会比对是否用户名被注册过如果被注册过会返回 cmd = 1 res = -1。没有则会将数据存入
29、数据库中。4.1.2 登录当注册成功后,用户就要进行登录,当用户点击登录按钮后,output_thread 输出线程会将 cmd = 2 用户名以及密码转化为 json 格式数据传入服务器中。服务器会依据传入的值返回相应的处理结果。4.1.3 添加好友当你登录和注册成功后你就需要去添加好友,首先进入到添加好友界面,然后输入好友的名称(必须是和他注册的名称一致)以及你的名称(后面要依据定位请一定写入你注册的用户名)以及验证信息然后将信息封装在information 类中public String toJson_add(String msg, String userName, String tar
30、get) Gson gson = new Gson();Imformation imfor = new Imformation();imfor.setCmd(8);imfor.setMsg(msg);imfor.setTarget(target);imfor.setName(userName);imfor.setType(1);String location_imfor = gson.toJson(imfor);return location_imfor;转换为 json 格式数据传入服务器中。4 . 2 网络结构设计图注释:Activity:用户界面类。Msssagequeue:消息列表类
31、Input_Thread: 接收线程类Output_Thread:发送线程类MsgEntity:消息队列第 13 页 共 26 页添加好友完成后我们就可以开始聊天了。首先是客户端 1 在聊天界面发送消息,然后会调用 MessageQuene.Instance.sendmsg(buffer)方法同时开启输出线程和输入线程。输出线程会去遍历 List对象里的消息如果有消息就去初始化网络 socket 没有消息就让线程等待,直到有消息进来,然后将消息发送到服务器,移出消息队列 list 集合中的消息返回 handler 消息。输入线程就是根据服务器端返还 boolean 类型的值看是否有消息。无消息
32、就使线程休眠 3 秒,有消息初始化 socket 然后去读取消息,将消息转换化为String 然后解析 json 数据放进 infromation 对象中。然后根据服务器端返回的 cmd 值和 type 或者 res 值对 flag 赋予相应的值。然后通过传入输入线程的handler 对象将数据传送出输入线程。在客户端根据相应的 flag 值进行相应的操作。4.3 下面简单从代码角度分析聊天功能的实现mBtnSend.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v) / TODO Auto-
33、generated method stubString msg = mEditTextContent.getText().toString().trim();String json_Data = Json_Tool.instance().toJson_MSN(msg, sender,第 14 页 共 26 页target);MyMessageQueue.instance().sendMsg(json_Data.getBytes(), handler);showMsg(msg, false, sender););在聊天界面监听聊天按钮,获得聊天框里的消息,再将 String 型的消息对象转换为
34、json 数据格式并将 cmd 的值设为 8 和 type 值设为 5 然后通过MyMessageQueue.instance().sendMsg(json_Data.getBytes(), handler);将消息以 json 数据格式发送出去public String toJson_MSN(String msg, String userName, String target) Gson gson = new Gson();Imformation imfor = new Imformation();imfor.setCmd(8);imfor.setMsg(msg);imfor.setTarg
35、et(target);imfor.setName(userName);imfor.setType(5);String location_imfor = gson.toJson(imfor);return location_imfor;在 MyMessageQueue 中调用了 oT.addMsgToSendList(entity);将消息对象加入到输出线程中 public void addMsgToSendList(MsgEntity msg) synchronized (this) this.sendMsgList.add(msg);notify();放到 list 集合中 while (i
36、sStart) synchronized (sendMsgList) for (MsgEntity msg : sendMsgList) Handler handler = msg.getHandler();try 第 15 页 共 26 页if (msg != null) TCP_Client.instance().sendMsg(msg.getBytes();sendMsgList.remove(msg);来到输出线程的 run 方法如果消息不为空,初始化 TCP_Client 类对象并调用里面的 sendmsg 方法 s_Tcp = new TCP_Client(Const.SOCKET
37、_SERVER, Const.SOCKET_PORT);Const.SOCKET_SERVER 为服务器端的 IP 地址Const.SOCKET_PORT) 为端口号socketChannel = SocketChannel.open(new InetSocketAddress(hostIp,hostListenningPort);if (socketChannel != null) socketChannel.socket().setTcpNoDelay(false);socketChannel.socket().setKeepAlive(true);socketChannel.config
38、ureBlocking(false);socketChannel.socket().setSoTimeout(Const.SOCKET_READ_TIMOUT);selector = Selector.open();if (selector != null) socketChannel.register(selector, S electionKey.OP_READ);done = true;SocketChannel 是一个连接到 TCP 网络套接字的通道(也叫做信道)。这部分是打开套接字通道并连接到服务器地址设置端口号,设置套接字通道网络没有延迟、设置通道保持长连接、设置通道为不阻塞模式、
39、并将信道注册到信道选择器中。通道触发了一个事件意思是该事件已经就绪。所以,某个channel 成功连接到另一个服务器称为“连接就绪”。一个 server socket channel 准备好接收新进入的连接称为“接收就绪”。一个有数据可读的通道可以说是“读就绪”。等待写数据的通道可以说是“写就绪”。这里我们给信道触发事件为读就绪。通道创建好了我们就可以将数据写入服务器中Selector(选择器)是 Java NIO 中能够检测一到多个 NIO 通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个 channel,从而管理多个网络连接。仅用单个线程来处理多个 C
40、hannels 的第 16 页 共 26 页好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源(如内存)。因此,使用的线程越少越好。但是,需要记住,现代的操作系统和 CPU 在多任务方面表现的越来越好,所以多线程的开销随着时间的推移,变得越来越小了。实际上,如果一个 CPU 有多个内核,不使用多任务可能是在浪费 CPU 能力。不管怎么说,关于那种设计的讨论应该放在另一篇不同的文章中。在这里,只要知道使用 Selector 能够处理多个通道就足够了。通道触发了一个事件意思是该事件已经就绪。
41、所以,某个 channel成功连接到另一个服务器称为“连接就绪”。一个 server socket channel 准备好接收新进入的连接称为“接收就绪”。一个有数据可读的通道可以说是“读就绪”。等待写数据的通道可以说是“写就绪”。这四种事件用 SelectionKey 的四个常量来表示:SelectionKey.OP_CONNECTSelectionKey.OP_ACCEPTSelectionKey.OP_READSelectionKey.OP_WRITEpublic void sendMsg(byte bs) throws IOException ByteBuffer writeBuffe
42、r = ByteBuffer.wrap(bs);socketChannel.write(writeBuffer);第 17 页 共 26 页服务器收到客户端 1 的消息发送申请后,他会把数据原封不懂的写入客户端 2 的套接字通道中。selector 监听到通道读就绪后我们就可以定义一个字节缓区将通道里的数据 read 出来转化为字符串,这时候的数据是 json 格式的数据我们需要将 json 格式数据解析出来放到客服端 2 的 information 类中public void readSocket() Selector selector = TCP_Client.instance().get
43、Selector();if (selector = null) return;try while (selector.select() 0) 第 18 页 共 26 页/ 遍历每个有可用 IO 操作 Channel 对应的 SelectionKeyfor (SelectionKey sk : selector.selectedKeys() if (sk.isReadable() SocketChannel sc = (SocketChannel) sk.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);try sc.read(buf
44、fer); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/ continue;buffer.flip(); /回绕缓冲区String receivedString = “;try receivedString = Charset.forName(“UTF-8“).newDecoder().decode(buffer).toString().trim();/ 收到内容消息的处理-if (!receivedString.equals(“) / 解析数据Imformation imfor = J
45、son_Tool.instance().parseJson(receivedString);这样信息就成功传递到客户端 2,我们将解析好的 infromation 对象数据传递到 talkactivity 界面然后将数据显示出来就是了这里如果是别人发过来的信息我们就显示左气泡自己发送的消息就显示右气泡。if (isComMsg)/如果是对方发来的消息,则显示的是左气泡第 19 页 共 26 页convertView = inflater.inflate(R.layout.chatting_item_msg_text_left, null);else/如果是自己发出的消息,则显示的是右气泡con
46、vertView = inflater.inflate(R.layout.chatting_item_msg_text_right, null);我们可以同过 iscomMsg 属性判断展示不同的 item 界面,然后将信息展示在 listview 中最终聊天页面的效果图如下:第 20 页 共 26 页5 相互定位相互定位功能的思路就是,进入到聊天界面,客户端 1 点击定位按钮向服务器端发送定位请求,服务器端再通知客户端 2,告诉客户端 2 客户端 1 在向你发送定位请求了,然后客户端 2 知道后,将自己的经纬度坐标以 json 数据格式传递给服务器端,再传递一些参数值告诉服务端我响应你的请求
47、了,现在你可以把数据返还给客户端 1 了。服务器端收到消息,然后将客户端 2 的位置信息写进客户端 1 的通道里,然后客户端 1 从通道里将数据位置信息读取出来在地图上设个标记就 ok 了。首先我们对定位请求按钮实现监听mBtnLocation.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v) / TODO Auto-generated method stubString json_Data = Json_Tool.instance().toJson_RLocation(sender, ta
48、rget);MyMessageQueue.instance().sendMsg(json_Data.getBytes(), handler);showMsg(“我在获取对方位置“, false, sender););同聊天功能一样客服端 1 将数据传递给服务器端将 cmd 值设为 8 type 值设为 3 服务器端接收到数据依据 cmd 和 type 的值比对事件协议及处理方案知道客户端 1 发送了个请求定位功能然后服务器将数据传递给客户端 2,客户端 2解析从服务器端拿到的数据拿到 cmd 的值为 8type 值为 3 然后将 flag 的值设为i 通过传入 input_thread 线程里
49、的 handler 对象将消息发送到 talkactivity然后在 talkactivity 里做了如下逻辑处理if (flag.equals(“i“) /发送坐标System.out.println(“进入到 handler flag = i得回调“);System.out.println(“p_X = “+ LocationSet.instance().locationX+“p_y =“ + 第 21 页 共 26 页LocationSet.instance().locationY);String json_Data = Json_Tool.instance().toJson_GLocation(target, LocationSet.instance().locationX, LocationSet.instance().locationY, sender);MyMessageQueue.instance().sendMsg(json_Data.getBytes(),handler);showMsg(se