Publicado en Android

Tomar una foto con la cámara en Android – Kotlin


Android permite varias formas para tomar una foto con la cámara del dispositivo, la más directa y simple es mediante un Intent para que se abra la applicación por defecto de la cámara, sacar foto y guardar, sin tener que especificar permiso de uso de la cámara por parte del usuario.

ImageCaptureHelper

Para facilitar aún más la cosas, he creado el siguiente helper (ayudita) para poder implementar en mis apps que requieren tomar foto y guardarla en el directorio interno de la app

class ImageCaptureHelper(private val context: Activity) {

    companion object {
        const val REQUEST_IMAGE_CAPTURE = 0x100
    }

    var currentPhotoPath: String? = null

    @Throws(IOException::class)
    private fun createImageFile(): File {
        // Create an image file name
        val timeStamp: String =
            SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
        val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(
            "JPEG_${timeStamp}_", /* prefix */
            ".jpg", /* suffix */
            storageDir /* directory */
        ).apply {
            // Save a file: path for use with ACTION_VIEW intents
            currentPhotoPath = absolutePath
        }
    }

    fun takePhoto() {
        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
            // Ensure that there's a camera activity to handle the intent
            takePictureIntent.resolveActivity(context.packageManager)?.also {
                // Create the File where the photo should go
                val photoFile: File? = try {
                    createImageFile()
                } catch (ex: IOException) {
                    null
                }

                // Continue only if the File was successfully created
                photoFile?.also { file ->
                    val photoURI: Uri = FileProvider.getUriForFile(
                        context, BuildConfig.APPLICATION_ID + ".provider", file
                    )
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                    context.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
                }
            }
        }
    }

    fun deletePhoto(filePath: String) {
        val myFile = File(filePath)
        if (myFile.exists()) myFile.delete()
    }

    fun deleteAllPhotos(excludeFile: String? = null) {
        val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)

        storageDir?.also {
            for (f in storageDir.listFiles()) {
                if (f.isFile) {
                    if (f.absolutePath != excludeFile) {
                        f.delete()
                    }

                    /*if (f.name.startsWith("JPEG_")) { }*/
                }
            }

        }

    }

    fun loadPhoto(imageView: ImageView) {
        // Get the dimensions of the View
        val targetW: Int = imageView.width
        val targetH: Int = imageView.height

        val bmOptions = BitmapFactory.Options().apply {
            // Get the dimensions of the bitmap
            inJustDecodeBounds = true

            val photoW: Int = outWidth
            val photoH: Int = outHeight

            // Determine how much to scale down the image
            val scaleFactor: Int = min(photoW / targetW, photoH / targetH)

            // Decode the image file into a Bitmap sized to fill the View
            inJustDecodeBounds = false
            inSampleSize = scaleFactor
        }
        BitmapFactory.decodeFile(currentPhotoPath, bmOptions)?.also { bitmap ->
            imageView.setImageBitmap(bitmap)
        }
    }


}

métodos de la classe

  • takePhoto: para inicializar la toma de fotos
  • deletePhoto para elminar una foto
  • deleteAllPhotos para elminar todas las fotos eralizadas con la app, permite excluir una foto (la útlima toma)
  • loadPhoto: para cargar la foto a un contenedor ImageView

Su uso

Se inicializa el helper pasando el contexto de la actividad

private val imageCaptureHelper by lazy {
    ImageCaptureHelper(this)
}

Para tomar la foto

imageCaptureHelper.takePhoto()

La foto es devuelta mediante onActivityResult()

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == ImageCaptureHelper.REQUEST_IMAGE_CAPTURE) {

        if (resultCode == RESULT_OK) {

            imageCaptureHelper.deleteAllPhotos(excludeFile = imageCaptureHelper.currentPhotoPath)
            imageCaptureHelper.loadPhoto(binding.contentMain.imageView)

        } else if (resultCode == RESULT_CANCELED) {

            imageCaptureHelper.currentPhotoPath?.also { fileName ->
                imageCaptureHelper.deletePhoto(fileName)
            }

        }

    }
}

Autor:

Desarrollador freelance programador apasionado por el arte de programar, amante del auto aprendizaje y interesado por la tecnología en general.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .