前言 本文将用实验步骤的方式,讲述如何在一台PC上,在2个android模拟器之间,以及android模拟器和Gtalk PC客户端之间进行XMPP通讯。
本文所用的代码样例,来源于一篇叫做“Totally *Unofficial* Android GTalk Client (Send/Receive XMPP Messages)”的文章,你在
google上 搜索“android gtalk xmpp”的关键字,第一个链接就是这篇文章,可是很可惜,在该文最初发表的davanum.wordpress.com网站上却找不到该文章,我是在费 了半天劲,才在这里找到这篇文章和它附带的代码。该文讲述了如何在android平台上收发xmpp消息。我把它的IDEA
project 转换成了完整的eclipse android 工程。并且给出了详细的实验步骤。为了试验方便,代码做了细微的改动。我会在后面提到。
准备工作 我的开发环境是基于android_sdk_windows_m3-rc37a和ADT0.3.3(android eclipse 插件)。这是目前最新的开发环境。如果你还在使用android_sdk_windows_m3-rc22a和低版本的ADT,最好都升级到最新版本。升 级步骤详见
http://code.google.com/android/intro/upgrading.html 然后,请把android sdk的tools目录置于系统path环境变量中。
另外,为了完成这个实验,你还需要有2个gmail帐号。还需要需要安装Gtalk pc 客户端。安装好Gtalk pc client后,你用2个帐号分别登录,把2个帐号都相互加为好友。
最后,最好把C:\Documents and Settings\user name\Local Settings\Application Data\Android目录中把所有文件删除。这些文件存储着用户数据,把他们删除是为了排除旧数据干扰。比如在我的机器上,这个路径就是:C: \Documents and Settings\Administrator\Local Settings\Application Data\Android。
忘了一点,该实验必须在联网环境下运行。
代码下载 在
这里下载完整的Eclipse android工程(eclipse工程名叫做xmpp,在android中的应用名叫做Gtalk Client)
实验1(android to Gtalk) 1.导入工程,在eclipse 环境中运行这个android工程。
2.在android模拟器中,先从Gtalk Client中退出。进入桌面。
3.导航到applications->Dev Tools -> Xmpp Settings
4.点击Add Acount按钮,填入你的第一个gmail帐号(以下称为gmail1)和密码。如果认证通过,那么你的gmail1 就和这个模拟器绑定了.
5. 确保stay connected to
server这个可选项打上钩。完成后的样子如下:
6. 启动你的Gtalk pc client,使用你的第二个帐号(以下称之为gmail2)登录。你可以看到你的gmail1好友处于忙碌状态。
7.在android 模拟器中,进入Gtalk Client应用。你可以在gmail2的gtalk客户端中看到,好友gmail1已经进入联机状态了.
8. 在gmail1的android模拟器的第1个输入框中输入gmail2的gmail地址,然后点击setup按钮。你将看到gmail1和gmail2之间保存在当前模拟器实例上的聊天记录,当然,如果你是第一次运行,是没有聊天记录的。
9. 然后在gmaill的android模拟器的第2个输入框中,输入发给gmail2的聊天信息,然后,点击send按钮。你会发现,gmail2的Gtalk pc client已经收到了来自gmail1的
消息。
10. 你也可以让gmail2通过gtalk pc client给gmail1的android 手机发送消息。
好了,关于android和Gtalk pc client之间通讯的实验我们就到这里,接下来,我们将在一台pc上模拟器2个android手机进行xmpp通讯。
实验2(android to android) 我们的实验2是接着实验1下来的。
11.让gmail2从Gtalk pc client上注销退出。
12.关闭gmail1的android模拟器。
13.在eclipes中启动xmpp项目,同时立即在在cmd窗口执行“emulator -skin QVGA-L”指令,启动第2个模拟器。
14. 你将在eclipse中的device view界面看到2个模拟器。如下
注:如果你在eclipse中看不到此界面,请点击window->show view->other->android/device 15.在第2个模拟器启动过程中,执行以下指令,在第2个模拟器上安装Gtalk client应用。
adb ?d <模拟器2名称> install <应用路径>
注意:这里的<模拟器2名称> 是指你在ADT中看到的第2个模拟器名称,一般是emulator-tcp-5557, <应用路 径>是指你的Gtalk client应用的apk文件绝对路径。该文件在你的工程目录的bin目录下。我这里的指令完整形式为: adb -d emulator-tcp-5557 install D:\workspace_gphone\xmpp\bin\xmpp.apk 16. 参照2-5步,在第2个模拟器tcp5557上绑定第2个gmail帐号gmail2.
17. 现在,2个模拟器已经配置好,可以和彼此setup,开始聊天了。
你可以看到,gmail1中的列表中出现了历史聊天记录。
代码分析 整个工程的代码非常简单。就一个Activity?GtalkClient。在该activtiy的onCreate方法中,我们把该activity 的生命周期和xmpp的service进行绑定。mConnection这个对象相当于一个event handle hook.它所要做的就是定义当service启动和终止时,我们的程序应该做些什么。你可以看到,当xmpp服务启动时,我们所要做的事情就是利用绑定 在模拟器上的gmail用户名和密码登录jabber服务器,也就是开始一个IXmppSession。同时通知服务器,该gmail用户已经联机了。
接下来,我们先来看发送xmpp 消息的代码。在send按钮的事件处理代码中,发送消息的代码非常简单,首先简单校验一下接收者的JID(我们这里就是聊天对象的gmail帐号),然后 使用mXmppSession的sendTextMessag方法,就把消息发送出去了。
最后,我们来分析一下该程序的关键:接收xmpp消息。
很意外,在setup按钮事件处理中,我们看到的代码居然是
Sql查询代码。利用这个查询语句返回的一个Cursor,作为ListView的数据提供者。在原作者的代码中,代码是这么写的
Cursor cursor = managedQuery(Im.Messages.CONTENT_URI, null, "contact=\'" + mRecipient.getText().toString() + "\'", null, null);
而我这里,改成了:
Cursor cursor = managedQuery(Im.Messages.CONTENT_URI, null,null, null, null);
也就是说他的Sql语句中包含了一个指定了contact 字段值的where字句,而我的Sql语句不带任何条件。但是不管怎么样,这只是个sql语句。那么为什么我们程序运行起来后,我们能在这个ListView中看到和好友的聊天记录呢?
首先,我们要想到,这个ListView的数据来源就是这个Cursor。ListView的内容能随着我们的聊天记录动态更新,也就是意味着我们聊天的时候,该Cursor所对应的表数据在动态更新,那么这个
数据库表在那里呢?
其实,android把和xmpp相关的一切数据,存在一个叫im.db的数据库中,该数据库在那里呢,在你的userdata.img文件中。该 文件的位置为C:\Documents and Settings\user name\Local Settings\Application Data\Android。该文件是一个打包文件,里面存储着用户在android模拟器上存储的各种数据,包括配置数据,发布的应用等等。那么我们怎么 知道这个img文件的目录结构呢,不用着急,ADT可以帮你。请看下图:
注:如果你在eclipse中看不到此界面,请点击window->show view->other->android/File Explorer 知道了这个im.db的位置,怎么知道这个im.db中有哪些表,表结构如何,有哪些数据呢?这时,我们就需要使用我们的adb sqlite3 shell了。
在cmd窗口中,逐条执行以下指令:
adb -d emulator-tcp-5555 shell
sqlite3 /data/data/com.google.android.providers.im/databases/im.db
.mode line
如果你想看看im.db数据库中有几个表,执行一下
.tables
指令,你将会看到该数据库中所有的表。接下来你可以使用
select * from messages;
Sql语句得到messages表的内容,正是我们的聊天记录。
这里,各个字段的含义分别是:
_id:主键。
contact:对方的Jid。
provider:jabber服务提供商,外键,在providers表中作为主键。
account:本机的Jid帐号,外键,在accounts表中作为主键。
body:消息内容
date:消息发送时间
incoming:消息流向是否是从contact到account。
注意:这些字段和代码中Im.MessagesColumns.BODY等常量一一对应。
当你使用Gtalk Client收发xmpp消息时,你会发现messges表是不停的更新的。
如果你想删除聊天记录,你可以使用delete 语句来进行记录删除。 同样你可以查询另外几个表的内容,从而找到各个表之间的关联关系。我就不多说了。
总结 通过上述实验,我们基本上弄明白了android平台上的xmpp消息的收发方式和背后的数据存储方式。也就能开发出更加复杂精美的xmpp应用来 了。例如,本文提及的例子只显示消息体,你也可以做到显示消息发送者和时间等等,还可以使用android 数据库API做一个聊天记录管理等等。最后,祝你聊天愉快
作者信息 Jagie 移动开发爱好者,可以通过
chen_cwf@163.com和他联系。
相关推荐
在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)客户端是一项常见的任务,因为XMPP是一种广泛使用的即时通讯协议,尤其适用于构建实时通信应用,如聊天、视频通话等。本篇文章将深入探讨...
资源包括 基于XMPP的多方通信系统研究与实现.pdf 基于XMPP的P2P即时通信系统的研究及实现.kdh ...XMPP协议分析及客户端开发.nh XMPP_3920_最靠谱的中文翻译文档.docx XMPP-RFC3920中文.pdf Android中的XMPP应用.pdf
Android XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放...通过分析AndroidXMPP-master的源代码,开发者可以深入学习如何在Android平台上构建完整的XMPP客户端应用,掌握即时通讯的关键技术。
在Android平台上,利用XMPP协议进行数据推送可以提升应用的交互性和实时性。本文将深入探讨如何在Android应用程序中集成并有效利用XMPP。 ### 1. XMPP协议基础 XMPP的核心概念包括JID( Jabber ID)、资源、流...
Android XMPP(Extensible Messaging and Presence Protocol)是用于在Android平台上实现即时通讯(IM)的一种技术,它基于开放源码的XMPP协议栈。Openfire是XMPP服务器的一个实现,用Java编写,提供了实时、双向的...
在Android平台上,开发者通常使用Smack库来实现XMPP的功能。Smack-4.2.1是针对Android优化的一个版本,支持多种XMPP操作,如用户登录、注册、发送单聊消息、加入聊天室以及发布群聊信息。 一、Smack-4.2.1简介 ...
在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)聊天应用是一个常见的需求,尤其是在构建即时通讯系统时。本文将深入探讨如何使用asmack库来创建一个Android XMPP客户端。 首先,XMPP是一...
在IT行业中,Android版XMPP客户端是一个专门针对Android平台开发的即时通讯应用,它利用了XMPP(Extensible Messaging and Presence Protocol)协议来实现实时的聊天功能。XMPP是一种基于XML的开放标准,广泛应用于...
总的来说,AndroidPN是一个利用Xmpp协议在Android设备上实现消息推送的示例。通过理解和实现这个项目,开发者可以深入学习Android服务、BroadcastReceiver、网络通信以及即时通讯协议Xmpp的相关知识,这对于构建具有...
通过本篇文章的介绍,我们不仅了解到了XMPP作为一种重要的即时通信协议在Android平台上的应用价值,还掌握了如何利用Google提供的API及示例代码进行开发实践。随着技术的不断进步和发展,相信未来Android上的XMPP...
在Android平台上实现XMPP协议的语音、图片和文本聊天功能是一项常见的需求,XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通讯协议,广泛应用于即时通讯应用的开发。以下将详细介绍如何在...
在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)好友列表和聊天功能是一项常见的任务,尤其是在构建即时通讯应用时。XMPP是一种开放标准的实时通信协议,它基于XML,广泛用于实现聊天、视频...
android 电子文档 XMPP总结 文档
在Android平台上,构建一个仿微信微客服项目是一个挑战性但极具价值的任务。XMPP(Extensible Messaging and Presence Protocol)是一种开放标准的即时通讯协议,常用于实现聊天、在线状态跟踪等实时通信功能,与...
标签“android xmpp”进一步确认了我们讨论的主题,即在Android平台上使用XMPP进行通信。AndroidPN-server-0.5.0可能是包含服务器端源代码的文件,这个服务器软件可能已经实现了基本的XMPP功能,如连接管理、消息...
在android应用程序中使用xmpp协议的网络操作实例
XMPP(Extensible ...通过这个项目,开发者可以学习到XMPP协议的基础知识,以及如何在Android平台上实现XMPP客户端应用。结合提供的源码,可以深入理解这些概念的实际运用,为开发自己的即时通讯应用打下坚实基础。
总的来说,这个项目提供了一个完整的Android即时聊天应用的框架,开发者可以通过理解源码,学习如何在Android平台上实现XMPP协议的即时通讯功能。对于想要深入学习Android应用开发,尤其是涉及网络通信和即时通讯的...
在Android平台上构建一个基于XMPP协议的聊天应用是一项复杂但有趣的工作。XMPP(Extensible Messaging and Presence Protocol)是一种开放标准的即时通讯协议,广泛应用于实时通讯系统,如聊天、群聊、约会场景切换...
在Android平台上实现基于XMPP协议的即时聊天功能是一项常见的任务,尤其对于开发社交应用或企业通讯工具来说。XMPP(Extensible Messaging and Presence Protocol)是一种开放标准,它允许用户进行实时通信,包括...