Android 15: java.lang.SecurityException, android.graphics.ImageDecoder$DecodeExceptionAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android 15: java.lang.SecurityException, android.graphics.ImageDecoder$DecodeException

Сообщение Anonymous »

На самом деле основная цель моего вопроса — как отобразить URL-адрес изображения, хранящегося в Firebase (либо база данных, база данных реального времени, хранилище) в AsyncImage().
Загрузка URL-адреса моего изображения из Firebase успешно, но внутри прослушивателя выдается

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

java.lang.SecurityException: Calling uid ( 10213 ) does not have permission to access picker uri: content://media/picker/0/com.android.providers.media.photopicker/media/1000000020
в моем AndroidManifest.xml Мой код запроса:

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


fun hasPermission(context: Context): Boolean {
return when {
Build.VERSION.SDK_INT >= 33 -> ContextCompat.checkSelfPermission(
context, Manifest.permission.READ_MEDIA_IMAGES
) == PackageManager.PERMISSION_GRANTED
else -> ContextCompat.checkSelfPermission(
context, Manifest.permission.READ_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
}
}

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

val context = LocalContext.current

val requestLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
if (permissions[Manifest.permission.READ_MEDIA_IMAGES] == true) {
Toast.makeText(context, "Gallery permission enabled", Toast.LENGTH_LONG).show()
} else {
val rationaleRequired = when {
Build.VERSION.SDK_INT >= 33 -> {
ActivityCompat.shouldShowRequestPermissionRationale(
context as Activity, Manifest.permission.READ_MEDIA_IMAGES
)
}
else -> {
ActivityCompat.shouldShowRequestPermissionRationale(
context as Activity, Manifest.permission.READ_EXTERNAL_STORAGE
)
}
}

val message = if (rationaleRequired) {
"Gallery permission is required for updating your profile."
} else {
"Gallery permission is required.  Please enable it manually in settings."
}
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
}
}

val permissions = remember {
if (Build.VERSION.SDK_INT >= 33) {
arrayOf(
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_IMAGES
)
} else {
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
}
}

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

Profile(image.value  , onPickImage = {
if (hasPermission(context)) {
launcher.launch(
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
)
} else {
requestLauncher.launch(permissions)
}
})

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

@Composable
fun Profile(image : String ,  onPickImage : () -> Unit) {
println("Profile , image : $image ")
if(image.isEmpty()) {
println("default image ")
DefaultImage(onPickImage)
}
else {
println("load image")
AsyncImage(
model = ImageRequest.Builder(LocalContext.current)
.listener(
onError = { request, result ->

// error come here -------------->.......
println(result.throwable)
}
)
.data(image.toUri())
.build(),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier
.size(90.dp)
.clip(CircleShape)
.clickable {
onPickImage()
}
)
}
}
На самом деле URL-адрес изображения успешно обновляется внутри базы данных Firebase, а также работает нормально, когда я получаю информацию о пользователе, что означает URL-адрес изображения из базы данных Firebase по идентификатору пользователя, затем я успешно получаю его, но затем он не может загрузиться внутри AsyncImage() означает, что изображение не может отображаться из-за java.lang.SecurityException, когда я перезапускаю свое приложение.
после этого я увидел доступ к внешнему хранилищу в Android 15 на YouTube, тогда это работает, значит Я не получаю URL-адрес изображения из базы данных Firebase, но использую весь доступ к внешнему хранилищу и получаю последнее выбранное изображение, выбранное пользователем, и получаю этот URL-адрес изображения и использую его внутри своего проекта, а затем загружаю этот URL-адрес внутри AsynImage().
но я хочу использовать Firebase, поэтому я пытаюсь сохранить изображение в базе данных реального времени Firebase, затем
оно успешно сохраняется и также извлекается

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

fun loadUserImage(
onLoadImage : (String) -> Unit ,
onLoadImageError : (String) -> Unit
){
database.getReference().child(currentFileName)
.addValueEventListener(
object  : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
currentImage = snapshot.ref.toString()
println("snapshot : ${snapshot.value} , image : $currentImage")
onLoadImage(currentImage)
}

override fun onCancelled(error: DatabaseError) {
onLoadImageError(error.message)
}
}
)
}
Внутри onLoadImage я получаю URL-адрес изображения, например

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

image : https://fir-project-655c8-default-rtdb.firebaseio.com
затем внутри прослушивателя AsynImage() я также получил ошибку, и изображение не загружается при переустановке приложения

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

android.graphics.ImageDecoder$DecodeException: Failed to create image decoder with message 'unimplemented'Input contained an error.
Я прочитал много ответов, но они устарели и в основном написаны на Java.
Как мы можем устранить эту ошибку?

Подробнее здесь: https://stackoverflow.com/questions/791 ... derdecodee
Ответить

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

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

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

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

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