如何使用Android的camera或camera2 API来支持旧版本和新版本的API,而无需弃用说明?


135

新的camera2 API使我感到困惑。我想开发一个使用设备摄像头的应用程序(适用于Android API 10-21)。如前所述这里,我应该使用“相机” API。

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

我不仅希望我的应用程序在旧版Android上运行,而且还希望在最新版本上运行。

Answers:


152

即使将旧的相机API标记为已弃用,它仍然可以正常运行,并且会保留相当长的一段时间(因为Play商店中几乎所有使用相机的应用程序当前都使用它)。

您将不得不忽略Android Studio关于不推荐使用它的抱怨,但是如果您想支持早于21的Android版本,则必须使用旧的API。

在API级别21上,您当然可以使用新的API及其新功能,但是如果您在两种API之间切换,则当前必须在应用程序中保持完全独立的流程。不幸的是,这两个API的世界观差异很大,因此很难编写一个支持库,让您也可以在较旧的设备上使用类似新API的库(如果没有,则库将从新API映射到旧API。在API 21+上)。


1
好答案。因此,如果您想支持16级及以上的API,最好暂时使用旧相机,对吗?
Loolooii 2015年

5
所以唯一的方法是使用if语句和android.os.Build.VERSION.SDK_INT分隔代码?
哈迪

因此,对于开发人员而言,如果仅针对API 21和更高版本,请使用Camera2,但如果需要旧版支持,请使用Camera?还是建议您使用不同的API检测构建版本并编码2种不同的方法?
john.weland 2015年

2
这取决于您的应用程序执行的操作。如果相机功能只是简单的傻瓜相机,并且您想定位旧API,只需使用旧相机API。但是,如果您想做的事情不仅仅是获取JPEG和绘制预览,或者只是针对新的API,请使用camera2。在(硬性)中间是希望在camera2上提供精美的可选功能,但也可以在旧设备上运行的应用程序。在那里,您必须构建两个单独的代码路径,每个API都一个。
Eddy Talvala 2015年

21
弃用Camera API是一个错误,他们应该引入Camera Advanced API(适用于高级应用程序,例如完整的Camera应用程序)-否则(大多数)仅使用相机拍照的应用程序必须维护2个api。Google应该至少引入了一个紧凑的库(一如既往)
Sudara

38

将您需要的摄像机中的所有方法放入接口中,然后创建一个这样的摄像机实例

    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());
    }

这样,您便可以将一切分解,这将使您的生活变得更加轻松。

忠告-使用camera2的生活并不是那么好。供应商仍在胡扯实施,因此您将不得不添加许多条件和解决方法。

示例1-S6报告它不支持Flash :)示例2-LG设备报告了支持的图像尺寸列表-但是实际上并非所有图像都受支持!


14
这是真的。摄像头2 API实际上将摄像头设备分为三类:LEGACY,LIMITED和FULL。如果将摄像机分类为LEGACY,那么所有的camera2 API调用都将在后台转换为camera1,因此这真的不值得花时间。我的建议是调用CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... 并选择旧的API(如果正确)。
panonski '16

9

要支持所需的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
 }

33
对于完整的相机实现,这几乎是不实际的。另外,现在您必须维护两个代码路径。版本检查在Android开发中确实有用,但不是。
katzenhut

5
如果用户正在运行Build.VERSION_CODES.LOLLIPOP_MR1,该怎么办?还是在那之上?我认为您的第二次检查应该是“否则if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)”
拉尔夫·皮纳

亲爱的,如果我的应用程序应该在16和更新版本的api中运行,该如何在相同的apk camera2和旧api中进行构建?香料对这项工作有好处吗?
Mateus

您必须实现两个API。只需保留一个接口和两个类,即可实现相机功能。在创建用于运行相机的实例之一之前,请调用上述方法,以便它可以找出要调用的类和功能
user0770

3

虽然,Google推荐使用Camera2 Api> = 21,但是您可能无法进行手动设置。

当您需要工具应用程序以自动设置模式拍照时,它将很好用。但!如果需要使用手动设置模式实现创建应用,对于API> = 21的设备,首先,需要检查支持的硬件级别:

选择摄像机(前,脸),获取其特性并检查硬件级别。

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristics代表下一个受支持的级别:LIMITED,FULL,LEGACY,LEVEL_3,EXTERNAL。

在较高级别上,级别为:

对于较旧的Android设备,传统设备在向后兼容模式下运行,并且功能非常有限。

LIMITED设备代表基线功能集,并且还可能包含作为FULL子集的其他功能。

FULL设备还支持对传感器,闪光灯,镜头和后处理设置进行逐帧手动控制,以及高速率的图像捕获。

LEVEL_3设备还支持YUV重新处理和RAW图像捕获,以及其他输出流配置。

如果您获得了LEGACY supprot级别,则应使用旧的Camera Api



0

Plz阅读链接相机版本支持 他们指出:
相机API1
Android 5.0不推荐使用相机API1,由于新平台开发重点是相机API2,相机API1仍在逐步淘汰。但是,淘汰期将很长,Android版本将在一段时间内继续支持Camera API1应用程序。具体来说,将继续支持:

  • 用于应用程序的Camera API1接口。在Camera API1之上构建的Camera应用程序应像在运行Android早期版本的设备上一样运行。
  • 相机HAL版本。包括对Camera HAL1.0的支持。

  • -1

    我发现最好的选择是创建两个活动。使用一般方法检查当前设备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);

    这样一来,当回顾代码时,我不必感到困惑。由于代码是分开的,因此很容易修改。

    By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
    Licensed under cc by-sa 3.0 with attribution required.