蔡良辰 杨静 国轩 边荣华 黄诗雨
天津市职业技术师范大学 信息技术工程学院 天津市 300222
摘要:随着社会的发展,人们越来越注重生活的规划,而学生正是这其中的主体。我们的项目最初的意愿就是为学生的学习生活提供一些帮助。这个信息时代,可以说学生群体是其中的主力军,我们顺应潮流,期望达到目标。大家都很熟悉手机app,所以我们采用这种形式期望达到预期的效果。App大家都很熟悉,不必赘言。我们就是想应用这种技术进行一个整合,把一些数据显示出来。这里,我们采用教师和学生两个视角进行开发,两方角色职能不同,接下来分开来介绍。
关键词:Android 学生 学习生活
1 引言
1.1目的
随着社会的发展,互联网技术走进了生活的各个方面,我们希望用此来提高学生的校园生活质量,帮助老师来管理课堂。同时帮助学生群体丰富课余生活,寻找好友。
1.2范围
我们这个软件主要采用android 和java编程语言。使用mysql数据库来存储数据。
2 主要设计
2.1 项目架构
这里我们模拟的是cs架构进行设计,即?Client/Server?(客户机/服务器) 结构。客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理、数据共享、数据及系统维护和 并发控制等,客户端程序主要完成用户的具体的业务。
2.2设计模式
我们的代码主要采用MVP设计模式进行编写。
2.3前端页面设计
前端页面设计比较简洁,采用android的各个控件进行组合页面。里面唯一比较有意思的就是ListView,接下来详细介绍一下本项目中ListView的使用。
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
在本项目中,学生模块有一个功能是帮助学生找一些志同道合的同学,我们后台获取数据库数据传到前台之后,使用适配器将其处理过后,显示在前台定义的ListView中。
获取数据之后,我在这儿使用的适配器的实现类是ArrayAdapter.它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入。ArrayAdapter有多个构造函数的重载,因为后台传过来的数据都是字符串,所以将其的泛型指定为String。然后再ArrayAdapter的构造函数中传输ListView的布局id,适配的数据等。最后还需要调用ListView中的setAdapter方法,将构造好的适配器对象传递进去。
在android前端布局的使用情况中,唯有这个组件(ListView)有些难度。
2.3.1 OkHttp
在这个项目中,客户端与服务器的交互使用的网络协议Http网络协议。
OkHttp是一个第三方类库,用于android中请求网络。这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient)。
我通过讲解项目中登录实例来讲解项目中OkHttp的使用。
登录功能,因为分为学生模块和老师模块,所以在LoginActivity中,我使用RadioGroup,RadioButton这种组件进行判断,选择不同的RadioButton进行不同的操作。
以登录学生模块为例,首先获取输入框中的账号密码之后,使用POST请求进行提交。
后台服务器获取到传递的账号密码之后,与数据库中的数据进行验证,然后返回不同参数,前端根据不同的参数决定Activity是否跳转。
学生模块另一个功能寻找兴趣相似的同学,发起请求之后,后台相应的servlet服务器获取到数据后,传到前台。不过这儿的数据就需要JSON数据解析。
2.3.2 推荐算法
前面提到过学生模块有一个功能是帮助学生寻找兴趣爱好相似的同学,这儿就是模仿其他软件的推荐系统。
电影软件或者音乐软件会根据用户的历史数据,来了解用户的兴趣爱好,从而将用户的感兴趣的信息推荐给用户。具体介绍协同过滤推荐算法,这个功能也是借鉴这个原理。
基于用户的协同过滤。第一步:找到和目标用户兴趣相似的用户集合,第二步:找到该集合中用户喜欢的、且目标用户没有听说过的物品推荐给目标用户。
这个项目的这个功能主要实施的就是第一步。根据数据库中用户的信息,将兴趣爱好相似的其他用户做成一个集合,在将数据传给前台。
2.4 上课签到
这个功能主要通过扫描二维码来实现。接下来介绍生成和扫描二维码的方法。
实现二维码的扫码和生成功能,在网上搜了一下,能够发现大部分都提到说使用Google开源的Zxing,现在基本上都是使用的Zxing来做的。所以我们的扫码功能也是基于Zxing来实现。
二维码的扫码和生成就是解码和编码的过程。
我们首先分析一波zxing扫码的整个流程。我们知道想实现扫码的功能,扫码的核心算法与思路应该是跟Zxing原来一样的。而且zxing的库是比较庞大的,我们只是实现扫码功能的话,zxing里面的很多东西,我们是用不到的,所以需要对其简化,去掉不用的东西。
首先我们看CaptureActivity这个类,这个Activity就是官方的扫码界面。我们看他的setContentView(R.layout.capture);这行语句,进入capture布局,可以看到,一下眼熟的控件。CaptureActivity里面有一个很重要的方法。这个initCamera方法涉及到相机的初始化配置,以及扫码配置与启动。CameraManager是相机管理类,里面有着很多很重要的方法,比如开始预览的方法,停止预览以及获取每一帧画面的数据信息等方法。
这个方法的作用是打开相机设备,并且配置一些相机参数的。OpenCamera是Camera的包装类。CameraConfigurationManager是设置相机硬件参数的一个类。configManager.initFromCameraParameters(theCamera);这个方法主要是的内容是寻找最好的预览尺寸。
我们看到decodeThread线程,我们进去看一下发现里面的代码主要是设置了Map<DecodeHintType,Object> hints这个变量,这个变量是用来存储支持扫码类型的。run方法里面主要是创建了一个decodeHandler对象,并把hints这个存储支持扫码类型的变量给传进去了。
这里有一个方法,这就是扫码逻辑中最重要的解密的逻辑了。首先它构建了一个PlanarYUVLuminanceSource对象,接着根据source创建了二进制的BinaryBitmap。然后rawResult =multiFormatReader.decodeWithState(bitmap);通过该语句,实现了解密,把解码的结果封装赋值给了Result类。
最后把结果传给了CaptureActivityHandler,在其handlemessage方法中实现对结果的处理。
参考文献
郭霖 第一行代码(第二版)人民邮电出版社
黑马程序员Android移动开发基础案例教程 人民邮电出版社
林信良 Java学习笔记 清华大学出版社
How Tomcat Works中文版
本论文成果与校级大学生创新创业计划“优秀复制APP”项目(项目编号202010066023)一致