imagekotlin

Koltin low quality images registerForActivityResult


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

Solution

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