Android 15: java.lang.SecurityException, android.graphics.ImageDecoder$DecodeException в котлине [дубликат]Android

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

Сообщение Anonymous »

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

>







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()
}
)


внутри AsyncImage() означает, что изображение не может отображаться из-за исключения java.lang.SecurityException, когда я перезапускаю свое приложение.
после этого я увидел доступ внешнее хранилище в Android 15 на YouTube, тогда оно работает, означает, что я не получаю URI изображения из базы данных Firebase, но я использую весь доступ к внешнему хранилищу (все изображения галереи) и получаю последнее выбранное изображение, которое выбирает пользователь, и получаю этот URI изображения и использовать внутри моего проекта, а затем загрузить этот URI внутри 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.
Как мы можем устранить эту ошибку?
Редактировать:
На самом деле я выбираю изображение и отображаю изображение в своем приложении успешно, без ошибок, а затем сохраняю URL-адрес этого изображения в базе данных Firebase, и когда я повторно запускаю приложение, я загружаю URL-адрес этого изображения из база данных Firebase. затем отображается java.lang.SecurityException, а адрес изображения имеет вид
content://media/picker/0/com.android.providers.media.photopicker/media. и если я сохраню изображение в хранилище Firebase, а затем загружу это изображение после повторного запуска приложения, тогда оно выдаст android.graphics.ImageDecoder$DecodeException, а адрес изображения будет выглядеть как https://fir-project-655c8-default-rtdb.firebaseio.com . ? и я не хочу использовать onActivityResult(), потому что они устарели. Мне нужна альтернатива, которая не обесценивается. и у меня есть все разрешения
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 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(userImageBoard.value) {

if (Constants.hasPermission(context)) {
launcher.launch(
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
)
} else {
requestLauncher.launch(permissions)
}
}


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

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

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

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

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

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