Conversión de Bitmaps a Byte Arrays con Extension Functions
Clase 24 de 33 • Curso de Android: Integración de APIs nativas
Contenido del curso
- 7

Emisión controlada de tiempo con Kotlin Flows
12:55 - 8

Simulación de ubicación GPS en emulador y dispositivo Android
05:48 - 9

Modelos de localización personalizados con Clean Architecture en Kotlin
08:36 - 10

Mapeo de datos de localización en Android con Kotlin
14:51 - 11

Inyección de dependencias para observar localización en Android
06:33 - 12

StateFlow para controlar localización en aplicaciones Android
08:47 - 13

State Flows para controlar localización y tiempo en Kotlin
10:00 - 14

Configuración y pruebas de Location Tracker en Android
09:37 quiz de Servicios de Localización
- 15

Integración de ubicación actual en mapas interactivos
06:46 - 16

Creación de polilíneas con datos reales en mapas de Android
04:07 - 17

Integración de intents y estados en pantalla mapa con Compose
08:05 - 18

Implementación del ViewModel para rastreo de localización en Android
14:29 quiz de Integración Maps con Localización
- 19

Gestión de permisos en tiempo de ejecución para aplicaciones Android
08:34 - 20

Creación de diálogos de permisos reutilizables en Android
06:55 - 21

Gestión de permisos de localización y notificaciones en Android
10:18 - 22

Implementación de solicitud de permisos con LaunchedEffect en Compose
09:53 quiz de Manejo de permisos
- 23

Implementación de PhotoHandler para gestión de cámara en Android
11:59 - 24

Conversión de Bitmaps a Byte Arrays con Extension Functions
05:58 - 25

Definición de Intents y estados de UI para cámara en Kotlin
08:41 - 26

Configuración de métodos del ViewModel para gestión de cámara
09:41 - 27

Integración de CameraX con Jetpack Compose en Android
14:23 - 28

Creación de pantalla de previsualización de fotos con Jetpack Compose
08:44 - 29

Integración de galería fotográfica en mapas con Jetpack Compose
11:56 quiz de Integración cámara
Optimizar la separación por capas en tus proyectos Android suele requerir la transformación eficiente de Bitmaps en Byte Arrays y viceversa. En Kotlin, las extension functions ofrecen una forma sencilla y eficaz para realizar estas conversiones, especialmente si tu estructura multimodular necesita aislar la lógica de Android (Bitmaps) de las capas más puras en Java o Kotlin (Byte Arrays).
¿Por qué convertir de Bitmap a Byte Array en un proyecto multimodular?
Al dividir un proyecto por capas, la capa de domain típicamente no tiene dependencias relacionadas directamente con Android. Esto obliga a representar imágenes, inicialmente manejadas en la capa de presentación con Bitmaps, en un formato neutro y universal como Byte Arrays. De esta manera, mantenemos la estructura modular clara y las dependencias bajo control.
¿Cuál es la manera más eficiente de convertir Bitmaps a Byte Arrays en Kotlin?
Usando Kotlin, implementaremos estas conversiones mediante funciones de extensión rápidas y legibles:
Para convertir un Bitmap a Byte Array, sigue esta estructura simple:
fun Bitmap.toByteArray(quality: Int = 90, format: Bitmap.CompressFormat = Bitmap.CompressFormat.JPEG): ByteArray {
val stream = ByteArrayOutputStream()
this.compress(format, quality, stream)
return stream.toByteArray()
}
Aquí, puedes ajustar fácilmente parámetros como la calidad y el formato de compresión según tus necesidades específicas.
¿Cómo transformar Byte Arrays en Bitmaps con Kotlin?
Realizar la operación opuesta también es sencillo con Kotlin. Transformar un Byte Array de nuevo a Bitmap requiere únicamente la utilización de la clase BitmapFactory:
fun ByteArray.toBitmap(): Bitmap? {
return BitmapFactory.decodeByteArray(this, 0, this.size)
}
De esta manera, garantizas que las imágenes transportadas en tu lógica de dominio puedan fácilmente visualizarse en la capa Android.
¿Qué hay que considerar en la organización del código en proyectos modulares?
En estos proyectos, es clave que las operaciones específicas a Android, como la manipulación directa de Bitmaps, se mantengan rigurosamente en la capa de presentación. Es por ello recomendable mover clases asociadas principalmente con la interfaz de usuario, como el photo handler, hacia la capa de presentación, respetando así la integridad modular y la separación por responsabilidades.
¿Cómo configurar la inyección de dependencias en el módulo camera?
La configuración de tu clase de inyección para un módulo específico de cámara y su implementación es tan sencilla como:
@Module
@InstallIn(SingletonComponent::class)
object CameraModule {
@Singleton
@Provides
fun providePhotoHandler(@ApplicationContext context: Context): PhotoHandler {
return PhotoHandlerImplementation(context)
}
}
Explora cómo implementar estas técnicas avanzadas y sencillas en tu proyecto Android multimodular y mejora así su modularidad y limpieza. ¿Tienes dudas sobre estos procesos? Cuéntanos en los comentarios.