【问题标题】:I keep getting deprecated API warning even with correct check即使检查正确,我也会不断收到弃用的 API 警告
【发布时间】:2018-11-13 11:12:10
【问题描述】:

我正在开发一个 Android 项目,在我的代码中的某个时刻,我需要获取设备序列号。

为了得到它,我曾经使用Build.SERIAL,它自 Android O 以来已被弃用。为了避免出现问题,我开始使用Build.getSerial(),并创建了一个小方法来完成操作系统版本检查:

private static String getSerial() throws SecurityException {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
        return Build.SERIAL;
    }

    return Build.getSerial();
}

注意:我没有检查要授予的权限 READ_PHONE_STATEgetSerial() 方法要求),因为我一开始就这样做,并确保我已经拥有它之前 使用此方法。

问题是,无论我如何写下 Android 操作系统检查,我都会收到已弃用的 API 警告。

我尝试了以下方法,对于所有可能的版本,我一直在 Build.SERIAL 上收到警告

private static String getSerial() throws SecurityException {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        return Build.getSerial();
    }
    return Build.SERIAL;
}

private static String getDeviceUDI() throws SecurityException {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        return Build.getSerial();
    } else {
        return Build.SERIAL;
    }
}

private static String getDeviceUDI() throws SecurityException {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
        return Build.SERIAL;
    } else {
        return Build.getSerial();
    }
}

【问题讨论】:

  • 你的代码没问题。也许您需要清理或失效并再次重新启动您的工作室?
  • 更新你的安卓工作室到最新版本
  • @Umair 我尝试清理项目、重建甚至重新启动 Android Studio,但到目前为止没有任何效果。
  • @FredMaggiowski 有趣的是我在我的 AS 中复制/粘贴了您的代码,它工作正常,没有警告或错误消息:D 在这种情况下,MatPag 的答案是正确的,您将不得不取消警告
  • @Umair 听起来很有趣:|我猜代码是正确的,并且 AS 从周末开始仍然喝醉了......我正在尝试按照 Rahul 的建议更新它

标签: android android-studio deprecated


【解决方案1】:

你需要这样的东西:

@SuppressLint("HardwareIds")
@SuppressWarnings("deprecation")
private static String getSerial() throws SecurityException {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
        return Build.SERIAL;
    }
    return Build.getSerial();
}

隐藏所有不正确的警告

【讨论】:

  • 抑制不是我相信的解决方案,总是有任何警告的原因:)
  • 好的,但我更愿意实际解决警告而不是使其静音。
  • 在 AS 内部有很多地方警告或弃用消息不正确,即使您采取所有措施确保安全,它们仍然存在。如果你知道自己在做什么,有时你唯一能做的就是压制他们。
  • 查看您的代码,我认为您做的一切都是正确的。我认为这是 AS 失败的情况之一。
  • 我尝试将 AS 更新到 v3.1.2 并遇到了一些特殊问题,在修复它们之后我发现没有任何改变。我保留了我的代码并添加了//noinspection deprecation 注释以禁用对Build.SERIAL 的检查。我没有链接抑制警告,但我不知道我还能做什么..
【解决方案2】:

这很烦人,但我只发现这样的工作:

@TargetApi(BUILD.VERSION_CODES.N)
private static String getDeprecatedSerial() {
    return BUILD.SERIAL;
}

private static String getSerial() throws SecurityException {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
        return getDeprecatedSerial();
    }

    return Build.getSerial();
}

这样您就不会收到有关此 API 的 API 级别的弃用警告,也不会抑制所有弃用警告。

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2017-09-25
    • 2017-02-23
    相关资源
    最近更新 更多