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);