如何定位多个 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