疫情智能问答机器人app
一、 项目技术栈
前端:android
后端:springboot+mybatis(java)处理请求和数据交互、flask(python)智能问答和爬虫
数据库:mysql(图片存放在阿里云)
二、 功能模块
1. 启动页
1.1 界面设计
图表 1 启动页
1.2 技术要点
- 启动页创建splashactivity,首先在activity_splash.xml中添加启动页内容。
- 其中包含基本的布局格式和文字显示,其中按键“开始体验”点击会跳转到登录注册界面。
- 我们预先先在drawable中存入三张图片hello_1、hello_2、hello_3用于启动页图片显示。
- 在splashactivity编写代码,首先创建小圆点、图片并且都把他们存放到集合里,方便后面读取处理,再用Handler进行异步消息处理。之后完成添加小圆点、全屏化处理,根据多少图片,自动插入相应的小圆点,并且俩者进行联动,滑动图片小圆点也跟随跳转,并且启动页是无限轮播的,所以position参数会一直增长,那么需要对list集合的长度取余数得到一个index下标。
- 在AndroidManifest.xml文件中,设置启动页为.SplashActivity。
2. 登陆注册
2.1界面设计
图表 2 登陆注册
2.2技术要点
记住密码再勾选以后会将用户名和密码保存在SharedPreferences中,以便于下次登录时不用再次输入。
点击登录会向java后端发送post请求,后端在mysql数据库中比对用户名和密码,成功后会返回用户的信息,包括头像、个性签名、手机号等,在这个时候装进初始化的页面中。以免再次请求数据。
注册时也会比对用户名,如果用户名重复,则注册失败。
3. app主页及子页面
3.1界面设计
图表 3 主页设计
3.2技术要点
Fragment+viewpager+tablayout+recycleview
整体分为tltlebar、fragment、bottom。Titlebar用来展示当前用户的头像、昵称、个性签名。Bottom用来快速跳转到常用的四个fragment,这四个fragment被装进viewpager中,其中聊天fragment又包含了7个fragment,这7个fragment被装进另一个viewpager中,顶部的tab则是使用了tablayout,Fragment内部则是recycleview用来展示内容。由此基本实现了各大app主页的效果。
4. 疫情新闻
4.1界面设计
图表 6 疫情新闻
4.2技术要点
Module 3 疫情数据爬虫
开发理由:疫情时期,人们仍然会关心疫情的发展动向,而最直接的方式就是对每天的疫情变换以数据形式展示。
工作流程:爬虫通过requests库来发送请求,并通过设置请求头headers的方式来避免被简单的拦截,对返回的结果通过xpath进行处理,分析数据定位来获取每一项数据并最终转换成list格式传回android中
使用说明:爬虫结果已包装成各个列表变量便于管理和传输。更新时将数据替换即可。
Module 4 数据展示(初版)
说明:数据展示主要分为三部分,整体采用LinerLayout,最上面是图标以及名称组成页面头,中间是由tablelayout表格布局分为4列三行共12块,分别显示不同部分,最下方是个textswitcher用以循环滚动显示各个省份的具体信息。
5. 疫情问答
5.1界面设计
图表 4 智能问答
5.2技术要点
5.2.1点击底部输入框弹出软键盘
首先设置在mainfest中设置activity的android:windowSoftInputMode=”stateVisible|adjustResize”但是会把titlebar也顶上去
还要设置fragment的android:fitsSystemWindows=”true”这样就可以达到想要的效果。
关于这个我前后试了很多种办法,但是遇到了种种问题如弹出的软键盘遮住输入框、弹出软键盘顶起titlebar、弹出的软键盘遮挡recycleview等。
5.2.2智能问答
Android端使用okhttp框架发送网络请求,将问题发送到java后端,接受请求后再将问题转发,向python后端请求问题的答案。Python端将问题与mysql数据库中的QA对进行句子相似性比较,取出最相似的前五条QA对。如果前五条相似度都不超过0.5则认为没有用户想要的答案,如果有,那么就将最相似的作为答案。同时将前五条最相似的问题作为用户接下来可能想问的问题,展示给用户,以方便用户的使用。用户可以通过点击问题来快速提问。
5.2.3语音输入及合成
Module 1 语言识别(语音识别)
开发理由:出于功能多样化的考虑以及用户对于问题需求输入的方便考虑,加入了语言输入功能。最终选择接入讯飞语音开发的sdk来辅助开发语音输入功能
相关介绍(原理):
前期准备:在工程 AndroidManifest.xml 文件中添加包括网络等权限,在程序入口处初始化即创建语音配置对象(这里要在manifest中设置好程序入口)。
工作流程:主要是mIat和mIatDialog两个对象前者用于语音听写识别流程控制,后者管理UI,当听写结束后由mRecognizerDialogListener监听器获得听写结果是json格式的返回结果,详细信息可以参考开发文档示例。听写成功则转由printResult来处理否则给出错误提示。
在printResult中json格式展平,提取ws项下的各个分词组合成识别到的语句。
使用说明:与“语音”Button绑定,点击后依次执行
mIatResults.clear();//清空上次的识别结果
setParam_mIat();//重新设置所有参数
mIatDialog.setListener(mRecognizerDialogListener);//将回调监听绑定到UI管理上
mIatDialog.show();//打开听写UI
Module 2 语言合成(语言输出)
开发理由:出于功能多样化的考虑以及用户对于问题需求输入后的交互性考虑,加入了语言合成输出功能。选择接入讯飞语音开发的sdk来辅助开发语音合成输出功能
相关介绍(原理):
前期准备:在工程 AndroidManifest.xml 文件中添加包括网络等权限,在程序入口处初始化即创建语音配置对象(这里要在manifest中设置好程序入口)。
工作流程:mTts和mTtsListener对象,前者是语音合成对象,后者是语音合成整个流程的监听者,对合成流程各个部分监控并实时响应。当mTts启动语音合成后就交由后者进行监控。
使用说明:实时将问答机器回答的内容送给ttsModule以替换语音合成内容。
6. 个人信息
6.1界面设
图表 5 个人信息
6.2技术要点
每次进入个人信息界面时会发送请求给java后端,java后端返回用户信息,并装载进recycleview中。点击修改信息按钮会弹出对话框进行修改,确认修改后会发送post请求给java后端,更新用户的信息。其中,用户头像保存在阿里云上使用oss存储,点击头像会弹出本地相册进行选择要上传的头像,确定后发送post请求给java后端,java后端将图片上传到阿里云oss,返回一个可以直接访问图片的url,将这个url保存到mysql数据库中。
三、 项目总结
总体做下来,磕磕绊绊很多,从recycleview到fragment,从okhttp到json的处理,遇到的小问题数不胜数,但好在都解决了。相比起web开发,android开发给我的感觉是限制很多,从静态广播的限制到权限的限制,再到子线程无法更新UI界面的限制,但是毕竟手机app的使用肯多比web网页要多很多,而且也更容易涉及到用户的隐私和安全,这么想想也是可以理解的。