android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx
《android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx》由会员分享,可在线阅读,更多相关《android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
在打开软件后会开始初始化,完成与openfire服务器的连接,设置一些配置
static{
XMPPConnection.DEBUG_ENABLED=true;
finalConnectionConfigurationconnectionConfig=newConnectionConfiguration(
host,5222,"
"
);
//Googletalk
//ConnectionConfigurationconnectionConfig=new
//ConnectionConfiguration(
//"
5222,"
//connectionConfig.setSASLAuthenticationEnabled(false);
ActivityMain.connection=newXMPPConnection(connectionConfig);
ActivityMain.connection.DEBUG_ENABLED=true;
ProviderManagerpm=ProviderManager.getInstance();
configure(pm);
}
注册模块
注册有两种方法:
一种是用createAccount,不过我测试了一下发现不能创建用户,具体原因不详,下面介绍第二种。
如上图:
注册成功后服务器将多了ggg用户。
具体实现如下:
Registrationreg=newRegistration();
reg.setType(IQ.Type.SET);
reg.setTo(ConnectionSingleton.getInstance().getServiceName());
reg.setUsername(username.getText().toString());
reg.setPassword(password.getText().toString());
reg.addAttribute("
android"
"
geolo_createUser_android"
System.out.println("
reg:
+reg);
PacketFilterfilter=newAndFilter(newPacketIDFilter(reg
.getPacketID()),newPacketTypeFilter(IQ.class));
PacketCollectorcollector=ConnectionSingleton.getInstance()
.createPacketCollector(filter);
ConnectionSingleton.getInstance().sendPacket(reg);
result=(IQ)collector.nextResult(SmackConfiguration
.getPacketReplyTimeout());
//Stopqueuingresults
collector.cancel();
if(result==null){
Toast.makeText(getApplicationContext(),"
服,
Toast.LENGTH_SHORT).show();
}elseif(result.getType()==IQ.Type.ERROR){
if(result.getError().toString().equalsIgnoreCase(
conflict(409)"
)){
这,
}else{
注,
}elseif(result.getType()==IQ.Type.RESULT){
恭,
使用注册类,设置好注册的用户名密码和一些属性字段,直接设置包过滤,根据这个过滤创建一个结果集合,发送注册信息包,等待获取结果,剩余就是判断结果内容.
登录模块
登录比较简单
ConnectionSingleton.getInstance().connect();
//connect
Stringaccount=etUsername.getText().toString();
Stringpassword=etPassword.getText().toString();
//保存用户和密码
ActivityLogin.util.saveString(ACCOUNT_KEY,account);
ActivityLogin.util.saveString(PASSWORD_KEY,password);
ConnectionSingleton.getInstance().login(account,password);
//login
//loginsuccess
loginsuccess"
ActivityLogin.mCurrentAccount=account;
System.out.println(ConnectionSingleton.getInstance()
.getUser());
//登录成功后发现在线状态
Presencepresence=newPresence(Presence.Type.available);
ConnectionSingleton.getInstance().sendPacket(presence);
//开始主界面
Intentintent=newIntent(ActivityLogin.this,
ActivityMain.class);
startActivity(intent);
获取联系人模块(ActivityMain主界面)
获取联系人并将相关信息保存到一个list数组里,最后通知listview更新界面
roster=ActivityMain.connection.getRoster();
publicvoidupdateRoster(){
Collection<
RosterEntry>
entries=roster.getEntries();
for(RosterEntryentry:
entries){
System.out.print(entry.getName()+"
-"
+entry.getUser()+"
+entry.getType()+"
+entry.getGroups().size());
Presencepresence=roster.getPresence(entry.getUser());
+presence.getStatus()+"
+presence.getFrom());
Useruser=newUser();
user.setName(entry.getName());
user.setUser(entry.getUser());
user.setType(entry.getType());
user.setSize(entry.getGroups().size());
user.setStatus(presence.getStatus());
user.setFrom(presence.getFrom());
userinfos.add(user);
rosterAdapter.notifyDataSetChanged();
单人聊天模块
第一次修改:
在主界面点击选择一个用户,进入聊天Activity,ActivityChat先获取传过来的用户,创建聊天类并对该用户设置消息监听
ChatManagerchatmanager=ConnectionSingleton.getInstance()
.getChatManager();
//getuser
Intentintent=getIntent();
Stringuser=intent.getStringExtra("
user"
user:
+user);
//newasession
newChat=chatmanager.createChat(user,null);
//监听聊天消息
chatmanager.addChatListener(newChatManagerListenerEx());
//sendmessage
try{
newChat.sendMessage("
imbirdman"
}catch(XMPPExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
监听类
publicclassChatManagerListenerEximplementsChatManagerListener{
@Override
publicvoidchatCreated(Chatchat,booleanarg1){
//TODOAuto-generatedmethodstub
chat.addMessageListener(ml);
publicclassMessageListenerEximplementsMessageListener{
publicvoidprocessMessage(Chatarg0,Messagemessage){
Stringresult=message.getFrom()+"
:
+message.getBody();
System.out.println(result);
android.os.Messagemsg=newandroid.os.Message();
msg.what=0;
Bundlebd=newBundle();
bd.putString("
msg"
result);
msg.setData(bd);
handler.sendMessage(msg);
所获取到的消息都是通过handler来更新UI
publicHandlerhandler=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
switch(msg.what){
case0:
{
Stringresult=msg.getData().getString("
record.setText(record.getText()+"
\n"
+result);
break;
default:
};
aaa跟bbb的聊天
第二次修改:
第一次的测试,发现如果多个人之间都成为好友,那么他们之间的聊天就出现了接收不到的信息,当然在跟spark测试时,spark可以收到android端的信息,不过android客户端是收到这个信息,不过却没有显示出来,具体原因还不太清楚。
因此在第二次修改我改成监听所有聊天信息包,然后再分析包的归属,分发到对应的聊天窗口。
这里就是监听到包后打印的消息,打印出了jid和消息内容
publicclassXmppMessageManagerimplementsChatManagerListener{
privateXMPPConnection_connection;
privateChatManagermanager=null;
publicvoidinitialize(XMPPConnectionconnection){
_connection=connection;
manager=_connection.getChatManager();
manager.addChatListener(this);
chat.addMessageListener(newMessageListener(){
publicvoidprocessMessage(Chatnewchat,Messagemessage){
//若是聊天窗口存在,将消息转往目前窗口
//若窗口不存在,创建新的窗口
System.out
.println(message.getFrom()+"
+message.getBody());
if(!
ActivityMain.chats.containsKey(message.getFrom())){
ActivityMain.chats.put(message.getFrom(),newchat);
});
主要就是重写了ChatManagerListener类的监听,分发处理暂时没有想好怎么写。
接着在后台启动service就可以开始监听,行了第一次修改那些可以去掉了^0^。
多人聊天模块
也是在主界面的菜单进入ActivityMultiChat,该界面显示所创建的房间,点击就跳转到ActivityMultiRoom。
获取所有房间比较简单,只需执行下面这段代码
hostrooms=MultiUserChat.getHostedRooms(ActivityMain.connection,
conference.zhanghaitao-pc"
跳转到后获取要加入的房间的jid,并创建监听。
jid=getIntent().getStringExtra("
jid"
//后面服务名称必需是创建房间的那个服务
StringmultiUserRoom=jid;
muc=newMultiUserChat(ActivityMain.connection,multiUserRoom);
//创建聊天室,进入房间后的nickname
muc.join(ActivityLogin.mCurrentAccount);
Log.v(TAG,"
joinsuccess"
}catch(XMPPExceptione){
ChatPacketListenerchatListener=newChatPacketListener(muc);
muc.addMessageListener(chatListener);
监听大概的流程跟单人聊天差不多,都是handler来操作。
不过多人聊天是重写了PacketListener。
具体如下(不过该方法是监听房间的信息,也就是说显示的是以房间为名字的消息):
classChatPacketListenerimplementsPacketListener{
privateString_number;
privateDate_lastDate;
privateMultiUserChat_muc;
privateString_roomName;
publicChatPacketListener(MultiUserChatmuc){
_number="
0"
;
_lastDate=newDate(0);
_muc=muc;
_roomName=muc.getRoom();
publicvoidprocessPacket(Packetpacket){
Messagemessage=(Message)packet;
Stringfrom=message.getFrom();
if(message.getBody()!
=null){
DelayInformationinf=(DelayInformation)message.getExtension(
x"
jabber:
x:
delay"
DatesentDate;
if(inf!
sentDate=inf.getStamp();
sentDate=newDate();
Log.w(TAG,"
Receiveoldmessage:
date="
+sentDate.toLocaleString()+"
;
message="
+message.getBody());
msg.what=RECEIVE;
from"
from);
body"
message.getBody());
下载模块
在主界面对着用户名长按,进入下载activity。
进入activityFileTransfer,点击传输按钮即可将文件传输给之前选择的用户,当然这里做得比较简单,并没有拒绝功能,一旦发现有文件就接受。
FileTransferManagertransfer=newFileTransferManager(
ActivityMain.connection);
Stringdestination=user;
OutgoingFileTransferout=transfer
.createOutgoingFileTransfer(destination+"
/Smack"
那用户是如何监听到有文件并且接受呢?
在进入主界面的时候就已经开始了一个service(fileListenerService),该服务创建文件的监听类(XmppFileManager),监听类主要继承FileTransferListener重写里面的fileTransferRequest方法。
FilesaveTo;
//setanswerToforrepliesandsend()
answerTo=request.getRequestor();
Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())){
send("
ExternalMedianotmountedread/write"
return;
}elseif(!
landingDir.isDirectory()){
send(