关闭

仿qq聊天及定位等

1148人阅读 评论(0) 收藏 举报
聊天其实就是要实现消息推送,而推送消息就需要保持连接(长连接)。在之前项目里虽然实现了即时聊天,但是一种很本的方法。
去掉了其中的网络访问。地图试用的百度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)
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

0901Android基础仿QQ聊天界面(下)

聊天信息显示  聊天界面分左右边,建立两个layout,通过判断 public static final int MESSAGE_LEFT = 0;和 public static final...
  • DDDebussy
  • DDDebussy
  • 2015-09-01 14:39
  • 1740

2013-06-18《C++仿QQ系统设计与实…

仿QQ聊天系统   1.引言 1 1.1编写目的 1 1.2项目背景 1 1.3定义 2 1.4参考资料 2 2.总体设计 2 2.1需求概述 2 2.2软件结构 2 3.程序描述 ...
  • HXPshakele
  • HXPshakele
  • 2013-11-30 20:33
  • 985

仿QQ聊天程序

仿QQ聊天程序 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 一、设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天...
  • u012027907
  • u012027907
  • 2014-03-16 00:57
  • 8476

仿QQ聊天列表界面demo

先看下今天要实现的demo的效果图 大体分解下主要要如下需求: 1、聊天列表有个会伸缩的头部,伸缩过程中列表不可滑动 2、列表项可以向左滑动拖出删除功能,并且点击删除该列表项,滑动列表时有处于删...
  • chenzujie
  • chenzujie
  • 2015-12-24 16:57
  • 3642

仿QQ聊天程序(java)

仿QQ聊天程序 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 一、设计内容及要求 1.1综述 A.系统概述 我们要做的就是类...
  • zwx19921215
  • zwx19921215
  • 2014-03-17 15:52
  • 81499

Android即时通讯--仿QQ即时聊天:(五)聊天模块

1、复杂ListView的展示 聊天模块其实就是一个复杂的ListView,在数据适配器中,从application中获取到当前登录的用户,与聊天消息中的from参数进行比较,如果两者相同则说明是自己...
  • qq_20889581
  • qq_20889581
  • 2016-02-27 15:52
  • 6441

Android学习之仿QQ聊天界面的实现

前言:好几天没动手了,感觉有点手懒了,干我们这行真的一点不能懈怠啊!回来写了个仿扣扣聊天界面的实现,动态添加聊天内容等!分析:主体:RecylerView+LinearLayout效果:简单的模仿一下...
  • qq_16131393
  • qq_16131393
  • 2016-05-03 21:41
  • 10327

【HTML5】实现QQ聊天气泡效果

今天自己用 HTML/CSS 做了个类似QQ的聊天气泡,下面是效果图: 下面说下关键地方的样式设置,然后贴出html和css代码(不多)。 步骤1:布局 消息采用div+float布局,每条...
  • xiaohui_hubei
  • xiaohui_hubei
  • 2014-08-23 14:46
  • 8166

仿QQ聊天(4)—简单的聊天页面实现

点击好友item,跳转到PersonalCardActivity(名片页面), 之前一直在想怎么把这个圆形头像放到这个位置,想到的办法就是就一个帧布局,给帧布局指定一个坐标,让他固定在那里,这样就能...
  • u013278261
  • u013278261
  • 2015-11-05 16:06
  • 507

Android 仿微信QQ聊天界面

一些IM聊天软件的展现形式是左右分开的形式。比如说,别人给你发的信息全部靠左显示,你自己发给别人的信息全部靠右显示。 而我们的ListView很多时候是显示同一个布局,其实BaseAdapter中有2...
  • shineflowers
  • shineflowers
  • 2014-12-01 15:36
  • 10011
    本人新书
    个人资料
    • 访问:2121406次
    • 积分:28315
    • 等级:
    • 排名:第220名
    • 原创:757篇
    • 转载:262篇
    • 译文:22篇
    • 评论:385条
    技术公众号
      欢迎关注我的公众号,每天为你推荐最新的博文,与大家一起学习共同进步!
    博客专栏
    站长统计
    微博
    最新评论
    本人新作

    新书