如何定位多个 API 级别?

Posted

技术标签:

【中文标题】如何定位多个 API 级别?【英文标题】:How to target multiple API levels? 【发布时间】:2011-09-24 16:33:13 【问题描述】:

我希望在两个单独的 API 级别上使用 android 的 Camera.open() 方法。第一个是 API 级别 7,即 2.1 及更高版本,第二个是 2.3.3 和 2.3.4,即 API 级别 9。

在 API 级别 7 和 8 上,Camera.open 方法不接受任何参数。在 API 级别 9 及更高级别上,相机采用一个整数参数,为其提供要使用的 cameraId。

如何在同一代码中同时定位两个 API 级别?类似于这个伪代码的东西:

Camera lCamera;
if (Platform.APILevel < 7)
  lCamera.open();
else  
  lCamera.open(0);

【问题讨论】:

【参考方案1】:

我们经常做反射检测。比如:

    public Camera getCamera() 
        try 
            Method method = Camera.class.getMethod("open", Integer.TYPE);
            return (Camera) method.invoke(null, 0);
         catch (Exception e) 
                // Yes, I really want to handle all exceptions here!!!!
                Log.d(TAG,"Error when trying to invoke Camera.open(int), reverting to open()",e);
                return Camera.open();
        
    

【讨论】:

:) 酷。如果反射不经常运行(相机检索没问题),它会很好地工作 - 因为反射很慢。还有另一种有趣的方法,但不知何故,我发现它不是很有说服力......你可以编译(或下载)最新和最好的 android-all-classes jar 文件到你的 eclipse 项目中(但将它保存在 lib 目录之外)。并将它包装在上面的异常中......这将在eclipse中编译得很好,只有在运行时你会得到异常。但是,如果您想进行 ant build,这会增加额外的复杂性。 ... 只是一个跟进...如果 import 语句需要在以前版本的 SDK 中找不到的类呢? 这就是我上面写的 .jar 方法。 我是否必须将 targetSdk 设置为 9 才能做到这一点,或者我可以将其保持在 7 吗?【参考方案2】:

一般来说,您只需针对可以避免的最低 API 级别。为 API 级别 7 构建的任何内容都适用于 API 级别 8、9、10 等。在这种情况下,只需调用 lCamera.open();,它将选择找到的第一个后置摄像头。如果要使用前置摄像头,则必须使用更高级别的 API 级别 9。

【讨论】:

不正确 - 对于 3.0 及更高版本,您可能需要致电 invalidateOptionsMenu()。在所有较低的 API 版本上,此方法不存在,因此如果存在,您需要使用反射来调用它。【参考方案3】:

您可以通过读取final static整数android.os.Build.VERSION.SDK_INT来获取API级别。

在您的清单中,确保您设置了android:minSdkVersion AND android:targetSdkVersion

【讨论】:

这也有助于始终定位所需的***别 API,然后围绕所需的最高 API 级别不支持的区域。检查需要更改哪些内容以绕过较低的 API 级别的唯一方法似乎是不断更改项目的目标构建。 Sorry, I thought you were looking for how to implement the Platform.APILevel`.

以上是关于如何定位多个 API 级别?的主要内容,如果未能解决你的问题,请参考以下文章

Android PlayStore警告您的应用目前的目标是API级别25

C#如何获得具有多个级别的Json计数

Ionic 始终允许定位 API 级别 29

如何在订阅级别获取不同资源类型的 Azure 资源计数限制和配额?

前端获取用户位置信息

如何允许较低 Android API 级别的用户下载较高 API 级别版本的应用程序?