Xamarin开发Android笔记:使用ZXing进行连续扫描

在项目开发中需要使用到条码扫描,因为以前就测试过ZXing,感觉识别速度和功能都不错,所以直接引用。不过在实际开发的过程中,却遇到连续扫描的问题,每次扫描识别完成之后,扫描窗体自动关闭了。

在Xamarin论坛中查找解决方案,只是找到的iOS版本的解决方案。参考iOS的解决方案,其实就是在扫描完成之后重新打开扫描。按照这个思路,想到使用Intent for result的方式来进行实现。实现方法如下代码:

 

主窗体:

 1 using System;

 2 using Android.App;

 3 using Android.Content;

 4 using Android.Runtime;

 5 using Android.Views;

 6 using Android.Widget;

 7 using Android.OS;

 8 using ZXing.Mobile;

 9 

10 namespace imStudio.QRCodeLife

11 {

12     [Activity (Label = "imStudio.QRCodeLife", MainLauncher = true)]

13     public class MainActivity : Activity

14     {

15         int count = 1;

16 

17         protected override void OnCreate (Bundle bundle)

18         {

19             base.OnCreate (bundle);

20 

21             // Set our view from the "main" layout resource

22             SetContentView (Resource.Layout.Main);

23 

24             // Get our button from the layout resource,

25             // and attach an event to it

26             var button = FindViewById<Button>(Resource.Id.myButton);

27             var tv = FindViewById<TextView>(Resource.Id.textView1);

28             

29             button.Click += async delegate

30             {

31                 StartActivityForResult(typeof(CodeActivity),1);

32             };

33         }

34 

35         protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)

36         {

37             if (requestCode == 1)

38             {

39                 if (resultCode == Result.Ok)

40                 {

41                     FindViewById<TextView>(Resource.Id.textView1).Text += data.GetStringExtra("Code") + System.Environment.NewLine;

42                     StartActivityForResult(typeof(CodeActivity), 1);

43                 }

44             }

45         }

46     }

47 }

子窗体,增加一个“完成”或“取消”按钮,用于关闭扫码窗体,代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;



using Android.App;

using Android.Content;

using Android.OS;

using Android.Runtime;

using Android.Views;

using Android.Widget;



namespace imStudio.QRCodeLife

{

    [Activity(Label = "CodeActivity")]

    public class CodeActivity : Activity

    {

        protected override async void OnCreate(Bundle bundle)

        {

            base.OnCreate(bundle);



            // Create your application here

            var scanner = new ZXing.Mobile.MobileBarcodeScanner(this);

            scanner.UseCustomOverlay = true;

            var zxingOverlay = LayoutInflater.FromContext(this).Inflate(Resource.Layout.Code, null);

            var doneButton = zxingOverlay.FindViewById<Button>(Resource.Id.buttonZxingDone);

            doneButton.Click += (sender, e) =>

            {

                scanner.Cancel();

                SetResult(Result.Canceled);

                Finish();

            };

            scanner.CustomOverlay = zxingOverlay;

            var result = await scanner.Scan();



            HandleScanResult(result);

        }



        private void HandleScanResult(ZXing.Result result)

        {

            if (result != null)

            {

                Intent intent = new Intent();

                intent.PutExtra("Code", result.Text);

                SetResult(Result.Ok,intent);

                Finish();

            }

        }

    }

}

实现代码虽然有些粗糙,不过功能OK,先用着,回头再想有没有好的办法。

你可能感兴趣的:(android)