6

正如标题所说,我升级到 API 31。我有一个执行振动的功能,但在行

val vib = this.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

VIBRATOR_SERVICE现在显示为已弃用。我该如何更换它?或者至少,API 31 及更高版本的现代解决方案是什么?

编辑:正如 Joachim Sauer 所写,替代方案是 VibrationManager。我现在需要的是使用 VibrationManager 的等效代码行。

4

4 回答 4

10

该领域的文档是这样说的:

此常量在 API 级别 31 中已弃用。 用于VibratorManager检索默认系统振动器。

需要实例的代码最直接的翻译Vibrator是这样的:

val vibratorManager = this.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
val vibrator = vibratorManager.getDefaultVibrator();

一般来说,每当像这样不推荐使用类/方法/字段时,您应该首先检查文档。几乎每一次它都会告诉你用什么来代替(或者在某些情况下它没有替代品)。

于 2021-07-21T08:16:56.090 回答
7
val vib = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val vibratorManager =
        getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
    vibratorManager.defaultVibrator
} else {
    @Suppress("DEPRECATION")
    getSystemService(VIBRATOR_SERVICE) as Vibrator
}
于 2021-09-29T09:12:05.390 回答
1

我的答案是在 Java 中。如果你能理解的话。此代码适用于新旧 android 设备。参考文档在指定的时间段内不断振动。. 您应该使用 aVibrationEffect来创建振动模式。

Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

final int DELAY = 0, VIBRATE = 1000, SLEEP = 1000, START = 0;
long[] vibratePattern = {DELAY, VIBRATE, SLEEP};
    
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

   vibrator.vibrate(VibrationEffect.createWaveform(vibratePattern, START));

   } else {
        // backward compatibility for Android API < 26
        // noinspection deprecation
        vibrator.vibrate(vibratePattern, START);
   }

编辑

此方法适用于以下 API 级别 30,因此要在 API 级别 31 上完全使用此方法,您需要使用 VIBRATOR_MANAGER_SERVICE 而不是 VIBRATOR_SERVICE 来检索默认振动器服务。

正确的代码如下:

Vibrator vibrator;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {

   VibratorManager vibratorManager = (VibratorManager) getSystemService(Context.VIBRATOR_MANAGER_SERVICE);

   vibrator = vibratorManager.getDefaultVibrator();

  } else {
        // backward compatibility for Android API < 31,
        // VibratorManager was only added on API level 31 release.
        // noinspection deprecation
        vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

  }

  final int DELAY = 0, VIBRATE = 1000, SLEEP = 1000, START = 0;
  long[] vibratePattern = {DELAY, VIBRATE, SLEEP};
    
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

     vibrator.vibrate(VibrationEffect.createWaveform(vibratePattern, START));

     } else {
          // backward compatibility for Android API < 26
          // noinspection deprecation
          vibrator.vibrate(vibratePattern, START);
     }
于 2021-09-29T09:27:11.893 回答
0

这是新旧api的简单答案

private void vibrate() {
    //vibrate phone
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
        VibratorManager vibratorManager = (VibratorManager) mContext.getSystemService(Context.VIBRATOR_MANAGER_SERVICE);
        vibratorManager.getDefaultVibrator();
    }
    else {
        Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(10);
    }
于 2022-03-03T18:59:36.487 回答