当前位置: 首页 > 知识库问答 >
问题:

android firebase一对一聊天应用程序

南门鸿畴
2023-03-14

我尝试使用mvp开发一对一的聊天应用程序,当应用程序第一次运行时,聊天工作正常,消息发送给用户。问题是,当我尝试注册另一个帐户并尝试发送消息时,firebase创建了两个不同的聊天室,但我无法获得消息,因为第二个用户没有检测到聊天室已经创建并创建了另一个聊天室,请帮助我?这是我试图发送消息的代码:

最终字符串room_type_1=chat.getSenderUID()+“_”+chat.getReceiverUID();最终字符串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获得消息的代码

public void getMessageFromFirebaseUser(最终上下文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());
        }
    });

}

.

共有1个答案

党浩阔
2023-03-14

这个问题最简单的解决方案是创建聊天室,将用户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;
}

下面是firebase聊天应用程序的示例实现

 类似资料:
  • 问题内容: 我想知道为数千名用户编写聊天应用程序的正确方法是什么。 我只是感到困惑,我如何才能每秒使用AJAX或更少的方法来对服务器执行ping操作,并检查MySQL中是否有新记录等,并且服务器负载可以接受。 我目前正在考虑使用jQuery,PHP和MySQL进行编码。 请指教。您的帮助将不胜感激。 问题答案: 客户端 对于需要轮询服务器的任何程序,我建议使用WebSockets。 我写了一个非常

  • 我正在使用XMPP在app引擎上编写一个聊天应用程序。我的想法是允许用户互相聊天。我可以将消息发送到google talk帐户,方法是将登录的用户删除地址的@gmail.com部分,并将其替换为@appid.appspotchat.com)。例如,如果登录的用户是bob@gmail.com,则用于发送的jid将是bob@appid.appspotchat.com)。然后,您可以将消息发送到goog

  • 现在我们已经熟悉了Socket.IO,让我们编写一个聊天应用程序,我们可以用它在不同的聊天室聊天。 我们将允许用户选择用户名并允许他们使用它们进行聊天。 首先,让我们设置我们的HTML文件来请求用户名 - <!DOCTYPE html> <html> <head> <title>Hello world</title> </head> <script src = "/s

  • 我用firebase实时数据库和firebase身份验证方法创建了这个聊天应用程序,但我真的很困惑,我不知道如何在聊天应用程序中获得用户的最后一次露面。 下面是我在onCreate medthod中尝试的代码。 任何想法或替代方法都将不胜感激。

  • 本文向大家介绍Android实现一对一蓝牙聊天APP,包括了Android实现一对一蓝牙聊天APP的使用技巧和注意事项,需要的朋友参考一下 学习了,三天的Android 蓝牙开发,开始是一头雾水,看着别人讲的Google官方的demo感觉很容易,所有自己也尝试写一个很简单的聊天demo.可是想的很简单,自己做起来也花了,将近一天的时间才搞定这个基本的流程设计.下面是几点心得后面再贴代码 1)写一个

  • 事情是这样的: 我已经和离子电容进行了一对一的私聊,在云火商店里保存消息。到目前为止,它工作得很好。两个用户都可以发送和接收消息。另一方面,我使用FCM(Firebase Cloud Messaging)根据Capability的官方文档(https://capacitorjs.com/docs/guides/push-notifications-firebase)进行了推送通知,并且从Fireb