Загрузка изображения с помощью Glide — доступ к внешнему хранилищу запрещенAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Загрузка изображения с помощью Glide — доступ к внешнему хранилищу запрещен

Сообщение Anonymous »

Я создаю приложение для Android с помощью Kotlin и использую Glide для загрузки изображений.
Он работает с одним фрагментом, но не с другим, и я не понимаю, почему я не могу получить разрешения ?!
Изображения хранятся в базе данных комнаты.
Я уже проверил свои сообщения журнала и image-uri(содержание) и контекст один и тот же в обоих фрагментах, но один получает разрешение, а другой нет...
Это сообщение об ошибке, которое я получаю

Код: Выделить всё

2025-01-06 20:55:51.266  7954-7954  Glide                   com.example.travelfriends            D  Loading image from URI: content://media/external/images/media/1000000032
2025-01-06 20:55:51.266  7954-7954  Glide                   com.example.travelfriends            D  Context available: com.example.travelfriends.ui.MainActivity@9085568
2025-01-06 20:55:51.312  7954-7999  GlideExecutor           com.example.travelfriends            E  Request threw uncaught throwable
java.lang.SecurityException: com.example.travelfriends has no access to content://media/external/images/media/1000000032
Manifest.xml Фрагмент, в котором работает скольжение

Код: Выделить всё

package com.example.travelfriends.data

import android.net.Uri
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.travelfriends.R

class BookAdapter(
private val books: List,
private val onBookClick: (Book) ->  Unit
) : RecyclerView.Adapter() {

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

override fun onBindViewHolder(holder: BookViewHolder, position: Int) {
val book = books[position]
holder.bookTitle.text = book.name
holder.bookDescription.text = book.description

Log.d("Glide", "Context available: ${holder.itemView.context}")
Log.d("Glide", "Loading image from URI: ${book.image}")

// Verwende Glide, um das Bild zu laden
Glide.with(holder.itemView.context)
.load(Uri.parse(book.image))
.placeholder(R.drawable.ic_launcher_foreground)
.error(R.drawable.ic_launcher_foreground)
.into(holder.bookImage)

holder.itemView.setOnClickListener {
onBookClick(book)
}
}

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

// ViewHolder für jedes Buch
class BookViewHolder(view: android.view.View) : RecyclerView.ViewHolder(view) {
val bookTitle: TextView = view.findViewById(R.id.tvRecViewBookTitle)
val bookDescription: TextView = view.findViewById(R.id.tvRecViewBookDescription)
val bookImage: ImageView = view.findViewById(R.id.ivRecViewBookImage)
}

}
Фрагмент, в котором НЕ работает Glide

Код: Выделить всё

package com.example.travelfriends.ui.fragments

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.bumptech.glide.Glide
import com.example.travelfriends.R
import com.example.travelfriends.data.AppViewModel
import com.example.travelfriends.data.Entry

class BookDisplayFragment : Fragment() {

private lateinit var ivBookImage: ImageView
private lateinit var tvBookTitle: TextView
private lateinit var appViewModel: AppViewModel
private var bookId: Int = -1

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_book_display, container, false)

ivBookImage = view.findViewById(R.id.bookImage)
tvBookTitle = view.findViewById(R.id.bookTitle)
val btnNextEntry: Button = view.findViewById(R.id.nextEntryButton)

appViewModel = ViewModelProvider(requireActivity())[AppViewModel::class.java]

// Abrufen der übergebenen Argumente
arguments?.let {
bookId = it.getInt("bookId", -1)
}

if (bookId != -1) {
appViewModel.getBookById(bookId)
observeBookData()
}

return view
}

private fun observeBookData() {
appViewModel.allBooks.observe(viewLifecycleOwner, Observer { books ->
if (books.isNotEmpty()) {
val book = books[0]
tvBookTitle.text = book.name

Log.d("Glide", "Loading image from URI: ${book.image}")
Log.d("Glide", "Context available: ${requireContext()}")

Glide.with(requireContext())
.load(book.image)
.placeholder(R.drawable.ic_launcher_foreground)
.error(R.drawable.ic_launcher_foreground)
.into(ivBookImage)
}
})
}
}

Я пытался понять, почему у этого фрагмента нет разрешения на загрузку изображения, а у другого есть...
Но я не смог найти ответа, сообщения журнала тоже мне не помогло.
Я студент и не самый опытный программист, поэтому, пожалуйста, будьте вежливы.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... al-storage
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»