无法从其他用户FirebaseDatabase获取消息

时间:2019-05-15 16:51:40

标签: firebase firebase-realtime-database kotlin firebase-authentication

这是一个简单的聊天消息应用程序,使用Firebase实时数据库和身份验证。我已经成功创建了数据库,但是无法将消息从一个用户获取到另一个用户。因为,当我发送消息/单击“发送”按钮时,它会创建不同的节点,因此我认为它是名称中带有引号的字符串节点。我创建的节点结构是用户消息-> fromId(当前用户uid)-> toUid(向其发送消息)。

为使解释更清楚,这是发生的情况的屏幕截图。 This is when I send message from the first user. Send message from the second user.

我认为问题是,它使用“ uid”(即字符串)创建了不同的节点。因此,数据库有两个节点,一个带有“ ...”,另一个是正常的。对于某些信息,我使用一些库,例如Picasso图像加载,分组和包裹。

这是ChatLogActivity的源代码

import...

class ChatLogActivity : AppCompatActivity() {

companion object {
    val TAG = "ChatLog"
}

val adapter = GroupAdapter<ViewHolder>()
var toUser: User? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_chat_log)
    recyclerview_chat_log.adapter = adapter
    toUser = intent.getParcelableExtra(NewMessageActivity.USER_KEY)
    titleChatLog.text = toUser?.nama

    listenForMessages()
    arrowBack.setOnClickListener {
        finish()
    }

    send_button_chat_log.setOnClickListener {
        Log.d(TAG, "Attempt to send message.....")
        performSendMessage()
    }
}

private fun listenForMessages() {
    val fromId = FirebaseAuth.getInstance().uid
    val toId = toUser?.uid
    val ref = FirebaseDatabase.getInstance().getReference("/user-messages/$fromId/$toId")
    ref.addChildEventListener(object : ChildEventListener {
        override fun onChildAdded(p0: DataSnapshot, p1: String?) {
            val chatMessage = p0.getValue(ChatMessage::class.java)
            if (chatMessage != null) {
                Log.d(TAG, chatMessage.text)
                if (chatMessage.fromId == FirebaseAuth.getInstance().uid) {
                    val currentUser = LatestMessageActivity.currentUser?: return
                    adapter.add(ChatFromItem(chatMessage.text, currentUser))
                } else {
                    adapter.add(ChatToItem(chatMessage.text, toUser!!))
                }
            }
        }

        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onChildChanged(p0: DataSnapshot, p1: String?) {

        }

        override fun onChildMoved(p0: DataSnapshot, p1: String?) {

        }

        override fun onChildRemoved(p0: DataSnapshot) {

        }
    })
}

private fun performSendMessage() {
    val text = edittext_chat_log.text.toString()
    val fromId = FirebaseAuth.getInstance().uid
    val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY)
    val toId = user.uid
    val ref = FirebaseDatabase.getInstance().getReference("/user-messages/$fromId/$toId").push()
    val toRef = FirebaseDatabase.getInstance().getReference("/user-messages/$toId/$fromId ").push()
    if (fromId == null) return

    val chatMessage = ChatMessage(ref.key!!, text, fromId, toId, System.currentTimeMillis() / 1000)
    ref.setValue(chatMessage)
        .addOnSuccessListener {
            Log.d(TAG, "Save our chat message: ${ref.key}")
            edittext_chat_log.text.clear()
            recyclerview_chat_log.scrollToPosition(adapter.itemCount - 1)
        }
    toRef.setValue(chatMessage)
}
}

class ChatFromItem(val text: String, val user: User) : Item<ViewHolder>() {
override fun getLayout(): Int {
    return R.layout.chat_from_row
}

override fun bind(viewHolder: ViewHolder, position: Int) {
    val uri = user.profileImageUrl
    val targetImageView = viewHolder.itemView.imageViewFrom
    Picasso.get().load(uri).into(targetImageView)
    viewHolder.itemView.textViewFrom.text = text
}
}

class ChatToItem(val text: String, val user: User) : Item<ViewHolder>() {
override fun getLayout(): Int {
    return R.layout.chat_to_row
}

override fun bind(viewHolder: ViewHolder, position: Int) {
    val uri = user.profileImageUrl
    val targetImageView = viewHolder.itemView.imageViewTo
    Picasso.get().load(uri).into(targetImageView)
    viewHolder.itemView.textViewTo.text = text
}
}

这是ChatMessage,用于存储消息的类。

class ChatMessage(val id:String, val text: String, val fromId: String, val toId: String, val timeStamp: Long) {
constructor(): this("", "", "", "", -1)
}

很高兴有人能帮助解决这个问题。谢谢

0 个答案:

没有答案