XMPPプロトコルに基づくAndroid IM研究二


では、XMPPプロトコルに基づくAndroid IM研究の1つとして、XMPPとASmackに関する使い方を引き続き紹介します.ここでは主に友人の傍受とチャット情報の傍受を紹介します.友达の傍受に対して私は比较的に多くの工夫を费やして、主にSpackクライアントのソースコードを参考にして、达人が书いたコードは异なって、多くのコードの実现の方式はすべて私が绝えず学ぶ必要があります.Spackクライアントソースのアドレス:http://svn.ig.../repos/spark/
友达の傍受は私がそれを2つの部分に分けて、一部は友达のオンライン、オフラインなどの通知を傍受して、もう一部は友达が“あなたを友达に追加します”の通知を発起することを傍受します.第1部は比較的簡単で、直接コードをつけます:
 
   
   
   
   
  1. Java  
  2.       
  3. @Override        
  4.     public void entriesAdded(Collection address) {        
  5.         for(String jid : address) {        
  6.             RosterEntry entry = XMMPManager.connection.getRoster().getEntry(jid);        
  7.             User user = new User();        
  8.             user.setUser(jid);        
  9.             user.setName(entry.getName());        
  10.             user.setStatus(XMMPManager.connection.getRoster().getPresence(jid));        
  11.             groups.get(0).getUsers().add(user);        
  12.             AppContext.setGroups(groups);        
  13.         }        
  14.         handler.sendEmptyMessage(HandlerMessage.ENTRIESADDED);        
  15.     }        
  16.         
  17.     @Override        
  18.     public void entriesDeleted(Collection address) {        
  19.         for (String jid : address) {        
  20.             RosterEntry entry = XMMPManager.connection.getRoster().getEntry(jid);        
  21.             removeContact(entry);        
  22.             removeContact(getContactByJid(jid), getGroupByUser(jid));        
  23.         }        
  24.         handler.sendEmptyMessage(HandlerMessage.ENTRIESDELETED);        
  25.     }        
  26.         
  27.     @Override        
  28.     public void entriesUpdated(Collection address) {        
  29.         // TODO Auto-generated method stub        
  30.                 
  31.     }        
  32.         
  33.     @Override        
  34.     public void presenceChanged(Presence presence) {        
  35.         Bundle bundle = new Bundle();        
  36.         Log.i(ContactManager.class.getCanonicalName(), presence.getStatus());        
  37.         if (presence.isAway()) {        
  38.             bundle.putString("status", PresenceManager.STATUSAWAY);        
  39.         } else if (presence.isAvailable()) {        
  40.             bundle.putString("status", PresenceManager.STATUSAVAILABLE);        
  41.         }        
  42.         bundle.putString("user", presence.getFrom());        
  43.         Intent intent = new Intent();        
  44.         intent.setAction(CustomAction.ROSTER_STATUS_CHANGED_ACTION);        
  45.         intent.putExtras(bundle);        
  46.         activity.sendBroadcast(intent);        
  47.     }    

具体的には説明しないで、方法名を見れば意味がわかります.presenceChangedは親友状態の変化です.entriesAddedとentriesDeletedは、友達の追加と削除に対応しています.これらの方法を傍受し,インタフェースがオフラインになったり,ユーザの顔が灰色になったり,ユーザリストの総数が減少したりするなど,インタフェースにイベントを送信することにほかならない.
友达の傍受のもう一つの部分は、友达があなたに「友达に追加する」という通知を発起したとき、拒否または受け入れの選択をしてからユーザーに通知し、ユーザー側が選択をしてから戻って、友达を追加または拒否するプロセスを完了することです.これが具体的な考え方で、私の理解はこうです.私のコードを見てください.
 
   
   
   
   
  1. Java  
  2.       
  3. public void addSubscriptionListener() {        
  4.          PacketFilter packetFilter = new PacketTypeFilter(Presence.class);        
  5.          PacketListener subscribeListener = new PacketListener(){        
  6.         
  7.             @Override        
  8.             public void processPacket(Packet packet) {        
  9.                 final Presence presence = (Presence)packet;        
  10.                 if (presence.getType().equals(Presence.Type.subscribe)) {        
  11.                     Message msg = new Message();        
  12.                     msg.what = HandlerMessage.SUBSCRIBE;        
  13.                     String from = presence.getFrom();        
  14.                     Bundle data = new Bundle();        
  15.                     data.putString("from", from);        
  16.                     Log.i(ContactManager.class.getCanonicalName(), "from:"+from);        
  17.                     msg.setData(data);        
  18.                     handler.sendMessage(msg);        
  19.                 } else if (presence.getType().equals(Presence.Type.unsubscribe)) {        
  20.                     Message msg = new Message();        
  21.                     msg.what = HandlerMessage.UNSUBSCRIBE;        
  22.                     String from = presence.getFrom();        
  23.                     Bundle data = new Bundle();        
  24.                     data.putString("from", from);        
  25.                     msg.setData(data);        
  26.                     handler.sendMessage(msg);        
  27.                 }        
  28.                 Log.i(ContactManager.class.getCanonicalName(), "type:" + presence.getType());        
  29.             }        
  30.                      
  31.          };        
  32.          XMMPManager.connection.addPacketListener(subscribeListener, packetFilter);        
  33.     }    

このメソッドはXMPP接続後に呼び出され,最初から友人を傍受していることを示す.
チャット情報の傍受については、主に次の方法を使用します.
 
   
   
   
   
  1. Java  
  2.       
  3. public class MessageListenerEx implements MessageListener {        
  4.         
  5.         @Override        
  6.         public void processMessage(Chat chat, Message message) {        
  7.             Log.i(ChatActivity.class.getCanonicalName(), message.getBody());        
  8.             ChatInfo chatinfo = new ChatInfo();        
  9.             chatinfo.setText(message.getBody());        
  10.             chatinfo.setUserName(StringUtil.getLeftString(message.getFrom(), "@"));        
  11.             chatinfo.setDate(DateUtil.getCreateAt(new Date()));        
  12.             chatinfo.setLayoutId(R.layout.list_say_me_item);        
  13.             chatinfos.add(chatinfo);        
  14.             handler.sendEmptyMessage(RECEIVE);        
  15.         }        
  16.                 
  17.     }    

この方法は,ユーザからのメッセージを絶えず受信することであり,もちろん多くの詳細を処理する必要があるが,ここでは列挙しない.
チャット・オブジェクトとチャット管理クラスを取得し、リスニング・インタフェースを追加します.
 
   
   
   
   
  1. Java  
  2.       
  3. ChatManager chatManager = XMMPManager.connection.getChatManager();        
  4. Chat chat = chatManager.createChat(user, null);        
  5. chatManager.addChatListener(new ChatManagerListenerEx());    

userはチャットのオブジェクトです.次に、リスニングの実装方法を示します.
 
   
   
   
   
  1. Java  
  2.       
  3. public class ChatManagerListenerEx implements ChatManagerListener {        
  4.         
  5.         @Override        
  6.         public void chatCreated(Chat chat, boolean arg1) {        
  7.             chat.addMessageListener(ml);        
  8.         }        
  9.                 
  10.     }    

このようにして、次のメッセージを送信します.
 
   
   
   
   
  1. Java  
  2.       
  3. chat.sendMessage(content);