Muestra artistas, álbumes y canciones usando la Spotify Web API.
Desarrollada en Kotlin, Jetpack Compose, MVVM y Clean Architecture.
- Kotlin – lenguaje principal del proyecto.
- Jetpack Compose – para la UI declarativa.
- MVVM – patrón de arquitectura.
- Clean Architecture – separación de capas y responsabilidades.
- Coroutines – para procesos asíncronos.
- Retrofit – para consumir la API de Spotify.
- Hilt – para inyección de dependencias.
- StateFlow / Flow – manejo de estado reactivo.
- EncryptedSharedPreferences – almacenamiento seguro de tokens.
- Figma – diseño de la interfaz gráfica (Musium Music App UI).
- Requisitos (hardware/software)
- Instalación paso a paso (desde cero)
- Registro y configuración en Spotify Developer Dashboard
- Configurar el proyecto (variables locales y gradle)
- Ejecutar la app (emulador o dispositivo)
- Flujo de autenticación (PKCE) y seguridad de tokens
- Endpoints importantes usados
- Estructura del proyecto
- Inspiración del diseño
- Contacto
- PC o Mac con al menos 8 GB RAM (recomendado 16 GB para emuladores).
- Android Studio (recomendado: última versión estable; idealmente Arctic Fox / Bumblebee o superior — usa la versión soportada por tu equipo).
Descarga: https://developer.android.com/studio - JDK 11 o 17 (Android Studio normalmente instala/gestiona esto).
- Conexión a internet para descargar dependencias y comunicarse con Spotify.
- (Opcional) Un dispositivo Android físico con depuración USB activada.
- Descarga Android Studio desde la web oficial e instálalo.
- Al abrirlo por primera vez, sigue el asistente: instala el SDK, herramientas y un emulador (recomendado: Pixel 6 API 33 o similar).
- Verifica que Android Studio puede compilar un proyecto nuevo (File → New → New Project → Empty Compose Activity → Run).
Abre una terminal y ejecuta:
git clone https://github.com/tu-usuario/Soundify.git
cd Soundify- Abre Android Studio.
- En la barra de menú selecciona:
File → Open: selecciona la carpeta Soundify - Busca y selecciona la carpeta del proyecto llamada Soundify.
- Espera a que Gradle sincronice (esto puede tardar varios minutos la primera vez).
- Una vez termine, podrás ejecutar la app o abrir los archivos fuente desde el panel lateral.
-
Ve al panel de desarrolladores de Spotify:
👉 https://developer.spotify.com/dashboard/
(necesitas una cuenta Spotify activa). -
Haz clic en Create an App y asigna un nombre (por ejemplo:
SoundifyApp). -
Copia el Client ID — lo necesitarás más adelante para configurar el proyecto.
-
En la configuración de la app, haz clic en Edit Settings y agrega un Redirect URI: Este valor debe coincidir exactamente con el que está configurado en tu proyecto Android.
-
Si la app está en modo Development, agrega las cuentas que usarás para probar en la sección:
Users and Testers → Add Users
(esto es necesario para evitar errores 403 al autenticar con cuentas no autorizadas).
Nunca subas client_secret, tokens o local.properties al repo. Añade estos archivos a .gitignore (ya incluido normalmente).
En la raíz del proyecto crea (o edita) local.properties y añade:
# Local properties (NO subir a git)
CLIENT_ID=tu_client_id_aqui
REDIRECT_URI=tu_REDIRECT_URI_aqui
AUTHORIZATION_ENDPOINT=https://accounts.spotify.com/authorizeReemplaza tu_client_id_aqui por el Client ID que obtuviste del Dashboard.
Reemplaza tu_REDIRECT_URI_aqui por el REDIRECT_URI que configuraste en el Dashboard.
En app/build.gradle.kts antes de:
android {
defaultConfig {
...
}
}agrega:
val localProps = Properties()
val localFile = rootProject.file("local.properties")
if (localFile.exists()) {
localProps.load(localFile.inputStream())
}y dentro de:
android {
defaultConfig {
...
}
}agrega:
buildConfigField("String", "CLIENT_ID", "\"${project.findProperty("CLIENT_ID") ?: ""}\"")
buildConfigField("String", "REDIRECT_URI", "\"${project.findProperty("REDIRECT_URI") ?: ""}\"")
buildConfigField("String", "AUTHORIZATION_ENDPOINT", "\"${project.findProperty("AUTHORIZATION_ENDPOINT") ?: ""}\"")- Abre Android Studio → AVD Manager → crea un emulador (p. ej. Pixel 6, API 33).
- Run → selecciona el emulador y ejecuta la app.
- Activa Developer options y USB debugging en el dispositivo.
- Conecta por USB y acepta la depuración.
- Run en Android Studio → selecciona tu dispositivo.
- Se usa Authorization Code + PKCE:
- La app abre el navegador con URL
/authorizey parámetros:client_id,response_type=code,redirect_uri,code_challenge,scope, etc. - El usuario inicia sesión y autoriza.
- Spotify redirige al REDIRECT_URI que definiste
<REDIRECT_URI>?code=ABC... - La app captura el
codeenonNewIntent.
- La app abre el navegador con URL
- Se hace POST /api/token con
code + code_verifierpara obteneraccess_tokenyrefresh_token.
- Tokens se guardan cifrados usando security-crypto (EncryptedSharedPreferences).
- El SpotifyAuthInterceptor añade
Authorization: Bearer <token>. - Si una petición falla con 401, el SpotifyAuthenticator hace
refresh_token(POST /api/tokengrant_type=refresh_token), guarda el nuevo token y reintenta la petición.
GET /v1/search?q={query}&type=artist&limit={limit}→ buscar artistas.GET /v1/artists/{id}/albums?include_groups=album,single&limit={limit}→ álbumes del artista.GET /v1/albums/{id}/tracks?limit={limit}→ canciones del álbum.POST /api/token→ intercambio decodeporaccess_tokenyrefresh_token(y refresh de tokens).
La estructura general del proyecto Soundify es la siguiente:
app/src/main/java/com/luis/soundify/
│
├── core/ # Contiene codigo aprovechable para todo el proyecto
├── data/ # Contiene la capa de datos
│ ├── entities/ # Clases relacionadas con las respuestas de la API (Modelos de datos)
│ ├── remote/ # Clases relacionadas con Retrofit y llamadas a la API
│ ├── local/ # Almacenamiento seguro (EncryptedSharedPreferences)
│ ├── repository/ # Implementaciones de los repositorios
│ └── mappers/ # Transformaciones entre modelos de datos y modelos de dominio
│
├── domain/ # Contiene la lógica de negocio
│ ├── models/ # Modelos de datos
│ └── repository/ # Interfaces que abstraen la capa de datos
│
├── presentation/ # Contiene la UI de Jetpack Compose y ViewModels
│ └── screensX/ # Pantallas y composables
│
├── di/ # Módulos de Hilt para inyección de dependencias
│
├── composables/ # Composables generales
│
├── SoundifyApplication.kt # Inicialización de Hilt
└── SpotifyAuthManager.kt # Autenticación de Spotify
La interfaz gráfica de esta aplicación está inspirada en el diseño de la siguiente propuesta en Figma:
Musium - Music App UI & Community
Se utilizó como referencia para la paleta de colores, tipografía y disposición de elementos, adaptándola al desarrollo con Jetpack Compose.
Si deseas ponerte en contacto conmigo, puedes encontrarme en LinkedIn:
¡Gracias por revisar Soundify! 🎧
