基于Android的二维码识别系统的研究与实现(eclipse开发)

news2024/9/29 7:17:59

目 录
1 Android系统开发背景与意义 1
1.1 Android系统平台的出现 1
1.2 Android系统的发展 1
1.3 Android系统架构的介绍 1
1.4 Android开放系统 3
1.5 Android系统的特点 3
2 二维码识别系统背景介绍 3
2.1 二维码识别系统背景 3
2.1.1 二维码技术产生的背景 3
2.1.2 二维码分类及其特点 4
2.1.3 二维码技术国内外的发展 5
2.2 二维码技术研究的意义和应用 6
2.2.1 二维码技术的应用 6
2.2.2 二维码研究的意义 7
3 需求分析 8
3.1 系统需求分析 8
3.1.1 课题可行性分析 8
3.1.2 课题功能需求分析 9
3.1.3 课题功能需求分析说明 9
3.1.4 系统界面需求 9
3.1.5 系统性能需求 9
3.1.6 运行环境需求 9
3.2 系统需要解决的问题 9
3.3 系统关键技术分析 10
3.4 本章总结 10
4 系统设计 10
4.1 课题需要解决的问题 10
4.1.1 界面布局 10
4.1.2 条形码二维码解码功能 10
4.2 系统总体设计 11
4.2.1 课题功能框架 11
4.2.2 课题总体流程图 12
4.2.3 数据库的概念结构设计 13
4.3 系统详细设计 13
4.3.1 系统模块设计 13
4.3.2 系统界面详细设计 16
4.3.3 数据库详细设计 16
4.4 本章小结 17
5 编码与实现 17
5.1 开发环境搭配 17
5.1.1 软件下载安装 17
5.1.2 配置环境变量 17
5.2 二维码识别系统功能实现 17
5.2.1 二维码识别系统界面设计 17
5.2.2 二维码功能的设计与实现 19
5.2.3 查看扫描历史记录功能实现 21
5.2.4 分享功能实现 22
5.3 本章小结 22
6 系统测试与运行 22
6.1 测试目的 22
6.2 测试环境 23
6.3 测试的流程和测试 23
6.3.1 基于Android模拟器的运行测试 23
6.3.2 基于Android移动设备的运行测试 24
6.4 本章小结 27
结束语 28
参考文献 29
附录 30
致谢 31
3 需求分析
3.1 系统需求分析
3.1.1 课题可行性分析
随着Android的快速发展和不断完善,Android的应用是越发的广泛。所以基于Android平台的手机小程序也是越来越多、越来越受欢迎。
Java是一种跨平台的,面向对象的,分布式的,解释的,健壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立。
随着Android移动设备大部分都带有自动调焦作用,这就对Android二维码系统的应用带来了更广阔的市场。又各国对二维码的发展和研究,也产生了很多稳定和安全的二维码系统,并且Google根据每种条形码二维码的标准开发了开源项目Zxing。根据Zxing核心库的基础,该系统可以根据核心库提供的二维码标准,依据编码解码原理实该项目的条码、二维码识别。这对二维码的开发和研究带来了更多发展前景[7]。
3.1.2 课题功能需求分析
本次的毕业设计主要就是在基于Android平台下设计并开发一个条码二维码识别系统。运用当前Google提供的Android SDK来以及开源项目Zxing核心库编码解码原理为基础,来实现二位码识别系统。
本课题的总体的功能业务可以主要描述为以下几点:
(1) 主界面上显示出主要的功能
(2) 进行一维条行码的识别
(3) 进行二维QR码的识别
(4) 进行二维DM矩阵码识别
(5) 对二维码进行分享
(6) 软件使用帮助
3.1.3 课题功能需求分析说明
根据对本课题的主要需求的分析做如下说明:
(1) 主界面上主要就是显示该系统所能够进行的动作和所能实现的功能,也是用户进行软件操作的主要界面。
(2) 本软件最强大的功能是实现当前主流的条码、QR码和DM矩阵码的识别功能。
(3) 可以分享二维码。
(4) 对扫描历史进行查看。
(5) 对软件使用提供帮助。
3.1.4 系统界面需求
本系统的界面需要布局合理、美观,需要体现系统的友好性。
3.1.5 系统性能需求
本系统需要扫描速度快、安全性高、处理结果速度快,尽可能为用户节省时间。
3.1.6 运行环境需求
系统运行环境:基于Android操作系统移动设备
系统支持版本:Android 1.5及以上版本
开发环境:Eclipse 3.5 ADT16-16.0.1 JDK-7u3-windows-i586
3.2 系统需要解决的问题
开发基于Android二维码识别系统需要解决一下几个问题:
(1)数据库问题
本系统需要用到SQLite轻量级数据库。用SQLite数据库来实现历史记录数据的存放。
(2)布局问题
在Android平台下开发该应用软件,一个非常重要问题的是要解决布局问题。android平台中采用的是xml文件来设置布局。SDK提供了包括图片、文字显示、以及xml文件的设计方法。该系统需要用到FrameLayout布局来调用摄像头。
3.3 系统关键技术分析
(1)SQLite轻量级数据库的使用。
该系统需要使用到Android自身的数据库系统,使用SQLite数据创建存放扫描结果的历史记录表。
(2)移动设备Camera摄像头的调用。
该系统要是使用摄像头才能进行二维码的扫描和处理,通过摄像头来进行二维码图片数据的输入。
3.4 本章总结
通过对Android平台的架构的分析和对毕业设计课题的需求的分析,我们基本可以了解到该课题的主要功能。为下一阶段的设计的研究打下好的基础。
4 系统设计
4.1 课题需要解决的问题
4.1.1 界面布局
一个Android软件的好坏很大程度上并不是功能如何强大,而是友好易操作的界面的好坏。一个友好的界面不仅让用户更容易操作和使用软件,也让用户感觉到很舒服的感觉。Android系统正是考虑到这一点,为开发人员提供了强大的布局实现,并提供了很多布局方式包括:LinearLayout水平布局、FrameLayout框架布局、RelativeLayout相对布局、TableLayout表单布局和TAbWidget切换卡、AbsoluteLayout绝对布局。
本软件需要用调用Camera来实现扫描功能,需要用到框架布局FrameLayout能重叠控件,实现“范围框”的效果。
4.1.2 条形码二维码解码功能
本系统是根据Google研究开源项目Zxing核心库为基础,通过二维码发布的标准,就是为了实现二维码扫描功能,当前最流行条形码,日韩所使用最多的QR码和美国的DM矩阵码。Zxing不仅对最主要的二维码扫描功能做了详细的分析,同时也实现了国际化的操作,针对不同国家,使用不同的语言,由于QRcode二维码的广泛应用且QRcode支持中文,所以在此我们主要使用QRcode二维码识别,语言为简体中文[9]。
系统用例图如图4-1所示:
在这里插入图片描述

图4-1 系统功能用例图
4.2 系统总体设计
4.2.1 课题功能框架
基于Android二维码系统功能主要包括:一位条码扫描、二位QR码扫描、DM矩阵码扫描和分享二维码扫描。功能框架如图4-2所示:
在这里插入图片描述

图4-2 系统功能模块图

/*
 * Copyright (C) 2008 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.zxing.client.android;

import com.google.zxing.ResultPoint;
import com.google.zxing.client.android.camera.CameraManager;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;

import java.util.Collection;
import java.util.HashSet;

/**
 * This view is overlaid on top of the camera preview. It adds the viewfinder rectangle and partial
 * transparency outside it, as well as the laser scanner animation and result points.
 *
 * @author dswitkin@google.com (Daniel Switkin)
 */
public final class ViewfinderView extends View {

  private static final int[] SCANNER_ALPHA = {0, 64, 128, 192, 255, 192, 128, 64};
  private static final long ANIMATION_DELAY = 100L;
  private static final int OPAQUE = 0xFF;

  private final Paint paint;
  private Bitmap resultBitmap;
  private final int maskColor;
  private final int resultColor;
  private final int frameColor;
  private final int laserColor;
  private final int resultPointColor;
  private int scannerAlpha;
  private Collection<ResultPoint> possibleResultPoints;
  private Collection<ResultPoint> lastPossibleResultPoints;

  // This constructor is used when the class is built from an XML resource.
  public ViewfinderView(Context context, AttributeSet attrs) {
    super(context, attrs);

    // Initialize these once for performance rather than calling them every time in onDraw().
    paint = new Paint();
    Resources resources = getResources();
    maskColor = resources.getColor(R.color.viewfinder_mask);
    resultColor = resources.getColor(R.color.result_view);
    frameColor = resources.getColor(R.color.viewfinder_frame);
    laserColor = resources.getColor(R.color.viewfinder_laser);
    resultPointColor = resources.getColor(R.color.possible_result_points);
    scannerAlpha = 0;
    possibleResultPoints = new HashSet<ResultPoint>(5);
  }

  @Override
  public void onDraw(Canvas canvas) {
    Rect frame = CameraManager.get().getFramingRect();
    if (frame == null) {
      return;
    }
    int width = canvas.getWidth();
    int height = canvas.getHeight();

    // Draw the exterior (i.e. outside the framing rect) darkened
    paint.setColor(resultBitmap != null ? resultColor : maskColor);
    canvas.drawRect(0, 0, width, frame.top, paint);
    canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
    canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
    canvas.drawRect(0, frame.bottom + 1, width, height, paint);

    if (resultBitmap != null) {
      // Draw the opaque result bitmap over the scanning rectangle
      paint.setAlpha(OPAQUE);
      canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint);
    } else {

      // Draw a two pixel solid black border inside the framing rect
      paint.setColor(frameColor);
      canvas.drawRect(frame.left, frame.top, frame.right + 1, frame.top + 2, paint);
      canvas.drawRect(frame.left, frame.top + 2, frame.left + 2, frame.bottom - 1, paint);
      canvas.drawRect(frame.right - 1, frame.top, frame.right + 1, frame.bottom - 1, paint);
      canvas.drawRect(frame.left, frame.bottom - 1, frame.right + 1, frame.bottom + 1, paint);

      // Draw a red "laser scanner" line through the middle to show decoding is active
      paint.setColor(laserColor);
      paint.setAlpha(SCANNER_ALPHA[scannerAlpha]);
      scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length;
      int middle = frame.height() / 2 + frame.top;
      canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint);

      Collection<ResultPoint> currentPossible = possibleResultPoints;
      Collection<ResultPoint> currentLast = lastPossibleResultPoints;
      if (currentPossible.isEmpty()) {
        lastPossibleResultPoints = null;
      } else {
        possibleResultPoints = new HashSet<ResultPoint>(5);
        lastPossibleResultPoints = currentPossible;
        paint.setAlpha(OPAQUE);
        paint.setColor(resultPointColor);
        for (ResultPoint point : currentPossible) {
          canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 6.0f, paint);
        }
      }
      if (currentLast != null) {
        paint.setAlpha(OPAQUE / 2);
        paint.setColor(resultPointColor);
        for (ResultPoint point : currentLast) {
          canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 3.0f, paint);
        }
      }

      // Request another update at the animation interval, but only repaint the laser line,
      // not the entire viewfinder mask.
      postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom);
    }
  }

  public void drawViewfinder() {
    resultBitmap = null;
    invalidate();
  }

  /**
   * Draw a bitmap with the result points highlighted instead of the live scanning display.
   *
   * @param barcode An image of the decoded barcode.
   */
  public void drawResultBitmap(Bitmap barcode) {
    resultBitmap = barcode;
    invalidate();
  }

  public void addPossibleResultPoint(ResultPoint point) {
    possibleResultPoints.add(point);
  }

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

图像压缩原理-JPEG

搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种&#xff0c;比如PNG&#xff0c;JPEG等等&#xff0c;但当我们把一张图用工具变成各种其他格式时&#xff0c;其在计算机文件系统显示的文件大小各不一样&#xff0c;但是当你打开显示时&#xff0c;从视觉角度…

Android进阶之路 - Json解析异常

在App与H5交互时&#xff0c;有一个调原生分享的需求&#xff0c;交互方面没有问题&#xff0c;因为分享需要多值&#xff0c;所以采用json进行传递&#xff0c;在app接收进行解析时遇到了这个解析异常 Value &#xfeff; of type java.lang.String cannot be converted to JS…

【操作系统一】图解TCP/IP模型+实战

【操作系统一】OSI模型和TCP/IP模型一、OSI模型1、什么是OSI模型2、osi七层参考模型3、我更想介绍TCP/IP模型二、TCP/IP模型1、TCP/IP模型起源2、TCP/IP模型是五层还是四层&#xff1f;3、两层TCP/IP模型4、传输层&#xff08;也叫传输控制层&#xff09;4.1 TCP4.3、三次握手4…

【算法面试题汇总】LeetBook列表的算法面试题汇总---动态规划题目及答案

整理不易留个小心心呗&#x1f970; 如果有更好的或者是我有错的地方还请各位大佬指出哦 有些是copy的还望不要介意 动态规划至少有k个重复字符的最长子串二叉树中的最大路径和最长连续序列打家劫舍完全平方数最长上升子序列*零钱兑换矩阵中的最长递增路径至少有k个重复字符的最…

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库)

java计算机毕业设计ssm民宿管理系统设计7lky4&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Linux服务器上Neo4j的安装、迁移

目录 1、环境 2、下载 3、修改配置 4、启动及其他命令 5、客户端访问&#xff1a; 6、数据迁移 1、环境 Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。 neo4j版本&#xff1a;neo4j-community-3.5.6 2、下…

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;如何进入 Learner Lab 请参考 使用 Learner Lab …

第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)

第十三章 DFS与BFS一、深度优先搜索1、什么是DFS&#xff1f;2、DFS代码模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;分析&#xff1a;&#xff08;3&#xff09;模板&#xff1a;3、DFS代码分析二、广度优先搜索1、什么是BFS&#xff1f;2、BFS代…

就是把一个数组中相同类别数据,组成新的数组

效果图如上&#xff0c;就是把一个数组中相同类别数据&#xff0c;组成新的数组&#xff0c;每个数组最后加一个空对象&#xff0c;对象对应的格式要做些许改变 分店 品牌 业绩(元) 订单个数 单值(元) {{item.shopname}} {{item.shopname}} {{item.shopname}} {{item.shopname}…

《InnoDB引擎九》InnoDB关键特性-自适应哈希索引

InnoDB 关键特性 InnoDB存储引擎的关键特性包括&#xff1a; Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 自适应哈…

猿如意开发工具|emeditor

写在前面 昨天升了下系统&#xff0c;可以下载了&#xff0c;我就试了试 正文 在客户端里搜索我所需要的工具&#xff0c;就可以搜出来 这里我已经下好了&#xff0c;直接点开文件就好了 再点开文件 点击下一步&#xff0c;接下来还有几个步骤&#xff0c;都点下一步就可以了…

【HBuilder X】解决HBuilder X内置浏览器显示过大影响使用

1- 前言 不知道宝子们有没有遇到过这种情况&#xff0c;小媛发现自己的内置浏览器过大&#xff0c;很大&#xff0c;很丑&#xff0c;占了半个屏幕&#xff0c;像下图那样。 也试了几种方法&#xff0c;比如&#xff1a; 看自己的版本不是最新&#xff0c;或者和其他人的不一样…

嫁给程序员老公,我后悔了

01 在我还没长开的时候&#xff0c;就常听人说&#xff0c;有两种男人不能嫁&#xff1a;一种是兵哥哥&#xff0c;另一种是程序员。前者见不着&#xff0c;后者死的早。 一想到不等头发花白&#xff0c;就要踟蹰独行&#xff0c;我就害怕的厉害。所以&#xff0c;很长一段时…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教室管理系统9y8cv

相信很多和我一样的同学&#xff0c;因为实习&#xff0c;因为考研和考公等等&#xff0c;来不及做毕业设计&#xff0c;双专业的话 到时肯定忙不过来。提前做好准备吧&#xff0c;能自己完成的尽量自己完成&#xff0c;尽量不要找别人。自己的毕业前的一次大作业。努力完成也有…

Java项目:ssm高校党员管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 高校党员信息管理系统&#xff0c;分为普通用户和管理员两种角色。 普通用户登录后主要功能有&#xff1a; 我的中心:首页、个人资料、修改密…

广州蓝景分享—开发人员都知道的JavaScript技巧

JavaScript包含各种对典型编程思想有用的一些技巧&#xff0c;在实际开发中&#xff0c;我们通常希望减少代码行数&#xff1b;因此&#xff0c;今天这些技巧代码希望可以帮助到你。 现在我们就开始今天的内容吧。 1、与Javascript对象相关的 01)、对象解构 将对象的值解构为…

Vue2.0简讲!

Vue2.0简讲 Draven入门1.1、响应式渲染1.1.0、Vue创建1.1.1、指令(7)1.1.2、class与style绑定HTML Class对象语法数组语法绑定内联样式对象语法数组语法1.1.3、条件渲染v-if else-iftemplate v-if1.1.4、列表渲染v-forkey数组更新检测列表渲染Vue2列表渲染Vue3过滤应用(模糊查询…

机器学习与数据挖掘——前言

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 这是从老师的PPT里面提取出来的&#xff0c;知识点分布比较零散&#xff0c;可能他做PPT的时候也没想那么多。 一&#xff1a;机器学习 机器学习的定义&#xff1a;一个计算机程序被称为…

前端岗位初入职场后的最初一段时间需要做什么

文章题目有点长&#xff0c;叫 《前端岗位初入职场后的最初一段时间需要做什么》&#xff0c;说下写这篇文的初衷&#xff0c;在前端自学团里有很多刚毕业或者是刚从培训班出来的同学&#xff0c;在群里天天讨论着找工作和面试的事情&#xff0c;面试的题在很多app或者小程序可…

四、【React-Router6】高亮 NavLink

项目修改自 上一节 的 Demo 这里需要注意的变化 默认高亮样式类名如果依然是 active 则依然默认有效 6 里移除了 activeClassName &#xff0c;如果我的高亮样式类名是 peiqi&#xff0c;需要配置 className 为一个函数 函数接收两个参数 isActive&#xff1a;是否激活isPendi…