【问题标题】: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】:
操作说明
- 在条件中使用
Build.VERSION.SDK_INT 以根据 SDK_INT 进行相应操作
- 如果
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
}