关于 Android - 如何从广角相机拍摄 image/video?

On Android - how to capture image/video from the wide angle camera?

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

我想这与设置以下其中一项有关:

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

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

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

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

所以,如果有人还在寻找答案: 在 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;
}