Por que controlar a vibração no Android? De "ding" a uma obra-prima tátil
\n\nVocê já se perguntou por que alguns aplicativos vibram de forma agradável e precisa, enquanto outros parecem uma furadeira do vizinho? Tudo se resume à frequência e amplitude da vibração. No Stack Overflow, a pergunta "How to make an Android device vibrate with different frequency?" acumulou milhares de visualizações — e não é por acaso. Desenvolvedores não querem apenas "ligar a vibração", mas criar um feedback tátil significativo: um toque leve, um sinal de alarme pulsante ou a simulação do pressionamento de um botão mecânico.
\n\nNeste artigo, vamos explorar como controlar a vibração no Android usando Kotlin. Você aprenderá quais APIs existem, como elas evoluíram do Android 8 ao Android 14 e qual abordagem escolher para o seu projeto. Vamos lá!
\n\nUma breve viagem pela história: do Vibrator ao VibratorManager
\n\nPor muito tempo, os desenvolvedores Android usavam a classe Vibrator e o método vibrate(long milliseconds). Simples, mas limitado: nenhum controle sobre a frequência. Com o Android 8 (API 26), o Google apresentou o VibrationEffect — uma ferramenta poderosa para criar padrões de vibração complexos. Já no Android 12 (API 31), foi adicionado o VibratorManager, que permite gerenciar vários vibradores (por exemplo, em dispositivos dobráveis).
Hoje, temos três abordagens principais:
\n- \n
- Vibrator + VibrationEffect (API 26+) — básico, mas flexível. \n
- VibratorManager (API 31+) — moderno, para dispositivos com múltiplos vibradores. \n
- Vibrator.vibrate() obsoleto — apenas para compatibilidade reversa. \n
Vamos focar nas duas primeiras, pois elas oferecem controle sobre frequência e amplitude.
\n\nPreparação: permissão para vibrar
\n\nAntes de iniciar um "terremoto", não se esqueça de adicionar a permissão no AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE" />\n\nSem ela, seu código será simplesmente ignorado — sem erros, mas também sem vibração.
\n\nMétodo 1: VibrationEffect — controle de frequência e amplitude (API 26+)
\n\nA classe VibrationEffect permite criar vibração com frequência definida (através da amplitude) e duração. A frequência no Android não é definida diretamente em hertz — em vez disso, usa-se a amplitude (0–255), que é convertida pelo hardware em frequência. Quanto maior a amplitude, mais intensa a vibração.
Vibração simples com amplitude
\n\nval vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator\n\n// Vibração de 500 ms com amplitude máxima (255)\nval effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)\nvibrator.vibrate(effect)\n\nVibração com frequência (amplitude) diferente
\n\nQuer uma vibração fraca? Defina a amplitude como 50:
\nval weakVibration = VibrationEffect.createOneShot(300, 50)\nvibrator.vibrate(weakVibration)\n\nAmplitude 255 é a máxima, 1 é quase imperceptível. Experimente!
\n\nPadrões: vibração com pausas
\n\nÀs vezes, você não quer apenas um "ding", mas uma pulsação. Use createWaveform:
val timings = longArrayOf(0, 200, 100, 300) // pausa, vibração, pausa, vibração\nval amplitudes = intArrayOf(0, 200, 0, 150) // amplitude para cada etapa\n\nval pattern = VibrationEffect.createWaveform(timings, amplitudes, -1) // -1 = não repetir\nvibrator.vibrate(pattern)\n\nO primeiro elemento de timings é o atraso inicial. Geralmente, define-se como 0. amplitudes deve ter o mesmo comprimento. Se você passar null em vez do array de amplitudes, a amplitude máxima será usada em todas as etapas.
Método 2: VibratorManager — para dispositivos modernos (API 31+)
\n\nA partir do Android 12, é recomendado usar o VibratorManager