如何使用 Android 的摄像头或者 camera2API 来支持新旧 API 版本而不需要废弃说明?

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

但是,当我尝试将“ Camera”API (机器人,硬件,摄像头)添加到清单的用户特性 它被标记为已被废弃中时。另一方面,我不能把它改为“ camera2”API (机器人,硬件,相机2),因为它只能与 Android API 21 + (Android 5-Lollipop)兼容——也会链接它,但我只能添加2个链接。

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

89180 次浏览

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

尽管旧的摄像头 API 已经被标记为已经过时了,但它仍然是功能齐全的,并且将在相当长的一段时间内保持这种状态(因为几乎所有在 Play Store 上使用摄像头的应用程序目前都在使用它)。

你必须忽略 Android Studio 关于它已经过时的抱怨,但是如果你想支持早于21的 Android 版本,你必须使用旧的 API。

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

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

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

这样一来,所有的东西都会被分开,你的生活也会变得轻松许多。

给你个建议——有摄像机的生活并不是那么美好。供应商仍然在制造垃圾实现,因此您将不得不添加许多条件和变通方法。

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

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

这样当我回顾代码时就不会有太多的困惑。代码很容易修改,因为它是分离的。

使用支持注释

    @TargetApi(21)

为了避免检查

虽然 Google 推荐使用 Camera2 Api > = 21,但是手动设置可能会有问题。

当你需要用自动设置模式拍摄照片的实现应用程序,它会工作得很好。 但是!如果需要创建具有手动设置模式实现的应用程序,对于 API > = 21的设备,首先,需要检查支持的硬件级别:

选择相机(前,脸) ,得到它的特点和检查硬件水平。

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)


val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

相机特性代表下一个支持级别: 有限,完整,遗留,级别 _ 3,外部。

在高水平上,这些水平是:

LEGACY 设备以向后兼容模式运行,对于较老的 Android 设备,功能非常有限。

LIMITED 设备表示基线特性集,还可能包括 FULL 子集的附加功能。

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

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

如果你得到了 遗产的支持水平,你应该 用老阿比相机

请阅读链接 < a href = “ https://source.android.com/device/Camera/Version”rel = “ nofollow noReferrer”> Camera Version Support 他们说..。
相机 API1
Android 5.0取消了 Camera API1,随着新平台的开发集中在 Camera API2上,它将继续被淘汰。然而,逐步淘汰的时间将会很长,而且 Android 版本将在一段时间内继续支持 Camera API1应用程序。具体来说,继续为以下方面提供支持:

  • 应用程序的相机 API1界面。构建在 Camera API1之上的摄像头应用程序应该像在运行早期 Android 版本的设备上那样工作。
  • 相机 HAL 版本。包括对相机 HAL1.0的支持。