Documentation / MRZ Scanner 1.x (archive) / Xamarin / Xamarin.Forms
1.Before we start to work in Portable (Shared) project we must to configure platform specific projects (Android and iOS):
1.1Android platform specific project
- Copy MRZScannerDroidBinding.dll in your Android platform specific project
- Add reference to MRZScannerDroidBinding.dll file in your Android platform specific project references
- Create one layout.axml file and add the following code:
(It is recommended that the scanner takes full screen.)
<fragment
android:id="@+id/scannerFragment"
android:name="com.scansolutions.mrzscannerlib.MRZScanner"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- Create ViewRenderer that will help us to port our native fragment as control in portable project:
[assembly: ExportRenderer(typeof(MRZScannerForms.ScannerControl), typeof(MRZScannerForms.Droid.ScannerControlRenderer))]
namespace MRZScannerForms.Droid
{
public class ScannerControlRenderer : ViewRenderer
{
public ScannerControlRenderer(Context context) : base(context) { }
MRZScanner mrzScanner;
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.View> e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
Android.Views.View _scannerLayout = ((FormsAppCompatActivity)Context).LayoutInflater.Inflate(Resource.Layout.scannerFragment, this, false);
mrzScanner = (MRZScanner)((FormsAppCompatActivity)Context).SupportFragmentManager.FindFragmentById(Resource.Id.scannerFragment);
MRZScanner.RegisterWithLicenseKey(Context, "licenseKey");
if (Control == null)
SetNativeControl(_scannerLayout);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
try
{
Fragment fragment = ((FormsAppCompatActivity)Context).SupportFragmentManager.FindFragmentById(Resource.Id.scannerFragment);
if (fragment != null)
((FormsAppCompatActivity)Context).SupportFragmentManager.BeginTransaction().Remove(fragment).Commit();
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
}
mrzScanner = null;
}
base.Dispose(disposing);
}
}
}
- Implement the IMRZScannerListener interface as a listener for a successful MRZ scan in MainActivity:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IMRZScannerListener { …
1.2 iOS platform specific project
- Copy MRZScanneriOSBinding.dll in your iOS platform specific project
- Add reference to MRZScanneriOSBinding.dll file in your iOS platform specific project references
- Create ViewRenderer that will help us to port our native fragment as control in portable project and implement IMRZScannerDelegate for a successful MRZ scan:
[assembly: ExportRenderer(typeof(MRZScannerForms.ScannerControl), typeof(MRZScannerForms.iOS.ScannerControlRenderer))]
namespace MRZScannerForms.iOS
{
public class ScannerControlRenderer : ViewRenderer, IMRZScannerDelegate
{
MRZScannerController mrzSannerController;
protected override void OnElementChanged(ElementChangedEventArgs<View> e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
mrzSannerController = new MRZScannerController();
MRZScannerController.RegisterLicenseWithKey("licenseKey");
mrzSannerController.WeakDelegate = this;
UIViewController currentViewController = UIApplication.SharedApplication.KeyWindow.RootViewController.NavigationController != null ? UIApplication.SharedApplication.KeyWindow.RootViewController.NavigationController : UIApplication.SharedApplication.KeyWindow.RootViewController;
currentViewController.AddChildViewController(mrzSannerController);
mrzSannerController.InitUI(currentViewController);
if (Control == null)
SetNativeControl(mrzSannerController.View);
}
[Export("successfulScanWithResult:")]
public void SuccessfulScanWithResult(MRZResultDataModel mrzResultDataModel)
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (mrzSannerController != null)
{
mrzSannerController.CloseScanner();
mrzSannerController.Dispose();
mrzSannerController = null;
}
}
base.Dispose(disposing);
}
}
}
- Add the following row in your Info.plist file:
key: NSCameraUsageDescription
value: MRZ Scanner requires using camera
- Now let’s go back in Portable project and create ScannerControl class that will inherit from Xamarin.Forms.View
public class ScannerControl : Xamarin.Forms.View { }Here we can create bindable properties, event handlers, enums, etc. like we have in our sample applications.
- Use this custom control in you xamarin forms page where you want the scanner to be shown
<ContentPage.Content> <!--It is recommended that the scanner takes fullscreen--> <local:ScannerControl x:Name="scannerControl" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" /> </ContentPage.Content>
Updated Apr 8, 2020 · Questions? Ask us