如何使用Android的相机或camera2 API来支持旧的和新的API版本,而不需要弃用笔记?

新的camera2 API令我困惑。 我想开发一个使用设备相机的应用程序(用于Android API 10 – 21) 。 如此处所述,我应该使用“相机”API。

但是,当我尝试将“Camera”API (android.hardware.Camera)添加到清单的用户function时, 它被标记为已弃用 。 另一方面,我不能将其更改为“camera2”API (android.hardware.camera2),因为它仅与Android API 21+(Android 5 – 棒棒糖)兼容 – 也将其链接,但我只能添加2个链接。

我不仅希望我的应用能够运行在较旧版本的Android上,而且也是最新版本的…

尽pipe旧的相机API被标记为不推荐使用,但它仍然是function齐全的,并且将保持这种状态很长一段时间(因为Play商店中几乎所有使用相机的应用程序都使用它)。

您必须忽略Android Studio对于已弃用的投诉,但是如果您希望支持早于21的Android版本,则必须使用旧的API。

在API级别21上,您当然可以使用新的API及其新function,但是如果您在API之间切换,则目前必须在应用程序中保持完全独立的stream程。 不幸的是,这两个API有足够的世界观,所以很难编写一个支持库来让你在旧设备上使用新的API(如果库不是从新的API映射到旧的API的话)在API 21+上)。

把你需要的相机的所有方法放在一个界面中,然后像这样创build一个相机实例

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Log.d(TAG, "camera2 selected"); this.camera = new Camera2(getContext()); } else { Log.d(TAG, "camera1 selected"); this.camera = new Camera1(getContext()); } 

这样你就会把所有东西都分开,这会让你的生活变得更加容易。

build议 – 用camera2生活并不是那么好。 供应商仍然使用垃圾执行,因此你必须添加很多条件和解决方法。

示例1 – S6报告它不支持闪存:)示例2 – LG设备报告支持的图像大小列表 – 但是并不是所有的都支持!

要支持所需的API,请使用下面的代码。 只要确定相应的API级别的适当的名称。 例如,API 21是LOLLIPOP,API 15是ICE_CREAM_SANDWICH_MR1。

  if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) && ((Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))) { // your code here - is between 15-21 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // your code here - is api 21 } 

使用支持注释

  @TargetApi(21) 

避免检查

我发现最好的select是创build两个活动。 使用一般的方法来检查当前的设备API

 Intent i; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { i = new Intent(context,camera2.class) } else { i = new Intent(context,camera.class); } startActivity(i); 

这样,当回看代码时,我不必非常困惑。 代码很容易修改,因为它分离。