关于 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;
}
如何从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;
}