【问题标题】:On Android - how to capture image/video from the wide angle camera?在 Android 上 - 如何从广角相机捕获图像/视频?
【发布时间】:2020-01-04 11:54:44
【问题描述】:

如何从 camera2 api 广角相机捕捉图像或视频? 还是望远镜相机? 我知道如何处理前后摄像头的摄像头捕捉。 我只是不明白如何打开相机并选择广角/伸缩相机?

我猜这与设置以下之一有关:

CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
CameraCharacteristics.getPhysicalCameraIds()
CameraCharacteristics.getAvailablePhysicalCameraRequestKeys()
CameraDevice.createCaptureSession(SessionConfiguration config)
CameraCharactersitics.LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE

但我无法理解设置它的场景,也没有找到任何好的解释。 我将不胜感激任何类型的教程或解释。 最后一个问题 - 如何在没有物理设备的情况下对其进行测试?我的意思是 - 如何设置 Avd/模拟器?

【问题讨论】:

  • 嗨,伙计!您找到解决问题的方法了吗?您是如何通过选择相机来完成任务的?
  • 我还在研究。在 Android 10 上,其他摄像头也是物理摄像头,这意味着您可以像打开其他任何摄像头一样打开摄像头。相机 ID 是个大问题。对于某些广角相机 ID 为 3,对于某些广角相机是 cameraID = 2。
  • 这里有同样的需求。我找不到使用广角相机的方法。谷歌表示它不是使用 camerax 的方式:该方法是基于用例的......但我们需要一个用例“广角”。

标签: android camera android-camera2


【解决方案1】:

所以我在 CameraX 讨论组上问了这个问题,这是来自 google 的回复:

为了让 CameraX 支持广角相机,我们正在与制造商合作,首先通过 camera2 公开这些相机。今天,某些设备确实以不确定的方式这样做。随着我们的进展,我们会及时通知您,谢谢!

【讨论】:

    【解决方案2】:

    所以,如果有人仍在寻找答案: 几乎没有制造商支持,直到 android 10。从 android 10 - 所有物理相机都是逻辑相机。 这意味着您可以在

    上看到这些摄像头
    manager.getCameraIdList()
    

    您将获得所有可用相机的列表,只需查找 CameraCharacteristics.LENS_FACING 方向。并填充一个列表。

    这里是完整的代码:

    public CameraItem[] GetCameraListFirstTime() {
        List<CameraItem> listValuesItems = new ArrayList<CameraItem>();
        boolean IsMain = false;
        boolean IsSelfie = false;
        if(manager == null)
            manager = (CameraManager)mContext.getSystemService(CAMERA_SERVICE);
        try {
    
            for (String cameraId : manager.getCameraIdList()) {
                CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId);
                if (!IsMain && chars.get(CameraCharacteristics.LENS_FACING) == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                    listValuesItems.add(new CameraItem(Integer.parseInt(cameraId), "Main"));
                    IsMain = true;
                }
                else if (!IsSelfie && chars.get(CameraCharacteristics.LENS_FACING) == Camera.CameraInfo.CAMERA_FACING_BACK) {
    
                        listValuesItems.add(new CameraItem(Integer.parseInt(cameraId), "Selfie"));
                        IsSelfie = true;
                }
                else
                    listValuesItems.add(new CameraItem(Integer.parseInt(cameraId), "Wide or Other"));
            }
    
        }
        catch (CameraAccessException e) {
            Log.e(TAG, e.toString());
    
        }
        return listValuesItems.toArray(new CameraItem[0]);
    }
    
    public class CameraItem implements java.io.Serializable{
    public int Key;
    public String Description;
    public CameraItem(int key, String desc)
    {
        Key=key;
        Description = desc;
    }
    

    【讨论】:

    • 我认为这个逻辑是不正确的。如果相机不是主相机也不是自拍,那么我们只是假设它是广角相机。对于剩下的一个广角相机来说,这实际上不是必要的&&不够的条件。此外,它不是来自系统。此外,我们没有考虑焦距、它给出的图像大小、角度等参数来确定相机是否是广角相机。我对这里的想法/讨论持开放态度。
    • 这个问题是关于如何打开其他相机:“广角相机?或望远镜”。我已经在许多真实设备上对其进行了测试。该代码可以在我的应用程序上运行并运行。您的评论是正确的,但我确实写了“Wide or Other”。了解相机是否宽 - 这不仅仅是这个问题的范围。为了获得这些数据——你需要打开每个相机,询问它的参数,然后关闭。对于每个摄像机。我不会推荐它。每个用户都会收到很多错误(相机异常)
    • getCameraIdList 只返回后置或前置摄像头 id,还返回 mb 外置 USB 摄像头 id(如果您有一个连接到您的智能手机设备),它与 multicamera 的广角摄像头无关跨度>
    • 非常糟糕的答案...我猜你是Android新手,如果不确定它是如何工作的,请不要急于回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多