2015-11-02 7 views
1

Я хочу отправить составное событие в групповой (многопользовательский) чат в xmpp, я использую библиотеку asmack, у меня была такая же функциональность с чатом One to One.Как отправить состав/набирать (состояние чата) в многопользовательском чате/групповом чате и чатах один на один в xmpp android?

Я использую ниже код:

mMessageEventManager = new MessageEventManager(XMPPConnectApplication.getInstance().getXmppConnection()); 

       mMessageEventManager.addMessageEventNotificationListener(new MessageEventNotificationListener() { 

        @Override 
        public void offlineNotification(String arg0, String arg1) { 

        } 

        @Override 
        public void displayedNotification(String arg0, String arg1) { 

        } 

        @Override 
        public void deliveredNotification(String arg0, String arg1) { 

        } 

        @Override 
        public void composingNotification(String from, String to) { 
         Log.e("Receiver-composingNotification",from + " is started typing......"+to); 

        } 

        @Override 
        public void cancelledNotification(String from, String to) { 
         Log.e("Receiver-cancelledNotification",from + " is stopped typing......"+to); 

        } 
       }); 

Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи для того же.

Любая помощь будет оценена по достоинству.

ответ

5

Да, у меня есть идея об этом, и я сделал это только до 1 недели.

enter image description here

Я использовал MessageEventManager в управлять чат государства.

private MessageEventManager mMessageEventManager; 

Добавить этот метод для чата государства Принимающей Слушатель:

private void chatStateRecognizer(){ 

     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       mMessageEventManager = new MessageEventManager(mXmppConnection); 

       mMessageEventManager.addMessageEventNotificationListener(new MessageEventNotificationListener() { 

        @Override 
        public void offlineNotification(String arg0, String arg1) { 

        } 

        @Override 
        public void displayedNotification(String arg0, String arg1) { 

        } 

        @Override 
        public void deliveredNotification(String from, String arg1) { 
        } 

        @Override 
        public void composingNotification(String from, String to) { 
         Log.i("Receiver:Compose state",from + " is started typing......"+to); 
        } 

        @Override 
        public void cancelledNotification(String from, String to) { 
         Log.i("Receiver:Stop state",from + " is stopped typing......"+to); 

        } 
       }); 
      } 
     }); 

     thread.start(); 
    } 

Создать имя класса один Модель с GroupInfoModel.java:

public class GroupInfoModel implements Comparable<GroupInfoModel>, Serializable{ 

    private static final long serialVersionUID = 1L; 
    private String memberId = "", memberName = ""; 
    private boolean isAdmin; 
    public String getMemberId() { 
     return memberId; 
    } 
    public void setMemberId(String memberId) { 
     this.memberId = memberId; 
    } 
    public String getMemberName() { 
     return memberName; 
    } 
    public void setMemberName(String memberName) { 
     this.memberName = memberName; 
    } 
    public boolean isAdmin() { 
     return isAdmin; 
    } 
    public void setAdmin(boolean isAdmin) { 
     this.isAdmin = isAdmin; 
    } 
    @Override 
    public int compareTo(GroupInfoModel another) { 
     return getMemberName().compareTo(another.getMemberName()); 
    } 
} 

Теперь возьмите ArrayList из GroupInfoMo del.java класс:

private ArrayList<GroupInfoModel> groupDetailsList = new ArrayList<GroupInfoModel>(); 

private boolean isComposingStarted; 

на OnCreate() из активности/Фрагмент:

groupDetailsList.clear(); 
ServiceDiscoveryManager discoManager = ServiceDiscoveryManager.getInstanceFor(mXmppConnection); 
DiscoverItems items = discoManager.discoverItems(mRoomId); 
    for (Iterator<Item> it = items.getItems(); it.hasNext();) { 
     DiscoverItems.Item item = (DiscoverItems.Item) it.next(); 
     String occupant = item.getEntityID(); 
     occupant = occupant.split("/")[1]; 
     GroupInfoModel groupInfoModel = new GroupInfoModel(); 
     groupInfoModel.setAdmin(false); 
     groupInfoModel.setMemberId(occupant+"@"+mServiceNameHere); 
     groupInfoModel.setMemberName(occupant); 
     groupDetailsList.add(groupInfoModel); 
    } 

Добавить TextWatcher на вашем EditText из Compose Message (Просмотр в чате) scre ан:

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if(s.toString().length()==1&&!isComposingStarted){ 
     isComposingStarted = true; 
     if(chatType.equals("OneToOneChat")){ 
      mMessageEventManager.sendComposingNotification(myJabberId, friendJabberId); 
     }else if(chatType.equals("GroupChat")){ 
      for (int i = 0; i < groupDetailsList.size(); i++) { 
      if(!groupDetailsList.get(i).getMemberId().contains(myJabberId)){ 
       mMessageEventManager.sendComposingNotification(groupDetailsList.get(i).getMemberId(), roomId);  
      } 
      } 
     } 
    }else if(s.toString().length()==0){ 
     isComposingStarted = false; 
     if(chatType.equals("OneToOneChat")){ 
      mMessageEventManager.sendCancelledNotification(myJabberId, friendJabberId); 
     }else if(chatType.equals("GroupChat")){ 
      for (int i = 0; i < groupDetailsList.size(); i++) { 
       if(!groupDetailsList.get(i).getMemberId().contains(myJabberId)){ 
       mMessageEventManager.sendCancelledNotification(groupDetailsList.get(i).getMemberId(), roomId); 
       } 
      } 
     } 
    } 
} 

Я настоятельно рекомендуется, которые используют выше код в Применениекласса, вы можете изменить методы, как ваши требования.

Выполнено.

+0

Спасибо. работающ отлично. –

+0

Рад помочь вам. –

+0

Я сделал то же самое, но не отправил или не получил статус составления для любого ..пожалуйста, помогите мне найти решение ... – Kutbi

1
// send multi user chat typing status 
public static void sendMUCTypingStatus(ChatState state) 
{ 
// check if you are connected to group 
if(multiUserChat != null) 
{ 
    try{ 
     // create packet 
     Message statusPacket = new Message(); 
     // set body to null 
     statusPacket.setBody(null); 
     // set packet type to group chat 
     statusPacket.setType(Message.Type.groupchat); 
     // set subject to null 
     statusPacket.setSubject(null); 
     // set to the group name 
     statusPacket.setTo(multiUserChat.getRoom()); 
     // set from my current jis example : [email protected] 
     statusPacket.setFrom(new MyPrefrence(XmppBase.context).getUsername()); 
     // get the chat state extension and pass our state 
     ChatStateExtension extension = new ChatStateExtension(state); 
     // add the extention to our packet 
     statusPacket.addExtension(extension); 
     // get the connection and send the packet 
     Utils.getConnection().sendStanza(statusPacket); 
    } catch (SmackException.NotConnectedException e) { 
     e.printStackTrace(); 
    } 
} 
} 

Использование:

sendMucTypingStatus(ChatState.composing); 

смотреть это: Quick overview of using

0

С RxJava и Jake Wharton's RxBinding, это довольно просто сделать:

RxTextView.afterTextChangeEvents(editText) 
    .observeOn(Schedulers.io()) 
    .skip(1) 
    .map({ input -> 
     // FIRE ChatState.composing EVENT HERE 
     input // just returning the argument here 
    }) 
    .debounce(2, TimeUnit.SECONDS) 
    .observeOn(Schedulers.io()) 
    .subscribe { 
     // FIRE ChatState.active EVENT HERE 
    } 

Помните, что нам нужно будет написать код, чтобы поймать эти события через smack stanzaListener и отобразить его в пользовательском интерфейсе соответственно!

Код написан в Котлине, но он довольно прямолинейный.

 Смежные вопросы

  • Нет связанных вопросов^_^