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

66

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

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

Android Studio给我一个警告,说方法vibrate(interval)已过时,我应该使用VibrationEffect针对API>23。

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

我尝试搜索但没有关于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
请翻译以下与程序编写相关的内容,从英文到中文。只返回翻译后的文本:在问题本身发布代码。不要包含屏幕截图。 - Arpit Solanki
1
整型:振动的强度。这必须是1到255之间的值,或DEFAULT_AMPLITUDE。(根据文档) - Omar Dhanish
https://developer.android.com/reference/android/os/VibrationEffect.html#createOneShot(long,%20int) - Mike M.
添加了代码,如果您想查看。 - Hitesh Sahu
shakeItBaby PMPL - Ilya Gazman
显示剩余2条评论
9个回答

38

使用Kotlin

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

28

幅度是一个int值。它表示震动的强度。它必须在1和255之间,或者是DEFAULT_AMPLITUDE,它的值为-1。

您可以使用VibrationEffect.DEFAULT_AMPLITUDE来调用。

更多详情请参见这里


2
请注意,在Xamarin Forms中,这被定义为“VibrationEffect.DefaultAmplitude”。 - Thierry

16

你可以用这个来实现触觉反馈(震动):

view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);

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


2
对于大多数用途而言,这应该是正确的选择,因为它是迄今为止最简单(和本地)的实现。 - Mariano Zorrilla

12

更新支持 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。

1
val vibrator = context.getSystemService(Vibrator::class.java) - Ticherhaz FreePalestine

5

我刚刚偶然发现,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)
    }
}

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


请注意,此处模式将以两种不同的方式工作。createWaveform接受时间和振幅,而vibrate接受成对的开/关时间。 - Ivan Shafran

2

2

为我工作的 kotlin 扩展函数

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

good luck ✌ :))


1

在这里输入图像描述打开管理 NuGet 包

搜索并安装Xamarin.Essentials

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

1
已经是毫秒单位了,不需要进行任何转换:https://developer.android.com/reference/android/os/Vibrator.html#vibrate(long)。只需要一行代码即可。 - android developer

1
 @Suppress("DEPRECATION")
    fun setVibrationSettings(context: Context, isVibrationOn: Boolean) {
        val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            val vibrationEffect =
                VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE)
            (context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager).run {
                if (isVibrationOn) {
                    this.defaultVibrator.vibrate(vibrationEffect)
                } else {
                    this.defaultVibrator.cancel()
                }
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val vibrationEffect =
                VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE)
            (context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator).run {
                if (isVibrationOn) {
                    this.vibrate(vibrationEffect)
                } else {
                    this.cancel()
                }
            }
        } else {
            (context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator).run {
                if (isVibrationOn) {
                    this.vibrate(1000)
                } else {
                    this.cancel()
                }
            }
        }
    }

使用支持31和26 SDK的检查SDK编码

添加权限

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接