他来了,他来了,他带着YXing走来了。
YXing 集成了CameraX + zxing, 简洁调用,功能完善,自定义扫码界面,再也不用像以前一样cv一堆冗余的Camera代码进项目了。
怎么集成:
1.在根目录的build.gradle或settings.gradle中添加jitpack依赖 :
repositories {
maven { url "https://jitpack.io" }
}
2.在project的build.gradle中添加YXing依赖:
implementation 'com.github.amggg:YXing:V2.0.1'
功能:
1、扫描二维码(单个/多个)、条形码。
2、生成二维码,带logo二维码 、条形码。
3、识别相册内条形码、二维码图片。
注意事项:
1.在进入扫码界面前, 自行动态请求相机权限。
2.minSdk >= 21 (android5.0 及以上)。
3.AndroidX。
如何使用:
1.简单调用:
Activity中启动:
ScanCodeConfig.create(MainActivity.this)
//设置扫码页样式 ScanStyle.NONE:无 ScanStyle.QQ :仿QQ样式 ScanStyle.WECHAT :仿微信样式 ScanStyle.CUSTOMIZE : 自定义样式
.setStyle(style)
//扫码成功是否播放音效 true : 播放 false : 不播放
.setPlayAudio(false)
.buidler()
//跳转扫码页 扫码页可自定义样式
.start(ScanCodeActivity.class);
Fragment中启动:
ScanCodeConfig.create(MainActivity.this, mFragment)
//设置扫码页样式 ScanStyle.NONE:无 ScanStyle.QQ :仿QQ样式 ScanStyle.WECHAT :仿微信样式 ScanStyle.CUSTOMIZE : 自定义样式
.setStyle(style)
//扫码成功是否播放音效 true : 播放 false : 不播放
.setPlayAudio(false)
.buidler()
//跳转扫码页 扫码页可自定义样式
.start(ScanCodeActivity.class);
获取扫码结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && data != null) {
switch (requestCode) {
case ScanCodeConfig.QUESTCODE:
//接收扫码结果
Bundle extras = data.getExtras();
if (extras != null) {
int codeType = extras.getInt(ScanCodeConfig.CODE_TYPE);
String code = extras.getString(ScanCodeConfig.CODE_KEY);
tvCode.setText(String.format(
"扫码结果:\n" +
"码类型: %s \n" +
"码值 : %s", codeType == 0 ? "一维码" : "二维码", code));
}
break;
case ALBUM_QUEST_CODE:
//接收图片识别结果
String code = ScanCodeConfig.scanningImage(this, data.getData());
tvCode.setText(String.format("识别结果: %s", code));
break;
default:
break;
}
}
}
内置两种样式可供使用, 通过setStyle方法 设置。
1、仿 QQ
2、仿微信
通过设置style 为 ScanStyle.CUSTOMIZE 进行自定义样式设计:
ScanCodeConfig.create(MainActivity.this)
//设置扫码页样式 ScanStyle.NONE:无 ScanStyle.QQ :仿QQ样式 ScanStyle.WECHAT :仿微信样式 ScanStyle.CUSTOMIZE : 自定义样式
.setStyle(ScanStyle.CUSTOMIZE)
//扫码成功是否播放音效 true : 播放 false : 不播放
.setPlayAudio(true)
//设置音效音频
.setAudioId(R.raw.beep)
////////////////////////////////////////////
//以下配置 在style为 ScanStyle.CUSTOMIZE 时生效
//设置扫码框位置 left : 边框左边位置 top : 边框上边位置 right : 边框右边位置 bottom : 边框下边位置 单位/dp
// .setScanRect(new ScanRect(50, 200, 300, 450), false)
//是否限制识别区域为设定扫码框大小 true:限制 false:不限制 默认false:识别区域为整个屏幕
.setLimitRect(true)
//设置扫码框位置 scanSize : 扫码框大小 offsetX : x轴偏移量 offsetY :y轴偏移量 单位 /px
.setScanSize(600, 0, 0)
//是否显示边框上四个角标 true : 显示 false : 不显示
.setShowFrame(true)
//设置边框上四个角标颜色
.setFrameColor(R.color.whilte)
//设置边框上四个角标圆角 单位 /dp
.setFrameRadius(2)
//设置边框上四个角宽度 单位 /dp
.setFrameWith(4)
//设置边框上四个角长度 单位 /dp
.setFrameLength(15)
//设置是否显示边框外部阴影 true : 显示 false : 不显示
.setShowShadow(true)
//设置边框外部阴影颜色
.setShadeColor(R.color.black_tran30)
//设置扫码条运动方式 ScanMode.REVERSE : 往复运动 ScanMode.RESTART :重复运动 默认ScanMode.RESTART
.setScanMode(ScanMode.REVERSE)
//设置扫码条扫一次时间 单位/ms 默认3000
.setScanDuration(3000)
//设置扫码条图片
.setScanBitmapId(R.mipmap.scan_wechatline)
//////////////////////////////////////////////
//////////////////////////////////////////////
//以下配置在 setIdentifyMultiple 为 true 时生效
//设置是否开启识别多个二维码 true:开启 false:关闭 开启后识别到多个二维码会停留在扫码页 手动选择需要解析的二维码后返回结果
.setIdentifyMultiple(isMultiple)
//设置 二维码提示按钮的宽度 单位:px
.setQrCodeHintDrawableWidth(120)
//设置 二维码提示按钮的高度 单位:px
.setQrCodeHintDrawableHeight(120)
//设置 二维码提示按钮的Drawable资源
// .setQrCodeHintDrawableResource(R.mipmap.in)
//设置 二维码提示Drawable 是否开启缩放动画效果
.setStartCodeHintAnimation(true)
//设置 二维码选择页 背景透明度
.setQrCodeHintAlpha(0.5f)
//////////////////////////////////////////////
.buidler()
//跳转扫码页 扫码页可自定义样式
.start(MyScanActivity.class);
由于扫码界面一般会有很多不同的业务逻辑,所以可以根据需求自定义扫码界面:
自定义扫码界面流程:
1.新建Activity 继承 ScanCodeActivity
public class MyScanActivity extends ScanCodeActivity
2.重写getLayoutId() 和 initData() 方法
getLayoutId返回你自己定义的布局文件id
initData() 和平常一样 初始化数据 监听等等
public class MyScanActivity extends ScanCodeActivity {
private AppCompatButton btnOpenFlash;
@Override
public int getLayoutId() {
return R.layout.activity_myscan;
}
@Override
public void initData() {
super.initData();
btnOpenFlash = findViewById(R.id.btn_openflash);
btnOpenFlash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isOpenFlash = !isOpenFlash;
setFlashStatus(isOpenFlash);
btnOpenFlash.setText(isOpenFlash ? "关闭闪光灯" : "打开闪光灯");
}
});
}
}
3.布局文件中先将下面代码复制进去:
PreviewView是扫码界面, 下面可以任意添加自己的布局了:
下面尝试一下:
4.start()方法参数 替换成自定义的Activity:
ScanCodeConfig.create(MainActivity.this)
//设置扫码页样式 ScanStyle.NONE:无 ScanStyle.QQ :仿QQ样式 ScanStyle.WECHAT :仿微信样式
.setStyle(style)
//扫码成功是否播放音效 true : 播放 false : 不播放
.setPlayAudio(true)
.buidler()
//跳转扫码页 扫码页可自定义样式
.start(MyScanActivity.class);
5.在AndroidManifest.xml中 为MyScanActivity 添加configChanges属性 防止屏幕销毁重建造成异常
预览一下:
除了扫码功能外,还可以生成二维码:
1.单独的二维码:
Bitmap bitmap = ScanCodeConfig.createQRCode("star");
2.带logo的二维码:
Bitmap bitmap = ScanCodeConfig.createQRCodeWithLogo("star", BitmapFactory.decodeResource(getResources(), R.mipmap.timg));
3.生成带描边logo二维码
Bitmap bitmap = ScanCodeConfig.createQRCodeWithStrokeLogo("star", SizeUtils.dp2px(getApplicationContext(), 200), BitmapFactory.decodeResource(getResources(), R.mipmap.timg), SizeUtils.dp2px(getApplicationContext(), 60), SizeUtils.dp2px(getApplicationContext(), 60), SizeUtils.dp2px(getApplicationContext(), 10), SizeUtils.dp2px(getApplicationContext(), 10), SizeUtils.dp2px(getApplicationContext(), 2), ContextCompat.getColor(MainActivity.this, R.color.colorAccent));
二维码宽高, logo宽高, 圆角都可以自行设置:
/**
* 生成二维码
*
* @param text 需要生成二维码的文字、网址等
* @param size 需要生成二维码的大小()
* @return bitmap
*/
public static Bitmap createQRCode(String text, int size) {
/** 生成带logo 二维码
* @param text 文字
* @param size 二维码大小 1 :1
* @param logo logo
* @param logoWith logo宽
* @param logoHigh logo高
* @param logoRaduisX logo x圆角
* @param logoRaduisY logo y圆角
* @return
*/
public static Bitmap createQRCodeWithLogo(String text, int size, Bitmap logo, int logoWith, int logoHigh, float logoRaduisX, float logoRaduisY){
/** 生成带描边logo 二维码
* @param text 文字
* @param size 二维码大小 1 :1
* @param logo logo
* @param logoWith logo宽
* @param logoHigh logo高
* @param logoRaduisX logo x圆角
* @param logoRaduisY logo y圆角
* @param storkWith 描边宽度
* @param storkColor 描边颜色
* @return
*/
public static Bitmap createQRCodeWithStrokeLogo(String text, int size, Bitmap logo, int logoWith, int logoHigh, float logoRaduisX, float logoRaduisY, int storkWith, int storkColor){
除了生成二维码, 从相册识别二维码也是必不可少的:
调用以下方法, 把选中的图片uri传进去 就可以获取到二维码的内容了。。
/**
* 解码uri二维码图片
* @return
*/
public static String scanningImage(Activity mActivity, Uri uri) {
/**
* 解码bitmap二维码图片
* @return 解码内容
*/
public static String scanningImageByBitmap(Bitmap srcBitmap) {
4.生成条形码
Bitmap barCode = ScanCodeConfig.createBarCode("234323423423", 500, 200, false);
可配置条形码的宽高,是否在条码下方显示内容。
注意:条码内容不可为 中文。
/**
* 生成条形码
* @param content 要生成条形码包含的内容
* @param widthPix 条形码的宽度
* @param heightPix 条形码的高度
* @param isShowContent 是否显示条形码包含的内容
* @return 返回生成条形的位图
*/
public static Bitmap createBarcode(String content, int widthPix, int heightPix, boolean isShowContent) {
打完 收工~~~
github 内有app 下载链接
技术不强, 重在整理, 不喜勿喷。
附上github链接:https://github.com/amggg/YXing
star star star