Blink es una aplicación móvil de chat uno a uno, similar a Omegle, que conecta a usuarios de manera aleatoria a través de video y voz. La aplicación utiliza la API de WebRTC para la transmisión de medios y Firebase como servidor de señalización.
- Chat de video y voz: Comunicación en tiempo real entre dos usuarios seleccionados al azar.
- Cambio de participante: Permite buscar otro usuario con un solo clic.
- Interfaz intuitiva: Diseño simple y fácil de usar basado en Jetpack Compose.
- Android 5.0 (Lollipop) o superior.
- Acceso a Internet estable.
- Cámara y micrófono funcionales.
- Lenguaje: Kotlin.
- Arquitectura: MVVM (Model-View-ViewModel).
- Streaming de video y voz: WebRTC (GetStream API).
- Servidor de señalización: Firebase Firestore.
- UI: Jetpack Compose.
- Autenticación: Firebase Authentication (Autenticación Anónima).
git clone https://github.com/Pandax40/Blink.git
cd Blink- Crea un proyecto en Firebase
- Habilita Firestore en modo seguro y asegúrate de añadir las siguientes reglas:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Regla para la colección waitingRoom
match /waitingRoom/current {
// Solo usuarios autenticados pueden leer
allow read: if request.auth != null;
// Solo usuarios autenticados pueden escribir y solo el campo roomId es permitido
allow write: if request.auth != null && request.resource.data.keys().hasOnly(['roomId']);
// Solo usuarios autenticados pueden borrar el waitingRoom
allow delete: if request.auth != null
}
// Regla para la colección rooms
match /rooms/{roomId} {
// Solo usuarios autenticados pueden leer las salas
allow read: if request.auth != null;
// Solo usuarios autenticados pueden crear salas con los campos offer y answer
allow create: if request.auth != null && request.resource.data.keys().hasOnly(['offer', 'answer']);
allow update: if request.auth != null && (
// Los campos válidos son offer o answer
(request.resource.data.offer is map && request.resource.data.offer.keys().hasOnly(['sdp', 'ownerId'])) ||
(request.resource.data.answer is map && request.resource.data.answer.keys().hasOnly(['sdp', 'responderId']))
);
// Permitir que usuarios autenticados eliminen salas
allow delete: if request.auth != null;
}
// Regla para la colección iceCandidates
match /iceCandidates/{userId} {
// Un usuario solo puede leer todos los candidatos
allow read: if request.auth != null;
// Un usuario solo puede escribir sus propios candidatos
allow write: if request.auth != null && request.auth.uid == userId;
// Un usuario solo puede borrar sus propios candidatos
allow delete: if request.auth != null && request.auth.uid == userId;
}
}
}- Habilita Autenticación Anónima en la consola de Firebase:
- Ve a Authentication > Métodos de inicio de sesión.
- Activa la opción Anónimo.
- Descarga el archivo
google-services.jsondesde Firebase y colócalo en el directorioappde tu proyecto.
El proyecto ya incluye configuraciones básicas de WebRTC:
- Servidores STUN y TURN están configurados en el archivo
Client.kt. - El servidor TURN es gratuito y no tiene mucha capacidad, no supone un riesgo exponerlo en el repositorio.
Si necesitas personalizar los servidores de STUN/TURN, actualiza los valores en Client.kt en la sección:
private val iceServers = listOf(
PeerConnection.IceServer.builder("stun:stun.relay.metered.ca:80").createIceServer(),
// Otros servidores TURN/STUN...
)- Abre el proyecto en Android Studio.
- Sincroniza las dependencias de Gradle.
- Compila y ejecuta la aplicación.
- Al iniciar la aplicación, el usuario será autenticado automáticamente mediante Autenticación Anónima.
- Verás un botón de Blink en la pantalla principal.
- Haz clic en el botón para conectarte con otro usuario aleatorio.
- Puedes finalizar la sesión y buscar otro usuario haciendo clic en Blink Again.
- Si deseas salir de la sesión, utiliza el botón superior izquierdo para regresar al menú principal.
- HomeScreen.kt: Pantalla de inicio con el botón para iniciar un chat.
- BlinkScreen.kt: Pantalla principal donde se muestra el video de ambos participantes.
- BlinkViewModel.kt: Lógica de presentación y gestión de estados de video y señalización.
- Client.kt: Configuración de WebRTC y gestión de PeerConnection.
- AudioController.kt: Gestión de dispositivos de audio.
- SignalingRepository.kt: Interacciones con Firebase para la señalización.