2017-06-14 3 views
-1

Je crée une application de discussion en utilisant Smack XMPP. Tout fonctionne bien sauf les rapports Lire/Livrer.Envoyer Message.Type.normal dans smack XMPP android

Voilà comment je vous envoie le rapport de livraison:

{ 
    Message message = new Message(); 
    message.setTo(chatMessage.getReceiver()); 
    message.setType(Message.Type.normal); 
    message.setFrom(chatMessage.getSender()); 
    message.setStanzaId(chatMessage.getReceiver() + "_" + CommonMethods.getCurrentGMTTime(0)); 

    ChatMarker_File_XMPP_SERVER chatMarker_file_xmpp_server=new ChatMarker_File_XMPP_SERVER("received","urn:xmpp:chat-markers:0" , true); 
    chatMarker_file_xmpp_server.setIdValue(chatMessage.getMsgid()); 
    message.addExtension(chatMarker_file_xmpp_server); 
    Mychat = ChatManager.getInstanceFor(connection).createChat(
      message.getTo() + "@" 
        + context.getString(R.string.server), 
      mMessageListener); 
    try { 
     if (connection.isAuthenticated()) { 
      /******************************************************** 
      * ******** MESSAGE SEND  ********************** 
      ***/ 

      Mychat.sendMessage(message); 

     } else { 

      login(); 
     } 
    } catch (SmackException.NotConnectedException e) { 
     Log.e("xmpp.SendMessage()", "msg Not sent!-Not Connected!"); 

    } catch (Exception e) { 
     Log.e("SendMessage()-Exception", 
       "msg Not sent!" + e.getMessage()); 
    } 

} 

Mais la question est Mychat.sendMessage(message); la méthode SendMessage fait ce

/** 
    * Sends a message to the other chat participant. The thread ID, recipient, 
    * and message type of the message will automatically set to those of this chat. 
    * 
    * @param message the message to send. 
    * @throws NotConnectedException 
    */ 
    public void sendMessage(Message message) throws NotConnectedException { 
     // Force the recipient, message type, and thread ID since the user elected 
     // to send the message through this chat object. 
     message.setTo(participant); 
     message.setType(Message.Type.chat); 
     message.setThread(threadID); 
     chatManager.sendMessage(this, message); 
    } 

Maintenant, même si je suis en train explicitement « messageType » à la « normale 'mais le' sendMessage() 'le convertit encore en Type.Chat.

J'ai vérifié les autres méthodes et docs possibles de sorte que je puisse en quelque sorte envoyer un message avec Type normal mais n'a rien trouvé.

Merci

Répondre

2

Pourquoi ne pas utiliser Accusé de réception Delivery Manager ??

Lors de l'envoi un message:

Message message = new Message(); 
String deliveryReceiptId = DeliveryReceiptRequest.addTo(message); 
message.setType(Message.Type.chat); 

Et vous pouvez recevoir la livraison ackknowledgement comme ci-dessous ..

DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedListener(new ReceiptReceivedListener() { 
        @Override 
        public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) { 
         //here receiptId will be same as deliveryReceiptId u sent above which means msg is delivered to recipient 
        } 
       }); 
      } 

et si vous voulez un message envoyé à l'état du serveur u peut vérifier ma réponse ici: https://stackoverflow.com/a/44254615/6350239

et pour l'implémentation de l'état de lecture msg vous devez implémenter votre ticket de lecture personnalisé comme ceci https://stackoverflow.com/a/29001653/6350239