如何使用Android相机或camera2 API支持旧版和新版API,而无需弃用备注?

时间:2014-12-03 13:22:53

标签: android api camera android-camera android-camera2

新的camera2 API让我感到困惑。我想开发一个使用设备相机的应用(适用于Android API 10 - 21)。如上所述here,我应该使用“相机”API。

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

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

7 个答案:

答案 0 :(得分:150)

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

您必须忽略Android Studio关于其被弃用的投诉,但如果您想支持早于21的Android版本,则必须使用旧版API。

在API级别21上,您当然可以使用新API及其新功能,但如果您在API之间切换,目前您必须在应用中维护完全独立的流程。不幸的是,这两个API有着不同的世界观,很难编写一个支持库,可以让你在旧设备上使用类似新API的东西(其中库从新API映射到旧的API,如果没有API 21 +)。

答案 1 :(得分: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生活并不是那么好。 Venders仍然会进行垃圾实现,因此您必须添加许多条件和解决方法。

示例1 - S6报告它不支持flash :) 示例2 - LG设备报告支持的图像大小列表 - 但并非实际上都支持所有图像大小!!

答案 2 :(得分: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
 }

答案 3 :(得分:2)

虽然Google推荐使用Camera2 Api&gt; = 21,但您可能会遇到手动设置问题。

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

选择相机(正面,面部),获取其特性并检查硬件水平。

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristics代表下一个支持的级别: 有限,全额,遗产,LEVEL_3,外部。

在较高级别,级别为:

LEGACY 设备以旧版Android设备的向后兼容模式运行,功能非常有限。

有限设备代表基线功能集,还可能包含FULL子集的其他功能。

完整设备还支持传感器,闪光灯,镜头和后处理设置的每帧手动控制,以及高速率的图像捕捉。

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

如果你有 LEGACY 支持级别,你应该使用旧的Camera Api

答案 4 :(得分:1)

使用支持注释

    @TargetApi(21)

避免检查

答案 5 :(得分:-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);

这样,回顾代码时我不必有太多的困惑。代码很容易修改,因为它分开了。

答案 6 :(得分:-1)

请Plz读取链接Camera Version Support 他们说....
相机API1
Android 5.0弃用了Camera API1,随着新平台开发的重点是Camera API2,该API继续被淘汰。但是,淘汰期将很长,Android版本将在一段时间内继续支持Camera API1应用程序。具体来说,将继续支持:

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