Привет, я пытаюсь сделать снимок с помощью kotlin и registerForActivityResult, но я всегда получаю размытое изображение без качества. Я прочитал несколько сообщений, но не могу понять, как работать с моим приложением. Я использую фрагмент для вызова камеры. Какие-либо предложения? Извините за мой плохой английский, я провел целую неделю, пытаясь это работает. И ничего. заранее спасибо
частный вар imagenUri: Ури? = ноль
val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
try {
val intent = result.data
intent!!.putExtra(MediaStore.EXTRA_OUTPUT, imagenUri)
val bitMap = intent?.extras?.get("data") as Bitmap
imagenUri= getImageUriFromBitmap(requireContext(),bitMap)
binding.ivImagen.setImageURI(imagenUri)
Toast.makeText(context, "la uri es: $imagenUri", Toast.LENGTH_SHORT).show()
} catch (e: java.lang.Exception){
Toast.makeText(context, "NO SE HA PODIDO ENCONTRAR IMAGEN", Toast.LENGTH_SHORT).show()}
}
}
binding.ibTomarFoto.setOnClickListener(){
startForResult.launch(Intent(MediaStore.ACTION_IMAGE_CAPTURE))
}
Из документации:
public static final String ACTION_IMAGE_CAPTURE
Стандартное действие Intent, которое можно отправить, чтобы приложение камеры зафиксировало изображение и вернуло его.
Вызывающий может передать дополнительный EXTRA_OUTPUT для управления тем, куда будет записано это изображение. Если EXTRA_OUTPUT отсутствует, то изображение небольшого размера возвращается как объект Bitmap в дополнительном поле. Это полезно для приложений, которым требуется только небольшое изображение. Если EXTRA_OUTPUT присутствует, то полноразмерное изображение будет записано в значение Uri EXTRA_OUTPUT.
Поэтому вам нужно добавить дополнительный EXTRA_OUTPUT
, чтобы получить полноразмерное изображение, хранящееся по указанному вами URI. В противном случае вы получите небольшое изображение в качестве полезных данных в результате Intent
(эти пакеты не могут обрабатывать большие объекты).
Похоже, вы уже пытаетесь это сделать, просто добавили не туда — вам нужно добавить его к Intent
, с которым вы вызываете launch
, а не к результату. Это параметр конфигурации для запускаемой вами задачи!
Итак, это должно работать:
binding.ibTomarFoto.setOnClickListener(){
startForResult.launch(
Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, imagenUri)
)
}
А затем удалите ту же строку putExtra
из кода обработчика результатов (она ничего не делает, но нет смысла ее там хранить)
Да. Спасибо, вы были абсолютно правы!!!