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

Gee*_*Gee 132 api camera android android-camera android-camera2

新的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上运行,而且还需要最新版本的...

Edd*_*ala 152

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

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

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

  • 弃用Camera API是一个错误,他们应该推出一个Camera高级API(用于高级应用程序,如完整的相机应用程序) - 否则(大多数)使用相机拍摄照片的应用程序必须保持2 api.谷歌应该至少推出一个紧凑的库(一如既往) (20认同)
  • 所以唯一的方法是使用if语句和android.os.Build.VERSION.SDK_INT来分离代码? (5认同)
  • 这取决于您的应用程序的功能.如果相机功能是简单的傻瓜相机,并且您想要定位旧的API,只需使用旧的Camera API即可.但是,如果您想要做的不仅仅是抓取JPEG并绘制预览,或者如果您只是定位新的API,请使用camera2.在(硬)中间是想要在camera2上提供精美可选功能的应用程序,但也适用于旧设备.在那里,您必须构建两个单独的代码路径,每个API一个. (2认同)

slo*_*ott 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());
    }
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以将所有东西分开,这将使您的生活变得更加轻松.

建议 - 与camera2的生活并不是那么好.Venders仍然会进行垃圾实现,因此您必须添加许多条件和变通方法.

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

  • 这是真的.相机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(如果是). (14认同)

use*_*770 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
 }
Run Code Online (Sandbox Code Playgroud)

  • 这对于完整的相机实现来说几乎不实用.另外,现在你必须维护两个代码路径.版本检查确实在android开发中有用,但这不是它. (32认同)
  • 如果用户正在运行Build.VERSION_CODES.LOLLIPOP_MR1会发生什么?还是上面的东西?我认为你的第二次检查应该是"else if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)" (5认同)