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

时间:2017-08-10 05:23:37

标签: android android-vibration android-8.0-oreo

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

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

Android Studio警告我不推荐使用方法vibrate(interval)我应该使用VibrationEffect来获取API> 23。

所以我使用VibrationEffect的方法createOneShot,它采用2个参数:间隔和幅度。 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);
    }
}

8 个答案:

答案 0 :(得分:16)

幅度是一个int值。它的振动强度。这必须是1到255之间的值,或DEFAULT_AMPLITUDE,即-1。

您可以将其用作VibrationEffect.DEFAULT_AMPLITUDE

更多详情here

答案 1 :(得分:6)

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

view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);

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

答案 2 :(得分:4)

与科特林

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 :(得分:1)

此库可能会帮助您: https://github.com/josephrubin/Rumble-4-Android

你需要的只是 Rumble.once(150);

它为您处理API版本。

答案 4 :(得分:1)

我偶然发现了这一点,发现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),因此无需使用其他功能。

答案 5 :(得分:0)

enter image description here打开管理NuGet软件包

搜索并安装 Xamarin.Essentials

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

答案 6 :(得分:0)

已针对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。

答案 7 :(得分:0)

为我工作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"/>

祝你好运✌:))