Home > Software design >  Koltin low quality images registerForActivityResult
Koltin low quality images registerForActivityResult

Time:12-02

Hi I'm trying to capture a picture using kotlin and registerForActivityResult but I allways get a blur image with no quality I've read several post but I can't understand how to work with my application. I'm using a fragment to call the camera. Any suggestions? Sorry for my bad english I've spent about the full week trying it works. And nothing. Thanks in advance

private var imagenUri: Uri? =null

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

CodePudding user response:

From the documentation:

public static final String ACTION_IMAGE_CAPTURE

Standard Intent action that can be sent to have the camera application capture an image and return it.

The caller may pass an extra EXTRA_OUTPUT to control where this image will be written. If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap object in the extra field. This is useful for applications that only need a small image. If the EXTRA_OUTPUT is present, then the full-sized image will be written to the Uri value of EXTRA_OUTPUT.

So you need to add the EXTRA_OUTPUT extra to get a full-size image stored at a URI you supply. Otherwise you get a small image as a data payload in the result Intent (those bundles can't handle large objects).

It looks like you're already trying to do that, you've just added it to the wrong place - you need to add it to the Intent you call launch with, not the result one. It's a configuration option for the task you're launching!

So this should work:

binding.ibTomarFoto.setOnClickListener(){
    startForResult.launch(
        Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, imagenUri)
    )
}

And then remove the same putExtra line from your result-handler code (it doesn't do anything, but there's no point having it there)

  • Related