4

I have implement Document Scanner supported by IOS 13+ Vision in my Xamarin.Forms App. This is my code for SharedFunction for IOS

[assembly: Dependency(typeof(CameraScanner))]
    class CameraScanner : ICameraScanner
    {
        public void OpenScanCamera()
        {
            ScanViewController viewController = new ScanViewController();
            UIApplication.SharedApplication.KeyWindow.RootViewController.
            PresentViewController(viewController, false, null);
        }
        public static UIKit.UIViewController GetTopViewController()
        {
            var window = UIApplication.SharedApplication.KeyWindow;
            var vc = window.RootViewController;
            while (vc.PresentedViewController != null)
                vc = vc.PresentedViewController;

            if (vc is UINavigationController navController)
                vc = navController.ViewControllers.Last();
            return vc;
        }
    }

VNDocumentCameraViewController class logic for make a View for Take picture and scanning supported by IOS Vision

    [Register("UniversalView")]
    public class UniversalView : UIView
    {
        public UniversalView()
        {
            Initialize();
        }

        public UniversalView(RectangleF bounds) : base(bounds)
        {
            Initialize();
        }

        void Initialize()
        {
            BackgroundColor = UIColor.Blue;

        }
    }

    [Register("ScanViewController")]
    public class ScanViewController : UIViewController
    {
        public ScanViewController()
        {
        }

        public override void DidReceiveMemoryWarning()
        {
            // Releases the view if it doesn't have a superview.
            base.DidReceiveMemoryWarning();

            // Release any cached data, images, etc that aren't in use.
        }

        public override void ViewDidLoad()
        {
            View = new UniversalView();



            base.ViewDidLoad();

            // Perform any additional setup after loading the view
        }

        public override void ViewDidAppear(bool animated)
        {
            var documentCameraController = new VNDocumentCameraViewController();
            var documentscanDelegate = new DocumentScanDelegate();
            documentscanDelegate.OnScanTaken += (VNDocumentCameraScan scan) =>
            {
                documentCameraController.DismissViewController(true, null);
                Debug.WriteLine($"{scan.PageCount} Pages!");
            };

            documentscanDelegate.OnCanceled += () =>
            {
                documentCameraController.DismissViewController(true, null);
            };

            documentCameraController.Delegate = documentscanDelegate;
            documentCameraController.ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen;
            PresentViewController(documentCameraController, true, null);
        }
    }

    class DocumentScanDelegate : VNDocumentCameraViewControllerDelegate
    {
        public delegate void ScanTakenEventHandler(VNDocumentCameraScan scan);
        public event ScanTakenEventHandler OnScanTaken;

        public delegate void ScanCanceledEventHandler();
        public event ScanCanceledEventHandler OnCanceled;

        public override void DidCancel(VNDocumentCameraViewController controller)
        {
            Debug.WriteLine("DocumentScanDelegate:DidCancel");
            OnCanceled();
        }

        public override void DidFinish(VNDocumentCameraViewController controller, VNDocumentCameraScan scan)
        {
            Debug.WriteLine("DocumentScanDelegate:DidFinish");
            OnScanTaken(scan);
        }


        public override void DidFail(VNDocumentCameraViewController controller, NSError error)
        {
            Debug.WriteLine("Failed scanning photo");
        }
    }
}

Which is similar implementation for Xamarin.Android? I know that google also supports Camera Scanning but i can't find a good documentation about it. Anyone had imported this?

Rajzer
  • 1,174
  • 11
  • 24

0 Answers0