android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx

上传人:b****3 文档编号:18022804 上传时间:2022-12-13 格式:DOCX 页数:14 大小:366.68KB
下载 相关 举报
android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx_第1页
第1页 / 共14页
android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx_第2页
第2页 / 共14页
android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx_第3页
第3页 / 共14页
android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx_第4页
第4页 / 共14页
android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx

《android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx》由会员分享,可在线阅读,更多相关《android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。

android asmack 注册 登陆 聊天 多人聊天室 文件传输Word文件下载.docx

在打开软件后会开始初始化,完成与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(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1