【问题标题】:How to handle `is deprecated. Deprecated in Java`?如何处理`已弃用。在 Java 中弃用了?
【发布时间】:2022-11-20 15:40:03
【问题描述】:

我要使用的代码:

window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)

API 27 中弃用了 FLAG_SHOW_WHEN_LOCKED,API 27 中添加了替代 setShowWhenLocked 我项目中的minSdk是21,targetSdk是33,应该如何正确使用?

我收到警告is deprecated. Deprecated in Java
即使我这样处理:

if(Build.VERSION.SDK_INT >= 27) {
    setShowWhenLocked(true)
    setTurnScreenOn(true)
} else {
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
}

我仍然收到警告。同时支持新旧 API 的正确方法是什么?

【问题讨论】:

    标签: android kotlin deprecation-warning


    【解决方案1】:

    操作说明

    1. 在条件中使用 Build.VERSION.SDK_INT 以根据 SDK_INT 进行相应操作
    2. 如果SDK_INT>=27,则使用setshowwhenlocked;如果SDK_INT<27,则使用FLAG_SHOW_WHEN_LOCKED

      FLAG_SHOW_WHEN_LOCKED/setShowWhenLocked 的示例

      if(Build.VERSION.SDK_INT >= 27) {
          setShowWhenLocked(true)
      } else {
          window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)
      }
      

      但警告仍然存在

      这个警告仍然存在,但我们可以压制,因为我们已经正确处理了旧的 api (5-27) 和新的 api (27>) 并且警告存在只是因为@Deprecated API 没有任何元数据表明它们在哪个 SDK 中被弃用。正如您在this issue 中看到的那样。所以我们可以压制这个警告:

      if(Build.VERSION.SDK_INT >= 27) {
          setShowWhenLocked(true)
          setTurnScreenOn(true)
      } else {
          @Suppress("DEPRECATION")
          window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
                  WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
                  WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
      }
      

      警告

      如果使用正确 API 的 if 条件未正确处理代码,请不要隐藏这些警告。

      例如你不能做什么

      @Suppress("DEPRECATION")
      window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
              WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
              WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
      

      你的 minSdk 是 21,targetSdk 是 33 此代码适用于具有 5-27 API (Android 5 - Android 8.1) 的设备,但不适用于新设备。您必须妥善处理这两种情况。

      Vibrator 的示例

      获得振动器的旧方法

      context.getSystemService(VIBRATOR_SERVICE) as Vibrator
      

      将显示警告'VIBRATOR_SERVICE: String' is deprecated. Deprecated in Java。转到 documentation 并看到此常量可以在 API 1-31 中使用,所以我们必须这样做。在 IDE 和文档中都有关于替代方案的信息:Deprecated: Use android.os.VibratorManager to retrieve the default system vibrator.。如您所见,API 31 中添加了 VibrationManager,因此我们必须为不同的 sdk 版本编写不同的代码:

      val vibrator = if (Build.VERSION.SDK_INT >= 31) {
          val vibratorManager =
              context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
          vibratorManager.defaultVibrator
      } else {
          @Suppress("DEPRECATION")
          context.getSystemService(VIBRATOR_SERVICE) as Vibrator
      }
      

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2012-03-14
      • 2022-07-10
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2021-11-05
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多