【毕业设计_课程设计】基于Android的二维码扫描库

news2024/12/23 19:52:22

文章目录

  • 0 项目说明
  • 1 实现功能
  • 2 使用方式
  • 3 项目工程


0 项目说明

基于Android的二维码扫描库

提示:适合用于课程设计或毕业设计,工作量达标,源码开放


1 实现功能

  • 可打开默认二维码扫描页面
  • 支持对图片Bitmap的扫描功能
  • 支持对UI的定制化操作
  • 支持对条形码的扫描功能
  • 支持生成二维码操作
  • 支持控制闪光灯开关

2 使用方式

  • 集成默认的二维码扫描页面

在具体介绍该扫描库之前我们先看一下其具体的使用方式,看看是不是几行代码就可以集成二维码扫描的功能。

  • 在module的build.gradle中执行compile操作
compile 'cn.yipianfengye.android:zxing-library:2.1'
  • 在demo Application中执行初始化操作
@Override
    public void onCreate() {
        super.onCreate();

        ZXingLibrary.initDisplayOpinion(this);
    }
  • 在代码中执行打开扫描二维码界面操作
/**
         * 打开默认二维码扫描界面
         */
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
            }
        });

这里的REQUEST_CODE是我们定义的int型常量。

  • 在Activity的onActivityResult方法中接收扫描结果
/**
         * 处理二维码扫描结果
         */
        if (requestCode == REQUEST_CODE) {
            //处理扫描结果(在界面上显示)
            if (null != data) {
                Bundle bundle = data.getExtras();
                if (bundle == null) {
                    return;
                }
                if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                    String result = bundle.getString(CodeUtils.RESULT_STRING);
                    Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                    Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                }
            }
        }

执行效果
在这里插入图片描述
有了默认的二维码扫描界面,也有了对二维码图片的解析,可能有的同学会说如果我想定制化显示UI怎么办呢?没关系也支持滴。

  • 定制化显示扫描UI

由于我们的扫描组件是通过Fragment实现的,所以能够很轻松的实现扫描UI的定制化。

  • 在新的Activity中定义Layout布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_second"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/second_button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取消"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="10dp"
        android:layout_gravity="bottom|center_horizontal"
        />

    <FrameLayout
        android:id="@+id/fl_my_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></FrameLayout>

</FrameLayout>

启动id为fl_my_container的FrameLayout就是我们需要替换的扫描组件,也就是说我们会将我们定义的扫描Fragment替换到id为fl_my_container的FrameLayout的位置。而上面的button是我们添加的一个额外的控件,在这里你可以添加任意的控件,各种UI效果等。具体可以看下面在Activity的初始化过程。

  • 在Activity中执行Fragment的初始化操作
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        /**
         * 执行扫面Fragment的初始化操作
         */
        CaptureFragment captureFragment = new CaptureFragment();
        // 为二维码扫描界面设置定制化界面
        CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
        
        captureFragment.setAnalyzeCallback(analyzeCallback);
        /**
         * 替换我们的扫描控件
         */ getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();
    }

其中analyzeCallback是我们定义的扫描回调函数,其具体的定义:

/**
     * 二维码解析回调函数
     */
    CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
        @Override
        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
            bundle.putString(CodeUtils.RESULT_STRING, result);
            resultIntent.putExtras(bundle);
            SecondActivity.this.setResult(RESULT_OK, resultIntent);
            SecondActivity.this.finish();
        }

        @Override
        public void onAnalyzeFailed() {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
            bundle.putString(CodeUtils.RESULT_STRING, "");
            resultIntent.putExtras(bundle);
            SecondActivity.this.setResult(RESULT_OK, resultIntent);
            SecondActivity.this.finish();
        }
    };

仔细看的话,你会发现我们调用了CondeUtils.setFragmentArgs方法,该方法主要用于修改扫描界面扫描框与透明框相对位置的,与若不调用的话,其会显示默认的组件效果,而如果调用该方法的话,可以修改扫描框与透明框的相对位置等UI效果,我们可以看一下my_camera布局文件的实现。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <com.uuzuche.lib_zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:inner_width="200dp"
        app:inner_height="200dp"
        app:inner_margintop="150dp"
        app:inner_corner_color="@color/scan_corner_color"
        app:inner_corner_length="30dp"
        app:inner_corner_width="5dp"
        app:inner_scan_bitmap="@drawable/scan_image"
        app:inner_scan_speed="10"
        app:inner_scan_iscircle="false"
        />

</FrameLayout>

上面我们自定义的扫描控件的布局文件,下面我们看一下默认的扫描控件的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <com.uuzuche.lib_zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</FrameLayout>

可以发现其主要的区别就是在自定义的扫描控件中多了几个自定义的扫描框属性:

<declare-styleable name="innerrect">
        <attr name="inner_width" format="dimension"/><!-- 控制扫描框的宽度 -->
        <attr name="inner_height" format="dimension"/><!-- 控制扫描框的高度 -->
        <attr name="inner_margintop" format="dimension" /><!-- 控制扫描框距离顶部的距离 -->
        <attr name="inner_corner_color" format="color" /><!-- 控制扫描框四角的颜色 -->
        <attr name="inner_corner_length" format="dimension" /><!-- 控制扫描框四角的长度 -->
        <attr name="inner_corner_width" format="dimension" /><!-- 控制扫描框四角的宽度 -->
        <attr name="inner_scan_bitmap" format="reference" /><!-- 控制扫描图 -->
        <attr name="inner_scan_speed" format="integer" /><!-- 控制扫描速度 -->
        <attr name="inner_scan_iscircle" format="boolean" /><!-- 控制小圆点是否展示 -->
    </declare-styleable>

通过以上几个属性我们就可以定制化的显示我们的扫描UI了,比如定制化微信扫描UI:

当然了如果以上的以上,你还是对定制化UI方面不太满意,可以直接下载我的项目,然后引入lib-zxing module作为你的module,直接修改其代码。

  • 生成二维码图片

  • 生成带Logo的二维码图片:

/**
         * 生成二维码图片
         */
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String textContent = editText.getText().toString();
                if (TextUtils.isEmpty(textContent)) {
                    Toast.makeText(ThreeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();
                    return;
                }
                editText.setText("");
                mBitmap = CodeUtils.createImage(textContent, 400, 400, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
                imageView.setImageBitmap(mBitmap);
            }
        });
  • 生成不带logo的二维码图片
/**
         * 生成不带logo的二维码图片
         */
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String textContent = editText.getText().toString();
                if (TextUtils.isEmpty(textContent)) {
                    Toast.makeText(ThreeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();
                    return;
                }
                editText.setText("");
                mBitmap = CodeUtils.createImage(textContent, 400, 400, null);
                imageView.setImageBitmap(mBitmap);
            }
        });
  • 支持控制闪光灯
/**
 * 打开闪光灯
 */
CodeUtils.isLightEnable(true);

/**
 * 关闭闪光灯
 */
 CodeUtils.isLightEnable(false);

3 项目工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Problem C: 算法9-9~9-12:平衡二叉树的基本操作

Problem Description 平衡二叉树又称AVL树&#xff0c;它是一种具有平衡因子的特殊二叉排序树。平衡二叉树或者是一棵空树&#xff0c;或者是具有以下几条性质的二叉树&#xff1a; 1. 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根节点的值&#xf…

JavaSE笔记——内部类

文章目录前言一、创建内部类二、链接外部类三、使用.this 和.new四、内部类与向上转型五、内部类方法和作用域六、匿名内部类七、嵌套类1. 接口内部的类2. 从多层嵌套类中访问外部类的成员八、继承内部类九、局部内部类总结前言 一个定义在另一个类中的类&#xff0c;叫作内部…

AUTO-CUT安装。

auto cut 是李沐老师分享的视频剪辑工具wisper。 这我非常需要啊。 所以看看怎么安装。 先下载客户端。和ffmpeg 链接&#xff1a;https://pan.baidu.com/s/1EZomUtV8Y_es8crR6-r3GQ 提取码&#xff1a;lgky 解压安装autocut客户端。 还需要ffmpeg和环境。 环境配置是自动…

事业编上岸浙大mpa的个人经验总结

先来介绍下我的个人情况吧&#xff0c;我是2022级浙大MPA项目的一名新生&#xff0c;也是一名中学老师&#xff0c;定居在杭州&#xff0c;毕业于湖州师范学院&#xff0c;在学校主要是负责教研这一块的工作&#xff0c;因为工作需要的原因&#xff0c;在综合了解了几个项目后&…

测试工具Hercules

下载地址&#xff1a;Hercules SETUP utility | HW-group.com Hercules SETUP实用程序是有用的串行端口终端&#xff08;RS-485或RS-232终端&#xff09;、UDP/IP终端和TCP/IP客户端服务器终端。它只为硬件组内部使用而创建&#xff0c;但今天它在一个实用程序中包含了许多功能…

手把手刷算法项目fucking-algorithm,干翻算法

今天给大家分享一个开源项目&#xff0c;在 GitHub 排行榜上今天特别火&#xff0c;都爬到了日排行榜的第二名。 大家想知道&#xff0c;面试互联网大厂&#xff0c;必面的是什么吗&#xff1f;当然是算法。作为程序员&#xff0c;互联网大厂的面试&#xff0c;算法是最重要的…

用javascript分类刷leetcode10.递归分治(图文视频讲解)

递归三要素 递归函数以及参数递归终止条件递归单层搜索逻辑 递归伪代码模版&#xff1a; function recursion(level, param1, param2, ...) {//递归终止条件if (level > MAX_LEVEL) {// output resultreturn;}//处理当前层process_data(level, data, ...);//进入下一层re…

10_缓存-2_二级缓存

二级缓存是以namespace为标记的缓存&#xff0c;可以是由一个SqlSessionFactory创建的SqlSession之间共享缓存数据。默认并不开启。下面的代码中创建了两个SqlSession&#xff0c;执行相同的SQL语句&#xff0c;尝试让第二个SqlSession使用第一个SqlSession查询后缓存的数据。要…

CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型

前言 在ctf比赛中&#xff0c;misc方向是必考的一个方向&#xff0c;其中&#xff0c;图片隐写也是最常见的题目类型&#xff0c;在本篇文章中&#xff0c;将教授以下内容 1.各种图片文件的头数据以及判断是什么类型的图片 2.png图片隐写 3.jpg图片隐写 4.gif图片隐写 5.bmp图…

Android---RecyclerView实现吸顶效果

目录 一、ItemDecoration 二、实现RecyclerView吸顶效果 1、实现一个简单的RecyclerView。 2、通过ItemDecoration画分割线 3、画出每个分组的组名 4、实现吸顶效果 完整demo 一、ItemDecoration ItemDecoration 允许应用给具体的 View 添加具体的图画或者 layout 的偏移…

论文投稿指南——中文核心期刊推荐(物理学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

[附源码]计算机毕业设计Python的高校课程知识库(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

如何做好源代码防泄密

​ 一、前言 • 各类嵌入式研发及平台软件研发行业&#xff0c;都有自己的核心数据以及核心文档&#xff0c;用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; –属于核心机密资料&#xff0c;万一泄密会给造成恶劣影响 –核心数据类型多&#xff0c;有…

验证码是自动化的天敌?看看大神是怎么解决的

01 验证码 1、什么是验证码&#xff1a; 指一种随机生成的信息&#xff08;数字、字母、汉字、图片、算术题&#xff09;等为了防止恶意的请求行为&#xff0c;增加应用的安全性 自动化过程中也是需要进行注册或者登陆的操作&#xff0c;所以需要处理验证 2、验证码处理方式…

《第一堂棒球课》:MLB棒球创造营·棒球名人堂

铃木一朗&#xff0c;1973年10月22日出生于西春日井郡丰山町&#xff08;日本&#xff09;&#xff0c;日本职业棒球运动员&#xff0c;效力于美国职棒大联盟西雅图水手队。 1991年被欧力士蓝浪以第四指名选中&#xff0c;1994年以片假名&#xff08;Ichiro&#xff09;在一军…

记录一次并发问题的解决

并发问题的产生背景 该问题是在生产运行的过程中出现的。这个运行的项目是一个拉取第三方数据的一个服务&#xff0c;该服务会在拉取到数据之后直接将该数据直接插入到本地库&#xff0c;其中插入本地库的操作是调用的一个静态方法&#xff0c;静态方法对数据进行了多次数据处…

携程Apollo配置中心架构介绍

俗话说”麻雀虽小&#xff0c;五脏俱全“&#xff0c;有人说想看开源源码却不知道什么好&#xff0c;事实上&#xff0c;那些流行多年&#xff0c;广受好评的开源工程都是很值得一读的。今天我们介绍Apollo配置中心的基本情况&#xff0c;之所以介绍这个&#xff0c;主要是因为…

在线地图持续进化,BAT技术“鲜”发制人

配图来自Canva可画 眼下&#xff0c;在线地图正在成为智能穿戴、物流运输、旅游度假等诸多领域的“基础设施”&#xff0c;尤其是自动驾驶、车路协同等汽车细分赛道越来越重视在线地图的导入。 得益于此&#xff0c;在线地图市场持续走向火热。华经产业研究院数据显示&#x…

linux基础学习-ssh基础

ssh基础 通过SSH客户端我们可以连接到运行了SSH服务器的远程机器上 SSH客户端是一种使用Secure Shell(SSH)协议连接到远程计算机的软件程序目前较为可靠&#xff0c;专门为远程登录会话和其他网络服务提供安全性的协议 利用SSH协议可以有效防止远程管理过程中的信息泄露提供SS…

行业级开源无人机目标追踪,高空助力抓贼!

活久见&#xff01;成都一高楼惊险无人机抓小偷视频中危险动作&#xff0c;请勿模仿&#xff01; 本次实验中我们使用的是Prometheus 600&#xff08;P600&#xff09;行业级无人机研发平台&#xff08;此平台适用于无人机行业应用开发与室外环境下的无人机算法验证&#xff0…