新的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上运行,而且还需要最新版本的...
即使旧的相机API被标记为已弃用,它仍然完全正常运行,并且将保持相当长的一段时间(因为Play商店中几乎所有使用相机的应用程序当前都使用它)。
您将不得不忽略Android Studio对其被弃用的抱怨,但如果您想支持早于21的Android版本,则必须使用旧的API。
在API级别21,您当然可以使用新API及其新功能,但如果您在API之间切换,目前您必须在应用程序中维护完全独立的流程。不幸的是,这两个API有着不同的世界观,很难编写一个支持库,可以让你在旧设备上使用类似新API的东西(如果不是,那么库将从新API映射到旧API)在API 21+)。
将所需的所有方法放在界面中,然后创建一个这样的相机实例
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设备报告支持的图像大小列表 - 但并非所有这些都实际支持!!
要支持您想要的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
}
虽然,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。
使用支持注释
@TargetApi(21)
避免检查
我发现最好的选择是创建两个活动。使用常规方法检查当前设备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);
这样,回顾代码时我不必有很多困惑。代码很容易修改,因为它分开了。
Plz阅读链接Camera Version Support他们说.... 相机API1 Android 5.0弃用了Camera API1,随着新平台开发重点关注Camera API2,它仍在逐步淘汰。但是,淘汰期很长,Android版本将继续支持Camera API1应用程序一段时间。具体而言,支持继续: