首先给出我的参考链接地址
Android超方便 集成 Zxing实现扫一扫,闪光灯,生成二维码图片,解析二维码(条码)等功能
此篇文章发布时间结点是17年。。
当前文章发布时间节点是24年。。
请注意时间节点,以免造成原生版本导致的版本冲突问题
为什么要说时间节点问题呢?
随着时间发展,功能组件肯定是不断迭代的,就会导致可能会因为版本问题运行不了,我就是“受害者”,所以有了这篇文章。
可实现功能
当前依赖可实现以下功能,如不符合读者需求可跳过,节约宝贵的时间
- 摄像头扫描二维码条形码
- 打开相册识别图中的二维码条形码
- 可自定义设置打开相册时的界面
- 可自定义相册按钮和闪光灯按钮
如何使用
- minSdk 版本设置成 24 以上
- 引入jitpack库
maven { url 'https://jitpack.io' }
implementation 'com.github.zch-live:zxinglib:1.0.6'
- 调用扫描或者识别图片
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);ZxingConfig config = new ZxingConfig();//config.setShowbottomLayout(true);//底部布局(包括闪光灯和相册)//config.setPlayBeep(true);//是否播放提示音//config.setShake(true);//是否震动//config.setShowbottomLayout(true);//底部布局(包括闪光灯和相册)//config.setPlayBeep(true);//是否播放提示音//config.setShake(true);//是否震动config.setShowAlbum(false); //是否显示相册config.setShowBack(true); //显示左上角返回//config.setShowFlashLight(true);//是否显示闪光灯intent.putExtra(Constant.INTENT_ZXING_CONFIG, config);startActivityForResult(intent, 100866);
- 接收结果
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == 10086){if (data != null){String content = data.getStringExtra(Constant.CODED_CONTENT);if (content == null || content.contains("失败")){//识别失败tv3.setText("请提供真实,清晰,完整的条码");//失败了,终极解决办法,判断是不是高版本机型 > android11 ,有没有所有文件访问权限,建议只请求一次// 请求一次不要通过是否已开启访问权限去判断,亲测无效果// 建议通过本地存储是否请求过来限制访问次数(敏感权限)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//弹窗提示去开启所有文件访问权限Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);startActivity(intent);}}else {//识别成功tv3.setText("扫描结果:" + content);}}}}
完结撒花,以上就是识别步骤了
GitHub地址
使用说明1
打开界面的时候,通过传入参数去动态设置想要达到的效果
具体参数如下
其实摄像头扫描功能是比较好做的,因为大多数底层还是使用 Zxing ,如果你只需要摄像头扫描,可以看下这篇文章 第三方ZXing库zxing-android-embedded使用及自定义
主要复杂的是打开相册对图片的识别,以及识别过程中所产生的损耗
目前项目主要是识别快递单号中的条形码,在参考文章中,大多数只是对单独显示的条形码图片或者二维码图片才能识别出内容,当一整张快递单号放上去时,会因为转码量过大等,造成识别失败(图片源自网络,如有侵权联系即刻删除,无商业用途)
所以再次基础上进行改造,可对整张快递单进行扫描出结果,亲测识别结果最慢3秒可给出回调
原理如下:
- 识别图片时针对条形码进行识别
- 整张快递单号进行切割分段识别
- 分段切割5-8次,过程中有识别成功者中断识别,进行回调
使用说明2
依赖中已经有默认的界面,如不符合当前开发需求,可支持自定义界面,
要注意的是自定义界面时要与主要控件 id 对应,否则无效果(并不会报错)
默认打开相册识别界面如下
具体使用如下
/*如果需要自定义选择相册界面,使用此代码,在跳转之前调用即可选择按钮要使用 TextView 并且id 必须命名为 albumButton选择按钮要使用 TextView 并且id 必须命名为 tvLoading*/View photoView = LayoutInflater.from(this).inflate(R.layout.photo_view, null);// 通过 findViewById 去设置自己想要显示的内容PhotoView.setPhotoView(photoView);
对应id如下
使用说明3
使用前别忘了动态申请下权限,文中获取权限代码如下
部分高版本手机会存在 /0 目录下图片识别失败的情况,可以试下上述回调代码中终极解决办法-所有文件访问权限
/*动态申请权限操作*/private boolean isPermissionRequested = false;public void requestPermission() {if (Build.VERSION.SDK_INT >= 23 && !isPermissionRequested) {isPermissionRequested = true;ArrayList<String> permissionsList = new ArrayList<>();String[] permissions = {//在这里加入你要使用的权限Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,};for (String perm : permissions) {if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(perm)) {permissionsList.add(perm);// 进入这里代表没有权限.}}if (!permissionsList.isEmpty()) {String[] strings = new String[permissionsList.size()];requestPermissions(permissionsList.toArray(strings), 0);}}}
结尾: 如有其他问题可评论共同讨论