Android 振动已弃用。如何在 Android>= API 26 中使用 VibrationEffect?

Android vibrate is deprecated. How to use VibrationEffect in Android>= API 26?

我正在使用 Android 的 VIBRATOR_SERVICE 为按钮触摸提供触觉反馈。

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

Android Studio 警告我方法 vibrate(interval) 已弃用 我应该对 API>23 使用 VibrationEffect

所以我使用了VibrationEffect的方法createOneShot,它有两个参数:间隔和振幅。

我试着搜索它,但不知道要传递什么 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);
    }
}

A​​mplitude 是一个整数值。它的振动强度。这必须是 1 到 255 之间的值,或者 DEFAULT_AMPLITUDE 即 -1。

您可以将其用作 VibrationEffect.DEFAULT_AMPLITUDE

更多详情here

您可以将其用于触觉反馈(振动):

view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);

HapticFeedbackConstants 中还有其他常量可用,例如 VIRTUAL_KEYKEYBOARD_TAP ...

这个库可以帮助你: https://github.com/josephrubin/Rumble-4-Android

你只需要 Rumble.once(150);

它为您处理 API 个版本。

我偶然发现了这个,发现 VibrationEffect.createWaveform() 基本上使用与旧 vibrate() 相同的 long[] 模式。

因此,您可以像这样重用现有模式(这是 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)
    }
}

您也可以使用模式(例如 longArrayOf(0, 150))代替 VibrationEffect.createOneShot(),因此无需使用不同的函数。

使用科特林

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)
    }
}

打开管理 NuGet 包

搜索并安装 Xamarin.Essentials

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

已针对 Kotlin 更新

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

为我工作kotlin ext fun

对于触觉效果,vibro 有 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"/>

祝你好运✌:))