2017-03-29 313 views
0

我嘗試使用mvp 開發一對一聊天應用程序,當應用程序第一次運行時,聊天工作正常,並向用戶發送messsges。 問題是,當我嘗試註冊另一個帳戶並嘗試發送消息時,Firebase創建了兩個不同的聊天室,我無法獲取消息,因爲第二個用戶未檢測到聊天室已創建並創建另一個聊天室 cn你幫我嗎? 這是我嘗試發送消息的代碼:android firebase一對一聊天應用程序

final String room_type_1 = chat.getSenderUid()+「_」+ chat.getReceiverUid(); final String 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()); 
     } 
    }); 
} 

,這是其中i得到火力

公共無效getMessageFromFirebaseUser(最終語境上下文,字符串senderUid,字符串receiverUid,最終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()); 
     } 
    }); 

} 

消息的代碼。

回答

0

這個問題的最簡單的解決方案是創建聊天室,通過安排用戶uuid在升序或降序。

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是火力聊天應用

的樣本實現