Android利用zxing用相机扫描识别二维码(添加闪光灯和本地二维码)超详细教程
之前写了怎么用zxing的jar包进行简单的识别和生成二维码,以及生成带图片的二维码。
接下来单独说说怎么用相机扫描二维码,用相机扫描二维码相对于前面的生成二维码,识别二维码来说要麻烦一点,网上的教程太多,要么太简单,要么说得不清楚,来写写我的,一是方便大家学习,而是方便自己复习。
(1)下载
先致敬前辈,原GitHub的地址,https://github.com/zxing/zxing;
然后这是我修改过的别人的,接下来教程都是以我修改过的为准:我修改后的GitHub地址
如果访问GitHub较慢也可以直接在CSDN下载:此demo解压后可直接用Android studio打开
(2)粘贴com.google.zxing包
在下载好的java文件夹里面找到com.google.zxing包,复制,如图
打开自己的项目,右键点击java,选择粘贴,注意一定要粘贴在自己的main文件夹里面,不要粘贴到了test里面。包的名字也要是com.google.zxing,不然会报错。
然后打开会发现这4个JAVA文件会出错,原因是R包和自己的包不一样(注意看我com.google.zxing后面的括号里跟了个test,原因是我不小心粘贴到test文件夹里面了,后来调试的时候出错了,正常的粘贴到main里面是没有test的,一定要注意)
修改方法就是打开这四个文件,import自己的R包,格式如图:
(3)粘贴源文件
两个layout:activity_scanner,scanner_toolbar
一个raw文件声音beep.ogg
values里面的attrs,colors,ids,strings,如果有自己的内容的话注意不要覆盖了。
(4)配置权限等
在app下的build.gradle里面添加 compile 'com.google.zxing:core:3.3.0' 如图:
然后在manifest里面申请权限:
- <uses-permission android:name="android.permission.CAMERA"></uses-permission>
- <uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
- <uses-feature android:name="android.hardware.camera" />
- <uses-feature android:name="android.hardware.camera.autofocus" />
- <uses-permission android:name="android.permission.FLASHLIGHT" />
以及声明CaptureActivity
<activity android:name="com.google.zxing.activity.CaptureActivity"/>
(5)测试运行
在MainActivity里面import进CaptureActivity
import com.google.zxing.activity.CaptureActivity;
然后button监听里面:
- Button toscan=(Button)findViewById(R.id.to_scan);
- toscan.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent=new Intent();
- intent.setClass(MainActivity.this,CaptureActivity.class);
- startActivity(intent);
- }
- });
然后看效果:
点击button————————————出现扫描页面————————————扫描结果
可以看到在这里我自己又添加了一个闪光灯按钮和右上角的从相册获取图片按钮,看看效果
(6)show me the code:
主要的改动就是在CaptureActivity里面
handleDecode函数用于处理相机扫描得来的二维码,zxing里面已经写得很完全了,我在这里设置了个对话框,使扫描出来的内容直接显示出来
- /**
- * 这里是用相机扫描的处理方法
- */
- public void handleDecode(Result result, Bitmap barcode) {
- inactivityTimer.onActivity();
- playBeepSoundAndVibrate();
- final String resultString = result.getText();
- if (TextUtils.isEmpty(resultString)) {
- Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show();
- } else {
- //对话框
- AlertDialog dialog = new AlertDialog.Builder(this)
- .setTitle("扫描结果:")//设置对话框的标题
- .setMessage(resultString)//设置对话框的内容
- //设置对话框的按钮
- .setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- finish();
- }
- })
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- finish();
- }
- }).create();
- dialog.setCanceledOnTouchOutside(false);//点击其他地方对话框不消失
- dialog.show();
- }
- }
然后是从相册里面导入二维码:
open_picture方法:
- //打开图片
- private void open_picture(){
- Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);
- innerIntent.setType("image/*");
- Intent wrapperIntent = Intent.createChooser(innerIntent, "请选择二维码图片");
- CaptureActivity.this.startActivityForResult(wrapperIntent, REQUEST_CODE_SCAN_GALLERY);
- }
这是系统自带的onActivityResult方法,我做了一些改动。
onActivityResult的主要思路就是找到这个文件的路径,然后根据这个路径找到文件进行解析。
- /**
- * 这里是扫描相册图片的处理方法
- */
- @Override
- protected void onActivityResult(final int requestCode, int resultCode, Intent data) {
- if (resultCode==RESULT_OK) {
- switch (requestCode) {
- case REQUEST_CODE_SCAN_GALLERY:
- //获取选中图片的路径
- Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
- if (cursor.moveToFirst()) {
- photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
- }
- cursor.close();
- //扫描结果
- Result result = scanningImage(photo_path);
- //对话框
- AlertDialog dialog = new AlertDialog.Builder(this)
- .setTitle("扫描结果:")//设置对话框的标题
- .setMessage(result.getText().toString())//设置对话框的内容
- //设置对话框的按钮
- .setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- finish();
- }
- })
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- finish();
- }
- }).create();
- dialog.setCanceledOnTouchOutside(false);//点击其他地方对话框不消失
- dialog.show();
- break;
- }
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
然后是闪光灯控制:
这里另外需要在CameraManager里面修改一些参数,我已经修改好了的,下载我的demo可以直接用
- /**
- *闪光灯控制,CaptureActivity里面
- */
- private void lightOn(){
- camera = CameraManager.getCamera();
- parameter = camera.getParameters();
- if (!isOpen) {
- parameter.setFlashMode(android.hardware.Camera.Parameters.FLASH_MODE_TORCH);
- camera.setParameters(parameter);
- isOpen = true;
- } else { // 关灯
- parameter.setFlashMode(android.hardware.Camera.Parameters.FLASH_MODE_OFF);
- camera.setParameters(parameter);
- isOpen = false;
- }
- }
最后还有动态权限申请等等:
- /**访问照片权限
- *
- */
- final int checked = ContextCompat.checkSelfPermission(CaptureActivity.this
- , Manifest.permission.WRITE_EXTERNAL_STORAGE);
- if (checked == PackageManager.PERMISSION_GRANTED) {
- } else {
- ActivityCompat.requestPermissions(CaptureActivity.this
- , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
- }
- CameraManager.init(getApplication());
- viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_content);
- //摄像头权限
- if (Build.VERSION.SDK_INT >= 23) {
- //Manifest.permission.CAMERA
- //如果用户并没有同意该权限
- if (checkSelfPermission(Manifest.permission.CAMERA) != PERMISSION_GRANTED) {
- //申请权限
- requestPermissions(new String[]{Manifest.permission.CAMERA}, 100);
- } else {
- }
- }
最后:
有什么不懂的可以给我留言或者发邮件,邮箱在博客主页顶部。接下来我准备把这个扫描二维码集成到浏览器里面去。到时候再来写一下
Android利用zxing用相机扫描识别二维码(添加闪光灯和本地二维码)超详细教程相关推荐
- Android Studio 扫描识别二维码(包含闪光灯和本地二维码)、生成二维码、生成带logo的二维码
一.测试如下: 1.扫描识别二维码,扫描结果多少 2.生成二维码.生成带logo的二维码 二.添加依赖: 1.在Project的build.gradle中添加maven { url 'https:// ...
- [安卓开发笔记一]Android开发配置opencv环境超详细教程
[安卓开发笔记一]Android开发配置opencv环境超详细教程 [更新于 2022年4月] 再次提醒,建议现在看到这篇文章的,仅仅把此文做一个流程参考,4年前android studio就使用cm ...
- geoserver 发布 矢量切片(pbf)并用openlayers 6.14 /leaflet 1.8 加载展示 (二)(小白必备:超详细教程)
上一篇讲了 如何利用geoserver 发布矢量切片,接下来我们说 如何去展示,既然做我们就作全面吧,谁让我们gis 就是这么苦逼呢,哈哈. 环境: geoserver 2.21 vue 2.0 op ...
- 微服务Springcloud超详细教程+实战(二)
微服务Springcloud超详细教程+实战(二) -------------------------------------- 远程调用方式 无论是微服务还是分布式服务(都是SOA,都是面向服务编程 ...
- 【K8S实战】-超详细教程(二)
[K8S实战]-超详细教程(二) 环境这块的这里我就不过多描述了,需要了解的可以看这篇文章[k8s搭建(超详细,保姆级教程)]. 1.Deployment Deployment其他功能我上一篇文章已写 ...
- 极验验证码破解—超详细教程(二)
极验验证码破解-超详细教程(二) Gayhub:FanhuaandLuomu/geetest_break 2017.8.21 代码以上传,可供参考 [国家企业信用信息公示系统为例] 目录 一.网站ht ...
- Android利用zxing生成二维码,识别二维码,中间填充图片超详细、超简易教程
gayhub上的zxing可用于生成二维码,识别二维码 gayhub地址:https://github.com/zxing/zxing 此文只是简易教程,文末附有完整代码和demo下载地址,进入正题: ...
- Android利用zxing生成二维码
感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...
- Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接
Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...
最新文章
- 【C++】C++11 STL算法(八):对未初始化内存的操作(Operations on uninitialized memory)、C库(C library)
- Python中九种格式化输出方法,你都知道吗?
- 计组原理 : 计算机可靠性概述和性能评价
- s5pv210——I2C的代码实践
- qt编译器5.12.3怎么一次性删除所有的断点
- linux下socket调试,linux 下的socket 调试工具 netcat 使用
- error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'产生原因
- Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件
- java使用RXTX的详细总结
- android 模拟器好用哪个,安卓模拟器哪个好用 常用安卓模拟器性能大盘点
- 美国大学 计算机科学 排名,美国大学本科计算机专业排名TOP50榜单介绍
- 教程7--Schemas和客户端库
- 基于惯性轮倒立摆原理的自行车
- 3D游戏建模线上和线下学习的区别
- 【数据分析】贝叶斯原理
- 0422-团队项目1
- 四 状语从句(2021-11-09)
- 【GdiplusTypes.h error C3861 “min“ 找不到标识符】的终极方案
- 评分卡模型开发(六)--WOE值计算
- 清华大学计算机科学与技术系黄必胜,清华大学计算机科学与技术系
热门文章
- 服务器被挖矿怎么办,如何彻底删除挖矿文件
- BugKu 一枝独秀 [MISC]
- 【skLearn】Pycharm生成决策树系列
- 从服务端密码存储到用户数据加密方案
- 疯狂Android讲义(第四版)——绪论
- python turtle forward_Python turtle绘图
- python什么时候用input_Python input 使用
- fifa 18 android.com,fifa18手机版
- 计算机模块考试题,职称计算机考试Word模块考试题库
- ADODB操作数据库函数DBData和qstr