0 引言
近几年,Android系统的普及十分迅速。2013年第一季度Android操作系统在全球智能手机市场中的占有率已经超过65%,比2012年同期增加了30.3%,然而手机的普及却带来了新的问题。据统计,在中国每天都有1千部手机被丢失,而手机丢失后,用户隐私极易被侵犯。手机的安全问题主要包括2类,即手机防盗与隐私保护的问题。本文提出了一套新型的防盗技术,有效解决了这两个问题。
另一方面,随着智能手机的迅猛发展与物联网的兴起,智能手机作为物联网的移动终端前景大好。智能手机可以用来保护家居安全,比如通过手机远程视频查看来实现火警安防。这类用手机作为物联网的移动终端在市面上尚未有成熟完整的解决方案,主要问题是涉及软硬件结合,实现难度较大。本文也设计了一套小型物联网,将手机作为移动终端来实时监控家居安全。
1.Android系统概述
Android应用主要包括ac TI vi TI esservices、content、providers和broadcastreceivers四种组件,考虑到本文核心内容,着重介绍一下ac TI vity和broadcastreceivers这两大组件。
1.1 Ac TI vity概述
应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:MAIN(activity的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看一个人的联系方式,需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。通过解析各种intent,当向前导航时,activity将会调用startActivity(Intent myIntent)方法。系统会找到最匹配myIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。
1.2 BroadcastReceiver广播接收器
BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作,等等。在onReceive方法内,我们可以获取随广播而来的Intent中的数据,这非常重要,就像无线电一样, 包含很多有用的信息。Android中的广播机制设计的非常出色,很多事情原本需v要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。
2.系统设计
在本软件所设计的防盗系统中,除了市场上流行的防盗功能(如手机定位,换卡通知,响铃报警等),本文还自行设计了一套新型防盗数据获取技术,可控制手机进入防盗托管模式,在该模式下,可远程控制手机进行后台拍照并将盗窃人照片上传到邮件,并且实时检测盗窃人收发的短信和通话记录,截取短信内容,将短信转发给指定号码,同时也可以获取盗窃人的sim卡信息,达到对盗窃人信息的充分掌握,结合本应用的GPS手机定位功能可以更加有效的指认盗窃人、找回被盗手机。
为了实现上述检测防盗系统,我们从手机托管模式检测、短信截取和电话记录监听方面分别进行分析与设计。由于篇幅限制,类似拍照上传、报警响铃、GPS定位等功能在市场上比较常见,这里不再赘述。
2.1 防盗托管
2.1.1 防盗托管模式检测
为实现托管模式,必须先接收正确的指令,并且只有用户先前指定的安全号码所发送的指令才能生效,其他号码都不能远程控制用户手机(如图1所示)。这就需要后台实时广播检测是否有正确的相关指令。和之前提到一样,系统做任何事都会发出一个广播,针对本应用的需要,只须在对接收到短信时发出的广播作出响应,可以自动过滤其他动作,这样可以给系统节省一笔不小的开支。在Android系统中,接收短信的广播通知为“android.provider.Telephony.SMS_RECEIVED“
2.1.2 短信截取和电话记录监听转发
当手机收到一条短信后,软件会后台获取短信内容和来信人号码,若为安全号码,则转向执行判定程序,判定内容是否存在相关指令,若为托管指令,则手机自动进入托管模式,托管模式下的手机会实时检测手机是否接收或发送短信,并将短信内容和号码转发给安全号码。需要注意的是,短信的所有数据首先需要通过bundle.get(“pdus”)来获得,并存储在Object[]数组中。这里Bundle类是一个keyvalue对,两个activity之间的通讯可以通过bundle类来实现,做法就是:新建一个bundle类,bundle类中加入数据(key-value的形式,另一个activity 里面取数据的时候,就要用到key,找出对应的value),新建一个intent对象,并将该bundle加入这个intent对象,这里的intent即是定义为系统收发短信的Activity的intent。之后再解析Object数组中的数据,从而提取出短信内容和发信人号码。
当盗窃人收到来电并进行通话后,应用也会后台检测并发送电话记录给安全号码。大致实现方法是通过使用broadcast-Receiver来接收指定的电话广播,并判断手机通话状态。安卓平台开放了三个手机状态的API,分别是通话,空闲和响铃,考虑到本应用的需求,只需在通话过程中触发响应并获取来电人号码即可,最后通过短信的方式将其发送给安全号码。应用后台检测并响应短信接收广播的部分代码如下: