Android вибровызов устарел. Как использовать VibrationEffect в Android >= API 26?

Я использую Android VIBRATOR_SERVICE для получения тактической обратной связи для нажатия кнопки.

 ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(300);

Android Studio сообщит мне, что метод vibrate(interval) устарел. Я должен использовать VibrationEffect для API > 23.

Итак, я использовал метод VibrationEffect createOneShot, который принимает 2 параметра: интервал и амплитуду. введите описание изображения здесь

Я попытался найти его, но не понял, что передать как amplitude, кто-нибудь понял, как его использовать?

Обновление Добавленный код

// Vibrate for 150 milliseconds
private void shakeItBaby() {
    if (Build.VERSION.SDK_INT >= 26) {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150,10));
    } else {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(150);
    }
}

Ответ 1

Амплитуда - это значение int. Его сила вибрации. Это должно быть значение от 1 до 255 или DEFAULT_AMPLITUDE, которое равно -1.

Вы можете использовать его как VibrationEffect.DEFAULT_AMPLITUDE

Подробнее здесь

Ответ 2

с котлин

private fun vibrate(){
    val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         vibrator.vibrate(VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE))
    } else {
         vibrator.vibrate(200)
    }
}

Ответ 3

Вы можете использовать это для тактической обратной связи (вибрации):

view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);

В HapticFeedbackConstants имеются другие константы, такие как VIRTUAL_KEY, KEYBOARD_TAP...

Ответ 4

Эта библиотека может вам помочь: https://github.com/josephrubin/Rumble-4-Android

Все, что вам нужно, это Rumble.once(150);

Он обрабатывает версии API для вас.

Ответ 5

Я просто наткнулся на это и обнаружил, что VibrationEffect.createWaveform() основном использует тот же long[] -pattern, что и старый vibrate().

Из-за этого вы можете повторно использовать существующий шаблон следующим образом (это функция расширения Kotlin):

fun Context.vibrate(pattern: LongArray) {
    val vibrator =
        applicationContext.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator? ?: return

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        vibrator.vibrate(
            VibrationEffect.createWaveform(pattern, VibrationEffect.DEFAULT_AMPLITUDE)
        )

    } else {
        @Suppress("DEPRECATION")
        vibrator.vibrate(pattern, -1)
    }
}

И вместо VibrationEffect.createOneShot() вы также можете использовать шаблон (например, longArrayOf(0, 150)), поэтому нет необходимости использовать другие функции.

Ответ 6

enter image description here Открыть Управление пакетами NuGet

Поиск и установка Xamarin.Essentials

try {
 var duration = TimeSpan.FromMilliseconds(300);
 Vibration.Vibrate(duration);
} 
 catch (FeatureNotSupportedException ex){} 
 catch (Exception ex){}

Ответ 7

Обновлено для Котлина

// Vibrates the device for 100 milliseconds.
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())

Убедитесь, что вы добавили разрешение в AndroidManifest.xml следующим образом:

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

Обратите внимание, что вам не нужно запрашивать разрешение во время выполнения для использования вибрации.

Вам нужно подавить устаревание в предложении else, потому что предупреждение от более нового SDK.