In a hackathon project, my app need qr code scanning functionality. So I search a quick solution and find ZXing and WriteableBitmalEx.WinRT are quite useful.
Here is my setup:
declare local variable of media device
private MediaCapture _mediaCapture;
create a function, to initialize qr code function, which iniate variable needed, preparing viewfinder to get camera as its video source
private async Task InitializeQrCode() { // Find all available webcams DeviceInformationCollection webcamList = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); // Get the proper webcam (default one) DeviceInformation backWebcam = (from webcam in webcamList where webcam.IsEnabled select webcam).FirstOrDefault(); // Initializing MediaCapture _mediaCapture = new MediaCapture(); await _mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings { VideoDeviceId = backWebcam.Id, AudioDeviceId = "", StreamingCaptureMode = StreamingCaptureMode.Video, PhotoCaptureSource = PhotoCaptureSource.VideoPreview }); // Adjust camera rotation for Phone _mediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees); _mediaCapture.SetRecordRotation(VideoRotation.Clockwise90Degrees); // Set the source of CaptureElement to MediaCapture capturePreview.Source = _mediaCapture; await _mediaCapture.StartPreviewAsync(); }
And now for the actual code to have a qr code scanned :
private async void ScanQrCode() { await InitializeQrCode(); var imgProp = new ImageEncodingProperties { Subtype = "BMP", Width = 400, Height = 400 }; var bcReader = new BarcodeReader(); string qrCodeResult = String.Empty ; while (true) { var stream = new InMemoryRandomAccessStream(); await _mediaCapture.CapturePhotoToStreamAsync(imgProp, stream); stream.Seek(0); var wbm = new WriteableBitmap(400, 400); await wbm.SetSourceAsync(stream); var result = bcReader.Decode(wbm); if (result != null) { //var msgbox = new MessageDialog(result.Text); //await msgbox.ShowAsync(); qrCodeResult = result.Text; break; } } TextBlockStatus.Text = "Item is detected.."; }