Android:如何检查设备是不是实现了 Camera2 api 功能?
Posted
技术标签:
【中文标题】Android:如何检查设备是不是实现了 Camera2 api 功能?【英文标题】:Android: How can I check if a device has Camera2 api features implemented or not?Android:如何检查设备是否实现了 Camera2 api 功能? 【发布时间】:2015-09-06 19:59:58 【问题描述】:那么,我如何检查安卓设备是否实现了 Camera2 api 功能? camera2 api 中有许多新功能,例如手动控制。那么我怎么知道是否以编程方式实现了哪些 Camera2 api 功能?
【问题讨论】:
你试过了吗code
mManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); mCameraIds = mManager.getCameraIdList(); code
?
【参考方案1】:
确实,camera2 api 仅从 API 级别 21 开始支持。但仅此检查是不够的。有些设备的 API 级别为 21,但仅部分支持相机 2。要检查这一点,您应该检查 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL 的值。它可以是 FULL、LEGACY 或 LIMITED。 详情请看这里:https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html
获取方法如下:
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
for (String cameraId : manager.getCameraIdList())
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(cameraId);
Log.d("Img", "INFO_SUPPORTED_HARDWARE_LEVEL " + characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
【讨论】:
使用上面的代码,我们得到了一些数值。因此,作为参考,LEGACY、LIMITED、FULL 和 LEVEL_3 的数值分别为 2、0、1 和 3。 我得到前后摄像头不同的结果。我的前置摄像头是 FULL,后置摄像头是 LIMITED。不确定如何处理这些信息,因为我想将 Camera2 用于支持它的较新手机,但对于不支持它的手机,默认使用旧的 Camera API。【参考方案2】:实际上,检查 API 版本 21+ 即可。 camera2 API,包括CameraManager
是系统的一部分,不依赖于现有的硬件。因此,您可以随时向CameraManager
询问CameraDevice
s 的列表,然后您可以单独查询。
但是,我认为您的实际意思是“我如何判断是否可以使用 camera2 API 手动设置摄影参数?”,这取决于您拥有的设备。这取决于您需要什么控制,但您需要的信息可以通过获取REQUEST_AVAILABLE_CAPABILITIES
metadata field 来收集。提示:寻找MANUAL_SENSOR
。
【讨论】:
我的意思是一种检查棒棒糖设备是否支持Camera2 api的方法,因为有些棒棒糖设备没有实现Camera2 api。因此,在未实现 Camera2 api 的此类设备上调用CameraManager
可能会导致崩溃。你看,我不是在谈论硬件支持,而是设备是否实现了 Camera2 api。我认为我的问题会将您重定向到硬件部分,因此我正在对其进行编辑。很抱歉这个错误。
这样的话,我回答的第一句话就足够了。
但是 CameraManager 是 Camera2 api 的一部分吗?那么如何在没有实现 api 的设备上使用它呢?
没错,CameraManager 是 camera2 的一部分。但是 camera2 是 Android Lollipop、API 21 和更新版本的一部分。检查 API 21+ 的存在有效地检查了 camera2 的存在,它有效地检查了 CameraManager 的存在。因此,您只需检查 API 级别。
这个 Reddit 线程正在解决我上面描述的第二个问题,即实际上启用手动控制的制造商并不多。但是,每个 API 21+ 设备都实现了对 camera2 类的软件级调用。相信我,他们并没有在该线程中说应用程序会因尝试调用 CameraManager 引发异常(当然,只要它是棒棒糖)。【参考方案3】:
我在另一个项目中也需要这个,所以我编写了一个小应用程序来探测所有 camera2 功能并显示手机上可用的功能:https://play.google.com/store/apps/details?id=de.weis.camera2probe
您可以在应用内通过电子邮件发送此报告。我在这里列出了我收到的所有报告:https://github.com/TobiasWeis/android-camera2probe/wiki (应用程序的代码也在那里,以防有人需要集成到自己的项目中)
【讨论】:
【参考方案4】:如果有人需要全面了解如何确定设备中的哪个摄像头具有 Camera2 API 支持(至少有限支持):
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public boolean allowCamera2Support(int cameraId)
CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
try
String cameraIdS = manager.getCameraIdList()[cameraId];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIdS);
int support = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
if( support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY )
Log.d(TAG, "Camera " + cameraId + " has LEGACY Camera2 support");
else if( support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED )
Log.d(TAG, "Camera " + cameraId + " has LIMITED Camera2 support");
else if( support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL )
Log.d(TAG, "Camera " + cameraId + " has FULL Camera2 support");
else
Log.d(TAG, "Camera " + cameraId + " has unknown Camera2 support?!");
return support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED || support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
catch (CameraAccessException e)
e.printStackTrace();
return false;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void checkCamera2Support()
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP )
int numberOfCameras = 0;
CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
try
numberOfCameras = manager.getCameraIdList().length;
catch (CameraAccessException e)
e.printStackTrace();
catch(AssertionError e)
e.printStackTrace();
if( numberOfCameras == 0 )
Log.d(TAG, "0 cameras");
else
for (int i = 0; i < numberOfCameras; i++)
if (!allowCamera2Support(i))
Log.d(TAG, "camera " + i + " doesn't have limited or full support for Camera2 API");
else
// here you can get ids of cameras that have limited or full support for Camera2 API
【讨论】:
【参考方案5】:安装应用程序:手动相机兼容性。它检查手动对焦、白平衡、ISO、快门速度和 RAW 支持。全部通过 camera2 HAL 驱动程序曝光。我已经在 AT&T 商店安装了上述设备,以便在购买前检查手机。了解您是否购买昨天型号的好方法。
https://play.google.com/store/apps/details?id=pl.vipek.camera2_compatibility_test&hl=en
【讨论】:
这个应用程序似乎并没有真正探索每个显示的功能可用性。在我的 S5 Neo 上,它根本没有显示手动控制,但我可以通过 camera2 api 设置固定焦点和白平衡。 有大量其他评论抱怨该应用存在同样的问题。好像不太靠谱。【参考方案6】:安装应用程序更好的相机。您将能够检查它是否是完整的、遗留的、有限的或 mot 支持者。 这就是我发现三星galaxy Tab 3 SMT820 iscamera2 api full的原因。
【讨论】:
【参考方案7】:相机 API2
Camera API2 框架向应用公开了较低级别的相机控制,包括高效的零拷贝连拍/流式传输以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等的每帧控制。有关详细信息,请观看 Google I/O 视频概述。
Android 5.0 及更高版本包括 Camera API2;但是,运行 Android 5.0 及更高版本的设备可能不支持所有 Camera API2 功能。应用可以通过 Camera API2 接口查询的 android.info.supportedHardwareLevel 属性报告以下支持级别之一:
LEGACY: These devices expose capabilities to apps through the Camera API2 interfaces that are approximately the same capabilities as those exposed to apps through the Camera API1 interfaces. The legacy frameworks code conceptually translates Camera API2 calls into Camera API1 calls; legacy devices do not support Camera API2 features such as per-frame controls.
LIMITED: These devices support some Camera API2 capabilities (but not all) and must use Camera HAL 3.2 or later.
FULL: These devices support all of major capabilities of Camera API2 and must use Camera HAL 3.2 or later and Android 5.0 or later.
LEVEL_3: These devices support YUV reprocessing and RAW image capture, along with additional output stream configurations.
EXTERNAL: These devices are similar to LIMITED devices with some exceptions; for example, some sensor or lens information may not be reported or have less stable frame rates. This level is used for external cameras such as USB webcams.
这个What is Camera2 API? Check if your Smartphone supports it可以帮助你找到它!
【讨论】:
以上是关于Android:如何检查设备是不是实现了 Camera2 api 功能?的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何检查设备是不是通过 WiFi - Direct 连接到另一台设备?