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

如何发送图像时,用户离线就像聊天应用程序与Firebase的短信?

邢新
2023-03-14

所以Firebase具有离线功能。

因此,每当我发送任何文本消息时,只要我单击“发送”,它就会显示在我的设备上。它就像一个符咒。

我的问题是,当我尝试发送图像时,情况不一样。即使我在线,图像也会首先上传到Firebase存储。然后图像url将被存储到firebase数据库中。在那之后,它被展示给我看。这需要时间,具体取决于文件大小。我一发送图像并在后台上传,是否就可以在设备上显示图像?

我有一个适配器类,在recyclerView中检索数据。

以下是我如何将图像添加到视图中(这是在adapter类中):

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    switch (holder.getItemViewType()){
        case 1:
            //for text messages
            ViewHolder1 viewHolder1 = (ViewHolder1)holder;
            viewHolder1.Text.setText(messageList.get(position).getMessage());
            break;

        case 2:
            //for images
            ViewHolder2 viewHolder2 = (ViewHolder2)holder;
            Glide.with(viewHolder2.Image.getContext())
                    .load(messageList.get(position).getMessage())
                    .crossFade()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(viewHolder2.Image);
            break;
    }
}

这是我上传它的方式(这是在聊天活动课上):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == CHOOSE_IMAGE && resultCode == Activity.RESULT_OK && data!=null && data.getData()!=null){
        uriProfileImage = data.getData();
        final StorageReference profileImageRef = FirebaseStorage.getInstance().getReference("message/"+System.currentTimeMillis()+"jpg");
        if (uriProfileImage!=null){
            profileImageRef.putFile(uriProfileImage).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    profileImageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            Uri downloadUrl = uri;
                            profileImageUrl = downloadUrl.toString();

                            Map messageMap = new HashMap();
                            messageMap.put("Message", profileImageUrl);
                            messageMap.put("Type", 2);

                            Map messageUserMap = new HashMap();
                            messageUserMap.put(user_ref+"/"+push_id,messageMap);

                            mRootRef.updateChildren(messageUserMap, new DatabaseReference.CompletionListener() {
                                @Override
                                public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
                                    if (databaseError!=null){

                                    }
                                }
                            });
                        }
                    });
                }
            })

                    });
        }


    }
}

希望我清楚。任何帮助都将不胜感激。

共有1个答案

何浩荡
2023-03-14

当用户选择要上传的图像时,您可以同时执行两个操作。首先,开始上传到存储器,然后,获取图像并将其添加到视图中。

然后,您可以立即向用户提供反馈并显示图像,而无需首先往返于服务器。

 类似资料:
  • 我正在开发一款使用Firebase实时数据库和存储的聊天应用程序。 目前我使用这种方法发送和接收图像: 在“发送”按钮上单击:图库的意图 问题是高质量的图像超过1MB。一旦它们被发送,应用程序在滚动聊天时会变得非常慢,然后一些图像会从ImageView中消失。 有没有办法让图像检索更顺畅、更快?

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

  • 我正在尝试使用node.js、socket.io和express制作一个简单的聊天应用程序。但是,如果我单击main.jade文件中的send按钮,页面会刷新,并且不会出现任何消息。我在Firebug中也遇到这个错误: 加载页面时,与ws:/127.0.0.1:3000/socket.io/?eio=2&transport=websocket&sid=d_hnmpdxhed-j7lraaah的连接

  • 我希望基本上在我的应用程序内翻拍Kik。对于我在firebase聊天应用程序上看到的大多数指南,都有一个主要的消息节点,然后在该节点下面有一个扇出,每个用户都有引用主列表中消息的消息。 根据目前我的Firebase的布局方式,实现类似以下内容会更容易: 因此,当用户向对方发送消息时,我会更新发送者和用户下面的“聊天消息”节点。 有什么理由不这样做吗?我看到每个人都按照我描述的第一种方式进行,但我看

  • 用来显示聊天消息哪个更好?据我所知,RecyclerView支持更多的自定义视图方向(而且通常被认为性能优越),但由于聊天本质上是类似列表的,使用ListView会更好吗? 这对这个用例有什么不同吗?

  • 我正在Android上制作一个聊天应用程序,它使用谷歌Firebase来存储用户相互写入的消息。为了向用户显示这些消息,我从数据库中读取它们,并使用ListAdapter将它们组织成自定义的ListView。直到我更新了我的依赖项,特别是Firebase ui到: 现在,构造列表适配器的代码不起作用,如下所示: 为了解决这个问题,我更新了代码以符合新的firebase ui要求,使代码成为: 这段