Как вы исправляете ошибки, не связанные с поиском файлов (Glide)?

#android #firebase #kotlin #android-glide #filenotfoundexception

#Android #firebase #kotlin #android-glide #исключение filenotfoundexception

Вопрос:

Я пишу приложение для общения в чате, и я нахожусь в той части, где пользователи могут отправлять тексты / изображения (сохраненные в Firebase) друг другу. Я использую Glide для загрузки изображений из Firebase в ImageView. Изображения загружаются правильно; однако тексты загружаются в качестве заполнителя для моих изображений.

Код

 package com.example.realtimechat.chats

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.realtimechat.R
import com.example.realtimechat.common.Constants
import com.example.realtimechat.common.Extras
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.storage.FirebaseStorage
import java.text.SimpleDateFormat

class MessagesAdapter(private val context: Context,
                      private val messageList: List<MessageModel> = mutableListOf()): RecyclerView.Adapter<MessagesAdapter.MessageViewHolder>() {


    private lateinit var mAuth: FirebaseAuth

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessagesAdapter.MessageViewHolder {
        val view: View = LayoutInflater.from(context).inflate(R.layout.custom_message_layout, parent, false)
        return MessageViewHolder(view)
    }

    override fun onBindViewHolder(holder: MessagesAdapter.MessageViewHolder, position: Int) {
        val message: MessageModel = messageList[position]
        mAuth = FirebaseAuth.getInstance()

        val currentUserId = mAuth.currentUser!!.uid
        val fromUserId = message.MessageFrom

        val sfd: SimpleDateFormat = SimpleDateFormat("dd-MM-yyyy HH:mm")
        val dateTime = sfd.format(message.MessageTime)

        val splitString: Array<String> = dateTime.split(" ").toTypedArray()
        val messageTime = splitString[1]

        Log.i("message time:", messageTime)

        if(fromUserId == currentUserId){
            if(message.MessageType.equals(Constants.MESSAGE_TYPE_TEXT)){
                holder.llSent.visibility = View.VISIBLE
                holder.llSentImage.visibility = View.GONE
            }else{
                holder.llSent.visibility = View.GONE
                holder.llSentImage.visibility = View.VISIBLE
            }

            holder.llReceived.visibility = View.GONE
            holder.llReceivedImage.visibility = View.GONE

            holder.tvSentMessage.text = message.Message
            holder.tvSentMessageTime.text = messageTime
            holder.tvImageSentTime.text = messageTime
            Glide.with(context)
                .load(message.Message)
                .placeholder(R.drawable.ic_image)
                .into(holder.ivSent)
        }else{
            if(message.MessageType.equals(Constants.MESSAGE_TYPE_TEXT)){
                holder.llReceived.visibility = View.VISIBLE
                holder.llReceivedImage.visibility = View.GONE
            }else{
                holder.llReceived.visibility = View.GONE
                holder.llReceivedImage.visibility = View.VISIBLE
            }

            holder.llSent.visibility = View.GONE
            holder.llSentImage.visibility = View.GONE

            holder.tvReceivedMessage.text = message.Message
            holder.tvReceivedMessageTime.text = messageTime
            holder.tvImageReceivedTime.text = messageTime
            Glide.with(context)
                .load(message.Message)
                .placeholder(R.drawable.ic_image)
                .into(holder.ivReceived)
        }

        holder.clMessage.setTag(R.id.TAG_MESSAGE, message.Message)
        holder.clMessage.setTag(R.id.TAG_MESSAGE_ID, message.Message)
        holder.clMessage.setTag(R.id.TAG_MESSAGE_TYPE, message.Message)

        holder.clMessage.setOnClickListener{view ->
            val messageType: String = view.getTag(R.id.TAG_MESSAGE_TYPE).toString()
            val uri: Uri = Uri.parse(view.getTag(R.id.TAG_MESSAGE_TYPE).toString())
            if(messageType == Constants.MESSAGE_TYPE_VIDEO){
                val intent = Intent(Intent.ACTION_VIEW, uri)
                intent.setDataAndType(uri, "video/mp4")
                context.startActivity(intent)
            }else if(messageType == Constants.MESSAGE_TYPE_IMAGE){
                val intent = Intent(Intent.ACTION_VIEW, uri)
                intent.setDataAndType(uri, "image/jpg")
                context.startActivity(intent)
            }
        }
    }

    override fun getItemCount(): Int {
        return messageList.size
    }

    inner class MessageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val llSent: LinearLayout = itemView.findViewById(R.id.llSent)
        val llReceived: LinearLayout = itemView.findViewById(R.id.llReceived)
        val llSentImage: LinearLayout = itemView.findViewById(R.id.llSentImage)
        val llReceivedImage: LinearLayout = itemView.findViewById(R.id.llReceivedImage)
        val tvSentMessage: TextView = itemView.findViewById(R.id.tvSentMessage)
        val tvSentMessageTime: TextView = itemView.findViewById(R.id.tvSentMessageTime)
        val tvReceivedMessage: TextView = itemView.findViewById(R.id.tvReceivedMessage)
        val tvReceivedMessageTime: TextView = itemView.findViewById(R.id.tvReceivedMessageTime)
        val ivSent: ImageView = itemView.findViewById(R.id.ivSent)
        val ivReceived: ImageView = itemView.findViewById(R.id.ivReceived)
        val tvImageSentTime: TextView = itemView.findViewById(R.id.tvSentImageTime)
        val tvImageReceivedTime: TextView = itemView.findViewById(R.id.tvReceivedImageTime)
        val clMessage: ConstraintLayout = itemView.findViewById(R.id.clMessage)

    }

}
  

XML

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/clMessage"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:id="@ id/llSent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginEnd="8dp"
        android:orientation="horizontal"
        android:visibility="gone"
        android:background="@drawable/sent_message_background"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:visibility="visible">

        <TextView
            android:id="@ id/tvSentMessage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:padding="12dp"
            android:textColor="@android:color/white"
            android:autoLink="all"
            android:textColorLink="@android:color/holo_blue_bright"
            tools:text="What's up man" />

        <TextView
            android:id="@ id/tvSentMessageTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="10:00"
            android:layout_gravity="bottom"
            android:textSize="12sp"
            android:layout_marginEnd="4dp"/>
    </LinearLayout>

    <LinearLayout
        android:id="@ id/llSentImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="4dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/llSent"
        android:visibility="gone"
        tools:visibility="visible">

        <ImageView
            android:id="@ id/ivSent"
            android:layout_width="90dp"
            android:layout_height="100dp"
            android:background="@drawable/sent_message_background"
            android:src="@drawable/ic_image"
            android:contentDescription="Sent Image" />

        <TextView
            android:id="@ id/tvSentImageTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="10:00"
            android:layout_gravity="bottom|end"
            android:textSize="12sp"
            android:layout_marginEnd="4dp"/>
    </LinearLayout>
    
    <LinearLayout
        android:id="@ id/llReceived"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginStart="8dp"
        android:orientation="horizontal"
        android:visibility="gone"
        android:background="@drawable/received_message_background"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/llSent"
        tools:visibility="visible">

        <TextView
            android:id="@ id/tvReceivedMessage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:padding="12dp"
            android:autoLink="all"
            android:textColorLink="@android:color/holo_blue_bright"
            tools:text="What's up man" />

        <TextView
            android:id="@ id/tvReceivedMessageTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="10:00"
            android:layout_gravity="bottom"
            android:textSize="12sp"
            android:layout_marginEnd="4dp"/>
    </LinearLayout>
    
    <LinearLayout
        android:id="@ id/llReceivedImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginStart="8dp"
        android:layout_marginTop="4dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/llReceived"
        android:visibility="gone"
        tools:visibility="visible">

        <ImageView
            android:id="@ id/ivReceived"
            android:layout_width="90dp"
            android:layout_height="100dp"
            android:background="@drawable/received_message_background"
            android:src="@drawable/ic_image"
            android:contentDescription="Received Image"/>

        <TextView
            android:id="@ id/tvReceivedImageTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="10:00"
            android:layout_gravity="bottom"
            android:textSize="12sp"
            android:layout_marginEnd="4dp"/>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
  

Проблема, по-видимому , конкретно в OnBindViewHolder функции:

 Glide.with(context)
                .load(message.Message)
                .placeholder(R.drawable.ic_image)
                .into(holder.ivSent)
  

и

 Glide.with(context)
                .load(message.Message)
                .placeholder(R.drawable.ic_image)
                .into(holder.ivReceived)
  

Я использовал Logcat для получения более подробной информации. message.Message возвращено правильное значение, просто текстовое значение преобразуется в изображение из папки drawable.

PS В сообщении об ошибке logcat говорится, что файл не найден. Насколько мне известно, это связано с тем, что, когда я делаю Glide.with(context).load(message.Message) , система пытается найти файл изображения для текста, который недоступен, поскольку есть только текст. (Поправьте меня, если я ошибаюсь, пожалуйста)

Любые решения этой проблемы будут высоко оценены!

Комментарии:

1. поделитесь значением, которое сообщение. Возвращается сообщение. Убедитесь, что это URL-адрес изображения

2. сообщение @SantoshDhoundiyal. Сообщение возвращает оба сообщения пользователя и URL изображения

3. в .load (сообщение. Сообщение) передайте только значение URL изображения, например image_url = » example.com/img/image.jpg «, Glide.with (контекст) .load(image_url ) .placeholder(R.drawable.ic_image) .into (holder.ivReceived)

4. как сказал Сантош выше, функция load () ожидает URL изображения, формат вашего сообщения, похоже, отключен.