Вибрация Android устарела. Как использовать VibrationEffect в Android›= API 26?

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

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

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

Поэтому я использовал метод createOneShotVibrationEffect, который принимает 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);
    }
}

person Hitesh Sahu    schedule 10.08.2017    source источник
comment
разместите код в самом вопросе. Не включать скриншоты   -  person Arpit Solanki    schedule 10.08.2017
comment
int: Сила вибрации. Это должно быть значение от 1 до 255 или DEFAULT_AMPLITUDE. (согласно документации)   -  person Omar Dhanish    schedule 10.08.2017
comment
developer.android.com/reference/android/ ОС/   -  person Mike M.    schedule 10.08.2017
comment
Я добавил снимок экрана, чтобы показать параметры метода.   -  person Hitesh Sahu    schedule 10.08.2017
comment
добавлен код, если вы хотите увидеть   -  person Hitesh Sahu    schedule 10.08.2017


Ответы (8)


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

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

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

person Kapil G    schedule 10.08.2017
comment
Обратите внимание, что в Xamarin Forms это определяется как VibrationEffect.DefaultAmplitude - person Thierry; 30.12.2018

с котлином

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)
    }
}
person aolphn    schedule 25.10.2018

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

view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);

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

person Bob    schedule 10.08.2017
comment
Для большинства применений это должно быть правильным, поскольку на данный момент это самая простая (и нативная) реализация. - person Mariano Zorrilla; 18.03.2019

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

// 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.

person Yogesh Umesh Vaity    schedule 15.10.2019

Я только что наткнулся на это и обнаружил, что VibrationEffect.createWaveform() в основном использует тот же long[]-шаблон, что и старый 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)), поэтому нет необходимости использовать разные функции.

person hardysim    schedule 17.10.2018
comment
Обратите внимание, что шаблон здесь будет работать двумя разными способами. createWaveform принимает тайминги и амплитуды, а вибрация принимает парные тайминги включения/выключения. - person Ivan Shafran; 29.01.2021

работает на меня kotlin ext fun

для тактильного эффекта вибро имеет 5 миллисекунд!! (SHORT_HAPTIC_FEEDBACK_DURATION)

fun Context.performHapticFeedback() {
    val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val vibrationEffect = VibrationEffect.createOneShot(HAPTIC_FEEDBACK_DURATION, VibrationEffect.DEFAULT_AMPLITUDE)
        vibrator.vibrate(vibrationEffect)
    } else {
        vibrator.vibrate(TimeUnit.MILLISECONDS.toMillis(SHORT_HAPTIC_FEEDBACK_DURATION))
    }
}

private const val SHORT_HAPTIC_FEEDBACK_DURATION = 5L

использование

addOnItemTouchListener(ItemTouchListener { position, event ->
                if (event.action == MotionEvent.ACTION_DOWN) {
                    context.performHapticFeedback()  
                }  
            })

разрешение

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

удачи ✌ :))

person Serg Burlaka    schedule 22.04.2020

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

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

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

person jojois74    schedule 04.05.2018

введите описание изображения здесьОткройте Управление пакетами NuGet.

Найдите и установите Xamarin.Essentials

try {
 var duration = TimeSpan.FromMilliseconds(300);
 Vibration.Vibrate(duration);
} 
 catch (FeatureNotSupportedException ex){} 
 catch (Exception ex){}
person Newred    schedule 03.04.2019
comment
Это уже в мс. Не нужно ничего конвертировать: developer.android.com/reference /андроид/ОС/ . Нужна всего одна строка кода. - person android developer; 13.06.2019