二维码接力运算之匿名打分app

实验目的

1.通过Zxing库的加入,实现拍照和解读二维码等功能。

2.通过两轮扫码和运算,完成加密状态下的评委打分。

3.打造产品化界面。

⭐安装与学习以及跑通demo程序

介绍Zxing:Z*是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是可以对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android

需要注意的有:

在build.gradle的dependencies 中加入下面代码

 implementation 'com.journeyapps:zxing-android-embedded:3.6.0'

在AndroidManifest.xml中加入

<uses-permission android:name="android.permission.CAMERA"/>

当然也可以运行的时候同步加载权限:

boolean sSRPR=ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)|
        ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)|
        ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA);
if(sSRPR){
    ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA
    },0);
}

  • 项目架构和二维码生成、解码实现方案:

 

 

各模块功能表:

CustomZxingView:自定义的扫码界面。由于Zxing自带的界面是横屏的,操作起来不太方便。于是按照微信扫一扫重写View,使之变成竖屏的。

实现方案就是用Canvas类进行画图:主要就是构造Rect矩形对象。

改写后的view和zxing库中的扫码效果比较如下:

 

 

 

MainActivity:程序入口,包含界面交互等。主要功能是实现二维码的生成和解码。

①首先将某个值生成二维码:创建一个HashMap对象,放置二维码的参数。然后设置二维码的纠错级别、字符编码、内容。然后创建一个描述二维码的类BigMatriix的对象,调用qrCodeWriter的encode()方法,将内容转换为二维码。最后就是展示二维码。先使用一个数组和两层循环,为二维码设置颜色;然后使用Bitmap类的对象,放置二维码图片。再通过imageView的set方法,将其显示在界面上。

 

 

②将二维码解码,转换为某个字符串:解码分成两步骤,首先在扫码的类中,设置decoratedBarcodeView用来当作界面读取二维码,然后根据captureManager对象获取后面用于反转二维码的内容。调用decode(),用于解析二维码信息。

 

 

QrCodeActivity:其对应的xml文件中含有DecoratedBarcodeView组件,用以抓取镜头中的二维码信息。

  • 功能实现以及关键代码:

 

期望功能:

(0)N个人。每个人持有两个数,评分数A、临时产生的随机数B。

     要计算所有A的和,B是混淆用途。

     第一个人当秘书。

(2)第一圈,从秘书开始,把自己的A和B相加,把和传递个下一个人。

     下一个人继续加上自己的A和B,继续传下去,最后和回到秘书。

(3)第二圈,从秘书开始,把和减去B,把差传给下一个。

     下一个人继续减去自己的B,继续传下去,最后差回到秘书。

(4)最后的差是所有A的和。

(5)除非某个人的上家和下家串通,否则无法知道这个人的数A。

设计方案:

(0)设计两个选项,一个是第一轮,一个是第二轮。

(2)第一轮的操作始终都是把获取到的二维码信息生成随机数、然后相加,生成另一个二维码。如果是第一个人,也就是生成二维码的时候,没有上一个二维码给出的信息,那个属性就置0。

(3)第二轮,就是把扫描的二维码信息直接减去自己的B(随机数),生成二维码。所以这个解码顺序可以和生成二维码的顺序不同。

(4)最后一个人(秘书)扫完码后就得到了最终得分,除以总人数就得到了平均分。(只给出总得分,平均分等其他数据根据需要去求取即可)

界面及测试:

用radiogroup+radiobutton选择当前所处的模式,即第一轮还是第二轮。

功能实现代码:

随机数:考虑到需要增强很大的扰乱性,就必须让随机数B远大于评分区间。不然会出现加了随机数还没及格的尴尬情况,就暴露了评委打分太低。所以本题我规定评分区间是1~100,所以随机数为500~1500范围。

数据表示和流程控制:数据包括A打分(1-100)、B随机数(500-1500)、Last

上一个人二维码信息(不同模式都需要用到进行加加减减),通过单击按钮选择当前模式,并改变记录信息和响应操作。

 

 

 

(2)编码和解码的函数改动:编码中,需要根据当前处于第几轮的模式,选择不同操作;如果第一轮,那么上一个人的二维码信息加上A和B的值,生成新的二维码信息;如果第二轮,那直接由上一个人的二维码信息减去B即可。对于解码,就更简单了,直接保存到Last中。

 

  • 产品化设计:

输入要求:(0)输入A后必须立即隐藏,通过setText实现

  1. A B不为空的情况下才会响应生成二维码的动作
  2. 不能显示“随机数”等信息,展示给用户的只能是一个个的功能,比如给button起名字:保存数据等。

  • 产品测试:

 

以两个人为例子,运行:

①输入打分,点击保存数据,会立即隐藏你打的分:

 

②生成二维码,继续接力!(此时保存随机数B,执行A+B协议)

 

 

③切换到第二轮,直接读取上一个A+B后值,得到加密后的769

④继续在第二轮状态下生成二维码,并扫码,最终获得93正确数据!

 

 

 

经宿舍内部成员测试,该app运行稳定且顺利!

Debug集锦:

①Manifest文件中一定要注册好所有的java类,以<Activity>的形式,否则可能出现点击按钮后闪退。

②为保证安全性,保存打分数据的同时会隐藏掉打分,然后再生成二维码的时候会显示没有内容。起初认为改造功能后,content还是从输入框读取导致的,应改成从属性中获取。我选择使用新对象,从而摆脱老对象控制限制。之后还是没有运行成功。然后我转换了思路,不清空输入框,而是改成白色字体也可以,但是依然不行,因为还有第二轮传递。我必须找到错因。我太粗心了,其实很简单,就把按钮单击事件的判断输入框是否为空去掉即可:

 

 ​​​​​​

 

3.还有一个严重的bug,就是我在保存数据的时候没有存A,导致只输出了B,所以第二轮接力最后一个人一定是0!!!修改如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值