博客: 安卓之家
掘金: jp1017
微博: 追风917
CSDN: 蒋朋的家
简书: 追风917

前言


二维码现在用的超级多,其实它就是一种编码,把字符串编码保存成一个图片,我们扫描图片得到字符串就解码成功。

最有名的二维码解析库是 google 出品的 Zxing,网上也有很多的封装库,有自定义扫描窗口等,更多库请在这个库中搜索 二维码即可:

安卓各种图片框架

这些库采用的都是手机自带的摄像头,没有USB摄像头,悲催了。

USB摄像头拍照,摄像,网上有一个很牛的开源库:

UVCCamera

我也是参考了这个库,在其基础上开发,主要是采用了test4,开启服务来拍照,摄像。这里有几个坑,耽搁了一整天啊。

这里涉及两方面内容,识别代码和扫描界面

识别代码


代码里如何实现呢,一开始一点思路都没有啊。

手机摄像头预览识别,可参考:

https://github.com/bingoogolapple/BGAQRCode-Android/issues/55

那么USB摄像头如何实现呢,那么只能到 UVCCamera 这个库里去寻找答案,没办法,只能静下心来好好看。

我的二维码识别也采用了开源库:

https://github.com/yipianfengye/android-zxingLibrary

这个库在使用中有小bug,我都提了PR,自行解决了。

我注意到,该库可以根据 Bitmap 对象识别,那么哪里会有这个对象呢,最先想到的是拍照,点击拍照的时候,一定会有这些数据,那么这些数据在哪里呢,一层一层的剥开,最终在RendererHolder 的 run 方法里找到偶遇 bitmap, 然后他识别二维码的代码移植到这里,点击拍照,果然能识别到二维码,哇哈,成功了一丝丝,最开始以为就先这样实现就可以的。

扫描结束后,要弹个窗口提示下扫描结果啊是不是,这个简单啊,用EventBus啊,然后EventBus一开挂,见证奇迹的时刻:

然而奇迹并没有出现,一直订阅不到,然后各种追寻,未果。

然后尝试了另一个开源库 Router,然而,这个库也没有成功,然后一天就这么嗖嗖的过去了,中间找到 Router的作者,我写了个demo给他,他看后提示我是不是 多进程,Router 和 EventBus 都是不支持多进程的。

我赶紧去确认了下,该拍照摄像service设置了远程标志:

android:process=":uvcservice"

没跑了,确实跨进程通信了。

那么,怎么搞呢,广播咯,于是用广播实现了扫描后的结果通知。

暂时实现的功能是点击拍照按钮,扫描二维码,这就结束了吗?

扫描界面


界面又该如何实现呢,比如实现微信类似的二维码识别界面。查看了很多自定义二维码识别的界面,都是自定义View,然后重写 onDraw 方法,自定义扫码边框及扫描动画,比如这里:

ViewfinderView

然后查看了下USB摄像库,显示画面的View是继承自 TextureView 的,然后想在此 TextureView 里也重写 onDraw实现,但是发现TextureView里的此方法是final的,也就是不能在绘制别的东西了。查看了下源码,里面的注释里有这样一段话:

It is important to note that only one producer can use the TextureView.
For instance, if you use a TextureView to display the camera preview, you
cannot use {@link #lockCanvas()} to draw onto the TextureView at the same
time.

大体意思就是不能在TextureView上获取Canvas再绘制view,这样看来此路不通啊。

但是有了新的发现,这个发现正好解决了之前的预览识别问题,究竟是什么呢?

TextureView 的使用很简单,两步:

  1. 获取这个TextureView,
  2. 设置setSurfaceTextureListener,实现其四个方法

具体使用可查看下面两个文章:

TextureView 使用
TextureView+SurfaceTexture+OpenGL ES来播放视频(二)

在这个listener的源码中,发现 onSurfaceTextureUpdated 方法在每次变化的时候都会调用,也就是预览时会频繁调用,于是,在此方法里打印,果然如此,那么就可以在此方法里去实现预览识别啊。

想法不错,但是该如何去做呢,继续查看UVCCamera源码,发现,里面有个Callback的接口,该接口在拍照的fragment里有实现,但是没有具体实现,而该接口也没有update的调用,于是,我加了个方法:

onSurfaceUpdate(Surface surface);

并实现了该方法,那么剩下的就是在该方法里去扫描二维码,发现TextureView有个方法,getBitmap,这是极好的,通过此bitmap对象就可以扫描二维码了,bingo。

实际操作,确实也是这样的,哈哈,太棒了,此刻见证了一个真理:

源码是最好的老师

这样,无心插柳,解决了预览识别二维码的问题,但是界面还木有出来啊,怎么弄呢,不能Canvas绘制了,那么就在此TextureView周围添加一个边框吧。

至于扫描动画,也是设置的一个图片的平移动画,没什么可说的,有了思路,剩下的就好办了。

实际图如下:

代码已上传,请到这里查看:

UVCCameraZxing

关于识别图片二维码,也是支持的,很多库都有这个功能的,不难,enjoy!

当然,对于,条形码也是支持的,赶快使用起来吧。

最后,非常感谢您的阅读,有任何疑问,可以后面评论,谢谢!

神奇的安卓开发网站:http://androidcat.com/

安卓开源库收集整理:https://github.com/XXApple/AndroidLibs

分享是一种美德,更是一种生活方式!!

也许你会说我是一个梦想者,但我不是唯一的一个。

悦分享,越快乐^_^

欢迎交流,转载请注明出处,谢谢!

USB摄像头预览识别二维码相关推荐

  1. android USB摄像头做条形码及二维码扫描(1)

    摘要: 1.前言 2.底层配置 3.JNI实现 4.总结 5.BUG及优化记录 android USB摄像头做条形码及二维码扫描(2) 1. 前言 公司做的产品基于android开发板搭建的控制系统, ...

  2. Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决

    Android 8.0 WebView 拍照.简易预览.二维码扫描 各种问题解决 项目用到了WebView包装HTML5做成app使用,其中有页面用到了二维码和拍照上传功能.本人从未做过android ...

  3. vue3+jsQr实现手机浏览器调用本地摄像头扫描并识别二维码

    最近做的项目有个需求是在手机端打开页面,登录之后能在手机上扫描二维码并根据扫描的结果去查询班级情况.别的功能就不说了,移动端扫描二维码这个以前没做过,所以在这里记录一下. 项目用到的技术栈: Vue ...

  4. 用uni.previewImage({}) 来直接做图片的预览和识别二维码

    需求: 客户要求用户不用截图保存,通过直接用手机识别二维码关注,所以,这就需要我们进行图片的预览即可以解决. <image src="https://lr-huayoushi.oss- ...

  5. 微信小程序-预览图片识别二维码

    wx.getImageInfo(Object object) 获取图片信息.网络图片需先配置download域名才能生效. 测试图片地址:http://mmbiz.qpic.cn/mmbiz_png/ ...

  6. uniapp 对富文本中的图片预览及长按图片识别二维码/保存图片

    uniapp 对富文本中的图片预览及长按图片识别二维码/保存图片 富文本一定要使用uniapp提供的<rich-text>标签,不要使用 v-html 因为<rich-text> ...

  7. html+js 调用摄像头识别二维码

    1. html调起摄像头,参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia 2.识别二维码 ...

  8. 树莓派4b + python3 + pyzbar + opencv + 摄像头 扫描识别二维码(寻找最大的二维码)

    前言 最近需要做一个扫码乘车的功能,于是使用树莓派的摄像头扫描二维码来做一个demo . 网上有部分人用的是zbar这个库,但是我安装后,发现并不能在Python3上使用,这就有点不太好了.经过我的多 ...

  9. C# 调用摄像头实时识别二维码

    注释和winform控件自己做,源码需要下载. // 功能:调用zxing生成和解析二维码,调用摄像头根据图片识别二维 using System; using System.Collections.G ...

最新文章

  1. 洛谷P1330 封锁阳光大学
  2. 【Spring注解系列03】@Scope与@Lazy
  3. 【收藏】ABAP Bom按层展开的几种实现方法
  4. 关闭fedroa19开关机画面
  5. vue-router实例
  6. 高性能分布式锁-redisson
  7. XML To Linq 读取Sharepoint列表中的附件列信息
  8. 前端开发学习要装哪些电脑软件
  9. 「山东城商行联盟数据库准实时数据采集系统」入选2021中国大数据应用样板案例
  10. 华为存储设备管理ip修改
  11. java 动态性之反射机制 详解 案例,mybatis字段映射原理
  12. 安卓如何关闭软键盘?
  13. xf0x9f java mysql_MySql导入数据报错Incorrect string value: ‘xF0x9Fx90x82’
  14. 《Adobe Premiere Pro CS6中文版经典教程》——1.3 扩展工作流
  15. html a标签设置背景,css利用A标签的背景可能作出很有意思的效果
  16. 【QT实现TCP和UDP协议通信(二)】
  17. java判断时间是否超过24小时_判断两个日期是否超过24小时!
  18. 会打字、能翻译,联想智能语音鼠标好小橙使用评测
  19. logstash截取指定字符和grok的使用
  20. ASPM——网络安全的下一个热点

热门文章

  1. 一、中英文对切基本公式
  2. RTSP、RTP、RTCP协议简介
  3. socketio单聊,群聊
  4. QT 设置QPushButton背景为透明色
  5. 南开计算机学院网络安全,程明明 - 南开大学 - 网络空间安全学院
  6. matlab画波动图像,【基于Matlab的波动方程的可视化实现最终版材料】
  7. percent sql_使用SQL Server中的PERCENT_RANK函数计算SQL百分位数
  8. python怎么自动生成文档_用 Python 自动生成 Word 文档
  9. 基于众包采集定量数据的自适应结果推理
  10. SEO教程:如何优化长尾关键词达到快速排名(干货)