2017-03-29 3 views
0

Ich versuche, eins zu eins Chat-Anwendung mit mvp zu entwickeln, wenn die Anwendung zum ersten Mal den Chat funktioniert ordnungsgemäß ausgeführt und messsges an Benutzer gesendet werden. Das Problem ist, wenn ich versuche, mit einem anderen Konto zu registrieren und Nachrichten zu senden Firebase erstellt zwei verschiedene Chat-Räume und ich kann keine Nachrichten erhalten, weil der zweite Benutzer nicht erkannt, dass ein Chat-Raum erstellt wurde und erstellen Sie einen anderen cn Sie mir bitte helfen ?? Dies ist der Code, wo ich versuche, eine Nachricht zu senden:android Firebase eins zu eins Chat-Anwendung

final Zeichenfolge room_type_1 = chat.getSenderUid() + "_" + chat.getReceiverUid(); letzte Zeichenfolge room_type_2 = chat.getReceiverUid() + "_" + chat.getSenderUid();

final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(); 

    databaseReference.child(Constants.ARG_CHAT_ROOMS).getRef().addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.hasChild(room_type_1)) { 
       Log.e(TAG, "sendMessageToFirebaseUser: " + room_type_1 + " exists"); 
       databaseReference.child(Constants.ARG_CHAT_ROOMS).child(room_type_1).child(String.valueOf(chat.getTimestamp())).setValue(chat); 
      } else if (dataSnapshot.hasChild(room_type_2)) { 
       Log.e(TAG, "sendMessageToFirebaseUser: " + room_type_2 + " exists"); 
       databaseReference.child(Constants.ARG_CHAT_ROOMS).child(room_type_2).child(String.valueOf(chat.getTimestamp())).setValue(chat); 

      } else { 
       Log.e(TAG, "sendMessageToFirebaseUser: success"); 
       Log.e("sender uis",""+chat.getSenderUid()); 
       Log.e("srevier uis",""+chat.getSenderUid()); 
       databaseReference.child(Constants.ARG_CHAT_ROOMS).child(room_type_1).child(String.valueOf(chat.getTimestamp())).setValue(chat); 
       getMessageFromFirebaseUser(chat.getSenderUid(), chat.getReceiverUid()); 

      } 

      sendPushNotificationToReceiver(chat.sender, 
        chat.message, 
        chat.senderUid, 
        new SharedPrefUtil(context).getString(Constants.ARG_FIREBASE_TOKEN), 
        receiverFirebaseToken); 
      mOnSendMessageListener.onSendMessageSuccess(); 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      mOnSendMessageListener.onSendMessageFailure("Unable to send message: " + databaseError.getMessage()); 
     } 
    }); 
} 

und dies ist der Code, wo ich Nachricht erhalten von Feuerbasis

public void getMessageFromFirebaseUser (final Context Kontext, String senderUid, String receiverUid, final ChatFragmentListener chatFragmentListener) {

final String room_type_1 = senderUid + "_" + receiverUid; 
    final String room_type_2 = receiverUid + "_" + senderUid; 


    final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(); 

    final DatabaseReference databaseChats = FirebaseDatabase.getInstance().getReference().child(Constants.ARG_CHAT_ROOMS); 
    databaseChats.keepSynced(true); 


    databaseReference.child(Constants.ARG_CHAT_ROOMS).getRef().addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.hasChild(room_type_1)) { 
       Log.e(TAG, "getMessageFromFirebaseUser: " + room_type_1 + " exists"); 

       FirebaseDatabase.getInstance() 
         .getReference() 
         .child(Constants.ARG_CHAT_ROOMS) 
         .child(room_type_1).addChildEventListener(new ChildEventListener() { 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

         if (dataSnapshot.getKey() != s) { 
          Chat chat = new Chat(); 
          chat = dataSnapshot.getValue(Chat.class); 
          chatFragmentListener.onGetMessagesSuccess(chat); 

          Log.e("1", "get"); 
         } 


         // do something here 


        } 

        @Override 
        public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
          /* Log.e("childadded","eeeee"+s); 
           Log.e("chilchanged","ee"+dataSnapshot.getKey()); 
           Chat chat=dataSnapshot.getValue(Chat.class); 
           String key=dataSnapshot.getKey(); 
           if(!key.equals(s)){chats.add(chat);}*/ 

        } 

        @Override 
        public void onChildRemoved(DataSnapshot dataSnapshot) { 


        } 

        @Override 
        public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
           /* Log.e("childadded","eeeee"+s); 
           Log.e("childmoved","ee"+dataSnapshot.getKey()); 
           Chat chat=dataSnapshot.getValue(Chat.class); 
           String key=dataSnapshot.getKey(); 
           if(key.equals(s)){chats.remove(chat);}*/ 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 
         // lll 
         chatFragmentListener.onGetMessagesFailure("Unable to get message: " + databaseError.getMessage()); 
        } 
       }); 

      } else if (dataSnapshot.hasChild(room_type_2)) { 
       Log.e(TAG, "getMessageFromFirebaseUser: " + room_type_2 + " exists"); 

       FirebaseDatabase.getInstance() 
         .getReference() 
         .child(Constants.ARG_CHAT_ROOMS) 
         .child(room_type_2).addChildEventListener(new ChildEventListener() { 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
         Chat chat = new Chat(); 
         chat = dataSnapshot.getValue(Chat.class); 
         chatFragmentListener.onGetMessagesSuccess(chat); 
         Log.e("2", "get"); 
        } 

        @Override 
        public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

        } 

        @Override 
        public void onChildRemoved(DataSnapshot dataSnapshot) { 

        } 

        @Override 
        public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 
         chatFragmentListener.onGetMessagesFailure("Unable to get message: " + databaseError.getMessage()); 
        } 
       }); 


      } else { 
       Log.e(TAG, "getMessageFromFirebaseUser: no such room available"); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      chatFragmentListener.onGetMessagesFailure("Unable to get message: " + databaseError.getMessage()); 
     } 
    }); 

} 

.

Antwort

0

Die einfachste Lösung für dieses Problem ist das Erstellen eines Chatrooms, indem die Benutzer-UUID in aufsteigender oder absteigender Reihenfolge angeordnet wird.

public String getChatRoom(String fromUserId,String toMessageId){ 

      String chatRoom; 

      if(fromUserId.compareTo(toMessageId) < 0){ 
       // ToMessageId has less alphabetic order then fromUserId 
       chatRoom = toMessageId+" "+fromUserId; 
      }else{ 
       chatRoom = fromUserId+" "+toMessageId; 
      } 
      return chatRoom; 
} 

Here ist Beispielimplementierung von Feuerbasis Chat-Anwendung