Vibración en Android: cómo controlar la frecuencia y la amplitud (Kotlin)

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué controlar la vibración en Android? De «ring» a una obra maestra háptica

\n\n

¿Alguna vez te has preguntado por qué algunas aplicaciones vibran de forma agradable y precisa, mientras que otras lo hacen como el taladro del vecino? Todo se reduce a la frecuencia y amplitud de la vibración. En Stack Overflow, la pregunta «How to make an Android device vibrate with different frequency?» ha obtenido miles de visitas, y no es casualidad. Los desarrolladores no solo quieren «activar el vibrador», sino crear una retroalimentación háptica significativa: un toque ligero, una señal de alarma pulsante o la imitación de la pulsación de un botón mecánico.

\n\n

En este artículo, analizaremos cómo controlar la vibración en Android usando Kotlin. Conocerás las API existentes, cómo han evolucionado desde Android 8 hasta Android 14 y qué enfoque elegir para tu proyecto. ¡Allá vamos!

\n\n

Breve recorrido histórico: de Vibrator a VibratorManager

\n\n

Durante mucho tiempo, los desarrolladores de Android usaban la clase Vibrator y el método vibrate(long milliseconds). Simple, pero limitado: sin control sobre la frecuencia. Con la llegada de Android 8 (API 26), Google presentó VibrationEffect, una herramienta potente para crear patrones de vibración complejos. Y en Android 12 (API 31) se añadió VibratorManager, que permite controlar múltiples vibradores (por ejemplo, en dispositivos plegables).

\n\n

Hoy tenemos tres enfoques principales:

\n
    \n
  • Vibrator + VibrationEffect (API 26+) — básico pero flexible.
  • \n
  • VibratorManager (API 31+) — moderno, para dispositivos con múltiples vibradores.
  • \n
  • Vibrator.vibrate() obsoleto — solo para compatibilidad hacia atrás.
  • \n
\n\n

Nos centraremos en los dos primeros, ya que ofrecen control sobre la frecuencia y la amplitud.

\n\n

Preparación: permiso de vibración

\n\n

Antes de desatar un «terremoto», no olvides añadir el permiso en AndroidManifest.xml:

\n
<uses-permission android:name="android.permission.VIBRATE" />
\n\n

Sin él, tu código simplemente será ignorado: sin errores, pero tampoco habrá vibración.

\n\n

Método 1: VibrationEffect — control de frecuencia y amplitud (API 26+)

\n\n

La clase VibrationEffect permite crear vibraciones con una frecuencia determinada (a través de la amplitud) y duración. La frecuencia en Android no se establece directamente en hercios; en su lugar, se usa la amplitud (0–255), que se convierte por hardware en frecuencia. Cuanto mayor sea la amplitud, más intensa será la vibración.

\n\n

Vibración simple con amplitud

\n\n
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator\n\n// Vibración de 500 ms con amplitud máxima (255)\nval effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)\nvibrator.vibrate(effect)
\n\n

Vibración con diferente frecuencia (amplitud)

\n\n

¿Quieres una vibración débil? Especifica una amplitud de 50:

\n
val weakVibration = VibrationEffect.createOneShot(300, 50)\nvibrator.vibrate(weakVibration)
\n\n

La amplitud 255 es la máxima, 1 es apenas perceptible. ¡Experimenta!

\n\n

Patrones: vibración con pausas

\n\n

A veces no basta con un simple «ring», sino que se necesita una pulsación. Usa createWaveform:

\n
val timings = longArrayOf(0, 200, 100, 300)  // pausa, vibración, pausa, vibración\nval amplitudes = intArrayOf(0, 200, 0, 150)  // amplitud para cada etapa\n\nval pattern = VibrationEffect.createWaveform(timings, amplitudes, -1)  // -1 = no repetir\nvibrator.vibrate(pattern)
\n\n

El primer elemento de timings es el retardo inicial. Normalmente se pone 0. amplitudes debe tener la misma longitud. Si se pasa null en lugar de la matriz de amplitudes, se usará la amplitud máxima en todas las etapas.

\n\n

Método 2: VibratorManager — para dispositivos modernos (API 31+)

\n\n

A partir de Android 12, se recomienda usar VibratorManage

Blogs

Book Recommendations