仿qq聊天及定位等

聊天其实就是要实现消息推送,而推送消息就需要保持连接(长连接)。在之前项目里虽然实现了即时聊天,但是一种很本的方法。
去掉了其中的网络访问。地图试用的百度API

还是先放上图,在说下做法。

具体做法就是,开启一个服务,在后台每隔10秒钟访问一起(Socket)服务器,如果有数据,则返回数据,客户端进行解析,然后发送广播,即可接收到消息。
发送消息,则是由服务器提供接口来发送。然后,服务器与客户端建立一个简单的通信协议。
如:MSG|发送人ID|2012-2-12 07:25:12|发送类型      MSG是个标识,类型包括文本(包含表情),图片,语音,位置等。

图片和语音的发送,都是通过FTP先上传文件到服务器,然后把本地存储的路径发送给对方。

在聊天的页面中,用户的头像都是在本地存的。包括聊天的信息,也是本地数据库存的。这样就能记录信息。也可以扩展把聊天记录导出。
在本地创建的 消息数据库中。要定义好聊天信心的字段,包括自己ID,好友ID,消息类型,文本内容,时间,是否已读等(可扩展)


01

02

03

04

05

06

07

08

09

        private
String table = "CREATE TABLE IF NOT EXISTS message("
+

                        "_id integer PRIMARY KEY,"
+

                        "TtmType integer ,"
+

                        "TtmTuID integer ,"
+

                        "TtmToUserId integer ,"
+

                        "TtmContent text ,"
+

                        "TtmTime varchar(200) ,"
+

                        "isRead integer ,"
+

                        "isReplyLocation integer )";

这样再次进入聊天页面就可以把数据库的内容读出来,匹配到适配器


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

public
List<DetailEntity> getdatas(
int
TtmTuID,
int TtmToUserId) {

               
List<DetailEntity> de = new
ArrayList<DetailEntity>();

               
SQLiteDatabase database = dbmanger.getWritableDatabase();

 

               
Cursor cursor = database

                                .rawQuery(

                                                "select * from message where (TtmTuID = ? and TtmToUserId = ?) or (TtmToUserId = ? and TtmTuID = ?)  order by _id",

                                                new
String[] { String.valueOf(TtmTuID),

                                                               
String.valueOf(TtmToUserId),

                                                               
String.valueOf(TtmTuID),

                                                               
String.valueOf(TtmToUserId)});

               
while (cursor.moveToNext()) {

                        de.add(new
DetailEntity(cursor.getInt(1), cursor.getInt(2), cursor

                                       
.getInt(3), cursor.getString(4), cursor.getString(5),cursor.getInt(6),cursor.getInt(7)));

 

               
}

               
cursor.close();

               
database.close();

               
return de;

        }

图片的查看和语音的播放,都需要从数据库里取出文件保存的路径,不然的会显示和播放都不正确。
仔细看源码的话发现,在进入页面适配数据的时候已经从数据库读取内容了,而在适配器中查看图片,又重新读取了一次,
主要是因为,不这样做还是不能正确显示和播放。  对这个问题很费解。

进入到聊天页面,换取到数据,很据数据类型来加载对应的layout,当然还要判断用户ID,信息的读取是根据用户ID来获取的


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

messageList = MessageSQLService.getInstance(this).getdatas(

                                Integer.valueOf(UserInfomation.getUserID(TalkMessageAct.this)),

                                Integer.valueOf(TFuid));

for
(
int i =
0; i < messageList.size(); i++) {

         

        switch
(messageList.get(i).getTtmType()) {

        case
1:

 

               
int id = Integer.valueOf(messageList.get(i).getTtmTuID());

               
if (id == Integer.valueOf(TFuid)) {

 

               
} else
if
(id == Integer.valueOf(UserInfomation

                                .getUserID(TalkMessageAct.this))) {

                         

               
}

 

               
break;

        case
2:

               
int ids = Integer.valueOf(messageList.get(i).getTtmTuID());

               
if (ids == Integer.valueOf(TFuid)) {

 

               
} else
if
(ids == Integer.valueOf(UserInfomation

                                .getUserID(TalkMessageAct.this))) {

               
}

               
break;

        case
3:

               
int idsx = Integer.valueOf(messageList.get(i).getTtmTuID());

               
if (idsx == Integer.valueOf(TFuid)) {

 

               
} else
if
(idsx == Integer.valueOf(UserInfomation

                                .getUserID(TalkMessageAct.this))) {

               
}

               
break;

        case
5:

               
break;

        case
6:

               
int idsxx = Integer.valueOf(messageList.get(i).getTtmTuID());

               
if (idsxx == Integer.valueOf(TFuid)) {

 

               
} else
if
(idsxx == Integer.valueOf(UserInfomation

                                .getUserID(TalkMessageAct.this))) {

               
}

               
break;

 

        }

}

之前在测试中,用socket实现不了长连接。主要是因为不加上 socket.shutdownOutput();就收不到消息,而加上了即接收完消息断了连接。所以每隔10秒就要访问次Socket服务器


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

        socket =
new Socket(Constants.SOCKET_IP, Constants.SOCKET_PORT);

 

        if
(socket.isConnected()) {

               
 

               
out = new
PrintWriter(
new
BufferedWriter(

                                new
OutputStreamWriter(socket.getOutputStream())), true);

               
out.write("Lgn|"+

                        UserInfomation.getUserID(TalkMessageServer.this)+"|"+

                        UserInfomation.getUserPW(TalkMessageServer.this));

               
out.flush();

               
socket.shutdownOutput();

        }

        reader =
new BufferedReader(new
InputStreamReader(

                        socket.getInputStream()));

        while
((line = reader.readLine()) != null) {

               
if (line !=
null) {

                        //截取字符,读取信息的操作

               
}

虽然实现了,但在实际的应用中,效果不好。费电,丢包。

当然了,现在正在往长连接方向该,也修改了通信协议(很规范),(SocketChannel,Selector)
最后放上源码   
Test.rar(2.68
MB, 下载次数: 5691)

时间: 2024-10-11 00:07:06

仿qq聊天及定位等的相关文章

c#-C#仿QQ聊天的代码。在打开聊天窗口并输入聊天内容执行发送时,程序报错

问题描述 C#仿QQ聊天的代码.在打开聊天窗口并输入聊天内容执行发送时,程序报错 这是一段仿QQ聊天的代码.在打开聊天窗口并输入聊天内容执行发送时,程序报错: 参数化查询 '(@FromUserId int,@ToUserId int,@Message nvarchar(1),@MessageType' 需要参数 '@MessageState',但未提供该参数. 错误详细信息为: 未处理 System.Data.SqlClient.SqlException Message="参数化查询 '(@F

Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命

Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/liuguilin.html 日后我所写的特效专辑也会以一添加在这个专栏上,今天写的这个特效,是关于聊天的,你肯定遇到过,就是你跟人家聊天的时候,比如发送应(么么哒),然后屏幕上全部就是表情了,今天我们就是做这个,撒花的特效,国际惯例,上图 截图 实现这样的效果,你要知道贝塞尔曲线,何谓贝塞尔曲线?其实

Android仿QQ聊天撒花特效 很真实_Android

先看看效果图吧 实现这样的效果,你要知道贝塞尔曲线,何谓贝塞尔曲线?先在这里打个问号 下面就直接写了 1.activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent

android 仿QQ聊天,带表情,可翻页,带翻页拖动缓冲

http://blog.csdn.net/lnb333666/article/details/8546497 如题,这是公司项目的一个功能模块,先上个效果图: 其次大致说说原理: 1,首先判断输入的字符,是否包含表情的文字,比如   这个表情对应的文件名为 emoji_1.png,它对应的文字描述 : [可爱],如果我们在输出的是输出这么一句话:老婆,我想你了.  那么我们对应的根本文字就是:老婆,我想你了[可爱]. 2,具体的转换过程就是用正则表达式比配文字中是否含有[xxx]这类的文字,如果

mina的编码和解码以及断包的处理,发送自定义协议,仿qq聊天,发送xml或json

最近一段时间以来,mina很火,和移动开发一样,异常的火爆.前面写了几篇移动开发的文章,都还不错,你们的鼓励就是我最大的动力.好了,废话少说.我们来看下tcp通讯吧. tcp通讯对于java来说是很简单的.就是socket,也就是大家常说的套接字.大家不要把它看的很难.说白了tcp通讯其实就是数据流的读写.一条输入流,一条输出流.分别复杂发消息和接收消息. 明白了这些,ok,我们来看看我写的例子吧.先看服务器端的测试类的源码: package com.minaqq.test; import co

仿QQ聊天的代码。在打开聊天窗口并输入聊天内容执行发送时,程序报错:

问题描述 参数化查询'(@FromUserIdint,@ToUserIdint,@Messagenvarchar(1),@MessageType'需要参数'@MessageState',但未提供该参数.错误详细信息为:未处理System.Data.SqlClient.SqlExceptionMessage="参数化查询'(@FromUserIdint,@ToUserIdint,@Messagenvarchar(1),@MessageType'需要参数'@MessageState',但未提供该参数

SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

 SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr 源码:http://pan.baidu.com/s/1dETGYGT 应用情景之一:     没太多连续的时间来研究SignalR,所以我把这篇文章分了三个阶段: 第一

Android仿QQ、微信聊天界面长按提示框效果_Android

先来看看效果图 如何使用 示例代码 PromptViewHelper pvHelper = new PromptViewHelper(mActivity); pvHelper.setPromptViewManager(new ChatPromptViewManager(mActivity)); pvHelper.addPrompt(holder.itemView.findViewById(R.id.textview_content)); 使用起来还是很简单的 首先new一个PromptViewH

Android高仿微信聊天界面代码分享_Android

微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们来看一下整个小项目的主体结构: 下面是Activity的代码: package com.way.demo; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import jav