【《基于Android的物联网技术学习APP设计与实现》16000字】_第1页
【《基于Android的物联网技术学习APP设计与实现》16000字】_第2页
【《基于Android的物联网技术学习APP设计与实现》16000字】_第3页
【《基于Android的物联网技术学习APP设计与实现》16000字】_第4页
【《基于Android的物联网技术学习APP设计与实现》16000字】_第5页
已阅读5页,还剩42页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE2基于Android的物联网技术学习APP设计与实现摘要:随着物联网的日益兴起,学习物联网技术逐渐成为一种趋势。但目前传统的课堂教学模式已不适用于部分技术的学习,因为其分割了教师的理论传授与学生的实践。针对这一问题,设计基于Android的IoT学习APP。该APP以AndroidStudio作为开发工具,设计人机交互界面,并实现视频播放、直播、扫一扫等主要功能。由MySQL数据库存储用户账户、教学资源等信息。本APP通过教学视频、直播等信息化教育形式,帮助用户更好的学习物联网的相关内容。移动应用打破了时间与空间的限制,做到了随时随地进行学习,提高了学习效率,对于物联网知识与技术的学习具有一定的应用价值。关键词:Android;APP;移动教育目录1绪论 11.1研究必要性 11.2设计目的 21.3设计意义 21.4移动教育APP研究现状 32系统设计方案 52.1系统架构设计 52.2系统总体设计 62.3开发环境 62.3.1APP运行环境 62.3.2开发工具及其语言特性 72.4功能实现 73软件结构设计 83.1数据库格式设计 83.2软件功能设计 93.2.1登录与注册功能设计 93.2.2观看视频与直播功能设计 103.2.3搜索功能设计 113.2.4账号管理功能设计 114系统主要模块的实现 134.1登录与注册模块 134.2视频模块 174.3直播模块 214.3.1直播的推流端 224.3.2直播的拉流端 274.3.3动态模块 294.4搜索模块 304.5个人中心模块 335软件测试 385.1功能测试 385.2测试结果分析 416总结 42参考文献 441绪论随着社会的进步,互联网技术及信息技术正在飞速的发展,而在这种趋势之下教育行业也在不断和互联网相结合。物联网(Internetofthings,IoT)是新一代信息技术的重要组成部分。物联网即“万物相连的互联网”,是以互联网为基础延伸和扩展的网络,将各种信息传感设备与互联网结合起来而形成的一个巨大网络,实现在任何时间、任何地点,人、机、物的互联互通。物联网的日益兴起使得学习物联网技术成为一种趋势。但传统的课堂教学模式面临着诸多问题:教学枯燥乏味、分割了知识与技能传授和学习的完整性,导致教师的理论教授和学生的实践产生脱节,学习效率得不到提高。所以不适用于部分技术的学习,已不能满足教育信息化发展的需求[1]。1.1研究必要性随着移动互联网技术的不断飞速发展以及移动网络应用环境的日渐成熟,智能手机已然成为人们日常生活中必不可少的元素。人们可以随时随地从手机当中获取海量的信息,还能体验到更多丰富多彩的内容。2014年,教育部和有关部门已在相关方案中为我国未来6年的教育信息化制定了一个明确的规划,即未来高校的师生中实名网络学习空间的覆盖率将达90%以上,开放性大学的师生中实名网络学习空间的覆盖率将达100%。传统的课堂是知识课堂与技能课堂相结合的教学模式,知识课堂是指教师在课堂中教授理论知识,学生对其进行学习,技能课堂是指学生在实训室在教师指导下学习技能操作,对理论知识进行实践。但这种知识与技能相结合的教学模式有着非常明显的问题:知识和技能传授与学习的整体性因为时间或空间等原因的限制而被分割,这就导致了教师的理论教学与学生的操作实践不能同步进行,使两者间产生了脱节。随着物联网、移动网络技术等智能技术的快速发展,人们的生活方式正在逐渐改变。如今的课堂教学模式已经不再被知识与技能的单方面、脱节的传授所局限,而是顺应发展趋势,运用智能化方法实现教学过程与实践过程的完美融合。虚拟教学环境的建设使教学管理更加智能化、数字化,并将物理课堂与虚拟课堂相连接,是教育信息化发展的必然趋势[2]。1.2设计目的随着社会的进步,互联网技术及信息技术的飞速发展,教育行业也在不断地寻求变化,与互联网相结合。传统的课堂教学模式已经不能满足教育信息化发展的需求,所以移动化的学习模式将渐渐成为一种趋势。智能通信移动设备如今已经成为人们不可或缺的实用工具,移动APP也因此应运而生,被用于各种领域之中,在教育行业也已经成为重要的学习工具。移动教育APP改变了传统教育的结构和理念,开创了一种新的教学模式,为现代化信息教育注入了新鲜血液,已经得到了广泛的应用。而且现代大学生对智能移动设备并不陌生,对于安装在其上的APP亦是如此,同时APP对于他们也具有一定吸引力,会让人有想打开应用一探究竟的想法。移动APP能够推送海量的信息并且不受到各种场景的限制,让大学生可以随时随地对新知识进行学习。这种移动教育的形式使大学生能够获得多样化的信息,并且还能够让大学生更加方便、快捷的解决学习过程中遇到的问题,开阔大学生的视野[3]。纵观教育APP的整体发展趋势,可以看出其为教育教学创新和改革提供了优越的条件,能够对我国教育信息化的不断发展起到促进作用。1.3设计意义2010年美国联邦教育部颁布的《国家教育技术规划》(NationalEducationalTechnologyPlan,NETP)首次提出“技术赋能学习”的模型,强调了在以技术为支撑的信息化教育时代,教育必须以学习者为中心,教育技术应该成为组成学习系统的一部分而不是作为一项独立的技能所存在,所有的教育技术都应在围绕学习者的学习活动的前提下展开[4]。“技术赋能学习”是指使用某种适当的技术手段解决学习者在学习过程中遇到的问题,达到学习目的,提高学习者的学习效率。例如,技术改变了人类传统学习方式的时空结构,打破了时间与空间的限制,使“人人能学、时时能学、处处能学”成为可能[5]。教育APP是“技术赋能学习”的典型应用,也是教育信息化发展达到一定程度的体现,其结合了各种技术并突出了它们的优势,使学习变得移动化、智能化和个性化,而学习者的学习方式也逐渐被这种新型的移动教育模式改变[6]。作为移动计算技术和数字化学习相结合的产物,教育APP相较于传统教育有着更多的特征优势,如移动性、便利性、易用性、交互性等[7]。教育APP对于教育信息化的发展具有十分重大的意义。1.4移动教育APP研究现状移动教育研究的重点是其使用的技术和实现的设备。移动教育主要使用移动计算技术和互联网技术。区别于传统教学所使用的投影仪等体型较大且不可移动的教学设备,移动教育采用的设备是诸如现代智能移动电话、iPad等小型且便携的移动计算设备,教师和学生能通过这些设备实现双向交流[8],使教学过程变得更加简便、快捷,同时也提高了教师教学的效率。此外,移动学习具有三个主要特征:可靠性、协作性和个性化。可靠性体现在移动学习可以长期作为一种合格的学习方式使用是基于技术的支持。而协作性体现在移动学习需要多种设备和技术的协同工作才能打破时空的限制。个性化则是采用移动学习的很大一部分原因,其不受到时间与空间的制约,特定的内容可以根据自己的需要灵活调整[9]。移动学习自诞生以来就受到了广泛的关注,国外已经将移动学习作为未来教育的重要发展方向。而通过移动终端设备开发移动应用程序来辅助学习,也将成为移动学习的一大趋势。从技术层面看,移动教育APP的主要开发方式是在Android系统的基础上通过第三方软件进行设计开发。主要通过优化存在的问题来加快移动教育APP的进一步发展,如界面的友好性及交互性、课程教学内容的设计、移动应用对学习的影响等都是待优化的问题。从研发数量上看,我国移动教育APP的研发数量相对较少,不足以与当前的网络技术程度相匹配,并且学习方向较为分散,仍然处于初级阶段。移动教育较传统教育而言更加灵活、便利,互动性也更强,弥补了传统教育的不足,也展现了信息技术与教育的高度结合。正因如此,移动教育APP还需要进行更加深入的研发,开发出操作更简便、内容更优质的APP,让老师可以根据自己的教学特点,学生可以结合自身的情况和学习需求选择合适的APP,使其可以更好地开展课程的教学或学习[10]。我国对于移动APP在教育方面的应用研究还不够深入,主要研究方向为高等教育阶段。目前,由于受到技术问题的限制,移动教育APP只处于初步探索阶段,仍需要不断的深入研究,但是研究人员对其实际应用前景非常乐观。未来,移动教育APP在高等教育领域将具有广阔的发展前景,也可能对整个教育领域产生重大影响[11]。2系统设计方案2.1系统架构设计图2.1APP功能架构图APP功能架构图如图2.1所示,APP总共包含多个模块:教学视频、教学直播、话题讨论、资讯、个人中心、搜索、扫一扫。各个功能模块的相关信息如下:1.教学视频:区别于传统的课堂教学方式,用户可观看教学视频进行学习。有关课程的学习视频将会按照不同类别进行分类排列,可根据分类快速的找到想要观看的视频。还可查看视频的简介以及评论。2.教学直播:教师可发起直播进行教学,用户可观看直播进行学习,对感兴趣的教师可进行关注,也可查看教师发送的动态消息。3.话题讨论:用户可选择自己感兴趣的话题进行查看,可在话题下发表自己的评论,也可回复或点赞他人的评论。用户也可创建自己的话题。4.资讯:用户可查看APP上发布的物联网相关资讯。5.个人中心:用户可对账号进行管理,可以修改头像、昵称、密码,退出登录;用户可以查看关注的教师以及收藏的资讯;用户可签到领取积分,也可通过答题或小游戏赚取积分;用户可进行关于APP的相关设置;用户可进行认证并申请直播权限。6.搜索:用户可直接点击相关的词条进行搜索,也可在搜索框中输入关键词搜索;搜索结果按照视频、直播、话题、资讯四块内容进行划分。7.扫一扫:用户可扫描二维码进行识别,获取到更多信息。2.2系统总体设计APP主要操作流程,如图2.2所示:图2.2APP主要流程图2.3开发环境2.3.1APP运行环境本APP所需要的最低硬件配置和手机操作系统版本要求如下:CPU:双核2GHz及以上机身内存:4G以上操作系统:Android4.0及以上版本2.3.2开发工具及其语言特性采用AndroidStudio作为开发工具。AndroidStudio是谷歌官方推荐的,也是使用最广泛的Android应用开发工具。AndroidStudio中包含的特性使开发高度多样化的应用程序成为可能,包括学习应用程序的开发[12]。类似Eclipse

ADT,AndroidStudio提供了集成的Android开发工具用于开发和调试。AndroidStudio的功能十分强大,在IDEA的基础上,AndroidStudio提供了基于Gradle的构建支持,Android专属的重构和快速修复以及提示工具以捕获性能、可用性、版本兼容性等问题,还拥有布局编辑器,能实时展示界面布局效果,可以在编写程序的同时进行预览。AndroidStudio使用Java作为开发语言。Java作为静态面向对象编程语言的代表,极好地实现了面向对象理论。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。使用Java可以编写多种类型的应用程序。2.4功能实现本次研究拟完成的主要功能有:1.实现多线程,新开辟子线程来处理耗时的操作,不阻塞主线程,避免引发应用程序无响应的现象。2.Android视频播放的实现。3.直播推流端与拉流端的设计与实现。4.扫描二维码获取相应信息的实现。5.支持用户对个人信息的修改。3软件结构设计3.1数据库格式设计本次的项目主要是运用数据库对数据进行存储以及调用。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,增加了速度并且提高了灵活性。MySQL使用SQL语言,是用于访问数据库的最常用标准化语言。MySQL常被用于作为一种小型的关系型数据库范例。相比于其余类型的数据库,诸如DB2、SQLite等,有着体积小、使用方便、功能齐全与免费等优势[13],因此采用MySQL数据库。部分数据格式表格设计如下:如表3.1所示,account表用来存放所有用户的账号信息。表3.1account表字段名类型主键非空自增idint(10)√√√namevarchar(20)√passwordvarchar(40)√nicknamevarchar(40)√如表3.2所示,dynamic表用来存放所有用户发布的动态信息。表3.2dynamic表字段名类型主键非空自增idint(10)√√√user_idvarchar(20)√timedatetime()√urlvarchar(200)√textvarchar(100)√locationvarchar(50)√如表3.3所示,news表用来存放所有的资讯信息。表3.3news表字段名类型主键非空自增idint(10)√√√titlevarchar(100)√timedatetime()√urlvarchar(200)√picturevarchar(200)√3.2软件功能设计3.2.1登录与注册功能设计图3.1新用户注册流程图启动APP,进入登录界面,点击“注册”按钮,进入用户注册界面,其工作流程如图3.1所示。用户在注册界面输入所需的相关信息,若信息符合规范,则完成注册。若不符合规范,则根据提示,修改信息,完成注册。图3.2用户登录流程图启动APP,进入登录界面,根据工作流程图3.2所示,用户输入账号和密码,点击“登录”按钮,如果用户已经注册过账号和密码,并且校验正确,则进入APP主页面。反之,需重新输入。用户也可以选择第三方登录进入APP。3.2.2观看视频与直播功能设计图3.3视频功能流程图 登录APP后进入首页,提供视频让用户观看,其主要工作流程如图3.3所示。首页分为轮播图区和视频区,用户可点击轮播图查看详细信息,也可以直接点击视频进行观看。图3.4直播功能流程图 进入直播界面,其主要工作流程如图3.4所示。用户可以点击相应的直播进行观看。若用户已经完善了个人信息,还可以发布动态,也可以查看其他用户发布的动态。若用户的身份为教师,还可以发起直播,其他用户也可观看到该用户发起的直播。3.2.3搜索功能设计图3.5搜索功能流程图进入搜索界面,其主要工作流程如图3.5所示。用户可以在输入栏中输入关键字进行搜索。搜索后,搜索结果会以“视频”、“直播”、“论坛”、“资讯”四个模块进行分类显示,用户可以选择相应的模块查询想要的搜索结果。3.2.4账号管理功能设计图3.6账号管理功能流程图进入账号管理界面,其主要工作流程如图3.6所示。用户可以选择修改信息、完善个人信息或退出登录操作。用户可以修改的信息包括当前账号的头像、昵称及密码。点击“修改头像”选项,用户可以对当前的头像进行修改,修改完成后会实时显示修改后的头像。点击“修改昵称”选项,用户可以对当前的昵称进行修改,修改完成后会实时显示修改后的昵称。点击“修改密码”选项,用户可以对当前的密码进行修改。“完善个人信息”选项已在上文中提及过,若用户的当前账号还未完善个人信息,当用户在直播界面想要进行发布动态或发起直播操作时,系统会引导用户进入完善个人信息界面,用户填写完相关信息后可获得对应的发布动态或发起直播权限。用户也可在账号管理界面中点击“完善个人信息”选项直接进入完善个人信息界面。点击“退出登录”选项,可以退出APP。若用户修改了密码后退出登录,则在登录时需输入修改后的新密码才可重新登录。4系统主要模块的实现4.1登录与注册模块图4.1登录界面登录界面效果如图4.1所示,界面采用相对布局RelativeLayout嵌套线性布局LinearLayout的方式来实现,使用的控件有EditText、TextView、ImageView和Button等。登录功能通过Button控件触发事件的响应。主要过程为:通过语句Buttonbtn_login=(Button)findViewById(R.id.btn_login)获取Button实例;再通过语句btn_login.setOnClickListener(newView.OnClickListener(){…}注册一个监听器;重写onClick方法添加相应的逻辑。登录模块用于APP的登录。用户需输入账号、密码,然后点击“登录”按钮,之后系统会调取数据库中的用户信息表,将用户输入的信息与存储的用户相关信息进行比对。如果比对结果一致,则登录成功,跳转至首页,如果比对结果不一致或信息不存在,则登录失败,会弹出如“账号或密码错误”等错误信息提示用户登录失败的原因。实现的主要代码如下:EditTextetUsername=(EditText)findViewById(R.id.username);EditTextetPassword=(EditText)findViewById(R.id.password);Stringusername=etUsername.getText().toString();//获取用户输入的账号Stringpassword=etPassword.getText().toString();//获取用户输入的密码if(loginInterface.checkLogin(username,password)){//信息比对正确SharedPreferencessp=getSharedPreferences(PREF_NAME,MODE_PRIVATE);SharedPreferences.Editoreditor=sp.edit();editor.putString("username",username);editor.putString("password",password);mit();//提交用户信息,用于后续可能会进行的操作if(sp.getString("username","")!=null||sp.getString("username","")!=""&&sp.getString("password","")!=null||sp.getString("password","")!=""){Intentintent=newIntent(LoginActivity.this,MainActivity.class);startActivity(intent);//跳转至首页LoginActivity.this.finish();//关闭当前界面}}else{//信息比对不正确Stringwrong_password="密码错误";Toasttoast=Toast.makeText(LoginActivity.this,null,Toast.LENGTH_SHORT);toast.setText(wrong_password);toast.show();//错误信息提示}SharedPreferences是一种轻量级的数据存储方式,这种存储方式类似于Web程序中的Cookie,通常用它来保存一些配置文件数据、用户名及密码等[14]。SharedPreferences里的数据可被该应用内的所有组件访问,SharedPreferences接口本身只提供了读取数据的功能而并没有提供写入数据的功能,如果需要实现写入功能,则需要通过其内部接口Editor来实现,SharedPreferences调用edit()方法即可获取它对应的Editor对象[15]。通过SharedPreferences.Editor接口的commit方法或apply方法提交key-value键值对,将key-value键值对存储到文件中,然后便可以在跳转后的主界面和其它界面将有关信息读取出来并显示[16]。SharedPreferences还可以实现APP的自动登录,在用户第一次启动APP进行登录之后,所输入的登录信息会得到存储。从用户第二次启动APP开始,系统会调用之前缓存的相关登录信息,用户无需再次进行信息的输入便可以自动登录APP。图4.2注册界面注册界面效果如图4.2所示,注册界面的布局及控件的使用类似于登录界面,采用CardView来达到注册界面的浮窗效果,并且在布局文件中使用android:layout_centerInParent属性使浮窗居中。注册模块用于APP账号的注册。用户需要输入所要创建的用户名、密码及昵称,并且确认密码,获取验证码并正确输入。用户还需阅读并接受“用户协议”并勾选此选项才能进行注册操作。用户点击“注册”按钮,如果用户输入的注册信息符合规范,则注册成功,新创建的用户信息会添加至数据库的用户信息表中,然后会自动返回登录界面,用户可进行后续的登录操作。如果用户输入的注册信息不符合规范,则注册失败,会弹出如“密码长度应在8-16位之间”,“两次输入的密码不相同”等错误信息提示用户注册失败的原因。实现的主要代码如下:if(dao.checkLogin(userCadastro.getText().toString())){//检测到已存在该用户名Stringread_information="用户已存在";Toasttoast=Toast.makeText(RegisterActivity.this,null,Toast.LENGTH_SHORT);toast.setText(read_information);toast.show();//提示用户已存在信息}else{newThread(newRunnable(){//创建一个新线程@Overridepublicvoidrun(){RegisterControlec=newRegisterControle();c.setUser_login(userCadastro.getText().toString());//获取新创建的用户信息c.setUser_senha(senhaCadastro.getText().toString());c.setUser_nickname(nicknameCadastro.getText().toString());dao.create(c);//将用户信息插入数据库的表中runOnUiThread(newRunnable(){//在主线程中执行操作@Overridepublicvoidrun(){Stringregister_success="注册成功";Toasttoast=Toast.makeText(RegisterActivity.this,null,Toast.LENGTH_SHORT);toast.setText(register_success);toast.show();//提示注册成功信息finish();//关闭当前界面}});}}).start();//开启新线程}4.2视频模块图4.3首页用户登录成功后进入首页,首页效果如图4.3所示,首页上方为轮播图区域,会滚动显示APP的有关内容,用户可以点击查看详情。轮播图下方为教学视频,上划屏幕可将顶部的轮播图区域隐藏并可查看下方的更多视频,用户可以选择感兴趣的视频点击观看。图4.4视频详情界面用户点击视频后进入视频详情界面,该界面效果如图4.4所示,用户点击播放按钮开始播放视频,还可以实现暂停播放、继续播放、拖拉进度条、发送弹幕、关闭弹幕、全屏等功能。图4.5视频全屏播放界面点击视频播放器右下方的全屏按钮,可进入视频的全屏播放界面,效果如图4.5所示,全屏状态下在屏幕左侧上下滑动可调节亮度、右侧上下滑动可调节音量。该界面主要由VideoView和ProgressBar两个控件组成。外层为相对布局RelativeLayout,使ProgressBar可以在VideoView控件上层并居中显示[17]。用移动设备观看视频的方式一般有两种:一种是用户先将视频文件下载到手机上,然后用已经安装好的播放器对视频进行播放;另一种是手机连接上互联网然后直接播放网络视频。Android对这两种视频的播放方式均支持[18]。视频模块用于播放教学视频。视频播放器使用开源框架GSYVideoPlayer。GSYVideoPlayer是基于IJKPlayer开发的Android开源视频播放器,遵守Apache开源协议。用户进入视频详情界面,在界面初始化时会配置播放器、添加旋转支持、增加监听。系统会从数据库的视频表中读取当前视频所对应的视频URL、视频封面的URL以及视频标题,然后调用.setUp()方法配置读取到的视频信息。实现的主要代码如下:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_video); …… videoPlayer=(VideoPlayer)findViewById(R.id.video_player);//实例化VideoPlayer List<VideoControle>list=videoDao.getVideoMenu(videoId); //获取数据库中当前视频的相关信息for(VideoControled:list){videoPurl=d.getVideo_Purl();videoVurl=d.getVideo_Vurl();videoTitle=d.getVideo_title();} videoPlayer.setUp(videoVurl,true,null,videoTitle);//配置视频URL,视频标题Glide.with(this).load(videoPurl).transform(newCenterCrop()).into(imageView);videoPlayer.setThumbImageView(imageView);//配置封面//外部辅助的旋转,帮助全屏orientationUtils=newOrientationUtils(this,videoPlayer);//初始化不打开外部的旋转orientationUtils.setEnable(false);videoPlayer.setIsTouchWiget(true);//关闭自动旋转videoPlayer.setRotateViewAuto(false);videoPlayer.setLockLand(false);videoPlayer.setShowFullAnimation(false);videoPlayer.setNeedLockFull(true);videoPlayer.setReleaseWhenLossAudio(false);videoPlayer.getFullscreenButton().setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){//直接横屏orientationUtils.resolveByClick();//第一个true是否需要隐藏actionbar,第二个true是否需要隐藏statusbarvideoPlayer.startWindowFullscreen(VideoActivity.this,true,true);}});videoPlayer.setVideoAllCallBack(newGSYSampleCallBack(){@OverridepublicvoidonPrepared(Stringurl,Object...objects){super.onPrepared(url,objects);//开始播放了才能旋转和全屏orientationUtils.setEnable(true);isPlay=true;} ……});videoPlayer.setLockClickListener(newLockClickListener(){@OverridepublicvoidonClick(Viewview,booleanlock){if(orientationUtils!=null){//配合下方的onConfigurationChangedorientationUtils.setEnable(!lock);}}});}@OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){super.onConfigurationChanged(newConfig);//如果旋转了就全屏if(isPlay&&!isPause){videoPlayer.onConfigurationChanged(this,newConfig,orientationUtils,true,true);}}图4.6视频的简介与评论在视频详情界面,用户上滑屏幕可收起视频播放器并查看下方的更多内容,包括视频的简介与视频的评论,效果如图4.6所示,左右滑动屏幕可在两界面之间切换。在视频的简介界面,用户可查看该视频的概述文字。若用户喜欢该视频,还可以对视频进行点赞,下方还有相关的推荐视频供用户继续点击观看。在视频的评论界面,用户可以发表自己的评论,也可以回复其他用户的评论,还可以对喜欢的评论进行点赞。4.3直播模块首先需要介绍一下RTMP协议。RTMP协议的全称是RealTimeMessagingProtocol,即实时信息传输协议,它是Adobe公司开发的,用于服务器和Flash播放器之间进行音视频和数据传输的开放协议[19]。RTMP协议是目前主流的媒体流传输协议,被广泛应用于直播领域,目前,RTMP协议是大多数直播平台进行开发的首选。本项目也使用RTMP进行直播功能的开发。RTMP协议是传输层协议,是基于TCP的协议。不同于无连接且不可靠的UDP协议,TCP协议消除了流媒体传输时丢包的情况,确保了视频数据的准确性,使用户体验得到了保证[20]。但是也存在缺点,TCP提供超时重发,检验数据等功能,占用了部分带宽和处理机资源,增加了额外的开销。不过随着计算机以及网络技术的不断发展,这些开销会变得微乎其微[21]。图4.7直播界面用户点击底部的“直播”按钮可进入直播界面,效果如图4.7所示。界面上方为“我的关注”,列出了用户关注的教师。下方为推荐给用户观看的直播,用户可根据需求选择想要观看的直播点击进入进行观看。点击界面右下角的圆点可选择更多操作,若用户已完善了个人信息,可以发布自己的动态。若用户的身份为教师,还可以发起直播。直播模块用于用户观看直播或发起直播,使用开源SDK——WSLive。直播功能分为两部分,一部分为拉流端,用于观看者观看直播,另一部分为推流端,用于直播者发起直播。通常在移动终端上采用两种方法来解决直播时数据同步的问题。一种方法是移动终端定时去服务器上查询数据,也就是Pull(拉流);另一种方法是当服务器有数据时,将其实时推送到移动终端,即Push(推流)[22]。4.3.1直播的推流端直播推流端的主要过程如下:1.音视频采集:在Android开发中,主要有两种进行实时视频的采集。第一种方法是通过MediaRecorder类来进行视频采集。第二种方法是通过调用系统提供的Camera接口来完成视频的采集;而进行实时音频采集的方法主要也有两种。第一种方法是通过MediaRecorder类来进行音频的采集,其可以直接将设备麦克风录入的音频数据进行编码压缩操作并储存成文件。第二种方法是使用AudioRecord类进行原始音频数据的采集,然后对数据进行处理或者编码压缩。2.音视频编码:通过调用WSLive库对Android设备采集到的音视频原生数据进行编码。3.推流到服务器:将网络连接初始化,创建RTMP会话并为其分配内存,并设置会话的成员变量默认值,再设置流媒体服务器的URL以及会话参数,然后建立会话流,发送数据包,最后关闭连接并清理资源[23]。为了实现直播功能,需要调用移动设备的摄像头和麦克风进行录音录像,还需要连接网络进行视频流的传输,所以需要在工程的应用清单文件AndroidManifest.xml中进行声明,获得设备的网络、前后摄像头和麦克风的使用权限,实现的主要代码如下:<uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.RECORD_AUDIO"/><uses-permissionandroid:name="android.permission.MODIFY_AUDIO_SETTINGS"/><uses-featureandroid:name="android.hardware.camera"/><uses-featureandroid:name="android.hardware.camera.autofocus"/>图4.8发起直播界面发起直播界面采用简洁的设计,如图4.8所示,为了方便用户进行更多的操作将所有的组件缩减到一个Activity中。用户可选择的功能有:开始直播、停止直播、开始录制、停止录制、切换滤镜、切换摄像头、截屏、镜像。实现的主要代码如下:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_start_live);initLiveConfig();mLiveUI=newStartLiveUI(this,mLiveCameraView,rtmpUrl);}publicvoidinitLiveConfig(){mLiveCameraView=(StreamLiveCameraView)findViewById(R.id.stream_previewView);//参数配置startstreamAVOption=newStreamAVOption();streamAVOption.streamUrl=rtmpUrl;//参数配置endmLiveCameraView.init(this,streamAVOption);mLiveCameraView.addStreamStateListener(resConnectionListener);mLiveCameraView.setHardVideoFilter(newHardVideoGroupFilter(files));}publicvoidonBoomButtonClick(intindex){switch(index){ case0: //开始推流 if(!liveCameraView.isStreaming()){liveCameraView.startStreaming(rtmpUrl); } break; case1: //停止推流 if(liveCameraView.isStreaming()){ liveCameraView.stopStreaming(); } break; case2://开始录制if(!liveCameraView.isRecord()){Toasttoast=Toast.makeText(activity,null,Toast.LENGTH_SHORT);toast.setText("开始录制视频");toast.show();liveCameraView.startRecord();}break;case3://停止录制if(liveCameraView.isRecord()){liveCameraView.stopRecord();Toasttoast=Toast.makeText(activity,null,Toast.LENGTH_SHORT);toast.setText("视频已成功保存");toast.show();}break;case4://切换滤镜BaseHardVideoFilterbaseHardVideoFilter=null;if(isFilter){baseHardVideoFilter=newGPUImageCompatibleFilter(newGPUImageBeautyFilter());}else{baseHardVideoFilter=newFishEyeFilterHard();}liveCameraView.setHardVideoFilter(baseHardVideoFilter);isFilter=!isFilter;break;case5://切换摄像头liveCameraView.swapCamera();break;case6://截帧liveCameraView.takeScreenShot(newRESScreenShotListener(){@OverridepublicvoidonScreenShotResult(Bitmapbitmap){if(bitmap!=null){imageView.setVisibility(View.VISIBLE);imageView.setImageBitmap(bitmap);}}});break;case7://镜像if(isMirror){liveCameraView.setMirror(true,false,false);}else{liveCameraView.setMirror(true,true,true);}isMirror=!isMirror;break;default:break;}}图4.9直播间设置界面用户在发起直播前,还可以在直播间设置界面对直播的有关信息进行设置,界面效果如图4.9所示,用户可设置直播间的标题,介绍以及直播标签,最多可设置三个直播标签。4.3.2直播的拉流端图4.10直播详情界面用户选择想观看的直播后,点击进入直播详情界面,效果如图4.10所示。用户点击全屏按钮还可全屏观看直播,在全屏界面还有镜像,旋转画面,调整画面比例等功能。上文中说过直播的推流过程完成后,数据会推流到服务器,而流媒体服务器的作用是负责直播流的发布和转播分发。用户观看直播的拉流端使用的视频播放器仍然是开源框架GSYVideoPlayer,前文已提及,不再赘述。将对应参数配置为媒体服务器的地址即可播放RTMP媒体流。实现的主要代码如下:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_live); …… videolPlayer=(SampleVideo)findViewById(R.id.video_player);//实例化VideoPlayer Vurl=d.getAnchor_pull();//获取当前直播数据的拉流地址detailPlayer.setUp(Vurl,true,title);//配置拉流地址 ……}图4.11直播的聊天与简介在直播详情界面,视频播放器的下方为直播的聊天与简介,效果如图4.11所示,界面采用TabLayout和ViewPager结合使用的方式,使用户只需左右滑动屏幕就可快速,方便的查看两界面。在直播聊天界面,用户可发送消息,在直播简介界面,用户可查看该教师的简介,如直播标题、直播内容、直播标签等,用户还可以点击“关注”按钮对喜欢的教师进行关注。4.3.3动态模块图4.12动态界面用户在直播界面点击“动态”按钮或滑动屏幕可进入动态界面,效果如图4.12所示,用户可查看自己或其他用户的动态。图4.13上传位置和发布动态用户点击界面右下角的圆点并选择“发布动态”可进入发布动态的相应流程,效果如图4.13所示,用户会先进入上传位置界面,系统会定位用户的当前位置并显示,然后用户若点击“前往发布”按钮会进入发布动态界面,在该界面用户可以输入想发布的动态文字,然后点击“添加图片”按钮,系统会调取设备相册,选择图片后可进行添加。最后点击“发布”按钮,若用户的操作符合规范,则发布成功,跳转至动态界面,用户新发布的动态会显示在界面顶部。若用户的操作不符合规范,则发布失败,会弹出如“请输入动态内容”等错误信息提示用户发布失败的原因。4.4搜索模块图4.14搜索界面用户在首页点击最上方的搜索框会进入搜索界面,效果如图4.14所示,界面中还有推荐搜索的词条,当用户进行过搜索后还会显示搜索历史词条,用户点击词条后,该词条会自动输入至搜索框中,方便用户进行搜索。图4.15搜索结果界面在输入框中输入关键字,点击“搜索”按钮,可进入搜索结果界面查看搜索结果,效果如图4.15所示。在搜索时,系统会将关键词在数据库对应的表中进行查找,当对应字段值包含该关键词时,则认为找到一条搜索结果,同时也会查找该记录中其他需要的字段值,然后将搜索结果显示在界面中。如用户在输入框中输入关键词“物联网”,系统会先将该关键词在数据库的视频表的标题字段中进行查找,若某一条记录的标题字段中包含该关键词,则找到一条搜索结果,同时也会查找视频简介,视频标签等字段值,将结果显示在搜索结果视频分类界面中的对应位置。实现的主要代码如下://搜索界面protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_search);……Intentintent=newIntent(SearchActivity.this,SearchResultActivity.class);//创建Intent对象并初始化其跳转的目标ActivityStringsearch=editText.getText().toString();//获取输入框中的关键词intent.putExtra("search",search);//将数据附加到Intent对象startActivity(intent);//前往搜索结果界面……}//搜索结果界面protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_search_result);……Intentintent=getIntent();//获取Intent对象 Stringsearch=intent.getStringExtra("search");//获取附加的数据 …… SearchVideoFragmentsearchVideoFragment=newSearchVideoFragment();//创建搜索结果的视频分类界面的对象 Bundlebundle=newBundle();//创建Bundle对象 bundle.putString("search",search);//封装数据 searchVideoFragment.setArguments(bundle);//传递参数……}//搜索结果的视频分类界面publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){view=inflater.inflate(R.layout.fragment_search_video,container,false);Bundlebundle=this.getArguments();if(bundle!=null){search=bundle.getString("search");//从Bundle对象中获取数据}List<VideoControle>list=videoDao.getSearchVideoMenu(search);//在数据库中查找关键词recyclerView=(RecyclerView)view.findViewById(R.id.rv_search_video);//实例化RecyclerViewvideoAdapter=newVideoAdapter(list);//创建VideoAdapter对象并将搜索结果数据传入VideoAdapter的构造函数中recyclerView.setAdapter(videoAdapter);//完成适配器设置,显示搜索结果……}在搜索的整个流程中,用户需要先在搜索界面的输入框中输入关键词,进行搜索后会进入搜索结果界面,而搜索结果又会根据分类显示在对应的界面中。所以在实现时需要对关键词这一值在不同界面间进行传值。在Android开发中,Intent对象主要用来在Android程序的Activity、Service和BroadcastReceiver这三大组件之间传输数据,而通过Bundle对象可在不同的Intent之间传递数据[24]。实现的主要逻辑为:在跳转前的界面,即第一个界面中创建Bundle对象,并将数据以键值对的方式进行封装,然后创建Intent对象并初始化要跳转的目标Activity,将封装好的数据附加到Intent对象中,最后使用语句startActivity()启动目标Activity。在跳转后的界面,即第二个界面中使用getIntent()方法获取Intent对象,然后使用getString()方法从Bundle对象中获取到传递过来的数据。4.5个人中心模块图4.16个人中心界面用户点击首页左上角的头像按钮或右滑屏幕可进入个人中心界面,效果如图4.16所示,用户点击后可进入对应界面查看相关内容。在Android开发中,实现某一控件的点击事件有多种方式,较常见的方式有两种。第一种方法是使用匿名类的来注册监听器。先实例化控件,然后通过语句.setOnClickListener()为控件的点击事件注册一个监听器,这样每当点击控件时,就会执行监听器中的onClick()方法,只需要在这个方法中加入待实现的逻辑即可。第二种方法是实现接口。将所在Activity实现View.OnClickListener接口,实例化控件后通过语句.setOnClickListener(this)就可注册监听器,然后重写onClick()方法,加入待实现的逻辑即可[25]。但在该页面设计中不使用上述两种方法,而是采用另一种方式:在Activity所对应的布局文件中使用android:onClick属性。然后在Activity中直接实现该属性值的同名方法,在该方法中加入待实现的逻辑即可。这种方法代码结构简单,清晰,代码量也大大减少,并且通过布局文件的可配置性,增加了工程的可维护性,也进一步增强了模块化。图4.17我的关注和我的收藏用户点击“我的关注”,“我的收藏”可分别进入我的关注界面和我的收藏界面,效果如图4.17所示。在我的关注界面,用户可查看自己关注的教师以及该教师直播的相关信息,点击后可进入该教师的直播间。在我的收藏界面,用户可查看自己收藏的资讯,点击后可进入资讯界面查看该资讯的详情。图4.18设置界面、账号管理界面点击“设置”可进入设置界面,再点击“账号管理”可进入账号管理界面,如图4.18所示。在该界面用户可进行的操作有修改头像、修改昵称、修改密码、完善个人信息以及退出登录。图4.19修改头像点击“修改头像”会跳转至个人中心界面,然后点击头像区域,系统会让用户拍摄照片或选择相册中的照片,效果如图4.19所示,用户选定照片后会将头像进行实时替换。图4.20修改昵称界面、修改密码界面点击“修改昵称”进入修改昵称界面,用户在输入框中输入新昵称并点击“确定”按钮后即可实时更换昵称。点击“修改密码”进入修改密码界面,用户需依次在各个输入框中输入旧密码、新密码并且确认新密码,点击“确定”按钮后,若用户输入的相关信息符合规范,则修改密码成功,否则修改密码失败,会弹出如“两次输入的新密码不相同”等错误信息提示用户修改密码失败的原因。修改昵称界面和修改密码界面效果如图4.20所示。图4.21完善个人信息界面若用户还未完善个人信息,可点击“完善个人信息”进入完善个人信息界面,效果如图4.21所示,用户需如实输入相关信息并选择身份,若身份为学生,则在完善信息后可获得发布动态权限,若身份为教师,还可额外获得发起直播权限。若用户已完善个人信息,则点击进入后会显示“已完善个人信息”。图4.22退出登录点击“退出登录”后,系统会询问用户是否确定要退出,效果如图4.22所示,若用户点击“确定”按钮,则退出登录,返回至登录界面。5软件测试基于Android的IoT学习APP的研发,虽然在深入的分析、成熟的开发工具和技术之上所开展,但随着不断的扩大软件的规模和增加其复杂程度,并且面对各式各样的操作场景和应用场景,仍然有可能存在着潜在问题。目前解决这些问题的主要方法是通过软件测试来对其设计和功能进行最终评定[26]。通过及时的发现问题,避免APP在运行过程中出错,保证用户的良好体验。5.1功能测试功能测试主要针对APP的功能进行测试检查。测试用例及结果如下:1.注册功能测试,见表5.1。表5.1注册功能测试用例名称测试步骤预期结果实际结果能否输入用户名点击用户名输入框,在弹出的键盘中输入字符软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入能否输入密码点击密码输入框,在弹出的键盘中输入字符软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入能否确认密码点击确认密码输入框,在弹出的键盘中再次输入相同的密码字符软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入能否输入昵称点击昵称输入框,在弹出的键盘中输入字符软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入能否输入验证码点击验证码输入框,在弹出的键盘中输入验证码软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入用户注册校验输入相关信息后,点击注册注册成功注册成功2.登录功能测试,见表5.2。表5.2登录功能测试用例名称测试步骤预期结果实际结果能否输入用户名点击用户名输入框,在弹出的键盘中输入字符软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入能否输入密码点击密码输入框,在弹出的键盘中输入字符软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入登录校验输入正确的用户名和密码,点击登录登录成功登录成功登录校验输入错误的用户名和密码,点击登录提示密码错误,登录失败提示密码错误,登录失败3.视频模块测试,见表5.3。表5.3视频模块测试用例名称测试步骤预期结果实际结果能否正常进入视频详情界面点击视频,进入视频详情界面视频详情界面正常显示视频详情界面正常显示能否播放视频点击播放按钮播放视频视频正常播放视频正常播放能否全屏视频点击全屏按钮全屏视频视频正常全屏播放视频正常全屏播放全屏状态下能否正常进行视频的手势操作全屏后在屏幕相应位置滑动调节亮度,音量以及视频进度手势操作正常实现手势操作正常实现能否显示视频简介点击简介,上滑屏幕查看完整内容视频简介正常显示视频简介正常显示能否点赞视频点击简介界面的点赞按钮对视频点赞点赞按钮点亮,点赞数加一点赞按钮点亮,点赞数加一能否显示视频评论点击评论,上滑屏幕查看完整内容视频评论正常显示视频评论正常显示能否评论视频点击评论输入框,在弹出的输入框中输入字符并点击“发表”按钮评论成功,评论显示在最下方评论成功,评论显示在最下方能否回复评论点击一级评论,在弹出的输入框中输入字符并点击“发表”按钮回复成功,回复显示在该条评论的最下方回复成功,回复显示在该条评论的最下方能否点赞评论点击评论旁对应的点赞按钮对评论点赞点赞按钮点亮,点赞数加一点赞按钮点亮,点赞数加一4.直播模块测试,见表5.4。表5.4直播模块测试用例名称测试步骤预期结果实际结果能否正常进入直播详情界面点击直播视频,进入直播详情界面直播详情界面正常显示直播详情界面正常显示能否观看直播点击播放按钮观看直播直播正常播放直播正常播放能否全屏观看直播点击全屏按钮全屏观看直播正常全屏播放直播正常全屏播放能否显示直播简介点击简介,查看直播简介直播简介正常显示直播简介正常显示能否关注教师点击“关注”区域关注教师“关注”区域显示为“已关注”,在我的关注界面可查看已关注的教师“关注”区域显示为“已关注”,在我的关注界面可查看已关注的教师能否取消关注教师点击“已关注”区域取消关注教师“已关注”区域显示为“关注”,在我的关注界面会移除取消关注的教师“已关注”区域显示为“关注”,在我的关注界面会移除取消关注的教师能否进入发起直播流程在直播界面点击发起直播若未完善个人信息,则进入完善界面。若已完善且身份为学生,则无直播权限;若身份为教师,则进入正常发起直播流程若未完善个人信息,则进入完善界面。若已完善且身份为学生,则无直播权限;若身份为教师,则进入正常发起直播流程能否发起直播在我的直播界面点击发起直播进入开始直播界面,点击开始直播发起直播成功,提示“开始直播”发起直播成功,提示“开始直播”能否正常进入动态界面点击动态进入动态界面动态界面正常显示动态界面正常显示能否进入发布动态流程点击发布动态若未完善个人信息,则进入完善界面。若已完善,则进入正常发布动态流程若未完善个人信息,则进入完善界面。若已完善,则进入正常发布动态流程能否发布动态在发布动态界面的输入框中输入字符,并在下方添加图片,点击“发布”按钮发布动态成功,在动态界面刷新后可查看新发布的动态发布动态成功,在动态界面刷新后可查看新发布的动态5.搜索模块测试,见表5.5。表5.5搜索模块测试用例名称测试步骤预期结果实际结果能否正常进入搜索界面点击主页上方的搜索框进入搜索界面直播详情界面正常显示直播详情界面正常显示能否输入搜索关键词点击搜索输入框,在弹出的键盘中输入字符软键盘能正常弹出,字符能正常输入软键盘能正常弹出,字符能正常输入能否显示搜索结果输入字符后点击搜索,进入搜索结果界面搜索结果正常显示,点击不同分类显示对应分类下的搜索结果搜索结果正常显示,点击不同分类显示对应分类下的搜索结果6.账号管理功能测试,见表5.6。表5.6账号管理功能测试用例名称测试步骤预期结果实际结果能否修改头像点击头像,拍摄照片或从相册选择照片修改头像成功修改头像成功能否修改昵称在输入框中输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论