【Android源码 栏目提醒】:网学会员Android源码 为您提供Android通话拦截和强插应用研究 - 操作系统参考,解决您在Android通话拦截和强插应用研究 - 操作系统学习中工作中的难题,参考学习。
璐SN 1009-3044 E-maih xsjl@ccec.net.enComputer Knowledge and Technology电脯知识与技术 http:llwww.dnzs.net.cnVd.7。
No.7,March 201 l,PP.1589-1590 Tel:+86-55 l一5690963 5690964Android通话拦截和强插应用研究彭海文(武汉大学信息管理学院,湖北武汉430072)摘要:该文先简要介绍了Android平台和Android平台的下的开发,并针对通话拦截和强插所需要的两个知识Broadcasd王eceiver和TelephonyManager类进行说明,再介绍如何通过AIDL及JAVA反射机制,使用隐藏的ITdephony接口,并研究了通话拦截和强插技术在Android下的实现。
最后总结全文,并引出对Android权限管理的一些思考。
关键词:Android;通话拦截;通话强插中图分类号:1’P3n 文献标识码:A 文章编号:1009-3044(2011)07一1589_02Applied Research on Android of Call Block and CaH InsertPENG Hai-wen(School of Information Management,Wuhan University,Wdhan 430072,China)Abstract:This paper introduces Android Platform and its development.and gives a illustration on Broadcastl≈eceiver,TelephonyManager, implement of call block and call iuser- permisfion嗍ement.Then.it analyses how tO use AIDL and JAVA refection tO expose hidden ITelephony interface.Thetion on Android is also researched.Finally it takes a look at AndroidKey words:
android;call block;call insertion1 Android简介 Android是以Linux为基础的开放源代码操作系统,最初目标只在移动电话上使用,后来亦应用到平板电脑及其他领域上=,An—droid最初由Anay Rubin创办.2005年由Goole收购注资。
并拉拢多家制造商组成开放手持设备联盟(Open Handset Alliance)开发改良。
Android自从2007年底年Goole宣布以来,就吸引了广大厂商和用户的眼球,在这几年间也获得了长足的发展,从2009年的第一正式SDKll.5版本发布版本,到现在的2.3.3版本(3.0针对平板电脑设计)。
Android的生态环境上面也经历了爆发性的增长,2010年12月底的时候,Android软件市场中的应用数量就已经达到了20万个。
平均每秒钟就有103个应用被下载,每天有8899200被下载。
在手机厂商方面,手机巨头摩托罗拉甚至凭借Android一举咸鱼翻生,据Gartner的报告,Android的销售量已经超过了Symbian.成为第一大智能手机开放平台。
虽然Android的体验离苹果的IOS还有一段距离,但是比起老迈的Symbian和前途未卜的Windows Phone 7,它还是走在了前面,尤其是其开放性,使得很多大的软件开发商和开发人员在其上面投入。
2 Android开发简介 Goole针对Android的开发提供了一套完整的开发工具,其框架的设计借鉴了现有优秀java框架设计的一些优点,这些优秀的工具和设计降低了Android了开发门槛和难度。
Android平台框架中最核心的的几个组件是Activity,Intent,Content Provider,Set-vice。
和BroadcastReceiver。
通话拦截顾名思义就是在一个电话打进来的时候,程序能够通过来电号码,或者当前时『日J来决定是否拒绝这通电话:而通话强插就是在你通话时如果有一个更高优先级的电话打入,立即无条件挂掉当前电话并接起这个搞优先级电话。
在通话拦截和通话强插的实现中。
我们就需要用到BroadcastReeeiver组件和TelephonyManager类及其隐藏的ITelephony接口。
3 BroadcastReceiver介绍 在Android中.BroadcastReeeiver是对广播出来的消息进行过滤接受并响应的一类组件。
当一个Intent对象以广播方式发送出去以后.所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcaB-tReceiver的onReceiveO方法。
所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive0方法。
注册BroadeastReceiver有两种方式:一种方式是,静态的在Android Manifest.xml中用标签生命注册,并在标签内用标签设置过滤器。
另一种方式是,动态的在代码中先定义并设置好一个IntentFiher对象,然后在需要注册的地方调Context.registerReceiver0方法,如果取消时就调用Con-text.unregisterReceivem方法。
在清单文件Android Manifest.xml中,我们可以通过以下的代码来注册我们的的BroadcastReceiver: <receiver Android:name=”CallFiher”> <intent-filter Android:priority=”20”> <action Android:llalne=”Android.intent.action.PHONE_STATE”,>· </intent—filter> </receiver> 。
CallFiher是我们继承自BroadcastReceiver的类。
当一个电话的打进或者挂机,通话状态就会发生变化,这时Android会广播一个 action为”Android.intent.action.PHONE_-sTATE”的intent消息出来,由于我们注册了CallFilter监听这个消息,我们就能够通过重写on.. 收稿日期:2011-01-15 本拦目贲1壬编辑:谢媛嫒 -·-·。
··-·软件设计开发·-1589 万方数据Computer Knowledge and Technology电蓝知识与技术 第7卷第7期(2011年3月)Receive来捕捉状态的变化,同时在捕捉到通话状态的变化时(例如一个新的电话打进)我们可以从intent中提取出我们需要的信息,并加入自己的逻辑判断来决定下一步的动作是接起还是挂断。
我们可以通过了下面的代码来得到当前的通话状态和来电号码: String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE); String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);4 TelephonyManager类介绍 TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。
其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。
在应用程序中可以使用这些ge£方法获取相关数据。
TelephonyManager类的对象可以通过下面的方法来获得: 表1 TelephonyManager telephony_manager=erelephonyManag-r—————————————————.———..———————.—.———1er)context.getSystemService(Context.TELEPHONY_SERVICE) 需要注意的是有些通讯信息的获取对应用程序的权限有一定的限制。
在开发的时候需要为其添加相应的权限。
在我们这个拦截和强插通话的应用中,我们需要READ_PHONE_STATE,CAUJ)HONE和MODIFY—PHONE—STATE这三个权限。
Tele.phonyManager类定义了一些电话的状态字符串常量,表l是我们的逻辑判断中会用到的。
5通过AmL和JAVA反射获取隐藏ITelephony接口 ITelephony接口是本文最需要技巧的一个地方,我们可以通过这个技巧来实现举一反三。
由于Android的源代码是开放的,获们可以通过浏览源代码来发现一些隐藏的API和接口?然后通过AIDL和JAVA反射来获取隐藏的接口和API。
Android的早期版本提供了接电话和拒绝电话的API。
但是在Android 1.1版本后,Goole已经把该API隐藏掉。
但是我们可以通过该技术来获取隐藏的ITelephony接口。
AIDL(Android接口描述语言)是一种接口描述语言;编译器可以通过AIDL文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的。
获取隐藏接I=1的具体的做法是:先在项目中新建包COrn.Android.internal.telephony,因为要使用AIDL,该包与ITelephony.aidl一致在该包下新建文件ITelephony.aidl package corn.Android.internal.telephony; interface ITelephony{ boolean endCall0; void answerRinginscanO; void silenceRinger0;】 建好之后,eclipse会自动在gen文件夹下生成ITelephony.java,然后通过java的反射我们可以得到的ITelephony实例 Class<TelephonyManager>telephony_class=TelephonyManager.class; Method method=telephony_class.getDeelaredMethod(”getlTelephony”,(Class〔〕)null); method.setAccessible(true); telephony=0Telephony)method.invoke(telephony_manager,(Object〔〕)null); 有了telephony这个ITelephony实例后,我们就可以通过下面的代码来实现接电话和挂电话: telephony.answerRingingCall0; telephony.endCaU0;6实现 有了上述的一些技术储备后,我们就可以来实现具体的逻辑控制了,但是在通话强插上我们还有一个疑问:让我们考虑下现实的情况,当前通话中。
如果第i方给我电话.运营商会不会直接以通话中挂掉第三方,而不会通知我们?我们实际测试后发现。
运营商 图1是不会挂掉第三方的,而回转发呼叫给我们。
图l是实现的流程图。
当第三方呼叫被接起后,之前的通话进入呼叫保持状态,以上所有的功能在中国联通的3G网络测试通过。
7结束语 Android因为其开放性吸引了更多的人,但是任何事物都是有两面性的,开放的越多,一个恶意的程序危害性就越大.Android在一些关键的API使用上使用了权限的管理机制。
一个程序如果要使用这些关键的API就必须在清单文件中声明:然后程序在安装过程中,会把程序需要用到的权限都列举出来,对于一些Android的新手,可能不会去留意这个应用程序使用那些权限。
从而导致恶意程序的一些恶意行为。
在本文中我们使用了READ_PHONE_SrrATE,CALL_PHONE和MODInr-PHONE_STATE这三个权限来读取通话状态,接通和挂掉电话,我们同样也可以声明权限来后台发送和接受短信来达到吸费的目的。
Android需要一个权限设置工具来从整体上对权限进行管理。
参考文献:【11 Android Wiki〔EB/OL〕.http://zh.wikipedia.org/zh-cn/Android.【2】Android Developers〔EB/OL〕.http://developer.
android.com〕.【3】Rogers R,Blake Meike B,Mednieks Z.Android应用开发【M】.北京:人民邮电出版社。
2010.【4】韩超,梁泉.Android系统原理及开发要点详解【M】.北京:电子工业出版社,2010. 1590一-软件设计开发···。
·---- 本栏目责任编辑:谢嫒媛 万方数据
Android通话拦截和强插应用研究作者: 彭海文, PENG Hai-wen作者单位: 武汉大学信息管理学院湖北武汉430072刊名: 电脑知识与技术英文刊名: COMPUTER KNOWLEDGE AND TECHNOLOGY年,卷期: 2011077参考文献4条1.韩超梁泉
Android系统原理及开发要点详解 20102.Rogers RBlake Meike BMednieks Z
Android应用开发 20103.
Android Developers4.
Android Wiki本文链接:http://d.g.wanfangdata.com.cn/Periodical_dnzsyjs-itrzyksb201107047.aspx