Реализация сканирования QR-кодов, штрих-кодов в приложениях Xamarin.Forms является действительно простой задачей, благодаря проекту ZXing, который был портирован на Xamarin (и для всех устройств: iOS, Android и Windows Phone).

ZXing.Net.Mobile

Компонент Xamarin / Проект на GitHub

Для реализации функционала, сначала необходимо добавить ссылку на компонент ZXing в каждом из проектов. Затем, как всегда, мы должны найти способ общения проекта форм (что содержит логику) и различных проектов UI (проект конкретной платформы). Чтобы решить эту проблему, мы используем DependencyService для регистрации интерфейса и созданных, конкретных реализаций.

Интерфейс:

public interface IQrCodeScanningService
{
	Task<string> ScanAsync();
}

А вот реализация для проекта Windows phone:

public class QrCodeScanningService : IQrCodeScanningService
{
    public async Task<string> ScanAsync()
    {
        var scanner = new ZXing.Mobile.MobileBarcodeScanner(App.RootFrame.Dispatcher);
        var scanResults = await scanner.Scan();

        return scanResults.Text;
    }
}

Реализация для Android проекта (конечно, таким же образом можно создать реализацию и для iOS):

public class QrCodeScanningService : IQrCodeScanningService
{
    public async Task<string> ScanAsync()
    {
        var scanner = new ZXing.Mobile.MobileBarcodeScanner(Application.Context);
        var scanResults = await scanner.Scan();

        return scanResults.Text;
    }
}

Как вы можете видеть, каждая реализация является особенной (конструктор MobileBarcodeScanner принимает разные параметры, в зависимости от платформы).

Для каждой реализации, не забудьте добавить атрибут зависимостей так DependencyService может зарегистрировать интерфейс и реализацию:

// Windows Phone
[assembly: Dependency (typeof(QrCodeScanningService))]
namespace QrCodeScanningWithXamarin.WinPhone.Helpers

// Android
[assembly: Dependency(typeof(QrCodeScanningService))]
namespace QrCodeScanningWithXamarin.Droid.Helpers

И теперь, в проекте Forms (Shared или Portable), мы можем использовать DependencyService, чтобы получить экземпляр класса, который реализует наш интерфейс:

var scanButton = new Button
{
    Text = "Launch scan"
};
scanButton.Clicked += async (sender, args) =>
{
    var url = await DependencyService.Get<IQrCodeScanningService>().ScanAsync();

    Device.OpenUri(new Uri(url));
};

Запустите приложение и нажмите на кнопку, чтобы отобразить окно позволяющее пользователю сканировать QRcode или штрих-код. После того, как сканер появится на экране, нажмите на него и после автоматической фокусировки, выполнится сканирование и результат возвратится так, что вы сможете использовать его (просмотреть текст, открыть URL, и т.д.)

Оригинал

Теги: c#, .net, xamarin, ios, android, windows phone, перевод