Android开发四大组件之实现电话拦截和电话录音
一、问题描述
使用bordercastreceiver和service组件实现下述功能:
1.当手机处于来电状态,启动监听服务,对来电进行监听录音。
2.设置电话黑名单,当来电是黑名单电话,则直接挂断。
当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用bordercastreceiver接受广播,因bordercastreceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个service来监听电话并进行处理
二、加入aidl文件
android没有对外公开结束通话的api,要结束通话就必须使用aidl与电话管理服务进行通信,并调用服务中的api实现结束通话,这样需要android 源码文件neighboringcellinfo.aidl和itelephony.aidl添加到项目中,如图所示:
android studio 会自动编译产生对应的类文件
三、编写telreceiver组件
public class telreceiver extends broadcastreceiver { public telreceiver() { } @override public void onreceive(context context, intent intent) { intent i=new intent(context,listenphoneservice.class); i.setflags(intent.flag_activity_new_task); i.setaction(intent.getaction()); i.putextra(telephonymanager.extra_incoming_number, intent.getstringextra(telephonymanager.extra_incoming_number));//电话号码 i.putextra(telephonymanager.extra_state, intent.getstringextra(telephonymanager.extra_state));//电话状态 context.startservice(i);//启动服务 } }
注册广播:
<receiver android:name=".telreceiver" > <intent-filter android:priority="1000" > <action android:name="android.intent.action.phone_state" /> <action android:name="android.intent.action.new_outgoing_call" /> </intent-filter> </receiver>
四、编写listenphoneservice组件
public class listenphoneservice extends service { private audiomanager maudiomanager; private telephonymanager tm; public listenphoneservice() { } @override public void oncreate() { super.oncreate(); maudiomanager=(audiomanager)getsystemservice(context.audio_service); tm=(telephonymanager)getsystemservice(service.telephony_service); } @override public int onstartcommand(intent intent, int flags, int startid) { if(intent.getaction().equals(intent.action_new_outgoing_call)){//去电广播,android没有来电话广播 }else{//去掉拨打电话就是来电状态了 //方法1 //获得来电电话 // string number=intent.getstringextra(telephonymanager.extra_incoming_number); //获得电话状态 // string state=intent.getstringextra(telephonymanager.extra_state); // log.d("jereh", "incoming phone:" + number); // log.d("jereh","call state:"+state); // telephonymanager.extra_state_idle: 没有来电 或者 挂断 // telephonymanagerextra_state_offhook: 接起电话 // telephonymanager.extra_state_ringing:当电话呼入时,响铃时 // if(state.equals(telephonymanager.extra_state_ringing)){ // if(number.equals("13280998858")){//拦截指定的电话号码 // maudiomanager.setringermode(audiomanager.ringer_mode_silent); // log.d("jereh","电话被拦截"); // stopcall(); // maudiomanager.setringermode(audiomanager.ringer_mode_normal);//恢复铃声 // } // }else if(state.equals(telephonymanager.extra_state_offhook)){ //接起电话 // recordcall();//开始录音 // }else if(state.equals(telephonymanager.extra_state_idle)){ // stopcall();//停止录音 // } //方法2 // 设置一个监听器,监听电话状态 tm.listen(listener,phonestatelistener.listen_call_state); } return super.onstartcommand(intent, flags, startid); } /** * 挂断电话 */ private void stopcall(){ try { //android的设计将servicemanager隐藏了,所以只能使用反射机制获得。 method method=class.forname("android.os.servicemanager").getmethod("getservice", string.class); ibinder binder=(ibinder)method.invoke(null, new object[]{"phone"});//获得系统电话服务 itelephony telephoney=itelephony.stub.asinterface(binder); telephoney.endcall();//挂断电话 stopself();//停止服务 } catch (exception e) { e.printstacktrace(); } } phonestatelistener listener=new phonestatelistener(){ @override public void oncallstatechanged(int state,string incomingnumber){ switch (state){ //手机空闲了 case telephonymanager.call_state_idle: stopcall();//停止录音 break; //接起电话 case telephonymanager.call_state_offhook: recordcall();//开始录音 break; // 响铃时 case telephonymanager.call_state_ringing: log.e("jereh", "来电号码是:"+ incomingnumber); // 如果该号码属于黑名单 if (incomingnumber.equals("123456")) { // 如果是黑名单,就进行屏蔽 stopcall(); } break; } } }; /** * 停止录音 */ private void stoprecord(){ if(recording){ recorder.stop(); recorder.release(); recording=false; stopself();//停止服务 } } /** * 电话录音 */ private mediarecorder recorder; private boolean recording ; private void recordcall(){ log.d("jereh", "record calling") if( environment.getexternalstoragestate().equals(environment.media_mounted)){ recorder=new mediarecorder(); recorder.setaudiosource(mediarecorder.audiosource.mic);//读麦克风的声音 recorder.setoutputformat(mediarecorder.outputformat.three_gpp);//设置输出格式 recorder.setaudioencoder(mediarecorder.audioencoder.amr_nb);// 编码方式 file file=new file(environment.getdownloadcachedirectory().getabsolutepath(),"recorder"); if(!file.exists()){ file.mkdir(); } recorder.setoutputfile(file.getabsolutepath() + "/" + system.currenttimemillis() + "3gp");// 存放的位置是放在sd卡recorder目录下 try { recorder.prepare(); recorder.start(); recording=true; } catch (ioexception e) { e.printstacktrace(); } } } @override public ibinder onbind(intent intent) { throw new unsupportedoperationexception("not yet implemented"); } }
service xml配置
<service android:name=".listenphoneservice" android:enabled="true" android:exported="true" > </service>
五、最后别忘了一些权限的设置
<!-- 添加访问手机电话状态的权限 -->
<uses-permission android:name="android.permission.read_phone_state" />
<!-- 拨打电话权限 -->
<uses-permission android:name="android.permission.call_phone" />
<!-- 监听手机去电的权限 -->
<uses-permission android:name="android.permission.process_outgoing_calls" />
<!-- 在sdcard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.mount_unmount_filesystems" />
<!-- 往sdcard写入数据权限 -->
<uses-permission android:name="android.permission.write_external_storage" />
好了,以上就是本文的全部所述,希望对大家学习android四大基本组件有所帮助,谢谢。