移动设备交互应用 大作业(一)

简介: 移动设备交互应用 大作业(一)

一、期末大作业的目的与要求:

1. 垃圾分类界面

请尽量模拟如下垃圾分类APP的功能,即参考如下的界面展示形式及功能模块:

d6a03f26b6cd4f4bbb82a89ef64a0a9b.png

d2b76d5bfcd0403fa2a2e109ed069987.png


f83f0e6d2f2a4ada85dcf73b2895c110.png

2. 具体要求


模拟图1所示垃圾分类APP,介绍垃圾分类与回收相关的一些知识点并能提供相应服务:

1) 建议包含的一些功能:活动之间的转换与数据传递;能适应不同的展示界面;有登录功能,强制下线功能;数据有多样化的持久化功能;能跨程序提供与共享数据;有展示一些多媒体的功能;


2) 较好的实现了书本上介绍的一些较成熟的功能,并能较好的把这些功能融合在一个完整且无大bug的APP里;


3) 能在此基础上构建自己的报告亮点,如实现了书本不一样的功能模块,或者为某个知识点找到一些新的应用场景,或者能解决同学们普遍存在的一些问题等;


4) 模拟的APP不局限于所参照APP的功能,即尽量模拟这些功能,不要求将每个功能都实现,如果某个功能不能体现已学知识点,可以不用考虑,当然如果能想办法实现出来,可以作为报告亮点;即不必与这些功能完全一样,可在这些功能基础上进行变通,达到类似的效果就可以;可以设计一些该APP没有的功能,并能清楚说明这些功能的实现方式、潜在的用途等;同时布局的设计也不必与参考APP完全一样,可根据自己需要适当调整;


5) 总体目标是灵活利用所学的知识点,做到每个功能各种实现方式的丰富化(如数据的持久化的三种实现方式都能在APP中有所体现),并且能体现不同实现方式的优劣,如果能在APP上体现会更好;


3. 部分参考


1)功能实现参考:图1第2列图尽量参考第6章数据持久化技术的各个知识点;第3列尽量参考布局及活动之间的跳转,碎片的实现,多媒体展示功能;第4列可以利用数据持久化技术;


2)潜在的扩展功能:图1第4列尽量参考Android基于位置的服务;添加一个小功能,整合网络技术的应用,即将一个HTML网页文件中的文本与图片网址进行分离,并将文本与图片用不同文件夹分开保持;利用数据后台下载的功能;


3)可以借鉴的部分章节内容,第12章可以让你的APP界面变得更美观;第14章展示了一个大型的工程,可以学习下多个功能怎样在一个工程里体现;


4. 其它要求


1)构建的APP要格式工整,美观;


2)实验报告中需要有功能的描述、实验结果的截屏图像及详细说明;结果展示要具体,图文交叉解释;代码与文本重点要突出;


3)也欢迎采用课程后续章节的知识点完成本次大作业,如果实现的功能言之合理,会考虑酌情加分;


4)每位同学在最后一次课都需要上台报告,并且最好能现场演示APP的功能等,没上台报告的同学分数会受一定的影响;


5)报告由个人独立完成。


5. 评分标准


APP协议完成度高,与参考APP有一定的相似度,功能完善、丰富。能实现活动的编写、自定义用户界面的开发、碎片开发、广播机制、数据持久化与共享技术、网络技术、后台服务的应用等。

-------------(60分)


模拟APP结构合理,代码规范,界面美观易用。项目报告撰写规范、美观整齐,内容详实且能准备描述项目内容和设计思想、原理、框架等,项目报告要求5号字、除前两页外A4版面不低于10页的长度。

-------------(15分)


提供程序源代码和可执行程序(或安装程序);报告文档采用单独的word文档,项目所有代码(不是整个工程文件,应该总共不超过5M)在第17周之前打包作为附件进行上传blackboard系统;纸质版交到任课老师处。

-------------(10分)


项目报告能够详细,准确的描述项目内容,并在最后一堂课有较好的展示效果。

-------------(15分)


二、实验过程和代码与结果


1. 实验亮点:


①通过数据持久化与共享技术使用SQLite完成了历史搜索的功能;


②通过调用API网络接口完成对垃圾类别的判断;


③完成创新性功能——图片识别和语音识别,以及对应权限的申请;


④使用广播系统对网络进行判断,给出有无网络的提示;


⑤代码文件进行分文件夹分层存储,代码有易懂的结构;


⑥通过动态绘图进行布局,对不同种设备进行自适应匹配;


⑦使用更精美的UI动画(例如加载动画);


⑧通过代码托管平台实现了程序的版本更新;


⑨通过链接APPStore实现了对APP进行评分的可行性;


⑩完成了更细节的优化(如连续两次返回才退出,并在第一次时提示再滑动一次以退出);


⑪通过使用本地创建的秘钥将文件打包成APK;


⑫所有代码都有大量的注释,方便又易懂;


⑬实现了各个Adapter与Json处理工具,极大方便了开发过程;


⑭通过使用Intent进行Activity传值完成垃圾详情的查看;


⑮使用Fragment完成垃圾详情的查看;


⑯通过Logcat完成对整个项目的调试;


⑰采用LinearLayout进行布局。


2. “我的垃圾分类APP”的构建过程及结果


(1)欢迎页面的实现:


在日常使用中,为了使用APP更美观,并给APP内部数据加载预留时间,应设置一欢迎界面。在本次大作业中也有体现。

通过自动计时两秒,两秒后实现Activity的自动跳转。

public class WelcomeActivity extends BaseActivity {  
 @Override  
 protected void onCreate(Bundle savedInstanceState) {  
     requestWindowFeature(Window.FEATURE_NO_TITLE);  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_welcome);  
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
         getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);  
         getWindow().setStatusBarColor(Color.TRANSPARENT);  
     }  
     RxCountDown.countdown(2).doOnSubscribe(disposable -> {  
     }).subscribe(new Observer<Integer>() {  
         @Override  
         public void onSubscribe(Disposable d) {}  
         @Override  
         public void onNext(Integer integer) {}  
         @Override  
         public void onError(Throwable e) {}  
         @Override  
         public void onComplete() {  
             startActivity(new Intent(WelcomeActivity.this, HomeActivity.class));  
             finish();  
         }  
     });  
 } 

采用了ConstraintLayout进行布局:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context=".ui.activity.WelcomeActivity">  
</android.support.constraint.ConstraintLayout> 


(2)垃圾分类的实现:


为了实现垃圾分类,我使用了一种互联网技术——API接口,并通过接口与服务器的数据交互完成对垃圾分类的判断。实现分获取API数据,显示和查询详细三个连续操作,下面分开介绍。


①获取API数据:


   private void loadData() {  
    String serachStr = mEtSearch.getText().toString();  
    if (StringUtils.isEmpty(serachStr)) {  
        showToast("请输入搜索内容", mRelTops);  
    } else {  
        if (OrcLoadUtils.isWifiProxy(RkApplication.getInstance())) {  
            showToast("请先关闭代理等", mRelTops);  
        } else {  
            showStatus(mViewLottie, new LoadAbstract(this));  
            OrcLoadUtils.searchName(serachStr).subscribe(o -> {  
                try {  
                    hideStatus(mViewLottie);  
                    TrashResultEntity entity = (TrashResultEntity) o;  
                    if (entity != null) {  
                        if (entity.Ok) {  
                            if (entity.Data != null && entity.Data.size() > 0) {  
                                String serachStr2 = mEtSearch.getText().toString();  
                                if (!StringUtils.isEmpty(serachStr2)) {  
                                    setRestData(entity.Data);  
                                }  
                            } else {  
                                loadDataTwo(serachStr);  
                            }  
                        } else {  
                            loadDataTwo(serachStr);  
                        }  
                    }  
                } catch (Exception e) {  
                    loadDataTwo(serachStr);  
                    e.printStackTrace();  
                }  
            });  
        }  
    }  
}  


在获取API数据时,定义了TrashResultEntity类用以接受返回的结果,并将各个获取的数据写回到该类中。


②进行数据展示:


要显示数据即在对应的Adapter中写入数据即可,通过函数传参进入即可。此外,如果查询结果为空,则需要进行特判,并显示未查询到结果。


private void setRestData(List<TrashResultEntity.DataBean> data) {  
     mTypeRecycle.setVisibility(View.GONE);  
     mResAdapter.setHeaderView(headerView);  
     mResAdapter.setNewData(data);  
 }  
private void setRestData(String search, String message) {  
     if (StringUtils.isEmpty(message)) {  
         message = "未查询到结果";  
     }  
     List<TrashResultEntity.DataBean> list = new ArrayList<>();  
     TrashResultEntity.DataBean data = new TrashResultEntity.DataBean();  
     data.Kind = 1008;  
     data.msg = message;  
     data.Name = search;  
     list.add(data);  
     mTypeRecycle.setVisibility(View.GONE);  
     mResAdapter.setHeaderView(headerView);  
     mResAdapter.setNewData(list);  
 }  

③查询详细信息:


此时只需判断传入的垃圾的种类,如果为合法种类,则通过intent传值打开对应的Activity即可。


private void openDetails(int type) {  
     if (type == 1 || type == 2 || type == 3 || type == 4) {  
         Intent intent = new Intent(this, RefuseDetailActivity.class);  
         intent.putExtra("type", type);  
         startActivity(intent);  
     }  
 }  


(3)语音识别:


在本次大作业中,为了方便各种用户不同的数据输入需求,我引用百度语音来进行语音识别并进行垃圾分类。进行语音识别的顺序大致如下:


①首先申请录音权限:


如果获得了录音权限,则将百度语音就绪;若无法获得录音权限,则弹出提示“权限不足”。


private void openBdAudio() {  
     PermissionUtils.permission(Manifest.permission.RECORD_AUDIO,  
             Manifest.permission.ACCESS_NETWORK_STATE,  
             Manifest.permission.INTERNET,  
             Manifest.permission.READ_PHONE_STATE,  
             Manifest.permission.WRITE_EXTERNAL_STORAGE)  
             .callback(new PermissionUtils.FullCallback() {  
                 @Override  
                 public void onGranted(List<String> permissionsGranted) {  
                     mLottigSound.setVisibility(View.VISIBLE);  
                     mImSound.setVisibility(View.GONE);  
                     asr.send(SpeechConstant.ASR_START, "{}", null, 0, 0);  
                     mTvSoundTips.setText("按下结束说话");  
                 }  
                 @Override  
                 public void onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied) {  
                     LogUtils.e("权限不足");  
                     showToast("权限不足");  
                 }  
             }).request();  
 }  


②判断服务器是否就绪,若就绪则可以获取用户语音输入:


if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)){  
             // 引擎就绪,可以说话,一般在收到此事件后通过UI通知用户可以说话了  
             LogUtils.e("引擎就绪,可以说话,一般在收到此事件后通过UI通知用户可以说话了");  
             mLottigSound.setVisibility(View.VISIBLE);  
             mImSound.setVisibility(View.GONE);  
         }  


③当用户语音输入时,要提示出开始录音与录音结束


此处判断是否识别结束,如果已经识别结束,则给出提示“识别结束”,并将按钮的文字重新写为“按下说话”。


if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_FINISH)){  
             // 识别结束  
             LogUtils.e("识别结束");  
             mLottigSound.setVisibility(View.GONE);  
             mTvSoundTips.setText("按下说话");  
             mImSound.setVisibility(View.VISIBLE);  
         }  


④当用户输入完成时,及判断是否为有效输入


如果输入有效,则调用API对垃圾的类别进行判断。在判断数据是否有效输入时,可以判断数据长度不为空且字符数组长度大于0


if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)){  
             LogUtils.e(params);  
             RecogResult recogResult = RecogResult.parseJson(params);  
             // 识别结果  
             String[] results = recogResult.getResultsRecognition();  
             if (null != results && results.length > 0) {  
                 mEtSearch.setText(results[0]);  
             }  
             //LogUtils.e(results);  
         }  
相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
监控 API C++
利用C++构建PC端监控软件:实时屏幕录制
在今天的数字化世界中,监控软件变得越来越重要。无论是家庭用户需要监控他们的孩子,还是企业需要监控员工的电脑活动,实时屏幕录制是一种有效的方法。本文将向您介绍如何使用C++构建PC端监控软件,实现实时屏幕录制功能。此外,我们还将讨论如何自动提交监控到的数据到一个网站上。
482 0
|
编解码 网络协议 Linux
跨平台 scrcpy显示/控制安卓手机方案
• Genymotion、Parallels Desktop 等虚拟机软件 太专业, 需要配置太多软件, 适合开发者. • 国内一批安卓游戏助手都可以一试, 这里我随便下载了一款网易MuMu对字体的显示不太好. 可以尝试一下 傲软投屏(ApowerMirror) • Vysor Pro 收费较贵,免费版广告又多
757 0
|
2月前
|
存储 安全 Linux
I/O设备的运行时电源管理框架【ChatGPT】
I/O设备的运行时电源管理框架【ChatGPT】
|
2月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
3月前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
94 0
|
3月前
|
小程序 前端开发 JavaScript
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。开发者运用Service Worker等实现资源缓存与实时推送,利用Web App Manifest添加快捷方式至桌面,通过CSS3和JavaScript打造流畅动画与手势操作,需注意兼容性与性能优化,为用户创造更佳体验。
105 0
|
6月前
|
存储 缓存 数据安全/隐私保护
移动应用中的离线模式是一种重要的功能
【5月更文挑战第16天】移动应用的离线模式通过数据缓存和存储确保无网时仍能使用部分功能。数据同步采用延迟策略,用户更改信息后在网络恢复时同步至服务器。为保障安全,敏感数据加密存储并定期备份。开发者还需关注用户体验、电量性能及错误处理,以实现稳定可靠的离线模式,提升用户体验。
159 0
|
6月前
|
Web App开发 安全 API
想开发一款带有视频通话/共享屏幕功能的产品?那WebRTC是你必须要知道的!
一名技术爱好者在研究如何为开源项目集成视频通话功能时,深入学习了WebRTC技术。WebRTC是一个API,允许浏览器和应用实现实时音视频通信,简化了之前复杂的技术挑战,如音视频处理和网络传输。该技术可用于视频通话、桌面共享、视频会议等多种场景。在WebRTC中,通过信令交换、STUN/TURN服务器和ICE框架处理网络连接和通信路径,实现点对点连接。与WebSocket不同,WebRTC专注于高质量实时通信,使用UDP协议以降低延迟。接下来的文章将分享如何实现WebRTC的视频通话功能。
|
6月前
|
并行计算 Linux 异构计算
分享一款刚开源上线3天的音乐人声分离工具!无需联网!页面化操作!
分享一款刚开源上线3天的音乐人声分离工具!无需联网!页面化操作!
100 1
|
缓存 前端开发 Cloud Native
《PWA实战:如何为你的网站增加离线功能和推送通知》
《PWA实战:如何为你的网站增加离线功能和推送通知》
328 0
下一篇
无影云桌面