最近正在开发app,基本功能已开发完成,剩下扫码识别功能。之前上级已经写了一版,不是很好用,让我自己好好琢磨一下。针对这种功能需求,一般就先google,看有没有现成的代码可用,不出所料,果然有很多。自己在github上找了个最符合我app使用场景,且stat数很高的工程。down下来后,先阅读下作者的代码,发现迁移到我的代码中步骤十分简单。源地址:原作者github
一、build.gradle中添加依赖
implementation 'pub.devrel:easypermissions:1.0.1'
implementation 'cn.bingoogolapple:bga-photopicker:1.2.8@aar'
implementation 'cn.bingoogolapple:bga-baseadapter:1.2.9@aar'
implementation 'cn.bingoogolapple:bga-flowlayout:1.0.0@aar'
implementation 'com.github.bumptech.glide:glide:4.7.1'
// scanningCode
implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.7'
二、添加TestScanActivity
这里基本不用做太大改动,拷贝即食,如有其他逻辑,自行添加即可。AndroidManifest.xml中记得也要添加TestScanActivity!!
三、设计扫码页面Layout
扫码界面如果想图简便,可直接使用原作者的xml文件,不过要注意的是此文件中有view_contro.xml以及其他关联的style文件,需一并cory到自己的项目中。我这里暂时将用不到的TextView删除掉了,另外新增了一个Button按钮,用于将扫描结果返回到触发界面。还有一点就是,原作者是将扫描结果显示到顶部的toolbar上显示,我的app已经有toolbar了,所以在copy下的xml文件中将其删除了,使用自己的原有布局。
四、重构业务代码
public void ibInspectionPlanNo_OnClick(View view) {
Intent intent = new Intent(this, TestScanActivity.class);
startActivityForResult(intent, App.SCANNING_REQUEST_CODE);
}
这里是主界面跳转至扫码界面
@Override
public void onScanQRCodeSuccess(String result) {
scanningResuslt = result;
setTitle("扫描结果为:" + result);
vibrate();
mZXingView.startSpot(); // 开始识别
}
ScanActivity中重写的这个方法接收的参数为扫码识别结果,这里需要说明的是scanningResult是我声明的一个全局变量,作用是当用户点击确认扫描结果按钮时。将扫描结果传递到其他界面,用于其他业务逻辑处理。
public void btnSubmit_OnClick(View view) {
Intent intent = new Intent();
//绑定result_code跟intent内容
intent.putExtra("scanningResult", scanningResuslt);
setResult(RESULT_OK, intent);
finish();
}
这里是我给新增的确认扫描结果按钮绑定了一个函数,用于将扫描结果使用Intent传递到主界面显示。
TextView相关的点击事件代码基本可以不用做改动直接用就完了!!
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case App.SCANNING_REQUEST_CODE:
if (resultCode == RESULT_OK) {
String scanningResult = data.getStringExtra("scanningResult");
if (scanningResult != null && !"".equals(scanningResult)) {
mBinding.etInspectionPlanNo.setText(scanningResult);
long inspectionPlanId = localInspectionRepository.getInspectionPlanId(mBinding.etInspectionPlanNo.getText().toString().trim());
inspection.setInspectionPlanId(inspectionPlanId);
}
}
break;
最后在调用界面onActivityResult方法中,接收返回的扫码结果,根据自己的业务场景写相关代码就ok了。
本编文章主要记录自己如何将第三方的扫码代码移植到自己项目中,无任何核心代码,CV大法足矣。如果迁移过程中还有问题的话,就去看原作者的github吧。