Android 一行代码接入扫码功能 (CameraX + zxing)
他来了,他来了,他带着YXing走来了。
YXing 集成了CameraX + zxing, 简洁调用,功能完善,自定义扫码界面,再也不用像以前一样cv一堆冗余的Camera代码进项目了。
怎么集成:
1.在根目录的build.gradle中添加jitpack依赖:
allprojects { repositories { maven { url "https://jitpack.io" } }}
2.在project的build.gradle中添加YXing依赖:
implementation 'com.github.amggg:YXing:V1.0.2'
功能:
1、扫码功能。
2、生成二维码和带logo二维码 (大小圆角可设置)。
3、识别相册内二维码图片。
注意事项:
1.在进入扫码界面前, 自行动态请求相机权限。
2.minSdk >= 21 (android5.0 及以上)
如何使用:
1.简单调用:
ScanCodeConfig.create(MainActivity.this) //设置扫码页样式 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 && requestCode == ScanCodeConfig.QUESTCODE && data != null){ Bundle extras = data.getExtras(); if(extras != null){ String code = extras.getString(ScanCodeConfig.CODE_KEY); tvCode.setText(String.format("%s%s", "结果: " , code)); } } }
内置两种样式可供使用, 通过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)) //是否显示边框上四个角标 true : 显示 false : 不显示 .setShowFrame(true) //设置边框上四个角标颜色 .setFrameColor(R.color.whilte) //设置边框上四个角标圆角 单位 /dp .setFrameRaduis(2) //设置边框上四个角宽度 单位 /dp .setFrameWith(4) //设置边框上四个角长度 单位 /dp .setFrameLenth(15) //设置是否显示边框外部阴影 true : 显示 false : 不显示 .setShowShadow(true) //设置边框外部阴影颜色 .setShaowColor(R.color.black_tran30) //设置扫码条图片 .setScanBitmapId(R.mipmap.scan_wechatline) ////////////////////////////////////////////// .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) { Toast.makeText(MyScanActivity.this, "打开闪光灯", Toast.LENGTH_SHORT).show(); } }); }}
3.布局文件中先将下面代码复制进去:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rlparent" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.camera.view.PreviewView android:id="@+id/pvCamera" android:layout_width="match_parent" android:layout_height="match_parent" /> <!--开始自定义界面--></RelativeLayout>
PreviewView是扫码界面, 下面可以任意添加自己的布局了:
下面尝试一下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rlparent" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.camera.view.PreviewView android:id="@+id/pvCamera" android:layout_width="match_parent" android:layout_height="match_parent" /> <!--开始自定义界面--> <androidx.appcompat.widget.AppCompatButton android:id="@+id/btn_openflash" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="打开闪光灯" android:layout_alignParentBottom="true" /></RelativeLayout>
4.start()方法参数 替换成自定义的Activity:
ScanCodeConfig.create(MainActivity.this) //设置扫码页样式 ScanStyle.NONE:无 ScanStyle.QQ :仿QQ样式 ScanStyle.WECHAT :仿微信样式 .setStyle(style) //扫码成功是否播放音效 true : 播放 false : 不播放 .setPlayAudio(true) .buidler() //跳转扫码页 扫码页可自定义样式 .start(MyScanActivity.class);
预览一下:
除了扫码功能外,还可以生成二维码:
1.单独的二维码:
Bitmap bitmap = ScanCodeConfig.createQRCode("star"); ivCode.setImageBitmap(bitmap);
2.带logo的二维码:
Bitmap bitmap = ScanCodeConfig.createQRcodeWithLogo("star", BitmapFactory.decodeResource(getResources(), R.mipmap.timg)); ivCode.setImageBitmap(bitmap);
二维码宽高, 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){
除了生成二维码, 从相册识别二维码也是必不可少的:
调用以下方法, 把选中的图片uri传进去 就可以获取到二维码的内容了。。
/** * 解码uri二维码图片 * @return */ public static String scanningImage(Activity mActivity, Uri uri) {
打完 收工~~~
github 内有app 下载链接
技术不强, 重在整理, 不喜勿喷。
附上github链接https://github.com/amggg/YXing
star star star
版权声明: 本文为 InfoQ 作者【】的原创文章。
原文链接:【http://xie.infoq.cn/article/47185f8542855a2eda97c871b】。文章转载请联系作者。
还未添加个人签名 2018.07.12 加入
还未添加个人简介
评论