#征文再续#Android基于XMPP Smack Openfire开发IM即时聊天(二)

本文转自:

http://www.apkbus.com/forum.php?mod=viewthread&tid=121249&highlight=smack


1. 登陆界面 MainActivity.java

  1. package com.example.openfire_example;

  2. import org.jivesoftware.smack.XMPPException;
  3. import org.jivesoftware.smack.packet.Presence;


  4. import android.os.Build;
  5. import android.os.Bundle;
  6. import android.os.StrictMode;
  7. import android.annotation.SuppressLint;
  8. import android.annotation.TargetApi;
  9. import android.app.Activity;
  10. import android.content.Intent;
  11. import android.util.Log;
  12. import android.view.Menu;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.view.Window;
  16. import android.widget.CheckBox;
  17. import android.widget.EditText;
  18. import android.widget.Toast;

  19.     @SuppressLint("NewApi")
  20.     public class MainActivity extends Activity{
  21.         private EditText accountEditText;
  22.         private EditText passwordEditText;
  23.         private CheckBox remeberCheckBox;
  24.         
  25. //        @TargetApi(Build.VERSION_CODES.GINGERBREAD)
  26. //        @SuppressLint("NewApi")
  27.         public void onCreate(Bundle savedInstanceState) {
  28.                 super.onCreate(savedInstanceState);
  29.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  30.                 setContentView(R.layout.activity_main);
  31.                 StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
  32.                 StrictMode.setThreadPolicy(policy);
  33.                 accountEditText=(EditText) findViewById(R.id.et_account);
  34.                 passwordEditText=(EditText) findViewById(R.id.et_password);
  35.                 remeberCheckBox=(CheckBox) findViewById(R.id.login_remember);
  36.                
  37.                 findViewById(R.id.btn_cancl).setOnClickListener(new OnClickListener(){

  38.                     @Override
  39.                     public void onClick(View v) {
  40.                         finish();
  41.                     }
  42.                     
  43.                 });
  44.                
  45.                 findViewById(R.id.btn_login).setOnClickListener(new OnClickListener(){
  46.                     public void onClick(View v) {
  47.                         String account=accountEditText.getText().toString();
  48.                         String password=passwordEditText.getText().toString();
  49.                         if(account.equals("") || password.equals("")){
  50.                             Toast.makeText(MainActivity.this, "账号或密码不能为空!", Toast.LENGTH_SHORT).show();
  51.                         }else{
  52. //                            ClientConServer ccs=new ClientConServer(MainActivity.this);
  53. //                            boolean b=ccs.login(account,password);
  54.                             try{
  55.                            XmppTool.getConnection().login(account,password);
  56. //                          Log.i("XMPPClient", "Logged in as " + XmppTool.getConnection().getUser());
  57.                            
  58.                             //״̬
  59.                             Presence presence = new Presence(Presence.Type.available);
  60.                             XmppTool.getConnection().sendPacket(presence);
  61.                             //如果登录成功
  62. //                            if(b){
  63.                                 Toast.makeText(MainActivity.this, "登陆成功!", Toast.LENGTH_SHORT).show();
  64.                                 
  65.                                 startActivity(new Intent(MainActivity.this,LoginSuccessfulActivity.class));
  66.                                 Log.i("", "登陆成功!登陆成功!登陆成功!登陆成功!登陆成功!");
  67.                                 LoginSuccessfulActivity.account=account;
  68.                             }catch(XMPPException e)
  69.                             {
  70.                                 XmppTool.closeConnection();
  71.                                 
  72.                             }
  73. //                            }else{
  74. //                                Toast.makeText(MainActivity.this, "登陆失败!", Toast.LENGTH_SHORT).show();
  75. //                            }
  76.                         }
  77.                     }
  78.                 });
  79.          }
  80.    

  81.    
  82.     @Override
  83.     public boolean onCreateOptionsMenu(Menu menu) {
  84.    
  85.         // Inflate the menu; this adds items to the action bar if it is present.
  86.         getMenuInflater().inflate(R.menu.activity_main, menu);
  87.         return true;
  88.     }
  89.    
  90. }
复制代码
2. 服务界面 XmppTool.java
  1. public class XmppTool {

  2.         private static XMPPConnection con = null;

  3. private static void openConnection() {
  4.                 try {
  5.                         //声明XMPP连接 ConnectionConfiguration类的三个参数分别为ip地址,端口号
  6.                         ConnectionConfiguration connConfig = new ConnectionConfiguration("192.168.159.1", 5222);
  7.                         con = new XMPPConnection(connConfig);
  8.         //开始连接
  9.                         con.connect();
  10.                 }
  11.                 catch (XMPPException xe)
  12.            {
  13.                         xe.printStackTrace();
  14.                 }
  15.         }

  16.         public static XMPPConnection getConnection() {
  17.                 if (con == null) {
  18.                         openConnection();
  19.                 }
  20.                 return con;
  21.         }

  22.         public static void closeConnection() {
  23.                 con.disconnect();
  24.                 con = null;
  25.         }
复制代码
3. 聊天界面 FormClient.java
  1. public class FormClient extends Activity {

  2.     private MyAdapter adapter;
  3.     private List<Msg> listMsg = new ArrayList<Msg>();
  4.     private String pUSERID;
  5.     private EditText msgText;
  6.     private ProgressBar pb;

  7.     public class Msg {
  8.         String userid;
  9.         String msg;
  10.         String date;
  11.         String from;

  12.         public Msg(String userid, String msg, String date, String from) {
  13.             this.userid = userid;
  14.             this.msg = msg;
  15.             this.date = date;
  16.             this.from = from;
  17.         }
  18.     }

  19.     @Override
  20.     public void onCreate(Bundle savedInstanceState) {
  21.         super.onCreate(savedInstanceState);
  22.         setContentView(R.layout.formclient);
  23.         
  24.         //获取itent传送的用户名
  25.         this.pUSERID = getIntent().getStringExtra("USERID");
  26.         
  27.         ListView listview = (ListView) findViewById(R.id.formclient_listview);
  28.         listview.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
  29.         
  30.         this.adapter = new MyAdapter(this);
  31.         listview.setAdapter(adapter);
  32.         
  33.         //获取用户输入的聊天信息
  34.         this.msgText = (EditText) findViewById(R.id.formclient_text);
  35.         this.pb = (ProgressBar) findViewById(R.id.formclient_pb);

  36.         //建立聊天
  37.         ChatManager cm = XmppTool.getConnection().getChatManager();
  38.         //监听好友发送的聊天消息
  39.         final Chat newchat = cm.createChat("test@im.comit.com.cn", null);
  40.         
  41.         cm.addChatListener(new ChatManagerListener() {
  42.             @Override
  43.             public void chatCreated(Chat chat, boolean able)
  44.             {
  45.                 chat.addMessageListener(new MessageListener() {
  46.                     @Override
  47.                     public void processMessage(Chat chat2, Message message)
  48.                     {
  49.                         //接受聊天消息 如果是这个好友发送的
  50.                         if(message.getFrom().contains("test@im.comit.com.cn"))
  51.                         {
  52.                             //显示好友发送的消息
  53.                             String[] args = new String[] { "test", message.getBody(), TimeRender.getDate(), "IN" };
  54.                            
  55.                             //将好友的消息显示到界面
  56.                             android.os.Message msg = handler.obtainMessage();
  57.                             msg.what = 1;
  58.                             msg.obj = args;
  59.                             msg.sendToTarget();
  60.                         }
  61.                         else
  62.                         {
  63.                             //message.getFrom().cantatins("test@im.comit.com.cn);
  64.                         }
  65.                         
  66.                     }
  67.                 });
  68.             }
  69.         });

  70.         //监听发送按钮
  71.         Button btsend = (Button) findViewById(R.id.formclient_btsend);
  72.         btsend.setOnClickListener(new OnClickListener() {
  73.             @Override
  74.             public void onClick(View v) {
  75.                 //获取发送内容
  76.                 String msg = msgText.getText().toString();
  77.                
  78.                 if(msg.length() > 0){
  79.                     //显示发送内容
  80.                     listMsg.add(new Msg(pUSERID, msg, TimeRender.getDate(), "OUT"));
  81.                     //刷新发送的消息到界面
  82.                     adapter.notifyDataSetChanged();
  83.                     
  84.                     try {
  85.                         //发送消息
  86.                         newchat.sendMessage(msg);
  87.                         
  88.                     }
  89.                     catch (XMPPException e)
  90.                     {
  91.                         e.printStackTrace();
  92.                     }
  93.                 }
  94.                 else
  95.                 {
  96.                     Toast.makeText(FormClient.this, "发送消息失败", Toast.LENGTH_SHORT).show();
  97.                 }
  98.                 //清空发送消息输入框
  99.                 msgText.setText("");
  100.             }
  101.         });
  102.         
  103.       
  104.         FileTransferManager fileTransferManager = new FileTransferManager(XmppTool.getConnection());
  105.         fileTransferManager.addFileTransferListener(new RecFileTransferListener());
  106.     }

  107.    
  108.    
  109.    


  110.     private FileTransferRequest request;
  111.     private File file;

  112.     class RecFileTransferListener implements FileTransferListener
  113.     {
  114.         @Override
  115.         public void fileTransferRequest(FileTransferRequest prequest)
  116.         {
  117.          
  118. //          System.out.println("The file received from: " + prequest.getRequestor());
  119.             
  120.             file = new File("mnt/sdcard/" + prequest.getFileName());
  121.             request = prequest;
  122.             handler.sendEmptyMessage(5);
  123.         }
  124.     }

  125.     private Handler handler = new Handler() {
  126.         public void handleMessage(android.os.Message msg)
  127.         {
  128.                            
  129.             switch (msg.what) {
  130.             case 1:
  131.                 //显示会话消息
  132.                 String[] args = (String[]) msg.obj;
  133.                 listMsg.add(new Msg(args[0], args[1], args[2], args[3]));
  134.                 //刷新界面显示消息
  135.                 adapter.notifyDataSetChanged();
  136.                 break;         
  137.             default:
  138.                 break;
  139.             }
  140.         };
  141.     };

  142.     //返回按钮
  143.     @Override
  144.     public void onBackPressed()
  145.     {
  146.         super.onBackPressed();
  147.         XmppTool.closeConnection();
  148.         System.exit(0);
  149.         android.os.Process.killProcess(android.os.Process
  150.                 .myPid());
  151.     }

  152.     class MyAdapter extends BaseAdapter {

  153.         private Context cxt;
  154.         private LayoutInflater inflater;

  155.         public MyAdapter(FormClient formClient) {
  156.             this.cxt = formClient;
  157.         }

  158.         @Override
  159.         public int getCount() {
  160.             return listMsg.size();
  161.         }

  162.         @Override
  163.         public Object getItem(int position) {
  164.             return listMsg.get(position);
  165.         }

  166.         @Override
  167.         public long getItemId(int position) {
  168.             return position;
  169.         }

  170.         @Override
  171.         public View getView(int position, View convertView, ViewGroup parent)
  172.         {
  173.             this.inflater = (LayoutInflater) this.cxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  174.             
  175.             //IN,OUT消息
  176.             if(listMsg.get(position).from.equals("IN"))
  177.             {
  178.                 convertView = this.inflater.inflate(R.layout.formclient_chat_in, null);
  179.             }
  180.             else
  181.             {
  182.                 convertView = this.inflater.inflate(R.layout.formclient_chat_out, null);
  183.             }
  184.             
  185.             TextView useridView = (TextView) convertView.findViewById(R.id.formclient_row_userid);
  186.             TextView dateView = (TextView) convertView.findViewById(R.id.formclient_row_date);
  187.             TextView msgView = (TextView) convertView.findViewById(R.id.formclient_row_msg);
  188.             
  189.             useridView.setText(listMsg.get(position).userid);
  190.             dateView.setText(listMsg.get(position).date);
  191.             msgView.setText(listMsg.get(position).msg);
  192.             
  193.             return convertView;
  194.         }
  195.     }
  196. }
复制代码
因为这个项目也是比较匆忙就没有讲那么完善,注册跟好友获取没有,需要的朋友留言或者私聊我  jar包也在源码里
应观众要求上运行图:

170416y7ff0b0wn588q3vw.jpg (260.96 KB, 下载次数: 95)

下载附件  保存到相册

2013-5-30 14:36 上传







Openfire_example.zip

2013-5-29 15:20 上传

点击文件名下载附件

3.03 MB, 下载次数: 2251

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值