Ich baue eine Android-App mit Kotlin und verwende Glide zum Laden von Bildern.
Es funktioniert mit einem Fragment, aber nicht mit dem anderen und ich verstehe nicht, warum ich die Berechtigungen nicht erhalten kann ?!
Die Bilder werden in der Raumdatenbank gespeichert.
Ich habe bereits meine Log-Nachrichten und die Bild-URI(Inhalt) überprüft und Der Kontext ist in beiden Fragmenten derselbe, aber man erhält die Erlaubnis und eins nicht...
Das ist die Fehlermeldung, die ich bekomme
Code: Select all
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
Das Fragment, in dem Glide funktioniert
Code: Select all
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)
}
}
Das Fragment, in dem Glide NICHT funktioniert
Code: Select all
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)
}
})
}
}
Ich habe versucht zu verstehen, warum dieses Fragment nicht die Berechtigung zum Laden des Bildes hat, das andere jedoch ...
Aber ich konnte die Antwort nicht finden, auch die Protokollmeldungen Hat mir nicht geholfen.
Ich bin Student und nicht der erfahrenste Programmierer, also sei bitte nett.
Vielen Dank!
Ich baue eine Android-App mit Kotlin und verwende Glide zum Laden von Bildern.
Es funktioniert mit einem Fragment, aber nicht mit dem anderen und ich verstehe nicht, warum ich die Berechtigungen nicht erhalten kann ?!
Die Bilder werden in der Raumdatenbank gespeichert.
Ich habe bereits meine Log-Nachrichten und die Bild-URI(Inhalt) überprüft und Der Kontext ist in beiden Fragmenten derselbe, aber man erhält die Erlaubnis und eins nicht...
Das ist die Fehlermeldung, die ich bekomme
[code]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
[/code]
Manifest.xml
[code]
[/code]
Das Fragment, in dem Glide funktioniert
[code]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)
}
}
[/code]
Das Fragment, in dem Glide NICHT funktioniert
[code]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)
}
})
}
}
[/code]
Ich habe versucht zu verstehen, warum dieses Fragment nicht die Berechtigung zum Laden des Bildes hat, das andere jedoch ...
Aber ich konnte die Antwort nicht finden, auch die Protokollmeldungen Hat mir nicht geholfen.
Ich bin Student und nicht der erfahrenste Programmierer, also sei bitte nett.
Vielen Dank!