6

Как заставить Android-устройство вибрировать с разной частотой?

36

Я разработал Android-приложение и теперь хочу, чтобы устройство вибрировало при выполнении определенного действия. Как я могу это реализовать?

5 ответ(ов)

11

Для того чтобы использовать вибрацию в вашем приложении на Android, вы можете воспользоваться следующим примером кода:

import android.os.Vibrator;
...
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Вибрация в течение 500 миллисекунд
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
    // Устарело в API 26 
    v.vibrate(500);
}

Примечание:

Не забудьте добавить разрешение в файл AndroidManifest.xml:

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

Этот код проверяет версию API и использует соответствующий метод для вызова вибрации устройства. Если версия API 26 или выше, используется VibrationEffect, а для более ранних версий вызывается устаревший метод vibrate(long milliseconds). Убедитесь, что вы правильно указали разрешение на вибрацию в манифесте вашего приложения, иначе вызов метода вибрации не сработает.

1

Обновление 2017: метод vibrate(interval) устарел в Android-O (API 8.0)

Для обеспечения совместимости со всеми версиями Android используйте следующий метод.

// Вибрировать в течение 150 миллисекунд
private void shakeItBaby() {
    if (Build.VERSION.SDK_INT >= 26) {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
    } else {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(150);
    }
}

Kotlin:

// Вибрировать в течение 150 миллисекунд
private fun shakeItBaby(context: Context) {
    if (Build.VERSION.SDK_INT >= 26) {
        (context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE))
    } else {
        (context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(150)
    }
}
0

Вибрация без использования разрешений

Если вам нужно просто вызвать вибрацию устройства один раз для предоставления обратной связи при выполнении действия пользователем, вы можете использовать функцию performHapticFeedback() класса View. Для этого не требуется указывать разрешение VIBRATE в манифесте.

Используйте следующую функцию в качестве топ-левел функции в каком-нибудь универсальном классе, например, в Utils.kt вашего проекта:

/**
 * Вибрирует устройство. Используется для предоставления обратной связи, когда пользователь выполняет действие.
 */
fun vibrate(view: View) {
    view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
}

А затем просто используйте её в любом месте вашего Fragment или Activity следующим образом:

vibrate(requireView())

Просто и понятно!

0

Вышеупомянутые ответы отличные. Однако, я хотел бы, чтобы мое приложение вибрировало ровно дважды при нажатии на кнопку, и эта небольшая информация здесь отсутствует, поэтому пишу для будущих читателей, таких как я. 😃

Мы должны следовать тому, что уже сказано выше, и единственное изменение будет в паттерне вибрации, как показано ниже:

long[] pattern = {0, 100, 1000, 300};
v.vibrate(pattern, -1); // -1 это важно

Это вызовет вибрацию ровно дважды. Как мы уже знаем:

  1. 0 — это задержка
  2. 100 — это вибрация в течение 100 мс в первый раз
  3. затем идет задержка в 1000 мс
  4. после этого повторная вибрация на 300 мс

Можно продолжать добавлять задержки и вибрации поочередно (например, 0, 100, 1000, 300, 1000, 300 для 3-х вибраций и так далее...), но помните слова @Dave и используйте это ответственно. 😃

Также обратите внимание, что параметр repeat установлен в -1, что означает, что вибрация произойдет ровно так, как указано в паттерне. 😃

0

Обновление Kotlin для большей типобезопасности

Используйте это как функцию верхнего уровня в каком-нибудь общем классе вашего проекта, например, Utils.kt.

// Вибрирует устройство в течение 100 миллисекунд.
fun vibrateDevice(context: Context) {
    val vibrator = getSystemService(context, Vibrator::class.java)
    vibrator?.let {
        if (Build.VERSION.SDK_INT >= 26) {
            it.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE))
        } else {
            @Suppress("DEPRECATION")
            it.vibrate(100)
        }
    }
}

А затем вызывайте её в любом месте вашего кода следующим образом:

vibrateDevice(requireContext())

Объяснение

Использование Vibrator::class.java более типобезопасно, чем использование строковых констант.

Мы проверяем vibrator на нулевое значение с помощью let { }, потому что если вибрация недоступна для устройства, vibrator будет равен null.

В секции else допустимо подавить предупреждение о депрекации, так как оно относится к более новой версии SDK.

Нам не нужно запрашивать разрешение во время выполнения для использования вибрации. Однако нам нужно указать его в AndroidManifest.xml следующим образом:

<uses-permission android:name="android.permission.VIBRATE"/>
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь