一种基于约定短信的微信远程移动监听和回传系统、方法与流程

文档序号:12133126阅读:614来源:国知局
一种基于约定短信的微信远程移动监听和回传系统、方法与流程

本发明涉及移动互联网领域,特别涉及一种基于安卓移动终端的短信监控系统以及实现方法。



背景技术:

在移动网络广泛覆盖和智能手机高度普及的时代,人们的生活方式为之改变。身处移动智能时代,人们不再受到时间和空间制约,可以随心所欲地与朋友交流联系,随时随地获取信息。在需要专业监控的工程领域,用户希望能够减少人力成本。“在任意时刻都能够查看到监视画面”,是大多数使用监控系统的客户的需求。另一方面,智能手机的迅猛发展与普及,使客户或多或少对手机产生了一定的依赖。手机一旦不在身边,客户很可能就错过一些重要的信息,给客户的生活造成麻烦。很多人“机不离手”,一旦离开手机,便感到无所适从,甚至产生了一种新的症状——手机恐慌症。

在安卓手机大行其道,视频监控进入3G移动时代,GPS不断小型化、成为智能手机的标准配备的背景下,将移动视频监控和GPS手机定位技术结合起来,以SMS作为控制和获取参数的媒介,以MMS作为监控视频的载体,开发安卓移动平台短信控制系统有着广泛的应用前景。

目前针对监控系统和手机依赖的需求,存在如下缺陷:

1)无法通过最小化人力成本,实时获取/查看监视画面,

2)无法在手机未进行携带时,及时提醒从而不错过重要的信息。



技术实现要素:

本发明要解决的技术问题是,1)通过手机对手机的短信控制视频监控,可以随时随地获取远程手机拍摄视频信息,结合手机GPS定位追踪,可以实现对远程手机位置、环境的实时监控;2)通过附加手机通讯状态访问,可以避免手机不在身边错过重要信息。3)通过将重要信息即时发送到指定微信账户,实现了无障碍、跨系统的远程监控和即时查看。

解决上述技术问题,本发明提供了基于约定短信的微信远程移动监听和回传系统,包括:监控端和被监控端,

所述被监控端被配置为,监听预置信息,并判断所述预置信息是否有进行过匹配;所述预置信息,作为存放于数据库中的至少包括:监听号码及预约短信内容的一条记录,

若所述预置信息为未进行过匹配,则获得短信内容和该条短信内容对应的发信人,并在所述数据库中进行匹配;

若所述预置信息为匹配过:监听号码授权且预约短信内容判断为监听短信时,则所述监控端按照设定的类型代码对应执行监控指令,完成监控。

更进一步,短信监控系统还包括:在判断所述预置信息是否有进行过匹配前:

根据上述该条短信内容对应的发信人获得发信号码,

将所述发信号码与所述数据库中预先注册的授权列表中的号码名单进行比对,

若与授权列表中的电话号码名单匹配,则发信人有权监听,监听状态位参数为真;

在存储注册用户手机号码表和/或注册用户监听密码表的数据库中检查监听状态位参数是否为真,若为真则将短信内容与所述注册用户监听密码表中的名单进行匹配,匹配成功后接受监听信息,

如果不匹配,则短信为普通短信。

更进一步,当所述被监控端接受监听短信之后,向监控端发送提示短信:

匹配成功,

和/或,回复1获取摄像头拍照照片,

和/或,回复2获取GPS坐标,

和/或,回复3获取未接来电信息,

和/或,回复4获取未查短信信息,

和/或,回复5获取联系人信息,

和/或,回复6取消监。

更进一步,所述被监控端还被配置为建立数据存储模块,

所述数据存储模块用以,基于SQLite数据库建立监听人和约定短信内容对应的字段,并执行SQL注册、查询、删除语句,在所述SQLite数据库中对采集的监听号码和/或约定短信数据进行增加、删除或者查询。

更进一步,所述被监控端还被配置为建立监听模块,

所述监听模块包括:短信匹配单元、Gps坐标读取单元、来电监听单元、短信监听单元、读取联系人单元、短信息发送单元;

所述短信匹配单元,用以获取来信号码和内容,并将来信号码和内容进行匹配,以及,判断确定来信号码与数据库存储的记录匹配,获取监听的权限;

所述GPS坐标读取单元,用以每隔一定的间隔获取一次被监控端的位置坐标,并以将GPS坐标以字符串作为短信内容回复给监听手机;

所述来电监听单元,用以判断来电标志位是否为真,如果为非真,则没有来电,如果为真,将来电状态以字符串作为短信内容回复给监听手机;

所述短信监听单元,用以获取监控端开启监控到被监控端接收对应执行监控指令阶段,所述被监控端收到所有的短信的内容和收到短信的时间;

所述读取联系人单元,用以调用安卓移动终端ContentProvider组件的API接口,获取得到对应联系人;

所述短信息发送单元,用以通过sendTextMessage()函数发送文字短信,并向所述监控端发送提示信息和回馈其它单元的查询结果数据。

更进一步,所述被监控端还被配置为建立自动拍照模块,

所述自动拍照模块用以开启视频监控,新建一个Camera类的对象用于拍照的同时调用一个延时函数:在设定的延时时间后,调用Camera类的拍照函数拍照,

以及,通过文件输出流,形成.jpg格式的照片,并把照片存放在指定路径的内置存储卡上。

更进一步,所述被监控端还被配置为建立后台彩信发送模块

所述彩信发送模块按照如下方式建立:

设置被监控端接入点信息,

判断Wi-fi是否启用,若启动则关闭Wi-fi网络,

获取当前的APN,并向监控端发送拍摄照片的彩信,实现对被监控端的图像监控。

更进一步,所述被监控端还被配置为,通过第三方接口,将监控的内容转发到指定的微信用户。为了实现这一点,我们可通过调用微信内嵌浏览器定义的一个私有JavaScript对象:WeixinJSBridge,通过操作这个对象的相关方法可以实现分享到微信好友,和判断一个微信号的关注状态以及实现关注指定微信号等功能。将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看。

基于上述,本发明还提供了基于约定短信的微信远程移动监听和回传方法,包括如下步骤:

监听预置信息,并判断所述预置信息是否有进行过匹配;所述预置信息,作为存放于数据库中的至少包括:监听号码及预约短信内容的一条记录,

开始监听,若所述预置信息为未进行过匹配,则获得短信内容和该条短信内容对应的发信人,并在所述数据库中进行匹配;

若所述预置信息为匹配过:监听号码授权且预约短信内容判断为监听短信时,则按照设定的类型代码对应执行监控指令,完成监控。

更进一步,方法还包括进一步安全认证步骤:

根据上述该条短信内容对应的发信人获得发信号码,

将所述发信号码与所述数据库中预先注册的授权列表中的号码名单进行比对,

若与授权列表中的电话号码名单匹配,则发信人有权监听,监听状态位参数为真;

在存储注册用户手机号码表和/或注册用户监听密码表的数据库中检查监听状态位参数是否为真,若为真则将短信内容与所述注册用户监听密码表中的名单进行匹配,匹配成功后接受监听信息,

如果不匹配,则短信为普通短信。

本发明的有益效果:

本发明中的一种基于约定短信的微信远程移动监听和回传系统,能够实现短信控制视频监控,GPS定位、手机状态查询等功能,最后将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看。

本发明中的基于约定短信的微信远程移动监听和回传方法,以文字短信、彩信为媒介,通过授权号码向被监控端的Android手机认证短信的方式,获取远程手机的相关信息,最后将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看,从而达到远程监控的目的。

附图说明

图1是本发明中一个实施例的系统交互过程示意图。

图2是图1中的进一步优选步骤交互示意图。

图3是本发明中一个实施例的实现方法流程示意图。

图4是图3中的进一步优选流程示意图。

具体实施方式

现在将参考一些示例实施例描述本公开的原理。可以理解,这些实施例仅出于说明并且帮助本领域的技术人员理解和实施例本公开的目的而描述,而非建议对本公开的范围的任何限制。在此描述的本公开的内容可以以下文描述的方式之外的各种方式实施。

如本文中所述,术语“包括”及其各种变体可以被理解为开放式术语,其意味着“包括但不限于”。术语“基于”可以被理解为“至少部分地基于”。术语“一个实施例”可以被理解为“至少一个实施例”。术语“另一实施例”可以被理解为“至少一个其它实施例”。

可以理解,在本申请中的基于安卓移动终端,Android应用通常由一个或多个基本组件组成,Android提供的四大组件分别是:Activity组件、Service组件、Broadcast Receiver组件以及Content Provider组件,其中Activity组件负责与用户交互,相当于应用程序的一个用户界面[30]。Service用于提供后台服务,Broadcast Receiver负责接收广播消息,Content Provider为跨应用的数据交换提供标准。任何Android软件系统的构建都离不开这4个组件。

Activity负责与用户交互,在Android程序中,Activity代表手机的一个界面。如果把手机比喻成一个浏览器,Activity就相当于一个网页。有的程序只有一个Activity,有的可以包含多个Activity。数目取决于应用程序的功能设计。一般情况下,总有一个Activity是用户启动程序后首先看到的。有时有多个用户界面需要启动,则这些Activity就组成一个栈,当前活跃的Activity在栈顶,由当前界面跳转到下一个界面。每个Activity都被分配一个窗口进行绘制。窗口由一系列视图组成,这些视图全都继承自View类。View组件是Android应用中实实在在看到的部分,每个View组件均控制着界面中一块特定的矩形区域,在这些矩形中绘制并响应用户的操作。View组件是用户实实在在看到的部分,但View组件必须要放在容器中才能显示出来,如果需要通过某个Activity把特定的View组件显示出来,需要调用Activity.setContentView()函数。一般一个Android应用是由多个Activity组成的。在多个Activity之间可以进行相互跳转,例如,通过按下一个按钮后,跳转到其它的Activity,该跳转可以设置返回值,这样在很多时候是相当方便的。

Service也是一个十分重要的Android组件,它与Activity的区别是:它没有图形界面,不与用户交互,常常运行在后台,比如在用户使用其它Android应用时,在后台采集GPS坐标、播放音乐或者计算Activity组件需要的数据的服务时,可以用到Service组件。与Activity一样,Service组件需要继承Service基类、Service组件运行时有独立的生命周期。

BroadcastReceiver是另一个重要的应用组件,如它的字面意思,它是一个广播消息的接收器。在Android系统中,有许多来自于系统内部的广播消息,比如:收到短信、电池电量过低等等,应用程序可以拥有任意数量的广播接收器来对广播的信息作出响应。从代码的实现来看,BroadcastReceiver类似于事件监听器Listener。两者之间不同的是:事件监听器监听的是程序内的对象,而BroadcastReceiver监听的是Android程序中的其它组件。通过在BroadcastReceiver的子类中,改写onReceive(Context context,Intent intent)函数来实现。通过在该函数中使用intent.getAction()获取广播中的意图进行判断,如果是制定的意图,则对广播进行响应。

ContentProvider的作用是将特定的应用程序数据提供给其它的应用程序使用。在Android应用中的各个组件相互独立,各自运行在自己的Dalvik虚拟机中,如果需要在不同应用程序中进行实时的数据交换,比如:一个应用程序需要从联系人管理应用中读取指定联系人的数据,就需要使用Android为跨应用数据提供的标准——ContentProvider。通常在使用过程中需要继承ContentProvider基类,其为别的应用程序读取和管理数据提供了一系列标准的方法。其它应用程序使用ContentResolver对象来调用这些方法,即:一个应用程序用ContentProvider来暴露自己存储的数据,另一个程序使用与之相对应的ContentResolver来访问这些数据。

可以理解,SQLite数据库的存储实现。它是Android系统数据库,通过研究数据库文件和数据表的创建方法以及数据库的操作函数来实现对数据的创建、读取、增加、删除和查询。

在本申请中,还涉及U I界面的设计:按照本申请的实现目标和运行流程,本申请共设计三个界面,分别是:主界面、注册信息显示界面和拍照界面。主界面负责接收用户输入的授权号码、约定密码、待删除的授权电话号码以及对注册按钮、查询按钮、删除按钮和监听按钮的点击动作;注册信息显示界面主要负责显示包含所有已经注册的授权号码和监听密码的列表;拍照界面负责显示摄像头的实时图像。

主界面:授权号码静态文本,组件类型:TextView,用途:显示“电话号码”文字的静态文本。

主界面:授权号码编辑框,组件类型:EditText,用途:接收用户输入的电话号码信息。

主界面:约定密码静态文本,组件类型:TextView,用途:显示“密码”文字的静态文本。

主界面:约定密码编辑框,组件类型:EditText,用途:接收用户输入的密码。

主界面:注册按钮,组件类型:Button,用途:接收用户对注册按钮的点击事件。

主界面:查询按钮,组件类型:Button,用途:接收用户对查询按钮的点击事件。

主界面:删除按钮,组件类型:Button,用途:接收用户对删除按钮的点击事件。

主界面:监听按钮,组件类型:Button,用途:接收用户对监听按钮的点击事件。

1.主界面的实现,界面的设计通过在Eclipse中Android项目的res/layout目录下创建、编辑XML文件来实现。本文中的主界面通过新建Android项目,在该目录下修改main.xml文件实现。方法是在EclipsePackage Explorer中双击该文件,在工作区中修改xml文件的代码。主界面采用TableLayout表格布局形式,这种布局的特点是采用行、列的形式管理UI控件,通过添加TableRow来控制表格的行数。将表格布局中的android:orientation参数设为“vertical”即将布局中的TableRow容器和组件从上到下垂直排列。然后表格布局中添加表行容器和各组件,具体的步骤是:

(1)在表格布局中添加第一个表行容器,容器里包含授权号码的静态文本和编辑框。xml文件中包含多个节点,每个xml节代表了实现不同功能的信息[42]。本文是在<TableLayout..>和</TableLayout>节点之间添加TableRow容器,然后在<TableRow>和</TableRow>之间添加静态文本TextView组件,内部参数设为android:text="电话号码:",由于Android关闭了该组件的文字编辑功能,因此它显示的内容为“电话号码:”的静态文本;然后再添加一个EditText组件,参数设为android:d="@+id/num"。通过该参数,为电话号码文本编辑框组件分配了名为“num”的标识符,Android会在R.java的id内部类中给num赋予一个十六进制的数据,以后Java代码中可以用findViewById(R.id.num)语句来获取该组件的数据。TableRow容器使得每在其内部添加一个组件,就在同一行增加一个列,因此在第一行增加的TextView、EditText两个组件在同一行并列。

(2)以相同的方式在表格布局中再增加两个TableRow容器,由于表格布设为垂直排列,新添加的表行容器位于在第二、三行。与步骤(1)采取相同的方法,在第二个表行容器中添加TextView、EditText两个组件,其中TextView设定参数android:text="密码:",EditText设定参数为android:id="@+id/psw"。第三行表格容器中也用相同的方法添加参数为android:text="删除号码:"的TextView组件和参数为android:id="@+id/key"的EditText组件。

(3)在表格布局中TableRow外添加Button组件,由于布局界面的排序方式为垂直方式,该组件在布局中单占一行,位于第三行。将其内部参数设为android:id="@+id/insert",android:text="注册",表格字符为“注册”,赋予的标识符为“insert”。

(4)再按照相同的方式在表格布局外添加查询按钮组件,参数设为android:id="@+id/search",android:text="查询";添加删除按钮组件,参数为android:id="@+id/delete",android:text="删除";添加监听按钮组件,设置参数为android:id="@+id/listen",android:text="开始监听"。

这样在界面上就设置了三组文本编辑框和四个按钮,通过在主程序中采集数据和添加逻辑代码即可实现数据的注册、删除查询、监听功能。本文在主界面还增加了一个测试按钮,参数为android:id="@+id/test",android:text="测试"在测试按钮相关联源文件对应的函数中添加代码可以实现自定义的测试功能。

2.注册信息显示界面的实现,本申请的注册信息显示界面采用ListView列表组件来实现,该组件在Android系统中的应用非常广泛,通过垂直的方式显示所有的列表项。本文用它来显示所有经过注册的授权号码和约定密码对。注册信息显示界面布局的创建通过在res/layout目录下新建、编辑popup.xml来实现。该xml采用LinearLayout线性布局,android:orientation参数设为"vertical",即该布局所有的组件垂直向下依次排列。在<LinearLayout..></LinearLayout>之间添加<ListView../>组件,android:id参数设为"@+id/show",即给ListView组件分配名称为show的标识符,方便源文件的调用。

文件获得了ListView组件后,需要给ListView设置其需要显示的列表项,本文中ListView组件的列表项是一个线性布局,即列表中每一行的内容都是一系列垂直排列的组件。该线性布局通过在res/layout目录中新建编辑line.xml文件实现,在线性布局中依次填入android:text="监听人号码"的TextView组件,android:id="@+id/num"的EditText组件,android:text="密码"的TextView组件和android:id="@+id/psw"的EditText组件。通过源文件中的Adapter适配器将表项绑定到列表视图,并通过程序赋予列表项中编辑框的内容即可实现显示界面的内容。

3.拍照界面的显示,拍照界面的设计通过向res/layout目录下新建编辑cameramain.xml布局文件来实现,具体的做法是:该布局采用帧布局,帧布局内添加参数设置为android:id="@+id/Surface"的SurfaceView来实现。

以上三个界面构成了系统与界面的人机交互接口,在实现上本文采用编辑对应布局文件文档的方式实现。Eclipse也为开发人员提供了所见即所得的图形开发界面,通过把各组件像搭积木一样拖入界面,简单设置组件的参数即可完成界面布局的实现。

可以理解,本申请中的系统的划分方法主要是根据自顶向下的顺序,直接接触的的是用户界面层,即UI层。该层主要的功能是实现人机交互。包含的功能有:响应用户的点击和输入动作,显示已经注册的授权号码以及授权号码对应的查询密码,显示系统的实时状态等。在用户界面层和Android系统以及底层数据库之间的是功能实现层。该层主要实现监听匹配、判断处理和信息反馈三个功能子模块。其中,监听匹配模块负责提取、分析收到的监听短信的号码和内容将其与数据库授权列表中的注册信息进行匹配;判断处理模块负责根据监听匹配模块的处理结果,如果匹配成功,则根据监听手机发送来的查询代码,分别调用GPS监听模块、短信监听模块、联系人检索模块、来电监听模块、后台拍照模块,提取这些模块的结果数据,传递给信息反馈模块;信息反馈模块通过调用彩信发送模块将摄像头拍摄的图片信息回复给监听手机,通过文字短信发送模块,将其它数据信息回复给监听手机。

在功能实现层以下是数据库,它负责存储、维护注册用户手机号码和注册用户约定密码信息列表,向UI层和功能实现层提供数据维护服务。

请参考图1是本发明中一个实施例的系统交互过程示意图,本实施例中的基于约定短信的微信远程移动监听和回传系统,包括:监控端和被监控端,所述被监控端被配置为,监听预置信息,并判断所述预置信息是否有进行过匹配;所述预置信息,作为存放于数据库中的至少包括:监听号码及预约短信内容的一条记录,若所述预置信息为未进行过匹配,则获得短信内容和该条短信内容对应的发信人,并在所述数据库中进行匹配;若所述预置信息为匹配过:监听号码授权且预约短信内容判断为监听短信时,则所述监控端按照设定的类型代码对应执行监控指令,完成监控。如所示图2是图1中的进一步优选步骤交互示意图,作为本实施例中的优选,还包括:在判断所述预置信息是否有进行过匹配前:根据上述该条短信内容对应的发信人获得发信号码,将所述发信号码与所述数据库中预先注册的授权列表中的号码名单进行比对,若与授权列表中的电话号码名单匹配,则发信人有权监听,监听状态位参数为真;在存储注册用户手机号码表和/或注册用户监听密码表的数据库中检查监听状态位参数是否为真,若为真则将短信内容与所述注册用户监听密码表中的名单进行匹配,匹配成功后接受监听信息,如果不匹配,则短信为普通短信。作为本实施例中的优选,当所述被监控端接受监听短信之后,向监控端发送提示短信:匹配成功,和/或,回复1获取摄像头拍照照片,和/或,回复2获取GPS坐标,和/或,回复3获取未接来电信息,和/或,回复4获取未查短信信息,和/或,回复5获取联系人信息,和/或,回复6取消监。作为本实施例中的优选,所述被监控端还被配置为建立数据存储模块,所述数据存储模块用以,基于SQLite数据库建立监听人和约定短信内容对应的字段,并执行SQL注册、查询、删除语句,在所述SQLite数据库中对采集的监听号码和/或约定短信数据进行增加、删除或者查询。

上述监控端和被监控端的交互过程如下:

STEP1:注册界面作为入口界面,设置“监听者密码”、“约定短信内容”、“删除号码”等UI控件,负责采集相应字符串内容,增加“注册”、“查询”、“删除”等按钮,接收Click事件,实现监听号码和约定短信内容的增、删、查。

STEP2:建立SQLite数据库,建立监听人和约定短信内容对应的字段。在点击注册界面上的“注册”、“查询”、“删除”等按钮后,执行SQL语句,实现在数据库中对采集的监听号码、约定短信数据的增加、删除和查询。

STEP3:当点击注册界面的“监听”按钮后后,对数据库中存储的所有监听号码——约定短信内容记录进行遍历提取,封装在Buddle对象中,通过Intent对象传递给监听模块。监听模块是BroadcastReceiver组件的派生类,在该类内用onReceive()函数监听。

STEP4:由另一台手机向监听端手机发送一条短信,内容为已经在SQLite数据库中注册号好的约定短信。

STEP5:判断短信的发信号码和内容是否与数据库中的记录匹配过。

STEP6:若没有匹配过,则进行提取、匹配。手机短信的一般构成包含短信中心号码、对方号码和短信息内容三部分。目前PDU(协议数据单元)模式已经逐步成为主要用来发送和接收SMS信息的方式[38],因此从获得短信的PDU中获取发信人的手机号码和所发信息的内容,再分别与SQLite数据库中表里的记录逐条比对,若发送号码与内容与其中的一条记录中的内容完全匹配,则将匹配参数置为TRUE。

STEP7:通过监听模块向来信手机发送提示短信,内容为“匹配成功,回复1获取视频监控,2获取GPS坐标,3获取未接来电,4获取未查短信,5获取指定联系人,6重置”。

STEP8:根据提示短信回复想要查询内容的类型代码。

STEP9:若来信号码已经匹配过,则根据类型号码调用指定模块。由指定模块提取相关数据,向监控手机发送相关数据。

STEP10:若代码为1,开启视频监控,调用拍照模块,新建一个Camera类的对象用于拍照,调用一个延时函数,延时一段时间(比如5秒)后,调用Camera类的拍照函数拍照。通过文件输出流,形成jpg格式的照片,并把照片存放在指定路径的内置存储卡上。

STEP11:调用彩信模块,彩信模块从存储卡上读取照片,向监控手机发送彩信。

STEP12:最后将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看。

STEP13:若代码为6,则将匹配标志参数置为FALSE,使来信重新匹配。

作为本实施例中的优选,所述被监控端还被配置为建立监听模块,所述监听模块包括:短信匹配单元、Gps坐标读取单元、来电监听单元、短信监听单元、读取联系人单元、短信息发送单元;所述短信匹配单元,用以获取来信号码和内容,并将来信号码和内容进行匹配,以及,判断确定来信号码与数据库存储的记录匹配,获取监听的权限;所述GPS坐标读取单元,用以每隔一定的间隔获取一次被监控端的位置坐标,并以将GPS坐标以字符串作为短信内容回复给监听手机;所述来电监听单元,用以判断来电标志位是否为真,如果为非真,则没有来电,如果为真,将来电状态以字符串作为短信内容回复给监听手机;所述短信监听单元,用以获取监控端开启监控到被监控端接收对应执行监控指令阶段,所述被监控端收到所有的短信的内容和收到短信的时间;所述读取联系人单元,用以调用安卓移动终端ContentProvider组件的API接口,获取得到对应联系人;所述短信息发送单元,用以通过sendTextMessage()函数发送文字短信,并向所述监控端发送提示信息和回馈其它单元的查询结果数据。

监听模块

短信匹配单元中的短信的匹配

1.1获取来信号码和内容

当用户在开始界面点击“监听”按钮,产生点击事件,触发“监听”按钮对象上绑定的OnClickListener监听器,从而运行SmsReceiver.java文件,进入监听状态。本文创建的SmsReceiver继承自BroadcastReceiver。在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制。Android四大组件中的BroadcastReceiver是一种全局性的监听器,可以非常方便地实现不同组件之间的相互通信,它用于接收程序所发出的Broadcast Intent。Intent的中文意思是“意图”,在Android系统中,一个组件通过Intent启动另一个组件,通俗的说,Intent就是告诉系统“某人将要怎样做某事”。本系统中,SmsReceiver是BroadcastReceiver的子类,每次Broadcast事件发生后,就调用该类中的onReceive函数。SmsReceiver类的功能是对手机接收短信事件进行监听,并对收到的短信进行判断,调用相应模块进行处理。当手机接收到短信时就会广播内容为"android.provider.Telephony.SMS_RECEIVED"的消息。

在SmsReceiver类的onReceive函数中加入if语句,使用getAction()获取广播事件的意图动作,如果动作为"android.provider.Telephony.SMS_RECEIVED",说明手机收到一条短信。

PDU是用来发送和接收SMS的主要方式,通过在程序中使用createFromPdu()函数,将收到的pdu(协议数据单元)转化为SmsMessage对象。再通过getDisplayOriginatingAddress()函数将获得的来信电话号码存放在strsbPhone变量中,通过getDisplayMessageBody()函数将获得的短消息的文本内容存放在strsbPsw字符串变量中。

1.2.将来信号码和内容进行匹配

取得来信号码和内容后进行匹配,即将电话号码和短信内容与数据库中存储的授权号码和密码逐一比对。本文采取的方法是获取数据库数据表中所有记录,将记录中的授权号码phone字段中的所有数据按照主键的顺序存入一个名为strNum的字符串数组中,由于若匹配成功则将定义为boolean类型的匹配标志变量bMatch置为“true”,用Toast在屏幕显示“匹配成功”,向来信手机号码发送一条提示短信。

1.3.判断处理

当通过监听判断功能模块确定来信号码与数据库存储的记录匹配,也即说明来信的号码和发来的内容已经在系统中注册过,该来信号码是可以被信任的,有权限监听的。因此向该号码发送一条文字短信,告知对方已经匹配成功,询问对方需要获取哪些数据,短信内容为“匹配成功,回复1监控,回复2获取手机位置,回复3获取未接电话,回复4获取新来短信,回复5查询指定号码,回复6取消匹配。”对方收到该提示短信后,会发来一条代码短信来表达需要监听的类型。当手机再次接收到短信,就会再次调用onReceive函数,通过提取来信对方的电话号码和短信内容,如果来信号码为刚才匹配的号码,匹配标志位为“true”则用switch语句依据短信内容选择相应的功能模块分支。

2.Gps坐标读取单元中的Gps坐标读取

当监听手机发送的代码短信内容为字符“2”,则调用GPS监听模块。该模块的程序在入口类spy中完成,主要功能是在监听程序启动后,依据系统时钟每隔一定的间隔即获取一次Android手机的位置坐标。Android四大组件中的Service是与Activity最相似的组件,它们都代表可执行的程序,但Service没有UI界面,在后台运行。Android提供了大量的系统服务,开发者可以通过getSystemService()来获取指定名称的系统服务。一旦获取了特定的服务,便可利用其中的工具函数实现开发者的开发目的。

本申请就通过调用getSystemService(Context.LOCATION_SERVICE)函数获取Android提供的定位服务,获得Android系统为支持GPS定位功能专门提供的LocationManager类,Android的定位服务都通过该类的对象产生,通过调用该类提供的各个函数即可获取系统的GPS服务。常用的函数有:

boolean addGpsStatusListener(GpsStatus.Listener listener);添加GPS监听器。

GpsStatus getGpsStatus(GpsStatus status);取得GPS状态。

Location getLastKnownLocation(String provider);根据GPS的提供者获取最后一次已知的Location。

LocationProvider getProvider(String name);获取指定的LocationProvider。

void requestLocationUpdates(String provider,long minTime,float minDistance,LocationListener listener);根据指定的provider和最小距离分辨率,在指定的时间内触发指定的监听器。等等。

本申请在使用getSystemService()函数获得LocationManager的对象后,通过其调用requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,8,newLocationListener()函数,该函数是根据GPSprovider以3秒为周期,以8米为最小距离周期性地更新手机位置,并触发LocationListener监听器。在函数体中,重写onLocationChanged函数,当获取的Location非空时,更新Location对象,并建立一个StringBuilder,通过appen()函数,逐次加入“实时的位置信息:\n”、“经度:”字符串,然后通过用getLongitude()函数,获取Location对象中的经度信息,并用appen()函数附加到StringBuilder之后,再使用相同的方法在StringBuilder添加“\n纬度:字符串、Latitude()函数获得的纬度信息、“\n高度:”字符串、getAltitude()函数获得的高度信息。这样StringBuilder.toString()即为系统获得的GPS信息的字符串。当Location对象为空时,则将GPS字符串置为“坐标获取中”。最后GPS模块时将该字符串作为短信内容回复给监听手机,即完成了对手机位置的监听。

3.来电监听单元中的来电监听

当采集的短信内容为字符“3”,调用来电监听模块。手机通话状态的管理依靠Android提供的TelephonyManager服务类,与GPS监听模块中获取LocationManager服务类的方法相同,来电监听模块也通过调用getSystemService

(Context.TELEPHONY_SERVICE)函数来获取TelephonyManager。获取到该管理器后,可以调用管理器类提供的大量getX()函数来获取电话的相关信息。

本申请的来电监听模块的程序在主程序spy.java中实现。首先创建一个PhoneStateListener,它是一个通话监听器,通过调用监听器内部的onCallStateChanged(int state,String incomingNumber)函数来对被监控端的Android手机不同来电状态作出不同的响应。其中参数state是一个整形变量,代表来电的状态代码。incomingNumber字符串则代表来电的电话号码。重写该函数,在函数体中加入switch(state)分支函数,根据来电状态state的不同数值进行不同处理。

当state的值为TelephonyManager.CALL_STATE_IDLE时,表明被监控端的Android手机处于空闲状态,用break语句跳出分支。

当state的值为TelephonyManager.CALL_STATE_OFFHOOK时,手机处于摘机状态,用break语句跳出分支。

当state的值为TelephonyManager.CALL_STATE_RINGING时,表明手机处于来电状态,此状态正是本系统模块需要监听的状态,在该分支下调用sbIncoming.append(new Date()+"来电:"+incomingNumber)语句,将此时时间、来电号码incomingNumber附加到储存来电信息的StringBuilder静态变量sbIncoming中,并将代表来电标志位的boolean型变量bIncoming置为true。

本模块函数和GPS监听模块等状态监听模块一同位于主程序spy.java的onCreate创建函数中。监听系统开始运行、调用主程序中的创建函数监听模块即开始运行,不断获取更新存储在静态变量中的系统状态,当监听匹配模块匹配成功,按照对方回复的监听代码调取相应的状态监听模块时,该模块即把存储在静态变量中的数值以短信的方式发送给对方。

在来电监听模块被调用时,判断来电标志位bIncoming是否为true,如果为false,表示没有来电,则回复没有来电内容的短信,如果为true,则将包含sbIncoming.toString()字符串内容的短信回复给对方,完成来电状态的查询。实现对手机来电记录的监听。

4.短信监听单元中的短信监听

当采集的短信内容为字符“4”,调用未查短信监听模块。本文中的短信监听的目的是:当被监控端的Android手机不在身边时,获取从系统开启到被监控端的Android手机收到监听手机回复的短信监听代码阶段被监控端的Android手机收到所有的短信的内容和收到短信的时间,从而避免被监控端的Android手机的机主遗漏重要信息。从目的来看,被监控端的Android手机获取的短信当然不包括监听手机发来的匹配短信和代码短信。其具体的实现方法是:在系统的短信监听文件SmsReceiver.java中添加相关代码。在onReceive()函数外新建一个boolean型变量bMatch作为监听手机是否处于匹配状态的标志位,默认值设为false。当手机接到短信后,即进入短信匹配阶段。监听匹配模块分离、提取短信的手机号码和短信的内容,将号码和内容与数据库中的记录进行比对,若来信号码与数据库中的记录匹配,则将bMatch置为true。如果不匹配,也即说明该来信是监听匹配手机以外的号码或者是监听号码在非监听阶段发来的短信,这时将分离出的短信内容记录下来,与new Date()获取的时间一起存入字符串中,就形成了一次来信记录,将未查短信记录字符串用append函数不断附加就形成了完整的来未查短信记录,相关语句如下所示:

sbOtherMsg.append("短信来源:");

sbOtherMsg.append(strsbPhone);

sbOtherMsg.append("\n--------短信内容--------\n");

sbOtherMsg.append(strsbPsw);

sbOtherMsg.append("\n--------------------------\n");

其中sbOtherMsg为一个StringBuilder变量,用来存放来信内容;strsbPhone为短信监听程序当bMatch为false,也就是非监听模式下分离出的来信号码存放的StringBuilder变量;strsbPsw为非监听模式下分离出的来信内容。最后短信监听模块将sbOtherMsg以字符串的形式回复给监听手机,实现对手机未查短信记录的监听。

5.读取联系人单元中的读取联系人

当采集的短信内容为字符“5”,调用未查短信监听模块。该模块用到了Android四大组件的ContentProvider组件。它是不同应用程序之间进行数据交换的标准API,是一个对外提供数据的接口。当一个应用程序需要把自己的数据暴露给其他程序使用时就可通过ContentProvider实现,其他程序通过ContentResolver来操作其暴露的数据。可以把ContentProvider理解成一个网站,把ContentResolver理解成一个网络客户端。ContentResolver像客户端通过网址访问网站一样通过Uri来访问ContentProvider。Android系统提供了许多供开发人员访问的ContentProvider。开发者在访问时使用getContentResolver即可获取ContentResolver对象,然后通过其提供的函数来操作数据。本文用到的函数是query(Uri uri,String[]projection,String selection,String[]selectionArgs,String sortOrder);该函数用来查询指定Uri对应的ContentProvider按照指定条件提供的数据。其中uri是查询目标数据的地址;projection用于标识uri中有哪些列需要包含在返回的Cursor中;selection是用于查询数据的过滤,相当于SQLwhere语句的查询条件;selectionArgs是查询条件参数,配合selection参数使用;sortOrder代表按照projection指定的列进行排序的方式。

当调用该模块后,被监控端的Android手机向监听号码自动回复一条提示短信,内容为“请回复需要查询联系人的姓名”。对方回复需要查询的联系人后,短信监听模块将来信分离,将短信内容存放在字符串变量strsbPsw中。这时在联系人监听模块中建立一个Cursor对象cursorCont,它的值为函数getContentResolver().query(

ContactsContract.Contacts.CONTENT_URI,null,null,null,null)的返回值。其中ContactsContract.Contacts.CONTENT_URI是电话联系人的Uri。通过以上函数就获得了手机中的所有联系人。然后通过while(cursorCont.moveToNext){}遍历该Cursor对象。在while函数中新建存储遍历姓名的字符串变量strCont;然后将strCont与存放监听手机回复的查询姓名的变量strsbPsw进行比较,如果strCont.equals(strsbPsw)为真,说明strCont存储的联系人即为监听手机需要查询号码的联系人。再通过该联系人id获取联系人的电话,id在联系人列表中是唯一的。在if函数中创建联系人id字符串变量strId,;然后通过id获取电话号码列表,因为同一个联系人可以存放多个号码。新建Cursor对象cursorPhone,这样就获取了待查联系人的电话号码列表。再为存储查询号码的StringBuilder变量,遍历完成后将StringBuilder.toString()发送给监听手机,实现联系人检索功能。

6.短信息发送单元中的短信息发送

本文实现的系统是基于Android的短信监控系统,短信作为监听的手段和监听命令、回馈手机状态的载体,除传递图像信息外,均采用文字短信的方式。用来发送短信息的管理器SmsManager与TelephonyManager和LocationManager一样,也是Android系统提供的服务,它提供了形如sendXXMessage()的函数来发送短信。本文使用该类提供的sendTextMessage()函数发送文字短信。通过该函数向监听手机发送提示信息和回馈各模块的查询结果数据。例如:通过以下语句向监听手机发送未接来电内容信息。

SmsManagersManager;

sManager=SmsManager.getDefault();

sManager.sendTextMessage(strsbPhone,null,strIncoming,pi,null);}

首先以默认的方式建立一个SmsManager类的对象sManager,然后通过其调用sendTextMessage()函数来发送文字短信。sendTextMessage()函数的原型为:

voidsendTextMessage(StringdestinationAddress,String scAddress,Stringtext,PendingIntent sentIntent,Pending Intent delivery Intent);其中各参数的含义是:

destinationAddress:目标地址,即要发送的手机号码;

scAddress:短信服务中心,本文中都为null,代表当前默认的短信服务中心;

text:发送短信的内容;

sentIntent:当消息发出时,成功或者失败的信息报告通过PendingIntent来广播。如果该参数为空,则发信程序会被所有位置程序检查一遍,这样会导致发送时间延长。

deliveryIntent:当消息发送到收件人时,该PendingIntent会被广播。

在一些实施例中,所述被监控端还被配置为建立自动拍照模块,所述自动拍照模块用以开启视频监控,新建一个Camera类的对象用于拍照的同时调用一个延时函数:在设定的延时时间后,调用Camera类的拍照函数拍照,以及,通过文件输出流,形成.jpg格式的照片,并把照片存放在指定路径的内置存储卡上。所述自动拍照模块在当采集的短信内容为字符“1”,调用后台拍照模块。该功能主要自动调用手机摄像头进行拍照,将拍摄的照片存储在手机指定位置,再调用后台彩信发送模块发送给来信手机,实现对手机周围状况的监控。当调用该模块时用Intent方法启动负责后台拍照的文件CameraActivity.java。具体代码为:

Intent intent1=new Intent(context,CameraActivity.class);

context.startActivity(intent1);

拍照模块的界面布局文件通过在Android的res/layout文件夹下建立cameramain.xml实现。在cameramain.xml上加入SurfaceView控件用于显示摄像头画面。SurfaceView可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。本文用于拍照的文件为CameraActivity.java。在该类中使用setContentView(R.layout.cameramain);语句调用拍照页面布局,通过(SurfaceView)this.findViewById(R.id.Surface)语句取得拍照页面布局的SurfaceView组件对象,对其调用getHolder()函数完成SurfaceView组件的参数设定。

Android提供了Camera类来控制拍照。在该类中建立Camera类的对象camera,通过调用camera.takePicture()函数进行拍照。在本系统中拍照界面是自动弹出的,由于实际运行中Android手机从主界面跳转到拍照界面、拍照界面开启摄像头、自动按下快门、存储图片都需要一定的时间,如果跳转到拍照界面直接调用takePicture()函数拍照,拍照之后马上跳转到彩信发送模块会导致拍照失败。因此本文采取Handler消息传递机制,通过在多线程中调用延迟函数、发送消息来调用takePicture()拍照函数函数和彩信发送模块,从而解决以上问题,采用的语句为:

以上代码在新线程中加入了两个sleep()延迟函数,设定延迟5秒以后发送指定值为0x1233的消息启动拍照函数,再延迟8秒后发送指定值为0x1234的消息启动名为MMSTest1Activity的彩信发送界面。

另外,Camera类的takePicture()函数包含3个参数,其中第3个参数是一个PictureCallback对象,当程序获取了拍照所得的图片数据后,PictureCallback对象将被回调,当拍摄事件发生,便会将图片以byte[]的方式存档。

在一些实施例中,所述被监控端还被配置为建立后台彩信发送模块,所述彩信发送模块按照如下方式建立:设置被监控端接入点信息,判断Wi-fi是否启用,若启动则关闭Wi-fi网络,获取当前的APN,并向监控端发送拍摄照片的彩信,实现对被监控端的图像监控。后台彩信发送模块具体建立方法如下:

对短信监控系统的运行手机接入点的设定值为:

名称:MMSC

Apn:Uniwap

MMSC:http://mmsc.myuni.com.cn

MMSproxy:10.0.0.172

port:80

ApnType:mms

由于被监听的手机完全处于无人值守状态,而Android根本就没有提供后台发送彩信的接口。作者查询大量资料,发现一般教科书讲述的发彩信的方法均是调用Android系统自带的彩信界面,进入彩信发送界面后需要人为输入彩信相关信息和点击发送按钮,无法达到系统实时视频监控的要求。因此,本文采用Android提供的彩信工具包,包括com.google.android.mms、com.google.android.

mms.pdu、com.google.android.mms.uil,自行开发后台彩信发送程序。建立一个名为MMSTestActivity.java的文件,负责彩信的后台发送。

首先,通过getSystemService(Context.WIFI_SERVICE)函数获得WifiManager对象。如果WifiManager的isWifiEnabled()返回值为真,表示Wifi启用,由于发送彩信需经过移动蜂窝网络,因此调用WifiManager的setWifiEnabled()函数将其参数设为false,关闭Wifi网络。然后通过调用getSystemService(Context.CONNECTIVITY_SERVICE)获取ConnectivityManager对象。ConnectivityManager主要管理和网络连接相关的操作。在通过调用该对象的getNetworkInfo(

ConnectivityManager.TYPE_MOBILE)函数,获取NetworkInfo对象,调用该对象的getExtraInfo()函数获取当前的APN。APN即“接入点名称”,无论使用联通3G还是移动2G网络,都必须通过手机APN设置,是手机上网时必须配置的参数。中国联通的2G业务WAP浏览器中使用的APN为“UNIWAP”,3G业务WAP浏览器使用的APN为“3GWAP”本文实验的被监控端的Android手机使用联通网络,因此之后获得的当前APN等于“uniwap”时才启动彩信发送函数。彩信发送函数中,构造MMSInfo对象,设置其目的号码为请求发送视频监控的短信号码,文件路径为存储拍摄照片的路径。通过sendMMS()函数向监控手机发送拍摄照片的彩信,实现对被监控端的Android手机的图像监控。

在一些实施例中,所述被监控端还被配置为,通过第三方接口,将监控的内容转发到指定的微信用户。考虑到目前绝大多数C端用户都安装有腾讯的微信,同时短信和彩信也经常会被手机卫士等软件所拦截和屏蔽,因此我们需要进一步将所有信息转发到指定的微信用户,以实现无障碍的跨系统远程移动监听、回传和即时查看。为了实现这一点,我们可通过调用微信内嵌浏览器定义的一个私有JavaScript对象:WeixinJSBridge,通过操作这个对象的相关方法可以实现分享到微信好友,和判断一个微信号的关注状态以及实现关注指定微信号等功能。将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看。

图3是本发明中一个实施例的实现方法流程示意图,步骤S300监听预置信息,并判断所述预置信息是否有进行过匹配;所述预置信息,作为存放于数据库中的至少包括:监听号码及预约短信内容的一条记录,步骤S301开始监听,若所述预置信息为未进行过匹配,则获得短信内容和该条短信内容对应的发信人,并在所述数据库中进行匹配;步骤S302若所述预置信息为匹配过:监听号码授权且预约短信内容判断为监听短信时,则按照设定的类型代码对应执行监控指令,完成监控。在本实施例中的基于Android移动终端的短信监控系统,该系统安装运行环境为Android2.0以上系统,与外界交互的形式是手机文字短信和彩信。通过在被监听的Android移动终端上安装该系统,在系统内注册具有监听权限的电话号码和约定的监听密码,当有权限的监控端(手机)发送约定好的监听密码时,系统进行认证匹配,若匹配成功则回复提示信息,询问对方要查询哪些内容并赋予对方查询代码,被监控端的Android手机接到对方再次发来的查询代码后完成拍照、采集手机位置、未接来电、未查短信、联系人等内容,通过回复彩信、短信的方式,实现对被监控端的Android手机的远程监控。最后将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看。通过以上步骤实现的技术效果至少包括,经过系统授权的远程终端(手机)以发送和接收短信的方式,对装有本监控系统的Android手机的摄像头、位置坐标、未接来电、未查短信等进行有安全审核的监控,从而实现对被监控端的Android手机状态信息的远程监听与控制。最后将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看。

图4是图3中的进一步优选流程示意图,还包括进一步安全认证步骤:步骤S400根据上述该条短信内容对应的发信人获得发信号码,步骤S401将所述发信号码与所述数据库中预先注册的授权列表中的号码名单进行比对,步骤S402授权列表中的电话号码名单是否匹配?步骤S403若与授权列表中的电话号码名单匹配,则发信人有权监听,监听状态位参数为真;步骤S404在存储注册用户手机号码表和/或注册用户监听密码表的数据库中检查监听状态位参数是否为真,步骤S405若为真则将短信内容与所述注册用户监听密码表中的名单进行匹配,匹配成功后接受监听信息,步骤S406如果不匹配,则短信为普通短信。当被监控端的Android手机不在身边时,用户使用监控端比如,监听手机向被监控端的Android手机发送短信,被监控端的Android手机自动回复短信,从而实现监听手机与被监控端的Android手机的信息互动。监听端手机通过被监控端的Android手机发来的文字短信获得被监控端的Android手机的状态数据,或者通过彩信获得被监控端的Android手机摄像头拍摄的照片。最后将所有信息转发到指定的微信用户,实现方便快捷的跨系统远程移动监听、回传和即时查看。根据以上流程,监听手机只要能够发送文字短信、接收文字短信和彩信即可,并不要求监听手机也是Android手机。由于被监控端的Android手机回复的彩信、短信涉及摄像头拍摄的照片、GPS坐标、未接来电、未查短信、联系人等重要信息,且这些信息是通过向监听手机电话号码以短信的方式发送,为保证信息发送的安全和不影响监听手机在非监听阶段和非监听手机与被监控端的Android手机正常的短信通信,必须对短信监听的过程进行安全认证。本申请主要从设定授权手机号码和设置监听密码。当系统接受监听短信之后,自动向监听手机发送提示短信,内容可设为:“匹配成功!回复1获取摄像头拍照照片,回复2获取GPS坐标,回复3获取未接来电信息,回复4获取未查短信信息,回复5获取联系人信息,回复6取消监控。”监听手机按照提示信息的内容,回复查询代码信息。被监控端的Android手机按照发送来的查询代码提取相关模块的数据,以彩信或短信的方式自动回复给监听手机。监听手机监听完毕,注销监听权限,向被监控端的Android手机发送取消监听状态的代码短信。被监控端的Android手机将监听状态位置为FALSE,并修改匹配成功的标志位,注销监听手机的监听权限。

虽然本公开以具体结构特征和/或方法动作来描述,但是可以理解在所附权利要求书中限定的本公开并不必然限于上述具体特征或动作。而是,上述具体特征和动作仅公开为实施权利要求的示例形式。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1