編輯:關於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();
}
}
}
點擊:下載地址
Android手掌抑制功能的實現
最近需要實現一個功能,在Activity中有一個手寫區域,為了更好的用戶體驗,需要滿足即使整個手掌放在屏幕上時(android平板,屏幕比較大)也只響應手寫區域內的操作,
Android基於google Zxing實現各類二維碼掃描效果
隨著微信的到來,二維碼越來越火爆,隨處能看到二維碼,比如商城裡面,肯德基,餐廳等等,對於二維碼掃描我們使用的是google的開源框架Zxing,我們可以去http://c
微信說說怎麼發 微信朋友圈怎麼轉發
微信的朋友圈就像qq空間一樣,你可以在那裡發表你的心情,讓朋友們能與你一起分享喜怒哀樂,微信怎麼發說說,微信朋友圈怎麼轉發別人的說說,下面我們一起來看看吧!
Android開發必備技能——修改debug簽名
前言從事Android開發的小伙伴們,想必都會遇到這樣的問題。當你的應用中需要集成百度地圖、極光推送等第三方平台時,會去申請一個叫做AppKey的東西。與此同時,你得提供