編輯:關於Android編程
在Android平台實現XMPP即時通訊主要是使用asmack這個包,asmack是XMPP協議的實現。但是asmack只能幫助我們實現一些基本消息包的收發,如果需要實現特定的自定義消息包收發需要我們自己處理。
發送一個message結的消息,可以使用sendMessage()發送消息,這個方法有兩個重載方法,一種類型的參數是String類型,另一種則是傳入Message對象。String類型的方法傳入的字符串即為要發送的消息;傳入message對象的方需要寫一個類繼承Message,重寫toXML()方法,toXML()方法的返回值即為要發送的消息。例如:
//1、通過傳入String類型的sendMessage()方法發送消息: ChatManager chatManager = xmppConnection.getChatManager(); /** * String userJID 對方的JID * MessageListener listener 消息監聽,當收到消息後會回調processMessage(Chat chat, Message message)方法 */ Chat mChat = chatManager.createChat(mToUser, this); mChat.sendMessage("your content"); //2、通過傳入Message對象的sendMessage()方法發送消息: /** *寫一個類繼承Message重寫toXML()方法,方法的返回值即為要發送的消息 */ public class MyMessage extends Message { @Override public String toXML() { return "your content"; } } ChatManager chatManager = xmppConnection.getChatManager(); /** * String userJID 對方的JID * MessageListener listener 消息監聽,當收到消息後會回調processMessage(Chat chat, Message message)方法 */ Chat mChat = chatManager.createChat(mToUser, this); MyMessage myMessage = new MyMessage(); mChat.sendMessage(myMessage);接收Message消息:
接收Message類型的消息主要是在processMessage(Chat chat, Message message)方法中,當收到消息後都會回調這個方法,需要實現MessageListener這個接口,然後實現接口中的processMessage(Chat chat, Message message)方法。
當發送的iq消息中包含自定義的xml結的時候,asmack提供的解析並不能識別這些自定義的xml結,所以就需要我們自己實現消息包的解析和拼裝。
1、發送含自定義xml結的iq消息。
例如發送這樣一個iq消息:
發送步驟:
//步驟: //1、寫一個類繼承IQ並重寫getChildElementXML()方法,該方法的返回值將作為消息體。 public class MyIQ extends IQ { @Override public String getChildElementXML() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("<req var='read'>< attr var='temprature'/></req>"); return stringBuilder.toString(); } } //2、發送這個含自定義xml結的iq消息包 MyIQ packet = new MyIQ(); packet.setType(IQ.Type.GET);//設置IQ結type packet.setFrom("client@xmpp/B");//設置IQ結from packet.setTo("client2@xmpp/s2");//設置IQ結to xmppConnection.sendPacket(packet);//發送消息包
2、解析服務器返回的iq消息包,消息包中含自定義xml結。
例如解析服務器返回的這樣一個iq消息:
17
解析步驟:
//步驟: //1、寫一個類 implements PacketListener接口並實現其中的processPacket(Packet packet)方法。 public class MyPacketListener implements PacketListener { @Override public void processPacket(Packet packet) { //當收到消息包就會回調該方法 } } //2、添加包監聽器 MyPacketListener mMyPacketListener = new MyPacketListener(); //該方法有兩個參數 //第一個參數: PacketListener 包監聽器 //第二個參數: PacketFilter 包過濾器 xmppConnection.addPacketListener(mMyPacketListener, null); //完成以上兩步後,當收到消息包都會回調MyPacketListener中的processPacket(Packet packet)方法。 //3、寫一個類繼承IQ並實現getChildElementXML()方法。 public class GetDataResp extends IQ { //例如我們要獲取上面iq消息包中的temprature和17兩個屬性,所以將這兩個值聲明為成員變量,並生成get和set方法。 public String var; public String value; public String getVar() {return var;} public void setVar(String var) {this.var = var;} public String getValue() {return value;} public void setValue(String value) {his.value = value;} @Override public String getChildElementXML(){ //拼裝消息 StringBuilder buf = new StringBuilder(); buf.append("<resp xmlns='get:data'><attr var='"); · buf.append(getVar()); buf.append("'>"); buf.append(getValue()); buf.append("</attr></resp>"); return buf.toString(); } } //4、寫一個類implements IQProvider並實現接口中的parseIQ(XmlPullParser parser)方法。 public class GetDataRespProvider implements IQProvider { @Override public IQ parseIQ(XmlPullParser parser) throws Exception { GetDataResp getDataResp = new GetDataResp();//這個對象是上面第三步中的那個類對象 boolean done = false; while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("attr")) { String var = parser.getAttributeValue("", "var");//獲取var屬性的value即:temprature String value = parser.nextText();//獲取attr的文本即:17 getDataResp.setVar(var); getDataResp.setValue(value); } }else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals("resp")) { done = true; } } } return getDataResp; } } //5、在配置ConnectionConfiguration時添加IQProvider //第一個參數是:String 元素的名稱 //第二個參數是:String 命名空間 //第三個參數是:Object 需要傳入一個prvider對象 ProviderManager.getInstance().addIQProvider("resp", "data", new GetDataRespProvider()); //6、在第一步MyPacketListener中的processPacket(Packet packet)方法中獲取相應消息包 public class MyPacketListener implements PacketListener { @Override public void processPacket(Packet packet) { if (packet instanceof GetDataResp) { GetDataResp getDataResp = (GetDataResp) packet; String from = getDataResp.getFrom(); String to = getDataResp.getTo(); String var = getDataResp.getVar(); String value = getDataResp.getValue(); } } }
點擊:下載地址
最近需要實現一個功能,在Activity中有一個手寫區域,為了更好的用戶體驗,需要滿足即使整個手掌放在屏幕上時(android平板,屏幕比較大)也只響應手寫區域內的操作,
隨著微信的到來,二維碼越來越火爆,隨處能看到二維碼,比如商城裡面,肯德基,餐廳等等,對於二維碼掃描我們使用的是google的開源框架Zxing,我們可以去http://c
微信的朋友圈就像qq空間一樣,你可以在那裡發表你的心情,讓朋友們能與你一起分享喜怒哀樂,微信怎麼發說說,微信朋友圈怎麼轉發別人的說說,下面我們一起來看看吧!
前言從事Android開發的小伙伴們,想必都會遇到這樣的問題。當你的應用中需要集成百度地圖、極光推送等第三方平台時,會去申請一個叫做AppKey的東西。與此同時,你得提供