温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android中怎么实现电话拦截和电话录音功能

发布时间:2021-08-12 14:11:04 来源:亿速云 阅读:168 作者:Leah 栏目:移动开发

这期内容当中小编将会给大家带来有关Android中怎么实现电话拦截和电话录音功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

使用BordercastReceiver和Service组件实现下述功能:

1.当手机处于来电状态,启动监听服务,对来电进行监听录音。

2.设置电话黑名单,当来电是黑名单电话,则直接挂断。

当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理
二、加入AIDL文件

Android没有对外公开结束通话的API,要结束通话就必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,这样需要android 源码文件NeighboringCellInfo.aidl和ITelephony.aidl添加到项目中,如图所示:

Android Studio 会自动编译产生对应的类文件
三、编写TelReceiver组件

  1. public class TelReceiver extends BroadcastReceiver { 

  2. public TelReceiver() { 

  3.  

  4. @Override 

  5. public void onReceive(Context context, Intent intent) { 

  6. Intent i=new Intent(context,ListenPhoneService.class); 

  7. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

  8. i.setAction(intent.getAction()); 

  9. i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, 

  10. intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));//电话号码 

  11. i.putExtra(TelephonyManager.EXTRA_STATE, 

  12. intent.getStringExtra(TelephonyManager.EXTRA_STATE));//电话状态 

  13. context.startService(i);//启动服务 

  14. }

注册广播:

<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中怎么实现电话拦截和电话录音功能了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI