android firebase一对一聊天应用程序 [英] android firebase one to one chat application

查看:142
本文介绍了android firebase一对一聊天应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用mvp开发一对一聊天应用程序 当应用程序首次运行时,聊天正常进行,并将消息发送给用户. 问题是当我尝试注册另一个帐户并尝试发送消息时,firebase创建了两个不同的聊天室,而我无法收到消息,因为第二个用户未检测到已经创建了一个聊天室并创建了另一个 cn你能帮我吗? 这是我尝试发送消息的代码:

i try to develop one to one chat application using mvp when the application run for the first time the chat works correctly and messsges are sent to users . the problem is when i try to register with another account and try to send messages firebase creates two different chat rooms and i can't get messages because the second user didn't detect that a chat room has been created and create an other one cn you help me please ?? This the code where i try to send message:

最终字符串room_type_1 = chat.getSenderUid()+"_" + chat.getReceiverUid(); 最终字符串room_type_2 = chat.getReceiverUid()+"_" + chat.getSenderUid();

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());
        }
    });
}

这是我从Firebase接收消息的代码

and this is the code where i get message from firebase

public void getMessageFromFirebaseUser(最终上下文上下文,字符串senderUid,字符串receiverUid,最终ChatFragmentListener chatFragmentListener){

public void getMessageFromFirebaseUser(final Context context, 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());
        }
    });

}

.

推荐答案

此问题的最简单解决方案是通过将用户uuid升序或降序排列来创建聊天室.

Simplest solution for this problem is create chat room by arranging both the user uuid in ascending or descending order.

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;
}

这里是Firebase聊天应用程序的示例实现

Here is sample implementation of firebase chat app

这篇关于android firebase一对一聊天应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆