API 31 已弃用“VIBRATOR_SERVICE:字符串”

问题描述 投票:0回答:9

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

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

VIBRATOR_SERVICE 现在显示为已弃用。我怎样才能更换它?或者至少,API 31 及以上版本的现代解决方案是什么?

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

android deprecated vibration android-api-31
9个回答
64
投票
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
}

29
投票

该领域的文档这样说:

此常量在 API 级别 31 中已弃用。 使用

VibratorManager
检索默认系统振动器。

需要

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

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

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


4
投票

此代码适用于新旧 Android 设备。参考文档 在指定的时间内持续振动。。您应该使用

VibrationEffect
来创建振动模式。

在爪哇中:

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

在 Kotlin 中:

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

val DELAY = 0
val VIBRATE = 1000
val SLEEP = 1000
val START = 0
val vibratePattern = longArrayOf(DELAY.toLong(), VIBRATE.toLong(), SLEEP.toLong())

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,以检索默认的振动器服务。

正确的代码如下(Java):

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

正确的代码如下(Kotlin 中):

val vibrator: Vibrator

vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val vibratorManager: VibratorManager = getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
    vibratorManager.getDefaultVibrator()

} else {
    // backward compatibility for Android API < 31,
    // VibratorManager was only added on API level 31 release.
    // noinspection deprecation
    getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
}
val DELAY = 0
val VIBRATE = 1000
val SLEEP = 1000
val START = 0
val vibratePattern = longArrayOf(DELAY.toLong(), VIBRATE.toLong(), SLEEP.toLong())

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

1
投票

将各种答案放在一起并进行清理,以考虑 SDK 31 和 26 中的更改,同时提供向后兼容性。

@SuppressWarnings("deprecation")
private void vibrate() {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
        VibratorManager vibratorManager = (VibratorManager) getContext().getSystemService(Context.VIBRATOR_MANAGER_SERVICE);
        Vibrator vibrator = vibratorManager.getDefaultVibrator();
        vibrator.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
    }
    else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        Vibrator vibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
    } else {
        // API < 26
        Vibrator vibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(500);
    }
}

1
投票

我创建了一个包装类来处理兼容性问题:

class VibratorHelper private constructor(private val context: Context) {

    @Suppress("DEPRECATION")
    fun vibrate(duration: Long) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            val vibratorManager = context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
            vibratorManager.defaultVibrator.run {
                cancel()
                vibrate(VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE))
            }
        } else {
            val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
            vibrator.cancel()
            if (Build.VERSION.SDK_INT >= 26) {
                vibrator.vibrate(VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE))
            } else {
                vibrator.vibrate(duration)
            }
        }
    }

    companion object {
        @JvmStatic
        fun from(context: Context): VibratorHelper? {
            val hasVibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                val vibratorManager = context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
                vibratorManager.defaultVibrator.hasVibrator()
            } else {
                @Suppress("DEPRECATION")
                val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
                vibrator.hasVibrator()
            }
            return if (hasVibrator) VibratorHelper(context.applicationContext) else null
        }
    }
}

使用方法如下:

val vibrator = VibratorHelper.from(context)
vibrator?.vibrate(500)

1
投票

这就是我在我的应用程序(Kotlin)中使用的。它处理所有旧版本并隐藏已弃用的警告。它会短暂振动。

fun AppCompatActivity.vibrate() {
    val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        val vibratorManager = getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
        vibratorManager.defaultVibrator
    } else {
        @Suppress("DEPRECATION")
        getSystemService(AppCompatActivity.VIBRATOR_SERVICE) as Vibrator
    }
    val duration = 200L
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        vibrator.vibrate(VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE))
    } else {
        @Suppress("DEPRECATION")
        vibrator.vibrate(duration)
    }
}

0
投票

手柄SDK< 26, 26..32 and >=33

  private val vibrator: Vibrator by lazy {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
      (getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager).defaultVibrator
    } else {
      @Suppress("DEPRECATION")
      getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    }
  }

 @SuppressLint("MissingPermission")
  private fun startVibrator() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
      vibrator.vibrate(
          VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE),
          VibrationAttributes.createForUsage(VibrationAttributes.USAGE_ALARM)
      )
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      @Suppress("DEPRECATION")
      vibrator.vibrate(
        VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE),
        AudioAttributes.Builder()
          .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
          .setUsage(AudioAttributes.USAGE_ALARM)
          .build()
      )
    } else {
      @Suppress("DEPRECATION")
      vibrator.vibrate(1000)
    }
  }


0
投票

这是新旧 api 的简单答案

允许振动

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

之后将此代码用于 kotlin

@Suppress("DEPRECATION")
private fun vibrate(){

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        val vibratorManager = getSystemService(VIBRATOR_MANAGER_SERVICE) as VibratorManager
        vibratorManager.defaultVibrator
    } else {
        val vibrator = getSystemService(VIBRATOR_SERVICE) as Vibrator
        vibrator.vibrate(10)
    }
}

之后只需调用该方法即可


0
投票

我创建了一个上下文扩展来获取 Vibrator 服务:

@SuppressLint("ServiceCast")
fun Context.getVibratorManagerService() =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        val vibratorManager =
            getSystemService(VIBRATOR_MANAGER_SERVICE) as VibratorManager
        vibratorManager.defaultVibrator
    } else {
        @Suppress("DEPRECATION")
        getSystemService(VIBRATOR_SERVICE) as Vibrator
    }


© www.soinside.com 2019 - 2024. All rights reserved.