Как перевернуть камеру, используемую ZXing в Xamaring Forms - PullRequest
0 голосов
/ 18 февраля 2020

Как часть приложения, которое я разрабатываю, я хочу иметь возможность переключаться между использованием передней или задней камеры, но из-за моих поисков и попыток я не смог заставить его работать с помощью передней камеры.

Сканер, выполняющий сканирование, - это вид от ZXing. Net .Mobile.Forms, называемый ZXingScannerView, определен в моем xaml примерно так, вместе с кнопкой, которая должна переключать камеру.

<elements:AdvancedTabbedPage
...
xmlns:elements="clr-namespace:Wolf.Utility.Main.Xamarin.Elements;assembly=Wolf.Utility.Main"
xmlns:forms="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms">
...

<ContentPage>
   <ContentPage.ToolbarItems>
       <ToolbarItem Text="{x:Static resources:AppResources.CameraFlipText}" x:Name="CameraFlipButton" Clicked="CameraFlipButton_OnClicked"/>
   </ContentPage.ToolbarItems>
   <ContentPage.Content>
...
       <forms:ZXingScannerView x:Name="ScannerView" HeightRequest="200" IsAnalyzing="False" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" IsVisible="False" IsScanning="True"/>
...
   </ContentPage.Content>
</ContentPage>

Кнопка видна в правом верхнем углу на следующем изображении, в то время как вид сканера виден только при включенном сканировании, которого нет на изображении.

Изображение Страница, на которой происходит сканирование

Нажатие на кнопку должно переключаться между использованием передней и задней камеры, с передней по умолчанию. Однако, нажав кнопку, похоже, ничего не происходит, кроме записи в мой журнал Код для события Clicked кнопки можно увидеть ниже.

...
private void CameraFlipButton_OnClicked(object sender, EventArgs e)
        {
            Logging.Log(LogType.Information, "Flipping Camera...");

            Config.DefaultOptions.UseFrontCameraIfAvailable = !Config.DefaultOptions.UseFrontCameraIfAvailable;
            Config.CustomOptions.UseFrontCameraIfAvailable = !Config.CustomOptions.UseFrontCameraIfAvailable;

            if (!ScanningToggle.IsToggled) return;

            Logging.Log(LogType.Information, "Restarting Scanning...");
            ScanningToggle.IsToggled = false;
            ScanningToggle.IsToggled = true;
        }

Параметры, упомянутые в приведенном выше коде, определены так же в моем классе Config. Дополнительные значения в элементе CustomOptions установлены в моем методе Init моего класса Config, но они не имеют отношения к этому вопросу.

public class Config
{
...
public static MobileBarcodeScanningOptions CustomOptions = new MobileBarcodeScanningOptions() { UseFrontCameraIfAvailable = true };
public static MobileBarcodeScanningOptions DefaultOptions = new MobileBarcodeScanningOptions() { UseFrontCameraIfAvailable = true };
...
}

Параметры, которые будет использовать мой сканер, всегда выбираются между этими двумя, в зависимости от нескольких пользовательских вводов в настройках.

Пытаясь заставить его работать, я также пытался ...

  1. Инвертировать значение UseFrontCameraIfAvailable, пока сканирование выполняется выполняется

  2. Инвертировать значение UseFrontCameraIfAvailable в параметрах, используемых для запуска сканирования и последующего перезапуска сканирования - код, показанный выше.

  3. Изменить IsScanning ZXingScannerView из true в false, при перезапуске сканирования с измененными параметрами, но это только привело к зависанию камеры.

Нашел один , как я был о том, чтобы задать вопрос. Я попытаюсь последовать этому примеру завтра, но мне все равно очень понравятся мои входные данные.

Не стесняйтесь задавать вопросы или запрашивать дополнительный код, если я что-то пропустил, что вы думаете, может помощь.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Мне удалось выяснить, как успешно перевернуть камеру.

  • Для этого сначала удалите ZXingScannerView из моего стека, который его содержит.

  • Затем я создаю новый экземпляр ZXingScannerView, копируя все настройки из старого (позиционирование макета, значения ZXingScannerView c и т. Д.).

  • Затем я снова добавляю ZXingScannerView в стек, и оттуда вступают в силу любые изменения свойства UseFrontCameraIfAvailable.

Код, созданный для успеха, как следует. Сначала метод generi c, который копирует свойства, затем метод, который воссоздает ZXingScannerView, и, наконец, мой метод, который позволяет сканирование.

private void RecreateScannerView()
        {
            if (Config.DebugMode) Logging.Log(LogType.Debug, $"{nam1eof(RecreateScannerView)} method called");
            ScannerStack.Children.Remove(ScannerView);

            if (Config.DebugMode)
                Logging.Log(LogType.Debug,
                    $"Coping properties from existing {nameof(ZXingScannerView)} into a new {nameof(ZXingScannerView)}");
            ScannerView = GenericFactory.CopyProperties(new ZXingScannerView() {IsScanning = false}, ScannerView,
                skippedProperties: new List<string>() {nameof(ScannerView.IsScanning)}.ToArray());
            ScannerView.OnScanResult += ScannerView_OnScanResult;

            ScannerStack.Children.Add(ScannerView);
        }
private void EnableScan(MobileBarcodeScanningOptions imputedOptions = null)
        {
            if (Config.DebugMode) Logging.Log(LogType.Debug, $"{nameof(EnableScan)} Method is run in Thread named => {Thread.CurrentThread.Name}");

            var chosenOptions = imputedOptions ?? (Config.UseCustomOptions ? Config.CustomOptions : Config.DefaultOptions);
            if (Config.DebugMode)
                Logging.Log(LogType.Information,
                    $"Chose this option for Scanning => {(imputedOptions != null ? nameof(imputedOptions) : (Config.UseCustomOptions ? nameof(Config.CustomOptions) : nameof(Config.DefaultOptions)))}");
            ScannerView.Options = chosenOptions;

            RecreateScannerView();

            Logging.Log(LogType.Information, $"Starting the Scanning...");
            ScannerView.IsScanning = true;
            ScannerView.IsAnalyzing = true;
            ScannerView.IsVisible = true;

            if (Config.DebugMode)
                Logging.Log(LogType.Debug,
                    $"{nameof(EnableScan)} Called and Finished; ScannerView.IsAnalyzing => {ScannerView.IsAnalyzing}; ScannerView.IsVisible => {ScannerView.IsVisible}");
        }

Мой метод, чтобы перевернуть значение UseFrontCameraIfAvailable - это тот, который показан в приведенном выше вопросе.

Надежда на это в конечном итоге поможет другим, кто может наткнуться на аналогичную проблему.

0 голосов
/ 19 февраля 2020

Я не думаю, что он может переключать переднюю и заднюю камеры, когда он начал сканирование с помощью Zxing, поэтому этот параметр нужно выбрать и установить заранее

 var options = new MobileBarcodeScanningOptions
 {
     AutoRotate = true,
     UseNativeScanning = true,
     TryHarder = true,
     TryInverted = true,
     UseFrontCameraIfAvailable  = true
 };

 var scannedCode = await _scanner.Scan(options);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...