android安卓開發問題集 XMPP篇


1、消息推送查了下資料,后面還是使用了androidpn

(1)java.security.KeyStoreException: KeyStore jks implementation not found

解決方法, 在創建ConnectionConfiguration 時指定證書位置及類型:

        connConfig.setTruststorePath("/system/etc/security/cacerts.bks");
        connConfig.setTruststoreType("bks");

(2) 客戶端一些說明

asmack的代碼以及jar可以從 http://code.google.com/p/asmack/downloads/list 下載.

在android中創建一個service用來管理連接以及處理報文.

創建連接代碼如下 ,其中server_ip是jabber服務器的ip, 可以是域名.

        Log.i(TAG, "ConnectManager in...");
        ConnectionConfiguration connConfig = new ConnectionConfiguration(server_ip);
        // connConfig.setSecurityMode(SecurityMode.disabled);
        connConfig.setSecurityMode(SecurityMode.required);
        connConfig.setSASLAuthenticationEnabled(false);
        connConfig.setCompressionEnabled(false);
        mConnection = new XMPPConnection(connConfig);

 

連接到服務器代碼:

        if (!isConnect()) {
            Log.i(TAG, "Connect to server now...");
            try {
                // Connect to the server
                mConnection.connect();
                Log.i(TAG, "connect success!!!");
            } catch (XMPPException e) {
                Log.e(TAG, "connect failed!", e);
            }
        }

 

判斷是否連接上:

    mConnection.isConnected();

 

登錄到服務器代碼, 需要用戶名和密碼:

        if (!isLogin()) {
            Log.i(TAG, "Login to server now...");
            try {
                mConnection.login(username, passwd);
                Log.i(TAG, "login success!!!");
            } catch (XMPPException e) {
                Log.e(TAG, "login failed!", e);
            }
        }

判斷是否登錄上:

     mConnection.isAuthenticated();

 

添加連接監聽代碼:

        mConnection.addConnectionListener(new ConnectionListener() {
            public void connectionClosed() {
                // TODO
            }

            public void connectionClosedOnError(Exception e) {
                // TODO
            }

            public void reconnectingIn(int seconds) {
                // Ignore
            }

            public void reconnectionFailed(Exception e) {
                // Ignore
            }

            public void reconnectionSuccessful() {
                // Ignore
            }
        });

 

添加包監聽代碼, 以名單列表為例:

      PacketFilter rosterFilter = new PacketTypeFilter(RosterPacket.class);
      mConnection.addPacketListener(new RosterPacketListener(), rosterFilter);

     其中 RosterPacket類是繼承Packet類的,  除此之外還有 IQ,  Message,  Presence, AuthMechanism, Response五種類型的包.

可以使用OrFilter來同時處理多種類型的包. 以下代碼用來接收所有的包:

        PacketFilter rosterPF = new PacketTypeFilter(RosterPacket.class);
        PacketFilter IQPF = new PacketTypeFilter(IQ.class);
        PacketFilter MSGPF = new PacketTypeFilter(Message.class);
        PacketFilter PresencePF = new PacketTypeFilter(Presence.class);
        PacketFilter AMPF = new PacketTypeFilter(AuthMechanism.class);
        PacketFilter REPF = new PacketTypeFilter(Response.class);
        
        OrFilter allPF = new OrFilter(rosterPF, IQPF);
        allPF.addFilter(MSGPF);
        allPF.addFilter(PresencePF);
        allPF.addFilter(AMPF);
        allPF.addFilter(REPF);
        PacketListener myListener = new PacketListener() {
            public void processPacket(Packet pk) {
                Log.i(TAG, "receive message : " + pk.toString());
            }
        };
        mConnection.addPacketListener(myListener, allPF);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM