Introducción a la Integración Nativa en Android
Integra APIs Nativas en Android
Creación proyecto base
Google Maps SDK
Cómo crear una API key para Google Maps en Google Cloud
Creación de marcadores en Google Maps con Jetpack Compose
Cómo dibujar rutas en mapas usando polilíneas en Jetpack Compose
Cómo enfocar automáticamente mapas usando Camera Update Factory
Quiz: Google Maps SDK
Servicios de Localización
Uso de Flows en Kotlin para Controlar Intervalos de Tiempo y Emisión de Datos
Cómo simular ubicación en emuladores y dispositivos reales
Creación de Modelos y Cálculos de Localización con Clean Architecture
Implementación de Localización en Android Usando Flows
Inyección de dependencia para seguimiento de localización en Android
Uso de StateFlows para rastrear ubicación en aplicaciones Android
Location Tracker
Implementación de Location Tracker con Inyección de Dependencias
Quiz: Servicios de Localización
Integración Maps con Localización
Integración de mapas dinámicos con CameraPositionState en Android
Creación y uso de polilíneas en mapas con datos reales
Creación de una pantalla de mapa con Intents y estados en Jetpack Compose
Creación de un ViewModel para Seguimiento de Localización en Android
Quiz: Integración Maps con Localización
Manejo de permisos
Gestión de permisos en Android para localización, cámara y notificaciones
Cómo implementar diálogos para solicitar permisos en Android
Manejo de permisos de localización y notificación en Android
Cómo gestionar permisos en Android con Jetpack Compose
Quiz: Manejo de permisos
Integración cámara
Integración de cámara en Android con Photo Handler y manejo de permisos
Convierte Bitmaps a ByteArrays en Android con Kotlin
Creación de intents y estados UI para cámara en Android con Kotlin
Implementación de funciones clave en ViewModel para cámara Android
Integrar CámaraX en Jetpack Compose para Android
Captura y previsualización de fotos en Android con Jetpack Compose
Cómo Mostrar Fotos en Marcadores de Ubicación en Mapas con Jetpack Compose
Quiz: Integración cámara
Servicios en Android
Implementación de servicios en Android: normal services y foreground services
Implementar Foreground Services en Android para Persistencia en Segundo Plano
Quiz: Servicios en Android
Transmisiones en Android (Broadcast)
Implementación de BroadcastReceiver en Android para Escuchar Eventos del Sistema
Pruebas finales y cierre
You don't have access to this class
Keep learning! Join and start boosting your career
When developing Android applications that use sensitive data, such as the user's location or access to important hardware such as the camera, it is essential to correctly manage the required permissions. Android requires two main steps: register the permissions in the manifest file beforehand and enable them or request them from the user during execution.
The essential permissions to include in the manifest cover a variety of basic functions within an Android application. Some of the most common and relevant permissions are:
Both permissions must be explicitly included in the Android manifest; however, the ACCESS_FINE_LOCATION permission additionally requires direct authorization from the user in real time.
To optimize permission validation throughout the application, it is convenient to develop reusable functions in the form of extensions. The creation of a package called utils
and within it a permissions utils
file optimizes this programming practice by using functions that check if certain permissions are approved:
First a basic function is used for any permission:
private fun Context.hasPermission(permission: String): Boolean { return ContextCompat.checkSelfPermission( this, permission ) == PackageManager.PERMISSION_GRANTED}
It is then reused for specific permissions, such as fine location:
fun Context.hasLocationPermission(): Boolean = hasPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
For recent version-specific permissions, such as notifications in Android Tiramisu, conditional handling is implemented according to the SDK:
fun Context.hasNotificationPermission(): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { hasPermission(android.Manifest.permission.POST_NOTIFICATIONS) } else true}
And the requirement for camera access is also provided:
fun Context.hasCameraPermission(): Boolean = hasPermission(android.Manifest.permission.CAMERA)
When the user rejects some permissions, Android provides an option called Rationale, a valuable tool to improve the user experience. This feature displays a dialog that explains in detail the importance and specific use of the requested permission.
The function to display an explanation of the need for the permission takes the following structure:
fun ComponentActivity.shouldShowLocationRationalePermission(): Boolean { return shouldShowRequestPermissionRationale( android.Manifest.permission.ACCESS_FINE_LOCATION )}fun ComponentActivity.shouldShowPostNotificationRationale(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && shouldShowRequestPermissionRationale(android.Manifest.permission.POST_NOTIFICATIONS)fun ComponentActivity.shouldShowCameraPermissionRationale(): Boolean = shouldShowRequestPermissionRationale(android.Manifest.permission.CAMERA)
These functions allow to verify if it is necessary to show the explanatory dialog, following good practices that recommend requesting permissions just at the moment required by the application functionality.
Contributions 0
Questions 0
Want to see more contributions, questions and answers from the community?