136

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

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

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

4

7 回答 7

154

尽管旧的相机 API 被标记为已弃用,但它仍然可以正常工作,并且会在很长一段时间内保持这种状态(因为目前 Play 商店中几乎所有使用相机的应用程序都在使用它)。

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

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

于 2015-02-09T19:12:29.040 回答
39

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

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

于 2015-09-11T08:54:14.283 回答
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
 }
于 2014-12-26T13:42:56.103 回答
3

虽然,谷歌推荐使用 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 设备的向后兼容模式下运行,并且功能非常有限。

LIMITED设备代表基线功能集,还可能包括作为 FULL 子集的附加功能。

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

LEVEL_3设备还支持 YUV 再处理和 RAW 图像捕获,以及额外的输出流配置。

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

于 2018-06-05T16:46:15.233 回答
1

使用支持注解

    @TargetApi(21)

避免检查

于 2017-06-10T12:26:48.793 回答
0

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

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

于 2017-05-18T06:53:12.850 回答
0

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

  • 应用程序的相机 API1 接口。基于 Camera API1 构建的相机应用程序应该可以像在运行早期 Android 版本的设备上一样工作。
  • 相机 HAL 版本。包括对相机 HAL1.0 的支持。
  • 于 2018-09-13T14:32:06.320 回答