Как заставить Android-устройство вибрировать с разной частотой?
Я разработал Android-приложение и теперь хочу, чтобы устройство вибрировало при выполнении определенного действия. Как я могу это реализовать?
5 ответ(ов)
Для того чтобы использовать вибрацию в вашем приложении на 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)
. Убедитесь, что вы правильно указали разрешение на вибрацию в манифесте вашего приложения, иначе вызов метода вибрации не сработает.
Обновление 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)
}
}
Вибрация без использования разрешений
Если вам нужно просто вызвать вибрацию устройства один раз для предоставления обратной связи при выполнении действия пользователем, вы можете использовать функцию performHapticFeedback()
класса View
. Для этого не требуется указывать разрешение VIBRATE
в манифесте.
Используйте следующую функцию в качестве топ-левел функции в каком-нибудь универсальном классе, например, в Utils.kt вашего проекта:
/**
* Вибрирует устройство. Используется для предоставления обратной связи, когда пользователь выполняет действие.
*/
fun vibrate(view: View) {
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
}
А затем просто используйте её в любом месте вашего Fragment
или Activity
следующим образом:
vibrate(requireView())
Просто и понятно!
Вышеупомянутые ответы отличные. Однако, я хотел бы, чтобы мое приложение вибрировало ровно дважды при нажатии на кнопку, и эта небольшая информация здесь отсутствует, поэтому пишу для будущих читателей, таких как я. 😃
Мы должны следовать тому, что уже сказано выше, и единственное изменение будет в паттерне вибрации, как показано ниже:
long[] pattern = {0, 100, 1000, 300};
v.vibrate(pattern, -1); // -1 это важно
Это вызовет вибрацию ровно дважды. Как мы уже знаем:
- 0 — это задержка
- 100 — это вибрация в течение 100 мс в первый раз
- затем идет задержка в 1000 мс
- после этого повторная вибрация на 300 мс
Можно продолжать добавлять задержки и вибрации поочередно (например, 0, 100, 1000, 300, 1000, 300 для 3-х вибраций и так далее...), но помните слова @Dave и используйте это ответственно. 😃
Также обратите внимание, что параметр repeat установлен в -1, что означает, что вибрация произойдет ровно так, как указано в паттерне. 😃
Обновление 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"/>
Установить курсор в конец текста в EditText
Как запустить Activity из другого приложения в Android
Как исправить 'android.os.NetworkOnMainThreadException'?
Ошибка «Необходимо переопределить метод суперкласса» после импорта проекта в Eclipse
Room - Директория экспорта схемы не указана аннотационному процессору, не удается экспортировать схему