博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Xamarin.Android-用ZXing实现二维码扫描以及连续扫描
阅读量:4561 次
发布时间:2019-06-08

本文共 6341 字,大约阅读时间需要 21 分钟。

一、前言

本文的内容有两个基础:ZXing.Net和ZXing.Net.Mobile

ZXing.Net:ZXing的C#实现,主要封装了各种二维码的编码、解码等跨平台的算法

ZXing.Net.Mobile:对ZXing.Net在xamarin的应用进行了封装,主要实现了摄像头扫描、扫描view、扫描activity、扫描Fragment等

          ZXing.Net.Mobile下载: 或者 

 

二、效果图

        

 

三、基本实现

1、弹出新窗口进行扫描

public class MainFragment : Android.Support.V4.App.Fragment    {        MobileBarcodeScanner scanner;        public override View OnCreateView(LayoutInflater inflater, ViewGroup p1, Bundle p2)        {            return inflater.Inflate(Resource.Layout.Main, null);        }        public override void OnViewCreated(View view, Bundle savedInstanceState)        {            base.OnViewCreated(view, savedInstanceState);            scanner = new MobileBarcodeScanner(this.Activity);            this.View.FindViewById
View Code

btnDefault_Click中使用了默认的弹出扫描,可定制性差,只能修改上下的文字

btnCustom_Click中使用了自定义界面弹出扫描,其实就是给扫描界面上面覆盖一层自定义的布局

在HandleScanResult中进行扫描结果的处理,这里只是简单的Toast

 

2、Fragment中集成扫描

这里使用了ZXing.Net.Mobile库中已经封装好的ZXingScannerFragment,并使用了覆盖层进行界面自定义

public class ScannerFragment : Android.Support.V4.App.Fragment    {        ZXingScannerFragment scanFragment;        View zxingOverlay;        public override View OnCreateView(LayoutInflater inflater, ViewGroup p1, Bundle p2)        {            return inflater.Inflate(Resource.Layout.Scanner, null);        }        public override void OnViewCreated(View view, Bundle savedInstanceState)        {            base.OnViewCreated(view, savedInstanceState);            zxingOverlay = LayoutInflater.FromContext(this.Activity).Inflate(Resource.Layout.ZxingOverlay, null);            scanFragment = new ZXingScannerFragment(ScanResultCallback);            scanFragment.UseCustomView = true;            scanFragment.CustomOverlayView = zxingOverlay;            this.Activity.SupportFragmentManager.BeginTransaction()                .Replace(Resource.Id.fragment_container, scanFragment)                .Commit();        }        private void ScanResultCallback(ZXing.Result result)        {            if (result == null || string.IsNullOrEmpty(result.Text))            {                this.Activity.RunOnUiThread(() =>                {                    Toast.MakeText(this.Activity, "扫描已取消!", ToastLength.Short).Show();                    ((HomeFragment)this.FragmentManager.Fragments[0]).SetCurrentTab("Main");                });                return;            }            else            {                //扫描成功                this.Activity.RunOnUiThread(() =>                {                    //震动                    Vibrator vibrator = (Vibrator)Application.Context.GetSystemService(Context.VibratorService);                    long[] pattern = { 0, 350, 220, 350 };                    vibrator.Vibrate(pattern, -1);                    Console.WriteLine(result.Text);                    Toast.MakeText(this.Activity, result.Text, ToastLength.Short).Show();                    ((HomeFragment)this.FragmentManager.Fragments[0]).SetCurrentTab("Main");                });                return;            }        }    }
View Code

初始化ZXingScannerFragment,为其传入一个Action<ZXing.Result>类型的ScanResultCallback回调,

在ScanResultCallback中进行扫描结果处理:震动、输出、Toast、切换Fragment等

 

四、连续扫描

现在基本能扫描了,不过现在有个需求:扫描后如果扫描结果不是手机号码则继续扫描。

OK,修改一下扫描完成后的回调处理

//此处加上二维码的格式要求,如果不符合要求,就继续扫描(我这里是判断是否是手机号码)                    if (IsTelephone(result.Text))                    {                        Toast.MakeText(this.Activity, result.Text, ToastLength.Short).Show();                        ((HomeFragment)this.FragmentManager.Fragments[0]).SetCurrentTab("Main");                    }                    else                    {                        Toast.MakeText(this.Activity, "扫描的二维码格式不正确!", ToastLength.Short).Show();                    }
///         /// 验证手机号码的格式        ///         public bool IsTelephone(string str_telephone)        {            return Regex.IsMatch(str_telephone, @"^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$");        }

本来以为这样就搞定了,没想到扫描结果不是手机号时,提示 "扫描的二维码格式不正确!"后便停止扫描了。

看来ZXing.Net.Mobile库只要扫描完成后,就会停止扫描(我想作者是为了防止重复扫描的问题吧)。

为了实现连续扫描就只能修改ZXing.Net.Mobile库了

 

下面只是“Fragment中集成扫描”中的实现,“弹出新窗口进行扫描”也有类似的问题,小伙伴们自己查看源码发挥吧,哈哈!

经过分析发现ZXingSurfaceView类中的OnPreviewFrame方法在扫描完成后,触发回调前,调用了ShutdownCamera ();

这便是停止扫描的罪魁祸首,OK,将其抹杀,这时是可以连续扫描了,不过即使扫描结果是手机号扫描还会继续,这样就有可能出现重复扫描的问题,

因此这种情况下,扫描结果符合要求后,需要手动“停止扫描”:ZXingScannerFragment.Shutdown()

//此处加上二维码的格式要求,如果不符合要求,就继续扫描(我这里是判断是否是手机号码)                    if (IsTelephone(result.Text))                    {                        //主动关闭摄像头,防止重复扫描                        scanFragment.Shutdown();                        Toast.MakeText(this.Activity, result.Text, ToastLength.Short).Show();                        ((HomeFragment)this.FragmentManager.Fragments[0]).SetCurrentTab("Main");                    }                    else                    {                        Toast.MakeText(this.Activity, "扫描的二维码格式不正确!", ToastLength.Short).Show();                    }

 

 

 

参考:

 

如果你觉得文章对你有帮助,可以点击旁边的“推荐”按钮,这样会让更多需要的人有机会看到

转载于:https://www.cnblogs.com/Exception/p/4401141.html

你可能感兴趣的文章
SQL2005查询所有表的大小
查看>>
Shell 正则表达式
查看>>
Docker run命令参数整理
查看>>
qt-opencv配置mingw编译器
查看>>
CSS之Medial Queries的另一用法:实现IE hack的方法
查看>>
linux-CentOS6.4下安装oracle11g详解
查看>>
实力为王 八年DBA经验谈
查看>>
2-sat 问题 【例题 Flags(2-sat+线段树优化建图)】
查看>>
ext3.2 右击动态添加node的treepanel
查看>>
Database links
查看>>
数据库事务
查看>>
xe7 控件升级
查看>>
TFrame bug
查看>>
刚学习的如何才能自信的拍美美的婚纱照呢(要结婚啦)
查看>>
M51文件注释
查看>>
关于临界资源访问互斥量的死锁问题
查看>>
django-view层
查看>>
异步加载JS的方法。
查看>>
golang-gorm框架支持mysql json类型
查看>>
【tool】白盒测试
查看>>