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

问题描述 投票:130回答:7

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

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

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

android api camera android-camera android-camera2
7个回答
150
投票

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

您将不得不忽略Android Studio对其被弃用的抱怨,但如果您想支持早于21的Android版本,则必须使用旧的API。

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


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报告它不支持闪存:)示例2 - LG设备报告支持的图像大小列表 - 但并非所有这些都实际支持!!


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
 }

2
投票

虽然,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。

在较高的水平,水平是:

LEGACY设备在较旧的Android设备上以向后兼容模式运行,并且功能非常有限。

有限的设备代表基线功能集,也可能包含FULL子集的附加功能。

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

LEVEL_3器件还支持YUV再处理和RAW图像捕获,以及其他输出流配置。

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


1
投票

使用支持注释

    @TargetApi(21)

避免检查


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

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


-1
投票

Plz阅读链接Camera Version Support他们说.... 相机API1 Android 5.0弃用了Camera API1,随着新平台开发重点关注Camera API2,它仍在逐步淘汰。但是,淘汰期很长,Android版本将继续支持Camera API1应用程序一段时间。具体而言,支持继续:

  • 用于应用的Camera API1接口。构建在Camera API1之上的相机应用程序应该像运行早期Android发行版本的设备一样工作。
  • 相机HAL版本。包括对Camera HAL1.0的支持。
  • © www.soinside.com 2019 - 2024. All rights reserved.