9
votes

Comment savoir Statut de frappe dans XMPP Openfire à l'aide de Smack

Je développe une application de discussion à l'aide de OpenFire XMPP Server. Je peux envoyer une discussion en texte entre deux utilisateurs. Mais je veux connaître le statut de frappe lorsque quelqu'un saisit un message. J'ai donc créé une classe: - xxx

mais je suis confondre de sorte que ça va marcher? Je sais que j'ai besoin d'un paquet où je peux, dans l'auditeur. Mais je suis incapable de trouver ce paquet.

S'il vous plaît n'importe quel suggère, comment fonctionnera-t-il?

Et aussi quelle est la différence entre Smack et ASMACK?

Merci!


1 commentaires

Veuillez vérifier cette question à Stackoverflow: Stackoverflow.com/Questtions/21154833/...


8 Réponses :


12
votes

Pour activer chatStatelistener Vous devez créer une classe Messagelistener Classe xxx

alors vous créez Messagelistener objet xxx

puis transmettez-le dans la méthode Créer une chat xxx

Quelle est la différence entre Smack et Asmack ? <- <- Vérifiez ce


13 commentaires

Merci Sunil. A l'air bien et m'a donné une solution. Je vérifierai.


Aucun utilisateurIide n'est le Jid de l'autre participant, pas celui qui s'est connecté


merci Sunil. Si vous avez un peu de temps. S'il vous plaît vérifier également Stackoverflow.com/questions/18437329/...


Pour gérer les événements de message, regardez ce Igniteraltime.org/builds / Smack / Docs / Dernières documentaires / ...


J'ai vérifié mais je n'ai pas été statéChaged. plz suggérer


S'il vous plaît vérifier, cela ne fonctionne pas, je suis toujours incapable d'obtenir le statut de taper.


Envoyez-vous l'état de composition de l'autre extrémité?


Sry, j'utilise juste ce code. Je pense que je devrais utiliser FocAronedittText et lorsque l'utilisateur tapera l'utilisateur, il enverra un statut composant. Avez-vous un exemple?


Laissez-nous Continuer cette discussion en chat


@Sunilmishra Obtenir une erreur sur chat Newchat = chatmanager.createchat (jabber_id_of_friend, messagelistener) ;. Pouvez-vous expliquer cette ligne? Il affiche la ligne rouge avec erreur ne peut pas faire référence statique à la méthode non statique Createchat (String, Messagelistener) à partir du type Chatmanager


@get Createchat n'est pas une méthode statique, vous avez besoin d'une instance de ChatManager pour invoquer cette méthode


Cela n'a pas fonctionné sur Openfire. Notification de type BESOIN XEP-0085: notifications d'état de discussion, mais la dose OpenFire ne possède pas ce XEP. Toute autre suggestion sauf changer Openfire?


Sa ne fonctionne aucune autre solution pour obtenir l'état de l'utilisateur.



5
votes

Enfin j'ai eu la solution. J'ai besoin d'utiliser un auditeur de discussion avec le gestionnaire de discussion et je dois également utiliser dans la fonction Construit SendComposingNotification . Pas besoin d'utiliser une interface de messageEventReQuestLisTener ou toute autre classe personnalisée pour cela. J'ai ajouté les lignes suivantes, xxx

et devez également envoyer une notification comme celle-ci .. xxx

où Mem est le type de messageEventManger. Ref: http: //www.igniteraltime .org / Builds / Smack / Docs / Derniers / Javadoc / Org / JiveSoftware / Smackx / MessageEventManager.html


4 commentaires

salut j'ai essayé au-dessus ..mais ne fonctionne pas! Voici mon code! Toute aide sera appréciée ... Message msg1 = nouveau message (à, message.type.chat); msg1.setfrom ("user1@192.168.0.98"); // mon identifiant MessageEventManager Event = New MessageEventManager (connexion); // ID de destinataire Event.SendCosingNotification ("Tech1@192.168.0.98", msg1.ge TPacketide ());


@Aserez, vous devez traiter le message reçu dans le ProcessMessage () , car il reçoit tous les paquets entrants, non seulement le statut typing . Il peut être fait une pause, des paquets d'état hors ligne / en ligne, ou des messages .. Alors essayez de le traiter, puis de le gérer ..


Salut. J'ai essayé de la même chose, mais cela n'a pas fonctionné pour moi..Ce ni envoi de notification de composition ne la recevait pas. me donne NULL à la réception et pendant le reçu de iOS. Aidez-moi à découvrir cela. Merci.


FYI: fusionné de


2
votes
ChatManager chatManager = ChatManager.getInstanceFor(connection);
Chat chat= chatManager.createChat(to, new ChatStateListener() {
      @Override
      public void stateChanged(Chat chat, ChatState state) {
                switch (state){
                        case active:
                             Log.d("state","active");
                             break;
                        case composing:
                             Log.d("state","composing");
                             break;
                        case paused:
                             Log.d("state","paused");
                             break;
                        case inactive:
                             Log.d("state","inactive");
                             break;
                        case gone:
                             Log.d("state","gone");
                             break;
                 }
        }

        @Override
        public void processMessage(Chat chat, Message message) {
               Log.d("processMessage","processMessage");
        }
});
use this code.hope so will work

8 commentaires

Bonjour, Ameanali Momin, pouvez-vous s'il vous plaît laissez-moi savoir scénario exact à votre fin. et quel type d'erreur vous êtes confronté au XMPP. Pour plus d'informations Message M sur Skype @ Piyush.gupta326. Ensuite, nous pouvons en discuter davantage, votre problème et j'espère atteindre le point de réussite.


Je ne reçois aucune erreur, mais quand je démarre, le code Tyoping n'entre pas dans aucun état, je veux dire StatChanGangelistener non appelé.


Hey Man, avez-vous lu cette doc xmpp.org/extensions/xep-0085.htmlle_/a >


C'est une théorie complètement et non intéressante dès maintenant, car la plupart des choses sont assez claires en utilisant le client de discussion.


Je voulais dire, veuillez lire la documentation dans ce lien. J'espère que vous trouverez la solution là-bas. sinon, nous pouvons discuter de la même chose ici.


Dois-je devoir ajouter quelque chose en envoyant un message?


Laissez-nous Continuer cette discussion dans chat .


C'était mon erreur que je n'envoie pas l'état de composition lorsque l'utilisateur commence à taper et à envoyer un autre statut lors de l'arrêt de la frappe. Mais ChatState Auditeur que vous avez mentionné est perfacte.



1
votes

J'utilise l'auditeur de l'état de discussion:

public class ChatStateChangedListener implements ChatStateListener {

    public ChatStateChangedListener() {
        printLog("Chat State Changed Listner Constructor");
    }

    @Override
    public void processMessage(Chat arg0, Message arg1) {

    }


    @Override
    public void stateChanged(Chat chat, ChatState state) {

        if (state.toString().equals(ChatState.composing.toString())) {
                tvLastSeen.setText("Typing...");
            } else if (state.toString().equals(ChatState.paused.toString())) {
                tvLastSeen.setText("paused...");
            } else {
                tvLastSeen.setText("nothing");
            }

        }


    }

}


1 commentaires

FYI: fusionné de

Créer sur la classe MMessagelistener Pour écouter les messages entrants forts>

Classe privée MMESSAGELISTENER implémente Messagelistener, ChatStatelistener { P>

    public MMessageListener(Context contxt) {
    }


    @Override
    public void stateChanged(Chat chat, ChatState chatState) {

        mStatus = "Online";

        if (ChatState.composing.equals(chatState)) {

            mStatus = chat.getParticipant() + " is typing..";
            Log.d("Chat State", chat.getParticipant() + " is typing..");
        } else if (ChatState.gone.equals(chatState)) {
            Log.d("Chat State", chat.getParticipant() + " has left the conversation.");
            mStatus = chat.getParticipant() + " has left the conversation.";
        } else if (ChatState.paused.equals(chatState)){
            Log.d("Chat State", chat.getParticipant() + ": " + chatState.name());
            mStatus = "Paused";
        }else if (ChatState.active.equals(chatState)){
            mStatus = "Online";
        }

        // do whatever you want to do once you receive status


    }


    @Override
    public void processMessage(Message message) {

    }

    @Override
    public void processMessage(Chat chat, Message message) {


    }
}



0
votes

Cependant, vous pouvez également l'obtenir de processpacket. Là, vous obtiendrez un objet de message, après que vous puissiez extraire une partie XML à partir de là et les gérer sa contiennent de la discussion spécifique ou non.

    Message message = (Message) packet;
    String msg_xml = message.toXML().toString();

    if (msg_xml.contains(ChatState.composing.toString())) {
        //handle is-typing, probably some indication on screen
    } else if (msg_xml.contains(ChatState.paused.toString())) {
        // handle "stopped typing"
    } else {
       // normal msg
    }


0 commentaires