首页 > 系统 > Android > 正文

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

2019-10-24 20:35:14
字体:
来源:转载
供稿:网友

这篇文章给大家介绍Android开发四大组件之实现电话拦截和电话录音,涉及到android四大基本组件在程序中的应用,对android四大基本组件感兴趣的朋友可以参考下本篇文章

一、问题描述

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

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

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

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

二、加入AIDL文件

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

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

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);//启动服务 

注册广播:

 

 
  1. <receiver android:name=".TelReceiver" > 
  2. <intent-filter android:priority="1000" > 
  3. <action android:name="android.intent.action.PHONE_STATE" /> 
  4. <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
  5. </intent-filter> 
  6. </receiver> 

四、编写ListenPhoneService组件

 

 
  1. public class ListenPhoneService extends Service { 
  2. private AudioManager mAudioManager; 
  3. private TelephonyManager tm; 
  4. public ListenPhoneService() { 
  5. @Override 
  6. public void onCreate() { 
  7. super.onCreate(); 
  8. mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 
  9. tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE); 
  10. @Override 
  11. public int onStartCommand(Intent intent, int flags, int startId) { 
  12. if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去电广播,android没有来电话广播 
  13. }else{//去掉拨打电话就是来电状态了 
  14. //方法1 
  15. //获得来电电话 
  16. // String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
  17. //获得电话状态 
  18. // String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
  19. // Log.d("jereh", "incoming phone:" + number); 
  20. // Log.d("jereh","call state:"+state); 
  21. // TelephonyManager.EXTRA_STATE_IDLE: 没有来电 或者 挂断 
  22. // TelephonyManagerEXTRA_STATE_OFFHOOK: 接起电话 
  23. // TelephonyManager.EXTRA_STATE_RINGING:当电话呼入时,响铃时 
  24. // if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
  25. // if(number.equals("13280998858")){//拦截指定的电话号码 
  26. // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
  27. // Log.d("jereh","电话被拦截"); 
  28. // stopCall(); 
  29. // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复铃声 
  30. // } 
  31. // }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
  32. //接起电话 
  33. // recordCall();//开始录音 
  34. // }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 
  35. // stopCall();//停止录音 
  36. // } 
  37. //方法2 
  38. // 设置一个监听器,监听电话状态 
  39. tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE); 
  40. return super.onStartCommand(intent, flags, startId); 
  41. /** 
  42. * 挂断电话 
  43. */ 
  44. private void stopCall(){ 
  45. try { 
  46. //Android的设计将ServiceManager隐藏了,所以只能使用反射机制获得。 
  47. Method method=Class.forName("android.os.ServiceManager").getMethod("getService", String.class); 
  48. IBinder binder=(IBinder)method.invoke(nullnew Object[]{"phone"});//获得系统电话服务 
  49. ITelephony telephoney=ITelephony.Stub.asInterface(binder); 
  50. telephoney.endCall();//挂断电话 
  51. stopSelf();//停止服务 
  52. catch (Exception e) { 
  53. e.printStackTrace(); 
  54. PhoneStateListener listener=new PhoneStateListener(){ 
  55. @Override 
  56. public void onCallStateChanged(int state,String incomingNumber){ 
  57. switch (state){ 
  58. //手机空闲了 
  59. case TelephonyManager.CALL_STATE_IDLE: 
  60. stopCall();//停止录音 
  61. break
  62. //接起电话 
  63. case TelephonyManager.CALL_STATE_OFFHOOK: 
  64. recordCall();//开始录音 
  65. break
  66. // 响铃时 
  67. case TelephonyManager.CALL_STATE_RINGING: 
  68. Log.e("jereh""来电号码是:"+ incomingNumber); 
  69. // 如果该号码属于黑名单 
  70. if (incomingNumber.equals("123456")) { 
  71. // 如果是黑名单,就进行屏蔽 
  72. stopCall(); 
  73. break
  74. }; 
  75. /** 
  76. * 停止录音 
  77. */ 
  78. private void stopRecord(){ 
  79. if(recording){ 
  80. recorder.stop(); 
  81. recorder.release(); 
  82. recording=false
  83. stopSelf();//停止服务 
  84. /** 
  85. * 电话录音 
  86. */ 
  87. private MediaRecorder recorder; 
  88. private boolean recording ; 
  89. private void recordCall(){ 
  90. Log.d("jereh""record calling"
  91. if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 
  92. recorder=new MediaRecorder(); 
  93. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//读麦克风的声音 
  94. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式 
  95. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 编码方式 
  96. File file=new File(Environment.getDownloadCacheDirectory().getAbsolutePath(),"recorder"); 
  97. if(!file.exists()){ 
  98. file.mkdir(); 
  99. recorder.setOutputFile(file.getAbsolutePath() + "/" 
  100. + System.currentTimeMillis() + "3gp");// 存放的位置是放在sd卡recorder目录下 
  101. try { 
  102. recorder.prepare(); 
  103. recorder.start(); 
  104. recording=true
  105. catch (IOException e) { 
  106. e.printStackTrace(); 
  107. @Override 
  108. public IBinder onBind(Intent intent) { 
  109. throw new UnsupportedOperationException("Not yet implemented"); 

Service XML配置

 

 
  1. <service 
  2. android:name=".ListenPhoneService" 
  3. android:enabled="true" 
  4. android:exported="true" > 
  5. </service> 

五、最后别忘了一些权限的设置

好了,以上就是本文的全部所述,希望对大家学习android四大基本组件有所帮助,谢谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表