使用BordercastReceiver和Service组件实现以下功能:1.当手机处于来电状态时,启动监听服务,监听并记录来电称呼。2.设置电话黑名单,当来电是黑名单电话时,直接挂断。当有来电或者手机状态发生变化时,系统会发出有序的广播,所以我们可以使用BordercastReceiver来接收广播。因为BordercastReceiver执行时间短,不能执行耗时任务,也不能使用子线程,所以应该启动一个Service来监听调用并处理2.添加AIDL文件Android没有公开结束调用的API。结束通话必须使用AIDL与话机管理服务通信,调用服务中的API结束通话。这就需要在android源码文件NeighboringCellInfo.aidl的项目中加入ITelephony.aidl,如图:AndroidStudio会自动编译生成相应的类文件。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);//启动服务}}注册广播:4.编写ListenPhoneService组件publicclassListenPhoneServiceextendsService{privateAudioManagerAudioManager;privateTelephonyManagerrtm;publicListenPhoneService(){}@OverridepublicvoidonCreate(){super.onCreate();mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE);}@OverridepublicintonStartCommand(Intentintent,intflags,intstartId){if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去电广播,android没有来电广播}else{//去掉来电就是来电状态//方法一//获取来电number//Stringnumber=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);//获取电话状态//Stringstate=intent.getStringExtra(TelephonyManager.EXTRA_STATE);//Log.d("jereh","incomingphone:"+number);//Log.d("jereh","调用状态:"+state);//电话Mmanager.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","Phoneintercepted");//stopCall();//mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复铃声/////elseif(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){//拿起电话//recordCall();//开始录音//}elseif(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){//stopCall();//停止录音////方法2//设置监听器监听手机状态tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);}returnsuper.onStartCommand(intent,flags,startId);}/***挂断电话*/privatevoidstopCall(){try{//Android设计隐藏了ServiceManager,所以只能通过获取使用反射机制Methodmethod=Class.forName("android.os.ServiceManager").getMethod("getService",String.class);IBinderbinder=(IBinder)method.invoke(null,newObject[]{"phone"});//获取系统电话服务ITelephonytelephone=ITelephony.Stub.asInterface(binder);telephony.endCall();//挂断电话stopSelf();//停止服务}catch(Exceptione){e.printStackTrace();}}PhoneStateListenerlistener=newPhoneStateListener(){@OverridepublicvoidonCallStateChanged(intstate,StringcomingNumber){switch(state){//手机空闲caseTelephonyManager.CALL_STATE_IDLE:stopCall();//停止录音break;//拿起手机caseTelephonyManager.CALL_STATE_OFFHOOK:recordCall();//开始录音break;//响铃时caseTelephonyManager.CALL_STATE_RINGING:Log.e("jereh","来电号码为:"+incomingNumber);//如果号码属于黑名单if(incomingNumber.equals("123456")){//如果是黑名单,则阻塞stopCall();}break;}}};/***停止录音*/privatevoidstopRecord(){if(recording){recorder.stop();recorder.release();recording=false;stopSelf();//停止服务}}/***电话录音*/privateMediaRecorderrec命令;privatebooleanrecording;privatevoidrecordCall(){Log.d("jereh","re??cordcalling")if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){recorder=newMediaRecorder();recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//读取麦克风的声音recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式().getAbsolutePath(),"recorder");if(!file.exists()){file.mkdir();}recorder.setOutputFile(file.getAbsolutePath()+"/"+System.currentTimeMillis()+"3gp");//存储位置在sd卡刻录机目录下try{recorder.prepare();recorder.start();recording=true;}catch(IOExceptione){e.printStackTrace();}}}@OverridepublicIBinderonBind(Intentintent){thrownewUnsupportedOperationException("Notyeimplemented");}}复制代码ServiceXML配置五、***不要忘记设置一些权限