【问题标题】:Optionally using new API on Android可选择在 Android 上使用新 API
【发布时间】:2012-12-19 00:03:42
【问题描述】:

我很确定以前有人问过这个问题,但我在任何地方都找不到,所以请不要咬。

我正在编写一个需要与附近设备通信的 android 应用程序,如果有两个设备碰巧在附近,我想使用 WifiDirect API。

但如果不是这种情况,应用程序仍然可以工作,并且它将使用其他不太有效的方式在参与设备之间进行通信(如 Wifi 接入点共享)。

我还希望这个应用程序能够在旧设备上运行,例如 android 2.2,它根本没有 WifiDirect API(我认为 >=4.0)。

那么有没有办法让我的应用有选择地使用新的 API,但在旧手机的情况下不一定?

【问题讨论】:

  • 你说的是Android API自动切换吗?如果没有,我认为您可以根据 SDK/API 版本使用 if 语句切换实现。
  • 仅供参考,您可以在相关问题中看到@A--C 所谈论内容的示例,例如这个:stackoverflow.com/questions/4236902/…
  • 完美,正是我想要的!

标签: android compatibility


【解决方案1】:

请不要咬人

我们至少可以啃一点吗?只是一点点?

:-)

那么有没有办法让我的应用有选择地使用新的 API,但在旧手机的情况下不一定?

您可以在 Java 版本保护块中包装对新类/方法的引用:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
  // do stuff with WifiP2pManager
}
// optional else block for workaround for older devices

WiFiDirect 可能还有其他细节,我还没有使用过,但这是基本步骤。

【讨论】:

  • 我在浏览时看到的一个有趣的answer 正在捕获与没有方法/类相关的所有异常。不是我推荐它(正确的代码>暴力破解),但至少不会有任何崩溃!
  • @A--C:如果有问题的代码使用反射,那么只有在您仍然支持 Android 1.x 时才需要该技术。
  • 啊,我没有意识到。感谢@CommonsWare :-)
  • Build.VERSION_CODES.ICE_CREAM_SANDWICH 自 API 级别 14 起添加。如果您的应用是针对 API 级别 14 或更高级别构建的,但允许它在较旧的 Android 版本上运行,您可能会遇到运行时异常。最好改用if (Build.VERSION.SDK_INT>=14) {...}
  • @yorkw:不是真的。 Java 编译器只会内联该静态常量的文字值。换句话说,它实际上会评估Build.VERSION.SDK_INT>=14。当然,您仍然需要针对 API 级别 14 或更高级别进行构建以解决编译时错误。
【解决方案2】:

您可以使用Build.VERSION.SDK_INT 检查当前的 API 级别。在 if/case 语句中使用为不同的 API 选择不同的代码。此外,如果您的 minSdk 设置较少,您可能会收到有关专门针对以后 API 的代码的错误或警告。您可以通过使用 @TargetApi(APILEVEL) 注释这些后来的 API 类来解决这些问题

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 2015-11-20
    • 2021-09-21
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多