#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 изображения, формат вашего сообщения, похоже, отключен.