马玉春 汪文彬
摘 要: 智能手机的普及为用户使用手机提供了便利,也带来诸多不便。本文将手机联系人区分为通讯簿联系人、白名单、黑名单等,并结合参数设置和时间表设置,分别采用不同的策略进行处理;隐私数据本地保存和恢复,可以根据设置从静音模式自动切换到正常模式,自动打开Wi-Fi等。最后对技术细节和知识点进行剖析,给出了教学应用方案。
关键词: Android;联系人;情景模式;Wi-Fi;拦截
中图分类号: TP311.52 文献标识码: A DOI:10.3969/j.issn.1003-6970.2020.01.006
本文著录格式:马玉春,汪文彬. Android个性化服务软件的设计及教学应用[J]. 软件,2020,41(01):2428
【Abstract】: The popularity of smart phones provides convenience for users to use them, but also brings many inconveniences. Mobile phone contacts are divided into system contacts, whitelists, and blacklists and so on, and different strategies are adopted to deal with them combined with parameter settings and timetable settings. Private data can be saved and restored locally, and can be automatically switched from silent mode to normal mode according to settings, and Wi-Fi can be automatically opened. Finally, the technical details and knowledge points are analyzed, and the teaching application solution is given.
【Key words】: Android; Contacts; Scenario mode; Wi-Fi; Blocking
0 引言
智能手机在给用户带来便利的同时也带来了诸多不便,例如,上课时不能接听电话和收发短信且不能响铃;用户为避免影响正常的工作和生活,不希望陌生电话或匿名电话及垃圾短信骚扰;开会和驾驶时不能接听电话,如何自动告知对方自己所处的状态?在深夜睡眠状态,用户不希望大部分电话呼入,但是,又希望能够响应紧急联系人;对于独居老人,经常需要安静地查看其所处位置和地理环境,但老人由于误操作将情景模式设置为静音并关闭Wi-Fi,视力不好又找不到对应的开关,导致子女无法跟老人电话联系或微信视频。本文以Android手机作为对象,解决智能手机使用中的常见问题,达到个性化服务的目的。
1 逻辑框架
为了方便使用智能手机,将联系人分为普通名单(手机通讯簿中的成员)、白名单(紧急联系人)、黑名单和陌生人,分别采用不同的策略进行处理。另外根据时间表设置机主的时间安排,如上课时间段、午休和睡觉时间段等;再用Switch组件设置临时状态,例如,开会或驾驶(本文仅以会议为例说明)。如果是黑名单用户,则直接拦截,并更新当前日期和累加来电或短信次数(首次黑名单的添加在第3节介绍)。如果处于会议状态,则拦截来电,禁止短信播放提示音,并根据设置回复“会议中,会后联系……”。查询时间表,如果处于上课状态,同样拦截来电,禁止短信播放提示音,回复的短信可以根据设置的参数自动查询并添加下课时间。如果时间表上处于休息时间段,则禁止短信播放提示音,但当白名单来电时,允许正常拨入,否则直接拦截任何非白名单用户。这里采用一个BlockStructure类用于控制逻辑,主要有是否拦截、是否白名单或黑名单等布尔属性及主动回复的字符串短信内容属性,以及查询数据表和用户配置的各个Switch的状态。本服务软件的基本逻辑处理框架如图1所示。
2 主窗体设计
主窗体的设计围绕图1所示的逻辑框架展开,界面集成了来电显示和回拨功能、短信接收和发送、各种名单(通讯簿、白名单和黑名单)的添加和删除,通讯簿名单包括电话号码和姓名,白名单只取姓名,黑名单只取电话号码。软件运行所需要的各项参数及各种数据表的查看和设置,都通过菜单项进行,而“参数设置”由于使用最频繁,总是在标题栏上显示,以方便用户操作。
参数设置具有多个选项,主要用Switch组件来實现,对于时间表中的上课时间段,如果允许提示,则拦截后自动回复短信,回复对象可以是通讯簿中的普通名单、白名单或者包括陌生人(黑名单总是无条件拦截);对于会议开关,也采取这一策略。对于假期开关,如果假期有效,则上课时间段自动无效,电话可以正常拨入,短信提示音可以正常播放。白名单响铃开关,如果设置为有效,即使手机的情景模式为振动或无声,白名单呼入也可以自动切换为响铃,该项功能主要为了方便老人使用,避免白名单子女无法联系老人的情况。另外,还有拦截陌生人(不在系统通讯簿中)和匿名电话开关,一旦设置为有效,这些电话都将被拦截。点击白名单中的选项,可以查询其所在的地理位置,这在第4节详细介绍。
3 主要的数据表及处理
图2所示的黑名单数据表包括电话号码(Phone)、日期(Date)、次数(Times)和备注(Remark),其中Phone字段是关键字,Date字段用来登记来电或短信的日期,Times用来累加来电或短信的次数,Remark是黑名单的分类(如“诈骗”、“骚扰”等)。首次添加黑名单时通过手动进行,其后自动更新日期和累计次数。查看黑名单时,根据日期进行降序排序,即最近的日期在最前面。数据表采用文献[1]中的基于SQLite的通用数据库类进行管理。黑名单的分类专门用一个文本文件存储,利用ListView组件进行显示,可以根据需要修改。
作为对黑名单的补充,设置了AreaCode表,只有一个头部号码字段HeadCode,凡是以该头部号码(如区号)开头的电话全部拦截,这样可以避免区域电话或某些虚拟电话的骚扰。
白名单为紧急联系人,为了方便用户,避免输入电话号码的麻烦,白名单数据表中用姓名(Name)来标识。接到来电后,通过系统通讯簿查找到姓名,然后再对照白名单。白名单的显示顺序可以根据用户喜好进行手动调整,并调用Vibrator对象的vibrate方法振动手机。
时间表包括开始时间(Start)、结束时间(Stop)、业务类型(Business)和星期数(Weekday),以时间和星期的组合字段作为关键字。这里的业务类型主要以Class(上课)和Rest(休息)为主。上课期间拦截所有來电,可以根据设置的相应内容自动回复短信。如果处于放假状态,则上课时间无效。在休息时间段,白名单作为紧急联系人可以直通,其他所有号码直接拦截。查看时间表时,根据时间升序排列。
各项数据表的显示,都通过自定义ListView组件进行。以时间表为例,由于一行数据包含多个数据,需要设置一个自定义适配器TimeTableAdapter,其中存放TimeTableRowHolder类的对象,该对象包括时间表中的所有字段,在这个适配器中重写添加、更新和删除时间表记录的方法。ListView对象调用其setAdapter方法设置TimeTableAdapter对象,建立与数据源之间的联系。数据表中的数据,可以通过多线程技术调用FileOutputStream对象写入外部文本文件,从而复制到外部存储器保存;也可以调用FileInputStream对象从外部存储器中恢复数据,便于换机操作。
4 地理位置的查询
选择图2中的白名单,可以查询其所在的地理位置。采用文献[2]中的技术对待发送的短信进行加密,然后发送到目标手机。目标手机收到短信后进行解密,如果是白名单发送的查询地理位置命令,则调用百度地图的API函数,获取经纬度数据,加密后返回给查询手机。查询手机解密短信后,将经纬度数据在百度地图上进行标示,可以在2D地图和卫星地图之间切换,以便更加详细地了解目标手机所处的地理位置。目标手机在地址查询过程中,均自动处于静音状态,所收发的短信自动删除,不影响目标手机持有者的工作与生活。
百度地图 Android SDK是一套基于Android 4.0及以上版本设备的应用程序接口。可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。该套地图SDK免费对外开放,接口使用无次数限制。涉及百度地图的应用软件开发,首先需要申请百度帐号,申请成为百度地图开发者,最好进行实名认证,这样可以得到更好的服务。然后在百度地图控制台申请SDK开发密钥,输入“应用名称”、“应用类型”和开发工具指纹信息等,提交后即可得到“应用AK”,这个“应用AK”将用于项目配置文件AndroidManifest.xml中,如图3所示。
地理位置查询需要手机安装百度地图,开通访问网络和地理位置的权限。
5 广播接收器及其权限
当接到来电、收到短信或系统开机等,Android系统都会发出广播,任何注册了相应接收器的应用程序都可以收到广播并执行相应的处理[3]。应用程序本身也可以自行送出广播。大部分系统广播接收器需要申请系统权限,广播接收器的核心代码是实现BroadcastReceiver类的onReceive抽象方法。表1所示是本文所使用的部分广播接收器类及其对应的权限,第7个广播接收器类GetDataRecever是自定义类,当后台数据发生变化时,通知系统去更新界面,因而不需要任何权限。
个性化服务软件常驻系统内存执行,具有系统软件的特性,需要开机自动启动,需要设置相关的权限,并需要用户在安装的时候授权。在开机接收器类BootCompleteReceiver中启动服务,使得即使退出软件主界面,也能让软件在后台自动运行;OutGoingCallReceiver类可以监听拨出电话,并在主界面显示;PhoneStateReceiver类主要用于处理来电,获取来电号码进行一系列是否拦截的处理,主要任务在第1节的逻辑框架中进行,在这里还需要MODIFY_PHONE_STATE权限,用于拦截来电;SmsReceiver类用于接收短信,还需要READ_SMS权限读取短信内容;SmsSentReceiver类和SmsDeliveredReceiver类都用于发送短信监测,前者监测短信是否发出,后者监测短信是否送达目标手机,两者都需要SEND_SMS权限。
RingModeChangeReceiver类用于监测情景模式(响铃、振动与静音)的变化,需要READ_ SETTINGS权限读取系统设置,还需要MODIFY_ AUDIO_SETTINGS权限,当白名单呼入时自动修改情景模式为响铃状态;WiFiChangeReceiver 类用于监测Wi-Fi开关设置,需要ACCESS_WIFI_STATE权限,为了免手机流量使用微信视频,当发现Wi-Fi处于关闭状态时,需要使用CHANGE_WIFI_STATE权限来打开Wi-Fi开关;ScreenChangeReceiver类用于监测屏幕状态变化,当屏幕处于解锁状态时,自动读取Wi-Fi开关状态,及时打开Wi-Fi开关。
屏幕变化的广播接收器不能在配置文件AndroidManifest.xml中注册,只能通过代码进行注册,否则无效。老人由于视力不好或者文化程度不高,不小心将手机设置为静音或者关闭Wi-Fi功能,导致白名单呼入无声音,微信视频无反应,自己找不到开关设置,最后的三个广播接收器主要方便该类人群有效使用智能手机。
6 启动服务的实现
服务是一个应用程序组件,它能够在后台执行一些耗时较长的操作,并且不提供用户界面。服务能被其它应用程序的组件启动,即使用户切换到另外的应用时还能保持在后台运行。此外,应用程序组件还能与服务绑定,并与服务进行交互,甚至能进行进程间通信(Inter-Process Communication,IPC)。比如,服务可以处理网络传输、音乐播放、执行文件I/O或者与Content Provider进行交互,所有这些都是在后台进行的[4]。
服务有两种基本类型,即Started(启动)和Bound(绑定)服务。Started服务是应用程序组件通过调用startService来启动的,一旦被启动,该服务就处于“started”状态,服务就能在后台一直运行下去,即使启动它的组件已经被销毁了。通常,started的服务执行单一的操作并且不会向调用者返回结果。例如,它可以通过网络下载或上传文件,当操作完成后,服务应该自行终止。如果组件通过调用startService启动了服务,那么服务将一直保持运行,直至自行用stopSelf方法终止或由其它组件调用stopService方法来终止它。
当系统资源减少,为了保障拥有用户焦点的应用程序正常运行,Android系统会强行终止一个服务。如果服务被拥有用户焦点的Activity绑定着,则它一般不会被强行终止。如果服务声明为“在前台运行服务”,则它几乎不会被终止。否则,如果服务已被启动并且已运行了很长时间,那么系统将会随着时间的推移而降低它在后台任务列表中的级别,此类服务将很有可能会被强行终止。如果系统终止了服务,只要资源再度够用,系统就会再次启动服务(当然这还取决于onStartCommand方法的返回值)。
个性化服务软件是一个系统级的服务软件,可以直接运行软件启动服务,也可以利用上一节的BootCompleteReceiver广播接收器在手机开机后自动启动服务,从而对手机进行各种监测。为了避免本软件被Android内存管理系统销毁,可以在启动的服务中构建一个通知栏图标Notification的对象notify。PendingIntent对象pi指向主窗体,通过调用notify的setContentIntent方法并传入该pi对象,即可通过点击通知图标打开主窗体;方法setOngoing中传入true,表示有正在执行的后台任务;方法setPriority中传入参数Notification.PRIORITY_ MAX,使得该图标被置于最前列。在服务的onCreate方法中调用startForeground方法将服务放到前台执行。
7 软件测试
软件测试围绕主窗体和逻辑框架进行,首先在主窗体中测试来电显示、回拨电话、接收短信和发送短信功能,然后测试将电话号码加入系统通讯簿、白名单或黑名单中,也可直接尝试删除[5]。从主窗体的菜单项进入时间表、白名单、黑名单及其种类窗体,查看数据项的添加与删除,备份与恢复功能。最后结合参数设置进行综合测试,查看来电及接收短信,能否在特定条件下被拦截或放行。关于白名单地理位置查询功能,需要确保本机与目标手机都安装百度地图软件,目标手机处于联网状态,这样才能获取地理位置并以短信形式返回。圖4所示为查询白名单所在地理位置的效果,经纬度也一并显示。
8 教学应用
本文所研发的Android个性化服务软件是一个系统级服务软件,综合应用了前台和后台的主要技术。在教学应用中,可以先让学生安装使用该软件,使得手机处于正常模式,由于时间表的限制,上课可以自动拦截来电而不会有响铃干扰。然后,将知识点进行分解,首先从简单的菜单使用、多窗体及其参数传递开始入手,搭建一个最基本的框架;然后学习SQLite数据库,为APP添加数据库功能,在此基础之上利用多线程技术导出数据库中的数据至外部文本文件,或者从外部文本文件恢复数据;第三,掌握系统广播接收器的注册与监测技术,及自定义广播接收器的使用方法,逐个尝试,深入理解;最后将以上技术进行整合,添加服务功能,使其成为一个综合实用的技术载体[6]。
9 结语
本文所完成的Android个性化服务软件,将联系人分为系统通讯簿、白名单、黑名单、陌生人和匿名,结合时间表和多种参数设置,分别采用不同的控制策略,使得手机可以一直处于正常的情景模式,也不会影响日常工作、生活与学习。各种隐私数据可以备份到本地文本文件,也可以从本地文本文件恢复,有效避免了隐私泄漏的可能。可以根据设置的参数自动将情景模式从静音模式切换到正常模式,自动打开Wi-Fi方便老年人使用智能手机,也可以查询白名单联系人的地理位置,并以2D地图或者卫星地图进行显示。最后对个性化服务软件的技术细节和知识点进行分解,从前台到后台,从简单到复杂剖析了学习和掌握相关技术的方法。
参考文献
[1] 刘雍, 孙冰, 马玉春. Android平台下的通用SQLite模型的设计与实现[J]. 电脑编程技巧与维护, 2017, 4:41-42+59.
[2] 刘雍, 汪文彬, 马玉春. Android环境下的数据编码与处理技术[J]. 电脑编程技巧与维护, 2018, 9:71-74+107.
[3] 王小科, 寇长梅. Android入门经典[M]. 北京: 机械工业出版社, 2013.
[4] 陈佳, 李树强. Android移动开发[M]. 北京: 人民邮电出版社, 2016.
[5] 孙红丽, 叶斌. 基于Android 的通讯录系统的设计与实现[J]. 软件, 2015, 36(5): 117-120.
[6] 马玉春, 刘雍, 汪文彬. Android平台下的TCP客户机教学设计[J]. 软件, 2018, 39(10):14-17.
[7] 王志国, 杨维. 基于Android 平台酒店人员定位系统的设计与实现[J]. 软件, 2015, 36(10): 65-67.
[8] 张二江, 迟潇潇, 肖亚铁. 基于Android 平台的实时隐秘报警系统设计与实现[J]. 软件, 2015, 36(4): 28-32.
[9] 张晓诺. 基于Android 的智能家居环境监测系统APP 设计与实现[J]. 软件, 2015, 36(2): 77-79.
[10] 李淑民. Android 手机隐私泄露研究[J]. 软件, 2015, 36(2): 69-72.