В основномCameraX
какой-то ключ Знание Краткое введение баллов。не будет полностью представленCameraX
изиспользовать。
Далее приведены некоторые концепции и моменты внимания, а также введение существительных и другой контент.
Android
Сейчасиспользоватькамера В основномпроходитьCameraX
иCamera2
。Общие приложенияизразвиватьиспользоватьCameraX
Просто используйте библиотеку для вызова камеры。
потому чтоCameraX
СравниватьCamera2
Простой,Простой,Простой。 Многие функции непосредственно инкапсулированы вapi
Это внутри, чтобы мы могли позвонить,В то же время совместимость также высока.
CameraX
основан наCamera2
Сборка пакетаиз。Если вам нужен низкий уровень(Нижний уровень)изкамера控件来支持复杂用пример。ТакCamera2
Сразуданасизлучший выбор。
Оригинальная камера для использования,Нужна сама Конфигурация, много вариантов. И обратите внимание на выпуск объектов камеры и данных предварительного просмотра и т. д.,Конфигурациягромоздкий。иGoogle
ИнкапсулированныйCamera2
,Помогли нам упростить управление многими камерами.,Пусть разработчикам нужно сосредоточиться только на предварительном просмотре,Фотография,анализировать。Подождите реальной сцены。Вся эта библиотека методов инкапсулирована вCameraX
,Позже объединились вJetpack
библиотека。
CameraX
из Функции:Подводя итогCameraX
из一些Функции,Семейная история. Только для справки.
То есть мы можем игнорировать настройку и разрушение камеры. Сосредоточьтесь на таких данных, как изображения, выводимые камерой.
Наши общие функции делятся на:
PreviewView
В основном для предварительного просмотраНаше приложение в основном использует камеру для последующей бизнес-реализации этих четырех основных функций.
Вышеупомянутые четыре функции не обязательно использовать и вызывать по порядку. Все они могут использоваться независимо. Например, мне нужен только анализ изображений и другие функции не нужны.
Их также можно использовать в комбинации, обычно это предварительный просмотр + анализ + съемка.
Вышеупомянутая функция является вариантом использования. И мы используем CameraX для достижения этих требований, комбинируя различные варианты использования.
Процесс использования CameraX,жизненный цикличный, не требующий от нас управления камерой, система автоматически поможет нам контролировать время входа и выхода из камеры и т. д. Будет основан на жизненном текущей страницы. циклвзять под контроль。переданосистемапо умолчаниюизLifecycleOwner
взять под контрольиз: Примеры следующие: Обычно это даActivity
илиFragment
cameraProvider.bindToLifecycle(this, cameraSelector, previewUseCase);
и如果нас想自己控制CameraX
изжизненный цикл Тогда этого можно добиться путем настройки:
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry lifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleRegistry = new LifecycleRegistry(this);
lifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
lifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}
а потомbindToLifecycle
серединаиз lifecycleOwner
изменение объектадля нас自定义изlifecycleRegistry
。
Если вы хотите одновременно поддерживать предварительный просмотр и съемку видео,Таккамера都能支持。но Если вы хотите просмотреть+видеострельба+фотосессия,ТакнуждатьсяLIMITED
и лучшеизкамера,
И предпросмотр+видеосъемка+анализ Просто нужноLEVEL_3
и лучшеизкамера。
Потому что производительность передней и задней двойной камеры многих устройств различна. Поэтому некоторые функции поддерживаются задней камерой, но не поддерживаются передней камерой. Так как узнать?
может пройтиCamera2CameraInfo
категории для понимания。
Пример. Следующий код проверяет, включена ли задняя камера по умолчанию. LEVEL_3
оборудование:
@androidx.annotation.OptIn(markerClass = ExperimentalCamera2Interop.class)
Boolean isBackCameraLevel3Device(ProcessCameraProvider cameraProvider) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
List\ filteredCameraInfos = CameraSelector.DEFAULT_BACK_CAMERA
.filter(cameraProvider.getAvailableCameraInfos());
if (!filteredCameraInfos.isEmpty()) {
return Objects.equals(
Camera2CameraInfo.from(filteredCameraInfos.get(0)).getCameraCharacteristic(
CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL),
CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3);
}
}
return false;
}
Диапазон уровней:LEGACY < LIMITED < FULL < LEVEL_3
。
Если мы используем комбинацию вариантов использования (предпросмотр+анализ+фото+видео), то она будет вызываться в первый раз. createCaptureSession()
Появлятьсяаномальный.
CameraX автоматически выбирает лучшее устройство камеры на основе требований вашего приложения и вариантов использования. Если вы хотите использовать устройство, отличное от выбранного для вас, у вас есть несколько вариантов:
CameraSelector.DEFAULT_FRONT_CAMERA
Запрашивает префикс по умолчанию Камера.CameraSelector.DEFAULT_BACK_CAMERA
проситьпо умолчаниюиззадний Камера。CameraSelector.Builder.addCameraFilter()
в соответствии с CameraCharacteristics
Отфильтруйте список доступных устройств.Все устройства камеры должны быть распознаны системой и отображены в CameraManager.getCameraIdList(), прежде чем мы сможем их использовать.
Этот процесс идентификации – это то, что должны выполнить производители оборудования.
CameraSelector cameraSelector =
CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
Затем передайте cameraSelector в CameraProvider для настройки камеры.
По умолчанию угол, полученный при предварительном просмотре, — это тот, который был выбран.,иImageAnalysisАнализ изображенийикартина ФотографияImageCaptureНет,нуждатьсянас根据传递过来изimageProxy.getImageInfo().getRotationDegrees()
Процесс。
Например, ImageCapture может выполнять поворот напрямую:
ImageCapture imageCapture = new ImageCapture.Builder().build();
OrientationEventListener orientationEventListener = new OrientationEventListener((Context)this) {
@Override
public void onOrientationChanged(int orientation) {
int rotation;
// Monitors orientation values to determine the target rotation value
if (orientation >= 45 && orientation < 135) {
rotation = Surface.ROTATION_270;
} else if (orientation >= 135 && orientation < 225) {
rotation = Surface.ROTATION_180;
} else if (orientation >= 225 && orientation < 315) {
rotation = Surface.ROTATION_90;
} else {
rotation = Surface.ROTATION_0;
}
imageCapture.setTargetRotation(rotation);
}
};
orientationEventListener.enable();
По умолчанию CameraX использует систему отображения наилучшего разрешения.,ифотосессияImageCaptureи Анализ изображенийImageAnalysisрежим,Будет использоваться по умолчанию4:3
изширина и высота Сравнивать值 也Сразуда640*480
。
CameraX будет использовать разные разрешения для разных случаев использования. Не все последовательны. По умолчанию
режим предварительного просмотра:Самый высокий предварительный просмотр по умолчаниюразрешение。Следуй за щитомразрешение Сделать матчиз Лучший размер。(Можно регулировать)
режим анализа:по умолчаниюразрешениедля640*480。(Можно регулировать)
режим съемки:по умолчанию Самый высокий доступныйразрешение,Или максимальное разрешение, предпочтительное для устройства, соответствующее указанному выше соотношению сторон.
нас也может пройтиsetTargetResolution(Size resolution)
Укажите конкретныеизразрешение,Сделайте анализные снимки. Пример:
ImageAnalysis imageAnalysis =
new ImageAnalysis.Builder()
.setTargetResolution(new Size(1280, 720))
.build();
Вышеуказанное разрешение,нас还может пройти指定ширина и высота Сравниватьосознать:setTargetAspectRatio
но,Два параметра Конфигурация не могут использоваться одновременно.,В противном случае это будет ПоявлятьсяIllegalArgumentException
аномальный.
То есть в конкретном случае вы не можете одновременно установить соотношение сторон и разрешение.
в то же время,может пройтиStreamConfigurationMap.getOutputSizes(int)
для просмотра текущей поддержки устройстваиз Функцииразрешение。
Вспышка в основном используется при фотосъемке, и способ ее включения относительно прост:
ImageCapture mImageCapture = new ImageCapture.Builder().setFlashMode(ImageCapture.FLASH_MODE_AUTO).build();
setFashMode: включать ли вспышку, есть четыре основных режима:
Мы можем добиться масштабирования, фонарика, замера фокусировки (нажмите для фокусировки) и компенсации экспозиции с помощью элементов управления камерой.
Camera camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)
//Можно использовать часто используемые функции камеры
CameraControl cameraControl = camera.getCameraControl()
// Вы можете запросить состояние этих часто используемых функций камеры.
CameraInfo cameraInfo = camera.getCameraInfo()
масштабировать:CameraControl.setZoomRatio()
используется дляв соответствии смасштабировать Сравниватьпримернастраиватьмасштабировать,CameraControl.setZoomRatio()
используется для0приезжать1.0междуиз Линейныймасштабировать。
фонарик:CameraControl.enableTorch(boolean)
Фонарик (также называемый фонариком) можно включить или отключить.
фокус:CameraControl.startFocusAndMetering()
может быть указано в соответствии с FocusMeteringAction настраивать AF/AE/AWB Область замера для запуска автофокусировки и замера экспозиции. Существует множество приложений для камеры, которые таким образом реализуют функцию фокусировки касанием.
В основном речь идет о настройке камеры, записывающей видео. В остальном все аналогично. В основном мы вводим некоторые общие элементы конфигурации:
VideoCapture mVideoCapture = new VideoCapture.Builder().build();//Для записи видео
processCameraProvider.bindToLifecycle(this, mCameraSelector, mVideoCapture, mPreview);
Перед созданием VideoCapture мы можем настроить следующие параметры:
VideoCapture capture= new VideoCapture.Builder()
.setVideoFrameRate()
.setBitRate()
.setAudioBitRate()
...
.build()
Ссылка: https://developer.android.google.cn/training/camerax.