早前模仿别人的做的一个APP,基于Android的天气预报设计,加上语音识别的功能,现在分享一下,希望可以给大家带来帮助。代码仓库:https://github.com/Yang-Jianlin/Hefeng-Xiyu
城市选择界面设计,城市选择界面主要针对用户首次使用系统的初始城市设置和用户在使用过程中切换城市的设置,界面主要包括三个层次: 省、市、县(区) ,最终天气界面将显示所选县(区)的具体天气状况。
当用户首次进入系统时,城市选择页面作为初始化城市设置出现在系统欢迎界面之后,占据整个系统界面,以三级模式先显示省级行政单位,然后根据用户的具体选择一级级显示市、县(区)。当用户进入系统之后,或者非首次使用该系统,城市选择界面将在屏幕右滑后出现,占据整个屏幕的3/4,仍然是三级模式显示。本系统设计上,城市选择布局整体上采用LinearLayout形式,分为上下两个部分,即标题栏和城市显示栏。其中,标题栏显示的是用户选择城市的名称和标记按钮,采用RelativeLayout形式,左边显示标记按钮,中间显示所选城市名称。城市显示栏采用ListView形式,ListView在Android中表现为一个列表样式,从上到下滑动逐行显示行政单位名称,并且每一行可以作为一个点击按钮,方便三级行政单位的级联点击。
天气数据显示界面总体分为上下五个部分,依次为工具栏、实时天气界面、预报天气界面、舒适度界面、生活建议界面,总体界面采用FrameLayout形式。
-
工具栏,工具栏显示界面采用RelativeLayout形式,横向依次为城市选择菜单按钮、后台更新间隔按钮、城市名称、语音播报按钮、语音识别按钮。
-
实时天气界面,此界面分为上下两个部分。上一部分左边显示的为对应实时天气的图标(如,“晴”就显示“ ”),右边显示对应的实时温度和天气。实时天气界面的下一部分显示小时(3小时间隔)天气预报,方便用户了解今日天气具体状况,以达到精确出行的目的。小时预报采用HorizontalScrollView形式,这种形式表现为横向列表,通过左右滑动的方式查看小时预报。
-
预报天气界面,此界面主要显示的是未来6天天气情况,界面总体采用LinearLayout形式,在LinearLayout中使用TextView显示每天的天气状况,包括日期、晴雨、最高温度、最低温度四项天气数据,同时,在此界面中加入一个按钮用以链接到和风天气网站,让用户可以查看详细天气数据。最后将每一个TextView嵌入进预报界面的ListView框架之中,以列表的形式显示。
-
舒适度界面,此界面主要包含体感温度、空气湿度、风力、能见度四部分内容,界面通过布局的四层嵌套来完成设计,第一层(最外层)采用LinearLayout,第二层在第一层基础上分成几个LinearLayout,第三次是嵌套在第二层中的RelativeLayout,第四层采用LinearLayout对每一项数据垂直显示。具体设计图如图4-1所示。
5. 生活建议界面,此界面主要为用户提供一些合理的生活建议,包括空气状况建议、舒适度、洗车指数、运动建议。界面总体采用LinearLayout形式,将其分为上下四层,每一层为一个TextView,分别在每个TextView中显示根据获取的天气数据提供的建议。
Android系统主要提供了三种方式用于实现简单的数据持久化功能,即文件存储、SharedPreference存储以及数据库存储。其中,Android为方便数据存储专门为开发者提供了一个SQLite数据库,其操作语法和开发者常用的MYSQL数据库基本一致,但是对于Android应用程序开发者而言,SQLite操作繁琐复杂。因此,本设计采用LitePal,即GitHub上的开源数据库的框架,它是对象-关系映射模型,同时封装了一些最常用的数据库功能,使开发人员无需编写单独的SQL语句就可以完成建表、删除、修改、查找等各项数据库操作。
开发者使用LitePal,首先需要在Android工程的build.gradle中添加依赖,引入LitePal,即引入LitePal开源库。接下来需要在assets目录下创建litepal.xml文件,其中,dbname指的是SQLite数据库的名称,version指的是SQLite数据库的版本号,list指的是映射关系,即SQLite所用数据对应的表。
之后,litepal.xml中的list中需要引入省、市、县(区)的数据表,创建Province、City、County三个类作为数据表,即在三个类中分别创建get、set方法,用以获取各级行政单位的名称,最终通过互联网得出CityID。
本设计系统需要通过互联网访问和风天气网,并且获取接口提供的天气数据,将其解析显示在对应的界面。
(1)数据请求部分的编码,为了使系统达到更高的稳定性和便捷性,本设计采用上文介绍的OkHttp协议进行互联网访问协议。首先,需要在工程中创建一个类,用以实现OkHttp的初始化方法定义,由于OkHttp框架的出色封装,只需要在此类中创建sendOkHttpRequest方法,访问互联网时只需要在相应的活动中调用该方法并传入对应参数即可。
(2)数据解析部分的编码,此设计系统访问和风天气网获取的数据格式为上文介绍的JSON格式数据,需要将JSON数据解析并显示。创建一个json包,在包内建立数据解析类,本系统共创建了七个解析类,分别解析接口时间数据、实时天气数据、未来六天预报数据、舒适度数据、小时天气数据、生活建议数据以及城市名称数据。七个类的解析格式基本一致,在此仅以小时天气为例,小时天气数据包含时间、晴雨状况、温度数据,因此创建一个名为today的类作为小时天气解析类,类中定义了三个字符串变量分别存放时间、晴雨、温度,最后在数据显示活动中调用三个字符串变量并将其显示在对应的位置。
另外,系统考虑到了这样一个事实,即在用户退出系统之后,再次退出系统之前,仍然需要显示该城市天气状况。因此,系统将由城市解析类解析的城市名称对应的 CityId 写入本地存储器中,当用户再次进入系统时从本地读取CityId。Android对于持久化数据存储上文提及了三种方法,即数据库、文件、SharedPreference。由于此部分数据简单,如果使用数据库过于繁琐,使用文件操作麻烦,而SharedPreference存储使用键值对的方式,读取简单,因此,本设计采用SharedPreference进行本地存储CityID。
后台数据更新顾名思义就是系统退出后任何会在后台访问和风天气接口并返回数据在页面上更新数据,Android的后台更新通常采用上文介绍的Service,将更新功能放在后台子线程,在程序退出后不会被销毁。首先,在Android工程目录下创建一个service包,并在包中创建一个AutoUpdateService类并继承Service类,将更新操作写入类中。
本系统为方便老年和儿童用户快速查询天气情况,增强用户群体体验感,设计了语音播报和语音识别部分,可以语音广播天气情况和语音识别切换城市。
- 语音播报模块,由于目前Android版本已经更新至Android10.0,且市场上用户使用的手机大部分都在Android6.0以上版本,因此本系统采用Android6.0以上版本自带的语音播报模块SystemTTS。首先,需要在Androidmanifest开启扬声器权限,然后在Android项目工程的目录下创建SystemTTS类,类中包含声音配置方法、版本匹配方法、开始以及介绍播报方法。其中声音配置方法是配置播报语音的语速、音色等,版本匹配是检测Android版本是否处于Android6.0以上。
- 语音识别模块,由于Android没有提供很好的语音识别模块,所以语音识别部分需要借助一些提供Android语音识别的厂商提供的接口才能实现。目前国内市场上较为常见且技术比较成熟的人工智能服务提供商主要百度和科大讯飞。但是由于百度语音SDK占用内存稍大,且基本功能和科大讯飞无异,对于本设计系统而言,占用内存空间不适宜过大,因此本设计采用科大讯飞语音识别模块进行语音识别开发。
首先,本设计开发者需要注册为科大讯飞开发者平台开发人员,在科大讯飞开发者平台上创建自己的应用程序以获取APIKey,然后科大讯飞语音识别SDK和jar包导入本设计系统的项目目录,然后在主活动中调用SDK的语音识别方法,并传入APIkey和其他参数。导入jar包以及SDK的工程目录如图4-2所示。
3 软件演示
经过黑盒测试,本设计出现的问题基本得到解决。将编写完成的Android程序在Android Studio平台上运行,并命名为“和风细雨”后生成可以安装到Android手机上的APK文件,并在Android手机上安装。
Android手机上运行“和风细雨”软件,出现欢迎界面,欢迎页面如图5-1所示。
若软件首次使用,欢迎界面之后会出现初始化设置城市界面,若不是首次使用,会出现“和风细雨”主界面。城市设置界面如图5-2中的(1)所示,主界面如图5-2中的(2)所示。
不同于其它天气预报软件只是文字描述天气,而且只能手动切换城市天气,“和风细雨”天气预报系统极具特色的功能是当用户进入“和风细雨”主界面后,可以选择语音播报和语音识别切换城市天气,通过语音功能,极大的方便了老年和儿童用户群体查询天气,语音识别功能界面如图5-3所示。