Текущее поведение
Я использую react-native-camera
с iPad / iPhone и использую фронтальную камеру для сканирования штрих-кодов (Code39, Code128,QR и т. Д.) Однако при использовании фронтальной камеры она не фокусируется на штрих-коде или на предметах, которые я слегка прилегаю к камере.Задняя камера работает абсолютно идеально, однако фронтальная камера не работает.
Я не смог протестировать Android, так как я строю не для Android, а только для iOS.Похоже, я не могу найти никакой информации о фокусировке фронтальной камеры.
Если бы я стоял на заднем плане, поднесите мой Code39 близко к камере, но оставьте небольшой зазор внизу, этоне пытался сфокусироваться на карте, но оставался сосредоточенным на мне в фоновом режиме.
Я также поднял проблему здесь на их странице GitHub, но пришел сюда, чтобы посмотреть, побежал ли кто-нибудьк этому раньше, имеет обходной путь и т. д.
Ожидаемое поведение
Я ожидаю, что камера увидит, что код занимает намного больше экрана, чем яутра, сосредоточиться на нем, прочитать код и приступить к выполнению кода onBarCodeRead
Что я пытался это исправить?
- Отключить
autoFocus
, поскольку это было исправлением для Android, здесь не повезло. - Вручную установите
focusDepth
. - Вручную установите
autoFocusPointOfInterest
в центр экрана. - Изменить
zoom
до 0,2 и медленно увеличиваться до точки, где это начинает выглядеть глупо. - Установите
onGoogleVisionBarcodesDetected
на простоconsole.log что-то, как это было еще одно исправление для Android. - Обновление
react-native-camera@2.6.0
- Обновление в главной ветви в
react-native-camera@git+https://git@github.com/react-native-community/react-native-camera.git
Как можноЯ воссоздаю его?
- Создать новый реактивный проект
yarn add react-native-camera
/ npm install react-native-camera --save
- установить
type={RNCamera.Constants.Type.front}
для использования фронтальной камеры. - set
autoFocus={RNCamera.Constants.AutoFocus.on}
(В любом случае он включен по умолчанию, это просто гарантирует. - set
onBarCodeRead={() => alert('barcode found')}
- Попробуйте отсканировать Code39 / Code128 - (можно создать здесь)
- Попробуйте отсканировать его, и вы обнаружите, что камера не будет фокусироваться на нем, однако сфокусируйтесь на фоне.Это также верно, если вы закрываете камеру пальцем, когда вы отводите палец в сторону, вы ожидаете, что камера не сфокусирована на фоне, и попытаетесь перефокусироваться.Это не тот случай, он останется сфокусированным на среднем / большом расстоянии.
Используемое программное обеспечение и версии
- iOS: 12.1.4
- реакция-нативная камера: ^ 2.1.1 / 2.6.0
- реакция-нативная: 0,57,7
- реакция: 16,6,1
Код
Я рендерил камеру в react-native-modal
, и я поместил свой код ниже.
<RNCamera
style={styles.camera}
type={RNCamera.Constants.Type.front}
flashMode={RNCamera.Constants.FlashMode.off}
autoFocus={RNCamera.Constants.AutoFocus.on}
captureAudio={false}
onBarCodeRead={(barcode) => {
if (this.state.isModalVisible) {
this.setState({
isModalVisible : false
}, () => this.captureQR(barcode.data));
}
}}>
Соответствующий код пакета
Я нашел код, который кажется уместным:
в RNCamera.m
метод updateFocusDepth
- (void)updateFocusDepth
{
AVCaptureDevice *device = [self.videoCaptureDeviceInput device];
NSError *error = nil;
if (device == nil || self.autoFocus < 0 || device.focusMode != RNCameraAutoFocusOff || device.position == RNCameraTypeFront) {
return;
}
if (![device respondsToSelector:@selector(isLockingFocusWithCustomLensPositionSupported)] || ![device isLockingFocusWithCustomLensPositionSupported]) {
RCTLogWarn(@"%s: Setting focusDepth isn't supported for this camera device", __func__);
return;
}
if (![device lockForConfiguration:&error]) {
if (error) {
RCTLogError(@"%s: %@", __func__, error);
}
return;
}
__weak __typeof__(device) weakDevice = device;
[device setFocusModeLockedWithLensPosition:self.focusDepth completionHandler:^(CMTime syncTime) {
[weakDevice unlockForConfiguration];
}];
}
Более конкретно, только этот раздел здесь:
Если device.position == RNCameraTypeFront
, он просто вернется, если не соответствует ни одному из других критериев.
if (device == nil || self.autoFocus < 0 || device.focusMode != RNCameraAutoFocusOff || device.position == RNCameraTypeFront) {
return;
}