Android 一行代码接入扫码功能 (CameraX + zxing)

他来了,他来了,他带着YXing走来了。
YXing 集成了CameraX + zxing, 简洁调用,功能完善,自定义扫码界面,再也不用像以前一样cv一堆冗余的Camera代码进项目了。


001.jpg

怎么集成:
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


p002.jpg

2、仿微信


p003.jpg

通过设置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);
p004.jpg

由于扫码界面一般会有很多不同的业务逻辑,所以可以根据需求自定义扫码界面:

自定义扫码界面流程:
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.布局文件中先将下面代码复制进去:

<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);

5.在AndroidManifest.xml中 为MyScanActivity 添加configChanges属性 防止屏幕销毁重建造成异常

        <activity android:name=".MyScanActivity"
            android:configChanges="keyboard|orientation|screenSize"
            />

预览一下:


p005.jpg

除了扫码功能外,还可以生成二维码:
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 下载链接


微信图片_20230604174940.jpg

技术不强, 重在整理, 不喜勿喷。

附上github链接:https://github.com/amggg/YXing

star star star

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容