Xamarin.Android-用ZXing实现二维码扫描以及连续扫描
2015-04-08 23:53
274 查看
[b]一、前言[/b]
本文的内容有两个基础:ZXing.Net和ZXing.Net.Mobile
ZXing.Net:ZXing的C#实现,主要封装了各种二维码的编码、解码等跨平台的算法
ZXing.Net.Mobile:对ZXing.Net在xamarin的应用进行了封装,主要实现了摄像头扫描、扫描view、扫描activity、扫描Fragment等
ZXing.Net.Mobile下载:xamarin组件市场 或者 github
[b]二、效果图[/b]
View Code
初始化ZXingScannerFragment,为其传入一个Action<ZXing.Result>类型的ScanResultCallback回调,
在ScanResultCallback中进行扫描结果处理:震动、输出、Toast、切换Fragment等
[b]四、连续扫描[/b]
现在基本能扫描了,不过现在有个需求:扫描后如果扫描结果不是手机号码则继续扫描。
OK,修改一下扫描完成后的回调处理
本来以为这样就搞定了,没想到扫描结果不是手机号时,提示 "扫描的二维码格式不正确!"后便停止扫描了。
看来ZXing.Net.Mobile库只要扫描完成后,就会停止扫描(我想作者是为了防止重复扫描的问题吧)。
为了实现连续扫描就只能修改ZXing.Net.Mobile库了
下面只是“Fragment中集成扫描”中的实现,“弹出新窗口进行扫描”也有类似的问题,小伙伴们自己查看源码发挥吧,哈哈!
经过分析发现ZXingSurfaceView类中的OnPreviewFrame方法在扫描完成后,触发回调前,调用了ShutdownCamera ();
这便是停止扫描的罪魁祸首,OK,将其抹杀,这时是可以连续扫描了,不过即使扫描结果是手机号扫描还会继续,这样就有可能出现重复扫描的问题,
因此这种情况下,扫描结果符合要求后,需要手动“停止扫描”:ZXingScannerFragment.Shutdown()
源码下载
https://github.com/jordanqin/ZXing.Scanner
参考:
http://components.xamarin.com/view/zxing.net.mobile/
https://github.com/Redth/ZXing.Net.Mobile
如果你觉得文章对你有帮助,可以点击旁边的“推荐”按钮,这样会让更多需要的人有机会看到
本文的内容有两个基础:ZXing.Net和ZXing.Net.Mobile
ZXing.Net:ZXing的C#实现,主要封装了各种二维码的编码、解码等跨平台的算法
ZXing.Net.Mobile:对ZXing.Net在xamarin的应用进行了封装,主要实现了摄像头扫描、扫描view、扫描activity、扫描Fragment等
ZXing.Net.Mobile下载:xamarin组件市场 或者 github
[b]二、效果图[/b]
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等
[b]四、连续扫描[/b]
现在基本能扫描了,不过现在有个需求:扫描后如果扫描结果不是手机号码则继续扫描。
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(); }
/// <summary> /// 验证手机号码的格式 /// </summary> 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://github.com/jordanqin/ZXing.Scanner
参考:
http://components.xamarin.com/view/zxing.net.mobile/
https://github.com/Redth/ZXing.Net.Mobile
如果你觉得文章对你有帮助,可以点击旁边的“推荐”按钮,这样会让更多需要的人有机会看到
相关文章推荐
- Andriod Zxing 二维码扫描 实现连续扫描
- android开发(17) 扫描二维码 - 调用第三方APK来实现二维码扫描,参考自 开源项目zxing
- android中Zxing实现二维码功能的快速集成以及扫描界面的定制
- Xamarin开发Android笔记:使用ZXing进行连续扫描
- android开发之集成zxing,二维码,以及扫描二维码的功能实现。带源代码下载
- Android中的Zxing实现二维码的生成以及扫描
- android开发(17) 扫描二维码 - 调用第三方APK来实现二维码扫描,参考自 开源项目zxing
- [置顶] android开发之集成zxing,二维码,以及扫描二维码的功能实现。带源代码下载
- 高仿仿微信界面二维码扫描效果 之 Android 基于google Zxing实现二维码、条形码扫描
- 【转】条码扫描二维码扫描——ZXing android 源码简化
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android--基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- 在Android中使用 Google ZXing 实现二维码、条形码扫描
- phonegap添加二维码扫描插件集成ZXing扫描组件(Android版)
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android Zxing修改为竖屏扫描,和连续扫描问题
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- 在Android中使用 Google ZXing 实现二维码、条形码扫描