当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发四大组件之实现电话拦截和电话录音

Android开发四大组件之实现电话拦截和电话录音

2019年07月24日  | 移动技术网IT编程  | 我要评论

任丘老地方聊天室,小说排行榜前,刘恺威快乐大本营

一、问题描述

  使用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四大基本组件有所帮助,谢谢。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网