解决方案 »

  1.   

    你看你APK代码是怎么写的了,网络配置 以及端口 IP 售后服务正确。你的APK 有异常日志么。
      

  2.   

    首先建议你去看看openfire安装:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html
    如果安装OK的话看看下面的代码package com.example.smack;
    import org.jivesoftware.smack.Chat;
    import org.jivesoftware.smack.ConnectionConfiguration;
    import org.jivesoftware.smack.MessageListener;
    import org.jivesoftware.smack.PacketCollector;
    import org.jivesoftware.smack.SmackConfiguration;
    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smack.XMPPException;
    import org.jivesoftware.smack.filter.AndFilter;
    import org.jivesoftware.smack.filter.PacketFilter;
    import org.jivesoftware.smack.filter.PacketIDFilter;
    import org.jivesoftware.smack.filter.PacketTypeFilter;
    import org.jivesoftware.smack.packet.IQ;
    import org.jivesoftware.smack.packet.Message;
    import org.jivesoftware.smack.packet.Registration;
    import org.jivesoftware.smackx.MessageEventManager;import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    /**
     * 
     * 
     * 用asmack注册用户有以下几个步骤,自底向上:
     * 1:注册用户用调用的方法是:PacketCollector collector=connection.createPacketCollector(filter)
     * filter 作为参数传递进去,因此需要 filter
     * connetion 是一个连接openfire服务器的连接对象
     * XMPPConnection 是    Connection  类的一个子类
     * collector 用于获取注册返回结果用,
     *  IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());  
     *  result中包含注册是否成功的信息,详情查看API
     *
     * 
     * 
     * 
     * 2
     * PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()),new PacketTypeFilter(IQ.class))
     * 
     * PacketFilter是一个接口,被AndFilter所实现
     * AndFilter有一个构造方法AndFilter(PacketFilter...filters) 
     * 由此可知   PacketIDFilter 类和  PacketTypeFilter 类也实现了PacketFilter接口
     * 
     * reg是   Registration 的一个对象,要注册账号必须要用到此类,它里面可以设置用户名和密码
     * reg 也是 IQ 类的一个子类,因此,在 new AndFilter() 时第二个参数 new PacketTypeFilter()的参数必须为IQ.class
     * reg 如下定义
     * Registration reg = new Registration();
     * reg.setType(IQ.Type.SET);  
     * reg.setTo(connection.getServiceName());  
     * 
     * reg.setUsername(account); 设置用户名  
     * reg.setPassword(password); 设置密码
     * 
     * 以上代码的正确顺序为:
     * Registration reg = new Registration();  
     *       reg.setType(IQ.Type.SET);  
     *       reg.setTo(connetion.getServiceName());  
     *       reg.setUsername(account);  
     *       reg.setPassword(password);  
     *       reg.addAttribute("android", "geolo_createUser_android"); 这一句可有可无
     *       PacketFilter filter = new AndFilter(new PacketIDFilter(
     *       reg.getPacketID()), new PacketTypeFilter(IQ.class)); 
     *        
     *       PacketCollector collector = connetion.createPacketCollector(  
     *               filter);
     * 最后不要忘了
     * getConnection().sendPacket(reg); 发送数据包进行注册
     * IQ result = (IQ) collector.nextResult(
     * SmackConfiguration.getPacketReplyTimeout());  接受注册响应
     *
     *里面相关的继承实现关系
     *
     *Packet---派生出-->IQ--派生出-->Registration
     *
     *Connection---派生出---->XMPPConnection
     *
     *PacketFilter--被实现于--->AndFilter
     *
     *PacketFilter--被实现于--->PacketIDFilter
     *PacketFilter--被实现于--->PacketTypeFilter 
     * */
    public class MainActivity extends Activity {
    private XMPPConnection connection;
    private Button btn;
    private Button createroom;
    private Button sendMsg;
    private Chat chat;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    btn = (Button) this.findViewById(R.id.btn);
    createroom = (Button) this.findViewById(R.id.create);
    sendMsg = (Button) this.findViewById(R.id.sendMsg);

    //开启异步任务,连接服务器 详情请看 ConnectAsync类
    //第一个参数服务器ip地址(如果用本机做服务,就是本机的ip地址,
                         //用手机测试要保证手机和服务器能连上外网)
                          //第二个参数是端口号
    new ConnectAsync().execute("192.168.0.105","5222");


    //按钮点击注册,如果连接成功,点击该按钮后可以注册一个用户,到时候登录openfire就可以看到用户增加了一个
    btn.setOnClickListener(new OnClickListener(){ @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    //调用注册方法
    String result=regist("lisi","123456");
    Toast.makeText(MainActivity.this, result, 0).show();
    }});


    }



    private class ConnectAsync extends AsyncTask<String, Integer, XMPPConnection>{


    //通过ip地址和端口号获取XMPPConnection对象
    //XMPPConnection是通信的管道,很重要
    @Override
    protected XMPPConnection doInBackground(String... params) {
    ConnectionConfiguration config = new ConnectionConfiguration(params[0], Integer.parseInt(params[1]));
    config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
    config.setSASLAuthenticationEnabled(false);
    XMPPConnection mconnection = new XMPPConnection(config);
    try {
    mconnection.connect();
    return mconnection;
    } catch (XMPPException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return null;
    }


    //将得到的XMPPConnection返回给主线程中的connection,以便注册通信的后续操作
    @Override
    protected void onPostExecute(XMPPConnection result) {
    connection=result;
    super.onPostExecute(result);
    }

    }

    //注册函数,在上面有注释已经详述了,不再赘述
    public String regist(String username,String pwd){
    if(connection==null)
    return "0";
    Registration reg=new Registration();
    reg.setType(IQ.Type.SET);
    reg.setTo(connection.getServiceName());
    reg.setUsername(username);
    reg.setPassword(pwd);
    PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()),new PacketTypeFilter(IQ.class));
    PacketCollector collector = connection.createPacketCollector(filter);
    connection.sendPacket(reg);
    IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
    collector.cancel();
     if (result == null) {  
                Log.e("regist", "No response from server.");  
                return "0";  
            } else if (result.getType() == IQ.Type.RESULT) {  
                Log.v("regist", "regist success.");  
                return "1";  
            } else { // if (result.getType() == IQ.Type.ERROR)  
                if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {  
                    Log.e("regist", "IQ.Type.ERROR: " 
                            + result.getError().toString());  
                    return "2";  
                } else {  
                    Log.e("regist", "IQ.Type.ERROR: " 
                            + result.getError().toString());  
                    return "3";  
                }  
            }  
    }
    }对了,要导入一个asmack的jar包,没有的话给你个链接http://asmack.freakempire.de/
    去找android-asmack开头的jar包,我发现不知道为什么2014年的jar包里面有些方法没有,你就找2013年最新的jar包吧
    最后不要忘记在清单文件中配置访问网络的权限
    其实这个我也一直想做来着,所以研究了一下,也不是很懂,希望对你有帮助
      

  3.   

    android 连接代码就是这样写的,但是连不上,ios能连上
      

  4.   

    你确定ip写对了?端口号写对了?要不就把openfire重装